@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
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Originally I had custom Hashmaps and ArrayLists, in order to normalize
3
+ * generators and iterators for each. But using non-native collections
4
+ * adds complexity but, more importantly, performance overhead, especially
5
+ * if you don't use those iterators.
6
+ *
7
+ * Even using a Map over an object for a dictionary, in theory, has faster
8
+ * lookups, but in total evaluation time, when the file is parsed, it would
9
+ * be passing in either a Map or an object, and converting the object
10
+ * to a map has object creation overhead, and so does creating the map itself,
11
+ * if you pass in an array of arrays.
12
+ *
13
+ * Maps are good for dynamic property additions and repeated lookups. Nodes
14
+ * look up / evaluate properties, at most, once per node, so an object-as-map
15
+ * will either be faster or the differences will be negligible.
16
+ *
17
+ * So now, data is exceedingly simple. It's all passed in as is when parsing or
18
+ * using the API, and we just have some utility functions in this file to iterate over
19
+ * arrays / objects / simple values and return the values or entries, in any order.
20
+ */
21
+ import type { ConditionalExcept } from 'type-fest';
22
+ import { isNode } from './is-node.js';
23
+ import { N } from '../node-type.js';
24
+ import type { Mixin } from '../mixin.js';
25
+ import type { Rules } from '../rules.js';
26
+ import type { Ruleset } from '../ruleset.js';
27
+ import type { Node } from '../node.js';
28
+
29
+ const { isArray } = Array;
30
+
31
+ /** Fast replacement for lodash isPlainObject — checks constructor === Object */
32
+ export const isPlainObject = (value: unknown): value is Record<string, unknown> =>
33
+ typeof value === 'object' && value !== null && value.constructor === Object;
34
+
35
+ export function atIndex<T>(array: readonly T[], index: number = -1): T | undefined {
36
+ if (index >= 0) {
37
+ return array[index];
38
+ }
39
+ /** Use a negative index to access from the last element */
40
+ return array[array.length + index];
41
+ }
42
+
43
+ /**
44
+ * Entry generators, and this type will yield
45
+ * - [0] the value
46
+ * - [1] the key, if applicable, or the key '__value' for non-objects
47
+ * - [2] the containing object.
48
+ *
49
+ * The purpose of this structure is to iterate and allow replacement
50
+ * of the value in its containing object.
51
+ *
52
+ * The function logic should mirror this type logic.
53
+ */
54
+ type GetEntriesOf<T> = T extends readonly any[]
55
+ ? [T[number], number, T]
56
+ : T extends Node
57
+ ? [Node, Node, Rules]
58
+ : T extends Record<string, infer RecordValue>
59
+ ? RecordValue extends readonly any[]
60
+ ? [RecordValue[number], number, RecordValue]
61
+ : [RecordValue, keyof ConditionalExcept<T, readonly any[]>, T]
62
+ : [T, 'data', T];
63
+
64
+ // type Test = GetEntriesOf<Node<string>>
65
+ // type Test2 = GetEntriesOf<Node<string[]>>
66
+ // type Test3 = GetEntriesOf<Node<{ selector: Node[], foo: 'string' }>>
67
+
68
+ export function* getValues<T>(collection: T, reverse = false): Generator<GetEntriesOf<{ data: T }>[0]> {
69
+ if (isArray(collection)) {
70
+ if (reverse) {
71
+ for (let i = collection.length - 1; i >= 0; i--) {
72
+ yield collection[i]!;
73
+ }
74
+ } else {
75
+ let length = collection.length;
76
+ for (let i = 0; i < length; i++) {
77
+ yield collection[i]!;
78
+ }
79
+ }
80
+ } else if (isPlainObject(collection)) {
81
+ const values = Object.values(collection as Record<string, unknown>);
82
+ for (let value of values) {
83
+ if (isArray(value)) {
84
+ yield* getValues(value, reverse);
85
+ } else {
86
+ yield value;
87
+ }
88
+ }
89
+ } else {
90
+ yield collection;
91
+ }
92
+ }
93
+
94
+ export function* getEntries<T>(collection: T, reverse = false): Generator<GetEntriesOf<T>> {
95
+ if (isArray(collection)) {
96
+ if (reverse) {
97
+ for (let i = collection.length - 1; i >= 0; i--) {
98
+ yield [collection[i]!, i, collection] as GetEntriesOf<T>;
99
+ }
100
+ } else {
101
+ let length = collection.length;
102
+ for (let i = 0; i < length; i++) {
103
+ yield [collection[i]!, i, collection] as GetEntriesOf<T>;
104
+ }
105
+ }
106
+ } else if (isPlainObject(collection)) {
107
+ const entries = Object.entries(collection as Record<string, unknown>);
108
+ for (let [key, value] of entries) {
109
+ if (isArray(value)) {
110
+ yield* getEntries(value, reverse) as Generator<GetEntriesOf<T>>;
111
+ } else {
112
+ yield [value, key, collection] as GetEntriesOf<T>;
113
+ }
114
+ }
115
+ } else if (isNode(collection, N.Mixin | N.Ruleset | N.Rules)) {
116
+ let rules: Node[];
117
+ if ((collection as Node).type === 'Mixin') {
118
+ if ((collection as Mixin).get('params')?.length) {
119
+ throw new Error('We can\'t iterate over a mixin with parameters');
120
+ }
121
+ rules = [...(collection as Mixin).get('rules').value];
122
+ } else if ((collection as Node).type === 'Ruleset') {
123
+ rules = [...(collection as Ruleset).get('rules').value];
124
+ } else if ((collection as Node).type === 'Rules') {
125
+ rules = [...(collection as Rules).value];
126
+ }
127
+ for (let [, value] of rules!.entries()) {
128
+ if (value.type === 'Comment') {
129
+ continue;
130
+ }
131
+ if (!isNode(value, N.Declaration)) {
132
+ throw new Error('We can\'t iterate over rules with non-declarations');
133
+ }
134
+ yield [value.value, value.name, rules!] as unknown as GetEntriesOf<T>;
135
+ }
136
+ } else if (isNode(collection) && isArray((collection as Rules).value)) {
137
+ yield* getEntries((collection as Rules).value as unknown[], reverse) as Generator<GetEntriesOf<T>>;
138
+ } else {
139
+ yield [collection, 'value', collection] as unknown as GetEntriesOf<T>;
140
+ }
141
+ }
142
+
143
+ export function arraysEqual(a: string[], b: string[]) {
144
+ if (a.length !== b.length) {
145
+ return false;
146
+ }
147
+ for (let i = 0; i < a.length; i++) {
148
+ if (a[i] !== b[i]) {
149
+ return false;
150
+ }
151
+ }
152
+ return true;
153
+ }
154
+
155
+ type TraversalFrame = {
156
+ items: Node[];
157
+ index: number;
158
+ };
159
+
160
+ type TraversalMark = {
161
+ stack: TraversalFrame[];
162
+ };
163
+
164
+ type NodeTraversalOptions = {
165
+ includeSelf?: boolean;
166
+ deep?: boolean;
167
+ reverse?: boolean;
168
+ includePrePost?: boolean;
169
+ };
170
+
171
+ function cloneFrames(frames: TraversalFrame[]): TraversalFrame[] {
172
+ return frames.map(frame => ({
173
+ items: frame.items,
174
+ index: frame.index
175
+ }));
176
+ }
177
+
178
+ function collectDirectNodes(
179
+ node: Node,
180
+ reverse = false,
181
+ includePrePost = false
182
+ ): Node[] {
183
+ const result: Node[] = [];
184
+ const keys = (node.constructor as typeof Node).childKeys;
185
+
186
+ if (keys) {
187
+ const keyList = reverse ? [...keys].reverse() : keys;
188
+
189
+ for (const key of keyList) {
190
+ // Read from instance field directly (node[key]) instead of node.data[key],
191
+ // because array containers' .data getter returns the array itself, not { value: array }.
192
+ const nodeVal = (node as unknown as Record<string, unknown>)[key!];
193
+ if (isArray(nodeVal)) {
194
+ const items = reverse ? [...nodeVal].reverse() : nodeVal;
195
+ for (const item of items) {
196
+ if (isNode(item)) {
197
+ if (includePrePost) {
198
+ result.push(...item.nodeAndPrePost());
199
+ } else {
200
+ result.push(item);
201
+ }
202
+ }
203
+ }
204
+ } else if (isNode(nodeVal)) {
205
+ if (includePrePost) {
206
+ result.push(...nodeVal.nodeAndPrePost());
207
+ } else {
208
+ result.push(nodeVal);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ // Leaf nodes (keys === null) have no child nodes to collect
214
+
215
+ return result;
216
+ }
217
+
218
+ export class NodeTraversalCursor implements IterableIterator<Node> {
219
+ private stack: TraversalFrame[] = [];
220
+ private readonly deep: boolean;
221
+ private readonly reverse: boolean;
222
+ private readonly includePrePost: boolean;
223
+
224
+ constructor(root: Node, options: NodeTraversalOptions = {}) {
225
+ const {
226
+ includeSelf = false,
227
+ deep = false,
228
+ reverse = false,
229
+ includePrePost = false
230
+ } = options;
231
+
232
+ this.deep = deep;
233
+ this.reverse = reverse;
234
+ this.includePrePost = includePrePost;
235
+
236
+ const initialItems = includeSelf
237
+ ? includePrePost
238
+ ? [...root.nodeAndPrePost()]
239
+ : [root]
240
+ : collectDirectNodes(root, reverse, includePrePost);
241
+
242
+ this.stack.push({
243
+ items: initialItems,
244
+ index: 0
245
+ });
246
+ }
247
+
248
+ [Symbol.iterator](): IterableIterator<Node> {
249
+ return this;
250
+ }
251
+
252
+ next(): IteratorResult<Node> {
253
+ while (this.stack.length > 0) {
254
+ const frame = this.stack[this.stack.length - 1]!;
255
+
256
+ if (frame.index >= frame.items.length) {
257
+ this.stack.pop();
258
+ continue;
259
+ }
260
+
261
+ const node = frame.items[frame.index++]!;
262
+
263
+ if (this.deep) {
264
+ const children = collectDirectNodes(
265
+ node,
266
+ this.reverse,
267
+ this.includePrePost
268
+ );
269
+
270
+ if (children.length > 0) {
271
+ this.stack.push({
272
+ items: children,
273
+ index: 0
274
+ });
275
+ }
276
+ }
277
+
278
+ return {
279
+ done: false,
280
+ value: node
281
+ };
282
+ }
283
+
284
+ return {
285
+ done: true,
286
+ value: undefined as never
287
+ };
288
+ }
289
+
290
+ mark(): TraversalMark {
291
+ return {
292
+ stack: cloneFrames(this.stack)
293
+ };
294
+ }
295
+
296
+ restore(mark: TraversalMark): void {
297
+ this.stack = cloneFrames(mark.stack);
298
+ }
299
+ }
@@ -0,0 +1,90 @@
1
+ import { isNode } from './is-node.js';
2
+ import isObject from 'lodash-es/isObject.js';
3
+ import { type Node } from '../node.js';
4
+ import type { EqualityMode } from '../../types/modes.js';
5
+
6
+ export function compare(a: any, b: any, mode: EqualityMode = 'coerce') {
7
+ if (a === b) {
8
+ return 0;
9
+ }
10
+ if (!isObject(a) && !isObject(b)) {
11
+ return a > b ? 1 : -1;
12
+ }
13
+ if (isNode(a) && isNode(b)) {
14
+ return a.compare(b);
15
+ }
16
+ /** Do comparison without strict equality */
17
+ if (mode === 'coerce' && a == b) {
18
+ return 0;
19
+ }
20
+ return undefined;
21
+ }
22
+
23
+ /**
24
+ * Find the actual source order of two nodes, by comparing
25
+ * their position in their lowest common ancestor in the tree.
26
+ */
27
+ export function comparePosition(a: Node, b: Node) {
28
+ if (a === b) {
29
+ return 0;
30
+ }
31
+
32
+ const pathToRoot = (node: Node): Node[] => {
33
+ const path: Node[] = [];
34
+ let current: Node | undefined = node;
35
+ let guard = 0;
36
+ while (current && guard < 1024) {
37
+ path.push(current);
38
+ current = current.parent;
39
+ guard++;
40
+ }
41
+ return path;
42
+ };
43
+
44
+ const aPath = pathToRoot(a);
45
+ const bPath = pathToRoot(b);
46
+ let ai = aPath.length - 1;
47
+ let bi = bPath.length - 1;
48
+ let commonAncestor: Node | undefined;
49
+
50
+ while (ai >= 0 && bi >= 0 && aPath[ai] === bPath[bi]) {
51
+ commonAncestor = aPath[ai];
52
+ ai--;
53
+ bi--;
54
+ }
55
+
56
+ if (!commonAncestor) {
57
+ return 0;
58
+ }
59
+
60
+ const aChild = ai >= 0 ? aPath[ai] : a;
61
+ const bChild = bi >= 0 ? bPath[bi] : b;
62
+ const aIndex = Number.isFinite(aChild.index) ? aChild.index : 0;
63
+ const bIndex = Number.isFinite(bChild.index) ? bChild.index : 0;
64
+ return aIndex - bIndex;
65
+ }
66
+
67
+ export function compareNodeArray(a: any[], b: any[], mode: EqualityMode = 'coerce'): 0 | 1 | -1 | undefined {
68
+ let output: 0 | 1 | -1 | undefined;
69
+
70
+ if (a.length !== b.length) {
71
+ return undefined;
72
+ }
73
+
74
+ /**
75
+ * All values must be equal, or less than, or greater than.
76
+ * Anything else is undefined.
77
+ */
78
+ for (let i = 0; i < a.length; i++) {
79
+ let result = compare(a[i]!, b[i]!, mode);
80
+ if (result === undefined) {
81
+ return undefined;
82
+ }
83
+ if (output === undefined) {
84
+ output = result;
85
+ } else if (result !== output) {
86
+ return undefined;
87
+ }
88
+ }
89
+ return output;
90
+ }
@@ -0,0 +1,171 @@
1
+ import { CANONICAL, type Cursor, type Node, type NodeEdge, type RenderKey } from '../node.js';
2
+
3
+ function nodeFields(node: Node): Record<string, unknown> {
4
+ return node as unknown as Record<string, unknown>;
5
+ }
6
+
7
+ function getSingularEdgeStore(
8
+ node: Node,
9
+ key: string
10
+ ): NodeEdge<Node> | undefined {
11
+ return nodeFields(node)[`${key}Edge`] as NodeEdge<Node> | undefined;
12
+ }
13
+
14
+ function getIndexedEdgeStore(
15
+ node: Node,
16
+ key: string
17
+ ): Array<NodeEdge<Node> | undefined> | undefined {
18
+ return nodeFields(node)[`${key}Edges`] as Array<NodeEdge<Node> | undefined> | undefined;
19
+ }
20
+
21
+ function setSingularEdgeStore(
22
+ node: Node,
23
+ key: string,
24
+ edge: NodeEdge<Node>
25
+ ): void {
26
+ nodeFields(node)[`${key}Edge`] = edge;
27
+ }
28
+
29
+ function setIndexedEdgeStore(
30
+ node: Node,
31
+ key: string,
32
+ edges: Array<NodeEdge<Node> | undefined>
33
+ ): void {
34
+ nodeFields(node)[`${key}Edges`] = edges;
35
+ }
36
+
37
+ export function lookupEdge<T>(
38
+ edges: NodeEdge<T> | undefined,
39
+ key: RenderKey
40
+ ): T | undefined {
41
+ return edges?.get(key);
42
+ }
43
+
44
+ /**
45
+ * Resolve the primary parent cursor for a node/render-key pair.
46
+ *
47
+ * This mirrors `getParent(...)` at the cursor layer:
48
+ * - prefer the active render-key parent edge
49
+ * - fall back to canonical `node.parent`
50
+ *
51
+ * It deliberately does not follow secondary lanes such as `CALLER`. Traversals that
52
+ * want caller fallback must opt into that separately so the main render path stays
53
+ * stable and predictable.
54
+ */
55
+ export function getParentEdge(cursor: Cursor): Cursor | undefined {
56
+ const overridden = lookupEdge(cursor.node.parentEdges, cursor.renderKey);
57
+ if (overridden !== undefined) {
58
+ return overridden ? { node: overridden, renderKey: cursor.renderKey } : undefined;
59
+ }
60
+
61
+ return cursor.node.parent
62
+ ? { node: cursor.node.parent, renderKey: cursor.renderKey }
63
+ : undefined;
64
+ }
65
+
66
+ export function getEdge(cursor: Cursor, key: string): Cursor | undefined {
67
+ const edge = getSingularEdgeStore(cursor.node, key);
68
+ if (edge) {
69
+ const overridden = lookupEdge(edge, cursor.renderKey);
70
+ if (overridden !== undefined) {
71
+ return overridden ? { node: overridden, renderKey: cursor.renderKey } : undefined;
72
+ }
73
+ }
74
+
75
+ const canonicalChild = nodeFields(cursor.node)[key] as Node | undefined;
76
+ return canonicalChild ? { node: canonicalChild, renderKey: cursor.renderKey } : undefined;
77
+ }
78
+
79
+ export function getEdgeAt(cursor: Cursor, key: string, index: number): Cursor | undefined {
80
+ const edges = getIndexedEdgeStore(cursor.node, key);
81
+ if (edges) {
82
+ const overridden = lookupEdge(edges[index], cursor.renderKey);
83
+ if (overridden !== undefined) {
84
+ return overridden ? { node: overridden, renderKey: cursor.renderKey } : undefined;
85
+ }
86
+ }
87
+
88
+ const canonicalList = nodeFields(cursor.node)[key] as Node[] | undefined;
89
+ const canonicalChild = canonicalList?.[index];
90
+ return canonicalChild ? { node: canonicalChild, renderKey: cursor.renderKey } : undefined;
91
+ }
92
+
93
+ export function addEdge(
94
+ node: Node,
95
+ key: string,
96
+ renderKey: RenderKey,
97
+ child: Node
98
+ ): void {
99
+ if (renderKey === CANONICAL) {
100
+ const canonicalChild = nodeFields(node)[key] as Node | undefined;
101
+ if (canonicalChild === child) {
102
+ return;
103
+ }
104
+ throw new Error(`Cannot add a second CANONICAL edge for ${node.type}.${key}`);
105
+ }
106
+ const edge = getSingularEdgeStore(node, key) ?? new Map<RenderKey, Node>();
107
+ edge.set(renderKey, child);
108
+ setSingularEdgeStore(node, key, edge);
109
+ }
110
+
111
+ export function addEdgeAt(
112
+ node: Node,
113
+ key: string,
114
+ index: number,
115
+ renderKey: RenderKey,
116
+ child: Node
117
+ ): void {
118
+ if (renderKey === CANONICAL) {
119
+ const canonicalList = nodeFields(node)[key] as Node[] | undefined;
120
+ const canonicalChild = canonicalList?.[index];
121
+ if (canonicalChild === child) {
122
+ return;
123
+ }
124
+ throw new Error(`Cannot add a second CANONICAL edge for ${node.type}.${key}[${index}]`);
125
+ }
126
+ const indexedEdges = getIndexedEdgeStore(node, key) ?? [];
127
+ const edge = indexedEdges[index] ?? new Map<RenderKey, Node>();
128
+ edge.set(renderKey, child);
129
+ indexedEdges[index] = edge;
130
+ setIndexedEdgeStore(node, key, indexedEdges);
131
+ }
132
+
133
+ export function addParentEdge(
134
+ node: Node,
135
+ renderKey: RenderKey,
136
+ parent: Node
137
+ ): void {
138
+ /**
139
+ * Parent edges represent render-placement overrides, not a second canonical parent.
140
+ *
141
+ * Invariants:
142
+ * - `CANONICAL` must continue to live on `node.parent`
143
+ * - non-canonical writes may override the active parent for a render key
144
+ * - special keys such as `CALLER` are allowed here, but they are secondary lanes;
145
+ * they should not be treated as the default upward render path unless a traversal
146
+ * explicitly asks for them
147
+ */
148
+ if (renderKey === CANONICAL) {
149
+ if (node.parent === parent) {
150
+ return;
151
+ }
152
+ throw new Error(`Cannot add a second CANONICAL parent edge for ${node.type}`);
153
+ }
154
+ const edge = node.parentEdges ?? new Map<RenderKey, Node>();
155
+ edge.set(renderKey, parent);
156
+ node.parentEdges = edge;
157
+ }
158
+
159
+ export function removeParentEdge(
160
+ node: Node,
161
+ renderKey: RenderKey
162
+ ): void {
163
+ const edge = node.parentEdges;
164
+ if (!edge) {
165
+ return;
166
+ }
167
+ edge.delete(renderKey);
168
+ if (edge.size === 0) {
169
+ node.parentEdges = undefined;
170
+ }
171
+ }