Spaces:
Running
Running
var DEFAULTS = { | |
'*': { | |
colors: { | |
hexAlpha: false, // 4- and 8-character hex notation | |
opacity: true // rgba / hsla | |
}, | |
customUnits: { rpx: false }, | |
properties: { | |
backgroundClipMerging: true, // background-clip to shorthand | |
backgroundOriginMerging: true, // background-origin to shorthand | |
backgroundSizeMerging: true, // background-size to shorthand | |
colors: true, // any kind of color transformations, like `#ff00ff` to `#f0f` or `#fff` into `red` | |
ieBangHack: false, // !ie suffix hacks on IE<8 | |
ieFilters: false, // whether to preserve `filter` and `-ms-filter` properties | |
iePrefixHack: false, // underscore / asterisk prefix hacks on IE | |
ieSuffixHack: false, // \9 suffix hacks on IE6-9, \0 suffix hack on IE6-11 | |
merging: true, // merging properties into one | |
shorterLengthUnits: false, // optimize pixel units into `pt`, `pc` or `in` units | |
spaceAfterClosingBrace: true, // 'url() no-repeat' to 'url()no-repeat' | |
urlQuotes: true, // whether to wrap content of `url()` into quotes or not | |
zeroUnits: true // 0[unit] -> 0 | |
}, | |
selectors: { | |
adjacentSpace: false, // div+ nav Android stock browser hack | |
ie7Hack: false, // *+html hack | |
mergeablePseudoClasses: [ | |
':active', | |
':after', | |
':before', | |
':empty', | |
':checked', | |
':disabled', | |
':empty', | |
':enabled', | |
':first-child', | |
':first-letter', | |
':first-line', | |
':first-of-type', | |
':focus', | |
':hover', | |
':lang', | |
':last-child', | |
':last-of-type', | |
':link', | |
':not', | |
':nth-child', | |
':nth-last-child', | |
':nth-last-of-type', | |
':nth-of-type', | |
':only-child', | |
':only-of-type', | |
':root', | |
':target', | |
':visited' | |
], // selectors with these pseudo-classes can be merged as these are universally supported | |
mergeablePseudoElements: [ | |
'::after', | |
'::before', | |
'::first-letter', | |
'::first-line' | |
], // selectors with these pseudo-elements can be merged as these are universally supported | |
mergeLimit: 8191, // number of rules that can be safely merged together | |
multiplePseudoMerging: true | |
}, | |
units: { | |
ch: true, | |
in: true, | |
pc: true, | |
pt: true, | |
rem: true, | |
vh: true, | |
vm: true, // vm is vmin on IE9+ see https://developer.mozilla.org/en-US/docs/Web/CSS/length | |
vmax: true, | |
vmin: true, | |
vw: true | |
} | |
} | |
}; | |
DEFAULTS.ie11 = merge(DEFAULTS['*'], { properties: { ieSuffixHack: true } }); | |
DEFAULTS.ie10 = merge(DEFAULTS['*'], { properties: { ieSuffixHack: true } }); | |
DEFAULTS.ie9 = merge(DEFAULTS['*'], { | |
properties: { | |
ieFilters: true, | |
ieSuffixHack: true | |
} | |
}); | |
DEFAULTS.ie8 = merge(DEFAULTS.ie9, { | |
colors: { opacity: false }, | |
properties: { | |
backgroundClipMerging: false, | |
backgroundOriginMerging: false, | |
backgroundSizeMerging: false, | |
iePrefixHack: true, | |
merging: false | |
}, | |
selectors: { | |
mergeablePseudoClasses: [ | |
':after', | |
':before', | |
':first-child', | |
':first-letter', | |
':focus', | |
':hover', | |
':visited' | |
], | |
mergeablePseudoElements: [] | |
}, | |
units: { | |
ch: false, | |
rem: false, | |
vh: false, | |
vm: false, | |
vmax: false, | |
vmin: false, | |
vw: false | |
} | |
}); | |
DEFAULTS.ie7 = merge(DEFAULTS.ie8, { | |
properties: { ieBangHack: true }, | |
selectors: { | |
ie7Hack: true, | |
mergeablePseudoClasses: [ | |
':first-child', | |
':first-letter', | |
':hover', | |
':visited' | |
] | |
} | |
}); | |
function compatibilityFrom(source) { | |
return merge(DEFAULTS['*'], calculateSource(source)); | |
} | |
function merge(source, target) { | |
for (var key in source) { | |
if (Object.prototype.hasOwnProperty.call(source, key)) { | |
var value = source[key]; | |
if (Object.prototype.hasOwnProperty.call(target, key) && typeof value === 'object' && !Array.isArray(value)) { | |
target[key] = merge(value, target[key] || {}); | |
} else { | |
target[key] = key in target ? target[key] : value; | |
} | |
} | |
} | |
return target; | |
} | |
function calculateSource(source) { | |
if (typeof source == 'object') { return source; } | |
if (!/[,+-]/.test(source)) { return DEFAULTS[source] || DEFAULTS['*']; } | |
var parts = source.split(','); | |
var template = parts[0] in DEFAULTS | |
? DEFAULTS[parts.shift()] | |
: DEFAULTS['*']; | |
source = {}; | |
parts.forEach(function(part) { | |
var isAdd = part[0] == '+'; | |
var key = part.substring(1).split('.'); | |
var group = key[0]; | |
var option = key[1]; | |
source[group] = source[group] || {}; | |
source[group][option] = isAdd; | |
}); | |
return merge(template, source); | |
} | |
module.exports = compatibilityFrom; | |