summaryrefslogtreecommitdiff
path: root/node_modules/postcss-calc/src/lib/transform.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-31 15:37:35 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-31 15:37:35 +0800
commitd5f14083061f2ce6a42313188443a42e30796320 (patch)
treecc6a9889e08b29595a76a33b9e7b4ef84866468b /node_modules/postcss-calc/src/lib/transform.js
parentb1a6ea021f29f182b62f9f81024a3d8ac8621b7f (diff)
added make browserlist(autoprefixer) work fixed
Diffstat (limited to 'node_modules/postcss-calc/src/lib/transform.js')
-rw-r--r--node_modules/postcss-calc/src/lib/transform.js109
1 files changed, 109 insertions, 0 deletions
diff --git a/node_modules/postcss-calc/src/lib/transform.js b/node_modules/postcss-calc/src/lib/transform.js
new file mode 100644
index 00000000..78bff2ef
--- /dev/null
+++ b/node_modules/postcss-calc/src/lib/transform.js
@@ -0,0 +1,109 @@
+'use strict';
+const selectorParser = require('postcss-selector-parser');
+const valueParser = require('postcss-value-parser');
+
+const { parser } = require('../parser.js');
+
+const reducer = require('./reducer.js');
+const stringifier = require('./stringifier.js');
+
+const MATCH_CALC = /((?:-(moz|webkit)-)?calc)/i;
+
+/**
+ * @param {string} value
+ * @param {{precision: number, warnWhenCannotResolve: boolean}} options
+ * @param {import("postcss").Result} result
+ * @param {import("postcss").ChildNode} item
+ */
+function transformValue(value, options, result, item) {
+ return valueParser(value)
+ .walk((node) => {
+ // skip anything which isn't a calc() function
+ if (node.type !== 'function' || !MATCH_CALC.test(node.value)) {
+ return;
+ }
+
+ // stringify calc expression and produce an AST
+ const contents = valueParser.stringify(node.nodes);
+ const ast = parser.parse(contents);
+
+ // reduce AST to its simplest form, that is, either to a single value
+ // or a simplified calc expression
+ const reducedAst = reducer(ast, options.precision);
+
+ // stringify AST and write it back
+ /** @type {valueParser.Node} */ (node).type = 'word';
+ node.value = stringifier(
+ node.value,
+ reducedAst,
+ value,
+ options,
+ result,
+ item
+ );
+
+ return false;
+ })
+ .toString();
+}
+/**
+ * @param {import("postcss-selector-parser").Selectors} value
+ * @param {{precision: number, warnWhenCannotResolve: boolean}} options
+ * @param {import("postcss").Result} result
+ * @param {import("postcss").ChildNode} item
+ */
+function transformSelector(value, options, result, item) {
+ return selectorParser((selectors) => {
+ selectors.walk((node) => {
+ // attribute value
+ // e.g. the "calc(3*3)" part of "div[data-size="calc(3*3)"]"
+ if (node.type === 'attribute' && node.value) {
+ node.setValue(transformValue(node.value, options, result, item));
+ }
+
+ // tag value
+ // e.g. the "calc(3*3)" part of "div:nth-child(2n + calc(3*3))"
+ if (node.type === 'tag') {
+ node.value = transformValue(node.value, options, result, item);
+ }
+
+ return;
+ });
+ }).processSync(value);
+}
+
+/**
+ * @param {any} node
+ * @param {{precision: number, preserve: boolean, warnWhenCannotResolve: boolean}} options
+ * @param {'value'|'params'|'selector'} property
+ * @param {import("postcss").Result} result
+ */
+module.exports = (node, property, options, result) => {
+ let value = node[property];
+
+ try {
+ value =
+ property === 'selector'
+ ? transformSelector(node[property], options, result, node)
+ : transformValue(node[property], options, result, node);
+ } catch (error) {
+ if (error instanceof Error) {
+ result.warn(error.message, { node });
+ } else {
+ result.warn('Error', { node });
+ }
+ return;
+ }
+
+ // if the preserve option is enabled and the value has changed, write the
+ // transformed value into a cloned node which is inserted before the current
+ // node, preserving the original value. Otherwise, overwrite the original
+ // value.
+ if (options.preserve && node[property] !== value) {
+ const clone = node.clone();
+ clone[property] = value;
+ node.parent.insertBefore(node, clone);
+ } else {
+ node[property] = value;
+ }
+};