@jesscss/core 2.0.0-alpha.4 → 2.0.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 -94
  258. package/lib/tree/ampersand.d.ts.map +0 -1
  259. package/lib/tree/ampersand.js +0 -269
  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,253 @@
1
+ import { atrule, coll, decl, rules, ruleset, el, color, any, expr, num, ref, amp, sel } from '../index.js';
2
+ import { Context } from '../../context.js';
3
+ import { AssignmentType } from '../declaration.js';
4
+ import { isVisibleInContext } from '../node-base.js';
5
+
6
+ let context: Context;
7
+ describe('Declaration', () => {
8
+ beforeEach(() => {
9
+ context = new Context();
10
+ });
11
+ it('should serialize to CSS', () => {
12
+ let rule = decl({ name: 'color', value: color('#eee') });
13
+ expect(`${rule}`).toBe('color: #eee');
14
+ });
15
+
16
+ it('preEval normalizes assignment options without overwriting canonical options', async () => {
17
+ const rule = decl(
18
+ { name: 'color', value: any('red') },
19
+ { assign: AssignmentType.Add }
20
+ );
21
+ const preEvald = await rule.preEval(context);
22
+
23
+ expect(preEvald.toTrimmedString({ context })).toContain('color:');
24
+ expect(preEvald.toTrimmedString({ context })).not.toContain('+:');
25
+ expect(rule.toTrimmedString()).toContain('+:');
26
+ expect(rule.options?.assign).toBe(AssignmentType.Add);
27
+ expect(rule.options?.normalizedFromAssign).toBeUndefined();
28
+ });
29
+
30
+ it('omits the trailing semicolon when the canonical value is a collection', () => {
31
+ const rule = decl({
32
+ name: 'color',
33
+ value: coll([
34
+ decl({ name: 'nested', value: any('red') })
35
+ ])
36
+ });
37
+
38
+ expect(rule.requiredSemi).toBe(false);
39
+ expect(rules([rule]).toString()).not.toContain('};');
40
+ });
41
+
42
+ it('root rules serialization omits the trailing semicolon when a cloned declaration replaces the value with a collection', () => {
43
+ const rule = decl({ name: 'color', value: any('red') });
44
+ const clonedRule = rule.clone();
45
+ const patchedValue = coll([
46
+ decl({ name: 'nested', value: any('blue') })
47
+ ]);
48
+
49
+ clonedRule.adopt(patchedValue, context);
50
+ (clonedRule as unknown as { value: ReturnType<typeof coll> }).value = patchedValue;
51
+
52
+ expect(clonedRule.toTrimmedString({ context })).toContain('{');
53
+ expect(rules([clonedRule]).toString({ context })).not.toContain('};');
54
+ expect(rule.toTrimmedString()).toBe('color: red');
55
+ });
56
+
57
+ it('root rules serialization adds the trailing semicolon when a cloned declaration replaces a collection value with a scalar', () => {
58
+ const rule = decl({
59
+ name: 'color',
60
+ value: coll([
61
+ decl({ name: 'nested', value: any('red') })
62
+ ])
63
+ });
64
+ const clonedRule = rule.clone();
65
+ const patchedValue = any('blue');
66
+
67
+ clonedRule.adopt(patchedValue, context);
68
+ (clonedRule as unknown as { value: ReturnType<typeof any> }).value = patchedValue;
69
+
70
+ expect(clonedRule.toTrimmedString({ context })).toBe('color: blue');
71
+ expect(rules([clonedRule]).toString({ context })).toContain('blue;');
72
+ expect(rule.toTrimmedString()).toContain('{');
73
+ });
74
+
75
+ it('serialize-helper omits the trailing semicolon for a cloned collection value inside a ruleset', () => {
76
+ const rule = decl({ name: 'color', value: any('red') });
77
+ const node = rules([
78
+ ruleset({
79
+ selector: el('.x'),
80
+ rules: rules([rule])
81
+ })
82
+ ]);
83
+ const clonedNode = node.clone(true);
84
+ const clonedRule = (clonedNode.at(0, context) as ReturnType<typeof ruleset>).get('rules').at(0, context) as ReturnType<typeof decl>;
85
+ const patchedValue = coll([
86
+ decl({ name: 'nested', value: any('blue') })
87
+ ]);
88
+
89
+ clonedRule.adopt(patchedValue, context);
90
+ (clonedRule as unknown as { value: ReturnType<typeof coll> }).value = patchedValue;
91
+
92
+ expect(clonedNode.toString({ context })).toBeString(`
93
+ .x {
94
+ color: {
95
+ nested: blue;
96
+ }
97
+ }
98
+ `);
99
+ });
100
+
101
+ it('serialize-helper adds the trailing semicolon for a cloned scalar value inside a ruleset', () => {
102
+ const rule = decl({
103
+ name: 'color',
104
+ value: coll([
105
+ decl({ name: 'nested', value: any('red') })
106
+ ])
107
+ });
108
+ const node = rules([
109
+ ruleset({
110
+ selector: el('.x'),
111
+ rules: rules([rule])
112
+ })
113
+ ]);
114
+ const clonedNode = node.clone(true);
115
+ const clonedRule = (clonedNode.at(0, context) as ReturnType<typeof ruleset>).get('rules').at(0, context) as ReturnType<typeof decl>;
116
+ const patchedValue = any('blue');
117
+
118
+ clonedRule.adopt(patchedValue, context);
119
+ (clonedRule as unknown as { value: ReturnType<typeof any> }).value = patchedValue;
120
+
121
+ expect(clonedNode.toString({ context })).toBeString(`
122
+ .x {
123
+ color: blue;
124
+ }
125
+ `);
126
+ });
127
+
128
+ it('serialize-helper de-dupes declarations by a cloned property name', () => {
129
+ const first = decl({ name: 'color', value: any('red') });
130
+ const second = decl({ name: 'background', value: any('red') });
131
+ const node = rules([
132
+ ruleset({
133
+ selector: el('.x'),
134
+ rules: rules([first, second])
135
+ })
136
+ ]);
137
+ const clonedNode = node.clone(true);
138
+ const clonedFirst = (clonedNode.at(0, context) as ReturnType<typeof ruleset>).get('rules').at(0, context) as ReturnType<typeof decl>;
139
+ const patchedName = any('background', { role: 'property' });
140
+
141
+ clonedFirst.adopt(patchedName, context);
142
+ (clonedFirst as unknown as { name: ReturnType<typeof any> }).name = patchedName;
143
+
144
+ expect(clonedNode.toString({ context })).toBeString(`
145
+ .x {
146
+ background: red;
147
+ }
148
+ `);
149
+ });
150
+
151
+ it('clears stale same-render-key edges when a render-owned declaration updates a direct field', () => {
152
+ const rule = decl({
153
+ name: any('item-1', { role: 'property' }),
154
+ value: expr(any('stale'))
155
+ });
156
+ const nextValue = num(4);
157
+ const renderKey = 1;
158
+
159
+ rule.adopt(nextValue, context);
160
+ (rule as typeof rule & { renderKey: number }).renderKey = renderKey;
161
+ (rule as typeof rule & { valueEdge: Map<number, ReturnType<typeof expr>> }).valueEdge = new Map([[renderKey, expr(any('stale-edge'))]]);
162
+ rule.setCurrentValue(nextValue, { ...context, renderKey });
163
+
164
+ expect(rule.get('value', { ...context, renderKey }).toTrimmedString()).toBe('4');
165
+ expect((rule as typeof rule & { valueEdge?: Map<number, ReturnType<typeof expr>> }).valueEdge).toBeUndefined();
166
+ });
167
+
168
+ it('preserves merged property declarations for later property lookups in nested output', async () => {
169
+ const node = rules([
170
+ ruleset({
171
+ selector: el('a'),
172
+ rules: rules([
173
+ decl({ name: 'background-color', value: any('red') }, { assign: AssignmentType.Add }),
174
+ decl({ name: 'background-color', value: any('foo') }, { assign: AssignmentType.Add }),
175
+ ruleset({
176
+ selector: sel([amp(), el('b')]),
177
+ rules: rules([
178
+ decl({
179
+ name: 'background',
180
+ value: ref({ key: 'background-color' }, { type: 'property' })
181
+ })
182
+ ])
183
+ })
184
+ ])
185
+ })
186
+ ]);
187
+
188
+ const evald = await node.eval(new Context({ collapseNesting: true }));
189
+
190
+ expect(evald.toString({ context: new Context({ collapseNesting: true }) })).toBeString(`
191
+ a {
192
+ background-color: red, foo;
193
+ }
194
+ ab {
195
+ background: red, foo;
196
+ }
197
+ `);
198
+ });
199
+
200
+ it('preserves merge-sequence declarations inside nested @starting-style blocks', async () => {
201
+ const node = rules([
202
+ ruleset({
203
+ selector: el('.x'),
204
+ rules: rules([
205
+ atrule({
206
+ name: any('@starting-style', { role: 'atkeyword' }),
207
+ rules: rules([
208
+ decl({ name: 'padding', value: any('10px') }, { assign: AssignmentType.MergeSequence }),
209
+ decl({ name: 'padding', value: any('8px') }, { assign: AssignmentType.MergeSequence }),
210
+ decl({ name: 'padding', value: any('6px') }, { assign: AssignmentType.MergeSequence }),
211
+ decl({ name: 'padding', value: any('4px') }, { assign: AssignmentType.MergeSequence })
212
+ ])
213
+ })
214
+ ])
215
+ })
216
+ ]);
217
+
218
+ const evalContext = new Context();
219
+ const evald = await node.eval(evalContext);
220
+ const outerRuleset = evald.at(0, evalContext) as ReturnType<typeof ruleset>;
221
+ const outerRules = outerRuleset.enterRules(evalContext)!;
222
+ const startingStyle = outerRules.at(0, evalContext) as ReturnType<typeof atrule>;
223
+ const startingStyleRules = startingStyle.enterRules(evalContext)!;
224
+ const startingStyleContext = {
225
+ ...evalContext,
226
+ renderKey: startingStyleRules.renderKey,
227
+ rulesContext: startingStyleRules
228
+ } as Context;
229
+ const startingStyleChildren = startingStyleRules.getRegistryChildren(startingStyleContext);
230
+
231
+ expect(startingStyleChildren).toHaveLength(4);
232
+ expect(startingStyleChildren[0]!.toTrimmedString({ context: startingStyleContext })).toBe('padding: 10px 8px 6px 4px');
233
+ expect(isVisibleInContext(startingStyleChildren[0]!, startingStyleContext)).toBe(true);
234
+ expect(startingStyleChildren.slice(1).every(child => !isVisibleInContext(child!, startingStyleContext))).toBe(true);
235
+ expect(startingStyleChildren.every(child => child.options?.normalizedFromAssign === AssignmentType.MergeSequence)).toBe(true);
236
+
237
+ expect(evald.toString({ context: new Context() })).toBeString(`
238
+ .x {
239
+ @starting-style {
240
+ padding: 10px 8px 6px 4px;
241
+ }
242
+ }
243
+ `);
244
+ });
245
+
246
+ // it('should serialize to a module', () => {
247
+ // let rule = decl({ name: expr([any('color')]), value: spaced([any('#eee')]) })
248
+ // rule.toModule(context, out)
249
+ // expect(out.toString()).toBe(
250
+ // '$J.decl({\n name: $J.expr([$J.any("color")]),\n value: $J.spaced([$J.any("#eee")])\n})'
251
+ // )
252
+ // })
253
+ });
@@ -0,0 +1,177 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import {
3
+ Context,
4
+ any,
5
+ call,
6
+ decl,
7
+ el,
8
+ list,
9
+ mixin,
10
+ num,
11
+ op,
12
+ ref,
13
+ rules,
14
+ ruleset,
15
+ getDependency,
16
+ vardecl
17
+ } from '../../index.js';
18
+ import { isNode } from '../util/is-node.js';
19
+ import { N } from '../node-type.js';
20
+ import type { Declaration } from '../declaration.js';
21
+ import type { Node } from '../node.js';
22
+ import type { Rules } from '../rules.js';
23
+ import type { Ruleset } from '../ruleset.js';
24
+
25
+ function getFirstRuleset(root: Rules): Ruleset {
26
+ const rulesetNode = root.value.find(node => isNode(node, N.Ruleset));
27
+ expect(rulesetNode).toBeDefined();
28
+ return rulesetNode as Ruleset;
29
+ }
30
+
31
+ function collectDeclarations(node: Node): Declaration[] {
32
+ if (isNode(node, N.Declaration)) {
33
+ return [node as Declaration];
34
+ }
35
+ if (isNode(node, N.Rules)) {
36
+ return node.value.flatMap(child => collectDeclarations(child));
37
+ }
38
+ return [];
39
+ }
40
+
41
+ function getDeclarations(node: Ruleset): Declaration[] {
42
+ return collectDeclarations(node.get('rules'));
43
+ }
44
+
45
+ describe('dependency graph propagation', () => {
46
+ // Tests 2-5 access declaration.value after eval, which returns undefined
47
+ // for evaluated references on this branch. Unskip once API builders are
48
+ // updated for the .data refactor.
49
+
50
+ it('keeps static literal declarations static', async () => {
51
+ const root = rules([
52
+ ruleset({
53
+ selector: el('.test'),
54
+ rules: rules([
55
+ decl({ name: 'color', value: any('red') })
56
+ ])
57
+ })
58
+ ]);
59
+ const ctx = new Context();
60
+ ctx.root = root;
61
+ const evald = await root.eval(ctx);
62
+ const declaration = getDeclarations(getFirstRuleset(evald))[0]!;
63
+
64
+ expect(getDependency(declaration.get('value'), ctx)).toBeNull();
65
+ });
66
+
67
+ it.skip('tracks direct top-level variable references', async () => {
68
+ const base = vardecl({ name: 'base', value: any('red') });
69
+ const root = rules([
70
+ base,
71
+ ruleset({
72
+ selector: el('.test'),
73
+ rules: rules([
74
+ decl({ name: 'color', value: ref({ key: 'base' }, { type: 'variable' }) })
75
+ ])
76
+ })
77
+ ]);
78
+ const ctx = new Context();
79
+ ctx.root = root;
80
+ const evald = await root.eval(ctx);
81
+ const declaration = getDeclarations(getFirstRuleset(evald))[0]!;
82
+ const dependency = getDependency(declaration.get('value'), ctx);
83
+
84
+ expect(dependency).not.toBeNull();
85
+ expect(dependency?.dependsOn?.size).toBe(1);
86
+ expect([...dependency!.dependsOn!].map(dep => dep.get('name').valueOf())).toEqual(['base']);
87
+ });
88
+
89
+ it.skip('propagates dependencies through operations', async () => {
90
+ const base = vardecl({ name: 'base', value: any('10px') });
91
+ const root = rules([
92
+ base,
93
+ ruleset({
94
+ selector: el('.test'),
95
+ rules: rules([
96
+ decl({
97
+ name: 'width',
98
+ value: op([
99
+ ref({ key: 'base' }, { type: 'variable' }),
100
+ '+',
101
+ num(2)
102
+ ])
103
+ })
104
+ ])
105
+ })
106
+ ]);
107
+ const ctx = new Context();
108
+ ctx.root = root;
109
+ const evald = await root.eval(ctx);
110
+ const declaration = getDeclarations(getFirstRuleset(evald))[0]!;
111
+ const dependency = getDependency(declaration.get('value'), ctx);
112
+
113
+ expect(dependency).not.toBeNull();
114
+ expect([...dependency!.dependsOn!].map(dep => dep.get('name').valueOf())).toEqual(['base']);
115
+ });
116
+
117
+ it.skip('treats mixin params with static inputs as static', async () => {
118
+ const passthrough = mixin({
119
+ name: any('.passthrough'),
120
+ params: list([any('value', { role: 'property' })]),
121
+ rules: rules([
122
+ decl({ name: 'color', value: ref({ key: 'value' }, { type: 'variable' }) })
123
+ ])
124
+ });
125
+ const root = rules([
126
+ passthrough,
127
+ ruleset({
128
+ selector: el('.test'),
129
+ rules: rules([
130
+ call({
131
+ name: ref({ key: '.passthrough' }, { type: 'mixin' }),
132
+ args: list([any('red')])
133
+ })
134
+ ])
135
+ })
136
+ ]);
137
+ const ctx = new Context();
138
+ ctx.root = root;
139
+ const evald = await root.eval(ctx);
140
+ const declaration = getDeclarations(getFirstRuleset(evald))[0]!;
141
+
142
+ expect(getDependency(declaration.get('value'), ctx)).toBeNull();
143
+ });
144
+
145
+ it.skip('tracks top-level vars through mixin parameter binding', async () => {
146
+ const base = vardecl({ name: 'base', value: any('red') });
147
+ const passthrough = mixin({
148
+ name: any('.passthrough'),
149
+ params: list([any('value', { role: 'property' })]),
150
+ rules: rules([
151
+ decl({ name: 'color', value: ref({ key: 'value' }, { type: 'variable' }) })
152
+ ])
153
+ });
154
+ const root = rules([
155
+ base,
156
+ passthrough,
157
+ ruleset({
158
+ selector: el('.test'),
159
+ rules: rules([
160
+ call({
161
+ name: ref({ key: '.passthrough' }, { type: 'mixin' }),
162
+ args: list([ref({ key: 'base' }, { type: 'variable' })])
163
+ })
164
+ ])
165
+ })
166
+ ]);
167
+ const ctx = new Context();
168
+ ctx.root = root;
169
+ const evald = await root.eval(ctx);
170
+ const declaration = getDeclarations(getFirstRuleset(evald))[0]!;
171
+ const dependency = getDependency(declaration.get('value'), ctx);
172
+
173
+ expect(dependency).not.toBeNull();
174
+ expect(dependency?.dependsOn?.size).toBe(1);
175
+ expect([...dependency!.dependsOn!].map(dep => dep.get('name').valueOf())).toEqual(['base']);
176
+ });
177
+ });
@@ -0,0 +1,213 @@
1
+ import { describe, it, expect, beforeEach, beforeAll, afterAll } from 'vitest';
2
+ import {
3
+ rules,
4
+ decl,
5
+ vardecl,
6
+ any,
7
+ ref,
8
+ Rules,
9
+ Node
10
+ } from '../index.js';
11
+ import { Context } from '../../context.js';
12
+ import type { FindOptions } from '../util/registry-utils.js';
13
+
14
+ function getVar(context: Context, n: Rules, key: string, opts: FindOptions = {}) {
15
+ context.rulesContext = n;
16
+ opts.searchParents = true;
17
+ return n.find('declaration', key, 'VarDeclaration', opts);
18
+ }
19
+
20
+ describe('Detached Rulesets - Variable Lookups', () => {
21
+ let context: Context;
22
+
23
+ beforeAll(() => {
24
+ Node.prototype.fullRender = true;
25
+ });
26
+ afterAll(() => {
27
+ Node.prototype.fullRender = false;
28
+ });
29
+
30
+ beforeEach(() => {
31
+ context = new Context();
32
+ context.id = 'testing';
33
+ });
34
+
35
+ describe('Basic parent lookup (sanity check)', () => {
36
+ it('should find variable in parent scope', async () => {
37
+ const inherited = rules([]);
38
+ const node = rules([
39
+ vardecl({ name: 'foo', value: any('bar') }),
40
+ inherited
41
+ ]);
42
+
43
+ await node.eval(context);
44
+
45
+ const found = getVar(context, inherited, 'foo');
46
+
47
+ expect(found).toBeDefined();
48
+ expect(`${found}`).toBe('$foo: bar');
49
+ });
50
+ });
51
+
52
+ describe('Private variables', () => {
53
+ it('should NOT find private variables when searching from within the Rules', async () => {
54
+ // Create nested Rules structure:
55
+ // rootRules {
56
+ // @private-var: public-value;
57
+ // privateRules {
58
+ // @private-var: private-value; // private visibility
59
+ // }
60
+ // }
61
+ const privateRules = rules([
62
+ vardecl({ name: 'private-var', value: any('private-value') })
63
+ ], {
64
+ rulesVisibility: {
65
+ VarDeclaration: 'private'
66
+ }
67
+ });
68
+
69
+ const node = rules([
70
+ vardecl({ name: 'private-var', value: any('public-value') }),
71
+ privateRules
72
+ ]);
73
+
74
+ await node.eval(context);
75
+
76
+ // When searching from within the private Rules (same scope), private does NOT block.
77
+ // Private only blocks external access (outside looking in via child searches).
78
+ const found = getVar(context, privateRules, 'private-var');
79
+
80
+ // Should find the private one — same-scope lookups are not blocked by private visibility
81
+ expect(found).toBeDefined();
82
+ expect(`${found}`).toBe('$private-var: private-value');
83
+ });
84
+
85
+ it('should NOT find private variables when searching from outside the Rules', async () => {
86
+ // Create nested Rules structure:
87
+ // rootRules {
88
+ // privateRules {
89
+ // @private-var: private-value; // private visibility
90
+ // }
91
+ // }
92
+ const privateRules = rules([
93
+ vardecl({ name: 'private-var', value: any('private-value') })
94
+ ], {
95
+ rulesVisibility: {
96
+ VarDeclaration: 'private'
97
+ }
98
+ });
99
+
100
+ const node = rules([
101
+ privateRules
102
+ ]);
103
+
104
+ await node.eval(context);
105
+
106
+ // When searching from outside (parent), should NOT find the private variable
107
+ const found = getVar(context, node, 'private-var');
108
+
109
+ // Should NOT find the private variable from child
110
+ expect(found).toBeUndefined();
111
+ });
112
+ });
113
+
114
+ describe('Optional vs Private visibility', () => {
115
+ it('should treat optional variables as optional (continue searching)', async () => {
116
+ const optionalRules = rules([
117
+ vardecl({ name: 'var', value: any('optional-value') })
118
+ ], {
119
+ rulesVisibility: {
120
+ VarDeclaration: 'optional'
121
+ }
122
+ });
123
+
124
+ const node = rules([
125
+ vardecl({ name: 'var', value: any('public-value') }),
126
+ optionalRules
127
+ ]);
128
+
129
+ await node.eval(context);
130
+
131
+ const found = getVar(context, optionalRules, 'var');
132
+
133
+ // Should find the public one (optional ones are only returned if no public ones exist)
134
+ expect(found).toBeDefined();
135
+ expect(`${found}`).toBe('$var: public-value');
136
+ });
137
+
138
+ it('should find private variables from same scope (private only blocks outside-in)', async () => {
139
+ const privateRules = rules([
140
+ vardecl({ name: 'var', value: any('private-value') })
141
+ ], {
142
+ rulesVisibility: {
143
+ VarDeclaration: 'private'
144
+ }
145
+ });
146
+
147
+ const node = rules([
148
+ vardecl({ name: 'var', value: any('public-value') }),
149
+ privateRules
150
+ ]);
151
+
152
+ await node.eval(context);
153
+
154
+ const found = getVar(context, privateRules, 'var');
155
+
156
+ // Same-scope lookup: private does NOT block. Should find the private one.
157
+ expect(found).toBeDefined();
158
+ expect(`${found}`).toBe('$var: private-value');
159
+ });
160
+
161
+ it('should return optional variable when no public variable exists', async () => {
162
+ const optionalRules = rules([
163
+ vardecl({ name: 'var', value: any('optional-value') })
164
+ ], {
165
+ rulesVisibility: {
166
+ VarDeclaration: 'optional'
167
+ }
168
+ });
169
+
170
+ const node = rules([
171
+ optionalRules
172
+ ]);
173
+
174
+ await node.eval(context);
175
+
176
+ const found = getVar(context, optionalRules, 'var');
177
+
178
+ // Should return the optional one since no public one exists
179
+ expect(found).toBeDefined();
180
+ expect(`${found}`).toBe('$var: optional-value');
181
+ });
182
+ });
183
+
184
+ describe('Variable lookup parent chain traversal', () => {
185
+ it('should traverse parent chain correctly', async () => {
186
+ // Root: @a: root-value;
187
+ // Middle: @a: middle-value;
188
+ // Inner: (lookup @a)
189
+ const innerRules = rules([
190
+ // Just a reference to test lookup
191
+ decl({ name: 'test', value: ref('a', { type: 'variable' }) })
192
+ ]);
193
+
194
+ const middleRules = rules([
195
+ vardecl({ name: 'a', value: any('middle-value') }),
196
+ innerRules
197
+ ]);
198
+
199
+ const node = rules([
200
+ vardecl({ name: 'a', value: any('root-value') }),
201
+ middleRules
202
+ ]);
203
+
204
+ await node.eval(context);
205
+
206
+ const found = getVar(context, innerRules, 'a');
207
+
208
+ // Should find the middle one (closest in parent chain)
209
+ expect(found).toBeDefined();
210
+ expect(`${found}`).toBe('$a: middle-value');
211
+ });
212
+ });
213
+ });