@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,742 @@
|
|
|
1
|
+
import type { Class } from 'type-fest';
|
|
2
|
+
import {
|
|
3
|
+
CANONICAL,
|
|
4
|
+
Node,
|
|
5
|
+
F_STATIC,
|
|
6
|
+
defineType,
|
|
7
|
+
type OptionalLocation,
|
|
8
|
+
type RenderKey,
|
|
9
|
+
type TreeContext
|
|
10
|
+
} from './node.js';
|
|
11
|
+
import { isNode } from './util/is-node.js';
|
|
12
|
+
import { Nil } from './nil.js';
|
|
13
|
+
import type { Context } from '../context.js';
|
|
14
|
+
import { Interpolated } from './interpolated.js';
|
|
15
|
+
import { Any, type AnyRole } from './any.js';
|
|
16
|
+
import { Reference } from './reference.js';
|
|
17
|
+
import { List } from './list.js';
|
|
18
|
+
import { Sequence, spaced } from './sequence.js';
|
|
19
|
+
import { Operation } from './operation.js';
|
|
20
|
+
import { N } from './node-type.js';
|
|
21
|
+
import { Collection } from './collection.js';
|
|
22
|
+
import { Rules } from './rules.js';
|
|
23
|
+
import { type PrintOptions, getPrintOptions } from './util/print.js';
|
|
24
|
+
import { type MaybePromise, pipe, isThenable } from '@jesscss/awaitable-pipe';
|
|
25
|
+
import {
|
|
26
|
+
getDependency,
|
|
27
|
+
getParent,
|
|
28
|
+
mergeDependencies,
|
|
29
|
+
setDependency
|
|
30
|
+
} from './util/field-helpers.js';
|
|
31
|
+
|
|
32
|
+
export const enum AssignmentType {
|
|
33
|
+
Default = ':',
|
|
34
|
+
Add = '+:', // similar to += in JS, but merges lists / sequences / collections
|
|
35
|
+
// Subtract = '-:', // math subtraction, like -= in JS
|
|
36
|
+
// Multiply = '*:', // math multiplication, like *= in JS
|
|
37
|
+
// Divide = '/:', // math division, like /= in JS
|
|
38
|
+
CondAssign = '?:', // similar to ??= in JS or !default in Sass
|
|
39
|
+
// CondAdd = '?+:', // add if defined, otherwise assign
|
|
40
|
+
// CondSubtract = '?-:', // subtract if defined, otherwise assign
|
|
41
|
+
// CondMultiply = '?*:', // multiply if defined, otherwise assign
|
|
42
|
+
// CondDivide = '?/:', // divide if defined, otherwise assign
|
|
43
|
+
|
|
44
|
+
/** Legacy Less flags */
|
|
45
|
+
MergeList = '&,:', // merge into a list if another prop exists with this flag
|
|
46
|
+
MergeSequence = '&_:' // merge into a sequence if another prop exists with this flag
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export type DeclarationOptions = {
|
|
50
|
+
assign?: AssignmentType;
|
|
51
|
+
/** Tracks that this declaration was created via assignment normalization (e.g. +:, +_:). */
|
|
52
|
+
normalizedFromAssign?: AssignmentType;
|
|
53
|
+
semi?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* This doesn't prevent shadowing; it prevents declarations like:
|
|
56
|
+
* ^$overwrite: foo;
|
|
57
|
+
*
|
|
58
|
+
* Written as `!$foo:` in Jess or imported from a readonly context
|
|
59
|
+
*/
|
|
60
|
+
readonly?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Instead of implicitly declaring or overriding,
|
|
63
|
+
* requires a variable to previously be explicitly
|
|
64
|
+
* declared within scope.
|
|
65
|
+
*
|
|
66
|
+
* Used by SCSS (!global) and Jess's (^$foo:)
|
|
67
|
+
*/
|
|
68
|
+
setDefined?: boolean;
|
|
69
|
+
|
|
70
|
+
/** Used by SCSS (!default) and Jess (?:) */
|
|
71
|
+
// setIfUndefined?: boolean
|
|
72
|
+
/**
|
|
73
|
+
* Throw if already defined in the immediate scope
|
|
74
|
+
* Will not throw if defined in a parent scope.
|
|
75
|
+
*
|
|
76
|
+
* Used by SCSS in the case of mixins... not Jess?
|
|
77
|
+
*/
|
|
78
|
+
throwIfDefined?: boolean;
|
|
79
|
+
};
|
|
80
|
+
/** Should be Any<'property'> | Interpolated<'property'> */
|
|
81
|
+
type NameValue<T extends AnyRole = 'property'> = Any<T> | Interpolated<T>;
|
|
82
|
+
|
|
83
|
+
export type DeclarationValue<T extends AnyRole = 'property'> = {
|
|
84
|
+
name: NameValue<T>;
|
|
85
|
+
value: Node;
|
|
86
|
+
/** The actual string representation of important, if it exists */
|
|
87
|
+
important?: Any<'flag'>;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* A continuous collection of nodes.
|
|
92
|
+
*
|
|
93
|
+
* Initially, the name can be a Node or string.
|
|
94
|
+
* Once evaluated, name must be a string
|
|
95
|
+
*/
|
|
96
|
+
export type DeclarationChildData = { name: NameValue; value: Node; important: Any<'flag'> | undefined };
|
|
97
|
+
|
|
98
|
+
export interface Declaration {
|
|
99
|
+
type: 'Declaration' | 'VarDeclaration';
|
|
100
|
+
shortType: 'decl' | 'vardecl';
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export class Declaration<Opts extends DeclarationOptions = DeclarationOptions> extends Node<DeclarationValue, Opts, DeclarationChildData> {
|
|
104
|
+
static override childKeys = ['name', 'value', 'important'] as const;
|
|
105
|
+
|
|
106
|
+
name!: NameValue;
|
|
107
|
+
value!: Node;
|
|
108
|
+
important: Any<'flag'> | undefined;
|
|
109
|
+
|
|
110
|
+
private _getAssignmentRenderKey(context?: Context): RenderKey | undefined {
|
|
111
|
+
return context?.renderKey
|
|
112
|
+
?? context?.rulesContext?.renderKey
|
|
113
|
+
?? (this.renderKey !== CANONICAL ? this.renderKey : undefined);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private _setFieldOverride<K extends keyof DeclarationChildData & ('name' | 'value' | 'important')>(
|
|
117
|
+
key: K,
|
|
118
|
+
value: DeclarationChildData[K],
|
|
119
|
+
context?: Context
|
|
120
|
+
): void {
|
|
121
|
+
const renderKey = this._getAssignmentRenderKey(context);
|
|
122
|
+
const effectiveContext = renderKey !== undefined && context?.renderKey !== renderKey
|
|
123
|
+
? { ...context, renderKey }
|
|
124
|
+
: context;
|
|
125
|
+
|
|
126
|
+
if (value instanceof Node) {
|
|
127
|
+
this.adopt(value, effectiveContext);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (renderKey !== undefined && renderKey !== CANONICAL && this.renderKey !== renderKey) {
|
|
131
|
+
const edgeKey = `${key}Edge` as const;
|
|
132
|
+
const edge = ((this as unknown as Record<string, unknown>)[edgeKey] as Map<RenderKey, DeclarationChildData[K]> | undefined)
|
|
133
|
+
?? new Map<RenderKey, DeclarationChildData[K]>();
|
|
134
|
+
edge.set(renderKey, value);
|
|
135
|
+
(this as unknown as Record<string, unknown>)[edgeKey] = edge;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (renderKey !== undefined && renderKey !== CANONICAL) {
|
|
140
|
+
const edgeKey = `${key}Edge` as const;
|
|
141
|
+
const edge = ((this as unknown as Record<string, unknown>)[edgeKey] as Map<RenderKey, DeclarationChildData[K]> | undefined);
|
|
142
|
+
if (edge?.delete(renderKey) && edge.size === 0) {
|
|
143
|
+
delete (this as unknown as Record<string, unknown>)[edgeKey];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
(this as unknown as Record<string, unknown>)[key] = value;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
constructor(value: DeclarationValue, options?: Opts, location?: OptionalLocation, treeContext?: TreeContext) {
|
|
151
|
+
super(value, options, location, treeContext);
|
|
152
|
+
this.name = value.name;
|
|
153
|
+
this.value = value.value;
|
|
154
|
+
this.important = value.important;
|
|
155
|
+
if (this.name instanceof Node) {
|
|
156
|
+
this.adopt(this.name);
|
|
157
|
+
}
|
|
158
|
+
if (this.value instanceof Node) {
|
|
159
|
+
this.adopt(this.value);
|
|
160
|
+
}
|
|
161
|
+
if (this.important instanceof Node) {
|
|
162
|
+
this.adopt(this.important);
|
|
163
|
+
}
|
|
164
|
+
this.allowRuleRoot = true;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** If the value has curly braces, a semi-colon is not required */
|
|
168
|
+
override get requiredSemi() {
|
|
169
|
+
return this.requiresSemi();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
requiresSemi(context?: Context): boolean {
|
|
173
|
+
const value = this.get('value', context);
|
|
174
|
+
return !isNode(value, N.Collection) && !isNode(value, N.Mixin);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
isCustomProperty(context?: Context): boolean {
|
|
178
|
+
return this.get('name', context).valueOf().startsWith('--');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
getCurrentValue(context?: Context): Node {
|
|
182
|
+
return this.get('value', context);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
setCurrentValue(value: Node, context?: Context): void {
|
|
186
|
+
this._setFieldOverride('value', value, context);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
getCurrentName(context?: Context): NameValue {
|
|
190
|
+
return this.get('name', context);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
setCurrentName(name: NameValue, context?: Context): void {
|
|
194
|
+
this._setFieldOverride('name', name, context);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
getCurrentImportant(context?: Context): Any<'flag'> | undefined {
|
|
198
|
+
return this.get('important', context);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
setCurrentImportant(important: Any<'flag'> | undefined, context?: Context): void {
|
|
202
|
+
this._setFieldOverride('important', important, context);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
protected declTrimmedString(options?: PrintOptions) {
|
|
206
|
+
options = getPrintOptions(options);
|
|
207
|
+
const w = options.writer!;
|
|
208
|
+
const context = options.context;
|
|
209
|
+
const name = this.get('name', context);
|
|
210
|
+
const value = this.get('value', context);
|
|
211
|
+
const important = this.get('important', context);
|
|
212
|
+
const declarationOptions = this.options;
|
|
213
|
+
const { assign = ':', setDefined } = declarationOptions ?? {};
|
|
214
|
+
const mark = w.mark();
|
|
215
|
+
// setDefined uses `:=` (with default spacing rules) instead of the historical `$^` prefix.
|
|
216
|
+
const effAssign = (setDefined && assign === ':') ? ':=' : assign;
|
|
217
|
+
let a = effAssign === ':' ? ':' : ` ${effAssign}`;
|
|
218
|
+
// Serialize the property name so attached comments survive, then trim only
|
|
219
|
+
// trailing whitespace before the assignment token.
|
|
220
|
+
const normalizedName = w.capture(() => name.toString(options)).replace(/\s+$/, '');
|
|
221
|
+
w.add(`${normalizedName}${a}`, name);
|
|
222
|
+
// Custom properties must preserve value text exactly as provided.
|
|
223
|
+
const isCustomProperty = this.isCustomProperty(context);
|
|
224
|
+
if (isCustomProperty) {
|
|
225
|
+
options.inCustom = true;
|
|
226
|
+
// Preserve custom value text, but normalize boundary artifacts:
|
|
227
|
+
// - if capture ended with a line break before declaration termination,
|
|
228
|
+
// drop that trailing line break so semicolon insertion stays inline.
|
|
229
|
+
// - if a block comment is directly adjacent to a token (e.g. `a/*...*/`),
|
|
230
|
+
// insert a single separator space for stable CSS output.
|
|
231
|
+
let customOut = w.capture(() => value.toString(options));
|
|
232
|
+
customOut = customOut.replace(/[ \t\r\f]*\n[ \t\r\f]*$/g, '');
|
|
233
|
+
customOut = customOut.replace(/([^\s])\/\*/g, '$1 /*');
|
|
234
|
+
w.add(customOut, value);
|
|
235
|
+
options.inCustom = false;
|
|
236
|
+
} else {
|
|
237
|
+
// Capture value output to normalize spacing after ':'
|
|
238
|
+
let valOut = '';
|
|
239
|
+
try {
|
|
240
|
+
valOut = w.capture(() => value.toString(options));
|
|
241
|
+
} catch (error: unknown) {
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
const startsOnNextLine = /^[ \t\r\f]*\n/.test(valOut);
|
|
245
|
+
const preserveLeadingMultilineValue = startsOnNextLine && /\n[\s\S]*\n/.test(valOut);
|
|
246
|
+
if (preserveLeadingMultilineValue) {
|
|
247
|
+
const normalizedValue = valOut.replace(/\s+$/g, '');
|
|
248
|
+
w.add(normalizedValue, value);
|
|
249
|
+
} else {
|
|
250
|
+
const normalizedValue = valOut.replace(/^\s+|\s+$/g, '');
|
|
251
|
+
// Ensure exactly one space after ':' by adding one space
|
|
252
|
+
w.add(' ');
|
|
253
|
+
w.add(normalizedValue, value);
|
|
254
|
+
}
|
|
255
|
+
if (!isNode(value, N.Collection)) {
|
|
256
|
+
if (important) {
|
|
257
|
+
let imp = w.capture(() => important.toString(options));
|
|
258
|
+
imp = imp.replace(/\s+$/g, '');
|
|
259
|
+
|
|
260
|
+
if (important.pre === 0) {
|
|
261
|
+
imp = imp.replace(/^\s+/g, '');
|
|
262
|
+
w.add(imp, important);
|
|
263
|
+
} else if (important.pre !== undefined) {
|
|
264
|
+
w.add(imp, important);
|
|
265
|
+
} else {
|
|
266
|
+
w.add(` ${imp.trimStart()}`, important);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return w.getSince(mark);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
override toTrimmedString(options?: PrintOptions) {
|
|
275
|
+
return this.declTrimmedString(options);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
override preEval(context: Context): MaybePromise<this> {
|
|
279
|
+
/** @removal-target — node-copy-reduction: maybeClone → return this.
|
|
280
|
+
* Option changes should stay on the derived declaration instance. */
|
|
281
|
+
let node = this.clone();
|
|
282
|
+
node.preEvaluated = true;
|
|
283
|
+
// Index should already be assigned by parent Rules
|
|
284
|
+
return this._applyAssignmentNormalization(node, context);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
private _applyAssignmentNormalization(node: this, context: Context): MaybePromise<this> {
|
|
288
|
+
let name = node.get('name', context);
|
|
289
|
+
let value = node.get('value', context);
|
|
290
|
+
const excludesSelf = (candidate: Node): boolean => {
|
|
291
|
+
const currentSource = node.sourceNode ?? node;
|
|
292
|
+
const candidateSource = candidate.sourceNode ?? candidate;
|
|
293
|
+
return candidate !== node && candidateSource !== currentSource;
|
|
294
|
+
};
|
|
295
|
+
const isPriorMergedDeclaration = (candidate: Node): candidate is Declaration => (
|
|
296
|
+
excludesSelf(candidate)
|
|
297
|
+
&& isNode(candidate, N.Declaration)
|
|
298
|
+
&& candidate.options?.normalizedFromAssign !== undefined
|
|
299
|
+
);
|
|
300
|
+
|
|
301
|
+
const applyAssignmentNormalization = (key: Any<'property'>) => {
|
|
302
|
+
/** Normalize assignment types */
|
|
303
|
+
const nextOptions = {
|
|
304
|
+
...(node.options ?? {})
|
|
305
|
+
} as Opts;
|
|
306
|
+
let assign = nextOptions.assign;
|
|
307
|
+
const rawAssign = assign as string | undefined;
|
|
308
|
+
if (rawAssign === '+,:') {
|
|
309
|
+
assign = AssignmentType.MergeList;
|
|
310
|
+
} else if (rawAssign === '+_:') {
|
|
311
|
+
assign = AssignmentType.MergeSequence;
|
|
312
|
+
}
|
|
313
|
+
if (assign && assign !== AssignmentType.Default) {
|
|
314
|
+
const normalizedAssign = assign;
|
|
315
|
+
value = value.clone();
|
|
316
|
+
const cloneWithDependency = (source: Node): Node => {
|
|
317
|
+
const cloned = source.clone(true, undefined, context);
|
|
318
|
+
const dependency = getDependency(source, context);
|
|
319
|
+
if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
|
|
320
|
+
setDependency(cloned, {
|
|
321
|
+
dependsOn: new Set(dependency.dependsOn),
|
|
322
|
+
sourceExpr: dependency.sourceExpr
|
|
323
|
+
}, context);
|
|
324
|
+
}
|
|
325
|
+
return cloned;
|
|
326
|
+
};
|
|
327
|
+
const createAssignmentReference = (options: ConstructorParameters<typeof Reference>[1]) => {
|
|
328
|
+
const ref = new Reference({ key }, options);
|
|
329
|
+
if (node.index !== undefined) {
|
|
330
|
+
ref.index = node.index;
|
|
331
|
+
}
|
|
332
|
+
return ref;
|
|
333
|
+
};
|
|
334
|
+
const findPreviousPropertyDeclaration = (): Declaration | undefined => {
|
|
335
|
+
if (node.type !== 'Declaration') {
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
let rulesScope = isNode(context.rulesContext, N.Rules) ? context.rulesContext as Rules : undefined;
|
|
339
|
+
if (!rulesScope) {
|
|
340
|
+
let cursor: Node | undefined = node;
|
|
341
|
+
while (cursor && !isNode(cursor, N.Rules)) {
|
|
342
|
+
cursor = getParent(cursor, context);
|
|
343
|
+
}
|
|
344
|
+
rulesScope = cursor as Rules | undefined;
|
|
345
|
+
}
|
|
346
|
+
if (!rulesScope) {
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
const found = rulesScope.find('declaration', `${key.valueOf()}`, 'Declaration', {
|
|
350
|
+
context,
|
|
351
|
+
local: true,
|
|
352
|
+
start: node.index,
|
|
353
|
+
filter: isPriorMergedDeclaration
|
|
354
|
+
});
|
|
355
|
+
if (found) {
|
|
356
|
+
return found;
|
|
357
|
+
}
|
|
358
|
+
const children = rulesScope.getRegistryChildren(context);
|
|
359
|
+
const start = Math.min(
|
|
360
|
+
Math.max((node.index ?? children.length) - 1, -1),
|
|
361
|
+
children.length - 1
|
|
362
|
+
);
|
|
363
|
+
for (let i = start; i >= 0; i--) {
|
|
364
|
+
const candidate = children[i];
|
|
365
|
+
if (
|
|
366
|
+
candidate
|
|
367
|
+
&& String((candidate as Declaration).name?.valueOf?.() ?? '') === key.valueOf()
|
|
368
|
+
&& isPriorMergedDeclaration(candidate)
|
|
369
|
+
) {
|
|
370
|
+
return candidate;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return undefined;
|
|
374
|
+
};
|
|
375
|
+
/** Reference type */
|
|
376
|
+
let type: 'property' | 'variable' =
|
|
377
|
+
node.type === 'Declaration' ? 'property' : 'variable';
|
|
378
|
+
switch (assign) {
|
|
379
|
+
case AssignmentType.MergeList:
|
|
380
|
+
case AssignmentType.MergeSequence: {
|
|
381
|
+
const ref = createAssignmentReference({
|
|
382
|
+
type,
|
|
383
|
+
fallbackValue: new Nil(),
|
|
384
|
+
resolution: 'linear',
|
|
385
|
+
respectStart: true,
|
|
386
|
+
// Assignment normalization clears `assign` to Default, so matching by
|
|
387
|
+
// assignment flag prevents later merge iterations from seeing prior values.
|
|
388
|
+
// Only chain merged declarations together; plain prior declarations
|
|
389
|
+
// remain independent output in Less.
|
|
390
|
+
filter: isPriorMergedDeclaration
|
|
391
|
+
});
|
|
392
|
+
/**
|
|
393
|
+
* @note - It's up to Sequence and List to handle
|
|
394
|
+
* the merging of the values, if Nil()
|
|
395
|
+
* or a nested list.
|
|
396
|
+
*/
|
|
397
|
+
const isMergeListAssign = assign === AssignmentType.MergeList;
|
|
398
|
+
value = isMergeListAssign
|
|
399
|
+
? new List([ref, value])
|
|
400
|
+
: spaced([ref, value]);
|
|
401
|
+
node.setCurrentValue(value, context);
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
case AssignmentType.Add: {
|
|
405
|
+
if (node.type === 'Declaration') {
|
|
406
|
+
const previousDeclaration = findPreviousPropertyDeclaration();
|
|
407
|
+
if (!previousDeclaration) {
|
|
408
|
+
node.setCurrentValue(value, context);
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
// Less property `+:` appends comma-separated items.
|
|
412
|
+
// Use list composition (not generic `Operation +`) so scalar previous values
|
|
413
|
+
// remain distinct list members rather than string-concatenating.
|
|
414
|
+
node.setCurrentValue(new List([
|
|
415
|
+
cloneWithDependency(previousDeclaration.getCurrentValue(context)),
|
|
416
|
+
value
|
|
417
|
+
]), context);
|
|
418
|
+
} else {
|
|
419
|
+
node.setCurrentValue(new Operation([
|
|
420
|
+
new Reference({ key }, { type }),
|
|
421
|
+
'+',
|
|
422
|
+
value
|
|
423
|
+
]), context);
|
|
424
|
+
}
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
case AssignmentType.CondAssign: {
|
|
428
|
+
node.setCurrentValue(new Reference({ key }, {
|
|
429
|
+
type,
|
|
430
|
+
fallbackValue: value
|
|
431
|
+
}), context);
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
nextOptions.normalizedFromAssign = normalizedAssign;
|
|
436
|
+
nextOptions.assign = AssignmentType.Default;
|
|
437
|
+
node.options = nextOptions as Opts;
|
|
438
|
+
}
|
|
439
|
+
const normalizedValue = node.get('value', context);
|
|
440
|
+
const shouldResolveNormalizedAssignment = (
|
|
441
|
+
assign !== undefined
|
|
442
|
+
&& assign !== AssignmentType.Default
|
|
443
|
+
);
|
|
444
|
+
const out = shouldResolveNormalizedAssignment
|
|
445
|
+
? normalizedValue.eval(context)
|
|
446
|
+
: normalizedValue.preEval(context);
|
|
447
|
+
if (isThenable(out)) {
|
|
448
|
+
return out.then((value) => {
|
|
449
|
+
node.setCurrentValue(value, context);
|
|
450
|
+
return node;
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
node.setCurrentValue(out, context);
|
|
454
|
+
return node;
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
if (name instanceof Interpolated) {
|
|
458
|
+
const maybeKey = name.eval(context);
|
|
459
|
+
if (isThenable(maybeKey)) {
|
|
460
|
+
return maybeKey.then((key) => {
|
|
461
|
+
node.setCurrentName(key, context);
|
|
462
|
+
return applyAssignmentNormalization(key);
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
const key = maybeKey as Any<'property'>;
|
|
466
|
+
node.setCurrentName(key, context);
|
|
467
|
+
return applyAssignmentNormalization(key);
|
|
468
|
+
}
|
|
469
|
+
return applyAssignmentNormalization(name);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
override evalNode(context: Context): MaybePromise<this | Nil> {
|
|
473
|
+
const currentValue = this.get('value', context);
|
|
474
|
+
const staticNestedCollection =
|
|
475
|
+
isNode(currentValue, N.Collection)
|
|
476
|
+
|| (
|
|
477
|
+
isNode(currentValue, N.Sequence)
|
|
478
|
+
&& (currentValue as Sequence).get('value').length > 0
|
|
479
|
+
&& isNode((currentValue as Sequence).get('value')[(currentValue as Sequence).get('value').length - 1]!, N.Collection)
|
|
480
|
+
);
|
|
481
|
+
if (this.hasFlag(F_STATIC) && !staticNestedCollection) {
|
|
482
|
+
this.evaluated = true;
|
|
483
|
+
return this;
|
|
484
|
+
}
|
|
485
|
+
return pipe(
|
|
486
|
+
() => {
|
|
487
|
+
let node = this;
|
|
488
|
+
const copyDependency = (source: Node, target: Node) => {
|
|
489
|
+
const dependency = getDependency(source, context);
|
|
490
|
+
if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
|
|
491
|
+
setDependency(target, {
|
|
492
|
+
dependsOn: new Set(dependency.dependsOn),
|
|
493
|
+
sourceExpr: dependency.sourceExpr
|
|
494
|
+
}, context);
|
|
495
|
+
}
|
|
496
|
+
};
|
|
497
|
+
const cloneWithDependency = (source: Node): Node => {
|
|
498
|
+
const cloned = source.clone(false);
|
|
499
|
+
copyDependency(source, cloned);
|
|
500
|
+
return cloned;
|
|
501
|
+
};
|
|
502
|
+
const splitNestedPropertyValue = (valueNode: Node): { baseValue?: Node; collection: Collection } | undefined => {
|
|
503
|
+
if (isNode(valueNode, N.Collection)) {
|
|
504
|
+
return { collection: valueNode as Collection };
|
|
505
|
+
}
|
|
506
|
+
if (!isNode(valueNode, N.Sequence)) {
|
|
507
|
+
return undefined;
|
|
508
|
+
}
|
|
509
|
+
const items = [...(valueNode as Sequence).get('value')];
|
|
510
|
+
if (items.length === 0) {
|
|
511
|
+
return undefined;
|
|
512
|
+
}
|
|
513
|
+
const last = items[items.length - 1]!;
|
|
514
|
+
if (!isNode(last, N.Collection)) {
|
|
515
|
+
return undefined;
|
|
516
|
+
}
|
|
517
|
+
if (items.length === 1) {
|
|
518
|
+
return { collection: last as Collection };
|
|
519
|
+
}
|
|
520
|
+
const baseItems = items.slice(0, -1).map(item => item.copy(true));
|
|
521
|
+
const baseValue = baseItems.length === 1
|
|
522
|
+
? baseItems[0]!
|
|
523
|
+
: new Sequence(baseItems, undefined, valueNode.location, this.treeContext);
|
|
524
|
+
return { baseValue, collection: last as Collection };
|
|
525
|
+
};
|
|
526
|
+
const cloneImportant = () => node.important?.copy(true) as Any<'flag'> | undefined;
|
|
527
|
+
const makePropertyName = (prefix: string, childName: NameValue): Any<'property'> =>
|
|
528
|
+
new Any(
|
|
529
|
+
`${prefix}-${String(childName.valueOf())}`,
|
|
530
|
+
{ role: 'property' },
|
|
531
|
+
childName.location ?? node.location,
|
|
532
|
+
this.treeContext
|
|
533
|
+
);
|
|
534
|
+
const expandNestedPropertyDeclaration = (declNode: Declaration): MaybePromise<Declaration | Rules | Nil> => {
|
|
535
|
+
const nested = splitNestedPropertyValue(declNode.value);
|
|
536
|
+
if (!nested) {
|
|
537
|
+
return declNode;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
const expanded: Node[] = [];
|
|
541
|
+
const declCtor = declNode.constructor as Class<Declaration>;
|
|
542
|
+
const prefix = String(declNode.name.valueOf());
|
|
543
|
+
|
|
544
|
+
if (nested.baseValue) {
|
|
545
|
+
expanded.push(new declCtor(
|
|
546
|
+
{
|
|
547
|
+
name: declNode.name.copy(true) as NameValue,
|
|
548
|
+
value: nested.baseValue.copy(true),
|
|
549
|
+
important: cloneImportant()
|
|
550
|
+
},
|
|
551
|
+
{ ...declNode.options },
|
|
552
|
+
declNode.location,
|
|
553
|
+
this.treeContext
|
|
554
|
+
));
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
const entries = nested.collection.value.filter(
|
|
558
|
+
child => isNode(child, N.Declaration) && !isNode(child, N.VarDeclaration)
|
|
559
|
+
) as Declaration[];
|
|
560
|
+
|
|
561
|
+
const processEntry = (index: number): MaybePromise<void> => {
|
|
562
|
+
if (index >= entries.length) {
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
const current = entries[index]!;
|
|
567
|
+
const preEvaluated = current.preEval(context) as Declaration | Nil | Promise<Declaration | Nil>;
|
|
568
|
+
const afterPreEval = (resolvedCurrent: Declaration | Nil): MaybePromise<void> => {
|
|
569
|
+
if (resolvedCurrent instanceof Nil || !isNode(resolvedCurrent, N.Declaration) || isNode(resolvedCurrent, N.VarDeclaration)) {
|
|
570
|
+
return processEntry(index + 1);
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
const prefixedDecl = new declCtor(
|
|
574
|
+
{
|
|
575
|
+
name: makePropertyName(prefix, resolvedCurrent.name as NameValue),
|
|
576
|
+
value: resolvedCurrent.value.copy(true),
|
|
577
|
+
important: (resolvedCurrent.important?.copy(true) as Any<'flag'> | undefined)
|
|
578
|
+
},
|
|
579
|
+
{ ...resolvedCurrent.options },
|
|
580
|
+
resolvedCurrent.location,
|
|
581
|
+
this.treeContext
|
|
582
|
+
);
|
|
583
|
+
|
|
584
|
+
const evaluated = prefixedDecl.eval(context) as Declaration | Rules | Nil | Promise<Declaration | Rules | Nil>;
|
|
585
|
+
const afterEval = (resolvedPrefixed: Declaration | Rules | Nil): MaybePromise<void> => {
|
|
586
|
+
if (!(resolvedPrefixed instanceof Nil)) {
|
|
587
|
+
if (isNode(resolvedPrefixed, N.Rules)) {
|
|
588
|
+
expanded.push(...(resolvedPrefixed as Rules).value);
|
|
589
|
+
} else {
|
|
590
|
+
expanded.push(resolvedPrefixed as Declaration);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
return processEntry(index + 1);
|
|
594
|
+
};
|
|
595
|
+
|
|
596
|
+
return isThenable(evaluated)
|
|
597
|
+
? (evaluated as Promise<Declaration | Rules | Nil>).then(afterEval)
|
|
598
|
+
: afterEval(evaluated as Declaration | Rules | Nil);
|
|
599
|
+
};
|
|
600
|
+
|
|
601
|
+
return isThenable(preEvaluated)
|
|
602
|
+
? (preEvaluated as Promise<Declaration | Nil>).then(afterPreEval)
|
|
603
|
+
: afterPreEval(preEvaluated as Declaration | Nil);
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
const finish = () => new Rules(expanded, undefined, declNode.location, this.treeContext);
|
|
607
|
+
const processed = processEntry(0);
|
|
608
|
+
return isThenable(processed)
|
|
609
|
+
? (processed as Promise<void>).then(finish)
|
|
610
|
+
: finish();
|
|
611
|
+
};
|
|
612
|
+
const normalizeMergedLeadingPlaceholder = () => {
|
|
613
|
+
const normalizedAssign = node.options?.normalizedFromAssign;
|
|
614
|
+
const isListMergedAssign =
|
|
615
|
+
normalizedAssign === AssignmentType.Add
|
|
616
|
+
|| normalizedAssign === AssignmentType.MergeList;
|
|
617
|
+
const nodeValue = node.get('value', context);
|
|
618
|
+
if (!isListMergedAssign || !isNode(nodeValue, N.List)) {
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
const listValue = nodeValue.get('value', context);
|
|
622
|
+
if (listValue.length === 0) {
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
const first = listValue[0]!;
|
|
626
|
+
const isEmptyPlaceholder = (
|
|
627
|
+
isNode(first, N.Nil)
|
|
628
|
+
|| (isNode(first, N.List) && first.get('value').length === 0)
|
|
629
|
+
);
|
|
630
|
+
if (!isEmptyPlaceholder) {
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
const rest = listValue.slice(1);
|
|
634
|
+
if (rest.length === 0) {
|
|
635
|
+
node.setCurrentValue(new Nil(), context);
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
if (rest.length === 1) {
|
|
639
|
+
node.setCurrentValue(cloneWithDependency(rest[0]!), context);
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
const clonedRest = rest.map(item => cloneWithDependency(item));
|
|
643
|
+
node.setCurrentValue(new List(clonedRest), context);
|
|
644
|
+
const dependency = mergeDependencies(clonedRest, context);
|
|
645
|
+
if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
|
|
646
|
+
setDependency(node.get('value', context), {
|
|
647
|
+
dependsOn: new Set(dependency.dependsOn),
|
|
648
|
+
sourceExpr: dependency.sourceExpr
|
|
649
|
+
}, context);
|
|
650
|
+
}
|
|
651
|
+
};
|
|
652
|
+
/** Pre-eval already evaluated the name, just need to do value (if not a var declaration) */
|
|
653
|
+
if (node.type === 'VarDeclaration') {
|
|
654
|
+
return node;
|
|
655
|
+
}
|
|
656
|
+
const value = node.get('value', context);
|
|
657
|
+
if (value instanceof Node) {
|
|
658
|
+
const isCustomProperty = node.isCustomProperty(context);
|
|
659
|
+
if (isCustomProperty) {
|
|
660
|
+
const hasInterpolation =
|
|
661
|
+
value.type === 'Interpolated'
|
|
662
|
+
|| [...value.children(true)].some(child => child.type === 'Interpolated');
|
|
663
|
+
if (!hasInterpolation) {
|
|
664
|
+
return node;
|
|
665
|
+
}
|
|
666
|
+
context.inCustom = true;
|
|
667
|
+
}
|
|
668
|
+
const maybeNewValue = value.eval(context);
|
|
669
|
+
if (isThenable(maybeNewValue)) {
|
|
670
|
+
return (maybeNewValue as Promise<Node>).then((newValue) => {
|
|
671
|
+
context.inCustom = false;
|
|
672
|
+
if (newValue instanceof Nil) {
|
|
673
|
+
return newValue.inherit(node);
|
|
674
|
+
}
|
|
675
|
+
node.setCurrentValue(newValue, context);
|
|
676
|
+
normalizeMergedLeadingPlaceholder();
|
|
677
|
+
copyDependency(newValue, node.get('value', context));
|
|
678
|
+
// Merge !important from referenced declarations
|
|
679
|
+
if (context.hasImportantSource && !node.get('important', context)) {
|
|
680
|
+
node.setCurrentImportant(Any.create('!important', { role: 'flag' }) as Any<'flag'>, context);
|
|
681
|
+
}
|
|
682
|
+
// Pop important source after merging (if it was set)
|
|
683
|
+
if (context.hasImportantSource) {
|
|
684
|
+
context.popImportantSource();
|
|
685
|
+
}
|
|
686
|
+
return node;
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
context.inCustom = false;
|
|
690
|
+
if (maybeNewValue instanceof Nil) {
|
|
691
|
+
return (value as Nil).inherit(node);
|
|
692
|
+
}
|
|
693
|
+
node.setCurrentValue(maybeNewValue as Node, context);
|
|
694
|
+
normalizeMergedLeadingPlaceholder();
|
|
695
|
+
copyDependency(maybeNewValue as Node, node.get('value', context));
|
|
696
|
+
const expanded = expandNestedPropertyDeclaration(node);
|
|
697
|
+
if (isThenable(expanded)) {
|
|
698
|
+
return (expanded as Promise<Declaration | Rules | Nil>).then((resolvedExpanded) => {
|
|
699
|
+
if (context.hasImportantSource && !node.get('important', context) && isNode(resolvedExpanded, N.Declaration)) {
|
|
700
|
+
(resolvedExpanded as Declaration).setCurrentImportant(Any.create('!important', { role: 'flag' }) as Any<'flag'>, context);
|
|
701
|
+
}
|
|
702
|
+
if (context.hasImportantSource) {
|
|
703
|
+
context.popImportantSource();
|
|
704
|
+
}
|
|
705
|
+
return resolvedExpanded;
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
if (expanded !== node) {
|
|
709
|
+
if (context.hasImportantSource) {
|
|
710
|
+
context.popImportantSource();
|
|
711
|
+
}
|
|
712
|
+
return expanded;
|
|
713
|
+
}
|
|
714
|
+
// Merge !important from referenced declarations
|
|
715
|
+
if (context.hasImportantSource && !node.get('important', context)) {
|
|
716
|
+
node.setCurrentImportant(Any.create('!important', { role: 'flag' }) as Any<'flag'>, context);
|
|
717
|
+
}
|
|
718
|
+
// Pop important source after merging (if it was set)
|
|
719
|
+
if (context.hasImportantSource) {
|
|
720
|
+
context.popImportantSource();
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
return node;
|
|
724
|
+
}
|
|
725
|
+
) as MaybePromise<this | Nil>;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
export type DeclarationParams = ConstructorParameters<typeof Declaration>;
|
|
730
|
+
|
|
731
|
+
defineType<DeclarationValue>(Declaration, 'Declaration', 'decl');
|
|
732
|
+
|
|
733
|
+
export const decl = (
|
|
734
|
+
value: DeclarationValue<AnyRole> | { name: string; value: Node; important?: Any<'flag'> },
|
|
735
|
+
options?: DeclarationOptions,
|
|
736
|
+
location?: OptionalLocation,
|
|
737
|
+
treeContext?: TreeContext
|
|
738
|
+
) => {
|
|
739
|
+
let { name } = value;
|
|
740
|
+
value.name = typeof name === 'string' ? new Any(name, { role: 'property' }) : name;
|
|
741
|
+
return new Declaration(value as DeclarationValue, options, location, treeContext);
|
|
742
|
+
};
|