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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/lib/index.cjs +20159 -0
  2. package/lib/index.d.cts +5993 -0
  3. package/lib/index.d.cts.map +1 -0
  4. package/lib/index.d.ts +5992 -21
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +19926 -22
  7. package/lib/index.js.map +1 -1
  8. package/package.json +15 -14
  9. package/src/__tests__/define-function-record.test.ts +58 -0
  10. package/src/__tests__/define-function-simple.test.ts +55 -0
  11. package/src/__tests__/define-function-split-sequence.test.ts +547 -0
  12. package/src/__tests__/define-function-type-parity.test.ts +9 -0
  13. package/src/__tests__/define-function.test.ts +763 -0
  14. package/src/__tests__/num-operations.test.ts +91 -0
  15. package/src/__tests__/safe-parse.test.ts +374 -0
  16. package/src/context.ts +896 -0
  17. package/src/conversions.ts +282 -0
  18. package/src/debug-log.ts +29 -0
  19. package/src/define-function.ts +1006 -0
  20. package/src/deprecation.ts +67 -0
  21. package/src/globals.d.ts +26 -0
  22. package/src/index.ts +31 -0
  23. package/src/jess-error.ts +773 -0
  24. package/src/logger/deprecation-processing.ts +109 -0
  25. package/src/logger.ts +31 -0
  26. package/src/plugin.ts +292 -0
  27. package/src/tree/LOOKUP_CHAINS.md +35 -0
  28. package/src/tree/README.md +18 -0
  29. package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
  30. package/src/tree/__tests__/ampersand.test.ts +382 -0
  31. package/src/tree/__tests__/at-rule.test.ts +2047 -0
  32. package/src/tree/__tests__/basic-render.test.ts +212 -0
  33. package/src/tree/__tests__/block.test.ts +40 -0
  34. package/src/tree/__tests__/call.test.ts +346 -0
  35. package/src/tree/__tests__/color.test.ts +537 -0
  36. package/src/tree/__tests__/condition.test.ts +186 -0
  37. package/src/tree/__tests__/control.test.ts +564 -0
  38. package/src/tree/__tests__/declaration.test.ts +253 -0
  39. package/src/tree/__tests__/dependency-graph.test.ts +177 -0
  40. package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
  41. package/src/tree/__tests__/dimension.test.ts +236 -0
  42. package/src/tree/__tests__/expression.test.ts +73 -0
  43. package/src/tree/__tests__/ext-node.test.ts +31 -0
  44. package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
  45. package/src/tree/__tests__/extend-import-style.test.ts +929 -0
  46. package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
  47. package/src/tree/__tests__/extend-list.test.ts +31 -0
  48. package/src/tree/__tests__/extend-roots.test.ts +1045 -0
  49. package/src/tree/__tests__/extend-rules.test.ts +740 -0
  50. package/src/tree/__tests__/func.test.ts +171 -0
  51. package/src/tree/__tests__/import-js.test.ts +33 -0
  52. package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
  53. package/src/tree/__tests__/import-style.test.ts +1967 -0
  54. package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
  55. package/src/tree/__tests__/interpolated.test.ts +41 -0
  56. package/src/tree/__tests__/list.test.ts +177 -0
  57. package/src/tree/__tests__/log.test.ts +83 -0
  58. package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
  59. package/src/tree/__tests__/mixin.test.ts +2171 -0
  60. package/src/tree/__tests__/negative.test.ts +45 -0
  61. package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
  62. package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
  63. package/src/tree/__tests__/node-flags.test.ts +410 -0
  64. package/src/tree/__tests__/node-graph.test.ts +598 -0
  65. package/src/tree/__tests__/node-mutation.test.ts +182 -0
  66. package/src/tree/__tests__/operation.test.ts +18 -0
  67. package/src/tree/__tests__/paren.test.ts +90 -0
  68. package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
  69. package/src/tree/__tests__/quoted.test.ts +72 -0
  70. package/src/tree/__tests__/range.test.ts +59 -0
  71. package/src/tree/__tests__/reference.test.ts +743 -0
  72. package/src/tree/__tests__/rest.test.ts +29 -0
  73. package/src/tree/__tests__/rules-raw.test.ts +14 -0
  74. package/src/tree/__tests__/rules.test.ts +1271 -0
  75. package/src/tree/__tests__/ruleset.test.ts +597 -0
  76. package/src/tree/__tests__/selector-attr.test.ts +50 -0
  77. package/src/tree/__tests__/selector-basic.test.ts +44 -0
  78. package/src/tree/__tests__/selector-capture.test.ts +22 -0
  79. package/src/tree/__tests__/selector-complex.test.ts +120 -0
  80. package/src/tree/__tests__/selector-compound.test.ts +74 -0
  81. package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
  82. package/src/tree/__tests__/selector-list.test.ts +59 -0
  83. package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
  84. package/src/tree/__tests__/selector.test.ts +182 -0
  85. package/src/tree/__tests__/sequence.test.ts +226 -0
  86. package/src/tree/__tests__/serialize-types.test.ts +529 -0
  87. package/src/tree/__tests__/spaced.test.ts +8 -0
  88. package/src/tree/__tests__/url.test.ts +72 -0
  89. package/src/tree/__tests__/var-declaration.test.ts +90 -0
  90. package/src/tree/ampersand.ts +538 -0
  91. package/src/tree/any.ts +169 -0
  92. package/src/tree/at-rule.ts +760 -0
  93. package/src/tree/block.ts +72 -0
  94. package/src/tree/bool.ts +46 -0
  95. package/src/tree/call.ts +593 -0
  96. package/src/tree/collection.ts +52 -0
  97. package/src/tree/color.ts +629 -0
  98. package/src/tree/combinator.ts +30 -0
  99. package/src/tree/comment.ts +36 -0
  100. package/src/tree/condition.ts +194 -0
  101. package/src/tree/control.ts +452 -0
  102. package/src/tree/declaration-custom.ts +56 -0
  103. package/src/tree/declaration-var.ts +87 -0
  104. package/src/tree/declaration.ts +742 -0
  105. package/src/tree/default-guard.ts +35 -0
  106. package/src/tree/dimension.ts +392 -0
  107. package/src/tree/expression.ts +97 -0
  108. package/src/tree/extend-list.ts +51 -0
  109. package/src/tree/extend.ts +391 -0
  110. package/src/tree/function.ts +254 -0
  111. package/src/tree/import-js.ts +130 -0
  112. package/src/tree/import-style.ts +875 -0
  113. package/{lib/tree/index.js → src/tree/index.ts} +49 -22
  114. package/src/tree/interpolated.ts +346 -0
  115. package/src/tree/js-array.ts +21 -0
  116. package/src/tree/js-expr.ts +50 -0
  117. package/src/tree/js-function.ts +31 -0
  118. package/src/tree/js-object.ts +22 -0
  119. package/src/tree/list.ts +415 -0
  120. package/src/tree/log.ts +89 -0
  121. package/src/tree/mixin.ts +331 -0
  122. package/src/tree/negative.ts +58 -0
  123. package/src/tree/nil.ts +57 -0
  124. package/src/tree/node-base.ts +1716 -0
  125. package/src/tree/node-type.ts +122 -0
  126. package/src/tree/node.ts +118 -0
  127. package/src/tree/number.ts +54 -0
  128. package/src/tree/operation.ts +187 -0
  129. package/src/tree/paren.ts +132 -0
  130. package/src/tree/query-condition.ts +47 -0
  131. package/src/tree/quoted.ts +119 -0
  132. package/src/tree/range.ts +101 -0
  133. package/src/tree/reference.ts +1099 -0
  134. package/src/tree/rest.ts +55 -0
  135. package/src/tree/rules-raw.ts +52 -0
  136. package/src/tree/rules.ts +2896 -0
  137. package/src/tree/ruleset.ts +1217 -0
  138. package/src/tree/selector-attr.ts +172 -0
  139. package/src/tree/selector-basic.ts +75 -0
  140. package/src/tree/selector-capture.ts +85 -0
  141. package/src/tree/selector-complex.ts +189 -0
  142. package/src/tree/selector-compound.ts +205 -0
  143. package/src/tree/selector-interpolated.ts +95 -0
  144. package/src/tree/selector-list.ts +245 -0
  145. package/src/tree/selector-pseudo.ts +173 -0
  146. package/src/tree/selector-simple.ts +10 -0
  147. package/src/tree/selector.ts +152 -0
  148. package/src/tree/sequence.ts +463 -0
  149. package/src/tree/tree.ts +130 -0
  150. package/src/tree/url.ts +95 -0
  151. package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
  152. package/src/tree/util/EXTEND_AUDIT.md +233 -0
  153. package/src/tree/util/EXTEND_BASELINE.md +64 -0
  154. package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
  155. package/src/tree/util/EXTEND_DOCS.md +24 -0
  156. package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
  157. package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
  158. package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
  159. package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
  160. package/src/tree/util/EXTEND_RULES.md +74 -0
  161. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
  162. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
  163. package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
  164. package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
  165. package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
  166. package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
  167. package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
  168. package/src/tree/util/__tests__/_archive/README.md +4 -0
  169. package/src/tree/util/__tests__/bitset.test.ts +142 -0
  170. package/src/tree/util/__tests__/debug-log.ts +50 -0
  171. package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
  172. package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
  173. package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
  174. package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
  175. package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
  176. package/src/tree/util/__tests__/is-node.test.ts +63 -0
  177. package/src/tree/util/__tests__/list-like.test.ts +63 -0
  178. package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
  179. package/src/tree/util/__tests__/print.test.ts +183 -0
  180. package/src/tree/util/__tests__/process-extends.test.ts +226 -0
  181. package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
  182. package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
  183. package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
  184. package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
  185. package/src/tree/util/ampersand-template.ts +9 -0
  186. package/src/tree/util/bitset.ts +194 -0
  187. package/src/tree/util/calculate.ts +11 -0
  188. package/src/tree/util/cast.ts +89 -0
  189. package/src/tree/util/cloning.ts +8 -0
  190. package/src/tree/util/collections.ts +299 -0
  191. package/src/tree/util/compare.ts +90 -0
  192. package/src/tree/util/cursor.ts +171 -0
  193. package/src/tree/util/extend-core.ts +2139 -0
  194. package/src/tree/util/extend-roots.ts +1108 -0
  195. package/src/tree/util/field-helpers.ts +354 -0
  196. package/src/tree/util/is-node.ts +43 -0
  197. package/src/tree/util/list-like.ts +93 -0
  198. package/src/tree/util/mixin-instance-primitives.ts +2020 -0
  199. package/src/tree/util/print.ts +303 -0
  200. package/src/tree/util/process-leading-is.ts +421 -0
  201. package/src/tree/util/recursion-helper.ts +54 -0
  202. package/src/tree/util/regex.ts +2 -0
  203. package/src/tree/util/registry-utils.ts +1953 -0
  204. package/src/tree/util/ruleset-trace.ts +17 -0
  205. package/src/tree/util/scoped-body-eval.ts +320 -0
  206. package/src/tree/util/selector-match-core.ts +2005 -0
  207. package/src/tree/util/selector-utils.ts +757 -0
  208. package/src/tree/util/serialize-helper.ts +535 -0
  209. package/src/tree/util/serialize-types.ts +318 -0
  210. package/src/tree/util/should-operate.ts +78 -0
  211. package/src/tree/util/sourcemap.ts +37 -0
  212. package/src/types/config.ts +247 -0
  213. package/src/types/index.ts +12 -0
  214. package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
  215. package/src/types.d.ts +9 -0
  216. package/src/types.ts +68 -0
  217. package/src/use-webpack-resolver.ts +56 -0
  218. package/src/visitor/__tests__/visitor.test.ts +136 -0
  219. package/src/visitor/index.ts +263 -0
  220. package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
  221. package/lib/context.d.ts +0 -352
  222. package/lib/context.d.ts.map +0 -1
  223. package/lib/context.js +0 -636
  224. package/lib/context.js.map +0 -1
  225. package/lib/conversions.d.ts +0 -73
  226. package/lib/conversions.d.ts.map +0 -1
  227. package/lib/conversions.js +0 -253
  228. package/lib/conversions.js.map +0 -1
  229. package/lib/debug-log.d.ts +0 -2
  230. package/lib/debug-log.d.ts.map +0 -1
  231. package/lib/debug-log.js +0 -27
  232. package/lib/debug-log.js.map +0 -1
  233. package/lib/define-function.d.ts +0 -587
  234. package/lib/define-function.d.ts.map +0 -1
  235. package/lib/define-function.js +0 -726
  236. package/lib/define-function.js.map +0 -1
  237. package/lib/deprecation.d.ts +0 -34
  238. package/lib/deprecation.d.ts.map +0 -1
  239. package/lib/deprecation.js +0 -57
  240. package/lib/deprecation.js.map +0 -1
  241. package/lib/jess-error.d.ts +0 -343
  242. package/lib/jess-error.d.ts.map +0 -1
  243. package/lib/jess-error.js +0 -508
  244. package/lib/jess-error.js.map +0 -1
  245. package/lib/logger/deprecation-processing.d.ts +0 -41
  246. package/lib/logger/deprecation-processing.d.ts.map +0 -1
  247. package/lib/logger/deprecation-processing.js +0 -81
  248. package/lib/logger/deprecation-processing.js.map +0 -1
  249. package/lib/logger.d.ts +0 -10
  250. package/lib/logger.d.ts.map +0 -1
  251. package/lib/logger.js +0 -20
  252. package/lib/logger.js.map +0 -1
  253. package/lib/plugin.d.ts +0 -94
  254. package/lib/plugin.d.ts.map +0 -1
  255. package/lib/plugin.js +0 -174
  256. package/lib/plugin.js.map +0 -1
  257. package/lib/tree/ampersand.d.ts +0 -98
  258. package/lib/tree/ampersand.d.ts.map +0 -1
  259. package/lib/tree/ampersand.js +0 -319
  260. package/lib/tree/ampersand.js.map +0 -1
  261. package/lib/tree/any.d.ts +0 -58
  262. package/lib/tree/any.d.ts.map +0 -1
  263. package/lib/tree/any.js +0 -104
  264. package/lib/tree/any.js.map +0 -1
  265. package/lib/tree/at-rule.d.ts +0 -53
  266. package/lib/tree/at-rule.d.ts.map +0 -1
  267. package/lib/tree/at-rule.js +0 -503
  268. package/lib/tree/at-rule.js.map +0 -1
  269. package/lib/tree/block.d.ts +0 -22
  270. package/lib/tree/block.d.ts.map +0 -1
  271. package/lib/tree/block.js +0 -24
  272. package/lib/tree/block.js.map +0 -1
  273. package/lib/tree/bool.d.ts +0 -18
  274. package/lib/tree/bool.d.ts.map +0 -1
  275. package/lib/tree/bool.js +0 -28
  276. package/lib/tree/bool.js.map +0 -1
  277. package/lib/tree/call.d.ts +0 -66
  278. package/lib/tree/call.d.ts.map +0 -1
  279. package/lib/tree/call.js +0 -306
  280. package/lib/tree/call.js.map +0 -1
  281. package/lib/tree/collection.d.ts +0 -30
  282. package/lib/tree/collection.d.ts.map +0 -1
  283. package/lib/tree/collection.js +0 -37
  284. package/lib/tree/collection.js.map +0 -1
  285. package/lib/tree/color.d.ts +0 -101
  286. package/lib/tree/color.d.ts.map +0 -1
  287. package/lib/tree/color.js +0 -513
  288. package/lib/tree/color.js.map +0 -1
  289. package/lib/tree/combinator.d.ts +0 -13
  290. package/lib/tree/combinator.d.ts.map +0 -1
  291. package/lib/tree/combinator.js +0 -12
  292. package/lib/tree/combinator.js.map +0 -1
  293. package/lib/tree/comment.d.ts +0 -20
  294. package/lib/tree/comment.d.ts.map +0 -1
  295. package/lib/tree/comment.js +0 -19
  296. package/lib/tree/comment.js.map +0 -1
  297. package/lib/tree/condition.d.ts +0 -31
  298. package/lib/tree/condition.d.ts.map +0 -1
  299. package/lib/tree/condition.js +0 -103
  300. package/lib/tree/condition.js.map +0 -1
  301. package/lib/tree/control.d.ts +0 -104
  302. package/lib/tree/control.d.ts.map +0 -1
  303. package/lib/tree/control.js +0 -430
  304. package/lib/tree/control.js.map +0 -1
  305. package/lib/tree/declaration-custom.d.ts +0 -18
  306. package/lib/tree/declaration-custom.d.ts.map +0 -1
  307. package/lib/tree/declaration-custom.js +0 -24
  308. package/lib/tree/declaration-custom.js.map +0 -1
  309. package/lib/tree/declaration-var.d.ts +0 -35
  310. package/lib/tree/declaration-var.d.ts.map +0 -1
  311. package/lib/tree/declaration-var.js +0 -63
  312. package/lib/tree/declaration-var.js.map +0 -1
  313. package/lib/tree/declaration.d.ts +0 -78
  314. package/lib/tree/declaration.d.ts.map +0 -1
  315. package/lib/tree/declaration.js +0 -286
  316. package/lib/tree/declaration.js.map +0 -1
  317. package/lib/tree/default-guard.d.ts +0 -15
  318. package/lib/tree/default-guard.d.ts.map +0 -1
  319. package/lib/tree/default-guard.js +0 -19
  320. package/lib/tree/default-guard.js.map +0 -1
  321. package/lib/tree/dimension.d.ts +0 -34
  322. package/lib/tree/dimension.d.ts.map +0 -1
  323. package/lib/tree/dimension.js +0 -294
  324. package/lib/tree/dimension.js.map +0 -1
  325. package/lib/tree/expression.d.ts +0 -25
  326. package/lib/tree/expression.d.ts.map +0 -1
  327. package/lib/tree/expression.js +0 -32
  328. package/lib/tree/expression.js.map +0 -1
  329. package/lib/tree/extend-list.d.ts +0 -23
  330. package/lib/tree/extend-list.d.ts.map +0 -1
  331. package/lib/tree/extend-list.js +0 -23
  332. package/lib/tree/extend-list.js.map +0 -1
  333. package/lib/tree/extend.d.ts +0 -47
  334. package/lib/tree/extend.d.ts.map +0 -1
  335. package/lib/tree/extend.js +0 -296
  336. package/lib/tree/extend.js.map +0 -1
  337. package/lib/tree/function.d.ts +0 -48
  338. package/lib/tree/function.d.ts.map +0 -1
  339. package/lib/tree/function.js +0 -74
  340. package/lib/tree/function.js.map +0 -1
  341. package/lib/tree/import-js.d.ts +0 -35
  342. package/lib/tree/import-js.d.ts.map +0 -1
  343. package/lib/tree/import-js.js +0 -45
  344. package/lib/tree/import-js.js.map +0 -1
  345. package/lib/tree/import-style.d.ts +0 -156
  346. package/lib/tree/import-style.d.ts.map +0 -1
  347. package/lib/tree/import-style.js +0 -566
  348. package/lib/tree/import-style.js.map +0 -1
  349. package/lib/tree/index.d.ts +0 -71
  350. package/lib/tree/index.d.ts.map +0 -1
  351. package/lib/tree/index.js.map +0 -1
  352. package/lib/tree/interpolated-reference.d.ts +0 -24
  353. package/lib/tree/interpolated-reference.d.ts.map +0 -1
  354. package/lib/tree/interpolated-reference.js +0 -37
  355. package/lib/tree/interpolated-reference.js.map +0 -1
  356. package/lib/tree/interpolated.d.ts +0 -62
  357. package/lib/tree/interpolated.d.ts.map +0 -1
  358. package/lib/tree/interpolated.js +0 -204
  359. package/lib/tree/interpolated.js.map +0 -1
  360. package/lib/tree/js-array.d.ts +0 -10
  361. package/lib/tree/js-array.d.ts.map +0 -1
  362. package/lib/tree/js-array.js +0 -10
  363. package/lib/tree/js-array.js.map +0 -1
  364. package/lib/tree/js-expr.d.ts +0 -23
  365. package/lib/tree/js-expr.d.ts.map +0 -1
  366. package/lib/tree/js-expr.js +0 -28
  367. package/lib/tree/js-expr.js.map +0 -1
  368. package/lib/tree/js-function.d.ts +0 -20
  369. package/lib/tree/js-function.d.ts.map +0 -1
  370. package/lib/tree/js-function.js +0 -16
  371. package/lib/tree/js-function.js.map +0 -1
  372. package/lib/tree/js-object.d.ts +0 -10
  373. package/lib/tree/js-object.d.ts.map +0 -1
  374. package/lib/tree/js-object.js +0 -10
  375. package/lib/tree/js-object.js.map +0 -1
  376. package/lib/tree/list.d.ts +0 -38
  377. package/lib/tree/list.d.ts.map +0 -1
  378. package/lib/tree/list.js +0 -83
  379. package/lib/tree/list.js.map +0 -1
  380. package/lib/tree/log.d.ts +0 -29
  381. package/lib/tree/log.d.ts.map +0 -1
  382. package/lib/tree/log.js +0 -56
  383. package/lib/tree/log.js.map +0 -1
  384. package/lib/tree/mixin.d.ts +0 -87
  385. package/lib/tree/mixin.d.ts.map +0 -1
  386. package/lib/tree/mixin.js +0 -112
  387. package/lib/tree/mixin.js.map +0 -1
  388. package/lib/tree/negative.d.ts +0 -17
  389. package/lib/tree/negative.d.ts.map +0 -1
  390. package/lib/tree/negative.js +0 -22
  391. package/lib/tree/negative.js.map +0 -1
  392. package/lib/tree/nil.d.ts +0 -30
  393. package/lib/tree/nil.d.ts.map +0 -1
  394. package/lib/tree/nil.js +0 -35
  395. package/lib/tree/nil.js.map +0 -1
  396. package/lib/tree/node-base.d.ts +0 -361
  397. package/lib/tree/node-base.d.ts.map +0 -1
  398. package/lib/tree/node-base.js +0 -930
  399. package/lib/tree/node-base.js.map +0 -1
  400. package/lib/tree/node.d.ts +0 -10
  401. package/lib/tree/node.d.ts.map +0 -1
  402. package/lib/tree/node.js +0 -45
  403. package/lib/tree/node.js.map +0 -1
  404. package/lib/tree/number.d.ts +0 -21
  405. package/lib/tree/number.d.ts.map +0 -1
  406. package/lib/tree/number.js +0 -27
  407. package/lib/tree/number.js.map +0 -1
  408. package/lib/tree/operation.d.ts +0 -26
  409. package/lib/tree/operation.d.ts.map +0 -1
  410. package/lib/tree/operation.js +0 -103
  411. package/lib/tree/operation.js.map +0 -1
  412. package/lib/tree/paren.d.ts +0 -19
  413. package/lib/tree/paren.d.ts.map +0 -1
  414. package/lib/tree/paren.js +0 -92
  415. package/lib/tree/paren.js.map +0 -1
  416. package/lib/tree/query-condition.d.ts +0 -17
  417. package/lib/tree/query-condition.d.ts.map +0 -1
  418. package/lib/tree/query-condition.js +0 -39
  419. package/lib/tree/query-condition.js.map +0 -1
  420. package/lib/tree/quoted.d.ts +0 -28
  421. package/lib/tree/quoted.d.ts.map +0 -1
  422. package/lib/tree/quoted.js +0 -75
  423. package/lib/tree/quoted.js.map +0 -1
  424. package/lib/tree/range.d.ts +0 -33
  425. package/lib/tree/range.d.ts.map +0 -1
  426. package/lib/tree/range.js +0 -47
  427. package/lib/tree/range.js.map +0 -1
  428. package/lib/tree/reference.d.ts +0 -76
  429. package/lib/tree/reference.d.ts.map +0 -1
  430. package/lib/tree/reference.js +0 -521
  431. package/lib/tree/reference.js.map +0 -1
  432. package/lib/tree/rest.d.ts +0 -15
  433. package/lib/tree/rest.d.ts.map +0 -1
  434. package/lib/tree/rest.js +0 -32
  435. package/lib/tree/rest.js.map +0 -1
  436. package/lib/tree/rules-raw.d.ts +0 -17
  437. package/lib/tree/rules-raw.d.ts.map +0 -1
  438. package/lib/tree/rules-raw.js +0 -37
  439. package/lib/tree/rules-raw.js.map +0 -1
  440. package/lib/tree/rules.d.ts +0 -262
  441. package/lib/tree/rules.d.ts.map +0 -1
  442. package/lib/tree/rules.js +0 -2359
  443. package/lib/tree/rules.js.map +0 -1
  444. package/lib/tree/ruleset.d.ts +0 -92
  445. package/lib/tree/ruleset.d.ts.map +0 -1
  446. package/lib/tree/ruleset.js +0 -528
  447. package/lib/tree/ruleset.js.map +0 -1
  448. package/lib/tree/selector-attr.d.ts +0 -31
  449. package/lib/tree/selector-attr.d.ts.map +0 -1
  450. package/lib/tree/selector-attr.js +0 -99
  451. package/lib/tree/selector-attr.js.map +0 -1
  452. package/lib/tree/selector-basic.d.ts +0 -24
  453. package/lib/tree/selector-basic.d.ts.map +0 -1
  454. package/lib/tree/selector-basic.js +0 -38
  455. package/lib/tree/selector-basic.js.map +0 -1
  456. package/lib/tree/selector-capture.d.ts +0 -23
  457. package/lib/tree/selector-capture.d.ts.map +0 -1
  458. package/lib/tree/selector-capture.js +0 -34
  459. package/lib/tree/selector-capture.js.map +0 -1
  460. package/lib/tree/selector-complex.d.ts +0 -40
  461. package/lib/tree/selector-complex.d.ts.map +0 -1
  462. package/lib/tree/selector-complex.js +0 -143
  463. package/lib/tree/selector-complex.js.map +0 -1
  464. package/lib/tree/selector-compound.d.ts +0 -16
  465. package/lib/tree/selector-compound.d.ts.map +0 -1
  466. package/lib/tree/selector-compound.js +0 -114
  467. package/lib/tree/selector-compound.js.map +0 -1
  468. package/lib/tree/selector-interpolated.d.ts +0 -23
  469. package/lib/tree/selector-interpolated.d.ts.map +0 -1
  470. package/lib/tree/selector-interpolated.js +0 -27
  471. package/lib/tree/selector-interpolated.js.map +0 -1
  472. package/lib/tree/selector-list.d.ts +0 -17
  473. package/lib/tree/selector-list.d.ts.map +0 -1
  474. package/lib/tree/selector-list.js +0 -174
  475. package/lib/tree/selector-list.js.map +0 -1
  476. package/lib/tree/selector-pseudo.d.ts +0 -42
  477. package/lib/tree/selector-pseudo.d.ts.map +0 -1
  478. package/lib/tree/selector-pseudo.js +0 -204
  479. package/lib/tree/selector-pseudo.js.map +0 -1
  480. package/lib/tree/selector-simple.d.ts +0 -5
  481. package/lib/tree/selector-simple.d.ts.map +0 -1
  482. package/lib/tree/selector-simple.js +0 -6
  483. package/lib/tree/selector-simple.js.map +0 -1
  484. package/lib/tree/selector.d.ts +0 -43
  485. package/lib/tree/selector.d.ts.map +0 -1
  486. package/lib/tree/selector.js +0 -56
  487. package/lib/tree/selector.js.map +0 -1
  488. package/lib/tree/sequence.d.ts +0 -43
  489. package/lib/tree/sequence.d.ts.map +0 -1
  490. package/lib/tree/sequence.js +0 -151
  491. package/lib/tree/sequence.js.map +0 -1
  492. package/lib/tree/tree.d.ts +0 -87
  493. package/lib/tree/tree.d.ts.map +0 -1
  494. package/lib/tree/tree.js +0 -2
  495. package/lib/tree/tree.js.map +0 -1
  496. package/lib/tree/url.d.ts +0 -18
  497. package/lib/tree/url.d.ts.map +0 -1
  498. package/lib/tree/url.js +0 -35
  499. package/lib/tree/url.js.map +0 -1
  500. package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
  501. package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
  502. package/lib/tree/util/__tests__/debug-log.js +0 -36
  503. package/lib/tree/util/__tests__/debug-log.js.map +0 -1
  504. package/lib/tree/util/calculate.d.ts +0 -3
  505. package/lib/tree/util/calculate.d.ts.map +0 -1
  506. package/lib/tree/util/calculate.js +0 -10
  507. package/lib/tree/util/calculate.js.map +0 -1
  508. package/lib/tree/util/cast.d.ts +0 -10
  509. package/lib/tree/util/cast.d.ts.map +0 -1
  510. package/lib/tree/util/cast.js +0 -87
  511. package/lib/tree/util/cast.js.map +0 -1
  512. package/lib/tree/util/cloning.d.ts +0 -4
  513. package/lib/tree/util/cloning.d.ts.map +0 -1
  514. package/lib/tree/util/cloning.js +0 -8
  515. package/lib/tree/util/cloning.js.map +0 -1
  516. package/lib/tree/util/collections.d.ts +0 -57
  517. package/lib/tree/util/collections.d.ts.map +0 -1
  518. package/lib/tree/util/collections.js +0 -136
  519. package/lib/tree/util/collections.js.map +0 -1
  520. package/lib/tree/util/compare.d.ts +0 -11
  521. package/lib/tree/util/compare.d.ts.map +0 -1
  522. package/lib/tree/util/compare.js +0 -89
  523. package/lib/tree/util/compare.js.map +0 -1
  524. package/lib/tree/util/extend-helpers.d.ts +0 -2
  525. package/lib/tree/util/extend-helpers.d.ts.map +0 -1
  526. package/lib/tree/util/extend-helpers.js +0 -2
  527. package/lib/tree/util/extend-helpers.js.map +0 -1
  528. package/lib/tree/util/extend-roots.d.ts +0 -37
  529. package/lib/tree/util/extend-roots.d.ts.map +0 -1
  530. package/lib/tree/util/extend-roots.js +0 -700
  531. package/lib/tree/util/extend-roots.js.map +0 -1
  532. package/lib/tree/util/extend-roots.old.d.ts +0 -132
  533. package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
  534. package/lib/tree/util/extend-roots.old.js +0 -2272
  535. package/lib/tree/util/extend-roots.old.js.map +0 -1
  536. package/lib/tree/util/extend-trace-debug.d.ts +0 -13
  537. package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
  538. package/lib/tree/util/extend-trace-debug.js +0 -34
  539. package/lib/tree/util/extend-trace-debug.js.map +0 -1
  540. package/lib/tree/util/extend-walk.d.ts +0 -53
  541. package/lib/tree/util/extend-walk.d.ts.map +0 -1
  542. package/lib/tree/util/extend-walk.js +0 -881
  543. package/lib/tree/util/extend-walk.js.map +0 -1
  544. package/lib/tree/util/extend.d.ts +0 -218
  545. package/lib/tree/util/extend.d.ts.map +0 -1
  546. package/lib/tree/util/extend.js +0 -3182
  547. package/lib/tree/util/extend.js.map +0 -1
  548. package/lib/tree/util/find-extendable-locations.d.ts +0 -2
  549. package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
  550. package/lib/tree/util/find-extendable-locations.js +0 -2
  551. package/lib/tree/util/find-extendable-locations.js.map +0 -1
  552. package/lib/tree/util/format.d.ts +0 -20
  553. package/lib/tree/util/format.d.ts.map +0 -1
  554. package/lib/tree/util/format.js +0 -67
  555. package/lib/tree/util/format.js.map +0 -1
  556. package/lib/tree/util/is-node.d.ts +0 -13
  557. package/lib/tree/util/is-node.d.ts.map +0 -1
  558. package/lib/tree/util/is-node.js +0 -43
  559. package/lib/tree/util/is-node.js.map +0 -1
  560. package/lib/tree/util/print.d.ts +0 -80
  561. package/lib/tree/util/print.d.ts.map +0 -1
  562. package/lib/tree/util/print.js +0 -205
  563. package/lib/tree/util/print.js.map +0 -1
  564. package/lib/tree/util/process-leading-is.d.ts +0 -25
  565. package/lib/tree/util/process-leading-is.d.ts.map +0 -1
  566. package/lib/tree/util/process-leading-is.js +0 -364
  567. package/lib/tree/util/process-leading-is.js.map +0 -1
  568. package/lib/tree/util/recursion-helper.d.ts +0 -15
  569. package/lib/tree/util/recursion-helper.d.ts.map +0 -1
  570. package/lib/tree/util/recursion-helper.js +0 -43
  571. package/lib/tree/util/recursion-helper.js.map +0 -1
  572. package/lib/tree/util/regex.d.ts +0 -4
  573. package/lib/tree/util/regex.d.ts.map +0 -1
  574. package/lib/tree/util/regex.js +0 -4
  575. package/lib/tree/util/regex.js.map +0 -1
  576. package/lib/tree/util/registry-utils.d.ts +0 -192
  577. package/lib/tree/util/registry-utils.d.ts.map +0 -1
  578. package/lib/tree/util/registry-utils.js +0 -1214
  579. package/lib/tree/util/registry-utils.js.map +0 -1
  580. package/lib/tree/util/ruleset-trace.d.ts +0 -4
  581. package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
  582. package/lib/tree/util/ruleset-trace.js +0 -14
  583. package/lib/tree/util/ruleset-trace.js.map +0 -1
  584. package/lib/tree/util/selector-compare.d.ts +0 -2
  585. package/lib/tree/util/selector-compare.d.ts.map +0 -1
  586. package/lib/tree/util/selector-compare.js +0 -2
  587. package/lib/tree/util/selector-compare.js.map +0 -1
  588. package/lib/tree/util/selector-match-core.d.ts +0 -184
  589. package/lib/tree/util/selector-match-core.d.ts.map +0 -1
  590. package/lib/tree/util/selector-match-core.js +0 -1603
  591. package/lib/tree/util/selector-match-core.js.map +0 -1
  592. package/lib/tree/util/selector-utils.d.ts +0 -30
  593. package/lib/tree/util/selector-utils.d.ts.map +0 -1
  594. package/lib/tree/util/selector-utils.js +0 -100
  595. package/lib/tree/util/selector-utils.js.map +0 -1
  596. package/lib/tree/util/serialize-helper.d.ts +0 -13
  597. package/lib/tree/util/serialize-helper.d.ts.map +0 -1
  598. package/lib/tree/util/serialize-helper.js +0 -387
  599. package/lib/tree/util/serialize-helper.js.map +0 -1
  600. package/lib/tree/util/serialize-types.d.ts +0 -9
  601. package/lib/tree/util/serialize-types.d.ts.map +0 -1
  602. package/lib/tree/util/serialize-types.js +0 -216
  603. package/lib/tree/util/serialize-types.js.map +0 -1
  604. package/lib/tree/util/should-operate.d.ts +0 -23
  605. package/lib/tree/util/should-operate.d.ts.map +0 -1
  606. package/lib/tree/util/should-operate.js +0 -46
  607. package/lib/tree/util/should-operate.js.map +0 -1
  608. package/lib/tree/util/sourcemap.d.ts +0 -7
  609. package/lib/tree/util/sourcemap.d.ts.map +0 -1
  610. package/lib/tree/util/sourcemap.js +0 -25
  611. package/lib/tree/util/sourcemap.js.map +0 -1
  612. package/lib/types/config.d.ts +0 -205
  613. package/lib/types/config.d.ts.map +0 -1
  614. package/lib/types/config.js +0 -2
  615. package/lib/types/config.js.map +0 -1
  616. package/lib/types/index.d.ts +0 -15
  617. package/lib/types/index.d.ts.map +0 -1
  618. package/lib/types/index.js +0 -3
  619. package/lib/types/index.js.map +0 -1
  620. package/lib/types/modes.d.ts.map +0 -1
  621. package/lib/types/modes.js +0 -2
  622. package/lib/types/modes.js.map +0 -1
  623. package/lib/types.d.ts +0 -61
  624. package/lib/types.d.ts.map +0 -1
  625. package/lib/types.js +0 -2
  626. package/lib/types.js.map +0 -1
  627. package/lib/use-webpack-resolver.d.ts +0 -9
  628. package/lib/use-webpack-resolver.d.ts.map +0 -1
  629. package/lib/use-webpack-resolver.js +0 -41
  630. package/lib/use-webpack-resolver.js.map +0 -1
  631. package/lib/visitor/index.d.ts +0 -136
  632. package/lib/visitor/index.d.ts.map +0 -1
  633. package/lib/visitor/index.js +0 -135
  634. package/lib/visitor/index.js.map +0 -1
  635. package/lib/visitor/less-visitor.d.ts +0 -7
  636. package/lib/visitor/less-visitor.d.ts.map +0 -1
  637. package/lib/visitor/less-visitor.js.map +0 -1
@@ -0,0 +1,421 @@
1
+ /**
2
+ * Centralized unwrapping of generated :is() pseudo-selectors when they are
3
+ * the "first visual" selector (leading). Used after ruleset eval and in
4
+ * extend post-processing. Does NOT recurse into pseudo args; callers that
5
+ * need to process pseudo args (e.g. extend) call processLeadingIs for each
6
+ * selector they care about, including args of :is/:where at processing time.
7
+ */
8
+
9
+ import type { Selector } from '../selector.js';
10
+ import { SelectorList } from '../selector-list.js';
11
+ import { ComplexSelector, type ComplexSelectorComponent } from '../selector-complex.js';
12
+ import { CompoundSelector } from '../selector-compound.js';
13
+ import { PseudoSelector } from '../selector-pseudo.js';
14
+ import { Ampersand } from '../ampersand.js';
15
+ import { F_IMPLICIT_AMPERSAND, type Node } from '../node.js';
16
+ import { Nil } from '../nil.js';
17
+ import { isPlainObject } from './collections.js';
18
+ import { isNode } from './is-node.js';
19
+ import { N } from '../node-type.js';
20
+
21
+ export type ProcessLeadingIsOptions = {
22
+ /** When true, unwrapping a generated :is(SelectorList) merges its items into the outer list (return array). */
23
+ inSelectorList?: boolean;
24
+ };
25
+
26
+ /**
27
+ * Unwrap a generated :is() that is the first visual selector, when safe.
28
+ * - If selector is a SelectorList: process each item with inSelectorList=true; flatten any array returns.
29
+ * - If selector is a single generated :is(): when inSelectorList and arg is SelectorList, return arg.data (array); else return arg.
30
+ * - If first visual component of a CompoundSelector is generated :is (arg not SelectorList): merge :is arg's last part with compound suffix into a new ComplexSelector.
31
+ * - If first visual component of a ComplexSelector is generated :is (arg not SelectorList): unwrap into the complex's components.
32
+ *
33
+ * Does NOT recurse into pseudo-selector args. Only considers the outer selector structure.
34
+ *
35
+ * @returns The processed selector, or an array of selectors when unwrapping :is(SelectorList) in list context (caller merges into list).
36
+ */
37
+ export function processLeadingIs(
38
+ selector: Selector,
39
+ options: ProcessLeadingIsOptions = {}
40
+ ): Selector | Selector[] {
41
+ const { inSelectorList = false } = options;
42
+
43
+ const getFirstVisualIndex = (items: ComplexSelectorComponent[]): number => {
44
+ for (let i = 0; i < items.length; i++) {
45
+ if (!isNode(items[i], N.Combinator)) {
46
+ return i;
47
+ }
48
+ }
49
+ return -1;
50
+ };
51
+
52
+ const getImplicitAmpPrefix = (complex: ComplexSelector): string | null => {
53
+ for (const part of complex.value) {
54
+ if (isNode(part, N.Ampersand) && (part as unknown as Node).hasFlag(F_IMPLICIT_AMPERSAND)) {
55
+ const resolved = (part as Ampersand).getResolvedSelector();
56
+ return resolved && !(resolved instanceof Nil) ? resolved.valueOf() : null;
57
+ }
58
+ }
59
+ return null;
60
+ };
61
+
62
+ const hasEscapedQuoted = (node: Node | undefined, seen = new Set<Node>()): boolean => {
63
+ if (!node || seen.has(node)) {
64
+ return false;
65
+ }
66
+ seen.add(node);
67
+ if (isNode(node, N.Quoted) && Boolean(node.escaped)) {
68
+ return true;
69
+ }
70
+ const value = 'value' in node ? node.value : undefined;
71
+ if (Array.isArray(value)) {
72
+ for (const item of value) {
73
+ if (item && typeof item === 'object' && 'type' in (item as Record<string, unknown>)) {
74
+ if (hasEscapedQuoted(item as Node, seen)) {
75
+ return true;
76
+ }
77
+ }
78
+ }
79
+ return false;
80
+ }
81
+ if (isPlainObject(value)) {
82
+ for (const item of Object.values(value)) {
83
+ if (item && typeof item === 'object' && 'type' in (item as Record<string, unknown>)) {
84
+ if (hasEscapedQuoted(item as Node, seen)) {
85
+ return true;
86
+ }
87
+ }
88
+ }
89
+ }
90
+ return false;
91
+ };
92
+
93
+ const stripImplicitPrefixFromItem = (item: Selector, implicitAmpPrefix: string): Selector => {
94
+ if (!isNode(item, N.ComplexSelector)) {
95
+ return item.clone(false) as Selector;
96
+ }
97
+ const itemComplex = item as ComplexSelector;
98
+ const firstVisualIndex = getFirstVisualIndex([...itemComplex.value]);
99
+ if (firstVisualIndex < 0) {
100
+ return item.clone(false) as Selector;
101
+ }
102
+ const firstVisual = itemComplex.value[firstVisualIndex] as Selector;
103
+ if (firstVisual.valueOf() !== implicitAmpPrefix) {
104
+ return item.clone(false) as Selector;
105
+ }
106
+ let start = firstVisualIndex + 1;
107
+ if (start < itemComplex.value.length && isNode(itemComplex.value[start], N.Combinator)) {
108
+ start++;
109
+ }
110
+ const tail = itemComplex.value.slice(start).map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
111
+ if (tail.length === 1 && !isNode(tail[0], N.Combinator)) {
112
+ return tail[0] as Selector;
113
+ }
114
+ if (tail.length > 1) {
115
+ return ComplexSelector.create(tail).inherit(itemComplex) as Selector;
116
+ }
117
+ return item.clone(false) as Selector;
118
+ };
119
+
120
+ // SelectorList: process each item; merge list results (array or SelectorList) into one list.
121
+ if (isNode(selector, N.SelectorList)) {
122
+ const list = selector as SelectorList;
123
+ const out: Selector[] = [];
124
+ const seen = new Set<string>();
125
+ let changed = false;
126
+ const pushUnique = (item: Selector): void => {
127
+ const key = item.valueOf();
128
+ if (seen.has(key)) {
129
+ changed = true;
130
+ return;
131
+ }
132
+ seen.add(key);
133
+ out.push(item);
134
+ };
135
+ for (const item of list.value) {
136
+ const result = processLeadingIs(item, { inSelectorList: true });
137
+ if (Array.isArray(result)) {
138
+ for (const entry of result) {
139
+ pushUnique(entry);
140
+ }
141
+ changed = true;
142
+ } else if (isNode(result, N.SelectorList)) {
143
+ for (const entry of (result as SelectorList).value.map(s => s.clone(false) as Selector)) {
144
+ pushUnique(entry);
145
+ }
146
+ changed = true;
147
+ } else {
148
+ pushUnique(result);
149
+ changed ||= result !== item;
150
+ }
151
+ }
152
+ if (!changed) {
153
+ return selector;
154
+ }
155
+ if (out.length === 1) {
156
+ return out[0]!;
157
+ }
158
+ return SelectorList.create(out.map(s => s.clone(false) as Selector)).inherit(selector) as Selector;
159
+ }
160
+
161
+ // Single PseudoSelector :is, generated
162
+ if (isNode(selector, N.PseudoSelector)) {
163
+ const pseudo = selector as PseudoSelector;
164
+ if (pseudo.name !== ':is' || !pseudo.generated) {
165
+ return selector;
166
+ }
167
+ const arg = pseudo.arg as Selector | undefined;
168
+ if (!arg) {
169
+ return selector;
170
+ }
171
+ if (hasEscapedQuoted(arg)) {
172
+ return selector;
173
+ }
174
+ // :is(SelectorList): in list context merge; else return array for caller to handle
175
+ if (isNode(arg, N.SelectorList)) {
176
+ if (inSelectorList) {
177
+ return arg.value.map(s => s.clone(false) as Selector);
178
+ }
179
+ // Top-level single :is(SelectorList): unwrap to the list (or single if one item)
180
+ if (arg.value.length === 1) {
181
+ return arg.value[0]!.clone(false) as Selector;
182
+ }
183
+ return SelectorList.create(arg.value.map(s => s.clone(false) as Selector)).inherit(selector) as Selector;
184
+ }
185
+ // :is(not list): unwrap to the single selector
186
+ return arg.clone(false) as Selector;
187
+ }
188
+
189
+ // CompoundSelector: first component is generated :is (arg not list) → merge suffix into last part of :is, return ComplexSelector.
190
+ // GCD of complex + compound is complex (e.g. parent * b + &[e] → * b[e]), so we unwrap to that shape.
191
+ if (isNode(selector, N.CompoundSelector)) {
192
+ const compound = selector as CompoundSelector;
193
+ const value = compound.value;
194
+ if (value.length === 0) {
195
+ return selector;
196
+ }
197
+ const first = value[0];
198
+ if (
199
+ !isNode(first, N.PseudoSelector)
200
+ || (first as PseudoSelector).name !== ':is'
201
+ || !(first as PseudoSelector).generated
202
+ ) {
203
+ return selector;
204
+ }
205
+ const arg = (first as PseudoSelector).arg as Selector | undefined;
206
+ if (!arg) {
207
+ return selector;
208
+ }
209
+ if (hasEscapedQuoted(arg)) {
210
+ return selector;
211
+ }
212
+ const normalizedArg = isNode(arg, N.SelectorList) && arg.value.length === 1
213
+ ? (arg.value[0]! as Selector)
214
+ : arg;
215
+ if (isNode(normalizedArg, N.SelectorList)) {
216
+ const suffix = value.slice(1).map(s => (s as Selector).clone(false));
217
+ if (suffix.length === 0) {
218
+ return SelectorList.create(normalizedArg.value.map(s => s.clone(false) as Selector)).inherit(selector) as Selector;
219
+ }
220
+ // Keep :is(list).suffix (e.g. :is(.one,.two).three) as one selector.
221
+ return selector;
222
+ }
223
+
224
+ const suffix = value.slice(1).map(s => (s as Selector).clone(false));
225
+ if (suffix.length === 0) {
226
+ return arg.clone(false) as Selector;
227
+ }
228
+
229
+ // Merge suffix into last component of arg (complex or compound)
230
+ if (isNode(normalizedArg, N.ComplexSelector)) {
231
+ const complex = normalizedArg as ComplexSelector;
232
+ const comps = complex.value.slice().map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
233
+ for (let i = comps.length - 1; i >= 0; i--) {
234
+ const c = comps[i]!;
235
+ if (isNode(c, N.Combinator)) {
236
+ continue;
237
+ }
238
+ if (isNode(c, N.CompoundSelector)) {
239
+ const compound = c as CompoundSelector;
240
+ const newCompound = CompoundSelector.create([
241
+ ...compound.value.map(s => (s as Selector).clone(false)),
242
+ ...suffix
243
+ ]).inherit(compound);
244
+ comps[i] = newCompound as ComplexSelectorComponent;
245
+ break;
246
+ }
247
+ comps[i] = CompoundSelector.create([
248
+ (c as Selector).clone(false),
249
+ ...suffix
250
+ ]) as ComplexSelectorComponent;
251
+ break;
252
+ }
253
+ return ComplexSelector.create(comps).inherit(selector) as Selector;
254
+ }
255
+ if (isNode(normalizedArg, N.CompoundSelector)) {
256
+ const newCompound = (normalizedArg as CompoundSelector).value.slice().map(s => (s as Selector).clone(false));
257
+ newCompound.push(...suffix);
258
+ return CompoundSelector.create(newCompound).inherit(selector) as Selector;
259
+ }
260
+ const newCompound = CompoundSelector.create([
261
+ normalizedArg.clone(false),
262
+ ...suffix
263
+ ]).inherit(selector);
264
+ return ComplexSelector.create([newCompound as ComplexSelectorComponent]).inherit(selector) as Selector;
265
+ }
266
+
267
+ // ComplexSelector: first visual component is generated :is (arg not list) → unwrap into complex
268
+ if (isNode(selector, N.ComplexSelector)) {
269
+ const complex = selector as ComplexSelector;
270
+ const implicitAmpPrefix = getImplicitAmpPrefix(complex);
271
+ if (implicitAmpPrefix) {
272
+ let changed = false;
273
+ const outComponents: ComplexSelectorComponent[] = [];
274
+ for (const part of complex.value) {
275
+ if (isNode(part, N.PseudoSelector) && part.name === ':is' && part.generated) {
276
+ const arg = part.arg;
277
+ if (arg && hasEscapedQuoted(arg as Node)) {
278
+ outComponents.push((part as Selector).clone(false) as ComplexSelectorComponent);
279
+ continue;
280
+ }
281
+ if (arg && isNode(arg, N.SelectorList)) {
282
+ const normalizedArgs = arg.value.map((item) => {
283
+ const normalized = stripImplicitPrefixFromItem(item as Selector, implicitAmpPrefix);
284
+ if (normalized.valueOf() !== (item as Selector).valueOf()) {
285
+ changed = true;
286
+ }
287
+ return normalized;
288
+ });
289
+ let nonCombinatorCount = 0;
290
+ let hasImplicitAmpPart = false;
291
+ for (const c of complex.value) {
292
+ if (!isNode(c, N.Combinator)) {
293
+ nonCombinatorCount++;
294
+ if (isNode(c, N.Ampersand) && (c as unknown as Node).hasFlag(F_IMPLICIT_AMPERSAND)) {
295
+ hasImplicitAmpPart = true;
296
+ }
297
+ }
298
+ }
299
+ // `& :is(list)` under collapse should serialize as list headers.
300
+ if (nonCombinatorCount === 2 && hasImplicitAmpPart) {
301
+ return SelectorList.create(normalizedArgs).inherit(selector) as Selector;
302
+ }
303
+ const list = SelectorList.create(normalizedArgs).inherit(arg);
304
+ outComponents.push(...list.value.map(s => s.clone(false) as ComplexSelectorComponent));
305
+ changed = true;
306
+ continue;
307
+ }
308
+ }
309
+ outComponents.push((part as Selector).clone(false) as ComplexSelectorComponent);
310
+ }
311
+ if (changed) {
312
+ if (outComponents.length === 1 && !isNode(outComponents[0], N.Combinator)) {
313
+ return outComponents[0] as Selector;
314
+ }
315
+ return ComplexSelector.create(outComponents).inherit(selector) as Selector;
316
+ }
317
+ }
318
+
319
+ const value = [...complex.value];
320
+ const firstSelIndex = getFirstVisualIndex(value);
321
+ if (firstSelIndex < 0) {
322
+ return selector;
323
+ }
324
+ const first = value[firstSelIndex];
325
+ if (
326
+ isNode(first, N.CompoundSelector)
327
+ && isNode((first as CompoundSelector).value?.[0], N.PseudoSelector)
328
+ && ((first as CompoundSelector).value?.[0] as PseudoSelector).name === ':is'
329
+ && ((first as CompoundSelector).value?.[0] as PseudoSelector).generated
330
+ ) {
331
+ const unwrappedFirst = processLeadingIs(first as Selector, { inSelectorList: false });
332
+ if (!Array.isArray(unwrappedFirst)) {
333
+ const prefix = value
334
+ .slice(0, firstSelIndex)
335
+ .map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
336
+ const rest = value
337
+ .slice(firstSelIndex + 1)
338
+ .map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
339
+ const unwrappedComps = isNode(unwrappedFirst, N.ComplexSelector)
340
+ ? (unwrappedFirst as ComplexSelector).value.map(c => (c as Selector).clone(false) as ComplexSelectorComponent)
341
+ : [unwrappedFirst.clone(false) as ComplexSelectorComponent];
342
+ return ComplexSelector.create([
343
+ ...prefix,
344
+ ...unwrappedComps,
345
+ ...rest
346
+ ]).inherit(selector) as Selector;
347
+ }
348
+ }
349
+ if (
350
+ !isNode(first, N.PseudoSelector)
351
+ || (first as PseudoSelector).name !== ':is'
352
+ || !(first as PseudoSelector).generated
353
+ ) {
354
+ return selector;
355
+ }
356
+ const arg = (first as PseudoSelector).arg as Selector | undefined;
357
+ if (!arg) {
358
+ return selector;
359
+ }
360
+ if (hasEscapedQuoted(arg)) {
361
+ return selector;
362
+ }
363
+ const normalizedArg = isNode(arg, N.SelectorList) && arg.value.length === 1
364
+ ? (arg.value[0]! as Selector)
365
+ : arg;
366
+ if (isNode(normalizedArg, N.SelectorList)) {
367
+ const normalizedList = processLeadingIs(normalizedArg as Selector, { inSelectorList: true });
368
+ const rest = value.slice(firstSelIndex + 1).map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
369
+ // Keep :is(list) when there is a suffix (e.g. :is(.one,.two) .three) so it serializes as one selector.
370
+ if (rest.length > 0) {
371
+ if (isNode(normalizedList, N.SelectorList) && normalizedList !== normalizedArg) {
372
+ const copy = (first as PseudoSelector).clone(false) as PseudoSelector;
373
+ copy.adopt(normalizedList);
374
+ copy.arg = normalizedList;
375
+ return ComplexSelector.create([
376
+ ...value.slice(0, firstSelIndex).map(c => (c as Selector).clone(false) as ComplexSelectorComponent),
377
+ copy as unknown as ComplexSelectorComponent,
378
+ ...rest
379
+ ]).inherit(selector) as Selector;
380
+ }
381
+ return selector;
382
+ }
383
+ const listArg = isNode(normalizedList, N.SelectorList)
384
+ ? normalizedList as SelectorList
385
+ : normalizedArg as SelectorList;
386
+ const expanded: Selector[] = listArg.value.map((item) => {
387
+ if (isNode(item, N.ComplexSelector)) {
388
+ return ComplexSelector.create([
389
+ ...(item as ComplexSelector).value.map(c => (c as Selector).clone(false) as ComplexSelectorComponent),
390
+ ...rest
391
+ ]).inherit(selector) as Selector;
392
+ }
393
+ if (rest.length === 0) {
394
+ return (item as Selector).clone(false) as Selector;
395
+ }
396
+ return ComplexSelector.create([
397
+ (item as Selector).clone(false) as ComplexSelectorComponent,
398
+ ...rest
399
+ ]).inherit(selector) as Selector;
400
+ });
401
+ if (expanded.length === 1) {
402
+ return expanded[0]!;
403
+ }
404
+ return SelectorList.create(expanded).inherit(selector) as Selector;
405
+ }
406
+
407
+ if (isNode(normalizedArg, N.ComplexSelector)) {
408
+ const argComplex = normalizedArg as ComplexSelector;
409
+ const rest = value.slice(firstSelIndex + 1);
410
+ const argComps = argComplex.value.slice().map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
411
+ const restComps = rest.map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
412
+ const newValue = [...argComps, ...restComps];
413
+ return ComplexSelector.create(newValue).inherit(selector) as Selector;
414
+ }
415
+ const rest = value.slice(firstSelIndex + 1).map(c => (c as Selector).clone(false) as ComplexSelectorComponent);
416
+ const newValue = [normalizedArg.clone(false) as ComplexSelectorComponent, ...rest];
417
+ return ComplexSelector.create(newValue).inherit(selector) as Selector;
418
+ }
419
+
420
+ return selector;
421
+ }
@@ -0,0 +1,54 @@
1
+ import type { Call } from '../call.js';
2
+ import type { List } from '../list.js';
3
+ import type { Context } from '../../context.js';
4
+ import { isNode } from './is-node.js';
5
+
6
+ type CallItem = string | undefined;
7
+
8
+ function getCallArgsSignature(args: List | undefined, context?: Context): string | undefined {
9
+ if (!isNode(args)) {
10
+ return undefined;
11
+ }
12
+ return args.toTrimmedString(context ? { context } : undefined);
13
+ }
14
+ /**
15
+ * This memoizes arguments for a call and returns true
16
+ * if the call has called itself with the same arguments.
17
+ *
18
+ * It lazily indexes the arguments when there's a subsequent
19
+ * call.
20
+ */
21
+ export class CallMap {
22
+ private _callMap = new Map<Call, [CallItem, ...CallItem[]]>();
23
+
24
+ add(call: Call, args: List | undefined, context?: Context) {
25
+ let set = this._callMap.get(call);
26
+ const argsSignature = getCallArgsSignature(args, context);
27
+ if (!set) {
28
+ this._callMap.set(call, [argsSignature]);
29
+ } else {
30
+ if (argsSignature === undefined && set.includes(undefined)) {
31
+ return true;
32
+ }
33
+ for (let i = 0; i < set.length; i++) {
34
+ let item = set[i]!;
35
+ if (item === argsSignature) {
36
+ return true;
37
+ }
38
+ }
39
+ }
40
+ return false;
41
+ }
42
+
43
+ delete(call: Call) {
44
+ let set = this._callMap.get(call);
45
+ if (set) {
46
+ set.pop();
47
+ if (set.length === 0) {
48
+ this._callMap.delete(call);
49
+ }
50
+ return true;
51
+ }
52
+ return false;
53
+ }
54
+ }
@@ -0,0 +1,2 @@
1
+ /** Regex constants to re-use */
2
+ export const LIST_ITEM_TRIM = /^\s+|\s+$/g;