@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,195 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { performance } from 'node:perf_hooks';
3
+ import {
4
+ Node,
5
+ F_STATIC,
6
+ F_NON_STATIC,
7
+ F_MAY_ASYNC,
8
+ any,
9
+ dimension,
10
+ num,
11
+ list,
12
+ paren,
13
+ expr,
14
+ seq,
15
+ decl,
16
+ ref
17
+ } from '../index.js';
18
+ import { Context } from '../../context.js';
19
+ import { pipe } from '@jesscss/awaitable-pipe';
20
+ import { isEvaluated, isPreEvaluated, setEvaluated, setPreEvaluated } from '../util/field-helpers.js';
21
+
22
+ function fmt(ms: number) {
23
+ return `${ms.toFixed(3)}ms`;
24
+ }
25
+
26
+ function buildStaticTree(depth: number, breadth: number): Node {
27
+ if (depth === 0) {
28
+ return any(`leaf`);
29
+ }
30
+ const children: Node[] = [];
31
+ for (let i = 0; i < breadth; i++) {
32
+ children.push(buildStaticTree(depth - 1, breadth));
33
+ }
34
+ return list(children);
35
+ }
36
+
37
+ function buildDeclTree(count: number, staticRatio: number = 1.0): Node[] {
38
+ const decls: Node[] = [];
39
+ for (let i = 0; i < count; i++) {
40
+ if (i / count < staticRatio) {
41
+ decls.push(
42
+ decl({
43
+ name: any(`prop-${i}`, { role: 'property' }),
44
+ value: expr(any(`value-${i}`))
45
+ })
46
+ );
47
+ } else {
48
+ decls.push(
49
+ decl({
50
+ name: any(`prop-${i}`, { role: 'property' }),
51
+ value: expr(ref({ key: any(`var-${i}`) }))
52
+ })
53
+ );
54
+ }
55
+ }
56
+ return decls;
57
+ }
58
+
59
+ function evalStaticLegacy(node: Node, context: Context): any {
60
+ let preEvaluatedNode: Node;
61
+
62
+ return pipe(
63
+ () => {
64
+ if (!isPreEvaluated(node, context)) {
65
+ return node.preEval(context);
66
+ }
67
+ return node;
68
+ },
69
+ (preEvald: Node) => {
70
+ preEvaluatedNode = preEvald;
71
+ setPreEvaluated(preEvaluatedNode, true, context);
72
+ if (preEvald !== node) {
73
+ preEvaluatedNode.inherit(node);
74
+ }
75
+ if (!isEvaluated(preEvaluatedNode, context)) {
76
+ return preEvaluatedNode['evalNode'](context);
77
+ }
78
+ return preEvaluatedNode;
79
+ },
80
+ (evald: Node) => {
81
+ setEvaluated(evald, true, context);
82
+ if (preEvaluatedNode !== evald) {
83
+ evald.inherit(preEvaluatedNode);
84
+ }
85
+ return evald;
86
+ }
87
+ );
88
+ }
89
+
90
+ describe('Node Flags Performance', () => {
91
+ it('should verify static trees have correct flags', () => {
92
+ const tree = buildStaticTree(3, 4);
93
+ expect(tree.hasFlag(F_STATIC)).toBe(true);
94
+ expect(tree.hasFlag(F_MAY_ASYNC)).toBe(false);
95
+ expect(tree.hasFlag(F_NON_STATIC)).toBe(false);
96
+ });
97
+
98
+ it('sync fast-path: static tree eval should be sync', () => {
99
+ const context = new Context();
100
+ const tree = buildStaticTree(4, 5);
101
+ const result = Node.evalStatic(tree, context);
102
+ expect(result).not.toBeInstanceOf(Promise);
103
+ });
104
+
105
+ it('benchmark: optimized vs legacy evalStatic for static declarations', () => {
106
+ const iterations = 1000;
107
+
108
+ // Optimized path
109
+ {
110
+ const context = new Context();
111
+ const declSets = Array.from({ length: iterations }, () => buildDeclTree(10, 1.0));
112
+ const start = performance.now();
113
+ for (let i = 0; i < iterations; i++) {
114
+ for (const d of declSets[i]!) {
115
+ void Node.evalStatic(d, context);
116
+ }
117
+ }
118
+ const optimized = performance.now() - start;
119
+ console.log(` Optimized: ${fmt(optimized)} for ${iterations * 10} static decls`);
120
+ }
121
+
122
+ // Legacy path (always uses pipe)
123
+ {
124
+ const context = new Context();
125
+ const declSets = Array.from({ length: iterations }, () => buildDeclTree(10, 1.0));
126
+ const start = performance.now();
127
+ for (let i = 0; i < iterations; i++) {
128
+ for (const d of declSets[i]!) {
129
+ void evalStaticLegacy(d, context);
130
+ }
131
+ }
132
+ const legacy = performance.now() - start;
133
+ console.log(` Legacy: ${fmt(legacy)} for ${iterations * 10} static decls`);
134
+ }
135
+ });
136
+
137
+ it('benchmark: optimized vs legacy evalStatic for static trees', () => {
138
+ const iterations = 200;
139
+
140
+ // Optimized path
141
+ {
142
+ const context = new Context();
143
+ const trees = Array.from({ length: iterations }, () => buildStaticTree(3, 5));
144
+ const start = performance.now();
145
+ for (let i = 0; i < iterations; i++) {
146
+ void Node.evalStatic(trees[i]!, context);
147
+ }
148
+ const optimized = performance.now() - start;
149
+ console.log(` Optimized: ${fmt(optimized)} for ${iterations} static trees (depth=3, breadth=5)`);
150
+ }
151
+
152
+ // Legacy path
153
+ {
154
+ const context = new Context();
155
+ const trees = Array.from({ length: iterations }, () => buildStaticTree(3, 5));
156
+ const start = performance.now();
157
+ for (let i = 0; i < iterations; i++) {
158
+ void evalStaticLegacy(trees[i]!, context);
159
+ }
160
+ const legacy = performance.now() - start;
161
+ console.log(` Legacy: ${fmt(legacy)} for ${iterations} static trees (depth=3, breadth=5)`);
162
+ }
163
+ });
164
+
165
+ it('benchmark: re-eval already-evaluated static nodes should be near-zero', () => {
166
+ const context = new Context();
167
+ const tree = buildStaticTree(4, 5);
168
+
169
+ void Node.evalStatic(tree, context);
170
+
171
+ const iterations = 10000;
172
+ const start = performance.now();
173
+ for (let i = 0; i < iterations; i++) {
174
+ void Node.evalStatic(tree, context);
175
+ }
176
+ const elapsed = performance.now() - start;
177
+
178
+ console.log(` Re-eval static tree: ${fmt(elapsed)} for ${iterations} calls (${fmt(elapsed / iterations)}/call)`);
179
+ expect(elapsed).toBeLessThan(100);
180
+ });
181
+
182
+ it('flag propagation: count nodes with correct flags in a large tree', () => {
183
+ const tree = buildStaticTree(4, 5);
184
+ let staticCount = 0;
185
+ let totalCount = 0;
186
+ for (const node of tree.nodes()) {
187
+ totalCount++;
188
+ if (node.hasFlag(F_STATIC)) {
189
+ staticCount++;
190
+ }
191
+ }
192
+ console.log(` Flag coverage: ${staticCount}/${totalCount} nodes are F_STATIC (${(staticCount / totalCount * 100).toFixed(1)}%)`);
193
+ expect(staticCount).toBe(totalCount);
194
+ });
195
+ });
@@ -0,0 +1,410 @@
1
+ import {
2
+ F_STATIC,
3
+ F_NON_STATIC,
4
+ F_MAY_ASYNC,
5
+ any,
6
+ dimension,
7
+ num,
8
+ color,
9
+ bool,
10
+ comment,
11
+ co,
12
+ nil,
13
+ list,
14
+ paren,
15
+ expr,
16
+ seq,
17
+ ref,
18
+ interpolated,
19
+ call,
20
+ op,
21
+ decl,
22
+ quoted,
23
+ url,
24
+ block
25
+ } from '../index.js';
26
+
27
+ describe('Node Flags', () => {
28
+ describe('leaf node flag assignment', () => {
29
+ it('Any should be F_STATIC', () => {
30
+ const node = any('hello');
31
+ expect(node.hasFlag(F_STATIC)).toBe(true);
32
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
33
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(false);
34
+ });
35
+
36
+ it('Dimension should be F_STATIC', () => {
37
+ const node = dimension([10, 'px']);
38
+ expect(node.hasFlag(F_STATIC)).toBe(true);
39
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
40
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(false);
41
+ });
42
+
43
+ it('Num should be F_STATIC', () => {
44
+ const node = num(42);
45
+ expect(node.hasFlag(F_STATIC)).toBe(true);
46
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
47
+ });
48
+
49
+ it('Color should be F_STATIC', () => {
50
+ const node = color([255, 0, 0, 1]);
51
+ expect(node.hasFlag(F_STATIC)).toBe(true);
52
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
53
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(false);
54
+ });
55
+
56
+ it('Bool should be F_STATIC', () => {
57
+ const node = bool(true);
58
+ expect(node.hasFlag(F_STATIC)).toBe(true);
59
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
60
+ });
61
+
62
+ it('Comment should be F_STATIC', () => {
63
+ const node = comment('/* test */');
64
+ expect(node.hasFlag(F_STATIC)).toBe(true);
65
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
66
+ });
67
+
68
+ it('Combinator should be F_STATIC', () => {
69
+ const node = co('>');
70
+ expect(node.hasFlag(F_STATIC)).toBe(true);
71
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
72
+ });
73
+
74
+ it('Nil should be F_STATIC (invisible but static)', () => {
75
+ const node = nil();
76
+ expect(node.hasFlag(F_STATIC)).toBe(true);
77
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
78
+ });
79
+ });
80
+
81
+ describe('non-static node flag assignment', () => {
82
+ it('Reference should be F_NON_STATIC and F_MAY_ASYNC', () => {
83
+ const node = ref({ key: any('color') });
84
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
85
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(true);
86
+ expect(node.hasFlag(F_STATIC)).toBe(false);
87
+ });
88
+
89
+ it('Interpolated should be F_NON_STATIC and F_MAY_ASYNC', () => {
90
+ const node = interpolated({
91
+ source: 'hello%%',
92
+ replacements: [ref({ key: any('name') })]
93
+ });
94
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
95
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(true);
96
+ expect(node.hasFlag(F_STATIC)).toBe(false);
97
+ });
98
+
99
+ it('Operation should be F_NON_STATIC', () => {
100
+ const node = op([dimension([10, 'px']), '+', dimension([5, 'px'])]);
101
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
102
+ expect(node.hasFlag(F_STATIC)).toBe(false);
103
+ });
104
+
105
+ it('Call should be F_NON_STATIC and F_MAY_ASYNC', () => {
106
+ const node = call({ name: 'rgb', args: list([num(255), num(0), num(0)]) });
107
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
108
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(true);
109
+ expect(node.hasFlag(F_STATIC)).toBe(false);
110
+ });
111
+ });
112
+
113
+ describe('flag bubbling via adopt()', () => {
114
+ it('container with all-static children should get F_STATIC', () => {
115
+ const items = [any('hello'), any('world')];
116
+ const node = list(items);
117
+ expect(node.hasFlag(F_STATIC)).toBe(true);
118
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
119
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(false);
120
+ });
121
+
122
+ it('container with one non-static child should get F_NON_STATIC', () => {
123
+ const items = [any('hello'), ref({ key: any('name') })];
124
+ const node = list(items as any);
125
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
126
+ expect(node.hasFlag(F_STATIC)).toBe(false);
127
+ });
128
+
129
+ it('container with one async child should get F_MAY_ASYNC', () => {
130
+ const items = [any('hello'), ref({ key: any('name') })];
131
+ const node = list(items as any);
132
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(true);
133
+ });
134
+
135
+ it('F_NON_STATIC takes precedence over F_STATIC', () => {
136
+ const items = [any('static-child'), ref({ key: any('dynamic') })];
137
+ const node = list(items as any);
138
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
139
+ expect(node.hasFlag(F_STATIC)).toBe(false);
140
+ });
141
+
142
+ it('nested static containers should bubble F_STATIC up', () => {
143
+ const inner = list([any('a'), any('b')]);
144
+ const outer = paren(inner);
145
+ expect(inner.hasFlag(F_STATIC)).toBe(true);
146
+ expect((outer as any).hasFlag(F_STATIC)).toBe(true);
147
+ expect((outer as any).hasFlag(F_NON_STATIC)).toBe(false);
148
+ });
149
+
150
+ it('nested non-static containers should bubble F_NON_STATIC up', () => {
151
+ const inner = list([any('a'), ref({ key: any('x') })] as any);
152
+ const outer = paren(inner);
153
+ expect((outer as any).hasFlag(F_NON_STATIC)).toBe(true);
154
+ expect((outer as any).hasFlag(F_STATIC)).toBe(false);
155
+ });
156
+
157
+ it('F_MAY_ASYNC should bubble through multiple levels', () => {
158
+ const r = ref({ key: any('x') });
159
+ const inner = list([r] as any);
160
+ const outer = paren(inner);
161
+ expect((outer as any).hasFlag(F_MAY_ASYNC)).toBe(true);
162
+ });
163
+
164
+ it('expression is always F_NON_STATIC (needs unwrapping)', () => {
165
+ const node = expr(any('hello'));
166
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
167
+ expect(node.hasFlag(F_STATIC)).toBe(false);
168
+ });
169
+
170
+ it('sequence with all static children should be F_STATIC', () => {
171
+ const node = seq([any('a'), any('b')]);
172
+ expect(node.hasFlag(F_STATIC)).toBe(true);
173
+ });
174
+
175
+ it('Declaration with expr value gets F_NON_STATIC from Expression', () => {
176
+ const d = decl({
177
+ name: any('color', { role: 'property' }),
178
+ value: expr(any('red'))
179
+ });
180
+ expect(d.hasFlag(F_NON_STATIC)).toBe(true);
181
+ expect(d.hasFlag(F_STATIC)).toBe(false);
182
+ expect(d.hasFlag(F_MAY_ASYNC)).toBe(false);
183
+ });
184
+
185
+ it('Declaration with direct static value (no expr) should be F_STATIC', () => {
186
+ const d = decl({
187
+ name: any('color', { role: 'property' }),
188
+ value: any('red')
189
+ });
190
+ expect(d.hasFlag(F_STATIC)).toBe(true);
191
+ expect(d.hasFlag(F_NON_STATIC)).toBe(false);
192
+ });
193
+
194
+ it('Declaration with interpolated name should be F_NON_STATIC', () => {
195
+ const d = decl({
196
+ name: interpolated({
197
+ source: 'col%%',
198
+ replacements: [ref({ key: any('suffix') })]
199
+ }),
200
+ value: expr(any('red'))
201
+ });
202
+ expect(d.hasFlag(F_NON_STATIC)).toBe(true);
203
+ expect(d.hasFlag(F_MAY_ASYNC)).toBe(true);
204
+ });
205
+
206
+ it('Declaration with non-static value should be F_NON_STATIC', () => {
207
+ const d = decl({
208
+ name: any('color', { role: 'property' }),
209
+ value: expr(ref({ key: any('main-color') }))
210
+ });
211
+ expect(d.hasFlag(F_NON_STATIC)).toBe(true);
212
+ expect(d.hasFlag(F_MAY_ASYNC)).toBe(true);
213
+ });
214
+ });
215
+
216
+ describe('flag exclusivity', () => {
217
+ it('addFlag(F_STATIC) is a no-op when F_NON_STATIC is set', () => {
218
+ const node = any('test');
219
+ node.addFlag(F_NON_STATIC);
220
+ node.addFlag(F_STATIC);
221
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
222
+ expect(node.hasFlag(F_STATIC)).toBe(false);
223
+ });
224
+
225
+ it('addFlag(F_NON_STATIC) removes F_STATIC', () => {
226
+ const node = any('test');
227
+ expect(node.hasFlag(F_STATIC)).toBe(true);
228
+ node.addFlag(F_NON_STATIC);
229
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
230
+ expect(node.hasFlag(F_STATIC)).toBe(false);
231
+ });
232
+ });
233
+
234
+ describe('Quoted flag behavior', () => {
235
+ it('Quoted with string value should be F_STATIC', () => {
236
+ const node = quoted('"hello world"');
237
+ expect(node.hasFlag(F_STATIC)).toBe(true);
238
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
239
+ });
240
+
241
+ it('Quoted with interpolation should be F_NON_STATIC', () => {
242
+ const interp = interpolated({
243
+ source: 'hello%%',
244
+ replacements: [ref({ key: any('name') })]
245
+ });
246
+ const node = quoted(interp);
247
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
248
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(true);
249
+ });
250
+ });
251
+
252
+ describe('Url flag behavior', () => {
253
+ it('Url with static quoted path should be F_STATIC', () => {
254
+ const node = url(quoted('"image.png"'));
255
+ expect(node.hasFlag(F_STATIC)).toBe(true);
256
+ });
257
+
258
+ it('Url with static Any path should be F_STATIC', () => {
259
+ const node = url(any('image.png'));
260
+ expect(node.hasFlag(F_STATIC)).toBe(true);
261
+ });
262
+ });
263
+
264
+ describe('Block flag behavior', () => {
265
+ it('Block with static child should be F_STATIC', () => {
266
+ const node = block(any('test'));
267
+ expect(node.hasFlag(F_STATIC)).toBe(true);
268
+ });
269
+
270
+ it('Block with non-static child should be F_NON_STATIC', () => {
271
+ const node = block(ref({ key: any('x') }));
272
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
273
+ });
274
+ });
275
+
276
+ describe('Paren flag behavior', () => {
277
+ it('non-escaped Paren with static child inherits F_STATIC', () => {
278
+ const node = paren(any('hello'));
279
+ expect((node as any).hasFlag(F_STATIC)).toBe(true);
280
+ expect((node as any).hasFlag(F_NON_STATIC)).toBe(false);
281
+ });
282
+
283
+ it('escaped Paren is always F_NON_STATIC', () => {
284
+ const node = paren(any('hello'), { escaped: true });
285
+ expect((node as any).hasFlag(F_NON_STATIC)).toBe(true);
286
+ expect((node as any).hasFlag(F_STATIC)).toBe(false);
287
+ });
288
+
289
+ it('Paren with non-static child gets F_NON_STATIC', () => {
290
+ const node = paren(ref({ key: any('x') }));
291
+ expect((node as any).hasFlag(F_NON_STATIC)).toBe(true);
292
+ expect((node as any).hasFlag(F_MAY_ASYNC)).toBe(true);
293
+ });
294
+ });
295
+
296
+ describe('Quoted escaped flag behavior', () => {
297
+ it('escaped Quoted with string value is F_NON_STATIC', () => {
298
+ const node = quoted('2/1', { escaped: true });
299
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
300
+ expect(node.hasFlag(F_STATIC)).toBe(false);
301
+ });
302
+
303
+ it('non-escaped Quoted with string value is F_STATIC', () => {
304
+ const node = quoted('hello');
305
+ expect(node.hasFlag(F_STATIC)).toBe(true);
306
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
307
+ });
308
+ });
309
+
310
+ describe('Expression always non-static', () => {
311
+ it('Expression wrapping static Any is still F_NON_STATIC', () => {
312
+ const node = expr(any('hello'));
313
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
314
+ expect(node.hasFlag(F_STATIC)).toBe(false);
315
+ });
316
+
317
+ it('Expression wrapping Dimension is F_NON_STATIC', () => {
318
+ const node = expr(dimension({ number: 42, unit: 'px' }));
319
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
320
+ });
321
+
322
+ it('Expression wrapping Reference is F_NON_STATIC and F_MAY_ASYNC', () => {
323
+ const node = expr(ref({ key: any('x') }));
324
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
325
+ expect(node.hasFlag(F_MAY_ASYNC)).toBe(true);
326
+ });
327
+ });
328
+
329
+ describe('composed containers', () => {
330
+ it('list of static values is F_STATIC', () => {
331
+ const node = list([any('a'), any('b'), dimension({ number: 1 })]);
332
+ expect(node.hasFlag(F_STATIC)).toBe(true);
333
+ expect(node.hasFlag(F_NON_STATIC)).toBe(false);
334
+ });
335
+
336
+ it('list with one non-static child gets F_NON_STATIC', () => {
337
+ const node = list([any('a'), ref({ key: any('b') })]);
338
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
339
+ expect(node.hasFlag(F_STATIC)).toBe(false);
340
+ });
341
+
342
+ it('sequence of static values is F_STATIC', () => {
343
+ const node = seq([any('a'), any('b')]);
344
+ expect(node.hasFlag(F_STATIC)).toBe(true);
345
+ });
346
+
347
+ it('sequence with expression child gets F_NON_STATIC', () => {
348
+ const node = seq([any('a'), expr(any('b'))]);
349
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
350
+ expect(node.hasFlag(F_STATIC)).toBe(false);
351
+ });
352
+
353
+ it('Declaration wrapping expr(ref()) gets F_NON_STATIC and F_MAY_ASYNC', () => {
354
+ const d = decl({
355
+ name: any('color', { role: 'property' }),
356
+ value: expr(ref({ key: any('main-color') }))
357
+ });
358
+ expect(d.hasFlag(F_NON_STATIC)).toBe(true);
359
+ expect(d.hasFlag(F_MAY_ASYNC)).toBe(true);
360
+ });
361
+
362
+ it('Declaration with static name and value (no expr wrapper) is F_STATIC', () => {
363
+ const d = decl({
364
+ name: any('color', { role: 'property' }),
365
+ value: any('red')
366
+ });
367
+ expect(d.hasFlag(F_STATIC)).toBe(true);
368
+ });
369
+
370
+ it('nested lists: list(list(static)) is F_STATIC', () => {
371
+ const inner = list([any('a'), any('b')]);
372
+ const outer = list([inner, any('c')]);
373
+ expect(outer.hasFlag(F_STATIC)).toBe(true);
374
+ });
375
+
376
+ it('nested lists: list(list(ref())) is F_NON_STATIC', () => {
377
+ const inner = list([any('a'), ref({ key: any('x') })]);
378
+ const outer = list([inner, any('c')]);
379
+ expect(outer.hasFlag(F_NON_STATIC)).toBe(true);
380
+ expect(outer.hasFlag(F_MAY_ASYNC)).toBe(true);
381
+ });
382
+
383
+ it('paren(expr(static)) is F_NON_STATIC because of Expression', () => {
384
+ const node = paren(expr(any('foo')));
385
+ expect((node as any).hasFlag(F_NON_STATIC)).toBe(true);
386
+ });
387
+
388
+ it('Combinator is always F_STATIC', () => {
389
+ const node = co(' ');
390
+ expect(node.hasFlag(F_STATIC)).toBe(true);
391
+ });
392
+
393
+ it('escaped paren wrapping escaped quoted is F_NON_STATIC', () => {
394
+ const node = paren(quoted('2/1', { escaped: true }), { escaped: true });
395
+ expect((node as any).hasFlag(F_NON_STATIC)).toBe(true);
396
+ });
397
+
398
+ it('F_VISIBLE is preserved when adding F_STATIC', () => {
399
+ const node = any('hello');
400
+ expect(node.hasFlag(F_STATIC)).toBe(true);
401
+ expect(node.visible).toBe(true);
402
+ });
403
+
404
+ it('F_VISIBLE is preserved when adding F_NON_STATIC', () => {
405
+ const node = expr(any('hello'));
406
+ expect(node.hasFlag(F_NON_STATIC)).toBe(true);
407
+ expect(node.visible).toBe(true);
408
+ });
409
+ });
410
+ });