postcss-convert-values
Version:
Convert values with PostCSS (e.g. ms -> s)
58 lines (50 loc) • 2.18 kB
JavaScript
import getBrowsersList from '#getBrowsersList';
import transform from './lib/transform.js';
/** @import browserslist from 'browserslist' */
/** @import convert from './lib/convert.js' */
const plugin = 'postcss-convert-values';
/**
* @typedef {Parameters<typeof convert>[2]} ConvertOptions
* @typedef {{ overrideBrowserslist?: string | string[] }} AutoprefixerOptions
* @typedef {Pick<browserslist.Options, 'stats' | 'path' | 'env'>} BrowserslistOptions
* @typedef {{precision?: false | number, transformCustomProperties?: boolean} & ConvertOptions & AutoprefixerOptions & BrowserslistOptions} Options
*/
/** @param {Options} opts @return {import('postcss').Plugin} */
function pluginCreator(opts = { precision: false }) {
/** @type {Map<string, boolean>} */
const browserCache = new Map();
return {
postcssPlugin: plugin,
/** @param {import('postcss').Result & {opts: BrowserslistOptions & {file?: string}}} result */
prepare(result) {
const { stats, env, from, file } = result.opts || {};
const overrideKey = opts.overrideBrowserslist
? JSON.stringify(opts.overrideBrowserslist)
: '';
const pathKey = opts.path ?? '';
const envKey = opts.env ?? env ?? '';
const effectiveStats = opts.stats || stats;
const statsKey = effectiveStats ? JSON.stringify(effectiveStats) : '';
const cacheKey = `${overrideKey}\0${pathKey}\0${envKey}\0${from ?? ''}\0${file ?? ''}\0${statsKey}`;
let supportsIE = browserCache.get(cacheKey);
if (supportsIE === undefined) {
const browsers = getBrowsersList(opts, stats, from, file, env);
supportsIE = browsers.some((b) => b.startsWith('ie '));
browserCache.set(cacheKey, supportsIE);
}
const cache = new Map();
return {
/** @param {import('postcss').Root} css */
OnceExit(css) {
css.walkDecls((decl) =>
transform(/** @type {Options} */ (opts), supportsIE, decl, cache)
);
},
};
},
};
}
/** @type {true} */
pluginCreator.postcss = true;
const moduleExports = pluginCreator;
export { moduleExports as default, moduleExports as 'module.exports' };