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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/lib/index.cjs +20159 -0
  2. package/lib/index.d.cts +5993 -0
  3. package/lib/index.d.cts.map +1 -0
  4. package/lib/index.d.ts +5992 -21
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +19926 -22
  7. package/lib/index.js.map +1 -1
  8. package/package.json +15 -14
  9. package/src/__tests__/define-function-record.test.ts +58 -0
  10. package/src/__tests__/define-function-simple.test.ts +55 -0
  11. package/src/__tests__/define-function-split-sequence.test.ts +547 -0
  12. package/src/__tests__/define-function-type-parity.test.ts +9 -0
  13. package/src/__tests__/define-function.test.ts +763 -0
  14. package/src/__tests__/num-operations.test.ts +91 -0
  15. package/src/__tests__/safe-parse.test.ts +374 -0
  16. package/src/context.ts +896 -0
  17. package/src/conversions.ts +282 -0
  18. package/src/debug-log.ts +29 -0
  19. package/src/define-function.ts +1006 -0
  20. package/src/deprecation.ts +67 -0
  21. package/src/globals.d.ts +26 -0
  22. package/src/index.ts +31 -0
  23. package/src/jess-error.ts +773 -0
  24. package/src/logger/deprecation-processing.ts +109 -0
  25. package/src/logger.ts +31 -0
  26. package/src/plugin.ts +292 -0
  27. package/src/tree/LOOKUP_CHAINS.md +35 -0
  28. package/src/tree/README.md +18 -0
  29. package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
  30. package/src/tree/__tests__/ampersand.test.ts +382 -0
  31. package/src/tree/__tests__/at-rule.test.ts +2047 -0
  32. package/src/tree/__tests__/basic-render.test.ts +212 -0
  33. package/src/tree/__tests__/block.test.ts +40 -0
  34. package/src/tree/__tests__/call.test.ts +346 -0
  35. package/src/tree/__tests__/color.test.ts +537 -0
  36. package/src/tree/__tests__/condition.test.ts +186 -0
  37. package/src/tree/__tests__/control.test.ts +564 -0
  38. package/src/tree/__tests__/declaration.test.ts +253 -0
  39. package/src/tree/__tests__/dependency-graph.test.ts +177 -0
  40. package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
  41. package/src/tree/__tests__/dimension.test.ts +236 -0
  42. package/src/tree/__tests__/expression.test.ts +73 -0
  43. package/src/tree/__tests__/ext-node.test.ts +31 -0
  44. package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
  45. package/src/tree/__tests__/extend-import-style.test.ts +929 -0
  46. package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
  47. package/src/tree/__tests__/extend-list.test.ts +31 -0
  48. package/src/tree/__tests__/extend-roots.test.ts +1045 -0
  49. package/src/tree/__tests__/extend-rules.test.ts +740 -0
  50. package/src/tree/__tests__/func.test.ts +171 -0
  51. package/src/tree/__tests__/import-js.test.ts +33 -0
  52. package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
  53. package/src/tree/__tests__/import-style.test.ts +1967 -0
  54. package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
  55. package/src/tree/__tests__/interpolated.test.ts +41 -0
  56. package/src/tree/__tests__/list.test.ts +177 -0
  57. package/src/tree/__tests__/log.test.ts +83 -0
  58. package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
  59. package/src/tree/__tests__/mixin.test.ts +2171 -0
  60. package/src/tree/__tests__/negative.test.ts +45 -0
  61. package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
  62. package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
  63. package/src/tree/__tests__/node-flags.test.ts +410 -0
  64. package/src/tree/__tests__/node-graph.test.ts +598 -0
  65. package/src/tree/__tests__/node-mutation.test.ts +182 -0
  66. package/src/tree/__tests__/operation.test.ts +18 -0
  67. package/src/tree/__tests__/paren.test.ts +90 -0
  68. package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
  69. package/src/tree/__tests__/quoted.test.ts +72 -0
  70. package/src/tree/__tests__/range.test.ts +59 -0
  71. package/src/tree/__tests__/reference.test.ts +743 -0
  72. package/src/tree/__tests__/rest.test.ts +29 -0
  73. package/src/tree/__tests__/rules-raw.test.ts +14 -0
  74. package/src/tree/__tests__/rules.test.ts +1271 -0
  75. package/src/tree/__tests__/ruleset.test.ts +597 -0
  76. package/src/tree/__tests__/selector-attr.test.ts +50 -0
  77. package/src/tree/__tests__/selector-basic.test.ts +44 -0
  78. package/src/tree/__tests__/selector-capture.test.ts +22 -0
  79. package/src/tree/__tests__/selector-complex.test.ts +120 -0
  80. package/src/tree/__tests__/selector-compound.test.ts +74 -0
  81. package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
  82. package/src/tree/__tests__/selector-list.test.ts +59 -0
  83. package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
  84. package/src/tree/__tests__/selector.test.ts +182 -0
  85. package/src/tree/__tests__/sequence.test.ts +226 -0
  86. package/src/tree/__tests__/serialize-types.test.ts +529 -0
  87. package/src/tree/__tests__/spaced.test.ts +8 -0
  88. package/src/tree/__tests__/url.test.ts +72 -0
  89. package/src/tree/__tests__/var-declaration.test.ts +90 -0
  90. package/src/tree/ampersand.ts +538 -0
  91. package/src/tree/any.ts +169 -0
  92. package/src/tree/at-rule.ts +760 -0
  93. package/src/tree/block.ts +72 -0
  94. package/src/tree/bool.ts +46 -0
  95. package/src/tree/call.ts +593 -0
  96. package/src/tree/collection.ts +52 -0
  97. package/src/tree/color.ts +629 -0
  98. package/src/tree/combinator.ts +30 -0
  99. package/src/tree/comment.ts +36 -0
  100. package/src/tree/condition.ts +194 -0
  101. package/src/tree/control.ts +452 -0
  102. package/src/tree/declaration-custom.ts +56 -0
  103. package/src/tree/declaration-var.ts +87 -0
  104. package/src/tree/declaration.ts +742 -0
  105. package/src/tree/default-guard.ts +35 -0
  106. package/src/tree/dimension.ts +392 -0
  107. package/src/tree/expression.ts +97 -0
  108. package/src/tree/extend-list.ts +51 -0
  109. package/src/tree/extend.ts +391 -0
  110. package/src/tree/function.ts +254 -0
  111. package/src/tree/import-js.ts +130 -0
  112. package/src/tree/import-style.ts +875 -0
  113. package/{lib/tree/index.js → src/tree/index.ts} +49 -22
  114. package/src/tree/interpolated.ts +346 -0
  115. package/src/tree/js-array.ts +21 -0
  116. package/src/tree/js-expr.ts +50 -0
  117. package/src/tree/js-function.ts +31 -0
  118. package/src/tree/js-object.ts +22 -0
  119. package/src/tree/list.ts +415 -0
  120. package/src/tree/log.ts +89 -0
  121. package/src/tree/mixin.ts +331 -0
  122. package/src/tree/negative.ts +58 -0
  123. package/src/tree/nil.ts +57 -0
  124. package/src/tree/node-base.ts +1716 -0
  125. package/src/tree/node-type.ts +122 -0
  126. package/src/tree/node.ts +118 -0
  127. package/src/tree/number.ts +54 -0
  128. package/src/tree/operation.ts +187 -0
  129. package/src/tree/paren.ts +132 -0
  130. package/src/tree/query-condition.ts +47 -0
  131. package/src/tree/quoted.ts +119 -0
  132. package/src/tree/range.ts +101 -0
  133. package/src/tree/reference.ts +1099 -0
  134. package/src/tree/rest.ts +55 -0
  135. package/src/tree/rules-raw.ts +52 -0
  136. package/src/tree/rules.ts +2896 -0
  137. package/src/tree/ruleset.ts +1217 -0
  138. package/src/tree/selector-attr.ts +172 -0
  139. package/src/tree/selector-basic.ts +75 -0
  140. package/src/tree/selector-capture.ts +85 -0
  141. package/src/tree/selector-complex.ts +189 -0
  142. package/src/tree/selector-compound.ts +205 -0
  143. package/src/tree/selector-interpolated.ts +95 -0
  144. package/src/tree/selector-list.ts +245 -0
  145. package/src/tree/selector-pseudo.ts +173 -0
  146. package/src/tree/selector-simple.ts +10 -0
  147. package/src/tree/selector.ts +152 -0
  148. package/src/tree/sequence.ts +463 -0
  149. package/src/tree/tree.ts +130 -0
  150. package/src/tree/url.ts +95 -0
  151. package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
  152. package/src/tree/util/EXTEND_AUDIT.md +233 -0
  153. package/src/tree/util/EXTEND_BASELINE.md +64 -0
  154. package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
  155. package/src/tree/util/EXTEND_DOCS.md +24 -0
  156. package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
  157. package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
  158. package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
  159. package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
  160. package/src/tree/util/EXTEND_RULES.md +74 -0
  161. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
  162. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
  163. package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
  164. package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
  165. package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
  166. package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
  167. package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
  168. package/src/tree/util/__tests__/_archive/README.md +4 -0
  169. package/src/tree/util/__tests__/bitset.test.ts +142 -0
  170. package/src/tree/util/__tests__/debug-log.ts +50 -0
  171. package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
  172. package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
  173. package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
  174. package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
  175. package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
  176. package/src/tree/util/__tests__/is-node.test.ts +63 -0
  177. package/src/tree/util/__tests__/list-like.test.ts +63 -0
  178. package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
  179. package/src/tree/util/__tests__/print.test.ts +183 -0
  180. package/src/tree/util/__tests__/process-extends.test.ts +226 -0
  181. package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
  182. package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
  183. package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
  184. package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
  185. package/src/tree/util/ampersand-template.ts +9 -0
  186. package/src/tree/util/bitset.ts +194 -0
  187. package/src/tree/util/calculate.ts +11 -0
  188. package/src/tree/util/cast.ts +89 -0
  189. package/src/tree/util/cloning.ts +8 -0
  190. package/src/tree/util/collections.ts +299 -0
  191. package/src/tree/util/compare.ts +90 -0
  192. package/src/tree/util/cursor.ts +171 -0
  193. package/src/tree/util/extend-core.ts +2139 -0
  194. package/src/tree/util/extend-roots.ts +1108 -0
  195. package/src/tree/util/field-helpers.ts +354 -0
  196. package/src/tree/util/is-node.ts +43 -0
  197. package/src/tree/util/list-like.ts +93 -0
  198. package/src/tree/util/mixin-instance-primitives.ts +2020 -0
  199. package/src/tree/util/print.ts +303 -0
  200. package/src/tree/util/process-leading-is.ts +421 -0
  201. package/src/tree/util/recursion-helper.ts +54 -0
  202. package/src/tree/util/regex.ts +2 -0
  203. package/src/tree/util/registry-utils.ts +1953 -0
  204. package/src/tree/util/ruleset-trace.ts +17 -0
  205. package/src/tree/util/scoped-body-eval.ts +320 -0
  206. package/src/tree/util/selector-match-core.ts +2005 -0
  207. package/src/tree/util/selector-utils.ts +757 -0
  208. package/src/tree/util/serialize-helper.ts +535 -0
  209. package/src/tree/util/serialize-types.ts +318 -0
  210. package/src/tree/util/should-operate.ts +78 -0
  211. package/src/tree/util/sourcemap.ts +37 -0
  212. package/src/types/config.ts +247 -0
  213. package/src/types/index.ts +12 -0
  214. package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
  215. package/src/types.d.ts +9 -0
  216. package/src/types.ts +68 -0
  217. package/src/use-webpack-resolver.ts +56 -0
  218. package/src/visitor/__tests__/visitor.test.ts +136 -0
  219. package/src/visitor/index.ts +263 -0
  220. package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
  221. package/lib/context.d.ts +0 -352
  222. package/lib/context.d.ts.map +0 -1
  223. package/lib/context.js +0 -636
  224. package/lib/context.js.map +0 -1
  225. package/lib/conversions.d.ts +0 -73
  226. package/lib/conversions.d.ts.map +0 -1
  227. package/lib/conversions.js +0 -253
  228. package/lib/conversions.js.map +0 -1
  229. package/lib/debug-log.d.ts +0 -2
  230. package/lib/debug-log.d.ts.map +0 -1
  231. package/lib/debug-log.js +0 -27
  232. package/lib/debug-log.js.map +0 -1
  233. package/lib/define-function.d.ts +0 -587
  234. package/lib/define-function.d.ts.map +0 -1
  235. package/lib/define-function.js +0 -726
  236. package/lib/define-function.js.map +0 -1
  237. package/lib/deprecation.d.ts +0 -34
  238. package/lib/deprecation.d.ts.map +0 -1
  239. package/lib/deprecation.js +0 -57
  240. package/lib/deprecation.js.map +0 -1
  241. package/lib/jess-error.d.ts +0 -343
  242. package/lib/jess-error.d.ts.map +0 -1
  243. package/lib/jess-error.js +0 -508
  244. package/lib/jess-error.js.map +0 -1
  245. package/lib/logger/deprecation-processing.d.ts +0 -41
  246. package/lib/logger/deprecation-processing.d.ts.map +0 -1
  247. package/lib/logger/deprecation-processing.js +0 -81
  248. package/lib/logger/deprecation-processing.js.map +0 -1
  249. package/lib/logger.d.ts +0 -10
  250. package/lib/logger.d.ts.map +0 -1
  251. package/lib/logger.js +0 -20
  252. package/lib/logger.js.map +0 -1
  253. package/lib/plugin.d.ts +0 -94
  254. package/lib/plugin.d.ts.map +0 -1
  255. package/lib/plugin.js +0 -174
  256. package/lib/plugin.js.map +0 -1
  257. package/lib/tree/ampersand.d.ts +0 -98
  258. package/lib/tree/ampersand.d.ts.map +0 -1
  259. package/lib/tree/ampersand.js +0 -319
  260. package/lib/tree/ampersand.js.map +0 -1
  261. package/lib/tree/any.d.ts +0 -58
  262. package/lib/tree/any.d.ts.map +0 -1
  263. package/lib/tree/any.js +0 -104
  264. package/lib/tree/any.js.map +0 -1
  265. package/lib/tree/at-rule.d.ts +0 -53
  266. package/lib/tree/at-rule.d.ts.map +0 -1
  267. package/lib/tree/at-rule.js +0 -503
  268. package/lib/tree/at-rule.js.map +0 -1
  269. package/lib/tree/block.d.ts +0 -22
  270. package/lib/tree/block.d.ts.map +0 -1
  271. package/lib/tree/block.js +0 -24
  272. package/lib/tree/block.js.map +0 -1
  273. package/lib/tree/bool.d.ts +0 -18
  274. package/lib/tree/bool.d.ts.map +0 -1
  275. package/lib/tree/bool.js +0 -28
  276. package/lib/tree/bool.js.map +0 -1
  277. package/lib/tree/call.d.ts +0 -66
  278. package/lib/tree/call.d.ts.map +0 -1
  279. package/lib/tree/call.js +0 -306
  280. package/lib/tree/call.js.map +0 -1
  281. package/lib/tree/collection.d.ts +0 -30
  282. package/lib/tree/collection.d.ts.map +0 -1
  283. package/lib/tree/collection.js +0 -37
  284. package/lib/tree/collection.js.map +0 -1
  285. package/lib/tree/color.d.ts +0 -101
  286. package/lib/tree/color.d.ts.map +0 -1
  287. package/lib/tree/color.js +0 -513
  288. package/lib/tree/color.js.map +0 -1
  289. package/lib/tree/combinator.d.ts +0 -13
  290. package/lib/tree/combinator.d.ts.map +0 -1
  291. package/lib/tree/combinator.js +0 -12
  292. package/lib/tree/combinator.js.map +0 -1
  293. package/lib/tree/comment.d.ts +0 -20
  294. package/lib/tree/comment.d.ts.map +0 -1
  295. package/lib/tree/comment.js +0 -19
  296. package/lib/tree/comment.js.map +0 -1
  297. package/lib/tree/condition.d.ts +0 -31
  298. package/lib/tree/condition.d.ts.map +0 -1
  299. package/lib/tree/condition.js +0 -103
  300. package/lib/tree/condition.js.map +0 -1
  301. package/lib/tree/control.d.ts +0 -104
  302. package/lib/tree/control.d.ts.map +0 -1
  303. package/lib/tree/control.js +0 -430
  304. package/lib/tree/control.js.map +0 -1
  305. package/lib/tree/declaration-custom.d.ts +0 -18
  306. package/lib/tree/declaration-custom.d.ts.map +0 -1
  307. package/lib/tree/declaration-custom.js +0 -24
  308. package/lib/tree/declaration-custom.js.map +0 -1
  309. package/lib/tree/declaration-var.d.ts +0 -35
  310. package/lib/tree/declaration-var.d.ts.map +0 -1
  311. package/lib/tree/declaration-var.js +0 -63
  312. package/lib/tree/declaration-var.js.map +0 -1
  313. package/lib/tree/declaration.d.ts +0 -78
  314. package/lib/tree/declaration.d.ts.map +0 -1
  315. package/lib/tree/declaration.js +0 -286
  316. package/lib/tree/declaration.js.map +0 -1
  317. package/lib/tree/default-guard.d.ts +0 -15
  318. package/lib/tree/default-guard.d.ts.map +0 -1
  319. package/lib/tree/default-guard.js +0 -19
  320. package/lib/tree/default-guard.js.map +0 -1
  321. package/lib/tree/dimension.d.ts +0 -34
  322. package/lib/tree/dimension.d.ts.map +0 -1
  323. package/lib/tree/dimension.js +0 -294
  324. package/lib/tree/dimension.js.map +0 -1
  325. package/lib/tree/expression.d.ts +0 -25
  326. package/lib/tree/expression.d.ts.map +0 -1
  327. package/lib/tree/expression.js +0 -32
  328. package/lib/tree/expression.js.map +0 -1
  329. package/lib/tree/extend-list.d.ts +0 -23
  330. package/lib/tree/extend-list.d.ts.map +0 -1
  331. package/lib/tree/extend-list.js +0 -23
  332. package/lib/tree/extend-list.js.map +0 -1
  333. package/lib/tree/extend.d.ts +0 -47
  334. package/lib/tree/extend.d.ts.map +0 -1
  335. package/lib/tree/extend.js +0 -296
  336. package/lib/tree/extend.js.map +0 -1
  337. package/lib/tree/function.d.ts +0 -48
  338. package/lib/tree/function.d.ts.map +0 -1
  339. package/lib/tree/function.js +0 -74
  340. package/lib/tree/function.js.map +0 -1
  341. package/lib/tree/import-js.d.ts +0 -35
  342. package/lib/tree/import-js.d.ts.map +0 -1
  343. package/lib/tree/import-js.js +0 -45
  344. package/lib/tree/import-js.js.map +0 -1
  345. package/lib/tree/import-style.d.ts +0 -156
  346. package/lib/tree/import-style.d.ts.map +0 -1
  347. package/lib/tree/import-style.js +0 -566
  348. package/lib/tree/import-style.js.map +0 -1
  349. package/lib/tree/index.d.ts +0 -71
  350. package/lib/tree/index.d.ts.map +0 -1
  351. package/lib/tree/index.js.map +0 -1
  352. package/lib/tree/interpolated-reference.d.ts +0 -24
  353. package/lib/tree/interpolated-reference.d.ts.map +0 -1
  354. package/lib/tree/interpolated-reference.js +0 -37
  355. package/lib/tree/interpolated-reference.js.map +0 -1
  356. package/lib/tree/interpolated.d.ts +0 -62
  357. package/lib/tree/interpolated.d.ts.map +0 -1
  358. package/lib/tree/interpolated.js +0 -204
  359. package/lib/tree/interpolated.js.map +0 -1
  360. package/lib/tree/js-array.d.ts +0 -10
  361. package/lib/tree/js-array.d.ts.map +0 -1
  362. package/lib/tree/js-array.js +0 -10
  363. package/lib/tree/js-array.js.map +0 -1
  364. package/lib/tree/js-expr.d.ts +0 -23
  365. package/lib/tree/js-expr.d.ts.map +0 -1
  366. package/lib/tree/js-expr.js +0 -28
  367. package/lib/tree/js-expr.js.map +0 -1
  368. package/lib/tree/js-function.d.ts +0 -20
  369. package/lib/tree/js-function.d.ts.map +0 -1
  370. package/lib/tree/js-function.js +0 -16
  371. package/lib/tree/js-function.js.map +0 -1
  372. package/lib/tree/js-object.d.ts +0 -10
  373. package/lib/tree/js-object.d.ts.map +0 -1
  374. package/lib/tree/js-object.js +0 -10
  375. package/lib/tree/js-object.js.map +0 -1
  376. package/lib/tree/list.d.ts +0 -38
  377. package/lib/tree/list.d.ts.map +0 -1
  378. package/lib/tree/list.js +0 -83
  379. package/lib/tree/list.js.map +0 -1
  380. package/lib/tree/log.d.ts +0 -29
  381. package/lib/tree/log.d.ts.map +0 -1
  382. package/lib/tree/log.js +0 -56
  383. package/lib/tree/log.js.map +0 -1
  384. package/lib/tree/mixin.d.ts +0 -87
  385. package/lib/tree/mixin.d.ts.map +0 -1
  386. package/lib/tree/mixin.js +0 -112
  387. package/lib/tree/mixin.js.map +0 -1
  388. package/lib/tree/negative.d.ts +0 -17
  389. package/lib/tree/negative.d.ts.map +0 -1
  390. package/lib/tree/negative.js +0 -22
  391. package/lib/tree/negative.js.map +0 -1
  392. package/lib/tree/nil.d.ts +0 -30
  393. package/lib/tree/nil.d.ts.map +0 -1
  394. package/lib/tree/nil.js +0 -35
  395. package/lib/tree/nil.js.map +0 -1
  396. package/lib/tree/node-base.d.ts +0 -361
  397. package/lib/tree/node-base.d.ts.map +0 -1
  398. package/lib/tree/node-base.js +0 -930
  399. package/lib/tree/node-base.js.map +0 -1
  400. package/lib/tree/node.d.ts +0 -10
  401. package/lib/tree/node.d.ts.map +0 -1
  402. package/lib/tree/node.js +0 -45
  403. package/lib/tree/node.js.map +0 -1
  404. package/lib/tree/number.d.ts +0 -21
  405. package/lib/tree/number.d.ts.map +0 -1
  406. package/lib/tree/number.js +0 -27
  407. package/lib/tree/number.js.map +0 -1
  408. package/lib/tree/operation.d.ts +0 -26
  409. package/lib/tree/operation.d.ts.map +0 -1
  410. package/lib/tree/operation.js +0 -103
  411. package/lib/tree/operation.js.map +0 -1
  412. package/lib/tree/paren.d.ts +0 -19
  413. package/lib/tree/paren.d.ts.map +0 -1
  414. package/lib/tree/paren.js +0 -92
  415. package/lib/tree/paren.js.map +0 -1
  416. package/lib/tree/query-condition.d.ts +0 -17
  417. package/lib/tree/query-condition.d.ts.map +0 -1
  418. package/lib/tree/query-condition.js +0 -39
  419. package/lib/tree/query-condition.js.map +0 -1
  420. package/lib/tree/quoted.d.ts +0 -28
  421. package/lib/tree/quoted.d.ts.map +0 -1
  422. package/lib/tree/quoted.js +0 -75
  423. package/lib/tree/quoted.js.map +0 -1
  424. package/lib/tree/range.d.ts +0 -33
  425. package/lib/tree/range.d.ts.map +0 -1
  426. package/lib/tree/range.js +0 -47
  427. package/lib/tree/range.js.map +0 -1
  428. package/lib/tree/reference.d.ts +0 -76
  429. package/lib/tree/reference.d.ts.map +0 -1
  430. package/lib/tree/reference.js +0 -521
  431. package/lib/tree/reference.js.map +0 -1
  432. package/lib/tree/rest.d.ts +0 -15
  433. package/lib/tree/rest.d.ts.map +0 -1
  434. package/lib/tree/rest.js +0 -32
  435. package/lib/tree/rest.js.map +0 -1
  436. package/lib/tree/rules-raw.d.ts +0 -17
  437. package/lib/tree/rules-raw.d.ts.map +0 -1
  438. package/lib/tree/rules-raw.js +0 -37
  439. package/lib/tree/rules-raw.js.map +0 -1
  440. package/lib/tree/rules.d.ts +0 -262
  441. package/lib/tree/rules.d.ts.map +0 -1
  442. package/lib/tree/rules.js +0 -2359
  443. package/lib/tree/rules.js.map +0 -1
  444. package/lib/tree/ruleset.d.ts +0 -92
  445. package/lib/tree/ruleset.d.ts.map +0 -1
  446. package/lib/tree/ruleset.js +0 -528
  447. package/lib/tree/ruleset.js.map +0 -1
  448. package/lib/tree/selector-attr.d.ts +0 -31
  449. package/lib/tree/selector-attr.d.ts.map +0 -1
  450. package/lib/tree/selector-attr.js +0 -99
  451. package/lib/tree/selector-attr.js.map +0 -1
  452. package/lib/tree/selector-basic.d.ts +0 -24
  453. package/lib/tree/selector-basic.d.ts.map +0 -1
  454. package/lib/tree/selector-basic.js +0 -38
  455. package/lib/tree/selector-basic.js.map +0 -1
  456. package/lib/tree/selector-capture.d.ts +0 -23
  457. package/lib/tree/selector-capture.d.ts.map +0 -1
  458. package/lib/tree/selector-capture.js +0 -34
  459. package/lib/tree/selector-capture.js.map +0 -1
  460. package/lib/tree/selector-complex.d.ts +0 -40
  461. package/lib/tree/selector-complex.d.ts.map +0 -1
  462. package/lib/tree/selector-complex.js +0 -143
  463. package/lib/tree/selector-complex.js.map +0 -1
  464. package/lib/tree/selector-compound.d.ts +0 -16
  465. package/lib/tree/selector-compound.d.ts.map +0 -1
  466. package/lib/tree/selector-compound.js +0 -114
  467. package/lib/tree/selector-compound.js.map +0 -1
  468. package/lib/tree/selector-interpolated.d.ts +0 -23
  469. package/lib/tree/selector-interpolated.d.ts.map +0 -1
  470. package/lib/tree/selector-interpolated.js +0 -27
  471. package/lib/tree/selector-interpolated.js.map +0 -1
  472. package/lib/tree/selector-list.d.ts +0 -17
  473. package/lib/tree/selector-list.d.ts.map +0 -1
  474. package/lib/tree/selector-list.js +0 -174
  475. package/lib/tree/selector-list.js.map +0 -1
  476. package/lib/tree/selector-pseudo.d.ts +0 -42
  477. package/lib/tree/selector-pseudo.d.ts.map +0 -1
  478. package/lib/tree/selector-pseudo.js +0 -204
  479. package/lib/tree/selector-pseudo.js.map +0 -1
  480. package/lib/tree/selector-simple.d.ts +0 -5
  481. package/lib/tree/selector-simple.d.ts.map +0 -1
  482. package/lib/tree/selector-simple.js +0 -6
  483. package/lib/tree/selector-simple.js.map +0 -1
  484. package/lib/tree/selector.d.ts +0 -43
  485. package/lib/tree/selector.d.ts.map +0 -1
  486. package/lib/tree/selector.js +0 -56
  487. package/lib/tree/selector.js.map +0 -1
  488. package/lib/tree/sequence.d.ts +0 -43
  489. package/lib/tree/sequence.d.ts.map +0 -1
  490. package/lib/tree/sequence.js +0 -151
  491. package/lib/tree/sequence.js.map +0 -1
  492. package/lib/tree/tree.d.ts +0 -87
  493. package/lib/tree/tree.d.ts.map +0 -1
  494. package/lib/tree/tree.js +0 -2
  495. package/lib/tree/tree.js.map +0 -1
  496. package/lib/tree/url.d.ts +0 -18
  497. package/lib/tree/url.d.ts.map +0 -1
  498. package/lib/tree/url.js +0 -35
  499. package/lib/tree/url.js.map +0 -1
  500. package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
  501. package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
  502. package/lib/tree/util/__tests__/debug-log.js +0 -36
  503. package/lib/tree/util/__tests__/debug-log.js.map +0 -1
  504. package/lib/tree/util/calculate.d.ts +0 -3
  505. package/lib/tree/util/calculate.d.ts.map +0 -1
  506. package/lib/tree/util/calculate.js +0 -10
  507. package/lib/tree/util/calculate.js.map +0 -1
  508. package/lib/tree/util/cast.d.ts +0 -10
  509. package/lib/tree/util/cast.d.ts.map +0 -1
  510. package/lib/tree/util/cast.js +0 -87
  511. package/lib/tree/util/cast.js.map +0 -1
  512. package/lib/tree/util/cloning.d.ts +0 -4
  513. package/lib/tree/util/cloning.d.ts.map +0 -1
  514. package/lib/tree/util/cloning.js +0 -8
  515. package/lib/tree/util/cloning.js.map +0 -1
  516. package/lib/tree/util/collections.d.ts +0 -57
  517. package/lib/tree/util/collections.d.ts.map +0 -1
  518. package/lib/tree/util/collections.js +0 -136
  519. package/lib/tree/util/collections.js.map +0 -1
  520. package/lib/tree/util/compare.d.ts +0 -11
  521. package/lib/tree/util/compare.d.ts.map +0 -1
  522. package/lib/tree/util/compare.js +0 -89
  523. package/lib/tree/util/compare.js.map +0 -1
  524. package/lib/tree/util/extend-helpers.d.ts +0 -2
  525. package/lib/tree/util/extend-helpers.d.ts.map +0 -1
  526. package/lib/tree/util/extend-helpers.js +0 -2
  527. package/lib/tree/util/extend-helpers.js.map +0 -1
  528. package/lib/tree/util/extend-roots.d.ts +0 -37
  529. package/lib/tree/util/extend-roots.d.ts.map +0 -1
  530. package/lib/tree/util/extend-roots.js +0 -700
  531. package/lib/tree/util/extend-roots.js.map +0 -1
  532. package/lib/tree/util/extend-roots.old.d.ts +0 -132
  533. package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
  534. package/lib/tree/util/extend-roots.old.js +0 -2272
  535. package/lib/tree/util/extend-roots.old.js.map +0 -1
  536. package/lib/tree/util/extend-trace-debug.d.ts +0 -13
  537. package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
  538. package/lib/tree/util/extend-trace-debug.js +0 -34
  539. package/lib/tree/util/extend-trace-debug.js.map +0 -1
  540. package/lib/tree/util/extend-walk.d.ts +0 -53
  541. package/lib/tree/util/extend-walk.d.ts.map +0 -1
  542. package/lib/tree/util/extend-walk.js +0 -881
  543. package/lib/tree/util/extend-walk.js.map +0 -1
  544. package/lib/tree/util/extend.d.ts +0 -218
  545. package/lib/tree/util/extend.d.ts.map +0 -1
  546. package/lib/tree/util/extend.js +0 -3182
  547. package/lib/tree/util/extend.js.map +0 -1
  548. package/lib/tree/util/find-extendable-locations.d.ts +0 -2
  549. package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
  550. package/lib/tree/util/find-extendable-locations.js +0 -2
  551. package/lib/tree/util/find-extendable-locations.js.map +0 -1
  552. package/lib/tree/util/format.d.ts +0 -20
  553. package/lib/tree/util/format.d.ts.map +0 -1
  554. package/lib/tree/util/format.js +0 -67
  555. package/lib/tree/util/format.js.map +0 -1
  556. package/lib/tree/util/is-node.d.ts +0 -13
  557. package/lib/tree/util/is-node.d.ts.map +0 -1
  558. package/lib/tree/util/is-node.js +0 -43
  559. package/lib/tree/util/is-node.js.map +0 -1
  560. package/lib/tree/util/print.d.ts +0 -80
  561. package/lib/tree/util/print.d.ts.map +0 -1
  562. package/lib/tree/util/print.js +0 -205
  563. package/lib/tree/util/print.js.map +0 -1
  564. package/lib/tree/util/process-leading-is.d.ts +0 -25
  565. package/lib/tree/util/process-leading-is.d.ts.map +0 -1
  566. package/lib/tree/util/process-leading-is.js +0 -364
  567. package/lib/tree/util/process-leading-is.js.map +0 -1
  568. package/lib/tree/util/recursion-helper.d.ts +0 -15
  569. package/lib/tree/util/recursion-helper.d.ts.map +0 -1
  570. package/lib/tree/util/recursion-helper.js +0 -43
  571. package/lib/tree/util/recursion-helper.js.map +0 -1
  572. package/lib/tree/util/regex.d.ts +0 -4
  573. package/lib/tree/util/regex.d.ts.map +0 -1
  574. package/lib/tree/util/regex.js +0 -4
  575. package/lib/tree/util/regex.js.map +0 -1
  576. package/lib/tree/util/registry-utils.d.ts +0 -192
  577. package/lib/tree/util/registry-utils.d.ts.map +0 -1
  578. package/lib/tree/util/registry-utils.js +0 -1214
  579. package/lib/tree/util/registry-utils.js.map +0 -1
  580. package/lib/tree/util/ruleset-trace.d.ts +0 -4
  581. package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
  582. package/lib/tree/util/ruleset-trace.js +0 -14
  583. package/lib/tree/util/ruleset-trace.js.map +0 -1
  584. package/lib/tree/util/selector-compare.d.ts +0 -2
  585. package/lib/tree/util/selector-compare.d.ts.map +0 -1
  586. package/lib/tree/util/selector-compare.js +0 -2
  587. package/lib/tree/util/selector-compare.js.map +0 -1
  588. package/lib/tree/util/selector-match-core.d.ts +0 -184
  589. package/lib/tree/util/selector-match-core.d.ts.map +0 -1
  590. package/lib/tree/util/selector-match-core.js +0 -1603
  591. package/lib/tree/util/selector-match-core.js.map +0 -1
  592. package/lib/tree/util/selector-utils.d.ts +0 -30
  593. package/lib/tree/util/selector-utils.d.ts.map +0 -1
  594. package/lib/tree/util/selector-utils.js +0 -100
  595. package/lib/tree/util/selector-utils.js.map +0 -1
  596. package/lib/tree/util/serialize-helper.d.ts +0 -13
  597. package/lib/tree/util/serialize-helper.d.ts.map +0 -1
  598. package/lib/tree/util/serialize-helper.js +0 -387
  599. package/lib/tree/util/serialize-helper.js.map +0 -1
  600. package/lib/tree/util/serialize-types.d.ts +0 -9
  601. package/lib/tree/util/serialize-types.d.ts.map +0 -1
  602. package/lib/tree/util/serialize-types.js +0 -216
  603. package/lib/tree/util/serialize-types.js.map +0 -1
  604. package/lib/tree/util/should-operate.d.ts +0 -23
  605. package/lib/tree/util/should-operate.d.ts.map +0 -1
  606. package/lib/tree/util/should-operate.js +0 -46
  607. package/lib/tree/util/should-operate.js.map +0 -1
  608. package/lib/tree/util/sourcemap.d.ts +0 -7
  609. package/lib/tree/util/sourcemap.d.ts.map +0 -1
  610. package/lib/tree/util/sourcemap.js +0 -25
  611. package/lib/tree/util/sourcemap.js.map +0 -1
  612. package/lib/types/config.d.ts +0 -205
  613. package/lib/types/config.d.ts.map +0 -1
  614. package/lib/types/config.js +0 -2
  615. package/lib/types/config.js.map +0 -1
  616. package/lib/types/index.d.ts +0 -15
  617. package/lib/types/index.d.ts.map +0 -1
  618. package/lib/types/index.js +0 -3
  619. package/lib/types/index.js.map +0 -1
  620. package/lib/types/modes.d.ts.map +0 -1
  621. package/lib/types/modes.js +0 -2
  622. package/lib/types/modes.js.map +0 -1
  623. package/lib/types.d.ts +0 -61
  624. package/lib/types.d.ts.map +0 -1
  625. package/lib/types.js +0 -2
  626. package/lib/types.js.map +0 -1
  627. package/lib/use-webpack-resolver.d.ts +0 -9
  628. package/lib/use-webpack-resolver.d.ts.map +0 -1
  629. package/lib/use-webpack-resolver.js +0 -41
  630. package/lib/use-webpack-resolver.js.map +0 -1
  631. package/lib/visitor/index.d.ts +0 -136
  632. package/lib/visitor/index.d.ts.map +0 -1
  633. package/lib/visitor/index.js +0 -135
  634. package/lib/visitor/index.js.map +0 -1
  635. package/lib/visitor/less-visitor.d.ts +0 -7
  636. package/lib/visitor/less-visitor.d.ts.map +0 -1
  637. package/lib/visitor/less-visitor.js.map +0 -1
@@ -0,0 +1,463 @@
1
+ import { CANONICAL, Node, F_STATIC, defineType, type NodeEdge, type RenderKey } from './node.js';
2
+ import { canReuseEvalState } from './node-base.js';
3
+ import { Nil } from './nil.js';
4
+ import { List } from './list.js';
5
+ import type { Context } from '../context.js';
6
+ import { compare, compareNodeArray } from './util/compare.js';
7
+ import { isNode } from './util/is-node.js';
8
+ import { N } from './node-type.js';
9
+ import { type MaybePromise, pipe, isThenable, serialForEach } from '@jesscss/awaitable-pipe';
10
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
11
+ import { setParent } from './util/field-helpers.js';
12
+ import { addEdgeAt, addParentEdge, removeParentEdge } from './util/cursor.js';
13
+
14
+ export type SequenceOptions = {
15
+ /**
16
+ * CSS values are typically spaced,
17
+ * because of how they're parsed.
18
+ */
19
+ // spaced: boolean
20
+ /** Used with custom properties */
21
+ preserveWhitespace?: boolean;
22
+ /** Serialize children as a spaced value list without mutating child `pre` fields. */
23
+ forceSpacing?: boolean;
24
+ };
25
+
26
+ /**
27
+ * A continuous collection of nodes. Historically in Less,
28
+ * these were termed "expressions", but in computer science,
29
+ * an expression will yield a value, and a CSS value can
30
+ * actually be a sequence of values (like for shorthand)
31
+ */
32
+ export interface Sequence extends Node<Node[], SequenceOptions, SequenceChildData> {
33
+ type: 'Sequence' | 'QueryCondition';
34
+ shortType: 'seq' | 'query';
35
+ }
36
+ export type SequenceChildData = { value: Node[] };
37
+
38
+ export class Sequence extends Node<Node[], SequenceOptions, SequenceChildData> {
39
+ static override childKeys = ['value'] as const;
40
+
41
+ value!: Node[];
42
+ valueEdges?: Array<NodeEdge<Node> | undefined>;
43
+
44
+ constructor(value: Node[], options?: SequenceOptions, location?: any, treeContext?: any) {
45
+ super(value, options, location, treeContext);
46
+ this.value = value;
47
+ for (const child of value) {
48
+ if (child instanceof Node) {
49
+ this.adopt(child);
50
+ }
51
+ }
52
+ }
53
+
54
+ override clone(deep?: boolean, cloneFn?: (n: Node) => Node, ctx?: Context): this {
55
+ const value = this.getValue(ctx?.renderKey ?? this.renderKey);
56
+ const cloneChild = cloneFn ?? ((n: Node) => n.clone(deep, cloneFn, ctx));
57
+ const clonedValue = deep
58
+ ? value.map(child => cloneChild(child))
59
+ : [...value];
60
+ const options = this._meta?.options;
61
+ const newNode: this = Reflect.construct(this.constructor, [
62
+ [],
63
+ options ? { ...options } : undefined,
64
+ this.location,
65
+ this.treeContext
66
+ ]);
67
+ newNode.value = clonedValue;
68
+ if (ctx) {
69
+ for (const child of clonedValue) {
70
+ setParent(child, newNode, ctx);
71
+ }
72
+ } else {
73
+ for (const child of clonedValue) {
74
+ newNode.adopt(child);
75
+ }
76
+ }
77
+ newNode.inherit(this);
78
+ return newNode;
79
+ }
80
+
81
+ get length() {
82
+ return this.value.length;
83
+ }
84
+
85
+ getValue(renderKey?: RenderKey) {
86
+ if (renderKey === undefined || !this.valueEdges) {
87
+ return this.value;
88
+ }
89
+ let resolved: Node[] | undefined;
90
+ for (let i = 0; i < this.value.length; i++) {
91
+ const alternate = this.valueEdges[i]?.get(renderKey);
92
+ if (alternate !== undefined) {
93
+ (resolved ??= [...this.value])[i] = alternate;
94
+ }
95
+ }
96
+ return resolved ?? this.value;
97
+ }
98
+
99
+ getValueAt(index: number, renderKey?: RenderKey) {
100
+ return renderKey !== undefined
101
+ ? this.valueEdges?.[index]?.get(renderKey) ?? this.value[index]
102
+ : this.value[index];
103
+ }
104
+
105
+ private _replaceValueAt(index: number, node: Node, renderKey: RenderKey): void {
106
+ const previous = this.getValueAt(index, renderKey);
107
+ if (previous === node) {
108
+ return;
109
+ }
110
+ if (previous && previous !== node) {
111
+ removeParentEdge(previous, renderKey);
112
+ }
113
+ addEdgeAt(this, 'value', index, renderKey, node);
114
+ addParentEdge(node, renderKey, this);
115
+ }
116
+
117
+ private _cloneWithValue(value: Node[]): this {
118
+ const node = this.clone();
119
+ node.value = value;
120
+ for (const child of value) {
121
+ if (child instanceof Node) {
122
+ node.adopt(child);
123
+ }
124
+ }
125
+ return node;
126
+ }
127
+
128
+ // NOTE: `length` intentionally remains canonical for now. A state-aware
129
+ // getter would need an explicit Context channel; otherwise the same node
130
+ // instance would have ambiguous answers when different sessions patch
131
+ // `value` to different lengths at the same time.
132
+
133
+ override compare(other: Node, context?: Context) {
134
+ if (other instanceof Sequence) {
135
+ const equalityMode = this.treeContext?.equalityMode ?? 'coerce';
136
+ const renderKey = context?.renderKey;
137
+ const left = this.getValue(renderKey);
138
+ const right = other.getValue(renderKey);
139
+ const result = !context
140
+ ? compareNodeArray(left, right, equalityMode)
141
+ : compareSequenceItems(left, right, equalityMode, context);
142
+ return result;
143
+ }
144
+ if (other.type === 'Any') {
145
+ const normalize = (s: string) => s.replace(/\s+/g, ' ').trim();
146
+ const left = normalize(this.toTrimmedString(context ? { context } : undefined));
147
+ const right = normalize(other.toString());
148
+ return left === right ? 0 : undefined;
149
+ }
150
+ return undefined;
151
+ }
152
+
153
+ /** @todo - This serialization seems overly complex */
154
+ override toTrimmedString(options?: PrintOptions): string {
155
+ options = getPrintOptions(options);
156
+ if (options?.inCustom) {
157
+ return super.toTrimmedString(options);
158
+ }
159
+ const w = options.writer!;
160
+ const mark = w.mark();
161
+ const value = this.getValue(options.context?.renderKey ?? this.renderKey);
162
+ const length = value.length;
163
+
164
+ if (length === 0) {
165
+ return '';
166
+ }
167
+
168
+ // Serialize first node with toString() to preserve comments
169
+ const firstCaptured = w.captureWithMeta(() => value[0]!.toString(options));
170
+ w.add(firstCaptured.text);
171
+ let prevTrailingIntent = firstCaptured.trailingIntent;
172
+
173
+ // Serialize subsequent nodes with normalized spacing
174
+ for (let i = 1; i < length; i++) {
175
+ const node = value[i]!;
176
+ // For sequences, normalize spacing based on actual serialized output (including pre/post)
177
+ // If direct child has explicit pre === 0, respect that (no space)
178
+ if (node.pre === 0 && !this.options?.forceSpacing) {
179
+ // Explicitly no space - respect that, but still use toString() to preserve comments
180
+ node.toString(options);
181
+ } else {
182
+ // Check what's already written (previous node's output) to see if it ends with space
183
+ const currentMark = w.mark();
184
+ const writtenSoFar = w.getSince(mark);
185
+ const prevEndsWithSpace = writtenSoFar.endsWith(' ');
186
+ w.restore(currentMark);
187
+
188
+ // Capture current node's output to check if it starts with space
189
+ // This captures the serialized output including pre/post from child nodes
190
+ const currentCaptured = w.captureWithMeta(() => node.toString(options));
191
+ let currentNodeOut = currentCaptured.text;
192
+ const isNegativeValue = isNode(node, N.Negative);
193
+ if (
194
+ isNegativeValue
195
+ && !this.options?.preserveWhitespace
196
+ && /^\s+-/.test(currentNodeOut)
197
+ ) {
198
+ currentNodeOut = currentNodeOut.replace(/^\s+/, '');
199
+ }
200
+ const currentStartsWithSpace = /^\s/.test(currentNodeOut);
201
+ const hasExplicitNoSpaceBoundary = (
202
+ !this.options?.forceSpacing
203
+ && (
204
+ prevTrailingIntent === 'explicit_none'
205
+ || currentCaptured.leadingIntent === 'explicit_none'
206
+ )
207
+ );
208
+
209
+ if (!prevEndsWithSpace && !currentStartsWithSpace && !hasExplicitNoSpaceBoundary) {
210
+ // No space present - add single space before node
211
+ w.add(' ');
212
+ }
213
+ // Write the captured output (node was already serialized in capture())
214
+ w.add(currentNodeOut);
215
+ prevTrailingIntent = currentCaptured.trailingIntent;
216
+ }
217
+ }
218
+
219
+ return w.getSince(mark);
220
+ }
221
+
222
+ override operate(b: Node, op: string, context: Context): Sequence | List {
223
+ if (op !== '+') {
224
+ throw new Error(`Sequence operation "${op}" not supported`);
225
+ }
226
+ let newSequence = this.clone();
227
+ if (b instanceof List) {
228
+ return new List([newSequence, ...b.getValue(context.renderKey)]).inherit(this);
229
+ } else if (isNode(b, N.Sequence)) {
230
+ /** Inference not working in this class? */
231
+ const values = b.getValue(context.renderKey).map(v => v.clone());
232
+ if (values.length) {
233
+ values[0]!.pre = 1;
234
+ }
235
+ newSequence.value = [...newSequence.getValue(context.renderKey), ...values];
236
+ for (const child of newSequence.value) {
237
+ newSequence.adopt(child);
238
+ }
239
+ } else {
240
+ b = b.clone();
241
+ b.pre = 1;
242
+ newSequence.value = [...newSequence.getValue(context.renderKey), b];
243
+ for (const child of newSequence.value) {
244
+ newSequence.adopt(child);
245
+ }
246
+ }
247
+ return newSequence;
248
+ }
249
+
250
+ override preEval(context: Context): MaybePromise<Node> {
251
+ const reusableState = canReuseEvalState(this, context);
252
+ if (this.preEvaluated && reusableState) {
253
+ return this;
254
+ }
255
+ const renderKey = context.renderKey ?? this.renderKey;
256
+ const isNonCanonical = renderKey !== undefined && renderKey !== CANONICAL;
257
+ const value = this.getValue(renderKey);
258
+ const nextValue = [...value];
259
+
260
+ if (!this.hasFlag(F_STATIC)) {
261
+ const maybe = serialForEach(nextValue, (child, i) => {
262
+ const result = child.preEval(context);
263
+ if (isThenable(result)) {
264
+ return (result as Promise<Node>).then((resolved) => {
265
+ if (resolved !== child) {
266
+ nextValue[i] = resolved;
267
+ }
268
+ });
269
+ }
270
+ if (result !== child) {
271
+ nextValue[i] = result as Node;
272
+ }
273
+ });
274
+ if (isThenable(maybe)) {
275
+ return (maybe as Promise<void>).then(() => {
276
+ if (isNonCanonical) {
277
+ for (let i = 0; i < nextValue.length; i++) {
278
+ if (nextValue[i] !== value[i]) {
279
+ this._replaceValueAt(i, nextValue[i]!, renderKey);
280
+ }
281
+ }
282
+ if (reusableState) {
283
+ this.preEvaluated = true;
284
+ }
285
+ return this;
286
+ }
287
+ const changed = nextValue.some((child, i) => child !== value[i]);
288
+ if (!changed) {
289
+ if (reusableState) {
290
+ this.preEvaluated = true;
291
+ }
292
+ return this;
293
+ }
294
+ const node = this._cloneWithValue(nextValue);
295
+ node.preEvaluated = true;
296
+ return node;
297
+ });
298
+ }
299
+ if (isNonCanonical) {
300
+ for (let i = 0; i < nextValue.length; i++) {
301
+ if (nextValue[i] !== value[i]) {
302
+ this._replaceValueAt(i, nextValue[i]!, renderKey);
303
+ }
304
+ }
305
+ if (reusableState) {
306
+ this.preEvaluated = true;
307
+ }
308
+ return this;
309
+ }
310
+ const changed = nextValue.some((child, i) => child !== value[i]);
311
+ if (!changed) {
312
+ if (reusableState) {
313
+ this.preEvaluated = true;
314
+ }
315
+ return this;
316
+ }
317
+ const node = this._cloneWithValue(nextValue);
318
+ node.preEvaluated = true;
319
+ return node;
320
+ }
321
+
322
+ if (reusableState) {
323
+ this.preEvaluated = true;
324
+ }
325
+ return this;
326
+ }
327
+
328
+ /**
329
+ * During evaluation of sequences,
330
+ * Jess may find values that are lists.
331
+ *
332
+ * In this case, we need to create a single
333
+ * list that contains members of the expanded lists.
334
+ *
335
+ * @todo - If this is a selector sequence, and we've
336
+ * evaluated an expression to an inner sequence,
337
+ * then we should be inserting white-space combinators?
338
+ *
339
+ * @todo - REWRITE
340
+ */
341
+ override evalNode(context: Context): MaybePromise<Node> {
342
+ if (this.hasFlag(F_STATIC)) {
343
+ return this;
344
+ }
345
+ const renderKey = context.renderKey ?? this.renderKey;
346
+ const isNonCanonical = renderKey !== undefined && renderKey !== CANONICAL;
347
+ return pipe(
348
+ () => {
349
+ const nextValue = [...this.getValue(renderKey)];
350
+ let changed = false;
351
+ const maybe = serialForEach(nextValue.map((n, i) => [n, i] as const), ([n, i]) => {
352
+ const out = n.eval(context);
353
+ if (isThenable(out)) {
354
+ return (out as Promise<Node>).then((res) => {
355
+ if (res !== n) {
356
+ nextValue[i] = res;
357
+ changed = true;
358
+ }
359
+ });
360
+ }
361
+ if ((out as Node) !== n) {
362
+ nextValue[i] = out as Node;
363
+ changed = true;
364
+ }
365
+ });
366
+ if (isThenable(maybe)) {
367
+ return (maybe as Promise<void>).then(() => {
368
+ return { changed, nextValue };
369
+ });
370
+ }
371
+ return { changed, nextValue };
372
+ },
373
+ ({ changed, nextValue }) => {
374
+ const currentValue = this.getValue(renderKey);
375
+ const value = nextValue.filter(n => n && !(n instanceof Nil));
376
+ const shapeChanged = value.length !== currentValue.length;
377
+
378
+ if (isNonCanonical && !shapeChanged) {
379
+ if (changed) {
380
+ for (let i = 0; i < value.length; i++) {
381
+ if (value[i] !== currentValue[i]) {
382
+ this._replaceValueAt(i, value[i]!, renderKey);
383
+ }
384
+ }
385
+ }
386
+ return this;
387
+ }
388
+
389
+ if (value.length === 1 && !this.options?.preserveWhitespace) {
390
+ return value[0]!;
391
+ }
392
+ if (!changed && !shapeChanged) {
393
+ return this;
394
+ }
395
+ return this._cloneWithValue(value);
396
+ }
397
+ );
398
+ }
399
+
400
+ /** @todo move to visitors */
401
+ // toCSS(context: Context, out: OutputCollector): void {
402
+ // const cast = context.cast
403
+ // this.value.forEach(n => {
404
+ // const val = cast(n)
405
+ // val.toCSS(context, out)
406
+ // })
407
+ // }
408
+
409
+ // toModule(context: Context, out: OutputCollector) {
410
+ // const loc = this.location
411
+ // out.add('$J.expr([', loc)
412
+ // const length = this.value.length - 1
413
+ // this.value.forEach((n, i) => {
414
+ // n.toModule(context, out)
415
+ // if (i < length) {
416
+ // out.add(', ')
417
+ // }
418
+ // })
419
+ // out.add('])')
420
+ // }
421
+ }
422
+
423
+ export const seq = defineType(Sequence, 'Sequence', 'seq');
424
+
425
+ export const spaced = (
426
+ value: Node[],
427
+ options?: SequenceOptions
428
+ ) => {
429
+ for (let i = 1; i < value.length; i++) {
430
+ value[i]!.pre = 1;
431
+ }
432
+ return new Sequence(value, options);
433
+ };
434
+
435
+ function compareSequenceItems(
436
+ left: Node[],
437
+ right: Node[],
438
+ equalityMode: 'coerce' | 'strict',
439
+ context: Context
440
+ ): 0 | 1 | -1 | undefined {
441
+ let output: 0 | 1 | -1 | undefined;
442
+
443
+ if (left.length !== right.length) {
444
+ return undefined;
445
+ }
446
+
447
+ for (let i = 0; i < left.length; i++) {
448
+ const a = left[i]!;
449
+ const b = right[i]!;
450
+ const result = a instanceof Node && b instanceof Node
451
+ ? a.compare(b, context)
452
+ : compare(a, b, equalityMode);
453
+ if (result === undefined) {
454
+ return undefined;
455
+ }
456
+ if (output === undefined) {
457
+ output = result;
458
+ } else if (result !== output) {
459
+ return undefined;
460
+ }
461
+ }
462
+ return output;
463
+ }
@@ -0,0 +1,130 @@
1
+ import type { Ampersand } from './ampersand.js';
2
+ import type { Any, Anonymous, Keyword } from './any.js';
3
+ import type { AtRule } from './at-rule.js';
4
+ import type { Call } from './call.js';
5
+ import type { Declaration } from './declaration.js';
6
+ import type { Dimension } from './dimension.js';
7
+ import type { Expression } from './expression.js';
8
+ import type { Operation } from './operation.js';
9
+ import type { BasicSelector } from './selector-basic.js';
10
+ import type { List } from './list.js';
11
+ import type { Mixin } from './mixin.js';
12
+ import type { Func } from './function.js';
13
+ import type { JsFunction } from './js-function.js';
14
+ import type { Ruleset } from './ruleset.js';
15
+ import type { Rules } from './rules.js';
16
+ import type { ComplexSelector } from './selector-complex.js';
17
+ import type { CompoundSelector } from './selector-compound.js';
18
+ import type { StyleImport } from './import-style.js';
19
+ import type { JsImport } from './import-js.js';
20
+ import type { Nil } from './nil.js';
21
+ import type { SelectorList } from './selector-list.js';
22
+ import type { Collection } from './collection.js';
23
+ import type { VarDeclaration } from './declaration-var.js';
24
+ import type { Rest } from './rest.js';
25
+ import type { SimpleSelector } from './selector-simple.js';
26
+ import type { PseudoSelector } from './selector-pseudo.js';
27
+ import type { Combinator } from './combinator.js';
28
+ import type { Sequence } from './sequence.js';
29
+ import type { Selector } from './selector.js';
30
+ import type { JsObject } from './js-object.js';
31
+ import type { JsArray } from './js-array.js';
32
+ import type { Num } from './number.js';
33
+ import type { Url } from './url.js';
34
+ import type { Quoted } from './quoted.js';
35
+ import type { Color } from './color.js';
36
+ import type { Reference } from './reference.js';
37
+ import type { Comment } from './comment.js';
38
+ import type { Range } from './range.js';
39
+ import type { Log } from './log.js';
40
+ import type { Paren } from './paren.js';
41
+ import type { Block } from './block.js';
42
+
43
+ import { N } from './node-type.js';
44
+
45
+ /**
46
+ * Maps N bitmask values → node instance types for TypeScript narrowing.
47
+ * Used by isNode() overloads.
48
+ */
49
+ export interface NToNode {
50
+ [N.BasicSelector]: BasicSelector;
51
+ [N.Ampersand]: Ampersand;
52
+ [N.PseudoSelector]: PseudoSelector;
53
+ [N.CompoundSelector]: CompoundSelector;
54
+ [N.ComplexSelector]: ComplexSelector;
55
+ [N.SelectorList]: SelectorList;
56
+ [N.Combinator]: Combinator;
57
+ [N.SimpleSelector]: SimpleSelector;
58
+ [N.Selector]: Selector;
59
+ [N.Any]: Any;
60
+ [N.Color]: Color;
61
+ [N.Dimension]: Dimension;
62
+ [N.Quoted]: Quoted;
63
+ [N.Expression]: Expression;
64
+ [N.Operation]: Operation;
65
+ [N.Paren]: Paren;
66
+ [N.Range]: Range;
67
+ [N.List]: List;
68
+ [N.Sequence]: Sequence;
69
+ [N.Nil]: Nil;
70
+ [N.Call]: Call;
71
+ [N.Func]: Func;
72
+ [N.Mixin]: Mixin;
73
+ [N.Declaration]: Declaration;
74
+ [N.VarDeclaration]: VarDeclaration;
75
+ [N.Rules]: Rules;
76
+ [N.Collection]: Collection;
77
+ [N.Ruleset]: Ruleset;
78
+ [N.AtRule]: AtRule;
79
+ [N.Reference]: Reference;
80
+ [N.Comment]: Comment;
81
+ [N.JsFunction]: JsFunction;
82
+ [N.JsObject]: JsObject;
83
+ [N.JsArray]: JsArray;
84
+ }
85
+
86
+ export type Nodes = {
87
+ Ampersand: typeof Ampersand;
88
+ Any: typeof Any;
89
+ Anonymous: typeof Anonymous;
90
+ Keyword: typeof Keyword;
91
+ AtRule: typeof AtRule;
92
+ Call: typeof Call;
93
+ Comment: typeof Comment;
94
+ Declaration: typeof Declaration;
95
+ Expression: typeof Expression;
96
+ Operation: typeof Operation;
97
+ VarDeclaration: typeof VarDeclaration;
98
+ Dimension: typeof Dimension;
99
+ Num: typeof Num;
100
+ Selector: typeof Selector;
101
+ BasicSelector: typeof BasicSelector;
102
+ SimpleSelector: typeof SimpleSelector;
103
+ PseudoSelector: typeof PseudoSelector;
104
+ ComplexSelector: typeof ComplexSelector;
105
+ CompoundSelector: typeof CompoundSelector;
106
+ SelectorList: typeof SelectorList;
107
+ Combinator: typeof Combinator;
108
+ List: typeof List;
109
+ Mixin: typeof Mixin;
110
+ Func: typeof Func;
111
+ JsFunction: typeof JsFunction;
112
+ JsObject: typeof JsObject;
113
+ JsArray: typeof JsArray;
114
+ Ruleset: typeof Ruleset;
115
+ Rules: typeof Rules;
116
+ StyleImport: typeof StyleImport;
117
+ JsImport: typeof JsImport;
118
+ Nil: typeof Nil;
119
+ Collection: typeof Collection;
120
+ Rest: typeof Rest;
121
+ Sequence: typeof Sequence;
122
+ Url: typeof Url;
123
+ Quoted: typeof Quoted;
124
+ Color: typeof Color;
125
+ Reference: typeof Reference;
126
+ Range: typeof Range;
127
+ Log: typeof Log;
128
+ Paren: typeof Paren;
129
+ Block: typeof Block;
130
+ };
@@ -0,0 +1,95 @@
1
+ import { Node, defineType, type NodeOptions, type OptionalLocation, type TreeContext } from './node.js';
2
+ import { type Quoted } from './quoted.js';
3
+ import { type Any } from './any.js';
4
+ import { getPrintOptions, type PrintOptions } from './util/print.js';
5
+ import { isNode } from './util/is-node.js';
6
+ import { N } from './node-type.js';
7
+ import type { Context } from '../context.js';
8
+ import { isThenable, type MaybePromise } from '@jesscss/awaitable-pipe';
9
+ import { Reference } from './reference.js';
10
+
11
+ export type UrlChildData = { value: Quoted | Any };
12
+
13
+ /**
14
+ * e.g. url('foo.png')
15
+ */
16
+ export interface Url {
17
+ type: 'Url';
18
+ shortType: 'url';
19
+ eval(context: Context): MaybePromise<Url>;
20
+ }
21
+
22
+ export class Url extends Node<Quoted | Any, NodeOptions, UrlChildData> {
23
+ static override childKeys = ['value'] as const;
24
+
25
+ value!: Quoted | Any;
26
+
27
+ constructor(value: Quoted | Any, options?: NodeOptions, location?: OptionalLocation, treeContext?: TreeContext) {
28
+ super(value, options, location, treeContext);
29
+ this.value = value;
30
+ if (value instanceof Node) {
31
+ this.adopt(value);
32
+ }
33
+ }
34
+
35
+ /**
36
+ * @todo - enable URL rewriting
37
+ */
38
+ // NOTE: `valueOf()` intentionally remains canonical for now. Import-path
39
+ // consumers currently call it without a Context channel, so a state-aware
40
+ // answer would require either plumbing Context into that observer or changing
41
+ // the eval contract to return a materialized Url value for those callers.
42
+ override valueOf(): string {
43
+ return this.pathValue();
44
+ }
45
+
46
+ pathValue(context?: Context): string {
47
+ let value: string | Quoted | Any = this.value;
48
+
49
+ if (isNode(value, N.Quoted)) {
50
+ value = value.get('value') as string | Quoted | Any;
51
+ if (isNode(value)) {
52
+ return String(value);
53
+ }
54
+ return value as string;
55
+ }
56
+ return String(value);
57
+ }
58
+
59
+ override evalNode(context: Context): MaybePromise<Url> {
60
+ const value = this.value;
61
+ let effectiveValue: Quoted | Any = value;
62
+ if (isNode(value, N.Any)) {
63
+ const rawValue = String(value.valueOf());
64
+ if (/^@[\w-]+$/.test(rawValue)) {
65
+ effectiveValue = new Reference(rawValue.slice(1), { type: 'variable' });
66
+ } else if (/^\$[\w-]+$/.test(rawValue)) {
67
+ effectiveValue = new Reference(rawValue.slice(1), { type: 'property' });
68
+ }
69
+ }
70
+ const finish = (nextValue: Quoted | Any): Url => {
71
+ if (nextValue !== value) {
72
+ this.value = nextValue;
73
+ }
74
+ return this;
75
+ };
76
+ const maybeEvald = effectiveValue.eval(context) as MaybePromise<Quoted | Any>;
77
+ if (isThenable(maybeEvald)) {
78
+ return (maybeEvald as Promise<Quoted | Any>).then(finish);
79
+ }
80
+ return finish(maybeEvald as Quoted | Any);
81
+ }
82
+
83
+ override toTrimmedString(options?: PrintOptions) {
84
+ options = getPrintOptions(options);
85
+ const w = options.writer!;
86
+ const mark = w.mark();
87
+ const value = this.value;
88
+ w.add('url(');
89
+ value.toString(options);
90
+ w.add(')');
91
+ return w.getSince(mark);
92
+ }
93
+ }
94
+
95
+ export const url = defineType(Url, 'Url');