summaryrefslogtreecommitdiff
path: root/node_modules/postcss-reduce-initial/src/index.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
commitc06f7ee0a40255214c477e13d9b956a7e07c2900 (patch)
treef5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/postcss-reduce-initial/src/index.js
parent3fd9400d4dccc25aa29b5702216732e0b7542073 (diff)
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/postcss-reduce-initial/src/index.js')
-rw-r--r--node_modules/postcss-reduce-initial/src/index.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/node_modules/postcss-reduce-initial/src/index.js b/node_modules/postcss-reduce-initial/src/index.js
new file mode 100644
index 00000000..5432f7fe
--- /dev/null
+++ b/node_modules/postcss-reduce-initial/src/index.js
@@ -0,0 +1,70 @@
+'use strict';
+const browserslist = require('browserslist');
+const { isSupported } = require('caniuse-api');
+const fromInitial = require('./data/fromInitial.json');
+const toInitial = require('./data/toInitial.json');
+
+const initial = 'initial';
+
+// In most of the browser including chrome the initial for `writing-mode` is not `horizontal-tb`. Ref https://github.com/cssnano/cssnano/pull/905
+const defaultIgnoreProps = ['writing-mode', 'transform-box'];
+/** @typedef {{ignore?: string[]}} Options */
+
+/**
+ * @type {import('postcss').PluginCreator<Options>}
+ * @param {Options} options
+ * @return {import('postcss').Plugin}
+ */
+function pluginCreator(options = {}) {
+ return {
+ postcssPlugin: 'postcss-reduce-initial',
+ /** @param {import('postcss').Result & {opts: browserslist.Options & {ignore?: string[]}}} result */
+ prepare(result) {
+ const resultOpts = result.opts || {};
+ const browsers = browserslist(null, {
+ stats: resultOpts.stats,
+ path: __dirname,
+ env: resultOpts.env,
+ });
+
+ const initialSupport = isSupported('css-initial-value', browsers);
+ return {
+ OnceExit(css) {
+ css.walkDecls((decl) => {
+ const lowerCasedProp = decl.prop.toLowerCase();
+ const ignoreProp = new Set(
+ defaultIgnoreProps.concat(options.ignore || [])
+ );
+
+ if (ignoreProp.has(lowerCasedProp)) {
+ return;
+ }
+
+ if (
+ initialSupport &&
+ Object.prototype.hasOwnProperty.call(toInitial, lowerCasedProp) &&
+ decl.value.toLowerCase() ===
+ toInitial[/** @type {keyof toInitial} */ (lowerCasedProp)]
+ ) {
+ decl.value = initial;
+ return;
+ }
+
+ if (
+ decl.value.toLowerCase() !== initial ||
+ !fromInitial[/** @type {keyof fromInitial} */ (lowerCasedProp)]
+ ) {
+ return;
+ }
+
+ decl.value =
+ fromInitial[/** @type {keyof fromInitial} */ (lowerCasedProp)];
+ });
+ },
+ };
+ },
+ };
+}
+
+pluginCreator.postcss = true;
+module.exports = pluginCreator;