@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,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Originally I had custom Hashmaps and ArrayLists, in order to normalize
|
|
3
|
+
* generators and iterators for each. But using non-native collections
|
|
4
|
+
* adds complexity but, more importantly, performance overhead, especially
|
|
5
|
+
* if you don't use those iterators.
|
|
6
|
+
*
|
|
7
|
+
* Even using a Map over an object for a dictionary, in theory, has faster
|
|
8
|
+
* lookups, but in total evaluation time, when the file is parsed, it would
|
|
9
|
+
* be passing in either a Map or an object, and converting the object
|
|
10
|
+
* to a map has object creation overhead, and so does creating the map itself,
|
|
11
|
+
* if you pass in an array of arrays.
|
|
12
|
+
*
|
|
13
|
+
* Maps are good for dynamic property additions and repeated lookups. Nodes
|
|
14
|
+
* look up / evaluate properties, at most, once per node, so an object-as-map
|
|
15
|
+
* will either be faster or the differences will be negligible.
|
|
16
|
+
*
|
|
17
|
+
* So now, data is exceedingly simple. It's all passed in as is when parsing or
|
|
18
|
+
* using the API, and we just have some utility functions in this file to iterate over
|
|
19
|
+
* arrays / objects / simple values and return the values or entries, in any order.
|
|
20
|
+
*/
|
|
21
|
+
import type { ConditionalExcept } from 'type-fest';
|
|
22
|
+
import { isNode } from './is-node.js';
|
|
23
|
+
import { N } from '../node-type.js';
|
|
24
|
+
import type { Mixin } from '../mixin.js';
|
|
25
|
+
import type { Rules } from '../rules.js';
|
|
26
|
+
import type { Ruleset } from '../ruleset.js';
|
|
27
|
+
import type { Node } from '../node.js';
|
|
28
|
+
|
|
29
|
+
const { isArray } = Array;
|
|
30
|
+
|
|
31
|
+
/** Fast replacement for lodash isPlainObject — checks constructor === Object */
|
|
32
|
+
export const isPlainObject = (value: unknown): value is Record<string, unknown> =>
|
|
33
|
+
typeof value === 'object' && value !== null && value.constructor === Object;
|
|
34
|
+
|
|
35
|
+
export function atIndex<T>(array: readonly T[], index: number = -1): T | undefined {
|
|
36
|
+
if (index >= 0) {
|
|
37
|
+
return array[index];
|
|
38
|
+
}
|
|
39
|
+
/** Use a negative index to access from the last element */
|
|
40
|
+
return array[array.length + index];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Entry generators, and this type will yield
|
|
45
|
+
* - [0] the value
|
|
46
|
+
* - [1] the key, if applicable, or the key '__value' for non-objects
|
|
47
|
+
* - [2] the containing object.
|
|
48
|
+
*
|
|
49
|
+
* The purpose of this structure is to iterate and allow replacement
|
|
50
|
+
* of the value in its containing object.
|
|
51
|
+
*
|
|
52
|
+
* The function logic should mirror this type logic.
|
|
53
|
+
*/
|
|
54
|
+
type GetEntriesOf<T> = T extends readonly any[]
|
|
55
|
+
? [T[number], number, T]
|
|
56
|
+
: T extends Node
|
|
57
|
+
? [Node, Node, Rules]
|
|
58
|
+
: T extends Record<string, infer RecordValue>
|
|
59
|
+
? RecordValue extends readonly any[]
|
|
60
|
+
? [RecordValue[number], number, RecordValue]
|
|
61
|
+
: [RecordValue, keyof ConditionalExcept<T, readonly any[]>, T]
|
|
62
|
+
: [T, 'data', T];
|
|
63
|
+
|
|
64
|
+
// type Test = GetEntriesOf<Node<string>>
|
|
65
|
+
// type Test2 = GetEntriesOf<Node<string[]>>
|
|
66
|
+
// type Test3 = GetEntriesOf<Node<{ selector: Node[], foo: 'string' }>>
|
|
67
|
+
|
|
68
|
+
export function* getValues<T>(collection: T, reverse = false): Generator<GetEntriesOf<{ data: T }>[0]> {
|
|
69
|
+
if (isArray(collection)) {
|
|
70
|
+
if (reverse) {
|
|
71
|
+
for (let i = collection.length - 1; i >= 0; i--) {
|
|
72
|
+
yield collection[i]!;
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
let length = collection.length;
|
|
76
|
+
for (let i = 0; i < length; i++) {
|
|
77
|
+
yield collection[i]!;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} else if (isPlainObject(collection)) {
|
|
81
|
+
const values = Object.values(collection as Record<string, unknown>);
|
|
82
|
+
for (let value of values) {
|
|
83
|
+
if (isArray(value)) {
|
|
84
|
+
yield* getValues(value, reverse);
|
|
85
|
+
} else {
|
|
86
|
+
yield value;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
yield collection;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function* getEntries<T>(collection: T, reverse = false): Generator<GetEntriesOf<T>> {
|
|
95
|
+
if (isArray(collection)) {
|
|
96
|
+
if (reverse) {
|
|
97
|
+
for (let i = collection.length - 1; i >= 0; i--) {
|
|
98
|
+
yield [collection[i]!, i, collection] as GetEntriesOf<T>;
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
let length = collection.length;
|
|
102
|
+
for (let i = 0; i < length; i++) {
|
|
103
|
+
yield [collection[i]!, i, collection] as GetEntriesOf<T>;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
} else if (isPlainObject(collection)) {
|
|
107
|
+
const entries = Object.entries(collection as Record<string, unknown>);
|
|
108
|
+
for (let [key, value] of entries) {
|
|
109
|
+
if (isArray(value)) {
|
|
110
|
+
yield* getEntries(value, reverse) as Generator<GetEntriesOf<T>>;
|
|
111
|
+
} else {
|
|
112
|
+
yield [value, key, collection] as GetEntriesOf<T>;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
} else if (isNode(collection, N.Mixin | N.Ruleset | N.Rules)) {
|
|
116
|
+
let rules: Node[];
|
|
117
|
+
if ((collection as Node).type === 'Mixin') {
|
|
118
|
+
if ((collection as Mixin).get('params')?.length) {
|
|
119
|
+
throw new Error('We can\'t iterate over a mixin with parameters');
|
|
120
|
+
}
|
|
121
|
+
rules = [...(collection as Mixin).get('rules').value];
|
|
122
|
+
} else if ((collection as Node).type === 'Ruleset') {
|
|
123
|
+
rules = [...(collection as Ruleset).get('rules').value];
|
|
124
|
+
} else if ((collection as Node).type === 'Rules') {
|
|
125
|
+
rules = [...(collection as Rules).value];
|
|
126
|
+
}
|
|
127
|
+
for (let [, value] of rules!.entries()) {
|
|
128
|
+
if (value.type === 'Comment') {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (!isNode(value, N.Declaration)) {
|
|
132
|
+
throw new Error('We can\'t iterate over rules with non-declarations');
|
|
133
|
+
}
|
|
134
|
+
yield [value.value, value.name, rules!] as unknown as GetEntriesOf<T>;
|
|
135
|
+
}
|
|
136
|
+
} else if (isNode(collection) && isArray((collection as Rules).value)) {
|
|
137
|
+
yield* getEntries((collection as Rules).value as unknown[], reverse) as Generator<GetEntriesOf<T>>;
|
|
138
|
+
} else {
|
|
139
|
+
yield [collection, 'value', collection] as unknown as GetEntriesOf<T>;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function arraysEqual(a: string[], b: string[]) {
|
|
144
|
+
if (a.length !== b.length) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
for (let i = 0; i < a.length; i++) {
|
|
148
|
+
if (a[i] !== b[i]) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
type TraversalFrame = {
|
|
156
|
+
items: Node[];
|
|
157
|
+
index: number;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
type TraversalMark = {
|
|
161
|
+
stack: TraversalFrame[];
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
type NodeTraversalOptions = {
|
|
165
|
+
includeSelf?: boolean;
|
|
166
|
+
deep?: boolean;
|
|
167
|
+
reverse?: boolean;
|
|
168
|
+
includePrePost?: boolean;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
function cloneFrames(frames: TraversalFrame[]): TraversalFrame[] {
|
|
172
|
+
return frames.map(frame => ({
|
|
173
|
+
items: frame.items,
|
|
174
|
+
index: frame.index
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function collectDirectNodes(
|
|
179
|
+
node: Node,
|
|
180
|
+
reverse = false,
|
|
181
|
+
includePrePost = false
|
|
182
|
+
): Node[] {
|
|
183
|
+
const result: Node[] = [];
|
|
184
|
+
const keys = (node.constructor as typeof Node).childKeys;
|
|
185
|
+
|
|
186
|
+
if (keys) {
|
|
187
|
+
const keyList = reverse ? [...keys].reverse() : keys;
|
|
188
|
+
|
|
189
|
+
for (const key of keyList) {
|
|
190
|
+
// Read from instance field directly (node[key]) instead of node.data[key],
|
|
191
|
+
// because array containers' .data getter returns the array itself, not { value: array }.
|
|
192
|
+
const nodeVal = (node as unknown as Record<string, unknown>)[key!];
|
|
193
|
+
if (isArray(nodeVal)) {
|
|
194
|
+
const items = reverse ? [...nodeVal].reverse() : nodeVal;
|
|
195
|
+
for (const item of items) {
|
|
196
|
+
if (isNode(item)) {
|
|
197
|
+
if (includePrePost) {
|
|
198
|
+
result.push(...item.nodeAndPrePost());
|
|
199
|
+
} else {
|
|
200
|
+
result.push(item);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
} else if (isNode(nodeVal)) {
|
|
205
|
+
if (includePrePost) {
|
|
206
|
+
result.push(...nodeVal.nodeAndPrePost());
|
|
207
|
+
} else {
|
|
208
|
+
result.push(nodeVal);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Leaf nodes (keys === null) have no child nodes to collect
|
|
214
|
+
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export class NodeTraversalCursor implements IterableIterator<Node> {
|
|
219
|
+
private stack: TraversalFrame[] = [];
|
|
220
|
+
private readonly deep: boolean;
|
|
221
|
+
private readonly reverse: boolean;
|
|
222
|
+
private readonly includePrePost: boolean;
|
|
223
|
+
|
|
224
|
+
constructor(root: Node, options: NodeTraversalOptions = {}) {
|
|
225
|
+
const {
|
|
226
|
+
includeSelf = false,
|
|
227
|
+
deep = false,
|
|
228
|
+
reverse = false,
|
|
229
|
+
includePrePost = false
|
|
230
|
+
} = options;
|
|
231
|
+
|
|
232
|
+
this.deep = deep;
|
|
233
|
+
this.reverse = reverse;
|
|
234
|
+
this.includePrePost = includePrePost;
|
|
235
|
+
|
|
236
|
+
const initialItems = includeSelf
|
|
237
|
+
? includePrePost
|
|
238
|
+
? [...root.nodeAndPrePost()]
|
|
239
|
+
: [root]
|
|
240
|
+
: collectDirectNodes(root, reverse, includePrePost);
|
|
241
|
+
|
|
242
|
+
this.stack.push({
|
|
243
|
+
items: initialItems,
|
|
244
|
+
index: 0
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
[Symbol.iterator](): IterableIterator<Node> {
|
|
249
|
+
return this;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
next(): IteratorResult<Node> {
|
|
253
|
+
while (this.stack.length > 0) {
|
|
254
|
+
const frame = this.stack[this.stack.length - 1]!;
|
|
255
|
+
|
|
256
|
+
if (frame.index >= frame.items.length) {
|
|
257
|
+
this.stack.pop();
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const node = frame.items[frame.index++]!;
|
|
262
|
+
|
|
263
|
+
if (this.deep) {
|
|
264
|
+
const children = collectDirectNodes(
|
|
265
|
+
node,
|
|
266
|
+
this.reverse,
|
|
267
|
+
this.includePrePost
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
if (children.length > 0) {
|
|
271
|
+
this.stack.push({
|
|
272
|
+
items: children,
|
|
273
|
+
index: 0
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return {
|
|
279
|
+
done: false,
|
|
280
|
+
value: node
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
return {
|
|
285
|
+
done: true,
|
|
286
|
+
value: undefined as never
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
mark(): TraversalMark {
|
|
291
|
+
return {
|
|
292
|
+
stack: cloneFrames(this.stack)
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
restore(mark: TraversalMark): void {
|
|
297
|
+
this.stack = cloneFrames(mark.stack);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { isNode } from './is-node.js';
|
|
2
|
+
import isObject from 'lodash-es/isObject.js';
|
|
3
|
+
import { type Node } from '../node.js';
|
|
4
|
+
import type { EqualityMode } from '../../types/modes.js';
|
|
5
|
+
|
|
6
|
+
export function compare(a: any, b: any, mode: EqualityMode = 'coerce') {
|
|
7
|
+
if (a === b) {
|
|
8
|
+
return 0;
|
|
9
|
+
}
|
|
10
|
+
if (!isObject(a) && !isObject(b)) {
|
|
11
|
+
return a > b ? 1 : -1;
|
|
12
|
+
}
|
|
13
|
+
if (isNode(a) && isNode(b)) {
|
|
14
|
+
return a.compare(b);
|
|
15
|
+
}
|
|
16
|
+
/** Do comparison without strict equality */
|
|
17
|
+
if (mode === 'coerce' && a == b) {
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Find the actual source order of two nodes, by comparing
|
|
25
|
+
* their position in their lowest common ancestor in the tree.
|
|
26
|
+
*/
|
|
27
|
+
export function comparePosition(a: Node, b: Node) {
|
|
28
|
+
if (a === b) {
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const pathToRoot = (node: Node): Node[] => {
|
|
33
|
+
const path: Node[] = [];
|
|
34
|
+
let current: Node | undefined = node;
|
|
35
|
+
let guard = 0;
|
|
36
|
+
while (current && guard < 1024) {
|
|
37
|
+
path.push(current);
|
|
38
|
+
current = current.parent;
|
|
39
|
+
guard++;
|
|
40
|
+
}
|
|
41
|
+
return path;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const aPath = pathToRoot(a);
|
|
45
|
+
const bPath = pathToRoot(b);
|
|
46
|
+
let ai = aPath.length - 1;
|
|
47
|
+
let bi = bPath.length - 1;
|
|
48
|
+
let commonAncestor: Node | undefined;
|
|
49
|
+
|
|
50
|
+
while (ai >= 0 && bi >= 0 && aPath[ai] === bPath[bi]) {
|
|
51
|
+
commonAncestor = aPath[ai];
|
|
52
|
+
ai--;
|
|
53
|
+
bi--;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (!commonAncestor) {
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const aChild = ai >= 0 ? aPath[ai] : a;
|
|
61
|
+
const bChild = bi >= 0 ? bPath[bi] : b;
|
|
62
|
+
const aIndex = Number.isFinite(aChild.index) ? aChild.index : 0;
|
|
63
|
+
const bIndex = Number.isFinite(bChild.index) ? bChild.index : 0;
|
|
64
|
+
return aIndex - bIndex;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function compareNodeArray(a: any[], b: any[], mode: EqualityMode = 'coerce'): 0 | 1 | -1 | undefined {
|
|
68
|
+
let output: 0 | 1 | -1 | undefined;
|
|
69
|
+
|
|
70
|
+
if (a.length !== b.length) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* All values must be equal, or less than, or greater than.
|
|
76
|
+
* Anything else is undefined.
|
|
77
|
+
*/
|
|
78
|
+
for (let i = 0; i < a.length; i++) {
|
|
79
|
+
let result = compare(a[i]!, b[i]!, mode);
|
|
80
|
+
if (result === undefined) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
if (output === undefined) {
|
|
84
|
+
output = result;
|
|
85
|
+
} else if (result !== output) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return output;
|
|
90
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { CANONICAL, type Cursor, type Node, type NodeEdge, type RenderKey } from '../node.js';
|
|
2
|
+
|
|
3
|
+
function nodeFields(node: Node): Record<string, unknown> {
|
|
4
|
+
return node as unknown as Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function getSingularEdgeStore(
|
|
8
|
+
node: Node,
|
|
9
|
+
key: string
|
|
10
|
+
): NodeEdge<Node> | undefined {
|
|
11
|
+
return nodeFields(node)[`${key}Edge`] as NodeEdge<Node> | undefined;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function getIndexedEdgeStore(
|
|
15
|
+
node: Node,
|
|
16
|
+
key: string
|
|
17
|
+
): Array<NodeEdge<Node> | undefined> | undefined {
|
|
18
|
+
return nodeFields(node)[`${key}Edges`] as Array<NodeEdge<Node> | undefined> | undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function setSingularEdgeStore(
|
|
22
|
+
node: Node,
|
|
23
|
+
key: string,
|
|
24
|
+
edge: NodeEdge<Node>
|
|
25
|
+
): void {
|
|
26
|
+
nodeFields(node)[`${key}Edge`] = edge;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function setIndexedEdgeStore(
|
|
30
|
+
node: Node,
|
|
31
|
+
key: string,
|
|
32
|
+
edges: Array<NodeEdge<Node> | undefined>
|
|
33
|
+
): void {
|
|
34
|
+
nodeFields(node)[`${key}Edges`] = edges;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function lookupEdge<T>(
|
|
38
|
+
edges: NodeEdge<T> | undefined,
|
|
39
|
+
key: RenderKey
|
|
40
|
+
): T | undefined {
|
|
41
|
+
return edges?.get(key);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the primary parent cursor for a node/render-key pair.
|
|
46
|
+
*
|
|
47
|
+
* This mirrors `getParent(...)` at the cursor layer:
|
|
48
|
+
* - prefer the active render-key parent edge
|
|
49
|
+
* - fall back to canonical `node.parent`
|
|
50
|
+
*
|
|
51
|
+
* It deliberately does not follow secondary lanes such as `CALLER`. Traversals that
|
|
52
|
+
* want caller fallback must opt into that separately so the main render path stays
|
|
53
|
+
* stable and predictable.
|
|
54
|
+
*/
|
|
55
|
+
export function getParentEdge(cursor: Cursor): Cursor | undefined {
|
|
56
|
+
const overridden = lookupEdge(cursor.node.parentEdges, cursor.renderKey);
|
|
57
|
+
if (overridden !== undefined) {
|
|
58
|
+
return overridden ? { node: overridden, renderKey: cursor.renderKey } : undefined;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return cursor.node.parent
|
|
62
|
+
? { node: cursor.node.parent, renderKey: cursor.renderKey }
|
|
63
|
+
: undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function getEdge(cursor: Cursor, key: string): Cursor | undefined {
|
|
67
|
+
const edge = getSingularEdgeStore(cursor.node, key);
|
|
68
|
+
if (edge) {
|
|
69
|
+
const overridden = lookupEdge(edge, cursor.renderKey);
|
|
70
|
+
if (overridden !== undefined) {
|
|
71
|
+
return overridden ? { node: overridden, renderKey: cursor.renderKey } : undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const canonicalChild = nodeFields(cursor.node)[key] as Node | undefined;
|
|
76
|
+
return canonicalChild ? { node: canonicalChild, renderKey: cursor.renderKey } : undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function getEdgeAt(cursor: Cursor, key: string, index: number): Cursor | undefined {
|
|
80
|
+
const edges = getIndexedEdgeStore(cursor.node, key);
|
|
81
|
+
if (edges) {
|
|
82
|
+
const overridden = lookupEdge(edges[index], cursor.renderKey);
|
|
83
|
+
if (overridden !== undefined) {
|
|
84
|
+
return overridden ? { node: overridden, renderKey: cursor.renderKey } : undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const canonicalList = nodeFields(cursor.node)[key] as Node[] | undefined;
|
|
89
|
+
const canonicalChild = canonicalList?.[index];
|
|
90
|
+
return canonicalChild ? { node: canonicalChild, renderKey: cursor.renderKey } : undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function addEdge(
|
|
94
|
+
node: Node,
|
|
95
|
+
key: string,
|
|
96
|
+
renderKey: RenderKey,
|
|
97
|
+
child: Node
|
|
98
|
+
): void {
|
|
99
|
+
if (renderKey === CANONICAL) {
|
|
100
|
+
const canonicalChild = nodeFields(node)[key] as Node | undefined;
|
|
101
|
+
if (canonicalChild === child) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
throw new Error(`Cannot add a second CANONICAL edge for ${node.type}.${key}`);
|
|
105
|
+
}
|
|
106
|
+
const edge = getSingularEdgeStore(node, key) ?? new Map<RenderKey, Node>();
|
|
107
|
+
edge.set(renderKey, child);
|
|
108
|
+
setSingularEdgeStore(node, key, edge);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function addEdgeAt(
|
|
112
|
+
node: Node,
|
|
113
|
+
key: string,
|
|
114
|
+
index: number,
|
|
115
|
+
renderKey: RenderKey,
|
|
116
|
+
child: Node
|
|
117
|
+
): void {
|
|
118
|
+
if (renderKey === CANONICAL) {
|
|
119
|
+
const canonicalList = nodeFields(node)[key] as Node[] | undefined;
|
|
120
|
+
const canonicalChild = canonicalList?.[index];
|
|
121
|
+
if (canonicalChild === child) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
throw new Error(`Cannot add a second CANONICAL edge for ${node.type}.${key}[${index}]`);
|
|
125
|
+
}
|
|
126
|
+
const indexedEdges = getIndexedEdgeStore(node, key) ?? [];
|
|
127
|
+
const edge = indexedEdges[index] ?? new Map<RenderKey, Node>();
|
|
128
|
+
edge.set(renderKey, child);
|
|
129
|
+
indexedEdges[index] = edge;
|
|
130
|
+
setIndexedEdgeStore(node, key, indexedEdges);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function addParentEdge(
|
|
134
|
+
node: Node,
|
|
135
|
+
renderKey: RenderKey,
|
|
136
|
+
parent: Node
|
|
137
|
+
): void {
|
|
138
|
+
/**
|
|
139
|
+
* Parent edges represent render-placement overrides, not a second canonical parent.
|
|
140
|
+
*
|
|
141
|
+
* Invariants:
|
|
142
|
+
* - `CANONICAL` must continue to live on `node.parent`
|
|
143
|
+
* - non-canonical writes may override the active parent for a render key
|
|
144
|
+
* - special keys such as `CALLER` are allowed here, but they are secondary lanes;
|
|
145
|
+
* they should not be treated as the default upward render path unless a traversal
|
|
146
|
+
* explicitly asks for them
|
|
147
|
+
*/
|
|
148
|
+
if (renderKey === CANONICAL) {
|
|
149
|
+
if (node.parent === parent) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
throw new Error(`Cannot add a second CANONICAL parent edge for ${node.type}`);
|
|
153
|
+
}
|
|
154
|
+
const edge = node.parentEdges ?? new Map<RenderKey, Node>();
|
|
155
|
+
edge.set(renderKey, parent);
|
|
156
|
+
node.parentEdges = edge;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function removeParentEdge(
|
|
160
|
+
node: Node,
|
|
161
|
+
renderKey: RenderKey
|
|
162
|
+
): void {
|
|
163
|
+
const edge = node.parentEdges;
|
|
164
|
+
if (!edge) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
edge.delete(renderKey);
|
|
168
|
+
if (edge.size === 0) {
|
|
169
|
+
node.parentEdges = undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|