@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,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized unwrapping of generated :is() pseudo-selectors when they are
|
|
3
|
+
* the "first visual" selector (leading). Used after ruleset eval and in
|
|
4
|
+
* extend post-processing. Does NOT recurse into pseudo args; callers that
|
|
5
|
+
* need to process pseudo args (e.g. extend) call processLeadingIs for each
|
|
6
|
+
* selector they care about, including args of :is/:where at processing time.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { Selector } from '../selector.js';
|
|
10
|
+
import { SelectorList } from '../selector-list.js';
|
|
11
|
+
import { ComplexSelector, type ComplexSelectorComponent } from '../selector-complex.js';
|
|
12
|
+
import { CompoundSelector } from '../selector-compound.js';
|
|
13
|
+
import { PseudoSelector } from '../selector-pseudo.js';
|
|
14
|
+
import { Ampersand } from '../ampersand.js';
|
|
15
|
+
import { F_IMPLICIT_AMPERSAND, type Node } from '../node.js';
|
|
16
|
+
import { Nil } from '../nil.js';
|
|
17
|
+
import { isPlainObject } from './collections.js';
|
|
18
|
+
import { isNode } from './is-node.js';
|
|
19
|
+
import { N } from '../node-type.js';
|
|
20
|
+
|
|
21
|
+
export type ProcessLeadingIsOptions = {
|
|
22
|
+
/** When true, unwrapping a generated :is(SelectorList) merges its items into the outer list (return array). */
|
|
23
|
+
inSelectorList?: boolean;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Unwrap a generated :is() that is the first visual selector, when safe.
|
|
28
|
+
* - If selector is a SelectorList: process each item with inSelectorList=true; flatten any array returns.
|
|
29
|
+
* - If selector is a single generated :is(): when inSelectorList and arg is SelectorList, return arg.data (array); else return arg.
|
|
30
|
+
* - If first visual component of a CompoundSelector is generated :is (arg not SelectorList): merge :is arg's last part with compound suffix into a new ComplexSelector.
|
|
31
|
+
* - If first visual component of a ComplexSelector is generated :is (arg not SelectorList): unwrap into the complex's components.
|
|
32
|
+
*
|
|
33
|
+
* Does NOT recurse into pseudo-selector args. Only considers the outer selector structure.
|
|
34
|
+
*
|
|
35
|
+
* @returns The processed selector, or an array of selectors when unwrapping :is(SelectorList) in list context (caller merges into list).
|
|
36
|
+
*/
|
|
37
|
+
export function processLeadingIs(
|
|
38
|
+
selector: Selector,
|
|
39
|
+
options: ProcessLeadingIsOptions = {}
|
|
40
|
+
): Selector | Selector[] {
|
|
41
|
+
const { inSelectorList = false } = options;
|
|
42
|
+
|
|
43
|
+
const getFirstVisualIndex = (items: ComplexSelectorComponent[]): number => {
|
|
44
|
+
for (let i = 0; i < items.length; i++) {
|
|
45
|
+
if (!isNode(items[i], N.Combinator)) {
|
|
46
|
+
return i;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return -1;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const getImplicitAmpPrefix = (complex: ComplexSelector): string | null => {
|
|
53
|
+
for (const part of complex.value) {
|
|
54
|
+
if (isNode(part, N.Ampersand) && (part as unknown as Node).hasFlag(F_IMPLICIT_AMPERSAND)) {
|
|
55
|
+
const resolved = (part as Ampersand).getResolvedSelector();
|
|
56
|
+
return resolved && !(resolved instanceof Nil) ? resolved.valueOf() : null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const hasEscapedQuoted = (node: Node | undefined, seen = new Set<Node>()): boolean => {
|
|
63
|
+
if (!node || seen.has(node)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
seen.add(node);
|
|
67
|
+
if (isNode(node, N.Quoted) && Boolean(node.escaped)) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
const value = 'value' in node ? node.value : undefined;
|
|
71
|
+
if (Array.isArray(value)) {
|
|
72
|
+
for (const item of value) {
|
|
73
|
+
if (item && typeof item === 'object' && 'type' in (item as Record<string, unknown>)) {
|
|
74
|
+
if (hasEscapedQuoted(item as Node, seen)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
if (isPlainObject(value)) {
|
|
82
|
+
for (const item of Object.values(value)) {
|
|
83
|
+
if (item && typeof item === 'object' && 'type' in (item as Record<string, unknown>)) {
|
|
84
|
+
if (hasEscapedQuoted(item as Node, seen)) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const stripImplicitPrefixFromItem = (item: Selector, implicitAmpPrefix: string): Selector => {
|
|
94
|
+
if (!isNode(item, N.ComplexSelector)) {
|
|
95
|
+
return item.clone(false) as Selector;
|
|
96
|
+
}
|
|
97
|
+
const itemComplex = item as ComplexSelector;
|
|
98
|
+
const firstVisualIndex = getFirstVisualIndex([...itemComplex.value]);
|
|
99
|
+
if (firstVisualIndex < 0) {
|
|
100
|
+
return item.clone(false) as Selector;
|
|
101
|
+
}
|
|
102
|
+
const firstVisual = itemComplex.value[firstVisualIndex] as Selector;
|
|
103
|
+
if (firstVisual.valueOf() !== implicitAmpPrefix) {
|
|
104
|
+
return item.clone(false) as Selector;
|
|
105
|
+
}
|
|
106
|
+
let start = firstVisualIndex + 1;
|
|
107
|
+
if (start < itemComplex.value.length && isNode(itemComplex.value[start], N.Combinator)) {
|
|
108
|
+
start++;
|
|
109
|
+
}
|
|
110
|
+
const tail = itemComplex.value.slice(start).map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
|
|
111
|
+
if (tail.length === 1 && !isNode(tail[0], N.Combinator)) {
|
|
112
|
+
return tail[0] as Selector;
|
|
113
|
+
}
|
|
114
|
+
if (tail.length > 1) {
|
|
115
|
+
return ComplexSelector.create(tail).inherit(itemComplex) as Selector;
|
|
116
|
+
}
|
|
117
|
+
return item.clone(false) as Selector;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// SelectorList: process each item; merge list results (array or SelectorList) into one list.
|
|
121
|
+
if (isNode(selector, N.SelectorList)) {
|
|
122
|
+
const list = selector as SelectorList;
|
|
123
|
+
const out: Selector[] = [];
|
|
124
|
+
const seen = new Set<string>();
|
|
125
|
+
let changed = false;
|
|
126
|
+
const pushUnique = (item: Selector): void => {
|
|
127
|
+
const key = item.valueOf();
|
|
128
|
+
if (seen.has(key)) {
|
|
129
|
+
changed = true;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
seen.add(key);
|
|
133
|
+
out.push(item);
|
|
134
|
+
};
|
|
135
|
+
for (const item of list.value) {
|
|
136
|
+
const result = processLeadingIs(item, { inSelectorList: true });
|
|
137
|
+
if (Array.isArray(result)) {
|
|
138
|
+
for (const entry of result) {
|
|
139
|
+
pushUnique(entry);
|
|
140
|
+
}
|
|
141
|
+
changed = true;
|
|
142
|
+
} else if (isNode(result, N.SelectorList)) {
|
|
143
|
+
for (const entry of (result as SelectorList).value.map(s => s.clone(false) as Selector)) {
|
|
144
|
+
pushUnique(entry);
|
|
145
|
+
}
|
|
146
|
+
changed = true;
|
|
147
|
+
} else {
|
|
148
|
+
pushUnique(result);
|
|
149
|
+
changed ||= result !== item;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (!changed) {
|
|
153
|
+
return selector;
|
|
154
|
+
}
|
|
155
|
+
if (out.length === 1) {
|
|
156
|
+
return out[0]!;
|
|
157
|
+
}
|
|
158
|
+
return SelectorList.create(out.map(s => s.clone(false) as Selector)).inherit(selector) as Selector;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Single PseudoSelector :is, generated
|
|
162
|
+
if (isNode(selector, N.PseudoSelector)) {
|
|
163
|
+
const pseudo = selector as PseudoSelector;
|
|
164
|
+
if (pseudo.name !== ':is' || !pseudo.generated) {
|
|
165
|
+
return selector;
|
|
166
|
+
}
|
|
167
|
+
const arg = pseudo.arg as Selector | undefined;
|
|
168
|
+
if (!arg) {
|
|
169
|
+
return selector;
|
|
170
|
+
}
|
|
171
|
+
if (hasEscapedQuoted(arg)) {
|
|
172
|
+
return selector;
|
|
173
|
+
}
|
|
174
|
+
// :is(SelectorList): in list context merge; else return array for caller to handle
|
|
175
|
+
if (isNode(arg, N.SelectorList)) {
|
|
176
|
+
if (inSelectorList) {
|
|
177
|
+
return arg.value.map(s => s.clone(false) as Selector);
|
|
178
|
+
}
|
|
179
|
+
// Top-level single :is(SelectorList): unwrap to the list (or single if one item)
|
|
180
|
+
if (arg.value.length === 1) {
|
|
181
|
+
return arg.value[0]!.clone(false) as Selector;
|
|
182
|
+
}
|
|
183
|
+
return SelectorList.create(arg.value.map(s => s.clone(false) as Selector)).inherit(selector) as Selector;
|
|
184
|
+
}
|
|
185
|
+
// :is(not list): unwrap to the single selector
|
|
186
|
+
return arg.clone(false) as Selector;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// CompoundSelector: first component is generated :is (arg not list) → merge suffix into last part of :is, return ComplexSelector.
|
|
190
|
+
// GCD of complex + compound is complex (e.g. parent * b + &[e] → * b[e]), so we unwrap to that shape.
|
|
191
|
+
if (isNode(selector, N.CompoundSelector)) {
|
|
192
|
+
const compound = selector as CompoundSelector;
|
|
193
|
+
const value = compound.value;
|
|
194
|
+
if (value.length === 0) {
|
|
195
|
+
return selector;
|
|
196
|
+
}
|
|
197
|
+
const first = value[0];
|
|
198
|
+
if (
|
|
199
|
+
!isNode(first, N.PseudoSelector)
|
|
200
|
+
|| (first as PseudoSelector).name !== ':is'
|
|
201
|
+
|| !(first as PseudoSelector).generated
|
|
202
|
+
) {
|
|
203
|
+
return selector;
|
|
204
|
+
}
|
|
205
|
+
const arg = (first as PseudoSelector).arg as Selector | undefined;
|
|
206
|
+
if (!arg) {
|
|
207
|
+
return selector;
|
|
208
|
+
}
|
|
209
|
+
if (hasEscapedQuoted(arg)) {
|
|
210
|
+
return selector;
|
|
211
|
+
}
|
|
212
|
+
const normalizedArg = isNode(arg, N.SelectorList) && arg.value.length === 1
|
|
213
|
+
? (arg.value[0]! as Selector)
|
|
214
|
+
: arg;
|
|
215
|
+
if (isNode(normalizedArg, N.SelectorList)) {
|
|
216
|
+
const suffix = value.slice(1).map(s => (s as Selector).clone(false));
|
|
217
|
+
if (suffix.length === 0) {
|
|
218
|
+
return SelectorList.create(normalizedArg.value.map(s => s.clone(false) as Selector)).inherit(selector) as Selector;
|
|
219
|
+
}
|
|
220
|
+
// Keep :is(list).suffix (e.g. :is(.one,.two).three) as one selector.
|
|
221
|
+
return selector;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const suffix = value.slice(1).map(s => (s as Selector).clone(false));
|
|
225
|
+
if (suffix.length === 0) {
|
|
226
|
+
return arg.clone(false) as Selector;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Merge suffix into last component of arg (complex or compound)
|
|
230
|
+
if (isNode(normalizedArg, N.ComplexSelector)) {
|
|
231
|
+
const complex = normalizedArg as ComplexSelector;
|
|
232
|
+
const comps = complex.value.slice().map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
|
|
233
|
+
for (let i = comps.length - 1; i >= 0; i--) {
|
|
234
|
+
const c = comps[i]!;
|
|
235
|
+
if (isNode(c, N.Combinator)) {
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (isNode(c, N.CompoundSelector)) {
|
|
239
|
+
const compound = c as CompoundSelector;
|
|
240
|
+
const newCompound = CompoundSelector.create([
|
|
241
|
+
...compound.value.map(s => (s as Selector).clone(false)),
|
|
242
|
+
...suffix
|
|
243
|
+
]).inherit(compound);
|
|
244
|
+
comps[i] = newCompound as ComplexSelectorComponent;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
comps[i] = CompoundSelector.create([
|
|
248
|
+
(c as Selector).clone(false),
|
|
249
|
+
...suffix
|
|
250
|
+
]) as ComplexSelectorComponent;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
return ComplexSelector.create(comps).inherit(selector) as Selector;
|
|
254
|
+
}
|
|
255
|
+
if (isNode(normalizedArg, N.CompoundSelector)) {
|
|
256
|
+
const newCompound = (normalizedArg as CompoundSelector).value.slice().map(s => (s as Selector).clone(false));
|
|
257
|
+
newCompound.push(...suffix);
|
|
258
|
+
return CompoundSelector.create(newCompound).inherit(selector) as Selector;
|
|
259
|
+
}
|
|
260
|
+
const newCompound = CompoundSelector.create([
|
|
261
|
+
normalizedArg.clone(false),
|
|
262
|
+
...suffix
|
|
263
|
+
]).inherit(selector);
|
|
264
|
+
return ComplexSelector.create([newCompound as ComplexSelectorComponent]).inherit(selector) as Selector;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// ComplexSelector: first visual component is generated :is (arg not list) → unwrap into complex
|
|
268
|
+
if (isNode(selector, N.ComplexSelector)) {
|
|
269
|
+
const complex = selector as ComplexSelector;
|
|
270
|
+
const implicitAmpPrefix = getImplicitAmpPrefix(complex);
|
|
271
|
+
if (implicitAmpPrefix) {
|
|
272
|
+
let changed = false;
|
|
273
|
+
const outComponents: ComplexSelectorComponent[] = [];
|
|
274
|
+
for (const part of complex.value) {
|
|
275
|
+
if (isNode(part, N.PseudoSelector) && part.name === ':is' && part.generated) {
|
|
276
|
+
const arg = part.arg;
|
|
277
|
+
if (arg && hasEscapedQuoted(arg as Node)) {
|
|
278
|
+
outComponents.push((part as Selector).clone(false) as ComplexSelectorComponent);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (arg && isNode(arg, N.SelectorList)) {
|
|
282
|
+
const normalizedArgs = arg.value.map((item) => {
|
|
283
|
+
const normalized = stripImplicitPrefixFromItem(item as Selector, implicitAmpPrefix);
|
|
284
|
+
if (normalized.valueOf() !== (item as Selector).valueOf()) {
|
|
285
|
+
changed = true;
|
|
286
|
+
}
|
|
287
|
+
return normalized;
|
|
288
|
+
});
|
|
289
|
+
let nonCombinatorCount = 0;
|
|
290
|
+
let hasImplicitAmpPart = false;
|
|
291
|
+
for (const c of complex.value) {
|
|
292
|
+
if (!isNode(c, N.Combinator)) {
|
|
293
|
+
nonCombinatorCount++;
|
|
294
|
+
if (isNode(c, N.Ampersand) && (c as unknown as Node).hasFlag(F_IMPLICIT_AMPERSAND)) {
|
|
295
|
+
hasImplicitAmpPart = true;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// `& :is(list)` under collapse should serialize as list headers.
|
|
300
|
+
if (nonCombinatorCount === 2 && hasImplicitAmpPart) {
|
|
301
|
+
return SelectorList.create(normalizedArgs).inherit(selector) as Selector;
|
|
302
|
+
}
|
|
303
|
+
const list = SelectorList.create(normalizedArgs).inherit(arg);
|
|
304
|
+
outComponents.push(...list.value.map(s => s.clone(false) as ComplexSelectorComponent));
|
|
305
|
+
changed = true;
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
outComponents.push((part as Selector).clone(false) as ComplexSelectorComponent);
|
|
310
|
+
}
|
|
311
|
+
if (changed) {
|
|
312
|
+
if (outComponents.length === 1 && !isNode(outComponents[0], N.Combinator)) {
|
|
313
|
+
return outComponents[0] as Selector;
|
|
314
|
+
}
|
|
315
|
+
return ComplexSelector.create(outComponents).inherit(selector) as Selector;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const value = [...complex.value];
|
|
320
|
+
const firstSelIndex = getFirstVisualIndex(value);
|
|
321
|
+
if (firstSelIndex < 0) {
|
|
322
|
+
return selector;
|
|
323
|
+
}
|
|
324
|
+
const first = value[firstSelIndex];
|
|
325
|
+
if (
|
|
326
|
+
isNode(first, N.CompoundSelector)
|
|
327
|
+
&& isNode((first as CompoundSelector).value?.[0], N.PseudoSelector)
|
|
328
|
+
&& ((first as CompoundSelector).value?.[0] as PseudoSelector).name === ':is'
|
|
329
|
+
&& ((first as CompoundSelector).value?.[0] as PseudoSelector).generated
|
|
330
|
+
) {
|
|
331
|
+
const unwrappedFirst = processLeadingIs(first as Selector, { inSelectorList: false });
|
|
332
|
+
if (!Array.isArray(unwrappedFirst)) {
|
|
333
|
+
const prefix = value
|
|
334
|
+
.slice(0, firstSelIndex)
|
|
335
|
+
.map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
|
|
336
|
+
const rest = value
|
|
337
|
+
.slice(firstSelIndex + 1)
|
|
338
|
+
.map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
|
|
339
|
+
const unwrappedComps = isNode(unwrappedFirst, N.ComplexSelector)
|
|
340
|
+
? (unwrappedFirst as ComplexSelector).value.map(c => (c as Selector).clone(false) as ComplexSelectorComponent)
|
|
341
|
+
: [unwrappedFirst.clone(false) as ComplexSelectorComponent];
|
|
342
|
+
return ComplexSelector.create([
|
|
343
|
+
...prefix,
|
|
344
|
+
...unwrappedComps,
|
|
345
|
+
...rest
|
|
346
|
+
]).inherit(selector) as Selector;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (
|
|
350
|
+
!isNode(first, N.PseudoSelector)
|
|
351
|
+
|| (first as PseudoSelector).name !== ':is'
|
|
352
|
+
|| !(first as PseudoSelector).generated
|
|
353
|
+
) {
|
|
354
|
+
return selector;
|
|
355
|
+
}
|
|
356
|
+
const arg = (first as PseudoSelector).arg as Selector | undefined;
|
|
357
|
+
if (!arg) {
|
|
358
|
+
return selector;
|
|
359
|
+
}
|
|
360
|
+
if (hasEscapedQuoted(arg)) {
|
|
361
|
+
return selector;
|
|
362
|
+
}
|
|
363
|
+
const normalizedArg = isNode(arg, N.SelectorList) && arg.value.length === 1
|
|
364
|
+
? (arg.value[0]! as Selector)
|
|
365
|
+
: arg;
|
|
366
|
+
if (isNode(normalizedArg, N.SelectorList)) {
|
|
367
|
+
const normalizedList = processLeadingIs(normalizedArg as Selector, { inSelectorList: true });
|
|
368
|
+
const rest = value.slice(firstSelIndex + 1).map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
|
|
369
|
+
// Keep :is(list) when there is a suffix (e.g. :is(.one,.two) .three) so it serializes as one selector.
|
|
370
|
+
if (rest.length > 0) {
|
|
371
|
+
if (isNode(normalizedList, N.SelectorList) && normalizedList !== normalizedArg) {
|
|
372
|
+
const copy = (first as PseudoSelector).clone(false) as PseudoSelector;
|
|
373
|
+
copy.adopt(normalizedList);
|
|
374
|
+
copy.arg = normalizedList;
|
|
375
|
+
return ComplexSelector.create([
|
|
376
|
+
...value.slice(0, firstSelIndex).map(c => (c as Selector).clone(false) as ComplexSelectorComponent),
|
|
377
|
+
copy as unknown as ComplexSelectorComponent,
|
|
378
|
+
...rest
|
|
379
|
+
]).inherit(selector) as Selector;
|
|
380
|
+
}
|
|
381
|
+
return selector;
|
|
382
|
+
}
|
|
383
|
+
const listArg = isNode(normalizedList, N.SelectorList)
|
|
384
|
+
? normalizedList as SelectorList
|
|
385
|
+
: normalizedArg as SelectorList;
|
|
386
|
+
const expanded: Selector[] = listArg.value.map((item) => {
|
|
387
|
+
if (isNode(item, N.ComplexSelector)) {
|
|
388
|
+
return ComplexSelector.create([
|
|
389
|
+
...(item as ComplexSelector).value.map(c => (c as Selector).clone(false) as ComplexSelectorComponent),
|
|
390
|
+
...rest
|
|
391
|
+
]).inherit(selector) as Selector;
|
|
392
|
+
}
|
|
393
|
+
if (rest.length === 0) {
|
|
394
|
+
return (item as Selector).clone(false) as Selector;
|
|
395
|
+
}
|
|
396
|
+
return ComplexSelector.create([
|
|
397
|
+
(item as Selector).clone(false) as ComplexSelectorComponent,
|
|
398
|
+
...rest
|
|
399
|
+
]).inherit(selector) as Selector;
|
|
400
|
+
});
|
|
401
|
+
if (expanded.length === 1) {
|
|
402
|
+
return expanded[0]!;
|
|
403
|
+
}
|
|
404
|
+
return SelectorList.create(expanded).inherit(selector) as Selector;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if (isNode(normalizedArg, N.ComplexSelector)) {
|
|
408
|
+
const argComplex = normalizedArg as ComplexSelector;
|
|
409
|
+
const rest = value.slice(firstSelIndex + 1);
|
|
410
|
+
const argComps = argComplex.value.slice().map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
|
|
411
|
+
const restComps = rest.map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
|
|
412
|
+
const newValue = [...argComps, ...restComps];
|
|
413
|
+
return ComplexSelector.create(newValue).inherit(selector) as Selector;
|
|
414
|
+
}
|
|
415
|
+
const rest = value.slice(firstSelIndex + 1).map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
|
|
416
|
+
const newValue = [normalizedArg.clone(false) as ComplexSelectorComponent, ...rest];
|
|
417
|
+
return ComplexSelector.create(newValue).inherit(selector) as Selector;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return selector;
|
|
421
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { Call } from '../call.js';
|
|
2
|
+
import type { List } from '../list.js';
|
|
3
|
+
import type { Context } from '../../context.js';
|
|
4
|
+
import { isNode } from './is-node.js';
|
|
5
|
+
|
|
6
|
+
type CallItem = string | undefined;
|
|
7
|
+
|
|
8
|
+
function getCallArgsSignature(args: List | undefined, context?: Context): string | undefined {
|
|
9
|
+
if (!isNode(args)) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
return args.toTrimmedString(context ? { context } : undefined);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* This memoizes arguments for a call and returns true
|
|
16
|
+
* if the call has called itself with the same arguments.
|
|
17
|
+
*
|
|
18
|
+
* It lazily indexes the arguments when there's a subsequent
|
|
19
|
+
* call.
|
|
20
|
+
*/
|
|
21
|
+
export class CallMap {
|
|
22
|
+
private _callMap = new Map<Call, [CallItem, ...CallItem[]]>();
|
|
23
|
+
|
|
24
|
+
add(call: Call, args: List | undefined, context?: Context) {
|
|
25
|
+
let set = this._callMap.get(call);
|
|
26
|
+
const argsSignature = getCallArgsSignature(args, context);
|
|
27
|
+
if (!set) {
|
|
28
|
+
this._callMap.set(call, [argsSignature]);
|
|
29
|
+
} else {
|
|
30
|
+
if (argsSignature === undefined && set.includes(undefined)) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
for (let i = 0; i < set.length; i++) {
|
|
34
|
+
let item = set[i]!;
|
|
35
|
+
if (item === argsSignature) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
delete(call: Call) {
|
|
44
|
+
let set = this._callMap.get(call);
|
|
45
|
+
if (set) {
|
|
46
|
+
set.pop();
|
|
47
|
+
if (set.length === 0) {
|
|
48
|
+
this._callMap.delete(call);
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|