@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,547 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { defineFunction, callWithContext, type FunctionThis } from '../define-function.js';
|
|
3
|
+
import { Context } from '../context.js';
|
|
4
|
+
import { List, Sequence, Operation, Num, Dimension, Color } from '../tree/index.js';
|
|
5
|
+
import { splitSequence } from '../conversions.js';
|
|
6
|
+
|
|
7
|
+
describe('defineFunction - splitSequence', () => {
|
|
8
|
+
describe('splitSequence functionality', () => {
|
|
9
|
+
it('should preserve parser-equivalent positional shape: Sequence argument', async () => {
|
|
10
|
+
const func = defineFunction(
|
|
11
|
+
'probe',
|
|
12
|
+
function(value: Sequence) {
|
|
13
|
+
return `type:${value.type};len:${value.get('value').length}`;
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
params: [
|
|
17
|
+
{ name: 'value', type: Sequence }
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const parserEquivalentArg = new Sequence([new Num(1), new Num(2), new Num(3)]);
|
|
23
|
+
|
|
24
|
+
const context = new Context();
|
|
25
|
+
const result = await callWithContext(context, func, parserEquivalentArg);
|
|
26
|
+
expect(result).toBe('type:Sequence;len:3');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should split a sequence into individual arguments', async () => {
|
|
30
|
+
const rgb = defineFunction(
|
|
31
|
+
'rgb',
|
|
32
|
+
function(r: Num, g: Num, b: Num) {
|
|
33
|
+
return `rgb(${r} ${g} ${b})`;
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
params: [
|
|
37
|
+
{ name: 'r', type: Num },
|
|
38
|
+
{ name: 'g', type: Num },
|
|
39
|
+
{ name: 'b', type: Num }
|
|
40
|
+
],
|
|
41
|
+
preprocessParams: [splitSequence()]
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
// Create a sequence: [255, 128, 64]
|
|
46
|
+
const sequence = new Sequence([
|
|
47
|
+
new Num(255),
|
|
48
|
+
new Num(128),
|
|
49
|
+
new Num(64)
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
const context = new Context();
|
|
53
|
+
const result = await callWithContext(context, rgb, sequence);
|
|
54
|
+
|
|
55
|
+
expect(result).toBe('rgb(255 128 64)');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('should handle sequence with slash operation', async () => {
|
|
59
|
+
const rgba = defineFunction(
|
|
60
|
+
'rgba',
|
|
61
|
+
function(r: Num, g: Num, b: Num, a: Dimension) {
|
|
62
|
+
return `rgba(${r} ${g} ${b} / ${a})`;
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
params: [
|
|
66
|
+
{ name: 'r', type: Num },
|
|
67
|
+
{ name: 'g', type: Num },
|
|
68
|
+
{ name: 'b', type: Num },
|
|
69
|
+
{ name: 'a', type: Dimension }
|
|
70
|
+
],
|
|
71
|
+
preprocessParams: [splitSequence()]
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
// Create a sequence: [255, 255, 255, [50%, '/', undefined]]
|
|
76
|
+
const operation = new Operation([
|
|
77
|
+
new Dimension({ number: 50, unit: '%' }),
|
|
78
|
+
'/',
|
|
79
|
+
new Num(0) // placeholder for undefined
|
|
80
|
+
]);
|
|
81
|
+
|
|
82
|
+
const sequence = new Sequence([
|
|
83
|
+
new Num(255),
|
|
84
|
+
new Num(255),
|
|
85
|
+
new Num(255),
|
|
86
|
+
operation
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
const context = new Context();
|
|
90
|
+
const result = await callWithContext(context, rgba, sequence);
|
|
91
|
+
|
|
92
|
+
// The operation evaluation works correctly
|
|
93
|
+
expect(result).toBe('rgba(255 255 255 / 50%)');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('should not split sequence when preprocessParams is not provided', async () => {
|
|
97
|
+
const func = defineFunction(
|
|
98
|
+
'test',
|
|
99
|
+
function(args: Sequence) {
|
|
100
|
+
return `received: ${args}`;
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
params: [
|
|
104
|
+
{ name: 'args', type: Sequence }
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const sequence = new Sequence([
|
|
110
|
+
new Num(1),
|
|
111
|
+
new Num(2),
|
|
112
|
+
new Num(3)
|
|
113
|
+
]);
|
|
114
|
+
|
|
115
|
+
const context = new Context();
|
|
116
|
+
const result = await callWithContext(context, func, sequence);
|
|
117
|
+
|
|
118
|
+
expect(result).toContain('received:');
|
|
119
|
+
// The function receives the Sequence directly
|
|
120
|
+
expect(result).toContain('1 2 3');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('should handle empty sequence', async () => {
|
|
124
|
+
const func = defineFunction(
|
|
125
|
+
'test',
|
|
126
|
+
function() {
|
|
127
|
+
return 'empty';
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
params: [],
|
|
131
|
+
preprocessParams: [splitSequence()]
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
const sequence = new Sequence([]);
|
|
136
|
+
const context = new Context();
|
|
137
|
+
const result = await callWithContext(context, func, sequence);
|
|
138
|
+
|
|
139
|
+
expect(result).toBe('empty');
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('should handle sequence with single item', async () => {
|
|
143
|
+
const func = defineFunction(
|
|
144
|
+
'test',
|
|
145
|
+
function(value: Num) {
|
|
146
|
+
return `value: ${value}`;
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
params: [
|
|
150
|
+
{ name: 'value', type: Num }
|
|
151
|
+
],
|
|
152
|
+
preprocessParams: [splitSequence()]
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
const sequence = new Sequence([new Num(42)]);
|
|
157
|
+
const context = new Context();
|
|
158
|
+
const result = await callWithContext(context, func, sequence);
|
|
159
|
+
|
|
160
|
+
expect(result).toBe('value: 42');
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('FunctionThis type', () => {
|
|
165
|
+
it('should provide context and args function', async () => {
|
|
166
|
+
const func = defineFunction(
|
|
167
|
+
'test',
|
|
168
|
+
async function(this: FunctionThis, value: Num) {
|
|
169
|
+
expect(this.context).toBeInstanceOf(Context);
|
|
170
|
+
expect(typeof this.args).toBe('function');
|
|
171
|
+
|
|
172
|
+
const evaluatedArgs = await this.args();
|
|
173
|
+
expect(evaluatedArgs).toBeInstanceOf(List);
|
|
174
|
+
|
|
175
|
+
return `context: ${this.context}, args: ${evaluatedArgs}`;
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
params: [
|
|
179
|
+
{ name: 'value', type: Num }
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
const context = new Context();
|
|
185
|
+
const result = await callWithContext(context, func, new Num(42));
|
|
186
|
+
|
|
187
|
+
expect(result).toContain('context:');
|
|
188
|
+
expect(result).toContain('args:');
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('should provide consistent args function regardless of lazy parameters', async () => {
|
|
192
|
+
const func = defineFunction(
|
|
193
|
+
'test',
|
|
194
|
+
async function(this: FunctionThis, value: Num) {
|
|
195
|
+
expect(this.context).toBeInstanceOf(Context);
|
|
196
|
+
expect(typeof this.args).toBe('function');
|
|
197
|
+
|
|
198
|
+
const evaluatedArgs = await this.args();
|
|
199
|
+
expect(evaluatedArgs).toBeInstanceOf(List);
|
|
200
|
+
|
|
201
|
+
return `evaluated args: ${evaluatedArgs}`;
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
params: [
|
|
205
|
+
{ name: 'value', type: Num, lazy: true }
|
|
206
|
+
]
|
|
207
|
+
}
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
const context = new Context();
|
|
211
|
+
const result = await callWithContext(context, func, new Num(42));
|
|
212
|
+
|
|
213
|
+
expect(result).toContain('evaluated args:');
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('should handle mixed lazy and non-lazy parameters with consistent API', async () => {
|
|
217
|
+
const func = defineFunction(
|
|
218
|
+
'test',
|
|
219
|
+
async function(this: FunctionThis, immediate: Num, lazy: Num) {
|
|
220
|
+
expect(this.context).toBeInstanceOf(Context);
|
|
221
|
+
expect(typeof this.args).toBe('function');
|
|
222
|
+
|
|
223
|
+
const evaluatedArgs = await this.args();
|
|
224
|
+
expect(evaluatedArgs).toBeInstanceOf(List);
|
|
225
|
+
|
|
226
|
+
return `immediate: ${immediate}, lazy: ${lazy}, args: ${evaluatedArgs}`;
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
params: [
|
|
230
|
+
{ name: 'immediate', type: Num },
|
|
231
|
+
{ name: 'lazy', type: Num, lazy: true }
|
|
232
|
+
]
|
|
233
|
+
}
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
const context = new Context();
|
|
237
|
+
const result = await callWithContext(context, func, new Num(10), new Num(20));
|
|
238
|
+
|
|
239
|
+
expect(result).toContain('immediate: 10');
|
|
240
|
+
// The lazy parameter is passed as a function, so we expect to see the function representation
|
|
241
|
+
expect(result).toContain('lazy:');
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
describe('integration tests', () => {
|
|
246
|
+
it('should work with real CSS function call pattern', async () => {
|
|
247
|
+
const hsl = defineFunction(
|
|
248
|
+
'hsl',
|
|
249
|
+
function(h: Num, s: Dimension, l: Dimension, a?: Dimension) {
|
|
250
|
+
if (a) {
|
|
251
|
+
return `hsl(${h} ${s} ${l} / ${a})`;
|
|
252
|
+
}
|
|
253
|
+
return `hsl(${h} ${s} ${l})`;
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
params: [
|
|
257
|
+
{ name: 'h', type: Num },
|
|
258
|
+
{ name: 's', type: Dimension },
|
|
259
|
+
{ name: 'l', type: Dimension },
|
|
260
|
+
{ name: 'a', type: Dimension, optional: true }
|
|
261
|
+
],
|
|
262
|
+
preprocessParams: [splitSequence()]
|
|
263
|
+
}
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
// Simulate hsl(180 50% 50% / 0.5)
|
|
267
|
+
const operation = new Operation([
|
|
268
|
+
new Dimension({ number: 0.5 }),
|
|
269
|
+
'/',
|
|
270
|
+
new Num(0)
|
|
271
|
+
]);
|
|
272
|
+
|
|
273
|
+
const sequence = new Sequence([
|
|
274
|
+
new Num(180),
|
|
275
|
+
new Dimension({ number: 50, unit: '%' }),
|
|
276
|
+
new Dimension({ number: 50, unit: '%' }),
|
|
277
|
+
operation
|
|
278
|
+
]);
|
|
279
|
+
|
|
280
|
+
const context = new Context();
|
|
281
|
+
const result = await callWithContext(context, hsl, sequence);
|
|
282
|
+
|
|
283
|
+
// The operation evaluation works correctly
|
|
284
|
+
expect(result).toBe('hsl(180 50% 50% / 0.5)');
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it('should handle complex nested operations', async () => {
|
|
288
|
+
const func = defineFunction(
|
|
289
|
+
'complex',
|
|
290
|
+
function(a: Num, b: Num, c: Num, d: Num, e: Num) {
|
|
291
|
+
return `${a} ${b} ${c} ${d} ${e}`;
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
params: [
|
|
295
|
+
{ name: 'a', type: Num },
|
|
296
|
+
{ name: 'b', type: Num },
|
|
297
|
+
{ name: 'c', type: Num },
|
|
298
|
+
{ name: 'd', type: Num },
|
|
299
|
+
{ name: 'e', type: Num }
|
|
300
|
+
],
|
|
301
|
+
preprocessParams: [splitSequence()]
|
|
302
|
+
}
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
// Create a sequence with multiple operations
|
|
306
|
+
const op1 = new Operation([new Num(3), '+', new Num(1)]);
|
|
307
|
+
const op2 = new Operation([new Num(5), '-', new Num(1)]);
|
|
308
|
+
|
|
309
|
+
const sequence = new Sequence([
|
|
310
|
+
new Num(1),
|
|
311
|
+
new Num(2),
|
|
312
|
+
op1,
|
|
313
|
+
op2,
|
|
314
|
+
new Num(5)
|
|
315
|
+
]);
|
|
316
|
+
|
|
317
|
+
const context = new Context();
|
|
318
|
+
const result = await callWithContext(context, func, sequence);
|
|
319
|
+
|
|
320
|
+
// The operations should be evaluated
|
|
321
|
+
expect(result).toBe('1 2 4 4 5');
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
describe('comprehensive validation tests', () => {
|
|
326
|
+
describe('runtime validation', () => {
|
|
327
|
+
it('should validate direct function calls with type mismatches', () => {
|
|
328
|
+
const func = defineFunction(
|
|
329
|
+
'test',
|
|
330
|
+
(a: Color) => `received: ${a.type}`,
|
|
331
|
+
{ params: [{ name: 'a', type: Color }] }
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
const dimension = new Dimension({ number: 10, unit: 'px' });
|
|
335
|
+
|
|
336
|
+
// This should throw a runtime error
|
|
337
|
+
expect(() => {
|
|
338
|
+
(func as any)(dimension);
|
|
339
|
+
}).toThrow('Argument \'a\' must be of type \'Color\'');
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
it('should validate callWithContext calls with type mismatches', async () => {
|
|
343
|
+
const func = defineFunction(
|
|
344
|
+
'test',
|
|
345
|
+
(a: Color) => `received: ${a.type}`,
|
|
346
|
+
{ params: [{ name: 'a', type: Color }] }
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
const dimension = new Dimension({ number: 10, unit: 'px' });
|
|
350
|
+
const ctx = new Context();
|
|
351
|
+
|
|
352
|
+
// This should throw a runtime error (callWithContext is async)
|
|
353
|
+
await expect(
|
|
354
|
+
callWithContext(ctx, func as any, dimension)
|
|
355
|
+
).rejects.toThrow('Argument \'a\' must be of type \'Color\'');
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
it('should validate lazy parameters when thunks are called', async () => {
|
|
359
|
+
const func = defineFunction(
|
|
360
|
+
'test',
|
|
361
|
+
async (aThunk: () => Promise<Color>) => {
|
|
362
|
+
const a = await aThunk();
|
|
363
|
+
return `received: ${a.type}`;
|
|
364
|
+
},
|
|
365
|
+
{ params: [{ name: 'a', type: Color, lazy: true }] }
|
|
366
|
+
);
|
|
367
|
+
|
|
368
|
+
// Create a Jess node that evaluates to the wrong type
|
|
369
|
+
const dimensionNode = new Dimension({ number: 10, unit: 'px' });
|
|
370
|
+
|
|
371
|
+
// callWithContext should supply a lazy thunk for lazy params;
|
|
372
|
+
// the thunk then fails type validation when invoked.
|
|
373
|
+
const ctx = new Context();
|
|
374
|
+
const result = callWithContext(ctx, func as any, dimensionNode);
|
|
375
|
+
await expect(result).rejects.toThrow('Argument \'a\' must be of type \'Color\'');
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
it('should validate rest parameters correctly', () => {
|
|
379
|
+
const func = defineFunction(
|
|
380
|
+
'test',
|
|
381
|
+
(...args: Color[]) => `received: ${args.length} colors`,
|
|
382
|
+
{ params: [{ name: 'args', type: Color, rest: true }] }
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
const dimension = new Dimension({ number: 10, unit: 'px' });
|
|
386
|
+
const color = new Color('#ff0000');
|
|
387
|
+
|
|
388
|
+
// This should throw for the dimension in the rest array
|
|
389
|
+
expect(() => {
|
|
390
|
+
(func as any)(color, dimension);
|
|
391
|
+
}).toThrow('Element 1 of \'args\' must be of type \'Color\'');
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
it('should handle inheritance relationships correctly', () => {
|
|
395
|
+
// Test that Dimension is not compatible with Num (Num extends Dimension, not vice versa)
|
|
396
|
+
const numFunc = defineFunction(
|
|
397
|
+
'test',
|
|
398
|
+
(a: Num) => `received: ${a.type}`,
|
|
399
|
+
{ params: [{ name: 'a', type: Num }] }
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
const dimension = new Dimension({ number: 10, unit: 'px' });
|
|
403
|
+
|
|
404
|
+
// This should fail because Dimension is not compatible with Num
|
|
405
|
+
expect(() => {
|
|
406
|
+
(numFunc as any)(dimension);
|
|
407
|
+
}).toThrow('Argument \'a\' must be of type \'Num\'');
|
|
408
|
+
|
|
409
|
+
// Test that Num is compatible with Dimension (Num extends Dimension)
|
|
410
|
+
const dimensionFunc = defineFunction(
|
|
411
|
+
'test',
|
|
412
|
+
(a: Dimension) => `received: ${a.type}`,
|
|
413
|
+
{ params: [{ name: 'a', type: Dimension }] }
|
|
414
|
+
);
|
|
415
|
+
|
|
416
|
+
const num = new Num(10);
|
|
417
|
+
|
|
418
|
+
// This should work because Num extends Dimension
|
|
419
|
+
const result = (dimensionFunc as any)(num);
|
|
420
|
+
expect(result).toBe('received: Num');
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
it('should validate primitive types correctly', () => {
|
|
424
|
+
const func = defineFunction(
|
|
425
|
+
'test',
|
|
426
|
+
(a: string, b: number) => `${a}: ${b}`,
|
|
427
|
+
{ params: [
|
|
428
|
+
{ name: 'a', type: 'string' },
|
|
429
|
+
{ name: 'b', type: 'number' }
|
|
430
|
+
] }
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
// This should throw for type mismatches
|
|
434
|
+
expect(() => {
|
|
435
|
+
(func as any)(123, 'not a number');
|
|
436
|
+
}).toThrow('Argument \'a\' must be of type \'string\'');
|
|
437
|
+
});
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
describe('compile-time validation', () => {
|
|
441
|
+
it('should catch type mismatches at compile time', () => {
|
|
442
|
+
const func = defineFunction(
|
|
443
|
+
'test',
|
|
444
|
+
(a: Color) => `received: ${a.type}`,
|
|
445
|
+
{ params: [{ name: 'a', type: Dimension }] }
|
|
446
|
+
);
|
|
447
|
+
|
|
448
|
+
// The TypeScript compiler should catch this mismatch
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
it('should allow correct type matches at compile time', () => {
|
|
452
|
+
// This should compile without errors
|
|
453
|
+
const func = defineFunction(
|
|
454
|
+
'test',
|
|
455
|
+
(a: Color) => `received: ${a.type}`,
|
|
456
|
+
{ params: [{ name: 'a', type: Color }] }
|
|
457
|
+
);
|
|
458
|
+
|
|
459
|
+
// This should work
|
|
460
|
+
const color = new Color('#ff0000');
|
|
461
|
+
const result = func(color);
|
|
462
|
+
expect(result).toBe('received: Color');
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
it('should handle inheritance relationships at compile time', () => {
|
|
466
|
+
// This should compile because Num is compatible with Dimension
|
|
467
|
+
const func = defineFunction(
|
|
468
|
+
'test',
|
|
469
|
+
(a: Dimension) => `received: ${a.type}`,
|
|
470
|
+
{ params: [{ name: 'a', type: Num }] }
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
// This should work
|
|
474
|
+
const num = new Num(10);
|
|
475
|
+
const result = func(num);
|
|
476
|
+
expect(result).toBe('received: Num');
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
describe('mixed scenarios', () => {
|
|
481
|
+
it('should handle complex function signatures with multiple types', () => {
|
|
482
|
+
const func = defineFunction(
|
|
483
|
+
'complex',
|
|
484
|
+
(a: Color, b: Dimension, c: string, d: number) => `${a.type} ${b.type} ${c} ${d}`,
|
|
485
|
+
{ params: [
|
|
486
|
+
{ name: 'a', type: Color },
|
|
487
|
+
{ name: 'b', type: Dimension },
|
|
488
|
+
{ name: 'c', type: 'string' },
|
|
489
|
+
{ name: 'd', type: 'number' }
|
|
490
|
+
] }
|
|
491
|
+
);
|
|
492
|
+
|
|
493
|
+
const color = new Color('#ff0000');
|
|
494
|
+
const dimension = new Dimension({ number: 10, unit: 'px' });
|
|
495
|
+
|
|
496
|
+
// This should work
|
|
497
|
+
const result = func(color, dimension, 'test', 42);
|
|
498
|
+
expect(result).toBe('Color Dimension test 42');
|
|
499
|
+
|
|
500
|
+
// This should throw for type mismatches
|
|
501
|
+
expect(() => {
|
|
502
|
+
(func as any)(dimension, color, 123, 'not a number');
|
|
503
|
+
}).toThrow('Argument \'a\' must be of type \'Color\'');
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
it('should handle optional parameters correctly', () => {
|
|
507
|
+
const func = defineFunction(
|
|
508
|
+
'optional',
|
|
509
|
+
(a: Color, b?: Dimension) => `${a.type} ${b?.type || 'none'}`,
|
|
510
|
+
{ params: [
|
|
511
|
+
{ name: 'a', type: Color },
|
|
512
|
+
{ name: 'b', type: Dimension, optional: true }
|
|
513
|
+
] }
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
const color = new Color('#ff0000');
|
|
517
|
+
const dimension = new Dimension({ number: 10, unit: 'px' });
|
|
518
|
+
|
|
519
|
+
// These should all work
|
|
520
|
+
expect(func(color)).toBe('Color none');
|
|
521
|
+
expect(func(color, dimension)).toBe('Color Dimension');
|
|
522
|
+
|
|
523
|
+
// This should throw for missing required parameter
|
|
524
|
+
expect(() => {
|
|
525
|
+
(func as any)();
|
|
526
|
+
}).toThrow('Required argument \'a\' is missing');
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
it('should handle default values correctly', () => {
|
|
530
|
+
const func = defineFunction(
|
|
531
|
+
'defaults',
|
|
532
|
+
(a: Color, b: Dimension) => `${a.type} ${b.type}`,
|
|
533
|
+
{ params: [
|
|
534
|
+
{ name: 'a', type: Color },
|
|
535
|
+
{ name: 'b', type: Dimension, default: new Dimension({ number: 5, unit: 'px' }) }
|
|
536
|
+
] }
|
|
537
|
+
);
|
|
538
|
+
|
|
539
|
+
const color = new Color('#ff0000');
|
|
540
|
+
|
|
541
|
+
// This should work with default
|
|
542
|
+
const result = func(color);
|
|
543
|
+
expect(result).toBe('Color Dimension');
|
|
544
|
+
});
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
|
|
3
|
+
// Placeholder: this file exists to reserve coverage for type-parity tests.
|
|
4
|
+
// Vitest treats empty files as a failing suite ("No test suite found").
|
|
5
|
+
describe('defineFunction type parity (placeholder)', () => {
|
|
6
|
+
it('placeholder', () => {
|
|
7
|
+
expect(true).toBe(true);
|
|
8
|
+
});
|
|
9
|
+
});
|