@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.
Files changed (637) hide show
  1. package/lib/index.cjs +20159 -0
  2. package/lib/index.d.cts +5993 -0
  3. package/lib/index.d.cts.map +1 -0
  4. package/lib/index.d.ts +5992 -21
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +19926 -22
  7. package/lib/index.js.map +1 -1
  8. package/package.json +15 -14
  9. package/src/__tests__/define-function-record.test.ts +58 -0
  10. package/src/__tests__/define-function-simple.test.ts +55 -0
  11. package/src/__tests__/define-function-split-sequence.test.ts +547 -0
  12. package/src/__tests__/define-function-type-parity.test.ts +9 -0
  13. package/src/__tests__/define-function.test.ts +763 -0
  14. package/src/__tests__/num-operations.test.ts +91 -0
  15. package/src/__tests__/safe-parse.test.ts +374 -0
  16. package/src/context.ts +896 -0
  17. package/src/conversions.ts +282 -0
  18. package/src/debug-log.ts +29 -0
  19. package/src/define-function.ts +1006 -0
  20. package/src/deprecation.ts +67 -0
  21. package/src/globals.d.ts +26 -0
  22. package/src/index.ts +31 -0
  23. package/src/jess-error.ts +773 -0
  24. package/src/logger/deprecation-processing.ts +109 -0
  25. package/src/logger.ts +31 -0
  26. package/src/plugin.ts +292 -0
  27. package/src/tree/LOOKUP_CHAINS.md +35 -0
  28. package/src/tree/README.md +18 -0
  29. package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
  30. package/src/tree/__tests__/ampersand.test.ts +382 -0
  31. package/src/tree/__tests__/at-rule.test.ts +2047 -0
  32. package/src/tree/__tests__/basic-render.test.ts +212 -0
  33. package/src/tree/__tests__/block.test.ts +40 -0
  34. package/src/tree/__tests__/call.test.ts +346 -0
  35. package/src/tree/__tests__/color.test.ts +537 -0
  36. package/src/tree/__tests__/condition.test.ts +186 -0
  37. package/src/tree/__tests__/control.test.ts +564 -0
  38. package/src/tree/__tests__/declaration.test.ts +253 -0
  39. package/src/tree/__tests__/dependency-graph.test.ts +177 -0
  40. package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
  41. package/src/tree/__tests__/dimension.test.ts +236 -0
  42. package/src/tree/__tests__/expression.test.ts +73 -0
  43. package/src/tree/__tests__/ext-node.test.ts +31 -0
  44. package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
  45. package/src/tree/__tests__/extend-import-style.test.ts +929 -0
  46. package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
  47. package/src/tree/__tests__/extend-list.test.ts +31 -0
  48. package/src/tree/__tests__/extend-roots.test.ts +1045 -0
  49. package/src/tree/__tests__/extend-rules.test.ts +740 -0
  50. package/src/tree/__tests__/func.test.ts +171 -0
  51. package/src/tree/__tests__/import-js.test.ts +33 -0
  52. package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
  53. package/src/tree/__tests__/import-style.test.ts +1967 -0
  54. package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
  55. package/src/tree/__tests__/interpolated.test.ts +41 -0
  56. package/src/tree/__tests__/list.test.ts +177 -0
  57. package/src/tree/__tests__/log.test.ts +83 -0
  58. package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
  59. package/src/tree/__tests__/mixin.test.ts +2171 -0
  60. package/src/tree/__tests__/negative.test.ts +45 -0
  61. package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
  62. package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
  63. package/src/tree/__tests__/node-flags.test.ts +410 -0
  64. package/src/tree/__tests__/node-graph.test.ts +598 -0
  65. package/src/tree/__tests__/node-mutation.test.ts +182 -0
  66. package/src/tree/__tests__/operation.test.ts +18 -0
  67. package/src/tree/__tests__/paren.test.ts +90 -0
  68. package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
  69. package/src/tree/__tests__/quoted.test.ts +72 -0
  70. package/src/tree/__tests__/range.test.ts +59 -0
  71. package/src/tree/__tests__/reference.test.ts +743 -0
  72. package/src/tree/__tests__/rest.test.ts +29 -0
  73. package/src/tree/__tests__/rules-raw.test.ts +14 -0
  74. package/src/tree/__tests__/rules.test.ts +1271 -0
  75. package/src/tree/__tests__/ruleset.test.ts +597 -0
  76. package/src/tree/__tests__/selector-attr.test.ts +50 -0
  77. package/src/tree/__tests__/selector-basic.test.ts +44 -0
  78. package/src/tree/__tests__/selector-capture.test.ts +22 -0
  79. package/src/tree/__tests__/selector-complex.test.ts +120 -0
  80. package/src/tree/__tests__/selector-compound.test.ts +74 -0
  81. package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
  82. package/src/tree/__tests__/selector-list.test.ts +59 -0
  83. package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
  84. package/src/tree/__tests__/selector.test.ts +182 -0
  85. package/src/tree/__tests__/sequence.test.ts +226 -0
  86. package/src/tree/__tests__/serialize-types.test.ts +529 -0
  87. package/src/tree/__tests__/spaced.test.ts +8 -0
  88. package/src/tree/__tests__/url.test.ts +72 -0
  89. package/src/tree/__tests__/var-declaration.test.ts +90 -0
  90. package/src/tree/ampersand.ts +538 -0
  91. package/src/tree/any.ts +169 -0
  92. package/src/tree/at-rule.ts +760 -0
  93. package/src/tree/block.ts +72 -0
  94. package/src/tree/bool.ts +46 -0
  95. package/src/tree/call.ts +593 -0
  96. package/src/tree/collection.ts +52 -0
  97. package/src/tree/color.ts +629 -0
  98. package/src/tree/combinator.ts +30 -0
  99. package/src/tree/comment.ts +36 -0
  100. package/src/tree/condition.ts +194 -0
  101. package/src/tree/control.ts +452 -0
  102. package/src/tree/declaration-custom.ts +56 -0
  103. package/src/tree/declaration-var.ts +87 -0
  104. package/src/tree/declaration.ts +742 -0
  105. package/src/tree/default-guard.ts +35 -0
  106. package/src/tree/dimension.ts +392 -0
  107. package/src/tree/expression.ts +97 -0
  108. package/src/tree/extend-list.ts +51 -0
  109. package/src/tree/extend.ts +391 -0
  110. package/src/tree/function.ts +254 -0
  111. package/src/tree/import-js.ts +130 -0
  112. package/src/tree/import-style.ts +875 -0
  113. package/{lib/tree/index.js → src/tree/index.ts} +49 -22
  114. package/src/tree/interpolated.ts +346 -0
  115. package/src/tree/js-array.ts +21 -0
  116. package/src/tree/js-expr.ts +50 -0
  117. package/src/tree/js-function.ts +31 -0
  118. package/src/tree/js-object.ts +22 -0
  119. package/src/tree/list.ts +415 -0
  120. package/src/tree/log.ts +89 -0
  121. package/src/tree/mixin.ts +331 -0
  122. package/src/tree/negative.ts +58 -0
  123. package/src/tree/nil.ts +57 -0
  124. package/src/tree/node-base.ts +1716 -0
  125. package/src/tree/node-type.ts +122 -0
  126. package/src/tree/node.ts +118 -0
  127. package/src/tree/number.ts +54 -0
  128. package/src/tree/operation.ts +187 -0
  129. package/src/tree/paren.ts +132 -0
  130. package/src/tree/query-condition.ts +47 -0
  131. package/src/tree/quoted.ts +119 -0
  132. package/src/tree/range.ts +101 -0
  133. package/src/tree/reference.ts +1099 -0
  134. package/src/tree/rest.ts +55 -0
  135. package/src/tree/rules-raw.ts +52 -0
  136. package/src/tree/rules.ts +2896 -0
  137. package/src/tree/ruleset.ts +1217 -0
  138. package/src/tree/selector-attr.ts +172 -0
  139. package/src/tree/selector-basic.ts +75 -0
  140. package/src/tree/selector-capture.ts +85 -0
  141. package/src/tree/selector-complex.ts +189 -0
  142. package/src/tree/selector-compound.ts +205 -0
  143. package/src/tree/selector-interpolated.ts +95 -0
  144. package/src/tree/selector-list.ts +245 -0
  145. package/src/tree/selector-pseudo.ts +173 -0
  146. package/src/tree/selector-simple.ts +10 -0
  147. package/src/tree/selector.ts +152 -0
  148. package/src/tree/sequence.ts +463 -0
  149. package/src/tree/tree.ts +130 -0
  150. package/src/tree/url.ts +95 -0
  151. package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
  152. package/src/tree/util/EXTEND_AUDIT.md +233 -0
  153. package/src/tree/util/EXTEND_BASELINE.md +64 -0
  154. package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
  155. package/src/tree/util/EXTEND_DOCS.md +24 -0
  156. package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
  157. package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
  158. package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
  159. package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
  160. package/src/tree/util/EXTEND_RULES.md +74 -0
  161. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
  162. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
  163. package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
  164. package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
  165. package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
  166. package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
  167. package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
  168. package/src/tree/util/__tests__/_archive/README.md +4 -0
  169. package/src/tree/util/__tests__/bitset.test.ts +142 -0
  170. package/src/tree/util/__tests__/debug-log.ts +50 -0
  171. package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
  172. package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
  173. package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
  174. package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
  175. package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
  176. package/src/tree/util/__tests__/is-node.test.ts +63 -0
  177. package/src/tree/util/__tests__/list-like.test.ts +63 -0
  178. package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
  179. package/src/tree/util/__tests__/print.test.ts +183 -0
  180. package/src/tree/util/__tests__/process-extends.test.ts +226 -0
  181. package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
  182. package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
  183. package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
  184. package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
  185. package/src/tree/util/ampersand-template.ts +9 -0
  186. package/src/tree/util/bitset.ts +194 -0
  187. package/src/tree/util/calculate.ts +11 -0
  188. package/src/tree/util/cast.ts +89 -0
  189. package/src/tree/util/cloning.ts +8 -0
  190. package/src/tree/util/collections.ts +299 -0
  191. package/src/tree/util/compare.ts +90 -0
  192. package/src/tree/util/cursor.ts +171 -0
  193. package/src/tree/util/extend-core.ts +2139 -0
  194. package/src/tree/util/extend-roots.ts +1108 -0
  195. package/src/tree/util/field-helpers.ts +354 -0
  196. package/src/tree/util/is-node.ts +43 -0
  197. package/src/tree/util/list-like.ts +93 -0
  198. package/src/tree/util/mixin-instance-primitives.ts +2020 -0
  199. package/src/tree/util/print.ts +303 -0
  200. package/src/tree/util/process-leading-is.ts +421 -0
  201. package/src/tree/util/recursion-helper.ts +54 -0
  202. package/src/tree/util/regex.ts +2 -0
  203. package/src/tree/util/registry-utils.ts +1953 -0
  204. package/src/tree/util/ruleset-trace.ts +17 -0
  205. package/src/tree/util/scoped-body-eval.ts +320 -0
  206. package/src/tree/util/selector-match-core.ts +2005 -0
  207. package/src/tree/util/selector-utils.ts +757 -0
  208. package/src/tree/util/serialize-helper.ts +535 -0
  209. package/src/tree/util/serialize-types.ts +318 -0
  210. package/src/tree/util/should-operate.ts +78 -0
  211. package/src/tree/util/sourcemap.ts +37 -0
  212. package/src/types/config.ts +247 -0
  213. package/src/types/index.ts +12 -0
  214. package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
  215. package/src/types.d.ts +9 -0
  216. package/src/types.ts +68 -0
  217. package/src/use-webpack-resolver.ts +56 -0
  218. package/src/visitor/__tests__/visitor.test.ts +136 -0
  219. package/src/visitor/index.ts +263 -0
  220. package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
  221. package/lib/context.d.ts +0 -352
  222. package/lib/context.d.ts.map +0 -1
  223. package/lib/context.js +0 -636
  224. package/lib/context.js.map +0 -1
  225. package/lib/conversions.d.ts +0 -73
  226. package/lib/conversions.d.ts.map +0 -1
  227. package/lib/conversions.js +0 -253
  228. package/lib/conversions.js.map +0 -1
  229. package/lib/debug-log.d.ts +0 -2
  230. package/lib/debug-log.d.ts.map +0 -1
  231. package/lib/debug-log.js +0 -27
  232. package/lib/debug-log.js.map +0 -1
  233. package/lib/define-function.d.ts +0 -587
  234. package/lib/define-function.d.ts.map +0 -1
  235. package/lib/define-function.js +0 -726
  236. package/lib/define-function.js.map +0 -1
  237. package/lib/deprecation.d.ts +0 -34
  238. package/lib/deprecation.d.ts.map +0 -1
  239. package/lib/deprecation.js +0 -57
  240. package/lib/deprecation.js.map +0 -1
  241. package/lib/jess-error.d.ts +0 -343
  242. package/lib/jess-error.d.ts.map +0 -1
  243. package/lib/jess-error.js +0 -508
  244. package/lib/jess-error.js.map +0 -1
  245. package/lib/logger/deprecation-processing.d.ts +0 -41
  246. package/lib/logger/deprecation-processing.d.ts.map +0 -1
  247. package/lib/logger/deprecation-processing.js +0 -81
  248. package/lib/logger/deprecation-processing.js.map +0 -1
  249. package/lib/logger.d.ts +0 -10
  250. package/lib/logger.d.ts.map +0 -1
  251. package/lib/logger.js +0 -20
  252. package/lib/logger.js.map +0 -1
  253. package/lib/plugin.d.ts +0 -94
  254. package/lib/plugin.d.ts.map +0 -1
  255. package/lib/plugin.js +0 -174
  256. package/lib/plugin.js.map +0 -1
  257. package/lib/tree/ampersand.d.ts +0 -98
  258. package/lib/tree/ampersand.d.ts.map +0 -1
  259. package/lib/tree/ampersand.js +0 -319
  260. package/lib/tree/ampersand.js.map +0 -1
  261. package/lib/tree/any.d.ts +0 -58
  262. package/lib/tree/any.d.ts.map +0 -1
  263. package/lib/tree/any.js +0 -104
  264. package/lib/tree/any.js.map +0 -1
  265. package/lib/tree/at-rule.d.ts +0 -53
  266. package/lib/tree/at-rule.d.ts.map +0 -1
  267. package/lib/tree/at-rule.js +0 -503
  268. package/lib/tree/at-rule.js.map +0 -1
  269. package/lib/tree/block.d.ts +0 -22
  270. package/lib/tree/block.d.ts.map +0 -1
  271. package/lib/tree/block.js +0 -24
  272. package/lib/tree/block.js.map +0 -1
  273. package/lib/tree/bool.d.ts +0 -18
  274. package/lib/tree/bool.d.ts.map +0 -1
  275. package/lib/tree/bool.js +0 -28
  276. package/lib/tree/bool.js.map +0 -1
  277. package/lib/tree/call.d.ts +0 -66
  278. package/lib/tree/call.d.ts.map +0 -1
  279. package/lib/tree/call.js +0 -306
  280. package/lib/tree/call.js.map +0 -1
  281. package/lib/tree/collection.d.ts +0 -30
  282. package/lib/tree/collection.d.ts.map +0 -1
  283. package/lib/tree/collection.js +0 -37
  284. package/lib/tree/collection.js.map +0 -1
  285. package/lib/tree/color.d.ts +0 -101
  286. package/lib/tree/color.d.ts.map +0 -1
  287. package/lib/tree/color.js +0 -513
  288. package/lib/tree/color.js.map +0 -1
  289. package/lib/tree/combinator.d.ts +0 -13
  290. package/lib/tree/combinator.d.ts.map +0 -1
  291. package/lib/tree/combinator.js +0 -12
  292. package/lib/tree/combinator.js.map +0 -1
  293. package/lib/tree/comment.d.ts +0 -20
  294. package/lib/tree/comment.d.ts.map +0 -1
  295. package/lib/tree/comment.js +0 -19
  296. package/lib/tree/comment.js.map +0 -1
  297. package/lib/tree/condition.d.ts +0 -31
  298. package/lib/tree/condition.d.ts.map +0 -1
  299. package/lib/tree/condition.js +0 -103
  300. package/lib/tree/condition.js.map +0 -1
  301. package/lib/tree/control.d.ts +0 -104
  302. package/lib/tree/control.d.ts.map +0 -1
  303. package/lib/tree/control.js +0 -430
  304. package/lib/tree/control.js.map +0 -1
  305. package/lib/tree/declaration-custom.d.ts +0 -18
  306. package/lib/tree/declaration-custom.d.ts.map +0 -1
  307. package/lib/tree/declaration-custom.js +0 -24
  308. package/lib/tree/declaration-custom.js.map +0 -1
  309. package/lib/tree/declaration-var.d.ts +0 -35
  310. package/lib/tree/declaration-var.d.ts.map +0 -1
  311. package/lib/tree/declaration-var.js +0 -63
  312. package/lib/tree/declaration-var.js.map +0 -1
  313. package/lib/tree/declaration.d.ts +0 -78
  314. package/lib/tree/declaration.d.ts.map +0 -1
  315. package/lib/tree/declaration.js +0 -286
  316. package/lib/tree/declaration.js.map +0 -1
  317. package/lib/tree/default-guard.d.ts +0 -15
  318. package/lib/tree/default-guard.d.ts.map +0 -1
  319. package/lib/tree/default-guard.js +0 -19
  320. package/lib/tree/default-guard.js.map +0 -1
  321. package/lib/tree/dimension.d.ts +0 -34
  322. package/lib/tree/dimension.d.ts.map +0 -1
  323. package/lib/tree/dimension.js +0 -294
  324. package/lib/tree/dimension.js.map +0 -1
  325. package/lib/tree/expression.d.ts +0 -25
  326. package/lib/tree/expression.d.ts.map +0 -1
  327. package/lib/tree/expression.js +0 -32
  328. package/lib/tree/expression.js.map +0 -1
  329. package/lib/tree/extend-list.d.ts +0 -23
  330. package/lib/tree/extend-list.d.ts.map +0 -1
  331. package/lib/tree/extend-list.js +0 -23
  332. package/lib/tree/extend-list.js.map +0 -1
  333. package/lib/tree/extend.d.ts +0 -47
  334. package/lib/tree/extend.d.ts.map +0 -1
  335. package/lib/tree/extend.js +0 -296
  336. package/lib/tree/extend.js.map +0 -1
  337. package/lib/tree/function.d.ts +0 -48
  338. package/lib/tree/function.d.ts.map +0 -1
  339. package/lib/tree/function.js +0 -74
  340. package/lib/tree/function.js.map +0 -1
  341. package/lib/tree/import-js.d.ts +0 -35
  342. package/lib/tree/import-js.d.ts.map +0 -1
  343. package/lib/tree/import-js.js +0 -45
  344. package/lib/tree/import-js.js.map +0 -1
  345. package/lib/tree/import-style.d.ts +0 -156
  346. package/lib/tree/import-style.d.ts.map +0 -1
  347. package/lib/tree/import-style.js +0 -566
  348. package/lib/tree/import-style.js.map +0 -1
  349. package/lib/tree/index.d.ts +0 -71
  350. package/lib/tree/index.d.ts.map +0 -1
  351. package/lib/tree/index.js.map +0 -1
  352. package/lib/tree/interpolated-reference.d.ts +0 -24
  353. package/lib/tree/interpolated-reference.d.ts.map +0 -1
  354. package/lib/tree/interpolated-reference.js +0 -37
  355. package/lib/tree/interpolated-reference.js.map +0 -1
  356. package/lib/tree/interpolated.d.ts +0 -62
  357. package/lib/tree/interpolated.d.ts.map +0 -1
  358. package/lib/tree/interpolated.js +0 -204
  359. package/lib/tree/interpolated.js.map +0 -1
  360. package/lib/tree/js-array.d.ts +0 -10
  361. package/lib/tree/js-array.d.ts.map +0 -1
  362. package/lib/tree/js-array.js +0 -10
  363. package/lib/tree/js-array.js.map +0 -1
  364. package/lib/tree/js-expr.d.ts +0 -23
  365. package/lib/tree/js-expr.d.ts.map +0 -1
  366. package/lib/tree/js-expr.js +0 -28
  367. package/lib/tree/js-expr.js.map +0 -1
  368. package/lib/tree/js-function.d.ts +0 -20
  369. package/lib/tree/js-function.d.ts.map +0 -1
  370. package/lib/tree/js-function.js +0 -16
  371. package/lib/tree/js-function.js.map +0 -1
  372. package/lib/tree/js-object.d.ts +0 -10
  373. package/lib/tree/js-object.d.ts.map +0 -1
  374. package/lib/tree/js-object.js +0 -10
  375. package/lib/tree/js-object.js.map +0 -1
  376. package/lib/tree/list.d.ts +0 -38
  377. package/lib/tree/list.d.ts.map +0 -1
  378. package/lib/tree/list.js +0 -83
  379. package/lib/tree/list.js.map +0 -1
  380. package/lib/tree/log.d.ts +0 -29
  381. package/lib/tree/log.d.ts.map +0 -1
  382. package/lib/tree/log.js +0 -56
  383. package/lib/tree/log.js.map +0 -1
  384. package/lib/tree/mixin.d.ts +0 -87
  385. package/lib/tree/mixin.d.ts.map +0 -1
  386. package/lib/tree/mixin.js +0 -112
  387. package/lib/tree/mixin.js.map +0 -1
  388. package/lib/tree/negative.d.ts +0 -17
  389. package/lib/tree/negative.d.ts.map +0 -1
  390. package/lib/tree/negative.js +0 -22
  391. package/lib/tree/negative.js.map +0 -1
  392. package/lib/tree/nil.d.ts +0 -30
  393. package/lib/tree/nil.d.ts.map +0 -1
  394. package/lib/tree/nil.js +0 -35
  395. package/lib/tree/nil.js.map +0 -1
  396. package/lib/tree/node-base.d.ts +0 -361
  397. package/lib/tree/node-base.d.ts.map +0 -1
  398. package/lib/tree/node-base.js +0 -930
  399. package/lib/tree/node-base.js.map +0 -1
  400. package/lib/tree/node.d.ts +0 -10
  401. package/lib/tree/node.d.ts.map +0 -1
  402. package/lib/tree/node.js +0 -45
  403. package/lib/tree/node.js.map +0 -1
  404. package/lib/tree/number.d.ts +0 -21
  405. package/lib/tree/number.d.ts.map +0 -1
  406. package/lib/tree/number.js +0 -27
  407. package/lib/tree/number.js.map +0 -1
  408. package/lib/tree/operation.d.ts +0 -26
  409. package/lib/tree/operation.d.ts.map +0 -1
  410. package/lib/tree/operation.js +0 -103
  411. package/lib/tree/operation.js.map +0 -1
  412. package/lib/tree/paren.d.ts +0 -19
  413. package/lib/tree/paren.d.ts.map +0 -1
  414. package/lib/tree/paren.js +0 -92
  415. package/lib/tree/paren.js.map +0 -1
  416. package/lib/tree/query-condition.d.ts +0 -17
  417. package/lib/tree/query-condition.d.ts.map +0 -1
  418. package/lib/tree/query-condition.js +0 -39
  419. package/lib/tree/query-condition.js.map +0 -1
  420. package/lib/tree/quoted.d.ts +0 -28
  421. package/lib/tree/quoted.d.ts.map +0 -1
  422. package/lib/tree/quoted.js +0 -75
  423. package/lib/tree/quoted.js.map +0 -1
  424. package/lib/tree/range.d.ts +0 -33
  425. package/lib/tree/range.d.ts.map +0 -1
  426. package/lib/tree/range.js +0 -47
  427. package/lib/tree/range.js.map +0 -1
  428. package/lib/tree/reference.d.ts +0 -76
  429. package/lib/tree/reference.d.ts.map +0 -1
  430. package/lib/tree/reference.js +0 -521
  431. package/lib/tree/reference.js.map +0 -1
  432. package/lib/tree/rest.d.ts +0 -15
  433. package/lib/tree/rest.d.ts.map +0 -1
  434. package/lib/tree/rest.js +0 -32
  435. package/lib/tree/rest.js.map +0 -1
  436. package/lib/tree/rules-raw.d.ts +0 -17
  437. package/lib/tree/rules-raw.d.ts.map +0 -1
  438. package/lib/tree/rules-raw.js +0 -37
  439. package/lib/tree/rules-raw.js.map +0 -1
  440. package/lib/tree/rules.d.ts +0 -262
  441. package/lib/tree/rules.d.ts.map +0 -1
  442. package/lib/tree/rules.js +0 -2359
  443. package/lib/tree/rules.js.map +0 -1
  444. package/lib/tree/ruleset.d.ts +0 -92
  445. package/lib/tree/ruleset.d.ts.map +0 -1
  446. package/lib/tree/ruleset.js +0 -528
  447. package/lib/tree/ruleset.js.map +0 -1
  448. package/lib/tree/selector-attr.d.ts +0 -31
  449. package/lib/tree/selector-attr.d.ts.map +0 -1
  450. package/lib/tree/selector-attr.js +0 -99
  451. package/lib/tree/selector-attr.js.map +0 -1
  452. package/lib/tree/selector-basic.d.ts +0 -24
  453. package/lib/tree/selector-basic.d.ts.map +0 -1
  454. package/lib/tree/selector-basic.js +0 -38
  455. package/lib/tree/selector-basic.js.map +0 -1
  456. package/lib/tree/selector-capture.d.ts +0 -23
  457. package/lib/tree/selector-capture.d.ts.map +0 -1
  458. package/lib/tree/selector-capture.js +0 -34
  459. package/lib/tree/selector-capture.js.map +0 -1
  460. package/lib/tree/selector-complex.d.ts +0 -40
  461. package/lib/tree/selector-complex.d.ts.map +0 -1
  462. package/lib/tree/selector-complex.js +0 -143
  463. package/lib/tree/selector-complex.js.map +0 -1
  464. package/lib/tree/selector-compound.d.ts +0 -16
  465. package/lib/tree/selector-compound.d.ts.map +0 -1
  466. package/lib/tree/selector-compound.js +0 -114
  467. package/lib/tree/selector-compound.js.map +0 -1
  468. package/lib/tree/selector-interpolated.d.ts +0 -23
  469. package/lib/tree/selector-interpolated.d.ts.map +0 -1
  470. package/lib/tree/selector-interpolated.js +0 -27
  471. package/lib/tree/selector-interpolated.js.map +0 -1
  472. package/lib/tree/selector-list.d.ts +0 -17
  473. package/lib/tree/selector-list.d.ts.map +0 -1
  474. package/lib/tree/selector-list.js +0 -174
  475. package/lib/tree/selector-list.js.map +0 -1
  476. package/lib/tree/selector-pseudo.d.ts +0 -42
  477. package/lib/tree/selector-pseudo.d.ts.map +0 -1
  478. package/lib/tree/selector-pseudo.js +0 -204
  479. package/lib/tree/selector-pseudo.js.map +0 -1
  480. package/lib/tree/selector-simple.d.ts +0 -5
  481. package/lib/tree/selector-simple.d.ts.map +0 -1
  482. package/lib/tree/selector-simple.js +0 -6
  483. package/lib/tree/selector-simple.js.map +0 -1
  484. package/lib/tree/selector.d.ts +0 -43
  485. package/lib/tree/selector.d.ts.map +0 -1
  486. package/lib/tree/selector.js +0 -56
  487. package/lib/tree/selector.js.map +0 -1
  488. package/lib/tree/sequence.d.ts +0 -43
  489. package/lib/tree/sequence.d.ts.map +0 -1
  490. package/lib/tree/sequence.js +0 -151
  491. package/lib/tree/sequence.js.map +0 -1
  492. package/lib/tree/tree.d.ts +0 -87
  493. package/lib/tree/tree.d.ts.map +0 -1
  494. package/lib/tree/tree.js +0 -2
  495. package/lib/tree/tree.js.map +0 -1
  496. package/lib/tree/url.d.ts +0 -18
  497. package/lib/tree/url.d.ts.map +0 -1
  498. package/lib/tree/url.js +0 -35
  499. package/lib/tree/url.js.map +0 -1
  500. package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
  501. package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
  502. package/lib/tree/util/__tests__/debug-log.js +0 -36
  503. package/lib/tree/util/__tests__/debug-log.js.map +0 -1
  504. package/lib/tree/util/calculate.d.ts +0 -3
  505. package/lib/tree/util/calculate.d.ts.map +0 -1
  506. package/lib/tree/util/calculate.js +0 -10
  507. package/lib/tree/util/calculate.js.map +0 -1
  508. package/lib/tree/util/cast.d.ts +0 -10
  509. package/lib/tree/util/cast.d.ts.map +0 -1
  510. package/lib/tree/util/cast.js +0 -87
  511. package/lib/tree/util/cast.js.map +0 -1
  512. package/lib/tree/util/cloning.d.ts +0 -4
  513. package/lib/tree/util/cloning.d.ts.map +0 -1
  514. package/lib/tree/util/cloning.js +0 -8
  515. package/lib/tree/util/cloning.js.map +0 -1
  516. package/lib/tree/util/collections.d.ts +0 -57
  517. package/lib/tree/util/collections.d.ts.map +0 -1
  518. package/lib/tree/util/collections.js +0 -136
  519. package/lib/tree/util/collections.js.map +0 -1
  520. package/lib/tree/util/compare.d.ts +0 -11
  521. package/lib/tree/util/compare.d.ts.map +0 -1
  522. package/lib/tree/util/compare.js +0 -89
  523. package/lib/tree/util/compare.js.map +0 -1
  524. package/lib/tree/util/extend-helpers.d.ts +0 -2
  525. package/lib/tree/util/extend-helpers.d.ts.map +0 -1
  526. package/lib/tree/util/extend-helpers.js +0 -2
  527. package/lib/tree/util/extend-helpers.js.map +0 -1
  528. package/lib/tree/util/extend-roots.d.ts +0 -37
  529. package/lib/tree/util/extend-roots.d.ts.map +0 -1
  530. package/lib/tree/util/extend-roots.js +0 -700
  531. package/lib/tree/util/extend-roots.js.map +0 -1
  532. package/lib/tree/util/extend-roots.old.d.ts +0 -132
  533. package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
  534. package/lib/tree/util/extend-roots.old.js +0 -2272
  535. package/lib/tree/util/extend-roots.old.js.map +0 -1
  536. package/lib/tree/util/extend-trace-debug.d.ts +0 -13
  537. package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
  538. package/lib/tree/util/extend-trace-debug.js +0 -34
  539. package/lib/tree/util/extend-trace-debug.js.map +0 -1
  540. package/lib/tree/util/extend-walk.d.ts +0 -53
  541. package/lib/tree/util/extend-walk.d.ts.map +0 -1
  542. package/lib/tree/util/extend-walk.js +0 -881
  543. package/lib/tree/util/extend-walk.js.map +0 -1
  544. package/lib/tree/util/extend.d.ts +0 -218
  545. package/lib/tree/util/extend.d.ts.map +0 -1
  546. package/lib/tree/util/extend.js +0 -3182
  547. package/lib/tree/util/extend.js.map +0 -1
  548. package/lib/tree/util/find-extendable-locations.d.ts +0 -2
  549. package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
  550. package/lib/tree/util/find-extendable-locations.js +0 -2
  551. package/lib/tree/util/find-extendable-locations.js.map +0 -1
  552. package/lib/tree/util/format.d.ts +0 -20
  553. package/lib/tree/util/format.d.ts.map +0 -1
  554. package/lib/tree/util/format.js +0 -67
  555. package/lib/tree/util/format.js.map +0 -1
  556. package/lib/tree/util/is-node.d.ts +0 -13
  557. package/lib/tree/util/is-node.d.ts.map +0 -1
  558. package/lib/tree/util/is-node.js +0 -43
  559. package/lib/tree/util/is-node.js.map +0 -1
  560. package/lib/tree/util/print.d.ts +0 -80
  561. package/lib/tree/util/print.d.ts.map +0 -1
  562. package/lib/tree/util/print.js +0 -205
  563. package/lib/tree/util/print.js.map +0 -1
  564. package/lib/tree/util/process-leading-is.d.ts +0 -25
  565. package/lib/tree/util/process-leading-is.d.ts.map +0 -1
  566. package/lib/tree/util/process-leading-is.js +0 -364
  567. package/lib/tree/util/process-leading-is.js.map +0 -1
  568. package/lib/tree/util/recursion-helper.d.ts +0 -15
  569. package/lib/tree/util/recursion-helper.d.ts.map +0 -1
  570. package/lib/tree/util/recursion-helper.js +0 -43
  571. package/lib/tree/util/recursion-helper.js.map +0 -1
  572. package/lib/tree/util/regex.d.ts +0 -4
  573. package/lib/tree/util/regex.d.ts.map +0 -1
  574. package/lib/tree/util/regex.js +0 -4
  575. package/lib/tree/util/regex.js.map +0 -1
  576. package/lib/tree/util/registry-utils.d.ts +0 -192
  577. package/lib/tree/util/registry-utils.d.ts.map +0 -1
  578. package/lib/tree/util/registry-utils.js +0 -1214
  579. package/lib/tree/util/registry-utils.js.map +0 -1
  580. package/lib/tree/util/ruleset-trace.d.ts +0 -4
  581. package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
  582. package/lib/tree/util/ruleset-trace.js +0 -14
  583. package/lib/tree/util/ruleset-trace.js.map +0 -1
  584. package/lib/tree/util/selector-compare.d.ts +0 -2
  585. package/lib/tree/util/selector-compare.d.ts.map +0 -1
  586. package/lib/tree/util/selector-compare.js +0 -2
  587. package/lib/tree/util/selector-compare.js.map +0 -1
  588. package/lib/tree/util/selector-match-core.d.ts +0 -184
  589. package/lib/tree/util/selector-match-core.d.ts.map +0 -1
  590. package/lib/tree/util/selector-match-core.js +0 -1603
  591. package/lib/tree/util/selector-match-core.js.map +0 -1
  592. package/lib/tree/util/selector-utils.d.ts +0 -30
  593. package/lib/tree/util/selector-utils.d.ts.map +0 -1
  594. package/lib/tree/util/selector-utils.js +0 -100
  595. package/lib/tree/util/selector-utils.js.map +0 -1
  596. package/lib/tree/util/serialize-helper.d.ts +0 -13
  597. package/lib/tree/util/serialize-helper.d.ts.map +0 -1
  598. package/lib/tree/util/serialize-helper.js +0 -387
  599. package/lib/tree/util/serialize-helper.js.map +0 -1
  600. package/lib/tree/util/serialize-types.d.ts +0 -9
  601. package/lib/tree/util/serialize-types.d.ts.map +0 -1
  602. package/lib/tree/util/serialize-types.js +0 -216
  603. package/lib/tree/util/serialize-types.js.map +0 -1
  604. package/lib/tree/util/should-operate.d.ts +0 -23
  605. package/lib/tree/util/should-operate.d.ts.map +0 -1
  606. package/lib/tree/util/should-operate.js +0 -46
  607. package/lib/tree/util/should-operate.js.map +0 -1
  608. package/lib/tree/util/sourcemap.d.ts +0 -7
  609. package/lib/tree/util/sourcemap.d.ts.map +0 -1
  610. package/lib/tree/util/sourcemap.js +0 -25
  611. package/lib/tree/util/sourcemap.js.map +0 -1
  612. package/lib/types/config.d.ts +0 -205
  613. package/lib/types/config.d.ts.map +0 -1
  614. package/lib/types/config.js +0 -2
  615. package/lib/types/config.js.map +0 -1
  616. package/lib/types/index.d.ts +0 -15
  617. package/lib/types/index.d.ts.map +0 -1
  618. package/lib/types/index.js +0 -3
  619. package/lib/types/index.js.map +0 -1
  620. package/lib/types/modes.d.ts.map +0 -1
  621. package/lib/types/modes.js +0 -2
  622. package/lib/types/modes.js.map +0 -1
  623. package/lib/types.d.ts +0 -61
  624. package/lib/types.d.ts.map +0 -1
  625. package/lib/types.js +0 -2
  626. package/lib/types.js.map +0 -1
  627. package/lib/use-webpack-resolver.d.ts +0 -9
  628. package/lib/use-webpack-resolver.d.ts.map +0 -1
  629. package/lib/use-webpack-resolver.js +0 -41
  630. package/lib/use-webpack-resolver.js.map +0 -1
  631. package/lib/visitor/index.d.ts +0 -136
  632. package/lib/visitor/index.d.ts.map +0 -1
  633. package/lib/visitor/index.js +0 -135
  634. package/lib/visitor/index.js.map +0 -1
  635. package/lib/visitor/less-visitor.d.ts +0 -7
  636. package/lib/visitor/less-visitor.d.ts.map +0 -1
  637. 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
+ });