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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/lib/index.cjs +20159 -0
  2. package/lib/index.d.cts +5993 -0
  3. package/lib/index.d.cts.map +1 -0
  4. package/lib/index.d.ts +5992 -21
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +19926 -22
  7. package/lib/index.js.map +1 -1
  8. package/package.json +15 -14
  9. package/src/__tests__/define-function-record.test.ts +58 -0
  10. package/src/__tests__/define-function-simple.test.ts +55 -0
  11. package/src/__tests__/define-function-split-sequence.test.ts +547 -0
  12. package/src/__tests__/define-function-type-parity.test.ts +9 -0
  13. package/src/__tests__/define-function.test.ts +763 -0
  14. package/src/__tests__/num-operations.test.ts +91 -0
  15. package/src/__tests__/safe-parse.test.ts +374 -0
  16. package/src/context.ts +896 -0
  17. package/src/conversions.ts +282 -0
  18. package/src/debug-log.ts +29 -0
  19. package/src/define-function.ts +1006 -0
  20. package/src/deprecation.ts +67 -0
  21. package/src/globals.d.ts +26 -0
  22. package/src/index.ts +31 -0
  23. package/src/jess-error.ts +773 -0
  24. package/src/logger/deprecation-processing.ts +109 -0
  25. package/src/logger.ts +31 -0
  26. package/src/plugin.ts +292 -0
  27. package/src/tree/LOOKUP_CHAINS.md +35 -0
  28. package/src/tree/README.md +18 -0
  29. package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
  30. package/src/tree/__tests__/ampersand.test.ts +382 -0
  31. package/src/tree/__tests__/at-rule.test.ts +2047 -0
  32. package/src/tree/__tests__/basic-render.test.ts +212 -0
  33. package/src/tree/__tests__/block.test.ts +40 -0
  34. package/src/tree/__tests__/call.test.ts +346 -0
  35. package/src/tree/__tests__/color.test.ts +537 -0
  36. package/src/tree/__tests__/condition.test.ts +186 -0
  37. package/src/tree/__tests__/control.test.ts +564 -0
  38. package/src/tree/__tests__/declaration.test.ts +253 -0
  39. package/src/tree/__tests__/dependency-graph.test.ts +177 -0
  40. package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
  41. package/src/tree/__tests__/dimension.test.ts +236 -0
  42. package/src/tree/__tests__/expression.test.ts +73 -0
  43. package/src/tree/__tests__/ext-node.test.ts +31 -0
  44. package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
  45. package/src/tree/__tests__/extend-import-style.test.ts +929 -0
  46. package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
  47. package/src/tree/__tests__/extend-list.test.ts +31 -0
  48. package/src/tree/__tests__/extend-roots.test.ts +1045 -0
  49. package/src/tree/__tests__/extend-rules.test.ts +740 -0
  50. package/src/tree/__tests__/func.test.ts +171 -0
  51. package/src/tree/__tests__/import-js.test.ts +33 -0
  52. package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
  53. package/src/tree/__tests__/import-style.test.ts +1967 -0
  54. package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
  55. package/src/tree/__tests__/interpolated.test.ts +41 -0
  56. package/src/tree/__tests__/list.test.ts +177 -0
  57. package/src/tree/__tests__/log.test.ts +83 -0
  58. package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
  59. package/src/tree/__tests__/mixin.test.ts +2171 -0
  60. package/src/tree/__tests__/negative.test.ts +45 -0
  61. package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
  62. package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
  63. package/src/tree/__tests__/node-flags.test.ts +410 -0
  64. package/src/tree/__tests__/node-graph.test.ts +598 -0
  65. package/src/tree/__tests__/node-mutation.test.ts +182 -0
  66. package/src/tree/__tests__/operation.test.ts +18 -0
  67. package/src/tree/__tests__/paren.test.ts +90 -0
  68. package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
  69. package/src/tree/__tests__/quoted.test.ts +72 -0
  70. package/src/tree/__tests__/range.test.ts +59 -0
  71. package/src/tree/__tests__/reference.test.ts +743 -0
  72. package/src/tree/__tests__/rest.test.ts +29 -0
  73. package/src/tree/__tests__/rules-raw.test.ts +14 -0
  74. package/src/tree/__tests__/rules.test.ts +1271 -0
  75. package/src/tree/__tests__/ruleset.test.ts +597 -0
  76. package/src/tree/__tests__/selector-attr.test.ts +50 -0
  77. package/src/tree/__tests__/selector-basic.test.ts +44 -0
  78. package/src/tree/__tests__/selector-capture.test.ts +22 -0
  79. package/src/tree/__tests__/selector-complex.test.ts +120 -0
  80. package/src/tree/__tests__/selector-compound.test.ts +74 -0
  81. package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
  82. package/src/tree/__tests__/selector-list.test.ts +59 -0
  83. package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
  84. package/src/tree/__tests__/selector.test.ts +182 -0
  85. package/src/tree/__tests__/sequence.test.ts +226 -0
  86. package/src/tree/__tests__/serialize-types.test.ts +529 -0
  87. package/src/tree/__tests__/spaced.test.ts +8 -0
  88. package/src/tree/__tests__/url.test.ts +72 -0
  89. package/src/tree/__tests__/var-declaration.test.ts +90 -0
  90. package/src/tree/ampersand.ts +538 -0
  91. package/src/tree/any.ts +169 -0
  92. package/src/tree/at-rule.ts +760 -0
  93. package/src/tree/block.ts +72 -0
  94. package/src/tree/bool.ts +46 -0
  95. package/src/tree/call.ts +593 -0
  96. package/src/tree/collection.ts +52 -0
  97. package/src/tree/color.ts +629 -0
  98. package/src/tree/combinator.ts +30 -0
  99. package/src/tree/comment.ts +36 -0
  100. package/src/tree/condition.ts +194 -0
  101. package/src/tree/control.ts +452 -0
  102. package/src/tree/declaration-custom.ts +56 -0
  103. package/src/tree/declaration-var.ts +87 -0
  104. package/src/tree/declaration.ts +742 -0
  105. package/src/tree/default-guard.ts +35 -0
  106. package/src/tree/dimension.ts +392 -0
  107. package/src/tree/expression.ts +97 -0
  108. package/src/tree/extend-list.ts +51 -0
  109. package/src/tree/extend.ts +391 -0
  110. package/src/tree/function.ts +254 -0
  111. package/src/tree/import-js.ts +130 -0
  112. package/src/tree/import-style.ts +875 -0
  113. package/{lib/tree/index.js → src/tree/index.ts} +49 -22
  114. package/src/tree/interpolated.ts +346 -0
  115. package/src/tree/js-array.ts +21 -0
  116. package/src/tree/js-expr.ts +50 -0
  117. package/src/tree/js-function.ts +31 -0
  118. package/src/tree/js-object.ts +22 -0
  119. package/src/tree/list.ts +415 -0
  120. package/src/tree/log.ts +89 -0
  121. package/src/tree/mixin.ts +331 -0
  122. package/src/tree/negative.ts +58 -0
  123. package/src/tree/nil.ts +57 -0
  124. package/src/tree/node-base.ts +1716 -0
  125. package/src/tree/node-type.ts +122 -0
  126. package/src/tree/node.ts +118 -0
  127. package/src/tree/number.ts +54 -0
  128. package/src/tree/operation.ts +187 -0
  129. package/src/tree/paren.ts +132 -0
  130. package/src/tree/query-condition.ts +47 -0
  131. package/src/tree/quoted.ts +119 -0
  132. package/src/tree/range.ts +101 -0
  133. package/src/tree/reference.ts +1099 -0
  134. package/src/tree/rest.ts +55 -0
  135. package/src/tree/rules-raw.ts +52 -0
  136. package/src/tree/rules.ts +2896 -0
  137. package/src/tree/ruleset.ts +1217 -0
  138. package/src/tree/selector-attr.ts +172 -0
  139. package/src/tree/selector-basic.ts +75 -0
  140. package/src/tree/selector-capture.ts +85 -0
  141. package/src/tree/selector-complex.ts +189 -0
  142. package/src/tree/selector-compound.ts +205 -0
  143. package/src/tree/selector-interpolated.ts +95 -0
  144. package/src/tree/selector-list.ts +245 -0
  145. package/src/tree/selector-pseudo.ts +173 -0
  146. package/src/tree/selector-simple.ts +10 -0
  147. package/src/tree/selector.ts +152 -0
  148. package/src/tree/sequence.ts +463 -0
  149. package/src/tree/tree.ts +130 -0
  150. package/src/tree/url.ts +95 -0
  151. package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
  152. package/src/tree/util/EXTEND_AUDIT.md +233 -0
  153. package/src/tree/util/EXTEND_BASELINE.md +64 -0
  154. package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
  155. package/src/tree/util/EXTEND_DOCS.md +24 -0
  156. package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
  157. package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
  158. package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
  159. package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
  160. package/src/tree/util/EXTEND_RULES.md +74 -0
  161. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
  162. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
  163. package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
  164. package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
  165. package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
  166. package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
  167. package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
  168. package/src/tree/util/__tests__/_archive/README.md +4 -0
  169. package/src/tree/util/__tests__/bitset.test.ts +142 -0
  170. package/src/tree/util/__tests__/debug-log.ts +50 -0
  171. package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
  172. package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
  173. package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
  174. package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
  175. package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
  176. package/src/tree/util/__tests__/is-node.test.ts +63 -0
  177. package/src/tree/util/__tests__/list-like.test.ts +63 -0
  178. package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
  179. package/src/tree/util/__tests__/print.test.ts +183 -0
  180. package/src/tree/util/__tests__/process-extends.test.ts +226 -0
  181. package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
  182. package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
  183. package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
  184. package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
  185. package/src/tree/util/ampersand-template.ts +9 -0
  186. package/src/tree/util/bitset.ts +194 -0
  187. package/src/tree/util/calculate.ts +11 -0
  188. package/src/tree/util/cast.ts +89 -0
  189. package/src/tree/util/cloning.ts +8 -0
  190. package/src/tree/util/collections.ts +299 -0
  191. package/src/tree/util/compare.ts +90 -0
  192. package/src/tree/util/cursor.ts +171 -0
  193. package/src/tree/util/extend-core.ts +2139 -0
  194. package/src/tree/util/extend-roots.ts +1108 -0
  195. package/src/tree/util/field-helpers.ts +354 -0
  196. package/src/tree/util/is-node.ts +43 -0
  197. package/src/tree/util/list-like.ts +93 -0
  198. package/src/tree/util/mixin-instance-primitives.ts +2020 -0
  199. package/src/tree/util/print.ts +303 -0
  200. package/src/tree/util/process-leading-is.ts +421 -0
  201. package/src/tree/util/recursion-helper.ts +54 -0
  202. package/src/tree/util/regex.ts +2 -0
  203. package/src/tree/util/registry-utils.ts +1953 -0
  204. package/src/tree/util/ruleset-trace.ts +17 -0
  205. package/src/tree/util/scoped-body-eval.ts +320 -0
  206. package/src/tree/util/selector-match-core.ts +2005 -0
  207. package/src/tree/util/selector-utils.ts +757 -0
  208. package/src/tree/util/serialize-helper.ts +535 -0
  209. package/src/tree/util/serialize-types.ts +318 -0
  210. package/src/tree/util/should-operate.ts +78 -0
  211. package/src/tree/util/sourcemap.ts +37 -0
  212. package/src/types/config.ts +247 -0
  213. package/src/types/index.ts +12 -0
  214. package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
  215. package/src/types.d.ts +9 -0
  216. package/src/types.ts +68 -0
  217. package/src/use-webpack-resolver.ts +56 -0
  218. package/src/visitor/__tests__/visitor.test.ts +136 -0
  219. package/src/visitor/index.ts +263 -0
  220. package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
  221. package/lib/context.d.ts +0 -352
  222. package/lib/context.d.ts.map +0 -1
  223. package/lib/context.js +0 -636
  224. package/lib/context.js.map +0 -1
  225. package/lib/conversions.d.ts +0 -73
  226. package/lib/conversions.d.ts.map +0 -1
  227. package/lib/conversions.js +0 -253
  228. package/lib/conversions.js.map +0 -1
  229. package/lib/debug-log.d.ts +0 -2
  230. package/lib/debug-log.d.ts.map +0 -1
  231. package/lib/debug-log.js +0 -27
  232. package/lib/debug-log.js.map +0 -1
  233. package/lib/define-function.d.ts +0 -587
  234. package/lib/define-function.d.ts.map +0 -1
  235. package/lib/define-function.js +0 -726
  236. package/lib/define-function.js.map +0 -1
  237. package/lib/deprecation.d.ts +0 -34
  238. package/lib/deprecation.d.ts.map +0 -1
  239. package/lib/deprecation.js +0 -57
  240. package/lib/deprecation.js.map +0 -1
  241. package/lib/jess-error.d.ts +0 -343
  242. package/lib/jess-error.d.ts.map +0 -1
  243. package/lib/jess-error.js +0 -508
  244. package/lib/jess-error.js.map +0 -1
  245. package/lib/logger/deprecation-processing.d.ts +0 -41
  246. package/lib/logger/deprecation-processing.d.ts.map +0 -1
  247. package/lib/logger/deprecation-processing.js +0 -81
  248. package/lib/logger/deprecation-processing.js.map +0 -1
  249. package/lib/logger.d.ts +0 -10
  250. package/lib/logger.d.ts.map +0 -1
  251. package/lib/logger.js +0 -20
  252. package/lib/logger.js.map +0 -1
  253. package/lib/plugin.d.ts +0 -94
  254. package/lib/plugin.d.ts.map +0 -1
  255. package/lib/plugin.js +0 -174
  256. package/lib/plugin.js.map +0 -1
  257. package/lib/tree/ampersand.d.ts +0 -98
  258. package/lib/tree/ampersand.d.ts.map +0 -1
  259. package/lib/tree/ampersand.js +0 -319
  260. package/lib/tree/ampersand.js.map +0 -1
  261. package/lib/tree/any.d.ts +0 -58
  262. package/lib/tree/any.d.ts.map +0 -1
  263. package/lib/tree/any.js +0 -104
  264. package/lib/tree/any.js.map +0 -1
  265. package/lib/tree/at-rule.d.ts +0 -53
  266. package/lib/tree/at-rule.d.ts.map +0 -1
  267. package/lib/tree/at-rule.js +0 -503
  268. package/lib/tree/at-rule.js.map +0 -1
  269. package/lib/tree/block.d.ts +0 -22
  270. package/lib/tree/block.d.ts.map +0 -1
  271. package/lib/tree/block.js +0 -24
  272. package/lib/tree/block.js.map +0 -1
  273. package/lib/tree/bool.d.ts +0 -18
  274. package/lib/tree/bool.d.ts.map +0 -1
  275. package/lib/tree/bool.js +0 -28
  276. package/lib/tree/bool.js.map +0 -1
  277. package/lib/tree/call.d.ts +0 -66
  278. package/lib/tree/call.d.ts.map +0 -1
  279. package/lib/tree/call.js +0 -306
  280. package/lib/tree/call.js.map +0 -1
  281. package/lib/tree/collection.d.ts +0 -30
  282. package/lib/tree/collection.d.ts.map +0 -1
  283. package/lib/tree/collection.js +0 -37
  284. package/lib/tree/collection.js.map +0 -1
  285. package/lib/tree/color.d.ts +0 -101
  286. package/lib/tree/color.d.ts.map +0 -1
  287. package/lib/tree/color.js +0 -513
  288. package/lib/tree/color.js.map +0 -1
  289. package/lib/tree/combinator.d.ts +0 -13
  290. package/lib/tree/combinator.d.ts.map +0 -1
  291. package/lib/tree/combinator.js +0 -12
  292. package/lib/tree/combinator.js.map +0 -1
  293. package/lib/tree/comment.d.ts +0 -20
  294. package/lib/tree/comment.d.ts.map +0 -1
  295. package/lib/tree/comment.js +0 -19
  296. package/lib/tree/comment.js.map +0 -1
  297. package/lib/tree/condition.d.ts +0 -31
  298. package/lib/tree/condition.d.ts.map +0 -1
  299. package/lib/tree/condition.js +0 -103
  300. package/lib/tree/condition.js.map +0 -1
  301. package/lib/tree/control.d.ts +0 -104
  302. package/lib/tree/control.d.ts.map +0 -1
  303. package/lib/tree/control.js +0 -430
  304. package/lib/tree/control.js.map +0 -1
  305. package/lib/tree/declaration-custom.d.ts +0 -18
  306. package/lib/tree/declaration-custom.d.ts.map +0 -1
  307. package/lib/tree/declaration-custom.js +0 -24
  308. package/lib/tree/declaration-custom.js.map +0 -1
  309. package/lib/tree/declaration-var.d.ts +0 -35
  310. package/lib/tree/declaration-var.d.ts.map +0 -1
  311. package/lib/tree/declaration-var.js +0 -63
  312. package/lib/tree/declaration-var.js.map +0 -1
  313. package/lib/tree/declaration.d.ts +0 -78
  314. package/lib/tree/declaration.d.ts.map +0 -1
  315. package/lib/tree/declaration.js +0 -286
  316. package/lib/tree/declaration.js.map +0 -1
  317. package/lib/tree/default-guard.d.ts +0 -15
  318. package/lib/tree/default-guard.d.ts.map +0 -1
  319. package/lib/tree/default-guard.js +0 -19
  320. package/lib/tree/default-guard.js.map +0 -1
  321. package/lib/tree/dimension.d.ts +0 -34
  322. package/lib/tree/dimension.d.ts.map +0 -1
  323. package/lib/tree/dimension.js +0 -294
  324. package/lib/tree/dimension.js.map +0 -1
  325. package/lib/tree/expression.d.ts +0 -25
  326. package/lib/tree/expression.d.ts.map +0 -1
  327. package/lib/tree/expression.js +0 -32
  328. package/lib/tree/expression.js.map +0 -1
  329. package/lib/tree/extend-list.d.ts +0 -23
  330. package/lib/tree/extend-list.d.ts.map +0 -1
  331. package/lib/tree/extend-list.js +0 -23
  332. package/lib/tree/extend-list.js.map +0 -1
  333. package/lib/tree/extend.d.ts +0 -47
  334. package/lib/tree/extend.d.ts.map +0 -1
  335. package/lib/tree/extend.js +0 -296
  336. package/lib/tree/extend.js.map +0 -1
  337. package/lib/tree/function.d.ts +0 -48
  338. package/lib/tree/function.d.ts.map +0 -1
  339. package/lib/tree/function.js +0 -74
  340. package/lib/tree/function.js.map +0 -1
  341. package/lib/tree/import-js.d.ts +0 -35
  342. package/lib/tree/import-js.d.ts.map +0 -1
  343. package/lib/tree/import-js.js +0 -45
  344. package/lib/tree/import-js.js.map +0 -1
  345. package/lib/tree/import-style.d.ts +0 -156
  346. package/lib/tree/import-style.d.ts.map +0 -1
  347. package/lib/tree/import-style.js +0 -566
  348. package/lib/tree/import-style.js.map +0 -1
  349. package/lib/tree/index.d.ts +0 -71
  350. package/lib/tree/index.d.ts.map +0 -1
  351. package/lib/tree/index.js.map +0 -1
  352. package/lib/tree/interpolated-reference.d.ts +0 -24
  353. package/lib/tree/interpolated-reference.d.ts.map +0 -1
  354. package/lib/tree/interpolated-reference.js +0 -37
  355. package/lib/tree/interpolated-reference.js.map +0 -1
  356. package/lib/tree/interpolated.d.ts +0 -62
  357. package/lib/tree/interpolated.d.ts.map +0 -1
  358. package/lib/tree/interpolated.js +0 -204
  359. package/lib/tree/interpolated.js.map +0 -1
  360. package/lib/tree/js-array.d.ts +0 -10
  361. package/lib/tree/js-array.d.ts.map +0 -1
  362. package/lib/tree/js-array.js +0 -10
  363. package/lib/tree/js-array.js.map +0 -1
  364. package/lib/tree/js-expr.d.ts +0 -23
  365. package/lib/tree/js-expr.d.ts.map +0 -1
  366. package/lib/tree/js-expr.js +0 -28
  367. package/lib/tree/js-expr.js.map +0 -1
  368. package/lib/tree/js-function.d.ts +0 -20
  369. package/lib/tree/js-function.d.ts.map +0 -1
  370. package/lib/tree/js-function.js +0 -16
  371. package/lib/tree/js-function.js.map +0 -1
  372. package/lib/tree/js-object.d.ts +0 -10
  373. package/lib/tree/js-object.d.ts.map +0 -1
  374. package/lib/tree/js-object.js +0 -10
  375. package/lib/tree/js-object.js.map +0 -1
  376. package/lib/tree/list.d.ts +0 -38
  377. package/lib/tree/list.d.ts.map +0 -1
  378. package/lib/tree/list.js +0 -83
  379. package/lib/tree/list.js.map +0 -1
  380. package/lib/tree/log.d.ts +0 -29
  381. package/lib/tree/log.d.ts.map +0 -1
  382. package/lib/tree/log.js +0 -56
  383. package/lib/tree/log.js.map +0 -1
  384. package/lib/tree/mixin.d.ts +0 -87
  385. package/lib/tree/mixin.d.ts.map +0 -1
  386. package/lib/tree/mixin.js +0 -112
  387. package/lib/tree/mixin.js.map +0 -1
  388. package/lib/tree/negative.d.ts +0 -17
  389. package/lib/tree/negative.d.ts.map +0 -1
  390. package/lib/tree/negative.js +0 -22
  391. package/lib/tree/negative.js.map +0 -1
  392. package/lib/tree/nil.d.ts +0 -30
  393. package/lib/tree/nil.d.ts.map +0 -1
  394. package/lib/tree/nil.js +0 -35
  395. package/lib/tree/nil.js.map +0 -1
  396. package/lib/tree/node-base.d.ts +0 -361
  397. package/lib/tree/node-base.d.ts.map +0 -1
  398. package/lib/tree/node-base.js +0 -930
  399. package/lib/tree/node-base.js.map +0 -1
  400. package/lib/tree/node.d.ts +0 -10
  401. package/lib/tree/node.d.ts.map +0 -1
  402. package/lib/tree/node.js +0 -45
  403. package/lib/tree/node.js.map +0 -1
  404. package/lib/tree/number.d.ts +0 -21
  405. package/lib/tree/number.d.ts.map +0 -1
  406. package/lib/tree/number.js +0 -27
  407. package/lib/tree/number.js.map +0 -1
  408. package/lib/tree/operation.d.ts +0 -26
  409. package/lib/tree/operation.d.ts.map +0 -1
  410. package/lib/tree/operation.js +0 -103
  411. package/lib/tree/operation.js.map +0 -1
  412. package/lib/tree/paren.d.ts +0 -19
  413. package/lib/tree/paren.d.ts.map +0 -1
  414. package/lib/tree/paren.js +0 -92
  415. package/lib/tree/paren.js.map +0 -1
  416. package/lib/tree/query-condition.d.ts +0 -17
  417. package/lib/tree/query-condition.d.ts.map +0 -1
  418. package/lib/tree/query-condition.js +0 -39
  419. package/lib/tree/query-condition.js.map +0 -1
  420. package/lib/tree/quoted.d.ts +0 -28
  421. package/lib/tree/quoted.d.ts.map +0 -1
  422. package/lib/tree/quoted.js +0 -75
  423. package/lib/tree/quoted.js.map +0 -1
  424. package/lib/tree/range.d.ts +0 -33
  425. package/lib/tree/range.d.ts.map +0 -1
  426. package/lib/tree/range.js +0 -47
  427. package/lib/tree/range.js.map +0 -1
  428. package/lib/tree/reference.d.ts +0 -76
  429. package/lib/tree/reference.d.ts.map +0 -1
  430. package/lib/tree/reference.js +0 -521
  431. package/lib/tree/reference.js.map +0 -1
  432. package/lib/tree/rest.d.ts +0 -15
  433. package/lib/tree/rest.d.ts.map +0 -1
  434. package/lib/tree/rest.js +0 -32
  435. package/lib/tree/rest.js.map +0 -1
  436. package/lib/tree/rules-raw.d.ts +0 -17
  437. package/lib/tree/rules-raw.d.ts.map +0 -1
  438. package/lib/tree/rules-raw.js +0 -37
  439. package/lib/tree/rules-raw.js.map +0 -1
  440. package/lib/tree/rules.d.ts +0 -262
  441. package/lib/tree/rules.d.ts.map +0 -1
  442. package/lib/tree/rules.js +0 -2359
  443. package/lib/tree/rules.js.map +0 -1
  444. package/lib/tree/ruleset.d.ts +0 -92
  445. package/lib/tree/ruleset.d.ts.map +0 -1
  446. package/lib/tree/ruleset.js +0 -528
  447. package/lib/tree/ruleset.js.map +0 -1
  448. package/lib/tree/selector-attr.d.ts +0 -31
  449. package/lib/tree/selector-attr.d.ts.map +0 -1
  450. package/lib/tree/selector-attr.js +0 -99
  451. package/lib/tree/selector-attr.js.map +0 -1
  452. package/lib/tree/selector-basic.d.ts +0 -24
  453. package/lib/tree/selector-basic.d.ts.map +0 -1
  454. package/lib/tree/selector-basic.js +0 -38
  455. package/lib/tree/selector-basic.js.map +0 -1
  456. package/lib/tree/selector-capture.d.ts +0 -23
  457. package/lib/tree/selector-capture.d.ts.map +0 -1
  458. package/lib/tree/selector-capture.js +0 -34
  459. package/lib/tree/selector-capture.js.map +0 -1
  460. package/lib/tree/selector-complex.d.ts +0 -40
  461. package/lib/tree/selector-complex.d.ts.map +0 -1
  462. package/lib/tree/selector-complex.js +0 -143
  463. package/lib/tree/selector-complex.js.map +0 -1
  464. package/lib/tree/selector-compound.d.ts +0 -16
  465. package/lib/tree/selector-compound.d.ts.map +0 -1
  466. package/lib/tree/selector-compound.js +0 -114
  467. package/lib/tree/selector-compound.js.map +0 -1
  468. package/lib/tree/selector-interpolated.d.ts +0 -23
  469. package/lib/tree/selector-interpolated.d.ts.map +0 -1
  470. package/lib/tree/selector-interpolated.js +0 -27
  471. package/lib/tree/selector-interpolated.js.map +0 -1
  472. package/lib/tree/selector-list.d.ts +0 -17
  473. package/lib/tree/selector-list.d.ts.map +0 -1
  474. package/lib/tree/selector-list.js +0 -174
  475. package/lib/tree/selector-list.js.map +0 -1
  476. package/lib/tree/selector-pseudo.d.ts +0 -42
  477. package/lib/tree/selector-pseudo.d.ts.map +0 -1
  478. package/lib/tree/selector-pseudo.js +0 -204
  479. package/lib/tree/selector-pseudo.js.map +0 -1
  480. package/lib/tree/selector-simple.d.ts +0 -5
  481. package/lib/tree/selector-simple.d.ts.map +0 -1
  482. package/lib/tree/selector-simple.js +0 -6
  483. package/lib/tree/selector-simple.js.map +0 -1
  484. package/lib/tree/selector.d.ts +0 -43
  485. package/lib/tree/selector.d.ts.map +0 -1
  486. package/lib/tree/selector.js +0 -56
  487. package/lib/tree/selector.js.map +0 -1
  488. package/lib/tree/sequence.d.ts +0 -43
  489. package/lib/tree/sequence.d.ts.map +0 -1
  490. package/lib/tree/sequence.js +0 -151
  491. package/lib/tree/sequence.js.map +0 -1
  492. package/lib/tree/tree.d.ts +0 -87
  493. package/lib/tree/tree.d.ts.map +0 -1
  494. package/lib/tree/tree.js +0 -2
  495. package/lib/tree/tree.js.map +0 -1
  496. package/lib/tree/url.d.ts +0 -18
  497. package/lib/tree/url.d.ts.map +0 -1
  498. package/lib/tree/url.js +0 -35
  499. package/lib/tree/url.js.map +0 -1
  500. package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
  501. package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
  502. package/lib/tree/util/__tests__/debug-log.js +0 -36
  503. package/lib/tree/util/__tests__/debug-log.js.map +0 -1
  504. package/lib/tree/util/calculate.d.ts +0 -3
  505. package/lib/tree/util/calculate.d.ts.map +0 -1
  506. package/lib/tree/util/calculate.js +0 -10
  507. package/lib/tree/util/calculate.js.map +0 -1
  508. package/lib/tree/util/cast.d.ts +0 -10
  509. package/lib/tree/util/cast.d.ts.map +0 -1
  510. package/lib/tree/util/cast.js +0 -87
  511. package/lib/tree/util/cast.js.map +0 -1
  512. package/lib/tree/util/cloning.d.ts +0 -4
  513. package/lib/tree/util/cloning.d.ts.map +0 -1
  514. package/lib/tree/util/cloning.js +0 -8
  515. package/lib/tree/util/cloning.js.map +0 -1
  516. package/lib/tree/util/collections.d.ts +0 -57
  517. package/lib/tree/util/collections.d.ts.map +0 -1
  518. package/lib/tree/util/collections.js +0 -136
  519. package/lib/tree/util/collections.js.map +0 -1
  520. package/lib/tree/util/compare.d.ts +0 -11
  521. package/lib/tree/util/compare.d.ts.map +0 -1
  522. package/lib/tree/util/compare.js +0 -89
  523. package/lib/tree/util/compare.js.map +0 -1
  524. package/lib/tree/util/extend-helpers.d.ts +0 -2
  525. package/lib/tree/util/extend-helpers.d.ts.map +0 -1
  526. package/lib/tree/util/extend-helpers.js +0 -2
  527. package/lib/tree/util/extend-helpers.js.map +0 -1
  528. package/lib/tree/util/extend-roots.d.ts +0 -37
  529. package/lib/tree/util/extend-roots.d.ts.map +0 -1
  530. package/lib/tree/util/extend-roots.js +0 -700
  531. package/lib/tree/util/extend-roots.js.map +0 -1
  532. package/lib/tree/util/extend-roots.old.d.ts +0 -132
  533. package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
  534. package/lib/tree/util/extend-roots.old.js +0 -2272
  535. package/lib/tree/util/extend-roots.old.js.map +0 -1
  536. package/lib/tree/util/extend-trace-debug.d.ts +0 -13
  537. package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
  538. package/lib/tree/util/extend-trace-debug.js +0 -34
  539. package/lib/tree/util/extend-trace-debug.js.map +0 -1
  540. package/lib/tree/util/extend-walk.d.ts +0 -53
  541. package/lib/tree/util/extend-walk.d.ts.map +0 -1
  542. package/lib/tree/util/extend-walk.js +0 -881
  543. package/lib/tree/util/extend-walk.js.map +0 -1
  544. package/lib/tree/util/extend.d.ts +0 -218
  545. package/lib/tree/util/extend.d.ts.map +0 -1
  546. package/lib/tree/util/extend.js +0 -3182
  547. package/lib/tree/util/extend.js.map +0 -1
  548. package/lib/tree/util/find-extendable-locations.d.ts +0 -2
  549. package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
  550. package/lib/tree/util/find-extendable-locations.js +0 -2
  551. package/lib/tree/util/find-extendable-locations.js.map +0 -1
  552. package/lib/tree/util/format.d.ts +0 -20
  553. package/lib/tree/util/format.d.ts.map +0 -1
  554. package/lib/tree/util/format.js +0 -67
  555. package/lib/tree/util/format.js.map +0 -1
  556. package/lib/tree/util/is-node.d.ts +0 -13
  557. package/lib/tree/util/is-node.d.ts.map +0 -1
  558. package/lib/tree/util/is-node.js +0 -43
  559. package/lib/tree/util/is-node.js.map +0 -1
  560. package/lib/tree/util/print.d.ts +0 -80
  561. package/lib/tree/util/print.d.ts.map +0 -1
  562. package/lib/tree/util/print.js +0 -205
  563. package/lib/tree/util/print.js.map +0 -1
  564. package/lib/tree/util/process-leading-is.d.ts +0 -25
  565. package/lib/tree/util/process-leading-is.d.ts.map +0 -1
  566. package/lib/tree/util/process-leading-is.js +0 -364
  567. package/lib/tree/util/process-leading-is.js.map +0 -1
  568. package/lib/tree/util/recursion-helper.d.ts +0 -15
  569. package/lib/tree/util/recursion-helper.d.ts.map +0 -1
  570. package/lib/tree/util/recursion-helper.js +0 -43
  571. package/lib/tree/util/recursion-helper.js.map +0 -1
  572. package/lib/tree/util/regex.d.ts +0 -4
  573. package/lib/tree/util/regex.d.ts.map +0 -1
  574. package/lib/tree/util/regex.js +0 -4
  575. package/lib/tree/util/regex.js.map +0 -1
  576. package/lib/tree/util/registry-utils.d.ts +0 -192
  577. package/lib/tree/util/registry-utils.d.ts.map +0 -1
  578. package/lib/tree/util/registry-utils.js +0 -1214
  579. package/lib/tree/util/registry-utils.js.map +0 -1
  580. package/lib/tree/util/ruleset-trace.d.ts +0 -4
  581. package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
  582. package/lib/tree/util/ruleset-trace.js +0 -14
  583. package/lib/tree/util/ruleset-trace.js.map +0 -1
  584. package/lib/tree/util/selector-compare.d.ts +0 -2
  585. package/lib/tree/util/selector-compare.d.ts.map +0 -1
  586. package/lib/tree/util/selector-compare.js +0 -2
  587. package/lib/tree/util/selector-compare.js.map +0 -1
  588. package/lib/tree/util/selector-match-core.d.ts +0 -184
  589. package/lib/tree/util/selector-match-core.d.ts.map +0 -1
  590. package/lib/tree/util/selector-match-core.js +0 -1603
  591. package/lib/tree/util/selector-match-core.js.map +0 -1
  592. package/lib/tree/util/selector-utils.d.ts +0 -30
  593. package/lib/tree/util/selector-utils.d.ts.map +0 -1
  594. package/lib/tree/util/selector-utils.js +0 -100
  595. package/lib/tree/util/selector-utils.js.map +0 -1
  596. package/lib/tree/util/serialize-helper.d.ts +0 -13
  597. package/lib/tree/util/serialize-helper.d.ts.map +0 -1
  598. package/lib/tree/util/serialize-helper.js +0 -387
  599. package/lib/tree/util/serialize-helper.js.map +0 -1
  600. package/lib/tree/util/serialize-types.d.ts +0 -9
  601. package/lib/tree/util/serialize-types.d.ts.map +0 -1
  602. package/lib/tree/util/serialize-types.js +0 -216
  603. package/lib/tree/util/serialize-types.js.map +0 -1
  604. package/lib/tree/util/should-operate.d.ts +0 -23
  605. package/lib/tree/util/should-operate.d.ts.map +0 -1
  606. package/lib/tree/util/should-operate.js +0 -46
  607. package/lib/tree/util/should-operate.js.map +0 -1
  608. package/lib/tree/util/sourcemap.d.ts +0 -7
  609. package/lib/tree/util/sourcemap.d.ts.map +0 -1
  610. package/lib/tree/util/sourcemap.js +0 -25
  611. package/lib/tree/util/sourcemap.js.map +0 -1
  612. package/lib/types/config.d.ts +0 -205
  613. package/lib/types/config.d.ts.map +0 -1
  614. package/lib/types/config.js +0 -2
  615. package/lib/types/config.js.map +0 -1
  616. package/lib/types/index.d.ts +0 -15
  617. package/lib/types/index.d.ts.map +0 -1
  618. package/lib/types/index.js +0 -3
  619. package/lib/types/index.js.map +0 -1
  620. package/lib/types/modes.d.ts.map +0 -1
  621. package/lib/types/modes.js +0 -2
  622. package/lib/types/modes.js.map +0 -1
  623. package/lib/types.d.ts +0 -61
  624. package/lib/types.d.ts.map +0 -1
  625. package/lib/types.js +0 -2
  626. package/lib/types.js.map +0 -1
  627. package/lib/use-webpack-resolver.d.ts +0 -9
  628. package/lib/use-webpack-resolver.d.ts.map +0 -1
  629. package/lib/use-webpack-resolver.js +0 -41
  630. package/lib/use-webpack-resolver.js.map +0 -1
  631. package/lib/visitor/index.d.ts +0 -136
  632. package/lib/visitor/index.d.ts.map +0 -1
  633. package/lib/visitor/index.js +0 -135
  634. package/lib/visitor/index.js.map +0 -1
  635. package/lib/visitor/less-visitor.d.ts +0 -7
  636. package/lib/visitor/less-visitor.d.ts.map +0 -1
  637. package/lib/visitor/less-visitor.js.map +0 -1
@@ -0,0 +1,593 @@
1
+ import { CALLER, CANONICAL, Node, defineType, F_VISIBLE, F_NON_STATIC, F_MAY_ASYNC, type OptionalLocation, type TreeContext } from './node.js';
2
+ import { type Context } from '../context.js';
3
+ import { isNode } from './util/is-node.js';
4
+ import { N } from './node-type.js';
5
+ import { cast } from './util/cast.js';
6
+ import { callWithContext } from '../define-function.js';
7
+ import { type PrintOptions, getPrintOptions } from './util/print.js';
8
+ import { Paren } from './paren.js';
9
+ import { isThenable } from '@jesscss/awaitable-pipe';
10
+ import { evalMixinDirect, type MixinEntry, type Rules } from './rules.js';
11
+ import { Any } from './any.js';
12
+ import { List, list } from './list.js';
13
+ import { getParent, mergeDependencies, setDependency, setParent, setSourceParent } from './util/field-helpers.js';
14
+ import { finalizeInvocationOutputRules } from './util/mixin-instance-primitives.js';
15
+ import { addParentEdge } from './util/cursor.js';
16
+
17
+ export type CallValue = {
18
+ /**
19
+ * Can be an identifier or something like a mixin or variable lookup
20
+ * e.g. $|#mixin|.class() is -> [Call name: [Ref (#mixin.class)], args: []]
21
+ */
22
+ name: string | Node;
23
+ args?: List<Node>;
24
+ /**
25
+ * Optional content node, used for passing blocks to mixins/functions.
26
+ * This is how Jess represents "call with content block" forms like:
27
+ * $ > foo(): @{ ... }
28
+ * or:
29
+ * $ > foo(): @($x) { ... }
30
+ */
31
+ contentNode?: Node;
32
+ };
33
+
34
+ export type CallOptions = {
35
+ /**
36
+ * Legacy Less feature -- if a ruleset is returned,
37
+ * all the properties can be marked as important.
38
+ */
39
+ markImportant?: boolean;
40
+ silentFail?: boolean;
41
+ /** Parser-provided hint for modern color-call syntax (space/slash form). */
42
+ modernSyntax?: boolean;
43
+ };
44
+
45
+ /**
46
+ * This is an exported type that allows extra properties
47
+ * and specifies the shape of `this` for a function call.
48
+ */
49
+ export type ExtendedFn<T extends any[] = any[], R = any> = ((this: Context, ...args: T) => R) & {
50
+ /**
51
+ * Allow for optional calling, which means an optional
52
+ * reference to a function will output a stringified
53
+ * function representation if there's an evaluation error.
54
+ *
55
+ * This is done for Less, which sets this for functions
56
+ * that have a CSS equivalent.
57
+ */
58
+ allowOptional?: boolean;
59
+ evalArgs?: boolean;
60
+ };
61
+
62
+ /**
63
+ * @note In Less, the ref for something like `rgb`
64
+ * is not a string, but is an (optional) variable reference.
65
+ */
66
+ export type CallChildData = { name: string | Node; args: List<Node> | undefined; contentNode: Node | undefined };
67
+
68
+ export interface Call {
69
+ type: 'Call';
70
+ shortType: 'call';
71
+ }
72
+
73
+ export class Call extends Node<CallValue, CallOptions, CallChildData> {
74
+ static override childKeys = ['name', 'args', 'contentNode'] as const;
75
+
76
+ name!: string | Node;
77
+ args: List<Node> | undefined;
78
+ contentNode: Node | undefined;
79
+
80
+ override clone(deep?: boolean, cloneFn?: (n: Node) => Node, ctx?: Context): this {
81
+ const name = this.get('name', ctx);
82
+ const args = this.get('args', ctx);
83
+ const contentNode = this.get('contentNode', ctx);
84
+ const cloneData: CallValue = {
85
+ name: deep && name instanceof Node ? name.clone(deep, cloneFn, ctx) : name,
86
+ args: deep && args instanceof Node ? args.clone(deep, cloneFn, ctx) : args,
87
+ contentNode: deep && contentNode instanceof Node ? contentNode.clone(deep, cloneFn, ctx) : contentNode
88
+ };
89
+
90
+ let priorChildParents: Array<[Node, Node | undefined]> | undefined;
91
+ if (!deep) {
92
+ priorChildParents = [];
93
+ if (cloneData.name instanceof Node) {
94
+ priorChildParents.push([cloneData.name, cloneData.name.parent]);
95
+ }
96
+ if (cloneData.args instanceof Node) {
97
+ priorChildParents.push([cloneData.args, cloneData.args.parent]);
98
+ }
99
+ if (cloneData.contentNode instanceof Node) {
100
+ priorChildParents.push([cloneData.contentNode, cloneData.contentNode.parent]);
101
+ }
102
+ }
103
+
104
+ const options = this._meta?.options;
105
+ const newNode: this = Reflect.construct(this.constructor, [
106
+ cloneData,
107
+ options ? { ...options } : undefined,
108
+ this.location,
109
+ this.treeContext
110
+ ]);
111
+
112
+ if (priorChildParents) {
113
+ for (const [child, priorParent] of priorChildParents) {
114
+ if (ctx) {
115
+ setParent(child, newNode, ctx);
116
+ }
117
+ Reflect.set(child, 'parent', priorParent);
118
+ }
119
+ }
120
+
121
+ newNode.inherit(this);
122
+ return newNode;
123
+ }
124
+
125
+ constructor(value: CallValue, options?: CallOptions, location?: OptionalLocation, treeContext?: TreeContext) {
126
+ super(value, options, location, treeContext);
127
+ this.name = value.name;
128
+ this.args = value.args;
129
+ this.contentNode = value.contentNode;
130
+ if (this.name instanceof Node) {
131
+ this.adopt(this.name);
132
+ }
133
+ if (this.args instanceof Node) {
134
+ this.adopt(this.args);
135
+ }
136
+ if (this.contentNode instanceof Node) {
137
+ this.adopt(this.contentNode);
138
+ }
139
+ this.requiredSemi = true;
140
+ // Function calls are always non-static and may be async
141
+ this.addFlags(F_VISIBLE, F_NON_STATIC, F_MAY_ASYNC);
142
+ }
143
+
144
+ private _serializeCallArg(node: Node, options: PrintOptions): string {
145
+ const context = options.context;
146
+ if (isNode(node, N.Sequence)) {
147
+ const children = node.get('value', context);
148
+ const isQuotedConcatSequence = (
149
+ children.some(child => isNode(child, N.Quoted))
150
+ && children.every(child => isNode(child, N.Quoted | N.Any | N.Interpolated))
151
+ );
152
+ return children
153
+ .map(child => this._serializeCallArg(child, options).replace(/^[ \t\r\f]+|[ \t\r\f]+$/g, ''))
154
+ .join(isQuotedConcatSequence ? '' : ' ');
155
+ }
156
+ if (isNode(node, N.List)) {
157
+ const sep = node.options?.sep ?? ',';
158
+ const joiner = sep === '/' ? ' / ' : `${sep} `;
159
+ return node.get('value', context)
160
+ .map(child => this._serializeCallArg(child, options).replace(/^[ \t\r\f]+|[ \t\r\f]+$/g, ''))
161
+ .join(joiner);
162
+ }
163
+ return options.writer!.capture(() => node.toString(options))
164
+ .replace(/^[ \t\r\f]+|[ \t\r\f]+$/g, '');
165
+ }
166
+
167
+ override toTrimmedString(options?: PrintOptions) {
168
+ options = getPrintOptions(options);
169
+ const w = options.writer!;
170
+ const mark = w.mark();
171
+ const context = options.context;
172
+ const { silentFail, markImportant } = this.options ?? {};
173
+ const name = this.get('name', context);
174
+ const args = this.get('args', context);
175
+ const contentNode = this.get('contentNode', context);
176
+ if (typeof name === 'string') {
177
+ w.add(name, this);
178
+ } else {
179
+ name.toString(options);
180
+ }
181
+ if (silentFail) {
182
+ w.add('?');
183
+ }
184
+ w.add('(');
185
+ if (args) {
186
+ const normalizedArgs = args.get('value', context).filter(Boolean);
187
+ const last = normalizedArgs.length - 1;
188
+ for (let i = 0; i <= last; i++) {
189
+ const arg = normalizedArgs[i]!;
190
+ w.add(this._serializeCallArg(arg, options), arg);
191
+ if (i < last) {
192
+ w.add(', ');
193
+ }
194
+ }
195
+ }
196
+ w.add(')');
197
+ if (markImportant) {
198
+ w.add(' !important');
199
+ }
200
+ if (contentNode) {
201
+ w.add(': ');
202
+ contentNode.toString(options);
203
+ }
204
+ return w.getSince(mark);
205
+ }
206
+
207
+ /** Recursively makes declarations important */
208
+ makeImportant(rules: Rules, context?: Context): Rules {
209
+ const effectiveContext = (
210
+ context
211
+ && rules.renderKey !== CANONICAL
212
+ && context.renderKey !== rules.renderKey
213
+ )
214
+ ? { ...context, renderKey: rules.renderKey }
215
+ : context;
216
+ const important: Any<'flag'> = new Any('!important', { role: 'flag' });
217
+ for (const rule of rules.get('value', effectiveContext)) {
218
+ if (isNode(rule, N.Declaration)) {
219
+ rule.setCurrentImportant(important, effectiveContext);
220
+ } else if (isNode(rule, N.Rules)) {
221
+ this.makeImportant(rule, effectiveContext);
222
+ } else if (isNode(rule, N.AtRule)) {
223
+ const nestedRules = rule.get('rules');
224
+ if (nestedRules) {
225
+ this.makeImportant(nestedRules, effectiveContext);
226
+ }
227
+ } else if (isNode(rule, N.Ruleset)) {
228
+ const nestedRules = rule.get('rules');
229
+ if (nestedRules) {
230
+ this.makeImportant(nestedRules, effectiveContext);
231
+ }
232
+ }
233
+ }
234
+ return rules;
235
+ }
236
+
237
+ /** Come back and redo -- too hard to reason about as a MaybePromise */
238
+ override evalNode(context: Context): Promise<Node> {
239
+ return (async () => {
240
+ let name = this.get('name', context);
241
+ let args = this.get('args', context);
242
+ const callOptions = this.options ?? {};
243
+ let { markImportant } = callOptions;
244
+ const applyDependencyToResult = <T extends Node>(
245
+ result: T,
246
+ nodes?: readonly (Node | undefined)[]
247
+ ): T => {
248
+ const dependency = mergeDependencies(
249
+ nodes ? [result, ...nodes] : [result],
250
+ context
251
+ );
252
+ if (dependency?.dependsOn && dependency.dependsOn.size > 0) {
253
+ setDependency(result, {
254
+ dependsOn: new Set(dependency.dependsOn),
255
+ sourceExpr: this
256
+ }, context);
257
+ }
258
+ return result;
259
+ };
260
+ const adoptCallWhitespace = <T extends Node>(node: T): T => {
261
+ node.pre = this.pre;
262
+ node.post = this.post;
263
+ node.sourceParent ??= this;
264
+ return node;
265
+ };
266
+ const cloneLeafDownstreamResult = <T extends Node>(node: T): T => {
267
+ return node.clone();
268
+ };
269
+ const materializeDownstreamResult = <T extends Node>(node: T): T => {
270
+ if (node === node.sourceNode) {
271
+ const childKeys = Reflect.get(node.constructor, 'childKeys');
272
+ if (childKeys === null) {
273
+ return cloneLeafDownstreamResult(node);
274
+ }
275
+ return node;
276
+ }
277
+ return node;
278
+ };
279
+ const materializeStylesheetFunctionRulesBoundary = <T extends Node>(node: T): T => {
280
+ if (node === node.sourceNode && isNode(node, N.Rules)) {
281
+ return node.clone(false, undefined, context);
282
+ }
283
+ return materializeDownstreamResult(node);
284
+ };
285
+ const evalArgNodes = async (nodes?: List<Node>) => {
286
+ if (!nodes) {
287
+ return undefined;
288
+ }
289
+ const out: Node[] = [];
290
+ for (const node of nodes.get('value')) {
291
+ out.push(await node.eval(context));
292
+ }
293
+ return list(out, nodes.options);
294
+ };
295
+ const anchorCallArgNodes = (nodes?: List<Node>) => {
296
+ if (!nodes) {
297
+ return;
298
+ }
299
+ for (const argNode of nodes.get('value')) {
300
+ // Anchor property refs and callback mixins to the call-site scope
301
+ // without cloning the arg tree.
302
+ if (isNode(argNode, N.Reference) && argNode.options?.type === 'property') {
303
+ setSourceParent(argNode, this, context);
304
+ } else if (isNode(argNode, N.Mixin)) {
305
+ setSourceParent(argNode, this, context);
306
+ }
307
+ }
308
+ };
309
+
310
+ context.callStack.push(this);
311
+ context.parenFrames.push(false);
312
+
313
+ if (process.env.JESS_DEBUG_LOCK === 'throw-call') {
314
+ const rawName = String(name?.valueOf?.() ?? '');
315
+ if (rawName.includes('.inner-locked-mixin')) {
316
+ throw new Error(`[lock-call:raw] ${JSON.stringify({
317
+ rawName,
318
+ parent: this.parent?.type,
319
+ sourceParent: this.sourceParent?.type,
320
+ renderKey: String(this.renderKey),
321
+ rulesContext: context.rulesContext?.type,
322
+ lookupScope: context.lookupScope?.type
323
+ })}`);
324
+ }
325
+ }
326
+ let n = typeof name === 'string' ? name : await name.eval(context);
327
+ const debugRawKey = isNode(name, N.Reference)
328
+ ? String(name.key?.valueOf?.() ?? '')
329
+ : '';
330
+ if (process.env.JESS_DEBUG_LOCK === 'log-call' && debugRawKey.includes('inner-locked-mixin')) {
331
+ console.log('[lock-call]', {
332
+ debugRawKey,
333
+ resolvedType: Array.isArray(n) ? 'array' : n?.type ?? typeof n,
334
+ resolvedName: typeof n === 'string' ? n : n?.valueOf?.(),
335
+ parent: this.parent?.type,
336
+ sourceParent: this.sourceParent?.type,
337
+ rulesContext: context.rulesContext?.type,
338
+ lookupScope: context.lookupScope?.type
339
+ });
340
+ }
341
+ if (process.env.JESS_DEBUG_LOCK === 'throw-call-resolved') {
342
+ const resolvedName = String(n?.valueOf?.() ?? '');
343
+ const rawName = String(name?.valueOf?.() ?? '');
344
+ if (rawName.includes('.inner-locked-mixin') || resolvedName.includes('.inner-locked-mixin')) {
345
+ throw new Error(`[lock-call:resolved] ${JSON.stringify({
346
+ rawName,
347
+ resolvedName,
348
+ resolvedType: Array.isArray(n) ? 'array' : n?.type,
349
+ parent: this.parent?.type,
350
+ sourceParent: this.sourceParent?.type,
351
+ renderKey: String(this.renderKey),
352
+ rulesContext: context.rulesContext?.type,
353
+ lookupScope: context.lookupScope?.type
354
+ })}`);
355
+ }
356
+ }
357
+ // Resolve mixin reference only at call time (same as variable refs: evaluate when used, not when stored).
358
+ if (isNode(n, N.Reference) && n.options?.type === 'mixin-ruleset') {
359
+ n = await n.eval(context);
360
+ }
361
+ // Note: Stylesheet-defined functions should be represented as a Reference(type='function')
362
+ // by parsers that support them. We intentionally avoid implicit string→function lookup here
363
+ // to prevent surprising behavior for plain CSS function-like calls.
364
+ // If the evaluated name is a Call node, execute it directly
365
+ // This handles cases like @alias: .something(foo); @alias();
366
+ if (isNode(n, N.Call)) {
367
+ // Execute the inner Call node (it will handle its own callStack push/pop)
368
+ const result = materializeDownstreamResult(await n.eval(context));
369
+ // Apply markImportant if needed
370
+ if (markImportant && isNode(result, N.Rules)) {
371
+ this.makeImportant(result, context);
372
+ }
373
+ // Always pop the outer call's stack entries
374
+ context.callStack.pop();
375
+ context.parenFrames.pop();
376
+ return adoptCallWhitespace(result);
377
+ } else if (isNode(n, N.Mixin) || isNode(n, N.Ruleset) || Array.isArray(n)) {
378
+ // Direct mixin invocation — skip getFunctionFromMixins/callWithContext wrapper
379
+ const originalCaller = context.caller;
380
+ context.caller = this;
381
+ try {
382
+ const result = await evalMixinDirect(context, n as MixinEntry | MixinEntry[], args);
383
+ if (process.env.JESS_DEBUG_LOCK === 'throw-nil-call' && debugRawKey.includes('inner-locked-mixin') && isNode(result, N.Nil)) {
384
+ throw new Error(`[lock-call:direct-nil] ${JSON.stringify({
385
+ debugRawKey,
386
+ resolvedType: Array.isArray(n) ? 'array' : n?.type,
387
+ parent: this.parent?.type,
388
+ sourceParent: this.sourceParent?.type,
389
+ rulesContext: context.rulesContext?.type,
390
+ lookupScope: context.lookupScope?.type
391
+ })}`);
392
+ }
393
+ // Result is already fully evaluated by the dispatch primitives — no re-eval.
394
+ if (markImportant && isNode(result, N.Rules)) {
395
+ this.makeImportant(result, context);
396
+ }
397
+ context.callStack.pop();
398
+ context.parenFrames.pop();
399
+ return adoptCallWhitespace(result);
400
+ } finally {
401
+ context.caller = originalCaller;
402
+ }
403
+ } else if (isNode(n, N.Func)) {
404
+ // Execute stylesheet-defined functions via their evalCall behavior.
405
+ const argNodes = await evalArgNodes(args) ?? list([]);
406
+ const contentNode = this.get('contentNode', context);
407
+ const originalCaller = context.caller;
408
+ context.caller = this;
409
+ try {
410
+ const result = await n.evalCall(context, argNodes, contentNode);
411
+ if (process.env.JESS_DEBUG_LOCK === 'throw-nil-call' && debugRawKey.includes('inner-locked-mixin') && isNode(result, N.Nil)) {
412
+ throw new Error(`[lock-call:func-nil] ${JSON.stringify({
413
+ debugRawKey,
414
+ resolvedType: n.type,
415
+ parent: this.parent?.type,
416
+ sourceParent: this.sourceParent?.type,
417
+ rulesContext: context.rulesContext?.type,
418
+ lookupScope: context.lookupScope?.type
419
+ })}`);
420
+ }
421
+ context.callStack.pop();
422
+ context.parenFrames.pop();
423
+ return applyDependencyToResult(
424
+ adoptCallWhitespace(materializeStylesheetFunctionRulesBoundary(result)),
425
+ argNodes.get('value')
426
+ );
427
+ } finally {
428
+ context.caller = originalCaller;
429
+ }
430
+ } else if (isNode(n, N.Collection)) {
431
+ // If the evaluated name is Rules or Collection (detached rulesets),
432
+ // return those rules directly, but only if args are empty
433
+ // If args are provided, throw an error - you can't call Rules/Collection with arguments
434
+ if (args && args.get('value').length > 0) {
435
+ context.callStack.pop();
436
+ context.parenFrames.pop();
437
+ throw new ReferenceError(`Cannot call ${n.type} with arguments`);
438
+ }
439
+ let rules: Rules = n.createPlacementWrapper(context, context.nextRenderKey());
440
+ const placementContext: Context = {
441
+ ...context,
442
+ renderKey: rules.renderKey,
443
+ rulesContext: rules
444
+ };
445
+ // Detached-ruleset invocation keeps the definition-owned `.parent` /
446
+ // `.sourceParent` chain and exposes caller ancestry through an
447
+ // explicit secondary edge.
448
+ addParentEdge(rules, CALLER, this);
449
+ rules = await rules.eval(context);
450
+ finalizeInvocationOutputRules(rules, placementContext);
451
+ context.callStack.pop();
452
+ context.parenFrames.pop();
453
+ // Apply markImportant if needed
454
+ if (markImportant) {
455
+ this.makeImportant(rules, context);
456
+ }
457
+ return rules;
458
+ }
459
+
460
+ let fn = isNode(n, N.JsFunction) ? n.value : n;
461
+ if (typeof fn === 'function') {
462
+ const originalCaller = context.caller;
463
+ context.caller = this;
464
+ let didPopCallStack = false;
465
+ try {
466
+ const fnOptions = Reflect.get(fn, 'options');
467
+ const hasParamMetadata = Boolean(fnOptions && Reflect.get(fnOptions, 'params'));
468
+ if (args) {
469
+ anchorCallArgNodes(args);
470
+ if (!hasParamMetadata) {
471
+ args = await evalArgNodes(args);
472
+ anchorCallArgNodes(args);
473
+ }
474
+ }
475
+ const result = await (
476
+ args
477
+ ? (
478
+ hasParamMetadata
479
+ ? callWithContext(context, fn, args)
480
+ : callWithContext(context, fn, ...[...args.get('value')])
481
+ )
482
+ : callWithContext(context, fn)
483
+ );
484
+ if (process.env.JESS_DEBUG_LOCK === 'throw-nil-call' && debugRawKey.includes('inner-locked-mixin') && isNode(result, N.Nil)) {
485
+ throw new Error(`[lock-call:jsfn-nil] ${JSON.stringify({
486
+ debugRawKey,
487
+ resolvedType: typeof fn,
488
+ parent: this.parent?.type,
489
+ sourceParent: this.sourceParent?.type,
490
+ rulesContext: context.rulesContext?.type,
491
+ lookupScope: context.lookupScope?.type
492
+ })}`);
493
+ }
494
+ context.caller = originalCaller;
495
+ context.callStack.pop();
496
+ didPopCallStack = true;
497
+ if (isNode(result)) {
498
+ let evald = result.eval(context);
499
+ if (isThenable(evald)) {
500
+ evald = await evald;
501
+ }
502
+ if (process.env.JESS_DEBUG_LOCK === 'throw-nil-call' && debugRawKey.includes('inner-locked-mixin') && isNode(evald, N.Nil)) {
503
+ throw new Error(`[lock-call:jsfn-post-eval-nil] ${JSON.stringify({
504
+ debugRawKey,
505
+ resultType: result.type,
506
+ parent: this.parent?.type,
507
+ sourceParent: this.sourceParent?.type,
508
+ rulesContext: context.rulesContext?.type,
509
+ lookupScope: context.lookupScope?.type
510
+ })}`);
511
+ }
512
+ if (markImportant && isNode(evald, N.Rules)) {
513
+ this.makeImportant(evald, context);
514
+ }
515
+ return adoptCallWhitespace(evald);
516
+ }
517
+ let castResult = cast(result);
518
+ if (isNode(castResult, N.Rules) && castResult.value.length === 1) {
519
+ return adoptCallWhitespace(castResult.value[0]!);
520
+ }
521
+ return adoptCallWhitespace(castResult);
522
+ } catch (e) {
523
+ const unitMode = context?.opts?.unitMode ?? 'loose';
524
+ const shouldRethrowForMode = unitMode === 'strict';
525
+ if (e instanceof ReferenceError && e.message.includes('No matching mixins')) {
526
+ if (getParent(this, context)?.type === 'SelectorCapture') {
527
+ return adoptCallWhitespace(new Any(String(n.valueOf()), { role: 'ident' }).inherit(this));
528
+ }
529
+ if (isNode(name, N.Reference)) {
530
+ throw new ReferenceError(`No matching mixins found for '${name.get('key').valueOf()}'`);
531
+ }
532
+ throw e;
533
+ }
534
+ if (!callOptions.silentFail || shouldRethrowForMode) {
535
+ throw e;
536
+ }
537
+ let newCall = this.clone().inherit(this);
538
+ /** Remove this flag for serialization */
539
+ newCall.options.silentFail = false;
540
+ newCall.name = isNode(name, N.Reference) && name.options.fallbackValue === true
541
+ ? String(name.get('key'))
542
+ : String(n.valueOf());
543
+ newCall.args = await evalArgNodes(args);
544
+ return applyDependencyToResult(adoptCallWhitespace(newCall), newCall.args?.get('value'));
545
+ } finally {
546
+ context.caller = originalCaller;
547
+ context.parenFrames.pop();
548
+ if (!didPopCallStack) {
549
+ context.callStack.pop();
550
+ }
551
+ }
552
+ } else {
553
+ if (n === 'calc') {
554
+ context.calcFrames++;
555
+ }
556
+ const evaluatedArgs = await evalArgNodes(args);
557
+
558
+ if (n === 'calc') {
559
+ context.calcFrames--;
560
+ }
561
+ context.parenFrames.pop();
562
+ context.callStack.pop();
563
+ const needsMaterializedClone = Boolean(callOptions.silentFail);
564
+ const node = needsMaterializedClone
565
+ ? this.clone()
566
+ : this.clone();
567
+ node.options.silentFail = false;
568
+ if (
569
+ n === 'calc' && evaluatedArgs
570
+ ) {
571
+ const evalArgItems = evaluatedArgs.get('value');
572
+ if (isNode(evalArgItems[0], N.Dimension)) {
573
+ return applyDependencyToResult(evalArgItems[0]!, evalArgItems);
574
+ } else if (context.calcFrames !== 0) {
575
+ return applyDependencyToResult(new Paren(evalArgItems[0]!), evalArgItems);
576
+ }
577
+ }
578
+ node.name = n;
579
+ node.args = evaluatedArgs;
580
+ return applyDependencyToResult(adoptCallWhitespace(node), evaluatedArgs?.get('value'));
581
+ }
582
+ })().then(value => value);
583
+ }
584
+ }
585
+
586
+ type Params = ConstructorParameters<typeof Call>;
587
+
588
+ export const call = defineType(Call, 'Call') as (
589
+ value: Params[0],
590
+ options?: Params[1],
591
+ location?: Params[2],
592
+ treeContext?: Params[3]
593
+ ) => Call;
@@ -0,0 +1,52 @@
1
+ import type { MaybePromise } from 'awaitable-pipe/lib/utils';
2
+ import { defineType, type Node } from './node.js';
3
+ import { Rules } from './rules.js';
4
+ import { getPrintOptions, type PrintOptions } from './util/print.js';
5
+ import type { Context } from '../context.js';
6
+
7
+ /**
8
+ * A collection is essentially like an anonymous mixin,
9
+ * except that properties are arbitrary, so its intended
10
+ * for map data.
11
+ *
12
+ * Even though it doesn't allow everything that a regular set
13
+ * of rules does, we extend Rules just to make evaluation easier.
14
+ *
15
+ * Can be used like Sass property nesting.
16
+ * @see https://sass-lang.com/documentation/style-rules/declarations/#nesting
17
+ */
18
+ export interface Collection {
19
+ type: 'Collection';
20
+ shortType: 'coll';
21
+ }
22
+
23
+ export class Collection extends Rules {
24
+ override toTrimmedString(options?: PrintOptions) {
25
+ return this.toBraced(options);
26
+ }
27
+
28
+ /**
29
+ * Collection rules aren't evaluated by default. They're evaluated
30
+ * at access time OR if assigned to a property.
31
+ */
32
+ override evalNode(context: Context): MaybePromise<this> {
33
+ return this;
34
+ }
35
+
36
+ override preEval(context: Context): this | Promise<this> {
37
+ if (this.preEvaluated) {
38
+ return this;
39
+ }
40
+ this.preEvaluated = true;
41
+ return this;
42
+ }
43
+ }
44
+
45
+ type Params = ConstructorParameters<typeof Collection>;
46
+
47
+ export const coll = defineType(Collection, 'Collection', 'coll') as (
48
+ value: Params[0],
49
+ options?: Params[1],
50
+ location?: Params[2],
51
+ treeContext?: Params[3]
52
+ ) => Collection;