@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
package/src/tree/call.ts
ADDED
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
import { CALLER, CANONICAL, Node, defineType, F_VISIBLE, F_NON_STATIC, F_MAY_ASYNC, type OptionalLocation, type TreeContext } from './node.js';
|
|
2
|
+
import { type Context } from '../context.js';
|
|
3
|
+
import { isNode } from './util/is-node.js';
|
|
4
|
+
import { N } from './node-type.js';
|
|
5
|
+
import { cast } from './util/cast.js';
|
|
6
|
+
import { callWithContext } from '../define-function.js';
|
|
7
|
+
import { type PrintOptions, getPrintOptions } from './util/print.js';
|
|
8
|
+
import { Paren } from './paren.js';
|
|
9
|
+
import { isThenable } from '@jesscss/awaitable-pipe';
|
|
10
|
+
import { evalMixinDirect, type MixinEntry, type Rules } from './rules.js';
|
|
11
|
+
import { Any } from './any.js';
|
|
12
|
+
import { List, list } from './list.js';
|
|
13
|
+
import { getParent, mergeDependencies, setDependency, setParent, setSourceParent } from './util/field-helpers.js';
|
|
14
|
+
import { finalizeInvocationOutputRules } from './util/mixin-instance-primitives.js';
|
|
15
|
+
import { addParentEdge } from './util/cursor.js';
|
|
16
|
+
|
|
17
|
+
export type CallValue = {
|
|
18
|
+
/**
|
|
19
|
+
* Can be an identifier or something like a mixin or variable lookup
|
|
20
|
+
* e.g. $|#mixin|.class() is -> [Call name: [Ref (#mixin.class)], args: []]
|
|
21
|
+
*/
|
|
22
|
+
name: string | Node;
|
|
23
|
+
args?: List<Node>;
|
|
24
|
+
/**
|
|
25
|
+
* Optional content node, used for passing blocks to mixins/functions.
|
|
26
|
+
* This is how Jess represents "call with content block" forms like:
|
|
27
|
+
* $ > foo(): @{ ... }
|
|
28
|
+
* or:
|
|
29
|
+
* $ > foo(): @($x) { ... }
|
|
30
|
+
*/
|
|
31
|
+
contentNode?: Node;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type CallOptions = {
|
|
35
|
+
/**
|
|
36
|
+
* Legacy Less feature -- if a ruleset is returned,
|
|
37
|
+
* all the properties can be marked as important.
|
|
38
|
+
*/
|
|
39
|
+
markImportant?: boolean;
|
|
40
|
+
silentFail?: boolean;
|
|
41
|
+
/** Parser-provided hint for modern color-call syntax (space/slash form). */
|
|
42
|
+
modernSyntax?: boolean;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* This is an exported type that allows extra properties
|
|
47
|
+
* and specifies the shape of `this` for a function call.
|
|
48
|
+
*/
|
|
49
|
+
export type ExtendedFn<T extends any[] = any[], R = any> = ((this: Context, ...args: T) => R) & {
|
|
50
|
+
/**
|
|
51
|
+
* Allow for optional calling, which means an optional
|
|
52
|
+
* reference to a function will output a stringified
|
|
53
|
+
* function representation if there's an evaluation error.
|
|
54
|
+
*
|
|
55
|
+
* This is done for Less, which sets this for functions
|
|
56
|
+
* that have a CSS equivalent.
|
|
57
|
+
*/
|
|
58
|
+
allowOptional?: boolean;
|
|
59
|
+
evalArgs?: boolean;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @note In Less, the ref for something like `rgb`
|
|
64
|
+
* is not a string, but is an (optional) variable reference.
|
|
65
|
+
*/
|
|
66
|
+
export type CallChildData = { name: string | Node; args: List<Node> | undefined; contentNode: Node | undefined };
|
|
67
|
+
|
|
68
|
+
export interface Call {
|
|
69
|
+
type: 'Call';
|
|
70
|
+
shortType: 'call';
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export class Call extends Node<CallValue, CallOptions, CallChildData> {
|
|
74
|
+
static override childKeys = ['name', 'args', 'contentNode'] as const;
|
|
75
|
+
|
|
76
|
+
name!: string | Node;
|
|
77
|
+
args: List<Node> | undefined;
|
|
78
|
+
contentNode: Node | undefined;
|
|
79
|
+
|
|
80
|
+
override clone(deep?: boolean, cloneFn?: (n: Node) => Node, ctx?: Context): this {
|
|
81
|
+
const name = this.get('name', ctx);
|
|
82
|
+
const args = this.get('args', ctx);
|
|
83
|
+
const contentNode = this.get('contentNode', ctx);
|
|
84
|
+
const cloneData: CallValue = {
|
|
85
|
+
name: deep && name instanceof Node ? name.clone(deep, cloneFn, ctx) : name,
|
|
86
|
+
args: deep && args instanceof Node ? args.clone(deep, cloneFn, ctx) : args,
|
|
87
|
+
contentNode: deep && contentNode instanceof Node ? contentNode.clone(deep, cloneFn, ctx) : contentNode
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
let priorChildParents: Array<[Node, Node | undefined]> | undefined;
|
|
91
|
+
if (!deep) {
|
|
92
|
+
priorChildParents = [];
|
|
93
|
+
if (cloneData.name instanceof Node) {
|
|
94
|
+
priorChildParents.push([cloneData.name, cloneData.name.parent]);
|
|
95
|
+
}
|
|
96
|
+
if (cloneData.args instanceof Node) {
|
|
97
|
+
priorChildParents.push([cloneData.args, cloneData.args.parent]);
|
|
98
|
+
}
|
|
99
|
+
if (cloneData.contentNode instanceof Node) {
|
|
100
|
+
priorChildParents.push([cloneData.contentNode, cloneData.contentNode.parent]);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const options = this._meta?.options;
|
|
105
|
+
const newNode: this = Reflect.construct(this.constructor, [
|
|
106
|
+
cloneData,
|
|
107
|
+
options ? { ...options } : undefined,
|
|
108
|
+
this.location,
|
|
109
|
+
this.treeContext
|
|
110
|
+
]);
|
|
111
|
+
|
|
112
|
+
if (priorChildParents) {
|
|
113
|
+
for (const [child, priorParent] of priorChildParents) {
|
|
114
|
+
if (ctx) {
|
|
115
|
+
setParent(child, newNode, ctx);
|
|
116
|
+
}
|
|
117
|
+
Reflect.set(child, 'parent', priorParent);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
newNode.inherit(this);
|
|
122
|
+
return newNode;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
constructor(value: CallValue, options?: CallOptions, location?: OptionalLocation, treeContext?: TreeContext) {
|
|
126
|
+
super(value, options, location, treeContext);
|
|
127
|
+
this.name = value.name;
|
|
128
|
+
this.args = value.args;
|
|
129
|
+
this.contentNode = value.contentNode;
|
|
130
|
+
if (this.name instanceof Node) {
|
|
131
|
+
this.adopt(this.name);
|
|
132
|
+
}
|
|
133
|
+
if (this.args instanceof Node) {
|
|
134
|
+
this.adopt(this.args);
|
|
135
|
+
}
|
|
136
|
+
if (this.contentNode instanceof Node) {
|
|
137
|
+
this.adopt(this.contentNode);
|
|
138
|
+
}
|
|
139
|
+
this.requiredSemi = true;
|
|
140
|
+
// Function calls are always non-static and may be async
|
|
141
|
+
this.addFlags(F_VISIBLE, F_NON_STATIC, F_MAY_ASYNC);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private _serializeCallArg(node: Node, options: PrintOptions): string {
|
|
145
|
+
const context = options.context;
|
|
146
|
+
if (isNode(node, N.Sequence)) {
|
|
147
|
+
const children = node.get('value', context);
|
|
148
|
+
const isQuotedConcatSequence = (
|
|
149
|
+
children.some(child => isNode(child, N.Quoted))
|
|
150
|
+
&& children.every(child => isNode(child, N.Quoted | N.Any | N.Interpolated))
|
|
151
|
+
);
|
|
152
|
+
return children
|
|
153
|
+
.map(child => this._serializeCallArg(child, options).replace(/^[ \t\r\f]+|[ \t\r\f]+$/g, ''))
|
|
154
|
+
.join(isQuotedConcatSequence ? '' : ' ');
|
|
155
|
+
}
|
|
156
|
+
if (isNode(node, N.List)) {
|
|
157
|
+
const sep = node.options?.sep ?? ',';
|
|
158
|
+
const joiner = sep === '/' ? ' / ' : `${sep} `;
|
|
159
|
+
return node.get('value', context)
|
|
160
|
+
.map(child => this._serializeCallArg(child, options).replace(/^[ \t\r\f]+|[ \t\r\f]+$/g, ''))
|
|
161
|
+
.join(joiner);
|
|
162
|
+
}
|
|
163
|
+
return options.writer!.capture(() => node.toString(options))
|
|
164
|
+
.replace(/^[ \t\r\f]+|[ \t\r\f]+$/g, '');
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
override toTrimmedString(options?: PrintOptions) {
|
|
168
|
+
options = getPrintOptions(options);
|
|
169
|
+
const w = options.writer!;
|
|
170
|
+
const mark = w.mark();
|
|
171
|
+
const context = options.context;
|
|
172
|
+
const { silentFail, markImportant } = this.options ?? {};
|
|
173
|
+
const name = this.get('name', context);
|
|
174
|
+
const args = this.get('args', context);
|
|
175
|
+
const contentNode = this.get('contentNode', context);
|
|
176
|
+
if (typeof name === 'string') {
|
|
177
|
+
w.add(name, this);
|
|
178
|
+
} else {
|
|
179
|
+
name.toString(options);
|
|
180
|
+
}
|
|
181
|
+
if (silentFail) {
|
|
182
|
+
w.add('?');
|
|
183
|
+
}
|
|
184
|
+
w.add('(');
|
|
185
|
+
if (args) {
|
|
186
|
+
const normalizedArgs = args.get('value', context).filter(Boolean);
|
|
187
|
+
const last = normalizedArgs.length - 1;
|
|
188
|
+
for (let i = 0; i <= last; i++) {
|
|
189
|
+
const arg = normalizedArgs[i]!;
|
|
190
|
+
w.add(this._serializeCallArg(arg, options), arg);
|
|
191
|
+
if (i < last) {
|
|
192
|
+
w.add(', ');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
w.add(')');
|
|
197
|
+
if (markImportant) {
|
|
198
|
+
w.add(' !important');
|
|
199
|
+
}
|
|
200
|
+
if (contentNode) {
|
|
201
|
+
w.add(': ');
|
|
202
|
+
contentNode.toString(options);
|
|
203
|
+
}
|
|
204
|
+
return w.getSince(mark);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Recursively makes declarations important */
|
|
208
|
+
makeImportant(rules: Rules, context?: Context): Rules {
|
|
209
|
+
const effectiveContext = (
|
|
210
|
+
context
|
|
211
|
+
&& rules.renderKey !== CANONICAL
|
|
212
|
+
&& context.renderKey !== rules.renderKey
|
|
213
|
+
)
|
|
214
|
+
? { ...context, renderKey: rules.renderKey }
|
|
215
|
+
: context;
|
|
216
|
+
const important: Any<'flag'> = new Any('!important', { role: 'flag' });
|
|
217
|
+
for (const rule of rules.get('value', effectiveContext)) {
|
|
218
|
+
if (isNode(rule, N.Declaration)) {
|
|
219
|
+
rule.setCurrentImportant(important, effectiveContext);
|
|
220
|
+
} else if (isNode(rule, N.Rules)) {
|
|
221
|
+
this.makeImportant(rule, effectiveContext);
|
|
222
|
+
} else if (isNode(rule, N.AtRule)) {
|
|
223
|
+
const nestedRules = rule.get('rules');
|
|
224
|
+
if (nestedRules) {
|
|
225
|
+
this.makeImportant(nestedRules, effectiveContext);
|
|
226
|
+
}
|
|
227
|
+
} else if (isNode(rule, N.Ruleset)) {
|
|
228
|
+
const nestedRules = rule.get('rules');
|
|
229
|
+
if (nestedRules) {
|
|
230
|
+
this.makeImportant(nestedRules, effectiveContext);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return rules;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** Come back and redo -- too hard to reason about as a MaybePromise */
|
|
238
|
+
override evalNode(context: Context): Promise<Node> {
|
|
239
|
+
return (async () => {
|
|
240
|
+
let name = this.get('name', context);
|
|
241
|
+
let args = this.get('args', context);
|
|
242
|
+
const callOptions = this.options ?? {};
|
|
243
|
+
let { markImportant } = callOptions;
|
|
244
|
+
const applyDependencyToResult = <T extends Node>(
|
|
245
|
+
result: T,
|
|
246
|
+
nodes?: readonly (Node | undefined)[]
|
|
247
|
+
): T => {
|
|
248
|
+
const dependency = mergeDependencies(
|
|
249
|
+
nodes ? [result, ...nodes] : [result],
|
|
250
|
+
context
|
|
251
|
+
);
|
|
252
|
+
if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
|
|
253
|
+
setDependency(result, {
|
|
254
|
+
dependsOn: new Set(dependency.dependsOn),
|
|
255
|
+
sourceExpr: this
|
|
256
|
+
}, context);
|
|
257
|
+
}
|
|
258
|
+
return result;
|
|
259
|
+
};
|
|
260
|
+
const adoptCallWhitespace = <T extends Node>(node: T): T => {
|
|
261
|
+
node.pre = this.pre;
|
|
262
|
+
node.post = this.post;
|
|
263
|
+
node.sourceParent ??= this;
|
|
264
|
+
return node;
|
|
265
|
+
};
|
|
266
|
+
const cloneLeafDownstreamResult = <T extends Node>(node: T): T => {
|
|
267
|
+
return node.clone();
|
|
268
|
+
};
|
|
269
|
+
const materializeDownstreamResult = <T extends Node>(node: T): T => {
|
|
270
|
+
if (node === node.sourceNode) {
|
|
271
|
+
const childKeys = Reflect.get(node.constructor, 'childKeys');
|
|
272
|
+
if (childKeys === null) {
|
|
273
|
+
return cloneLeafDownstreamResult(node);
|
|
274
|
+
}
|
|
275
|
+
return node;
|
|
276
|
+
}
|
|
277
|
+
return node;
|
|
278
|
+
};
|
|
279
|
+
const materializeStylesheetFunctionRulesBoundary = <T extends Node>(node: T): T => {
|
|
280
|
+
if (node === node.sourceNode && isNode(node, N.Rules)) {
|
|
281
|
+
return node.clone(false, undefined, context);
|
|
282
|
+
}
|
|
283
|
+
return materializeDownstreamResult(node);
|
|
284
|
+
};
|
|
285
|
+
const evalArgNodes = async (nodes?: List<Node>) => {
|
|
286
|
+
if (!nodes) {
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
const out: Node[] = [];
|
|
290
|
+
for (const node of nodes.get('value')) {
|
|
291
|
+
out.push(await node.eval(context));
|
|
292
|
+
}
|
|
293
|
+
return list(out, nodes.options);
|
|
294
|
+
};
|
|
295
|
+
const anchorCallArgNodes = (nodes?: List<Node>) => {
|
|
296
|
+
if (!nodes) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
for (const argNode of nodes.get('value')) {
|
|
300
|
+
// Anchor property refs and callback mixins to the call-site scope
|
|
301
|
+
// without cloning the arg tree.
|
|
302
|
+
if (isNode(argNode, N.Reference) && argNode.options?.type === 'property') {
|
|
303
|
+
setSourceParent(argNode, this, context);
|
|
304
|
+
} else if (isNode(argNode, N.Mixin)) {
|
|
305
|
+
setSourceParent(argNode, this, context);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
context.callStack.push(this);
|
|
311
|
+
context.parenFrames.push(false);
|
|
312
|
+
|
|
313
|
+
if (process.env.JESS_DEBUG_LOCK === 'throw-call') {
|
|
314
|
+
const rawName = String(name?.valueOf?.() ?? '');
|
|
315
|
+
if (rawName.includes('.inner-locked-mixin')) {
|
|
316
|
+
throw new Error(`[lock-call:raw] ${JSON.stringify({
|
|
317
|
+
rawName,
|
|
318
|
+
parent: this.parent?.type,
|
|
319
|
+
sourceParent: this.sourceParent?.type,
|
|
320
|
+
renderKey: String(this.renderKey),
|
|
321
|
+
rulesContext: context.rulesContext?.type,
|
|
322
|
+
lookupScope: context.lookupScope?.type
|
|
323
|
+
})}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
let n = typeof name === 'string' ? name : await name.eval(context);
|
|
327
|
+
const debugRawKey = isNode(name, N.Reference)
|
|
328
|
+
? String(name.key?.valueOf?.() ?? '')
|
|
329
|
+
: '';
|
|
330
|
+
if (process.env.JESS_DEBUG_LOCK === 'log-call' && debugRawKey.includes('inner-locked-mixin')) {
|
|
331
|
+
console.log('[lock-call]', {
|
|
332
|
+
debugRawKey,
|
|
333
|
+
resolvedType: Array.isArray(n) ? 'array' : n?.type ?? typeof n,
|
|
334
|
+
resolvedName: typeof n === 'string' ? n : n?.valueOf?.(),
|
|
335
|
+
parent: this.parent?.type,
|
|
336
|
+
sourceParent: this.sourceParent?.type,
|
|
337
|
+
rulesContext: context.rulesContext?.type,
|
|
338
|
+
lookupScope: context.lookupScope?.type
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
if (process.env.JESS_DEBUG_LOCK === 'throw-call-resolved') {
|
|
342
|
+
const resolvedName = String(n?.valueOf?.() ?? '');
|
|
343
|
+
const rawName = String(name?.valueOf?.() ?? '');
|
|
344
|
+
if (rawName.includes('.inner-locked-mixin') || resolvedName.includes('.inner-locked-mixin')) {
|
|
345
|
+
throw new Error(`[lock-call:resolved] ${JSON.stringify({
|
|
346
|
+
rawName,
|
|
347
|
+
resolvedName,
|
|
348
|
+
resolvedType: Array.isArray(n) ? 'array' : n?.type,
|
|
349
|
+
parent: this.parent?.type,
|
|
350
|
+
sourceParent: this.sourceParent?.type,
|
|
351
|
+
renderKey: String(this.renderKey),
|
|
352
|
+
rulesContext: context.rulesContext?.type,
|
|
353
|
+
lookupScope: context.lookupScope?.type
|
|
354
|
+
})}`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Resolve mixin reference only at call time (same as variable refs: evaluate when used, not when stored).
|
|
358
|
+
if (isNode(n, N.Reference) && n.options?.type === 'mixin-ruleset') {
|
|
359
|
+
n = await n.eval(context);
|
|
360
|
+
}
|
|
361
|
+
// Note: Stylesheet-defined functions should be represented as a Reference(type='function')
|
|
362
|
+
// by parsers that support them. We intentionally avoid implicit string→function lookup here
|
|
363
|
+
// to prevent surprising behavior for plain CSS function-like calls.
|
|
364
|
+
// If the evaluated name is a Call node, execute it directly
|
|
365
|
+
// This handles cases like @alias: .something(foo); @alias();
|
|
366
|
+
if (isNode(n, N.Call)) {
|
|
367
|
+
// Execute the inner Call node (it will handle its own callStack push/pop)
|
|
368
|
+
const result = materializeDownstreamResult(await n.eval(context));
|
|
369
|
+
// Apply markImportant if needed
|
|
370
|
+
if (markImportant && isNode(result, N.Rules)) {
|
|
371
|
+
this.makeImportant(result, context);
|
|
372
|
+
}
|
|
373
|
+
// Always pop the outer call's stack entries
|
|
374
|
+
context.callStack.pop();
|
|
375
|
+
context.parenFrames.pop();
|
|
376
|
+
return adoptCallWhitespace(result);
|
|
377
|
+
} else if (isNode(n, N.Mixin) || isNode(n, N.Ruleset) || Array.isArray(n)) {
|
|
378
|
+
// Direct mixin invocation — skip getFunctionFromMixins/callWithContext wrapper
|
|
379
|
+
const originalCaller = context.caller;
|
|
380
|
+
context.caller = this;
|
|
381
|
+
try {
|
|
382
|
+
const result = await evalMixinDirect(context, n as MixinEntry | MixinEntry[], args);
|
|
383
|
+
if (process.env.JESS_DEBUG_LOCK === 'throw-nil-call' && debugRawKey.includes('inner-locked-mixin') && isNode(result, N.Nil)) {
|
|
384
|
+
throw new Error(`[lock-call:direct-nil] ${JSON.stringify({
|
|
385
|
+
debugRawKey,
|
|
386
|
+
resolvedType: Array.isArray(n) ? 'array' : n?.type,
|
|
387
|
+
parent: this.parent?.type,
|
|
388
|
+
sourceParent: this.sourceParent?.type,
|
|
389
|
+
rulesContext: context.rulesContext?.type,
|
|
390
|
+
lookupScope: context.lookupScope?.type
|
|
391
|
+
})}`);
|
|
392
|
+
}
|
|
393
|
+
// Result is already fully evaluated by the dispatch primitives — no re-eval.
|
|
394
|
+
if (markImportant && isNode(result, N.Rules)) {
|
|
395
|
+
this.makeImportant(result, context);
|
|
396
|
+
}
|
|
397
|
+
context.callStack.pop();
|
|
398
|
+
context.parenFrames.pop();
|
|
399
|
+
return adoptCallWhitespace(result);
|
|
400
|
+
} finally {
|
|
401
|
+
context.caller = originalCaller;
|
|
402
|
+
}
|
|
403
|
+
} else if (isNode(n, N.Func)) {
|
|
404
|
+
// Execute stylesheet-defined functions via their evalCall behavior.
|
|
405
|
+
const argNodes = await evalArgNodes(args) ?? list([]);
|
|
406
|
+
const contentNode = this.get('contentNode', context);
|
|
407
|
+
const originalCaller = context.caller;
|
|
408
|
+
context.caller = this;
|
|
409
|
+
try {
|
|
410
|
+
const result = await n.evalCall(context, argNodes, contentNode);
|
|
411
|
+
if (process.env.JESS_DEBUG_LOCK === 'throw-nil-call' && debugRawKey.includes('inner-locked-mixin') && isNode(result, N.Nil)) {
|
|
412
|
+
throw new Error(`[lock-call:func-nil] ${JSON.stringify({
|
|
413
|
+
debugRawKey,
|
|
414
|
+
resolvedType: n.type,
|
|
415
|
+
parent: this.parent?.type,
|
|
416
|
+
sourceParent: this.sourceParent?.type,
|
|
417
|
+
rulesContext: context.rulesContext?.type,
|
|
418
|
+
lookupScope: context.lookupScope?.type
|
|
419
|
+
})}`);
|
|
420
|
+
}
|
|
421
|
+
context.callStack.pop();
|
|
422
|
+
context.parenFrames.pop();
|
|
423
|
+
return applyDependencyToResult(
|
|
424
|
+
adoptCallWhitespace(materializeStylesheetFunctionRulesBoundary(result)),
|
|
425
|
+
argNodes.get('value')
|
|
426
|
+
);
|
|
427
|
+
} finally {
|
|
428
|
+
context.caller = originalCaller;
|
|
429
|
+
}
|
|
430
|
+
} else if (isNode(n, N.Collection)) {
|
|
431
|
+
// If the evaluated name is Rules or Collection (detached rulesets),
|
|
432
|
+
// return those rules directly, but only if args are empty
|
|
433
|
+
// If args are provided, throw an error - you can't call Rules/Collection with arguments
|
|
434
|
+
if (args && args.get('value').length > 0) {
|
|
435
|
+
context.callStack.pop();
|
|
436
|
+
context.parenFrames.pop();
|
|
437
|
+
throw new ReferenceError(`Cannot call ${n.type} with arguments`);
|
|
438
|
+
}
|
|
439
|
+
let rules: Rules = n.createPlacementWrapper(context, context.nextRenderKey());
|
|
440
|
+
const placementContext: Context = {
|
|
441
|
+
...context,
|
|
442
|
+
renderKey: rules.renderKey,
|
|
443
|
+
rulesContext: rules
|
|
444
|
+
};
|
|
445
|
+
// Detached-ruleset invocation keeps the definition-owned `.parent` /
|
|
446
|
+
// `.sourceParent` chain and exposes caller ancestry through an
|
|
447
|
+
// explicit secondary edge.
|
|
448
|
+
addParentEdge(rules, CALLER, this);
|
|
449
|
+
rules = await rules.eval(context);
|
|
450
|
+
finalizeInvocationOutputRules(rules, placementContext);
|
|
451
|
+
context.callStack.pop();
|
|
452
|
+
context.parenFrames.pop();
|
|
453
|
+
// Apply markImportant if needed
|
|
454
|
+
if (markImportant) {
|
|
455
|
+
this.makeImportant(rules, context);
|
|
456
|
+
}
|
|
457
|
+
return rules;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
let fn = isNode(n, N.JsFunction) ? n.value : n;
|
|
461
|
+
if (typeof fn === 'function') {
|
|
462
|
+
const originalCaller = context.caller;
|
|
463
|
+
context.caller = this;
|
|
464
|
+
let didPopCallStack = false;
|
|
465
|
+
try {
|
|
466
|
+
const fnOptions = Reflect.get(fn, 'options');
|
|
467
|
+
const hasParamMetadata = Boolean(fnOptions && Reflect.get(fnOptions, 'params'));
|
|
468
|
+
if (args) {
|
|
469
|
+
anchorCallArgNodes(args);
|
|
470
|
+
if (!hasParamMetadata) {
|
|
471
|
+
args = await evalArgNodes(args);
|
|
472
|
+
anchorCallArgNodes(args);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
const result = await (
|
|
476
|
+
args
|
|
477
|
+
? (
|
|
478
|
+
hasParamMetadata
|
|
479
|
+
? callWithContext(context, fn, args)
|
|
480
|
+
: callWithContext(context, fn, ...[...args.get('value')])
|
|
481
|
+
)
|
|
482
|
+
: callWithContext(context, fn)
|
|
483
|
+
);
|
|
484
|
+
if (process.env.JESS_DEBUG_LOCK === 'throw-nil-call' && debugRawKey.includes('inner-locked-mixin') && isNode(result, N.Nil)) {
|
|
485
|
+
throw new Error(`[lock-call:jsfn-nil] ${JSON.stringify({
|
|
486
|
+
debugRawKey,
|
|
487
|
+
resolvedType: typeof fn,
|
|
488
|
+
parent: this.parent?.type,
|
|
489
|
+
sourceParent: this.sourceParent?.type,
|
|
490
|
+
rulesContext: context.rulesContext?.type,
|
|
491
|
+
lookupScope: context.lookupScope?.type
|
|
492
|
+
})}`);
|
|
493
|
+
}
|
|
494
|
+
context.caller = originalCaller;
|
|
495
|
+
context.callStack.pop();
|
|
496
|
+
didPopCallStack = true;
|
|
497
|
+
if (isNode(result)) {
|
|
498
|
+
let evald = result.eval(context);
|
|
499
|
+
if (isThenable(evald)) {
|
|
500
|
+
evald = await evald;
|
|
501
|
+
}
|
|
502
|
+
if (process.env.JESS_DEBUG_LOCK === 'throw-nil-call' && debugRawKey.includes('inner-locked-mixin') && isNode(evald, N.Nil)) {
|
|
503
|
+
throw new Error(`[lock-call:jsfn-post-eval-nil] ${JSON.stringify({
|
|
504
|
+
debugRawKey,
|
|
505
|
+
resultType: result.type,
|
|
506
|
+
parent: this.parent?.type,
|
|
507
|
+
sourceParent: this.sourceParent?.type,
|
|
508
|
+
rulesContext: context.rulesContext?.type,
|
|
509
|
+
lookupScope: context.lookupScope?.type
|
|
510
|
+
})}`);
|
|
511
|
+
}
|
|
512
|
+
if (markImportant && isNode(evald, N.Rules)) {
|
|
513
|
+
this.makeImportant(evald, context);
|
|
514
|
+
}
|
|
515
|
+
return adoptCallWhitespace(evald);
|
|
516
|
+
}
|
|
517
|
+
let castResult = cast(result);
|
|
518
|
+
if (isNode(castResult, N.Rules) && castResult.value.length === 1) {
|
|
519
|
+
return adoptCallWhitespace(castResult.value[0]!);
|
|
520
|
+
}
|
|
521
|
+
return adoptCallWhitespace(castResult);
|
|
522
|
+
} catch (e) {
|
|
523
|
+
const unitMode = context?.opts?.unitMode ?? 'loose';
|
|
524
|
+
const shouldRethrowForMode = unitMode === 'strict';
|
|
525
|
+
if (e instanceof ReferenceError && e.message.includes('No matching mixins')) {
|
|
526
|
+
if (getParent(this, context)?.type === 'SelectorCapture') {
|
|
527
|
+
return adoptCallWhitespace(new Any(String(n.valueOf()), { role: 'ident' }).inherit(this));
|
|
528
|
+
}
|
|
529
|
+
if (isNode(name, N.Reference)) {
|
|
530
|
+
throw new ReferenceError(`No matching mixins found for '${name.get('key').valueOf()}'`);
|
|
531
|
+
}
|
|
532
|
+
throw e;
|
|
533
|
+
}
|
|
534
|
+
if (!callOptions.silentFail || shouldRethrowForMode) {
|
|
535
|
+
throw e;
|
|
536
|
+
}
|
|
537
|
+
let newCall = this.clone().inherit(this);
|
|
538
|
+
/** Remove this flag for serialization */
|
|
539
|
+
newCall.options.silentFail = false;
|
|
540
|
+
newCall.name = isNode(name, N.Reference) && name.options.fallbackValue === true
|
|
541
|
+
? String(name.get('key'))
|
|
542
|
+
: String(n.valueOf());
|
|
543
|
+
newCall.args = await evalArgNodes(args);
|
|
544
|
+
return applyDependencyToResult(adoptCallWhitespace(newCall), newCall.args?.get('value'));
|
|
545
|
+
} finally {
|
|
546
|
+
context.caller = originalCaller;
|
|
547
|
+
context.parenFrames.pop();
|
|
548
|
+
if (!didPopCallStack) {
|
|
549
|
+
context.callStack.pop();
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
} else {
|
|
553
|
+
if (n === 'calc') {
|
|
554
|
+
context.calcFrames++;
|
|
555
|
+
}
|
|
556
|
+
const evaluatedArgs = await evalArgNodes(args);
|
|
557
|
+
|
|
558
|
+
if (n === 'calc') {
|
|
559
|
+
context.calcFrames--;
|
|
560
|
+
}
|
|
561
|
+
context.parenFrames.pop();
|
|
562
|
+
context.callStack.pop();
|
|
563
|
+
const needsMaterializedClone = Boolean(callOptions.silentFail);
|
|
564
|
+
const node = needsMaterializedClone
|
|
565
|
+
? this.clone()
|
|
566
|
+
: this.clone();
|
|
567
|
+
node.options.silentFail = false;
|
|
568
|
+
if (
|
|
569
|
+
n === 'calc' && evaluatedArgs
|
|
570
|
+
) {
|
|
571
|
+
const evalArgItems = evaluatedArgs.get('value');
|
|
572
|
+
if (isNode(evalArgItems[0], N.Dimension)) {
|
|
573
|
+
return applyDependencyToResult(evalArgItems[0]!, evalArgItems);
|
|
574
|
+
} else if (context.calcFrames !== 0) {
|
|
575
|
+
return applyDependencyToResult(new Paren(evalArgItems[0]!), evalArgItems);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
node.name = n;
|
|
579
|
+
node.args = evaluatedArgs;
|
|
580
|
+
return applyDependencyToResult(adoptCallWhitespace(node), evaluatedArgs?.get('value'));
|
|
581
|
+
}
|
|
582
|
+
})().then(value => value);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
type Params = ConstructorParameters<typeof Call>;
|
|
587
|
+
|
|
588
|
+
export const call = defineType(Call, 'Call') as (
|
|
589
|
+
value: Params[0],
|
|
590
|
+
options?: Params[1],
|
|
591
|
+
location?: Params[2],
|
|
592
|
+
treeContext?: Params[3]
|
|
593
|
+
) => Call;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { MaybePromise } from 'awaitable-pipe/lib/utils';
|
|
2
|
+
import { defineType, type Node } from './node.js';
|
|
3
|
+
import { Rules } from './rules.js';
|
|
4
|
+
import { getPrintOptions, type PrintOptions } from './util/print.js';
|
|
5
|
+
import type { Context } from '../context.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A collection is essentially like an anonymous mixin,
|
|
9
|
+
* except that properties are arbitrary, so its intended
|
|
10
|
+
* for map data.
|
|
11
|
+
*
|
|
12
|
+
* Even though it doesn't allow everything that a regular set
|
|
13
|
+
* of rules does, we extend Rules just to make evaluation easier.
|
|
14
|
+
*
|
|
15
|
+
* Can be used like Sass property nesting.
|
|
16
|
+
* @see https://sass-lang.com/documentation/style-rules/declarations/#nesting
|
|
17
|
+
*/
|
|
18
|
+
export interface Collection {
|
|
19
|
+
type: 'Collection';
|
|
20
|
+
shortType: 'coll';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class Collection extends Rules {
|
|
24
|
+
override toTrimmedString(options?: PrintOptions) {
|
|
25
|
+
return this.toBraced(options);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Collection rules aren't evaluated by default. They're evaluated
|
|
30
|
+
* at access time OR if assigned to a property.
|
|
31
|
+
*/
|
|
32
|
+
override evalNode(context: Context): MaybePromise<this> {
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
override preEval(context: Context): this | Promise<this> {
|
|
37
|
+
if (this.preEvaluated) {
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
this.preEvaluated = true;
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
type Params = ConstructorParameters<typeof Collection>;
|
|
46
|
+
|
|
47
|
+
export const coll = defineType(Collection, 'Collection', 'coll') as (
|
|
48
|
+
value: Params[0],
|
|
49
|
+
options?: Params[1],
|
|
50
|
+
location?: Params[2],
|
|
51
|
+
treeContext?: Params[3]
|
|
52
|
+
) => Collection;
|