@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,215 @@
|
|
|
1
|
+
# Extend Architecture Analysis - Self-Referencing and Responsibility Boundaries
|
|
2
|
+
|
|
3
|
+
## Current Architecture
|
|
4
|
+
|
|
5
|
+
### Responsibility Layers
|
|
6
|
+
|
|
7
|
+
1. **`extend-roots.ts`** - High-level orchestration
|
|
8
|
+
- Manages extend root relationships
|
|
9
|
+
- Processes extends recursively
|
|
10
|
+
- **Responsible for**: Detecting and filtering self-referencing extends
|
|
11
|
+
- **Responsible for**: Preventing circular references
|
|
12
|
+
- **Responsible for**: Deciding which extends should be processed
|
|
13
|
+
|
|
14
|
+
2. **`extend.ts`** - Core extend logic
|
|
15
|
+
- `extendSelector()` - Performs the actual extension
|
|
16
|
+
- `tryExtendSelector()` - Wrapper with error handling
|
|
17
|
+
- **Responsible for**: Given valid inputs, perform the extension
|
|
18
|
+
- **Should NOT be responsible for**: Deciding whether to extend
|
|
19
|
+
|
|
20
|
+
3. **`extend-helpers.ts`** - Utility functions
|
|
21
|
+
- Selector matching, component comparison, path building
|
|
22
|
+
- **Responsible for**: Pure utility functions
|
|
23
|
+
|
|
24
|
+
## Current Self-Referencing Detection
|
|
25
|
+
|
|
26
|
+
### In `extend-roots.ts` (lines 450-453, 472-475)
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// Skip self-referencing extends
|
|
30
|
+
if (target.valueOf() === selectorWithExtend.valueOf()) {
|
|
31
|
+
return; // Early return - extend is skipped
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Later, for individual selectors:
|
|
35
|
+
if (singleTarget.valueOf() === selectorWithExtend.valueOf()) {
|
|
36
|
+
continue; // Skip this selector
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Analysis
|
|
41
|
+
|
|
42
|
+
**✅ GOOD:**
|
|
43
|
+
- Detection happens in `extend-roots.ts` where it belongs
|
|
44
|
+
- Uses `valueOf()` for comparison (handles different object instances)
|
|
45
|
+
- Early return prevents processing
|
|
46
|
+
|
|
47
|
+
**❌ ISSUES:**
|
|
48
|
+
|
|
49
|
+
1. **Incomplete Detection**: The check only compares `target` vs `selectorWithExtend`, but doesn't handle:
|
|
50
|
+
- Chained self-references: `.a:extend(.b)` where `.b:extend(.a)` exists
|
|
51
|
+
- Partial self-references: `.a.b:extend(.a)` (should this be skipped?)
|
|
52
|
+
- SelectorList self-references: `.a, .b:extend(.a, .b)`
|
|
53
|
+
|
|
54
|
+
2. **Test Failure Analysis**: The test `should ignore self-referencing extends: .w:extend(.w)` is failing with:
|
|
55
|
+
- Error: `Cannot read properties of undefined (reading 'clone')` at `extendSelectorList` line 973
|
|
56
|
+
- Expected: `.w, .v.w.v { color: black; }`
|
|
57
|
+
- Received: `.w { color: black; }`
|
|
58
|
+
|
|
59
|
+
This suggests:
|
|
60
|
+
- The self-reference check IS working (`.w:extend(.w)` is skipped)
|
|
61
|
+
- But something else is wrong - maybe `.v.w.v:extend(.w)` is also being skipped incorrectly?
|
|
62
|
+
- Or `extendSelectorList` is being called with an undefined result
|
|
63
|
+
|
|
64
|
+
3. **Missing Logic**: The check at line 451 compares `target` (the selector being extended) with `selectorWithExtend` (the selector that has the `:extend()`). But:
|
|
65
|
+
- `target` is the selector in the `:extend(.target)`
|
|
66
|
+
- `selectorWithExtend` is the selector that contains the `:extend()`
|
|
67
|
+
- For `.w:extend(.w)`, `target = .w` and `selectorWithExtend = .w`, so they match ✅
|
|
68
|
+
- But what about `.a.b:extend(.a)`? Should this be considered self-referencing?
|
|
69
|
+
|
|
70
|
+
## Recommendations
|
|
71
|
+
|
|
72
|
+
### 1. Keep Self-Referencing Detection in `extend-roots.ts`
|
|
73
|
+
|
|
74
|
+
**✅ CORRECT APPROACH**: The user is right - `extendSelector` should NOT have self-referencing checks. It should be a pure function that:
|
|
75
|
+
- Takes a target, find, and extendWith
|
|
76
|
+
- Performs the extension
|
|
77
|
+
- Returns the result
|
|
78
|
+
|
|
79
|
+
**Decision logic** (should I extend?) belongs in `extend-roots.ts`.
|
|
80
|
+
|
|
81
|
+
### 2. Enhance Self-Referencing Detection
|
|
82
|
+
|
|
83
|
+
The current check is too simple. We should:
|
|
84
|
+
|
|
85
|
+
**Option A: Keep Simple (Current)**
|
|
86
|
+
- Only skip when `target === selectorWithExtend` (exact match)
|
|
87
|
+
- This handles `.w:extend(.w)` but not `.a.b:extend(.a)`
|
|
88
|
+
|
|
89
|
+
**Option B: Enhanced Detection**
|
|
90
|
+
- Check if `target` is a component of `selectorWithExtend`
|
|
91
|
+
- Check for circular chains using the `processedExtends` set
|
|
92
|
+
- More sophisticated but might be overkill
|
|
93
|
+
|
|
94
|
+
**Recommendation**: Start with Option A, but make the check more robust:
|
|
95
|
+
- Handle SelectorList cases properly
|
|
96
|
+
- Ensure the check happens before calling `extendSelector`
|
|
97
|
+
- Add better error handling if `extendSelector` is called incorrectly
|
|
98
|
+
|
|
99
|
+
### 3. Fix the Test Failure
|
|
100
|
+
|
|
101
|
+
The error `Cannot read properties of undefined (reading 'clone')` at line 973 suggests:
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
originalSelectors.push(extended.value[0]!.clone(true));
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
This means `extended.value[0]` is `undefined`. This could happen if:
|
|
108
|
+
- `extendSelector` returns a SelectorList with an empty `value` array
|
|
109
|
+
- `extendSelector` returns something unexpected
|
|
110
|
+
- The self-reference check is working, but the result handling is wrong
|
|
111
|
+
|
|
112
|
+
**Investigation needed:**
|
|
113
|
+
1. Check what `extendSelector` returns when called with self-referencing (it shouldn't be called, but if it is...)
|
|
114
|
+
2. Check if `extendSelectorList` handles empty results correctly
|
|
115
|
+
3. Verify the flow when self-referencing is detected
|
|
116
|
+
|
|
117
|
+
### 4. Architecture Improvements
|
|
118
|
+
|
|
119
|
+
**Current Flow:**
|
|
120
|
+
```
|
|
121
|
+
extend-roots.ts:processExtend()
|
|
122
|
+
→ Check self-reference (line 451)
|
|
123
|
+
→ If not self-reference, call extendSelector()
|
|
124
|
+
→ Handle result
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Problem**: If self-reference check fails or is bypassed, `extendSelector` gets called with invalid inputs.
|
|
128
|
+
|
|
129
|
+
**Solution**:
|
|
130
|
+
- Make self-reference check more robust
|
|
131
|
+
- Add defensive checks in `extendSelector` if needed (but only for error handling, not logic)
|
|
132
|
+
- Ensure `extendSelectorList` handles edge cases
|
|
133
|
+
|
|
134
|
+
### 5. Test Expectations Review
|
|
135
|
+
|
|
136
|
+
The test expects:
|
|
137
|
+
```css
|
|
138
|
+
.w,
|
|
139
|
+
.v.w.v {
|
|
140
|
+
color: black;
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
This means:
|
|
145
|
+
- `.w:extend(.w)` should be ignored (self-reference) ✅
|
|
146
|
+
- `.v.w.v:extend(.w)` should work (not self-reference) ✅
|
|
147
|
+
- Both rulesets should be combined
|
|
148
|
+
|
|
149
|
+
**Current behavior**: Only `.w` is output, suggesting `.v.w.v:extend(.w)` is also being skipped incorrectly, OR the extend is working but the output is wrong.
|
|
150
|
+
|
|
151
|
+
## Action Items
|
|
152
|
+
|
|
153
|
+
1. **Remove naive self-reference check from `extendSelector`** ✅ (Already done)
|
|
154
|
+
|
|
155
|
+
2. **Investigate test failure**:
|
|
156
|
+
- Why is `extended.value[0]` undefined?
|
|
157
|
+
- Is `.v.w.v:extend(.w)` being processed correctly?
|
|
158
|
+
- Is the self-reference check working for all cases?
|
|
159
|
+
|
|
160
|
+
3. **Enhance self-reference detection in `extend-roots.ts`**:
|
|
161
|
+
- Ensure it handles SelectorList cases
|
|
162
|
+
- Add logging/debugging to verify it's working
|
|
163
|
+
- Consider if partial matches should be considered self-referencing
|
|
164
|
+
|
|
165
|
+
4. **Add defensive checks** (if needed):
|
|
166
|
+
- In `extendSelectorList`, check if `extended.value[0]` exists before cloning
|
|
167
|
+
- But don't add logic checks - only error handling
|
|
168
|
+
|
|
169
|
+
5. **Review test expectations**:
|
|
170
|
+
- Verify the test is correct
|
|
171
|
+
- Ensure it's testing the right behavior
|
|
172
|
+
- Check if test setup is correct
|
|
173
|
+
|
|
174
|
+
## Conclusion
|
|
175
|
+
|
|
176
|
+
The user is correct: `extendSelector` should remain a pure function that performs extensions when called. The responsibility for detecting and filtering self-referencing extends belongs in `extend-roots.ts`.
|
|
177
|
+
|
|
178
|
+
The current implementation has the right architecture, but:
|
|
179
|
+
- The self-reference detection might need enhancement
|
|
180
|
+
- There's a bug causing the test failure that needs investigation
|
|
181
|
+
- The error handling in `extendSelectorList` might need improvement
|
|
182
|
+
|
|
183
|
+
## Immediate Fixes
|
|
184
|
+
|
|
185
|
+
### 1. Add Defensive Check in `extendSelectorList`
|
|
186
|
+
|
|
187
|
+
The error `Cannot read properties of undefined (reading 'clone')` at line 977 suggests `extended.value[0]` is undefined. This is a defensive programming issue, not a logic issue.
|
|
188
|
+
|
|
189
|
+
**Fix**: Add a check to ensure `extended.value.length > 0` before accessing `extended.value[0]`.
|
|
190
|
+
|
|
191
|
+
This is acceptable because:
|
|
192
|
+
- It's error handling, not business logic
|
|
193
|
+
- It prevents crashes when unexpected inputs occur
|
|
194
|
+
- It doesn't change the behavior of `extendSelector` itself
|
|
195
|
+
|
|
196
|
+
### 2. Investigate Root Cause
|
|
197
|
+
|
|
198
|
+
The empty SelectorList suggests:
|
|
199
|
+
- `createExtendedSelectorList` might be creating empty SelectorLists
|
|
200
|
+
- `extendSelector` might be returning unexpected results in edge cases
|
|
201
|
+
- The self-reference check in `extend-roots.ts` might not be catching all cases
|
|
202
|
+
|
|
203
|
+
**Next Steps**:
|
|
204
|
+
1. Add defensive check (done)
|
|
205
|
+
2. Add logging to understand when empty SelectorLists are created
|
|
206
|
+
3. Verify self-reference detection is working correctly
|
|
207
|
+
4. Check if `createExtendedSelectorList` can return empty arrays
|
|
208
|
+
|
|
209
|
+
### 3. Architecture Validation
|
|
210
|
+
|
|
211
|
+
**✅ CORRECT**: Self-reference detection in `extend-roots.ts` (lines 450-453, 472-475)
|
|
212
|
+
**✅ CORRECT**: `extendSelector` is a pure function without business logic checks
|
|
213
|
+
**✅ CORRECT**: Defensive error handling in `extendSelectorList` (acceptable)
|
|
214
|
+
|
|
215
|
+
**❓ NEEDS INVESTIGATION**: Why is `extendSelector` returning empty SelectorLists?
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Extend Utilities Architectural Audit
|
|
2
|
+
|
|
3
|
+
## Analysis Date
|
|
4
|
+
2024-12-19
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
Deep analysis of unused functions in `extend.ts` to determine:
|
|
8
|
+
1. Why they exist
|
|
9
|
+
2. Whether they solve problems that should be solved
|
|
10
|
+
3. Whether they're better approaches than current code
|
|
11
|
+
4. Whether they should be integrated or removed
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Unused Functions Analysis
|
|
16
|
+
|
|
17
|
+
### 1. `handleFullExtend` (lines 910-977)
|
|
18
|
+
**Status:** UNUSED - Logic is duplicated inline in `extendSelector`
|
|
19
|
+
|
|
20
|
+
**Purpose:**
|
|
21
|
+
- Consolidates full extend logic (when `partial: false`)
|
|
22
|
+
- Handles SelectorList, PseudoSelector, and CompoundSelector cases
|
|
23
|
+
- Has performance optimization for generated selectors (mutates in place)
|
|
24
|
+
|
|
25
|
+
**Current Implementation:**
|
|
26
|
+
- Full extend logic is scattered throughout `extendSelector` (lines 723-830)
|
|
27
|
+
- Handles root-level matches, pseudo-selector matches, compound matches, complex selector matches
|
|
28
|
+
- Does NOT have the performance optimization for generated selectors
|
|
29
|
+
|
|
30
|
+
**Analysis:**
|
|
31
|
+
- ✅ **SHOULD BE INTEGRATED**: The current code duplicates this logic but is less organized
|
|
32
|
+
- ✅ **BETTER APPROACH**: `handleFullExtend` consolidates the logic and has performance optimizations
|
|
33
|
+
- ⚠️ **ISSUE**: Current code handles some cases `handleFullExtend` doesn't (e.g., boundary crossing detection)
|
|
34
|
+
- **Recommendation**: Refactor `extendSelector` to use `handleFullExtend` for full extends, but keep boundary-crossing logic separate
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
### 2. `createValidatedIsWrapper` (lines 1077-1181)
|
|
39
|
+
**Status:** UNUSED - Only `createValidatedIsWrapperWithErrors` is used
|
|
40
|
+
|
|
41
|
+
**Purpose:**
|
|
42
|
+
- Creates `:is()` wrapper with validation that returns fallback on conflicts
|
|
43
|
+
- Has context-aware validation (checks if `:is()` would conflict with compound selector context)
|
|
44
|
+
- Returns fallback selector instead of throwing
|
|
45
|
+
|
|
46
|
+
**Current Implementation:**
|
|
47
|
+
- Uses `createValidatedIsWrapperWithErrors` which throws on conflicts (line 794)
|
|
48
|
+
- No fallback mechanism - always throws
|
|
49
|
+
|
|
50
|
+
**Analysis:**
|
|
51
|
+
- ❓ **UNCLEAR IF NEEDED**: The current approach throws errors, which might be correct
|
|
52
|
+
- ⚠️ **POTENTIAL ISSUE**: If validation fails, we throw - but maybe we should fallback?
|
|
53
|
+
- **Recommendation**: Review if fallback behavior is needed. If not, remove. If yes, integrate.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### 3. `optimizeTopLevelUnnecessaryIsWrapper` (lines 1548-1568)
|
|
58
|
+
**Status:** UNUSED
|
|
59
|
+
|
|
60
|
+
**Purpose:**
|
|
61
|
+
- Optimizes standalone `:is()` pseudo-selectors that were generated
|
|
62
|
+
- Unwraps `:is()` when it's not needed (e.g., `:is(.a)` → `.a`)
|
|
63
|
+
- Only optimizes generated selectors (not user-authored)
|
|
64
|
+
|
|
65
|
+
**Current Implementation:**
|
|
66
|
+
- No optimization of unnecessary `:is()` wrappers
|
|
67
|
+
- Generated `:is()` selectors are kept as-is
|
|
68
|
+
|
|
69
|
+
**Analysis:**
|
|
70
|
+
- ✅ **SHOULD BE INTEGRATED**: This is a valid optimization
|
|
71
|
+
- ✅ **PERFORMANCE BENEFIT**: Reduces unnecessary `:is()` wrappers in output
|
|
72
|
+
- ⚠️ **WHEN TO CALL**: Need to determine where in the pipeline to call this
|
|
73
|
+
- **Recommendation**: Integrate into `flattenGeneratedIs` or call after extend operations
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
### 4. `handlePartialExtendAtRoot` (lines 1573-1584)
|
|
78
|
+
**Status:** UNUSED
|
|
79
|
+
|
|
80
|
+
**Purpose:**
|
|
81
|
+
- Handles partial extends at root level (when `location.path.length === 0`)
|
|
82
|
+
- Creates `:is()` wrapper for compound selectors
|
|
83
|
+
- Falls back to selector list for other cases
|
|
84
|
+
|
|
85
|
+
**Current Implementation:**
|
|
86
|
+
- Root-level partial extends are handled inline (lines 619-688)
|
|
87
|
+
- Uses `createExtendedSelectorList` directly
|
|
88
|
+
- Has special handling for remainders and complex selector partial matches
|
|
89
|
+
|
|
90
|
+
**Analysis:**
|
|
91
|
+
- ⚠️ **PARTIALLY DUPLICATED**: Current code does more (handles remainders, complex selectors)
|
|
92
|
+
- ❓ **SIMPLER APPROACH**: `handlePartialExtendAtRoot` is simpler but less complete
|
|
93
|
+
- **Recommendation**: Current implementation is more complete. Remove `handlePartialExtendAtRoot` unless we want to simplify.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### 5. `needsPartialMatchProcessing` (lines 1589-1592)
|
|
98
|
+
**Status:** UNUSED
|
|
99
|
+
|
|
100
|
+
**Purpose:**
|
|
101
|
+
- Checks if partial match result needs processing
|
|
102
|
+
- Returns true for ComplexSelector or CompoundSelector
|
|
103
|
+
|
|
104
|
+
**Current Implementation:**
|
|
105
|
+
- No such check - processes all results directly
|
|
106
|
+
|
|
107
|
+
**Analysis:**
|
|
108
|
+
- ❓ **MAYBE USEFUL**: Could be used to skip processing for simple selectors
|
|
109
|
+
- ⚠️ **LOW VALUE**: The check is trivial and doesn't add much
|
|
110
|
+
- **Recommendation**: Remove unless we find a performance benefit
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
### 6. `processPartialMatchResult` (lines 1597-1607)
|
|
115
|
+
**Status:** UNUSED - Stub function
|
|
116
|
+
|
|
117
|
+
**Purpose:**
|
|
118
|
+
- Placeholder for processing partial match results
|
|
119
|
+
- Currently just returns result as-is
|
|
120
|
+
- Comment says "This is where we would handle complex partial match scenarios"
|
|
121
|
+
|
|
122
|
+
**Current Implementation:**
|
|
123
|
+
- Partial match processing is done inline in `extendSelector`
|
|
124
|
+
|
|
125
|
+
**Analysis:**
|
|
126
|
+
- ⚠️ **INCOMPLETE WORK**: This was a placeholder that was never implemented
|
|
127
|
+
- ❓ **MAYBE NEEDED**: Comment suggests there are complex scenarios not handled
|
|
128
|
+
- **Recommendation**: Either implement it or remove it. Check if there are unhandled partial match scenarios.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
### 7. `handleExtendLocationPartial` (lines 1612-1623)
|
|
133
|
+
**Status:** UNUSED
|
|
134
|
+
|
|
135
|
+
**Purpose:**
|
|
136
|
+
- Handles extension location in partial mode
|
|
137
|
+
- Creates `:is()` wrappers
|
|
138
|
+
- Currently just calls `applyExtensionAtLocation`
|
|
139
|
+
|
|
140
|
+
**Current Implementation:**
|
|
141
|
+
- Partial mode handling is done inline in `extendSelector` (lines 616-722)
|
|
142
|
+
- Has complex logic for root-level, component-level, and multiple matches
|
|
143
|
+
|
|
144
|
+
**Analysis:**
|
|
145
|
+
- ⚠️ **INCOMPLETE**: Function is a stub that doesn't do the actual work
|
|
146
|
+
- ❓ **MAYBE INTENDED**: Was meant to consolidate partial mode logic but never completed
|
|
147
|
+
- **Recommendation**: Remove - current inline implementation is more complete
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### 8. `handleExtendLocationFull` (lines 1628-1645)
|
|
152
|
+
**Status:** UNUSED
|
|
153
|
+
|
|
154
|
+
**Purpose:**
|
|
155
|
+
- Handles extension location in full mode
|
|
156
|
+
- Calls `convertToIsWrapperIfNeeded` for compound selectors
|
|
157
|
+
- Falls back to `applyExtensionAtLocation`
|
|
158
|
+
|
|
159
|
+
**Current Implementation:**
|
|
160
|
+
- Full mode handling is done inline in `extendSelector` (lines 723-830)
|
|
161
|
+
- Has logic for root-level, pseudo-selector, boundary-crossing, compound, and complex selector cases
|
|
162
|
+
|
|
163
|
+
**Analysis:**
|
|
164
|
+
- ⚠️ **INCOMPLETE**: Function doesn't handle all the cases current code does
|
|
165
|
+
- ❓ **MAYBE INTENDED**: Was meant to consolidate full mode logic but never completed
|
|
166
|
+
- **Recommendation**: Remove - current inline implementation is more complete
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
### 9. `convertToIsWrapperIfNeeded` (lines 1650-1667)
|
|
171
|
+
**Status:** UNUSED - Only called from unused `handleExtendLocationFull`
|
|
172
|
+
|
|
173
|
+
**Purpose:**
|
|
174
|
+
- Converts extended results to use `:is()` wrappers for compound selectors
|
|
175
|
+
- Currently a stub with TODO comment
|
|
176
|
+
|
|
177
|
+
**Current Implementation:**
|
|
178
|
+
- Compound selector extensions create `:is()` wrappers directly (line 794)
|
|
179
|
+
- Uses `createValidatedIsWrapperWithErrors`
|
|
180
|
+
|
|
181
|
+
**Analysis:**
|
|
182
|
+
- ⚠️ **INCOMPLETE WORK**: Stub function with TODO
|
|
183
|
+
- ❓ **MAYBE NEEDED**: Comment suggests there's logic for compound boundary cases
|
|
184
|
+
- **Recommendation**: Either implement the logic or remove. Check if current implementation handles all cases.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
### 10. `createValidatedCompoundSelector` (lines 1708-1719)
|
|
189
|
+
**Status:** UNUSED - Only `createValidatedCompoundSelectorWithErrors` is used
|
|
190
|
+
|
|
191
|
+
**Purpose:**
|
|
192
|
+
- Creates compound selector with validation that returns fallback on conflicts
|
|
193
|
+
- Returns fallback selector instead of throwing
|
|
194
|
+
|
|
195
|
+
**Current Implementation:**
|
|
196
|
+
- Uses `createValidatedCompoundSelectorWithErrors` which throws on conflicts
|
|
197
|
+
- No fallback mechanism
|
|
198
|
+
|
|
199
|
+
**Analysis:**
|
|
200
|
+
- ❓ **UNCLEAR IF NEEDED**: Current approach throws errors, which might be correct
|
|
201
|
+
- ⚠️ **POTENTIAL ISSUE**: If validation fails, we throw - but maybe we should fallback?
|
|
202
|
+
- **Recommendation**: Review if fallback behavior is needed. If not, remove. If yes, integrate.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Summary & Recommendations
|
|
207
|
+
|
|
208
|
+
### Functions to INTEGRATE:
|
|
209
|
+
1. **`handleFullExtend`** - Consolidates full extend logic, has performance optimizations
|
|
210
|
+
2. **`optimizeTopLevelUnnecessaryIsWrapper`** - Valid optimization that should be applied
|
|
211
|
+
|
|
212
|
+
### Functions to REVIEW:
|
|
213
|
+
1. **`createValidatedIsWrapper`** - Check if fallback behavior is needed vs throwing
|
|
214
|
+
2. **`createValidatedCompoundSelector`** - Check if fallback behavior is needed vs throwing
|
|
215
|
+
3. **`processPartialMatchResult`** - Check if there are unhandled partial match scenarios
|
|
216
|
+
4. **`convertToIsWrapperIfNeeded`** - Check if compound boundary cases need special handling
|
|
217
|
+
|
|
218
|
+
### Functions to REMOVE:
|
|
219
|
+
1. **`handlePartialExtendAtRoot`** - Current implementation is more complete
|
|
220
|
+
2. **`needsPartialMatchProcessing`** - Trivial check, no value
|
|
221
|
+
3. **`handleExtendLocationPartial`** - Incomplete stub, current code is better
|
|
222
|
+
4. **`handleExtendLocationFull`** - Incomplete stub, current code is better
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Action Items
|
|
227
|
+
|
|
228
|
+
1. ✅ Review validation error handling - should we fallback or throw?
|
|
229
|
+
2. ✅ Integrate `handleFullExtend` into `extendSelector` for full extends
|
|
230
|
+
3. ✅ Integrate `optimizeTopLevelUnnecessaryIsWrapper` into flattening pipeline
|
|
231
|
+
4. ✅ Investigate if `processPartialMatchResult` and `convertToIsWrapperIfNeeded` solve real problems
|
|
232
|
+
5. ✅ Remove incomplete stub functions
|
|
233
|
+
6. ✅ Enable ESLint `@typescript-eslint/no-unused-vars` to catch unused code
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Extend Tests Baseline
|
|
2
|
+
|
|
3
|
+
## Date
|
|
4
|
+
2025-01-XX (Before refactoring)
|
|
5
|
+
|
|
6
|
+
## Test Command
|
|
7
|
+
```bash
|
|
8
|
+
cd packages/core && pnpm test -- --run extend
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Baseline Results
|
|
12
|
+
|
|
13
|
+
### Summary
|
|
14
|
+
- **Test Files**: 7 failed | 5 passed (12 total)
|
|
15
|
+
- **Tests**: 10 failed | 148 passed (158 total)
|
|
16
|
+
- **Duration**: 659ms
|
|
17
|
+
|
|
18
|
+
### Failing Tests (10)
|
|
19
|
+
|
|
20
|
+
1. **src/tree/util/__tests__/process-extends.test.ts**
|
|
21
|
+
- Entire test file failed
|
|
22
|
+
|
|
23
|
+
2. **src/tree/__tests__/extend-import-style.test.ts**
|
|
24
|
+
- `compose type can be extended from parent when mutable`
|
|
25
|
+
- `import with mutable: false cannot be extended - collects extendNotAccessible warning`
|
|
26
|
+
|
|
27
|
+
3. **src/tree/__tests__/extend-roots.test.ts**
|
|
28
|
+
- `child compose root cannot extend parent (compose is a boundary) - extend throws error`
|
|
29
|
+
- `children roots are accessible if mutable`
|
|
30
|
+
|
|
31
|
+
4. **src/tree/__tests__/extend-rules.test.ts**
|
|
32
|
+
- `should ignore self-referencing extends: .w:extend(.w)`
|
|
33
|
+
|
|
34
|
+
5. **src/tree/util/__tests__/extend-duplicate-validation.test.ts**
|
|
35
|
+
- `should allow duplicate same ID selectors for specificity (#foo#foo)`
|
|
36
|
+
- `should allow extending #foo with #foo (same ID)`
|
|
37
|
+
|
|
38
|
+
6. **src/tree/util/__tests__/extend-selector-algorithm.test.ts**
|
|
39
|
+
- `should extend complex partial match with compound boundaries - example 6`
|
|
40
|
+
- Expected: `.a>.b.c>.d.e,.a>.f`
|
|
41
|
+
- Received: Different output
|
|
42
|
+
|
|
43
|
+
7. **src/tree/util/__tests__/extend-simplified-cases.test.ts**
|
|
44
|
+
- `should extend with :is() selector - extract selectors from :is()`
|
|
45
|
+
- Expected: `.foo,.ext3,.ext4`
|
|
46
|
+
- Received: `.foo,:is(.ext3,.ext4)`
|
|
47
|
+
- `should extend with :is() selector in partial mode`
|
|
48
|
+
- Expected: `.foo :is(.bar,.ext3,.ext4)`
|
|
49
|
+
- Received: `.foo :is(.bar,:is(.ext3,.ext4))`
|
|
50
|
+
|
|
51
|
+
## Notes
|
|
52
|
+
|
|
53
|
+
- These failures appear to be pre-existing issues, not related to the refactoring
|
|
54
|
+
- The `.foo.foo` bug is not currently tested, so we need to add a test case for it
|
|
55
|
+
- Some failures are related to `:is()` flattening behavior
|
|
56
|
+
- Some failures are related to duplicate ID selector handling
|
|
57
|
+
|
|
58
|
+
## Next Steps
|
|
59
|
+
|
|
60
|
+
1. Document these baseline failures
|
|
61
|
+
2. Proceed with refactoring
|
|
62
|
+
3. Verify that refactoring doesn't introduce new failures
|
|
63
|
+
4. Fix the `.foo.foo` bug and add test case
|
|
64
|
+
5. Address any new failures introduced by refactoring
|