@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,391 @@
1
+ import type { Class } from 'type-fest';
2
+ import { defineType, Node, F_VISIBLE, F_NON_STATIC, F_IMPLICIT_AMPERSAND, type NodeOptions } from './node.js';
3
+ import { type Context } from '../context.js';
4
+ import { Selector } from './selector.js';
5
+ import { Ampersand } from './ampersand.js';
6
+ import type { Ruleset } from './ruleset.js';
7
+ import { Nil } from './nil.js';
8
+ import { ComplexSelector, type ComplexSelectorComponent } from './selector-complex.js';
9
+ import { Combinator } from './combinator.js';
10
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
11
+ import { type MaybePromise, isThenable } from '@jesscss/awaitable-pipe';
12
+ import { isNode } from './util/is-node.js';
13
+ import { N } from './node-type.js';
14
+ import { getImplicitSelector, selectorHasAuthoredAmpersand, wrapParentSelectorForNestedContext } from './util/selector-utils.js';
15
+ import { addParentEdge } from './util/cursor.js';
16
+ import { CANONICAL, EVAL } from './node-base.js';
17
+
18
+ export enum ExtendFlag {
19
+ /** Sass and Jess default */
20
+ All = 0,
21
+ /** Less default - must not be a partial selector match */
22
+ Exact = 1
23
+ }
24
+
25
+ export type ExtendValue = {
26
+ /** The current selector. By default is `&` */
27
+ selector?: Selector;
28
+ /** The target to extend */
29
+ target: Selector;
30
+ /**
31
+ * Optional namespace scoping for extend targets.
32
+ *
33
+ * - `namespace: '*'` means "search all extend roots in this file (ignore namespace scoping)".
34
+ * - `namespace: 'ns'` means "search the extend root(s) assigned to namespace `ns`".
35
+ */
36
+ namespace?: string;
37
+ flag?: ExtendFlag;
38
+ };
39
+ /**
40
+ * Extends selectors - parsed by Less as an independent statement
41
+ * at the beginning of rules.
42
+ *
43
+ * @todo - figure out eval -- use Rules lookups
44
+ * @note - there is some pseudo-code somewhere that smartly
45
+ * registers selectors by a string code.
46
+ */
47
+ export type ExtendChildData = {
48
+ selector: Selector | undefined;
49
+ target: Selector;
50
+ namespace: string | undefined;
51
+ flag: ExtendFlag | undefined;
52
+ };
53
+
54
+ export interface Extend extends Node<ExtendValue, NodeOptions, ExtendChildData> {
55
+ type: 'Extend';
56
+ shortType: 'extend';
57
+ eval(context: Context): MaybePromise<Selector>;
58
+ }
59
+
60
+ export class Extend extends Node<ExtendValue, NodeOptions, ExtendChildData> {
61
+ static override childKeys = ['selector', 'target'] as const;
62
+
63
+ readonly selector: ExtendValue['selector'];
64
+ readonly target!: Selector;
65
+ private readonly namespace: string | undefined;
66
+ private readonly flag: ExtendFlag | undefined;
67
+
68
+ override clone(deep?: boolean, cloneFn?: (n: Node) => Node, ctx?: Context): this {
69
+ const selector = this.get('selector', ctx);
70
+ const target = this.get('target', ctx);
71
+ const namespace = this.get('namespace', ctx);
72
+ const flag = this.get('flag', ctx);
73
+ const cloneChild = cloneFn ?? ((n: Node) => n.clone(deep, cloneFn, ctx));
74
+ const options = this._meta?.options;
75
+ let priorChildParents: Array<[Node, Node | undefined]> | undefined;
76
+ if (!deep) {
77
+ priorChildParents = [];
78
+ if (selector instanceof Node) {
79
+ priorChildParents.push([selector, selector.parent]);
80
+ }
81
+ if (target instanceof Node) {
82
+ priorChildParents.push([target, target.parent]);
83
+ }
84
+ }
85
+ const newNode = new (this.constructor as Class<this>)(
86
+ {
87
+ selector: deep && selector instanceof Node ? cloneChild(selector) : selector,
88
+ target: deep ? cloneChild(target) : target,
89
+ namespace,
90
+ flag
91
+ },
92
+ options ? { ...options } : undefined,
93
+ this.location,
94
+ this.treeContext
95
+ );
96
+ if (priorChildParents) {
97
+ const renderKey = ctx?.renderKey ?? (this.renderKey === CANONICAL ? EVAL : this.renderKey);
98
+ for (const [child, priorParent] of priorChildParents) {
99
+ addParentEdge(child, renderKey, newNode);
100
+ (child as unknown as { parent?: Node }).parent = priorParent;
101
+ }
102
+ }
103
+ newNode.inherit(this);
104
+ return newNode;
105
+ }
106
+
107
+ constructor(value: ExtendValue, options?: any, location?: any, treeContext?: any) {
108
+ super(value, options, location, treeContext);
109
+ this.selector = value.selector;
110
+ this.target = value.target;
111
+ this.namespace = value.namespace;
112
+ this.flag = value.flag;
113
+ if (this.selector instanceof Node) {
114
+ this.adopt(this.selector);
115
+ }
116
+ if (this.target instanceof Node) {
117
+ this.adopt(this.target);
118
+ }
119
+ this.removeFlag(F_VISIBLE);
120
+ this.addFlag(F_NON_STATIC);
121
+ }
122
+
123
+ override valueOf(context?: Context) {
124
+ return `$extend ${this.get('target', context).valueOf()}`;
125
+ }
126
+
127
+ override toTrimmedString(options?: PrintOptions): string {
128
+ options = getPrintOptions(options);
129
+ const w = options.writer!;
130
+ const context = options.context;
131
+ let target = this.get('target', context);
132
+ let selector = this.get('selector', context);
133
+ let flag = this.get('flag', context);
134
+ let namespace = this.get('namespace', context);
135
+ const mark = w.mark();
136
+ w.add('$extend');
137
+ if (selector) {
138
+ let out = w.capture(() => selector.toString(options)).trim();
139
+ w.add(' ');
140
+ w.add(out, selector);
141
+ w.add(' ->');
142
+ }
143
+ let out = w.capture(() => target.toString(options)).trim();
144
+ w.add(' ');
145
+ if (namespace) {
146
+ w.add(`${namespace}|`);
147
+ }
148
+ w.add(out, target);
149
+ if (flag === ExtendFlag.Exact) {
150
+ w.add(' !exact');
151
+ }
152
+ w.add(';');
153
+ return w.getSince(mark);
154
+ }
155
+
156
+ // Don't preEval Extend - let it be evaluated in evalNode when the ruleset is in the frame
157
+ // This ensures the ampersand resolves to the correct ruleset selector, not the parent frame
158
+
159
+ override evalNode(context: Context): MaybePromise<Nil> {
160
+ let selector = this.get('selector', context);
161
+ let target = this.get('target', context);
162
+ let flag = this.get('flag', context);
163
+ let namespace = this.get('namespace', context);
164
+ const hasExplicitSelector = selector !== undefined;
165
+
166
+ const currentFrame = context.rulesetFrames.at(-1);
167
+
168
+ // If selector is undefined, convert it to ampersand so it resolves to the ruleset's selector
169
+ // If selector is already set to a non-ampersand (e.g., from a bubbled extend), keep it as-is
170
+ // The parser sets the selector correctly when bubbling extends, so we should preserve it
171
+ if (!selector) {
172
+ // Set selector to ampersand - it will resolve to the current ruleset's selector when evaluated
173
+ // This matches the conceptual model: .c:extend(.ext all) is like { &:extend(.ext all); } inside .c
174
+ // The frame selector should already be :is(.a, .b) .c (the evaluated selector from preEval)
175
+ selector = Ampersand.create(undefined);
176
+ // Make the ampersand visible so it's included in the selector when evaluated
177
+ // This ensures the parent selector is properly included in the extend selector
178
+ selector.addFlag(F_VISIBLE);
179
+ }
180
+ // If selector is already set (e.g., .ext7 from a bubbled extend), use it directly
181
+ // Don't convert non-ampersand selectors to ampersand - they should be used as-is
182
+ // Get current extend root from registry stack
183
+ const extendRoot = context.extendRoots.getCurrentExtendRoot();
184
+ if (!extendRoot) {
185
+ /** Throw error? */
186
+ return new Nil();
187
+ }
188
+
189
+ const maybeSel = selector.eval(context);
190
+ if (isThenable(maybeSel)) {
191
+ return (maybeSel as Promise<Selector | Nil>).then((sel) => {
192
+ if (sel instanceof Nil) {
193
+ return new Nil();
194
+ }
195
+ // Resolve ampersand to its current parent selector if needed (live resolution for extend)
196
+ let resolvedSel: Selector = sel;
197
+ if (isNode(sel, N.Ampersand)) {
198
+ const ampResolved = sel.getResolvedSelector();
199
+ if (ampResolved && !(ampResolved instanceof Nil)) {
200
+ resolvedSel = ampResolved;
201
+ }
202
+ }
203
+ resolvedSel = resolveExtendSelectorInFrame(
204
+ resolvedSel,
205
+ hasExplicitSelector,
206
+ currentFrame,
207
+ context
208
+ );
209
+ resolvedSel = materializeImplicitAmpersands(resolvedSel, flag !== ExtendFlag.All);
210
+ const rs = currentFrame as Ruleset;
211
+ const docOrder = getDocumentOrderForExtend(rs, context);
212
+ const fromReferenceScope = context.inReferenceImportScope;
213
+ context.extends.push([target, resolvedSel, flag === ExtendFlag.All, extendRoot, this, docOrder, fromReferenceScope, namespace]);
214
+ return new Nil();
215
+ });
216
+ }
217
+ const sel = maybeSel as Selector | Nil;
218
+ if (sel instanceof Nil) {
219
+ return new Nil();
220
+ }
221
+ // Resolve ampersand to its current parent selector if needed (live resolution for extend)
222
+ let resolvedSel: Selector = sel;
223
+ if (isNode(sel, N.Ampersand)) {
224
+ const ampResolved = sel.getResolvedSelector();
225
+ if (ampResolved && !(ampResolved instanceof Nil)) {
226
+ resolvedSel = ampResolved;
227
+ }
228
+ }
229
+ resolvedSel = resolveExtendSelectorInFrame(
230
+ resolvedSel,
231
+ hasExplicitSelector,
232
+ currentFrame,
233
+ context
234
+ );
235
+ resolvedSel = materializeImplicitAmpersands(resolvedSel, flag !== ExtendFlag.All);
236
+ const rs = currentFrame && isNode(currentFrame, N.Ruleset) ? currentFrame as Ruleset : undefined;
237
+ const docOrder = getDocumentOrderForExtend(rs, context);
238
+ const fromReferenceScope = context.inReferenceImportScope;
239
+ context.extends.push([target, resolvedSel, flag === ExtendFlag.All, extendRoot, this, docOrder, fromReferenceScope, namespace]);
240
+ return new Nil();
241
+ }
242
+ }
243
+
244
+ function materializeImplicitAmpersands(
245
+ selector: Selector,
246
+ includeNonListImplicit: boolean
247
+ ): Selector {
248
+ const materialize = (node: Selector): Selector => {
249
+ if (isNode(node, N.Ampersand)) {
250
+ const amp = node as Ampersand;
251
+ const n = amp as unknown as Node;
252
+ if (n.hasFlag(F_IMPLICIT_AMPERSAND)) {
253
+ const resolved = amp.getResolvedSelector();
254
+ if (
255
+ resolved
256
+ && !(resolved instanceof Nil)
257
+ && (includeNonListImplicit || isNode(resolved, N.SelectorList))
258
+ ) {
259
+ return materialize(resolved.copy(true) as Selector);
260
+ }
261
+ }
262
+ return node.copy(true) as Selector;
263
+ }
264
+
265
+ if (isNode(node, N.ComplexSelector)) {
266
+ const complex = node as ComplexSelector;
267
+ const parts: Selector[] = [];
268
+ for (const part of complex.get('value') as unknown as Selector[]) {
269
+ if (isNode(part, N.Ampersand)) {
270
+ const amp = part as Ampersand;
271
+ const n = amp as unknown as Node;
272
+ if (n.hasFlag(F_IMPLICIT_AMPERSAND)) {
273
+ const resolved = amp.getResolvedSelector();
274
+ if (
275
+ resolved
276
+ && !(resolved instanceof Nil)
277
+ && (includeNonListImplicit || isNode(resolved, N.SelectorList))
278
+ ) {
279
+ const repl = materialize(resolved.copy(true) as Selector);
280
+ if (isNode(repl, N.ComplexSelector)) {
281
+ parts.push(...((repl as ComplexSelector).get('value') as unknown as Selector[]).map(x => x.copy(true) as Selector));
282
+ } else {
283
+ parts.push(repl);
284
+ }
285
+ continue;
286
+ }
287
+ }
288
+ }
289
+ const repl = materialize(part);
290
+ parts.push(repl);
291
+ }
292
+ return ComplexSelector.create(parts as ComplexSelectorComponent[]).inherit(node) as Selector;
293
+ }
294
+
295
+ const value = (node as Selector & { value?: Selector[] }).value;
296
+ if (Array.isArray(value)) {
297
+ const cloned = node.copy(true) as Selector & { value?: Selector[] };
298
+ cloned.value = value.map(item => materialize(item as Selector));
299
+ return cloned as Selector;
300
+ }
301
+
302
+ return node.copy(true) as Selector;
303
+ };
304
+
305
+ return materialize(selector);
306
+ }
307
+
308
+ /** Document order for extend: prefer parse location startOffset (source order), else assigned map, else push order (length). */
309
+ function getDocumentOrderForExtend(rs: Ruleset | undefined, context: Context): number {
310
+ if (!rs) {
311
+ return context.extends.length;
312
+ }
313
+ const loc = (rs as Node).location;
314
+ const fromLoc = Array.isArray(loc) && loc.length >= 1 && typeof loc[0] === 'number' ? loc[0] : undefined;
315
+ if (fromLoc !== undefined) {
316
+ return fromLoc;
317
+ }
318
+ const fromMap = context.documentOrderByRuleset?.get(rs);
319
+ if (fromMap !== undefined) {
320
+ return fromMap;
321
+ }
322
+ return context.extends.length;
323
+ }
324
+ export const extend = defineType(Extend, 'Extend');
325
+
326
+ function resolveExtendSelectorInFrame(
327
+ selector: Selector,
328
+ hasExplicitSelector: boolean,
329
+ currentFrame: Node | undefined,
330
+ context: Context
331
+ ): Selector {
332
+ if (!currentFrame || !isNode(currentFrame, N.Ruleset)) {
333
+ return selector;
334
+ }
335
+
336
+ const rs = currentFrame as Ruleset;
337
+ const fullSel = rs.getEffectiveSelector(false, context);
338
+ let resolvedSel = selector;
339
+ let usedParentListComposition = false;
340
+
341
+ if (!hasExplicitSelector) {
342
+ const ownSel = rs.getOwnSelector(context);
343
+ const parentFrame = context.rulesetFrames.at(-2);
344
+ const parentSel = (
345
+ parentFrame && isNode(parentFrame, N.Ruleset)
346
+ ? (parentFrame as Ruleset).getEffectiveSelector(false, context)
347
+ : undefined
348
+ );
349
+ if (
350
+ ownSel
351
+ && parentSel
352
+ && !(parentSel instanceof Nil)
353
+ && isNode(parentSel, N.SelectorList)
354
+ ) {
355
+ resolvedSel = ComplexSelector.create([
356
+ wrapParentSelectorForNestedContext(parentSel as Selector),
357
+ Combinator.create(' '),
358
+ ownSel.copy(true) as Selector
359
+ ] as unknown as ComplexSelectorComponent[]) as unknown as Selector;
360
+ usedParentListComposition = true;
361
+ }
362
+ }
363
+
364
+ if (!hasExplicitSelector && !usedParentListComposition) {
365
+ if (fullSel && !(fullSel instanceof Nil)) {
366
+ return fullSel as Selector;
367
+ }
368
+
369
+ const parentSel = rs.getEffectiveSelector(false, context);
370
+ if (parentSel && !(parentSel instanceof Nil) && resolvedSel.valueOf() !== (parentSel as Selector).valueOf()) {
371
+ return ComplexSelector.create([
372
+ (parentSel as Selector).copy(true),
373
+ Combinator.create(' '),
374
+ resolvedSel.copy(true)
375
+ ]) as unknown as Selector;
376
+ }
377
+
378
+ return resolvedSel;
379
+ }
380
+
381
+ if (
382
+ hasExplicitSelector
383
+ && selectorHasAuthoredAmpersand(resolvedSel)
384
+ && fullSel
385
+ && !(fullSel instanceof Nil)
386
+ ) {
387
+ return getImplicitSelector(resolvedSel, fullSel as Selector, false);
388
+ }
389
+
390
+ return resolvedSel;
391
+ }
@@ -0,0 +1,254 @@
1
+ import { type Context } from '../context.js';
2
+ import { defineType, F_VISIBLE, Node, type LocationInfo, type OptionalLocation, type TreeContext } from './node.js';
3
+ import type { Any, AnyRole } from './any.js';
4
+ import { Any as AnyCtor } from './any.js';
5
+ import { Interpolated } from './interpolated.js';
6
+ import { Rules } from './rules.js';
7
+ import { type List, list } from './list.js';
8
+ import type { Declaration } from './declaration.js';
9
+ import type { VarDeclaration } from './declaration-var.js';
10
+ import { VarDeclaration as VarDeclarationCtor } from './declaration-var.js';
11
+ import { Nil } from './nil.js';
12
+ import { N } from './node-type.js';
13
+ import { isNode } from './util/is-node.js';
14
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
15
+ import { getParent, getSourceParent, setChildren } from './util/field-helpers.js';
16
+
17
+ /**
18
+ * Stylesheet-defined function with a return value.
19
+ * Called `Func` to avoid conflict with the built-in `Function` class.
20
+ *
21
+ * Parsed by Sass/Jess-like languages (e.g. SCSS `@function`).
22
+ *
23
+ * Evaluation model:
24
+ * - Evaluate the function body in an isolated scope (like mixins) with bound params.
25
+ * - Then look up a declaration by name (default: `return`) and return its value.
26
+ */
27
+ export type FuncValue<Name extends AnyRole = 'name'> = {
28
+ name?: Any<Name> | Interpolated<Name>;
29
+ params?: List<Node>;
30
+ body: Node;
31
+ };
32
+
33
+ export type FuncOptions = {
34
+ /**
35
+ * Declaration name to look up after evaluating the body.
36
+ * Defaults to `'return'` (a `return: <expr>;` declaration).
37
+ */
38
+ returnName?: string;
39
+ };
40
+
41
+ export type FuncChildData = {
42
+ name: FuncValue['name'];
43
+ params: FuncValue['params'];
44
+ body: Node;
45
+ };
46
+
47
+ export interface Func extends Node<FuncValue, FuncOptions, FuncChildData> {
48
+ type: 'Func';
49
+ shortType: 'fn';
50
+ }
51
+
52
+ export class Func extends Node<FuncValue, FuncOptions, FuncChildData> {
53
+ static override childKeys = ['name', 'params', 'body'] as const;
54
+
55
+ name: FuncValue['name'];
56
+ params: FuncValue['params'];
57
+ body!: Node;
58
+
59
+ constructor(value: FuncValue, options?: FuncOptions, location?: OptionalLocation, treeContext?: TreeContext) {
60
+ super(value, options, location, treeContext);
61
+ this.name = value.name;
62
+ this.params = value.params;
63
+ this.body = value.body;
64
+ if (this.name instanceof Node) {
65
+ this.adopt(this.name);
66
+ }
67
+ if (this.params instanceof Node) {
68
+ this.adopt(this.params);
69
+ }
70
+ if (this.body instanceof Node) {
71
+ this.adopt(this.body);
72
+ }
73
+ this.removeFlag(F_VISIBLE);
74
+ }
75
+
76
+ get nameKey(): string | undefined {
77
+ return this.getNameKey();
78
+ }
79
+
80
+ getNameKey(context?: Context): string | undefined {
81
+ const name = this.get('name', context);
82
+ if (!name) {
83
+ return undefined;
84
+ }
85
+ return String(name.valueOf());
86
+ }
87
+
88
+ override toTrimmedString(options?: PrintOptions): string {
89
+ options = getPrintOptions(options);
90
+ const w = options.writer!;
91
+ const mark = w.mark();
92
+ const context = options.context;
93
+ const name = this.get('name', context);
94
+ const params = this.get('params', context);
95
+ const body = this.get('body', context);
96
+
97
+ w.add('$function', this);
98
+ w.add(' ');
99
+ w.add(name ? `${name}` : '@', this);
100
+ w.add('(');
101
+ if (params) {
102
+ params.toString(options);
103
+ }
104
+ w.add(') ');
105
+
106
+ // Body is always emitted as braced rules. If it's not a Rules node already, wrap it.
107
+ const bodyRules = body instanceof Rules ? body : Rules.create([body]);
108
+ bodyRules.toBraced(options);
109
+
110
+ return w.getSince(mark);
111
+ }
112
+
113
+ /**
114
+ * Execute the function and return its looked-up value.
115
+ *
116
+ * Functions follow the same scoped-body model as simple mixins:
117
+ * bind args into an ephemeral param scope, evaluate one render-keyed body
118
+ * wrapper, then read the return declaration from that evaluated scope.
119
+ */
120
+ async evalCall(context: Context, args: List<Node> = list([]), _contentNode?: Node): Promise<Node> {
121
+ const returnName = this.options?.returnName ?? 'return';
122
+ const name = this.get('name', context);
123
+ const params = this.get('params', context);
124
+ const bodyNode = this.get('body', context);
125
+ const renderKey = context.nextRenderKey();
126
+ const invocationParent = context.caller
127
+ ? getParent(context.caller, context) ?? context.rulesContext
128
+ : context.rulesContext ?? getParent(this, context);
129
+ const callerSourceNode = context.caller && isNode(context.caller, N.Call) && context.caller.get('name') instanceof Node
130
+ ? context.caller.get('name')
131
+ : context.caller;
132
+ const sourceParent = callerSourceNode
133
+ ? getSourceParent(callerSourceNode as Node, context)
134
+ : getSourceParent(this, context);
135
+ const scope = this._createInvocationScope(params, args, renderKey, invocationParent, context);
136
+ const bodyRules = this._createInvocationBodyRules(bodyNode, renderKey, scope ?? invocationParent, sourceParent, context);
137
+
138
+ const previousRulesContext = context.rulesContext;
139
+ const previousLookupScope = context.lookupScope;
140
+ const previousRenderKey = context.renderKey;
141
+ context.rulesContext = scope ?? bodyRules;
142
+ context.lookupScope = scope ?? bodyRules;
143
+ context.renderKey = renderKey;
144
+ let evaluated: Rules;
145
+ try {
146
+ evaluated = await bodyRules.eval(context);
147
+ } finally {
148
+ context.rulesContext = previousRulesContext;
149
+ context.lookupScope = previousLookupScope;
150
+ context.renderKey = previousRenderKey;
151
+ }
152
+
153
+ if (!(evaluated instanceof Rules)) {
154
+ throw new Error(`Function ${String(name?.valueOf() ?? '<anonymous>')} must evaluate to rules`);
155
+ }
156
+
157
+ const returnLookupOptions = { searchParents: false, context };
158
+ const decl = evaluated.find('declaration', returnName, 'Declaration', returnLookupOptions) as Declaration | undefined
159
+ ?? evaluated.find('declaration', returnName, 'VarDeclaration', returnLookupOptions) as VarDeclaration | undefined;
160
+ if (!decl) {
161
+ throw new Error(`Function ${String(name?.valueOf() ?? '<anonymous>')} must return a value (missing "${returnName}: ...")`);
162
+ }
163
+ context.rulesContext = scope ?? evaluated;
164
+ context.lookupScope = scope ?? evaluated;
165
+ context.renderKey = evaluated.renderKey;
166
+ try {
167
+ const returnValue = (decl as Declaration).get('value', context);
168
+ return await returnValue.eval(context);
169
+ } finally {
170
+ context.rulesContext = previousRulesContext;
171
+ context.lookupScope = previousLookupScope;
172
+ context.renderKey = previousRenderKey;
173
+ }
174
+ }
175
+
176
+ private _createInvocationScope(
177
+ params: List<Node> | undefined,
178
+ args: List<Node>,
179
+ renderKey: symbol,
180
+ parent: Node | undefined,
181
+ context: Context
182
+ ): Rules | undefined {
183
+ if (!params) {
184
+ return undefined;
185
+ }
186
+ const scope = Rules.create([], {
187
+ rulesVisibility: {
188
+ Ruleset: 'public',
189
+ Declaration: 'public',
190
+ VarDeclaration: 'public',
191
+ Mixin: 'public'
192
+ }
193
+ });
194
+ scope.renderKey = renderKey;
195
+ scope.parent = parent;
196
+
197
+ const invocationContext = {
198
+ ...context,
199
+ renderKey,
200
+ rulesContext: scope,
201
+ lookupScope: scope
202
+ };
203
+ const argItems = args.get('value', context);
204
+ const paramItems = params.get('value', context);
205
+
206
+ for (let i = 0; i < paramItems.length; i++) {
207
+ const param = paramItems[i]!;
208
+ if (!isNode(param, N.VarDeclaration)) {
209
+ continue;
210
+ }
211
+ const boundParam = new VarDeclarationCtor({
212
+ name: new AnyCtor(String(param.get('name', context).valueOf()), { role: 'property' }),
213
+ value: new Nil()
214
+ }, { ...(param.options ?? {}), paramVar: true }, param.location, this.treeContext);
215
+ boundParam.index = param.index ?? -(i + 1);
216
+ scope.push(boundParam);
217
+
218
+ const boundValue = argItems[i] ?? param.get('value', context);
219
+ if (boundValue) {
220
+ boundParam.setCurrentValue(boundValue, invocationContext);
221
+ }
222
+ }
223
+
224
+ return scope;
225
+ }
226
+
227
+ private _createInvocationBodyRules(
228
+ bodyNode: Node,
229
+ renderKey: symbol,
230
+ parent: Node | undefined,
231
+ sourceParent: Node | undefined,
232
+ context: Context
233
+ ): Rules {
234
+ let bodyRules: Rules;
235
+ if (bodyNode instanceof Rules) {
236
+ bodyRules = bodyNode.createShallowBodyWrapper(undefined, renderKey);
237
+ } else {
238
+ bodyRules = Rules.create([], undefined, Array.isArray(this.location) && this.location.length === 6 ? (this.location as LocationInfo) : undefined, this.treeContext);
239
+ bodyRules.renderKey = renderKey;
240
+ setChildren(bodyRules, [bodyNode], { ...context, renderKey }, { markDirty: false });
241
+ }
242
+ bodyRules.parent = parent;
243
+ bodyRules.sourceParent = sourceParent;
244
+ bodyRules.index = this.index;
245
+ return bodyRules;
246
+ }
247
+ }
248
+
249
+ export const fn = defineType(Func, 'Func', 'fn') as (
250
+ value: FuncValue | { name?: string; params?: List<Node>; body: Node },
251
+ options?: FuncOptions,
252
+ location?: OptionalLocation,
253
+ treeContext?: TreeContext
254
+ ) => Func;