@jesscss/core 2.0.0-alpha.5 → 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 -98
- package/lib/tree/ampersand.d.ts.map +0 -1
- package/lib/tree/ampersand.js +0 -319
- 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,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitmask-based node type system.
|
|
3
|
+
*
|
|
4
|
+
* Each concrete node type gets a single bit. Abstract parent types
|
|
5
|
+
* (Selector, SimpleSelector) are masks combining their children's bits.
|
|
6
|
+
* A node's `nodeType` field is the OR of its own bit and all ancestor bits.
|
|
7
|
+
*
|
|
8
|
+
* isNode(x, N.Foo) compiles to: x.nodeType & Foo (one bitwise AND)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// ── Leaf bits (one bit per concrete type) ──────────────────────────
|
|
12
|
+
// These are types that are checked via isNode AND are concrete (not abstract).
|
|
13
|
+
// Sorted roughly by hierarchy grouping.
|
|
14
|
+
|
|
15
|
+
export enum N {
|
|
16
|
+
// Selector subtypes
|
|
17
|
+
BasicSelector = 1 << 0,
|
|
18
|
+
Ampersand = 1 << 1,
|
|
19
|
+
PseudoSelector = 1 << 2,
|
|
20
|
+
CompoundSelector = 1 << 3,
|
|
21
|
+
ComplexSelector = 1 << 4,
|
|
22
|
+
SelectorList = 1 << 5,
|
|
23
|
+
Combinator = 1 << 6,
|
|
24
|
+
|
|
25
|
+
// Value types
|
|
26
|
+
Any = 1 << 7,
|
|
27
|
+
Color = 1 << 8,
|
|
28
|
+
Dimension = 1 << 9,
|
|
29
|
+
Quoted = 1 << 10,
|
|
30
|
+
Expression = 1 << 11,
|
|
31
|
+
Operation = 1 << 12,
|
|
32
|
+
Paren = 1 << 13,
|
|
33
|
+
Range = 1 << 14,
|
|
34
|
+
List = 1 << 15,
|
|
35
|
+
Sequence = 1 << 16,
|
|
36
|
+
Nil = 1 << 17,
|
|
37
|
+
|
|
38
|
+
// Callable types
|
|
39
|
+
Call = 1 << 18,
|
|
40
|
+
Func = 1 << 19,
|
|
41
|
+
Mixin = 1 << 20,
|
|
42
|
+
|
|
43
|
+
// Declaration types
|
|
44
|
+
Declaration = 1 << 21,
|
|
45
|
+
VarDeclaration = 1 << 22,
|
|
46
|
+
|
|
47
|
+
// Container types
|
|
48
|
+
Rules = 1 << 23,
|
|
49
|
+
Collection = 1 << 24,
|
|
50
|
+
Ruleset = 1 << 25,
|
|
51
|
+
AtRule = 1 << 26,
|
|
52
|
+
|
|
53
|
+
// Other types
|
|
54
|
+
Reference = 1 << 27,
|
|
55
|
+
Comment = 1 << 28,
|
|
56
|
+
JsFunction = 1 << 29,
|
|
57
|
+
JsObject = 1 << 30,
|
|
58
|
+
// Note: 1 << 31 is negative in JS (sign bit), so we use it carefully
|
|
59
|
+
JsArray = 1 << 31,
|
|
60
|
+
|
|
61
|
+
// ── Abstract / parent masks ──────────────────────────────────────
|
|
62
|
+
// These combine child bits so isNode(x, N.Selector) matches any selector.
|
|
63
|
+
|
|
64
|
+
SimpleSelector = BasicSelector | Ampersand | PseudoSelector,
|
|
65
|
+
Selector = SimpleSelector | CompoundSelector | ComplexSelector | SelectorList | Combinator
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Map from type name string → bitmask.
|
|
70
|
+
* Used by defineType to look up the mask for a given type name
|
|
71
|
+
* when walking the prototype chain.
|
|
72
|
+
*/
|
|
73
|
+
/**
|
|
74
|
+
* Map from type name string → bitmask.
|
|
75
|
+
* Used by defineType to look up the bit for a given type name
|
|
76
|
+
* when walking the prototype chain.
|
|
77
|
+
*
|
|
78
|
+
* IMPORTANT: Abstract parent types (Selector, SimpleSelector) map to 0 here.
|
|
79
|
+
* Their combined masks (N.Selector, N.SimpleSelector) are only used by
|
|
80
|
+
* isNode callers, NOT by defineType. Each concrete child already has its own
|
|
81
|
+
* bit, so when defineType walks the chain, the child's bit is sufficient.
|
|
82
|
+
*/
|
|
83
|
+
export const nodeTypeBits: Record<string, number> = {
|
|
84
|
+
// Concrete leaf types — each gets its own bit
|
|
85
|
+
BasicSelector: N.BasicSelector,
|
|
86
|
+
Ampersand: N.Ampersand,
|
|
87
|
+
PseudoSelector: N.PseudoSelector,
|
|
88
|
+
CompoundSelector: N.CompoundSelector,
|
|
89
|
+
ComplexSelector: N.ComplexSelector,
|
|
90
|
+
SelectorList: N.SelectorList,
|
|
91
|
+
Combinator: N.Combinator,
|
|
92
|
+
Any: N.Any,
|
|
93
|
+
Color: N.Color,
|
|
94
|
+
Dimension: N.Dimension,
|
|
95
|
+
Quoted: N.Quoted,
|
|
96
|
+
Expression: N.Expression,
|
|
97
|
+
Operation: N.Operation,
|
|
98
|
+
Paren: N.Paren,
|
|
99
|
+
Range: N.Range,
|
|
100
|
+
List: N.List,
|
|
101
|
+
Sequence: N.Sequence,
|
|
102
|
+
Nil: N.Nil,
|
|
103
|
+
Call: N.Call,
|
|
104
|
+
Func: N.Func,
|
|
105
|
+
Mixin: N.Mixin,
|
|
106
|
+
Declaration: N.Declaration,
|
|
107
|
+
VarDeclaration: N.VarDeclaration,
|
|
108
|
+
Rules: N.Rules,
|
|
109
|
+
Collection: N.Collection,
|
|
110
|
+
Ruleset: N.Ruleset,
|
|
111
|
+
AtRule: N.AtRule,
|
|
112
|
+
Reference: N.Reference,
|
|
113
|
+
Comment: N.Comment,
|
|
114
|
+
JsFunction: N.JsFunction,
|
|
115
|
+
JsObject: N.JsObject,
|
|
116
|
+
JsArray: N.JsArray,
|
|
117
|
+
|
|
118
|
+
// Abstract parent types — 0 because children already have their own bits.
|
|
119
|
+
// The combined masks (N.Selector, N.SimpleSelector) are for isNode callers only.
|
|
120
|
+
Selector: 0,
|
|
121
|
+
SimpleSelector: 0
|
|
122
|
+
};
|
package/src/tree/node.ts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is the entry point for the Node class.
|
|
3
|
+
* It imports from node-base.ts, applies prototype patches,
|
|
4
|
+
* and re-exports everything.
|
|
5
|
+
*
|
|
6
|
+
* This ensures that ANY import of Node gets the patched version,
|
|
7
|
+
* regardless of whether it goes through tree/index.ts or not.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// First, import everything from node-base (the pure Node class)
|
|
11
|
+
export * from './node-base.js';
|
|
12
|
+
import { Node } from './node-base.js';
|
|
13
|
+
|
|
14
|
+
// Import dependencies needed for patching (these import from node-base, not node)
|
|
15
|
+
import { Nil } from './nil.js';
|
|
16
|
+
import { Any } from './any.js';
|
|
17
|
+
import { TreeContext } from '../context.js';
|
|
18
|
+
import { type Operator } from './util/calculate.js';
|
|
19
|
+
|
|
20
|
+
const LEGACY_DATA_INTERNAL = new Set([
|
|
21
|
+
'parent', 'index', 'frames', 'pre', 'post', 'state', 'nodeType',
|
|
22
|
+
'isSelector', 'keySetLibrary', 'role',
|
|
23
|
+
'fullRender',
|
|
24
|
+
'rulesetRegistry', 'mixinRegistry', 'declarationRegistry', 'functionRegistry',
|
|
25
|
+
'rulesIndexed', '_indexing',
|
|
26
|
+
'pendingExtends',
|
|
27
|
+
'_valueOf', '_keySet', '_visibleKeySet', '_requiredKeySet'
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
function getLegacyData(this: Node) {
|
|
31
|
+
const childKeys = (this.constructor as typeof Node).childKeys;
|
|
32
|
+
|
|
33
|
+
if (Array.isArray(childKeys)) {
|
|
34
|
+
const extraKeys = Object.keys(this).filter((key) => {
|
|
35
|
+
return !key.startsWith('_') && !LEGACY_DATA_INTERNAL.has(key) && !childKeys.includes(key);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
if (childKeys.length === 1 && extraKeys.length === 0) {
|
|
39
|
+
return (this as any)[childKeys[0]!];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const out: Record<string, unknown> = {};
|
|
43
|
+
for (const key of childKeys) {
|
|
44
|
+
const value = (this as any)[key];
|
|
45
|
+
if (value !== undefined) {
|
|
46
|
+
out[key] = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const key of extraKeys) {
|
|
50
|
+
const value = (this as any)[key];
|
|
51
|
+
if (value !== undefined) {
|
|
52
|
+
out[key] = value;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const directValue = (this as any).value;
|
|
59
|
+
if (directValue !== undefined) {
|
|
60
|
+
return directValue;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const out: Record<string, unknown> = {};
|
|
64
|
+
for (const key of Object.keys(this)) {
|
|
65
|
+
if (key.startsWith('_') || LEGACY_DATA_INTERNAL.has(key)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const value = (this as any)[key];
|
|
69
|
+
if (value !== undefined) {
|
|
70
|
+
out[key] = value;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Patch Node.prototype.nil to return a Nil instance
|
|
78
|
+
*/
|
|
79
|
+
Node.prototype.nil = function() {
|
|
80
|
+
return new Nil();
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Patch Node.prototype.operate for string concatenation
|
|
85
|
+
*/
|
|
86
|
+
Node.prototype.operate = function(b: Node, op: Operator) {
|
|
87
|
+
let aVal = this.toString();
|
|
88
|
+
let bVal = b.toString();
|
|
89
|
+
if (op === '+') {
|
|
90
|
+
return new Any(aVal + bVal).inherit(this);
|
|
91
|
+
}
|
|
92
|
+
throw new Error(`Cannot operate on ${this.type}`);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Define a fallback treeContext for testing.
|
|
97
|
+
* Reads from _meta.treeContext (set by constructor), falls back to
|
|
98
|
+
* a lazily-created empty TreeContext for nodes created without one.
|
|
99
|
+
*/
|
|
100
|
+
Object.defineProperty(Node.prototype, 'treeContext', {
|
|
101
|
+
get() {
|
|
102
|
+
let context = this._meta?.treeContext;
|
|
103
|
+
if (!context) {
|
|
104
|
+
context = this._treeContext;
|
|
105
|
+
if (!context) {
|
|
106
|
+
context = this._treeContext = new TreeContext();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return context;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
Object.defineProperty(Node.prototype, 'data', {
|
|
114
|
+
get: getLegacyData,
|
|
115
|
+
set(value) {
|
|
116
|
+
this.setData(value);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type OptionalLocation,
|
|
3
|
+
type NodeOptions,
|
|
4
|
+
type TreeContext,
|
|
5
|
+
defineType,
|
|
6
|
+
type Node
|
|
7
|
+
} from './node.js';
|
|
8
|
+
import { Dimension } from './dimension.js';
|
|
9
|
+
import { Color } from './color.js';
|
|
10
|
+
import { type Context } from '../context.js';
|
|
11
|
+
import { type Operator } from './util/calculate.js';
|
|
12
|
+
import { isPlainObject } from './util/collections.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A number. Named `Num` to avoid conflict with the built-in `Number` class.
|
|
16
|
+
*/
|
|
17
|
+
export interface Num {
|
|
18
|
+
type: 'Num';
|
|
19
|
+
shortType: 'num';
|
|
20
|
+
}
|
|
21
|
+
export class Num extends Dimension {
|
|
22
|
+
// Numbers are static and don't need evaluation
|
|
23
|
+
|
|
24
|
+
constructor(value: number | { number: number }, options?: NodeOptions, location?: OptionalLocation, treeContext?: TreeContext) {
|
|
25
|
+
super(isPlainObject(value) ? value as { number: number } : { number: value as number }, options, location, treeContext);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Method overloads for better type safety
|
|
29
|
+
override operate(b: Num, op: Operator, context?: Context): Num | Dimension;
|
|
30
|
+
override operate(b: Dimension, op: Operator, context?: Context): Dimension;
|
|
31
|
+
override operate(b: Color, op: Operator, context?: Context): Color;
|
|
32
|
+
override operate(b: Node, op: Operator, context?: Context): Dimension | Color;
|
|
33
|
+
override operate(b: Node, op: Operator, context?: Context): Dimension | Color {
|
|
34
|
+
// Call super.operate() to get the result
|
|
35
|
+
const result = super.operate(b, op, context);
|
|
36
|
+
|
|
37
|
+
// If the result is a Dimension and has an empty unit, convert it to a Num
|
|
38
|
+
if (result instanceof Dimension && !result.unit) {
|
|
39
|
+
return new Num(result.number).inherit(this);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Otherwise, pass through the result as-is
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
defineType(Num, 'Num');
|
|
48
|
+
|
|
49
|
+
export const num = (
|
|
50
|
+
value: number,
|
|
51
|
+
options?: NodeOptions,
|
|
52
|
+
location?: OptionalLocation,
|
|
53
|
+
treeContext?: TreeContext
|
|
54
|
+
) => new Num(value, options, location, treeContext);
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { Node, defineType, F_VISIBLE, F_NON_STATIC, type NodeOptions, type OptionalLocation, type TreeContext } from './node.js';
|
|
2
|
+
import type { Context } from '../context.js';
|
|
3
|
+
import type { Operator } from './util/calculate.js';
|
|
4
|
+
import { type MaybePromise, isThenable } from '@jesscss/awaitable-pipe';
|
|
5
|
+
import { getPrintOptions, type PrintOptions } from './util/print.js';
|
|
6
|
+
import { isNode } from './util/is-node.js';
|
|
7
|
+
import { N } from './node-type.js';
|
|
8
|
+
import { Call } from './call.js';
|
|
9
|
+
import { list } from './list.js';
|
|
10
|
+
import {
|
|
11
|
+
mergeDependencies,
|
|
12
|
+
setDependency,
|
|
13
|
+
setEvaluated
|
|
14
|
+
} from './util/field-helpers.js';
|
|
15
|
+
|
|
16
|
+
export type { Operator };
|
|
17
|
+
/** Operation is always a tuple */
|
|
18
|
+
export type OperationValue = [
|
|
19
|
+
left: Node,
|
|
20
|
+
op: Operator,
|
|
21
|
+
right: Node
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
export type OperationChildData = { left: Node; operator: Operator; right: Node };
|
|
25
|
+
|
|
26
|
+
export interface Operation {
|
|
27
|
+
type: 'Operation';
|
|
28
|
+
shortType: 'op';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A math operation OR a value with a slash. CSS is ambiguous
|
|
32
|
+
* in syntax about which is which, so we just classify `value / value`
|
|
33
|
+
* as an operation.
|
|
34
|
+
*/
|
|
35
|
+
export class Operation extends Node<OperationValue, NodeOptions, OperationChildData> {
|
|
36
|
+
static override childKeys = ['left', 'right'] as const;
|
|
37
|
+
|
|
38
|
+
left!: Node;
|
|
39
|
+
private operator!: Operator;
|
|
40
|
+
right!: Node;
|
|
41
|
+
|
|
42
|
+
override clone(deep?: boolean): this {
|
|
43
|
+
const options = this._meta?.options;
|
|
44
|
+
const value: OperationValue = [
|
|
45
|
+
deep ? this.left.clone(deep) : this.left,
|
|
46
|
+
this.operator,
|
|
47
|
+
deep ? this.right.clone(deep) : this.right
|
|
48
|
+
];
|
|
49
|
+
const newNode: this = Reflect.construct(this.constructor, [
|
|
50
|
+
value,
|
|
51
|
+
options ? { ...options } : undefined,
|
|
52
|
+
this.location,
|
|
53
|
+
this.treeContext
|
|
54
|
+
]);
|
|
55
|
+
newNode.inherit(this);
|
|
56
|
+
return newNode;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
constructor(value: OperationValue, options?: NodeOptions, location?: OptionalLocation, treeContext?: TreeContext) {
|
|
60
|
+
super(value, options, location, treeContext);
|
|
61
|
+
this.left = value[0];
|
|
62
|
+
this.operator = value[1];
|
|
63
|
+
this.right = value[2];
|
|
64
|
+
if (this.left instanceof Node) {
|
|
65
|
+
this.adopt(this.left);
|
|
66
|
+
}
|
|
67
|
+
if (this.right instanceof Node) {
|
|
68
|
+
this.adopt(this.right);
|
|
69
|
+
}
|
|
70
|
+
// Operations are always non-static, but can inherit may_async from children
|
|
71
|
+
this.addFlags(F_VISIBLE, F_NON_STATIC);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
override toTrimmedString(options?: PrintOptions): string {
|
|
75
|
+
options = getPrintOptions(options);
|
|
76
|
+
const w = options.writer!;
|
|
77
|
+
const mark = w.mark();
|
|
78
|
+
const context = options.context;
|
|
79
|
+
const left = this.get('left', context);
|
|
80
|
+
const op = this.operator;
|
|
81
|
+
const right = this.get('right', context);
|
|
82
|
+
let leftStr = w.capture(() => left.toString(options));
|
|
83
|
+
let rightStr = w.capture(() => right.toString(options));
|
|
84
|
+
w.add(leftStr.trimEnd(), left);
|
|
85
|
+
w.add(` ${op} `, this);
|
|
86
|
+
w.add(rightStr.trimStart(), right);
|
|
87
|
+
return w.getSince(mark);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
override evalNode(context: Context): MaybePromise<Node> {
|
|
91
|
+
let n = this;
|
|
92
|
+
const left = n.get('left', context);
|
|
93
|
+
const op = n.operator;
|
|
94
|
+
const right = n.get('right', context);
|
|
95
|
+
const maybeLeft = left.eval(context);
|
|
96
|
+
const applyMergedDependency = (result: Node, l: Node, r: Node): Node => {
|
|
97
|
+
const dependency = mergeDependencies([l, r], context);
|
|
98
|
+
if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
|
|
99
|
+
setDependency(result, {
|
|
100
|
+
dependsOn: new Set(dependency.dependsOn),
|
|
101
|
+
sourceExpr: this
|
|
102
|
+
}, context);
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
};
|
|
106
|
+
const finalize = (l: Node, r: Node): MaybePromise<Node> => {
|
|
107
|
+
if (context.shouldOperate(op, l, r)) {
|
|
108
|
+
if (isNode(l, N.Operation) || isNode(r, N.Operation)) {
|
|
109
|
+
// Preserve composite expressions such as `10px / 2 * 2` when a nested
|
|
110
|
+
// operation intentionally remains unevaluated under current math mode.
|
|
111
|
+
const outOperation = n.clone(false);
|
|
112
|
+
outOperation.adopt(l, context);
|
|
113
|
+
outOperation.adopt(r, context);
|
|
114
|
+
Reflect.set(outOperation, 'left', l);
|
|
115
|
+
Reflect.set(outOperation, 'right', r);
|
|
116
|
+
return applyMergedDependency(outOperation, l, r);
|
|
117
|
+
}
|
|
118
|
+
const unitMode = context?.opts?.unitMode ?? 'preserve';
|
|
119
|
+
const isPreserveMode = unitMode === 'preserve';
|
|
120
|
+
|
|
121
|
+
// In preserve mode, catch unit errors and return calc() call
|
|
122
|
+
if (isPreserveMode && isNode(l, N.Dimension) && isNode(r, N.Dimension)) {
|
|
123
|
+
try {
|
|
124
|
+
let out = l.operate(r, op, context);
|
|
125
|
+
out.pre = left.pre;
|
|
126
|
+
out.post = right.post;
|
|
127
|
+
return out;
|
|
128
|
+
} catch (error) {
|
|
129
|
+
// If it's a unit error (TypeError), return calc(operation)
|
|
130
|
+
if (error instanceof TypeError) {
|
|
131
|
+
// Preserve canonical operation state by materializing an isolated wrapper when needed.
|
|
132
|
+
const calcOperation = n.clone(false);
|
|
133
|
+
calcOperation.adopt(l, context);
|
|
134
|
+
calcOperation.adopt(r, context);
|
|
135
|
+
Reflect.set(calcOperation, 'left', l);
|
|
136
|
+
Reflect.set(calcOperation, 'right', r);
|
|
137
|
+
setEvaluated(calcOperation, true, context);
|
|
138
|
+
setEvaluated(l, true, context);
|
|
139
|
+
setEvaluated(r, true, context);
|
|
140
|
+
const calcCall = new Call({ name: 'calc', args: list([calcOperation]) });
|
|
141
|
+
calcCall.pre = left.pre;
|
|
142
|
+
calcCall.post = right.post;
|
|
143
|
+
return applyMergedDependency(calcCall, l, r);
|
|
144
|
+
}
|
|
145
|
+
// Re-throw non-unit errors
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
let out: Node;
|
|
151
|
+
try {
|
|
152
|
+
out = l.operate(r, op, context);
|
|
153
|
+
} catch (error) {
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
out.pre = left.pre;
|
|
157
|
+
out.post = right.post;
|
|
158
|
+
return applyMergedDependency(out, l, r);
|
|
159
|
+
}
|
|
160
|
+
if (l === n.left && r === n.right) {
|
|
161
|
+
return applyMergedDependency(n, l, r);
|
|
162
|
+
}
|
|
163
|
+
const outOperation = n.clone(false);
|
|
164
|
+
outOperation.adopt(l, context);
|
|
165
|
+
outOperation.adopt(r, context);
|
|
166
|
+
Reflect.set(outOperation, 'left', l);
|
|
167
|
+
Reflect.set(outOperation, 'right', r);
|
|
168
|
+
return applyMergedDependency(outOperation, l, r);
|
|
169
|
+
};
|
|
170
|
+
const handleLeft = (l: Node): MaybePromise<Node> => {
|
|
171
|
+
const maybeRight = right.eval(context);
|
|
172
|
+
if (isThenable(maybeRight)) {
|
|
173
|
+
return (maybeRight as Promise<Node>).then((r) => {
|
|
174
|
+
return finalize(l, r);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
const r = maybeRight as Node;
|
|
178
|
+
return finalize(l, r);
|
|
179
|
+
};
|
|
180
|
+
if (isThenable(maybeLeft)) {
|
|
181
|
+
return (maybeLeft as Promise<Node>).then(handleLeft);
|
|
182
|
+
}
|
|
183
|
+
return handleLeft(maybeLeft as Node);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export const op = defineType(Operation, 'Operation', 'op');
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { type Context } from '../context.js';
|
|
2
|
+
import { Bool } from './bool.js';
|
|
3
|
+
import { Expression } from './expression.js';
|
|
4
|
+
import { Operation } from './operation.js';
|
|
5
|
+
import { Node, defineType, F_NON_STATIC, type OptionalLocation, type TreeContext } from './node.js';
|
|
6
|
+
import { Dimension } from './dimension.js';
|
|
7
|
+
import { type MaybePromise, isThenable } from '@jesscss/awaitable-pipe';
|
|
8
|
+
import { type PrintOptions, getPrintOptions } from './util/print.js';
|
|
9
|
+
|
|
10
|
+
export type ParenOptions = {
|
|
11
|
+
escaped?: boolean;
|
|
12
|
+
delimiter?: 'paren' | 'square';
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type ParenChildData = { value: Node | undefined };
|
|
16
|
+
|
|
17
|
+
const isOpOrExpression = (node: Node): node is Operation | Expression => {
|
|
18
|
+
return node instanceof Operation || node instanceof Expression;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* An expression in parenthesis
|
|
23
|
+
*/
|
|
24
|
+
export interface Paren {
|
|
25
|
+
type: 'Paren';
|
|
26
|
+
shortType: 'paren';
|
|
27
|
+
eval(context: Context): MaybePromise<Node>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class Paren extends Node<Node | undefined, ParenOptions, ParenChildData> {
|
|
31
|
+
static override childKeys = ['value'] as const;
|
|
32
|
+
|
|
33
|
+
value: Node | undefined;
|
|
34
|
+
|
|
35
|
+
constructor(value?: Node, options?: ParenOptions, location?: OptionalLocation, treeContext?: TreeContext) {
|
|
36
|
+
super(value, options, location, treeContext);
|
|
37
|
+
this.value = value;
|
|
38
|
+
if (value instanceof Node) {
|
|
39
|
+
this.adopt(value);
|
|
40
|
+
}
|
|
41
|
+
if (options?.escaped) {
|
|
42
|
+
this.addFlag(F_NON_STATIC);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private _isEscaped(_context?: Context): boolean {
|
|
47
|
+
return Boolean(this.options?.escaped);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private _unwrapValue(value: Node, context?: Context): Node {
|
|
51
|
+
let current = value;
|
|
52
|
+
while (current instanceof Paren) {
|
|
53
|
+
const next = current.get('value', context);
|
|
54
|
+
if (!next) {
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
current = next;
|
|
58
|
+
}
|
|
59
|
+
return current;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
override toTrimmedString(options?: PrintOptions): string {
|
|
63
|
+
options = getPrintOptions(options);
|
|
64
|
+
const w = options.writer!;
|
|
65
|
+
const mark = w.mark();
|
|
66
|
+
const parenOptions = this.options;
|
|
67
|
+
const escapeChar = parenOptions?.escaped ? '~' : '';
|
|
68
|
+
const delimiter = parenOptions?.delimiter ?? 'paren';
|
|
69
|
+
const open = delimiter === 'square' ? '[' : '(';
|
|
70
|
+
const close = delimiter === 'square' ? ']' : ')';
|
|
71
|
+
if (escapeChar) {
|
|
72
|
+
w.add(escapeChar, this);
|
|
73
|
+
}
|
|
74
|
+
w.add(open);
|
|
75
|
+
let value = this.get('value', options.context);
|
|
76
|
+
if (value) {
|
|
77
|
+
if (value instanceof Node) {
|
|
78
|
+
let out = w.capture(() => value.toString(options));
|
|
79
|
+
w.add(out.replace(/^[ \t\r\f]*|[ \t\r\f]*$/g, ''), value);
|
|
80
|
+
} else {
|
|
81
|
+
w.add(String(value), this);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
w.add(close);
|
|
85
|
+
return w.getSince(mark);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
override evalNode(context: Context): MaybePromise<Node> {
|
|
89
|
+
let value = this.get('value', context);
|
|
90
|
+
if (value) {
|
|
91
|
+
let isOp = isOpOrExpression(value);
|
|
92
|
+
if (isOp) {
|
|
93
|
+
context.parenFrames.push(true);
|
|
94
|
+
}
|
|
95
|
+
const maybeEvald = value.eval(context);
|
|
96
|
+
const after = (v: Node): Node => {
|
|
97
|
+
value = v;
|
|
98
|
+
if (isOp) {
|
|
99
|
+
context.parenFrames.pop();
|
|
100
|
+
}
|
|
101
|
+
if (this._isEscaped(context) && value instanceof Node) {
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
const delimiter = this.options?.delimiter ?? 'paren';
|
|
105
|
+
if (delimiter === 'paren') {
|
|
106
|
+
value = this._unwrapValue(value, context);
|
|
107
|
+
if (value instanceof Bool || value instanceof Dimension) {
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
if (isOp && !isOpOrExpression(value)) {
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const node = this.clone();
|
|
115
|
+
const previousValue = node.value;
|
|
116
|
+
node.value = value;
|
|
117
|
+
if (previousValue instanceof Node && previousValue !== value) {
|
|
118
|
+
previousValue.parent = undefined;
|
|
119
|
+
}
|
|
120
|
+
node.adopt(value);
|
|
121
|
+
return node;
|
|
122
|
+
};
|
|
123
|
+
if (isThenable(maybeEvald)) {
|
|
124
|
+
return (maybeEvald as Promise<Node>).then(after);
|
|
125
|
+
}
|
|
126
|
+
return after(maybeEvald as Node);
|
|
127
|
+
}
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export const paren = defineType(Paren, 'Paren');
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Context } from '../context.js';
|
|
2
|
+
import type { PrintOptions } from '..';
|
|
3
|
+
import { getPrintOptions } from './util/print.js';
|
|
4
|
+
import { defineType } from './node.js';
|
|
5
|
+
import { Sequence } from './sequence.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Used by `@media`, `@supports`, and `@container`
|
|
9
|
+
*
|
|
10
|
+
* This just helps identify conditions if we need to
|
|
11
|
+
* merge them later.
|
|
12
|
+
*
|
|
13
|
+
* @todo - add more structure?
|
|
14
|
+
*/
|
|
15
|
+
export interface QueryCondition {
|
|
16
|
+
type: 'QueryCondition';
|
|
17
|
+
shortType: 'query';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class QueryCondition extends Sequence {
|
|
21
|
+
override toTrimmedString(options?: PrintOptions): string {
|
|
22
|
+
options = getPrintOptions(options);
|
|
23
|
+
const w = options.writer!;
|
|
24
|
+
const mark = w.mark();
|
|
25
|
+
let value = this.get('value', options.context);
|
|
26
|
+
let length = value.length;
|
|
27
|
+
|
|
28
|
+
if (length === 0) {
|
|
29
|
+
return '';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Print first node as-is
|
|
33
|
+
let node = value[0]!;
|
|
34
|
+
let out = w.capture(() => node.toString(options));
|
|
35
|
+
w.add(out.replace(/^\s*|\s*$/g, ''), node);
|
|
36
|
+
|
|
37
|
+
// Space out sub-nodes
|
|
38
|
+
for (let i = 1; i < length; i++) {
|
|
39
|
+
let node = value[i]!;
|
|
40
|
+
w.add(' ');
|
|
41
|
+
let out = w.capture(() => node.toString(options));
|
|
42
|
+
w.add(out.replace(/^\s*|\s*$/g, ''), node);
|
|
43
|
+
}
|
|
44
|
+
return w.getSince(mark);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export const query = defineType(QueryCondition, 'QueryCondition', 'query');
|