69 lines
2.1 KiB
JavaScript
69 lines
2.1 KiB
JavaScript
|
'use strict';
|
||
|
const browserslist = require('browserslist');
|
||
|
const { isSupported } = require('caniuse-api');
|
||
|
const fromInitial = require('./data/fromInitial.json');
|
||
|
const toInitial = require('./data/toInitial.json');
|
||
|
|
||
|
const initial = 'initial';
|
||
|
|
||
|
// In most of the browser including chrome the initial for `writing-mode` is not `horizontal-tb`. Ref https://github.com/cssnano/cssnano/pull/905
|
||
|
const defaultIgnoreProps = ['writing-mode', 'transform-box'];
|
||
|
|
||
|
/**
|
||
|
* @type {import('postcss').PluginCreator<void>}
|
||
|
* @return {import('postcss').Plugin}
|
||
|
*/
|
||
|
function pluginCreator() {
|
||
|
return {
|
||
|
postcssPlugin: 'postcss-reduce-initial',
|
||
|
/** @param {import('postcss').Result & {opts: browserslist.Options & {ignore?: string[]}}} result */
|
||
|
prepare(result) {
|
||
|
const resultOpts = result.opts || {};
|
||
|
const browsers = browserslist(null, {
|
||
|
stats: resultOpts.stats,
|
||
|
path: __dirname,
|
||
|
env: resultOpts.env,
|
||
|
});
|
||
|
|
||
|
const initialSupport = isSupported('css-initial-value', browsers);
|
||
|
return {
|
||
|
OnceExit(css) {
|
||
|
css.walkDecls((decl) => {
|
||
|
const lowerCasedProp = decl.prop.toLowerCase();
|
||
|
const ignoreProp = new Set(
|
||
|
defaultIgnoreProps.concat(resultOpts.ignore || [])
|
||
|
);
|
||
|
|
||
|
if (ignoreProp.has(lowerCasedProp)) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
initialSupport &&
|
||
|
Object.prototype.hasOwnProperty.call(toInitial, lowerCasedProp) &&
|
||
|
decl.value.toLowerCase() ===
|
||
|
toInitial[/** @type {keyof toInitial} */ (lowerCasedProp)]
|
||
|
) {
|
||
|
decl.value = initial;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
decl.value.toLowerCase() !== initial ||
|
||
|
!fromInitial[/** @type {keyof fromInitial} */ (lowerCasedProp)]
|
||
|
) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
decl.value =
|
||
|
fromInitial[/** @type {keyof fromInitial} */ (lowerCasedProp)];
|
||
|
});
|
||
|
},
|
||
|
};
|
||
|
},
|
||
|
};
|
||
|
}
|
||
|
|
||
|
pluginCreator.postcss = true;
|
||
|
module.exports = pluginCreator;
|