@codefast/cli 0.3.13-canary.1 → 0.3.13-canary.3

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 (364) hide show
  1. package/README.md +1 -1
  2. package/dist/bin.d.ts +3 -0
  3. package/dist/bin.d.ts.map +1 -0
  4. package/dist/{bin.mjs → bin.js} +1 -4
  5. package/dist/commands/arrange.d.ts +3 -0
  6. package/dist/commands/arrange.d.ts.map +1 -0
  7. package/dist/commands/arrange.js +108 -0
  8. package/dist/commands/mirror.d.ts +3 -0
  9. package/dist/commands/mirror.d.ts.map +1 -0
  10. package/dist/commands/mirror.js +36 -0
  11. package/dist/commands/tag.d.ts +3 -0
  12. package/dist/commands/tag.d.ts.map +1 -0
  13. package/dist/commands/tag.js +44 -0
  14. package/dist/lib/arrange/application/ports/domain-source-parser.port.d.ts +5 -0
  15. package/dist/lib/arrange/application/ports/domain-source-parser.port.d.ts.map +1 -0
  16. package/dist/lib/arrange/application/ports/file-walker.port.d.ts +5 -0
  17. package/dist/lib/arrange/application/ports/file-walker.port.d.ts.map +1 -0
  18. package/dist/lib/arrange/application/requests/analyze-directory.request.d.ts +6 -0
  19. package/dist/lib/arrange/application/requests/analyze-directory.request.d.ts.map +1 -0
  20. package/dist/lib/arrange/application/requests/analyze-directory.request.js +4 -0
  21. package/dist/lib/arrange/application/requests/arrange-sync.request.d.ts +18 -0
  22. package/dist/lib/arrange/application/requests/arrange-sync.request.d.ts.map +1 -0
  23. package/dist/lib/arrange/application/requests/arrange-sync.request.js +15 -0
  24. package/dist/lib/arrange/application/requests/suggest-groups.request.d.ts +8 -0
  25. package/dist/lib/arrange/application/requests/suggest-groups.request.d.ts.map +1 -0
  26. package/dist/lib/arrange/application/requests/suggest-groups.request.js +8 -0
  27. package/dist/lib/arrange/application/use-cases/analyze-directory.use-case.d.ts +17 -0
  28. package/dist/lib/arrange/application/use-cases/analyze-directory.use-case.d.ts.map +1 -0
  29. package/dist/lib/arrange/application/use-cases/analyze-directory.use-case.js +24 -0
  30. package/dist/lib/arrange/application/use-cases/group-file-preview.use-case.d.ts +17 -0
  31. package/dist/lib/arrange/application/use-cases/group-file-preview.use-case.d.ts.map +1 -0
  32. package/dist/lib/arrange/application/use-cases/group-file-preview.use-case.js +46 -0
  33. package/dist/lib/arrange/application/use-cases/group-file.use-case.d.ts +5 -0
  34. package/dist/lib/arrange/application/use-cases/group-file.use-case.d.ts.map +1 -0
  35. package/dist/lib/arrange/application/use-cases/group-file.use-case.js +40 -0
  36. package/dist/lib/arrange/application/use-cases/run-arrange-sync.use-case.d.ts +19 -0
  37. package/dist/lib/arrange/application/use-cases/run-arrange-sync.use-case.d.ts.map +1 -0
  38. package/dist/lib/arrange/application/use-cases/run-arrange-sync.use-case.js +85 -0
  39. package/dist/lib/arrange/application/use-cases/suggest-cn-groups.use-case.d.ts +7 -0
  40. package/dist/lib/arrange/application/use-cases/suggest-cn-groups.use-case.d.ts.map +1 -0
  41. package/dist/lib/arrange/application/use-cases/suggest-cn-groups.use-case.js +10 -0
  42. package/dist/lib/arrange/domain/arrange-analyze.service.d.ts +12 -0
  43. package/dist/lib/arrange/domain/arrange-analyze.service.d.ts.map +1 -0
  44. package/dist/lib/arrange/domain/arrange-analyze.service.js +116 -0
  45. package/dist/lib/arrange/domain/arrange-grouping.service.d.ts +53 -0
  46. package/dist/lib/arrange/domain/arrange-grouping.service.d.ts.map +1 -0
  47. package/dist/lib/arrange/domain/arrange-grouping.service.js +106 -0
  48. package/dist/lib/arrange/domain/ast/ast-helpers.helper.d.ts +28 -0
  49. package/dist/lib/arrange/domain/ast/ast-helpers.helper.d.ts.map +1 -0
  50. package/dist/lib/arrange/domain/ast/ast-helpers.helper.js +130 -0
  51. package/dist/lib/arrange/domain/ast/ast-node.model.d.ts +179 -0
  52. package/dist/lib/arrange/domain/ast/ast-node.model.d.ts.map +1 -0
  53. package/dist/lib/arrange/domain/ast/ast-node.model.js +210 -0
  54. package/dist/lib/arrange/domain/ast/collectors-cn.collector.d.ts +7 -0
  55. package/dist/lib/arrange/domain/ast/collectors-cn.collector.d.ts.map +1 -0
  56. package/dist/lib/arrange/domain/ast/collectors-cn.collector.js +70 -0
  57. package/dist/lib/arrange/domain/ast/collectors-jsx.collector.d.ts +4 -0
  58. package/dist/lib/arrange/domain/ast/collectors-jsx.collector.d.ts.map +1 -0
  59. package/dist/lib/arrange/domain/ast/collectors-jsx.collector.js +21 -0
  60. package/dist/lib/arrange/domain/ast/collectors-tv.collector.d.ts +13 -0
  61. package/dist/lib/arrange/domain/ast/collectors-tv.collector.d.ts.map +1 -0
  62. package/dist/lib/arrange/domain/ast/collectors-tv.collector.js +302 -0
  63. package/dist/lib/arrange/domain/ast/targets.model.d.ts +8 -0
  64. package/dist/lib/arrange/domain/ast/targets.model.d.ts.map +1 -0
  65. package/dist/lib/arrange/domain/ast/targets.model.js +147 -0
  66. package/dist/lib/arrange/domain/constants.domain.d.ts +70 -0
  67. package/dist/lib/arrange/domain/constants.domain.d.ts.map +1 -0
  68. package/dist/lib/arrange/domain/constants.domain.js +182 -0
  69. package/dist/lib/arrange/domain/errors.domain.d.ts +14 -0
  70. package/dist/lib/arrange/domain/errors.domain.d.ts.map +1 -0
  71. package/dist/lib/arrange/domain/errors.domain.js +16 -0
  72. package/dist/lib/arrange/domain/grouping.domain.d.ts +41 -0
  73. package/dist/lib/arrange/domain/grouping.domain.d.ts.map +1 -0
  74. package/dist/lib/arrange/domain/grouping.domain.js +371 -0
  75. package/dist/lib/arrange/domain/imports.domain.d.ts +7 -0
  76. package/dist/lib/arrange/domain/imports.domain.d.ts.map +1 -0
  77. package/dist/lib/arrange/domain/imports.domain.js +80 -0
  78. package/dist/lib/arrange/domain/source-text-formatters.formatter.d.ts +16 -0
  79. package/dist/lib/arrange/domain/source-text-formatters.formatter.d.ts.map +1 -0
  80. package/dist/lib/arrange/domain/source-text-formatters.formatter.js +55 -0
  81. package/dist/lib/arrange/domain/tokenizer.util.d.ts +45 -0
  82. package/dist/lib/arrange/domain/tokenizer.util.d.ts.map +1 -0
  83. package/dist/lib/arrange/domain/tokenizer.util.js +469 -0
  84. package/dist/lib/arrange/domain/types.domain.d.ts +115 -0
  85. package/dist/lib/arrange/domain/types.domain.d.ts.map +1 -0
  86. package/dist/lib/arrange/domain/types.domain.js +10 -0
  87. package/dist/lib/arrange/index.d.ts +45 -0
  88. package/dist/lib/arrange/index.d.ts.map +1 -0
  89. package/dist/lib/arrange/index.js +41 -0
  90. package/dist/lib/arrange/infra/arrange-sync-cli-options.adapter.d.ts +14 -0
  91. package/dist/lib/arrange/infra/arrange-sync-cli-options.adapter.d.ts.map +1 -0
  92. package/dist/lib/arrange/infra/domain-source-parser.adapter.d.ts +11 -0
  93. package/dist/lib/arrange/infra/domain-source-parser.adapter.d.ts.map +1 -0
  94. package/dist/lib/arrange/infra/domain-source-parser.adapter.js +19 -0
  95. package/dist/lib/arrange/infra/ensure-cn-import.adapter.d.ts +3 -0
  96. package/dist/lib/arrange/infra/ensure-cn-import.adapter.d.ts.map +1 -0
  97. package/dist/lib/arrange/infra/ensure-cn-import.adapter.js +6 -0
  98. package/dist/lib/arrange/infra/file-walker.adapter.d.ts +8 -0
  99. package/dist/lib/arrange/infra/file-walker.adapter.d.ts.map +1 -0
  100. package/dist/lib/arrange/infra/file-walker.adapter.js +17 -0
  101. package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.test-helper.d.ts +8 -0
  102. package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.test-helper.d.ts.map +1 -0
  103. package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.test-helper.js +25 -0
  104. package/dist/lib/arrange/infra/ts-ast-translator.adapter.d.ts +10 -0
  105. package/dist/lib/arrange/infra/ts-ast-translator.adapter.d.ts.map +1 -0
  106. package/dist/lib/arrange/infra/ts-ast-translator.adapter.js +363 -0
  107. package/dist/lib/arrange/presentation/arrange-prelude.presenter.d.ts +14 -0
  108. package/dist/lib/arrange/presentation/arrange-prelude.presenter.d.ts.map +1 -0
  109. package/dist/lib/arrange/presentation/arrange-prelude.presenter.js +24 -0
  110. package/dist/lib/arrange/presentation/formatters.presenter.d.ts +3 -0
  111. package/dist/lib/arrange/presentation/formatters.presenter.d.ts.map +1 -0
  112. package/dist/lib/arrange/presentation/formatters.presenter.js +2 -0
  113. package/dist/lib/arrange/presentation/present-analyze-cli.presenter.d.ts +4 -0
  114. package/dist/lib/arrange/presentation/present-analyze-cli.presenter.d.ts.map +1 -0
  115. package/dist/lib/arrange/presentation/present-analyze-cli.presenter.js +4 -0
  116. package/dist/lib/arrange/presentation/report.presenter.d.ts +4 -0
  117. package/dist/lib/arrange/presentation/report.presenter.d.ts.map +1 -0
  118. package/dist/lib/arrange/presentation/report.presenter.js +37 -0
  119. package/dist/lib/arrange/presentation/resolve-arrange-cli-target.presenter.d.ts +2 -0
  120. package/dist/lib/arrange/presentation/resolve-arrange-cli-target.presenter.d.ts.map +1 -0
  121. package/dist/lib/arrange/presentation/resolve-arrange-cli-target.presenter.js +7 -0
  122. package/dist/lib/config/domain/schema.domain.d.ts +50 -0
  123. package/dist/lib/config/domain/schema.domain.d.ts.map +1 -0
  124. package/dist/lib/config/domain/schema.domain.js +43 -0
  125. package/dist/lib/config/index.d.ts +4 -0
  126. package/dist/lib/config/index.d.ts.map +1 -0
  127. package/dist/lib/config/index.js +2 -0
  128. package/dist/lib/config/infra/loader.adapter.d.ts +11 -0
  129. package/dist/lib/config/infra/loader.adapter.d.ts.map +1 -0
  130. package/dist/lib/config/infra/loader.adapter.js +90 -0
  131. package/dist/lib/core/application/architecture-boundaries.policy.d.ts +19 -0
  132. package/dist/lib/core/application/architecture-boundaries.policy.d.ts.map +1 -0
  133. package/dist/lib/core/application/architecture-boundaries.policy.js +370 -0
  134. package/dist/lib/core/application/ports/cli-io.port.d.ts +31 -0
  135. package/dist/lib/core/application/ports/cli-io.port.d.ts.map +1 -0
  136. package/dist/lib/core/application/schema-parse.util.d.ts +8 -0
  137. package/dist/lib/core/application/schema-parse.util.d.ts.map +1 -0
  138. package/dist/lib/core/application/schema-parse.util.js +20 -0
  139. package/dist/lib/core/application/utils/caught-unknown-message.util.d.ts +6 -0
  140. package/dist/lib/core/application/utils/caught-unknown-message.util.d.ts.map +1 -0
  141. package/dist/lib/core/application/utils/caught-unknown-message.util.js +34 -0
  142. package/dist/lib/core/application/utils/verbose-diagnostics.util.d.ts +5 -0
  143. package/dist/lib/core/application/utils/verbose-diagnostics.util.d.ts.map +1 -0
  144. package/dist/lib/core/application/utils/verbose-diagnostics.util.js +7 -0
  145. package/dist/lib/core/domain/errors.domain.d.ts +11 -0
  146. package/dist/lib/core/domain/errors.domain.d.ts.map +1 -0
  147. package/dist/lib/core/domain/errors.domain.js +9 -0
  148. package/dist/lib/core/domain/result.model.d.ts +17 -0
  149. package/dist/lib/core/domain/result.model.d.ts.map +1 -0
  150. package/dist/lib/core/domain/result.model.js +15 -0
  151. package/dist/lib/core/infra/container.adapter.d.ts +58 -0
  152. package/dist/lib/core/infra/container.adapter.d.ts.map +1 -0
  153. package/dist/lib/core/infra/container.adapter.js +80 -0
  154. package/dist/lib/core/infra/logging-decorator.adapter.d.ts +12 -0
  155. package/dist/lib/core/infra/logging-decorator.adapter.d.ts.map +1 -0
  156. package/dist/lib/core/infra/logging-decorator.adapter.js +75 -0
  157. package/dist/lib/core/presentation/cli-executor.presenter.d.ts +33 -0
  158. package/dist/lib/core/presentation/cli-executor.presenter.d.ts.map +1 -0
  159. package/dist/lib/core/presentation/cli-executor.presenter.js +73 -0
  160. package/dist/lib/core/presentation/format-app-error.presenter.d.ts +6 -0
  161. package/dist/lib/core/presentation/format-app-error.presenter.d.ts.map +1 -0
  162. package/dist/lib/core/presentation/format-app-error.presenter.js +19 -0
  163. package/dist/lib/core/presentation/global-cli-options.presenter.d.ts +9 -0
  164. package/dist/lib/core/presentation/global-cli-options.presenter.d.ts.map +1 -0
  165. package/dist/lib/core/presentation/global-cli-options.presenter.js +8 -0
  166. package/dist/lib/core/presentation/load-codefast-config.presenter.d.ts +8 -0
  167. package/dist/lib/core/presentation/load-codefast-config.presenter.d.ts.map +1 -0
  168. package/dist/lib/core/presentation/load-codefast-config.presenter.js +15 -0
  169. package/dist/lib/core/presentation/parse-cli-schema.presenter.d.ts +5 -0
  170. package/dist/lib/core/presentation/parse-cli-schema.presenter.d.ts.map +1 -0
  171. package/dist/lib/core/presentation/parse-cli-schema.presenter.js +4 -0
  172. package/dist/lib/core/presentation/run-cli-use-case-after-parse.presenter.d.ts +6 -0
  173. package/dist/lib/core/presentation/run-cli-use-case-after-parse.presenter.d.ts.map +1 -0
  174. package/dist/lib/core/presentation/run-cli-use-case-after-parse.presenter.js +17 -0
  175. package/dist/lib/core/presentation/workspace-root-strict.presenter.d.ts +5 -0
  176. package/dist/lib/core/presentation/workspace-root-strict.presenter.d.ts.map +1 -0
  177. package/dist/lib/core/presentation/workspace-root-strict.presenter.js +12 -0
  178. package/dist/lib/infra/config-reporter.adapter.d.ts +4 -0
  179. package/dist/lib/infra/config-reporter.adapter.d.ts.map +1 -0
  180. package/dist/lib/infra/config-reporter.adapter.js +9 -0
  181. package/dist/lib/infra/fs-contract.port.d.ts +2 -0
  182. package/dist/lib/infra/fs-contract.port.d.ts.map +1 -0
  183. package/dist/lib/infra/fs-contract.port.js +1 -0
  184. package/dist/lib/infra/node-io.adapter.d.ts +4 -0
  185. package/dist/lib/infra/node-io.adapter.d.ts.map +1 -0
  186. package/dist/lib/infra/node-io.adapter.js +37 -0
  187. package/dist/lib/infra/workspace/repo-root.adapter.d.ts +7 -0
  188. package/dist/lib/infra/workspace/repo-root.adapter.d.ts.map +1 -0
  189. package/dist/lib/infra/workspace/repo-root.adapter.js +23 -0
  190. package/dist/lib/mirror/application/ports/file-system-service.port.d.ts +6 -0
  191. package/dist/lib/mirror/application/ports/file-system-service.port.d.ts.map +1 -0
  192. package/dist/lib/mirror/application/ports/file-system-service.port.js +1 -0
  193. package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.d.ts +27 -0
  194. package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.d.ts.map +1 -0
  195. package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.js +1 -0
  196. package/dist/lib/mirror/application/ports/package-repository.port.d.ts +16 -0
  197. package/dist/lib/mirror/application/ports/package-repository.port.d.ts.map +1 -0
  198. package/dist/lib/mirror/application/ports/package-repository.port.js +1 -0
  199. package/dist/lib/mirror/application/ports/workspace-service.port.d.ts +7 -0
  200. package/dist/lib/mirror/application/ports/workspace-service.port.d.ts.map +1 -0
  201. package/dist/lib/mirror/application/ports/workspace-service.port.js +1 -0
  202. package/dist/lib/mirror/application/requests/mirror-sync.request.d.ts +10 -0
  203. package/dist/lib/mirror/application/requests/mirror-sync.request.d.ts.map +1 -0
  204. package/dist/lib/mirror/application/requests/mirror-sync.request.js +8 -0
  205. package/dist/lib/mirror/application/use-cases/generate-mirror-exports.use-case.d.ts +10 -0
  206. package/dist/lib/mirror/application/use-cases/generate-mirror-exports.use-case.d.ts.map +1 -0
  207. package/dist/lib/mirror/application/use-cases/generate-mirror-exports.use-case.js +271 -0
  208. package/dist/lib/mirror/application/use-cases/run-mirror-sync.use-case.d.ts +19 -0
  209. package/dist/lib/mirror/application/use-cases/run-mirror-sync.use-case.d.ts.map +1 -0
  210. package/dist/lib/mirror/application/use-cases/run-mirror-sync.use-case.js +168 -0
  211. package/dist/lib/mirror/domain/constants.domain.d.ts +6 -0
  212. package/dist/lib/mirror/domain/constants.domain.d.ts.map +1 -0
  213. package/dist/lib/mirror/domain/constants.domain.js +5 -0
  214. package/dist/lib/mirror/domain/errors.domain.d.ts +10 -0
  215. package/dist/lib/mirror/domain/errors.domain.d.ts.map +1 -0
  216. package/dist/lib/mirror/domain/errors.domain.js +12 -0
  217. package/dist/lib/mirror/domain/types.domain.d.ts +65 -0
  218. package/dist/lib/mirror/domain/types.domain.d.ts.map +1 -0
  219. package/dist/lib/mirror/domain/types.domain.js +1 -0
  220. package/dist/lib/mirror/index.d.ts +6 -0
  221. package/dist/lib/mirror/index.d.ts.map +1 -0
  222. package/dist/lib/mirror/index.js +1 -0
  223. package/dist/lib/mirror/infra/dirent-list.adapter.d.ts +9 -0
  224. package/dist/lib/mirror/infra/dirent-list.adapter.d.ts.map +1 -0
  225. package/dist/lib/mirror/infra/dirent-list.adapter.js +13 -0
  226. package/dist/lib/mirror/infra/file-system-service.adapter.d.ts +7 -0
  227. package/dist/lib/mirror/infra/file-system-service.adapter.d.ts.map +1 -0
  228. package/dist/lib/mirror/infra/file-system-service.adapter.js +47 -0
  229. package/dist/lib/mirror/infra/mirror-sync-cli-options.adapter.d.ts +14 -0
  230. package/dist/lib/mirror/infra/mirror-sync-cli-options.adapter.d.ts.map +1 -0
  231. package/dist/lib/mirror/infra/mirror-sync-cli-options.adapter.js +1 -0
  232. package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.d.ts +3 -0
  233. package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.d.ts.map +1 -0
  234. package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.js +13 -0
  235. package/dist/lib/mirror/infra/package-filter.adapter.d.ts +8 -0
  236. package/dist/lib/mirror/infra/package-filter.adapter.d.ts.map +1 -0
  237. package/dist/lib/mirror/infra/package-filter.adapter.js +33 -0
  238. package/dist/lib/mirror/infra/package-repository.adapter.d.ts +17 -0
  239. package/dist/lib/mirror/infra/package-repository.adapter.d.ts.map +1 -0
  240. package/dist/lib/mirror/infra/package-repository.adapter.js +17 -0
  241. package/dist/lib/mirror/infra/path-normalizer.adapter.d.ts +2 -0
  242. package/dist/lib/mirror/infra/path-normalizer.adapter.d.ts.map +1 -0
  243. package/dist/lib/mirror/infra/path-normalizer.adapter.js +4 -0
  244. package/dist/lib/mirror/infra/update-pkg.adapter.d.ts +19 -0
  245. package/dist/lib/mirror/infra/update-pkg.adapter.d.ts.map +1 -0
  246. package/dist/lib/mirror/infra/update-pkg.adapter.js +156 -0
  247. package/dist/lib/mirror/infra/workspace-packages.adapter.d.ts +26 -0
  248. package/dist/lib/mirror/infra/workspace-packages.adapter.d.ts.map +1 -0
  249. package/dist/lib/mirror/infra/workspace-packages.adapter.js +170 -0
  250. package/dist/lib/mirror/infra/workspace-service.adapter.d.ts +8 -0
  251. package/dist/lib/mirror/infra/workspace-service.adapter.d.ts.map +1 -0
  252. package/dist/lib/mirror/infra/workspace-service.adapter.js +10 -0
  253. package/dist/lib/mirror/presentation/mirror-prelude.presenter.d.ts +17 -0
  254. package/dist/lib/mirror/presentation/mirror-prelude.presenter.d.ts.map +1 -0
  255. package/dist/lib/mirror/presentation/mirror-prelude.presenter.js +35 -0
  256. package/dist/lib/mirror/presentation/reporter.presenter.d.ts +25 -0
  257. package/dist/lib/mirror/presentation/reporter.presenter.d.ts.map +1 -0
  258. package/dist/lib/mirror/presentation/reporter.presenter.js +140 -0
  259. package/dist/lib/mirror/presentation/resolve-mirror-package-arg.presenter.d.ts +11 -0
  260. package/dist/lib/mirror/presentation/resolve-mirror-package-arg.presenter.d.ts.map +1 -0
  261. package/dist/lib/mirror/presentation/resolve-mirror-package-arg.presenter.js +27 -0
  262. package/dist/lib/shared/source-code/domain/text-edit.model.d.ts +14 -0
  263. package/dist/lib/shared/source-code/domain/text-edit.model.d.ts.map +1 -0
  264. package/dist/lib/shared/source-code/domain/text-edit.model.js +30 -0
  265. package/dist/lib/shared/source-code/infra/tsx-file-walk.adapter.d.ts +4 -0
  266. package/dist/lib/shared/source-code/infra/tsx-file-walk.adapter.d.ts.map +1 -0
  267. package/dist/lib/shared/source-code/infra/tsx-file-walk.adapter.js +37 -0
  268. package/dist/lib/tag/application/ports/target-resolver.port.d.ts +6 -0
  269. package/dist/lib/tag/application/ports/target-resolver.port.d.ts.map +1 -0
  270. package/dist/lib/tag/application/ports/target-resolver.port.js +1 -0
  271. package/dist/lib/tag/application/ports/typescript-tree-walk.port.d.ts +6 -0
  272. package/dist/lib/tag/application/ports/typescript-tree-walk.port.d.ts.map +1 -0
  273. package/dist/lib/tag/application/ports/typescript-tree-walk.port.js +1 -0
  274. package/dist/lib/tag/application/requests/tag-sync.request.d.ts +10 -0
  275. package/dist/lib/tag/application/requests/tag-sync.request.d.ts.map +1 -0
  276. package/dist/lib/tag/application/requests/tag-sync.request.js +8 -0
  277. package/dist/lib/tag/application/use-cases/run-tag-sync.use-case.d.ts +23 -0
  278. package/dist/lib/tag/application/use-cases/run-tag-sync.use-case.d.ts.map +1 -0
  279. package/dist/lib/tag/application/use-cases/run-tag-sync.use-case.js +357 -0
  280. package/dist/lib/tag/domain/types.domain.d.ts +56 -0
  281. package/dist/lib/tag/domain/types.domain.d.ts.map +1 -0
  282. package/dist/lib/tag/domain/types.domain.js +1 -0
  283. package/dist/lib/tag/index.d.ts +14 -0
  284. package/dist/lib/tag/index.d.ts.map +1 -0
  285. package/dist/lib/tag/index.js +10 -0
  286. package/dist/lib/tag/infra/tag-sync-cli-options.adapter.d.ts +14 -0
  287. package/dist/lib/tag/infra/tag-sync-cli-options.adapter.d.ts.map +1 -0
  288. package/dist/lib/tag/infra/tag-sync-cli-options.adapter.js +1 -0
  289. package/dist/lib/tag/infra/tag-target-candidates.adapter.d.ts +4 -0
  290. package/dist/lib/tag/infra/tag-target-candidates.adapter.d.ts.map +1 -0
  291. package/dist/lib/tag/infra/tag-target-candidates.adapter.js +200 -0
  292. package/dist/lib/tag/infra/tag-target-resolver.adapter.d.ts +3 -0
  293. package/dist/lib/tag/infra/tag-target-resolver.adapter.d.ts.map +1 -0
  294. package/dist/lib/tag/infra/tag-target-resolver.adapter.js +4 -0
  295. package/dist/lib/tag/infra/typescript-tree-walk.adapter.d.ts +3 -0
  296. package/dist/lib/tag/infra/typescript-tree-walk.adapter.d.ts.map +1 -0
  297. package/dist/lib/tag/infra/typescript-tree-walk.adapter.js +4 -0
  298. package/dist/lib/tag/presentation/colors.presenter.d.ts +8 -0
  299. package/dist/lib/tag/presentation/colors.presenter.d.ts.map +1 -0
  300. package/dist/lib/tag/presentation/colors.presenter.js +9 -0
  301. package/dist/lib/tag/presentation/resolve-tag-cli-target.presenter.d.ts +8 -0
  302. package/dist/lib/tag/presentation/resolve-tag-cli-target.presenter.d.ts.map +1 -0
  303. package/dist/lib/tag/presentation/resolve-tag-cli-target.presenter.js +10 -0
  304. package/dist/lib/tag/presentation/resolve-tag-workspace-root.presenter.d.ts +8 -0
  305. package/dist/lib/tag/presentation/resolve-tag-workspace-root.presenter.d.ts.map +1 -0
  306. package/dist/lib/tag/presentation/resolve-tag-workspace-root.presenter.js +10 -0
  307. package/dist/lib/tag/presentation/tag-prelude.presenter.d.ts +15 -0
  308. package/dist/lib/tag/presentation/tag-prelude.presenter.d.ts.map +1 -0
  309. package/dist/lib/tag/presentation/tag-prelude.presenter.js +31 -0
  310. package/dist/lib/tag/presentation/tag-sync.presenter.d.ts +20 -0
  311. package/dist/lib/tag/presentation/tag-sync.presenter.d.ts.map +1 -0
  312. package/dist/lib/tag/presentation/tag-sync.presenter.js +92 -0
  313. package/dist/program.d.ts +4 -0
  314. package/dist/program.d.ts.map +1 -0
  315. package/dist/program.js +40 -0
  316. package/package.json +8 -5
  317. package/dist/commands/arrange.mjs +0 -107
  318. package/dist/commands/mirror.mjs +0 -66
  319. package/dist/commands/tag.mjs +0 -58
  320. package/dist/lib/arrange/application/analyze.mjs +0 -92
  321. package/dist/lib/arrange/application/group-file.mjs +0 -113
  322. package/dist/lib/arrange/application/run-target.mjs +0 -65
  323. package/dist/lib/arrange/domain/ast/ast-helpers.mjs +0 -115
  324. package/dist/lib/arrange/domain/ast/collectors-cn.mjs +0 -61
  325. package/dist/lib/arrange/domain/ast/collectors-jsx.mjs +0 -20
  326. package/dist/lib/arrange/domain/ast/collectors-tv.mjs +0 -170
  327. package/dist/lib/arrange/domain/ast/targets.mjs +0 -106
  328. package/dist/lib/arrange/domain/constants.mjs +0 -169
  329. package/dist/lib/arrange/domain/errors.mjs +0 -19
  330. package/dist/lib/arrange/domain/grouping.mjs +0 -235
  331. package/dist/lib/arrange/domain/imports.mjs +0 -54
  332. package/dist/lib/arrange/domain/tokenizer.mjs +0 -216
  333. package/dist/lib/arrange/index.mjs +0 -15
  334. package/dist/lib/arrange/infra/walk.mjs +0 -33
  335. package/dist/lib/arrange/presentation/formatters.mjs +0 -52
  336. package/dist/lib/arrange/presentation/report.mjs +0 -24
  337. package/dist/lib/config/domain/schema.mjs +0 -25
  338. package/dist/lib/config/index.mjs +0 -3
  339. package/dist/lib/config/infra/loader.mjs +0 -78
  340. package/dist/lib/infra/caught-unknown-message.mjs +0 -20
  341. package/dist/lib/infra/config-reporter.mjs +0 -10
  342. package/dist/lib/infra/node-io.mjs +0 -30
  343. package/dist/lib/infra/workspace/repo-root.mjs +0 -22
  344. package/dist/lib/mirror/application/engine.mjs +0 -248
  345. package/dist/lib/mirror/application/sync.mjs +0 -162
  346. package/dist/lib/mirror/domain/constants.mjs +0 -12
  347. package/dist/lib/mirror/domain/errors.mjs +0 -15
  348. package/dist/lib/mirror/index.mjs +0 -2
  349. package/dist/lib/mirror/infra/dirent-list.mjs +0 -14
  350. package/dist/lib/mirror/infra/package-filter.mjs +0 -26
  351. package/dist/lib/mirror/infra/path-normalizer.mjs +0 -7
  352. package/dist/lib/mirror/infra/update-pkg.mjs +0 -105
  353. package/dist/lib/mirror/infra/workspace-packages.mjs +0 -159
  354. package/dist/lib/mirror/presentation/reporter.mjs +0 -111
  355. package/dist/lib/tag/application/engine.mjs +0 -287
  356. package/dist/lib/tag/index.mjs +0 -4
  357. package/dist/lib/tag/infra/target-resolver.mjs +0 -170
  358. package/dist/lib/tag/presentation/colors.mjs +0 -12
  359. package/dist/lib/tag/presentation/tag-presenter.mjs +0 -63
  360. package/dist/program.mjs +0 -34
  361. /package/dist/lib/arrange/{domain/types.mjs → application/ports/domain-source-parser.port.js} +0 -0
  362. /package/dist/lib/{infra/fs-contract.mjs → arrange/application/ports/file-walker.port.js} +0 -0
  363. /package/dist/lib/{mirror/domain/types.mjs → arrange/infra/arrange-sync-cli-options.adapter.js} +0 -0
  364. /package/dist/lib/{tag/domain/types.mjs → core/application/ports/cli-io.port.js} +0 -0
@@ -1,235 +0,0 @@
1
- import { BUCKET_ORDER } from "./constants.mjs";
2
- import { bucketsCompatible, bucketsMergeCompatible, classifyToken, compositeSecondaryOrder, selectorKey, stateKey, stripVariants, tokenizeClassString } from "./tokenizer.mjs";
3
- //#region src/lib/arrange/domain/grouping.ts
4
- function isVariantKeyedBucket(bucket) {
5
- return bucket === "selector" || bucket === "state" || bucket === "starting";
6
- }
7
- function variantGroupKey(bucket, classToken) {
8
- return bucket === "selector" ? selectorKey(classToken) : stateKey(classToken);
9
- }
10
- /**
11
- * True when `staticLiteralTexts` carries the **same partition** of Tailwind tokens as
12
- * `suggestedGroups` from {@link suggestCnGroups}, ignoring order of arguments and
13
- * order of tokens within each chunk.
14
- */
15
- function areCnTailwindPartitionsEquivalent(staticLiteralTexts, suggestedGroups) {
16
- const partitionSignatures = (chunks) => chunks.map((chunk) => {
17
- const classTokens = tokenizeClassString(chunk);
18
- return classTokens.length === 0 ? "" : [...classTokens].sort().join(" ");
19
- }).filter((s) => s.length > 0).sort((a, b) => a.localeCompare(b));
20
- const staticPartitionSigs = partitionSignatures(staticLiteralTexts);
21
- const suggestedPartitionSigs = partitionSignatures(suggestedGroups);
22
- if (staticPartitionSigs.length !== suggestedPartitionSigs.length) return false;
23
- for (let i = 0; i < staticPartitionSigs.length; i++) if (staticPartitionSigs[i] !== suggestedPartitionSigs[i]) return false;
24
- return true;
25
- }
26
- /** Dominant bucket of a whitespace-delimited class group (for merge heuristics). */
27
- function dominantBucketOfGroup(groupStr) {
28
- const counts = /* @__PURE__ */ new Map();
29
- for (const classToken of tokenizeClassString(groupStr)) {
30
- const tokenBucket = classifyToken(classToken);
31
- counts.set(tokenBucket, (counts.get(tokenBucket) ?? 0) + 1);
32
- }
33
- let best = "other";
34
- let bestN = 0;
35
- for (const [bucket, count] of counts) {
36
- if (count > bestN) {
37
- best = bucket;
38
- bestN = count;
39
- continue;
40
- }
41
- if (count === bestN && BUCKET_ORDER[bucket] < BUCKET_ORDER[best]) best = bucket;
42
- }
43
- return best;
44
- }
45
- /** Dynamic cap: more tokens → allow more groups, within [BASE, CAP]. */
46
- function dynamicMaxGroups(tokenCount) {
47
- const byTokens = Math.ceil(tokenCount / 2) + 2;
48
- return Math.max(4, Math.min(24, byTokens));
49
- }
50
- /**
51
- * Merge singleton groups (< MIN_GROUP_TOKENS tokens) into their nearest
52
- * neighbour. Prefers merging toward a bucket-compatible neighbor.
53
- *
54
- * Loop termination: each iteration either splices one element (shrinking the
55
- * array, guaranteeing progress) or finds no singleton that can merge and exits
56
- * via `changed = false`. Two mutually-incompatible singletons both hit
57
- * `continue` and `changed` stays false, so the loop exits without spinning.
58
- */
59
- function mergeSingletons(groups) {
60
- if (groups.length <= 1) return groups;
61
- const result = [...groups];
62
- let changed = true;
63
- while (changed) {
64
- changed = false;
65
- for (let i = 0; i < result.length; i++) if (tokenizeClassString(result[i]).length < 2) {
66
- if (result.length === 1) break;
67
- const myBucket = dominantBucketOfGroup(result[i]);
68
- const prevCompat = i > 0 && bucketsMergeCompatible(myBucket, dominantBucketOfGroup(result[i - 1]));
69
- const nextCompat = i < result.length - 1 && bucketsMergeCompatible(myBucket, dominantBucketOfGroup(result[i + 1]));
70
- let mergeDir;
71
- if (nextCompat && !prevCompat) mergeDir = "forward";
72
- else if (prevCompat && !nextCompat) mergeDir = "backward";
73
- else if (prevCompat && nextCompat) mergeDir = i < result.length - 1 ? "forward" : "backward";
74
- else continue;
75
- if (mergeDir === "forward") result[i + 1] = result[i] + " " + result[i + 1];
76
- else result[i - 1] = result[i - 1] + " " + result[i];
77
- result.splice(i, 1);
78
- changed = true;
79
- break;
80
- }
81
- }
82
- return result;
83
- }
84
- /** Tie-break when two merge candidates are both {@link bucketsMergeCompatible} (same bucket or COMPATIBLE_BUCKET_SETS). */
85
- function capMergePenalty(leftBucket, rightBucket) {
86
- if (leftBucket === rightBucket) return 0;
87
- if (bucketsCompatible(leftBucket, rightBucket)) return 0;
88
- return 500;
89
- }
90
- /**
91
- * Merge adjacent groups until total count ≤ maxGroups.
92
- * Only merges pairs allowed by {@link bucketsMergeCompatible} — never glues incompatible
93
- * buckets (which previously defaulted to penalty 0 and merged layout+state when over cap).
94
- *
95
- * Complexity: O(n²) in the number of groups — each merge pass scans all remaining adjacent
96
- * pairs. In practice `n` is bounded by {@link MAX_GROUPS_CAP} (24) and typical class strings
97
- * are well below that, so this is not a concern for the current usage pattern. If this ever
98
- * runs in a high-throughput batch mode, consider a priority-queue approach.
99
- */
100
- function capGroups(groups, maxGroups) {
101
- const result = [...groups];
102
- const lengths = result.map((groupStr) => tokenizeClassString(groupStr).length);
103
- while (result.length > maxGroups) {
104
- const mergePairCandidates = [];
105
- for (let i = 0; i < result.length - 1; i++) {
106
- const dominantLeft = dominantBucketOfGroup(result[i]);
107
- const dominantRight = dominantBucketOfGroup(result[i + 1]);
108
- if (!bucketsMergeCompatible(dominantLeft, dominantRight)) continue;
109
- mergePairCandidates.push({
110
- i,
111
- size: lengths[i] + lengths[i + 1],
112
- penalty: capMergePenalty(dominantLeft, dominantRight)
113
- });
114
- }
115
- if (mergePairCandidates.length === 0) break;
116
- let best = mergePairCandidates[0];
117
- for (const candidate of mergePairCandidates) if (candidate.penalty < best.penalty || candidate.penalty === best.penalty && candidate.size < best.size) best = candidate;
118
- const bestIdx = best.i;
119
- result[bestIdx] = result[bestIdx] + " " + result[bestIdx + 1];
120
- lengths[bestIdx] = lengths[bestIdx] + lengths[bestIdx + 1];
121
- result.splice(bestIdx + 1, 1);
122
- lengths.splice(bestIdx + 1, 1);
123
- }
124
- return result;
125
- }
126
- /**
127
- * If a chunk is **only** bare `ease-*` timing (Motion), buffer it and prepend to the **first**
128
- * **later** chunk that is predominantly `state` **and** contains some `animate-*` utility —
129
- * skipping intermediate `state` chunks (`sm:…`, `group-data-[…]:…`, etc.) that sit between
130
- * `ease-ui` and `data-open:animate-*`. If no such chunk exists, the ease chunk is left as-is.
131
- */
132
- function mergeEaseTimingIntoFollowingAnimatedState(groups) {
133
- const result = [...groups];
134
- let changed = true;
135
- while (changed) {
136
- changed = false;
137
- for (let i = 0; i < result.length; i++) {
138
- if (!chunkIsOnlyEaseTimingMotion(result[i])) continue;
139
- const easeStr = result[i];
140
- let target = -1;
141
- for (let j = i + 1; j < result.length; j++) {
142
- if (dominantBucketOfGroup(result[j]) !== "state") continue;
143
- if (!tokenizeClassString(result[j]).some((classToken) => /^animate/.test(stripVariants(classToken)))) continue;
144
- target = j;
145
- break;
146
- }
147
- if (target === -1) continue;
148
- result[target] = `${easeStr} ${result[target]}`.trim();
149
- result.splice(i, 1);
150
- changed = true;
151
- break;
152
- }
153
- }
154
- return result;
155
- }
156
- function chunkIsOnlyEaseTimingMotion(groupStr) {
157
- const classTokens = tokenizeClassString(groupStr);
158
- if (classTokens.length === 0) return false;
159
- return classTokens.every((classToken) => classifyToken(classToken) === "motion" && /^ease-/.test(stripVariants(classToken)));
160
- }
161
- function suggestCnGroups(classString) {
162
- const tokens = tokenizeClassString(classString);
163
- if (tokens.length === 0) return [];
164
- const classified = tokens.map((classToken, index) => ({
165
- classToken,
166
- bucket: classifyToken(classToken),
167
- index
168
- }));
169
- classified.sort((left, right) => {
170
- const bucketOrderDiff = BUCKET_ORDER[left.bucket] - BUCKET_ORDER[right.bucket];
171
- if (bucketOrderDiff !== 0) return bucketOrderDiff;
172
- if (left.bucket === "composite" && right.bucket === "composite") {
173
- const compositeOrderDiff = compositeSecondaryOrder(stripVariants(left.classToken)) - compositeSecondaryOrder(stripVariants(right.classToken));
174
- if (compositeOrderDiff !== 0) return compositeOrderDiff;
175
- }
176
- return left.index - right.index;
177
- });
178
- const rawGroups = [];
179
- /** Bucket of the last token already placed in the current run (pairwise compat with `COMPATIBLE_BUCKET_SETS`). */
180
- let lastBucketInRun = null;
181
- let currentStateKey = null;
182
- let currentTokens = [];
183
- const flush = () => {
184
- if (currentTokens.length > 0) {
185
- rawGroups.push(currentTokens.join(" "));
186
- currentTokens = [];
187
- }
188
- lastBucketInRun = null;
189
- currentStateKey = null;
190
- };
191
- for (const { classToken, bucket: tokenBucket } of classified) {
192
- if (lastBucketInRun === null) {
193
- lastBucketInRun = tokenBucket;
194
- currentStateKey = isVariantKeyedBucket(tokenBucket) ? variantGroupKey(tokenBucket, classToken) : null;
195
- currentTokens.push(classToken);
196
- continue;
197
- }
198
- if (isVariantKeyedBucket(tokenBucket)) {
199
- const key = variantGroupKey(tokenBucket, classToken);
200
- if (currentStateKey !== null && key !== currentStateKey) {
201
- flush();
202
- lastBucketInRun = tokenBucket;
203
- currentStateKey = key;
204
- currentTokens.push(classToken);
205
- continue;
206
- }
207
- }
208
- if (!bucketsCompatible(tokenBucket, lastBucketInRun)) {
209
- flush();
210
- lastBucketInRun = tokenBucket;
211
- currentStateKey = isVariantKeyedBucket(tokenBucket) ? variantGroupKey(tokenBucket, classToken) : null;
212
- currentTokens.push(classToken);
213
- continue;
214
- }
215
- if (isVariantKeyedBucket(tokenBucket)) currentStateKey = variantGroupKey(tokenBucket, classToken);
216
- else if (currentStateKey !== null) currentStateKey = null;
217
- lastBucketInRun = tokenBucket;
218
- currentTokens.push(classToken);
219
- }
220
- flush();
221
- const withEaseMerged = mergeEaseTimingIntoFollowingAnimatedState(mergeSingletons(rawGroups));
222
- return capGroups(withEaseMerged, Math.max(dynamicMaxGroups(tokens.length), withEaseMerged.length));
223
- }
224
- /**
225
- * One label per suggested group: a single bucket name, or `mixed:a+b` when that chunk
226
- * spans multiple Tailwind buckets (matches `codefast arrange group` stdout).
227
- */
228
- function summarizeGroupBucketLabels(groups) {
229
- return groups.map((g) => {
230
- const uniq = new Set(tokenizeClassString(g).map(classifyToken));
231
- return uniq.size === 1 ? [...uniq][0] : `mixed:${[...uniq].sort().join("+")}`;
232
- });
233
- }
234
- //#endregion
235
- export { areCnTailwindPartitionsEquivalent, capGroups, mergeEaseTimingIntoFollowingAnimatedState, mergeSingletons, suggestCnGroups, summarizeGroupBucketLabels };
@@ -1,54 +0,0 @@
1
- import ts from "typescript";
2
- //#region src/lib/arrange/domain/imports.ts
3
- function sourceFileImportsCn(sf) {
4
- for (const statement of sf.statements) {
5
- if (!ts.isImportDeclaration(statement) || !statement.importClause) continue;
6
- const clause = statement.importClause;
7
- if (clause.name?.text === "cn") return true;
8
- if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {
9
- for (const importedBinding of clause.namedBindings.elements) if (importedBinding.name.text === "cn") return true;
10
- }
11
- }
12
- return false;
13
- }
14
- /**
15
- * Resolve the module specifier used when injecting a `cn` import into a file.
16
- */
17
- function cnModuleSpecifierForFile(filePath, override) {
18
- if (override) return override;
19
- return "@codefast/tailwind-variants";
20
- }
21
- function findImportDeclarationFromModule(sf, moduleSpecifier) {
22
- for (const statement of sf.statements) {
23
- if (!ts.isImportDeclaration(statement)) continue;
24
- const spec = statement.moduleSpecifier;
25
- if (ts.isStringLiteral(spec) && spec.text === moduleSpecifier) return statement;
26
- }
27
- }
28
- function ensureCnImport(sourceText, filePath, cnImportOverride) {
29
- const sf = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, filePath.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
30
- if (sourceFileImportsCn(sf)) return sourceText;
31
- const moduleSpecifier = cnModuleSpecifierForFile(filePath, cnImportOverride);
32
- const decl = findImportDeclarationFromModule(sf, moduleSpecifier);
33
- if (decl?.importClause && !decl.importClause.isTypeOnly && decl.importClause.namedBindings && ts.isNamedImports(decl.importClause.namedBindings)) {
34
- const elements = decl.importClause.namedBindings.elements;
35
- if (elements.length > 0) {
36
- const pos = elements[0].getStart(sf);
37
- return `${sourceText.slice(0, pos)}cn, ${sourceText.slice(pos)}`;
38
- }
39
- }
40
- const importLine = `import { cn } from "${moduleSpecifier}";`;
41
- let firstImport = -1;
42
- for (const statement of sf.statements) if (ts.isImportDeclaration(statement)) {
43
- firstImport = statement.getStart(sf);
44
- break;
45
- }
46
- const useClient = /^["']use client["'];?\s*\r?\n/.exec(sourceText);
47
- let insertAt;
48
- if (useClient) insertAt = useClient[0].length;
49
- else if (firstImport !== -1) insertAt = firstImport;
50
- else insertAt = 0;
51
- return `${sourceText.slice(0, insertAt)}${importLine}\n${sourceText.slice(insertAt)}`;
52
- }
53
- //#endregion
54
- export { cnModuleSpecifierForFile, ensureCnImport };
@@ -1,216 +0,0 @@
1
- import { COMPATIBLE_BUCKET_SETS, RESPONSIVE_PREFIX, STATE_PREFIXES } from "./constants.mjs";
2
- //#region src/lib/arrange/domain/tokenizer.ts
3
- /**
4
- * Variant stems not covered by a single entry in STATE_PREFIXES (compound `has-*`,
5
- * numbered `nth-*`, media features, v4 `in-[…]`, child selectors `*` / `**`, …).
6
- * When these are missed, `isStateToken` is false and the variant is stripped — the
7
- * utility is then bucketed as if it were unconditional, which breaks preview grouping.
8
- */
9
- function isCompoundOrMediaVariantPrefix(prefix) {
10
- if (prefix === "*" || prefix === "**") return true;
11
- if (prefix === "inert") return true;
12
- if (prefix.startsWith("has-")) return true;
13
- if (prefix.startsWith("in-[")) return true;
14
- if (/^nth(?:-last)?(?:-of-type)?(?:-\d+|-\[)/.test(prefix) || /^nth-of-type-\d+$/.test(prefix) || /^nth-last-of-type-\d+$/.test(prefix)) return true;
15
- if (/^(?:user-valid|user-invalid|contrast-more|contrast-less|forced-colors|inverted-colors)$/.test(prefix)) return true;
16
- if (/^(?:any-)?pointer-(?:fine|coarse|none)$/.test(prefix)) return true;
17
- if (/^(?:portrait|landscape|noscript)$/.test(prefix)) return true;
18
- return false;
19
- }
20
- function tokenizeClassString(classString) {
21
- return classString.trim().split(/\s+/).filter(Boolean);
22
- }
23
- /**
24
- * Index of the first `:` that separates a Tailwind variant segment from the rest.
25
- * Colons inside `[...]` (at positive bracket depth) are ignored so selectors like
26
- * `[&_a:hover]:text-red-500` split as `[&_a:hover]:` + `text-red-500`.
27
- */
28
- function indexOfFirstVariantColon(text) {
29
- let depth = 0;
30
- for (let i = 0; i < text.length; i++) {
31
- const ch = text[i];
32
- if (ch === "[") depth++;
33
- else if (ch === "]") depth = Math.max(0, depth - 1);
34
- else if (ch === ":" && depth === 0) return i;
35
- }
36
- return -1;
37
- }
38
- function stripVariants(token) {
39
- let withoutVariants = token;
40
- const MAX_PASSES = 12;
41
- for (let i = 0; i < MAX_PASSES; i++) {
42
- const colonIdx = indexOfFirstVariantColon(withoutVariants);
43
- if (colonIdx === -1) break;
44
- withoutVariants = withoutVariants.slice(colonIdx + 1);
45
- }
46
- return withoutVariants;
47
- }
48
- /** Outermost variant segment: first `:` at bracket depth 0 → text before it. */
49
- function firstLeadingVariantPrefix(token) {
50
- const colonIdx = indexOfFirstVariantColon(token);
51
- if (colonIdx === -1) return;
52
- return token.slice(0, colonIdx);
53
- }
54
- function isSelectorVariantToken(token) {
55
- const prefix = firstLeadingVariantPrefix(token);
56
- if (prefix === void 0) return false;
57
- if (prefix === "*" || prefix === "**") return true;
58
- if (prefix.startsWith("has-")) return true;
59
- if (prefix.startsWith("in-[")) return true;
60
- if (prefix.startsWith("group-[")) return true;
61
- if (prefix.startsWith("peer-[")) return true;
62
- if (prefix.startsWith("not-[")) return true;
63
- return false;
64
- }
65
- function isStateToken(token) {
66
- const prefix = firstLeadingVariantPrefix(token);
67
- if (prefix === void 0) return false;
68
- if (RESPONSIVE_PREFIX.test(token)) return true;
69
- if (STATE_PREFIXES.has(prefix)) return true;
70
- if (prefix.startsWith("data-[")) return true;
71
- if (prefix.startsWith("aria-[")) return true;
72
- if (prefix.startsWith("supports-[")) return true;
73
- if (prefix.startsWith("in-data-")) return true;
74
- if (/^data-(?!\[)/.test(prefix)) return true;
75
- if (/^aria-/.test(prefix)) return true;
76
- if (/^(group|peer)-/.test(prefix)) return true;
77
- if (/^not-/.test(prefix)) return true;
78
- if (isCompoundOrMediaVariantPrefix(prefix)) return true;
79
- if (prefix.startsWith("[") && prefix.endsWith("]")) return true;
80
- return false;
81
- }
82
- /**
83
- * Secondary sort inside the **composite** bucket: opacity / blend / isolation →
84
- * 3D context → 3D transforms → 2D transforms → filters → will-change.
85
- */
86
- function compositeSecondaryOrder(bareUtility) {
87
- const b = bareUtility;
88
- if (/^opacity(?:-|$)/.test(b) || /^mix-blend-/.test(b) || /^isolation(?:-|$)/.test(b) || b === "isolate") return 0;
89
- if (b === "transform-3d" || /^perspective(?:-|$)/.test(b)) return 10;
90
- if (/^rotate-[xyz](?:-|$)/.test(b) || /^translate-z(?:-|$)/.test(b) || /^scale-z(?:-|$)/.test(b)) return 20;
91
- if (/^translate(?:-|$)/.test(b) || /^scale(?:-|$)/.test(b) || /^rotate(?:-|$)/.test(b) || /^skew(?:-|$)/.test(b)) return 30;
92
- if (/^transform(?:-(?:gpu|cpu|none))?$/.test(b)) return 35;
93
- if (/^blur(?:-|$)/.test(b) || /^backdrop-/.test(b) || /^filter(?:-|$)/.test(b) || /^brightness-/.test(b) || /^contrast-/.test(b) || /^grayscale(?:-|$)/.test(b) || /^hue-rotate-/.test(b) || /^invert(?:-|$)/.test(b) || /^saturate-/.test(b) || /^sepia(?:-|$)/.test(b)) return 40;
94
- if (/^will-change/.test(b)) return 50;
95
- return 99;
96
- }
97
- /** Classify a **bare** utility (no `hover:` / `md:` / … prefixes). */
98
- function classifyBareUtility(bareUtility) {
99
- const b = bareUtility;
100
- if (/^@container(?:\/[a-z][a-z0-9-]*)?$/i.test(b)) return "existence";
101
- if (/^(?:hidden|contents|sr-only|not-sr-only|list-item|flow-root)$/.test(b) || /^(?:block|inline-block|inline)$/.test(b)) return "existence";
102
- if (/^table(?:$|-)/.test(b)) return "existence";
103
- if (/^contain-/.test(b)) return "existence";
104
- if (/^(?:group|peer)(?:\/[a-z][a-z0-9-]*)?$/.test(b)) return "existence";
105
- if (/^(?:static|relative|absolute|fixed|sticky)$/.test(b)) return "position";
106
- if (/^-?(?:inset|top|right|bottom|left|start|end)(?:-|\/|$)/.test(b) || /^-?(?:inset-x|inset-y|inset-s|inset-e)-/.test(b)) return "position";
107
- if (/^-?z-/.test(b) || b === "z-auto") return "position";
108
- if (/^(?:flex|inline-flex|grid|inline-grid|subgrid|masonry)(?:$|-)/.test(b) || /^(?:items|justify|justify-items|justify-self|content|self|place|place-content|place-items|place-self)-/.test(b) || /^-?(?:gap|space-[xy]|col-|row-|grid-|auto-cols|auto-rows|order-|order$)/.test(b) || /^-?(?:auto-flow|grid-flow)-/.test(b) || /^(?:columns-|break-after|break-before|break-inside)-/.test(b) || /^(?:float|clear)-/.test(b) || /^(?:wrap-|flex-wrap|flex-nowrap|flex-row|flex-col|flex-auto|flex-initial|flex-none|flex-1|flex-\[)/.test(b) || /^container$/.test(b)) return "layout";
109
- if (/^-?(?:w|h|min-w|max-w|min-h|max-h|size|aspect|shrink|grow|basis)-/.test(b) || /^(?:shrink|grow)(?:$|-)/.test(b) || /^-?overflow-/.test(b) || /^-?object-/.test(b)) return "sizing";
110
- if (/^-?(?:p|px|py|pt|pb|pl|pr|ps|pe|m|mx|my|mt|mb|ml|mr|ms|me)-/.test(b)) return "spacing";
111
- if (/^-?(?:rounded|border|ring|divide|inset-ring)(?:-|\/|$)/.test(b) || /^(?:rounded|border|ring|divide|inset-ring)$/.test(b) || /^ring-offset-/.test(b)) return "shape";
112
- if (/^-?bg-/.test(b) || /^(?:from|via|to)(?:-|\/|$)/.test(b) || /^bg-(?:linear|radial|conic)-/.test(b) || /^-?mask-/.test(b) || /^-?(?:fill|stroke)-/.test(b)) return "background";
113
- if (/^-?(?:shadow|inset-shadow|drop-shadow|text-shadow)(?:-|\/|$)/.test(b) || /^(?:shadow|inset-shadow)$/.test(b) || /^-?outline(?:-|\/|$)/.test(b) || /^outline$/.test(b)) return "shadow";
114
- if (/^-?(?:font|leading|tracking|list|indent|align|decoration|underline-offset|text-wrap|text-balance|text-pretty)-/.test(b) || /^-?(?:text-(?!shadow))/.test(b) || /^-?(?:whitespace|break|line-clamp|hyphens)-/.test(b) || /^(?:antialiased|subpixel-antialiased|italic|not-italic|overline|line-through|underline|no-underline|uppercase|lowercase|capitalize|normal-case|truncate|text-wrap|text-balance|text-pretty)$/.test(b) || /^text-wrap-/.test(b) || /^tabular-nums$|^slashed-zero$|^lining-nums$|^oldstyle-nums$|^proportional-nums$/.test(b)) return "typography";
115
- if (/^opacity(?:-|$)/.test(b) || /^mix-blend-/.test(b) || /^isolation(?:-|$)/.test(b) || b === "isolate" || /^transform(?:-(?:gpu|cpu|none))?$/.test(b) || /^-?(?:translate|scale|rotate|skew)-/.test(b) || /^perspective(?:-|$)/.test(b) || b === "transform-3d" || /^blur(?:-|$)/.test(b) || /^backdrop-/.test(b) || /^filter(?:-|$)/.test(b) || /^brightness-/.test(b) || /^contrast-/.test(b) || /^grayscale(?:-|$)/.test(b) || /^hue-rotate-/.test(b) || /^invert(?:-|$)/.test(b) || /^saturate-/.test(b) || /^sepia(?:-|$)/.test(b) || /^will-change/.test(b)) return "composite";
116
- if (/^(?:transition|duration|ease|delay|animate)(?:-|$)/.test(b) || /^ease-/.test(b)) return "motion";
117
- if (/^(?:cursor|pointer-events|select|touch|scroll|scroll-m|scroll-p|overscroll|snap|resize|field-sizing|appearance|scheme|color-scheme|accent|caret)(?:-|$)/.test(b) || /^(?:cursor|select|resize)$/.test(b) || /^scroll-behavior/.test(b) || /^scroll-snap/.test(b) || /^touch-action/.test(b) || b === "inert") return "behavior";
118
- return "other";
119
- }
120
- /**
121
- * Arbitrary **parent** selectors (`[&…]`, `[&>a]:…`, slot forms with `&` inside the bracket)
122
- * scope utilities to descendants — bucket as `selector` so they chunk apart from base layout/typography
123
- * and are labeled distinctly from interactive `state` variants (`hover:`, `data-[…]:`, …).
124
- * Pure arbitrary **properties** (`[--x]:`, `[color:red]`) have no `&` in the leading `[…]` segment.
125
- */
126
- function isArbitraryParentSelectorStateToken(token) {
127
- if (/^\[&/.test(token)) return true;
128
- if (!token.startsWith("[")) return false;
129
- const colonIdx = indexOfFirstVariantColon(token);
130
- if (colonIdx === -1 || colonIdx === 0 || token[colonIdx - 1] !== "]") return false;
131
- return token.slice(0, colonIdx).includes("&");
132
- }
133
- function classifyToken(token) {
134
- if (isArbitraryParentSelectorStateToken(token)) return "selector";
135
- if (isSelectorVariantToken(token)) return "selector";
136
- if (/^@container(?:\/[a-z][a-z0-9-]*)?$/i.test(token)) return "existence";
137
- if (token.startsWith("[")) {
138
- const splitIdx = indexOfFirstVariantColon(token);
139
- if (splitIdx === -1) return "arbitrary";
140
- if (splitIdx === 0 || token[splitIdx - 1] !== "]") return "arbitrary";
141
- }
142
- if (firstLeadingVariantPrefix(token) === "starting") return "starting";
143
- if (isStateToken(token)) return "state";
144
- return classifyBareUtility(stripVariants(token));
145
- }
146
- /**
147
- * Stable key for `data-[…]` variants so unrelated selectors stay split, while
148
- * **branching on the full bracket** (e.g. `data-[vaul-drawer-direction=bottom]`
149
- * vs `=left`) keeps direction-specific utilities in separate state groups.
150
- */
151
- function dataAttributeStem(token) {
152
- const match = token.match(/^data-\[([^\]]*)\]/);
153
- return match ? `data-[${match[1]}]` : "data";
154
- }
155
- /** Same idea as {@link dataAttributeStem} for `aria-[…]:` variants. */
156
- function ariaAttributeStem(token) {
157
- const match = token.match(/^aria-\[([^\]]*)\]/);
158
- return match ? `aria-[${match[1]}]` : "aria";
159
- }
160
- /** `in-data-[…]:` — normalize on the full bracket expression like {@link dataAttributeStem}. */
161
- function inDataAttributeStem(token) {
162
- const match = token.match(/^in-data-\[([^\]]*)\]/);
163
- return match ? `in-data-[${match[1]}]` : "in-data";
164
- }
165
- /**
166
- * Stable key for splitting adjacent `state` / `starting` tokens in {@link suggestCnGroups}
167
- * (`selector` uses {@link selectorKey}).
168
- * Uses the **full variant stack** (every `:` segment outside `[…]`), not only the
169
- * outermost prefix, so `@md/foo:[&>*]:w-auto` and `@md/foo:has-[…]:mt-px` stay in
170
- * separate groups while `hover:opacity` still keys as `hover` + `opacity`…
171
- *
172
- * `data-[…]` / `aria-[…]` normalize the first segment via {@link dataAttributeStem} /
173
- * {@link ariaAttributeStem} (full token required for bracket capture).
174
- */
175
- function stateKey(token) {
176
- const layers = [];
177
- let rest = token;
178
- while (rest.length > 0) {
179
- const colonIdx = indexOfFirstVariantColon(rest);
180
- if (colonIdx === -1) break;
181
- layers.push(rest.slice(0, colonIdx));
182
- rest = rest.slice(colonIdx + 1);
183
- }
184
- if (layers.length === 0) return token;
185
- if (layers[0].startsWith("data-[")) layers[0] = dataAttributeStem(token);
186
- else if (layers[0].startsWith("aria-[")) layers[0] = ariaAttributeStem(token);
187
- else if (layers[0].startsWith("in-data-[")) layers[0] = inDataAttributeStem(token);
188
- return layers.join("");
189
- }
190
- const SELECTOR_KEY_SEP = "";
191
- /**
192
- * Variant key for {@link Bucket} `"selector"` tokens in {@link suggestCnGroups}.
193
- * Reuses {@link stateKey} layer splitting, then normalizes common shadcn/Radix SVG patterns so
194
- * `[&_svg]:…` and `[&_svg:not([class*='size-'])]:…` stay in one chunk.
195
- */
196
- function selectorKey(token) {
197
- return stateKey(token).split(SELECTOR_KEY_SEP).map(normalizeSelectorVariantLayer).join(SELECTOR_KEY_SEP);
198
- }
199
- function normalizeSelectorVariantLayer(layer) {
200
- if (layer === "[&_svg:not([class*='size-'])]") return "[&_svg]";
201
- return layer;
202
- }
203
- function bucketsCompatible(a, b) {
204
- if (a === b) return true;
205
- return COMPATIBLE_BUCKET_SETS.some((bucketSet) => bucketSet.has(a) && bucketSet.has(b));
206
- }
207
- /** Like {@link bucketsCompatible}, but never merge two distinct state / starting / selector variant blobs. */
208
- function bucketsMergeCompatible(a, b) {
209
- if (a === "state" && b === "state") return false;
210
- if (a === "starting" && b === "starting") return false;
211
- if (a === "selector" && b === "selector") return false;
212
- if (a === "arbitrary" || b === "arbitrary") return false;
213
- return bucketsCompatible(a, b);
214
- }
215
- //#endregion
216
- export { bucketsCompatible, bucketsMergeCompatible, classifyBareUtility, classifyToken, compositeSecondaryOrder, indexOfFirstVariantColon, isArbitraryParentSelectorStateToken, selectorKey, stateKey, stripVariants, tokenizeClassString };
@@ -1,15 +0,0 @@
1
- import { DEFAULT_ARRANGE_TARGET, LONG_STRING_TOKEN_THRESHOLD, MAX_STRIP_VARIANT_PASSES } from "./domain/constants.mjs";
2
- import { bucketsCompatible, bucketsMergeCompatible, classifyToken, indexOfFirstVariantColon, selectorKey, stateKey, stripVariants, tokenizeClassString } from "./domain/tokenizer.mjs";
3
- import { forEachStringLiteralInClassExpression, mergeCnUnconditionalLiteralPoolForTest } from "./domain/ast/collectors-cn.mjs";
4
- import { KNOWN_CN_TV_MODULES, applyEditsDescending, buildKnownCnTvBindings, indentOfLineContaining, isCnOrTvIdentifier, lineOf, moduleLooksLikeCnTvReexport, unwrapCnInsideTvCallReplacement } from "./domain/ast/ast-helpers.mjs";
5
- import { DEFAULT_SKIP_DIRS, walkTsxFiles } from "./infra/walk.mjs";
6
- import { analyzeDirectory } from "./application/analyze.mjs";
7
- import { printAnalyzeReport } from "./presentation/report.mjs";
8
- import { areCnTailwindPartitionsEquivalent, capGroups, mergeEaseTimingIntoFollowingAnimatedState, mergeSingletons, suggestCnGroups, summarizeGroupBucketLabels } from "./domain/grouping.mjs";
9
- import { escapeTsStringLiteralContent, formatArray, formatCnArguments, formatCnCall, formatJsxCnAttributeValue } from "./presentation/formatters.mjs";
10
- import { cnModuleSpecifierForFile, ensureCnImport } from "./domain/imports.mjs";
11
- import { groupFile } from "./application/group-file.mjs";
12
- import { ArrangeError, ArrangeErrorCode } from "./domain/errors.mjs";
13
- import { runArrangeSync, runOnTarget } from "./application/run-target.mjs";
14
- import { createNodeCliFs, createNodeCliLogger } from "../infra/node-io.mjs";
15
- export { ArrangeError, ArrangeErrorCode, DEFAULT_ARRANGE_TARGET, DEFAULT_SKIP_DIRS, KNOWN_CN_TV_MODULES, LONG_STRING_TOKEN_THRESHOLD, MAX_STRIP_VARIANT_PASSES, analyzeDirectory, applyEditsDescending, areCnTailwindPartitionsEquivalent, bucketsCompatible, bucketsMergeCompatible, buildKnownCnTvBindings, capGroups, classifyToken, cnModuleSpecifierForFile, createNodeCliFs, createNodeCliLogger, ensureCnImport, escapeTsStringLiteralContent, forEachStringLiteralInClassExpression, formatArray, formatCnArguments, formatCnCall, formatJsxCnAttributeValue, groupFile, indentOfLineContaining, indexOfFirstVariantColon, isCnOrTvIdentifier, lineOf, mergeCnUnconditionalLiteralPoolForTest, mergeEaseTimingIntoFollowingAnimatedState, mergeSingletons, moduleLooksLikeCnTvReexport, printAnalyzeReport, runArrangeSync, runOnTarget, selectorKey, stateKey, stripVariants, suggestCnGroups, summarizeGroupBucketLabels, tokenizeClassString, unwrapCnInsideTvCallReplacement, walkTsxFiles };
@@ -1,33 +0,0 @@
1
- import path from "node:path";
2
- //#region src/lib/arrange/infra/walk.ts
3
- const DEFAULT_SKIP_DIRS = new Set([
4
- "node_modules",
5
- "dist",
6
- ".git",
7
- ".turbo",
8
- ".next",
9
- ".cache",
10
- "out",
11
- "build",
12
- "coverage",
13
- ".vercel",
14
- ".output"
15
- ]);
16
- function walkTsxFiles(rootDirectoryPath, fs) {
17
- const result = [];
18
- const visit = (entryPath) => {
19
- if (fs.statSync(entryPath).isDirectory()) {
20
- for (const childName of fs.readdirSync(entryPath)) {
21
- if (DEFAULT_SKIP_DIRS.has(childName)) continue;
22
- visit(path.join(entryPath, childName));
23
- }
24
- return;
25
- }
26
- if (entryPath.endsWith(".d.ts")) return;
27
- if (entryPath.endsWith(".tsx") || entryPath.endsWith(".ts")) result.push(entryPath);
28
- };
29
- visit(rootDirectoryPath);
30
- return result;
31
- }
32
- //#endregion
33
- export { DEFAULT_SKIP_DIRS, walkTsxFiles };
@@ -1,52 +0,0 @@
1
- import { indentOfLineContaining } from "../domain/ast/ast-helpers.mjs";
2
- //#region src/lib/arrange/presentation/formatters.ts
3
- function escapeTsStringLiteralContent(group) {
4
- return group.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"");
5
- }
6
- /**
7
- * Multiline fragment for use *inside* an existing `cn(...)` — replaces one
8
- * string argument with several, without producing `cn(cn(...))`.
9
- */
10
- function formatCnArguments(groups, options) {
11
- const indent = options?.indent ?? " ";
12
- const commaAfterLast = options?.commaAfterLastGroup ?? options?.trailingClassName ?? false;
13
- const lines = [];
14
- for (let i = 0; i < groups.length; i++) {
15
- const group = groups[i];
16
- const comma = i < groups.length - 1 || commaAfterLast ? "," : "";
17
- lines.push(`${indent}"${escapeTsStringLiteralContent(group)}"${comma}`);
18
- }
19
- if (options?.trailingClassName) lines.push(`${indent}className,`);
20
- return lines.join("\n");
21
- }
22
- function formatCnCall(groups, options) {
23
- const lines = ["cn("];
24
- const commaOnEachStringLine = groups.length > 1 || Boolean(options?.trailingClassName);
25
- for (let i = 0; i < groups.length; i++) {
26
- const group = groups[i];
27
- const comma = commaOnEachStringLine ? "," : "";
28
- lines.push(` "${escapeTsStringLiteralContent(group)}"${comma}`);
29
- }
30
- if (options?.trailingClassName) lines.push(" className,");
31
- lines.push(")");
32
- return lines.join("\n");
33
- }
34
- function formatArray(groups) {
35
- const lines = ["["];
36
- for (let i = 0; i < groups.length; i++) {
37
- const group = groups[i];
38
- const comma = i < groups.length - 1 || groups.length > 1 ? "," : "";
39
- lines.push(` "${escapeTsStringLiteralContent(group)}"${comma}`);
40
- }
41
- lines.push("]");
42
- return lines.join("\n");
43
- }
44
- function formatJsxCnAttributeValue(groups, source, valueNodeStart) {
45
- const baseIndent = indentOfLineContaining(source, valueNodeStart);
46
- return `{cn(\n${formatCnArguments(groups, {
47
- indent: `${baseIndent} `,
48
- commaAfterLastGroup: groups.length > 1
49
- })}\n${baseIndent})}`;
50
- }
51
- //#endregion
52
- export { escapeTsStringLiteralContent, formatArray, formatCnArguments, formatCnCall, formatJsxCnAttributeValue };
@@ -1,24 +0,0 @@
1
- import "../domain/constants.mjs";
2
- import path from "node:path";
3
- //#region src/lib/arrange/presentation/report.ts
4
- function printAnalyzeReport(analyzeRootDirectoryPath, analyzeReport, logger) {
5
- const { out } = logger;
6
- out(`Path: ${path.resolve(analyzeRootDirectoryPath)}`);
7
- out(`.ts/.tsx files: ${analyzeReport.files}`);
8
- out(`cn(...) call sites: ${analyzeReport.cnCallExpressions}`);
9
- out(`tv(...) call sites: ${analyzeReport.tvCallExpressions}`);
10
- out(`\nLong cn(...) string literals (≥18 tokens — consider splitting arguments): ${analyzeReport.longCnStringLiterals.length}`);
11
- for (const findingEntry of analyzeReport.longCnStringLiterals.slice(0, 40)) out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
12
- if (analyzeReport.longCnStringLiterals.length > 40) out(` … and ${analyzeReport.longCnStringLiterals.length - 40} more`);
13
- out(`\nLong tv({...}) string literals in base/variants/… (≥18 tokens): ${analyzeReport.longTvStringLiterals.length}`);
14
- for (const findingEntry of analyzeReport.longTvStringLiterals.slice(0, 40)) out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
15
- if (analyzeReport.longTvStringLiterals.length > 40) out(` … and ${analyzeReport.longTvStringLiterals.length - 40} more`);
16
- out(`\nJSX className="..." or className={'...'} (static strings, ≥18 tokens): ${analyzeReport.longJsxClassNameLiterals.length}`);
17
- for (const findingEntry of analyzeReport.longJsxClassNameLiterals.slice(0, 40)) out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
18
- if (analyzeReport.longJsxClassNameLiterals.length > 40) out(` … and ${analyzeReport.longJsxClassNameLiterals.length - 40} more`);
19
- out(`\ncn(...) nested inside tv({...}) (prefer a string or array — preview/apply can rewrite): ${analyzeReport.cnInsideTvCalls.length}`);
20
- for (const findingEntry of analyzeReport.cnInsideTvCalls.slice(0, 40)) out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.argCount} args) ${findingEntry.preview}`);
21
- if (analyzeReport.cnInsideTvCalls.length > 40) out(` … and ${analyzeReport.cnInsideTvCalls.length - 40} more`);
22
- }
23
- //#endregion
24
- export { printAnalyzeReport };
@@ -1,25 +0,0 @@
1
- import { z } from "zod";
2
- //#region src/lib/config/domain/schema.ts
3
- const hookSchema = z.custom((value) => typeof value === "function", { message: "Expected a function" });
4
- const mirrorConfigSchema = z.object({
5
- skipPackages: z.array(z.string()).optional(),
6
- pathTransformations: z.record(z.string(), z.object({ removePrefix: z.string().optional() }).strict()).optional(),
7
- customExports: z.record(z.string(), z.record(z.string(), z.string())).optional(),
8
- cssExports: z.record(z.string(), z.union([z.boolean(), z.object({
9
- enabled: z.boolean().optional(),
10
- customExports: z.record(z.string(), z.string()).optional(),
11
- forceExportFiles: z.boolean().optional()
12
- }).strict()])).optional()
13
- }).strict();
14
- const codefastTagConfigSchema = z.object({
15
- skipPackages: z.array(z.string()).optional(),
16
- onAfterWrite: hookSchema.optional()
17
- }).strict();
18
- const codefastArrangeConfigSchema = z.object({ onAfterWrite: hookSchema.optional() }).strict();
19
- const codefastConfigSchema = z.object({
20
- mirror: mirrorConfigSchema.optional(),
21
- tag: codefastTagConfigSchema.optional(),
22
- arrange: codefastArrangeConfigSchema.optional()
23
- }).strict();
24
- //#endregion
25
- export { codefastArrangeConfigSchema, codefastConfigSchema, codefastTagConfigSchema, hookSchema, mirrorConfigSchema };