@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,227 @@
1
+ # Why Were These Unused Functions Created? - LLM Analysis
2
+
3
+ ## Overview
4
+ Based on the EXTEND_AUDIT.md (dated 2024-12-19) and code analysis, these unused functions appear to be the result of an **incomplete refactoring attempt** where an LLM tried to extract and consolidate logic but never fully integrated the new functions.
5
+
6
+ ## Pattern: Incomplete Refactoring
7
+
8
+ The unused functions fall into two categories:
9
+ 1. **Extraction attempts** - Functions created to consolidate scattered logic, but the original inline code was never replaced
10
+ 2. **Defensive programming** - Functions created "just in case" for error handling scenarios that never materialized
11
+
12
+ ---
13
+
14
+ ## 1. `handleCompoundFullExtend` - Extraction Attempt
15
+
16
+ ### Why It Was Created
17
+ Looking at the EXTEND_AUDIT.md and code comments, this function was created to:
18
+ - **Consolidate compound selector handling in full mode**
19
+ - Handle the special case of compound selectors containing `:is()` pseudo-selectors
20
+ - Process all matching components (including `:is()` matches) in a single loop
21
+ - Provide a cleaner separation of concerns
22
+
23
+ ### The Problem
24
+ The comment at line 1376 says: *"handleCompoundFullExtend is only for special cases like extending within :is() pseudo-selectors"*
25
+
26
+ But the actual logic for compound selectors in full mode is **already handled inline** in `extendSelector` at lines 1160-1203. The function was created but **never called** - the inline implementation was kept instead.
27
+
28
+ ### LLM Reasoning Pattern
29
+ An LLM likely:
30
+ 1. Saw the complex inline logic for compound selectors in full mode
31
+ 2. Thought "this should be extracted into a function for clarity"
32
+ 3. Created `handleCompoundFullExtend` with the extracted logic
33
+ 4. **Forgot to actually call it** or decided the inline version was better
34
+ 5. Left both versions in the code
35
+
36
+ This is a classic "extract function but forget to use it" pattern.
37
+
38
+ ---
39
+
40
+ ## 2. `createValidatedIsWrapper` - Defensive Programming / Alternative Approach
41
+
42
+ ### Why It Was Created
43
+ From EXTEND_AUDIT.md line 38-53:
44
+ - Created as a **fallback mechanism** for validation errors
45
+ - Returns fallback selector instead of throwing
46
+ - Has context-aware validation
47
+
48
+ ### The Problem
49
+ The codebase **always throws errors** on validation failures (using `createValidatedIsWrapperWithErrors`). The fallback behavior was never needed or used.
50
+
51
+ ### LLM Reasoning Pattern
52
+ An LLM likely:
53
+ 1. Thought "what if validation fails? Should we have a fallback?"
54
+ 2. Created the fallback version "just in case"
55
+ 3. But the actual code always uses the throwing version
56
+ 4. The fallback version was never integrated
57
+
58
+ This is **defensive programming gone wrong** - creating functionality "just in case" that never gets used.
59
+
60
+ ---
61
+
62
+ ## 3. `createValidatedCompoundSelector` - Same Pattern
63
+
64
+ ### Why It Was Created
65
+ Same as `createValidatedIsWrapper`:
66
+ - Fallback mechanism for compound selector validation
67
+ - Returns fallback instead of throwing
68
+
69
+ ### The Problem
70
+ Only `createValidatedCompoundSelectorWithErrors` (which throws) is used. The fallback version was never needed.
71
+
72
+ ### LLM Reasoning Pattern
73
+ Same defensive programming pattern - created as an alternative approach that was never adopted.
74
+
75
+ ---
76
+
77
+ ## 4. `isValidCompoundSelector` - Legacy / Duplicate Implementation
78
+
79
+ ### Why It Was Created
80
+ This function appears to be a **simpler, older version** of `validateCompoundSelector`:
81
+ - Returns boolean instead of detailed error information
82
+ - Simpler implementation (just counts elements/IDs)
83
+ - Recursive for nested compounds
84
+
85
+ ### The Problem
86
+ `validateCompoundSelector` (lines 2022-2069) has its own complete implementation that:
87
+ - Returns detailed error information
88
+ - Has better error messages
89
+ - Is actually used throughout the codebase
90
+
91
+ `isValidCompoundSelector` was likely the **original implementation** that was replaced by `validateCompoundSelector`, but never removed.
92
+
93
+ ### LLM Reasoning Pattern
94
+ An LLM likely:
95
+ 1. Started with `isValidCompoundSelector` (simple boolean check)
96
+ 2. Realized it needed more detailed error information
97
+ 3. Created `validateCompoundSelector` with better error reporting
98
+ 4. **Forgot to remove the old version**
99
+
100
+ This is a **refactoring artifact** - old code left behind after improvement.
101
+
102
+ ---
103
+
104
+ ## 5. `getIsSelectorArg` - Utility Function for Unused Code
105
+
106
+ ### Why It Was Created
107
+ A simple utility to extract the `:is()` argument from a component:
108
+ - Checks if component is `:is()` pseudo-selector
109
+ - Returns the SelectorList argument if valid
110
+ - Clean, reusable utility
111
+
112
+ ### The Problem
113
+ Only used by `handleCompoundFullExtend`, which itself is unused. The utility is fine, but it's **orphaned** because its only consumer was never integrated.
114
+
115
+ ### LLM Reasoning Pattern
116
+ Created as a helper for `handleCompoundFullExtend`. When `handleCompoundFullExtend` wasn't integrated, this utility became orphaned.
117
+
118
+ ---
119
+
120
+ ## 6. `extendWithinIsArg` - Thin Wrapper for Unused Code
121
+
122
+ ### Why It Was Created
123
+ A thin wrapper around `extendSelector` for extending within `:is()` arguments:
124
+ - Sets specific flags (`partial: false`, `skipAmpersandCheck: true`, `hasMoreAfterIs`)
125
+ - Provides a clean API for this specific use case
126
+
127
+ ### The Problem
128
+ Only used by `handleCompoundFullExtend`, which is unused. The wrapper is fine, but **orphaned** like `getIsSelectorArg`.
129
+
130
+ ### LLM Reasoning Pattern
131
+ Created as a convenience wrapper for `handleCompoundFullExtend`. When that function wasn't integrated, this became orphaned.
132
+
133
+ ---
134
+
135
+ ## Root Cause Analysis
136
+
137
+ ### Why LLMs Create Unused Functions
138
+
139
+ 1. **Incomplete Refactoring**
140
+ - Extract logic into a function
141
+ - Forget to replace the original code with a call to the new function
142
+ - Both versions remain in the codebase
143
+
144
+ 2. **Defensive Programming**
145
+ - Create alternative implementations "just in case"
146
+ - Never actually use them because the primary approach works fine
147
+ - Leave them in "for future use" that never comes
148
+
149
+ 3. **Refactoring Artifacts**
150
+ - Create improved version of a function
151
+ - Forget to remove the old version
152
+ - Both remain in codebase
153
+
154
+ 4. **Orphaned Dependencies**
155
+ - Create helper functions for a main function
156
+ - Main function never gets integrated
157
+ - Helpers become orphaned
158
+
159
+ ### Common LLM Patterns
160
+
161
+ 1. **"Extract but don't integrate"** - Creates cleaner functions but doesn't replace inline code
162
+ 2. **"Create alternatives"** - Makes multiple versions (with/without errors, with/without fallbacks)
163
+ 3. **"Forget to clean up"** - Leaves old versions when creating new ones
164
+ 4. **"Build infrastructure"** - Creates utilities for functions that never get used
165
+
166
+ ### Why This Happens
167
+
168
+ LLMs often:
169
+ - Focus on **creating** code more than **integrating** it
170
+ - Create multiple approaches and forget to choose one
171
+ - Don't trace through the full call graph to verify integration
172
+ - Leave "just in case" code that seems useful but never gets used
173
+
174
+ ---
175
+
176
+ ## Lessons Learned
177
+
178
+ 1. **Always trace the call graph** - Verify functions are actually called
179
+ 2. **Remove old versions** - When creating improved versions, remove the old ones
180
+ 3. **Choose one approach** - Don't create multiple alternatives without choosing
181
+ 4. **Complete refactorings** - If extracting logic, actually replace the original
182
+ 5. **Avoid "just in case" code** - Only create what's actually needed
183
+
184
+ ---
185
+
186
+ ## Summary
187
+
188
+ These unused functions represent **incomplete refactoring attempts** where:
189
+ - Logic was extracted but never integrated (`handleCompoundFullExtend`)
190
+ - Alternative approaches were created but never adopted (`createValidatedIsWrapper`, `createValidatedCompoundSelector`)
191
+ - Old versions were left behind when new ones were created (`isValidCompoundSelector`)
192
+ - Helper functions were orphaned when their consumers weren't integrated (`getIsSelectorArg`, `extendWithinIsArg`)
193
+
194
+ ### Evidence from EXTEND_AUDIT.md (2024-12-19)
195
+
196
+ The audit document shows a similar pattern with `handleFullExtend`:
197
+ - **Was marked as UNUSED** in the audit
198
+ - **Was recommended to be INTEGRATED** (line 209: "SHOULD BE INTEGRATED")
199
+ - **Actually WAS integrated** - it's now called at line 1054 in `extendSelector`
200
+
201
+ This shows the pattern: an LLM created `handleFullExtend`, it was identified as unused, then **later integrated**. But `handleCompoundFullExtend` followed the same pattern and **never got integrated**.
202
+
203
+ ### The Pattern
204
+
205
+ 1. **First attempt**: Create `handleFullExtend` - initially unused, later integrated ✅
206
+ 2. **Second attempt**: Create `handleCompoundFullExtend` - created but never integrated ❌
207
+ 3. **Result**: One function integrated, one left behind
208
+
209
+ This suggests **multiple refactoring sessions** where:
210
+ - Some functions got integrated (`handleFullExtend`)
211
+ - Others were created but forgotten (`handleCompoundFullExtend`)
212
+ - The integration was incomplete
213
+
214
+ ### Why This Happens to LLMs
215
+
216
+ 1. **Session boundaries** - Different refactoring sessions, incomplete integration
217
+ 2. **Scope creep** - Start extracting one function, create others, forget to finish
218
+ 3. **Copy-paste patterns** - See `handleFullExtend` works, create `handleCompoundFullExtend` similarly, but forget to call it
219
+ 4. **Incomplete testing** - Create functions, test passes (because old code still works), forget to integrate
220
+
221
+ The pattern suggests an LLM was trying to improve code organization but didn't complete the refactoring by:
222
+ 1. Actually calling the new functions
223
+ 2. Removing the old implementations
224
+ 3. Cleaning up orphaned dependencies
225
+ 4. Following through on all extraction attempts, not just some
226
+
227
+ This is a common issue when refactoring - it's easy to create new code, harder to fully integrate it and remove the old. The fact that `handleFullExtend` WAS integrated shows the intent was there, but the follow-through was incomplete.
@@ -0,0 +1,12 @@
1
+ # Node Copy Reduction Plan
2
+
3
+ The canonical dev-facing docs for this plan now live under root `docs/`.
4
+
5
+ Read these instead:
6
+
7
+ - `docs/future/node-copy-reduction/README.md`
8
+ - `docs/future/node-copy-reduction/migration.md`
9
+ - `docs/future/node-copy-reduction/subsystems.md`
10
+
11
+ This package-local file is left only as a pointer because the work applies across
12
+ the eval/runtime architecture, not just `packages/core/src/tree/util`.
@@ -0,0 +1,59 @@
1
+ # Extend test index (core)
2
+
3
+ This doc exists to make **extend-related tests** easy to find (especially for LLM-assisted debugging).
4
+
5
+ **Before changing extend logic:** See `../EXTEND_RULES.md` for the single set of rules and the header comments in `../extend.ts` for implementation context. Keep operational “what to run / where to look” guidance in Cursor-native files (e.g. `.cursor/rules/subtrees/core__extend.mdc`).
6
+
7
+ Historical deep-dive audits and refactoring notes were archived/removed from this directory to reduce noise; use git history if you need them.
8
+
9
+ ## “Where are the extend tests?”
10
+
11
+ There are two main clusters:
12
+
13
+ ### 1) Extend **integration** tests (eval → toString)
14
+ - `src/tree/__tests__/extend-eval-integration.test.ts`
15
+ - High-level behavior checks across eval + serialization.
16
+ - Includes the rule: **Exact extend matches a single OR-branch** (does not require all `:is(...)` branches).
17
+
18
+ ### 2) Extend **utility / algorithm** tests
19
+ Located in `src/tree/util/__tests__/`:
20
+
21
+ - `extend-core-unit.test.ts`
22
+ - Main focused unit suite for the rebuilt `tryExtendSelector()` path in `extend-core.ts`.
23
+ - This is the current source of truth for exact vs partial rewriting, ampersand crossing/hoisting, and seam-aware rewrite behavior.
24
+
25
+ - `selector-match-unit.test.ts`
26
+ - Main focused unit suite for `selectorMatch()` in `selector-match-core.ts`.
27
+ - This is the current source of truth for selector comparison/matching semantics, alternates, pseudo boundaries, and ampersand crossing detection.
28
+
29
+ - `extend-comment-handling.test.ts`
30
+ - Legacy-but-still-distinct coverage for comment preservation/duplication behavior.
31
+
32
+ - `extend-ampersand-boundary.test.ts`
33
+ - Legacy boundary-oriented tests that still exercise nested/ruleset-level ampersand behavior.
34
+
35
+ - `process-extends.test.ts`
36
+ - Tests orchestration / application ordering for registered extends.
37
+
38
+ - `extend-pipeline-bench.test.ts`
39
+ - Bench coverage, not a primary behavior suite.
40
+
41
+ ## Extend evaluation / ruleset plumbing (non-util tests)
42
+
43
+ - `src/tree/__tests__/extend-rules.test.ts`
44
+ - Extend behavior inside rulesets; includes chaining-related expectations.
45
+
46
+ - `src/tree/__tests__/extend-roots.test.ts`
47
+ - Extend root registry / hoisting behavior.
48
+
49
+ - `src/tree/__tests__/extend-import-style.test.ts`
50
+ - Extend interaction with import-style logic.
51
+
52
+ ## What’s missing / where to add new coverage
53
+
54
+ If you are fixing a fixture like `tests-unit/extend-exact/extend-exact.less`, the most “direct” core place to add a reproduction is:
55
+
56
+ - `src/tree/__tests__/extend-eval-integration.test.ts` (if it’s an eval/print behavior)
57
+ - `src/tree/util/__tests__/selector-match-unit.test.ts` (if it’s primarily a matcher problem)
58
+ - `src/tree/util/__tests__/extend-core-unit.test.ts` (if it’s primarily a rewrite problem)
59
+ - `src/tree/util/__tests__/extend-ampersand-boundary.test.ts` (if it’s specifically about implicit `&` / parent prefix crossings)
@@ -0,0 +1,130 @@
1
+ # ExtendLocation API Optimization Analysis
2
+
3
+ ## Summary
4
+
5
+ After migrating from the legacy `matchSelectors` API to the new `findExtendableLocations` API, we have successfully maintained and verified the performance optimizations that were crucial for the extend functionality. The optimization system provides significant performance improvements ranging from **1.3x to 31x speedup** depending on the scenario.
6
+
7
+ ## Benchmark Test Suite
8
+
9
+ The comprehensive benchmark test suite in `selector-benchmark.test.ts` validates all optimization layers:
10
+
11
+ ## Optimization Layers Analysis
12
+
13
+ ### OPTIMIZATION 1: Exact Match Cache
14
+ - **Performance**: 1.3x speedup for exact matches
15
+ - **Purpose**: Cache identical selector matches to avoid redundant computation
16
+ - **Impact**: Moderate improvement for exact matches, most beneficial for repeated operations
17
+
18
+ ### OPTIMIZATION 2 & 3: KeySet Fast Rejection
19
+ - **Performance**: 9.3x to 14.6x speedup for disjoint/non-subset selectors
20
+ - **Purpose**: Early bailout for impossible matches using set theory
21
+ - **Impact**: **Highest impact optimization** - eliminates expensive tree traversal for most non-matching cases
22
+
23
+ ### OPTIMIZATION 4: Fast Path Patterns
24
+ - **Performance**: 1.6x to 4.8x speedup for common selector patterns
25
+ - **Purpose**: Optimized algorithms for frequent CSS patterns (simple-to-simple, compound-to-simple, etc.)
26
+ - **Impact**: Good improvement for typical CSS use cases
27
+
28
+ ## Real-World Performance Impact
29
+
30
+ ### Non-Matching Scenarios (Most Common)
31
+ In real stylesheets, the vast majority of extend operations don't find matches. These scenarios show the most dramatic improvements:
32
+
33
+ - **Simple different classes**: 5.4x speedup
34
+ - **Different IDs**: 5.2x speedup
35
+ - **Disjoint compounds**: 10.6x speedup
36
+ - **Complex different structures**: **31.0x speedup**
37
+
38
+ ### Overall Performance
39
+ - **Average speedup across all scenarios**: 4.2x
40
+ - **Best case speedup**: 31x (complex non-matching selectors)
41
+ - **Worst case**: Still maintains correctness with minimal overhead
42
+
43
+ ## Why These Optimizations Are Worthwhile
44
+
45
+ ### 1. **Volume Characteristics**
46
+ Real CSS stylesheets contain thousands of selectors, and extend operations are tested against most of them. A 10x speedup on operations that happen thousands of times results in massive compilation time savings.
47
+
48
+ ### 2. **Non-Match Dominance**
49
+ In typical extend scenarios, 90%+ of selector comparisons result in no match. Our optimizations are specifically designed to fast-reject these cases with minimal computation.
50
+
51
+ ### 3. **Complexity Scaling**
52
+ Without optimizations, complex selectors with :is(), nested structures, and long combinator chains become exponentially expensive. The optimizations provide linear or near-constant time rejection for most cases.
53
+
54
+ ### 4. **Cache Locality**
55
+ The KeySet optimization works on compact bit-sets rather than full AST traversal, providing better CPU cache performance.
56
+
57
+ ## Test Results Summary
58
+
59
+ ### KeySet Fast Rejection (Most Important)
60
+ ```
61
+ 🔥 OPTIMIZATION 2 & 3: KeySet Fast Rejection
62
+ ===============================================
63
+ 🏁 Disjoint selectors (with KeySet rejection)
64
+ Total: 10.26ms
65
+ Average: 0.0001ms per operation
66
+ Ops/sec: 9,743,937
67
+ 🏁 Disjoint selectors (no KeySet rejection)
68
+ Total: 148.25ms
69
+ Average: 0.0015ms per operation
70
+ Ops/sec: 674,555
71
+ 🚀 KeySet rejection speedup: 14.4x
72
+ ```
73
+
74
+ ### Fast Path Patterns
75
+ ```
76
+ 🔥 OPTIMIZATION 4: Fast Path Patterns
77
+ ======================================
78
+ 🏁 Simple to Simple (with fast path)
79
+ Ops/sec: 8,629,182
80
+ 🏁 Simple to Simple (no fast path)
81
+ Ops/sec: 2,039,328
82
+ 🚀 Simple to Simple speedup: 4.2x
83
+
84
+ 🏁 Complex Selector (short) (with fast path)
85
+ Ops/sec: 11,296,670
86
+ 🏁 Complex Selector (short) (no fast path)
87
+ Ops/sec: 2,345,454
88
+ 🚀 Complex Selector speedup: 4.8x
89
+ ```
90
+
91
+ ### Non-Matching Scenarios (Real-World Critical)
92
+ ```
93
+ 🔥 NON-MATCHING SCENARIOS (Most Common)
94
+ ========================================
95
+ 🏁 Complex with different structure (optimized)
96
+ Ops/sec: 5,954,951
97
+ 🏁 Complex with different structure (unoptimized)
98
+ Ops/sec: 192,076
99
+ 🚀 Complex with different structure speedup: 31.0x
100
+ ```
101
+
102
+ ## Verification of Correctness
103
+
104
+ All optimizations maintain semantic correctness:
105
+ - ✅ Same `hasMatches` results between optimized and unoptimized paths
106
+ - ✅ All existing extend algorithm tests pass (10/10)
107
+ - ✅ Optimizations only affect performance, not behavior
108
+
109
+ ## Individual Optimization Testing
110
+
111
+ The benchmark suite can disable each optimization individually:
112
+
113
+ 1. **`findExtendableLocationsNoExactCache`** - Bypasses exact match caching
114
+ 2. **`findExtendableLocationsNoKeySetRejection`** - Bypasses KeySet fast rejection
115
+ 3. **`findExtendableLocationsNoFastPath`** - Bypasses fast path patterns
116
+ 4. **`findExtendableLocationsNoOptimizations`** - Bypasses all optimizations
117
+
118
+ This allows us to measure the individual contribution of each optimization layer and verify that they work correctly in isolation.
119
+
120
+ ## Conclusion
121
+
122
+ The optimization system migrated to the new ExtendLocation API is **highly effective** and **well-justified**:
123
+
124
+ 1. **Provides 4.2x average speedup** across diverse scenarios
125
+ 2. **Up to 31x speedup** for the most common case (non-matching complex selectors)
126
+ 3. **Maintains perfect correctness** - all functionality tests pass
127
+ 4. **Scales well** - performance improves dramatically as selector complexity increases
128
+ 5. **Real-world impact** - optimizes the 90%+ case of non-matching selectors that dominate extend operations
129
+
130
+ The optimizations are essential for making the extend functionality performant in real-world CSS codebases with thousands of selectors.
@@ -0,0 +1,138 @@
1
+ # Walk-and-Consume Algorithm Design
2
+
3
+ ## Current Architecture (3-Phase Pipeline)
4
+
5
+ The current extend pipeline has three separate traversal phases:
6
+
7
+ 1. **Search**: `findExtendableLocations(target, find)` → walks the AST, collects `ExtendLocation[]`
8
+ 2. **Classify**: `selectorCompare(target, find)` → another traversal to determine match type
9
+ 3. **Apply**: `extendSelector(target, find, extendWith, partial)` → uses locations to decide
10
+ what transformation to apply, then constructs new AST nodes
11
+
12
+ ### Where the Time Goes
13
+
14
+ | Hotspot | Cause | Status |
15
+ |---------|-------|--------|
16
+ | `applyExtendsToSelector` growing list | O(N²) for N same-target instructions | **Fixed** (batched) |
17
+ | `selectorCompare` SelectorList sort | O(N log N) per comparison | **Fixed** (Set-based) |
18
+ | `areCompoundSelectorsEquivalent` expansion | (N+1)^K combinatorial explosion | **Fixed** (pointer walk) |
19
+ | `processExtends` per-instruction diagnostics | O(I) × cost_per_extend per ruleset | **Not fixed** |
20
+ | Triple traversal per extend call | search + classify + apply | **Not fixed** |
21
+
22
+ ## Walk-and-Consume Design
23
+
24
+ ### Core Idea
25
+
26
+ Replace the 3-phase pipeline with a single recursive descent that:
27
+ 1. Walks the target selector tree (depth-first)
28
+ 2. At each node, checks if it matches `find`
29
+ 3. If it matches, **immediately transforms** it (wrap in `:is()`, add to list, etc.)
30
+ 4. Returns the transformed (or original) node
31
+
32
+ ### Context Threading
33
+
34
+ The transformation depends on context. The walker carries a `WalkContext`:
35
+
36
+ ```typescript
37
+ interface WalkContext {
38
+ /** Are we at the top-level selector (not inside a compound/complex/pseudo)? */
39
+ isRoot: boolean;
40
+ /** Parent node type */
41
+ parentType: 'SelectorList' | 'ComplexSelector' | 'CompoundSelector' | 'PseudoSelector' | null;
42
+ /** Is there content before this node in the parent container? */
43
+ hasContentBefore: boolean;
44
+ /** Is there content after this node in the parent container? */
45
+ hasContentAfter: boolean;
46
+ /** Index within parent container */
47
+ indexInParent: number;
48
+ }
49
+ ```
50
+
51
+ ### Transformation Rules (Context → Action)
52
+
53
+ | Context | Partial Mode | Full Mode |
54
+ |---------|-------------|-----------|
55
+ | Root, whole match | SelectorList(target, extendWith) | SelectorList(target, extendWith) |
56
+ | Inside CompoundSelector | `:is(matched, extendWith)` + rest | reject (return unchanged) |
57
+ | Inside ComplexSelector | `:is(matched, extendWith)` + rest | `:is(matched, extendWith)` + rest |
58
+ | Inside PseudoSelector arg | recurse into arg | recurse into arg (with boundary check) |
59
+ | Inside SelectorList | extend each matching item | extend each matching item |
60
+
61
+ ### Implementation Strategy
62
+
63
+ Rather than rewriting the entire 3600-line file at once, we implement incrementally:
64
+
65
+ #### Phase 1: Unified `walkAndExtend` for Simple Cases
66
+ - SimpleSelector target + SimpleSelector find (most common case)
67
+ - Handles: root match, inside SelectorList, inside CompoundSelector, inside ComplexSelector
68
+ - Bypasses: ampersand crossing, boundary crossing, `:is()` normalization
69
+ - **Test**: run all 941 tests, fall back to old path for complex cases
70
+
71
+ #### Phase 2: Compound and Complex find selectors
72
+ - CompoundSelector find (e.g., `.a.b:extend(.a.b)`)
73
+ - ComplexSelector find (e.g., `.a .b:extend(.a .b)`)
74
+
75
+ #### Phase 3: Batch multi-instruction walk
76
+ - Walk once, apply ALL matching instructions simultaneously
77
+ - Eliminates the per-instruction diagnostic loop in `processExtends`
78
+ - Key for Bootstrap performance
79
+
80
+ #### Phase 4: Remove old code paths
81
+ - Once all cases are covered and tests pass, remove the 3-phase pipeline
82
+
83
+ ### Phase 1 Implementation Detail
84
+
85
+ ```typescript
86
+ function walkAndExtend(
87
+ target: Selector,
88
+ find: Selector,
89
+ extendWith: Selector,
90
+ partial: boolean,
91
+ ctx: WalkContext
92
+ ): Selector {
93
+ // 1. Check for exact match at this node
94
+ if (componentsMatch(target, find)) {
95
+ return applyTransformation(target, find, extendWith, partial, ctx);
96
+ }
97
+
98
+ // 2. Recurse into container nodes
99
+ if (isNode(target, 'SelectorList')) {
100
+ return walkSelectorList(target, find, extendWith, partial, ctx);
101
+ }
102
+ if (isNode(target, 'ComplexSelector')) {
103
+ return walkComplexSelector(target, find, extendWith, partial, ctx);
104
+ }
105
+ if (isNode(target, 'CompoundSelector')) {
106
+ return walkCompoundSelector(target, find, extendWith, partial, ctx);
107
+ }
108
+ if (isNode(target, 'PseudoSelector') && target.value.arg) {
109
+ return walkPseudoSelector(target, find, extendWith, partial, ctx);
110
+ }
111
+
112
+ // 3. No match, return unchanged
113
+ return target;
114
+ }
115
+ ```
116
+
117
+ ### Key Invariant
118
+
119
+ The walk-and-consume MUST produce identical output to the current pipeline for all
120
+ existing test cases. Unit tests serve as the guardrail — any behavioral difference
121
+ is a bug in the new implementation.
122
+
123
+ ### Boundary Between Old and New
124
+
125
+ During incremental rollout, `extendSelector` becomes a dispatcher:
126
+
127
+ ```typescript
128
+ function extendSelector(target, find, extendWith, partial, ...): Selector {
129
+ // Try walk-and-consume for supported cases
130
+ if (canUseWalkAndConsume(target, find)) {
131
+ return walkAndExtend(target, find, extendWith, partial, ROOT_CTX);
132
+ }
133
+ // Fall back to existing 3-phase pipeline
134
+ return extendSelectorLegacy(target, find, extendWith, partial, ...);
135
+ }
136
+ ```
137
+
138
+ This lets us expand coverage gradually while maintaining correctness.
@@ -0,0 +1,9 @@
1
+ # ExtendLocation API Optimization Analysis (archived)
2
+
3
+ This file used to exist in `__tests__/` as a long-form analysis.
4
+
5
+ It duplicated the package-root analysis, so it was archived once at:
6
+
7
+ - `packages/core/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md`
8
+
9
+
@@ -0,0 +1,4 @@
1
+ # Archived docs (`packages/core/src/tree/util/__tests__`)
2
+
3
+ This folder holds dated snapshots of ad-hoc notes that used to live alongside tests.
4
+