diff options
Diffstat (limited to 'node_modules/stylehacks/src/index.js')
| -rw-r--r-- | node_modules/stylehacks/src/index.js | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/node_modules/stylehacks/src/index.js b/node_modules/stylehacks/src/index.js new file mode 100644 index 00000000..6b8ce94c --- /dev/null +++ b/node_modules/stylehacks/src/index.js @@ -0,0 +1,60 @@ +'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; |
