@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,523 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { OutputWriter } from '../print.js';
3
+
4
+ describe('OutputWriter', () => {
5
+ describe('position tracking', () => {
6
+ it('properly advances output position with plain add', () => {
7
+ const w = new OutputWriter();
8
+
9
+ expect(w.line).toBe(0);
10
+ expect(w.column).toBe(0);
11
+
12
+ w.add('hello');
13
+ expect(w.line).toBe(0);
14
+ expect(w.column).toBe(5);
15
+
16
+ w.add(' world');
17
+ expect(w.line).toBe(0);
18
+ expect(w.column).toBe(11);
19
+ });
20
+
21
+ it('properly counts lines during add', () => {
22
+ const w = new OutputWriter();
23
+
24
+ w.add('line1\nline2\nline3');
25
+ expect(w.line).toBe(2);
26
+ expect(w.column).toBe(5); // length of 'line3'
27
+ });
28
+
29
+ it('handles multiple newlines correctly', () => {
30
+ const w = new OutputWriter();
31
+
32
+ w.add('a\nb\nc\nd');
33
+ expect(w.line).toBe(3);
34
+ expect(w.column).toBe(1); // length of 'd'
35
+ });
36
+
37
+ it('handles empty string', () => {
38
+ const w = new OutputWriter();
39
+
40
+ w.add('');
41
+ expect(w.line).toBe(0);
42
+ expect(w.column).toBe(0);
43
+ });
44
+
45
+ it('handles string ending with newline', () => {
46
+ const w = new OutputWriter();
47
+
48
+ w.add('hello\n');
49
+ expect(w.line).toBe(1);
50
+ expect(w.column).toBe(0); // after newline
51
+ });
52
+ });
53
+
54
+ describe('capture behavior', () => {
55
+ it('captures content without advancing the output index', () => {
56
+ const w = new OutputWriter();
57
+
58
+ w.add('before ');
59
+ const beforeLine = w.line;
60
+ const beforeColumn = w.column;
61
+
62
+ const captured = w.capture(() => {
63
+ w.add('captured content\nwith newlines');
64
+ });
65
+
66
+ // Position should be unchanged after capture
67
+ expect(w.line).toBe(beforeLine);
68
+ expect(w.column).toBe(beforeColumn);
69
+ expect(w.toString()).toBe('before ');
70
+ expect(captured).toBe('captured content\nwith newlines');
71
+ });
72
+
73
+ it('capture does not affect main buffer', () => {
74
+ const w = new OutputWriter();
75
+
76
+ w.add('start');
77
+ const captured = w.capture(() => {
78
+ w.add('middle');
79
+ });
80
+ w.add('end');
81
+
82
+ expect(w.toString()).toBe('startend');
83
+ expect(captured).toBe('middle');
84
+ });
85
+
86
+ it('capture with newlines does not affect position', () => {
87
+ const w = new OutputWriter();
88
+
89
+ w.add('line1\n');
90
+ const captured = w.capture(() => {
91
+ w.add('line2\nline3\n');
92
+ });
93
+
94
+ expect(w.line).toBe(1);
95
+ expect(w.column).toBe(0);
96
+ expect(w.toString()).toBe('line1\n');
97
+ expect(captured).toBe('line2\nline3\n');
98
+ });
99
+
100
+ it('captureWithMeta defaults to implicit boundary intent', () => {
101
+ const w = new OutputWriter();
102
+ const captured = w.captureWithMeta(() => {
103
+ w.add('abc');
104
+ });
105
+ expect(captured).toEqual({
106
+ text: 'abc',
107
+ leadingIntent: 'implicit',
108
+ trailingIntent: 'implicit'
109
+ });
110
+ });
111
+
112
+ it('captureWithMeta preserves explicit boundary intent signals', () => {
113
+ const w = new OutputWriter();
114
+ const captured = w.captureWithMeta(() => {
115
+ w.signalBoundaryIntent('pre', 'explicit_none');
116
+ w.add('abc');
117
+ w.signalBoundaryIntent('post', 'explicit_none');
118
+ });
119
+ expect(captured).toEqual({
120
+ text: 'abc',
121
+ leadingIntent: 'explicit_none',
122
+ trailingIntent: 'explicit_none'
123
+ });
124
+ });
125
+ });
126
+
127
+ describe('mark and restore', () => {
128
+ it('mark returns current chunk count', () => {
129
+ const w = new OutputWriter();
130
+
131
+ expect(w.mark()).toBe(0);
132
+ w.add('chunk1');
133
+ expect(w.mark()).toBe(1);
134
+ w.add('chunk2');
135
+ expect(w.mark()).toBe(2);
136
+ });
137
+
138
+ it('getSince returns content since mark', () => {
139
+ const w = new OutputWriter();
140
+
141
+ w.add('chunk1');
142
+ const mark1 = w.mark();
143
+ w.add('chunk2');
144
+ w.add('chunk3');
145
+
146
+ expect(w.getSince(mark1)).toBe('chunk2chunk3');
147
+ });
148
+
149
+ it('restore reverts to mark position', () => {
150
+ const w = new OutputWriter();
151
+
152
+ w.add('line1\n');
153
+ const mark = w.mark();
154
+ w.add('line2\nline3\n');
155
+
156
+ expect(w.line).toBe(3);
157
+ expect(w.column).toBe(0);
158
+
159
+ w.restore(mark);
160
+ expect(w.line).toBe(1);
161
+ expect(w.column).toBe(0);
162
+ expect(w.toString()).toBe('line1\n');
163
+ });
164
+
165
+ it('restore with invalid mark does nothing', () => {
166
+ const w = new OutputWriter();
167
+
168
+ w.add('content');
169
+ const originalLine = w.line;
170
+ const originalColumn = w.column;
171
+ const originalString = w.toString();
172
+
173
+ w.restore(-1);
174
+ w.restore(999);
175
+
176
+ expect(w.line).toBe(originalLine);
177
+ expect(w.column).toBe(originalColumn);
178
+ expect(w.toString()).toBe(originalString);
179
+ });
180
+ });
181
+
182
+ describe('_positions array behavior', () => {
183
+ it('tracks positions for each chunk', () => {
184
+ const w = new OutputWriter();
185
+
186
+ w.add('hello');
187
+ w.add(' world');
188
+ w.add('\nnew line');
189
+
190
+ // Access private _positions array for testing
191
+ const positions = (w as any)._positions;
192
+ expect(positions).toHaveLength(3);
193
+ expect(positions[0]).toEqual({ line: 0, column: 5, segments: 0, length: 5 });
194
+ expect(positions[1]).toEqual({ line: 0, column: 11, segments: 0, length: 11 });
195
+ expect(positions[2]).toEqual({ line: 1, column: 8, segments: 0, length: 20 });
196
+ });
197
+
198
+ it('capture does not affect _positions array', () => {
199
+ const w = new OutputWriter();
200
+
201
+ w.add('before');
202
+ const beforePositions = [...(w as any)._positions];
203
+
204
+ const captured = w.capture(() => {
205
+ w.add('captured\ncontent');
206
+ });
207
+
208
+ // _positions should be unchanged after capture
209
+ expect((w as any)._positions).toEqual(beforePositions);
210
+ expect(captured).toBe('captured\ncontent');
211
+ });
212
+
213
+ it('restore properly resets _positions array', () => {
214
+ const w = new OutputWriter();
215
+
216
+ w.add('line1\n');
217
+ const mark = w.mark();
218
+ const positionsAtMark = [...(w as any)._positions];
219
+
220
+ w.add('line2\nline3\n');
221
+ expect((w as any)._positions).toHaveLength(2); // Only 2 chunks: 'line2\n' and 'line3\n'
222
+
223
+ w.restore(mark);
224
+ expect((w as any)._positions).toEqual(positionsAtMark);
225
+ });
226
+
227
+ it('_positions tracks segments count', () => {
228
+ const w = new OutputWriter();
229
+
230
+ // Add content with origin that has location info
231
+ const mockOrigin = {
232
+ location: [0, 1, 1, 0, 1, 5], // [start, startLine, startColumn, end, endLine, endColumn]
233
+ treeContext: { file: { fullPath: 'test.css' } }
234
+ };
235
+
236
+ w.add('content', mockOrigin);
237
+ const positions = (w as any)._positions;
238
+ expect(positions[0].segments).toBe(1);
239
+ });
240
+ });
241
+
242
+ describe('sourcemap segments behavior', () => {
243
+ it('creates segments for content with origin location', () => {
244
+ const w = new OutputWriter();
245
+
246
+ const mockOrigin = {
247
+ location: [0, 1, 1, 0, 1, 5], // [start, startLine, startColumn, end, endLine, endColumn]
248
+ treeContext: { file: { fullPath: 'test.css' } }
249
+ };
250
+
251
+ w.add('hello', mockOrigin);
252
+ const segments = w.getSegments();
253
+
254
+ expect(segments).toHaveLength(1);
255
+ expect(segments[0]).toEqual({
256
+ genLine: 0,
257
+ genColumn: 0,
258
+ source: 'test.css',
259
+ origLine: 0, // 1-based to 0-based conversion
260
+ origColumn: 0 // 1-based to 0-based conversion
261
+ });
262
+ });
263
+
264
+ it('capture does not create segments in main buffer', () => {
265
+ const w = new OutputWriter();
266
+
267
+ const mockOrigin = {
268
+ location: [0, 1, 1, 0, 1, 5],
269
+ treeContext: { file: { fullPath: 'test.css' } }
270
+ };
271
+
272
+ w.add('before');
273
+ const beforeSegments = [...w.getSegments()];
274
+
275
+ const captured = w.capture(() => {
276
+ w.add('captured', mockOrigin);
277
+ });
278
+
279
+ // Segments should be unchanged after capture
280
+ expect(w.getSegments()).toEqual(beforeSegments);
281
+ expect(captured).toBe('captured');
282
+ });
283
+
284
+ it('restore properly resets segments array', () => {
285
+ const w = new OutputWriter();
286
+
287
+ const mockOrigin = {
288
+ location: [0, 1, 1, 0, 1, 5],
289
+ treeContext: { file: { fullPath: 'test.css' } }
290
+ };
291
+
292
+ w.add('before');
293
+ const mark = w.mark();
294
+ const segmentsAtMark = [...w.getSegments()];
295
+
296
+ w.add('after', mockOrigin);
297
+ expect(w.getSegments()).toHaveLength(1);
298
+
299
+ w.restore(mark);
300
+ expect(w.getSegments()).toEqual(segmentsAtMark);
301
+ });
302
+
303
+ it('segments track correct generated positions', () => {
304
+ const w = new OutputWriter();
305
+
306
+ const mockOrigin = {
307
+ location: [0, 1, 1, 0, 1, 5],
308
+ treeContext: { file: { fullPath: 'test.css' } }
309
+ };
310
+
311
+ w.add('hello\nworld', mockOrigin);
312
+ const segments = w.getSegments();
313
+
314
+ expect(segments).toHaveLength(1);
315
+ expect(segments[0]!.genLine).toBe(0);
316
+ expect(segments[0]!.genColumn).toBe(0);
317
+ });
318
+
319
+ it('multiple segments track positions correctly', () => {
320
+ const w = new OutputWriter();
321
+
322
+ const origin1 = {
323
+ location: [0, 1, 1, 0, 1, 5],
324
+ treeContext: { file: { fullPath: 'test1.css' } }
325
+ };
326
+
327
+ const origin2 = {
328
+ location: [0, 2, 1, 0, 2, 5],
329
+ treeContext: { file: { fullPath: 'test2.css' } }
330
+ };
331
+
332
+ w.add('hello', origin1);
333
+ w.add(' world', origin2);
334
+
335
+ const segments = w.getSegments();
336
+ expect(segments).toHaveLength(2);
337
+ expect(segments[0]!.genLine).toBe(0);
338
+ expect(segments[0]!.genColumn).toBe(0);
339
+ expect(segments[1]!.genLine).toBe(0);
340
+ expect(segments[1]!.genColumn).toBe(5);
341
+ });
342
+
343
+ it('segments handle newlines correctly', () => {
344
+ const w = new OutputWriter();
345
+
346
+ const mockOrigin = {
347
+ location: [0, 1, 1, 0, 1, 5],
348
+ treeContext: { file: { fullPath: 'test.css' } }
349
+ };
350
+
351
+ w.add('line1\nline2', mockOrigin);
352
+ const segments = w.getSegments();
353
+
354
+ expect(segments).toHaveLength(1);
355
+ expect(segments[0]!.genLine).toBe(0);
356
+ expect(segments[0]!.genColumn).toBe(0);
357
+ });
358
+
359
+ it('restore with segments maintains correct mapping', () => {
360
+ const w = new OutputWriter();
361
+
362
+ const mockOrigin = {
363
+ location: [0, 1, 1, 0, 1, 5],
364
+ treeContext: { file: { fullPath: 'test.css' } }
365
+ };
366
+
367
+ w.add('before');
368
+ const mark = w.mark();
369
+
370
+ w.add('content', mockOrigin);
371
+ expect(w.getSegments()).toHaveLength(1);
372
+
373
+ w.restore(mark);
374
+ expect(w.getSegments()).toHaveLength(0);
375
+
376
+ // Adding after restore should work correctly
377
+ w.add('after', mockOrigin);
378
+ expect(w.getSegments()).toHaveLength(1);
379
+ expect(w.getSegments()[0]!.genLine).toBe(0);
380
+ expect(w.getSegments()[0]!.genColumn).toBe(6); // after 'before'
381
+ });
382
+ });
383
+
384
+ describe('declaration-like serialization pattern', () => {
385
+ it('handles basic declaration pattern', () => {
386
+ const w = new OutputWriter();
387
+
388
+ w.add('property:');
389
+ const valOut = w.capture(() => {
390
+ w.add('value');
391
+ });
392
+ w.add(' ');
393
+ w.add(valOut);
394
+ w.add(';');
395
+
396
+ expect(w.toString()).toBe('property: value;');
397
+ });
398
+
399
+ it('handles trailing spaces in captured content', () => {
400
+ const w = new OutputWriter();
401
+
402
+ w.add('property:');
403
+ const valOut = w.capture(() => {
404
+ w.add('value ');
405
+ });
406
+ w.add(' ');
407
+ w.add(valOut);
408
+ w.add(';');
409
+
410
+ expect(w.toString()).toBe('property: value ;');
411
+ });
412
+
413
+ it('handles leading spaces in captured content', () => {
414
+ const w = new OutputWriter();
415
+
416
+ w.add('property:');
417
+ const valOut = w.capture(() => {
418
+ w.add(' value');
419
+ });
420
+ w.add(' ');
421
+ w.add(valOut);
422
+ w.add(';');
423
+
424
+ expect(w.toString()).toBe('property: value;');
425
+ });
426
+
427
+ it('handles both leading and trailing spaces', () => {
428
+ const w = new OutputWriter();
429
+
430
+ w.add('property:');
431
+ const valOut = w.capture(() => {
432
+ w.add(' value ');
433
+ });
434
+ w.add(' ');
435
+ w.add(valOut);
436
+ w.add(';');
437
+
438
+ expect(w.toString()).toBe('property: value ;');
439
+ });
440
+
441
+ it('demonstrates the actual CSS serialization issue', () => {
442
+ const w = new OutputWriter();
443
+
444
+ w.add('color:');
445
+ const valOut = w.capture(() => {
446
+ w.add('white '); // Note the trailing space
447
+ });
448
+ w.add(' ');
449
+ w.add(valOut.replace(/^\s+/, '')); // Remove leading whitespace only
450
+ w.add('!important');
451
+
452
+ // This produces "color: white !important" instead of "color: white!important"
453
+ expect(w.toString()).toBe('color: white !important');
454
+ });
455
+
456
+ it('demonstrates the correct behavior with trailing space removal', () => {
457
+ const w = new OutputWriter();
458
+
459
+ w.add('color:');
460
+ const valOut = w.capture(() => {
461
+ w.add('white '); // Note the trailing space
462
+ });
463
+ w.add(' ');
464
+ w.add(valOut.replace(/^\s+/, '').replace(/\s+$/, '')); // Remove both leading and trailing whitespace
465
+ w.add('!important');
466
+
467
+ // This produces the correct "color: white!important"
468
+ expect(w.toString()).toBe('color: white!important');
469
+ });
470
+ });
471
+
472
+ describe('toString and chunks', () => {
473
+ it('toString joins all chunks', () => {
474
+ const w = new OutputWriter();
475
+
476
+ w.add('chunk1');
477
+ w.add('chunk2');
478
+ w.add('chunk3');
479
+
480
+ expect(w.toString()).toBe('chunk1chunk2chunk3');
481
+ });
482
+
483
+ it('toString returns empty string for empty writer', () => {
484
+ const w = new OutputWriter();
485
+ expect(w.toString()).toBe('');
486
+ });
487
+ });
488
+
489
+ describe('edge cases', () => {
490
+ it('handles null/undefined text gracefully', () => {
491
+ const w = new OutputWriter();
492
+
493
+ // @ts-ignore - testing edge case
494
+ w.add(null);
495
+ // @ts-ignore - testing edge case
496
+ w.add(undefined);
497
+ w.add('');
498
+
499
+ expect(w.toString()).toBe('');
500
+ expect(w.line).toBe(0);
501
+ expect(w.column).toBe(0);
502
+ });
503
+
504
+ it('handles very long strings', () => {
505
+ const w = new OutputWriter();
506
+ const longString = 'a'.repeat(1000);
507
+
508
+ w.add(longString);
509
+ expect(w.line).toBe(0);
510
+ expect(w.column).toBe(1000);
511
+ expect(w.toString()).toBe(longString);
512
+ });
513
+
514
+ it('handles strings with only newlines', () => {
515
+ const w = new OutputWriter();
516
+
517
+ w.add('\n\n\n');
518
+ expect(w.line).toBe(3);
519
+ expect(w.column).toBe(0);
520
+ expect(w.toString()).toBe('\n\n\n');
521
+ });
522
+ });
523
+ });
@@ -0,0 +1,183 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { OutputWriter, getPrintOptions } from '../print.js';
3
+ import { any } from '../../../index.js';
4
+
5
+ describe('processPrePost with capture', () => {
6
+ let w: OutputWriter;
7
+ let options: ReturnType<typeof getPrintOptions>;
8
+
9
+ beforeEach(() => {
10
+ w = new OutputWriter();
11
+ options = getPrintOptions({ writer: w });
12
+ });
13
+
14
+ it('processPrePost returns correct value for array with newline string', () => {
15
+ const node = any('test');
16
+ node.pre = ['\n '];
17
+
18
+ const result = node.processPrePost('pre', '', options);
19
+ expect(result).toBe('\n ');
20
+ });
21
+
22
+ it('capture properly captures output from processPrePost with array containing newline string', () => {
23
+ const node = any('test');
24
+ node.pre = ['\n '];
25
+
26
+ const captured = w.capture(() => {
27
+ node.processPrePost('pre', '', options);
28
+ });
29
+
30
+ expect(captured).toBe('\n ');
31
+ expect(w.toString()).toBe('');
32
+ });
33
+
34
+ it('capture properly captures output from processPrePost with array containing multiple strings', () => {
35
+ const node = any('test');
36
+ node.pre = ['\n ', ' more'];
37
+
38
+ const captured = w.capture(() => {
39
+ node.processPrePost('pre', '', options);
40
+ });
41
+
42
+ expect(captured).toBe('\n more');
43
+ expect(w.toString()).toBe('');
44
+ });
45
+
46
+ it('capture properly captures output from processPrePost with array containing single space string', () => {
47
+ const node = any('test');
48
+ node.pre = [' '];
49
+
50
+ const captured = w.capture(() => {
51
+ node.processPrePost('pre', '', options);
52
+ });
53
+
54
+ expect(captured).toBe(' ');
55
+ expect(w.toString()).toBe('');
56
+ });
57
+
58
+ it('capture properly captures output from processPrePost with array containing empty string', () => {
59
+ const node = any('test');
60
+ node.pre = [''];
61
+
62
+ const captured = w.capture(() => {
63
+ node.processPrePost('pre', '', options);
64
+ });
65
+
66
+ expect(captured).toBe('');
67
+ expect(w.toString()).toBe('');
68
+ });
69
+
70
+ it('capture properly captures output from processPrePost with array containing only newline', () => {
71
+ const node = any('test');
72
+ node.pre = ['\n'];
73
+
74
+ const captured = w.capture(() => {
75
+ node.processPrePost('pre', '', options);
76
+ });
77
+
78
+ expect(captured).toBe('\n');
79
+ expect(w.toString()).toBe('');
80
+ });
81
+
82
+ it('capture properly captures output from processPrePost with array containing tab and spaces', () => {
83
+ const node = any('test');
84
+ node.pre = ['\n\t '];
85
+
86
+ const captured = w.capture(() => {
87
+ node.processPrePost('pre', '', options);
88
+ });
89
+
90
+ expect(captured).toBe('\n\t ');
91
+ expect(w.toString()).toBe('');
92
+ });
93
+
94
+ it('capture properly captures output when processPrePost is called multiple times', () => {
95
+ const node = any('test');
96
+ node.pre = ['\n '];
97
+
98
+ const captured1 = w.capture(() => {
99
+ node.processPrePost('pre', '', options);
100
+ });
101
+
102
+ const captured2 = w.capture(() => {
103
+ node.processPrePost('pre', '', options);
104
+ });
105
+
106
+ expect(captured1).toBe('\n ');
107
+ expect(captured2).toBe('\n ');
108
+ expect(w.toString()).toBe('');
109
+ });
110
+
111
+ it('capture properly captures output when there is existing content in writer', () => {
112
+ w.add('existing');
113
+ const node = any('test');
114
+ node.pre = ['\n '];
115
+
116
+ const captured = w.capture(() => {
117
+ node.processPrePost('pre', '', options);
118
+ });
119
+
120
+ expect(captured).toBe('\n ');
121
+ expect(w.toString()).toBe('existing');
122
+ });
123
+
124
+ it('processPrePost with numeric value 1 returns single space', () => {
125
+ const node = any('test');
126
+ node.pre = 1;
127
+
128
+ const result = node.processPrePost('pre', '', options);
129
+ expect(result).toBe(' ');
130
+ });
131
+
132
+ it('capture properly captures output from processPrePost with numeric value 1', () => {
133
+ const node = any('test');
134
+ node.pre = 1;
135
+
136
+ const captured = w.capture(() => {
137
+ node.processPrePost('pre', '', options);
138
+ });
139
+
140
+ expect(captured).toBe(' ');
141
+ expect(w.toString()).toBe('');
142
+ });
143
+
144
+ it('processPrePost with numeric value 0 returns empty string', () => {
145
+ const node = any('test');
146
+ node.pre = 0;
147
+
148
+ const result = node.processPrePost('pre', '', options);
149
+ expect(result).toBe('');
150
+ });
151
+
152
+ it('capture properly captures output from processPrePost with numeric value 0', () => {
153
+ const node = any('test');
154
+ node.pre = 0;
155
+
156
+ const captured = w.capture(() => {
157
+ node.processPrePost('pre', '', options);
158
+ });
159
+
160
+ expect(captured).toBe('');
161
+ expect(w.toString()).toBe('');
162
+ });
163
+
164
+ it('processPrePost with string value returns that string', () => {
165
+ const node = any('test');
166
+ node.pre = [' '];
167
+
168
+ const result = node.processPrePost('pre', '', options);
169
+ expect(result).toBe(' ');
170
+ });
171
+
172
+ it('capture properly captures output from processPrePost with string value', () => {
173
+ const node = any('test');
174
+ node.pre = [' '];
175
+
176
+ const captured = w.capture(() => {
177
+ node.processPrePost('pre', '', options);
178
+ });
179
+
180
+ expect(captured).toBe(' ');
181
+ expect(w.toString()).toBe('');
182
+ });
183
+ });