@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,740 @@
1
+ import { describe, it, expect, beforeEach, beforeAll } from 'vitest';
2
+ import {
3
+ rules,
4
+ ruleset,
5
+ sel,
6
+ el,
7
+ sellist,
8
+ decl,
9
+ extend,
10
+ any,
11
+ co,
12
+ compound,
13
+ pseudo,
14
+ Node,
15
+ ExtendFlag
16
+ } from '../index.js';
17
+ import { Context } from '../../context.js';
18
+ import { getParent } from '../util/field-helpers.js';
19
+ import { F_EXTENDED } from '../node.js';
20
+ import { processExtends } from '../util/extend-roots.js';
21
+
22
+ let context: Context;
23
+
24
+ describe('Rules extend', () => {
25
+ beforeEach(() => {
26
+ context = new Context();
27
+ });
28
+
29
+ describe('basic extend', () => {
30
+ it('should extend a ruleset within the same file', async () => {
31
+ const node = rules([
32
+ ruleset({
33
+ selector: sellist([sel([el('.base')])]),
34
+ rules: rules([
35
+ decl({ name: 'color', value: any('red') })
36
+ ])
37
+ }),
38
+ ruleset({
39
+ selector: sellist([sel([el('.child')])]),
40
+ rules: rules([
41
+ extend({
42
+ target: el('.base')
43
+ }),
44
+ decl({ name: 'background', value: any('blue') })
45
+ ])
46
+ })
47
+ ]);
48
+
49
+ const evald = await node.eval(context);
50
+ const css = evald.render(context);
51
+ expect(css).toBeString(`
52
+ .base,
53
+ .child {
54
+ color: red;
55
+ }
56
+ .child {
57
+ background: blue;
58
+ }
59
+ `);
60
+ });
61
+
62
+ it('keeps canonical ruleset extended flags unset during state-only extend processing', async () => {
63
+ const base = ruleset({
64
+ selector: sellist([sel([el('.base')])]),
65
+ rules: rules([
66
+ decl({ name: 'color', value: any('red') })
67
+ ])
68
+ });
69
+ const child = ruleset({
70
+ selector: sellist([sel([el('.child')])]),
71
+ rules: rules([
72
+ extend({
73
+ target: el('.base')
74
+ })
75
+ ])
76
+ });
77
+ const node = rules([base, child]);
78
+
79
+ const evald = await node.eval(context);
80
+ const css = evald.render(context);
81
+ const evaluatedBase = evald.get('value').find(child => child.sourceNode === base);
82
+
83
+ expect(css).toContain('.base,');
84
+ expect(css).toContain('.child {');
85
+ expect(base.hasFlag(F_EXTENDED)).toBe(false);
86
+ expect(evaluatedBase).toBeDefined();
87
+ expect(evaluatedBase?.hasFlag(F_EXTENDED)).toBe(true);
88
+ });
89
+
90
+ it('does not re-parent canonical selector or target during a shallow clone', () => {
91
+ const target = el('.base');
92
+ const selector = el('.child');
93
+ const node = extend({
94
+ selector,
95
+ target
96
+ });
97
+
98
+ expect(selector.parent).toBe(node);
99
+ expect(target.parent).toBe(node);
100
+
101
+ const cloned = node.clone();
102
+
103
+ expect(cloned).not.toBe(node);
104
+ expect(selector.parent).toBe(node);
105
+ expect(target.parent).toBe(node);
106
+ expect(getParent(selector, context)).toBe(cloned);
107
+ expect(getParent(target, context)).toBe(cloned);
108
+ });
109
+ });
110
+
111
+ describe('multiple extends', () => {
112
+ it('should handle multiple extends in the same file', async () => {
113
+ const node = rules([
114
+ ruleset({
115
+ selector: sellist([sel([el('.base')])]),
116
+ rules: rules([
117
+ decl({ name: 'color', value: any('red') })
118
+ ])
119
+ }),
120
+ ruleset({
121
+ selector: sellist([sel([el('.child1')])]),
122
+ rules: rules([
123
+ extend({
124
+ target: el('.base')
125
+ })
126
+ ])
127
+ }),
128
+ ruleset({
129
+ selector: sellist([sel([el('.child2')])]),
130
+ rules: rules([
131
+ extend({
132
+ target: el('.base')
133
+ })
134
+ ])
135
+ })
136
+ ]);
137
+
138
+ const evald = await node.eval(context);
139
+ const css = evald.render(context);
140
+ expect(css).toBeString(`
141
+ .base,
142
+ .child1,
143
+ .child2 {
144
+ color: red;
145
+ }
146
+ `);
147
+ });
148
+ });
149
+
150
+ describe('partial extend', () => {
151
+ it('should handle partial extend (all flag)', async () => {
152
+ const node = rules([
153
+ ruleset({
154
+ selector: sellist([sel([el('.parent'), co('>'), el('.base')])]),
155
+ rules: rules([
156
+ decl({ name: 'color', value: any('red') })
157
+ ])
158
+ }),
159
+ ruleset({
160
+ selector: sellist([sel([el('.parent'), co('>'), el('.child')])]),
161
+ rules: rules([
162
+ extend({
163
+ target: el('.base'),
164
+ flag: ExtendFlag.All // ExtendFlag.All for partial matching
165
+ }),
166
+ decl({ name: 'background', value: any('blue') })
167
+ ])
168
+ })
169
+ ]);
170
+
171
+ const evald = await node.eval(context);
172
+ const css = evald.render(context);
173
+ expect(css).toBeString(`
174
+ .parent > :is(.base, .parent > .child) {
175
+ color: red;
176
+ }
177
+ .parent > .child {
178
+ background: blue;
179
+ }
180
+ `);
181
+ });
182
+ });
183
+
184
+ describe('complex selectors', () => {
185
+ it('should extend compound selectors', async () => {
186
+ const node = rules([
187
+ ruleset({
188
+ selector: sellist([sel([compound([el('.btn'), el('.primary')])])]),
189
+ rules: rules([
190
+ decl({ name: 'color', value: any('red') })
191
+ ])
192
+ }),
193
+ ruleset({
194
+ selector: sellist([sel([compound([el('.btn'), el('.secondary')])])]),
195
+ rules: rules([
196
+ extend({
197
+ target: compound([el('.btn'), el('.primary')])
198
+ }),
199
+ decl({ name: 'background', value: any('blue') })
200
+ ])
201
+ })
202
+ ]);
203
+
204
+ const evald = await node.eval(context);
205
+ const css = evald.render(context);
206
+ expect(css).toBeString(`
207
+ .btn.primary,
208
+ .btn.secondary {
209
+ color: red;
210
+ }
211
+ .btn.secondary {
212
+ background: blue;
213
+ }
214
+ `);
215
+ });
216
+
217
+ it('should extend selectors with pseudo-classes', async () => {
218
+ const node = rules([
219
+ ruleset({
220
+ selector: sellist([sel([compound([el('.btn'), pseudo({ name: ':hover' })])])]),
221
+ rules: rules([
222
+ decl({ name: 'color', value: any('red') })
223
+ ])
224
+ }),
225
+ ruleset({
226
+ selector: sellist([sel([compound([el('.btn'), pseudo({ name: ':hover' })])])]),
227
+ rules: rules([
228
+ extend({
229
+ target: compound([el('.btn'), pseudo({ name: ':hover' })])
230
+ }),
231
+ decl({ name: 'background', value: any('blue') })
232
+ ])
233
+ })
234
+ ]);
235
+
236
+ const evald = await node.eval(context);
237
+ const css = evald.render(context);
238
+ expect(css).toBeString(`
239
+ .btn:hover {
240
+ color: red;
241
+ }
242
+ .btn:hover {
243
+ background: blue;
244
+ }
245
+ `);
246
+ });
247
+ });
248
+
249
+ describe('extend chaining', () => {
250
+ it('should chain simple extends: .a -> .b -> .c', async () => {
251
+ const node = rules([
252
+ ruleset({
253
+ selector: sellist([sel([el('.a')])]),
254
+ rules: rules([
255
+ decl({ name: 'color', value: any('black') })
256
+ ])
257
+ }),
258
+ ruleset({
259
+ selector: sellist([sel([el('.b')])]),
260
+ rules: rules([
261
+ extend({
262
+ target: el('.a')
263
+ })
264
+ ])
265
+ }),
266
+ ruleset({
267
+ selector: sellist([sel([el('.c')])]),
268
+ rules: rules([
269
+ extend({
270
+ target: el('.b')
271
+ })
272
+ ])
273
+ })
274
+ ]);
275
+
276
+ const evald = await node.eval(context);
277
+ const css = evald.render(context);
278
+ expect(css).toBeString(`
279
+ .a,
280
+ .b,
281
+ .c {
282
+ color: black;
283
+ }
284
+ `);
285
+ });
286
+
287
+ it('should chain extends regardless of order: .d -> .e -> .f (reverse order)', async () => {
288
+ const node = rules([
289
+ ruleset({
290
+ selector: sellist([sel([el('.d')])]),
291
+ rules: rules([
292
+ extend({
293
+ target: el('.e')
294
+ })
295
+ ])
296
+ }),
297
+ ruleset({
298
+ selector: sellist([sel([el('.e')])]),
299
+ rules: rules([
300
+ extend({
301
+ target: el('.f')
302
+ })
303
+ ])
304
+ }),
305
+ ruleset({
306
+ selector: sellist([sel([el('.f')])]),
307
+ rules: rules([
308
+ decl({ name: 'color', value: any('black') })
309
+ ])
310
+ })
311
+ ]);
312
+
313
+ const evald = await node.eval(context);
314
+ const css = evald.render(context);
315
+ expect(css).toBeString(`
316
+ .f,
317
+ .e,
318
+ .d {
319
+ color: black;
320
+ }
321
+ `);
322
+ });
323
+
324
+ it('should chain multiple levels: .l -> .m -> .n -> .o -> .p -> .q -> .r -> .s -> .t', async () => {
325
+ const node = rules([
326
+ ruleset({
327
+ selector: sellist([sel([el('.l')])]),
328
+ rules: rules([
329
+ decl({ name: 'color', value: any('black') })
330
+ ])
331
+ }),
332
+ ruleset({
333
+ selector: sellist([sel([el('.m')])]),
334
+ rules: rules([
335
+ extend({
336
+ target: el('.l')
337
+ })
338
+ ])
339
+ }),
340
+ ruleset({
341
+ selector: sellist([sel([el('.n')])]),
342
+ rules: rules([
343
+ extend({
344
+ target: el('.m')
345
+ })
346
+ ])
347
+ }),
348
+ ruleset({
349
+ selector: sellist([sel([el('.o')])]),
350
+ rules: rules([
351
+ extend({
352
+ target: el('.n')
353
+ })
354
+ ])
355
+ }),
356
+ ruleset({
357
+ selector: sellist([sel([el('.p')])]),
358
+ rules: rules([
359
+ extend({
360
+ target: el('.o')
361
+ })
362
+ ])
363
+ }),
364
+ ruleset({
365
+ selector: sellist([sel([el('.q')])]),
366
+ rules: rules([
367
+ extend({
368
+ target: el('.p')
369
+ })
370
+ ])
371
+ }),
372
+ ruleset({
373
+ selector: sellist([sel([el('.r')])]),
374
+ rules: rules([
375
+ extend({
376
+ target: el('.q')
377
+ })
378
+ ])
379
+ }),
380
+ ruleset({
381
+ selector: sellist([sel([el('.s')])]),
382
+ rules: rules([
383
+ extend({
384
+ target: el('.r')
385
+ })
386
+ ])
387
+ }),
388
+ ruleset({
389
+ selector: sellist([sel([el('.t')])]),
390
+ rules: rules([
391
+ extend({
392
+ target: el('.s')
393
+ })
394
+ ])
395
+ })
396
+ ]);
397
+
398
+ const evald = await node.eval(context);
399
+ const css = evald.render(context);
400
+ expect(css).toBeString(`
401
+ .l,
402
+ .m,
403
+ .n,
404
+ .o,
405
+ .p,
406
+ .q,
407
+ .r,
408
+ .s,
409
+ .t {
410
+ color: black;
411
+ }
412
+ `);
413
+ });
414
+
415
+ it('should handle circular references: .x -> .y -> .z -> .x', async () => {
416
+ const node = rules([
417
+ ruleset({
418
+ selector: sellist([sel([el('.x')])]),
419
+ rules: rules([
420
+ extend({
421
+ target: el('.z')
422
+ }),
423
+ decl({ name: 'color', value: any('x') })
424
+ ])
425
+ }),
426
+ ruleset({
427
+ selector: sellist([sel([el('.y')])]),
428
+ rules: rules([
429
+ extend({
430
+ target: el('.x')
431
+ }),
432
+ decl({ name: 'color', value: any('y') })
433
+ ])
434
+ }),
435
+ ruleset({
436
+ selector: sellist([sel([el('.z')])]),
437
+ rules: rules([
438
+ extend({
439
+ target: el('.y')
440
+ }),
441
+ decl({ name: 'color', value: any('z') })
442
+ ])
443
+ })
444
+ ]);
445
+
446
+ const evald = await node.eval(context);
447
+ const css = evald.render(context);
448
+ expect(css).toBeString(`
449
+ .x,
450
+ .y,
451
+ .z {
452
+ color: x;
453
+ }
454
+ .y,
455
+ .z,
456
+ .x {
457
+ color: y;
458
+ }
459
+ .z,
460
+ .x,
461
+ .y {
462
+ color: z;
463
+ }
464
+ `);
465
+ });
466
+
467
+ it('should handle extend with all flag chaining: .g.h -> .i.j -> .k', async () => {
468
+ const node = rules([
469
+ ruleset({
470
+ selector: sellist([sel([compound([el('.g'), el('.h')])])]),
471
+ rules: rules([
472
+ decl({ name: 'color', value: any('black') })
473
+ ])
474
+ }),
475
+ ruleset({
476
+ selector: sellist([sel([compound([el('.i'), el('.j')])])]),
477
+ rules: rules([
478
+ extend({
479
+ target: el('.g'),
480
+ flag: ExtendFlag.All
481
+ }),
482
+ decl({ name: 'color', value: any('inherit') })
483
+ ])
484
+ }),
485
+ ruleset({
486
+ selector: sellist([sel([el('.k')])]),
487
+ rules: rules([
488
+ extend({
489
+ target: el('.i'),
490
+ flag: ExtendFlag.All
491
+ })
492
+ ])
493
+ })
494
+ ]);
495
+
496
+ const evald = await node.eval(context);
497
+ const css = evald.render(context);
498
+ expect(css).toBeString(`
499
+ :is(.g, :is(.i, .k).j).h {
500
+ color: black;
501
+ }
502
+ :is(.i, .k).j {
503
+ color: inherit;
504
+ }
505
+ `);
506
+ });
507
+
508
+ it('should handle extend inside ruleset: .va -> .vb -> .vc', async () => {
509
+ const node = rules([
510
+ ruleset({
511
+ selector: sellist([sel([el('.va')])]),
512
+ rules: rules([
513
+ decl({ name: 'color', value: any('black') })
514
+ ])
515
+ }),
516
+ ruleset({
517
+ selector: sellist([sel([el('.vb')])]),
518
+ rules: rules([
519
+ extend({
520
+ target: el('.va')
521
+ }),
522
+ decl({ name: 'color', value: any('inherit') })
523
+ ])
524
+ }),
525
+ ruleset({
526
+ selector: sellist([sel([el('.vc')])]),
527
+ rules: rules([
528
+ extend({
529
+ target: el('.vb')
530
+ })
531
+ ])
532
+ })
533
+ ]);
534
+
535
+ const evald = await node.eval(context);
536
+ const css = evald.render(context);
537
+ expect(css).toBeString(`
538
+ .va,
539
+ .vb,
540
+ .vc {
541
+ color: black;
542
+ }
543
+ .vb,
544
+ .vc {
545
+ color: inherit;
546
+ }
547
+ `);
548
+ });
549
+
550
+ it('should ignore self-referencing extends: .w:extend(.w)', async () => {
551
+ const node = rules([
552
+ ruleset({
553
+ selector: sellist([sel([el('.w')])]),
554
+ rules: rules([
555
+ extend({
556
+ target: el('.w')
557
+ }),
558
+ decl({ name: 'color', value: any('black') })
559
+ ])
560
+ }),
561
+ ruleset({
562
+ selector: sellist([sel([compound([el('.v'), el('.w'), el('.v')])])]),
563
+ rules: rules([
564
+ extend({
565
+ target: el('.w'),
566
+ flag: ExtendFlag.All
567
+ })
568
+ ])
569
+ })
570
+ ]);
571
+
572
+ const evald = await node.eval(context);
573
+ const css = evald.render(context);
574
+ expect(css).toBeString(`
575
+ .w,
576
+ .v.w.v {
577
+ color: black;
578
+ }
579
+ `);
580
+ });
581
+
582
+ it('should handle complex chaining with multiple branches', async () => {
583
+ const node = rules([
584
+ ruleset({
585
+ selector: sellist([sel([el('.base')])]),
586
+ rules: rules([
587
+ decl({ name: 'color', value: any('red') })
588
+ ])
589
+ }),
590
+ ruleset({
591
+ selector: sellist([sel([el('.branch1')])]),
592
+ rules: rules([
593
+ extend({
594
+ target: el('.base')
595
+ })
596
+ ])
597
+ }),
598
+ ruleset({
599
+ selector: sellist([sel([el('.branch2')])]),
600
+ rules: rules([
601
+ extend({
602
+ target: el('.base')
603
+ })
604
+ ])
605
+ }),
606
+ ruleset({
607
+ selector: sellist([sel([el('.chain1')])]),
608
+ rules: rules([
609
+ extend({
610
+ target: el('.branch1')
611
+ })
612
+ ])
613
+ }),
614
+ ruleset({
615
+ selector: sellist([sel([el('.chain2')])]),
616
+ rules: rules([
617
+ extend({
618
+ target: el('.branch2')
619
+ })
620
+ ])
621
+ })
622
+ ]);
623
+
624
+ const evald = await node.eval(context);
625
+ const css = evald.render(context);
626
+ expect(css).toBeString(`
627
+ .base,
628
+ .branch1,
629
+ .branch2,
630
+ .chain1,
631
+ .chain2 {
632
+ color: red;
633
+ }
634
+ `);
635
+ });
636
+
637
+ it('limits downstream extend matching to roots inside the recorded namespace', () => {
638
+ const localBase = ruleset({
639
+ selector: sellist([sel([el('.base')])]),
640
+ rules: rules([
641
+ decl({ name: 'color', value: any('red') })
642
+ ])
643
+ });
644
+ const localRoot = rules([localBase]);
645
+
646
+ const importedBase = ruleset({
647
+ selector: sellist([sel([el('.base')])]),
648
+ rules: rules([
649
+ decl({ name: 'color', value: any('blue') })
650
+ ])
651
+ });
652
+ const importedRoot = rules([importedBase]);
653
+
654
+ const child = ruleset({
655
+ selector: sellist([sel([el('.child')])]),
656
+ rules: rules([])
657
+ });
658
+ const extension = extend({
659
+ target: el('.base'),
660
+ namespace: 'theme'
661
+ });
662
+ const ownerRoot = rules([child]);
663
+
664
+ context.extendRoots.registerRoot(localRoot);
665
+ context.extendRoots.registerRoot(importedRoot, undefined, { namespace: 'theme' });
666
+ context.extendRoots.registerRoot(ownerRoot);
667
+ context.extendRoots.registerRuleset(localRoot, localBase);
668
+ context.extendRoots.registerRuleset(importedRoot, importedBase);
669
+ context.extendRoots.registerRuleset(ownerRoot, child);
670
+
671
+ context.extends = [[
672
+ extension.get('target'),
673
+ child.getEffectiveSelector(false, context),
674
+ false,
675
+ ownerRoot,
676
+ extension,
677
+ undefined,
678
+ false,
679
+ 'theme'
680
+ ]];
681
+
682
+ processExtends(context);
683
+
684
+ expect(importedBase.valueOf(context)).toContain('.child');
685
+ expect(localBase.valueOf(context)).not.toContain('.child');
686
+ expect(context.warnings).toHaveLength(0);
687
+ });
688
+
689
+ it('treats a namespace miss as not-found, not not-accessible', () => {
690
+ const localBase = ruleset({
691
+ selector: sellist([sel([el('.base')])]),
692
+ rules: rules([
693
+ decl({ name: 'color', value: any('red') })
694
+ ])
695
+ });
696
+ const localRoot = rules([localBase]);
697
+
698
+ const importedBase = ruleset({
699
+ selector: sellist([sel([el('.base')])]),
700
+ rules: rules([
701
+ decl({ name: 'color', value: any('blue') })
702
+ ])
703
+ });
704
+ const importedRoot = rules([importedBase]);
705
+
706
+ const child = ruleset({
707
+ selector: sellist([sel([el('.child')])]),
708
+ rules: rules([])
709
+ });
710
+ const extension = extend({
711
+ target: el('.base'),
712
+ namespace: 'missing'
713
+ });
714
+ const ownerRoot = rules([child]);
715
+
716
+ context.extendRoots.registerRoot(localRoot);
717
+ context.extendRoots.registerRoot(importedRoot, undefined, { namespace: 'theme' });
718
+ context.extendRoots.registerRoot(ownerRoot);
719
+ context.extendRoots.registerRuleset(localRoot, localBase);
720
+ context.extendRoots.registerRuleset(importedRoot, importedBase);
721
+ context.extendRoots.registerRuleset(ownerRoot, child);
722
+
723
+ context.extends = [[
724
+ extension.get('target'),
725
+ child.getEffectiveSelector(false, context),
726
+ false,
727
+ ownerRoot,
728
+ extension,
729
+ undefined,
730
+ false,
731
+ 'missing'
732
+ ]];
733
+
734
+ processExtends(context);
735
+
736
+ expect(context.warnings).toHaveLength(1);
737
+ expect(context.warnings[0]?.code).toBe('extend/not-found');
738
+ });
739
+ });
740
+ });