Files
Projektarbeit-MYP/backend/node_modules/stylehacks/src/index.js

72 lines
1.9 KiB
JavaScript

'use strict';
const { dirname } = require('path');
const browserslist = require('browserslist');
const plugins = require('./plugins');
/**
* @typedef {{ overrideBrowserslist?: string | string[] }} AutoprefixerOptions
* @typedef {Pick<browserslist.Options, 'stats' | 'path' | 'env'>} BrowserslistOptions
* @typedef {{lint?: boolean} & AutoprefixerOptions & BrowserslistOptions} Options
*/
/**
* @type {import('postcss').PluginCreator<Options>}
* @param {Options} opts
* @return {import('postcss').Plugin}
*/
function pluginCreator(opts = {}) {
return {
postcssPlugin: 'stylehacks',
/**
* @param {import('postcss').Result & {opts: BrowserslistOptions & {file?: string}}} result
*/
prepare(result) {
const { stats, env, from, file } = result.opts || {};
const browsers = browserslist(opts.overrideBrowserslist, {
stats: opts.stats || stats,
path: opts.path || dirname(from || file || __filename),
env: opts.env || env,
});
return {
OnceExit(css) {
/** @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;