UNPKG

postcss-reduce-initial

Version:

Reduce initial definitions to the actual initial value, where possible.

81 lines (69 loc) 2.58 kB
'use strict'; const { dirname } = require('path'); const browserslist = require('browserslist'); const { isSupported } = require('caniuse-api'); const fromInitial = require('./data/fromInitial.json'); const toInitial = require('./data/toInitial.json'); const ignoreProps = require('./lib/ignoreProps.js'); 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 = ignoreProps; /** * @typedef {{ overrideBrowserslist?: string | string[] }} AutoprefixerOptions * @typedef {Pick<browserslist.Options, 'stats' | 'path' | 'env'>} BrowserslistOptions * @typedef {{ignore?: string[]} & AutoprefixerOptions & BrowserslistOptions} Options */ /** * @type {import('postcss').PluginCreator<Options>} * @param {Options} options * @return {import('postcss').Plugin} */ function pluginCreator(options = {}) { return { postcssPlugin: 'postcss-reduce-initial', /** * @param {import('postcss').Result & {opts: BrowserslistOptions & {file?: string}}} result */ prepare(result) { const { stats, env, from, file } = result.opts || {}; const browsers = browserslist(options.overrideBrowserslist, { stats: options.stats || stats, path: options.path || dirname(from || file || __filename), env: options.env || 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(options.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;