@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,535 @@
1
+ import type { AtRule } from '../at-rule.js';
2
+ import type { Declaration } from '../declaration.js';
3
+ import type { Rules } from '../rules.js';
4
+ import type { Ruleset } from '../ruleset.js';
5
+ import { F_EXTENDED, isVisibleInContext, type Node } from '../node.js';
6
+ import { type FinalPrintOptions, getPrintOptions, OutputWriter } from './print.js';
7
+ import { isNode } from './is-node.js';
8
+ import { N } from '../node-type.js';
9
+ import { Nil } from '../nil.js';
10
+ import { hasExtendedSelector } from './selector-utils.js';
11
+ import { isBareAmpersandOwnSelector } from './selector-utils.js';
12
+ import type { FlatRulePosition } from '../rules.js';
13
+
14
+ function isRulesNode(node: Node): node is Rules {
15
+ return isNode(node, N.Rules);
16
+ }
17
+
18
+ function isRulesetNode(node: Node): node is Ruleset {
19
+ return isNode(node, N.Ruleset);
20
+ }
21
+
22
+ function isAtRuleNode(node: Node): node is AtRule {
23
+ return isNode(node, N.AtRule);
24
+ }
25
+
26
+ function isDeclarationNode(node: Node): node is Declaration {
27
+ return isNode(node, N.Declaration);
28
+ }
29
+
30
+ function isContainerNode(node: Node): node is Rules | Ruleset | AtRule {
31
+ return isRulesNode(node) || isRulesetNode(node) || isAtRuleNode(node);
32
+ }
33
+
34
+ function getRulesVisibility(node: Rules | Ruleset): Record<string, string> | undefined {
35
+ return isRulesNode(node)
36
+ ? node.options.rulesVisibility
37
+ : node.options.rulesVisibility;
38
+ }
39
+
40
+ function getRenderableSelectorString(node: Ruleset, collapseNesting: boolean | undefined, context: FinalPrintOptions['context']): string {
41
+ return String(node.getRenderableSelector(collapseNesting, context)?.valueOf?.() ?? '');
42
+ }
43
+
44
+ function isReferenceModeRules(node: Node): node is Rules {
45
+ return isRulesNode(node) && node.options.referenceMode === true;
46
+ }
47
+
48
+ /**
49
+ * Normalizes the indent of a multi-line string by replacing initial whitespace.
50
+ */
51
+ export function normalizeIndent(multiLineString: string, indent: string, maintainRelative?: boolean): string {
52
+ if (!maintainRelative) {
53
+ return multiLineString.replace(/^\s*/, indent).replace(/[ \t\r\f]*\n\s*/g, '\n' + indent);
54
+ }
55
+
56
+ // Find the first line's original indent length
57
+ const firstLineMatch = multiLineString.match(/^(?:\n*|[ \t\r\f]*\n+)(\s*)/);
58
+ const firstLineOriginalIndentLength = firstLineMatch ? firstLineMatch[1]!.length : 0;
59
+
60
+ // Use replace with callback to process each line in one pass
61
+ let isFirstLine = true;
62
+ return multiLineString.replace(/(?:^|\n)(\s*)([^\n]*)/g, (match, lineIndent, lineContent) => {
63
+ if (isFirstLine) {
64
+ isFirstLine = false;
65
+ return indent + lineContent.trimEnd();
66
+ }
67
+
68
+ const lineOriginalIndentLength = lineIndent.length;
69
+ // Calculate the difference from the first line's indent
70
+ const indentDifference = lineOriginalIndentLength - firstLineOriginalIndentLength;
71
+ // Apply the difference to the new indent to maintain relative spacing
72
+ const newLineIndent = indent + ' '.repeat(Math.max(0, indentDifference));
73
+ return '\n' + newLineIndent + lineContent.trimEnd();
74
+ });
75
+ }
76
+
77
+ export function indent(depth: number): string {
78
+ return ''.padStart(depth * 2);
79
+ }
80
+
81
+ function rulesetExtendsReference(node: Ruleset, options: FinalPrintOptions): boolean {
82
+ return (
83
+ (options.context ? node._hasFlag(F_EXTENDED, options.context) : node.hasFlag(F_EXTENDED))
84
+ || hasExtendedSelector(node.getRenderableSelector(options.collapseNesting, options.context), options.context)
85
+ );
86
+ }
87
+
88
+ function rulesHaveReferenceRenderableDescendant(rules: Rules, options: FinalPrintOptions): boolean {
89
+ for (const child of rules._getRenderChildren(options.context)) {
90
+ if (isRulesNode(child)) {
91
+ if (rulesHaveReferenceRenderableDescendant(child, options)) {
92
+ return true;
93
+ }
94
+ continue;
95
+ }
96
+ if (isRulesetNode(child)) {
97
+ if (!isVisibleInContext(child, options.context) && !child.fullRender) {
98
+ const nestedRules = child.enterRules(options.context);
99
+ if (nestedRules && rulesHaveReferenceRenderableDescendant(nestedRules, options)) {
100
+ return true;
101
+ }
102
+ continue;
103
+ }
104
+ if (rulesetExtendsReference(child, options)) {
105
+ return true;
106
+ }
107
+ const nestedRules = child.enterRules(options.context);
108
+ if (nestedRules && rulesHaveReferenceRenderableDescendant(nestedRules, options)) {
109
+ return true;
110
+ }
111
+ continue;
112
+ }
113
+ if (isAtRuleNode(child)) {
114
+ if (!isVisibleInContext(child, options.context) && !child.fullRender) {
115
+ const nestedRules = child.enterRules(options.context);
116
+ if (nestedRules && rulesHaveReferenceRenderableDescendant(nestedRules, options)) {
117
+ return true;
118
+ }
119
+ continue;
120
+ }
121
+ const nestedRules = child.enterRules(options.context);
122
+ if (nestedRules && rulesHaveReferenceRenderableDescendant(nestedRules, options)) {
123
+ return true;
124
+ }
125
+ continue;
126
+ }
127
+ if (!isVisibleInContext(child, options.context) && !child.fullRender) {
128
+ continue;
129
+ }
130
+ }
131
+ return false;
132
+ }
133
+
134
+ function nodeExtendsReference(node: AtRule | Ruleset, options: FinalPrintOptions): boolean {
135
+ if (isRulesetNode(node)) {
136
+ if (rulesetExtendsReference(node, options)) {
137
+ return true;
138
+ }
139
+ const rules = node.enterRules(options.context);
140
+ return rules ? rulesHaveReferenceRenderableDescendant(rules, options) : false;
141
+ }
142
+ const rules = node.enterRules(options.context);
143
+ return rules ? rulesHaveReferenceRenderableDescendant(rules, options) : false;
144
+ }
145
+
146
+ function framesHaveSameHeader(
147
+ currentFrame: AtRule | Ruleset,
148
+ priorFrame: AtRule | Ruleset,
149
+ depth: number,
150
+ options: FinalPrintOptions
151
+ ): boolean {
152
+ if (currentFrame.type !== priorFrame.type) {
153
+ return false;
154
+ }
155
+ const currentHeader = currentFrame.getHeaderString({ ...options, depth }, true);
156
+ const priorHeader = priorFrame.getHeaderString({ ...options, depth }, true);
157
+ return currentHeader === priorHeader;
158
+ }
159
+
160
+ /**
161
+ * Handles flattening and serializing of at-rules and rulesets
162
+ */
163
+ export function serializeRulesContainer(node: AtRule | Ruleset, options: FinalPrintOptions): string {
164
+ const w = options.writer;
165
+ let inFrames = options.inFrames;
166
+ const frameHeaders = options.frameHeaders;
167
+
168
+ if (isRulesetNode(node) && node.getRenderableSelector(options.collapseNesting, options.context) instanceof Nil) {
169
+ return '';
170
+ }
171
+ // let header = node.getHeaderString(options);
172
+
173
+ const mark = w.mark();
174
+ const previousReferenceMode = options.referenceMode === true;
175
+ const previousReferenceRenderEnabled = options.referenceRenderEnabled !== false;
176
+ const previousReferenceRenderOnExtend = options.referenceRenderOnExtend !== false;
177
+ const inReferenceMode = previousReferenceMode;
178
+ const enteringReferenceMode = false;
179
+ const inheritedRenderEnabled = enteringReferenceMode ? false : previousReferenceRenderEnabled;
180
+ const renderEnabled = inReferenceMode
181
+ ? (inheritedRenderEnabled || (previousReferenceRenderOnExtend && nodeExtendsReference(node, options)))
182
+ : true;
183
+ const isOptionalReferenceBoundary = isRulesNode(node)
184
+ && getRulesVisibility(node)?.Ruleset === 'optional';
185
+ options.referenceMode = inReferenceMode;
186
+ options.referenceRenderEnabled = renderEnabled;
187
+ options.referenceRenderOnExtend = previousReferenceRenderOnExtend;
188
+ if (isRulesetNode(node) && inReferenceMode && renderEnabled) {
189
+ const previewHeader = node.getHeaderString(options, false);
190
+ if (!previewHeader) {
191
+ const nestedRules = node.enterRules(options.context);
192
+ if (!nestedRules || !rulesHaveReferenceRenderableDescendant(nestedRules, options)) {
193
+ options.referenceMode = previousReferenceMode;
194
+ options.referenceRenderEnabled = previousReferenceRenderEnabled;
195
+ options.referenceRenderOnExtend = previousReferenceRenderOnExtend;
196
+ return '';
197
+ }
198
+ }
199
+ }
200
+ const rules = node.enterRules(options.context);
201
+ if (!rules) {
202
+ if (inReferenceMode && !renderEnabled) {
203
+ options.referenceMode = previousReferenceMode;
204
+ options.referenceRenderEnabled = previousReferenceRenderEnabled;
205
+ options.referenceRenderOnExtend = previousReferenceRenderOnExtend;
206
+ return '';
207
+ }
208
+ // Leaf at-rules (no body) are not "frame headers". Always emit them with comments
209
+ // preserved; comment-stripping should only apply to repeated *frame* headers.
210
+ w.add(node.getHeaderString(options, false));
211
+ options.referenceMode = previousReferenceMode;
212
+ options.referenceRenderEnabled = previousReferenceRenderEnabled;
213
+ options.referenceRenderOnExtend = previousReferenceRenderOnExtend;
214
+ return w.getSince(mark);
215
+ }
216
+
217
+ const positionMap = new WeakMap<Node, FlatRulePosition>();
218
+ let rulesToRender = rules.flatRules(true, options.context, positionMap);
219
+ if (isRulesetNode(node) && inReferenceMode && renderEnabled) {
220
+ const mergedMirrorBodyRules: Node[] = [];
221
+ const expandedRulesToRender: Node[] = [];
222
+ for (const child of rulesToRender) {
223
+ if (isRulesetNode(child)) {
224
+ const ownSelector = child.getOwnSelector();
225
+ if (
226
+ ownSelector
227
+ && !(ownSelector instanceof Nil)
228
+ && isBareAmpersandOwnSelector(ownSelector)
229
+ ) {
230
+ const childRules = child.enterRules(options.context);
231
+ if (childRules) {
232
+ for (const innerChild of childRules.flatRules(true, options.context, positionMap)) {
233
+ if (isContainerNode(innerChild)) {
234
+ expandedRulesToRender.push(innerChild);
235
+ } else {
236
+ mergedMirrorBodyRules.push(innerChild);
237
+ }
238
+ }
239
+ continue;
240
+ }
241
+ }
242
+ }
243
+ expandedRulesToRender.push(child);
244
+ }
245
+ if (mergedMirrorBodyRules.length > 0) {
246
+ const finalRulesToRender: Node[] = [];
247
+ let insertedMergedMirrorBodyRules = false;
248
+ for (const child of expandedRulesToRender) {
249
+ const isContainer = isContainerNode(child);
250
+ if (!insertedMergedMirrorBodyRules && isContainer) {
251
+ finalRulesToRender.push(...mergedMirrorBodyRules);
252
+ insertedMergedMirrorBodyRules = true;
253
+ }
254
+ finalRulesToRender.push(child);
255
+ }
256
+ if (!insertedMergedMirrorBodyRules) {
257
+ finalRulesToRender.push(...mergedMirrorBodyRules);
258
+ }
259
+ rulesToRender = finalRulesToRender;
260
+ } else {
261
+ rulesToRender = expandedRulesToRender;
262
+ }
263
+ }
264
+ const declarationOutputCache = new Map<object, string>();
265
+ const skippedDuplicateDeclarations = new Set<object>();
266
+ const seenDeclarationsByProp = new Map<string, Set<string>>();
267
+ const withNodePosition = <T>(target: Node, fn: () => T): T => {
268
+ const ctx = options.context;
269
+ const position = positionMap.get(target);
270
+ if (!ctx || !position) {
271
+ return fn();
272
+ }
273
+
274
+ const previousRenderKey = ctx.renderKey;
275
+ if (position.renderKey !== undefined) {
276
+ ctx.renderKey = position.renderKey;
277
+ }
278
+ try {
279
+ return fn();
280
+ } finally {
281
+ ctx.renderKey = previousRenderKey;
282
+ }
283
+ };
284
+ if (rulesToRender.length === 0) {
285
+ options.referenceMode = previousReferenceMode;
286
+ options.referenceRenderEnabled = previousReferenceRenderEnabled;
287
+ options.referenceRenderOnExtend = previousReferenceRenderOnExtend;
288
+ return '';
289
+ }
290
+
291
+ // Less-style duplicate declaration handling:
292
+ // for each property, keep the last exact serialized declaration and skip earlier duplicates.
293
+ for (let i = rulesToRender.length - 1; i >= 0; i--) {
294
+ const node = rulesToRender[i]!;
295
+ if (!isDeclarationNode(node) || isNode(node, N.VarDeclaration)) {
296
+ continue;
297
+ }
298
+ // Push per-node position so patched fields are visible during dedup
299
+ const declWriter = new OutputWriter();
300
+ const declOptions = getPrintOptions({ ...options, writer: declWriter, depth: options.depth + 1 });
301
+ const declOut = withNodePosition(node, () => node.toTrimmedString(declOptions));
302
+ declarationOutputCache.set(node, declOut);
303
+ const declKey = `${declOut}${node.requiresSemi(options.context) ? ';' : ''}`;
304
+ const declProp = node.get('name', options.context).valueOf();
305
+ let seenValues = seenDeclarationsByProp.get(declProp);
306
+ if (!seenValues) {
307
+ seenValues = new Set<string>();
308
+ seenDeclarationsByProp.set(declProp, seenValues);
309
+ }
310
+ if (seenValues.has(declKey)) {
311
+ skippedDuplicateDeclarations.add(node);
312
+ } else {
313
+ seenValues.add(declKey);
314
+ }
315
+ }
316
+
317
+ const hoisted = node.isHoisted(options);
318
+ // const isRuleset = isNode(node, 'Ruleset');
319
+ const treeFrames = options.treeFrames!;
320
+ const prevTreeFrames = hoisted ? treeFrames.slice() : undefined;
321
+ if (hoisted) {
322
+ // When hoisting, we must reset the active frame stack to at-rules only.
323
+ // Otherwise, previously-rendered non-hoisted rulesets (e.g. `.header`) can remain
324
+ // in `treeFrames` and cause nested output like:
325
+ // .header { :is(.header-nav, .footer .footer-nav) { ... } }
326
+ // even though the current node is hoisted to root.
327
+ const atRulesOnly = treeFrames.filter(f => isNode(f, N.AtRule));
328
+ treeFrames.splice(0, treeFrames.length, ...atRulesOnly, node);
329
+ options.inFrames = inFrames = treeFrames;
330
+ } else {
331
+ options.inFrames = inFrames = treeFrames!;
332
+ inFrames.push(node);
333
+ }
334
+ // Note: in the hoisted branch above, `node` is already included.
335
+
336
+ let lastRenderedFrames = options.lastRenderedFrames;
337
+
338
+ /** Don't output selector yet. Let's see if any child rules need hoisting. */
339
+ for (let idx = 0; idx < rulesToRender.length; idx++) {
340
+ let n = rulesToRender[idx]!;
341
+ const isContainer = isNode(n, N.Ruleset | N.AtRule | N.Rules);
342
+
343
+ // Push per-node position from the position map so patched fields resolve
344
+ const skipped = withNodePosition(n, () => {
345
+ if (!isVisibleInContext(n, options.context) && !n.fullRender) {
346
+ return true;
347
+ }
348
+ if (inReferenceMode && !renderEnabled && !isOptionalReferenceBoundary && isContainer) {
349
+ return true;
350
+ }
351
+ if (inReferenceMode && !renderEnabled && !isContainer) {
352
+ return true;
353
+ }
354
+ if (isNode(n, N.Declaration) && !isNode(n, N.VarDeclaration) && skippedDuplicateDeclarations.has(n)) {
355
+ return true;
356
+ }
357
+
358
+ if (isRulesNode(n)) {
359
+ const ownRefMode = isReferenceModeRules(n);
360
+ const childRefMode = inReferenceMode || ownRefMode;
361
+ const entering = !inReferenceMode && ownRefMode;
362
+ const childRenderEnabled = childRefMode
363
+ ? (entering ? false : renderEnabled)
364
+ : true;
365
+ const childOptions: FinalPrintOptions = {
366
+ ...options,
367
+ referenceMode: childRefMode,
368
+ referenceRenderEnabled: childRenderEnabled,
369
+ referenceRenderOnExtend: previousReferenceRenderOnExtend
370
+ };
371
+ const childOut = w.capture(() => n.toTrimmedString(childOptions));
372
+ if (childOut) {
373
+ w.add(childOut, n);
374
+ }
375
+ return true;
376
+ }
377
+ const isLeafAtRule = isAtRuleNode(n) && !n.enterRules(options.context);
378
+ if (isContainerNode(n) && !isLeafAtRule) {
379
+ const childReferenceRenderEnabled = (
380
+ inReferenceMode
381
+ && isAtRuleNode(node)
382
+ && isContainerNode(n)
383
+ )
384
+ ? nodeExtendsReference(n, options)
385
+ : renderEnabled;
386
+ const keepReferenceFilteringForBareMirror = (
387
+ inReferenceMode
388
+ && renderEnabled
389
+ && isRulesetNode(node)
390
+ && isRulesetNode(n)
391
+ && Boolean(
392
+ (() => {
393
+ const ownSelector = n.getOwnSelector();
394
+ return ownSelector
395
+ && !(ownSelector instanceof Nil)
396
+ && isBareAmpersandOwnSelector(ownSelector);
397
+ })()
398
+ )
399
+ );
400
+ const childReferenceMode = (
401
+ inReferenceMode
402
+ && isAtRuleNode(node)
403
+ && isContainerNode(n)
404
+ )
405
+ ? true
406
+ : keepReferenceFilteringForBareMirror
407
+ ? true
408
+ : (inReferenceMode && renderEnabled && !isOptionalReferenceBoundary) ? false : inReferenceMode;
409
+ const childOptions: FinalPrintOptions = {
410
+ ...options,
411
+ referenceMode: childReferenceMode,
412
+ referenceRenderEnabled: childReferenceRenderEnabled,
413
+ referenceRenderOnExtend: previousReferenceRenderOnExtend,
414
+ preserveCapturedContainerFrame: true
415
+ };
416
+ const childOut = w.capture(() => n.toTrimmedString(childOptions));
417
+ if (!childOut) {
418
+ return true;
419
+ }
420
+ w.add(childOut, n);
421
+ return true;
422
+ }
423
+
424
+ return false;
425
+ });
426
+ if (skipped) {
427
+ continue;
428
+ }
429
+
430
+ withNodePosition(n, () => {
431
+ let matches = -1;
432
+ for (let i = 0; i < lastRenderedFrames.length; i++) {
433
+ const currentFrame = inFrames[i];
434
+ const priorFrame = lastRenderedFrames[i];
435
+ const sameFrame = currentFrame === priorFrame
436
+ || (
437
+ currentFrame
438
+ && priorFrame
439
+ && isContainerNode(currentFrame)
440
+ && isContainerNode(priorFrame)
441
+ && !isRulesNode(currentFrame)
442
+ && !isRulesNode(priorFrame)
443
+ && framesHaveSameHeader(currentFrame, priorFrame, i, options)
444
+ );
445
+ if (!sameFrame) {
446
+ break;
447
+ }
448
+ matches = i;
449
+ }
450
+ for (let i = lastRenderedFrames.length - 1; i > matches; i--) {
451
+ w.add(indent(i) + '}\n');
452
+ frameHeaders.pop();
453
+ lastRenderedFrames.pop();
454
+ options.depth = i;
455
+ }
456
+
457
+ for (let i = matches + 1; i < inFrames.length; i++) {
458
+ let s = frameHeaders[i];
459
+ const f = inFrames[i]!;
460
+ lastRenderedFrames.push(f);
461
+ if (s === undefined) {
462
+ s = inFrames[i]!.getHeaderString({ ...options, depth: i });
463
+ frameHeaders[i] = s;
464
+ } else if (s === '') {
465
+ s = inFrames[i]!.getHeaderString({ ...options, depth: i }, true);
466
+ frameHeaders[i] = s;
467
+ }
468
+ options.depth = i;
469
+ w.add(s!);
470
+ }
471
+
472
+ const idt = indent(options.depth + 1);
473
+ const nn = n;
474
+ let pre = w.capture(() => nn.processPrePost('pre', undefined, options));
475
+ const out = isDeclarationNode(nn)
476
+ ? (declarationOutputCache.get(nn) ?? w.capture(() => nn.toTrimmedString({ ...options, depth: options.depth + 1 })))
477
+ : w.capture(() => nn.toTrimmedString({ ...options, depth: options.depth + 1 }));
478
+ if (
479
+ isNode(nn, N.Any)
480
+ && !nn.requiredSemi
481
+ && !out.trim()
482
+ && !pre.trim()
483
+ ) {
484
+ return;
485
+ }
486
+ if (isDeclarationNode(nn)) {
487
+ pre = pre.replace(/^[\s\S]*\n([ \t]*)$/g, '$1');
488
+ const declIn = pre + out;
489
+ const hasEmptyValue = /:\s*$/.test(out);
490
+ const declNormalized = hasEmptyValue && (!pre || pre.trim() === '')
491
+ ? `${idt}${out}`
492
+ : normalizeIndent(declIn, idt, true);
493
+ if (nn.isCustomProperty(options.context)) {
494
+ w.add(idt);
495
+ w.add(out, nn);
496
+ } else {
497
+ w.add(declNormalized, nn);
498
+ }
499
+ } else if (isRulesNode(nn)) {
500
+ w.add(out, nn);
501
+ } else if (isAtRuleNode(nn) && !nn.enterRules(options.context)) {
502
+ w.add(out, nn);
503
+ } else {
504
+ w.add(idt);
505
+ w.add(out, nn);
506
+ }
507
+ if (isDeclarationNode(nn) ? nn.requiresSemi(options.context) : nn.requiredSemi) {
508
+ w.add(';');
509
+ }
510
+
511
+ w.add('\n');
512
+ const post = w.capture(() => nn.processPrePost('post', undefined, options));
513
+ if (!/^\s*$/.test(post)) {
514
+ w.add(normalizeIndent(post, idt));
515
+ }
516
+ });
517
+ }
518
+ inFrames.pop();
519
+ frameHeaders.pop();
520
+ const frameCloseBase = options.preserveCapturedContainerFrame
521
+ ? treeFrames.length + 1
522
+ : treeFrames.length;
523
+ while (lastRenderedFrames.length > frameCloseBase) {
524
+ w.add(indent(lastRenderedFrames.length - 1) + '}\n');
525
+ options.depth = Math.max(frameCloseBase, options.depth - 1);
526
+ lastRenderedFrames.pop();
527
+ }
528
+ if (prevTreeFrames) {
529
+ treeFrames.splice(0, treeFrames.length, ...prevTreeFrames);
530
+ }
531
+ options.referenceMode = previousReferenceMode;
532
+ options.referenceRenderEnabled = previousReferenceRenderEnabled;
533
+ options.referenceRenderOnExtend = previousReferenceRenderOnExtend;
534
+ return w.getSince(mark);
535
+ }