@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,391 @@
|
|
|
1
|
+
import type { Class } from 'type-fest';
|
|
2
|
+
import { defineType, Node, F_VISIBLE, F_NON_STATIC, F_IMPLICIT_AMPERSAND, type NodeOptions } from './node.js';
|
|
3
|
+
import { type Context } from '../context.js';
|
|
4
|
+
import { Selector } from './selector.js';
|
|
5
|
+
import { Ampersand } from './ampersand.js';
|
|
6
|
+
import type { Ruleset } from './ruleset.js';
|
|
7
|
+
import { Nil } from './nil.js';
|
|
8
|
+
import { ComplexSelector, type ComplexSelectorComponent } from './selector-complex.js';
|
|
9
|
+
import { Combinator } from './combinator.js';
|
|
10
|
+
import { type PrintOptions, getPrintOptions } from './util/print.js';
|
|
11
|
+
import { type MaybePromise, isThenable } from '@jesscss/awaitable-pipe';
|
|
12
|
+
import { isNode } from './util/is-node.js';
|
|
13
|
+
import { N } from './node-type.js';
|
|
14
|
+
import { getImplicitSelector, selectorHasAuthoredAmpersand, wrapParentSelectorForNestedContext } from './util/selector-utils.js';
|
|
15
|
+
import { addParentEdge } from './util/cursor.js';
|
|
16
|
+
import { CANONICAL, EVAL } from './node-base.js';
|
|
17
|
+
|
|
18
|
+
export enum ExtendFlag {
|
|
19
|
+
/** Sass and Jess default */
|
|
20
|
+
All = 0,
|
|
21
|
+
/** Less default - must not be a partial selector match */
|
|
22
|
+
Exact = 1
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type ExtendValue = {
|
|
26
|
+
/** The current selector. By default is `&` */
|
|
27
|
+
selector?: Selector;
|
|
28
|
+
/** The target to extend */
|
|
29
|
+
target: Selector;
|
|
30
|
+
/**
|
|
31
|
+
* Optional namespace scoping for extend targets.
|
|
32
|
+
*
|
|
33
|
+
* - `namespace: '*'` means "search all extend roots in this file (ignore namespace scoping)".
|
|
34
|
+
* - `namespace: 'ns'` means "search the extend root(s) assigned to namespace `ns`".
|
|
35
|
+
*/
|
|
36
|
+
namespace?: string;
|
|
37
|
+
flag?: ExtendFlag;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Extends selectors - parsed by Less as an independent statement
|
|
41
|
+
* at the beginning of rules.
|
|
42
|
+
*
|
|
43
|
+
* @todo - figure out eval -- use Rules lookups
|
|
44
|
+
* @note - there is some pseudo-code somewhere that smartly
|
|
45
|
+
* registers selectors by a string code.
|
|
46
|
+
*/
|
|
47
|
+
export type ExtendChildData = {
|
|
48
|
+
selector: Selector | undefined;
|
|
49
|
+
target: Selector;
|
|
50
|
+
namespace: string | undefined;
|
|
51
|
+
flag: ExtendFlag | undefined;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export interface Extend extends Node<ExtendValue, NodeOptions, ExtendChildData> {
|
|
55
|
+
type: 'Extend';
|
|
56
|
+
shortType: 'extend';
|
|
57
|
+
eval(context: Context): MaybePromise<Selector>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export class Extend extends Node<ExtendValue, NodeOptions, ExtendChildData> {
|
|
61
|
+
static override childKeys = ['selector', 'target'] as const;
|
|
62
|
+
|
|
63
|
+
readonly selector: ExtendValue['selector'];
|
|
64
|
+
readonly target!: Selector;
|
|
65
|
+
private readonly namespace: string | undefined;
|
|
66
|
+
private readonly flag: ExtendFlag | undefined;
|
|
67
|
+
|
|
68
|
+
override clone(deep?: boolean, cloneFn?: (n: Node) => Node, ctx?: Context): this {
|
|
69
|
+
const selector = this.get('selector', ctx);
|
|
70
|
+
const target = this.get('target', ctx);
|
|
71
|
+
const namespace = this.get('namespace', ctx);
|
|
72
|
+
const flag = this.get('flag', ctx);
|
|
73
|
+
const cloneChild = cloneFn ?? ((n: Node) => n.clone(deep, cloneFn, ctx));
|
|
74
|
+
const options = this._meta?.options;
|
|
75
|
+
let priorChildParents: Array<[Node, Node | undefined]> | undefined;
|
|
76
|
+
if (!deep) {
|
|
77
|
+
priorChildParents = [];
|
|
78
|
+
if (selector instanceof Node) {
|
|
79
|
+
priorChildParents.push([selector, selector.parent]);
|
|
80
|
+
}
|
|
81
|
+
if (target instanceof Node) {
|
|
82
|
+
priorChildParents.push([target, target.parent]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const newNode = new (this.constructor as Class<this>)(
|
|
86
|
+
{
|
|
87
|
+
selector: deep && selector instanceof Node ? cloneChild(selector) : selector,
|
|
88
|
+
target: deep ? cloneChild(target) : target,
|
|
89
|
+
namespace,
|
|
90
|
+
flag
|
|
91
|
+
},
|
|
92
|
+
options ? { ...options } : undefined,
|
|
93
|
+
this.location,
|
|
94
|
+
this.treeContext
|
|
95
|
+
);
|
|
96
|
+
if (priorChildParents) {
|
|
97
|
+
const renderKey = ctx?.renderKey ?? (this.renderKey === CANONICAL ? EVAL : this.renderKey);
|
|
98
|
+
for (const [child, priorParent] of priorChildParents) {
|
|
99
|
+
addParentEdge(child, renderKey, newNode);
|
|
100
|
+
(child as unknown as { parent?: Node }).parent = priorParent;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
newNode.inherit(this);
|
|
104
|
+
return newNode;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
constructor(value: ExtendValue, options?: any, location?: any, treeContext?: any) {
|
|
108
|
+
super(value, options, location, treeContext);
|
|
109
|
+
this.selector = value.selector;
|
|
110
|
+
this.target = value.target;
|
|
111
|
+
this.namespace = value.namespace;
|
|
112
|
+
this.flag = value.flag;
|
|
113
|
+
if (this.selector instanceof Node) {
|
|
114
|
+
this.adopt(this.selector);
|
|
115
|
+
}
|
|
116
|
+
if (this.target instanceof Node) {
|
|
117
|
+
this.adopt(this.target);
|
|
118
|
+
}
|
|
119
|
+
this.removeFlag(F_VISIBLE);
|
|
120
|
+
this.addFlag(F_NON_STATIC);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
override valueOf(context?: Context) {
|
|
124
|
+
return `$extend ${this.get('target', context).valueOf()}`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
override toTrimmedString(options?: PrintOptions): string {
|
|
128
|
+
options = getPrintOptions(options);
|
|
129
|
+
const w = options.writer!;
|
|
130
|
+
const context = options.context;
|
|
131
|
+
let target = this.get('target', context);
|
|
132
|
+
let selector = this.get('selector', context);
|
|
133
|
+
let flag = this.get('flag', context);
|
|
134
|
+
let namespace = this.get('namespace', context);
|
|
135
|
+
const mark = w.mark();
|
|
136
|
+
w.add('$extend');
|
|
137
|
+
if (selector) {
|
|
138
|
+
let out = w.capture(() => selector.toString(options)).trim();
|
|
139
|
+
w.add(' ');
|
|
140
|
+
w.add(out, selector);
|
|
141
|
+
w.add(' ->');
|
|
142
|
+
}
|
|
143
|
+
let out = w.capture(() => target.toString(options)).trim();
|
|
144
|
+
w.add(' ');
|
|
145
|
+
if (namespace) {
|
|
146
|
+
w.add(`${namespace}|`);
|
|
147
|
+
}
|
|
148
|
+
w.add(out, target);
|
|
149
|
+
if (flag === ExtendFlag.Exact) {
|
|
150
|
+
w.add(' !exact');
|
|
151
|
+
}
|
|
152
|
+
w.add(';');
|
|
153
|
+
return w.getSince(mark);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Don't preEval Extend - let it be evaluated in evalNode when the ruleset is in the frame
|
|
157
|
+
// This ensures the ampersand resolves to the correct ruleset selector, not the parent frame
|
|
158
|
+
|
|
159
|
+
override evalNode(context: Context): MaybePromise<Nil> {
|
|
160
|
+
let selector = this.get('selector', context);
|
|
161
|
+
let target = this.get('target', context);
|
|
162
|
+
let flag = this.get('flag', context);
|
|
163
|
+
let namespace = this.get('namespace', context);
|
|
164
|
+
const hasExplicitSelector = selector !== undefined;
|
|
165
|
+
|
|
166
|
+
const currentFrame = context.rulesetFrames.at(-1);
|
|
167
|
+
|
|
168
|
+
// If selector is undefined, convert it to ampersand so it resolves to the ruleset's selector
|
|
169
|
+
// If selector is already set to a non-ampersand (e.g., from a bubbled extend), keep it as-is
|
|
170
|
+
// The parser sets the selector correctly when bubbling extends, so we should preserve it
|
|
171
|
+
if (!selector) {
|
|
172
|
+
// Set selector to ampersand - it will resolve to the current ruleset's selector when evaluated
|
|
173
|
+
// This matches the conceptual model: .c:extend(.ext all) is like { &:extend(.ext all); } inside .c
|
|
174
|
+
// The frame selector should already be :is(.a, .b) .c (the evaluated selector from preEval)
|
|
175
|
+
selector = Ampersand.create(undefined);
|
|
176
|
+
// Make the ampersand visible so it's included in the selector when evaluated
|
|
177
|
+
// This ensures the parent selector is properly included in the extend selector
|
|
178
|
+
selector.addFlag(F_VISIBLE);
|
|
179
|
+
}
|
|
180
|
+
// If selector is already set (e.g., .ext7 from a bubbled extend), use it directly
|
|
181
|
+
// Don't convert non-ampersand selectors to ampersand - they should be used as-is
|
|
182
|
+
// Get current extend root from registry stack
|
|
183
|
+
const extendRoot = context.extendRoots.getCurrentExtendRoot();
|
|
184
|
+
if (!extendRoot) {
|
|
185
|
+
/** Throw error? */
|
|
186
|
+
return new Nil();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const maybeSel = selector.eval(context);
|
|
190
|
+
if (isThenable(maybeSel)) {
|
|
191
|
+
return (maybeSel as Promise<Selector | Nil>).then((sel) => {
|
|
192
|
+
if (sel instanceof Nil) {
|
|
193
|
+
return new Nil();
|
|
194
|
+
}
|
|
195
|
+
// Resolve ampersand to its current parent selector if needed (live resolution for extend)
|
|
196
|
+
let resolvedSel: Selector = sel;
|
|
197
|
+
if (isNode(sel, N.Ampersand)) {
|
|
198
|
+
const ampResolved = sel.getResolvedSelector();
|
|
199
|
+
if (ampResolved && !(ampResolved instanceof Nil)) {
|
|
200
|
+
resolvedSel = ampResolved;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
resolvedSel = resolveExtendSelectorInFrame(
|
|
204
|
+
resolvedSel,
|
|
205
|
+
hasExplicitSelector,
|
|
206
|
+
currentFrame,
|
|
207
|
+
context
|
|
208
|
+
);
|
|
209
|
+
resolvedSel = materializeImplicitAmpersands(resolvedSel, flag !== ExtendFlag.All);
|
|
210
|
+
const rs = currentFrame as Ruleset;
|
|
211
|
+
const docOrder = getDocumentOrderForExtend(rs, context);
|
|
212
|
+
const fromReferenceScope = context.inReferenceImportScope;
|
|
213
|
+
context.extends.push([target, resolvedSel, flag === ExtendFlag.All, extendRoot, this, docOrder, fromReferenceScope, namespace]);
|
|
214
|
+
return new Nil();
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
const sel = maybeSel as Selector | Nil;
|
|
218
|
+
if (sel instanceof Nil) {
|
|
219
|
+
return new Nil();
|
|
220
|
+
}
|
|
221
|
+
// Resolve ampersand to its current parent selector if needed (live resolution for extend)
|
|
222
|
+
let resolvedSel: Selector = sel;
|
|
223
|
+
if (isNode(sel, N.Ampersand)) {
|
|
224
|
+
const ampResolved = sel.getResolvedSelector();
|
|
225
|
+
if (ampResolved && !(ampResolved instanceof Nil)) {
|
|
226
|
+
resolvedSel = ampResolved;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
resolvedSel = resolveExtendSelectorInFrame(
|
|
230
|
+
resolvedSel,
|
|
231
|
+
hasExplicitSelector,
|
|
232
|
+
currentFrame,
|
|
233
|
+
context
|
|
234
|
+
);
|
|
235
|
+
resolvedSel = materializeImplicitAmpersands(resolvedSel, flag !== ExtendFlag.All);
|
|
236
|
+
const rs = currentFrame && isNode(currentFrame, N.Ruleset) ? currentFrame as Ruleset : undefined;
|
|
237
|
+
const docOrder = getDocumentOrderForExtend(rs, context);
|
|
238
|
+
const fromReferenceScope = context.inReferenceImportScope;
|
|
239
|
+
context.extends.push([target, resolvedSel, flag === ExtendFlag.All, extendRoot, this, docOrder, fromReferenceScope, namespace]);
|
|
240
|
+
return new Nil();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function materializeImplicitAmpersands(
|
|
245
|
+
selector: Selector,
|
|
246
|
+
includeNonListImplicit: boolean
|
|
247
|
+
): Selector {
|
|
248
|
+
const materialize = (node: Selector): Selector => {
|
|
249
|
+
if (isNode(node, N.Ampersand)) {
|
|
250
|
+
const amp = node as Ampersand;
|
|
251
|
+
const n = amp as unknown as Node;
|
|
252
|
+
if (n.hasFlag(F_IMPLICIT_AMPERSAND)) {
|
|
253
|
+
const resolved = amp.getResolvedSelector();
|
|
254
|
+
if (
|
|
255
|
+
resolved
|
|
256
|
+
&& !(resolved instanceof Nil)
|
|
257
|
+
&& (includeNonListImplicit || isNode(resolved, N.SelectorList))
|
|
258
|
+
) {
|
|
259
|
+
return materialize(resolved.copy(true) as Selector);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return node.copy(true) as Selector;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (isNode(node, N.ComplexSelector)) {
|
|
266
|
+
const complex = node as ComplexSelector;
|
|
267
|
+
const parts: Selector[] = [];
|
|
268
|
+
for (const part of complex.get('value') as unknown as Selector[]) {
|
|
269
|
+
if (isNode(part, N.Ampersand)) {
|
|
270
|
+
const amp = part as Ampersand;
|
|
271
|
+
const n = amp as unknown as Node;
|
|
272
|
+
if (n.hasFlag(F_IMPLICIT_AMPERSAND)) {
|
|
273
|
+
const resolved = amp.getResolvedSelector();
|
|
274
|
+
if (
|
|
275
|
+
resolved
|
|
276
|
+
&& !(resolved instanceof Nil)
|
|
277
|
+
&& (includeNonListImplicit || isNode(resolved, N.SelectorList))
|
|
278
|
+
) {
|
|
279
|
+
const repl = materialize(resolved.copy(true) as Selector);
|
|
280
|
+
if (isNode(repl, N.ComplexSelector)) {
|
|
281
|
+
parts.push(...((repl as ComplexSelector).get('value') as unknown as Selector[]).map(x => x.copy(true) as Selector));
|
|
282
|
+
} else {
|
|
283
|
+
parts.push(repl);
|
|
284
|
+
}
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
const repl = materialize(part);
|
|
290
|
+
parts.push(repl);
|
|
291
|
+
}
|
|
292
|
+
return ComplexSelector.create(parts as ComplexSelectorComponent[]).inherit(node) as Selector;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
const value = (node as Selector & { value?: Selector[] }).value;
|
|
296
|
+
if (Array.isArray(value)) {
|
|
297
|
+
const cloned = node.copy(true) as Selector & { value?: Selector[] };
|
|
298
|
+
cloned.value = value.map(item => materialize(item as Selector));
|
|
299
|
+
return cloned as Selector;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return node.copy(true) as Selector;
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
return materialize(selector);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/** Document order for extend: prefer parse location startOffset (source order), else assigned map, else push order (length). */
|
|
309
|
+
function getDocumentOrderForExtend(rs: Ruleset | undefined, context: Context): number {
|
|
310
|
+
if (!rs) {
|
|
311
|
+
return context.extends.length;
|
|
312
|
+
}
|
|
313
|
+
const loc = (rs as Node).location;
|
|
314
|
+
const fromLoc = Array.isArray(loc) && loc.length >= 1 && typeof loc[0] === 'number' ? loc[0] : undefined;
|
|
315
|
+
if (fromLoc !== undefined) {
|
|
316
|
+
return fromLoc;
|
|
317
|
+
}
|
|
318
|
+
const fromMap = context.documentOrderByRuleset?.get(rs);
|
|
319
|
+
if (fromMap !== undefined) {
|
|
320
|
+
return fromMap;
|
|
321
|
+
}
|
|
322
|
+
return context.extends.length;
|
|
323
|
+
}
|
|
324
|
+
export const extend = defineType(Extend, 'Extend');
|
|
325
|
+
|
|
326
|
+
function resolveExtendSelectorInFrame(
|
|
327
|
+
selector: Selector,
|
|
328
|
+
hasExplicitSelector: boolean,
|
|
329
|
+
currentFrame: Node | undefined,
|
|
330
|
+
context: Context
|
|
331
|
+
): Selector {
|
|
332
|
+
if (!currentFrame || !isNode(currentFrame, N.Ruleset)) {
|
|
333
|
+
return selector;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const rs = currentFrame as Ruleset;
|
|
337
|
+
const fullSel = rs.getEffectiveSelector(false, context);
|
|
338
|
+
let resolvedSel = selector;
|
|
339
|
+
let usedParentListComposition = false;
|
|
340
|
+
|
|
341
|
+
if (!hasExplicitSelector) {
|
|
342
|
+
const ownSel = rs.getOwnSelector(context);
|
|
343
|
+
const parentFrame = context.rulesetFrames.at(-2);
|
|
344
|
+
const parentSel = (
|
|
345
|
+
parentFrame && isNode(parentFrame, N.Ruleset)
|
|
346
|
+
? (parentFrame as Ruleset).getEffectiveSelector(false, context)
|
|
347
|
+
: undefined
|
|
348
|
+
);
|
|
349
|
+
if (
|
|
350
|
+
ownSel
|
|
351
|
+
&& parentSel
|
|
352
|
+
&& !(parentSel instanceof Nil)
|
|
353
|
+
&& isNode(parentSel, N.SelectorList)
|
|
354
|
+
) {
|
|
355
|
+
resolvedSel = ComplexSelector.create([
|
|
356
|
+
wrapParentSelectorForNestedContext(parentSel as Selector),
|
|
357
|
+
Combinator.create(' '),
|
|
358
|
+
ownSel.copy(true) as Selector
|
|
359
|
+
] as unknown as ComplexSelectorComponent[]) as unknown as Selector;
|
|
360
|
+
usedParentListComposition = true;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if (!hasExplicitSelector && !usedParentListComposition) {
|
|
365
|
+
if (fullSel && !(fullSel instanceof Nil)) {
|
|
366
|
+
return fullSel as Selector;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
const parentSel = rs.getEffectiveSelector(false, context);
|
|
370
|
+
if (parentSel && !(parentSel instanceof Nil) && resolvedSel.valueOf() !== (parentSel as Selector).valueOf()) {
|
|
371
|
+
return ComplexSelector.create([
|
|
372
|
+
(parentSel as Selector).copy(true),
|
|
373
|
+
Combinator.create(' '),
|
|
374
|
+
resolvedSel.copy(true)
|
|
375
|
+
]) as unknown as Selector;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return resolvedSel;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
if (
|
|
382
|
+
hasExplicitSelector
|
|
383
|
+
&& selectorHasAuthoredAmpersand(resolvedSel)
|
|
384
|
+
&& fullSel
|
|
385
|
+
&& !(fullSel instanceof Nil)
|
|
386
|
+
) {
|
|
387
|
+
return getImplicitSelector(resolvedSel, fullSel as Selector, false);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return resolvedSel;
|
|
391
|
+
}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { type Context } from '../context.js';
|
|
2
|
+
import { defineType, F_VISIBLE, Node, type LocationInfo, type OptionalLocation, type TreeContext } from './node.js';
|
|
3
|
+
import type { Any, AnyRole } from './any.js';
|
|
4
|
+
import { Any as AnyCtor } from './any.js';
|
|
5
|
+
import { Interpolated } from './interpolated.js';
|
|
6
|
+
import { Rules } from './rules.js';
|
|
7
|
+
import { type List, list } from './list.js';
|
|
8
|
+
import type { Declaration } from './declaration.js';
|
|
9
|
+
import type { VarDeclaration } from './declaration-var.js';
|
|
10
|
+
import { VarDeclaration as VarDeclarationCtor } from './declaration-var.js';
|
|
11
|
+
import { Nil } from './nil.js';
|
|
12
|
+
import { N } from './node-type.js';
|
|
13
|
+
import { isNode } from './util/is-node.js';
|
|
14
|
+
import { type PrintOptions, getPrintOptions } from './util/print.js';
|
|
15
|
+
import { getParent, getSourceParent, setChildren } from './util/field-helpers.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Stylesheet-defined function with a return value.
|
|
19
|
+
* Called `Func` to avoid conflict with the built-in `Function` class.
|
|
20
|
+
*
|
|
21
|
+
* Parsed by Sass/Jess-like languages (e.g. SCSS `@function`).
|
|
22
|
+
*
|
|
23
|
+
* Evaluation model:
|
|
24
|
+
* - Evaluate the function body in an isolated scope (like mixins) with bound params.
|
|
25
|
+
* - Then look up a declaration by name (default: `return`) and return its value.
|
|
26
|
+
*/
|
|
27
|
+
export type FuncValue<Name extends AnyRole = 'name'> = {
|
|
28
|
+
name?: Any<Name> | Interpolated<Name>;
|
|
29
|
+
params?: List<Node>;
|
|
30
|
+
body: Node;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type FuncOptions = {
|
|
34
|
+
/**
|
|
35
|
+
* Declaration name to look up after evaluating the body.
|
|
36
|
+
* Defaults to `'return'` (a `return: <expr>;` declaration).
|
|
37
|
+
*/
|
|
38
|
+
returnName?: string;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export type FuncChildData = {
|
|
42
|
+
name: FuncValue['name'];
|
|
43
|
+
params: FuncValue['params'];
|
|
44
|
+
body: Node;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export interface Func extends Node<FuncValue, FuncOptions, FuncChildData> {
|
|
48
|
+
type: 'Func';
|
|
49
|
+
shortType: 'fn';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export class Func extends Node<FuncValue, FuncOptions, FuncChildData> {
|
|
53
|
+
static override childKeys = ['name', 'params', 'body'] as const;
|
|
54
|
+
|
|
55
|
+
name: FuncValue['name'];
|
|
56
|
+
params: FuncValue['params'];
|
|
57
|
+
body!: Node;
|
|
58
|
+
|
|
59
|
+
constructor(value: FuncValue, options?: FuncOptions, location?: OptionalLocation, treeContext?: TreeContext) {
|
|
60
|
+
super(value, options, location, treeContext);
|
|
61
|
+
this.name = value.name;
|
|
62
|
+
this.params = value.params;
|
|
63
|
+
this.body = value.body;
|
|
64
|
+
if (this.name instanceof Node) {
|
|
65
|
+
this.adopt(this.name);
|
|
66
|
+
}
|
|
67
|
+
if (this.params instanceof Node) {
|
|
68
|
+
this.adopt(this.params);
|
|
69
|
+
}
|
|
70
|
+
if (this.body instanceof Node) {
|
|
71
|
+
this.adopt(this.body);
|
|
72
|
+
}
|
|
73
|
+
this.removeFlag(F_VISIBLE);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
get nameKey(): string | undefined {
|
|
77
|
+
return this.getNameKey();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
getNameKey(context?: Context): string | undefined {
|
|
81
|
+
const name = this.get('name', context);
|
|
82
|
+
if (!name) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
return String(name.valueOf());
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
override toTrimmedString(options?: PrintOptions): string {
|
|
89
|
+
options = getPrintOptions(options);
|
|
90
|
+
const w = options.writer!;
|
|
91
|
+
const mark = w.mark();
|
|
92
|
+
const context = options.context;
|
|
93
|
+
const name = this.get('name', context);
|
|
94
|
+
const params = this.get('params', context);
|
|
95
|
+
const body = this.get('body', context);
|
|
96
|
+
|
|
97
|
+
w.add('$function', this);
|
|
98
|
+
w.add(' ');
|
|
99
|
+
w.add(name ? `${name}` : '@', this);
|
|
100
|
+
w.add('(');
|
|
101
|
+
if (params) {
|
|
102
|
+
params.toString(options);
|
|
103
|
+
}
|
|
104
|
+
w.add(') ');
|
|
105
|
+
|
|
106
|
+
// Body is always emitted as braced rules. If it's not a Rules node already, wrap it.
|
|
107
|
+
const bodyRules = body instanceof Rules ? body : Rules.create([body]);
|
|
108
|
+
bodyRules.toBraced(options);
|
|
109
|
+
|
|
110
|
+
return w.getSince(mark);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Execute the function and return its looked-up value.
|
|
115
|
+
*
|
|
116
|
+
* Functions follow the same scoped-body model as simple mixins:
|
|
117
|
+
* bind args into an ephemeral param scope, evaluate one render-keyed body
|
|
118
|
+
* wrapper, then read the return declaration from that evaluated scope.
|
|
119
|
+
*/
|
|
120
|
+
async evalCall(context: Context, args: List<Node> = list([]), _contentNode?: Node): Promise<Node> {
|
|
121
|
+
const returnName = this.options?.returnName ?? 'return';
|
|
122
|
+
const name = this.get('name', context);
|
|
123
|
+
const params = this.get('params', context);
|
|
124
|
+
const bodyNode = this.get('body', context);
|
|
125
|
+
const renderKey = context.nextRenderKey();
|
|
126
|
+
const invocationParent = context.caller
|
|
127
|
+
? getParent(context.caller, context) ?? context.rulesContext
|
|
128
|
+
: context.rulesContext ?? getParent(this, context);
|
|
129
|
+
const callerSourceNode = context.caller && isNode(context.caller, N.Call) && context.caller.get('name') instanceof Node
|
|
130
|
+
? context.caller.get('name')
|
|
131
|
+
: context.caller;
|
|
132
|
+
const sourceParent = callerSourceNode
|
|
133
|
+
? getSourceParent(callerSourceNode as Node, context)
|
|
134
|
+
: getSourceParent(this, context);
|
|
135
|
+
const scope = this._createInvocationScope(params, args, renderKey, invocationParent, context);
|
|
136
|
+
const bodyRules = this._createInvocationBodyRules(bodyNode, renderKey, scope ?? invocationParent, sourceParent, context);
|
|
137
|
+
|
|
138
|
+
const previousRulesContext = context.rulesContext;
|
|
139
|
+
const previousLookupScope = context.lookupScope;
|
|
140
|
+
const previousRenderKey = context.renderKey;
|
|
141
|
+
context.rulesContext = scope ?? bodyRules;
|
|
142
|
+
context.lookupScope = scope ?? bodyRules;
|
|
143
|
+
context.renderKey = renderKey;
|
|
144
|
+
let evaluated: Rules;
|
|
145
|
+
try {
|
|
146
|
+
evaluated = await bodyRules.eval(context);
|
|
147
|
+
} finally {
|
|
148
|
+
context.rulesContext = previousRulesContext;
|
|
149
|
+
context.lookupScope = previousLookupScope;
|
|
150
|
+
context.renderKey = previousRenderKey;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (!(evaluated instanceof Rules)) {
|
|
154
|
+
throw new Error(`Function ${String(name?.valueOf() ?? '<anonymous>')} must evaluate to rules`);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const returnLookupOptions = { searchParents: false, context };
|
|
158
|
+
const decl = evaluated.find('declaration', returnName, 'Declaration', returnLookupOptions) as Declaration | undefined
|
|
159
|
+
?? evaluated.find('declaration', returnName, 'VarDeclaration', returnLookupOptions) as VarDeclaration | undefined;
|
|
160
|
+
if (!decl) {
|
|
161
|
+
throw new Error(`Function ${String(name?.valueOf() ?? '<anonymous>')} must return a value (missing "${returnName}: ...")`);
|
|
162
|
+
}
|
|
163
|
+
context.rulesContext = scope ?? evaluated;
|
|
164
|
+
context.lookupScope = scope ?? evaluated;
|
|
165
|
+
context.renderKey = evaluated.renderKey;
|
|
166
|
+
try {
|
|
167
|
+
const returnValue = (decl as Declaration).get('value', context);
|
|
168
|
+
return await returnValue.eval(context);
|
|
169
|
+
} finally {
|
|
170
|
+
context.rulesContext = previousRulesContext;
|
|
171
|
+
context.lookupScope = previousLookupScope;
|
|
172
|
+
context.renderKey = previousRenderKey;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
private _createInvocationScope(
|
|
177
|
+
params: List<Node> | undefined,
|
|
178
|
+
args: List<Node>,
|
|
179
|
+
renderKey: symbol,
|
|
180
|
+
parent: Node | undefined,
|
|
181
|
+
context: Context
|
|
182
|
+
): Rules | undefined {
|
|
183
|
+
if (!params) {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
const scope = Rules.create([], {
|
|
187
|
+
rulesVisibility: {
|
|
188
|
+
Ruleset: 'public',
|
|
189
|
+
Declaration: 'public',
|
|
190
|
+
VarDeclaration: 'public',
|
|
191
|
+
Mixin: 'public'
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
scope.renderKey = renderKey;
|
|
195
|
+
scope.parent = parent;
|
|
196
|
+
|
|
197
|
+
const invocationContext = {
|
|
198
|
+
...context,
|
|
199
|
+
renderKey,
|
|
200
|
+
rulesContext: scope,
|
|
201
|
+
lookupScope: scope
|
|
202
|
+
};
|
|
203
|
+
const argItems = args.get('value', context);
|
|
204
|
+
const paramItems = params.get('value', context);
|
|
205
|
+
|
|
206
|
+
for (let i = 0; i < paramItems.length; i++) {
|
|
207
|
+
const param = paramItems[i]!;
|
|
208
|
+
if (!isNode(param, N.VarDeclaration)) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
const boundParam = new VarDeclarationCtor({
|
|
212
|
+
name: new AnyCtor(String(param.get('name', context).valueOf()), { role: 'property' }),
|
|
213
|
+
value: new Nil()
|
|
214
|
+
}, { ...(param.options ?? {}), paramVar: true }, param.location, this.treeContext);
|
|
215
|
+
boundParam.index = param.index ?? -(i + 1);
|
|
216
|
+
scope.push(boundParam);
|
|
217
|
+
|
|
218
|
+
const boundValue = argItems[i] ?? param.get('value', context);
|
|
219
|
+
if (boundValue) {
|
|
220
|
+
boundParam.setCurrentValue(boundValue, invocationContext);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return scope;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
private _createInvocationBodyRules(
|
|
228
|
+
bodyNode: Node,
|
|
229
|
+
renderKey: symbol,
|
|
230
|
+
parent: Node | undefined,
|
|
231
|
+
sourceParent: Node | undefined,
|
|
232
|
+
context: Context
|
|
233
|
+
): Rules {
|
|
234
|
+
let bodyRules: Rules;
|
|
235
|
+
if (bodyNode instanceof Rules) {
|
|
236
|
+
bodyRules = bodyNode.createShallowBodyWrapper(undefined, renderKey);
|
|
237
|
+
} else {
|
|
238
|
+
bodyRules = Rules.create([], undefined, Array.isArray(this.location) && this.location.length === 6 ? (this.location as LocationInfo) : undefined, this.treeContext);
|
|
239
|
+
bodyRules.renderKey = renderKey;
|
|
240
|
+
setChildren(bodyRules, [bodyNode], { ...context, renderKey }, { markDirty: false });
|
|
241
|
+
}
|
|
242
|
+
bodyRules.parent = parent;
|
|
243
|
+
bodyRules.sourceParent = sourceParent;
|
|
244
|
+
bodyRules.index = this.index;
|
|
245
|
+
return bodyRules;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export const fn = defineType(Func, 'Func', 'fn') as (
|
|
250
|
+
value: FuncValue | { name?: string; params?: List<Node>; body: Node },
|
|
251
|
+
options?: FuncOptions,
|
|
252
|
+
location?: OptionalLocation,
|
|
253
|
+
treeContext?: TreeContext
|
|
254
|
+
) => Func;
|