.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / autoprefixer / lib / transition.js
1 'use strict';
2
3 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4
5 var parser = require('postcss-value-parser');
6 var vendor = require('postcss').vendor;
7 var list = require('postcss').list;
8
9 var Transition = function () {
10     function Transition(prefixes) {
11         _classCallCheck(this, Transition);
12
13         Object.defineProperty(this, 'props', {
14             enumerable: true,
15             writable: true,
16             value: ['transition', 'transition-property']
17         });
18
19         this.prefixes = prefixes;
20     }
21
22     /**
23      * Process transition and add prefies for all necessary properties
24      */
25
26
27     Transition.prototype.add = function add(decl, result) {
28         var _this = this;
29
30         var prefix = void 0,
31             prop = void 0;
32         var declPrefixes = this.prefixes.add[decl.prop] && this.prefixes.add[decl.prop].prefixes || [];
33
34         var params = this.parse(decl.value);
35         var names = params.map(function (i) {
36             return _this.findProp(i);
37         });
38         var added = [];
39
40         if (names.some(function (i) {
41             return i[0] === '-';
42         })) {
43             return;
44         }
45
46         for (var _iterator = params, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
47             var _ref;
48
49             if (_isArray) {
50                 if (_i >= _iterator.length) break;
51                 _ref = _iterator[_i++];
52             } else {
53                 _i = _iterator.next();
54                 if (_i.done) break;
55                 _ref = _i.value;
56             }
57
58             var param = _ref;
59
60             prop = this.findProp(param);
61             if (prop[0] === '-') continue;
62
63             var prefixer = this.prefixes.add[prop];
64             if (!prefixer || !prefixer.prefixes) continue;
65
66             for (var _iterator3 = prefixer.prefixes, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
67                 if (_isArray3) {
68                     if (_i3 >= _iterator3.length) break;
69                     prefix = _iterator3[_i3++];
70                 } else {
71                     _i3 = _iterator3.next();
72                     if (_i3.done) break;
73                     prefix = _i3.value;
74                 }
75
76                 var prefixed = this.prefixes.prefixed(prop, prefix);
77                 if (prefixed !== '-ms-transform' && names.indexOf(prefixed) === -1) {
78                     if (!this.disabled(prop, prefix)) {
79                         added.push(this.clone(prop, prefixed, param));
80                     }
81                 }
82             }
83         }
84
85         params = params.concat(added);
86         var value = this.stringify(params);
87
88         var webkitClean = this.stringify(this.cleanFromUnprefixed(params, '-webkit-'));
89         if (declPrefixes.indexOf('-webkit-') !== -1) {
90             this.cloneBefore(decl, '-webkit-' + decl.prop, webkitClean);
91         }
92         this.cloneBefore(decl, decl.prop, webkitClean);
93         if (declPrefixes.indexOf('-o-') !== -1) {
94             var operaClean = this.stringify(this.cleanFromUnprefixed(params, '-o-'));
95             this.cloneBefore(decl, '-o-' + decl.prop, operaClean);
96         }
97
98         for (var _iterator2 = declPrefixes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
99             if (_isArray2) {
100                 if (_i2 >= _iterator2.length) break;
101                 prefix = _iterator2[_i2++];
102             } else {
103                 _i2 = _iterator2.next();
104                 if (_i2.done) break;
105                 prefix = _i2.value;
106             }
107
108             if (prefix !== '-webkit-' && prefix !== '-o-') {
109                 var prefixValue = this.stringify(this.cleanOtherPrefixes(params, prefix));
110                 this.cloneBefore(decl, prefix + decl.prop, prefixValue);
111             }
112         }
113
114         if (value !== decl.value && !this.already(decl, decl.prop, value)) {
115             this.checkForWarning(result, decl);
116             decl.cloneBefore();
117             decl.value = value;
118         }
119     };
120
121     /**
122      * Find property name
123      */
124
125
126     Transition.prototype.findProp = function findProp(param) {
127         var prop = param[0].value;
128         if (/^\d/.test(prop)) {
129             for (var i = 0; i < param.length; i++) {
130                 var token = param[i];
131                 if (i !== 0 && token.type === 'word') {
132                     return token.value;
133                 }
134             }
135         }
136         return prop;
137     };
138
139     /**
140      * Does we aready have this declaration
141      */
142
143
144     Transition.prototype.already = function already(decl, prop, value) {
145         return decl.parent.some(function (i) {
146             return i.prop === prop && i.value === value;
147         });
148     };
149
150     /**
151      * Add declaration if it is not exist
152      */
153
154
155     Transition.prototype.cloneBefore = function cloneBefore(decl, prop, value) {
156         if (!this.already(decl, prop, value)) {
157             decl.cloneBefore({ prop: prop, value: value });
158         }
159     };
160
161     /**
162      * Show transition-property warning
163      */
164
165
166     Transition.prototype.checkForWarning = function checkForWarning(result, decl) {
167         if (decl.prop !== 'transition-property') {
168             return;
169         }
170
171         decl.parent.each(function (i) {
172             if (i.type !== 'decl') {
173                 return undefined;
174             }
175             if (i.prop.indexOf('transition-') !== 0) {
176                 return undefined;
177             }
178             if (i.prop === 'transition-property') {
179                 return undefined;
180             }
181
182             if (list.comma(i.value).length > 1) {
183                 decl.warn(result, 'Replace transition-property to transition, ' + 'because Autoprefixer could not support ' + 'any cases of transition-property ' + 'and other transition-*');
184             }
185             return false;
186         });
187     };
188
189     /**
190      * Process transition and remove all unnecessary properties
191      */
192
193
194     Transition.prototype.remove = function remove(decl) {
195         var _this2 = this;
196
197         var params = this.parse(decl.value);
198         params = params.filter(function (i) {
199             var prop = _this2.prefixes.remove[_this2.findProp(i)];
200             return !prop || !prop.remove;
201         });
202         var value = this.stringify(params);
203
204         if (decl.value === value) {
205             return;
206         }
207
208         if (params.length === 0) {
209             decl.remove();
210             return;
211         }
212
213         var double = decl.parent.some(function (i) {
214             return i.prop === decl.prop && i.value === value;
215         });
216         var smaller = decl.parent.some(function (i) {
217             return i !== decl && i.prop === decl.prop && i.value.length > value.length;
218         });
219
220         if (double || smaller) {
221             decl.remove();
222             return;
223         }
224
225         decl.value = value;
226     };
227
228     /**
229      * Parse properties list to array
230      */
231
232
233     Transition.prototype.parse = function parse(value) {
234         var ast = parser(value);
235         var result = [];
236         var param = [];
237         for (var _iterator4 = ast.nodes, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
238             var _ref2;
239
240             if (_isArray4) {
241                 if (_i4 >= _iterator4.length) break;
242                 _ref2 = _iterator4[_i4++];
243             } else {
244                 _i4 = _iterator4.next();
245                 if (_i4.done) break;
246                 _ref2 = _i4.value;
247             }
248
249             var node = _ref2;
250
251             param.push(node);
252             if (node.type === 'div' && node.value === ',') {
253                 result.push(param);
254                 param = [];
255             }
256         }
257         result.push(param);
258         return result.filter(function (i) {
259             return i.length > 0;
260         });
261     };
262
263     /**
264      * Return properties string from array
265      */
266
267
268     Transition.prototype.stringify = function stringify(params) {
269         if (params.length === 0) {
270             return '';
271         }
272         var nodes = [];
273         for (var _iterator5 = params, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {
274             var _ref3;
275
276             if (_isArray5) {
277                 if (_i5 >= _iterator5.length) break;
278                 _ref3 = _iterator5[_i5++];
279             } else {
280                 _i5 = _iterator5.next();
281                 if (_i5.done) break;
282                 _ref3 = _i5.value;
283             }
284
285             var param = _ref3;
286
287             if (param[param.length - 1].type !== 'div') {
288                 param.push(this.div(params));
289             }
290             nodes = nodes.concat(param);
291         }
292         if (nodes[0].type === 'div') {
293             nodes = nodes.slice(1);
294         }
295         if (nodes[nodes.length - 1].type === 'div') {
296             nodes = nodes.slice(0, +-2 + 1 || undefined);
297         }
298         return parser.stringify({ nodes: nodes });
299     };
300
301     /**
302      * Return new param array with different name
303      */
304
305
306     Transition.prototype.clone = function clone(origin, name, param) {
307         var result = [];
308         var changed = false;
309         for (var _iterator6 = param, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {
310             var _ref4;
311
312             if (_isArray6) {
313                 if (_i6 >= _iterator6.length) break;
314                 _ref4 = _iterator6[_i6++];
315             } else {
316                 _i6 = _iterator6.next();
317                 if (_i6.done) break;
318                 _ref4 = _i6.value;
319             }
320
321             var i = _ref4;
322
323             if (!changed && i.type === 'word' && i.value === origin) {
324                 result.push({ type: 'word', value: name });
325                 changed = true;
326             } else {
327                 result.push(i);
328             }
329         }
330         return result;
331     };
332
333     /**
334      * Find or create seperator
335      */
336
337
338     Transition.prototype.div = function div(params) {
339         for (var _iterator7 = params, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {
340             var _ref5;
341
342             if (_isArray7) {
343                 if (_i7 >= _iterator7.length) break;
344                 _ref5 = _iterator7[_i7++];
345             } else {
346                 _i7 = _iterator7.next();
347                 if (_i7.done) break;
348                 _ref5 = _i7.value;
349             }
350
351             var param = _ref5;
352
353             for (var _iterator8 = param, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {
354                 var _ref6;
355
356                 if (_isArray8) {
357                     if (_i8 >= _iterator8.length) break;
358                     _ref6 = _iterator8[_i8++];
359                 } else {
360                     _i8 = _iterator8.next();
361                     if (_i8.done) break;
362                     _ref6 = _i8.value;
363                 }
364
365                 var node = _ref6;
366
367                 if (node.type === 'div' && node.value === ',') {
368                     return node;
369                 }
370             }
371         }
372         return { type: 'div', value: ',', after: ' ' };
373     };
374
375     Transition.prototype.cleanOtherPrefixes = function cleanOtherPrefixes(params, prefix) {
376         var _this3 = this;
377
378         return params.filter(function (param) {
379             var current = vendor.prefix(_this3.findProp(param));
380             return current === '' || current === prefix;
381         });
382     };
383
384     /**
385      * Remove all non-webkit prefixes and unprefixed params if we have prefixed
386      */
387
388
389     Transition.prototype.cleanFromUnprefixed = function cleanFromUnprefixed(params, prefix) {
390         var _this4 = this;
391
392         var remove = params.map(function (i) {
393             return _this4.findProp(i);
394         }).filter(function (i) {
395             return i.slice(0, prefix.length) === prefix;
396         }).map(function (i) {
397             return _this4.prefixes.unprefixed(i);
398         });
399
400         var result = [];
401         for (var _iterator9 = params, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {
402             var _ref7;
403
404             if (_isArray9) {
405                 if (_i9 >= _iterator9.length) break;
406                 _ref7 = _iterator9[_i9++];
407             } else {
408                 _i9 = _iterator9.next();
409                 if (_i9.done) break;
410                 _ref7 = _i9.value;
411             }
412
413             var param = _ref7;
414
415             var prop = this.findProp(param);
416             var p = vendor.prefix(prop);
417             if (remove.indexOf(prop) === -1 && (p === prefix || p === '')) {
418                 result.push(param);
419             }
420         }
421         return result;
422     };
423
424     /**
425      * Check property for disabled by option
426      */
427
428
429     Transition.prototype.disabled = function disabled(prop, prefix) {
430         var other = ['order', 'justify-content', 'align-self', 'align-content'];
431         if (prop.indexOf('flex') !== -1 || other.indexOf(prop) !== -1) {
432             if (this.prefixes.options.flexbox === false) {
433                 return true;
434             }
435
436             if (this.prefixes.options.flexbox === 'no-2009') {
437                 return prefix.indexOf('2009') !== -1;
438             }
439         }
440         return undefined;
441     };
442
443     return Transition;
444 }();
445
446 module.exports = Transition;