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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/lib/index.cjs +20159 -0
  2. package/lib/index.d.cts +5993 -0
  3. package/lib/index.d.cts.map +1 -0
  4. package/lib/index.d.ts +5992 -21
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +19926 -22
  7. package/lib/index.js.map +1 -1
  8. package/package.json +15 -14
  9. package/src/__tests__/define-function-record.test.ts +58 -0
  10. package/src/__tests__/define-function-simple.test.ts +55 -0
  11. package/src/__tests__/define-function-split-sequence.test.ts +547 -0
  12. package/src/__tests__/define-function-type-parity.test.ts +9 -0
  13. package/src/__tests__/define-function.test.ts +763 -0
  14. package/src/__tests__/num-operations.test.ts +91 -0
  15. package/src/__tests__/safe-parse.test.ts +374 -0
  16. package/src/context.ts +896 -0
  17. package/src/conversions.ts +282 -0
  18. package/src/debug-log.ts +29 -0
  19. package/src/define-function.ts +1006 -0
  20. package/src/deprecation.ts +67 -0
  21. package/src/globals.d.ts +26 -0
  22. package/src/index.ts +31 -0
  23. package/src/jess-error.ts +773 -0
  24. package/src/logger/deprecation-processing.ts +109 -0
  25. package/src/logger.ts +31 -0
  26. package/src/plugin.ts +292 -0
  27. package/src/tree/LOOKUP_CHAINS.md +35 -0
  28. package/src/tree/README.md +18 -0
  29. package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
  30. package/src/tree/__tests__/ampersand.test.ts +382 -0
  31. package/src/tree/__tests__/at-rule.test.ts +2047 -0
  32. package/src/tree/__tests__/basic-render.test.ts +212 -0
  33. package/src/tree/__tests__/block.test.ts +40 -0
  34. package/src/tree/__tests__/call.test.ts +346 -0
  35. package/src/tree/__tests__/color.test.ts +537 -0
  36. package/src/tree/__tests__/condition.test.ts +186 -0
  37. package/src/tree/__tests__/control.test.ts +564 -0
  38. package/src/tree/__tests__/declaration.test.ts +253 -0
  39. package/src/tree/__tests__/dependency-graph.test.ts +177 -0
  40. package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
  41. package/src/tree/__tests__/dimension.test.ts +236 -0
  42. package/src/tree/__tests__/expression.test.ts +73 -0
  43. package/src/tree/__tests__/ext-node.test.ts +31 -0
  44. package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
  45. package/src/tree/__tests__/extend-import-style.test.ts +929 -0
  46. package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
  47. package/src/tree/__tests__/extend-list.test.ts +31 -0
  48. package/src/tree/__tests__/extend-roots.test.ts +1045 -0
  49. package/src/tree/__tests__/extend-rules.test.ts +740 -0
  50. package/src/tree/__tests__/func.test.ts +171 -0
  51. package/src/tree/__tests__/import-js.test.ts +33 -0
  52. package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
  53. package/src/tree/__tests__/import-style.test.ts +1967 -0
  54. package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
  55. package/src/tree/__tests__/interpolated.test.ts +41 -0
  56. package/src/tree/__tests__/list.test.ts +177 -0
  57. package/src/tree/__tests__/log.test.ts +83 -0
  58. package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
  59. package/src/tree/__tests__/mixin.test.ts +2171 -0
  60. package/src/tree/__tests__/negative.test.ts +45 -0
  61. package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
  62. package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
  63. package/src/tree/__tests__/node-flags.test.ts +410 -0
  64. package/src/tree/__tests__/node-graph.test.ts +598 -0
  65. package/src/tree/__tests__/node-mutation.test.ts +182 -0
  66. package/src/tree/__tests__/operation.test.ts +18 -0
  67. package/src/tree/__tests__/paren.test.ts +90 -0
  68. package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
  69. package/src/tree/__tests__/quoted.test.ts +72 -0
  70. package/src/tree/__tests__/range.test.ts +59 -0
  71. package/src/tree/__tests__/reference.test.ts +743 -0
  72. package/src/tree/__tests__/rest.test.ts +29 -0
  73. package/src/tree/__tests__/rules-raw.test.ts +14 -0
  74. package/src/tree/__tests__/rules.test.ts +1271 -0
  75. package/src/tree/__tests__/ruleset.test.ts +597 -0
  76. package/src/tree/__tests__/selector-attr.test.ts +50 -0
  77. package/src/tree/__tests__/selector-basic.test.ts +44 -0
  78. package/src/tree/__tests__/selector-capture.test.ts +22 -0
  79. package/src/tree/__tests__/selector-complex.test.ts +120 -0
  80. package/src/tree/__tests__/selector-compound.test.ts +74 -0
  81. package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
  82. package/src/tree/__tests__/selector-list.test.ts +59 -0
  83. package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
  84. package/src/tree/__tests__/selector.test.ts +182 -0
  85. package/src/tree/__tests__/sequence.test.ts +226 -0
  86. package/src/tree/__tests__/serialize-types.test.ts +529 -0
  87. package/src/tree/__tests__/spaced.test.ts +8 -0
  88. package/src/tree/__tests__/url.test.ts +72 -0
  89. package/src/tree/__tests__/var-declaration.test.ts +90 -0
  90. package/src/tree/ampersand.ts +538 -0
  91. package/src/tree/any.ts +169 -0
  92. package/src/tree/at-rule.ts +760 -0
  93. package/src/tree/block.ts +72 -0
  94. package/src/tree/bool.ts +46 -0
  95. package/src/tree/call.ts +593 -0
  96. package/src/tree/collection.ts +52 -0
  97. package/src/tree/color.ts +629 -0
  98. package/src/tree/combinator.ts +30 -0
  99. package/src/tree/comment.ts +36 -0
  100. package/src/tree/condition.ts +194 -0
  101. package/src/tree/control.ts +452 -0
  102. package/src/tree/declaration-custom.ts +56 -0
  103. package/src/tree/declaration-var.ts +87 -0
  104. package/src/tree/declaration.ts +742 -0
  105. package/src/tree/default-guard.ts +35 -0
  106. package/src/tree/dimension.ts +392 -0
  107. package/src/tree/expression.ts +97 -0
  108. package/src/tree/extend-list.ts +51 -0
  109. package/src/tree/extend.ts +391 -0
  110. package/src/tree/function.ts +254 -0
  111. package/src/tree/import-js.ts +130 -0
  112. package/src/tree/import-style.ts +875 -0
  113. package/{lib/tree/index.js → src/tree/index.ts} +49 -22
  114. package/src/tree/interpolated.ts +346 -0
  115. package/src/tree/js-array.ts +21 -0
  116. package/src/tree/js-expr.ts +50 -0
  117. package/src/tree/js-function.ts +31 -0
  118. package/src/tree/js-object.ts +22 -0
  119. package/src/tree/list.ts +415 -0
  120. package/src/tree/log.ts +89 -0
  121. package/src/tree/mixin.ts +331 -0
  122. package/src/tree/negative.ts +58 -0
  123. package/src/tree/nil.ts +57 -0
  124. package/src/tree/node-base.ts +1716 -0
  125. package/src/tree/node-type.ts +122 -0
  126. package/src/tree/node.ts +118 -0
  127. package/src/tree/number.ts +54 -0
  128. package/src/tree/operation.ts +187 -0
  129. package/src/tree/paren.ts +132 -0
  130. package/src/tree/query-condition.ts +47 -0
  131. package/src/tree/quoted.ts +119 -0
  132. package/src/tree/range.ts +101 -0
  133. package/src/tree/reference.ts +1099 -0
  134. package/src/tree/rest.ts +55 -0
  135. package/src/tree/rules-raw.ts +52 -0
  136. package/src/tree/rules.ts +2896 -0
  137. package/src/tree/ruleset.ts +1217 -0
  138. package/src/tree/selector-attr.ts +172 -0
  139. package/src/tree/selector-basic.ts +75 -0
  140. package/src/tree/selector-capture.ts +85 -0
  141. package/src/tree/selector-complex.ts +189 -0
  142. package/src/tree/selector-compound.ts +205 -0
  143. package/src/tree/selector-interpolated.ts +95 -0
  144. package/src/tree/selector-list.ts +245 -0
  145. package/src/tree/selector-pseudo.ts +173 -0
  146. package/src/tree/selector-simple.ts +10 -0
  147. package/src/tree/selector.ts +152 -0
  148. package/src/tree/sequence.ts +463 -0
  149. package/src/tree/tree.ts +130 -0
  150. package/src/tree/url.ts +95 -0
  151. package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
  152. package/src/tree/util/EXTEND_AUDIT.md +233 -0
  153. package/src/tree/util/EXTEND_BASELINE.md +64 -0
  154. package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
  155. package/src/tree/util/EXTEND_DOCS.md +24 -0
  156. package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
  157. package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
  158. package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
  159. package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
  160. package/src/tree/util/EXTEND_RULES.md +74 -0
  161. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
  162. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
  163. package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
  164. package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
  165. package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
  166. package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
  167. package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
  168. package/src/tree/util/__tests__/_archive/README.md +4 -0
  169. package/src/tree/util/__tests__/bitset.test.ts +142 -0
  170. package/src/tree/util/__tests__/debug-log.ts +50 -0
  171. package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
  172. package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
  173. package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
  174. package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
  175. package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
  176. package/src/tree/util/__tests__/is-node.test.ts +63 -0
  177. package/src/tree/util/__tests__/list-like.test.ts +63 -0
  178. package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
  179. package/src/tree/util/__tests__/print.test.ts +183 -0
  180. package/src/tree/util/__tests__/process-extends.test.ts +226 -0
  181. package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
  182. package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
  183. package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
  184. package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
  185. package/src/tree/util/ampersand-template.ts +9 -0
  186. package/src/tree/util/bitset.ts +194 -0
  187. package/src/tree/util/calculate.ts +11 -0
  188. package/src/tree/util/cast.ts +89 -0
  189. package/src/tree/util/cloning.ts +8 -0
  190. package/src/tree/util/collections.ts +299 -0
  191. package/src/tree/util/compare.ts +90 -0
  192. package/src/tree/util/cursor.ts +171 -0
  193. package/src/tree/util/extend-core.ts +2139 -0
  194. package/src/tree/util/extend-roots.ts +1108 -0
  195. package/src/tree/util/field-helpers.ts +354 -0
  196. package/src/tree/util/is-node.ts +43 -0
  197. package/src/tree/util/list-like.ts +93 -0
  198. package/src/tree/util/mixin-instance-primitives.ts +2020 -0
  199. package/src/tree/util/print.ts +303 -0
  200. package/src/tree/util/process-leading-is.ts +421 -0
  201. package/src/tree/util/recursion-helper.ts +54 -0
  202. package/src/tree/util/regex.ts +2 -0
  203. package/src/tree/util/registry-utils.ts +1953 -0
  204. package/src/tree/util/ruleset-trace.ts +17 -0
  205. package/src/tree/util/scoped-body-eval.ts +320 -0
  206. package/src/tree/util/selector-match-core.ts +2005 -0
  207. package/src/tree/util/selector-utils.ts +757 -0
  208. package/src/tree/util/serialize-helper.ts +535 -0
  209. package/src/tree/util/serialize-types.ts +318 -0
  210. package/src/tree/util/should-operate.ts +78 -0
  211. package/src/tree/util/sourcemap.ts +37 -0
  212. package/src/types/config.ts +247 -0
  213. package/src/types/index.ts +12 -0
  214. package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
  215. package/src/types.d.ts +9 -0
  216. package/src/types.ts +68 -0
  217. package/src/use-webpack-resolver.ts +56 -0
  218. package/src/visitor/__tests__/visitor.test.ts +136 -0
  219. package/src/visitor/index.ts +263 -0
  220. package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
  221. package/lib/context.d.ts +0 -352
  222. package/lib/context.d.ts.map +0 -1
  223. package/lib/context.js +0 -636
  224. package/lib/context.js.map +0 -1
  225. package/lib/conversions.d.ts +0 -73
  226. package/lib/conversions.d.ts.map +0 -1
  227. package/lib/conversions.js +0 -253
  228. package/lib/conversions.js.map +0 -1
  229. package/lib/debug-log.d.ts +0 -2
  230. package/lib/debug-log.d.ts.map +0 -1
  231. package/lib/debug-log.js +0 -27
  232. package/lib/debug-log.js.map +0 -1
  233. package/lib/define-function.d.ts +0 -587
  234. package/lib/define-function.d.ts.map +0 -1
  235. package/lib/define-function.js +0 -726
  236. package/lib/define-function.js.map +0 -1
  237. package/lib/deprecation.d.ts +0 -34
  238. package/lib/deprecation.d.ts.map +0 -1
  239. package/lib/deprecation.js +0 -57
  240. package/lib/deprecation.js.map +0 -1
  241. package/lib/jess-error.d.ts +0 -343
  242. package/lib/jess-error.d.ts.map +0 -1
  243. package/lib/jess-error.js +0 -508
  244. package/lib/jess-error.js.map +0 -1
  245. package/lib/logger/deprecation-processing.d.ts +0 -41
  246. package/lib/logger/deprecation-processing.d.ts.map +0 -1
  247. package/lib/logger/deprecation-processing.js +0 -81
  248. package/lib/logger/deprecation-processing.js.map +0 -1
  249. package/lib/logger.d.ts +0 -10
  250. package/lib/logger.d.ts.map +0 -1
  251. package/lib/logger.js +0 -20
  252. package/lib/logger.js.map +0 -1
  253. package/lib/plugin.d.ts +0 -94
  254. package/lib/plugin.d.ts.map +0 -1
  255. package/lib/plugin.js +0 -174
  256. package/lib/plugin.js.map +0 -1
  257. package/lib/tree/ampersand.d.ts +0 -94
  258. package/lib/tree/ampersand.d.ts.map +0 -1
  259. package/lib/tree/ampersand.js +0 -269
  260. package/lib/tree/ampersand.js.map +0 -1
  261. package/lib/tree/any.d.ts +0 -58
  262. package/lib/tree/any.d.ts.map +0 -1
  263. package/lib/tree/any.js +0 -104
  264. package/lib/tree/any.js.map +0 -1
  265. package/lib/tree/at-rule.d.ts +0 -53
  266. package/lib/tree/at-rule.d.ts.map +0 -1
  267. package/lib/tree/at-rule.js +0 -503
  268. package/lib/tree/at-rule.js.map +0 -1
  269. package/lib/tree/block.d.ts +0 -22
  270. package/lib/tree/block.d.ts.map +0 -1
  271. package/lib/tree/block.js +0 -24
  272. package/lib/tree/block.js.map +0 -1
  273. package/lib/tree/bool.d.ts +0 -18
  274. package/lib/tree/bool.d.ts.map +0 -1
  275. package/lib/tree/bool.js +0 -28
  276. package/lib/tree/bool.js.map +0 -1
  277. package/lib/tree/call.d.ts +0 -66
  278. package/lib/tree/call.d.ts.map +0 -1
  279. package/lib/tree/call.js +0 -306
  280. package/lib/tree/call.js.map +0 -1
  281. package/lib/tree/collection.d.ts +0 -30
  282. package/lib/tree/collection.d.ts.map +0 -1
  283. package/lib/tree/collection.js +0 -37
  284. package/lib/tree/collection.js.map +0 -1
  285. package/lib/tree/color.d.ts +0 -101
  286. package/lib/tree/color.d.ts.map +0 -1
  287. package/lib/tree/color.js +0 -513
  288. package/lib/tree/color.js.map +0 -1
  289. package/lib/tree/combinator.d.ts +0 -13
  290. package/lib/tree/combinator.d.ts.map +0 -1
  291. package/lib/tree/combinator.js +0 -12
  292. package/lib/tree/combinator.js.map +0 -1
  293. package/lib/tree/comment.d.ts +0 -20
  294. package/lib/tree/comment.d.ts.map +0 -1
  295. package/lib/tree/comment.js +0 -19
  296. package/lib/tree/comment.js.map +0 -1
  297. package/lib/tree/condition.d.ts +0 -31
  298. package/lib/tree/condition.d.ts.map +0 -1
  299. package/lib/tree/condition.js +0 -103
  300. package/lib/tree/condition.js.map +0 -1
  301. package/lib/tree/control.d.ts +0 -104
  302. package/lib/tree/control.d.ts.map +0 -1
  303. package/lib/tree/control.js +0 -430
  304. package/lib/tree/control.js.map +0 -1
  305. package/lib/tree/declaration-custom.d.ts +0 -18
  306. package/lib/tree/declaration-custom.d.ts.map +0 -1
  307. package/lib/tree/declaration-custom.js +0 -24
  308. package/lib/tree/declaration-custom.js.map +0 -1
  309. package/lib/tree/declaration-var.d.ts +0 -35
  310. package/lib/tree/declaration-var.d.ts.map +0 -1
  311. package/lib/tree/declaration-var.js +0 -63
  312. package/lib/tree/declaration-var.js.map +0 -1
  313. package/lib/tree/declaration.d.ts +0 -78
  314. package/lib/tree/declaration.d.ts.map +0 -1
  315. package/lib/tree/declaration.js +0 -286
  316. package/lib/tree/declaration.js.map +0 -1
  317. package/lib/tree/default-guard.d.ts +0 -15
  318. package/lib/tree/default-guard.d.ts.map +0 -1
  319. package/lib/tree/default-guard.js +0 -19
  320. package/lib/tree/default-guard.js.map +0 -1
  321. package/lib/tree/dimension.d.ts +0 -34
  322. package/lib/tree/dimension.d.ts.map +0 -1
  323. package/lib/tree/dimension.js +0 -294
  324. package/lib/tree/dimension.js.map +0 -1
  325. package/lib/tree/expression.d.ts +0 -25
  326. package/lib/tree/expression.d.ts.map +0 -1
  327. package/lib/tree/expression.js +0 -32
  328. package/lib/tree/expression.js.map +0 -1
  329. package/lib/tree/extend-list.d.ts +0 -23
  330. package/lib/tree/extend-list.d.ts.map +0 -1
  331. package/lib/tree/extend-list.js +0 -23
  332. package/lib/tree/extend-list.js.map +0 -1
  333. package/lib/tree/extend.d.ts +0 -47
  334. package/lib/tree/extend.d.ts.map +0 -1
  335. package/lib/tree/extend.js +0 -296
  336. package/lib/tree/extend.js.map +0 -1
  337. package/lib/tree/function.d.ts +0 -48
  338. package/lib/tree/function.d.ts.map +0 -1
  339. package/lib/tree/function.js +0 -74
  340. package/lib/tree/function.js.map +0 -1
  341. package/lib/tree/import-js.d.ts +0 -35
  342. package/lib/tree/import-js.d.ts.map +0 -1
  343. package/lib/tree/import-js.js +0 -45
  344. package/lib/tree/import-js.js.map +0 -1
  345. package/lib/tree/import-style.d.ts +0 -156
  346. package/lib/tree/import-style.d.ts.map +0 -1
  347. package/lib/tree/import-style.js +0 -566
  348. package/lib/tree/import-style.js.map +0 -1
  349. package/lib/tree/index.d.ts +0 -71
  350. package/lib/tree/index.d.ts.map +0 -1
  351. package/lib/tree/index.js.map +0 -1
  352. package/lib/tree/interpolated-reference.d.ts +0 -24
  353. package/lib/tree/interpolated-reference.d.ts.map +0 -1
  354. package/lib/tree/interpolated-reference.js +0 -37
  355. package/lib/tree/interpolated-reference.js.map +0 -1
  356. package/lib/tree/interpolated.d.ts +0 -62
  357. package/lib/tree/interpolated.d.ts.map +0 -1
  358. package/lib/tree/interpolated.js +0 -204
  359. package/lib/tree/interpolated.js.map +0 -1
  360. package/lib/tree/js-array.d.ts +0 -10
  361. package/lib/tree/js-array.d.ts.map +0 -1
  362. package/lib/tree/js-array.js +0 -10
  363. package/lib/tree/js-array.js.map +0 -1
  364. package/lib/tree/js-expr.d.ts +0 -23
  365. package/lib/tree/js-expr.d.ts.map +0 -1
  366. package/lib/tree/js-expr.js +0 -28
  367. package/lib/tree/js-expr.js.map +0 -1
  368. package/lib/tree/js-function.d.ts +0 -20
  369. package/lib/tree/js-function.d.ts.map +0 -1
  370. package/lib/tree/js-function.js +0 -16
  371. package/lib/tree/js-function.js.map +0 -1
  372. package/lib/tree/js-object.d.ts +0 -10
  373. package/lib/tree/js-object.d.ts.map +0 -1
  374. package/lib/tree/js-object.js +0 -10
  375. package/lib/tree/js-object.js.map +0 -1
  376. package/lib/tree/list.d.ts +0 -38
  377. package/lib/tree/list.d.ts.map +0 -1
  378. package/lib/tree/list.js +0 -83
  379. package/lib/tree/list.js.map +0 -1
  380. package/lib/tree/log.d.ts +0 -29
  381. package/lib/tree/log.d.ts.map +0 -1
  382. package/lib/tree/log.js +0 -56
  383. package/lib/tree/log.js.map +0 -1
  384. package/lib/tree/mixin.d.ts +0 -87
  385. package/lib/tree/mixin.d.ts.map +0 -1
  386. package/lib/tree/mixin.js +0 -112
  387. package/lib/tree/mixin.js.map +0 -1
  388. package/lib/tree/negative.d.ts +0 -17
  389. package/lib/tree/negative.d.ts.map +0 -1
  390. package/lib/tree/negative.js +0 -22
  391. package/lib/tree/negative.js.map +0 -1
  392. package/lib/tree/nil.d.ts +0 -30
  393. package/lib/tree/nil.d.ts.map +0 -1
  394. package/lib/tree/nil.js +0 -35
  395. package/lib/tree/nil.js.map +0 -1
  396. package/lib/tree/node-base.d.ts +0 -361
  397. package/lib/tree/node-base.d.ts.map +0 -1
  398. package/lib/tree/node-base.js +0 -930
  399. package/lib/tree/node-base.js.map +0 -1
  400. package/lib/tree/node.d.ts +0 -10
  401. package/lib/tree/node.d.ts.map +0 -1
  402. package/lib/tree/node.js +0 -45
  403. package/lib/tree/node.js.map +0 -1
  404. package/lib/tree/number.d.ts +0 -21
  405. package/lib/tree/number.d.ts.map +0 -1
  406. package/lib/tree/number.js +0 -27
  407. package/lib/tree/number.js.map +0 -1
  408. package/lib/tree/operation.d.ts +0 -26
  409. package/lib/tree/operation.d.ts.map +0 -1
  410. package/lib/tree/operation.js +0 -103
  411. package/lib/tree/operation.js.map +0 -1
  412. package/lib/tree/paren.d.ts +0 -19
  413. package/lib/tree/paren.d.ts.map +0 -1
  414. package/lib/tree/paren.js +0 -92
  415. package/lib/tree/paren.js.map +0 -1
  416. package/lib/tree/query-condition.d.ts +0 -17
  417. package/lib/tree/query-condition.d.ts.map +0 -1
  418. package/lib/tree/query-condition.js +0 -39
  419. package/lib/tree/query-condition.js.map +0 -1
  420. package/lib/tree/quoted.d.ts +0 -28
  421. package/lib/tree/quoted.d.ts.map +0 -1
  422. package/lib/tree/quoted.js +0 -75
  423. package/lib/tree/quoted.js.map +0 -1
  424. package/lib/tree/range.d.ts +0 -33
  425. package/lib/tree/range.d.ts.map +0 -1
  426. package/lib/tree/range.js +0 -47
  427. package/lib/tree/range.js.map +0 -1
  428. package/lib/tree/reference.d.ts +0 -76
  429. package/lib/tree/reference.d.ts.map +0 -1
  430. package/lib/tree/reference.js +0 -521
  431. package/lib/tree/reference.js.map +0 -1
  432. package/lib/tree/rest.d.ts +0 -15
  433. package/lib/tree/rest.d.ts.map +0 -1
  434. package/lib/tree/rest.js +0 -32
  435. package/lib/tree/rest.js.map +0 -1
  436. package/lib/tree/rules-raw.d.ts +0 -17
  437. package/lib/tree/rules-raw.d.ts.map +0 -1
  438. package/lib/tree/rules-raw.js +0 -37
  439. package/lib/tree/rules-raw.js.map +0 -1
  440. package/lib/tree/rules.d.ts +0 -262
  441. package/lib/tree/rules.d.ts.map +0 -1
  442. package/lib/tree/rules.js +0 -2359
  443. package/lib/tree/rules.js.map +0 -1
  444. package/lib/tree/ruleset.d.ts +0 -92
  445. package/lib/tree/ruleset.d.ts.map +0 -1
  446. package/lib/tree/ruleset.js +0 -528
  447. package/lib/tree/ruleset.js.map +0 -1
  448. package/lib/tree/selector-attr.d.ts +0 -31
  449. package/lib/tree/selector-attr.d.ts.map +0 -1
  450. package/lib/tree/selector-attr.js +0 -99
  451. package/lib/tree/selector-attr.js.map +0 -1
  452. package/lib/tree/selector-basic.d.ts +0 -24
  453. package/lib/tree/selector-basic.d.ts.map +0 -1
  454. package/lib/tree/selector-basic.js +0 -38
  455. package/lib/tree/selector-basic.js.map +0 -1
  456. package/lib/tree/selector-capture.d.ts +0 -23
  457. package/lib/tree/selector-capture.d.ts.map +0 -1
  458. package/lib/tree/selector-capture.js +0 -34
  459. package/lib/tree/selector-capture.js.map +0 -1
  460. package/lib/tree/selector-complex.d.ts +0 -40
  461. package/lib/tree/selector-complex.d.ts.map +0 -1
  462. package/lib/tree/selector-complex.js +0 -143
  463. package/lib/tree/selector-complex.js.map +0 -1
  464. package/lib/tree/selector-compound.d.ts +0 -16
  465. package/lib/tree/selector-compound.d.ts.map +0 -1
  466. package/lib/tree/selector-compound.js +0 -114
  467. package/lib/tree/selector-compound.js.map +0 -1
  468. package/lib/tree/selector-interpolated.d.ts +0 -23
  469. package/lib/tree/selector-interpolated.d.ts.map +0 -1
  470. package/lib/tree/selector-interpolated.js +0 -27
  471. package/lib/tree/selector-interpolated.js.map +0 -1
  472. package/lib/tree/selector-list.d.ts +0 -17
  473. package/lib/tree/selector-list.d.ts.map +0 -1
  474. package/lib/tree/selector-list.js +0 -174
  475. package/lib/tree/selector-list.js.map +0 -1
  476. package/lib/tree/selector-pseudo.d.ts +0 -42
  477. package/lib/tree/selector-pseudo.d.ts.map +0 -1
  478. package/lib/tree/selector-pseudo.js +0 -204
  479. package/lib/tree/selector-pseudo.js.map +0 -1
  480. package/lib/tree/selector-simple.d.ts +0 -5
  481. package/lib/tree/selector-simple.d.ts.map +0 -1
  482. package/lib/tree/selector-simple.js +0 -6
  483. package/lib/tree/selector-simple.js.map +0 -1
  484. package/lib/tree/selector.d.ts +0 -43
  485. package/lib/tree/selector.d.ts.map +0 -1
  486. package/lib/tree/selector.js +0 -56
  487. package/lib/tree/selector.js.map +0 -1
  488. package/lib/tree/sequence.d.ts +0 -43
  489. package/lib/tree/sequence.d.ts.map +0 -1
  490. package/lib/tree/sequence.js +0 -151
  491. package/lib/tree/sequence.js.map +0 -1
  492. package/lib/tree/tree.d.ts +0 -87
  493. package/lib/tree/tree.d.ts.map +0 -1
  494. package/lib/tree/tree.js +0 -2
  495. package/lib/tree/tree.js.map +0 -1
  496. package/lib/tree/url.d.ts +0 -18
  497. package/lib/tree/url.d.ts.map +0 -1
  498. package/lib/tree/url.js +0 -35
  499. package/lib/tree/url.js.map +0 -1
  500. package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
  501. package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
  502. package/lib/tree/util/__tests__/debug-log.js +0 -36
  503. package/lib/tree/util/__tests__/debug-log.js.map +0 -1
  504. package/lib/tree/util/calculate.d.ts +0 -3
  505. package/lib/tree/util/calculate.d.ts.map +0 -1
  506. package/lib/tree/util/calculate.js +0 -10
  507. package/lib/tree/util/calculate.js.map +0 -1
  508. package/lib/tree/util/cast.d.ts +0 -10
  509. package/lib/tree/util/cast.d.ts.map +0 -1
  510. package/lib/tree/util/cast.js +0 -87
  511. package/lib/tree/util/cast.js.map +0 -1
  512. package/lib/tree/util/cloning.d.ts +0 -4
  513. package/lib/tree/util/cloning.d.ts.map +0 -1
  514. package/lib/tree/util/cloning.js +0 -8
  515. package/lib/tree/util/cloning.js.map +0 -1
  516. package/lib/tree/util/collections.d.ts +0 -57
  517. package/lib/tree/util/collections.d.ts.map +0 -1
  518. package/lib/tree/util/collections.js +0 -136
  519. package/lib/tree/util/collections.js.map +0 -1
  520. package/lib/tree/util/compare.d.ts +0 -11
  521. package/lib/tree/util/compare.d.ts.map +0 -1
  522. package/lib/tree/util/compare.js +0 -89
  523. package/lib/tree/util/compare.js.map +0 -1
  524. package/lib/tree/util/extend-helpers.d.ts +0 -2
  525. package/lib/tree/util/extend-helpers.d.ts.map +0 -1
  526. package/lib/tree/util/extend-helpers.js +0 -2
  527. package/lib/tree/util/extend-helpers.js.map +0 -1
  528. package/lib/tree/util/extend-roots.d.ts +0 -37
  529. package/lib/tree/util/extend-roots.d.ts.map +0 -1
  530. package/lib/tree/util/extend-roots.js +0 -700
  531. package/lib/tree/util/extend-roots.js.map +0 -1
  532. package/lib/tree/util/extend-roots.old.d.ts +0 -132
  533. package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
  534. package/lib/tree/util/extend-roots.old.js +0 -2272
  535. package/lib/tree/util/extend-roots.old.js.map +0 -1
  536. package/lib/tree/util/extend-trace-debug.d.ts +0 -13
  537. package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
  538. package/lib/tree/util/extend-trace-debug.js +0 -34
  539. package/lib/tree/util/extend-trace-debug.js.map +0 -1
  540. package/lib/tree/util/extend-walk.d.ts +0 -53
  541. package/lib/tree/util/extend-walk.d.ts.map +0 -1
  542. package/lib/tree/util/extend-walk.js +0 -881
  543. package/lib/tree/util/extend-walk.js.map +0 -1
  544. package/lib/tree/util/extend.d.ts +0 -218
  545. package/lib/tree/util/extend.d.ts.map +0 -1
  546. package/lib/tree/util/extend.js +0 -3182
  547. package/lib/tree/util/extend.js.map +0 -1
  548. package/lib/tree/util/find-extendable-locations.d.ts +0 -2
  549. package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
  550. package/lib/tree/util/find-extendable-locations.js +0 -2
  551. package/lib/tree/util/find-extendable-locations.js.map +0 -1
  552. package/lib/tree/util/format.d.ts +0 -20
  553. package/lib/tree/util/format.d.ts.map +0 -1
  554. package/lib/tree/util/format.js +0 -67
  555. package/lib/tree/util/format.js.map +0 -1
  556. package/lib/tree/util/is-node.d.ts +0 -13
  557. package/lib/tree/util/is-node.d.ts.map +0 -1
  558. package/lib/tree/util/is-node.js +0 -43
  559. package/lib/tree/util/is-node.js.map +0 -1
  560. package/lib/tree/util/print.d.ts +0 -80
  561. package/lib/tree/util/print.d.ts.map +0 -1
  562. package/lib/tree/util/print.js +0 -205
  563. package/lib/tree/util/print.js.map +0 -1
  564. package/lib/tree/util/process-leading-is.d.ts +0 -25
  565. package/lib/tree/util/process-leading-is.d.ts.map +0 -1
  566. package/lib/tree/util/process-leading-is.js +0 -364
  567. package/lib/tree/util/process-leading-is.js.map +0 -1
  568. package/lib/tree/util/recursion-helper.d.ts +0 -15
  569. package/lib/tree/util/recursion-helper.d.ts.map +0 -1
  570. package/lib/tree/util/recursion-helper.js +0 -43
  571. package/lib/tree/util/recursion-helper.js.map +0 -1
  572. package/lib/tree/util/regex.d.ts +0 -4
  573. package/lib/tree/util/regex.d.ts.map +0 -1
  574. package/lib/tree/util/regex.js +0 -4
  575. package/lib/tree/util/regex.js.map +0 -1
  576. package/lib/tree/util/registry-utils.d.ts +0 -192
  577. package/lib/tree/util/registry-utils.d.ts.map +0 -1
  578. package/lib/tree/util/registry-utils.js +0 -1214
  579. package/lib/tree/util/registry-utils.js.map +0 -1
  580. package/lib/tree/util/ruleset-trace.d.ts +0 -4
  581. package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
  582. package/lib/tree/util/ruleset-trace.js +0 -14
  583. package/lib/tree/util/ruleset-trace.js.map +0 -1
  584. package/lib/tree/util/selector-compare.d.ts +0 -2
  585. package/lib/tree/util/selector-compare.d.ts.map +0 -1
  586. package/lib/tree/util/selector-compare.js +0 -2
  587. package/lib/tree/util/selector-compare.js.map +0 -1
  588. package/lib/tree/util/selector-match-core.d.ts +0 -184
  589. package/lib/tree/util/selector-match-core.d.ts.map +0 -1
  590. package/lib/tree/util/selector-match-core.js +0 -1603
  591. package/lib/tree/util/selector-match-core.js.map +0 -1
  592. package/lib/tree/util/selector-utils.d.ts +0 -30
  593. package/lib/tree/util/selector-utils.d.ts.map +0 -1
  594. package/lib/tree/util/selector-utils.js +0 -100
  595. package/lib/tree/util/selector-utils.js.map +0 -1
  596. package/lib/tree/util/serialize-helper.d.ts +0 -13
  597. package/lib/tree/util/serialize-helper.d.ts.map +0 -1
  598. package/lib/tree/util/serialize-helper.js +0 -387
  599. package/lib/tree/util/serialize-helper.js.map +0 -1
  600. package/lib/tree/util/serialize-types.d.ts +0 -9
  601. package/lib/tree/util/serialize-types.d.ts.map +0 -1
  602. package/lib/tree/util/serialize-types.js +0 -216
  603. package/lib/tree/util/serialize-types.js.map +0 -1
  604. package/lib/tree/util/should-operate.d.ts +0 -23
  605. package/lib/tree/util/should-operate.d.ts.map +0 -1
  606. package/lib/tree/util/should-operate.js +0 -46
  607. package/lib/tree/util/should-operate.js.map +0 -1
  608. package/lib/tree/util/sourcemap.d.ts +0 -7
  609. package/lib/tree/util/sourcemap.d.ts.map +0 -1
  610. package/lib/tree/util/sourcemap.js +0 -25
  611. package/lib/tree/util/sourcemap.js.map +0 -1
  612. package/lib/types/config.d.ts +0 -205
  613. package/lib/types/config.d.ts.map +0 -1
  614. package/lib/types/config.js +0 -2
  615. package/lib/types/config.js.map +0 -1
  616. package/lib/types/index.d.ts +0 -15
  617. package/lib/types/index.d.ts.map +0 -1
  618. package/lib/types/index.js +0 -3
  619. package/lib/types/index.js.map +0 -1
  620. package/lib/types/modes.d.ts.map +0 -1
  621. package/lib/types/modes.js +0 -2
  622. package/lib/types/modes.js.map +0 -1
  623. package/lib/types.d.ts +0 -61
  624. package/lib/types.d.ts.map +0 -1
  625. package/lib/types.js +0 -2
  626. package/lib/types.js.map +0 -1
  627. package/lib/use-webpack-resolver.d.ts +0 -9
  628. package/lib/use-webpack-resolver.d.ts.map +0 -1
  629. package/lib/use-webpack-resolver.js +0 -41
  630. package/lib/use-webpack-resolver.js.map +0 -1
  631. package/lib/visitor/index.d.ts +0 -136
  632. package/lib/visitor/index.d.ts.map +0 -1
  633. package/lib/visitor/index.js +0 -135
  634. package/lib/visitor/index.js.map +0 -1
  635. package/lib/visitor/less-visitor.d.ts +0 -7
  636. package/lib/visitor/less-visitor.d.ts.map +0 -1
  637. package/lib/visitor/less-visitor.js.map +0 -1
@@ -4,6 +4,7 @@
4
4
  * Kept in `@jesscss/core` to avoid cyclic workspace dependencies with `styles-config`.
5
5
  */
6
6
  export type MathMode = 'always' | 'parens-division' | 'parens' | 'strict';
7
+
7
8
  /**
8
9
  * Unit conversion modes.
9
10
  *
@@ -14,6 +15,7 @@ export type MathMode = 'always' | 'parens-division' | 'parens' | 'strict';
14
15
  * Kept in `@jesscss/core` to avoid cyclic workspace dependencies with `styles-config`.
15
16
  */
16
17
  export type UnitMode = 'loose' | 'preserve' | 'strict';
18
+
17
19
  /**
18
20
  * Equality modes for guard/comparison semantics.
19
21
  *
@@ -21,4 +23,3 @@ export type UnitMode = 'loose' | 'preserve' | 'strict';
21
23
  * - `strict`: type-strict equality behavior
22
24
  */
23
25
  export type EqualityMode = 'coerce' | 'strict';
24
- //# sourceMappingURL=modes.d.ts.map
package/src/types.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ declare interface Set<T> {
2
+ union<U>(b: Set<U>): Set<T | U>;
3
+ intersection<U>(b: Set<U>): Set<T | U>;
4
+ difference<U>(b: Set<U>): Set<T | U>;
5
+ symmetricDifference<U>(b: Set<U>): Set<T | U>;
6
+ isSubsetOf<U>(b: Set<U>): boolean;
7
+ isSupersetOf<U>(b: Set<U>): boolean;
8
+ isDisjointFrom<U>(b: Set<U>): boolean;
9
+ }
package/src/types.ts ADDED
@@ -0,0 +1,68 @@
1
+ import type { PluginInterface } from './plugin';
2
+ export type ExtendSelectorKind = 'simple' | 'basic' | 'pseudo' | 'complex' | 'compound';
3
+
4
+ export const enum MathMode {
5
+ /**
6
+ * @note - A Jess file always performs math for expressions,
7
+ * but that's because expressions are only parsed as such
8
+ * when wrapped with `$()`, whereas Less & SCSS try to
9
+ * parse expressions in regular value sequences.
10
+ */
11
+ ALWAYS = 0,
12
+ PARENS_DIVISION = 1,
13
+ PARENS = 2
14
+ }
15
+
16
+ export const enum UnitMode {
17
+ /** Less's default 1.x-4.x */
18
+ LOOSE = 0,
19
+ /**
20
+ * @todo - I think Less's current strict unit mode is weirder,
21
+ * so this may need another mode depending on behavior. But
22
+ * if it's too weird, it could be a breaking change.
23
+ */
24
+ STRICT = 1
25
+ }
26
+
27
+ export interface StylesConfig {
28
+ compile?: {
29
+ plugins?: PluginInterface[];
30
+ searchPaths?: string[];
31
+ enableJavaScript?: boolean;
32
+ mathMode?: MathMode;
33
+ unitMode?: UnitMode;
34
+ allowExtendSelectors?: ExtendSelectorKind[];
35
+ };
36
+ output?: {
37
+ collapseNesting?: boolean;
38
+ compress?: boolean;
39
+ sourceMap?: boolean;
40
+ };
41
+ language?: {
42
+ less?: LessOptions;
43
+ [key: string]: LessOptions | Record<string, any> | undefined;
44
+ // Future: scss?: ScssOptions, css?: CssOptions, etc.
45
+ };
46
+ }
47
+
48
+ export interface LessOptions {
49
+ allowExtendSelectors?: ExtendSelectorKind[];
50
+ mathMode?: MathMode;
51
+ unitMode?: UnitMode;
52
+ dumpLineNumbers?: string;
53
+ relativeUrls?: boolean;
54
+ compress?: boolean;
55
+ strictMath?: boolean;
56
+ strictUnits?: boolean;
57
+ javascriptEnabled?: boolean;
58
+ sourceMap?: boolean;
59
+ globalVars?: Record<string, any>;
60
+ modifyVars?: Record<string, any>;
61
+ urlArgs?: string;
62
+ rewriteUrls?: boolean;
63
+ rootpath?: string;
64
+ paths?: string[];
65
+ plugin?: any;
66
+ processImports?: boolean;
67
+ syncImport?: boolean;
68
+ }
@@ -0,0 +1,56 @@
1
+ // jess/useWebpackResolver.ts
2
+ import path from 'node:path';
3
+ import fs from 'node:fs';
4
+ import {
5
+ ResolverFactory,
6
+ CachedInputFileSystem
7
+ } from 'enhanced-resolve';
8
+ import type { PluginInterface } from './plugin.js';
9
+
10
+ const { isArray } = Array;
11
+
12
+ type WebpackResolverInstance = { apply(resolver: any): void };
13
+ export type WebpackResolverCtor<Opts> = new (opts?: Opts) => WebpackResolverInstance;
14
+ type InferCtorOpts<C> = C extends new (opts?: infer O) => any ? O : never;
15
+
16
+ export function useWebpackResolver<Ctor extends WebpackResolverCtor<any>>(
17
+ CtorRef: Ctor
18
+ ): (opts?: InferCtorOpts<Ctor>) => PluginInterface {
19
+ return (opts?: InferCtorOpts<Ctor>): PluginInterface => {
20
+ const fileSystem = new CachedInputFileSystem(fs as any, 4000);
21
+ const pluginInstance: WebpackResolverInstance = new CtorRef(opts as any);
22
+
23
+ const er = ResolverFactory.createResolver({
24
+ fileSystem,
25
+ plugins: [pluginInstance]
26
+ });
27
+
28
+ const resolveOnce = (basedir: string, request: string) =>
29
+ new Promise<string | null>((resolve) => {
30
+ er.resolve({}, basedir, request, {}, (err, out) => {
31
+ resolve(err ? null : (out as string));
32
+ });
33
+ });
34
+
35
+ return {
36
+ name: `webpack-resolver(${CtorRef.name || 'ctor'})`,
37
+ async resolve(filePath, currentDir, searchPaths) {
38
+ const bases = [currentDir, ...searchPaths];
39
+ const out: string[] = [];
40
+ const seen = new Set<string>();
41
+ filePath = isArray(filePath) ? filePath : [filePath];
42
+ for (const base of bases) {
43
+ const baseDir = path.isAbsolute(base) ? base : path.resolve(currentDir, base);
44
+ for (const path of filePath) {
45
+ const abs = await resolveOnce(baseDir, path);
46
+ if (abs && !seen.has(abs)) {
47
+ seen.add(abs);
48
+ out.push(abs);
49
+ }
50
+ }
51
+ }
52
+ return out;
53
+ }
54
+ };
55
+ };
56
+ }
@@ -0,0 +1,136 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Visitor, TreeVisitor, ABORT } from '../index.js';
3
+ import { ruleset, rules, decl, any } from '../../tree/index.js';
4
+
5
+ describe('Visitor Pattern', () => {
6
+ describe('accept() method', () => {
7
+ it('should visit node itself first, then children', () => {
8
+ const visited: string[] = [];
9
+
10
+ const visitor = {
11
+ enter: (node: any) => {
12
+ visited.push(`enter:${node?.type}`);
13
+ },
14
+ ruleset: (node: any) => {
15
+ visited.push(`ruleset`);
16
+ return node;
17
+ },
18
+ declaration: (node: any) => {
19
+ visited.push(`declaration`);
20
+ return node;
21
+ }
22
+ } as Visitor;
23
+
24
+ const declaration = decl({ name: 'color', value: any('red') });
25
+ const rs = ruleset({ selector: null as any, rules: rules([declaration]) });
26
+
27
+ rs.accept(visitor);
28
+
29
+ // Should visit ruleset first, then declaration
30
+ expect(visited).toContain('enter:Ruleset');
31
+ expect(visited).toContain('ruleset');
32
+ expect(visited).toContain('enter:Declaration');
33
+ expect(visited).toContain('declaration');
34
+
35
+ // Ruleset should be visited before declaration
36
+ const rulesetIndex = visited.findIndex(v => v === 'ruleset');
37
+ const declIndex = visited.findIndex(v => v === 'declaration');
38
+ expect(rulesetIndex).toBeLessThan(declIndex);
39
+ });
40
+
41
+ it('should handle node replacement', () => {
42
+ const visitor = {
43
+ declaration: (node: any) => {
44
+ return decl({ name: 'background', value: any('blue') });
45
+ }
46
+ } as unknown as Visitor;
47
+
48
+ const declaration = decl({ name: 'color', value: any('red') });
49
+ const result = declaration.accept(visitor);
50
+
51
+ expect(result.type).toBe('Declaration');
52
+ expect((result as any).name.valueOf()).toBe('background');
53
+ });
54
+
55
+ it('should recursively visit children', () => {
56
+ const visited: string[] = [];
57
+
58
+ const visitor = {
59
+ ruleset: (node: any) => {
60
+ visited.push('ruleset');
61
+ return node;
62
+ },
63
+ declaration: (node: any) => {
64
+ visited.push('declaration');
65
+ return node;
66
+ }
67
+ } as Visitor;
68
+
69
+ const decl1 = decl({ name: 'color', value: any('red') });
70
+ const decl2 = decl({ name: 'background', value: any('blue') });
71
+ const rs = ruleset({ selector: null as any, rules: rules([decl1, decl2]) });
72
+
73
+ rs.accept(visitor);
74
+
75
+ expect(visited.filter(v => v === 'ruleset')).toHaveLength(1);
76
+ expect(visited.filter(v => v === 'declaration')).toHaveLength(2);
77
+ });
78
+ });
79
+
80
+ describe('TreeVisitor with accept()', () => {
81
+ it('should use accept() if node has it, avoiding double-visiting', () => {
82
+ const visited: string[] = [];
83
+
84
+ class TestVisitor extends TreeVisitor {
85
+ override ruleset(node: any) {
86
+ visited.push('ruleset');
87
+ return node;
88
+ }
89
+
90
+ override declaration(node: any) {
91
+ visited.push('declaration');
92
+ return node;
93
+ }
94
+ }
95
+
96
+ const visitor = new TestVisitor();
97
+ const declaration = decl({ name: 'color', value: any('red') });
98
+ const rs = ruleset({ selector: null as any, rules: rules([declaration]) });
99
+
100
+ visitor.visit(rs);
101
+
102
+ // Should visit each node exactly once (no double-visiting)
103
+ expect(visited.filter(v => v === 'ruleset')).toHaveLength(1);
104
+ expect(visited.filter(v => v === 'declaration')).toHaveLength(1);
105
+ });
106
+ });
107
+
108
+ describe('Visitor return values', () => {
109
+ it('should handle ABORT symbol', () => {
110
+ const visited: string[] = [];
111
+
112
+ const visitor = {
113
+ enter: () => {
114
+ visited.push('enter');
115
+ return ABORT;
116
+ },
117
+ ruleset: () => {
118
+ visited.push('ruleset');
119
+ }
120
+ } as unknown as Visitor;
121
+
122
+ const rs = ruleset({ selector: null as any, rules: rules([]) });
123
+ const visitorInstance = new (class extends Visitor {
124
+ override visit(n: any) {
125
+ return super.visit(n);
126
+ }
127
+ })();
128
+ Object.assign(visitorInstance, visitor);
129
+ rs.accept(visitorInstance);
130
+
131
+ // Should stop after enter returns ABORT
132
+ expect(visited).toContain('enter');
133
+ expect(visited).not.toContain('ruleset');
134
+ });
135
+ });
136
+ });
@@ -0,0 +1,263 @@
1
+ import {
2
+ Node,
3
+ type NodeVisitReturn,
4
+ ABORT,
5
+ REMOVE
6
+ } from '../tree/node.js';
7
+ // import { type isNode } from '../tree/util'
8
+ import type * as tree from '../tree/index.js';
9
+
10
+ // const { isArray } = Array
11
+
12
+ // type GuardedType<T> = typeof isNode extends (value: any, type: T) => value is infer U ? U : never
13
+
14
+ const lowerFirst = (s: string) => s.charAt(0).toLowerCase() + s.slice(1);
15
+ export { ABORT, REMOVE };
16
+ export const SKIP: unique symbol = Symbol('SKIP');
17
+
18
+ type VisitorReturn = NodeVisitReturn | typeof SKIP;
19
+ export type VisitorContext = {
20
+ visitDeeper?: boolean;
21
+ };
22
+
23
+ /**
24
+ * Define all the optional methods one can define on a visitor that can be visited
25
+ *
26
+ * @todo - Write type tests for methods
27
+ */
28
+ export interface Visitor {
29
+
30
+ /** Optional methods called before entering / exiting the visitor */
31
+ enter?(n?: tree.Node): void | typeof ABORT;
32
+ /**
33
+ * `exit()` gets passed the top-most visitor result,
34
+ * in case we want to transform it on the way out.
35
+ */
36
+ exit?(val?: NodeVisitReturn): NodeVisitReturn;
37
+
38
+ /** Visitor methods */
39
+ atRule?(n: tree.AtRule, ctx?: VisitorContext): VisitorReturn;
40
+ atRuleExit?(n: tree.AtRule, ctx?: VisitorContext): void;
41
+ block?(n: tree.Block, ctx?: VisitorContext): VisitorReturn;
42
+ blockExit?(n: tree.Block, ctx?: VisitorContext): void;
43
+ bool?(n: tree.Bool, ctx?: VisitorContext): VisitorReturn;
44
+ boolExit?(n: tree.Bool, ctx?: VisitorContext): void;
45
+ ampersand?(n: tree.Ampersand, ctx?: VisitorContext): VisitorReturn;
46
+ ampersandExit?(n: tree.Ampersand, ctx?: VisitorContext): void;
47
+ any?(n: tree.Any, ctx?: VisitorContext): VisitorReturn;
48
+ anyExit?(n: tree.Any, ctx?: VisitorContext): void;
49
+ anonymous?(n: tree.Anonymous, ctx?: VisitorContext): VisitorReturn;
50
+ anonymousExit?(n: tree.Anonymous, ctx?: VisitorContext): void;
51
+ call?(n: tree.Call, ctx?: VisitorContext): VisitorReturn;
52
+ callExit?(n: tree.Call, ctx?: VisitorContext): void;
53
+ collection?(n: tree.Collection, ctx?: VisitorContext): VisitorReturn;
54
+ collectionExit?(n: tree.Collection, ctx?: VisitorContext): void;
55
+ color?(n: tree.Color, ctx?: VisitorContext): VisitorReturn;
56
+ colorExit?(n: tree.Color, ctx?: VisitorContext): void;
57
+ comment?(n: tree.Comment, ctx?: VisitorContext): VisitorReturn;
58
+ commentExit?(n: tree.Comment, ctx?: VisitorContext): void;
59
+ combinator?(n: tree.Combinator, ctx?: VisitorContext): VisitorReturn;
60
+ combinatorExit?(n: tree.Combinator, ctx?: VisitorContext): void;
61
+ condition?(n: tree.Condition, ctx?: VisitorContext): VisitorReturn;
62
+ conditionExit?(n: tree.Condition, ctx?: VisitorContext): void;
63
+ customDeclaration?(n: tree.CustomDeclaration, ctx?: VisitorContext): VisitorReturn;
64
+ customDeclarationExit?(n: tree.CustomDeclaration, ctx?: VisitorContext): void;
65
+ declaration?(n: tree.Declaration): VisitorReturn;
66
+ declarationExit?(n: tree.Declaration, ctx?: VisitorContext): void;
67
+ dimension?(n: tree.Dimension, ctx?: VisitorContext): VisitorReturn;
68
+ dimensionExit?(n: tree.Dimension, ctx?: VisitorContext): void;
69
+ expression?(n: tree.Expression, ctx?: VisitorContext): VisitorReturn;
70
+ expressionExit?(n: tree.Expression, ctx?: VisitorContext): void;
71
+ extend?(n: tree.Extend, ctx?: VisitorContext): VisitorReturn;
72
+ extendExit?(n: tree.Extend, ctx?: VisitorContext): void;
73
+ list?(n: tree.List<Node>, ctx?: VisitorContext): VisitorReturn;
74
+ listExit?(n: tree.List<Node>, ctx?: VisitorContext): void;
75
+ mixin?(n: tree.Mixin, ctx?: VisitorContext): VisitorReturn;
76
+ mixinExit?(n: tree.Mixin, ctx?: VisitorContext): void;
77
+ negative?(n: tree.Negative, ctx?: VisitorContext): VisitorReturn;
78
+ negativeExit?(n: tree.Negative, ctx?: VisitorContext): void;
79
+ func?(n: tree.Func, ctx?: VisitorContext): VisitorReturn;
80
+ funcExit?(n: tree.Func, ctx?: VisitorContext): void;
81
+ jsFunction?(n: tree.JsFunction): VisitorReturn;
82
+ jsFunctionExit?(n: tree.JsFunction, ctx?: VisitorContext): void;
83
+ nil?(n: tree.Nil, ctx?: VisitorContext): VisitorReturn;
84
+ nilExit?(n: tree.Nil, ctx?: VisitorContext): void;
85
+ operation?(n: tree.Operation, ctx?: VisitorContext): VisitorReturn;
86
+ operationExit?(n: tree.Operation, ctx?: VisitorContext): void;
87
+ paren?(n: tree.Paren, ctx?: VisitorContext): VisitorReturn;
88
+ parenExit?(n: tree.Paren, ctx?: VisitorContext): void;
89
+ queryCondition?(n: tree.QueryCondition, ctx?: VisitorContext): VisitorReturn;
90
+ queryConditionExit?(n: tree.QueryCondition, ctx?: VisitorContext): void;
91
+ quoted?(n: tree.Quoted, ctx?: VisitorContext): VisitorReturn;
92
+ quotedExit?(n: tree.Quoted, ctx?: VisitorContext): void;
93
+ ruleset?(n: tree.Ruleset, ctx?: VisitorContext): VisitorReturn;
94
+ rulesetExit?(n: tree.Ruleset, ctx?: VisitorContext): void;
95
+ rules?(n: tree.Rules, ctx?: VisitorContext): VisitorReturn;
96
+ rulesExit?(n: tree.Rules, ctx?: VisitorContext): void;
97
+ attributeSelector?(n: tree.AttributeSelector, ctx?: VisitorContext): VisitorReturn;
98
+ attributeSelectorExit?(n: tree.AttributeSelector, ctx?: VisitorContext): void;
99
+ basicSelector?(n: tree.BasicSelector, ctx?: VisitorContext): VisitorReturn;
100
+ basicSelectorExit?(n: tree.BasicSelector, ctx?: VisitorContext): void;
101
+ selectorList?(n: tree.SelectorList, ctx?: VisitorContext): VisitorReturn;
102
+ selectorListExit?(n: tree.SelectorList, ctx?: VisitorContext): void;
103
+ pseudoSelector?(n: tree.PseudoSelector, ctx?: VisitorContext): VisitorReturn;
104
+ pseudoSelectorExit?(n: tree.PseudoSelector, ctx?: VisitorContext): void;
105
+ compoundSelector?(n: tree.CompoundSelector, ctx?: VisitorContext): VisitorReturn;
106
+ compoundSelectorExit?(n: tree.CompoundSelector, ctx?: VisitorContext): void;
107
+ complexSelector?(n: tree.ComplexSelector, ctx?: VisitorContext): VisitorReturn;
108
+ complexSelectorExit?(n: tree.ComplexSelector, ctx?: VisitorContext): void;
109
+ sequence?(n: tree.Sequence, ctx?: VisitorContext): VisitorReturn;
110
+ sequenceExit?(n: tree.Sequence, ctx?: VisitorContext): void;
111
+ varDeclaration?(n: tree.VarDeclaration, ctx?: VisitorContext): VisitorReturn;
112
+ varDeclarationExit?(n: tree.VarDeclaration, ctx?: VisitorContext): void;
113
+ reference?(n: tree.Reference, ctx?: VisitorContext): VisitorReturn;
114
+ referenceExit?(n: tree.Reference, ctx?: VisitorContext): void;
115
+ styleImport?(n: tree.StyleImport, ctx?: VisitorContext): VisitorReturn;
116
+ styleImportExit?(n: tree.StyleImport, ctx?: VisitorContext): void;
117
+ interpolated?(n: tree.Interpolated, ctx?: VisitorContext): VisitorReturn;
118
+ interpolatedExit?(n: tree.Interpolated, ctx?: VisitorContext): void;
119
+ defaultGuard?(n: tree.DefaultGuard, ctx?: VisitorContext): VisitorReturn;
120
+ defaultGuardExit?(n: tree.DefaultGuard, ctx?: VisitorContext): void;
121
+ rest?(n: tree.Rest, ctx?: VisitorContext): VisitorReturn;
122
+ restExit?(n: tree.Rest, ctx?: VisitorContext): void;
123
+ }
124
+
125
+ export abstract class Visitor {
126
+ private readonly _methodMap = new Map<string, ((n: Node, ctx?: VisitorContext) => VisitorReturn) | false>();
127
+ /** Temporary state, set on first visit and later un-set when exiting */
128
+ protected startNode: Node | undefined;
129
+
130
+ getMethod(s: string) {
131
+ let lower = this._methodMap.get(s);
132
+ /**
133
+ * if we previously looked for the method and it doesn't exist,
134
+ * then explicitly set the map record to false.
135
+ */
136
+ if (!lower && lower !== false) {
137
+ // @ts-expect-error - Its ok if it doesn't exist
138
+ lower = this[lowerFirst(s)];
139
+ this._methodMap.set(s, lower ?? false);
140
+ }
141
+ return lower;
142
+ }
143
+
144
+ protected _visit(n: Node, ctx?: VisitorContext): VisitorReturn {
145
+ let fn = this.getMethod(n.type);
146
+ if (fn) {
147
+ return fn.call(this, n, ctx) ?? n;
148
+ }
149
+ return n;
150
+ }
151
+
152
+ visitExit(n: Node, ctx?: VisitorContext) {
153
+ let fn = this.getMethod(`${n.type}Exit`);
154
+ if (fn) {
155
+ fn.call(this, n, ctx);
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Visit will always return a Node
161
+ */
162
+ visit(n: Node): Node {
163
+ this.startNode = n;
164
+ const originalVisit = this.visit;
165
+ /**
166
+ * Bind to inner _visit, so that all inner calls will not call this current method again
167
+ */
168
+ this.visit = this._visit.bind(this) as typeof this.visit;
169
+ let possibleAbort = this.enter?.(n);
170
+ if (possibleAbort === ABORT) {
171
+ return n;
172
+ }
173
+ let returnVal = this._visit(n);
174
+ this.visit = originalVisit.bind(this);
175
+ /** Apply any final transformations / decisions */
176
+ returnVal = this.exit?.(returnVal) ?? returnVal;
177
+ this.startNode = undefined;
178
+ if (returnVal instanceof Node) {
179
+ return returnVal;
180
+ }
181
+ return n;
182
+ }
183
+ }
184
+
185
+ /**
186
+ * This is a specific visitor type that auto-walks the tree,
187
+ * and optionally mutates children nodes.
188
+ *
189
+ * @note If you are extending this class, you DO NOT HAVE TO
190
+ * manually visit children nodes. This class will do it for you.
191
+ */
192
+ export abstract class TreeVisitor extends Visitor {
193
+ /** Visit children nodes before or after visiting the parent node */
194
+ visitChildren: 'before' | 'after' = 'after';
195
+ visitedNodes = new Set<Node>();
196
+
197
+ constructor(
198
+ public reverse?: boolean
199
+ ) {
200
+ super();
201
+ }
202
+
203
+ override enter(n: tree.Node) {
204
+ this.visitedNodes.clear();
205
+ }
206
+
207
+ override _visit(n: Node, ctx: VisitorContext) {
208
+ if (this.visitedNodes.has(n)) {
209
+ return n;
210
+ }
211
+ this.visitedNodes.add(n);
212
+ const { reverse } = this;
213
+
214
+ // If node has accept() method, let it control traversal
215
+ // This allows nodes to customize traversal (e.g., Less.js compatibility)
216
+ // accept() will visit self and children, so we don't auto-visit here
217
+ const hasAccept = n.accept && typeof n.accept === 'function';
218
+ const hasCustomAccept = hasAccept && n.accept !== Node.prototype.accept;
219
+ if (hasCustomAccept) {
220
+ const returnVal = n.accept(this);
221
+ if (!returnVal || typeof returnVal === 'symbol') {
222
+ return returnVal;
223
+ }
224
+ // accept() already visited self and children, so we just handle exit
225
+ this.visitExit(n, ctx);
226
+ if (returnVal instanceof Node) {
227
+ this.visitedNodes.add(returnVal);
228
+ }
229
+ return returnVal;
230
+ }
231
+
232
+ // Default: auto-visit children (node doesn't have accept() or doesn't override it)
233
+ if (this.visitChildren === 'before') {
234
+ for (const node of n.children(true, reverse, true)) {
235
+ this._visit(node, ctx);
236
+ }
237
+ const returnVal = super._visit(n, ctx);
238
+ /** @node The exit function passes in the original node */
239
+ this.visitExit(n, ctx);
240
+ /** Don't visit new created nodes */
241
+ if (returnVal instanceof Node) {
242
+ this.visitedNodes.add(returnVal);
243
+ }
244
+ return returnVal;
245
+ }
246
+ let returnVal = super._visit(n, ctx);
247
+ if (!returnVal || typeof returnVal === 'symbol') {
248
+ return returnVal;
249
+ }
250
+
251
+ if (returnVal !== n) {
252
+ /** Don't visit new created nodes */
253
+ this.visitedNodes.add(returnVal);
254
+ } else {
255
+ for (const node of n.children(true, reverse, true)) {
256
+ this._visit(node, ctx);
257
+ }
258
+ }
259
+
260
+ this.visitExit(n, ctx);
261
+ return returnVal;
262
+ }
263
+ }
@@ -1,7 +1,8 @@
1
1
  import { Visitor } from './index.js';
2
+
2
3
  /**
3
4
  * A visitor adapter for legacy Less plugins
4
5
  */
5
6
  export class LessVisitor extends Visitor {
6
- }
7
- //# sourceMappingURL=less-visitor.js.map
7
+
8
+ }