@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,122 @@
1
+ /**
2
+ * Bitmask-based node type system.
3
+ *
4
+ * Each concrete node type gets a single bit. Abstract parent types
5
+ * (Selector, SimpleSelector) are masks combining their children's bits.
6
+ * A node's `nodeType` field is the OR of its own bit and all ancestor bits.
7
+ *
8
+ * isNode(x, N.Foo) compiles to: x.nodeType & Foo (one bitwise AND)
9
+ */
10
+
11
+ // ── Leaf bits (one bit per concrete type) ──────────────────────────
12
+ // These are types that are checked via isNode AND are concrete (not abstract).
13
+ // Sorted roughly by hierarchy grouping.
14
+
15
+ export enum N {
16
+ // Selector subtypes
17
+ BasicSelector = 1 << 0,
18
+ Ampersand = 1 << 1,
19
+ PseudoSelector = 1 << 2,
20
+ CompoundSelector = 1 << 3,
21
+ ComplexSelector = 1 << 4,
22
+ SelectorList = 1 << 5,
23
+ Combinator = 1 << 6,
24
+
25
+ // Value types
26
+ Any = 1 << 7,
27
+ Color = 1 << 8,
28
+ Dimension = 1 << 9,
29
+ Quoted = 1 << 10,
30
+ Expression = 1 << 11,
31
+ Operation = 1 << 12,
32
+ Paren = 1 << 13,
33
+ Range = 1 << 14,
34
+ List = 1 << 15,
35
+ Sequence = 1 << 16,
36
+ Nil = 1 << 17,
37
+
38
+ // Callable types
39
+ Call = 1 << 18,
40
+ Func = 1 << 19,
41
+ Mixin = 1 << 20,
42
+
43
+ // Declaration types
44
+ Declaration = 1 << 21,
45
+ VarDeclaration = 1 << 22,
46
+
47
+ // Container types
48
+ Rules = 1 << 23,
49
+ Collection = 1 << 24,
50
+ Ruleset = 1 << 25,
51
+ AtRule = 1 << 26,
52
+
53
+ // Other types
54
+ Reference = 1 << 27,
55
+ Comment = 1 << 28,
56
+ JsFunction = 1 << 29,
57
+ JsObject = 1 << 30,
58
+ // Note: 1 << 31 is negative in JS (sign bit), so we use it carefully
59
+ JsArray = 1 << 31,
60
+
61
+ // ── Abstract / parent masks ──────────────────────────────────────
62
+ // These combine child bits so isNode(x, N.Selector) matches any selector.
63
+
64
+ SimpleSelector = BasicSelector | Ampersand | PseudoSelector,
65
+ Selector = SimpleSelector | CompoundSelector | ComplexSelector | SelectorList | Combinator
66
+ }
67
+
68
+ /**
69
+ * Map from type name string → bitmask.
70
+ * Used by defineType to look up the mask for a given type name
71
+ * when walking the prototype chain.
72
+ */
73
+ /**
74
+ * Map from type name string → bitmask.
75
+ * Used by defineType to look up the bit for a given type name
76
+ * when walking the prototype chain.
77
+ *
78
+ * IMPORTANT: Abstract parent types (Selector, SimpleSelector) map to 0 here.
79
+ * Their combined masks (N.Selector, N.SimpleSelector) are only used by
80
+ * isNode callers, NOT by defineType. Each concrete child already has its own
81
+ * bit, so when defineType walks the chain, the child's bit is sufficient.
82
+ */
83
+ export const nodeTypeBits: Record<string, number> = {
84
+ // Concrete leaf types — each gets its own bit
85
+ BasicSelector: N.BasicSelector,
86
+ Ampersand: N.Ampersand,
87
+ PseudoSelector: N.PseudoSelector,
88
+ CompoundSelector: N.CompoundSelector,
89
+ ComplexSelector: N.ComplexSelector,
90
+ SelectorList: N.SelectorList,
91
+ Combinator: N.Combinator,
92
+ Any: N.Any,
93
+ Color: N.Color,
94
+ Dimension: N.Dimension,
95
+ Quoted: N.Quoted,
96
+ Expression: N.Expression,
97
+ Operation: N.Operation,
98
+ Paren: N.Paren,
99
+ Range: N.Range,
100
+ List: N.List,
101
+ Sequence: N.Sequence,
102
+ Nil: N.Nil,
103
+ Call: N.Call,
104
+ Func: N.Func,
105
+ Mixin: N.Mixin,
106
+ Declaration: N.Declaration,
107
+ VarDeclaration: N.VarDeclaration,
108
+ Rules: N.Rules,
109
+ Collection: N.Collection,
110
+ Ruleset: N.Ruleset,
111
+ AtRule: N.AtRule,
112
+ Reference: N.Reference,
113
+ Comment: N.Comment,
114
+ JsFunction: N.JsFunction,
115
+ JsObject: N.JsObject,
116
+ JsArray: N.JsArray,
117
+
118
+ // Abstract parent types — 0 because children already have their own bits.
119
+ // The combined masks (N.Selector, N.SimpleSelector) are for isNode callers only.
120
+ Selector: 0,
121
+ SimpleSelector: 0
122
+ };
@@ -0,0 +1,118 @@
1
+ /**
2
+ * This file is the entry point for the Node class.
3
+ * It imports from node-base.ts, applies prototype patches,
4
+ * and re-exports everything.
5
+ *
6
+ * This ensures that ANY import of Node gets the patched version,
7
+ * regardless of whether it goes through tree/index.ts or not.
8
+ */
9
+
10
+ // First, import everything from node-base (the pure Node class)
11
+ export * from './node-base.js';
12
+ import { Node } from './node-base.js';
13
+
14
+ // Import dependencies needed for patching (these import from node-base, not node)
15
+ import { Nil } from './nil.js';
16
+ import { Any } from './any.js';
17
+ import { TreeContext } from '../context.js';
18
+ import { type Operator } from './util/calculate.js';
19
+
20
+ const LEGACY_DATA_INTERNAL = new Set([
21
+ 'parent', 'index', 'frames', 'pre', 'post', 'state', 'nodeType',
22
+ 'isSelector', 'keySetLibrary', 'role',
23
+ 'fullRender',
24
+ 'rulesetRegistry', 'mixinRegistry', 'declarationRegistry', 'functionRegistry',
25
+ 'rulesIndexed', '_indexing',
26
+ 'pendingExtends',
27
+ '_valueOf', '_keySet', '_visibleKeySet', '_requiredKeySet'
28
+ ]);
29
+
30
+ function getLegacyData(this: Node) {
31
+ const childKeys = (this.constructor as typeof Node).childKeys;
32
+
33
+ if (Array.isArray(childKeys)) {
34
+ const extraKeys = Object.keys(this).filter((key) => {
35
+ return !key.startsWith('_') && !LEGACY_DATA_INTERNAL.has(key) && !childKeys.includes(key);
36
+ });
37
+
38
+ if (childKeys.length === 1 && extraKeys.length === 0) {
39
+ return (this as any)[childKeys[0]!];
40
+ }
41
+
42
+ const out: Record<string, unknown> = {};
43
+ for (const key of childKeys) {
44
+ const value = (this as any)[key];
45
+ if (value !== undefined) {
46
+ out[key] = value;
47
+ }
48
+ }
49
+ for (const key of extraKeys) {
50
+ const value = (this as any)[key];
51
+ if (value !== undefined) {
52
+ out[key] = value;
53
+ }
54
+ }
55
+ return Object.keys(out).length > 0 ? out : undefined;
56
+ }
57
+
58
+ const directValue = (this as any).value;
59
+ if (directValue !== undefined) {
60
+ return directValue;
61
+ }
62
+
63
+ const out: Record<string, unknown> = {};
64
+ for (const key of Object.keys(this)) {
65
+ if (key.startsWith('_') || LEGACY_DATA_INTERNAL.has(key)) {
66
+ continue;
67
+ }
68
+ const value = (this as any)[key];
69
+ if (value !== undefined) {
70
+ out[key] = value;
71
+ }
72
+ }
73
+ return Object.keys(out).length > 0 ? out : undefined;
74
+ }
75
+
76
+ /**
77
+ * Patch Node.prototype.nil to return a Nil instance
78
+ */
79
+ Node.prototype.nil = function() {
80
+ return new Nil();
81
+ };
82
+
83
+ /**
84
+ * Patch Node.prototype.operate for string concatenation
85
+ */
86
+ Node.prototype.operate = function(b: Node, op: Operator) {
87
+ let aVal = this.toString();
88
+ let bVal = b.toString();
89
+ if (op === '+') {
90
+ return new Any(aVal + bVal).inherit(this);
91
+ }
92
+ throw new Error(`Cannot operate on ${this.type}`);
93
+ };
94
+
95
+ /**
96
+ * Define a fallback treeContext for testing.
97
+ * Reads from _meta.treeContext (set by constructor), falls back to
98
+ * a lazily-created empty TreeContext for nodes created without one.
99
+ */
100
+ Object.defineProperty(Node.prototype, 'treeContext', {
101
+ get() {
102
+ let context = this._meta?.treeContext;
103
+ if (!context) {
104
+ context = this._treeContext;
105
+ if (!context) {
106
+ context = this._treeContext = new TreeContext();
107
+ }
108
+ }
109
+ return context;
110
+ }
111
+ });
112
+
113
+ Object.defineProperty(Node.prototype, 'data', {
114
+ get: getLegacyData,
115
+ set(value) {
116
+ this.setData(value);
117
+ }
118
+ });
@@ -0,0 +1,54 @@
1
+ import {
2
+ type OptionalLocation,
3
+ type NodeOptions,
4
+ type TreeContext,
5
+ defineType,
6
+ type Node
7
+ } from './node.js';
8
+ import { Dimension } from './dimension.js';
9
+ import { Color } from './color.js';
10
+ import { type Context } from '../context.js';
11
+ import { type Operator } from './util/calculate.js';
12
+ import { isPlainObject } from './util/collections.js';
13
+
14
+ /**
15
+ * A number. Named `Num` to avoid conflict with the built-in `Number` class.
16
+ */
17
+ export interface Num {
18
+ type: 'Num';
19
+ shortType: 'num';
20
+ }
21
+ export class Num extends Dimension {
22
+ // Numbers are static and don't need evaluation
23
+
24
+ constructor(value: number | { number: number }, options?: NodeOptions, location?: OptionalLocation, treeContext?: TreeContext) {
25
+ super(isPlainObject(value) ? value as { number: number } : { number: value as number }, options, location, treeContext);
26
+ }
27
+
28
+ // Method overloads for better type safety
29
+ override operate(b: Num, op: Operator, context?: Context): Num | Dimension;
30
+ override operate(b: Dimension, op: Operator, context?: Context): Dimension;
31
+ override operate(b: Color, op: Operator, context?: Context): Color;
32
+ override operate(b: Node, op: Operator, context?: Context): Dimension | Color;
33
+ override operate(b: Node, op: Operator, context?: Context): Dimension | Color {
34
+ // Call super.operate() to get the result
35
+ const result = super.operate(b, op, context);
36
+
37
+ // If the result is a Dimension and has an empty unit, convert it to a Num
38
+ if (result instanceof Dimension && !result.unit) {
39
+ return new Num(result.number).inherit(this);
40
+ }
41
+
42
+ // Otherwise, pass through the result as-is
43
+ return result;
44
+ }
45
+ }
46
+
47
+ defineType(Num, 'Num');
48
+
49
+ export const num = (
50
+ value: number,
51
+ options?: NodeOptions,
52
+ location?: OptionalLocation,
53
+ treeContext?: TreeContext
54
+ ) => new Num(value, options, location, treeContext);
@@ -0,0 +1,187 @@
1
+ import { Node, defineType, F_VISIBLE, F_NON_STATIC, type NodeOptions, type OptionalLocation, type TreeContext } from './node.js';
2
+ import type { Context } from '../context.js';
3
+ import type { Operator } from './util/calculate.js';
4
+ import { type MaybePromise, isThenable } from '@jesscss/awaitable-pipe';
5
+ import { getPrintOptions, type PrintOptions } from './util/print.js';
6
+ import { isNode } from './util/is-node.js';
7
+ import { N } from './node-type.js';
8
+ import { Call } from './call.js';
9
+ import { list } from './list.js';
10
+ import {
11
+ mergeDependencies,
12
+ setDependency,
13
+ setEvaluated
14
+ } from './util/field-helpers.js';
15
+
16
+ export type { Operator };
17
+ /** Operation is always a tuple */
18
+ export type OperationValue = [
19
+ left: Node,
20
+ op: Operator,
21
+ right: Node
22
+ ];
23
+
24
+ export type OperationChildData = { left: Node; operator: Operator; right: Node };
25
+
26
+ export interface Operation {
27
+ type: 'Operation';
28
+ shortType: 'op';
29
+ }
30
+ /**
31
+ * A math operation OR a value with a slash. CSS is ambiguous
32
+ * in syntax about which is which, so we just classify `value / value`
33
+ * as an operation.
34
+ */
35
+ export class Operation extends Node<OperationValue, NodeOptions, OperationChildData> {
36
+ static override childKeys = ['left', 'right'] as const;
37
+
38
+ left!: Node;
39
+ private operator!: Operator;
40
+ right!: Node;
41
+
42
+ override clone(deep?: boolean): this {
43
+ const options = this._meta?.options;
44
+ const value: OperationValue = [
45
+ deep ? this.left.clone(deep) : this.left,
46
+ this.operator,
47
+ deep ? this.right.clone(deep) : this.right
48
+ ];
49
+ const newNode: this = Reflect.construct(this.constructor, [
50
+ value,
51
+ options ? { ...options } : undefined,
52
+ this.location,
53
+ this.treeContext
54
+ ]);
55
+ newNode.inherit(this);
56
+ return newNode;
57
+ }
58
+
59
+ constructor(value: OperationValue, options?: NodeOptions, location?: OptionalLocation, treeContext?: TreeContext) {
60
+ super(value, options, location, treeContext);
61
+ this.left = value[0];
62
+ this.operator = value[1];
63
+ this.right = value[2];
64
+ if (this.left instanceof Node) {
65
+ this.adopt(this.left);
66
+ }
67
+ if (this.right instanceof Node) {
68
+ this.adopt(this.right);
69
+ }
70
+ // Operations are always non-static, but can inherit may_async from children
71
+ this.addFlags(F_VISIBLE, F_NON_STATIC);
72
+ }
73
+
74
+ override toTrimmedString(options?: PrintOptions): string {
75
+ options = getPrintOptions(options);
76
+ const w = options.writer!;
77
+ const mark = w.mark();
78
+ const context = options.context;
79
+ const left = this.get('left', context);
80
+ const op = this.operator;
81
+ const right = this.get('right', context);
82
+ let leftStr = w.capture(() => left.toString(options));
83
+ let rightStr = w.capture(() => right.toString(options));
84
+ w.add(leftStr.trimEnd(), left);
85
+ w.add(` ${op} `, this);
86
+ w.add(rightStr.trimStart(), right);
87
+ return w.getSince(mark);
88
+ }
89
+
90
+ override evalNode(context: Context): MaybePromise<Node> {
91
+ let n = this;
92
+ const left = n.get('left', context);
93
+ const op = n.operator;
94
+ const right = n.get('right', context);
95
+ const maybeLeft = left.eval(context);
96
+ const applyMergedDependency = (result: Node, l: Node, r: Node): Node => {
97
+ const dependency = mergeDependencies([l, r], context);
98
+ if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
99
+ setDependency(result, {
100
+ dependsOn: new Set(dependency.dependsOn),
101
+ sourceExpr: this
102
+ }, context);
103
+ }
104
+ return result;
105
+ };
106
+ const finalize = (l: Node, r: Node): MaybePromise<Node> => {
107
+ if (context.shouldOperate(op, l, r)) {
108
+ if (isNode(l, N.Operation) || isNode(r, N.Operation)) {
109
+ // Preserve composite expressions such as `10px / 2 * 2` when a nested
110
+ // operation intentionally remains unevaluated under current math mode.
111
+ const outOperation = n.clone(false);
112
+ outOperation.adopt(l, context);
113
+ outOperation.adopt(r, context);
114
+ Reflect.set(outOperation, 'left', l);
115
+ Reflect.set(outOperation, 'right', r);
116
+ return applyMergedDependency(outOperation, l, r);
117
+ }
118
+ const unitMode = context?.opts?.unitMode ?? 'preserve';
119
+ const isPreserveMode = unitMode === 'preserve';
120
+
121
+ // In preserve mode, catch unit errors and return calc() call
122
+ if (isPreserveMode && isNode(l, N.Dimension) && isNode(r, N.Dimension)) {
123
+ try {
124
+ let out = l.operate(r, op, context);
125
+ out.pre = left.pre;
126
+ out.post = right.post;
127
+ return out;
128
+ } catch (error) {
129
+ // If it's a unit error (TypeError), return calc(operation)
130
+ if (error instanceof TypeError) {
131
+ // Preserve canonical operation state by materializing an isolated wrapper when needed.
132
+ const calcOperation = n.clone(false);
133
+ calcOperation.adopt(l, context);
134
+ calcOperation.adopt(r, context);
135
+ Reflect.set(calcOperation, 'left', l);
136
+ Reflect.set(calcOperation, 'right', r);
137
+ setEvaluated(calcOperation, true, context);
138
+ setEvaluated(l, true, context);
139
+ setEvaluated(r, true, context);
140
+ const calcCall = new Call({ name: 'calc', args: list([calcOperation]) });
141
+ calcCall.pre = left.pre;
142
+ calcCall.post = right.post;
143
+ return applyMergedDependency(calcCall, l, r);
144
+ }
145
+ // Re-throw non-unit errors
146
+ throw error;
147
+ }
148
+ }
149
+
150
+ let out: Node;
151
+ try {
152
+ out = l.operate(r, op, context);
153
+ } catch (error) {
154
+ throw error;
155
+ }
156
+ out.pre = left.pre;
157
+ out.post = right.post;
158
+ return applyMergedDependency(out, l, r);
159
+ }
160
+ if (l === n.left && r === n.right) {
161
+ return applyMergedDependency(n, l, r);
162
+ }
163
+ const outOperation = n.clone(false);
164
+ outOperation.adopt(l, context);
165
+ outOperation.adopt(r, context);
166
+ Reflect.set(outOperation, 'left', l);
167
+ Reflect.set(outOperation, 'right', r);
168
+ return applyMergedDependency(outOperation, l, r);
169
+ };
170
+ const handleLeft = (l: Node): MaybePromise<Node> => {
171
+ const maybeRight = right.eval(context);
172
+ if (isThenable(maybeRight)) {
173
+ return (maybeRight as Promise<Node>).then((r) => {
174
+ return finalize(l, r);
175
+ });
176
+ }
177
+ const r = maybeRight as Node;
178
+ return finalize(l, r);
179
+ };
180
+ if (isThenable(maybeLeft)) {
181
+ return (maybeLeft as Promise<Node>).then(handleLeft);
182
+ }
183
+ return handleLeft(maybeLeft as Node);
184
+ }
185
+ }
186
+
187
+ export const op = defineType(Operation, 'Operation', 'op');
@@ -0,0 +1,132 @@
1
+ import { type Context } from '../context.js';
2
+ import { Bool } from './bool.js';
3
+ import { Expression } from './expression.js';
4
+ import { Operation } from './operation.js';
5
+ import { Node, defineType, F_NON_STATIC, type OptionalLocation, type TreeContext } from './node.js';
6
+ import { Dimension } from './dimension.js';
7
+ import { type MaybePromise, isThenable } from '@jesscss/awaitable-pipe';
8
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
9
+
10
+ export type ParenOptions = {
11
+ escaped?: boolean;
12
+ delimiter?: 'paren' | 'square';
13
+ };
14
+
15
+ export type ParenChildData = { value: Node | undefined };
16
+
17
+ const isOpOrExpression = (node: Node): node is Operation | Expression => {
18
+ return node instanceof Operation || node instanceof Expression;
19
+ };
20
+
21
+ /**
22
+ * An expression in parenthesis
23
+ */
24
+ export interface Paren {
25
+ type: 'Paren';
26
+ shortType: 'paren';
27
+ eval(context: Context): MaybePromise<Node>;
28
+ }
29
+
30
+ export class Paren extends Node<Node | undefined, ParenOptions, ParenChildData> {
31
+ static override childKeys = ['value'] as const;
32
+
33
+ value: Node | undefined;
34
+
35
+ constructor(value?: Node, options?: ParenOptions, location?: OptionalLocation, treeContext?: TreeContext) {
36
+ super(value, options, location, treeContext);
37
+ this.value = value;
38
+ if (value instanceof Node) {
39
+ this.adopt(value);
40
+ }
41
+ if (options?.escaped) {
42
+ this.addFlag(F_NON_STATIC);
43
+ }
44
+ }
45
+
46
+ private _isEscaped(_context?: Context): boolean {
47
+ return Boolean(this.options?.escaped);
48
+ }
49
+
50
+ private _unwrapValue(value: Node, context?: Context): Node {
51
+ let current = value;
52
+ while (current instanceof Paren) {
53
+ const next = current.get('value', context);
54
+ if (!next) {
55
+ break;
56
+ }
57
+ current = next;
58
+ }
59
+ return current;
60
+ }
61
+
62
+ override toTrimmedString(options?: PrintOptions): string {
63
+ options = getPrintOptions(options);
64
+ const w = options.writer!;
65
+ const mark = w.mark();
66
+ const parenOptions = this.options;
67
+ const escapeChar = parenOptions?.escaped ? '~' : '';
68
+ const delimiter = parenOptions?.delimiter ?? 'paren';
69
+ const open = delimiter === 'square' ? '[' : '(';
70
+ const close = delimiter === 'square' ? ']' : ')';
71
+ if (escapeChar) {
72
+ w.add(escapeChar, this);
73
+ }
74
+ w.add(open);
75
+ let value = this.get('value', options.context);
76
+ if (value) {
77
+ if (value instanceof Node) {
78
+ let out = w.capture(() => value.toString(options));
79
+ w.add(out.replace(/^[ \t\r\f]*|[ \t\r\f]*$/g, ''), value);
80
+ } else {
81
+ w.add(String(value), this);
82
+ }
83
+ }
84
+ w.add(close);
85
+ return w.getSince(mark);
86
+ }
87
+
88
+ override evalNode(context: Context): MaybePromise<Node> {
89
+ let value = this.get('value', context);
90
+ if (value) {
91
+ let isOp = isOpOrExpression(value);
92
+ if (isOp) {
93
+ context.parenFrames.push(true);
94
+ }
95
+ const maybeEvald = value.eval(context);
96
+ const after = (v: Node): Node => {
97
+ value = v;
98
+ if (isOp) {
99
+ context.parenFrames.pop();
100
+ }
101
+ if (this._isEscaped(context) && value instanceof Node) {
102
+ return value;
103
+ }
104
+ const delimiter = this.options?.delimiter ?? 'paren';
105
+ if (delimiter === 'paren') {
106
+ value = this._unwrapValue(value, context);
107
+ if (value instanceof Bool || value instanceof Dimension) {
108
+ return value;
109
+ }
110
+ if (isOp && !isOpOrExpression(value)) {
111
+ return value;
112
+ }
113
+ }
114
+ const node = this.clone();
115
+ const previousValue = node.value;
116
+ node.value = value;
117
+ if (previousValue instanceof Node && previousValue !== value) {
118
+ previousValue.parent = undefined;
119
+ }
120
+ node.adopt(value);
121
+ return node;
122
+ };
123
+ if (isThenable(maybeEvald)) {
124
+ return (maybeEvald as Promise<Node>).then(after);
125
+ }
126
+ return after(maybeEvald as Node);
127
+ }
128
+ return this;
129
+ }
130
+ }
131
+
132
+ export const paren = defineType(Paren, 'Paren');
@@ -0,0 +1,47 @@
1
+ import type { Context } from '../context.js';
2
+ import type { PrintOptions } from '..';
3
+ import { getPrintOptions } from './util/print.js';
4
+ import { defineType } from './node.js';
5
+ import { Sequence } from './sequence.js';
6
+
7
+ /**
8
+ * Used by `@media`, `@supports`, and `@container`
9
+ *
10
+ * This just helps identify conditions if we need to
11
+ * merge them later.
12
+ *
13
+ * @todo - add more structure?
14
+ */
15
+ export interface QueryCondition {
16
+ type: 'QueryCondition';
17
+ shortType: 'query';
18
+ }
19
+
20
+ export class QueryCondition extends Sequence {
21
+ override toTrimmedString(options?: PrintOptions): string {
22
+ options = getPrintOptions(options);
23
+ const w = options.writer!;
24
+ const mark = w.mark();
25
+ let value = this.get('value', options.context);
26
+ let length = value.length;
27
+
28
+ if (length === 0) {
29
+ return '';
30
+ }
31
+
32
+ // Print first node as-is
33
+ let node = value[0]!;
34
+ let out = w.capture(() => node.toString(options));
35
+ w.add(out.replace(/^\s*|\s*$/g, ''), node);
36
+
37
+ // Space out sub-nodes
38
+ for (let i = 1; i < length; i++) {
39
+ let node = value[i]!;
40
+ w.add(' ');
41
+ let out = w.capture(() => node.toString(options));
42
+ w.add(out.replace(/^\s*|\s*$/g, ''), node);
43
+ }
44
+ return w.getSince(mark);
45
+ }
46
+ }
47
+ export const query = defineType(QueryCondition, 'QueryCondition', 'query');