@jesscss/core 2.0.0-alpha.4 → 2.0.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs +20159 -0
- package/lib/index.d.cts +5993 -0
- package/lib/index.d.cts.map +1 -0
- package/lib/index.d.ts +5992 -21
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +19926 -22
- package/lib/index.js.map +1 -1
- package/package.json +15 -14
- package/src/__tests__/define-function-record.test.ts +58 -0
- package/src/__tests__/define-function-simple.test.ts +55 -0
- package/src/__tests__/define-function-split-sequence.test.ts +547 -0
- package/src/__tests__/define-function-type-parity.test.ts +9 -0
- package/src/__tests__/define-function.test.ts +763 -0
- package/src/__tests__/num-operations.test.ts +91 -0
- package/src/__tests__/safe-parse.test.ts +374 -0
- package/src/context.ts +896 -0
- package/src/conversions.ts +282 -0
- package/src/debug-log.ts +29 -0
- package/src/define-function.ts +1006 -0
- package/src/deprecation.ts +67 -0
- package/src/globals.d.ts +26 -0
- package/src/index.ts +31 -0
- package/src/jess-error.ts +773 -0
- package/src/logger/deprecation-processing.ts +109 -0
- package/src/logger.ts +31 -0
- package/src/plugin.ts +292 -0
- package/src/tree/LOOKUP_CHAINS.md +35 -0
- package/src/tree/README.md +18 -0
- package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
- package/src/tree/__tests__/ampersand.test.ts +382 -0
- package/src/tree/__tests__/at-rule.test.ts +2047 -0
- package/src/tree/__tests__/basic-render.test.ts +212 -0
- package/src/tree/__tests__/block.test.ts +40 -0
- package/src/tree/__tests__/call.test.ts +346 -0
- package/src/tree/__tests__/color.test.ts +537 -0
- package/src/tree/__tests__/condition.test.ts +186 -0
- package/src/tree/__tests__/control.test.ts +564 -0
- package/src/tree/__tests__/declaration.test.ts +253 -0
- package/src/tree/__tests__/dependency-graph.test.ts +177 -0
- package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
- package/src/tree/__tests__/dimension.test.ts +236 -0
- package/src/tree/__tests__/expression.test.ts +73 -0
- package/src/tree/__tests__/ext-node.test.ts +31 -0
- package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
- package/src/tree/__tests__/extend-import-style.test.ts +929 -0
- package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
- package/src/tree/__tests__/extend-list.test.ts +31 -0
- package/src/tree/__tests__/extend-roots.test.ts +1045 -0
- package/src/tree/__tests__/extend-rules.test.ts +740 -0
- package/src/tree/__tests__/func.test.ts +171 -0
- package/src/tree/__tests__/import-js.test.ts +33 -0
- package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
- package/src/tree/__tests__/import-style.test.ts +1967 -0
- package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
- package/src/tree/__tests__/interpolated.test.ts +41 -0
- package/src/tree/__tests__/list.test.ts +177 -0
- package/src/tree/__tests__/log.test.ts +83 -0
- package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
- package/src/tree/__tests__/mixin.test.ts +2171 -0
- package/src/tree/__tests__/negative.test.ts +45 -0
- package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
- package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
- package/src/tree/__tests__/node-flags.test.ts +410 -0
- package/src/tree/__tests__/node-graph.test.ts +598 -0
- package/src/tree/__tests__/node-mutation.test.ts +182 -0
- package/src/tree/__tests__/operation.test.ts +18 -0
- package/src/tree/__tests__/paren.test.ts +90 -0
- package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
- package/src/tree/__tests__/quoted.test.ts +72 -0
- package/src/tree/__tests__/range.test.ts +59 -0
- package/src/tree/__tests__/reference.test.ts +743 -0
- package/src/tree/__tests__/rest.test.ts +29 -0
- package/src/tree/__tests__/rules-raw.test.ts +14 -0
- package/src/tree/__tests__/rules.test.ts +1271 -0
- package/src/tree/__tests__/ruleset.test.ts +597 -0
- package/src/tree/__tests__/selector-attr.test.ts +50 -0
- package/src/tree/__tests__/selector-basic.test.ts +44 -0
- package/src/tree/__tests__/selector-capture.test.ts +22 -0
- package/src/tree/__tests__/selector-complex.test.ts +120 -0
- package/src/tree/__tests__/selector-compound.test.ts +74 -0
- package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
- package/src/tree/__tests__/selector-list.test.ts +59 -0
- package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
- package/src/tree/__tests__/selector.test.ts +182 -0
- package/src/tree/__tests__/sequence.test.ts +226 -0
- package/src/tree/__tests__/serialize-types.test.ts +529 -0
- package/src/tree/__tests__/spaced.test.ts +8 -0
- package/src/tree/__tests__/url.test.ts +72 -0
- package/src/tree/__tests__/var-declaration.test.ts +90 -0
- package/src/tree/ampersand.ts +538 -0
- package/src/tree/any.ts +169 -0
- package/src/tree/at-rule.ts +760 -0
- package/src/tree/block.ts +72 -0
- package/src/tree/bool.ts +46 -0
- package/src/tree/call.ts +593 -0
- package/src/tree/collection.ts +52 -0
- package/src/tree/color.ts +629 -0
- package/src/tree/combinator.ts +30 -0
- package/src/tree/comment.ts +36 -0
- package/src/tree/condition.ts +194 -0
- package/src/tree/control.ts +452 -0
- package/src/tree/declaration-custom.ts +56 -0
- package/src/tree/declaration-var.ts +87 -0
- package/src/tree/declaration.ts +742 -0
- package/src/tree/default-guard.ts +35 -0
- package/src/tree/dimension.ts +392 -0
- package/src/tree/expression.ts +97 -0
- package/src/tree/extend-list.ts +51 -0
- package/src/tree/extend.ts +391 -0
- package/src/tree/function.ts +254 -0
- package/src/tree/import-js.ts +130 -0
- package/src/tree/import-style.ts +875 -0
- package/{lib/tree/index.js → src/tree/index.ts} +49 -22
- package/src/tree/interpolated.ts +346 -0
- package/src/tree/js-array.ts +21 -0
- package/src/tree/js-expr.ts +50 -0
- package/src/tree/js-function.ts +31 -0
- package/src/tree/js-object.ts +22 -0
- package/src/tree/list.ts +415 -0
- package/src/tree/log.ts +89 -0
- package/src/tree/mixin.ts +331 -0
- package/src/tree/negative.ts +58 -0
- package/src/tree/nil.ts +57 -0
- package/src/tree/node-base.ts +1716 -0
- package/src/tree/node-type.ts +122 -0
- package/src/tree/node.ts +118 -0
- package/src/tree/number.ts +54 -0
- package/src/tree/operation.ts +187 -0
- package/src/tree/paren.ts +132 -0
- package/src/tree/query-condition.ts +47 -0
- package/src/tree/quoted.ts +119 -0
- package/src/tree/range.ts +101 -0
- package/src/tree/reference.ts +1099 -0
- package/src/tree/rest.ts +55 -0
- package/src/tree/rules-raw.ts +52 -0
- package/src/tree/rules.ts +2896 -0
- package/src/tree/ruleset.ts +1217 -0
- package/src/tree/selector-attr.ts +172 -0
- package/src/tree/selector-basic.ts +75 -0
- package/src/tree/selector-capture.ts +85 -0
- package/src/tree/selector-complex.ts +189 -0
- package/src/tree/selector-compound.ts +205 -0
- package/src/tree/selector-interpolated.ts +95 -0
- package/src/tree/selector-list.ts +245 -0
- package/src/tree/selector-pseudo.ts +173 -0
- package/src/tree/selector-simple.ts +10 -0
- package/src/tree/selector.ts +152 -0
- package/src/tree/sequence.ts +463 -0
- package/src/tree/tree.ts +130 -0
- package/src/tree/url.ts +95 -0
- package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
- package/src/tree/util/EXTEND_AUDIT.md +233 -0
- package/src/tree/util/EXTEND_BASELINE.md +64 -0
- package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
- package/src/tree/util/EXTEND_DOCS.md +24 -0
- package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
- package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
- package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
- package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
- package/src/tree/util/EXTEND_RULES.md +74 -0
- package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
- package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
- package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
- package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
- package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
- package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
- package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
- package/src/tree/util/__tests__/_archive/README.md +4 -0
- package/src/tree/util/__tests__/bitset.test.ts +142 -0
- package/src/tree/util/__tests__/debug-log.ts +50 -0
- package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
- package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
- package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
- package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
- package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
- package/src/tree/util/__tests__/is-node.test.ts +63 -0
- package/src/tree/util/__tests__/list-like.test.ts +63 -0
- package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
- package/src/tree/util/__tests__/print.test.ts +183 -0
- package/src/tree/util/__tests__/process-extends.test.ts +226 -0
- package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
- package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
- package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
- package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
- package/src/tree/util/ampersand-template.ts +9 -0
- package/src/tree/util/bitset.ts +194 -0
- package/src/tree/util/calculate.ts +11 -0
- package/src/tree/util/cast.ts +89 -0
- package/src/tree/util/cloning.ts +8 -0
- package/src/tree/util/collections.ts +299 -0
- package/src/tree/util/compare.ts +90 -0
- package/src/tree/util/cursor.ts +171 -0
- package/src/tree/util/extend-core.ts +2139 -0
- package/src/tree/util/extend-roots.ts +1108 -0
- package/src/tree/util/field-helpers.ts +354 -0
- package/src/tree/util/is-node.ts +43 -0
- package/src/tree/util/list-like.ts +93 -0
- package/src/tree/util/mixin-instance-primitives.ts +2020 -0
- package/src/tree/util/print.ts +303 -0
- package/src/tree/util/process-leading-is.ts +421 -0
- package/src/tree/util/recursion-helper.ts +54 -0
- package/src/tree/util/regex.ts +2 -0
- package/src/tree/util/registry-utils.ts +1953 -0
- package/src/tree/util/ruleset-trace.ts +17 -0
- package/src/tree/util/scoped-body-eval.ts +320 -0
- package/src/tree/util/selector-match-core.ts +2005 -0
- package/src/tree/util/selector-utils.ts +757 -0
- package/src/tree/util/serialize-helper.ts +535 -0
- package/src/tree/util/serialize-types.ts +318 -0
- package/src/tree/util/should-operate.ts +78 -0
- package/src/tree/util/sourcemap.ts +37 -0
- package/src/types/config.ts +247 -0
- package/src/types/index.ts +12 -0
- package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
- package/src/types.d.ts +9 -0
- package/src/types.ts +68 -0
- package/src/use-webpack-resolver.ts +56 -0
- package/src/visitor/__tests__/visitor.test.ts +136 -0
- package/src/visitor/index.ts +263 -0
- package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
- package/lib/context.d.ts +0 -352
- package/lib/context.d.ts.map +0 -1
- package/lib/context.js +0 -636
- package/lib/context.js.map +0 -1
- package/lib/conversions.d.ts +0 -73
- package/lib/conversions.d.ts.map +0 -1
- package/lib/conversions.js +0 -253
- package/lib/conversions.js.map +0 -1
- package/lib/debug-log.d.ts +0 -2
- package/lib/debug-log.d.ts.map +0 -1
- package/lib/debug-log.js +0 -27
- package/lib/debug-log.js.map +0 -1
- package/lib/define-function.d.ts +0 -587
- package/lib/define-function.d.ts.map +0 -1
- package/lib/define-function.js +0 -726
- package/lib/define-function.js.map +0 -1
- package/lib/deprecation.d.ts +0 -34
- package/lib/deprecation.d.ts.map +0 -1
- package/lib/deprecation.js +0 -57
- package/lib/deprecation.js.map +0 -1
- package/lib/jess-error.d.ts +0 -343
- package/lib/jess-error.d.ts.map +0 -1
- package/lib/jess-error.js +0 -508
- package/lib/jess-error.js.map +0 -1
- package/lib/logger/deprecation-processing.d.ts +0 -41
- package/lib/logger/deprecation-processing.d.ts.map +0 -1
- package/lib/logger/deprecation-processing.js +0 -81
- package/lib/logger/deprecation-processing.js.map +0 -1
- package/lib/logger.d.ts +0 -10
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js +0 -20
- package/lib/logger.js.map +0 -1
- package/lib/plugin.d.ts +0 -94
- package/lib/plugin.d.ts.map +0 -1
- package/lib/plugin.js +0 -174
- package/lib/plugin.js.map +0 -1
- package/lib/tree/ampersand.d.ts +0 -94
- package/lib/tree/ampersand.d.ts.map +0 -1
- package/lib/tree/ampersand.js +0 -269
- package/lib/tree/ampersand.js.map +0 -1
- package/lib/tree/any.d.ts +0 -58
- package/lib/tree/any.d.ts.map +0 -1
- package/lib/tree/any.js +0 -104
- package/lib/tree/any.js.map +0 -1
- package/lib/tree/at-rule.d.ts +0 -53
- package/lib/tree/at-rule.d.ts.map +0 -1
- package/lib/tree/at-rule.js +0 -503
- package/lib/tree/at-rule.js.map +0 -1
- package/lib/tree/block.d.ts +0 -22
- package/lib/tree/block.d.ts.map +0 -1
- package/lib/tree/block.js +0 -24
- package/lib/tree/block.js.map +0 -1
- package/lib/tree/bool.d.ts +0 -18
- package/lib/tree/bool.d.ts.map +0 -1
- package/lib/tree/bool.js +0 -28
- package/lib/tree/bool.js.map +0 -1
- package/lib/tree/call.d.ts +0 -66
- package/lib/tree/call.d.ts.map +0 -1
- package/lib/tree/call.js +0 -306
- package/lib/tree/call.js.map +0 -1
- package/lib/tree/collection.d.ts +0 -30
- package/lib/tree/collection.d.ts.map +0 -1
- package/lib/tree/collection.js +0 -37
- package/lib/tree/collection.js.map +0 -1
- package/lib/tree/color.d.ts +0 -101
- package/lib/tree/color.d.ts.map +0 -1
- package/lib/tree/color.js +0 -513
- package/lib/tree/color.js.map +0 -1
- package/lib/tree/combinator.d.ts +0 -13
- package/lib/tree/combinator.d.ts.map +0 -1
- package/lib/tree/combinator.js +0 -12
- package/lib/tree/combinator.js.map +0 -1
- package/lib/tree/comment.d.ts +0 -20
- package/lib/tree/comment.d.ts.map +0 -1
- package/lib/tree/comment.js +0 -19
- package/lib/tree/comment.js.map +0 -1
- package/lib/tree/condition.d.ts +0 -31
- package/lib/tree/condition.d.ts.map +0 -1
- package/lib/tree/condition.js +0 -103
- package/lib/tree/condition.js.map +0 -1
- package/lib/tree/control.d.ts +0 -104
- package/lib/tree/control.d.ts.map +0 -1
- package/lib/tree/control.js +0 -430
- package/lib/tree/control.js.map +0 -1
- package/lib/tree/declaration-custom.d.ts +0 -18
- package/lib/tree/declaration-custom.d.ts.map +0 -1
- package/lib/tree/declaration-custom.js +0 -24
- package/lib/tree/declaration-custom.js.map +0 -1
- package/lib/tree/declaration-var.d.ts +0 -35
- package/lib/tree/declaration-var.d.ts.map +0 -1
- package/lib/tree/declaration-var.js +0 -63
- package/lib/tree/declaration-var.js.map +0 -1
- package/lib/tree/declaration.d.ts +0 -78
- package/lib/tree/declaration.d.ts.map +0 -1
- package/lib/tree/declaration.js +0 -286
- package/lib/tree/declaration.js.map +0 -1
- package/lib/tree/default-guard.d.ts +0 -15
- package/lib/tree/default-guard.d.ts.map +0 -1
- package/lib/tree/default-guard.js +0 -19
- package/lib/tree/default-guard.js.map +0 -1
- package/lib/tree/dimension.d.ts +0 -34
- package/lib/tree/dimension.d.ts.map +0 -1
- package/lib/tree/dimension.js +0 -294
- package/lib/tree/dimension.js.map +0 -1
- package/lib/tree/expression.d.ts +0 -25
- package/lib/tree/expression.d.ts.map +0 -1
- package/lib/tree/expression.js +0 -32
- package/lib/tree/expression.js.map +0 -1
- package/lib/tree/extend-list.d.ts +0 -23
- package/lib/tree/extend-list.d.ts.map +0 -1
- package/lib/tree/extend-list.js +0 -23
- package/lib/tree/extend-list.js.map +0 -1
- package/lib/tree/extend.d.ts +0 -47
- package/lib/tree/extend.d.ts.map +0 -1
- package/lib/tree/extend.js +0 -296
- package/lib/tree/extend.js.map +0 -1
- package/lib/tree/function.d.ts +0 -48
- package/lib/tree/function.d.ts.map +0 -1
- package/lib/tree/function.js +0 -74
- package/lib/tree/function.js.map +0 -1
- package/lib/tree/import-js.d.ts +0 -35
- package/lib/tree/import-js.d.ts.map +0 -1
- package/lib/tree/import-js.js +0 -45
- package/lib/tree/import-js.js.map +0 -1
- package/lib/tree/import-style.d.ts +0 -156
- package/lib/tree/import-style.d.ts.map +0 -1
- package/lib/tree/import-style.js +0 -566
- package/lib/tree/import-style.js.map +0 -1
- package/lib/tree/index.d.ts +0 -71
- package/lib/tree/index.d.ts.map +0 -1
- package/lib/tree/index.js.map +0 -1
- package/lib/tree/interpolated-reference.d.ts +0 -24
- package/lib/tree/interpolated-reference.d.ts.map +0 -1
- package/lib/tree/interpolated-reference.js +0 -37
- package/lib/tree/interpolated-reference.js.map +0 -1
- package/lib/tree/interpolated.d.ts +0 -62
- package/lib/tree/interpolated.d.ts.map +0 -1
- package/lib/tree/interpolated.js +0 -204
- package/lib/tree/interpolated.js.map +0 -1
- package/lib/tree/js-array.d.ts +0 -10
- package/lib/tree/js-array.d.ts.map +0 -1
- package/lib/tree/js-array.js +0 -10
- package/lib/tree/js-array.js.map +0 -1
- package/lib/tree/js-expr.d.ts +0 -23
- package/lib/tree/js-expr.d.ts.map +0 -1
- package/lib/tree/js-expr.js +0 -28
- package/lib/tree/js-expr.js.map +0 -1
- package/lib/tree/js-function.d.ts +0 -20
- package/lib/tree/js-function.d.ts.map +0 -1
- package/lib/tree/js-function.js +0 -16
- package/lib/tree/js-function.js.map +0 -1
- package/lib/tree/js-object.d.ts +0 -10
- package/lib/tree/js-object.d.ts.map +0 -1
- package/lib/tree/js-object.js +0 -10
- package/lib/tree/js-object.js.map +0 -1
- package/lib/tree/list.d.ts +0 -38
- package/lib/tree/list.d.ts.map +0 -1
- package/lib/tree/list.js +0 -83
- package/lib/tree/list.js.map +0 -1
- package/lib/tree/log.d.ts +0 -29
- package/lib/tree/log.d.ts.map +0 -1
- package/lib/tree/log.js +0 -56
- package/lib/tree/log.js.map +0 -1
- package/lib/tree/mixin.d.ts +0 -87
- package/lib/tree/mixin.d.ts.map +0 -1
- package/lib/tree/mixin.js +0 -112
- package/lib/tree/mixin.js.map +0 -1
- package/lib/tree/negative.d.ts +0 -17
- package/lib/tree/negative.d.ts.map +0 -1
- package/lib/tree/negative.js +0 -22
- package/lib/tree/negative.js.map +0 -1
- package/lib/tree/nil.d.ts +0 -30
- package/lib/tree/nil.d.ts.map +0 -1
- package/lib/tree/nil.js +0 -35
- package/lib/tree/nil.js.map +0 -1
- package/lib/tree/node-base.d.ts +0 -361
- package/lib/tree/node-base.d.ts.map +0 -1
- package/lib/tree/node-base.js +0 -930
- package/lib/tree/node-base.js.map +0 -1
- package/lib/tree/node.d.ts +0 -10
- package/lib/tree/node.d.ts.map +0 -1
- package/lib/tree/node.js +0 -45
- package/lib/tree/node.js.map +0 -1
- package/lib/tree/number.d.ts +0 -21
- package/lib/tree/number.d.ts.map +0 -1
- package/lib/tree/number.js +0 -27
- package/lib/tree/number.js.map +0 -1
- package/lib/tree/operation.d.ts +0 -26
- package/lib/tree/operation.d.ts.map +0 -1
- package/lib/tree/operation.js +0 -103
- package/lib/tree/operation.js.map +0 -1
- package/lib/tree/paren.d.ts +0 -19
- package/lib/tree/paren.d.ts.map +0 -1
- package/lib/tree/paren.js +0 -92
- package/lib/tree/paren.js.map +0 -1
- package/lib/tree/query-condition.d.ts +0 -17
- package/lib/tree/query-condition.d.ts.map +0 -1
- package/lib/tree/query-condition.js +0 -39
- package/lib/tree/query-condition.js.map +0 -1
- package/lib/tree/quoted.d.ts +0 -28
- package/lib/tree/quoted.d.ts.map +0 -1
- package/lib/tree/quoted.js +0 -75
- package/lib/tree/quoted.js.map +0 -1
- package/lib/tree/range.d.ts +0 -33
- package/lib/tree/range.d.ts.map +0 -1
- package/lib/tree/range.js +0 -47
- package/lib/tree/range.js.map +0 -1
- package/lib/tree/reference.d.ts +0 -76
- package/lib/tree/reference.d.ts.map +0 -1
- package/lib/tree/reference.js +0 -521
- package/lib/tree/reference.js.map +0 -1
- package/lib/tree/rest.d.ts +0 -15
- package/lib/tree/rest.d.ts.map +0 -1
- package/lib/tree/rest.js +0 -32
- package/lib/tree/rest.js.map +0 -1
- package/lib/tree/rules-raw.d.ts +0 -17
- package/lib/tree/rules-raw.d.ts.map +0 -1
- package/lib/tree/rules-raw.js +0 -37
- package/lib/tree/rules-raw.js.map +0 -1
- package/lib/tree/rules.d.ts +0 -262
- package/lib/tree/rules.d.ts.map +0 -1
- package/lib/tree/rules.js +0 -2359
- package/lib/tree/rules.js.map +0 -1
- package/lib/tree/ruleset.d.ts +0 -92
- package/lib/tree/ruleset.d.ts.map +0 -1
- package/lib/tree/ruleset.js +0 -528
- package/lib/tree/ruleset.js.map +0 -1
- package/lib/tree/selector-attr.d.ts +0 -31
- package/lib/tree/selector-attr.d.ts.map +0 -1
- package/lib/tree/selector-attr.js +0 -99
- package/lib/tree/selector-attr.js.map +0 -1
- package/lib/tree/selector-basic.d.ts +0 -24
- package/lib/tree/selector-basic.d.ts.map +0 -1
- package/lib/tree/selector-basic.js +0 -38
- package/lib/tree/selector-basic.js.map +0 -1
- package/lib/tree/selector-capture.d.ts +0 -23
- package/lib/tree/selector-capture.d.ts.map +0 -1
- package/lib/tree/selector-capture.js +0 -34
- package/lib/tree/selector-capture.js.map +0 -1
- package/lib/tree/selector-complex.d.ts +0 -40
- package/lib/tree/selector-complex.d.ts.map +0 -1
- package/lib/tree/selector-complex.js +0 -143
- package/lib/tree/selector-complex.js.map +0 -1
- package/lib/tree/selector-compound.d.ts +0 -16
- package/lib/tree/selector-compound.d.ts.map +0 -1
- package/lib/tree/selector-compound.js +0 -114
- package/lib/tree/selector-compound.js.map +0 -1
- package/lib/tree/selector-interpolated.d.ts +0 -23
- package/lib/tree/selector-interpolated.d.ts.map +0 -1
- package/lib/tree/selector-interpolated.js +0 -27
- package/lib/tree/selector-interpolated.js.map +0 -1
- package/lib/tree/selector-list.d.ts +0 -17
- package/lib/tree/selector-list.d.ts.map +0 -1
- package/lib/tree/selector-list.js +0 -174
- package/lib/tree/selector-list.js.map +0 -1
- package/lib/tree/selector-pseudo.d.ts +0 -42
- package/lib/tree/selector-pseudo.d.ts.map +0 -1
- package/lib/tree/selector-pseudo.js +0 -204
- package/lib/tree/selector-pseudo.js.map +0 -1
- package/lib/tree/selector-simple.d.ts +0 -5
- package/lib/tree/selector-simple.d.ts.map +0 -1
- package/lib/tree/selector-simple.js +0 -6
- package/lib/tree/selector-simple.js.map +0 -1
- package/lib/tree/selector.d.ts +0 -43
- package/lib/tree/selector.d.ts.map +0 -1
- package/lib/tree/selector.js +0 -56
- package/lib/tree/selector.js.map +0 -1
- package/lib/tree/sequence.d.ts +0 -43
- package/lib/tree/sequence.d.ts.map +0 -1
- package/lib/tree/sequence.js +0 -151
- package/lib/tree/sequence.js.map +0 -1
- package/lib/tree/tree.d.ts +0 -87
- package/lib/tree/tree.d.ts.map +0 -1
- package/lib/tree/tree.js +0 -2
- package/lib/tree/tree.js.map +0 -1
- package/lib/tree/url.d.ts +0 -18
- package/lib/tree/url.d.ts.map +0 -1
- package/lib/tree/url.js +0 -35
- package/lib/tree/url.js.map +0 -1
- package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
- package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
- package/lib/tree/util/__tests__/debug-log.js +0 -36
- package/lib/tree/util/__tests__/debug-log.js.map +0 -1
- package/lib/tree/util/calculate.d.ts +0 -3
- package/lib/tree/util/calculate.d.ts.map +0 -1
- package/lib/tree/util/calculate.js +0 -10
- package/lib/tree/util/calculate.js.map +0 -1
- package/lib/tree/util/cast.d.ts +0 -10
- package/lib/tree/util/cast.d.ts.map +0 -1
- package/lib/tree/util/cast.js +0 -87
- package/lib/tree/util/cast.js.map +0 -1
- package/lib/tree/util/cloning.d.ts +0 -4
- package/lib/tree/util/cloning.d.ts.map +0 -1
- package/lib/tree/util/cloning.js +0 -8
- package/lib/tree/util/cloning.js.map +0 -1
- package/lib/tree/util/collections.d.ts +0 -57
- package/lib/tree/util/collections.d.ts.map +0 -1
- package/lib/tree/util/collections.js +0 -136
- package/lib/tree/util/collections.js.map +0 -1
- package/lib/tree/util/compare.d.ts +0 -11
- package/lib/tree/util/compare.d.ts.map +0 -1
- package/lib/tree/util/compare.js +0 -89
- package/lib/tree/util/compare.js.map +0 -1
- package/lib/tree/util/extend-helpers.d.ts +0 -2
- package/lib/tree/util/extend-helpers.d.ts.map +0 -1
- package/lib/tree/util/extend-helpers.js +0 -2
- package/lib/tree/util/extend-helpers.js.map +0 -1
- package/lib/tree/util/extend-roots.d.ts +0 -37
- package/lib/tree/util/extend-roots.d.ts.map +0 -1
- package/lib/tree/util/extend-roots.js +0 -700
- package/lib/tree/util/extend-roots.js.map +0 -1
- package/lib/tree/util/extend-roots.old.d.ts +0 -132
- package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
- package/lib/tree/util/extend-roots.old.js +0 -2272
- package/lib/tree/util/extend-roots.old.js.map +0 -1
- package/lib/tree/util/extend-trace-debug.d.ts +0 -13
- package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
- package/lib/tree/util/extend-trace-debug.js +0 -34
- package/lib/tree/util/extend-trace-debug.js.map +0 -1
- package/lib/tree/util/extend-walk.d.ts +0 -53
- package/lib/tree/util/extend-walk.d.ts.map +0 -1
- package/lib/tree/util/extend-walk.js +0 -881
- package/lib/tree/util/extend-walk.js.map +0 -1
- package/lib/tree/util/extend.d.ts +0 -218
- package/lib/tree/util/extend.d.ts.map +0 -1
- package/lib/tree/util/extend.js +0 -3182
- package/lib/tree/util/extend.js.map +0 -1
- package/lib/tree/util/find-extendable-locations.d.ts +0 -2
- package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
- package/lib/tree/util/find-extendable-locations.js +0 -2
- package/lib/tree/util/find-extendable-locations.js.map +0 -1
- package/lib/tree/util/format.d.ts +0 -20
- package/lib/tree/util/format.d.ts.map +0 -1
- package/lib/tree/util/format.js +0 -67
- package/lib/tree/util/format.js.map +0 -1
- package/lib/tree/util/is-node.d.ts +0 -13
- package/lib/tree/util/is-node.d.ts.map +0 -1
- package/lib/tree/util/is-node.js +0 -43
- package/lib/tree/util/is-node.js.map +0 -1
- package/lib/tree/util/print.d.ts +0 -80
- package/lib/tree/util/print.d.ts.map +0 -1
- package/lib/tree/util/print.js +0 -205
- package/lib/tree/util/print.js.map +0 -1
- package/lib/tree/util/process-leading-is.d.ts +0 -25
- package/lib/tree/util/process-leading-is.d.ts.map +0 -1
- package/lib/tree/util/process-leading-is.js +0 -364
- package/lib/tree/util/process-leading-is.js.map +0 -1
- package/lib/tree/util/recursion-helper.d.ts +0 -15
- package/lib/tree/util/recursion-helper.d.ts.map +0 -1
- package/lib/tree/util/recursion-helper.js +0 -43
- package/lib/tree/util/recursion-helper.js.map +0 -1
- package/lib/tree/util/regex.d.ts +0 -4
- package/lib/tree/util/regex.d.ts.map +0 -1
- package/lib/tree/util/regex.js +0 -4
- package/lib/tree/util/regex.js.map +0 -1
- package/lib/tree/util/registry-utils.d.ts +0 -192
- package/lib/tree/util/registry-utils.d.ts.map +0 -1
- package/lib/tree/util/registry-utils.js +0 -1214
- package/lib/tree/util/registry-utils.js.map +0 -1
- package/lib/tree/util/ruleset-trace.d.ts +0 -4
- package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
- package/lib/tree/util/ruleset-trace.js +0 -14
- package/lib/tree/util/ruleset-trace.js.map +0 -1
- package/lib/tree/util/selector-compare.d.ts +0 -2
- package/lib/tree/util/selector-compare.d.ts.map +0 -1
- package/lib/tree/util/selector-compare.js +0 -2
- package/lib/tree/util/selector-compare.js.map +0 -1
- package/lib/tree/util/selector-match-core.d.ts +0 -184
- package/lib/tree/util/selector-match-core.d.ts.map +0 -1
- package/lib/tree/util/selector-match-core.js +0 -1603
- package/lib/tree/util/selector-match-core.js.map +0 -1
- package/lib/tree/util/selector-utils.d.ts +0 -30
- package/lib/tree/util/selector-utils.d.ts.map +0 -1
- package/lib/tree/util/selector-utils.js +0 -100
- package/lib/tree/util/selector-utils.js.map +0 -1
- package/lib/tree/util/serialize-helper.d.ts +0 -13
- package/lib/tree/util/serialize-helper.d.ts.map +0 -1
- package/lib/tree/util/serialize-helper.js +0 -387
- package/lib/tree/util/serialize-helper.js.map +0 -1
- package/lib/tree/util/serialize-types.d.ts +0 -9
- package/lib/tree/util/serialize-types.d.ts.map +0 -1
- package/lib/tree/util/serialize-types.js +0 -216
- package/lib/tree/util/serialize-types.js.map +0 -1
- package/lib/tree/util/should-operate.d.ts +0 -23
- package/lib/tree/util/should-operate.d.ts.map +0 -1
- package/lib/tree/util/should-operate.js +0 -46
- package/lib/tree/util/should-operate.js.map +0 -1
- package/lib/tree/util/sourcemap.d.ts +0 -7
- package/lib/tree/util/sourcemap.d.ts.map +0 -1
- package/lib/tree/util/sourcemap.js +0 -25
- package/lib/tree/util/sourcemap.js.map +0 -1
- package/lib/types/config.d.ts +0 -205
- package/lib/types/config.d.ts.map +0 -1
- package/lib/types/config.js +0 -2
- package/lib/types/config.js.map +0 -1
- package/lib/types/index.d.ts +0 -15
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/index.js +0 -3
- package/lib/types/index.js.map +0 -1
- package/lib/types/modes.d.ts.map +0 -1
- package/lib/types/modes.js +0 -2
- package/lib/types/modes.js.map +0 -1
- package/lib/types.d.ts +0 -61
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -2
- package/lib/types.js.map +0 -1
- package/lib/use-webpack-resolver.d.ts +0 -9
- package/lib/use-webpack-resolver.d.ts.map +0 -1
- package/lib/use-webpack-resolver.js +0 -41
- package/lib/use-webpack-resolver.js.map +0 -1
- package/lib/visitor/index.d.ts +0 -136
- package/lib/visitor/index.d.ts.map +0 -1
- package/lib/visitor/index.js +0 -135
- package/lib/visitor/index.js.map +0 -1
- package/lib/visitor/less-visitor.d.ts +0 -7
- package/lib/visitor/less-visitor.d.ts.map +0 -1
- package/lib/visitor/less-visitor.js.map +0 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# Why Were These Unused Functions Created? - LLM Analysis
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Based on the EXTEND_AUDIT.md (dated 2024-12-19) and code analysis, these unused functions appear to be the result of an **incomplete refactoring attempt** where an LLM tried to extract and consolidate logic but never fully integrated the new functions.
|
|
5
|
+
|
|
6
|
+
## Pattern: Incomplete Refactoring
|
|
7
|
+
|
|
8
|
+
The unused functions fall into two categories:
|
|
9
|
+
1. **Extraction attempts** - Functions created to consolidate scattered logic, but the original inline code was never replaced
|
|
10
|
+
2. **Defensive programming** - Functions created "just in case" for error handling scenarios that never materialized
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. `handleCompoundFullExtend` - Extraction Attempt
|
|
15
|
+
|
|
16
|
+
### Why It Was Created
|
|
17
|
+
Looking at the EXTEND_AUDIT.md and code comments, this function was created to:
|
|
18
|
+
- **Consolidate compound selector handling in full mode**
|
|
19
|
+
- Handle the special case of compound selectors containing `:is()` pseudo-selectors
|
|
20
|
+
- Process all matching components (including `:is()` matches) in a single loop
|
|
21
|
+
- Provide a cleaner separation of concerns
|
|
22
|
+
|
|
23
|
+
### The Problem
|
|
24
|
+
The comment at line 1376 says: *"handleCompoundFullExtend is only for special cases like extending within :is() pseudo-selectors"*
|
|
25
|
+
|
|
26
|
+
But the actual logic for compound selectors in full mode is **already handled inline** in `extendSelector` at lines 1160-1203. The function was created but **never called** - the inline implementation was kept instead.
|
|
27
|
+
|
|
28
|
+
### LLM Reasoning Pattern
|
|
29
|
+
An LLM likely:
|
|
30
|
+
1. Saw the complex inline logic for compound selectors in full mode
|
|
31
|
+
2. Thought "this should be extracted into a function for clarity"
|
|
32
|
+
3. Created `handleCompoundFullExtend` with the extracted logic
|
|
33
|
+
4. **Forgot to actually call it** or decided the inline version was better
|
|
34
|
+
5. Left both versions in the code
|
|
35
|
+
|
|
36
|
+
This is a classic "extract function but forget to use it" pattern.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 2. `createValidatedIsWrapper` - Defensive Programming / Alternative Approach
|
|
41
|
+
|
|
42
|
+
### Why It Was Created
|
|
43
|
+
From EXTEND_AUDIT.md line 38-53:
|
|
44
|
+
- Created as a **fallback mechanism** for validation errors
|
|
45
|
+
- Returns fallback selector instead of throwing
|
|
46
|
+
- Has context-aware validation
|
|
47
|
+
|
|
48
|
+
### The Problem
|
|
49
|
+
The codebase **always throws errors** on validation failures (using `createValidatedIsWrapperWithErrors`). The fallback behavior was never needed or used.
|
|
50
|
+
|
|
51
|
+
### LLM Reasoning Pattern
|
|
52
|
+
An LLM likely:
|
|
53
|
+
1. Thought "what if validation fails? Should we have a fallback?"
|
|
54
|
+
2. Created the fallback version "just in case"
|
|
55
|
+
3. But the actual code always uses the throwing version
|
|
56
|
+
4. The fallback version was never integrated
|
|
57
|
+
|
|
58
|
+
This is **defensive programming gone wrong** - creating functionality "just in case" that never gets used.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 3. `createValidatedCompoundSelector` - Same Pattern
|
|
63
|
+
|
|
64
|
+
### Why It Was Created
|
|
65
|
+
Same as `createValidatedIsWrapper`:
|
|
66
|
+
- Fallback mechanism for compound selector validation
|
|
67
|
+
- Returns fallback instead of throwing
|
|
68
|
+
|
|
69
|
+
### The Problem
|
|
70
|
+
Only `createValidatedCompoundSelectorWithErrors` (which throws) is used. The fallback version was never needed.
|
|
71
|
+
|
|
72
|
+
### LLM Reasoning Pattern
|
|
73
|
+
Same defensive programming pattern - created as an alternative approach that was never adopted.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 4. `isValidCompoundSelector` - Legacy / Duplicate Implementation
|
|
78
|
+
|
|
79
|
+
### Why It Was Created
|
|
80
|
+
This function appears to be a **simpler, older version** of `validateCompoundSelector`:
|
|
81
|
+
- Returns boolean instead of detailed error information
|
|
82
|
+
- Simpler implementation (just counts elements/IDs)
|
|
83
|
+
- Recursive for nested compounds
|
|
84
|
+
|
|
85
|
+
### The Problem
|
|
86
|
+
`validateCompoundSelector` (lines 2022-2069) has its own complete implementation that:
|
|
87
|
+
- Returns detailed error information
|
|
88
|
+
- Has better error messages
|
|
89
|
+
- Is actually used throughout the codebase
|
|
90
|
+
|
|
91
|
+
`isValidCompoundSelector` was likely the **original implementation** that was replaced by `validateCompoundSelector`, but never removed.
|
|
92
|
+
|
|
93
|
+
### LLM Reasoning Pattern
|
|
94
|
+
An LLM likely:
|
|
95
|
+
1. Started with `isValidCompoundSelector` (simple boolean check)
|
|
96
|
+
2. Realized it needed more detailed error information
|
|
97
|
+
3. Created `validateCompoundSelector` with better error reporting
|
|
98
|
+
4. **Forgot to remove the old version**
|
|
99
|
+
|
|
100
|
+
This is a **refactoring artifact** - old code left behind after improvement.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 5. `getIsSelectorArg` - Utility Function for Unused Code
|
|
105
|
+
|
|
106
|
+
### Why It Was Created
|
|
107
|
+
A simple utility to extract the `:is()` argument from a component:
|
|
108
|
+
- Checks if component is `:is()` pseudo-selector
|
|
109
|
+
- Returns the SelectorList argument if valid
|
|
110
|
+
- Clean, reusable utility
|
|
111
|
+
|
|
112
|
+
### The Problem
|
|
113
|
+
Only used by `handleCompoundFullExtend`, which itself is unused. The utility is fine, but it's **orphaned** because its only consumer was never integrated.
|
|
114
|
+
|
|
115
|
+
### LLM Reasoning Pattern
|
|
116
|
+
Created as a helper for `handleCompoundFullExtend`. When `handleCompoundFullExtend` wasn't integrated, this utility became orphaned.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 6. `extendWithinIsArg` - Thin Wrapper for Unused Code
|
|
121
|
+
|
|
122
|
+
### Why It Was Created
|
|
123
|
+
A thin wrapper around `extendSelector` for extending within `:is()` arguments:
|
|
124
|
+
- Sets specific flags (`partial: false`, `skipAmpersandCheck: true`, `hasMoreAfterIs`)
|
|
125
|
+
- Provides a clean API for this specific use case
|
|
126
|
+
|
|
127
|
+
### The Problem
|
|
128
|
+
Only used by `handleCompoundFullExtend`, which is unused. The wrapper is fine, but **orphaned** like `getIsSelectorArg`.
|
|
129
|
+
|
|
130
|
+
### LLM Reasoning Pattern
|
|
131
|
+
Created as a convenience wrapper for `handleCompoundFullExtend`. When that function wasn't integrated, this became orphaned.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Root Cause Analysis
|
|
136
|
+
|
|
137
|
+
### Why LLMs Create Unused Functions
|
|
138
|
+
|
|
139
|
+
1. **Incomplete Refactoring**
|
|
140
|
+
- Extract logic into a function
|
|
141
|
+
- Forget to replace the original code with a call to the new function
|
|
142
|
+
- Both versions remain in the codebase
|
|
143
|
+
|
|
144
|
+
2. **Defensive Programming**
|
|
145
|
+
- Create alternative implementations "just in case"
|
|
146
|
+
- Never actually use them because the primary approach works fine
|
|
147
|
+
- Leave them in "for future use" that never comes
|
|
148
|
+
|
|
149
|
+
3. **Refactoring Artifacts**
|
|
150
|
+
- Create improved version of a function
|
|
151
|
+
- Forget to remove the old version
|
|
152
|
+
- Both remain in codebase
|
|
153
|
+
|
|
154
|
+
4. **Orphaned Dependencies**
|
|
155
|
+
- Create helper functions for a main function
|
|
156
|
+
- Main function never gets integrated
|
|
157
|
+
- Helpers become orphaned
|
|
158
|
+
|
|
159
|
+
### Common LLM Patterns
|
|
160
|
+
|
|
161
|
+
1. **"Extract but don't integrate"** - Creates cleaner functions but doesn't replace inline code
|
|
162
|
+
2. **"Create alternatives"** - Makes multiple versions (with/without errors, with/without fallbacks)
|
|
163
|
+
3. **"Forget to clean up"** - Leaves old versions when creating new ones
|
|
164
|
+
4. **"Build infrastructure"** - Creates utilities for functions that never get used
|
|
165
|
+
|
|
166
|
+
### Why This Happens
|
|
167
|
+
|
|
168
|
+
LLMs often:
|
|
169
|
+
- Focus on **creating** code more than **integrating** it
|
|
170
|
+
- Create multiple approaches and forget to choose one
|
|
171
|
+
- Don't trace through the full call graph to verify integration
|
|
172
|
+
- Leave "just in case" code that seems useful but never gets used
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Lessons Learned
|
|
177
|
+
|
|
178
|
+
1. **Always trace the call graph** - Verify functions are actually called
|
|
179
|
+
2. **Remove old versions** - When creating improved versions, remove the old ones
|
|
180
|
+
3. **Choose one approach** - Don't create multiple alternatives without choosing
|
|
181
|
+
4. **Complete refactorings** - If extracting logic, actually replace the original
|
|
182
|
+
5. **Avoid "just in case" code** - Only create what's actually needed
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Summary
|
|
187
|
+
|
|
188
|
+
These unused functions represent **incomplete refactoring attempts** where:
|
|
189
|
+
- Logic was extracted but never integrated (`handleCompoundFullExtend`)
|
|
190
|
+
- Alternative approaches were created but never adopted (`createValidatedIsWrapper`, `createValidatedCompoundSelector`)
|
|
191
|
+
- Old versions were left behind when new ones were created (`isValidCompoundSelector`)
|
|
192
|
+
- Helper functions were orphaned when their consumers weren't integrated (`getIsSelectorArg`, `extendWithinIsArg`)
|
|
193
|
+
|
|
194
|
+
### Evidence from EXTEND_AUDIT.md (2024-12-19)
|
|
195
|
+
|
|
196
|
+
The audit document shows a similar pattern with `handleFullExtend`:
|
|
197
|
+
- **Was marked as UNUSED** in the audit
|
|
198
|
+
- **Was recommended to be INTEGRATED** (line 209: "SHOULD BE INTEGRATED")
|
|
199
|
+
- **Actually WAS integrated** - it's now called at line 1054 in `extendSelector`
|
|
200
|
+
|
|
201
|
+
This shows the pattern: an LLM created `handleFullExtend`, it was identified as unused, then **later integrated**. But `handleCompoundFullExtend` followed the same pattern and **never got integrated**.
|
|
202
|
+
|
|
203
|
+
### The Pattern
|
|
204
|
+
|
|
205
|
+
1. **First attempt**: Create `handleFullExtend` - initially unused, later integrated ✅
|
|
206
|
+
2. **Second attempt**: Create `handleCompoundFullExtend` - created but never integrated ❌
|
|
207
|
+
3. **Result**: One function integrated, one left behind
|
|
208
|
+
|
|
209
|
+
This suggests **multiple refactoring sessions** where:
|
|
210
|
+
- Some functions got integrated (`handleFullExtend`)
|
|
211
|
+
- Others were created but forgotten (`handleCompoundFullExtend`)
|
|
212
|
+
- The integration was incomplete
|
|
213
|
+
|
|
214
|
+
### Why This Happens to LLMs
|
|
215
|
+
|
|
216
|
+
1. **Session boundaries** - Different refactoring sessions, incomplete integration
|
|
217
|
+
2. **Scope creep** - Start extracting one function, create others, forget to finish
|
|
218
|
+
3. **Copy-paste patterns** - See `handleFullExtend` works, create `handleCompoundFullExtend` similarly, but forget to call it
|
|
219
|
+
4. **Incomplete testing** - Create functions, test passes (because old code still works), forget to integrate
|
|
220
|
+
|
|
221
|
+
The pattern suggests an LLM was trying to improve code organization but didn't complete the refactoring by:
|
|
222
|
+
1. Actually calling the new functions
|
|
223
|
+
2. Removing the old implementations
|
|
224
|
+
3. Cleaning up orphaned dependencies
|
|
225
|
+
4. Following through on all extraction attempts, not just some
|
|
226
|
+
|
|
227
|
+
This is a common issue when refactoring - it's easy to create new code, harder to fully integrate it and remove the old. The fact that `handleFullExtend` WAS integrated shows the intent was there, but the follow-through was incomplete.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Node Copy Reduction Plan
|
|
2
|
+
|
|
3
|
+
The canonical dev-facing docs for this plan now live under root `docs/`.
|
|
4
|
+
|
|
5
|
+
Read these instead:
|
|
6
|
+
|
|
7
|
+
- `docs/future/node-copy-reduction/README.md`
|
|
8
|
+
- `docs/future/node-copy-reduction/migration.md`
|
|
9
|
+
- `docs/future/node-copy-reduction/subsystems.md`
|
|
10
|
+
|
|
11
|
+
This package-local file is left only as a pointer because the work applies across
|
|
12
|
+
the eval/runtime architecture, not just `packages/core/src/tree/util`.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Extend test index (core)
|
|
2
|
+
|
|
3
|
+
This doc exists to make **extend-related tests** easy to find (especially for LLM-assisted debugging).
|
|
4
|
+
|
|
5
|
+
**Before changing extend logic:** See `../EXTEND_RULES.md` for the single set of rules and the header comments in `../extend.ts` for implementation context. Keep operational “what to run / where to look” guidance in Cursor-native files (e.g. `.cursor/rules/subtrees/core__extend.mdc`).
|
|
6
|
+
|
|
7
|
+
Historical deep-dive audits and refactoring notes were archived/removed from this directory to reduce noise; use git history if you need them.
|
|
8
|
+
|
|
9
|
+
## “Where are the extend tests?”
|
|
10
|
+
|
|
11
|
+
There are two main clusters:
|
|
12
|
+
|
|
13
|
+
### 1) Extend **integration** tests (eval → toString)
|
|
14
|
+
- `src/tree/__tests__/extend-eval-integration.test.ts`
|
|
15
|
+
- High-level behavior checks across eval + serialization.
|
|
16
|
+
- Includes the rule: **Exact extend matches a single OR-branch** (does not require all `:is(...)` branches).
|
|
17
|
+
|
|
18
|
+
### 2) Extend **utility / algorithm** tests
|
|
19
|
+
Located in `src/tree/util/__tests__/`:
|
|
20
|
+
|
|
21
|
+
- `extend-core-unit.test.ts`
|
|
22
|
+
- Main focused unit suite for the rebuilt `tryExtendSelector()` path in `extend-core.ts`.
|
|
23
|
+
- This is the current source of truth for exact vs partial rewriting, ampersand crossing/hoisting, and seam-aware rewrite behavior.
|
|
24
|
+
|
|
25
|
+
- `selector-match-unit.test.ts`
|
|
26
|
+
- Main focused unit suite for `selectorMatch()` in `selector-match-core.ts`.
|
|
27
|
+
- This is the current source of truth for selector comparison/matching semantics, alternates, pseudo boundaries, and ampersand crossing detection.
|
|
28
|
+
|
|
29
|
+
- `extend-comment-handling.test.ts`
|
|
30
|
+
- Legacy-but-still-distinct coverage for comment preservation/duplication behavior.
|
|
31
|
+
|
|
32
|
+
- `extend-ampersand-boundary.test.ts`
|
|
33
|
+
- Legacy boundary-oriented tests that still exercise nested/ruleset-level ampersand behavior.
|
|
34
|
+
|
|
35
|
+
- `process-extends.test.ts`
|
|
36
|
+
- Tests orchestration / application ordering for registered extends.
|
|
37
|
+
|
|
38
|
+
- `extend-pipeline-bench.test.ts`
|
|
39
|
+
- Bench coverage, not a primary behavior suite.
|
|
40
|
+
|
|
41
|
+
## Extend evaluation / ruleset plumbing (non-util tests)
|
|
42
|
+
|
|
43
|
+
- `src/tree/__tests__/extend-rules.test.ts`
|
|
44
|
+
- Extend behavior inside rulesets; includes chaining-related expectations.
|
|
45
|
+
|
|
46
|
+
- `src/tree/__tests__/extend-roots.test.ts`
|
|
47
|
+
- Extend root registry / hoisting behavior.
|
|
48
|
+
|
|
49
|
+
- `src/tree/__tests__/extend-import-style.test.ts`
|
|
50
|
+
- Extend interaction with import-style logic.
|
|
51
|
+
|
|
52
|
+
## What’s missing / where to add new coverage
|
|
53
|
+
|
|
54
|
+
If you are fixing a fixture like `tests-unit/extend-exact/extend-exact.less`, the most “direct” core place to add a reproduction is:
|
|
55
|
+
|
|
56
|
+
- `src/tree/__tests__/extend-eval-integration.test.ts` (if it’s an eval/print behavior)
|
|
57
|
+
- `src/tree/util/__tests__/selector-match-unit.test.ts` (if it’s primarily a matcher problem)
|
|
58
|
+
- `src/tree/util/__tests__/extend-core-unit.test.ts` (if it’s primarily a rewrite problem)
|
|
59
|
+
- `src/tree/util/__tests__/extend-ampersand-boundary.test.ts` (if it’s specifically about implicit `&` / parent prefix crossings)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# ExtendLocation API Optimization Analysis
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
After migrating from the legacy `matchSelectors` API to the new `findExtendableLocations` API, we have successfully maintained and verified the performance optimizations that were crucial for the extend functionality. The optimization system provides significant performance improvements ranging from **1.3x to 31x speedup** depending on the scenario.
|
|
6
|
+
|
|
7
|
+
## Benchmark Test Suite
|
|
8
|
+
|
|
9
|
+
The comprehensive benchmark test suite in `selector-benchmark.test.ts` validates all optimization layers:
|
|
10
|
+
|
|
11
|
+
## Optimization Layers Analysis
|
|
12
|
+
|
|
13
|
+
### OPTIMIZATION 1: Exact Match Cache
|
|
14
|
+
- **Performance**: 1.3x speedup for exact matches
|
|
15
|
+
- **Purpose**: Cache identical selector matches to avoid redundant computation
|
|
16
|
+
- **Impact**: Moderate improvement for exact matches, most beneficial for repeated operations
|
|
17
|
+
|
|
18
|
+
### OPTIMIZATION 2 & 3: KeySet Fast Rejection
|
|
19
|
+
- **Performance**: 9.3x to 14.6x speedup for disjoint/non-subset selectors
|
|
20
|
+
- **Purpose**: Early bailout for impossible matches using set theory
|
|
21
|
+
- **Impact**: **Highest impact optimization** - eliminates expensive tree traversal for most non-matching cases
|
|
22
|
+
|
|
23
|
+
### OPTIMIZATION 4: Fast Path Patterns
|
|
24
|
+
- **Performance**: 1.6x to 4.8x speedup for common selector patterns
|
|
25
|
+
- **Purpose**: Optimized algorithms for frequent CSS patterns (simple-to-simple, compound-to-simple, etc.)
|
|
26
|
+
- **Impact**: Good improvement for typical CSS use cases
|
|
27
|
+
|
|
28
|
+
## Real-World Performance Impact
|
|
29
|
+
|
|
30
|
+
### Non-Matching Scenarios (Most Common)
|
|
31
|
+
In real stylesheets, the vast majority of extend operations don't find matches. These scenarios show the most dramatic improvements:
|
|
32
|
+
|
|
33
|
+
- **Simple different classes**: 5.4x speedup
|
|
34
|
+
- **Different IDs**: 5.2x speedup
|
|
35
|
+
- **Disjoint compounds**: 10.6x speedup
|
|
36
|
+
- **Complex different structures**: **31.0x speedup**
|
|
37
|
+
|
|
38
|
+
### Overall Performance
|
|
39
|
+
- **Average speedup across all scenarios**: 4.2x
|
|
40
|
+
- **Best case speedup**: 31x (complex non-matching selectors)
|
|
41
|
+
- **Worst case**: Still maintains correctness with minimal overhead
|
|
42
|
+
|
|
43
|
+
## Why These Optimizations Are Worthwhile
|
|
44
|
+
|
|
45
|
+
### 1. **Volume Characteristics**
|
|
46
|
+
Real CSS stylesheets contain thousands of selectors, and extend operations are tested against most of them. A 10x speedup on operations that happen thousands of times results in massive compilation time savings.
|
|
47
|
+
|
|
48
|
+
### 2. **Non-Match Dominance**
|
|
49
|
+
In typical extend scenarios, 90%+ of selector comparisons result in no match. Our optimizations are specifically designed to fast-reject these cases with minimal computation.
|
|
50
|
+
|
|
51
|
+
### 3. **Complexity Scaling**
|
|
52
|
+
Without optimizations, complex selectors with :is(), nested structures, and long combinator chains become exponentially expensive. The optimizations provide linear or near-constant time rejection for most cases.
|
|
53
|
+
|
|
54
|
+
### 4. **Cache Locality**
|
|
55
|
+
The KeySet optimization works on compact bit-sets rather than full AST traversal, providing better CPU cache performance.
|
|
56
|
+
|
|
57
|
+
## Test Results Summary
|
|
58
|
+
|
|
59
|
+
### KeySet Fast Rejection (Most Important)
|
|
60
|
+
```
|
|
61
|
+
🔥 OPTIMIZATION 2 & 3: KeySet Fast Rejection
|
|
62
|
+
===============================================
|
|
63
|
+
🏁 Disjoint selectors (with KeySet rejection)
|
|
64
|
+
Total: 10.26ms
|
|
65
|
+
Average: 0.0001ms per operation
|
|
66
|
+
Ops/sec: 9,743,937
|
|
67
|
+
🏁 Disjoint selectors (no KeySet rejection)
|
|
68
|
+
Total: 148.25ms
|
|
69
|
+
Average: 0.0015ms per operation
|
|
70
|
+
Ops/sec: 674,555
|
|
71
|
+
🚀 KeySet rejection speedup: 14.4x
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Fast Path Patterns
|
|
75
|
+
```
|
|
76
|
+
🔥 OPTIMIZATION 4: Fast Path Patterns
|
|
77
|
+
======================================
|
|
78
|
+
🏁 Simple to Simple (with fast path)
|
|
79
|
+
Ops/sec: 8,629,182
|
|
80
|
+
🏁 Simple to Simple (no fast path)
|
|
81
|
+
Ops/sec: 2,039,328
|
|
82
|
+
🚀 Simple to Simple speedup: 4.2x
|
|
83
|
+
|
|
84
|
+
🏁 Complex Selector (short) (with fast path)
|
|
85
|
+
Ops/sec: 11,296,670
|
|
86
|
+
🏁 Complex Selector (short) (no fast path)
|
|
87
|
+
Ops/sec: 2,345,454
|
|
88
|
+
🚀 Complex Selector speedup: 4.8x
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Non-Matching Scenarios (Real-World Critical)
|
|
92
|
+
```
|
|
93
|
+
🔥 NON-MATCHING SCENARIOS (Most Common)
|
|
94
|
+
========================================
|
|
95
|
+
🏁 Complex with different structure (optimized)
|
|
96
|
+
Ops/sec: 5,954,951
|
|
97
|
+
🏁 Complex with different structure (unoptimized)
|
|
98
|
+
Ops/sec: 192,076
|
|
99
|
+
🚀 Complex with different structure speedup: 31.0x
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Verification of Correctness
|
|
103
|
+
|
|
104
|
+
All optimizations maintain semantic correctness:
|
|
105
|
+
- ✅ Same `hasMatches` results between optimized and unoptimized paths
|
|
106
|
+
- ✅ All existing extend algorithm tests pass (10/10)
|
|
107
|
+
- ✅ Optimizations only affect performance, not behavior
|
|
108
|
+
|
|
109
|
+
## Individual Optimization Testing
|
|
110
|
+
|
|
111
|
+
The benchmark suite can disable each optimization individually:
|
|
112
|
+
|
|
113
|
+
1. **`findExtendableLocationsNoExactCache`** - Bypasses exact match caching
|
|
114
|
+
2. **`findExtendableLocationsNoKeySetRejection`** - Bypasses KeySet fast rejection
|
|
115
|
+
3. **`findExtendableLocationsNoFastPath`** - Bypasses fast path patterns
|
|
116
|
+
4. **`findExtendableLocationsNoOptimizations`** - Bypasses all optimizations
|
|
117
|
+
|
|
118
|
+
This allows us to measure the individual contribution of each optimization layer and verify that they work correctly in isolation.
|
|
119
|
+
|
|
120
|
+
## Conclusion
|
|
121
|
+
|
|
122
|
+
The optimization system migrated to the new ExtendLocation API is **highly effective** and **well-justified**:
|
|
123
|
+
|
|
124
|
+
1. **Provides 4.2x average speedup** across diverse scenarios
|
|
125
|
+
2. **Up to 31x speedup** for the most common case (non-matching complex selectors)
|
|
126
|
+
3. **Maintains perfect correctness** - all functionality tests pass
|
|
127
|
+
4. **Scales well** - performance improves dramatically as selector complexity increases
|
|
128
|
+
5. **Real-world impact** - optimizes the 90%+ case of non-matching selectors that dominate extend operations
|
|
129
|
+
|
|
130
|
+
The optimizations are essential for making the extend functionality performant in real-world CSS codebases with thousands of selectors.
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Walk-and-Consume Algorithm Design
|
|
2
|
+
|
|
3
|
+
## Current Architecture (3-Phase Pipeline)
|
|
4
|
+
|
|
5
|
+
The current extend pipeline has three separate traversal phases:
|
|
6
|
+
|
|
7
|
+
1. **Search**: `findExtendableLocations(target, find)` → walks the AST, collects `ExtendLocation[]`
|
|
8
|
+
2. **Classify**: `selectorCompare(target, find)` → another traversal to determine match type
|
|
9
|
+
3. **Apply**: `extendSelector(target, find, extendWith, partial)` → uses locations to decide
|
|
10
|
+
what transformation to apply, then constructs new AST nodes
|
|
11
|
+
|
|
12
|
+
### Where the Time Goes
|
|
13
|
+
|
|
14
|
+
| Hotspot | Cause | Status |
|
|
15
|
+
|---------|-------|--------|
|
|
16
|
+
| `applyExtendsToSelector` growing list | O(N²) for N same-target instructions | **Fixed** (batched) |
|
|
17
|
+
| `selectorCompare` SelectorList sort | O(N log N) per comparison | **Fixed** (Set-based) |
|
|
18
|
+
| `areCompoundSelectorsEquivalent` expansion | (N+1)^K combinatorial explosion | **Fixed** (pointer walk) |
|
|
19
|
+
| `processExtends` per-instruction diagnostics | O(I) × cost_per_extend per ruleset | **Not fixed** |
|
|
20
|
+
| Triple traversal per extend call | search + classify + apply | **Not fixed** |
|
|
21
|
+
|
|
22
|
+
## Walk-and-Consume Design
|
|
23
|
+
|
|
24
|
+
### Core Idea
|
|
25
|
+
|
|
26
|
+
Replace the 3-phase pipeline with a single recursive descent that:
|
|
27
|
+
1. Walks the target selector tree (depth-first)
|
|
28
|
+
2. At each node, checks if it matches `find`
|
|
29
|
+
3. If it matches, **immediately transforms** it (wrap in `:is()`, add to list, etc.)
|
|
30
|
+
4. Returns the transformed (or original) node
|
|
31
|
+
|
|
32
|
+
### Context Threading
|
|
33
|
+
|
|
34
|
+
The transformation depends on context. The walker carries a `WalkContext`:
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
interface WalkContext {
|
|
38
|
+
/** Are we at the top-level selector (not inside a compound/complex/pseudo)? */
|
|
39
|
+
isRoot: boolean;
|
|
40
|
+
/** Parent node type */
|
|
41
|
+
parentType: 'SelectorList' | 'ComplexSelector' | 'CompoundSelector' | 'PseudoSelector' | null;
|
|
42
|
+
/** Is there content before this node in the parent container? */
|
|
43
|
+
hasContentBefore: boolean;
|
|
44
|
+
/** Is there content after this node in the parent container? */
|
|
45
|
+
hasContentAfter: boolean;
|
|
46
|
+
/** Index within parent container */
|
|
47
|
+
indexInParent: number;
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Transformation Rules (Context → Action)
|
|
52
|
+
|
|
53
|
+
| Context | Partial Mode | Full Mode |
|
|
54
|
+
|---------|-------------|-----------|
|
|
55
|
+
| Root, whole match | SelectorList(target, extendWith) | SelectorList(target, extendWith) |
|
|
56
|
+
| Inside CompoundSelector | `:is(matched, extendWith)` + rest | reject (return unchanged) |
|
|
57
|
+
| Inside ComplexSelector | `:is(matched, extendWith)` + rest | `:is(matched, extendWith)` + rest |
|
|
58
|
+
| Inside PseudoSelector arg | recurse into arg | recurse into arg (with boundary check) |
|
|
59
|
+
| Inside SelectorList | extend each matching item | extend each matching item |
|
|
60
|
+
|
|
61
|
+
### Implementation Strategy
|
|
62
|
+
|
|
63
|
+
Rather than rewriting the entire 3600-line file at once, we implement incrementally:
|
|
64
|
+
|
|
65
|
+
#### Phase 1: Unified `walkAndExtend` for Simple Cases
|
|
66
|
+
- SimpleSelector target + SimpleSelector find (most common case)
|
|
67
|
+
- Handles: root match, inside SelectorList, inside CompoundSelector, inside ComplexSelector
|
|
68
|
+
- Bypasses: ampersand crossing, boundary crossing, `:is()` normalization
|
|
69
|
+
- **Test**: run all 941 tests, fall back to old path for complex cases
|
|
70
|
+
|
|
71
|
+
#### Phase 2: Compound and Complex find selectors
|
|
72
|
+
- CompoundSelector find (e.g., `.a.b:extend(.a.b)`)
|
|
73
|
+
- ComplexSelector find (e.g., `.a .b:extend(.a .b)`)
|
|
74
|
+
|
|
75
|
+
#### Phase 3: Batch multi-instruction walk
|
|
76
|
+
- Walk once, apply ALL matching instructions simultaneously
|
|
77
|
+
- Eliminates the per-instruction diagnostic loop in `processExtends`
|
|
78
|
+
- Key for Bootstrap performance
|
|
79
|
+
|
|
80
|
+
#### Phase 4: Remove old code paths
|
|
81
|
+
- Once all cases are covered and tests pass, remove the 3-phase pipeline
|
|
82
|
+
|
|
83
|
+
### Phase 1 Implementation Detail
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
function walkAndExtend(
|
|
87
|
+
target: Selector,
|
|
88
|
+
find: Selector,
|
|
89
|
+
extendWith: Selector,
|
|
90
|
+
partial: boolean,
|
|
91
|
+
ctx: WalkContext
|
|
92
|
+
): Selector {
|
|
93
|
+
// 1. Check for exact match at this node
|
|
94
|
+
if (componentsMatch(target, find)) {
|
|
95
|
+
return applyTransformation(target, find, extendWith, partial, ctx);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// 2. Recurse into container nodes
|
|
99
|
+
if (isNode(target, 'SelectorList')) {
|
|
100
|
+
return walkSelectorList(target, find, extendWith, partial, ctx);
|
|
101
|
+
}
|
|
102
|
+
if (isNode(target, 'ComplexSelector')) {
|
|
103
|
+
return walkComplexSelector(target, find, extendWith, partial, ctx);
|
|
104
|
+
}
|
|
105
|
+
if (isNode(target, 'CompoundSelector')) {
|
|
106
|
+
return walkCompoundSelector(target, find, extendWith, partial, ctx);
|
|
107
|
+
}
|
|
108
|
+
if (isNode(target, 'PseudoSelector') && target.value.arg) {
|
|
109
|
+
return walkPseudoSelector(target, find, extendWith, partial, ctx);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// 3. No match, return unchanged
|
|
113
|
+
return target;
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Key Invariant
|
|
118
|
+
|
|
119
|
+
The walk-and-consume MUST produce identical output to the current pipeline for all
|
|
120
|
+
existing test cases. Unit tests serve as the guardrail — any behavioral difference
|
|
121
|
+
is a bug in the new implementation.
|
|
122
|
+
|
|
123
|
+
### Boundary Between Old and New
|
|
124
|
+
|
|
125
|
+
During incremental rollout, `extendSelector` becomes a dispatcher:
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
function extendSelector(target, find, extendWith, partial, ...): Selector {
|
|
129
|
+
// Try walk-and-consume for supported cases
|
|
130
|
+
if (canUseWalkAndConsume(target, find)) {
|
|
131
|
+
return walkAndExtend(target, find, extendWith, partial, ROOT_CTX);
|
|
132
|
+
}
|
|
133
|
+
// Fall back to existing 3-phase pipeline
|
|
134
|
+
return extendSelectorLegacy(target, find, extendWith, partial, ...);
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
This lets us expand coverage gradually while maintaining correctness.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# ExtendLocation API Optimization Analysis (archived)
|
|
2
|
+
|
|
3
|
+
This file used to exist in `__tests__/` as a long-form analysis.
|
|
4
|
+
|
|
5
|
+
It duplicated the package-root analysis, so it was archived once at:
|
|
6
|
+
|
|
7
|
+
- `packages/core/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md`
|
|
8
|
+
|
|
9
|
+
|