@jesscss/core 2.0.0-alpha.5 → 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 -98
- package/lib/tree/ampersand.d.ts.map +0 -1
- package/lib/tree/ampersand.js +0 -319
- 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,523 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { OutputWriter } from '../print.js';
|
|
3
|
+
|
|
4
|
+
describe('OutputWriter', () => {
|
|
5
|
+
describe('position tracking', () => {
|
|
6
|
+
it('properly advances output position with plain add', () => {
|
|
7
|
+
const w = new OutputWriter();
|
|
8
|
+
|
|
9
|
+
expect(w.line).toBe(0);
|
|
10
|
+
expect(w.column).toBe(0);
|
|
11
|
+
|
|
12
|
+
w.add('hello');
|
|
13
|
+
expect(w.line).toBe(0);
|
|
14
|
+
expect(w.column).toBe(5);
|
|
15
|
+
|
|
16
|
+
w.add(' world');
|
|
17
|
+
expect(w.line).toBe(0);
|
|
18
|
+
expect(w.column).toBe(11);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('properly counts lines during add', () => {
|
|
22
|
+
const w = new OutputWriter();
|
|
23
|
+
|
|
24
|
+
w.add('line1\nline2\nline3');
|
|
25
|
+
expect(w.line).toBe(2);
|
|
26
|
+
expect(w.column).toBe(5); // length of 'line3'
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('handles multiple newlines correctly', () => {
|
|
30
|
+
const w = new OutputWriter();
|
|
31
|
+
|
|
32
|
+
w.add('a\nb\nc\nd');
|
|
33
|
+
expect(w.line).toBe(3);
|
|
34
|
+
expect(w.column).toBe(1); // length of 'd'
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('handles empty string', () => {
|
|
38
|
+
const w = new OutputWriter();
|
|
39
|
+
|
|
40
|
+
w.add('');
|
|
41
|
+
expect(w.line).toBe(0);
|
|
42
|
+
expect(w.column).toBe(0);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('handles string ending with newline', () => {
|
|
46
|
+
const w = new OutputWriter();
|
|
47
|
+
|
|
48
|
+
w.add('hello\n');
|
|
49
|
+
expect(w.line).toBe(1);
|
|
50
|
+
expect(w.column).toBe(0); // after newline
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
describe('capture behavior', () => {
|
|
55
|
+
it('captures content without advancing the output index', () => {
|
|
56
|
+
const w = new OutputWriter();
|
|
57
|
+
|
|
58
|
+
w.add('before ');
|
|
59
|
+
const beforeLine = w.line;
|
|
60
|
+
const beforeColumn = w.column;
|
|
61
|
+
|
|
62
|
+
const captured = w.capture(() => {
|
|
63
|
+
w.add('captured content\nwith newlines');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Position should be unchanged after capture
|
|
67
|
+
expect(w.line).toBe(beforeLine);
|
|
68
|
+
expect(w.column).toBe(beforeColumn);
|
|
69
|
+
expect(w.toString()).toBe('before ');
|
|
70
|
+
expect(captured).toBe('captured content\nwith newlines');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('capture does not affect main buffer', () => {
|
|
74
|
+
const w = new OutputWriter();
|
|
75
|
+
|
|
76
|
+
w.add('start');
|
|
77
|
+
const captured = w.capture(() => {
|
|
78
|
+
w.add('middle');
|
|
79
|
+
});
|
|
80
|
+
w.add('end');
|
|
81
|
+
|
|
82
|
+
expect(w.toString()).toBe('startend');
|
|
83
|
+
expect(captured).toBe('middle');
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('capture with newlines does not affect position', () => {
|
|
87
|
+
const w = new OutputWriter();
|
|
88
|
+
|
|
89
|
+
w.add('line1\n');
|
|
90
|
+
const captured = w.capture(() => {
|
|
91
|
+
w.add('line2\nline3\n');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
expect(w.line).toBe(1);
|
|
95
|
+
expect(w.column).toBe(0);
|
|
96
|
+
expect(w.toString()).toBe('line1\n');
|
|
97
|
+
expect(captured).toBe('line2\nline3\n');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('captureWithMeta defaults to implicit boundary intent', () => {
|
|
101
|
+
const w = new OutputWriter();
|
|
102
|
+
const captured = w.captureWithMeta(() => {
|
|
103
|
+
w.add('abc');
|
|
104
|
+
});
|
|
105
|
+
expect(captured).toEqual({
|
|
106
|
+
text: 'abc',
|
|
107
|
+
leadingIntent: 'implicit',
|
|
108
|
+
trailingIntent: 'implicit'
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('captureWithMeta preserves explicit boundary intent signals', () => {
|
|
113
|
+
const w = new OutputWriter();
|
|
114
|
+
const captured = w.captureWithMeta(() => {
|
|
115
|
+
w.signalBoundaryIntent('pre', 'explicit_none');
|
|
116
|
+
w.add('abc');
|
|
117
|
+
w.signalBoundaryIntent('post', 'explicit_none');
|
|
118
|
+
});
|
|
119
|
+
expect(captured).toEqual({
|
|
120
|
+
text: 'abc',
|
|
121
|
+
leadingIntent: 'explicit_none',
|
|
122
|
+
trailingIntent: 'explicit_none'
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
describe('mark and restore', () => {
|
|
128
|
+
it('mark returns current chunk count', () => {
|
|
129
|
+
const w = new OutputWriter();
|
|
130
|
+
|
|
131
|
+
expect(w.mark()).toBe(0);
|
|
132
|
+
w.add('chunk1');
|
|
133
|
+
expect(w.mark()).toBe(1);
|
|
134
|
+
w.add('chunk2');
|
|
135
|
+
expect(w.mark()).toBe(2);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('getSince returns content since mark', () => {
|
|
139
|
+
const w = new OutputWriter();
|
|
140
|
+
|
|
141
|
+
w.add('chunk1');
|
|
142
|
+
const mark1 = w.mark();
|
|
143
|
+
w.add('chunk2');
|
|
144
|
+
w.add('chunk3');
|
|
145
|
+
|
|
146
|
+
expect(w.getSince(mark1)).toBe('chunk2chunk3');
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('restore reverts to mark position', () => {
|
|
150
|
+
const w = new OutputWriter();
|
|
151
|
+
|
|
152
|
+
w.add('line1\n');
|
|
153
|
+
const mark = w.mark();
|
|
154
|
+
w.add('line2\nline3\n');
|
|
155
|
+
|
|
156
|
+
expect(w.line).toBe(3);
|
|
157
|
+
expect(w.column).toBe(0);
|
|
158
|
+
|
|
159
|
+
w.restore(mark);
|
|
160
|
+
expect(w.line).toBe(1);
|
|
161
|
+
expect(w.column).toBe(0);
|
|
162
|
+
expect(w.toString()).toBe('line1\n');
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('restore with invalid mark does nothing', () => {
|
|
166
|
+
const w = new OutputWriter();
|
|
167
|
+
|
|
168
|
+
w.add('content');
|
|
169
|
+
const originalLine = w.line;
|
|
170
|
+
const originalColumn = w.column;
|
|
171
|
+
const originalString = w.toString();
|
|
172
|
+
|
|
173
|
+
w.restore(-1);
|
|
174
|
+
w.restore(999);
|
|
175
|
+
|
|
176
|
+
expect(w.line).toBe(originalLine);
|
|
177
|
+
expect(w.column).toBe(originalColumn);
|
|
178
|
+
expect(w.toString()).toBe(originalString);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
describe('_positions array behavior', () => {
|
|
183
|
+
it('tracks positions for each chunk', () => {
|
|
184
|
+
const w = new OutputWriter();
|
|
185
|
+
|
|
186
|
+
w.add('hello');
|
|
187
|
+
w.add(' world');
|
|
188
|
+
w.add('\nnew line');
|
|
189
|
+
|
|
190
|
+
// Access private _positions array for testing
|
|
191
|
+
const positions = (w as any)._positions;
|
|
192
|
+
expect(positions).toHaveLength(3);
|
|
193
|
+
expect(positions[0]).toEqual({ line: 0, column: 5, segments: 0, length: 5 });
|
|
194
|
+
expect(positions[1]).toEqual({ line: 0, column: 11, segments: 0, length: 11 });
|
|
195
|
+
expect(positions[2]).toEqual({ line: 1, column: 8, segments: 0, length: 20 });
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('capture does not affect _positions array', () => {
|
|
199
|
+
const w = new OutputWriter();
|
|
200
|
+
|
|
201
|
+
w.add('before');
|
|
202
|
+
const beforePositions = [...(w as any)._positions];
|
|
203
|
+
|
|
204
|
+
const captured = w.capture(() => {
|
|
205
|
+
w.add('captured\ncontent');
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// _positions should be unchanged after capture
|
|
209
|
+
expect((w as any)._positions).toEqual(beforePositions);
|
|
210
|
+
expect(captured).toBe('captured\ncontent');
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('restore properly resets _positions array', () => {
|
|
214
|
+
const w = new OutputWriter();
|
|
215
|
+
|
|
216
|
+
w.add('line1\n');
|
|
217
|
+
const mark = w.mark();
|
|
218
|
+
const positionsAtMark = [...(w as any)._positions];
|
|
219
|
+
|
|
220
|
+
w.add('line2\nline3\n');
|
|
221
|
+
expect((w as any)._positions).toHaveLength(2); // Only 2 chunks: 'line2\n' and 'line3\n'
|
|
222
|
+
|
|
223
|
+
w.restore(mark);
|
|
224
|
+
expect((w as any)._positions).toEqual(positionsAtMark);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('_positions tracks segments count', () => {
|
|
228
|
+
const w = new OutputWriter();
|
|
229
|
+
|
|
230
|
+
// Add content with origin that has location info
|
|
231
|
+
const mockOrigin = {
|
|
232
|
+
location: [0, 1, 1, 0, 1, 5], // [start, startLine, startColumn, end, endLine, endColumn]
|
|
233
|
+
treeContext: { file: { fullPath: 'test.css' } }
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
w.add('content', mockOrigin);
|
|
237
|
+
const positions = (w as any)._positions;
|
|
238
|
+
expect(positions[0].segments).toBe(1);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
describe('sourcemap segments behavior', () => {
|
|
243
|
+
it('creates segments for content with origin location', () => {
|
|
244
|
+
const w = new OutputWriter();
|
|
245
|
+
|
|
246
|
+
const mockOrigin = {
|
|
247
|
+
location: [0, 1, 1, 0, 1, 5], // [start, startLine, startColumn, end, endLine, endColumn]
|
|
248
|
+
treeContext: { file: { fullPath: 'test.css' } }
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
w.add('hello', mockOrigin);
|
|
252
|
+
const segments = w.getSegments();
|
|
253
|
+
|
|
254
|
+
expect(segments).toHaveLength(1);
|
|
255
|
+
expect(segments[0]).toEqual({
|
|
256
|
+
genLine: 0,
|
|
257
|
+
genColumn: 0,
|
|
258
|
+
source: 'test.css',
|
|
259
|
+
origLine: 0, // 1-based to 0-based conversion
|
|
260
|
+
origColumn: 0 // 1-based to 0-based conversion
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('capture does not create segments in main buffer', () => {
|
|
265
|
+
const w = new OutputWriter();
|
|
266
|
+
|
|
267
|
+
const mockOrigin = {
|
|
268
|
+
location: [0, 1, 1, 0, 1, 5],
|
|
269
|
+
treeContext: { file: { fullPath: 'test.css' } }
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
w.add('before');
|
|
273
|
+
const beforeSegments = [...w.getSegments()];
|
|
274
|
+
|
|
275
|
+
const captured = w.capture(() => {
|
|
276
|
+
w.add('captured', mockOrigin);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// Segments should be unchanged after capture
|
|
280
|
+
expect(w.getSegments()).toEqual(beforeSegments);
|
|
281
|
+
expect(captured).toBe('captured');
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it('restore properly resets segments array', () => {
|
|
285
|
+
const w = new OutputWriter();
|
|
286
|
+
|
|
287
|
+
const mockOrigin = {
|
|
288
|
+
location: [0, 1, 1, 0, 1, 5],
|
|
289
|
+
treeContext: { file: { fullPath: 'test.css' } }
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
w.add('before');
|
|
293
|
+
const mark = w.mark();
|
|
294
|
+
const segmentsAtMark = [...w.getSegments()];
|
|
295
|
+
|
|
296
|
+
w.add('after', mockOrigin);
|
|
297
|
+
expect(w.getSegments()).toHaveLength(1);
|
|
298
|
+
|
|
299
|
+
w.restore(mark);
|
|
300
|
+
expect(w.getSegments()).toEqual(segmentsAtMark);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('segments track correct generated positions', () => {
|
|
304
|
+
const w = new OutputWriter();
|
|
305
|
+
|
|
306
|
+
const mockOrigin = {
|
|
307
|
+
location: [0, 1, 1, 0, 1, 5],
|
|
308
|
+
treeContext: { file: { fullPath: 'test.css' } }
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
w.add('hello\nworld', mockOrigin);
|
|
312
|
+
const segments = w.getSegments();
|
|
313
|
+
|
|
314
|
+
expect(segments).toHaveLength(1);
|
|
315
|
+
expect(segments[0]!.genLine).toBe(0);
|
|
316
|
+
expect(segments[0]!.genColumn).toBe(0);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
it('multiple segments track positions correctly', () => {
|
|
320
|
+
const w = new OutputWriter();
|
|
321
|
+
|
|
322
|
+
const origin1 = {
|
|
323
|
+
location: [0, 1, 1, 0, 1, 5],
|
|
324
|
+
treeContext: { file: { fullPath: 'test1.css' } }
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
const origin2 = {
|
|
328
|
+
location: [0, 2, 1, 0, 2, 5],
|
|
329
|
+
treeContext: { file: { fullPath: 'test2.css' } }
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
w.add('hello', origin1);
|
|
333
|
+
w.add(' world', origin2);
|
|
334
|
+
|
|
335
|
+
const segments = w.getSegments();
|
|
336
|
+
expect(segments).toHaveLength(2);
|
|
337
|
+
expect(segments[0]!.genLine).toBe(0);
|
|
338
|
+
expect(segments[0]!.genColumn).toBe(0);
|
|
339
|
+
expect(segments[1]!.genLine).toBe(0);
|
|
340
|
+
expect(segments[1]!.genColumn).toBe(5);
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
it('segments handle newlines correctly', () => {
|
|
344
|
+
const w = new OutputWriter();
|
|
345
|
+
|
|
346
|
+
const mockOrigin = {
|
|
347
|
+
location: [0, 1, 1, 0, 1, 5],
|
|
348
|
+
treeContext: { file: { fullPath: 'test.css' } }
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
w.add('line1\nline2', mockOrigin);
|
|
352
|
+
const segments = w.getSegments();
|
|
353
|
+
|
|
354
|
+
expect(segments).toHaveLength(1);
|
|
355
|
+
expect(segments[0]!.genLine).toBe(0);
|
|
356
|
+
expect(segments[0]!.genColumn).toBe(0);
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
it('restore with segments maintains correct mapping', () => {
|
|
360
|
+
const w = new OutputWriter();
|
|
361
|
+
|
|
362
|
+
const mockOrigin = {
|
|
363
|
+
location: [0, 1, 1, 0, 1, 5],
|
|
364
|
+
treeContext: { file: { fullPath: 'test.css' } }
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
w.add('before');
|
|
368
|
+
const mark = w.mark();
|
|
369
|
+
|
|
370
|
+
w.add('content', mockOrigin);
|
|
371
|
+
expect(w.getSegments()).toHaveLength(1);
|
|
372
|
+
|
|
373
|
+
w.restore(mark);
|
|
374
|
+
expect(w.getSegments()).toHaveLength(0);
|
|
375
|
+
|
|
376
|
+
// Adding after restore should work correctly
|
|
377
|
+
w.add('after', mockOrigin);
|
|
378
|
+
expect(w.getSegments()).toHaveLength(1);
|
|
379
|
+
expect(w.getSegments()[0]!.genLine).toBe(0);
|
|
380
|
+
expect(w.getSegments()[0]!.genColumn).toBe(6); // after 'before'
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
describe('declaration-like serialization pattern', () => {
|
|
385
|
+
it('handles basic declaration pattern', () => {
|
|
386
|
+
const w = new OutputWriter();
|
|
387
|
+
|
|
388
|
+
w.add('property:');
|
|
389
|
+
const valOut = w.capture(() => {
|
|
390
|
+
w.add('value');
|
|
391
|
+
});
|
|
392
|
+
w.add(' ');
|
|
393
|
+
w.add(valOut);
|
|
394
|
+
w.add(';');
|
|
395
|
+
|
|
396
|
+
expect(w.toString()).toBe('property: value;');
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
it('handles trailing spaces in captured content', () => {
|
|
400
|
+
const w = new OutputWriter();
|
|
401
|
+
|
|
402
|
+
w.add('property:');
|
|
403
|
+
const valOut = w.capture(() => {
|
|
404
|
+
w.add('value ');
|
|
405
|
+
});
|
|
406
|
+
w.add(' ');
|
|
407
|
+
w.add(valOut);
|
|
408
|
+
w.add(';');
|
|
409
|
+
|
|
410
|
+
expect(w.toString()).toBe('property: value ;');
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
it('handles leading spaces in captured content', () => {
|
|
414
|
+
const w = new OutputWriter();
|
|
415
|
+
|
|
416
|
+
w.add('property:');
|
|
417
|
+
const valOut = w.capture(() => {
|
|
418
|
+
w.add(' value');
|
|
419
|
+
});
|
|
420
|
+
w.add(' ');
|
|
421
|
+
w.add(valOut);
|
|
422
|
+
w.add(';');
|
|
423
|
+
|
|
424
|
+
expect(w.toString()).toBe('property: value;');
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
it('handles both leading and trailing spaces', () => {
|
|
428
|
+
const w = new OutputWriter();
|
|
429
|
+
|
|
430
|
+
w.add('property:');
|
|
431
|
+
const valOut = w.capture(() => {
|
|
432
|
+
w.add(' value ');
|
|
433
|
+
});
|
|
434
|
+
w.add(' ');
|
|
435
|
+
w.add(valOut);
|
|
436
|
+
w.add(';');
|
|
437
|
+
|
|
438
|
+
expect(w.toString()).toBe('property: value ;');
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
it('demonstrates the actual CSS serialization issue', () => {
|
|
442
|
+
const w = new OutputWriter();
|
|
443
|
+
|
|
444
|
+
w.add('color:');
|
|
445
|
+
const valOut = w.capture(() => {
|
|
446
|
+
w.add('white '); // Note the trailing space
|
|
447
|
+
});
|
|
448
|
+
w.add(' ');
|
|
449
|
+
w.add(valOut.replace(/^\s+/, '')); // Remove leading whitespace only
|
|
450
|
+
w.add('!important');
|
|
451
|
+
|
|
452
|
+
// This produces "color: white !important" instead of "color: white!important"
|
|
453
|
+
expect(w.toString()).toBe('color: white !important');
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
it('demonstrates the correct behavior with trailing space removal', () => {
|
|
457
|
+
const w = new OutputWriter();
|
|
458
|
+
|
|
459
|
+
w.add('color:');
|
|
460
|
+
const valOut = w.capture(() => {
|
|
461
|
+
w.add('white '); // Note the trailing space
|
|
462
|
+
});
|
|
463
|
+
w.add(' ');
|
|
464
|
+
w.add(valOut.replace(/^\s+/, '').replace(/\s+$/, '')); // Remove both leading and trailing whitespace
|
|
465
|
+
w.add('!important');
|
|
466
|
+
|
|
467
|
+
// This produces the correct "color: white!important"
|
|
468
|
+
expect(w.toString()).toBe('color: white!important');
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
describe('toString and chunks', () => {
|
|
473
|
+
it('toString joins all chunks', () => {
|
|
474
|
+
const w = new OutputWriter();
|
|
475
|
+
|
|
476
|
+
w.add('chunk1');
|
|
477
|
+
w.add('chunk2');
|
|
478
|
+
w.add('chunk3');
|
|
479
|
+
|
|
480
|
+
expect(w.toString()).toBe('chunk1chunk2chunk3');
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
it('toString returns empty string for empty writer', () => {
|
|
484
|
+
const w = new OutputWriter();
|
|
485
|
+
expect(w.toString()).toBe('');
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
describe('edge cases', () => {
|
|
490
|
+
it('handles null/undefined text gracefully', () => {
|
|
491
|
+
const w = new OutputWriter();
|
|
492
|
+
|
|
493
|
+
// @ts-ignore - testing edge case
|
|
494
|
+
w.add(null);
|
|
495
|
+
// @ts-ignore - testing edge case
|
|
496
|
+
w.add(undefined);
|
|
497
|
+
w.add('');
|
|
498
|
+
|
|
499
|
+
expect(w.toString()).toBe('');
|
|
500
|
+
expect(w.line).toBe(0);
|
|
501
|
+
expect(w.column).toBe(0);
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
it('handles very long strings', () => {
|
|
505
|
+
const w = new OutputWriter();
|
|
506
|
+
const longString = 'a'.repeat(1000);
|
|
507
|
+
|
|
508
|
+
w.add(longString);
|
|
509
|
+
expect(w.line).toBe(0);
|
|
510
|
+
expect(w.column).toBe(1000);
|
|
511
|
+
expect(w.toString()).toBe(longString);
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
it('handles strings with only newlines', () => {
|
|
515
|
+
const w = new OutputWriter();
|
|
516
|
+
|
|
517
|
+
w.add('\n\n\n');
|
|
518
|
+
expect(w.line).toBe(3);
|
|
519
|
+
expect(w.column).toBe(0);
|
|
520
|
+
expect(w.toString()).toBe('\n\n\n');
|
|
521
|
+
});
|
|
522
|
+
});
|
|
523
|
+
});
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { OutputWriter, getPrintOptions } from '../print.js';
|
|
3
|
+
import { any } from '../../../index.js';
|
|
4
|
+
|
|
5
|
+
describe('processPrePost with capture', () => {
|
|
6
|
+
let w: OutputWriter;
|
|
7
|
+
let options: ReturnType<typeof getPrintOptions>;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
w = new OutputWriter();
|
|
11
|
+
options = getPrintOptions({ writer: w });
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('processPrePost returns correct value for array with newline string', () => {
|
|
15
|
+
const node = any('test');
|
|
16
|
+
node.pre = ['\n '];
|
|
17
|
+
|
|
18
|
+
const result = node.processPrePost('pre', '', options);
|
|
19
|
+
expect(result).toBe('\n ');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('capture properly captures output from processPrePost with array containing newline string', () => {
|
|
23
|
+
const node = any('test');
|
|
24
|
+
node.pre = ['\n '];
|
|
25
|
+
|
|
26
|
+
const captured = w.capture(() => {
|
|
27
|
+
node.processPrePost('pre', '', options);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
expect(captured).toBe('\n ');
|
|
31
|
+
expect(w.toString()).toBe('');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('capture properly captures output from processPrePost with array containing multiple strings', () => {
|
|
35
|
+
const node = any('test');
|
|
36
|
+
node.pre = ['\n ', ' more'];
|
|
37
|
+
|
|
38
|
+
const captured = w.capture(() => {
|
|
39
|
+
node.processPrePost('pre', '', options);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
expect(captured).toBe('\n more');
|
|
43
|
+
expect(w.toString()).toBe('');
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('capture properly captures output from processPrePost with array containing single space string', () => {
|
|
47
|
+
const node = any('test');
|
|
48
|
+
node.pre = [' '];
|
|
49
|
+
|
|
50
|
+
const captured = w.capture(() => {
|
|
51
|
+
node.processPrePost('pre', '', options);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
expect(captured).toBe(' ');
|
|
55
|
+
expect(w.toString()).toBe('');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('capture properly captures output from processPrePost with array containing empty string', () => {
|
|
59
|
+
const node = any('test');
|
|
60
|
+
node.pre = [''];
|
|
61
|
+
|
|
62
|
+
const captured = w.capture(() => {
|
|
63
|
+
node.processPrePost('pre', '', options);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
expect(captured).toBe('');
|
|
67
|
+
expect(w.toString()).toBe('');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('capture properly captures output from processPrePost with array containing only newline', () => {
|
|
71
|
+
const node = any('test');
|
|
72
|
+
node.pre = ['\n'];
|
|
73
|
+
|
|
74
|
+
const captured = w.capture(() => {
|
|
75
|
+
node.processPrePost('pre', '', options);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
expect(captured).toBe('\n');
|
|
79
|
+
expect(w.toString()).toBe('');
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('capture properly captures output from processPrePost with array containing tab and spaces', () => {
|
|
83
|
+
const node = any('test');
|
|
84
|
+
node.pre = ['\n\t '];
|
|
85
|
+
|
|
86
|
+
const captured = w.capture(() => {
|
|
87
|
+
node.processPrePost('pre', '', options);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
expect(captured).toBe('\n\t ');
|
|
91
|
+
expect(w.toString()).toBe('');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('capture properly captures output when processPrePost is called multiple times', () => {
|
|
95
|
+
const node = any('test');
|
|
96
|
+
node.pre = ['\n '];
|
|
97
|
+
|
|
98
|
+
const captured1 = w.capture(() => {
|
|
99
|
+
node.processPrePost('pre', '', options);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const captured2 = w.capture(() => {
|
|
103
|
+
node.processPrePost('pre', '', options);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expect(captured1).toBe('\n ');
|
|
107
|
+
expect(captured2).toBe('\n ');
|
|
108
|
+
expect(w.toString()).toBe('');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('capture properly captures output when there is existing content in writer', () => {
|
|
112
|
+
w.add('existing');
|
|
113
|
+
const node = any('test');
|
|
114
|
+
node.pre = ['\n '];
|
|
115
|
+
|
|
116
|
+
const captured = w.capture(() => {
|
|
117
|
+
node.processPrePost('pre', '', options);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
expect(captured).toBe('\n ');
|
|
121
|
+
expect(w.toString()).toBe('existing');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('processPrePost with numeric value 1 returns single space', () => {
|
|
125
|
+
const node = any('test');
|
|
126
|
+
node.pre = 1;
|
|
127
|
+
|
|
128
|
+
const result = node.processPrePost('pre', '', options);
|
|
129
|
+
expect(result).toBe(' ');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('capture properly captures output from processPrePost with numeric value 1', () => {
|
|
133
|
+
const node = any('test');
|
|
134
|
+
node.pre = 1;
|
|
135
|
+
|
|
136
|
+
const captured = w.capture(() => {
|
|
137
|
+
node.processPrePost('pre', '', options);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
expect(captured).toBe(' ');
|
|
141
|
+
expect(w.toString()).toBe('');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('processPrePost with numeric value 0 returns empty string', () => {
|
|
145
|
+
const node = any('test');
|
|
146
|
+
node.pre = 0;
|
|
147
|
+
|
|
148
|
+
const result = node.processPrePost('pre', '', options);
|
|
149
|
+
expect(result).toBe('');
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it('capture properly captures output from processPrePost with numeric value 0', () => {
|
|
153
|
+
const node = any('test');
|
|
154
|
+
node.pre = 0;
|
|
155
|
+
|
|
156
|
+
const captured = w.capture(() => {
|
|
157
|
+
node.processPrePost('pre', '', options);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
expect(captured).toBe('');
|
|
161
|
+
expect(w.toString()).toBe('');
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('processPrePost with string value returns that string', () => {
|
|
165
|
+
const node = any('test');
|
|
166
|
+
node.pre = [' '];
|
|
167
|
+
|
|
168
|
+
const result = node.processPrePost('pre', '', options);
|
|
169
|
+
expect(result).toBe(' ');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('capture properly captures output from processPrePost with string value', () => {
|
|
173
|
+
const node = any('test');
|
|
174
|
+
node.pre = [' '];
|
|
175
|
+
|
|
176
|
+
const captured = w.capture(() => {
|
|
177
|
+
node.processPrePost('pre', '', options);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
expect(captured).toBe(' ');
|
|
181
|
+
expect(w.toString()).toBe('');
|
|
182
|
+
});
|
|
183
|
+
});
|