411 lines
12 KiB
JavaScript
411 lines
12 KiB
JavaScript
(function() {
|
|
var AtRule, Browsers, Declaration, Prefixes, Processor, Resolution, Selector, Supports, Transition, Value, declsCache, utils, vendor;
|
|
|
|
Declaration = require('./declaration');
|
|
|
|
Resolution = require('./resolution');
|
|
|
|
Transition = require('./transition');
|
|
|
|
Processor = require('./processor');
|
|
|
|
Supports = require('./supports');
|
|
|
|
Browsers = require('./browsers');
|
|
|
|
Selector = require('./selector');
|
|
|
|
AtRule = require('./at-rule');
|
|
|
|
Value = require('./value');
|
|
|
|
utils = require('./utils');
|
|
|
|
vendor = require('postcss/lib/vendor');
|
|
|
|
Selector.hack(require('./hacks/fullscreen'));
|
|
|
|
Selector.hack(require('./hacks/placeholder'));
|
|
|
|
Declaration.hack(require('./hacks/flex'));
|
|
|
|
Declaration.hack(require('./hacks/order'));
|
|
|
|
Declaration.hack(require('./hacks/filter'));
|
|
|
|
Declaration.hack(require('./hacks/grid-end'));
|
|
|
|
Declaration.hack(require('./hacks/flex-flow'));
|
|
|
|
Declaration.hack(require('./hacks/flex-grow'));
|
|
|
|
Declaration.hack(require('./hacks/flex-wrap'));
|
|
|
|
Declaration.hack(require('./hacks/grid-start'));
|
|
|
|
Declaration.hack(require('./hacks/align-self'));
|
|
|
|
Declaration.hack(require('./hacks/flex-basis'));
|
|
|
|
Declaration.hack(require('./hacks/mask-border'));
|
|
|
|
Declaration.hack(require('./hacks/align-items'));
|
|
|
|
Declaration.hack(require('./hacks/flex-shrink'));
|
|
|
|
Declaration.hack(require('./hacks/break-props'));
|
|
|
|
Declaration.hack(require('./hacks/writing-mode'));
|
|
|
|
Declaration.hack(require('./hacks/border-image'));
|
|
|
|
Declaration.hack(require('./hacks/justify-items'));
|
|
|
|
Declaration.hack(require('./hacks/align-content'));
|
|
|
|
Declaration.hack(require('./hacks/border-radius'));
|
|
|
|
Declaration.hack(require('./hacks/block-logical'));
|
|
|
|
Declaration.hack(require('./hacks/grid-template'));
|
|
|
|
Declaration.hack(require('./hacks/inline-logical'));
|
|
|
|
Declaration.hack(require('./hacks/grid-row-align'));
|
|
|
|
Declaration.hack(require('./hacks/transform-decl'));
|
|
|
|
Declaration.hack(require('./hacks/flex-direction'));
|
|
|
|
Declaration.hack(require('./hacks/image-rendering'));
|
|
|
|
Declaration.hack(require('./hacks/justify-content'));
|
|
|
|
Declaration.hack(require('./hacks/background-size'));
|
|
|
|
Declaration.hack(require('./hacks/text-emphasis-position'));
|
|
|
|
Value.hack(require('./hacks/stretch'));
|
|
|
|
Value.hack(require('./hacks/gradient'));
|
|
|
|
Value.hack(require('./hacks/pixelated'));
|
|
|
|
Value.hack(require('./hacks/image-set'));
|
|
|
|
Value.hack(require('./hacks/cross-fade'));
|
|
|
|
Value.hack(require('./hacks/flex-values'));
|
|
|
|
Value.hack(require('./hacks/display-flex'));
|
|
|
|
Value.hack(require('./hacks/display-grid'));
|
|
|
|
Value.hack(require('./hacks/filter-value'));
|
|
|
|
declsCache = {};
|
|
|
|
Prefixes = (function() {
|
|
function Prefixes(data1, browsers, options) {
|
|
var ref;
|
|
this.data = data1;
|
|
this.browsers = browsers;
|
|
this.options = options != null ? options : {};
|
|
ref = this.preprocess(this.select(this.data)), this.add = ref[0], this.remove = ref[1];
|
|
this.transition = new Transition(this);
|
|
this.processor = new Processor(this);
|
|
}
|
|
|
|
Prefixes.prototype.cleaner = function() {
|
|
var empty;
|
|
if (!this.cleanerCache) {
|
|
if (this.browsers.selected.length) {
|
|
empty = new Browsers(this.browsers.data, []);
|
|
this.cleanerCache = new Prefixes(this.data, empty, this.options);
|
|
} else {
|
|
return this;
|
|
}
|
|
}
|
|
return this.cleanerCache;
|
|
};
|
|
|
|
Prefixes.prototype.select = function(list) {
|
|
var add, all, data, name, notes, selected;
|
|
selected = {
|
|
add: {},
|
|
remove: {}
|
|
};
|
|
for (name in list) {
|
|
data = list[name];
|
|
add = data.browsers.map(function(i) {
|
|
var params;
|
|
params = i.split(' ');
|
|
return {
|
|
browser: params[0] + ' ' + params[1],
|
|
note: params[2]
|
|
};
|
|
});
|
|
notes = add.filter(function(i) {
|
|
return i.note;
|
|
}).map((function(_this) {
|
|
return function(i) {
|
|
return _this.browsers.prefix(i.browser) + ' ' + i.note;
|
|
};
|
|
})(this));
|
|
notes = utils.uniq(notes);
|
|
add = add.filter((function(_this) {
|
|
return function(i) {
|
|
return _this.browsers.isSelected(i.browser);
|
|
};
|
|
})(this)).map((function(_this) {
|
|
return function(i) {
|
|
var prefix;
|
|
prefix = _this.browsers.prefix(i.browser);
|
|
if (i.note) {
|
|
return prefix + ' ' + i.note;
|
|
} else {
|
|
return prefix;
|
|
}
|
|
};
|
|
})(this));
|
|
add = this.sort(utils.uniq(add));
|
|
if (this.options.flexbox === 'no-2009') {
|
|
add = add.filter(function(i) {
|
|
return i.indexOf('2009') === -1;
|
|
});
|
|
}
|
|
all = data.browsers.map((function(_this) {
|
|
return function(i) {
|
|
return _this.browsers.prefix(i);
|
|
};
|
|
})(this));
|
|
if (data.mistakes) {
|
|
all = all.concat(data.mistakes);
|
|
}
|
|
all = all.concat(notes);
|
|
all = utils.uniq(all);
|
|
if (add.length) {
|
|
selected.add[name] = add;
|
|
if (add.length < all.length) {
|
|
selected.remove[name] = all.filter(function(i) {
|
|
return add.indexOf(i) === -1;
|
|
});
|
|
}
|
|
} else {
|
|
selected.remove[name] = all;
|
|
}
|
|
}
|
|
return selected;
|
|
};
|
|
|
|
Prefixes.prototype.sort = function(prefixes) {
|
|
return prefixes.sort(function(a, b) {
|
|
var aLength, bLength;
|
|
aLength = utils.removeNote(a).length;
|
|
bLength = utils.removeNote(b).length;
|
|
if (aLength === bLength) {
|
|
return b.length - a.length;
|
|
} else {
|
|
return bLength - aLength;
|
|
}
|
|
});
|
|
};
|
|
|
|
Prefixes.prototype.preprocess = function(selected) {
|
|
var a, add, j, k, l, len, len1, len2, len3, len4, len5, len6, m, n, name, o, old, olds, p, prefix, prefixed, prefixes, prop, props, ref, ref1, ref2, ref3, remove, selector, value, values;
|
|
add = {
|
|
selectors: [],
|
|
'@supports': new Supports(Prefixes, this)
|
|
};
|
|
ref = selected.add;
|
|
for (name in ref) {
|
|
prefixes = ref[name];
|
|
if (name === '@keyframes' || name === '@viewport') {
|
|
add[name] = new AtRule(name, prefixes, this);
|
|
} else if (name === '@resolution') {
|
|
add[name] = new Resolution(name, prefixes, this);
|
|
} else if (this.data[name].selector) {
|
|
add.selectors.push(Selector.load(name, prefixes, this));
|
|
} else {
|
|
props = this.data[name].props;
|
|
if (props) {
|
|
value = Value.load(name, prefixes, this);
|
|
for (j = 0, len = props.length; j < len; j++) {
|
|
prop = props[j];
|
|
if (!add[prop]) {
|
|
add[prop] = {
|
|
values: []
|
|
};
|
|
}
|
|
add[prop].values.push(value);
|
|
}
|
|
} else {
|
|
values = ((ref1 = add[name]) != null ? ref1.values : void 0) || [];
|
|
add[name] = Declaration.load(name, prefixes, this);
|
|
add[name].values = values;
|
|
}
|
|
}
|
|
}
|
|
remove = {
|
|
selectors: []
|
|
};
|
|
ref2 = selected.remove;
|
|
for (name in ref2) {
|
|
prefixes = ref2[name];
|
|
if (this.data[name].selector) {
|
|
selector = Selector.load(name, prefixes);
|
|
for (k = 0, len1 = prefixes.length; k < len1; k++) {
|
|
prefix = prefixes[k];
|
|
remove.selectors.push(selector.old(prefix));
|
|
}
|
|
} else if (name === '@keyframes' || name === '@viewport') {
|
|
for (l = 0, len2 = prefixes.length; l < len2; l++) {
|
|
prefix = prefixes[l];
|
|
prefixed = '@' + prefix + name.slice(1);
|
|
remove[prefixed] = {
|
|
remove: true
|
|
};
|
|
}
|
|
} else if (name === '@resolution') {
|
|
remove[name] = new Resolution(name, prefixes, this);
|
|
} else {
|
|
props = this.data[name].props;
|
|
if (props) {
|
|
value = Value.load(name, [], this);
|
|
for (m = 0, len3 = prefixes.length; m < len3; m++) {
|
|
prefix = prefixes[m];
|
|
old = value.old(prefix);
|
|
if (old) {
|
|
for (n = 0, len4 = props.length; n < len4; n++) {
|
|
prop = props[n];
|
|
if (!remove[prop]) {
|
|
remove[prop] = {};
|
|
}
|
|
if (!remove[prop].values) {
|
|
remove[prop].values = [];
|
|
}
|
|
remove[prop].values.push(old);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
for (o = 0, len5 = prefixes.length; o < len5; o++) {
|
|
prefix = prefixes[o];
|
|
prop = vendor.unprefixed(name);
|
|
olds = this.decl(name).old(name, prefix);
|
|
if (name === 'align-self') {
|
|
a = (ref3 = add[name]) != null ? ref3.prefixes : void 0;
|
|
if (a) {
|
|
if (prefix === '-webkit- 2009' && a.indexOf('-webkit-') !== -1) {
|
|
continue;
|
|
} else if (prefix === '-webkit-' && a.indexOf('-webkit- 2009') !== -1) {
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
for (p = 0, len6 = olds.length; p < len6; p++) {
|
|
prefixed = olds[p];
|
|
if (!remove[prefixed]) {
|
|
remove[prefixed] = {};
|
|
}
|
|
remove[prefixed].remove = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return [add, remove];
|
|
};
|
|
|
|
Prefixes.prototype.decl = function(prop) {
|
|
var decl;
|
|
decl = declsCache[prop];
|
|
if (decl) {
|
|
return decl;
|
|
} else {
|
|
return declsCache[prop] = Declaration.load(prop);
|
|
}
|
|
};
|
|
|
|
Prefixes.prototype.unprefixed = function(prop) {
|
|
var value;
|
|
value = this.normalize(vendor.unprefixed(prop));
|
|
if (value === 'flex-direction') {
|
|
value = 'flex-flow';
|
|
}
|
|
return value;
|
|
};
|
|
|
|
Prefixes.prototype.normalize = function(prop) {
|
|
return this.decl(prop).normalize(prop);
|
|
};
|
|
|
|
Prefixes.prototype.prefixed = function(prop, prefix) {
|
|
prop = vendor.unprefixed(prop);
|
|
return this.decl(prop).prefixed(prop, prefix);
|
|
};
|
|
|
|
Prefixes.prototype.values = function(type, prop) {
|
|
var data, global, ref, ref1, values;
|
|
data = this[type];
|
|
global = (ref = data['*']) != null ? ref.values : void 0;
|
|
values = (ref1 = data[prop]) != null ? ref1.values : void 0;
|
|
if (global && values) {
|
|
return utils.uniq(global.concat(values));
|
|
} else {
|
|
return global || values || [];
|
|
}
|
|
};
|
|
|
|
Prefixes.prototype.group = function(decl) {
|
|
var checker, index, length, rule, unprefixed;
|
|
rule = decl.parent;
|
|
index = rule.index(decl);
|
|
length = rule.nodes.length;
|
|
unprefixed = this.unprefixed(decl.prop);
|
|
checker = (function(_this) {
|
|
return function(step, callback) {
|
|
var other;
|
|
index += step;
|
|
while (index >= 0 && index < length) {
|
|
other = rule.nodes[index];
|
|
if (other.type === 'decl') {
|
|
if (step === -1 && other.prop === unprefixed) {
|
|
if (!Browsers.withPrefix(other.value)) {
|
|
break;
|
|
}
|
|
}
|
|
if (_this.unprefixed(other.prop) !== unprefixed) {
|
|
break;
|
|
} else if (callback(other) === true) {
|
|
return true;
|
|
}
|
|
if (step === +1 && other.prop === unprefixed) {
|
|
if (!Browsers.withPrefix(other.value)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
index += step;
|
|
}
|
|
return false;
|
|
};
|
|
})(this);
|
|
return {
|
|
up: function(callback) {
|
|
return checker(-1, callback);
|
|
},
|
|
down: function(callback) {
|
|
return checker(+1, callback);
|
|
}
|
|
};
|
|
};
|
|
|
|
return Prefixes;
|
|
|
|
})();
|
|
|
|
module.exports = Prefixes;
|
|
|
|
}).call(this);
|