@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,742 @@
1
+ import type { Class } from 'type-fest';
2
+ import {
3
+ CANONICAL,
4
+ Node,
5
+ F_STATIC,
6
+ defineType,
7
+ type OptionalLocation,
8
+ type RenderKey,
9
+ type TreeContext
10
+ } from './node.js';
11
+ import { isNode } from './util/is-node.js';
12
+ import { Nil } from './nil.js';
13
+ import type { Context } from '../context.js';
14
+ import { Interpolated } from './interpolated.js';
15
+ import { Any, type AnyRole } from './any.js';
16
+ import { Reference } from './reference.js';
17
+ import { List } from './list.js';
18
+ import { Sequence, spaced } from './sequence.js';
19
+ import { Operation } from './operation.js';
20
+ import { N } from './node-type.js';
21
+ import { Collection } from './collection.js';
22
+ import { Rules } from './rules.js';
23
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
24
+ import { type MaybePromise, pipe, isThenable } from '@jesscss/awaitable-pipe';
25
+ import {
26
+ getDependency,
27
+ getParent,
28
+ mergeDependencies,
29
+ setDependency
30
+ } from './util/field-helpers.js';
31
+
32
+ export const enum AssignmentType {
33
+ Default = ':',
34
+ Add = '+:', // similar to += in JS, but merges lists / sequences / collections
35
+ // Subtract = '-:', // math subtraction, like -= in JS
36
+ // Multiply = '*:', // math multiplication, like *= in JS
37
+ // Divide = '/:', // math division, like /= in JS
38
+ CondAssign = '?:', // similar to ??= in JS or !default in Sass
39
+ // CondAdd = '?+:', // add if defined, otherwise assign
40
+ // CondSubtract = '?-:', // subtract if defined, otherwise assign
41
+ // CondMultiply = '?*:', // multiply if defined, otherwise assign
42
+ // CondDivide = '?/:', // divide if defined, otherwise assign
43
+
44
+ /** Legacy Less flags */
45
+ MergeList = '&,:', // merge into a list if another prop exists with this flag
46
+ MergeSequence = '&_:' // merge into a sequence if another prop exists with this flag
47
+ }
48
+
49
+ export type DeclarationOptions = {
50
+ assign?: AssignmentType;
51
+ /** Tracks that this declaration was created via assignment normalization (e.g. +:, +_:). */
52
+ normalizedFromAssign?: AssignmentType;
53
+ semi?: boolean;
54
+ /**
55
+ * This doesn't prevent shadowing; it prevents declarations like:
56
+ * ^$overwrite: foo;
57
+ *
58
+ * Written as `!$foo:` in Jess or imported from a readonly context
59
+ */
60
+ readonly?: boolean;
61
+ /**
62
+ * Instead of implicitly declaring or overriding,
63
+ * requires a variable to previously be explicitly
64
+ * declared within scope.
65
+ *
66
+ * Used by SCSS (!global) and Jess's (^$foo:)
67
+ */
68
+ setDefined?: boolean;
69
+
70
+ /** Used by SCSS (!default) and Jess (?:) */
71
+ // setIfUndefined?: boolean
72
+ /**
73
+ * Throw if already defined in the immediate scope
74
+ * Will not throw if defined in a parent scope.
75
+ *
76
+ * Used by SCSS in the case of mixins... not Jess?
77
+ */
78
+ throwIfDefined?: boolean;
79
+ };
80
+ /** Should be Any<'property'> | Interpolated<'property'> */
81
+ type NameValue<T extends AnyRole = 'property'> = Any<T> | Interpolated<T>;
82
+
83
+ export type DeclarationValue<T extends AnyRole = 'property'> = {
84
+ name: NameValue<T>;
85
+ value: Node;
86
+ /** The actual string representation of important, if it exists */
87
+ important?: Any<'flag'>;
88
+ };
89
+
90
+ /**
91
+ * A continuous collection of nodes.
92
+ *
93
+ * Initially, the name can be a Node or string.
94
+ * Once evaluated, name must be a string
95
+ */
96
+ export type DeclarationChildData = { name: NameValue; value: Node; important: Any<'flag'> | undefined };
97
+
98
+ export interface Declaration {
99
+ type: 'Declaration' | 'VarDeclaration';
100
+ shortType: 'decl' | 'vardecl';
101
+ }
102
+
103
+ export class Declaration<Opts extends DeclarationOptions = DeclarationOptions> extends Node<DeclarationValue, Opts, DeclarationChildData> {
104
+ static override childKeys = ['name', 'value', 'important'] as const;
105
+
106
+ name!: NameValue;
107
+ value!: Node;
108
+ important: Any<'flag'> | undefined;
109
+
110
+ private _getAssignmentRenderKey(context?: Context): RenderKey | undefined {
111
+ return context?.renderKey
112
+ ?? context?.rulesContext?.renderKey
113
+ ?? (this.renderKey !== CANONICAL ? this.renderKey : undefined);
114
+ }
115
+
116
+ private _setFieldOverride<K extends keyof DeclarationChildData & ('name' | 'value' | 'important')>(
117
+ key: K,
118
+ value: DeclarationChildData[K],
119
+ context?: Context
120
+ ): void {
121
+ const renderKey = this._getAssignmentRenderKey(context);
122
+ const effectiveContext = renderKey !== undefined && context?.renderKey !== renderKey
123
+ ? { ...context, renderKey }
124
+ : context;
125
+
126
+ if (value instanceof Node) {
127
+ this.adopt(value, effectiveContext);
128
+ }
129
+
130
+ if (renderKey !== undefined && renderKey !== CANONICAL && this.renderKey !== renderKey) {
131
+ const edgeKey = `${key}Edge` as const;
132
+ const edge = ((this as unknown as Record<string, unknown>)[edgeKey] as Map<RenderKey, DeclarationChildData[K]> | undefined)
133
+ ?? new Map<RenderKey, DeclarationChildData[K]>();
134
+ edge.set(renderKey, value);
135
+ (this as unknown as Record<string, unknown>)[edgeKey] = edge;
136
+ return;
137
+ }
138
+
139
+ if (renderKey !== undefined && renderKey !== CANONICAL) {
140
+ const edgeKey = `${key}Edge` as const;
141
+ const edge = ((this as unknown as Record<string, unknown>)[edgeKey] as Map<RenderKey, DeclarationChildData[K]> | undefined);
142
+ if (edge?.delete(renderKey) && edge.size === 0) {
143
+ delete (this as unknown as Record<string, unknown>)[edgeKey];
144
+ }
145
+ }
146
+
147
+ (this as unknown as Record<string, unknown>)[key] = value;
148
+ }
149
+
150
+ constructor(value: DeclarationValue, options?: Opts, location?: OptionalLocation, treeContext?: TreeContext) {
151
+ super(value, options, location, treeContext);
152
+ this.name = value.name;
153
+ this.value = value.value;
154
+ this.important = value.important;
155
+ if (this.name instanceof Node) {
156
+ this.adopt(this.name);
157
+ }
158
+ if (this.value instanceof Node) {
159
+ this.adopt(this.value);
160
+ }
161
+ if (this.important instanceof Node) {
162
+ this.adopt(this.important);
163
+ }
164
+ this.allowRuleRoot = true;
165
+ }
166
+
167
+ /** If the value has curly braces, a semi-colon is not required */
168
+ override get requiredSemi() {
169
+ return this.requiresSemi();
170
+ }
171
+
172
+ requiresSemi(context?: Context): boolean {
173
+ const value = this.get('value', context);
174
+ return !isNode(value, N.Collection) && !isNode(value, N.Mixin);
175
+ }
176
+
177
+ isCustomProperty(context?: Context): boolean {
178
+ return this.get('name', context).valueOf().startsWith('--');
179
+ }
180
+
181
+ getCurrentValue(context?: Context): Node {
182
+ return this.get('value', context);
183
+ }
184
+
185
+ setCurrentValue(value: Node, context?: Context): void {
186
+ this._setFieldOverride('value', value, context);
187
+ }
188
+
189
+ getCurrentName(context?: Context): NameValue {
190
+ return this.get('name', context);
191
+ }
192
+
193
+ setCurrentName(name: NameValue, context?: Context): void {
194
+ this._setFieldOverride('name', name, context);
195
+ }
196
+
197
+ getCurrentImportant(context?: Context): Any<'flag'> | undefined {
198
+ return this.get('important', context);
199
+ }
200
+
201
+ setCurrentImportant(important: Any<'flag'> | undefined, context?: Context): void {
202
+ this._setFieldOverride('important', important, context);
203
+ }
204
+
205
+ protected declTrimmedString(options?: PrintOptions) {
206
+ options = getPrintOptions(options);
207
+ const w = options.writer!;
208
+ const context = options.context;
209
+ const name = this.get('name', context);
210
+ const value = this.get('value', context);
211
+ const important = this.get('important', context);
212
+ const declarationOptions = this.options;
213
+ const { assign = ':', setDefined } = declarationOptions ?? {};
214
+ const mark = w.mark();
215
+ // setDefined uses `:=` (with default spacing rules) instead of the historical `$^` prefix.
216
+ const effAssign = (setDefined && assign === ':') ? ':=' : assign;
217
+ let a = effAssign === ':' ? ':' : ` ${effAssign}`;
218
+ // Serialize the property name so attached comments survive, then trim only
219
+ // trailing whitespace before the assignment token.
220
+ const normalizedName = w.capture(() => name.toString(options)).replace(/\s+$/, '');
221
+ w.add(`${normalizedName}${a}`, name);
222
+ // Custom properties must preserve value text exactly as provided.
223
+ const isCustomProperty = this.isCustomProperty(context);
224
+ if (isCustomProperty) {
225
+ options.inCustom = true;
226
+ // Preserve custom value text, but normalize boundary artifacts:
227
+ // - if capture ended with a line break before declaration termination,
228
+ // drop that trailing line break so semicolon insertion stays inline.
229
+ // - if a block comment is directly adjacent to a token (e.g. `a/*...*/`),
230
+ // insert a single separator space for stable CSS output.
231
+ let customOut = w.capture(() => value.toString(options));
232
+ customOut = customOut.replace(/[ \t\r\f]*\n[ \t\r\f]*$/g, '');
233
+ customOut = customOut.replace(/([^\s])\/\*/g, '$1 /*');
234
+ w.add(customOut, value);
235
+ options.inCustom = false;
236
+ } else {
237
+ // Capture value output to normalize spacing after ':'
238
+ let valOut = '';
239
+ try {
240
+ valOut = w.capture(() => value.toString(options));
241
+ } catch (error: unknown) {
242
+ throw error;
243
+ }
244
+ const startsOnNextLine = /^[ \t\r\f]*\n/.test(valOut);
245
+ const preserveLeadingMultilineValue = startsOnNextLine && /\n[\s\S]*\n/.test(valOut);
246
+ if (preserveLeadingMultilineValue) {
247
+ const normalizedValue = valOut.replace(/\s+$/g, '');
248
+ w.add(normalizedValue, value);
249
+ } else {
250
+ const normalizedValue = valOut.replace(/^\s+|\s+$/g, '');
251
+ // Ensure exactly one space after ':' by adding one space
252
+ w.add(' ');
253
+ w.add(normalizedValue, value);
254
+ }
255
+ if (!isNode(value, N.Collection)) {
256
+ if (important) {
257
+ let imp = w.capture(() => important.toString(options));
258
+ imp = imp.replace(/\s+$/g, '');
259
+
260
+ if (important.pre === 0) {
261
+ imp = imp.replace(/^\s+/g, '');
262
+ w.add(imp, important);
263
+ } else if (important.pre !== undefined) {
264
+ w.add(imp, important);
265
+ } else {
266
+ w.add(` ${imp.trimStart()}`, important);
267
+ }
268
+ }
269
+ }
270
+ }
271
+ return w.getSince(mark);
272
+ }
273
+
274
+ override toTrimmedString(options?: PrintOptions) {
275
+ return this.declTrimmedString(options);
276
+ }
277
+
278
+ override preEval(context: Context): MaybePromise<this> {
279
+ /** @removal-target — node-copy-reduction: maybeClone → return this.
280
+ * Option changes should stay on the derived declaration instance. */
281
+ let node = this.clone();
282
+ node.preEvaluated = true;
283
+ // Index should already be assigned by parent Rules
284
+ return this._applyAssignmentNormalization(node, context);
285
+ }
286
+
287
+ private _applyAssignmentNormalization(node: this, context: Context): MaybePromise<this> {
288
+ let name = node.get('name', context);
289
+ let value = node.get('value', context);
290
+ const excludesSelf = (candidate: Node): boolean => {
291
+ const currentSource = node.sourceNode ?? node;
292
+ const candidateSource = candidate.sourceNode ?? candidate;
293
+ return candidate !== node && candidateSource !== currentSource;
294
+ };
295
+ const isPriorMergedDeclaration = (candidate: Node): candidate is Declaration => (
296
+ excludesSelf(candidate)
297
+ && isNode(candidate, N.Declaration)
298
+ && candidate.options?.normalizedFromAssign !== undefined
299
+ );
300
+
301
+ const applyAssignmentNormalization = (key: Any<'property'>) => {
302
+ /** Normalize assignment types */
303
+ const nextOptions = {
304
+ ...(node.options ?? {})
305
+ } as Opts;
306
+ let assign = nextOptions.assign;
307
+ const rawAssign = assign as string | undefined;
308
+ if (rawAssign === '+,:') {
309
+ assign = AssignmentType.MergeList;
310
+ } else if (rawAssign === '+_:') {
311
+ assign = AssignmentType.MergeSequence;
312
+ }
313
+ if (assign && assign !== AssignmentType.Default) {
314
+ const normalizedAssign = assign;
315
+ value = value.clone();
316
+ const cloneWithDependency = (source: Node): Node => {
317
+ const cloned = source.clone(true, undefined, context);
318
+ const dependency = getDependency(source, context);
319
+ if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
320
+ setDependency(cloned, {
321
+ dependsOn: new Set(dependency.dependsOn),
322
+ sourceExpr: dependency.sourceExpr
323
+ }, context);
324
+ }
325
+ return cloned;
326
+ };
327
+ const createAssignmentReference = (options: ConstructorParameters<typeof Reference>[1]) => {
328
+ const ref = new Reference({ key }, options);
329
+ if (node.index !== undefined) {
330
+ ref.index = node.index;
331
+ }
332
+ return ref;
333
+ };
334
+ const findPreviousPropertyDeclaration = (): Declaration | undefined => {
335
+ if (node.type !== 'Declaration') {
336
+ return undefined;
337
+ }
338
+ let rulesScope = isNode(context.rulesContext, N.Rules) ? context.rulesContext as Rules : undefined;
339
+ if (!rulesScope) {
340
+ let cursor: Node | undefined = node;
341
+ while (cursor && !isNode(cursor, N.Rules)) {
342
+ cursor = getParent(cursor, context);
343
+ }
344
+ rulesScope = cursor as Rules | undefined;
345
+ }
346
+ if (!rulesScope) {
347
+ return undefined;
348
+ }
349
+ const found = rulesScope.find('declaration', `${key.valueOf()}`, 'Declaration', {
350
+ context,
351
+ local: true,
352
+ start: node.index,
353
+ filter: isPriorMergedDeclaration
354
+ });
355
+ if (found) {
356
+ return found;
357
+ }
358
+ const children = rulesScope.getRegistryChildren(context);
359
+ const start = Math.min(
360
+ Math.max((node.index ?? children.length) - 1, -1),
361
+ children.length - 1
362
+ );
363
+ for (let i = start; i >= 0; i--) {
364
+ const candidate = children[i];
365
+ if (
366
+ candidate
367
+ && String((candidate as Declaration).name?.valueOf?.() ?? '') === key.valueOf()
368
+ && isPriorMergedDeclaration(candidate)
369
+ ) {
370
+ return candidate;
371
+ }
372
+ }
373
+ return undefined;
374
+ };
375
+ /** Reference type */
376
+ let type: 'property' | 'variable' =
377
+ node.type === 'Declaration' ? 'property' : 'variable';
378
+ switch (assign) {
379
+ case AssignmentType.MergeList:
380
+ case AssignmentType.MergeSequence: {
381
+ const ref = createAssignmentReference({
382
+ type,
383
+ fallbackValue: new Nil(),
384
+ resolution: 'linear',
385
+ respectStart: true,
386
+ // Assignment normalization clears `assign` to Default, so matching by
387
+ // assignment flag prevents later merge iterations from seeing prior values.
388
+ // Only chain merged declarations together; plain prior declarations
389
+ // remain independent output in Less.
390
+ filter: isPriorMergedDeclaration
391
+ });
392
+ /**
393
+ * @note - It's up to Sequence and List to handle
394
+ * the merging of the values, if Nil()
395
+ * or a nested list.
396
+ */
397
+ const isMergeListAssign = assign === AssignmentType.MergeList;
398
+ value = isMergeListAssign
399
+ ? new List([ref, value])
400
+ : spaced([ref, value]);
401
+ node.setCurrentValue(value, context);
402
+ break;
403
+ }
404
+ case AssignmentType.Add: {
405
+ if (node.type === 'Declaration') {
406
+ const previousDeclaration = findPreviousPropertyDeclaration();
407
+ if (!previousDeclaration) {
408
+ node.setCurrentValue(value, context);
409
+ break;
410
+ }
411
+ // Less property `+:` appends comma-separated items.
412
+ // Use list composition (not generic `Operation +`) so scalar previous values
413
+ // remain distinct list members rather than string-concatenating.
414
+ node.setCurrentValue(new List([
415
+ cloneWithDependency(previousDeclaration.getCurrentValue(context)),
416
+ value
417
+ ]), context);
418
+ } else {
419
+ node.setCurrentValue(new Operation([
420
+ new Reference({ key }, { type }),
421
+ '+',
422
+ value
423
+ ]), context);
424
+ }
425
+ break;
426
+ }
427
+ case AssignmentType.CondAssign: {
428
+ node.setCurrentValue(new Reference({ key }, {
429
+ type,
430
+ fallbackValue: value
431
+ }), context);
432
+ break;
433
+ }
434
+ }
435
+ nextOptions.normalizedFromAssign = normalizedAssign;
436
+ nextOptions.assign = AssignmentType.Default;
437
+ node.options = nextOptions as Opts;
438
+ }
439
+ const normalizedValue = node.get('value', context);
440
+ const shouldResolveNormalizedAssignment = (
441
+ assign !== undefined
442
+ && assign !== AssignmentType.Default
443
+ );
444
+ const out = shouldResolveNormalizedAssignment
445
+ ? normalizedValue.eval(context)
446
+ : normalizedValue.preEval(context);
447
+ if (isThenable(out)) {
448
+ return out.then((value) => {
449
+ node.setCurrentValue(value, context);
450
+ return node;
451
+ });
452
+ }
453
+ node.setCurrentValue(out, context);
454
+ return node;
455
+ };
456
+
457
+ if (name instanceof Interpolated) {
458
+ const maybeKey = name.eval(context);
459
+ if (isThenable(maybeKey)) {
460
+ return maybeKey.then((key) => {
461
+ node.setCurrentName(key, context);
462
+ return applyAssignmentNormalization(key);
463
+ });
464
+ }
465
+ const key = maybeKey as Any<'property'>;
466
+ node.setCurrentName(key, context);
467
+ return applyAssignmentNormalization(key);
468
+ }
469
+ return applyAssignmentNormalization(name);
470
+ }
471
+
472
+ override evalNode(context: Context): MaybePromise<this | Nil> {
473
+ const currentValue = this.get('value', context);
474
+ const staticNestedCollection =
475
+ isNode(currentValue, N.Collection)
476
+ || (
477
+ isNode(currentValue, N.Sequence)
478
+ && (currentValue as Sequence).get('value').length > 0
479
+ && isNode((currentValue as Sequence).get('value')[(currentValue as Sequence).get('value').length - 1]!, N.Collection)
480
+ );
481
+ if (this.hasFlag(F_STATIC) && !staticNestedCollection) {
482
+ this.evaluated = true;
483
+ return this;
484
+ }
485
+ return pipe(
486
+ () => {
487
+ let node = this;
488
+ const copyDependency = (source: Node, target: Node) => {
489
+ const dependency = getDependency(source, context);
490
+ if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
491
+ setDependency(target, {
492
+ dependsOn: new Set(dependency.dependsOn),
493
+ sourceExpr: dependency.sourceExpr
494
+ }, context);
495
+ }
496
+ };
497
+ const cloneWithDependency = (source: Node): Node => {
498
+ const cloned = source.clone(false);
499
+ copyDependency(source, cloned);
500
+ return cloned;
501
+ };
502
+ const splitNestedPropertyValue = (valueNode: Node): { baseValue?: Node; collection: Collection } | undefined => {
503
+ if (isNode(valueNode, N.Collection)) {
504
+ return { collection: valueNode as Collection };
505
+ }
506
+ if (!isNode(valueNode, N.Sequence)) {
507
+ return undefined;
508
+ }
509
+ const items = [...(valueNode as Sequence).get('value')];
510
+ if (items.length === 0) {
511
+ return undefined;
512
+ }
513
+ const last = items[items.length - 1]!;
514
+ if (!isNode(last, N.Collection)) {
515
+ return undefined;
516
+ }
517
+ if (items.length === 1) {
518
+ return { collection: last as Collection };
519
+ }
520
+ const baseItems = items.slice(0, -1).map(item => item.copy(true));
521
+ const baseValue = baseItems.length === 1
522
+ ? baseItems[0]!
523
+ : new Sequence(baseItems, undefined, valueNode.location, this.treeContext);
524
+ return { baseValue, collection: last as Collection };
525
+ };
526
+ const cloneImportant = () => node.important?.copy(true) as Any<'flag'> | undefined;
527
+ const makePropertyName = (prefix: string, childName: NameValue): Any<'property'> =>
528
+ new Any(
529
+ `${prefix}-${String(childName.valueOf())}`,
530
+ { role: 'property' },
531
+ childName.location ?? node.location,
532
+ this.treeContext
533
+ );
534
+ const expandNestedPropertyDeclaration = (declNode: Declaration): MaybePromise<Declaration | Rules | Nil> => {
535
+ const nested = splitNestedPropertyValue(declNode.value);
536
+ if (!nested) {
537
+ return declNode;
538
+ }
539
+
540
+ const expanded: Node[] = [];
541
+ const declCtor = declNode.constructor as Class<Declaration>;
542
+ const prefix = String(declNode.name.valueOf());
543
+
544
+ if (nested.baseValue) {
545
+ expanded.push(new declCtor(
546
+ {
547
+ name: declNode.name.copy(true) as NameValue,
548
+ value: nested.baseValue.copy(true),
549
+ important: cloneImportant()
550
+ },
551
+ { ...declNode.options },
552
+ declNode.location,
553
+ this.treeContext
554
+ ));
555
+ }
556
+
557
+ const entries = nested.collection.value.filter(
558
+ child => isNode(child, N.Declaration) && !isNode(child, N.VarDeclaration)
559
+ ) as Declaration[];
560
+
561
+ const processEntry = (index: number): MaybePromise<void> => {
562
+ if (index >= entries.length) {
563
+ return;
564
+ }
565
+
566
+ const current = entries[index]!;
567
+ const preEvaluated = current.preEval(context) as Declaration | Nil | Promise<Declaration | Nil>;
568
+ const afterPreEval = (resolvedCurrent: Declaration | Nil): MaybePromise<void> => {
569
+ if (resolvedCurrent instanceof Nil || !isNode(resolvedCurrent, N.Declaration) || isNode(resolvedCurrent, N.VarDeclaration)) {
570
+ return processEntry(index + 1);
571
+ }
572
+
573
+ const prefixedDecl = new declCtor(
574
+ {
575
+ name: makePropertyName(prefix, resolvedCurrent.name as NameValue),
576
+ value: resolvedCurrent.value.copy(true),
577
+ important: (resolvedCurrent.important?.copy(true) as Any<'flag'> | undefined)
578
+ },
579
+ { ...resolvedCurrent.options },
580
+ resolvedCurrent.location,
581
+ this.treeContext
582
+ );
583
+
584
+ const evaluated = prefixedDecl.eval(context) as Declaration | Rules | Nil | Promise<Declaration | Rules | Nil>;
585
+ const afterEval = (resolvedPrefixed: Declaration | Rules | Nil): MaybePromise<void> => {
586
+ if (!(resolvedPrefixed instanceof Nil)) {
587
+ if (isNode(resolvedPrefixed, N.Rules)) {
588
+ expanded.push(...(resolvedPrefixed as Rules).value);
589
+ } else {
590
+ expanded.push(resolvedPrefixed as Declaration);
591
+ }
592
+ }
593
+ return processEntry(index + 1);
594
+ };
595
+
596
+ return isThenable(evaluated)
597
+ ? (evaluated as Promise<Declaration | Rules | Nil>).then(afterEval)
598
+ : afterEval(evaluated as Declaration | Rules | Nil);
599
+ };
600
+
601
+ return isThenable(preEvaluated)
602
+ ? (preEvaluated as Promise<Declaration | Nil>).then(afterPreEval)
603
+ : afterPreEval(preEvaluated as Declaration | Nil);
604
+ };
605
+
606
+ const finish = () => new Rules(expanded, undefined, declNode.location, this.treeContext);
607
+ const processed = processEntry(0);
608
+ return isThenable(processed)
609
+ ? (processed as Promise<void>).then(finish)
610
+ : finish();
611
+ };
612
+ const normalizeMergedLeadingPlaceholder = () => {
613
+ const normalizedAssign = node.options?.normalizedFromAssign;
614
+ const isListMergedAssign =
615
+ normalizedAssign === AssignmentType.Add
616
+ || normalizedAssign === AssignmentType.MergeList;
617
+ const nodeValue = node.get('value', context);
618
+ if (!isListMergedAssign || !isNode(nodeValue, N.List)) {
619
+ return;
620
+ }
621
+ const listValue = nodeValue.get('value', context);
622
+ if (listValue.length === 0) {
623
+ return;
624
+ }
625
+ const first = listValue[0]!;
626
+ const isEmptyPlaceholder = (
627
+ isNode(first, N.Nil)
628
+ || (isNode(first, N.List) && first.get('value').length === 0)
629
+ );
630
+ if (!isEmptyPlaceholder) {
631
+ return;
632
+ }
633
+ const rest = listValue.slice(1);
634
+ if (rest.length === 0) {
635
+ node.setCurrentValue(new Nil(), context);
636
+ return;
637
+ }
638
+ if (rest.length === 1) {
639
+ node.setCurrentValue(cloneWithDependency(rest[0]!), context);
640
+ return;
641
+ }
642
+ const clonedRest = rest.map(item => cloneWithDependency(item));
643
+ node.setCurrentValue(new List(clonedRest), context);
644
+ const dependency = mergeDependencies(clonedRest, context);
645
+ if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
646
+ setDependency(node.get('value', context), {
647
+ dependsOn: new Set(dependency.dependsOn),
648
+ sourceExpr: dependency.sourceExpr
649
+ }, context);
650
+ }
651
+ };
652
+ /** Pre-eval already evaluated the name, just need to do value (if not a var declaration) */
653
+ if (node.type === 'VarDeclaration') {
654
+ return node;
655
+ }
656
+ const value = node.get('value', context);
657
+ if (value instanceof Node) {
658
+ const isCustomProperty = node.isCustomProperty(context);
659
+ if (isCustomProperty) {
660
+ const hasInterpolation =
661
+ value.type === 'Interpolated'
662
+ || [...value.children(true)].some(child => child.type === 'Interpolated');
663
+ if (!hasInterpolation) {
664
+ return node;
665
+ }
666
+ context.inCustom = true;
667
+ }
668
+ const maybeNewValue = value.eval(context);
669
+ if (isThenable(maybeNewValue)) {
670
+ return (maybeNewValue as Promise<Node>).then((newValue) => {
671
+ context.inCustom = false;
672
+ if (newValue instanceof Nil) {
673
+ return newValue.inherit(node);
674
+ }
675
+ node.setCurrentValue(newValue, context);
676
+ normalizeMergedLeadingPlaceholder();
677
+ copyDependency(newValue, node.get('value', context));
678
+ // Merge !important from referenced declarations
679
+ if (context.hasImportantSource && !node.get('important', context)) {
680
+ node.setCurrentImportant(Any.create('!important', { role: 'flag' }) as Any<'flag'>, context);
681
+ }
682
+ // Pop important source after merging (if it was set)
683
+ if (context.hasImportantSource) {
684
+ context.popImportantSource();
685
+ }
686
+ return node;
687
+ });
688
+ }
689
+ context.inCustom = false;
690
+ if (maybeNewValue instanceof Nil) {
691
+ return (value as Nil).inherit(node);
692
+ }
693
+ node.setCurrentValue(maybeNewValue as Node, context);
694
+ normalizeMergedLeadingPlaceholder();
695
+ copyDependency(maybeNewValue as Node, node.get('value', context));
696
+ const expanded = expandNestedPropertyDeclaration(node);
697
+ if (isThenable(expanded)) {
698
+ return (expanded as Promise<Declaration | Rules | Nil>).then((resolvedExpanded) => {
699
+ if (context.hasImportantSource && !node.get('important', context) && isNode(resolvedExpanded, N.Declaration)) {
700
+ (resolvedExpanded as Declaration).setCurrentImportant(Any.create('!important', { role: 'flag' }) as Any<'flag'>, context);
701
+ }
702
+ if (context.hasImportantSource) {
703
+ context.popImportantSource();
704
+ }
705
+ return resolvedExpanded;
706
+ });
707
+ }
708
+ if (expanded !== node) {
709
+ if (context.hasImportantSource) {
710
+ context.popImportantSource();
711
+ }
712
+ return expanded;
713
+ }
714
+ // Merge !important from referenced declarations
715
+ if (context.hasImportantSource && !node.get('important', context)) {
716
+ node.setCurrentImportant(Any.create('!important', { role: 'flag' }) as Any<'flag'>, context);
717
+ }
718
+ // Pop important source after merging (if it was set)
719
+ if (context.hasImportantSource) {
720
+ context.popImportantSource();
721
+ }
722
+ }
723
+ return node;
724
+ }
725
+ ) as MaybePromise<this | Nil>;
726
+ }
727
+ }
728
+
729
+ export type DeclarationParams = ConstructorParameters<typeof Declaration>;
730
+
731
+ defineType<DeclarationValue>(Declaration, 'Declaration', 'decl');
732
+
733
+ export const decl = (
734
+ value: DeclarationValue<AnyRole> | { name: string; value: Node; important?: Any<'flag'> },
735
+ options?: DeclarationOptions,
736
+ location?: OptionalLocation,
737
+ treeContext?: TreeContext
738
+ ) => {
739
+ let { name } = value;
740
+ value.name = typeof name === 'string' ? new Any(name, { role: 'property' }) : name;
741
+ return new Declaration(value as DeclarationValue, options, location, treeContext);
742
+ };