summaryrefslogtreecommitdiff
path: root/node_modules/postcss-ordered-values/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-ordered-values/src/index.js
parent3fd9400d4dccc25aa29b5702216732e0b7542073 (diff)
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/postcss-ordered-values/src/index.js')
-rw-r--r--node_modules/postcss-ordered-values/src/index.js163
1 files changed, 163 insertions, 0 deletions
diff --git a/node_modules/postcss-ordered-values/src/index.js b/node_modules/postcss-ordered-values/src/index.js
new file mode 100644
index 00000000..42c168a3
--- /dev/null
+++ b/node_modules/postcss-ordered-values/src/index.js
@@ -0,0 +1,163 @@
+'use strict';
+const valueParser = require('postcss-value-parser');
+const {
+ normalizeGridAutoFlow,
+ normalizeGridColumnRowGap,
+ normalizeGridColumnRow,
+} = require('./rules/grid');
+
+// rules
+const animation = require('./rules/animation');
+const border = require('./rules/border');
+const boxShadow = require('./rules/boxShadow');
+const flexFlow = require('./rules/flexFlow');
+const transition = require('./rules/transition');
+const listStyle = require('./rules/listStyle');
+const column = require('./rules/columns');
+const vendorUnprefixed = require('./lib/vendorUnprefixed.js');
+
+/** @type {[string, (parsed: valueParser.ParsedValue) => string][]} */
+const borderRules = [
+ ['border', border],
+ ['border-block', border],
+ ['border-inline', border],
+ ['border-block-end', border],
+ ['border-block-start', border],
+ ['border-inline-end', border],
+ ['border-inline-start', border],
+ ['border-top', border],
+ ['border-right', border],
+ ['border-bottom', border],
+ ['border-left', border],
+];
+
+/** @type {[string, (parsed: valueParser.ParsedValue) => string | string[] | valueParser.ParsedValue][]} */
+const grid = [
+ ['grid-auto-flow', normalizeGridAutoFlow],
+ ['grid-column-gap', normalizeGridColumnRowGap], // normal | <length-percentage>
+ ['grid-row-gap', normalizeGridColumnRowGap], // normal | <length-percentage>
+ ['grid-column', normalizeGridColumnRow], // <grid-line>+
+ ['grid-row', normalizeGridColumnRow], // <grid-line>+
+ ['grid-row-start', normalizeGridColumnRow], // <grid-line>
+ ['grid-row-end', normalizeGridColumnRow], // <grid-line>
+ ['grid-column-start', normalizeGridColumnRow], // <grid-line>
+ ['grid-column-end', normalizeGridColumnRow], // <grid-line>
+];
+
+/** @type {[string, (parsed: valueParser.ParsedValue) => string | valueParser.ParsedValue][]} */
+const columnRules = [
+ ['column-rule', border],
+ ['columns', column],
+];
+
+/** @type {Map<string, ((parsed: valueParser.ParsedValue) => string | string[] | valueParser.ParsedValue)>} */
+const rules = new Map([
+ ['animation', animation],
+ ['outline', border],
+ ['box-shadow', boxShadow],
+ ['flex-flow', flexFlow],
+ ['list-style', listStyle],
+ ['transition', transition],
+ ...borderRules,
+ ...grid,
+ ...columnRules,
+]);
+
+const variableFunctions = new Set(['var', 'env', 'constant']);
+
+/**
+ * @param {valueParser.Node} node
+ * @return {boolean}
+ */
+function isVariableFunctionNode(node) {
+ if (node.type !== 'function') {
+ return false;
+ }
+
+ return variableFunctions.has(node.value.toLowerCase());
+}
+
+/**
+ * @param {valueParser.ParsedValue} parsed
+ * @return {boolean}
+ */
+function shouldAbort(parsed) {
+ let abort = false;
+
+ parsed.walk((node) => {
+ if (
+ node.type === 'comment' ||
+ isVariableFunctionNode(node) ||
+ (node.type === 'word' && node.value.includes(`___CSS_LOADER_IMPORT___`))
+ ) {
+ abort = true;
+
+ return false;
+ }
+ });
+
+ return abort;
+}
+
+/**
+ * @param {import('postcss').Declaration} decl
+ * @return {string}
+ */
+function getValue(decl) {
+ let { value, raws } = decl;
+
+ if (raws && raws.value && raws.value.raw) {
+ value = raws.value.raw;
+ }
+
+ return value;
+}
+/**
+ * @type {import('postcss').PluginCreator<void>}
+ * @return {import('postcss').Plugin}
+ */
+function pluginCreator() {
+ return {
+ postcssPlugin: 'postcss-ordered-values',
+ prepare() {
+ const cache = new Map();
+ return {
+ OnceExit(css) {
+ css.walkDecls((decl) => {
+ const lowerCasedProp = decl.prop.toLowerCase();
+ const normalizedProp = vendorUnprefixed(lowerCasedProp);
+ const processor = rules.get(normalizedProp);
+
+ if (!processor) {
+ return;
+ }
+
+ const value = getValue(decl);
+
+ if (cache.has(value)) {
+ decl.value = cache.get(value);
+
+ return;
+ }
+
+ const parsed = valueParser(value);
+
+ if (parsed.nodes.length < 2 || shouldAbort(parsed)) {
+ cache.set(value, value);
+
+ return;
+ }
+
+ const result = processor(parsed);
+
+ decl.value = result.toString();
+ cache.set(value, result.toString());
+ });
+ },
+ };
+ },
+ };
+}
+
+pluginCreator.postcss = true;
+module.exports = pluginCreator;