Frontend/25_01_07/mai/node_modules/stylehacks/src/index.js

61 lines
1.4 KiB
JavaScript
Raw Normal View History

2025-01-28 10:38:27 +00:00
'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;