@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,537 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { Color, ColorFormat, Dimension, Num } from '../index.js';
|
|
3
|
+
import { Call, List } from '../index.js';
|
|
4
|
+
import { Context } from '../../context.js';
|
|
5
|
+
import { Node } from '../node.js';
|
|
6
|
+
|
|
7
|
+
describe('Color Node', () => {
|
|
8
|
+
describe('Constructor and Basic Properties', () => {
|
|
9
|
+
it('should create color from RGB values', () => {
|
|
10
|
+
const color = new Color({
|
|
11
|
+
format: ColorFormat.RGB,
|
|
12
|
+
rgb: [255, 0, 0],
|
|
13
|
+
alpha: 1
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
expect(color.options.format).toBe(ColorFormat.RGB);
|
|
17
|
+
expect(color.rgb).toEqual([255, 0, 0]);
|
|
18
|
+
expect(color.alpha).toBe(1);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should create color from HSL values', () => {
|
|
22
|
+
const color = new Color({
|
|
23
|
+
format: ColorFormat.HSL,
|
|
24
|
+
hsl: [0, 1, 0.5],
|
|
25
|
+
alpha: 1
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
expect(color.options.format).toBe(ColorFormat.HSL);
|
|
29
|
+
expect(color.hsl).toEqual([0, 1, 0.5]); // Clamped values (decimals)
|
|
30
|
+
expect(color.alpha).toBe(1);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should create color from hex string', () => {
|
|
34
|
+
const color = new Color('#ff0000');
|
|
35
|
+
|
|
36
|
+
expect(color.options.format).toBe(ColorFormat.HEX);
|
|
37
|
+
expect(color.rgb).toEqual([255, 0, 0]);
|
|
38
|
+
expect(color.alpha).toBe(1);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should create color from hex string with alpha', () => {
|
|
42
|
+
const color = new Color('#ff000080');
|
|
43
|
+
|
|
44
|
+
expect(color.options.format).toBe(ColorFormat.HEX);
|
|
45
|
+
expect(color.rgb).toEqual([255, 0, 0]);
|
|
46
|
+
expect(color.alpha).toBeCloseTo(0.5, 2);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should create color from named color', () => {
|
|
50
|
+
const color = new Color({
|
|
51
|
+
format: ColorFormat.HEX,
|
|
52
|
+
node: 'red',
|
|
53
|
+
rgb: [255, 0, 0],
|
|
54
|
+
alpha: 1
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
expect(color.options.format).toBe(ColorFormat.HEX);
|
|
58
|
+
expect(color.rgb).toEqual([255, 0, 0]);
|
|
59
|
+
expect(color.alpha).toBe(1);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('Clamped vs Unclamped Values', () => {
|
|
64
|
+
it('should clamp RGB values in public getter', () => {
|
|
65
|
+
const color = new Color({
|
|
66
|
+
format: ColorFormat.RGB,
|
|
67
|
+
rgb: [300, -50, 128.7],
|
|
68
|
+
alpha: 1
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Public getter should clamp
|
|
72
|
+
expect(color.rgb).toEqual([255, 0, 129]);
|
|
73
|
+
|
|
74
|
+
// Internal getter should preserve unclamped values
|
|
75
|
+
expect(color._rgb).toEqual([300, -50, 128.7]);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should clamp HSL values in public getter', () => {
|
|
79
|
+
const color = new Color({
|
|
80
|
+
format: ColorFormat.HSL,
|
|
81
|
+
hsl: [450, 1.5, -0.2],
|
|
82
|
+
alpha: 1
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Public getter should clamp
|
|
86
|
+
expect(color.hsl).toEqual([90, 1, 0]);
|
|
87
|
+
|
|
88
|
+
// Internal getter should preserve unclamped values
|
|
89
|
+
expect(color._hsl).toEqual([450, 1.5, -0.2]);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('should clamp alpha value in public getter', () => {
|
|
93
|
+
const color = new Color({
|
|
94
|
+
format: ColorFormat.RGB,
|
|
95
|
+
rgb: [255, 0, 0],
|
|
96
|
+
alpha: 1.5
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Public getter should clamp
|
|
100
|
+
expect(color.alpha).toBe(1);
|
|
101
|
+
|
|
102
|
+
// Internal getter should preserve unclamped value
|
|
103
|
+
expect(color._alpha).toBe(1.5);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe('RGB/HSL Conversion', () => {
|
|
108
|
+
it('should convert RGB to HSL correctly', () => {
|
|
109
|
+
const color = new Color({
|
|
110
|
+
format: ColorFormat.RGB,
|
|
111
|
+
rgb: [255, 0, 0],
|
|
112
|
+
alpha: 1
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
expect(color.hsl).toEqual([0, 1, 0.5]);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should convert HSL to RGB correctly', () => {
|
|
119
|
+
const color = new Color({
|
|
120
|
+
format: ColorFormat.HSL,
|
|
121
|
+
hsl: [0, 1, 0.5],
|
|
122
|
+
alpha: 1
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
expect(color.rgb).toEqual([255, 0, 0]);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('should handle grayscale colors', () => {
|
|
129
|
+
const color = new Color({
|
|
130
|
+
format: ColorFormat.RGB,
|
|
131
|
+
rgb: [128, 128, 128],
|
|
132
|
+
alpha: 1
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
expect(color.hsl[0]).toBeCloseTo(0, 2);
|
|
136
|
+
expect(color.hsl[1]).toBeCloseTo(0, 2);
|
|
137
|
+
expect(color.hsl[2]).toBeCloseTo(0.5, 2);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe('Operations', () => {
|
|
142
|
+
it('should add colors correctly', () => {
|
|
143
|
+
const color1 = new Color({
|
|
144
|
+
format: ColorFormat.RGB,
|
|
145
|
+
rgb: [100, 50, 25],
|
|
146
|
+
alpha: 1
|
|
147
|
+
});
|
|
148
|
+
const color2 = new Color({
|
|
149
|
+
format: ColorFormat.RGB,
|
|
150
|
+
rgb: [50, 100, 75],
|
|
151
|
+
alpha: 0.5
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const result = color1.operate(color2, '+');
|
|
155
|
+
|
|
156
|
+
expect(result.rgb).toEqual([150, 150, 100]);
|
|
157
|
+
expect(result.alpha).toBe(1); // alpha blending: 1 * (1 - 0.5) + 0.5 = 1
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it('should subtract colors correctly', () => {
|
|
161
|
+
const color1 = new Color({
|
|
162
|
+
format: ColorFormat.RGB,
|
|
163
|
+
rgb: [200, 150, 100],
|
|
164
|
+
alpha: 1
|
|
165
|
+
});
|
|
166
|
+
const color2 = new Color({
|
|
167
|
+
format: ColorFormat.RGB,
|
|
168
|
+
rgb: [50, 25, 10],
|
|
169
|
+
alpha: 0.5
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
const result = color1.operate(color2, '-');
|
|
173
|
+
|
|
174
|
+
expect(result.rgb).toEqual([150, 125, 90]);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('should multiply colors correctly', () => {
|
|
178
|
+
const color1 = new Color({
|
|
179
|
+
format: ColorFormat.RGB,
|
|
180
|
+
rgb: [100, 200, 50],
|
|
181
|
+
alpha: 1
|
|
182
|
+
});
|
|
183
|
+
const color2 = new Color({
|
|
184
|
+
format: ColorFormat.RGB,
|
|
185
|
+
rgb: [2, 0.5, 3],
|
|
186
|
+
alpha: 0.5
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const result = color1.operate(color2, '*');
|
|
190
|
+
|
|
191
|
+
expect(result.rgb).toEqual([200, 100, 150]);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('should operate with numbers', () => {
|
|
195
|
+
const color = new Color({
|
|
196
|
+
format: ColorFormat.RGB,
|
|
197
|
+
rgb: [100, 200, 50],
|
|
198
|
+
alpha: 1
|
|
199
|
+
});
|
|
200
|
+
const num = new Num({ number: 2 });
|
|
201
|
+
|
|
202
|
+
const result = color.operate(num, '*');
|
|
203
|
+
|
|
204
|
+
expect(result.rgb).toEqual([200, 255, 100]);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('should preserve format during operations', () => {
|
|
208
|
+
const color1 = new Color({
|
|
209
|
+
format: ColorFormat.HSL,
|
|
210
|
+
hsl: [180, 0.5, 0.5],
|
|
211
|
+
alpha: 1
|
|
212
|
+
});
|
|
213
|
+
const color2 = new Color({
|
|
214
|
+
format: ColorFormat.HSL,
|
|
215
|
+
hsl: [90, 0.25, 0.25],
|
|
216
|
+
alpha: 0.5
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
const result = color1.operate(color2, '+');
|
|
220
|
+
|
|
221
|
+
expect(result.options.format).toBe(ColorFormat.HSL);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
describe('Serialization', () => {
|
|
226
|
+
it('should serialize RGB colors correctly', () => {
|
|
227
|
+
const color = new Color({
|
|
228
|
+
format: ColorFormat.RGB,
|
|
229
|
+
rgb: [255, 0, 0],
|
|
230
|
+
alpha: 1
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
expect(color.toTrimmedString()).toBe('rgb(255, 0, 0)');
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('should serialize RGBA colors correctly', () => {
|
|
237
|
+
const color = new Color({
|
|
238
|
+
format: ColorFormat.RGB,
|
|
239
|
+
rgb: [255, 0, 0],
|
|
240
|
+
alpha: 0.5
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
expect(color.toTrimmedString()).toBe('rgba(255, 0, 0, 0.5)');
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it('should serialize HSL colors correctly', () => {
|
|
247
|
+
const color = new Color({
|
|
248
|
+
format: ColorFormat.HSL,
|
|
249
|
+
hsl: [180, 0.5, 0.5],
|
|
250
|
+
alpha: 1
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
expect(color.toTrimmedString()).toBe('hsl(180, 50%, 50%)');
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
it('should serialize HSLA colors correctly', () => {
|
|
257
|
+
const color = new Color({
|
|
258
|
+
format: ColorFormat.HSL,
|
|
259
|
+
hsl: [180, 0.5, 0.5],
|
|
260
|
+
alpha: 0.5
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
expect(color.toTrimmedString()).toBe('hsla(180, 50%, 50%, 0.5)');
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
it('should serialize hex colors correctly', () => {
|
|
267
|
+
const color = new Color('#ff0000');
|
|
268
|
+
|
|
269
|
+
expect(color.toTrimmedString()).toBe('#ff0000');
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it('should preserve original function call syntax when node is present', () => {
|
|
273
|
+
const callNode = new Call({
|
|
274
|
+
name: 'rgba',
|
|
275
|
+
args: new List([
|
|
276
|
+
new Dimension({ number: 0, unit: '' }),
|
|
277
|
+
new Dimension({ number: 0, unit: '' }),
|
|
278
|
+
new Dimension({ number: 0, unit: '' }),
|
|
279
|
+
new Dimension({ number: 0.1, unit: '' })
|
|
280
|
+
])
|
|
281
|
+
});
|
|
282
|
+
const color = new Color({
|
|
283
|
+
format: ColorFormat.RGB,
|
|
284
|
+
node: callNode,
|
|
285
|
+
rgb: [0, 0, 0],
|
|
286
|
+
alpha: 0.1
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
expect(color.toTrimmedString()).toBe('rgba(0, 0, 0, 0.1)');
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it('should preserve string nodes (like hex strings)', () => {
|
|
293
|
+
const color = new Color({
|
|
294
|
+
format: ColorFormat.HEX,
|
|
295
|
+
node: '#ff0000',
|
|
296
|
+
rgb: [255, 0, 0],
|
|
297
|
+
alpha: 1
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
expect(color.toTrimmedString()).toBe('#ff0000');
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('should fall back to standard format when no node is present', () => {
|
|
304
|
+
const color = new Color({
|
|
305
|
+
format: ColorFormat.RGB,
|
|
306
|
+
rgb: [255, 0, 0],
|
|
307
|
+
alpha: 1
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
expect(color.toTrimmedString()).toBe('rgb(255, 0, 0)');
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
describe('compare', () => {
|
|
315
|
+
it('compares semantically equal colors across formats as equal', () => {
|
|
316
|
+
const left = new Color('#ff0000');
|
|
317
|
+
const right = new Color({
|
|
318
|
+
format: ColorFormat.HSL,
|
|
319
|
+
hsl: [0, 1, 0.5],
|
|
320
|
+
alpha: 1
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
expect(left.compare(right, new Context())).toBe(0);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('compares colors by normalized rgba channels instead of node object identity', () => {
|
|
327
|
+
const left = new Color({
|
|
328
|
+
format: ColorFormat.RGB,
|
|
329
|
+
rgb: [255, 0, 0],
|
|
330
|
+
alpha: 1
|
|
331
|
+
});
|
|
332
|
+
const right = new Color({
|
|
333
|
+
format: ColorFormat.RGB,
|
|
334
|
+
rgb: [0, 0, 255],
|
|
335
|
+
alpha: 1
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
expect(left.compare(right, new Context())).toBe(1);
|
|
339
|
+
expect(right.compare(left, new Context())).toBe(-1);
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
it('forwards compare(context) through contextual valueOf on the generic node path', () => {
|
|
343
|
+
class ContextualNode extends Node<string> {
|
|
344
|
+
static override childKeys = null as null;
|
|
345
|
+
raw: string;
|
|
346
|
+
|
|
347
|
+
constructor(value: string) {
|
|
348
|
+
super(value);
|
|
349
|
+
this.raw = value;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
override valueOf(context?: Context) {
|
|
353
|
+
return context?.id ?? this.raw;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const left = new ContextualNode('left');
|
|
358
|
+
const right = new ContextualNode('right');
|
|
359
|
+
const context = new Context();
|
|
360
|
+
context.id = 'shared';
|
|
361
|
+
|
|
362
|
+
expect(left.compare(right, context)).toBe(0);
|
|
363
|
+
expect(left.compare(right)).toBe(-1);
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
describe('Clamping During Serialization', () => {
|
|
368
|
+
it('should clamp RGB values during serialization', () => {
|
|
369
|
+
const color = new Color({
|
|
370
|
+
format: ColorFormat.RGB,
|
|
371
|
+
rgb: [300, -50, 128.7],
|
|
372
|
+
alpha: 1
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
expect(color.toTrimmedString()).toBe('rgb(255, 0, 129)');
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
it('should clamp RGBA values during serialization', () => {
|
|
379
|
+
const color = new Color({
|
|
380
|
+
format: ColorFormat.RGB,
|
|
381
|
+
rgb: [300, -50, 128.7],
|
|
382
|
+
alpha: 0.5
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
expect(color.toTrimmedString()).toBe('rgba(255, 0, 129, 0.5)');
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
it('should clamp HSL values during serialization', () => {
|
|
389
|
+
const color = new Color({
|
|
390
|
+
format: ColorFormat.HSL,
|
|
391
|
+
hsl: [450, 1.5, -0.2],
|
|
392
|
+
alpha: 1
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
expect(color.toTrimmedString()).toBe('hsl(90, 100%, 0%)');
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
it('should clamp HSLA values during serialization', () => {
|
|
399
|
+
const color = new Color({
|
|
400
|
+
format: ColorFormat.HSL,
|
|
401
|
+
hsl: [450, 1.5, -0.2],
|
|
402
|
+
alpha: 0.5
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
expect(color.toTrimmedString()).toBe('hsla(90, 100%, 0%, 0.5)');
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
describe('call-backed colors', () => {
|
|
410
|
+
it('should preserve Call node for RGB function colors', () => {
|
|
411
|
+
const args = [
|
|
412
|
+
new Dimension({ number: 255, unit: '' }),
|
|
413
|
+
new Dimension({ number: 0, unit: '' }),
|
|
414
|
+
new Dimension({ number: 0, unit: '' })
|
|
415
|
+
];
|
|
416
|
+
const callNode = new Call({ name: 'rgb', args: args as any });
|
|
417
|
+
|
|
418
|
+
const color = new Color({
|
|
419
|
+
node: callNode,
|
|
420
|
+
rgb: [255, 0, 0],
|
|
421
|
+
alpha: 1
|
|
422
|
+
}, { format: ColorFormat.RGB });
|
|
423
|
+
|
|
424
|
+
expect(color.options.format).toBe(ColorFormat.RGB);
|
|
425
|
+
expect(color._nodeValue).toBeInstanceOf(Call);
|
|
426
|
+
expect((color._nodeValue as Call).get('name')).toBe('rgb');
|
|
427
|
+
expect(color.alpha).toBe(1);
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
it('should preserve Call node for HSL function colors', () => {
|
|
431
|
+
const args = [
|
|
432
|
+
new Dimension({ number: 0, unit: 'deg' }),
|
|
433
|
+
new Dimension({ number: 100, unit: '%' }),
|
|
434
|
+
new Dimension({ number: 50, unit: '%' })
|
|
435
|
+
];
|
|
436
|
+
const callNode = new Call({ name: 'hsl', args: args as any });
|
|
437
|
+
|
|
438
|
+
const color = new Color({
|
|
439
|
+
node: callNode,
|
|
440
|
+
hsl: [[0, 'deg'], [100, '%'], [50, '%']],
|
|
441
|
+
alpha: 1
|
|
442
|
+
}, { format: ColorFormat.HSL });
|
|
443
|
+
|
|
444
|
+
expect(color.options.format).toBe(ColorFormat.HSL);
|
|
445
|
+
expect(color._nodeValue).toBeInstanceOf(Call);
|
|
446
|
+
expect((color._nodeValue as Call).get('name')).toBe('hsl');
|
|
447
|
+
expect(color.alpha).toBe(1);
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
describe('RGBA/HSLA Getters', () => {
|
|
452
|
+
it('should return RGBA values correctly', () => {
|
|
453
|
+
const color = new Color({
|
|
454
|
+
format: ColorFormat.RGB,
|
|
455
|
+
rgb: [255, 0, 0],
|
|
456
|
+
alpha: 0.5
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
expect(color.rgba).toEqual([255, 0, 0, 0.5]);
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
it('should return HSLA values correctly', () => {
|
|
463
|
+
const color = new Color({
|
|
464
|
+
format: ColorFormat.HSL,
|
|
465
|
+
hsl: [180, 0.5, 0.5],
|
|
466
|
+
alpha: 0.5
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
expect(color.hsla).toEqual([180, 0.5, 0.5, 0.5]);
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
it('should set RGBA values correctly', () => {
|
|
473
|
+
const color = new Color({
|
|
474
|
+
format: ColorFormat.RGB,
|
|
475
|
+
rgb: [0, 0, 0],
|
|
476
|
+
alpha: 1
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
color.rgba = [255, 0, 0, 0.5];
|
|
480
|
+
|
|
481
|
+
expect(color.rgb).toEqual([255, 0, 0]);
|
|
482
|
+
expect(color.alpha).toBe(0.5);
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
it('should set HSLA values correctly', () => {
|
|
486
|
+
const color = new Color({
|
|
487
|
+
format: ColorFormat.HSL,
|
|
488
|
+
hsl: [0, 0, 0],
|
|
489
|
+
alpha: 1
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
color.hsla = [180, 50, 50, 0.5];
|
|
493
|
+
|
|
494
|
+
expect(color.hsl).toEqual([180, 1, 1]);
|
|
495
|
+
expect(color.alpha).toBe(0.5);
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
describe('Error Handling', () => {
|
|
500
|
+
it('should throw error for invalid color value', () => {
|
|
501
|
+
expect(() => {
|
|
502
|
+
new Color({
|
|
503
|
+
format: ColorFormat.RGB,
|
|
504
|
+
// Missing rgb and hsl
|
|
505
|
+
alpha: 1
|
|
506
|
+
});
|
|
507
|
+
}).toThrow();
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
it('should throw error for invalid operation with dimension with unit', () => {
|
|
511
|
+
const color = new Color({
|
|
512
|
+
format: ColorFormat.RGB,
|
|
513
|
+
rgb: [255, 0, 0],
|
|
514
|
+
alpha: 1
|
|
515
|
+
});
|
|
516
|
+
const dimension = new Dimension({ number: 10, unit: 'px' });
|
|
517
|
+
const context = new Context({ unitMode: 'strict' });
|
|
518
|
+
|
|
519
|
+
expect(() => {
|
|
520
|
+
color.operate(dimension, '+', context);
|
|
521
|
+
}).toThrow('Cannot convert "10px" to a color');
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
it('should throw error for invalid operation with non-color', () => {
|
|
525
|
+
const color = new Color({
|
|
526
|
+
format: ColorFormat.RGB,
|
|
527
|
+
rgb: [255, 0, 0],
|
|
528
|
+
alpha: 1
|
|
529
|
+
});
|
|
530
|
+
const list = new List([]);
|
|
531
|
+
|
|
532
|
+
expect(() => {
|
|
533
|
+
color.operate(list, '+');
|
|
534
|
+
}).toThrow('Cannot operate on List');
|
|
535
|
+
});
|
|
536
|
+
});
|
|
537
|
+
});
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { amp, bool, co, condition, dimension, el, num, rules, ruleset, sel, sellist, seq } from '../index.js';
|
|
2
|
+
import { Context } from '../../context.js';
|
|
3
|
+
|
|
4
|
+
let context: Context;
|
|
5
|
+
|
|
6
|
+
describe('Condition', () => {
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
context = new Context();
|
|
9
|
+
});
|
|
10
|
+
describe('serialization', () => {
|
|
11
|
+
it('should serialize a condition', () => {
|
|
12
|
+
let node = condition([
|
|
13
|
+
bool(true),
|
|
14
|
+
'=',
|
|
15
|
+
bool(true)
|
|
16
|
+
]);
|
|
17
|
+
expect(`${node}`).toBe('(true = true)');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should serialize an and', () => {
|
|
21
|
+
let node = condition([
|
|
22
|
+
bool(true),
|
|
23
|
+
'and',
|
|
24
|
+
bool(true)
|
|
25
|
+
]);
|
|
26
|
+
expect(`${node}`).toBe('(true and true)');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should serialize an or', () => {
|
|
30
|
+
let node = condition([
|
|
31
|
+
bool(true),
|
|
32
|
+
'or',
|
|
33
|
+
bool(true)
|
|
34
|
+
]);
|
|
35
|
+
expect(`${node}`).toBe('(true or true)');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should serialize a negated condition', () => {
|
|
39
|
+
let node = condition([
|
|
40
|
+
bool(true),
|
|
41
|
+
'=',
|
|
42
|
+
bool(true)
|
|
43
|
+
], { negate: true });
|
|
44
|
+
expect(`${node}`).toBe('not (true = true)');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('evaluation', () => {
|
|
49
|
+
it('should evaluate a condition', async () => {
|
|
50
|
+
let node = condition([
|
|
51
|
+
bool(true),
|
|
52
|
+
'=',
|
|
53
|
+
bool(true)
|
|
54
|
+
]);
|
|
55
|
+
let evald = await node.eval(context);
|
|
56
|
+
expect(evald.render(context)).toBe('true');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('should evaluate a condition', async () => {
|
|
60
|
+
let node = condition([
|
|
61
|
+
bool(true),
|
|
62
|
+
'=',
|
|
63
|
+
bool(false)
|
|
64
|
+
]);
|
|
65
|
+
let evald = await node.eval(context);
|
|
66
|
+
expect(evald.render(context)).toBe('false');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should evaluate a condition', async () => {
|
|
70
|
+
let node = condition([
|
|
71
|
+
bool(true),
|
|
72
|
+
'=',
|
|
73
|
+
bool(false)
|
|
74
|
+
]);
|
|
75
|
+
let evald = await node.eval(context);
|
|
76
|
+
expect(evald.render(context)).toBe('false');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('should compare dimensions', async () => {
|
|
80
|
+
let node = condition([
|
|
81
|
+
num(10),
|
|
82
|
+
'=',
|
|
83
|
+
num(10)
|
|
84
|
+
]);
|
|
85
|
+
let evald = await node.eval(context);
|
|
86
|
+
expect(evald.render(context)).toBe('true');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should compare dimensions', async () => {
|
|
90
|
+
let node = condition([
|
|
91
|
+
num(10),
|
|
92
|
+
'=',
|
|
93
|
+
num(11)
|
|
94
|
+
]);
|
|
95
|
+
let evald = await node.eval(context);
|
|
96
|
+
expect(evald.render(context)).toBe('false');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('should compare dimensions', async () => {
|
|
100
|
+
let node = condition([
|
|
101
|
+
dimension([10, 'px']),
|
|
102
|
+
'=',
|
|
103
|
+
dimension([10, 'px'])
|
|
104
|
+
]);
|
|
105
|
+
let evald = await node.eval(context);
|
|
106
|
+
expect(evald.render(context)).toBe('true');
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should compare dimensions', async () => {
|
|
110
|
+
let node = condition([
|
|
111
|
+
dimension([1, 's']),
|
|
112
|
+
'=',
|
|
113
|
+
dimension([1000, 'ms'])
|
|
114
|
+
]);
|
|
115
|
+
let evald = await node.eval(context);
|
|
116
|
+
expect(evald.render(context)).toBe('true');
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe('cloned mutation', () => {
|
|
121
|
+
it('renders cloned operands and negate without mutating the canonical node', () => {
|
|
122
|
+
const node = condition([
|
|
123
|
+
bool(true),
|
|
124
|
+
'=',
|
|
125
|
+
bool(false)
|
|
126
|
+
]);
|
|
127
|
+
const clonedNode = node.clone();
|
|
128
|
+
const left = bool(false);
|
|
129
|
+
const right = bool(true);
|
|
130
|
+
|
|
131
|
+
clonedNode.adopt(left, context);
|
|
132
|
+
clonedNode.adopt(right, context);
|
|
133
|
+
(clonedNode as unknown as { left: ReturnType<typeof bool> }).left = left;
|
|
134
|
+
(clonedNode as unknown as { operator: string }).operator = 'or';
|
|
135
|
+
(clonedNode as unknown as { right: ReturnType<typeof bool> }).right = right;
|
|
136
|
+
(clonedNode as unknown as { negate: boolean }).negate = true;
|
|
137
|
+
|
|
138
|
+
expect(clonedNode.toTrimmedString({ context })).toBe('not (false or true)');
|
|
139
|
+
expect(node.toTrimmedString()).toBe('(true = false)');
|
|
140
|
+
expect(node.get('left').toTrimmedString()).toBe('true');
|
|
141
|
+
expect(node.get('operator')).toBe('=');
|
|
142
|
+
expect(node.get('right')?.toTrimmedString()).toBe('false');
|
|
143
|
+
expect(node.get('negate')).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('evaluates cloned operands and operator without mutating the canonical node', async () => {
|
|
147
|
+
const node = condition([
|
|
148
|
+
bool(true),
|
|
149
|
+
'and',
|
|
150
|
+
bool(false)
|
|
151
|
+
]);
|
|
152
|
+
const clonedNode = node.clone();
|
|
153
|
+
const left = bool(false);
|
|
154
|
+
const right = bool(true);
|
|
155
|
+
|
|
156
|
+
clonedNode.adopt(left, context);
|
|
157
|
+
clonedNode.adopt(right, context);
|
|
158
|
+
(clonedNode as unknown as { left: ReturnType<typeof bool> }).left = left;
|
|
159
|
+
(clonedNode as unknown as { operator: string }).operator = 'or';
|
|
160
|
+
(clonedNode as unknown as { right: ReturnType<typeof bool> }).right = right;
|
|
161
|
+
|
|
162
|
+
const evald = await clonedNode.eval(context);
|
|
163
|
+
|
|
164
|
+
expect(evald.render(context)).toBe('true');
|
|
165
|
+
expect(`${await node.eval(new Context())}`).toBe('false');
|
|
166
|
+
expect(node.get('left').toTrimmedString()).toBe('true');
|
|
167
|
+
expect(node.get('operator')).toBe('and');
|
|
168
|
+
expect(node.get('right')?.toTrimmedString()).toBe('false');
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('evaluates cloned negate without mutating the canonical node', async () => {
|
|
172
|
+
const node = condition([
|
|
173
|
+
bool(true)
|
|
174
|
+
]);
|
|
175
|
+
const clonedNode = node.clone();
|
|
176
|
+
|
|
177
|
+
(clonedNode as unknown as { negate: boolean }).negate = true;
|
|
178
|
+
|
|
179
|
+
const evald = await clonedNode.eval(context);
|
|
180
|
+
|
|
181
|
+
expect(evald.render(context)).toBe('false');
|
|
182
|
+
expect(`${await node.eval(new Context())}`).toBe('true');
|
|
183
|
+
expect(node.get('negate')).toBe(false);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
});
|