72 lines
1.9 KiB
JavaScript
72 lines
1.9 KiB
JavaScript
'use strict';
|
|
const { dirname } = require('path');
|
|
const browserslist = require('browserslist');
|
|
const plugins = require('./plugins');
|
|
|
|
/**
|
|
* @typedef {{ overrideBrowserslist?: string | string[] }} AutoprefixerOptions
|
|
* @typedef {Pick<browserslist.Options, 'stats' | 'path' | 'env'>} BrowserslistOptions
|
|
* @typedef {{lint?: boolean} & AutoprefixerOptions & BrowserslistOptions} Options
|
|
*/
|
|
|
|
/**
|
|
* @type {import('postcss').PluginCreator<Options>}
|
|
* @param {Options} opts
|
|
* @return {import('postcss').Plugin}
|
|
*/
|
|
function pluginCreator(opts = {}) {
|
|
return {
|
|
postcssPlugin: 'stylehacks',
|
|
|
|
/**
|
|
* @param {import('postcss').Result & {opts: BrowserslistOptions & {file?: string}}} result
|
|
*/
|
|
prepare(result) {
|
|
const { stats, env, from, file } = result.opts || {};
|
|
const browsers = browserslist(opts.overrideBrowserslist, {
|
|
stats: opts.stats || stats,
|
|
path: opts.path || dirname(from || file || __filename),
|
|
env: opts.env || env,
|
|
});
|
|
|
|
return {
|
|
OnceExit(css) {
|
|
/** @type {import('./plugin').Plugin[]} */
|
|
const processors = [];
|
|
for (const Plugin of plugins) {
|
|
const hack = new Plugin(result);
|
|
if (!browsers.some((browser) => hack.targets.has(browser))) {
|
|
processors.push(hack);
|
|
}
|
|
}
|
|
css.walk((node) => {
|
|
processors.forEach((proc) => {
|
|
if (!proc.nodeTypes.has(node.type)) {
|
|
return;
|
|
}
|
|
|
|
if (opts.lint) {
|
|
return proc.detectAndWarn(node);
|
|
}
|
|
|
|
return proc.detectAndResolve(node);
|
|
});
|
|
});
|
|
},
|
|
};
|
|
},
|
|
};
|
|
}
|
|
|
|
/** @type {(node: import('postcss').Node) => boolean} */
|
|
pluginCreator.detect = (node) => {
|
|
return plugins.some((Plugin) => {
|
|
const hack = new Plugin();
|
|
|
|
return hack.any(node);
|
|
});
|
|
};
|
|
|
|
pluginCreator.postcss = true;
|
|
module.exports = pluginCreator;
|