61 lines
1.4 KiB
JavaScript
61 lines
1.4 KiB
JavaScript
'use strict';
|
|
const browserslist = require('browserslist');
|
|
const plugins = require('./plugins');
|
|
|
|
/** @typedef {{lint?: boolean}} Options */
|
|
|
|
/**
|
|
* @type {import('postcss').PluginCreator<Options>}
|
|
* @param {Options} opts
|
|
* @return {import('postcss').Plugin}
|
|
*/
|
|
function pluginCreator(opts = {}) {
|
|
return {
|
|
postcssPlugin: 'stylehacks',
|
|
|
|
OnceExit(css, { result }) {
|
|
/** @type {typeof result.opts & browserslist.Options} */
|
|
const resultOpts = result.opts || {};
|
|
const browsers = browserslist(null, {
|
|
stats: resultOpts.stats,
|
|
path: __dirname,
|
|
env: resultOpts.env,
|
|
});
|
|
|
|
/** @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;
|