|
- '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;
|