@codefast/cli 0.3.13-canary.0 → 0.3.13-canary.2

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 (390) hide show
  1. package/dist/bin.d.ts +3 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/{bin.mjs → bin.js} +1 -4
  4. package/dist/commands/arrange.d.ts +3 -0
  5. package/dist/commands/arrange.d.ts.map +1 -0
  6. package/dist/commands/arrange.js +129 -0
  7. package/dist/commands/mirror.d.ts +4 -0
  8. package/dist/commands/mirror.d.ts.map +1 -0
  9. package/dist/commands/mirror.js +75 -0
  10. package/dist/commands/tag.d.ts +3 -0
  11. package/dist/commands/tag.d.ts.map +1 -0
  12. package/dist/commands/tag.js +41 -0
  13. package/dist/lib/arrange/application/analyze.d.ts +17 -0
  14. package/dist/lib/arrange/application/analyze.d.ts.map +1 -0
  15. package/dist/lib/arrange/application/analyze.js +24 -0
  16. package/dist/lib/arrange/application/group-file-preview.d.ts +17 -0
  17. package/dist/lib/arrange/application/group-file-preview.d.ts.map +1 -0
  18. package/dist/lib/arrange/application/group-file-preview.js +46 -0
  19. package/dist/lib/arrange/application/group-file.d.ts +5 -0
  20. package/dist/lib/arrange/application/group-file.d.ts.map +1 -0
  21. package/dist/lib/arrange/application/group-file.js +40 -0
  22. package/dist/lib/arrange/application/ports/domain-source-parser.port.d.ts +5 -0
  23. package/dist/lib/arrange/application/ports/domain-source-parser.port.d.ts.map +1 -0
  24. package/dist/lib/arrange/application/ports/file-walker.port.d.ts +5 -0
  25. package/dist/lib/arrange/application/ports/file-walker.port.d.ts.map +1 -0
  26. package/dist/lib/arrange/application/requests/analyze-directory.request.d.ts +6 -0
  27. package/dist/lib/arrange/application/requests/analyze-directory.request.d.ts.map +1 -0
  28. package/dist/lib/arrange/application/requests/analyze-directory.request.js +4 -0
  29. package/dist/lib/arrange/application/requests/arrange-sync.request.d.ts +18 -0
  30. package/dist/lib/arrange/application/requests/arrange-sync.request.d.ts.map +1 -0
  31. package/dist/lib/arrange/application/requests/arrange-sync.request.js +15 -0
  32. package/dist/lib/arrange/application/run-target.d.ts +19 -0
  33. package/dist/lib/arrange/application/run-target.d.ts.map +1 -0
  34. package/dist/lib/arrange/application/run-target.js +85 -0
  35. package/dist/lib/arrange/domain/arrange-analyze.service.d.ts +12 -0
  36. package/dist/lib/arrange/domain/arrange-analyze.service.d.ts.map +1 -0
  37. package/dist/lib/arrange/domain/arrange-analyze.service.js +116 -0
  38. package/dist/lib/arrange/domain/arrange-grouping.service.d.ts +53 -0
  39. package/dist/lib/arrange/domain/arrange-grouping.service.d.ts.map +1 -0
  40. package/dist/lib/arrange/domain/arrange-grouping.service.js +106 -0
  41. package/dist/lib/arrange/domain/ast/ast-helpers.d.ts +28 -0
  42. package/dist/lib/arrange/domain/ast/ast-helpers.d.ts.map +1 -0
  43. package/dist/lib/arrange/domain/ast/ast-helpers.js +130 -0
  44. package/dist/lib/arrange/domain/ast/ast-node.model.d.ts +179 -0
  45. package/dist/lib/arrange/domain/ast/ast-node.model.d.ts.map +1 -0
  46. package/dist/lib/arrange/domain/ast/ast-node.model.js +210 -0
  47. package/dist/lib/arrange/domain/ast/collectors-cn.d.ts +7 -0
  48. package/dist/lib/arrange/domain/ast/collectors-cn.d.ts.map +1 -0
  49. package/dist/lib/arrange/domain/ast/collectors-cn.js +70 -0
  50. package/dist/lib/arrange/domain/ast/collectors-jsx.d.ts +4 -0
  51. package/dist/lib/arrange/domain/ast/collectors-jsx.d.ts.map +1 -0
  52. package/dist/lib/arrange/domain/ast/collectors-jsx.js +21 -0
  53. package/dist/lib/arrange/domain/ast/collectors-tv.d.ts +13 -0
  54. package/dist/lib/arrange/domain/ast/collectors-tv.d.ts.map +1 -0
  55. package/dist/lib/arrange/domain/ast/collectors-tv.js +302 -0
  56. package/dist/lib/arrange/domain/ast/targets.d.ts +8 -0
  57. package/dist/lib/arrange/domain/ast/targets.d.ts.map +1 -0
  58. package/dist/lib/arrange/domain/ast/targets.js +147 -0
  59. package/dist/lib/arrange/domain/constants.d.ts +68 -0
  60. package/dist/lib/arrange/domain/constants.d.ts.map +1 -0
  61. package/dist/lib/arrange/domain/constants.js +180 -0
  62. package/dist/lib/arrange/domain/errors.d.ts +14 -0
  63. package/dist/lib/arrange/domain/errors.d.ts.map +1 -0
  64. package/dist/lib/arrange/domain/errors.js +16 -0
  65. package/dist/lib/arrange/domain/grouping.d.ts +41 -0
  66. package/dist/lib/arrange/domain/grouping.d.ts.map +1 -0
  67. package/dist/lib/arrange/domain/grouping.js +307 -0
  68. package/dist/lib/arrange/domain/imports.d.ts +7 -0
  69. package/dist/lib/arrange/domain/imports.d.ts.map +1 -0
  70. package/dist/lib/arrange/domain/imports.js +80 -0
  71. package/dist/lib/arrange/domain/source-text-formatters.d.ts +16 -0
  72. package/dist/lib/arrange/domain/source-text-formatters.d.ts.map +1 -0
  73. package/dist/lib/arrange/domain/source-text-formatters.js +55 -0
  74. package/dist/lib/arrange/domain/tokenizer.d.ts +45 -0
  75. package/dist/lib/arrange/domain/tokenizer.d.ts.map +1 -0
  76. package/dist/lib/arrange/domain/tokenizer.js +466 -0
  77. package/dist/lib/arrange/domain/types.d.ts +112 -0
  78. package/dist/lib/arrange/domain/types.d.ts.map +1 -0
  79. package/dist/lib/arrange/domain/types.js +7 -0
  80. package/dist/lib/arrange/index.d.ts +45 -0
  81. package/dist/lib/arrange/index.d.ts.map +1 -0
  82. package/dist/lib/arrange/index.js +41 -0
  83. package/dist/lib/arrange/infra/arrange-sync-cli-options.d.ts +14 -0
  84. package/dist/lib/arrange/infra/arrange-sync-cli-options.d.ts.map +1 -0
  85. package/dist/lib/arrange/infra/domain-source-parser.adapter.d.ts +11 -0
  86. package/dist/lib/arrange/infra/domain-source-parser.adapter.d.ts.map +1 -0
  87. package/dist/lib/arrange/infra/domain-source-parser.adapter.js +19 -0
  88. package/dist/lib/arrange/infra/ensure-cn-import.d.ts +3 -0
  89. package/dist/lib/arrange/infra/ensure-cn-import.d.ts.map +1 -0
  90. package/dist/lib/arrange/infra/ensure-cn-import.js +6 -0
  91. package/dist/lib/arrange/infra/file-walker.adapter.d.ts +8 -0
  92. package/dist/lib/arrange/infra/file-walker.adapter.d.ts.map +1 -0
  93. package/dist/lib/arrange/infra/file-walker.adapter.js +17 -0
  94. package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.d.ts +8 -0
  95. package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.d.ts.map +1 -0
  96. package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.js +25 -0
  97. package/dist/lib/arrange/infra/ts-ast-translator.d.ts +10 -0
  98. package/dist/lib/arrange/infra/ts-ast-translator.d.ts.map +1 -0
  99. package/dist/lib/arrange/infra/ts-ast-translator.js +363 -0
  100. package/dist/lib/arrange/presentation/formatters.d.ts +3 -0
  101. package/dist/lib/arrange/presentation/formatters.d.ts.map +1 -0
  102. package/dist/lib/arrange/presentation/formatters.js +2 -0
  103. package/dist/lib/arrange/presentation/report.d.ts +4 -0
  104. package/dist/lib/arrange/presentation/report.d.ts.map +1 -0
  105. package/dist/lib/arrange/presentation/report.js +37 -0
  106. package/dist/lib/config/domain/schema.d.ts +50 -0
  107. package/dist/lib/config/domain/schema.d.ts.map +1 -0
  108. package/dist/lib/config/domain/schema.js +43 -0
  109. package/dist/lib/config/index.d.ts +4 -0
  110. package/dist/lib/config/index.d.ts.map +1 -0
  111. package/dist/lib/config/index.js +2 -0
  112. package/dist/lib/config/infra/loader.d.ts +11 -0
  113. package/dist/lib/config/infra/loader.d.ts.map +1 -0
  114. package/dist/lib/config/infra/loader.js +90 -0
  115. package/dist/lib/core/application/architecture-boundaries.d.ts +19 -0
  116. package/dist/lib/core/application/architecture-boundaries.d.ts.map +1 -0
  117. package/dist/lib/core/application/architecture-boundaries.js +263 -0
  118. package/dist/lib/core/application/ports/cli-io.port.d.ts +27 -0
  119. package/dist/lib/core/application/ports/cli-io.port.d.ts.map +1 -0
  120. package/dist/lib/core/application/schema-parse.d.ts +8 -0
  121. package/dist/lib/core/application/schema-parse.d.ts.map +1 -0
  122. package/dist/lib/core/application/schema-parse.js +20 -0
  123. package/dist/lib/core/application/utils/caught-unknown-message.d.ts +6 -0
  124. package/dist/lib/core/application/utils/caught-unknown-message.d.ts.map +1 -0
  125. package/dist/lib/core/application/utils/caught-unknown-message.js +34 -0
  126. package/dist/lib/core/application/utils/verbose-diagnostics.d.ts +5 -0
  127. package/dist/lib/core/application/utils/verbose-diagnostics.d.ts.map +1 -0
  128. package/dist/lib/core/application/utils/verbose-diagnostics.js +7 -0
  129. package/dist/lib/core/domain/errors.d.ts +11 -0
  130. package/dist/lib/core/domain/errors.d.ts.map +1 -0
  131. package/dist/lib/core/domain/errors.js +9 -0
  132. package/dist/lib/core/domain/result.d.ts +15 -0
  133. package/dist/lib/core/domain/result.d.ts.map +1 -0
  134. package/dist/lib/core/domain/result.js +9 -0
  135. package/dist/lib/core/infra/container.d.ts +34 -0
  136. package/dist/lib/core/infra/container.d.ts.map +1 -0
  137. package/dist/lib/core/infra/container.js +65 -0
  138. package/dist/lib/core/infra/logging-decorator.d.ts +12 -0
  139. package/dist/lib/core/infra/logging-decorator.d.ts.map +1 -0
  140. package/dist/lib/core/infra/logging-decorator.js +75 -0
  141. package/dist/lib/core/presentation/cli-executor.d.ts +33 -0
  142. package/dist/lib/core/presentation/cli-executor.d.ts.map +1 -0
  143. package/dist/lib/core/presentation/cli-executor.js +73 -0
  144. package/dist/lib/core/presentation/create-command-handler.d.ts +20 -0
  145. package/dist/lib/core/presentation/create-command-handler.d.ts.map +1 -0
  146. package/dist/lib/core/presentation/create-command-handler.js +70 -0
  147. package/dist/lib/core/presentation/format-app-error.d.ts +6 -0
  148. package/dist/lib/core/presentation/format-app-error.d.ts.map +1 -0
  149. package/dist/lib/core/presentation/format-app-error.js +19 -0
  150. package/dist/lib/infra/caught-unknown-message.d.ts +2 -0
  151. package/dist/lib/infra/caught-unknown-message.d.ts.map +1 -0
  152. package/dist/lib/infra/caught-unknown-message.js +1 -0
  153. package/dist/lib/infra/config-reporter.d.ts +4 -0
  154. package/dist/lib/infra/config-reporter.d.ts.map +1 -0
  155. package/dist/lib/infra/config-reporter.js +9 -0
  156. package/dist/lib/infra/fs-contract.d.ts +2 -0
  157. package/dist/lib/infra/fs-contract.d.ts.map +1 -0
  158. package/dist/lib/infra/fs-contract.js +1 -0
  159. package/dist/lib/infra/node-io.d.ts +4 -0
  160. package/dist/lib/infra/node-io.d.ts.map +1 -0
  161. package/dist/lib/infra/node-io.js +27 -0
  162. package/dist/lib/infra/workspace/repo-root.d.ts +7 -0
  163. package/dist/lib/infra/workspace/repo-root.d.ts.map +1 -0
  164. package/dist/lib/infra/workspace/repo-root.js +23 -0
  165. package/dist/lib/mirror/application/engine.d.ts +10 -0
  166. package/dist/lib/mirror/application/engine.d.ts.map +1 -0
  167. package/dist/lib/mirror/application/engine.js +271 -0
  168. package/dist/lib/mirror/application/ports/file-system-service.port.d.ts +6 -0
  169. package/dist/lib/mirror/application/ports/file-system-service.port.d.ts.map +1 -0
  170. package/dist/lib/mirror/application/ports/file-system-service.port.js +1 -0
  171. package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.d.ts +27 -0
  172. package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.d.ts.map +1 -0
  173. package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.js +1 -0
  174. package/dist/lib/mirror/application/ports/package-repository.port.d.ts +16 -0
  175. package/dist/lib/mirror/application/ports/package-repository.port.d.ts.map +1 -0
  176. package/dist/lib/mirror/application/ports/package-repository.port.js +1 -0
  177. package/dist/lib/mirror/application/ports/workspace-service.port.d.ts +7 -0
  178. package/dist/lib/mirror/application/ports/workspace-service.port.d.ts.map +1 -0
  179. package/dist/lib/mirror/application/ports/workspace-service.port.js +1 -0
  180. package/dist/lib/mirror/application/requests/mirror-sync.request.d.ts +10 -0
  181. package/dist/lib/mirror/application/requests/mirror-sync.request.d.ts.map +1 -0
  182. package/dist/lib/mirror/application/requests/mirror-sync.request.js +8 -0
  183. package/dist/lib/mirror/application/sync.d.ts +19 -0
  184. package/dist/lib/mirror/application/sync.d.ts.map +1 -0
  185. package/dist/lib/mirror/application/sync.js +168 -0
  186. package/dist/lib/mirror/domain/constants.d.ts +6 -0
  187. package/dist/lib/mirror/domain/constants.d.ts.map +1 -0
  188. package/dist/lib/mirror/domain/constants.js +5 -0
  189. package/dist/lib/mirror/domain/errors.d.ts +10 -0
  190. package/dist/lib/mirror/domain/errors.d.ts.map +1 -0
  191. package/dist/lib/mirror/domain/errors.js +12 -0
  192. package/dist/lib/mirror/domain/types.d.ts +65 -0
  193. package/dist/lib/mirror/domain/types.d.ts.map +1 -0
  194. package/dist/lib/mirror/domain/types.js +1 -0
  195. package/dist/lib/mirror/index.d.ts +6 -0
  196. package/dist/lib/mirror/index.d.ts.map +1 -0
  197. package/dist/lib/mirror/index.js +1 -0
  198. package/dist/lib/mirror/infra/dirent-list.d.ts +9 -0
  199. package/dist/lib/mirror/infra/dirent-list.d.ts.map +1 -0
  200. package/dist/lib/mirror/infra/dirent-list.js +13 -0
  201. package/dist/lib/mirror/infra/file-system-service.adapter.d.ts +7 -0
  202. package/dist/lib/mirror/infra/file-system-service.adapter.d.ts.map +1 -0
  203. package/dist/lib/mirror/infra/file-system-service.adapter.js +47 -0
  204. package/dist/lib/mirror/infra/mirror-sync-cli-options.d.ts +14 -0
  205. package/dist/lib/mirror/infra/mirror-sync-cli-options.d.ts.map +1 -0
  206. package/dist/lib/mirror/infra/mirror-sync-cli-options.js +1 -0
  207. package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.d.ts +3 -0
  208. package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.d.ts.map +1 -0
  209. package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.js +13 -0
  210. package/dist/lib/mirror/infra/package-filter.d.ts +8 -0
  211. package/dist/lib/mirror/infra/package-filter.d.ts.map +1 -0
  212. package/dist/lib/mirror/infra/package-filter.js +33 -0
  213. package/dist/lib/mirror/infra/package-repository.adapter.d.ts +17 -0
  214. package/dist/lib/mirror/infra/package-repository.adapter.d.ts.map +1 -0
  215. package/dist/lib/mirror/infra/package-repository.adapter.js +17 -0
  216. package/dist/lib/mirror/infra/path-normalizer.d.ts +2 -0
  217. package/dist/lib/mirror/infra/path-normalizer.d.ts.map +1 -0
  218. package/dist/lib/mirror/infra/path-normalizer.js +4 -0
  219. package/dist/lib/mirror/infra/update-pkg.d.ts +19 -0
  220. package/dist/lib/mirror/infra/update-pkg.d.ts.map +1 -0
  221. package/dist/lib/mirror/infra/update-pkg.js +156 -0
  222. package/dist/lib/mirror/infra/workspace-packages.d.ts +26 -0
  223. package/dist/lib/mirror/infra/workspace-packages.d.ts.map +1 -0
  224. package/dist/lib/mirror/infra/workspace-packages.js +170 -0
  225. package/dist/lib/mirror/infra/workspace-service.adapter.d.ts +8 -0
  226. package/dist/lib/mirror/infra/workspace-service.adapter.d.ts.map +1 -0
  227. package/dist/lib/mirror/infra/workspace-service.adapter.js +10 -0
  228. package/dist/lib/mirror/presentation/reporter.d.ts +25 -0
  229. package/dist/lib/mirror/presentation/reporter.d.ts.map +1 -0
  230. package/dist/lib/mirror/presentation/reporter.js +140 -0
  231. package/dist/lib/shared/source-code/domain/text-edit.d.ts +14 -0
  232. package/dist/lib/shared/source-code/domain/text-edit.d.ts.map +1 -0
  233. package/dist/lib/shared/source-code/domain/text-edit.js +30 -0
  234. package/dist/lib/shared/source-code/infra/tsx-file-walk.d.ts +4 -0
  235. package/dist/lib/shared/source-code/infra/tsx-file-walk.d.ts.map +1 -0
  236. package/dist/lib/shared/source-code/infra/tsx-file-walk.js +37 -0
  237. package/dist/lib/tag/application/engine.d.ts +23 -0
  238. package/dist/lib/tag/application/engine.d.ts.map +1 -0
  239. package/dist/lib/tag/application/engine.js +357 -0
  240. package/dist/lib/tag/application/ports/target-resolver.port.d.ts +6 -0
  241. package/dist/lib/tag/application/ports/target-resolver.port.d.ts.map +1 -0
  242. package/dist/lib/tag/application/ports/target-resolver.port.js +1 -0
  243. package/dist/lib/tag/application/ports/typescript-tree-walk.port.d.ts +6 -0
  244. package/dist/lib/tag/application/ports/typescript-tree-walk.port.d.ts.map +1 -0
  245. package/dist/lib/tag/application/ports/typescript-tree-walk.port.js +1 -0
  246. package/dist/lib/tag/application/requests/tag-sync.request.d.ts +10 -0
  247. package/dist/lib/tag/application/requests/tag-sync.request.d.ts.map +1 -0
  248. package/dist/lib/tag/application/requests/tag-sync.request.js +8 -0
  249. package/dist/lib/tag/domain/types.d.ts +56 -0
  250. package/dist/lib/tag/domain/types.d.ts.map +1 -0
  251. package/dist/lib/tag/domain/types.js +1 -0
  252. package/dist/lib/tag/index.d.ts +14 -0
  253. package/dist/lib/tag/index.d.ts.map +1 -0
  254. package/dist/lib/tag/index.js +10 -0
  255. package/dist/lib/tag/infra/tag-sync-cli-options.d.ts +14 -0
  256. package/dist/lib/tag/infra/tag-sync-cli-options.d.ts.map +1 -0
  257. package/dist/lib/tag/infra/tag-sync-cli-options.js +1 -0
  258. package/dist/lib/tag/infra/tag-target-resolver.adapter.d.ts +3 -0
  259. package/dist/lib/tag/infra/tag-target-resolver.adapter.d.ts.map +1 -0
  260. package/dist/lib/tag/infra/tag-target-resolver.adapter.js +4 -0
  261. package/dist/lib/tag/infra/target-resolver.d.ts +4 -0
  262. package/dist/lib/tag/infra/target-resolver.d.ts.map +1 -0
  263. package/dist/lib/tag/infra/target-resolver.js +200 -0
  264. package/dist/lib/tag/infra/typescript-tree-walk.adapter.d.ts +3 -0
  265. package/dist/lib/tag/infra/typescript-tree-walk.adapter.d.ts.map +1 -0
  266. package/dist/lib/tag/infra/typescript-tree-walk.adapter.js +4 -0
  267. package/dist/lib/tag/presentation/colors.d.ts +8 -0
  268. package/dist/lib/tag/presentation/colors.d.ts.map +1 -0
  269. package/dist/lib/tag/presentation/colors.js +9 -0
  270. package/dist/lib/tag/presentation/tag-presenter.d.ts +20 -0
  271. package/dist/lib/tag/presentation/tag-presenter.d.ts.map +1 -0
  272. package/dist/lib/tag/presentation/tag-presenter.js +92 -0
  273. package/dist/program.d.ts +4 -0
  274. package/dist/program.d.ts.map +1 -0
  275. package/dist/program.js +40 -0
  276. package/package.json +8 -5
  277. package/dist/analyze-DvtJ3j9m.mjs +0 -92
  278. package/dist/arrange-Bbh62DrU.mjs +0 -107
  279. package/dist/arrange-BqP2DI3w.mjs +0 -8
  280. package/dist/ast-helpers-MDRYuIAk.mjs +0 -115
  281. package/dist/caught-unknown-message-CRhkDWO7.mjs +0 -20
  282. package/dist/collectors-cn-BS8TTQ8O.mjs +0 -61
  283. package/dist/collectors-jsx-D9tL2ZPM.mjs +0 -20
  284. package/dist/collectors-tv-D2PXZaRt.mjs +0 -170
  285. package/dist/colors-BjdkCfGK.mjs +0 -12
  286. package/dist/commands/arrange.mjs +0 -2
  287. package/dist/commands/mirror.mjs +0 -2
  288. package/dist/commands/mirror.test.mjs +0 -48
  289. package/dist/commands/tag.mjs +0 -2
  290. package/dist/config-DVia_f9a.mjs +0 -3
  291. package/dist/config-reporter-SCcWDZc1.mjs +0 -10
  292. package/dist/constants-AtPhF-Ct.mjs +0 -169
  293. package/dist/constants-Bq5wdyLC.mjs +0 -8
  294. package/dist/dirent-list-BSDeRG5i.mjs +0 -14
  295. package/dist/engine-CcWEHSCq.mjs +0 -287
  296. package/dist/engine-DRTdkc5u.mjs +0 -236
  297. package/dist/errors-CFH4w6ic.mjs +0 -15
  298. package/dist/errors-CpU1ogfA.mjs +0 -19
  299. package/dist/formatters-DGE8jJ53.mjs +0 -52
  300. package/dist/group-file-ClW7XdD6.mjs +0 -113
  301. package/dist/grouping-c1grpCQT.mjs +0 -235
  302. package/dist/imports-DSVq1xhB.mjs +0 -54
  303. package/dist/lib/arrange/application/analyze.mjs +0 -2
  304. package/dist/lib/arrange/application/analyze.test.mjs +0 -171
  305. package/dist/lib/arrange/application/group-file.mjs +0 -2
  306. package/dist/lib/arrange/application/group-file.test.mjs +0 -273
  307. package/dist/lib/arrange/application/run-target.mjs +0 -2
  308. package/dist/lib/arrange/application/run-target.test.mjs +0 -97
  309. package/dist/lib/arrange/domain/ast/ast-helpers.mjs +0 -2
  310. package/dist/lib/arrange/domain/ast/ast-helpers.test.mjs +0 -148
  311. package/dist/lib/arrange/domain/ast/collectors-cn.mjs +0 -2
  312. package/dist/lib/arrange/domain/ast/collectors-cn.test.mjs +0 -58
  313. package/dist/lib/arrange/domain/ast/collectors-jsx.mjs +0 -2
  314. package/dist/lib/arrange/domain/ast/collectors-jsx.test.mjs +0 -20
  315. package/dist/lib/arrange/domain/ast/collectors-tv.mjs +0 -2
  316. package/dist/lib/arrange/domain/ast/collectors-tv.test.mjs +0 -145
  317. package/dist/lib/arrange/domain/ast/targets.mjs +0 -2
  318. package/dist/lib/arrange/domain/ast/targets.test.mjs +0 -50
  319. package/dist/lib/arrange/domain/constants.mjs +0 -2
  320. package/dist/lib/arrange/domain/errors.mjs +0 -2
  321. package/dist/lib/arrange/domain/grouping.mjs +0 -2
  322. package/dist/lib/arrange/domain/grouping.test.mjs +0 -186
  323. package/dist/lib/arrange/domain/imports.mjs +0 -2
  324. package/dist/lib/arrange/domain/imports.test.mjs +0 -48
  325. package/dist/lib/arrange/domain/tokenizer.mjs +0 -2
  326. package/dist/lib/arrange/domain/tokenizer.test.mjs +0 -165
  327. package/dist/lib/arrange/index.mjs +0 -16
  328. package/dist/lib/arrange/infra/walk.mjs +0 -2
  329. package/dist/lib/arrange/infra/walk.test.mjs +0 -50
  330. package/dist/lib/arrange/presentation/formatters.mjs +0 -2
  331. package/dist/lib/arrange/presentation/formatters.test.mjs +0 -73
  332. package/dist/lib/arrange/presentation/report.mjs +0 -2
  333. package/dist/lib/config/domain/schema.mjs +0 -2
  334. package/dist/lib/config/index.mjs +0 -4
  335. package/dist/lib/config/infra/loader.mjs +0 -2
  336. package/dist/lib/config/infra/loader.test.mjs +0 -116
  337. package/dist/lib/infra/caught-unknown-message.mjs +0 -2
  338. package/dist/lib/infra/config-reporter.mjs +0 -2
  339. package/dist/lib/infra/node-io.mjs +0 -2
  340. package/dist/lib/infra/workspace/repo-root.mjs +0 -2
  341. package/dist/lib/infra/workspace/repo-root.test.mjs +0 -45
  342. package/dist/lib/mirror/application/engine.mjs +0 -2
  343. package/dist/lib/mirror/application/sync.mjs +0 -2
  344. package/dist/lib/mirror/application/sync.test.mjs +0 -482
  345. package/dist/lib/mirror/domain/constants.mjs +0 -2
  346. package/dist/lib/mirror/domain/errors.mjs +0 -2
  347. package/dist/lib/mirror/index.mjs +0 -3
  348. package/dist/lib/mirror/infra/dirent-list.mjs +0 -2
  349. package/dist/lib/mirror/infra/dirent-list.test.mjs +0 -18
  350. package/dist/lib/mirror/infra/package-filter.mjs +0 -2
  351. package/dist/lib/mirror/infra/package-filter.test.mjs +0 -32
  352. package/dist/lib/mirror/infra/path-normalizer.mjs +0 -2
  353. package/dist/lib/mirror/infra/update-pkg.mjs +0 -2
  354. package/dist/lib/mirror/infra/workspace-packages.mjs +0 -2
  355. package/dist/lib/mirror/infra/workspace-packages.test.mjs +0 -167
  356. package/dist/lib/mirror/presentation/reporter.mjs +0 -2
  357. package/dist/lib/tag/application/engine.mjs +0 -2
  358. package/dist/lib/tag/application/engine.test.mjs +0 -159
  359. package/dist/lib/tag/index.mjs +0 -5
  360. package/dist/lib/tag/infra/target-resolver.mjs +0 -2
  361. package/dist/lib/tag/presentation/colors.mjs +0 -2
  362. package/dist/lib/tag/presentation/tag-presenter.mjs +0 -2
  363. package/dist/lib/tag/presentation/tag-presenter.test.mjs +0 -29
  364. package/dist/loader-DpN-zl5g.mjs +0 -78
  365. package/dist/mirror-CbGiLXKT.mjs +0 -2
  366. package/dist/mirror-DqJE3ejL.mjs +0 -66
  367. package/dist/node-io-DFRbHO6m.mjs +0 -30
  368. package/dist/package-filter-C_8ryqvz.mjs +0 -26
  369. package/dist/path-normalizer-D4ceBO3l.mjs +0 -7
  370. package/dist/program-DR-H4tH3.mjs +0 -34
  371. package/dist/program.mjs +0 -2
  372. package/dist/repo-root-HmtIEm6J.mjs +0 -22
  373. package/dist/report-DYxvw34T.mjs +0 -24
  374. package/dist/reporter-CwIe_tAM.mjs +0 -108
  375. package/dist/run-target-CJWrqNT4.mjs +0 -65
  376. package/dist/schema-Or8RAARd.mjs +0 -25
  377. package/dist/sync-e1Sp-shi.mjs +0 -157
  378. package/dist/tag-Cd9JujU5.mjs +0 -2
  379. package/dist/tag-hEKVZ_-7.mjs +0 -58
  380. package/dist/tag-presenter-Cs66UBsH.mjs +0 -63
  381. package/dist/target-resolver-CR3FXMTy.mjs +0 -170
  382. package/dist/targets-pCTslnFh.mjs +0 -106
  383. package/dist/tokenizer-CeZx73Zu.mjs +0 -216
  384. package/dist/update-pkg-CnGfjWBy.mjs +0 -37
  385. package/dist/walk-DjgQn66n.mjs +0 -33
  386. package/dist/workspace-packages-K2NYTHJq.mjs +0 -159
  387. /package/dist/lib/arrange/{domain/types.mjs → application/ports/domain-source-parser.port.js} +0 -0
  388. /package/dist/lib/{infra/fs-contract.mjs → arrange/application/ports/file-walker.port.js} +0 -0
  389. /package/dist/lib/{mirror/domain/types.mjs → arrange/infra/arrange-sync-cli-options.js} +0 -0
  390. /package/dist/lib/{tag/domain/types.mjs → core/application/ports/cli-io.port.js} +0 -0
@@ -0,0 +1,180 @@
1
+ /** Analyze report: long literal threshold (token count). */
2
+ export const LONG_STRING_TOKEN_THRESHOLD = 18;
3
+ /**
4
+ * Minimum token count for a string to be considered a candidate for grouping
5
+ * in the apply/preview pipeline. Intentionally much lower than
6
+ * {@link LONG_STRING_TOKEN_THRESHOLD} (analyze only).
7
+ */
8
+ export const APPLY_MIN_TOKENS = 2;
9
+ /**
10
+ * Minimum tokens a group must have to stand alone before singleton-merging.
11
+ * Set to 2 so single-token groups are not collapsed into unrelated buckets by the merger.
12
+ */
13
+ export const MIN_GROUP_TOKENS = 2;
14
+ /** Dynamic max groups clamp: base bound. */
15
+ export const MAX_GROUPS_BASE = 4;
16
+ /** Dynamic max groups clamp: upper cap. */
17
+ export const MAX_GROUPS_CAP = 24;
18
+ /**
19
+ * Extra slots so a few state / aria groups do not force `capGroups` to merge
20
+ * unrelated buckets (e.g. `bg-border` + `outline-hidden`).
21
+ */
22
+ export const MAX_GROUPS_HEADROOM = 2;
23
+ /** Maximum findings printed per category in the analyze report. */
24
+ export const MAX_REPORT_LINES = 40;
25
+ /** Maximum recursion depth when traversing `tv()` object literals. */
26
+ export const MAX_OBJECT_DEPTH = 12;
27
+ /** Maximum depth when peeling conditional / parens / arrays inside `cn(...)` args. */
28
+ export const MAX_CLASS_EXPR_DEPTH = 12;
29
+ /**
30
+ * Maximum variant-stripping passes in {@link stripVariants}.
31
+ * Real-world Tailwind stacks rarely exceed 4–5 segments (e.g. `@md/sidebar:group-hover:dark:focus-visible:`);
32
+ * 12 is a conservative safety cap that prevents runaway loops on malformed input.
33
+ */
34
+ export const MAX_STRIP_VARIANT_PASSES = 12;
35
+ /**
36
+ * Passed when optional `knownBindings` is missing — size 0 disables matching
37
+ * for `cn` / `tv` identifier resolution.
38
+ */
39
+ export const EMPTY_CN_TV_BINDINGS = new Set();
40
+ /**
41
+ * Bucket sort order — **render pipeline** (lower → earlier in output).
42
+ * Existence → Position → Layout → Sizing → Spacing → Shape → Background → Shadow
43
+ * → Typography → Composite → Motion → Starting → Behavior → State (variants) → Selector variants.
44
+ */
45
+ export const BUCKET_ORDER = {
46
+ existence: 0,
47
+ position: 1,
48
+ layout: 2,
49
+ sizing: 3,
50
+ spacing: 4,
51
+ shape: 5,
52
+ background: 6,
53
+ shadow: 7,
54
+ typography: 8,
55
+ composite: 9,
56
+ motion: 10,
57
+ starting: 11,
58
+ behavior: 12,
59
+ state: 13,
60
+ selector: 14,
61
+ other: 15,
62
+ arbitrary: 16,
63
+ };
64
+ /**
65
+ * Compatible bucket **pairs** — two adjacent tokens whose buckets appear in the same
66
+ * `Set` may stay in one `cn()` string chunk. Compatibility is **not transitive**: there is
67
+ * no `{position, sizing}` pair, so `fixed inset-0` and `overflow-auto` become **separate**
68
+ * literals unless **layout** tokens sit between them in sorted order; then
69
+ * `position↔layout` and `layout↔sizing` each justify one hop and the whole “box in flow”
70
+ * (place + tracks + scrollport) stays in one chunk — co-located because they jointly define
71
+ * stacking and scroll behavior for the same surface.
72
+ */
73
+ export const COMPATIBLE_BUCKET_SETS = [
74
+ // existence + position: named container / group / peer context edited next to inset & z-index.
75
+ new Set(["existence", "position"]),
76
+ // existence + layout: `group/cmd` + `flex …` are one template row (context + grid/flex).
77
+ new Set(["existence", "layout"]),
78
+ // position + layout: `fixed inset-0` + `grid` describe the same stacking + track shell.
79
+ new Set(["position", "layout"]),
80
+ // layout + sizing: `grid` + `overflow-auto` / min size are one scrollport / track concern.
81
+ new Set(["layout", "sizing"]),
82
+ // shape + shadow: radius/border + shadow/outline overlay are one “chrome” literal in UIs.
83
+ new Set(["shape", "shadow"]),
84
+ // background + shadow: fill + depth (card surface) without splitting noise across args.
85
+ new Set(["background", "shadow"]),
86
+ // background + typography: destructive buttons etc. (`bg-*` + `text-*` on the same control).
87
+ new Set(["background", "typography"]),
88
+ // layout + typography: title rows (`flex` + `text-sm`) in one literal when adjacent in sort order.
89
+ new Set(["layout", "typography"]),
90
+ // sizing + typography: chart shell (`aspect-video` + `text-xs`) before selector-variant chunks.
91
+ new Set(["sizing", "typography"]),
92
+ // motion + behavior: `transition-*` with `pointer-events-*` / `select-*` on the same surface.
93
+ new Set(["motion", "behavior"]),
94
+ // motion + starting: `transition` beside `starting:*` for coordinated enter/exit motion.
95
+ new Set(["motion", "starting"]),
96
+ // composite + motion: transforms then transitions (`-translate-*` + `transition-*` + `ease-*`).
97
+ new Set(["composite", "motion"]),
98
+ // sizing + composite: width/position utilities with transforms in one interaction block.
99
+ new Set(["sizing", "composite"]),
100
+ // sizing + spacing: width utilities with padding on the same slot (`w-auto` + `px-3`).
101
+ new Set(["sizing", "spacing"]),
102
+ ];
103
+ /**
104
+ * Responsive / variant prefix — Tailwind v4 aware.
105
+ *
106
+ * v3: sm: md: … — v4: @sm:, @min-[600px]:, @[480px]:, named @md/sidebar:,
107
+ * viewport md/sidebar:, min-[100px]: / max-[100px]:, …
108
+ */
109
+ export const RESPONSIVE_PREFIX = /^(?:@(?:min|max)-\[[^\]]+\]:|@\[[^\]]+\]:|@(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/[a-z][a-z0-9-]*)?:|(?:max-|min-)?(?:sm|md|lg|xl|2xl|3xl)(?:\/[a-z][a-z0-9-]*)?:|(?:max-|min-)\[[^\]]+\]:)/;
110
+ /** State variant stems — hoisted to module scope (not recreated per call). */
111
+ export const STATE_PREFIXES = new Set([
112
+ "hover",
113
+ "focus",
114
+ "focus-within",
115
+ "focus-visible",
116
+ "active",
117
+ "visited",
118
+ "link",
119
+ "any-link",
120
+ "disabled",
121
+ "enabled",
122
+ "checked",
123
+ "indeterminate",
124
+ "required",
125
+ "optional",
126
+ "valid",
127
+ "invalid",
128
+ "in-range",
129
+ "out-of-range",
130
+ "read-only",
131
+ "read-write",
132
+ "placeholder-shown",
133
+ "default",
134
+ "autofill",
135
+ "open",
136
+ "closed",
137
+ "first",
138
+ "last",
139
+ "only",
140
+ "odd",
141
+ "even",
142
+ "first-of-type",
143
+ "last-of-type",
144
+ "only-of-type",
145
+ "first-child",
146
+ "last-child",
147
+ "only-child",
148
+ "empty",
149
+ "target",
150
+ "group",
151
+ "peer",
152
+ "aria",
153
+ "data",
154
+ "dark",
155
+ "light",
156
+ "supports",
157
+ "motion-reduce",
158
+ "motion-safe",
159
+ "print",
160
+ "screen",
161
+ "ltr",
162
+ "rtl",
163
+ "not",
164
+ "has",
165
+ "in",
166
+ "nth",
167
+ "file",
168
+ "selection",
169
+ "marker",
170
+ "placeholder",
171
+ "before",
172
+ "after",
173
+ "first-line",
174
+ "first-letter",
175
+ "backdrop",
176
+ "details-content",
177
+ "popover-open",
178
+ ]);
179
+ /** Default directory for arrange analyze/preview/apply when no target is passed. */
180
+ export const DEFAULT_ARRANGE_TARGET = "packages/ui/src/components";
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Structured errors for the arrange CLI library (throw from lib; handle exit in commands).
3
+ */
4
+ export declare const ArrangeErrorCode: {
5
+ readonly TARGET_NOT_FOUND: "TARGET_NOT_FOUND";
6
+ readonly INVALID_INPUT: "INVALID_INPUT";
7
+ readonly INTERNAL: "INTERNAL";
8
+ };
9
+ export type ArrangeErrorCode = (typeof ArrangeErrorCode)[keyof typeof ArrangeErrorCode];
10
+ export declare class ArrangeError extends Error {
11
+ readonly code: ArrangeErrorCode;
12
+ constructor(code: ArrangeErrorCode, message: string, options?: ErrorOptions);
13
+ }
14
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/lib/arrange/domain/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,gBAAgB;aAC3B,gBAAgB,EAAE,kBAAkB;aACpC,aAAa,EAAE,eAAe;aAC9B,QAAQ,EAAE,UAAU;CACZ,CAAC;AAGX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAExF,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAEhC,YAAY,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAI1E;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Structured errors for the arrange CLI library (throw from lib; handle exit in commands).
3
+ */
4
+ export const ArrangeErrorCode = {
5
+ TARGET_NOT_FOUND: "TARGET_NOT_FOUND",
6
+ INVALID_INPUT: "INVALID_INPUT",
7
+ INTERNAL: "INTERNAL",
8
+ };
9
+ export class ArrangeError extends Error {
10
+ code;
11
+ constructor(code, message, options) {
12
+ super(message, options);
13
+ this.name = "ArrangeError";
14
+ this.code = code;
15
+ }
16
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * True when `staticLiteralTexts` carries the **same partition** of Tailwind tokens as
3
+ * `suggestedGroups` from {@link suggestCnGroups}, ignoring order of arguments and
4
+ * order of tokens within each chunk.
5
+ */
6
+ export declare function areCnTailwindPartitionsEquivalent(staticLiteralTexts: string[], suggestedGroups: string[]): boolean;
7
+ /**
8
+ * Merge singleton groups (< MIN_GROUP_TOKENS tokens) into their nearest
9
+ * neighbour. Prefers merging toward a bucket-compatible neighbor.
10
+ *
11
+ * Loop termination: each iteration either splices one element (shrinking the
12
+ * array, guaranteeing progress) or finds no singleton that can merge and exits
13
+ * via `changed = false`. Two mutually-incompatible singletons both hit
14
+ * `continue` and `changed` stays false, so the loop exits without spinning.
15
+ */
16
+ export declare function mergeSingletons(groups: string[]): string[];
17
+ /**
18
+ * Merge adjacent groups until total count ≤ maxGroups.
19
+ * Only merges pairs allowed by {@link bucketsMergeCompatible} — never glues incompatible
20
+ * buckets (which previously defaulted to penalty 0 and merged layout+state when over cap).
21
+ *
22
+ * Complexity: O(n²) in the number of groups — each merge pass scans all remaining adjacent
23
+ * pairs. In practice `n` is bounded by {@link MAX_GROUPS_CAP} (24) and typical class strings
24
+ * are well below that, so this is not a concern for the current usage pattern. If this ever
25
+ * runs in a high-throughput batch mode, consider a priority-queue approach.
26
+ */
27
+ export declare function capGroups(groups: string[], maxGroups: number): string[];
28
+ /**
29
+ * If a chunk is **only** bare `ease-*` timing (Motion), buffer it and prepend to the **first**
30
+ * **later** chunk that is predominantly `state` **and** contains some `animate-*` utility —
31
+ * skipping intermediate `state` chunks (`sm:…`, `group-data-[…]:…`, etc.) that sit between
32
+ * `ease-ui` and `data-open:animate-*`. If no such chunk exists, the ease chunk is left as-is.
33
+ */
34
+ export declare function mergeEaseTimingIntoFollowingAnimatedState(groups: string[]): string[];
35
+ export declare function suggestCnGroups(classString: string): string[];
36
+ /**
37
+ * One label per suggested group: a single bucket name, or `mixed:a+b` when that chunk
38
+ * spans multiple Tailwind buckets (matches `codefast arrange group` stdout).
39
+ */
40
+ export declare function summarizeGroupBucketLabels(groups: string[]): string[];
41
+ //# sourceMappingURL=grouping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouping.d.ts","sourceRoot":"","sources":["../../../../src/lib/arrange/domain/grouping.ts"],"names":[],"mappings":"AA2BA;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,kBAAkB,EAAE,MAAM,EAAE,EAC5B,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAqBT;AA+BD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA6C1D;AAaD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAuCvE;AAED;;;;;GAKG;AACH,wBAAgB,yCAAyC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAgCpF;AAaD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CA4F7D;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAKrE"}
@@ -0,0 +1,307 @@
1
+ import { BUCKET_ORDER, MAX_GROUPS_BASE, MAX_GROUPS_CAP, MAX_GROUPS_HEADROOM, MIN_GROUP_TOKENS, } from "#lib/arrange/domain/constants";
2
+ import { bucketsCompatible, bucketsMergeCompatible, classifyToken, compositeSecondaryOrder, selectorKey, stateKey, stripVariants, tokenizeClassString, } from "#lib/arrange/domain/tokenizer";
3
+ function isVariantKeyedBucket(bucket) {
4
+ return bucket === "selector" || bucket === "state" || bucket === "starting";
5
+ }
6
+ function variantGroupKey(bucket, classToken) {
7
+ return bucket === "selector" ? selectorKey(classToken) : stateKey(classToken);
8
+ }
9
+ /**
10
+ * True when `staticLiteralTexts` carries the **same partition** of Tailwind tokens as
11
+ * `suggestedGroups` from {@link suggestCnGroups}, ignoring order of arguments and
12
+ * order of tokens within each chunk.
13
+ */
14
+ export function areCnTailwindPartitionsEquivalent(staticLiteralTexts, suggestedGroups) {
15
+ const partitionSignatures = (chunks) => chunks
16
+ .map((chunk) => {
17
+ const classTokens = tokenizeClassString(chunk);
18
+ return classTokens.length === 0 ? "" : [...classTokens].sort().join(" ");
19
+ })
20
+ .filter((s) => s.length > 0)
21
+ .sort((a, b) => a.localeCompare(b));
22
+ const staticPartitionSigs = partitionSignatures(staticLiteralTexts);
23
+ const suggestedPartitionSigs = partitionSignatures(suggestedGroups);
24
+ if (staticPartitionSigs.length !== suggestedPartitionSigs.length) {
25
+ return false;
26
+ }
27
+ for (let i = 0; i < staticPartitionSigs.length; i++) {
28
+ if (staticPartitionSigs[i] !== suggestedPartitionSigs[i]) {
29
+ return false;
30
+ }
31
+ }
32
+ return true;
33
+ }
34
+ /** Dominant bucket of a whitespace-delimited class group (for merge heuristics). */
35
+ function dominantBucketOfGroup(groupStr) {
36
+ const counts = new Map();
37
+ for (const classToken of tokenizeClassString(groupStr)) {
38
+ const tokenBucket = classifyToken(classToken);
39
+ counts.set(tokenBucket, (counts.get(tokenBucket) ?? 0) + 1);
40
+ }
41
+ let best = "other";
42
+ let bestN = 0;
43
+ for (const [bucket, count] of counts) {
44
+ if (count > bestN) {
45
+ best = bucket;
46
+ bestN = count;
47
+ continue;
48
+ }
49
+ // Deterministic tie-break: prefer earlier render-pipeline bucket.
50
+ if (count === bestN && BUCKET_ORDER[bucket] < BUCKET_ORDER[best]) {
51
+ best = bucket;
52
+ }
53
+ }
54
+ return best;
55
+ }
56
+ /** Dynamic cap: more tokens → allow more groups, within [BASE, CAP]. */
57
+ function dynamicMaxGroups(tokenCount) {
58
+ const byTokens = Math.ceil(tokenCount / 2) + MAX_GROUPS_HEADROOM;
59
+ return Math.max(MAX_GROUPS_BASE, Math.min(MAX_GROUPS_CAP, byTokens));
60
+ }
61
+ /**
62
+ * Merge singleton groups (< MIN_GROUP_TOKENS tokens) into their nearest
63
+ * neighbour. Prefers merging toward a bucket-compatible neighbor.
64
+ *
65
+ * Loop termination: each iteration either splices one element (shrinking the
66
+ * array, guaranteeing progress) or finds no singleton that can merge and exits
67
+ * via `changed = false`. Two mutually-incompatible singletons both hit
68
+ * `continue` and `changed` stays false, so the loop exits without spinning.
69
+ */
70
+ export function mergeSingletons(groups) {
71
+ if (groups.length <= 1) {
72
+ return groups;
73
+ }
74
+ const result = [...groups];
75
+ let changed = true;
76
+ while (changed) {
77
+ changed = false;
78
+ for (let i = 0; i < result.length; i++) {
79
+ if (tokenizeClassString(result[i]).length < MIN_GROUP_TOKENS) {
80
+ if (result.length === 1) {
81
+ break;
82
+ }
83
+ const myBucket = dominantBucketOfGroup(result[i]);
84
+ const prevCompat = i > 0 && bucketsMergeCompatible(myBucket, dominantBucketOfGroup(result[i - 1]));
85
+ const nextCompat = i < result.length - 1 &&
86
+ bucketsMergeCompatible(myBucket, dominantBucketOfGroup(result[i + 1]));
87
+ let mergeDir;
88
+ if (nextCompat && !prevCompat) {
89
+ mergeDir = "forward";
90
+ }
91
+ else if (prevCompat && !nextCompat) {
92
+ mergeDir = "backward";
93
+ }
94
+ else if (prevCompat && nextCompat) {
95
+ mergeDir = i < result.length - 1 ? "forward" : "backward";
96
+ }
97
+ else {
98
+ continue;
99
+ }
100
+ if (mergeDir === "forward") {
101
+ result[i + 1] = result[i] + " " + result[i + 1];
102
+ }
103
+ else {
104
+ result[i - 1] = result[i - 1] + " " + result[i];
105
+ }
106
+ result.splice(i, 1);
107
+ changed = true;
108
+ break;
109
+ }
110
+ }
111
+ }
112
+ return result;
113
+ }
114
+ /** Tie-break when two merge candidates are both {@link bucketsMergeCompatible} (same bucket or COMPATIBLE_BUCKET_SETS). */
115
+ function capMergePenalty(leftBucket, rightBucket) {
116
+ if (leftBucket === rightBucket) {
117
+ return 0;
118
+ }
119
+ if (bucketsCompatible(leftBucket, rightBucket)) {
120
+ return 0;
121
+ }
122
+ return 500;
123
+ }
124
+ /**
125
+ * Merge adjacent groups until total count ≤ maxGroups.
126
+ * Only merges pairs allowed by {@link bucketsMergeCompatible} — never glues incompatible
127
+ * buckets (which previously defaulted to penalty 0 and merged layout+state when over cap).
128
+ *
129
+ * Complexity: O(n²) in the number of groups — each merge pass scans all remaining adjacent
130
+ * pairs. In practice `n` is bounded by {@link MAX_GROUPS_CAP} (24) and typical class strings
131
+ * are well below that, so this is not a concern for the current usage pattern. If this ever
132
+ * runs in a high-throughput batch mode, consider a priority-queue approach.
133
+ */
134
+ export function capGroups(groups, maxGroups) {
135
+ const result = [...groups];
136
+ const lengths = result.map((groupStr) => tokenizeClassString(groupStr).length);
137
+ while (result.length > maxGroups) {
138
+ const mergePairCandidates = [];
139
+ for (let i = 0; i < result.length - 1; i++) {
140
+ const dominantLeft = dominantBucketOfGroup(result[i]);
141
+ const dominantRight = dominantBucketOfGroup(result[i + 1]);
142
+ if (!bucketsMergeCompatible(dominantLeft, dominantRight)) {
143
+ continue;
144
+ }
145
+ mergePairCandidates.push({
146
+ i,
147
+ size: lengths[i] + lengths[i + 1],
148
+ penalty: capMergePenalty(dominantLeft, dominantRight),
149
+ });
150
+ }
151
+ if (mergePairCandidates.length === 0) {
152
+ break;
153
+ }
154
+ let best = mergePairCandidates[0];
155
+ for (const candidate of mergePairCandidates) {
156
+ if (candidate.penalty < best.penalty ||
157
+ (candidate.penalty === best.penalty && candidate.size < best.size)) {
158
+ best = candidate;
159
+ }
160
+ }
161
+ const bestIdx = best.i;
162
+ result[bestIdx] = result[bestIdx] + " " + result[bestIdx + 1];
163
+ lengths[bestIdx] = lengths[bestIdx] + lengths[bestIdx + 1];
164
+ result.splice(bestIdx + 1, 1);
165
+ lengths.splice(bestIdx + 1, 1);
166
+ }
167
+ return result;
168
+ }
169
+ /**
170
+ * If a chunk is **only** bare `ease-*` timing (Motion), buffer it and prepend to the **first**
171
+ * **later** chunk that is predominantly `state` **and** contains some `animate-*` utility —
172
+ * skipping intermediate `state` chunks (`sm:…`, `group-data-[…]:…`, etc.) that sit between
173
+ * `ease-ui` and `data-open:animate-*`. If no such chunk exists, the ease chunk is left as-is.
174
+ */
175
+ export function mergeEaseTimingIntoFollowingAnimatedState(groups) {
176
+ const result = [...groups];
177
+ let changed = true;
178
+ while (changed) {
179
+ changed = false;
180
+ for (let i = 0; i < result.length; i++) {
181
+ if (!chunkIsOnlyEaseTimingMotion(result[i])) {
182
+ continue;
183
+ }
184
+ const easeStr = result[i];
185
+ let target = -1;
186
+ for (let j = i + 1; j < result.length; j++) {
187
+ if (dominantBucketOfGroup(result[j]) !== "state") {
188
+ continue;
189
+ }
190
+ const classTokens = tokenizeClassString(result[j]);
191
+ if (!classTokens.some((classToken) => /^animate/.test(stripVariants(classToken)))) {
192
+ continue;
193
+ }
194
+ target = j;
195
+ break;
196
+ }
197
+ if (target === -1) {
198
+ continue;
199
+ }
200
+ result[target] = `${easeStr} ${result[target]}`.trim();
201
+ result.splice(i, 1);
202
+ changed = true;
203
+ break;
204
+ }
205
+ }
206
+ return result;
207
+ }
208
+ function chunkIsOnlyEaseTimingMotion(groupStr) {
209
+ const classTokens = tokenizeClassString(groupStr);
210
+ if (classTokens.length === 0) {
211
+ return false;
212
+ }
213
+ return classTokens.every((classToken) => classifyToken(classToken) === "motion" && /^ease-/.test(stripVariants(classToken)));
214
+ }
215
+ export function suggestCnGroups(classString) {
216
+ const tokens = tokenizeClassString(classString);
217
+ if (tokens.length === 0) {
218
+ return [];
219
+ }
220
+ const classified = tokens.map((classToken, index) => ({
221
+ classToken,
222
+ bucket: classifyToken(classToken),
223
+ index,
224
+ }));
225
+ classified.sort((left, right) => {
226
+ const bucketOrderDiff = BUCKET_ORDER[left.bucket] - BUCKET_ORDER[right.bucket];
227
+ if (bucketOrderDiff !== 0) {
228
+ return bucketOrderDiff;
229
+ }
230
+ if (left.bucket === "composite" && right.bucket === "composite") {
231
+ const compositeOrderDiff = compositeSecondaryOrder(stripVariants(left.classToken)) -
232
+ compositeSecondaryOrder(stripVariants(right.classToken));
233
+ if (compositeOrderDiff !== 0) {
234
+ return compositeOrderDiff;
235
+ }
236
+ }
237
+ return left.index - right.index;
238
+ });
239
+ const rawGroups = [];
240
+ /** Bucket of the last token already placed in the current run (pairwise compat with `COMPATIBLE_BUCKET_SETS`). */
241
+ let lastBucketInRun = null;
242
+ let currentStateKey = null;
243
+ let currentTokens = [];
244
+ const flush = () => {
245
+ if (currentTokens.length > 0) {
246
+ rawGroups.push(currentTokens.join(" "));
247
+ currentTokens = [];
248
+ }
249
+ lastBucketInRun = null;
250
+ currentStateKey = null;
251
+ };
252
+ for (const { classToken, bucket: tokenBucket } of classified) {
253
+ if (lastBucketInRun === null) {
254
+ lastBucketInRun = tokenBucket;
255
+ currentStateKey = isVariantKeyedBucket(tokenBucket)
256
+ ? variantGroupKey(tokenBucket, classToken)
257
+ : null;
258
+ currentTokens.push(classToken);
259
+ continue;
260
+ }
261
+ if (isVariantKeyedBucket(tokenBucket)) {
262
+ const key = variantGroupKey(tokenBucket, classToken);
263
+ if (currentStateKey !== null && key !== currentStateKey) {
264
+ flush();
265
+ lastBucketInRun = tokenBucket;
266
+ currentStateKey = key;
267
+ currentTokens.push(classToken);
268
+ continue;
269
+ }
270
+ }
271
+ if (!bucketsCompatible(tokenBucket, lastBucketInRun)) {
272
+ flush();
273
+ lastBucketInRun = tokenBucket;
274
+ currentStateKey = isVariantKeyedBucket(tokenBucket)
275
+ ? variantGroupKey(tokenBucket, classToken)
276
+ : null;
277
+ currentTokens.push(classToken);
278
+ continue;
279
+ }
280
+ if (isVariantKeyedBucket(tokenBucket)) {
281
+ currentStateKey = variantGroupKey(tokenBucket, classToken);
282
+ }
283
+ else if (currentStateKey !== null) {
284
+ // Defensive reset: keeps state-key logic explicit if bucket rules evolve.
285
+ currentStateKey = null;
286
+ }
287
+ lastBucketInRun = tokenBucket;
288
+ currentTokens.push(classToken);
289
+ }
290
+ flush();
291
+ const merged = mergeSingletons(rawGroups);
292
+ const withEaseMerged = mergeEaseTimingIntoFollowingAnimatedState(merged);
293
+ // Never cap-merge below the semantic chunk count from the tokenizer (fixes layout+state glued
294
+ // when `preferred` compat list was empty and unrelated pairs used penalty 0).
295
+ const maxAllowed = Math.max(dynamicMaxGroups(tokens.length), withEaseMerged.length);
296
+ return capGroups(withEaseMerged, maxAllowed);
297
+ }
298
+ /**
299
+ * One label per suggested group: a single bucket name, or `mixed:a+b` when that chunk
300
+ * spans multiple Tailwind buckets (matches `codefast arrange group` stdout).
301
+ */
302
+ export function summarizeGroupBucketLabels(groups) {
303
+ return groups.map((g) => {
304
+ const uniq = new Set(tokenizeClassString(g).map(classifyToken));
305
+ return uniq.size === 1 ? [...uniq][0] : `mixed:${[...uniq].sort().join("+")}`;
306
+ });
307
+ }
@@ -0,0 +1,7 @@
1
+ import { type DomainSourceFile } from "#lib/arrange/domain/ast/ast-node.model";
2
+ /**
3
+ * Resolve the module specifier used when injecting a `cn` import into a file.
4
+ */
5
+ export declare function cnModuleSpecifierForFile(filePath: string, override?: string): string;
6
+ export declare function ensureCnImport(sourceFile: DomainSourceFile, cnImportOverride?: string): string;
7
+ //# sourceMappingURL=imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../../../../src/lib/arrange/domain/imports.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,wCAAwC,CAAC;AAsBhD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAMpF;AAeD,wBAAgB,cAAc,CAAC,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CA2C9F"}
@@ -0,0 +1,80 @@
1
+ import { isDomainImportDeclaration, isDomainNamedImports, isDomainStringLiteral, } from "#lib/arrange/domain/ast/ast-node.model";
2
+ function sourceFileImportsCn(sourceFile) {
3
+ for (const statement of sourceFile.statements) {
4
+ if (!isDomainImportDeclaration(statement) || !statement.importClause) {
5
+ continue;
6
+ }
7
+ const clause = statement.importClause;
8
+ if (clause.name?.text === "cn") {
9
+ return true;
10
+ }
11
+ if (clause.namedBindings && isDomainNamedImports(clause.namedBindings)) {
12
+ for (const importedBinding of clause.namedBindings.elements) {
13
+ if (importedBinding.name.text === "cn") {
14
+ return true;
15
+ }
16
+ }
17
+ }
18
+ }
19
+ return false;
20
+ }
21
+ /**
22
+ * Resolve the module specifier used when injecting a `cn` import into a file.
23
+ */
24
+ export function cnModuleSpecifierForFile(filePath, override) {
25
+ void filePath;
26
+ if (override) {
27
+ return override;
28
+ }
29
+ return "@codefast/tailwind-variants";
30
+ }
31
+ function findImportDeclarationFromModule(sourceFile, moduleSpecifier) {
32
+ for (const statement of sourceFile.statements) {
33
+ if (!isDomainImportDeclaration(statement)) {
34
+ continue;
35
+ }
36
+ const spec = statement.moduleSpecifier;
37
+ if (isDomainStringLiteral(spec) && spec.text === moduleSpecifier) {
38
+ return statement;
39
+ }
40
+ }
41
+ return undefined;
42
+ }
43
+ export function ensureCnImport(sourceFile, cnImportOverride) {
44
+ const sourceText = sourceFile.text;
45
+ if (sourceFileImportsCn(sourceFile)) {
46
+ return sourceText;
47
+ }
48
+ const moduleSpecifier = cnModuleSpecifierForFile(sourceFile.fileName, cnImportOverride);
49
+ const decl = findImportDeclarationFromModule(sourceFile, moduleSpecifier);
50
+ if (decl?.importClause &&
51
+ !decl.importClause.isTypeOnly &&
52
+ decl.importClause.namedBindings &&
53
+ isDomainNamedImports(decl.importClause.namedBindings)) {
54
+ const elements = decl.importClause.namedBindings.elements;
55
+ if (elements.length > 0) {
56
+ const pos = elements[0].pos;
57
+ return `${sourceText.slice(0, pos)}cn, ${sourceText.slice(pos)}`;
58
+ }
59
+ }
60
+ const importLine = `import { cn } from "${moduleSpecifier}";`;
61
+ let firstImport = -1;
62
+ for (const statement of sourceFile.statements) {
63
+ if (isDomainImportDeclaration(statement)) {
64
+ firstImport = statement.pos;
65
+ break;
66
+ }
67
+ }
68
+ const useClient = /^["']use client["'];?\s*\r?\n/.exec(sourceText);
69
+ let insertAt;
70
+ if (useClient) {
71
+ insertAt = useClient[0].length;
72
+ }
73
+ else if (firstImport !== -1) {
74
+ insertAt = firstImport;
75
+ }
76
+ else {
77
+ insertAt = 0;
78
+ }
79
+ return `${sourceText.slice(0, insertAt)}${importLine}\n${sourceText.slice(insertAt)}`;
80
+ }
@@ -0,0 +1,16 @@
1
+ export declare function escapeTsStringLiteralContent(group: string): string;
2
+ /**
3
+ * Multiline fragment for use *inside* an existing `cn(...)` — replaces one
4
+ * string argument with several, without producing `cn(cn(...))`.
5
+ */
6
+ export declare function formatCnArguments(groups: string[], options?: {
7
+ indent?: string;
8
+ commaAfterLastGroup?: boolean;
9
+ trailingClassName?: boolean;
10
+ }): string;
11
+ export declare function formatCnCall(groups: string[], options?: {
12
+ trailingClassName?: boolean;
13
+ }): string;
14
+ export declare function formatArray(groups: string[]): string;
15
+ export declare function formatJsxCnAttributeValue(groups: string[], source: string, valueNodeStart: number): string;
16
+ //# sourceMappingURL=source-text-formatters.d.ts.map