3 var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
5 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
7 var Browsers = require('./browsers');
8 var utils = require('./utils');
10 var vendor = require('postcss').vendor;
13 * Recursivly clone objects
15 function _clone(obj, parent) {
16 var cloned = new obj.constructor();
18 for (var _iterator = Object.keys(obj || {}), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
22 if (_i >= _iterator.length) break;
23 _ref = _iterator[_i++];
25 _i = _iterator.next();
33 if (i === 'parent' && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') {
37 } else if (i === 'source' || i === null) {
39 } else if (value instanceof Array) {
40 cloned[i] = value.map(function (x) {
41 return _clone(x, cloned);
43 } else if (i !== '_autoprefixerPrefix' && i !== '_autoprefixerValues') {
44 if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value !== null) {
45 value = _clone(value, cloned);
54 var Prefixer = function () {
57 * Add hack to selected names
59 Prefixer.hack = function hack(klass) {
65 return klass.names.map(function (name) {
66 _this.hacks[name] = klass;
67 return _this.hacks[name];
72 * Load hacks for some names
76 Prefixer.load = function load(name, prefixes, all) {
77 var Klass = this.hacks && this.hacks[name];
79 return new Klass(name, prefixes, all);
81 return new this(name, prefixes, all);
86 * Clone node and clean autprefixer custom caches
90 Prefixer.clone = function clone(node, overrides) {
91 var cloned = _clone(node);
92 for (var name in overrides) {
93 cloned[name] = overrides[name];
98 function Prefixer(name, prefixes, all) {
99 _classCallCheck(this, Prefixer);
102 this.prefixes = prefixes;
107 * Find prefix in node parents
111 Prefixer.prototype.parentPrefix = function parentPrefix(node) {
114 if (typeof node._autoprefixerPrefix !== 'undefined') {
115 prefix = node._autoprefixerPrefix;
116 } else if (node.type === 'decl' && node.prop[0] === '-') {
117 prefix = vendor.prefix(node.prop);
118 } else if (node.type === 'root') {
120 } else if (node.type === 'rule' && node.selector.indexOf(':-') !== -1 && /:(-\w+-)/.test(node.selector)) {
121 prefix = node.selector.match(/:(-\w+-)/)[1];
122 } else if (node.type === 'atrule' && node.name[0] === '-') {
123 prefix = vendor.prefix(node.name);
125 prefix = this.parentPrefix(node.parent);
128 if (Browsers.prefixes().indexOf(prefix) === -1) {
132 node._autoprefixerPrefix = prefix;
134 return node._autoprefixerPrefix;
138 * Clone node with prefixes
142 Prefixer.prototype.process = function process(node, result) {
143 if (!this.check(node)) {
147 var parent = this.parentPrefix(node);
149 var prefixes = this.prefixes.filter(function (prefix) {
150 return !parent || parent === utils.removeNote(prefix);
154 for (var _iterator2 = prefixes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
158 if (_i2 >= _iterator2.length) break;
159 _ref2 = _iterator2[_i2++];
161 _i2 = _iterator2.next();
168 if (this.add(node, prefix, added.concat([prefix]), result)) {
177 * Shortcut for Prefixer.clone
181 Prefixer.prototype.clone = function clone(node, overrides) {
182 return Prefixer.clone(node, overrides);
188 module.exports = Prefixer;