@jesscss/core 2.0.0-alpha.4 → 2.0.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs +20159 -0
- package/lib/index.d.cts +5993 -0
- package/lib/index.d.cts.map +1 -0
- package/lib/index.d.ts +5992 -21
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +19926 -22
- package/lib/index.js.map +1 -1
- package/package.json +15 -14
- package/src/__tests__/define-function-record.test.ts +58 -0
- package/src/__tests__/define-function-simple.test.ts +55 -0
- package/src/__tests__/define-function-split-sequence.test.ts +547 -0
- package/src/__tests__/define-function-type-parity.test.ts +9 -0
- package/src/__tests__/define-function.test.ts +763 -0
- package/src/__tests__/num-operations.test.ts +91 -0
- package/src/__tests__/safe-parse.test.ts +374 -0
- package/src/context.ts +896 -0
- package/src/conversions.ts +282 -0
- package/src/debug-log.ts +29 -0
- package/src/define-function.ts +1006 -0
- package/src/deprecation.ts +67 -0
- package/src/globals.d.ts +26 -0
- package/src/index.ts +31 -0
- package/src/jess-error.ts +773 -0
- package/src/logger/deprecation-processing.ts +109 -0
- package/src/logger.ts +31 -0
- package/src/plugin.ts +292 -0
- package/src/tree/LOOKUP_CHAINS.md +35 -0
- package/src/tree/README.md +18 -0
- package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
- package/src/tree/__tests__/ampersand.test.ts +382 -0
- package/src/tree/__tests__/at-rule.test.ts +2047 -0
- package/src/tree/__tests__/basic-render.test.ts +212 -0
- package/src/tree/__tests__/block.test.ts +40 -0
- package/src/tree/__tests__/call.test.ts +346 -0
- package/src/tree/__tests__/color.test.ts +537 -0
- package/src/tree/__tests__/condition.test.ts +186 -0
- package/src/tree/__tests__/control.test.ts +564 -0
- package/src/tree/__tests__/declaration.test.ts +253 -0
- package/src/tree/__tests__/dependency-graph.test.ts +177 -0
- package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
- package/src/tree/__tests__/dimension.test.ts +236 -0
- package/src/tree/__tests__/expression.test.ts +73 -0
- package/src/tree/__tests__/ext-node.test.ts +31 -0
- package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
- package/src/tree/__tests__/extend-import-style.test.ts +929 -0
- package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
- package/src/tree/__tests__/extend-list.test.ts +31 -0
- package/src/tree/__tests__/extend-roots.test.ts +1045 -0
- package/src/tree/__tests__/extend-rules.test.ts +740 -0
- package/src/tree/__tests__/func.test.ts +171 -0
- package/src/tree/__tests__/import-js.test.ts +33 -0
- package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
- package/src/tree/__tests__/import-style.test.ts +1967 -0
- package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
- package/src/tree/__tests__/interpolated.test.ts +41 -0
- package/src/tree/__tests__/list.test.ts +177 -0
- package/src/tree/__tests__/log.test.ts +83 -0
- package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
- package/src/tree/__tests__/mixin.test.ts +2171 -0
- package/src/tree/__tests__/negative.test.ts +45 -0
- package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
- package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
- package/src/tree/__tests__/node-flags.test.ts +410 -0
- package/src/tree/__tests__/node-graph.test.ts +598 -0
- package/src/tree/__tests__/node-mutation.test.ts +182 -0
- package/src/tree/__tests__/operation.test.ts +18 -0
- package/src/tree/__tests__/paren.test.ts +90 -0
- package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
- package/src/tree/__tests__/quoted.test.ts +72 -0
- package/src/tree/__tests__/range.test.ts +59 -0
- package/src/tree/__tests__/reference.test.ts +743 -0
- package/src/tree/__tests__/rest.test.ts +29 -0
- package/src/tree/__tests__/rules-raw.test.ts +14 -0
- package/src/tree/__tests__/rules.test.ts +1271 -0
- package/src/tree/__tests__/ruleset.test.ts +597 -0
- package/src/tree/__tests__/selector-attr.test.ts +50 -0
- package/src/tree/__tests__/selector-basic.test.ts +44 -0
- package/src/tree/__tests__/selector-capture.test.ts +22 -0
- package/src/tree/__tests__/selector-complex.test.ts +120 -0
- package/src/tree/__tests__/selector-compound.test.ts +74 -0
- package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
- package/src/tree/__tests__/selector-list.test.ts +59 -0
- package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
- package/src/tree/__tests__/selector.test.ts +182 -0
- package/src/tree/__tests__/sequence.test.ts +226 -0
- package/src/tree/__tests__/serialize-types.test.ts +529 -0
- package/src/tree/__tests__/spaced.test.ts +8 -0
- package/src/tree/__tests__/url.test.ts +72 -0
- package/src/tree/__tests__/var-declaration.test.ts +90 -0
- package/src/tree/ampersand.ts +538 -0
- package/src/tree/any.ts +169 -0
- package/src/tree/at-rule.ts +760 -0
- package/src/tree/block.ts +72 -0
- package/src/tree/bool.ts +46 -0
- package/src/tree/call.ts +593 -0
- package/src/tree/collection.ts +52 -0
- package/src/tree/color.ts +629 -0
- package/src/tree/combinator.ts +30 -0
- package/src/tree/comment.ts +36 -0
- package/src/tree/condition.ts +194 -0
- package/src/tree/control.ts +452 -0
- package/src/tree/declaration-custom.ts +56 -0
- package/src/tree/declaration-var.ts +87 -0
- package/src/tree/declaration.ts +742 -0
- package/src/tree/default-guard.ts +35 -0
- package/src/tree/dimension.ts +392 -0
- package/src/tree/expression.ts +97 -0
- package/src/tree/extend-list.ts +51 -0
- package/src/tree/extend.ts +391 -0
- package/src/tree/function.ts +254 -0
- package/src/tree/import-js.ts +130 -0
- package/src/tree/import-style.ts +875 -0
- package/{lib/tree/index.js → src/tree/index.ts} +49 -22
- package/src/tree/interpolated.ts +346 -0
- package/src/tree/js-array.ts +21 -0
- package/src/tree/js-expr.ts +50 -0
- package/src/tree/js-function.ts +31 -0
- package/src/tree/js-object.ts +22 -0
- package/src/tree/list.ts +415 -0
- package/src/tree/log.ts +89 -0
- package/src/tree/mixin.ts +331 -0
- package/src/tree/negative.ts +58 -0
- package/src/tree/nil.ts +57 -0
- package/src/tree/node-base.ts +1716 -0
- package/src/tree/node-type.ts +122 -0
- package/src/tree/node.ts +118 -0
- package/src/tree/number.ts +54 -0
- package/src/tree/operation.ts +187 -0
- package/src/tree/paren.ts +132 -0
- package/src/tree/query-condition.ts +47 -0
- package/src/tree/quoted.ts +119 -0
- package/src/tree/range.ts +101 -0
- package/src/tree/reference.ts +1099 -0
- package/src/tree/rest.ts +55 -0
- package/src/tree/rules-raw.ts +52 -0
- package/src/tree/rules.ts +2896 -0
- package/src/tree/ruleset.ts +1217 -0
- package/src/tree/selector-attr.ts +172 -0
- package/src/tree/selector-basic.ts +75 -0
- package/src/tree/selector-capture.ts +85 -0
- package/src/tree/selector-complex.ts +189 -0
- package/src/tree/selector-compound.ts +205 -0
- package/src/tree/selector-interpolated.ts +95 -0
- package/src/tree/selector-list.ts +245 -0
- package/src/tree/selector-pseudo.ts +173 -0
- package/src/tree/selector-simple.ts +10 -0
- package/src/tree/selector.ts +152 -0
- package/src/tree/sequence.ts +463 -0
- package/src/tree/tree.ts +130 -0
- package/src/tree/url.ts +95 -0
- package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
- package/src/tree/util/EXTEND_AUDIT.md +233 -0
- package/src/tree/util/EXTEND_BASELINE.md +64 -0
- package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
- package/src/tree/util/EXTEND_DOCS.md +24 -0
- package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
- package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
- package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
- package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
- package/src/tree/util/EXTEND_RULES.md +74 -0
- package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
- package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
- package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
- package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
- package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
- package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
- package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
- package/src/tree/util/__tests__/_archive/README.md +4 -0
- package/src/tree/util/__tests__/bitset.test.ts +142 -0
- package/src/tree/util/__tests__/debug-log.ts +50 -0
- package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
- package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
- package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
- package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
- package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
- package/src/tree/util/__tests__/is-node.test.ts +63 -0
- package/src/tree/util/__tests__/list-like.test.ts +63 -0
- package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
- package/src/tree/util/__tests__/print.test.ts +183 -0
- package/src/tree/util/__tests__/process-extends.test.ts +226 -0
- package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
- package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
- package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
- package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
- package/src/tree/util/ampersand-template.ts +9 -0
- package/src/tree/util/bitset.ts +194 -0
- package/src/tree/util/calculate.ts +11 -0
- package/src/tree/util/cast.ts +89 -0
- package/src/tree/util/cloning.ts +8 -0
- package/src/tree/util/collections.ts +299 -0
- package/src/tree/util/compare.ts +90 -0
- package/src/tree/util/cursor.ts +171 -0
- package/src/tree/util/extend-core.ts +2139 -0
- package/src/tree/util/extend-roots.ts +1108 -0
- package/src/tree/util/field-helpers.ts +354 -0
- package/src/tree/util/is-node.ts +43 -0
- package/src/tree/util/list-like.ts +93 -0
- package/src/tree/util/mixin-instance-primitives.ts +2020 -0
- package/src/tree/util/print.ts +303 -0
- package/src/tree/util/process-leading-is.ts +421 -0
- package/src/tree/util/recursion-helper.ts +54 -0
- package/src/tree/util/regex.ts +2 -0
- package/src/tree/util/registry-utils.ts +1953 -0
- package/src/tree/util/ruleset-trace.ts +17 -0
- package/src/tree/util/scoped-body-eval.ts +320 -0
- package/src/tree/util/selector-match-core.ts +2005 -0
- package/src/tree/util/selector-utils.ts +757 -0
- package/src/tree/util/serialize-helper.ts +535 -0
- package/src/tree/util/serialize-types.ts +318 -0
- package/src/tree/util/should-operate.ts +78 -0
- package/src/tree/util/sourcemap.ts +37 -0
- package/src/types/config.ts +247 -0
- package/src/types/index.ts +12 -0
- package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
- package/src/types.d.ts +9 -0
- package/src/types.ts +68 -0
- package/src/use-webpack-resolver.ts +56 -0
- package/src/visitor/__tests__/visitor.test.ts +136 -0
- package/src/visitor/index.ts +263 -0
- package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
- package/lib/context.d.ts +0 -352
- package/lib/context.d.ts.map +0 -1
- package/lib/context.js +0 -636
- package/lib/context.js.map +0 -1
- package/lib/conversions.d.ts +0 -73
- package/lib/conversions.d.ts.map +0 -1
- package/lib/conversions.js +0 -253
- package/lib/conversions.js.map +0 -1
- package/lib/debug-log.d.ts +0 -2
- package/lib/debug-log.d.ts.map +0 -1
- package/lib/debug-log.js +0 -27
- package/lib/debug-log.js.map +0 -1
- package/lib/define-function.d.ts +0 -587
- package/lib/define-function.d.ts.map +0 -1
- package/lib/define-function.js +0 -726
- package/lib/define-function.js.map +0 -1
- package/lib/deprecation.d.ts +0 -34
- package/lib/deprecation.d.ts.map +0 -1
- package/lib/deprecation.js +0 -57
- package/lib/deprecation.js.map +0 -1
- package/lib/jess-error.d.ts +0 -343
- package/lib/jess-error.d.ts.map +0 -1
- package/lib/jess-error.js +0 -508
- package/lib/jess-error.js.map +0 -1
- package/lib/logger/deprecation-processing.d.ts +0 -41
- package/lib/logger/deprecation-processing.d.ts.map +0 -1
- package/lib/logger/deprecation-processing.js +0 -81
- package/lib/logger/deprecation-processing.js.map +0 -1
- package/lib/logger.d.ts +0 -10
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js +0 -20
- package/lib/logger.js.map +0 -1
- package/lib/plugin.d.ts +0 -94
- package/lib/plugin.d.ts.map +0 -1
- package/lib/plugin.js +0 -174
- package/lib/plugin.js.map +0 -1
- package/lib/tree/ampersand.d.ts +0 -94
- package/lib/tree/ampersand.d.ts.map +0 -1
- package/lib/tree/ampersand.js +0 -269
- package/lib/tree/ampersand.js.map +0 -1
- package/lib/tree/any.d.ts +0 -58
- package/lib/tree/any.d.ts.map +0 -1
- package/lib/tree/any.js +0 -104
- package/lib/tree/any.js.map +0 -1
- package/lib/tree/at-rule.d.ts +0 -53
- package/lib/tree/at-rule.d.ts.map +0 -1
- package/lib/tree/at-rule.js +0 -503
- package/lib/tree/at-rule.js.map +0 -1
- package/lib/tree/block.d.ts +0 -22
- package/lib/tree/block.d.ts.map +0 -1
- package/lib/tree/block.js +0 -24
- package/lib/tree/block.js.map +0 -1
- package/lib/tree/bool.d.ts +0 -18
- package/lib/tree/bool.d.ts.map +0 -1
- package/lib/tree/bool.js +0 -28
- package/lib/tree/bool.js.map +0 -1
- package/lib/tree/call.d.ts +0 -66
- package/lib/tree/call.d.ts.map +0 -1
- package/lib/tree/call.js +0 -306
- package/lib/tree/call.js.map +0 -1
- package/lib/tree/collection.d.ts +0 -30
- package/lib/tree/collection.d.ts.map +0 -1
- package/lib/tree/collection.js +0 -37
- package/lib/tree/collection.js.map +0 -1
- package/lib/tree/color.d.ts +0 -101
- package/lib/tree/color.d.ts.map +0 -1
- package/lib/tree/color.js +0 -513
- package/lib/tree/color.js.map +0 -1
- package/lib/tree/combinator.d.ts +0 -13
- package/lib/tree/combinator.d.ts.map +0 -1
- package/lib/tree/combinator.js +0 -12
- package/lib/tree/combinator.js.map +0 -1
- package/lib/tree/comment.d.ts +0 -20
- package/lib/tree/comment.d.ts.map +0 -1
- package/lib/tree/comment.js +0 -19
- package/lib/tree/comment.js.map +0 -1
- package/lib/tree/condition.d.ts +0 -31
- package/lib/tree/condition.d.ts.map +0 -1
- package/lib/tree/condition.js +0 -103
- package/lib/tree/condition.js.map +0 -1
- package/lib/tree/control.d.ts +0 -104
- package/lib/tree/control.d.ts.map +0 -1
- package/lib/tree/control.js +0 -430
- package/lib/tree/control.js.map +0 -1
- package/lib/tree/declaration-custom.d.ts +0 -18
- package/lib/tree/declaration-custom.d.ts.map +0 -1
- package/lib/tree/declaration-custom.js +0 -24
- package/lib/tree/declaration-custom.js.map +0 -1
- package/lib/tree/declaration-var.d.ts +0 -35
- package/lib/tree/declaration-var.d.ts.map +0 -1
- package/lib/tree/declaration-var.js +0 -63
- package/lib/tree/declaration-var.js.map +0 -1
- package/lib/tree/declaration.d.ts +0 -78
- package/lib/tree/declaration.d.ts.map +0 -1
- package/lib/tree/declaration.js +0 -286
- package/lib/tree/declaration.js.map +0 -1
- package/lib/tree/default-guard.d.ts +0 -15
- package/lib/tree/default-guard.d.ts.map +0 -1
- package/lib/tree/default-guard.js +0 -19
- package/lib/tree/default-guard.js.map +0 -1
- package/lib/tree/dimension.d.ts +0 -34
- package/lib/tree/dimension.d.ts.map +0 -1
- package/lib/tree/dimension.js +0 -294
- package/lib/tree/dimension.js.map +0 -1
- package/lib/tree/expression.d.ts +0 -25
- package/lib/tree/expression.d.ts.map +0 -1
- package/lib/tree/expression.js +0 -32
- package/lib/tree/expression.js.map +0 -1
- package/lib/tree/extend-list.d.ts +0 -23
- package/lib/tree/extend-list.d.ts.map +0 -1
- package/lib/tree/extend-list.js +0 -23
- package/lib/tree/extend-list.js.map +0 -1
- package/lib/tree/extend.d.ts +0 -47
- package/lib/tree/extend.d.ts.map +0 -1
- package/lib/tree/extend.js +0 -296
- package/lib/tree/extend.js.map +0 -1
- package/lib/tree/function.d.ts +0 -48
- package/lib/tree/function.d.ts.map +0 -1
- package/lib/tree/function.js +0 -74
- package/lib/tree/function.js.map +0 -1
- package/lib/tree/import-js.d.ts +0 -35
- package/lib/tree/import-js.d.ts.map +0 -1
- package/lib/tree/import-js.js +0 -45
- package/lib/tree/import-js.js.map +0 -1
- package/lib/tree/import-style.d.ts +0 -156
- package/lib/tree/import-style.d.ts.map +0 -1
- package/lib/tree/import-style.js +0 -566
- package/lib/tree/import-style.js.map +0 -1
- package/lib/tree/index.d.ts +0 -71
- package/lib/tree/index.d.ts.map +0 -1
- package/lib/tree/index.js.map +0 -1
- package/lib/tree/interpolated-reference.d.ts +0 -24
- package/lib/tree/interpolated-reference.d.ts.map +0 -1
- package/lib/tree/interpolated-reference.js +0 -37
- package/lib/tree/interpolated-reference.js.map +0 -1
- package/lib/tree/interpolated.d.ts +0 -62
- package/lib/tree/interpolated.d.ts.map +0 -1
- package/lib/tree/interpolated.js +0 -204
- package/lib/tree/interpolated.js.map +0 -1
- package/lib/tree/js-array.d.ts +0 -10
- package/lib/tree/js-array.d.ts.map +0 -1
- package/lib/tree/js-array.js +0 -10
- package/lib/tree/js-array.js.map +0 -1
- package/lib/tree/js-expr.d.ts +0 -23
- package/lib/tree/js-expr.d.ts.map +0 -1
- package/lib/tree/js-expr.js +0 -28
- package/lib/tree/js-expr.js.map +0 -1
- package/lib/tree/js-function.d.ts +0 -20
- package/lib/tree/js-function.d.ts.map +0 -1
- package/lib/tree/js-function.js +0 -16
- package/lib/tree/js-function.js.map +0 -1
- package/lib/tree/js-object.d.ts +0 -10
- package/lib/tree/js-object.d.ts.map +0 -1
- package/lib/tree/js-object.js +0 -10
- package/lib/tree/js-object.js.map +0 -1
- package/lib/tree/list.d.ts +0 -38
- package/lib/tree/list.d.ts.map +0 -1
- package/lib/tree/list.js +0 -83
- package/lib/tree/list.js.map +0 -1
- package/lib/tree/log.d.ts +0 -29
- package/lib/tree/log.d.ts.map +0 -1
- package/lib/tree/log.js +0 -56
- package/lib/tree/log.js.map +0 -1
- package/lib/tree/mixin.d.ts +0 -87
- package/lib/tree/mixin.d.ts.map +0 -1
- package/lib/tree/mixin.js +0 -112
- package/lib/tree/mixin.js.map +0 -1
- package/lib/tree/negative.d.ts +0 -17
- package/lib/tree/negative.d.ts.map +0 -1
- package/lib/tree/negative.js +0 -22
- package/lib/tree/negative.js.map +0 -1
- package/lib/tree/nil.d.ts +0 -30
- package/lib/tree/nil.d.ts.map +0 -1
- package/lib/tree/nil.js +0 -35
- package/lib/tree/nil.js.map +0 -1
- package/lib/tree/node-base.d.ts +0 -361
- package/lib/tree/node-base.d.ts.map +0 -1
- package/lib/tree/node-base.js +0 -930
- package/lib/tree/node-base.js.map +0 -1
- package/lib/tree/node.d.ts +0 -10
- package/lib/tree/node.d.ts.map +0 -1
- package/lib/tree/node.js +0 -45
- package/lib/tree/node.js.map +0 -1
- package/lib/tree/number.d.ts +0 -21
- package/lib/tree/number.d.ts.map +0 -1
- package/lib/tree/number.js +0 -27
- package/lib/tree/number.js.map +0 -1
- package/lib/tree/operation.d.ts +0 -26
- package/lib/tree/operation.d.ts.map +0 -1
- package/lib/tree/operation.js +0 -103
- package/lib/tree/operation.js.map +0 -1
- package/lib/tree/paren.d.ts +0 -19
- package/lib/tree/paren.d.ts.map +0 -1
- package/lib/tree/paren.js +0 -92
- package/lib/tree/paren.js.map +0 -1
- package/lib/tree/query-condition.d.ts +0 -17
- package/lib/tree/query-condition.d.ts.map +0 -1
- package/lib/tree/query-condition.js +0 -39
- package/lib/tree/query-condition.js.map +0 -1
- package/lib/tree/quoted.d.ts +0 -28
- package/lib/tree/quoted.d.ts.map +0 -1
- package/lib/tree/quoted.js +0 -75
- package/lib/tree/quoted.js.map +0 -1
- package/lib/tree/range.d.ts +0 -33
- package/lib/tree/range.d.ts.map +0 -1
- package/lib/tree/range.js +0 -47
- package/lib/tree/range.js.map +0 -1
- package/lib/tree/reference.d.ts +0 -76
- package/lib/tree/reference.d.ts.map +0 -1
- package/lib/tree/reference.js +0 -521
- package/lib/tree/reference.js.map +0 -1
- package/lib/tree/rest.d.ts +0 -15
- package/lib/tree/rest.d.ts.map +0 -1
- package/lib/tree/rest.js +0 -32
- package/lib/tree/rest.js.map +0 -1
- package/lib/tree/rules-raw.d.ts +0 -17
- package/lib/tree/rules-raw.d.ts.map +0 -1
- package/lib/tree/rules-raw.js +0 -37
- package/lib/tree/rules-raw.js.map +0 -1
- package/lib/tree/rules.d.ts +0 -262
- package/lib/tree/rules.d.ts.map +0 -1
- package/lib/tree/rules.js +0 -2359
- package/lib/tree/rules.js.map +0 -1
- package/lib/tree/ruleset.d.ts +0 -92
- package/lib/tree/ruleset.d.ts.map +0 -1
- package/lib/tree/ruleset.js +0 -528
- package/lib/tree/ruleset.js.map +0 -1
- package/lib/tree/selector-attr.d.ts +0 -31
- package/lib/tree/selector-attr.d.ts.map +0 -1
- package/lib/tree/selector-attr.js +0 -99
- package/lib/tree/selector-attr.js.map +0 -1
- package/lib/tree/selector-basic.d.ts +0 -24
- package/lib/tree/selector-basic.d.ts.map +0 -1
- package/lib/tree/selector-basic.js +0 -38
- package/lib/tree/selector-basic.js.map +0 -1
- package/lib/tree/selector-capture.d.ts +0 -23
- package/lib/tree/selector-capture.d.ts.map +0 -1
- package/lib/tree/selector-capture.js +0 -34
- package/lib/tree/selector-capture.js.map +0 -1
- package/lib/tree/selector-complex.d.ts +0 -40
- package/lib/tree/selector-complex.d.ts.map +0 -1
- package/lib/tree/selector-complex.js +0 -143
- package/lib/tree/selector-complex.js.map +0 -1
- package/lib/tree/selector-compound.d.ts +0 -16
- package/lib/tree/selector-compound.d.ts.map +0 -1
- package/lib/tree/selector-compound.js +0 -114
- package/lib/tree/selector-compound.js.map +0 -1
- package/lib/tree/selector-interpolated.d.ts +0 -23
- package/lib/tree/selector-interpolated.d.ts.map +0 -1
- package/lib/tree/selector-interpolated.js +0 -27
- package/lib/tree/selector-interpolated.js.map +0 -1
- package/lib/tree/selector-list.d.ts +0 -17
- package/lib/tree/selector-list.d.ts.map +0 -1
- package/lib/tree/selector-list.js +0 -174
- package/lib/tree/selector-list.js.map +0 -1
- package/lib/tree/selector-pseudo.d.ts +0 -42
- package/lib/tree/selector-pseudo.d.ts.map +0 -1
- package/lib/tree/selector-pseudo.js +0 -204
- package/lib/tree/selector-pseudo.js.map +0 -1
- package/lib/tree/selector-simple.d.ts +0 -5
- package/lib/tree/selector-simple.d.ts.map +0 -1
- package/lib/tree/selector-simple.js +0 -6
- package/lib/tree/selector-simple.js.map +0 -1
- package/lib/tree/selector.d.ts +0 -43
- package/lib/tree/selector.d.ts.map +0 -1
- package/lib/tree/selector.js +0 -56
- package/lib/tree/selector.js.map +0 -1
- package/lib/tree/sequence.d.ts +0 -43
- package/lib/tree/sequence.d.ts.map +0 -1
- package/lib/tree/sequence.js +0 -151
- package/lib/tree/sequence.js.map +0 -1
- package/lib/tree/tree.d.ts +0 -87
- package/lib/tree/tree.d.ts.map +0 -1
- package/lib/tree/tree.js +0 -2
- package/lib/tree/tree.js.map +0 -1
- package/lib/tree/url.d.ts +0 -18
- package/lib/tree/url.d.ts.map +0 -1
- package/lib/tree/url.js +0 -35
- package/lib/tree/url.js.map +0 -1
- package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
- package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
- package/lib/tree/util/__tests__/debug-log.js +0 -36
- package/lib/tree/util/__tests__/debug-log.js.map +0 -1
- package/lib/tree/util/calculate.d.ts +0 -3
- package/lib/tree/util/calculate.d.ts.map +0 -1
- package/lib/tree/util/calculate.js +0 -10
- package/lib/tree/util/calculate.js.map +0 -1
- package/lib/tree/util/cast.d.ts +0 -10
- package/lib/tree/util/cast.d.ts.map +0 -1
- package/lib/tree/util/cast.js +0 -87
- package/lib/tree/util/cast.js.map +0 -1
- package/lib/tree/util/cloning.d.ts +0 -4
- package/lib/tree/util/cloning.d.ts.map +0 -1
- package/lib/tree/util/cloning.js +0 -8
- package/lib/tree/util/cloning.js.map +0 -1
- package/lib/tree/util/collections.d.ts +0 -57
- package/lib/tree/util/collections.d.ts.map +0 -1
- package/lib/tree/util/collections.js +0 -136
- package/lib/tree/util/collections.js.map +0 -1
- package/lib/tree/util/compare.d.ts +0 -11
- package/lib/tree/util/compare.d.ts.map +0 -1
- package/lib/tree/util/compare.js +0 -89
- package/lib/tree/util/compare.js.map +0 -1
- package/lib/tree/util/extend-helpers.d.ts +0 -2
- package/lib/tree/util/extend-helpers.d.ts.map +0 -1
- package/lib/tree/util/extend-helpers.js +0 -2
- package/lib/tree/util/extend-helpers.js.map +0 -1
- package/lib/tree/util/extend-roots.d.ts +0 -37
- package/lib/tree/util/extend-roots.d.ts.map +0 -1
- package/lib/tree/util/extend-roots.js +0 -700
- package/lib/tree/util/extend-roots.js.map +0 -1
- package/lib/tree/util/extend-roots.old.d.ts +0 -132
- package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
- package/lib/tree/util/extend-roots.old.js +0 -2272
- package/lib/tree/util/extend-roots.old.js.map +0 -1
- package/lib/tree/util/extend-trace-debug.d.ts +0 -13
- package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
- package/lib/tree/util/extend-trace-debug.js +0 -34
- package/lib/tree/util/extend-trace-debug.js.map +0 -1
- package/lib/tree/util/extend-walk.d.ts +0 -53
- package/lib/tree/util/extend-walk.d.ts.map +0 -1
- package/lib/tree/util/extend-walk.js +0 -881
- package/lib/tree/util/extend-walk.js.map +0 -1
- package/lib/tree/util/extend.d.ts +0 -218
- package/lib/tree/util/extend.d.ts.map +0 -1
- package/lib/tree/util/extend.js +0 -3182
- package/lib/tree/util/extend.js.map +0 -1
- package/lib/tree/util/find-extendable-locations.d.ts +0 -2
- package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
- package/lib/tree/util/find-extendable-locations.js +0 -2
- package/lib/tree/util/find-extendable-locations.js.map +0 -1
- package/lib/tree/util/format.d.ts +0 -20
- package/lib/tree/util/format.d.ts.map +0 -1
- package/lib/tree/util/format.js +0 -67
- package/lib/tree/util/format.js.map +0 -1
- package/lib/tree/util/is-node.d.ts +0 -13
- package/lib/tree/util/is-node.d.ts.map +0 -1
- package/lib/tree/util/is-node.js +0 -43
- package/lib/tree/util/is-node.js.map +0 -1
- package/lib/tree/util/print.d.ts +0 -80
- package/lib/tree/util/print.d.ts.map +0 -1
- package/lib/tree/util/print.js +0 -205
- package/lib/tree/util/print.js.map +0 -1
- package/lib/tree/util/process-leading-is.d.ts +0 -25
- package/lib/tree/util/process-leading-is.d.ts.map +0 -1
- package/lib/tree/util/process-leading-is.js +0 -364
- package/lib/tree/util/process-leading-is.js.map +0 -1
- package/lib/tree/util/recursion-helper.d.ts +0 -15
- package/lib/tree/util/recursion-helper.d.ts.map +0 -1
- package/lib/tree/util/recursion-helper.js +0 -43
- package/lib/tree/util/recursion-helper.js.map +0 -1
- package/lib/tree/util/regex.d.ts +0 -4
- package/lib/tree/util/regex.d.ts.map +0 -1
- package/lib/tree/util/regex.js +0 -4
- package/lib/tree/util/regex.js.map +0 -1
- package/lib/tree/util/registry-utils.d.ts +0 -192
- package/lib/tree/util/registry-utils.d.ts.map +0 -1
- package/lib/tree/util/registry-utils.js +0 -1214
- package/lib/tree/util/registry-utils.js.map +0 -1
- package/lib/tree/util/ruleset-trace.d.ts +0 -4
- package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
- package/lib/tree/util/ruleset-trace.js +0 -14
- package/lib/tree/util/ruleset-trace.js.map +0 -1
- package/lib/tree/util/selector-compare.d.ts +0 -2
- package/lib/tree/util/selector-compare.d.ts.map +0 -1
- package/lib/tree/util/selector-compare.js +0 -2
- package/lib/tree/util/selector-compare.js.map +0 -1
- package/lib/tree/util/selector-match-core.d.ts +0 -184
- package/lib/tree/util/selector-match-core.d.ts.map +0 -1
- package/lib/tree/util/selector-match-core.js +0 -1603
- package/lib/tree/util/selector-match-core.js.map +0 -1
- package/lib/tree/util/selector-utils.d.ts +0 -30
- package/lib/tree/util/selector-utils.d.ts.map +0 -1
- package/lib/tree/util/selector-utils.js +0 -100
- package/lib/tree/util/selector-utils.js.map +0 -1
- package/lib/tree/util/serialize-helper.d.ts +0 -13
- package/lib/tree/util/serialize-helper.d.ts.map +0 -1
- package/lib/tree/util/serialize-helper.js +0 -387
- package/lib/tree/util/serialize-helper.js.map +0 -1
- package/lib/tree/util/serialize-types.d.ts +0 -9
- package/lib/tree/util/serialize-types.d.ts.map +0 -1
- package/lib/tree/util/serialize-types.js +0 -216
- package/lib/tree/util/serialize-types.js.map +0 -1
- package/lib/tree/util/should-operate.d.ts +0 -23
- package/lib/tree/util/should-operate.d.ts.map +0 -1
- package/lib/tree/util/should-operate.js +0 -46
- package/lib/tree/util/should-operate.js.map +0 -1
- package/lib/tree/util/sourcemap.d.ts +0 -7
- package/lib/tree/util/sourcemap.d.ts.map +0 -1
- package/lib/tree/util/sourcemap.js +0 -25
- package/lib/tree/util/sourcemap.js.map +0 -1
- package/lib/types/config.d.ts +0 -205
- package/lib/types/config.d.ts.map +0 -1
- package/lib/types/config.js +0 -2
- package/lib/types/config.js.map +0 -1
- package/lib/types/index.d.ts +0 -15
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/index.js +0 -3
- package/lib/types/index.js.map +0 -1
- package/lib/types/modes.d.ts.map +0 -1
- package/lib/types/modes.js +0 -2
- package/lib/types/modes.js.map +0 -1
- package/lib/types.d.ts +0 -61
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -2
- package/lib/types.js.map +0 -1
- package/lib/use-webpack-resolver.d.ts +0 -9
- package/lib/use-webpack-resolver.d.ts.map +0 -1
- package/lib/use-webpack-resolver.js +0 -41
- package/lib/use-webpack-resolver.js.map +0 -1
- package/lib/visitor/index.d.ts +0 -136
- package/lib/visitor/index.d.ts.map +0 -1
- package/lib/visitor/index.js +0 -135
- package/lib/visitor/index.js.map +0 -1
- package/lib/visitor/less-visitor.d.ts +0 -7
- package/lib/visitor/less-visitor.d.ts.map +0 -1
- package/lib/visitor/less-visitor.js.map +0 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type Context } from '../context.js';
|
|
2
|
+
import { Node, defineType } from './node.js';
|
|
3
|
+
import { Bool } from './bool.js';
|
|
4
|
+
import { type PrintOptions, getPrintOptions } from './util/print.js';
|
|
5
|
+
|
|
6
|
+
export interface DefaultGuard extends Node<string> {
|
|
7
|
+
type: 'DefaultGuard';
|
|
8
|
+
shortType: 'defaultguard';
|
|
9
|
+
eval(context: Context): Bool;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class DefaultGuard extends Node<string> {
|
|
13
|
+
static override childKeys = null as null;
|
|
14
|
+
|
|
15
|
+
readonly value!: string;
|
|
16
|
+
|
|
17
|
+
constructor(value: string, options?: any, location?: any, treeContext?: any) {
|
|
18
|
+
super(value, options, location, treeContext);
|
|
19
|
+
this.value = value;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override toTrimmedString(options?: PrintOptions) {
|
|
23
|
+
options = getPrintOptions(options);
|
|
24
|
+
const w = options.writer!;
|
|
25
|
+
const mark = w.mark();
|
|
26
|
+
w.add('default', this);
|
|
27
|
+
return w.getSince(mark);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
override evalNode(context: Context): Bool {
|
|
31
|
+
return new Bool(Boolean(context.isDefault));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const defaultguard = defineType(DefaultGuard, 'DefaultGuard');
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import type { Class } from 'type-fest';
|
|
2
|
+
import { type Context } from '../context.js';
|
|
3
|
+
import { Color, ColorFormat } from './color.js';
|
|
4
|
+
import {
|
|
5
|
+
Node,
|
|
6
|
+
F_STATIC,
|
|
7
|
+
type OptionalLocation,
|
|
8
|
+
type NodeOptions,
|
|
9
|
+
type TreeContext,
|
|
10
|
+
defineType
|
|
11
|
+
} from './node.js';
|
|
12
|
+
import { type Operator, calculate } from './util/calculate.js';
|
|
13
|
+
import { logger } from '../logger.js';
|
|
14
|
+
import round from 'lodash-es/round.js';
|
|
15
|
+
import { type PrintOptions, getPrintOptions } from './util/print.js';
|
|
16
|
+
|
|
17
|
+
// import type { Context } from '../context.js'
|
|
18
|
+
// import type { OutputCollector } from '../output'
|
|
19
|
+
|
|
20
|
+
export type DimensionValue = {
|
|
21
|
+
number: number;
|
|
22
|
+
unit?: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const { isArray } = Array;
|
|
26
|
+
|
|
27
|
+
type LengthUnit = 'm' | 'cm' | 'mm' | 'in' | 'px' | 'pt' | 'pc';
|
|
28
|
+
type DurationUnit = 's' | 'ms';
|
|
29
|
+
type AngleUnit = 'rad' | 'deg' | 'grad' | 'turn';
|
|
30
|
+
type ConversionUnit = LengthUnit | DurationUnit | AngleUnit;
|
|
31
|
+
type UnitMapEntries = Array<[ConversionUnit, ConversionGroup]>;
|
|
32
|
+
|
|
33
|
+
export interface Dimension extends Node<DimensionValue> {
|
|
34
|
+
type: 'Dimension' | 'Num';
|
|
35
|
+
shortType: 'dimension' | 'num';
|
|
36
|
+
eval(context: Context): Dimension;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A number or dimension
|
|
41
|
+
*/
|
|
42
|
+
export class Dimension extends Node<DimensionValue> {
|
|
43
|
+
static override childKeys = null as null;
|
|
44
|
+
|
|
45
|
+
readonly number!: number;
|
|
46
|
+
readonly unit: string | undefined;
|
|
47
|
+
|
|
48
|
+
constructor(
|
|
49
|
+
value: DimensionValue,
|
|
50
|
+
options?: NodeOptions,
|
|
51
|
+
location?: OptionalLocation,
|
|
52
|
+
treeContext?: TreeContext
|
|
53
|
+
) {
|
|
54
|
+
super(value, options, location, treeContext);
|
|
55
|
+
this.number = value.number;
|
|
56
|
+
this.unit = value.unit;
|
|
57
|
+
this.addFlag(F_STATIC);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Compatibility — synthesizes the legacy .data shape from instance fields */
|
|
61
|
+
|
|
62
|
+
private _unitToGroup: Map<string, ConversionGroup> | undefined;
|
|
63
|
+
get unitToGroup() {
|
|
64
|
+
let unitToGroup = this._unitToGroup;
|
|
65
|
+
if (!unitToGroup) {
|
|
66
|
+
const lengthEntries: UnitMapEntries = ['m', 'cm', 'mm', 'in', 'px', 'pt', 'pc'].map(unit => [unit as LengthUnit, ConversionGroup.Length]);
|
|
67
|
+
const durationEntries: UnitMapEntries = ['s', 'ms'].map(unit => [unit as DurationUnit, ConversionGroup.Duration]);
|
|
68
|
+
const angleEntries: UnitMapEntries = ['rad', 'deg', 'grad', 'turn'].map(unit => [unit as AngleUnit, ConversionGroup.Angle]);
|
|
69
|
+
const entries = lengthEntries.concat(durationEntries).concat(angleEntries);
|
|
70
|
+
this._unitToGroup = unitToGroup = new Map(entries);
|
|
71
|
+
}
|
|
72
|
+
return unitToGroup;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
override clone(deep?: boolean): this {
|
|
76
|
+
const options = this._meta?.options;
|
|
77
|
+
const newNode = new (this.constructor as Class<this>)(
|
|
78
|
+
{ number: this.number, unit: this.unit },
|
|
79
|
+
options ? { ...options } : undefined,
|
|
80
|
+
this.location,
|
|
81
|
+
this.treeContext
|
|
82
|
+
);
|
|
83
|
+
newNode.inherit(this);
|
|
84
|
+
return newNode;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
override valueOf() {
|
|
88
|
+
const { number, unit } = this;
|
|
89
|
+
return unit ? `${number}${unit}` : number;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
override operate(b: Node, op: Operator, context?: Context | undefined): Dimension | Color {
|
|
93
|
+
if (!(b instanceof Dimension || b instanceof Color)) {
|
|
94
|
+
throw new TypeError(`Cannot operate on ${b.type}`);
|
|
95
|
+
}
|
|
96
|
+
let unitToGroup = this.unitToGroup;
|
|
97
|
+
if (b instanceof Color) {
|
|
98
|
+
let { number, unit } = this;
|
|
99
|
+
const unitMode = context?.opts?.unitMode ?? 'loose';
|
|
100
|
+
const isStrictLikeMode = unitMode === 'strict' || unitMode === 'preserve';
|
|
101
|
+
if (unit && isStrictLikeMode) {
|
|
102
|
+
throw new TypeError(`Cannot convert "${this}" to a color`);
|
|
103
|
+
}
|
|
104
|
+
let thisColor = new Color(
|
|
105
|
+
{ rgb: [number, number, number] },
|
|
106
|
+
{ format: b.options?.format ?? ColorFormat.RGB }
|
|
107
|
+
).inherit(this);
|
|
108
|
+
return thisColor.operate(b, op, context).inherit(this);
|
|
109
|
+
}
|
|
110
|
+
let { number: aVal, unit: aUnit } = this;
|
|
111
|
+
let { number: bVal, unit: bUnit } = b;
|
|
112
|
+
let unitMode = context?.opts.unitMode ?? 'loose';
|
|
113
|
+
let isStrictMode = unitMode === 'strict';
|
|
114
|
+
let isPreserveMode = unitMode === 'preserve';
|
|
115
|
+
|
|
116
|
+
if (bVal === 0 && op === '/') {
|
|
117
|
+
throw new TypeError('Cannot divide by zero');
|
|
118
|
+
}
|
|
119
|
+
if (!aUnit || !bUnit) {
|
|
120
|
+
let outUnit = aUnit ?? bUnit;
|
|
121
|
+
/** One or both doesn't have a unit, so just calculate the number */
|
|
122
|
+
if ((isStrictMode || isPreserveMode) && bUnit && op === '/') {
|
|
123
|
+
if (isPreserveMode) {
|
|
124
|
+
return new Dimension({
|
|
125
|
+
number: calculate(aVal, op, bVal),
|
|
126
|
+
unit: `1/${bUnit}`
|
|
127
|
+
}).inherit(this);
|
|
128
|
+
}
|
|
129
|
+
throw new TypeError('Cannot divide a number by a unit');
|
|
130
|
+
}
|
|
131
|
+
return new Dimension({ number: calculate(aVal, op, bVal), unit: outUnit }).inherit(this);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (aUnit === bUnit) {
|
|
135
|
+
/** Both units match, so the now we have some choices */
|
|
136
|
+
if (op === '+' || op === '-') {
|
|
137
|
+
return new Dimension({ number: calculate(aVal, op, bVal), unit: aUnit }).inherit(this);
|
|
138
|
+
}
|
|
139
|
+
if (isStrictMode || isPreserveMode) {
|
|
140
|
+
if (op === '*') {
|
|
141
|
+
if (isPreserveMode) {
|
|
142
|
+
return new Dimension({
|
|
143
|
+
number: calculate(aVal, op, bVal),
|
|
144
|
+
unit: `${aUnit}*${bUnit}`
|
|
145
|
+
}).inherit(this);
|
|
146
|
+
}
|
|
147
|
+
throw new TypeError('Cannot multiply two units together');
|
|
148
|
+
} else {
|
|
149
|
+
/** Cancel units during division */
|
|
150
|
+
return new Dimension({ number: calculate(aVal, op, bVal) }).inherit(this);
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
return new Dimension({ number: calculate(aVal, op, bVal), unit: aUnit }).inherit(this);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const aGroup = unitToGroup.get(aUnit);
|
|
157
|
+
const bGroup = unitToGroup.get(bUnit);
|
|
158
|
+
|
|
159
|
+
if (aGroup === undefined || bGroup === undefined || aGroup !== bGroup) {
|
|
160
|
+
if (isStrictMode || isPreserveMode) {
|
|
161
|
+
if (isPreserveMode) {
|
|
162
|
+
return new Dimension({
|
|
163
|
+
number: calculate(aVal, op, bVal),
|
|
164
|
+
unit: (
|
|
165
|
+
op === '+' || op === '-'
|
|
166
|
+
? `${aUnit}±${bUnit}`
|
|
167
|
+
: `${aUnit}${op}${bUnit}`
|
|
168
|
+
)
|
|
169
|
+
}).inherit(this);
|
|
170
|
+
}
|
|
171
|
+
/** Units don't match, and can't be converted */
|
|
172
|
+
throw new TypeError('Incompatible units. Change the units or use the unit function');
|
|
173
|
+
}
|
|
174
|
+
/** Just coerce to the left-hand unit */
|
|
175
|
+
return new Dimension({ number: calculate(aVal, op, bVal), unit: aUnit }).inherit(this);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const group = conversions[bGroup];
|
|
179
|
+
// @ts-expect-error - set up proper indexing later
|
|
180
|
+
let atomicUnit = group[aUnit] as number;
|
|
181
|
+
// @ts-expect-error - set up proper indexing later
|
|
182
|
+
let targetUnit = group[bUnit] as number;
|
|
183
|
+
|
|
184
|
+
if (isPreserveMode && (op === '*' || op === '/')) {
|
|
185
|
+
return new Dimension({
|
|
186
|
+
number: calculate(aVal, op, bVal),
|
|
187
|
+
unit: `${aUnit}${op}${bUnit}`
|
|
188
|
+
}).inherit(this);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
bVal = bVal / (atomicUnit / targetUnit);
|
|
192
|
+
return new Dimension({ number: calculate(aVal, op, bVal), unit: aUnit }).inherit(this);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
override compare(b: Node, context?: Context): 0 | 1 | -1 | undefined {
|
|
196
|
+
if (b.type === 'Any') {
|
|
197
|
+
const text = String(('value' in b ? b.value : '') ?? '').trim();
|
|
198
|
+
if (!/^[-+]?(?:\d+\.?\d*|\.\d+)$/.test(text)) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
return this.number === Number(text) ? 0 : undefined;
|
|
202
|
+
}
|
|
203
|
+
if (b.type === 'Quoted') {
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
if (b.type === 'Bool') {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
if (!(b instanceof Dimension || b instanceof Color)) {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
let unitToGroup = this.unitToGroup;
|
|
213
|
+
let unitMode = context?.opts?.unitMode ?? 'loose';
|
|
214
|
+
let isStrictMode = unitMode === 'strict';
|
|
215
|
+
let isPreserveMode = unitMode === 'preserve';
|
|
216
|
+
let { number: aVal, unit: aUnit } = this;
|
|
217
|
+
|
|
218
|
+
/** Normalize percentages to a number for numerical comparison */
|
|
219
|
+
if (aUnit === '%') {
|
|
220
|
+
aVal = aVal / 100;
|
|
221
|
+
aUnit = undefined;
|
|
222
|
+
}
|
|
223
|
+
if (b instanceof Color) {
|
|
224
|
+
if (aUnit) {
|
|
225
|
+
let msg = `Cannot convert "${this}" to a color`;
|
|
226
|
+
if (isStrictMode) {
|
|
227
|
+
throw new TypeError(msg);
|
|
228
|
+
} else {
|
|
229
|
+
logger.warn(msg);
|
|
230
|
+
}
|
|
231
|
+
return super.compare(b, context);
|
|
232
|
+
}
|
|
233
|
+
let thisColor = new Color({ rgb: [aVal, aVal, aVal] }, { format: ColorFormat.RGB }).inherit(this);
|
|
234
|
+
return thisColor.compare(b);
|
|
235
|
+
}
|
|
236
|
+
let { number: bVal, unit: bUnit } = b;
|
|
237
|
+
if (bUnit === '%') {
|
|
238
|
+
bVal = bVal / 100;
|
|
239
|
+
bUnit = undefined;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (!aUnit && !bUnit) {
|
|
243
|
+
return Node.numericCompare(aVal, bVal);
|
|
244
|
+
}
|
|
245
|
+
if (!aUnit || !bUnit) {
|
|
246
|
+
// Less guards allow unitless numbers to compare directly with dimensions.
|
|
247
|
+
return Node.numericCompare(aVal, bVal);
|
|
248
|
+
}
|
|
249
|
+
if (aUnit && bUnit) {
|
|
250
|
+
/** These are the only truly comparable dimensions */
|
|
251
|
+
if (!aUnit) {
|
|
252
|
+
return Node.numericCompare(aVal, bVal);
|
|
253
|
+
}
|
|
254
|
+
const aGroup = unitToGroup.get(aUnit);
|
|
255
|
+
const bGroup = unitToGroup.get(bUnit!);
|
|
256
|
+
|
|
257
|
+
if (aGroup === undefined || bGroup === undefined || aGroup !== bGroup) {
|
|
258
|
+
if (isStrictMode || isPreserveMode) {
|
|
259
|
+
/** Units don't match, and can't be converted */
|
|
260
|
+
throw new TypeError('Incompatible units. Change the units or use the unit function');
|
|
261
|
+
}
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
const group = conversions[bGroup];
|
|
265
|
+
// @ts-expect-error - set up proper indexing later
|
|
266
|
+
let atomicUnit = group[aUnit] as number;
|
|
267
|
+
// @ts-expect-error - set up proper indexing later
|
|
268
|
+
let targetUnit = group[bUnit] as number;
|
|
269
|
+
|
|
270
|
+
bVal = bVal / (atomicUnit / targetUnit);
|
|
271
|
+
|
|
272
|
+
return Node.numericCompare(aVal, bVal);
|
|
273
|
+
}
|
|
274
|
+
return super.compare(b, context);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
override toTrimmedString(options?: PrintOptions) {
|
|
278
|
+
options = getPrintOptions(options);
|
|
279
|
+
const w = options.writer!;
|
|
280
|
+
const mark = w.mark();
|
|
281
|
+
let { number, unit = '' } = this;
|
|
282
|
+
|
|
283
|
+
// Check if unit is compound (contains '/', '*', or '±')
|
|
284
|
+
const isCompoundUnit = unit && (unit.includes('/') || unit.includes('*') || unit.includes('±'));
|
|
285
|
+
|
|
286
|
+
if (isCompoundUnit) {
|
|
287
|
+
// Output as calc() for compound units
|
|
288
|
+
// Parse the compound unit to reconstruct a valid calc() expression
|
|
289
|
+
w.add('calc(', this);
|
|
290
|
+
const numberStr = `${round(number, 8)}`.toLowerCase();
|
|
291
|
+
|
|
292
|
+
// Parse compound unit to create calc expression
|
|
293
|
+
if (unit.includes('/')) {
|
|
294
|
+
// Division: "px/s" or "1/s" → calc(number * 1px / 1s) or calc(number / 1s)
|
|
295
|
+
const parts = unit.split('/');
|
|
296
|
+
const numerator = parts[0] || '1';
|
|
297
|
+
const denominator = parts[1] || '1';
|
|
298
|
+
if (numerator === '1') {
|
|
299
|
+
// Special case: "1/s" means number / unit → calc(number / 1s)
|
|
300
|
+
w.add(`${numberStr} / 1${denominator}`);
|
|
301
|
+
} else {
|
|
302
|
+
// General case: "px/s" → calc(number * 1px / 1s)
|
|
303
|
+
w.add(`${numberStr} * 1${numerator} / 1${denominator}`);
|
|
304
|
+
}
|
|
305
|
+
} else if (unit.includes('*')) {
|
|
306
|
+
// Multiplication: "px*em" → calc(number * 1px * 1em)
|
|
307
|
+
// Example: 10px * 2em → 20 with unit "px*em" → calc(20 * 1px * 1em)
|
|
308
|
+
const parts = unit.split('*');
|
|
309
|
+
const units = parts.map(u => `1${u}`).join(' * ');
|
|
310
|
+
w.add(`${numberStr} * ${units}`);
|
|
311
|
+
} else if (unit.includes('±')) {
|
|
312
|
+
// Addition/subtraction: "px±em" → calc(1px ± 1em)
|
|
313
|
+
// Note: We don't have the original values, so this is approximate
|
|
314
|
+
// The actual operation would be calc(aVal * 1px ± bVal * 1em)
|
|
315
|
+
const parts = unit.split('±');
|
|
316
|
+
const unit1 = parts[0] || '';
|
|
317
|
+
const unit2 = parts[1] || '';
|
|
318
|
+
// Output as calc(1unit1 + 1unit2) - approximation since we don't have original values
|
|
319
|
+
w.add(`1${unit1} + 1${unit2}`);
|
|
320
|
+
} else {
|
|
321
|
+
// Fallback - shouldn't happen
|
|
322
|
+
w.add(`${numberStr} * 1${unit}`);
|
|
323
|
+
}
|
|
324
|
+
w.add(')');
|
|
325
|
+
} else {
|
|
326
|
+
// Normal unit output
|
|
327
|
+
const numberStr = `${round(number, 8)}`.toLowerCase();
|
|
328
|
+
w.add(numberStr, this);
|
|
329
|
+
if (unit) {
|
|
330
|
+
w.add(unit);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return w.getSince(mark);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** @todo - move to visitors */
|
|
337
|
+
// toCSS(context: Context, out: OutputCollector) {
|
|
338
|
+
// out.add(this.toString(), this.location)
|
|
339
|
+
// }
|
|
340
|
+
|
|
341
|
+
// toModule(context: Context, out: OutputCollector) {
|
|
342
|
+
// const pre = context.pre
|
|
343
|
+
// out.add('$J.num({\n' +
|
|
344
|
+
// ` ${pre}value: ${this.data},\n` +
|
|
345
|
+
// ` ${pre}unit: "${this.unit ?? ''}"\n` +
|
|
346
|
+
// `${pre}})`
|
|
347
|
+
// , this.location)
|
|
348
|
+
// }
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const enum ConversionGroup {
|
|
352
|
+
Length = 0,
|
|
353
|
+
Duration = 1,
|
|
354
|
+
Angle = 2
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const conversions = {
|
|
358
|
+
[ConversionGroup.Length]: {
|
|
359
|
+
m: 1,
|
|
360
|
+
cm: 0.01,
|
|
361
|
+
mm: 0.001,
|
|
362
|
+
in: 0.0254,
|
|
363
|
+
px: 0.0254 / 96,
|
|
364
|
+
pt: 0.0254 / 72,
|
|
365
|
+
pc: 0.0254 / 72 * 12
|
|
366
|
+
} satisfies Record<LengthUnit, number>,
|
|
367
|
+
[ConversionGroup.Duration]: {
|
|
368
|
+
s: 1,
|
|
369
|
+
ms: 0.001
|
|
370
|
+
} satisfies Record<DurationUnit, number>,
|
|
371
|
+
[ConversionGroup.Angle]: {
|
|
372
|
+
rad: 1 / (2 * Math.PI),
|
|
373
|
+
deg: 1 / 360,
|
|
374
|
+
grad: 1 / 400,
|
|
375
|
+
turn: 1
|
|
376
|
+
} satisfies Record<AngleUnit, number>
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
defineType(Dimension, 'Dimension');
|
|
380
|
+
|
|
381
|
+
export const dimension = (
|
|
382
|
+
value: DimensionValue | [number, string] | number,
|
|
383
|
+
options?: NodeOptions,
|
|
384
|
+
location?: OptionalLocation,
|
|
385
|
+
treeContext?: TreeContext
|
|
386
|
+
) => {
|
|
387
|
+
if (isArray(value)) {
|
|
388
|
+
let [number, unit] = value;
|
|
389
|
+
return new Dimension({ number, unit }, options, location, treeContext);
|
|
390
|
+
}
|
|
391
|
+
return new Dimension(typeof value === 'number' ? { number: value } : value, options, location, treeContext);
|
|
392
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { Class } from 'type-fest';
|
|
2
|
+
import type { Context } from '../context.js';
|
|
3
|
+
import { Node, F_NON_STATIC, defineType, type NodeOptions, type OptionalLocation, type TreeContext } from './node.js';
|
|
4
|
+
import { type PrintOptions, getPrintOptions } from './util/print.js';
|
|
5
|
+
import { type MaybePromise, isThenable } from '@jesscss/awaitable-pipe';
|
|
6
|
+
import { getDependency, setDependency, setParent } from './util/field-helpers.js';
|
|
7
|
+
|
|
8
|
+
export type ExpressionChildData = { value: Node };
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* An expression is a node that returns a value.
|
|
12
|
+
* It can contain values, references, and operations.
|
|
13
|
+
*
|
|
14
|
+
* When parsing Less/Sass, everything containing an operation is
|
|
15
|
+
* considered an expression.
|
|
16
|
+
*/
|
|
17
|
+
export interface Expression extends Node<Node, NodeOptions, ExpressionChildData> {
|
|
18
|
+
type: 'Expression';
|
|
19
|
+
shortType: 'expr';
|
|
20
|
+
eval(context: Context): MaybePromise<Node>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class Expression extends Node<Node, NodeOptions, ExpressionChildData> {
|
|
24
|
+
static override childKeys = ['value'] as const;
|
|
25
|
+
|
|
26
|
+
readonly value!: Node;
|
|
27
|
+
|
|
28
|
+
override clone(deep?: boolean, cloneFn?: (n: Node) => Node, ctx?: Context): this {
|
|
29
|
+
const value = this.get('value', ctx);
|
|
30
|
+
const cloneChild = cloneFn ?? ((n: Node) => n.clone(deep, cloneFn, ctx));
|
|
31
|
+
const clonedValue = deep ? cloneChild(value) : value;
|
|
32
|
+
const options = this._meta?.options;
|
|
33
|
+
const priorParent = !deep && ctx ? clonedValue.parent : undefined;
|
|
34
|
+
const newNode = new (this.constructor as Class<this>)(
|
|
35
|
+
clonedValue,
|
|
36
|
+
options ? { ...options } : undefined,
|
|
37
|
+
this.location,
|
|
38
|
+
this.treeContext
|
|
39
|
+
);
|
|
40
|
+
if (!deep && ctx) {
|
|
41
|
+
setParent(clonedValue, newNode, ctx);
|
|
42
|
+
(clonedValue as unknown as { parent?: Node }).parent = priorParent;
|
|
43
|
+
}
|
|
44
|
+
newNode.inherit(this);
|
|
45
|
+
return newNode;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
constructor(value: Node, options?: NodeOptions, location?: OptionalLocation, treeContext?: TreeContext) {
|
|
49
|
+
super(value, options, location, treeContext);
|
|
50
|
+
this.value = value;
|
|
51
|
+
if (value instanceof Node) {
|
|
52
|
+
this.adopt(value);
|
|
53
|
+
}
|
|
54
|
+
this.addFlag(F_NON_STATIC);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
override evalNode(context: Context): MaybePromise<Node> {
|
|
58
|
+
const value = this.get('value', context);
|
|
59
|
+
const out = value.eval(context);
|
|
60
|
+
const applyDependency = (result: Node): Node => {
|
|
61
|
+
const dependency = getDependency(result, context);
|
|
62
|
+
if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
|
|
63
|
+
setDependency(result, {
|
|
64
|
+
dependsOn: new Set(dependency.dependsOn),
|
|
65
|
+
sourceExpr: this
|
|
66
|
+
}, context);
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
};
|
|
70
|
+
/** @todo - Cast as selector if the context is within a selector */
|
|
71
|
+
if (isThenable(out)) {
|
|
72
|
+
return (out as Promise<Node>).then(applyDependency);
|
|
73
|
+
}
|
|
74
|
+
return applyDependency(out as Node);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
override toTrimmedString(options?: PrintOptions): string {
|
|
78
|
+
options = getPrintOptions(options);
|
|
79
|
+
const w = options.writer!;
|
|
80
|
+
const mark = w.mark();
|
|
81
|
+
const value = this.get('value', options.context);
|
|
82
|
+
w.add('$', this);
|
|
83
|
+
w.add('(');
|
|
84
|
+
value.toString(options);
|
|
85
|
+
w.add(')');
|
|
86
|
+
return w.getSince(mark);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
type Params = ConstructorParameters<typeof Expression>;
|
|
91
|
+
|
|
92
|
+
export const expr = defineType(Expression, 'Expression', 'expr') as (
|
|
93
|
+
value: Params[0],
|
|
94
|
+
options?: Params[1],
|
|
95
|
+
location?: Params[2],
|
|
96
|
+
treeContext?: Params[3]
|
|
97
|
+
) => Expression;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Node, F_VISIBLE, defineType, type NodeOptions } from './node.js';
|
|
2
|
+
import { type PrintOptions, getPrintOptions } from './util/print.js';
|
|
3
|
+
import type { Extend } from './extend.js';
|
|
4
|
+
import type { Context } from '../context.js';
|
|
5
|
+
|
|
6
|
+
export type ExtendListChildData = { value: Extend[] };
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* An extend statement list with no rules
|
|
10
|
+
*
|
|
11
|
+
* e.g.
|
|
12
|
+
* .a:extend(.b), .c:extend(.d);
|
|
13
|
+
*/
|
|
14
|
+
export interface ExtendList extends Node<Extend[], NodeOptions, ExtendListChildData> {
|
|
15
|
+
type: 'ExtendList';
|
|
16
|
+
shortType: 'extendlist';
|
|
17
|
+
eval(context: Context): ExtendList;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class ExtendList extends Node<Extend[], NodeOptions, ExtendListChildData> {
|
|
21
|
+
static override childKeys = ['value'] as const;
|
|
22
|
+
|
|
23
|
+
readonly value!: Extend[];
|
|
24
|
+
|
|
25
|
+
constructor(value: Extend[], options?: any, location?: any, treeContext?: any) {
|
|
26
|
+
super(value, options, location, treeContext);
|
|
27
|
+
this.value = value;
|
|
28
|
+
for (const child of value) {
|
|
29
|
+
if (child instanceof Node) {
|
|
30
|
+
this.adopt(child);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
this.allowRoot = true;
|
|
34
|
+
this.allowRuleRoot = true;
|
|
35
|
+
this.removeFlag(F_VISIBLE);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
override toTrimmedString(options?: PrintOptions): string {
|
|
39
|
+
options = getPrintOptions(options);
|
|
40
|
+
const w = options.writer!;
|
|
41
|
+
const mark = w.mark();
|
|
42
|
+
for (const child of this.get('value', options.context)) {
|
|
43
|
+
child.toTrimmedString(options);
|
|
44
|
+
}
|
|
45
|
+
// toTrimmedString side effect is already emitted to writer; getSince captures it. Add ';'
|
|
46
|
+
w.add(';');
|
|
47
|
+
return w.getSince(mark);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const extendList = defineType(ExtendList, 'ExtendList');
|