'use strict'; const browserslist = require('browserslist'); const plugins = require('./plugins'); /** @typedef {{lint?: boolean}} Options */ /** * @type {import('postcss').PluginCreator} * @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;