@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,35 @@
1
+ import { type Context } from '../context.js';
2
+ import { Node, defineType } from './node.js';
3
+ import { Bool } from './bool.js';
4
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
5
+
6
+ export interface DefaultGuard extends Node<string> {
7
+ type: 'DefaultGuard';
8
+ shortType: 'defaultguard';
9
+ eval(context: Context): Bool;
10
+ }
11
+
12
+ export class DefaultGuard extends Node<string> {
13
+ static override childKeys = null as null;
14
+
15
+ readonly value!: string;
16
+
17
+ constructor(value: string, options?: any, location?: any, treeContext?: any) {
18
+ super(value, options, location, treeContext);
19
+ this.value = value;
20
+ }
21
+
22
+ override toTrimmedString(options?: PrintOptions) {
23
+ options = getPrintOptions(options);
24
+ const w = options.writer!;
25
+ const mark = w.mark();
26
+ w.add('default', this);
27
+ return w.getSince(mark);
28
+ }
29
+
30
+ override evalNode(context: Context): Bool {
31
+ return new Bool(Boolean(context.isDefault));
32
+ }
33
+ }
34
+
35
+ export const defaultguard = defineType(DefaultGuard, 'DefaultGuard');
@@ -0,0 +1,392 @@
1
+ import type { Class } from 'type-fest';
2
+ import { type Context } from '../context.js';
3
+ import { Color, ColorFormat } from './color.js';
4
+ import {
5
+ Node,
6
+ F_STATIC,
7
+ type OptionalLocation,
8
+ type NodeOptions,
9
+ type TreeContext,
10
+ defineType
11
+ } from './node.js';
12
+ import { type Operator, calculate } from './util/calculate.js';
13
+ import { logger } from '../logger.js';
14
+ import round from 'lodash-es/round.js';
15
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
16
+
17
+ // import type { Context } from '../context.js'
18
+ // import type { OutputCollector } from '../output'
19
+
20
+ export type DimensionValue = {
21
+ number: number;
22
+ unit?: string;
23
+ };
24
+
25
+ const { isArray } = Array;
26
+
27
+ type LengthUnit = 'm' | 'cm' | 'mm' | 'in' | 'px' | 'pt' | 'pc';
28
+ type DurationUnit = 's' | 'ms';
29
+ type AngleUnit = 'rad' | 'deg' | 'grad' | 'turn';
30
+ type ConversionUnit = LengthUnit | DurationUnit | AngleUnit;
31
+ type UnitMapEntries = Array<[ConversionUnit, ConversionGroup]>;
32
+
33
+ export interface Dimension extends Node<DimensionValue> {
34
+ type: 'Dimension' | 'Num';
35
+ shortType: 'dimension' | 'num';
36
+ eval(context: Context): Dimension;
37
+ }
38
+
39
+ /**
40
+ * A number or dimension
41
+ */
42
+ export class Dimension extends Node<DimensionValue> {
43
+ static override childKeys = null as null;
44
+
45
+ readonly number!: number;
46
+ readonly unit: string | undefined;
47
+
48
+ constructor(
49
+ value: DimensionValue,
50
+ options?: NodeOptions,
51
+ location?: OptionalLocation,
52
+ treeContext?: TreeContext
53
+ ) {
54
+ super(value, options, location, treeContext);
55
+ this.number = value.number;
56
+ this.unit = value.unit;
57
+ this.addFlag(F_STATIC);
58
+ }
59
+
60
+ /** Compatibility — synthesizes the legacy .data shape from instance fields */
61
+
62
+ private _unitToGroup: Map<string, ConversionGroup> | undefined;
63
+ get unitToGroup() {
64
+ let unitToGroup = this._unitToGroup;
65
+ if (!unitToGroup) {
66
+ const lengthEntries: UnitMapEntries = ['m', 'cm', 'mm', 'in', 'px', 'pt', 'pc'].map(unit => [unit as LengthUnit, ConversionGroup.Length]);
67
+ const durationEntries: UnitMapEntries = ['s', 'ms'].map(unit => [unit as DurationUnit, ConversionGroup.Duration]);
68
+ const angleEntries: UnitMapEntries = ['rad', 'deg', 'grad', 'turn'].map(unit => [unit as AngleUnit, ConversionGroup.Angle]);
69
+ const entries = lengthEntries.concat(durationEntries).concat(angleEntries);
70
+ this._unitToGroup = unitToGroup = new Map(entries);
71
+ }
72
+ return unitToGroup;
73
+ }
74
+
75
+ override clone(deep?: boolean): this {
76
+ const options = this._meta?.options;
77
+ const newNode = new (this.constructor as Class<this>)(
78
+ { number: this.number, unit: this.unit },
79
+ options ? { ...options } : undefined,
80
+ this.location,
81
+ this.treeContext
82
+ );
83
+ newNode.inherit(this);
84
+ return newNode;
85
+ }
86
+
87
+ override valueOf() {
88
+ const { number, unit } = this;
89
+ return unit ? `${number}${unit}` : number;
90
+ }
91
+
92
+ override operate(b: Node, op: Operator, context?: Context | undefined): Dimension | Color {
93
+ if (!(b instanceof Dimension || b instanceof Color)) {
94
+ throw new TypeError(`Cannot operate on ${b.type}`);
95
+ }
96
+ let unitToGroup = this.unitToGroup;
97
+ if (b instanceof Color) {
98
+ let { number, unit } = this;
99
+ const unitMode = context?.opts?.unitMode ?? 'loose';
100
+ const isStrictLikeMode = unitMode === 'strict' || unitMode === 'preserve';
101
+ if (unit && isStrictLikeMode) {
102
+ throw new TypeError(`Cannot convert "${this}" to a color`);
103
+ }
104
+ let thisColor = new Color(
105
+ { rgb: [number, number, number] },
106
+ { format: b.options?.format ?? ColorFormat.RGB }
107
+ ).inherit(this);
108
+ return thisColor.operate(b, op, context).inherit(this);
109
+ }
110
+ let { number: aVal, unit: aUnit } = this;
111
+ let { number: bVal, unit: bUnit } = b;
112
+ let unitMode = context?.opts.unitMode ?? 'loose';
113
+ let isStrictMode = unitMode === 'strict';
114
+ let isPreserveMode = unitMode === 'preserve';
115
+
116
+ if (bVal === 0 && op === '/') {
117
+ throw new TypeError('Cannot divide by zero');
118
+ }
119
+ if (!aUnit || !bUnit) {
120
+ let outUnit = aUnit ?? bUnit;
121
+ /** One or both doesn't have a unit, so just calculate the number */
122
+ if ((isStrictMode || isPreserveMode) && bUnit && op === '/') {
123
+ if (isPreserveMode) {
124
+ return new Dimension({
125
+ number: calculate(aVal, op, bVal),
126
+ unit: `1/${bUnit}`
127
+ }).inherit(this);
128
+ }
129
+ throw new TypeError('Cannot divide a number by a unit');
130
+ }
131
+ return new Dimension({ number: calculate(aVal, op, bVal), unit: outUnit }).inherit(this);
132
+ }
133
+
134
+ if (aUnit === bUnit) {
135
+ /** Both units match, so the now we have some choices */
136
+ if (op === '+' || op === '-') {
137
+ return new Dimension({ number: calculate(aVal, op, bVal), unit: aUnit }).inherit(this);
138
+ }
139
+ if (isStrictMode || isPreserveMode) {
140
+ if (op === '*') {
141
+ if (isPreserveMode) {
142
+ return new Dimension({
143
+ number: calculate(aVal, op, bVal),
144
+ unit: `${aUnit}*${bUnit}`
145
+ }).inherit(this);
146
+ }
147
+ throw new TypeError('Cannot multiply two units together');
148
+ } else {
149
+ /** Cancel units during division */
150
+ return new Dimension({ number: calculate(aVal, op, bVal) }).inherit(this);
151
+ }
152
+ } else {
153
+ return new Dimension({ number: calculate(aVal, op, bVal), unit: aUnit }).inherit(this);
154
+ }
155
+ }
156
+ const aGroup = unitToGroup.get(aUnit);
157
+ const bGroup = unitToGroup.get(bUnit);
158
+
159
+ if (aGroup === undefined || bGroup === undefined || aGroup !== bGroup) {
160
+ if (isStrictMode || isPreserveMode) {
161
+ if (isPreserveMode) {
162
+ return new Dimension({
163
+ number: calculate(aVal, op, bVal),
164
+ unit: (
165
+ op === '+' || op === '-'
166
+ ? `${aUnit}±${bUnit}`
167
+ : `${aUnit}${op}${bUnit}`
168
+ )
169
+ }).inherit(this);
170
+ }
171
+ /** Units don't match, and can't be converted */
172
+ throw new TypeError('Incompatible units. Change the units or use the unit function');
173
+ }
174
+ /** Just coerce to the left-hand unit */
175
+ return new Dimension({ number: calculate(aVal, op, bVal), unit: aUnit }).inherit(this);
176
+ }
177
+
178
+ const group = conversions[bGroup];
179
+ // @ts-expect-error - set up proper indexing later
180
+ let atomicUnit = group[aUnit] as number;
181
+ // @ts-expect-error - set up proper indexing later
182
+ let targetUnit = group[bUnit] as number;
183
+
184
+ if (isPreserveMode && (op === '*' || op === '/')) {
185
+ return new Dimension({
186
+ number: calculate(aVal, op, bVal),
187
+ unit: `${aUnit}${op}${bUnit}`
188
+ }).inherit(this);
189
+ }
190
+
191
+ bVal = bVal / (atomicUnit / targetUnit);
192
+ return new Dimension({ number: calculate(aVal, op, bVal), unit: aUnit }).inherit(this);
193
+ }
194
+
195
+ override compare(b: Node, context?: Context): 0 | 1 | -1 | undefined {
196
+ if (b.type === 'Any') {
197
+ const text = String(('value' in b ? b.value : '') ?? '').trim();
198
+ if (!/^[-+]?(?:\d+\.?\d*|\.\d+)$/.test(text)) {
199
+ return undefined;
200
+ }
201
+ return this.number === Number(text) ? 0 : undefined;
202
+ }
203
+ if (b.type === 'Quoted') {
204
+ return undefined;
205
+ }
206
+ if (b.type === 'Bool') {
207
+ return undefined;
208
+ }
209
+ if (!(b instanceof Dimension || b instanceof Color)) {
210
+ return undefined;
211
+ }
212
+ let unitToGroup = this.unitToGroup;
213
+ let unitMode = context?.opts?.unitMode ?? 'loose';
214
+ let isStrictMode = unitMode === 'strict';
215
+ let isPreserveMode = unitMode === 'preserve';
216
+ let { number: aVal, unit: aUnit } = this;
217
+
218
+ /** Normalize percentages to a number for numerical comparison */
219
+ if (aUnit === '%') {
220
+ aVal = aVal / 100;
221
+ aUnit = undefined;
222
+ }
223
+ if (b instanceof Color) {
224
+ if (aUnit) {
225
+ let msg = `Cannot convert "${this}" to a color`;
226
+ if (isStrictMode) {
227
+ throw new TypeError(msg);
228
+ } else {
229
+ logger.warn(msg);
230
+ }
231
+ return super.compare(b, context);
232
+ }
233
+ let thisColor = new Color({ rgb: [aVal, aVal, aVal] }, { format: ColorFormat.RGB }).inherit(this);
234
+ return thisColor.compare(b);
235
+ }
236
+ let { number: bVal, unit: bUnit } = b;
237
+ if (bUnit === '%') {
238
+ bVal = bVal / 100;
239
+ bUnit = undefined;
240
+ }
241
+
242
+ if (!aUnit && !bUnit) {
243
+ return Node.numericCompare(aVal, bVal);
244
+ }
245
+ if (!aUnit || !bUnit) {
246
+ // Less guards allow unitless numbers to compare directly with dimensions.
247
+ return Node.numericCompare(aVal, bVal);
248
+ }
249
+ if (aUnit && bUnit) {
250
+ /** These are the only truly comparable dimensions */
251
+ if (!aUnit) {
252
+ return Node.numericCompare(aVal, bVal);
253
+ }
254
+ const aGroup = unitToGroup.get(aUnit);
255
+ const bGroup = unitToGroup.get(bUnit!);
256
+
257
+ if (aGroup === undefined || bGroup === undefined || aGroup !== bGroup) {
258
+ if (isStrictMode || isPreserveMode) {
259
+ /** Units don't match, and can't be converted */
260
+ throw new TypeError('Incompatible units. Change the units or use the unit function');
261
+ }
262
+ return undefined;
263
+ }
264
+ const group = conversions[bGroup];
265
+ // @ts-expect-error - set up proper indexing later
266
+ let atomicUnit = group[aUnit] as number;
267
+ // @ts-expect-error - set up proper indexing later
268
+ let targetUnit = group[bUnit] as number;
269
+
270
+ bVal = bVal / (atomicUnit / targetUnit);
271
+
272
+ return Node.numericCompare(aVal, bVal);
273
+ }
274
+ return super.compare(b, context);
275
+ }
276
+
277
+ override toTrimmedString(options?: PrintOptions) {
278
+ options = getPrintOptions(options);
279
+ const w = options.writer!;
280
+ const mark = w.mark();
281
+ let { number, unit = '' } = this;
282
+
283
+ // Check if unit is compound (contains '/', '*', or '±')
284
+ const isCompoundUnit = unit && (unit.includes('/') || unit.includes('*') || unit.includes('±'));
285
+
286
+ if (isCompoundUnit) {
287
+ // Output as calc() for compound units
288
+ // Parse the compound unit to reconstruct a valid calc() expression
289
+ w.add('calc(', this);
290
+ const numberStr = `${round(number, 8)}`.toLowerCase();
291
+
292
+ // Parse compound unit to create calc expression
293
+ if (unit.includes('/')) {
294
+ // Division: "px/s" or "1/s" → calc(number * 1px / 1s) or calc(number / 1s)
295
+ const parts = unit.split('/');
296
+ const numerator = parts[0] || '1';
297
+ const denominator = parts[1] || '1';
298
+ if (numerator === '1') {
299
+ // Special case: "1/s" means number / unit → calc(number / 1s)
300
+ w.add(`${numberStr} / 1${denominator}`);
301
+ } else {
302
+ // General case: "px/s" → calc(number * 1px / 1s)
303
+ w.add(`${numberStr} * 1${numerator} / 1${denominator}`);
304
+ }
305
+ } else if (unit.includes('*')) {
306
+ // Multiplication: "px*em" → calc(number * 1px * 1em)
307
+ // Example: 10px * 2em → 20 with unit "px*em" → calc(20 * 1px * 1em)
308
+ const parts = unit.split('*');
309
+ const units = parts.map(u => `1${u}`).join(' * ');
310
+ w.add(`${numberStr} * ${units}`);
311
+ } else if (unit.includes('±')) {
312
+ // Addition/subtraction: "px±em" → calc(1px ± 1em)
313
+ // Note: We don't have the original values, so this is approximate
314
+ // The actual operation would be calc(aVal * 1px ± bVal * 1em)
315
+ const parts = unit.split('±');
316
+ const unit1 = parts[0] || '';
317
+ const unit2 = parts[1] || '';
318
+ // Output as calc(1unit1 + 1unit2) - approximation since we don't have original values
319
+ w.add(`1${unit1} + 1${unit2}`);
320
+ } else {
321
+ // Fallback - shouldn't happen
322
+ w.add(`${numberStr} * 1${unit}`);
323
+ }
324
+ w.add(')');
325
+ } else {
326
+ // Normal unit output
327
+ const numberStr = `${round(number, 8)}`.toLowerCase();
328
+ w.add(numberStr, this);
329
+ if (unit) {
330
+ w.add(unit);
331
+ }
332
+ }
333
+ return w.getSince(mark);
334
+ }
335
+
336
+ /** @todo - move to visitors */
337
+ // toCSS(context: Context, out: OutputCollector) {
338
+ // out.add(this.toString(), this.location)
339
+ // }
340
+
341
+ // toModule(context: Context, out: OutputCollector) {
342
+ // const pre = context.pre
343
+ // out.add('$J.num({\n' +
344
+ // ` ${pre}value: ${this.data},\n` +
345
+ // ` ${pre}unit: "${this.unit ?? ''}"\n` +
346
+ // `${pre}})`
347
+ // , this.location)
348
+ // }
349
+ }
350
+
351
+ const enum ConversionGroup {
352
+ Length = 0,
353
+ Duration = 1,
354
+ Angle = 2
355
+ }
356
+
357
+ const conversions = {
358
+ [ConversionGroup.Length]: {
359
+ m: 1,
360
+ cm: 0.01,
361
+ mm: 0.001,
362
+ in: 0.0254,
363
+ px: 0.0254 / 96,
364
+ pt: 0.0254 / 72,
365
+ pc: 0.0254 / 72 * 12
366
+ } satisfies Record<LengthUnit, number>,
367
+ [ConversionGroup.Duration]: {
368
+ s: 1,
369
+ ms: 0.001
370
+ } satisfies Record<DurationUnit, number>,
371
+ [ConversionGroup.Angle]: {
372
+ rad: 1 / (2 * Math.PI),
373
+ deg: 1 / 360,
374
+ grad: 1 / 400,
375
+ turn: 1
376
+ } satisfies Record<AngleUnit, number>
377
+ };
378
+
379
+ defineType(Dimension, 'Dimension');
380
+
381
+ export const dimension = (
382
+ value: DimensionValue | [number, string] | number,
383
+ options?: NodeOptions,
384
+ location?: OptionalLocation,
385
+ treeContext?: TreeContext
386
+ ) => {
387
+ if (isArray(value)) {
388
+ let [number, unit] = value;
389
+ return new Dimension({ number, unit }, options, location, treeContext);
390
+ }
391
+ return new Dimension(typeof value === 'number' ? { number: value } : value, options, location, treeContext);
392
+ };
@@ -0,0 +1,97 @@
1
+ import type { Class } from 'type-fest';
2
+ import type { Context } from '../context.js';
3
+ import { Node, F_NON_STATIC, defineType, type NodeOptions, type OptionalLocation, type TreeContext } from './node.js';
4
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
5
+ import { type MaybePromise, isThenable } from '@jesscss/awaitable-pipe';
6
+ import { getDependency, setDependency, setParent } from './util/field-helpers.js';
7
+
8
+ export type ExpressionChildData = { value: Node };
9
+
10
+ /**
11
+ * An expression is a node that returns a value.
12
+ * It can contain values, references, and operations.
13
+ *
14
+ * When parsing Less/Sass, everything containing an operation is
15
+ * considered an expression.
16
+ */
17
+ export interface Expression extends Node<Node, NodeOptions, ExpressionChildData> {
18
+ type: 'Expression';
19
+ shortType: 'expr';
20
+ eval(context: Context): MaybePromise<Node>;
21
+ }
22
+
23
+ export class Expression extends Node<Node, NodeOptions, ExpressionChildData> {
24
+ static override childKeys = ['value'] as const;
25
+
26
+ readonly value!: Node;
27
+
28
+ override clone(deep?: boolean, cloneFn?: (n: Node) => Node, ctx?: Context): this {
29
+ const value = this.get('value', ctx);
30
+ const cloneChild = cloneFn ?? ((n: Node) => n.clone(deep, cloneFn, ctx));
31
+ const clonedValue = deep ? cloneChild(value) : value;
32
+ const options = this._meta?.options;
33
+ const priorParent = !deep && ctx ? clonedValue.parent : undefined;
34
+ const newNode = new (this.constructor as Class<this>)(
35
+ clonedValue,
36
+ options ? { ...options } : undefined,
37
+ this.location,
38
+ this.treeContext
39
+ );
40
+ if (!deep && ctx) {
41
+ setParent(clonedValue, newNode, ctx);
42
+ (clonedValue as unknown as { parent?: Node }).parent = priorParent;
43
+ }
44
+ newNode.inherit(this);
45
+ return newNode;
46
+ }
47
+
48
+ constructor(value: Node, options?: NodeOptions, location?: OptionalLocation, treeContext?: TreeContext) {
49
+ super(value, options, location, treeContext);
50
+ this.value = value;
51
+ if (value instanceof Node) {
52
+ this.adopt(value);
53
+ }
54
+ this.addFlag(F_NON_STATIC);
55
+ }
56
+
57
+ override evalNode(context: Context): MaybePromise<Node> {
58
+ const value = this.get('value', context);
59
+ const out = value.eval(context);
60
+ const applyDependency = (result: Node): Node => {
61
+ const dependency = getDependency(result, context);
62
+ if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
63
+ setDependency(result, {
64
+ dependsOn: new Set(dependency.dependsOn),
65
+ sourceExpr: this
66
+ }, context);
67
+ }
68
+ return result;
69
+ };
70
+ /** @todo - Cast as selector if the context is within a selector */
71
+ if (isThenable(out)) {
72
+ return (out as Promise<Node>).then(applyDependency);
73
+ }
74
+ return applyDependency(out as Node);
75
+ }
76
+
77
+ override toTrimmedString(options?: PrintOptions): string {
78
+ options = getPrintOptions(options);
79
+ const w = options.writer!;
80
+ const mark = w.mark();
81
+ const value = this.get('value', options.context);
82
+ w.add('$', this);
83
+ w.add('(');
84
+ value.toString(options);
85
+ w.add(')');
86
+ return w.getSince(mark);
87
+ }
88
+ }
89
+
90
+ type Params = ConstructorParameters<typeof Expression>;
91
+
92
+ export const expr = defineType(Expression, 'Expression', 'expr') as (
93
+ value: Params[0],
94
+ options?: Params[1],
95
+ location?: Params[2],
96
+ treeContext?: Params[3]
97
+ ) => Expression;
@@ -0,0 +1,51 @@
1
+ import { Node, F_VISIBLE, defineType, type NodeOptions } from './node.js';
2
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
3
+ import type { Extend } from './extend.js';
4
+ import type { Context } from '../context.js';
5
+
6
+ export type ExtendListChildData = { value: Extend[] };
7
+
8
+ /**
9
+ * An extend statement list with no rules
10
+ *
11
+ * e.g.
12
+ * .a:extend(.b), .c:extend(.d);
13
+ */
14
+ export interface ExtendList extends Node<Extend[], NodeOptions, ExtendListChildData> {
15
+ type: 'ExtendList';
16
+ shortType: 'extendlist';
17
+ eval(context: Context): ExtendList;
18
+ }
19
+
20
+ export class ExtendList extends Node<Extend[], NodeOptions, ExtendListChildData> {
21
+ static override childKeys = ['value'] as const;
22
+
23
+ readonly value!: Extend[];
24
+
25
+ constructor(value: Extend[], options?: any, location?: any, treeContext?: any) {
26
+ super(value, options, location, treeContext);
27
+ this.value = value;
28
+ for (const child of value) {
29
+ if (child instanceof Node) {
30
+ this.adopt(child);
31
+ }
32
+ }
33
+ this.allowRoot = true;
34
+ this.allowRuleRoot = true;
35
+ this.removeFlag(F_VISIBLE);
36
+ }
37
+
38
+ override toTrimmedString(options?: PrintOptions): string {
39
+ options = getPrintOptions(options);
40
+ const w = options.writer!;
41
+ const mark = w.mark();
42
+ for (const child of this.get('value', options.context)) {
43
+ child.toTrimmedString(options);
44
+ }
45
+ // toTrimmedString side effect is already emitted to writer; getSince captures it. Add ';'
46
+ w.add(';');
47
+ return w.getSince(mark);
48
+ }
49
+ }
50
+
51
+ export const extendList = defineType(ExtendList, 'ExtendList');