@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,215 @@
1
+ # Extend Architecture Analysis - Self-Referencing and Responsibility Boundaries
2
+
3
+ ## Current Architecture
4
+
5
+ ### Responsibility Layers
6
+
7
+ 1. **`extend-roots.ts`** - High-level orchestration
8
+ - Manages extend root relationships
9
+ - Processes extends recursively
10
+ - **Responsible for**: Detecting and filtering self-referencing extends
11
+ - **Responsible for**: Preventing circular references
12
+ - **Responsible for**: Deciding which extends should be processed
13
+
14
+ 2. **`extend.ts`** - Core extend logic
15
+ - `extendSelector()` - Performs the actual extension
16
+ - `tryExtendSelector()` - Wrapper with error handling
17
+ - **Responsible for**: Given valid inputs, perform the extension
18
+ - **Should NOT be responsible for**: Deciding whether to extend
19
+
20
+ 3. **`extend-helpers.ts`** - Utility functions
21
+ - Selector matching, component comparison, path building
22
+ - **Responsible for**: Pure utility functions
23
+
24
+ ## Current Self-Referencing Detection
25
+
26
+ ### In `extend-roots.ts` (lines 450-453, 472-475)
27
+
28
+ ```typescript
29
+ // Skip self-referencing extends
30
+ if (target.valueOf() === selectorWithExtend.valueOf()) {
31
+ return; // Early return - extend is skipped
32
+ }
33
+
34
+ // Later, for individual selectors:
35
+ if (singleTarget.valueOf() === selectorWithExtend.valueOf()) {
36
+ continue; // Skip this selector
37
+ }
38
+ ```
39
+
40
+ ### Analysis
41
+
42
+ **✅ GOOD:**
43
+ - Detection happens in `extend-roots.ts` where it belongs
44
+ - Uses `valueOf()` for comparison (handles different object instances)
45
+ - Early return prevents processing
46
+
47
+ **❌ ISSUES:**
48
+
49
+ 1. **Incomplete Detection**: The check only compares `target` vs `selectorWithExtend`, but doesn't handle:
50
+ - Chained self-references: `.a:extend(.b)` where `.b:extend(.a)` exists
51
+ - Partial self-references: `.a.b:extend(.a)` (should this be skipped?)
52
+ - SelectorList self-references: `.a, .b:extend(.a, .b)`
53
+
54
+ 2. **Test Failure Analysis**: The test `should ignore self-referencing extends: .w:extend(.w)` is failing with:
55
+ - Error: `Cannot read properties of undefined (reading 'clone')` at `extendSelectorList` line 973
56
+ - Expected: `.w, .v.w.v { color: black; }`
57
+ - Received: `.w { color: black; }`
58
+
59
+ This suggests:
60
+ - The self-reference check IS working (`.w:extend(.w)` is skipped)
61
+ - But something else is wrong - maybe `.v.w.v:extend(.w)` is also being skipped incorrectly?
62
+ - Or `extendSelectorList` is being called with an undefined result
63
+
64
+ 3. **Missing Logic**: The check at line 451 compares `target` (the selector being extended) with `selectorWithExtend` (the selector that has the `:extend()`). But:
65
+ - `target` is the selector in the `:extend(.target)`
66
+ - `selectorWithExtend` is the selector that contains the `:extend()`
67
+ - For `.w:extend(.w)`, `target = .w` and `selectorWithExtend = .w`, so they match ✅
68
+ - But what about `.a.b:extend(.a)`? Should this be considered self-referencing?
69
+
70
+ ## Recommendations
71
+
72
+ ### 1. Keep Self-Referencing Detection in `extend-roots.ts`
73
+
74
+ **✅ CORRECT APPROACH**: The user is right - `extendSelector` should NOT have self-referencing checks. It should be a pure function that:
75
+ - Takes a target, find, and extendWith
76
+ - Performs the extension
77
+ - Returns the result
78
+
79
+ **Decision logic** (should I extend?) belongs in `extend-roots.ts`.
80
+
81
+ ### 2. Enhance Self-Referencing Detection
82
+
83
+ The current check is too simple. We should:
84
+
85
+ **Option A: Keep Simple (Current)**
86
+ - Only skip when `target === selectorWithExtend` (exact match)
87
+ - This handles `.w:extend(.w)` but not `.a.b:extend(.a)`
88
+
89
+ **Option B: Enhanced Detection**
90
+ - Check if `target` is a component of `selectorWithExtend`
91
+ - Check for circular chains using the `processedExtends` set
92
+ - More sophisticated but might be overkill
93
+
94
+ **Recommendation**: Start with Option A, but make the check more robust:
95
+ - Handle SelectorList cases properly
96
+ - Ensure the check happens before calling `extendSelector`
97
+ - Add better error handling if `extendSelector` is called incorrectly
98
+
99
+ ### 3. Fix the Test Failure
100
+
101
+ The error `Cannot read properties of undefined (reading 'clone')` at line 973 suggests:
102
+
103
+ ```typescript
104
+ originalSelectors.push(extended.value[0]!.clone(true));
105
+ ```
106
+
107
+ This means `extended.value[0]` is `undefined`. This could happen if:
108
+ - `extendSelector` returns a SelectorList with an empty `value` array
109
+ - `extendSelector` returns something unexpected
110
+ - The self-reference check is working, but the result handling is wrong
111
+
112
+ **Investigation needed:**
113
+ 1. Check what `extendSelector` returns when called with self-referencing (it shouldn't be called, but if it is...)
114
+ 2. Check if `extendSelectorList` handles empty results correctly
115
+ 3. Verify the flow when self-referencing is detected
116
+
117
+ ### 4. Architecture Improvements
118
+
119
+ **Current Flow:**
120
+ ```
121
+ extend-roots.ts:processExtend()
122
+ → Check self-reference (line 451)
123
+ → If not self-reference, call extendSelector()
124
+ → Handle result
125
+ ```
126
+
127
+ **Problem**: If self-reference check fails or is bypassed, `extendSelector` gets called with invalid inputs.
128
+
129
+ **Solution**:
130
+ - Make self-reference check more robust
131
+ - Add defensive checks in `extendSelector` if needed (but only for error handling, not logic)
132
+ - Ensure `extendSelectorList` handles edge cases
133
+
134
+ ### 5. Test Expectations Review
135
+
136
+ The test expects:
137
+ ```css
138
+ .w,
139
+ .v.w.v {
140
+ color: black;
141
+ }
142
+ ```
143
+
144
+ This means:
145
+ - `.w:extend(.w)` should be ignored (self-reference) ✅
146
+ - `.v.w.v:extend(.w)` should work (not self-reference) ✅
147
+ - Both rulesets should be combined
148
+
149
+ **Current behavior**: Only `.w` is output, suggesting `.v.w.v:extend(.w)` is also being skipped incorrectly, OR the extend is working but the output is wrong.
150
+
151
+ ## Action Items
152
+
153
+ 1. **Remove naive self-reference check from `extendSelector`** ✅ (Already done)
154
+
155
+ 2. **Investigate test failure**:
156
+ - Why is `extended.value[0]` undefined?
157
+ - Is `.v.w.v:extend(.w)` being processed correctly?
158
+ - Is the self-reference check working for all cases?
159
+
160
+ 3. **Enhance self-reference detection in `extend-roots.ts`**:
161
+ - Ensure it handles SelectorList cases
162
+ - Add logging/debugging to verify it's working
163
+ - Consider if partial matches should be considered self-referencing
164
+
165
+ 4. **Add defensive checks** (if needed):
166
+ - In `extendSelectorList`, check if `extended.value[0]` exists before cloning
167
+ - But don't add logic checks - only error handling
168
+
169
+ 5. **Review test expectations**:
170
+ - Verify the test is correct
171
+ - Ensure it's testing the right behavior
172
+ - Check if test setup is correct
173
+
174
+ ## Conclusion
175
+
176
+ The user is correct: `extendSelector` should remain a pure function that performs extensions when called. The responsibility for detecting and filtering self-referencing extends belongs in `extend-roots.ts`.
177
+
178
+ The current implementation has the right architecture, but:
179
+ - The self-reference detection might need enhancement
180
+ - There's a bug causing the test failure that needs investigation
181
+ - The error handling in `extendSelectorList` might need improvement
182
+
183
+ ## Immediate Fixes
184
+
185
+ ### 1. Add Defensive Check in `extendSelectorList`
186
+
187
+ The error `Cannot read properties of undefined (reading 'clone')` at line 977 suggests `extended.value[0]` is undefined. This is a defensive programming issue, not a logic issue.
188
+
189
+ **Fix**: Add a check to ensure `extended.value.length > 0` before accessing `extended.value[0]`.
190
+
191
+ This is acceptable because:
192
+ - It's error handling, not business logic
193
+ - It prevents crashes when unexpected inputs occur
194
+ - It doesn't change the behavior of `extendSelector` itself
195
+
196
+ ### 2. Investigate Root Cause
197
+
198
+ The empty SelectorList suggests:
199
+ - `createExtendedSelectorList` might be creating empty SelectorLists
200
+ - `extendSelector` might be returning unexpected results in edge cases
201
+ - The self-reference check in `extend-roots.ts` might not be catching all cases
202
+
203
+ **Next Steps**:
204
+ 1. Add defensive check (done)
205
+ 2. Add logging to understand when empty SelectorLists are created
206
+ 3. Verify self-reference detection is working correctly
207
+ 4. Check if `createExtendedSelectorList` can return empty arrays
208
+
209
+ ### 3. Architecture Validation
210
+
211
+ **✅ CORRECT**: Self-reference detection in `extend-roots.ts` (lines 450-453, 472-475)
212
+ **✅ CORRECT**: `extendSelector` is a pure function without business logic checks
213
+ **✅ CORRECT**: Defensive error handling in `extendSelectorList` (acceptable)
214
+
215
+ **❓ NEEDS INVESTIGATION**: Why is `extendSelector` returning empty SelectorLists?
@@ -0,0 +1,233 @@
1
+ # Extend Utilities Architectural Audit
2
+
3
+ ## Analysis Date
4
+ 2024-12-19
5
+
6
+ ## Purpose
7
+ Deep analysis of unused functions in `extend.ts` to determine:
8
+ 1. Why they exist
9
+ 2. Whether they solve problems that should be solved
10
+ 3. Whether they're better approaches than current code
11
+ 4. Whether they should be integrated or removed
12
+
13
+ ---
14
+
15
+ ## Unused Functions Analysis
16
+
17
+ ### 1. `handleFullExtend` (lines 910-977)
18
+ **Status:** UNUSED - Logic is duplicated inline in `extendSelector`
19
+
20
+ **Purpose:**
21
+ - Consolidates full extend logic (when `partial: false`)
22
+ - Handles SelectorList, PseudoSelector, and CompoundSelector cases
23
+ - Has performance optimization for generated selectors (mutates in place)
24
+
25
+ **Current Implementation:**
26
+ - Full extend logic is scattered throughout `extendSelector` (lines 723-830)
27
+ - Handles root-level matches, pseudo-selector matches, compound matches, complex selector matches
28
+ - Does NOT have the performance optimization for generated selectors
29
+
30
+ **Analysis:**
31
+ - ✅ **SHOULD BE INTEGRATED**: The current code duplicates this logic but is less organized
32
+ - ✅ **BETTER APPROACH**: `handleFullExtend` consolidates the logic and has performance optimizations
33
+ - ⚠️ **ISSUE**: Current code handles some cases `handleFullExtend` doesn't (e.g., boundary crossing detection)
34
+ - **Recommendation**: Refactor `extendSelector` to use `handleFullExtend` for full extends, but keep boundary-crossing logic separate
35
+
36
+ ---
37
+
38
+ ### 2. `createValidatedIsWrapper` (lines 1077-1181)
39
+ **Status:** UNUSED - Only `createValidatedIsWrapperWithErrors` is used
40
+
41
+ **Purpose:**
42
+ - Creates `:is()` wrapper with validation that returns fallback on conflicts
43
+ - Has context-aware validation (checks if `:is()` would conflict with compound selector context)
44
+ - Returns fallback selector instead of throwing
45
+
46
+ **Current Implementation:**
47
+ - Uses `createValidatedIsWrapperWithErrors` which throws on conflicts (line 794)
48
+ - No fallback mechanism - always throws
49
+
50
+ **Analysis:**
51
+ - ❓ **UNCLEAR IF NEEDED**: The current approach throws errors, which might be correct
52
+ - ⚠️ **POTENTIAL ISSUE**: If validation fails, we throw - but maybe we should fallback?
53
+ - **Recommendation**: Review if fallback behavior is needed. If not, remove. If yes, integrate.
54
+
55
+ ---
56
+
57
+ ### 3. `optimizeTopLevelUnnecessaryIsWrapper` (lines 1548-1568)
58
+ **Status:** UNUSED
59
+
60
+ **Purpose:**
61
+ - Optimizes standalone `:is()` pseudo-selectors that were generated
62
+ - Unwraps `:is()` when it's not needed (e.g., `:is(.a)` → `.a`)
63
+ - Only optimizes generated selectors (not user-authored)
64
+
65
+ **Current Implementation:**
66
+ - No optimization of unnecessary `:is()` wrappers
67
+ - Generated `:is()` selectors are kept as-is
68
+
69
+ **Analysis:**
70
+ - ✅ **SHOULD BE INTEGRATED**: This is a valid optimization
71
+ - ✅ **PERFORMANCE BENEFIT**: Reduces unnecessary `:is()` wrappers in output
72
+ - ⚠️ **WHEN TO CALL**: Need to determine where in the pipeline to call this
73
+ - **Recommendation**: Integrate into `flattenGeneratedIs` or call after extend operations
74
+
75
+ ---
76
+
77
+ ### 4. `handlePartialExtendAtRoot` (lines 1573-1584)
78
+ **Status:** UNUSED
79
+
80
+ **Purpose:**
81
+ - Handles partial extends at root level (when `location.path.length === 0`)
82
+ - Creates `:is()` wrapper for compound selectors
83
+ - Falls back to selector list for other cases
84
+
85
+ **Current Implementation:**
86
+ - Root-level partial extends are handled inline (lines 619-688)
87
+ - Uses `createExtendedSelectorList` directly
88
+ - Has special handling for remainders and complex selector partial matches
89
+
90
+ **Analysis:**
91
+ - ⚠️ **PARTIALLY DUPLICATED**: Current code does more (handles remainders, complex selectors)
92
+ - ❓ **SIMPLER APPROACH**: `handlePartialExtendAtRoot` is simpler but less complete
93
+ - **Recommendation**: Current implementation is more complete. Remove `handlePartialExtendAtRoot` unless we want to simplify.
94
+
95
+ ---
96
+
97
+ ### 5. `needsPartialMatchProcessing` (lines 1589-1592)
98
+ **Status:** UNUSED
99
+
100
+ **Purpose:**
101
+ - Checks if partial match result needs processing
102
+ - Returns true for ComplexSelector or CompoundSelector
103
+
104
+ **Current Implementation:**
105
+ - No such check - processes all results directly
106
+
107
+ **Analysis:**
108
+ - ❓ **MAYBE USEFUL**: Could be used to skip processing for simple selectors
109
+ - ⚠️ **LOW VALUE**: The check is trivial and doesn't add much
110
+ - **Recommendation**: Remove unless we find a performance benefit
111
+
112
+ ---
113
+
114
+ ### 6. `processPartialMatchResult` (lines 1597-1607)
115
+ **Status:** UNUSED - Stub function
116
+
117
+ **Purpose:**
118
+ - Placeholder for processing partial match results
119
+ - Currently just returns result as-is
120
+ - Comment says "This is where we would handle complex partial match scenarios"
121
+
122
+ **Current Implementation:**
123
+ - Partial match processing is done inline in `extendSelector`
124
+
125
+ **Analysis:**
126
+ - ⚠️ **INCOMPLETE WORK**: This was a placeholder that was never implemented
127
+ - ❓ **MAYBE NEEDED**: Comment suggests there are complex scenarios not handled
128
+ - **Recommendation**: Either implement it or remove it. Check if there are unhandled partial match scenarios.
129
+
130
+ ---
131
+
132
+ ### 7. `handleExtendLocationPartial` (lines 1612-1623)
133
+ **Status:** UNUSED
134
+
135
+ **Purpose:**
136
+ - Handles extension location in partial mode
137
+ - Creates `:is()` wrappers
138
+ - Currently just calls `applyExtensionAtLocation`
139
+
140
+ **Current Implementation:**
141
+ - Partial mode handling is done inline in `extendSelector` (lines 616-722)
142
+ - Has complex logic for root-level, component-level, and multiple matches
143
+
144
+ **Analysis:**
145
+ - ⚠️ **INCOMPLETE**: Function is a stub that doesn't do the actual work
146
+ - ❓ **MAYBE INTENDED**: Was meant to consolidate partial mode logic but never completed
147
+ - **Recommendation**: Remove - current inline implementation is more complete
148
+
149
+ ---
150
+
151
+ ### 8. `handleExtendLocationFull` (lines 1628-1645)
152
+ **Status:** UNUSED
153
+
154
+ **Purpose:**
155
+ - Handles extension location in full mode
156
+ - Calls `convertToIsWrapperIfNeeded` for compound selectors
157
+ - Falls back to `applyExtensionAtLocation`
158
+
159
+ **Current Implementation:**
160
+ - Full mode handling is done inline in `extendSelector` (lines 723-830)
161
+ - Has logic for root-level, pseudo-selector, boundary-crossing, compound, and complex selector cases
162
+
163
+ **Analysis:**
164
+ - ⚠️ **INCOMPLETE**: Function doesn't handle all the cases current code does
165
+ - ❓ **MAYBE INTENDED**: Was meant to consolidate full mode logic but never completed
166
+ - **Recommendation**: Remove - current inline implementation is more complete
167
+
168
+ ---
169
+
170
+ ### 9. `convertToIsWrapperIfNeeded` (lines 1650-1667)
171
+ **Status:** UNUSED - Only called from unused `handleExtendLocationFull`
172
+
173
+ **Purpose:**
174
+ - Converts extended results to use `:is()` wrappers for compound selectors
175
+ - Currently a stub with TODO comment
176
+
177
+ **Current Implementation:**
178
+ - Compound selector extensions create `:is()` wrappers directly (line 794)
179
+ - Uses `createValidatedIsWrapperWithErrors`
180
+
181
+ **Analysis:**
182
+ - ⚠️ **INCOMPLETE WORK**: Stub function with TODO
183
+ - ❓ **MAYBE NEEDED**: Comment suggests there's logic for compound boundary cases
184
+ - **Recommendation**: Either implement the logic or remove. Check if current implementation handles all cases.
185
+
186
+ ---
187
+
188
+ ### 10. `createValidatedCompoundSelector` (lines 1708-1719)
189
+ **Status:** UNUSED - Only `createValidatedCompoundSelectorWithErrors` is used
190
+
191
+ **Purpose:**
192
+ - Creates compound selector with validation that returns fallback on conflicts
193
+ - Returns fallback selector instead of throwing
194
+
195
+ **Current Implementation:**
196
+ - Uses `createValidatedCompoundSelectorWithErrors` which throws on conflicts
197
+ - No fallback mechanism
198
+
199
+ **Analysis:**
200
+ - ❓ **UNCLEAR IF NEEDED**: Current approach throws errors, which might be correct
201
+ - ⚠️ **POTENTIAL ISSUE**: If validation fails, we throw - but maybe we should fallback?
202
+ - **Recommendation**: Review if fallback behavior is needed. If not, remove. If yes, integrate.
203
+
204
+ ---
205
+
206
+ ## Summary & Recommendations
207
+
208
+ ### Functions to INTEGRATE:
209
+ 1. **`handleFullExtend`** - Consolidates full extend logic, has performance optimizations
210
+ 2. **`optimizeTopLevelUnnecessaryIsWrapper`** - Valid optimization that should be applied
211
+
212
+ ### Functions to REVIEW:
213
+ 1. **`createValidatedIsWrapper`** - Check if fallback behavior is needed vs throwing
214
+ 2. **`createValidatedCompoundSelector`** - Check if fallback behavior is needed vs throwing
215
+ 3. **`processPartialMatchResult`** - Check if there are unhandled partial match scenarios
216
+ 4. **`convertToIsWrapperIfNeeded`** - Check if compound boundary cases need special handling
217
+
218
+ ### Functions to REMOVE:
219
+ 1. **`handlePartialExtendAtRoot`** - Current implementation is more complete
220
+ 2. **`needsPartialMatchProcessing`** - Trivial check, no value
221
+ 3. **`handleExtendLocationPartial`** - Incomplete stub, current code is better
222
+ 4. **`handleExtendLocationFull`** - Incomplete stub, current code is better
223
+
224
+ ---
225
+
226
+ ## Action Items
227
+
228
+ 1. ✅ Review validation error handling - should we fallback or throw?
229
+ 2. ✅ Integrate `handleFullExtend` into `extendSelector` for full extends
230
+ 3. ✅ Integrate `optimizeTopLevelUnnecessaryIsWrapper` into flattening pipeline
231
+ 4. ✅ Investigate if `processPartialMatchResult` and `convertToIsWrapperIfNeeded` solve real problems
232
+ 5. ✅ Remove incomplete stub functions
233
+ 6. ✅ Enable ESLint `@typescript-eslint/no-unused-vars` to catch unused code
@@ -0,0 +1,64 @@
1
+ # Extend Tests Baseline
2
+
3
+ ## Date
4
+ 2025-01-XX (Before refactoring)
5
+
6
+ ## Test Command
7
+ ```bash
8
+ cd packages/core && pnpm test -- --run extend
9
+ ```
10
+
11
+ ## Baseline Results
12
+
13
+ ### Summary
14
+ - **Test Files**: 7 failed | 5 passed (12 total)
15
+ - **Tests**: 10 failed | 148 passed (158 total)
16
+ - **Duration**: 659ms
17
+
18
+ ### Failing Tests (10)
19
+
20
+ 1. **src/tree/util/__tests__/process-extends.test.ts**
21
+ - Entire test file failed
22
+
23
+ 2. **src/tree/__tests__/extend-import-style.test.ts**
24
+ - `compose type can be extended from parent when mutable`
25
+ - `import with mutable: false cannot be extended - collects extendNotAccessible warning`
26
+
27
+ 3. **src/tree/__tests__/extend-roots.test.ts**
28
+ - `child compose root cannot extend parent (compose is a boundary) - extend throws error`
29
+ - `children roots are accessible if mutable`
30
+
31
+ 4. **src/tree/__tests__/extend-rules.test.ts**
32
+ - `should ignore self-referencing extends: .w:extend(.w)`
33
+
34
+ 5. **src/tree/util/__tests__/extend-duplicate-validation.test.ts**
35
+ - `should allow duplicate same ID selectors for specificity (#foo#foo)`
36
+ - `should allow extending #foo with #foo (same ID)`
37
+
38
+ 6. **src/tree/util/__tests__/extend-selector-algorithm.test.ts**
39
+ - `should extend complex partial match with compound boundaries - example 6`
40
+ - Expected: `.a>.b.c>.d.e,.a>.f`
41
+ - Received: Different output
42
+
43
+ 7. **src/tree/util/__tests__/extend-simplified-cases.test.ts**
44
+ - `should extend with :is() selector - extract selectors from :is()`
45
+ - Expected: `.foo,.ext3,.ext4`
46
+ - Received: `.foo,:is(.ext3,.ext4)`
47
+ - `should extend with :is() selector in partial mode`
48
+ - Expected: `.foo :is(.bar,.ext3,.ext4)`
49
+ - Received: `.foo :is(.bar,:is(.ext3,.ext4))`
50
+
51
+ ## Notes
52
+
53
+ - These failures appear to be pre-existing issues, not related to the refactoring
54
+ - The `.foo.foo` bug is not currently tested, so we need to add a test case for it
55
+ - Some failures are related to `:is()` flattening behavior
56
+ - Some failures are related to duplicate ID selector handling
57
+
58
+ ## Next Steps
59
+
60
+ 1. Document these baseline failures
61
+ 2. Proceed with refactoring
62
+ 3. Verify that refactoring doesn't introduce new failures
63
+ 4. Fix the `.foo.foo` bug and add test case
64
+ 5. Address any new failures introduced by refactoring