| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- '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;
|