summaryrefslogtreecommitdiff
path: root/node_modules/stylehacks/src/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/stylehacks/src/index.js')
-rw-r--r--node_modules/stylehacks/src/index.js60
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;