@codefast/cli 0.5.0-canary.5 → 0.5.0-canary.7

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 (274) hide show
  1. package/README.md +106 -480
  2. package/dist/arrange/analyze.js +25 -0
  3. package/dist/arrange/analyze.js.map +1 -0
  4. package/dist/arrange/cli-schema.js +29 -0
  5. package/dist/arrange/cli-schema.js.map +1 -0
  6. package/dist/arrange/command.js +170 -0
  7. package/dist/arrange/command.js.map +1 -0
  8. package/dist/arrange/domain/analyze-service.js +122 -0
  9. package/dist/arrange/domain/analyze-service.js.map +1 -0
  10. package/dist/arrange/domain/ast/ast-node.js +240 -0
  11. package/dist/arrange/domain/ast/ast-node.js.map +1 -0
  12. package/dist/arrange/domain/ast/collectors-cn.js +81 -0
  13. package/dist/arrange/domain/ast/collectors-cn.js.map +1 -0
  14. package/dist/arrange/domain/ast/collectors-jsx.js +24 -0
  15. package/dist/arrange/domain/ast/collectors-jsx.js.map +1 -0
  16. package/dist/arrange/domain/ast/collectors-tv.js +319 -0
  17. package/dist/arrange/domain/ast/collectors-tv.js.map +1 -0
  18. package/dist/arrange/domain/ast/helpers.js +151 -0
  19. package/dist/arrange/domain/ast/helpers.js.map +1 -0
  20. package/dist/arrange/domain/ast/simplify-targets.js +161 -0
  21. package/dist/arrange/domain/ast/simplify-targets.js.map +1 -0
  22. package/dist/arrange/domain/ast/targets.js +182 -0
  23. package/dist/arrange/domain/ast/targets.js.map +1 -0
  24. package/dist/arrange/domain/constants.js +225 -0
  25. package/dist/arrange/domain/constants.js.map +1 -0
  26. package/dist/arrange/domain/grouping-service.js +128 -0
  27. package/dist/arrange/domain/grouping-service.js.map +1 -0
  28. package/dist/arrange/domain/grouping.js +435 -0
  29. package/dist/arrange/domain/grouping.js.map +1 -0
  30. package/dist/arrange/domain/imports.js +160 -0
  31. package/dist/arrange/domain/imports.js.map +1 -0
  32. package/dist/arrange/domain/source-text-formatters.js +100 -0
  33. package/dist/arrange/domain/source-text-formatters.js.map +1 -0
  34. package/dist/arrange/domain/tailwind-token.js +50 -0
  35. package/dist/arrange/domain/tailwind-token.js.map +1 -0
  36. package/dist/arrange/domain/token-classifier.js +448 -0
  37. package/dist/arrange/domain/token-classifier.js.map +1 -0
  38. package/dist/arrange/domain/types.js +11 -0
  39. package/dist/arrange/domain/types.js.map +1 -0
  40. package/dist/arrange/output.js +120 -0
  41. package/dist/arrange/output.js.map +1 -0
  42. package/dist/arrange/process-file.js +44 -0
  43. package/dist/arrange/process-file.js.map +1 -0
  44. package/dist/arrange/resolve-target.js +33 -0
  45. package/dist/arrange/resolve-target.js.map +1 -0
  46. package/dist/arrange/scan-target.js +30 -0
  47. package/dist/arrange/scan-target.js.map +1 -0
  48. package/dist/arrange/simplify-process-file.js +29 -0
  49. package/dist/arrange/simplify-process-file.js.map +1 -0
  50. package/dist/arrange/simplify-sync.js +29 -0
  51. package/dist/arrange/simplify-sync.js.map +1 -0
  52. package/dist/arrange/source-parse.js +17 -0
  53. package/dist/arrange/source-parse.js.map +1 -0
  54. package/dist/arrange/suggest.js +14 -0
  55. package/dist/arrange/suggest.js.map +1 -0
  56. package/dist/arrange/sync.js +48 -0
  57. package/dist/arrange/sync.js.map +1 -0
  58. package/dist/arrange/typescript-ast-translator.js +455 -0
  59. package/dist/arrange/typescript-ast-translator.js.map +1 -0
  60. package/dist/arrange/workspace.js +31 -0
  61. package/dist/arrange/workspace.js.map +1 -0
  62. package/dist/audit/cli-schema.js +22 -0
  63. package/dist/audit/cli-schema.js.map +1 -0
  64. package/dist/audit/command.js +60 -0
  65. package/dist/audit/command.js.map +1 -0
  66. package/dist/audit/domain/audit-file.js +101 -0
  67. package/dist/audit/domain/audit-file.js.map +1 -0
  68. package/dist/audit/domain/mappings.js +103 -0
  69. package/dist/audit/domain/mappings.js.map +1 -0
  70. package/dist/audit/domain/tokenize.js +83 -0
  71. package/dist/audit/domain/tokenize.js.map +1 -0
  72. package/dist/audit/domain/types.js +2 -0
  73. package/dist/audit/domain/types.js.map +1 -0
  74. package/dist/audit/output.js +44 -0
  75. package/dist/audit/output.js.map +1 -0
  76. package/dist/audit/prepare.js +42 -0
  77. package/dist/audit/prepare.js.map +1 -0
  78. package/dist/audit/run.js +57 -0
  79. package/dist/audit/run.js.map +1 -0
  80. package/dist/{bin.mjs → bin.js} +2 -4
  81. package/dist/bin.js.map +1 -0
  82. package/dist/cli.js +45 -0
  83. package/dist/cli.js.map +1 -0
  84. package/dist/core/cli/format-error.js +19 -0
  85. package/dist/core/cli/format-error.js.map +1 -0
  86. package/dist/core/cli/global-options.js +10 -0
  87. package/dist/core/cli/global-options.js.map +1 -0
  88. package/dist/core/cli/positional.js +9 -0
  89. package/dist/core/cli/positional.js.map +1 -0
  90. package/dist/core/cli/result-handle.js +69 -0
  91. package/dist/core/cli/result-handle.js.map +1 -0
  92. package/dist/core/config/loader.js +88 -0
  93. package/dist/core/config/loader.js.map +1 -0
  94. package/dist/core/config/schema.js +97 -0
  95. package/dist/core/config/schema.js.map +1 -0
  96. package/dist/core/config/warnings.js +12 -0
  97. package/dist/core/config/warnings.js.map +1 -0
  98. package/dist/core/config.js +18 -0
  99. package/dist/core/config.js.map +1 -0
  100. package/dist/core/errors.js +58 -0
  101. package/dist/core/errors.js.map +1 -0
  102. package/dist/core/exit-codes.js +15 -0
  103. package/dist/core/exit-codes.js.map +1 -0
  104. package/dist/core/filesystem/node.js +33 -0
  105. package/dist/core/filesystem/node.js.map +1 -0
  106. package/dist/core/filesystem/port.js +2 -0
  107. package/dist/core/filesystem/port.js.map +1 -0
  108. package/dist/core/glob.js +20 -0
  109. package/dist/core/glob.js.map +1 -0
  110. package/dist/core/logger.js +13 -0
  111. package/dist/core/logger.js.map +1 -0
  112. package/dist/core/result.js +16 -0
  113. package/dist/core/result.js.map +1 -0
  114. package/dist/core/schema-parse.js +21 -0
  115. package/dist/core/schema-parse.js.map +1 -0
  116. package/dist/core/source-text-edit.js +62 -0
  117. package/dist/core/source-text-edit.js.map +1 -0
  118. package/dist/core/verbose-diagnostics.js +9 -0
  119. package/dist/core/verbose-diagnostics.js.map +1 -0
  120. package/dist/core/workspace/resolver.js +208 -0
  121. package/dist/core/workspace/resolver.js.map +1 -0
  122. package/dist/core/workspace/typescript-walk.js +41 -0
  123. package/dist/core/workspace/typescript-walk.js.map +1 -0
  124. package/dist/mirror/cli-result.js +20 -0
  125. package/dist/mirror/cli-result.js.map +1 -0
  126. package/dist/mirror/cli-schema.js +11 -0
  127. package/dist/mirror/cli-schema.js.map +1 -0
  128. package/dist/mirror/command.js +73 -0
  129. package/dist/mirror/command.js.map +1 -0
  130. package/dist/mirror/dist-filesystem-impl.js +53 -0
  131. package/dist/mirror/dist-filesystem-impl.js.map +1 -0
  132. package/dist/mirror/domain/constants.js +21 -0
  133. package/dist/mirror/domain/constants.js.map +1 -0
  134. package/dist/mirror/domain/dirent-guard.js +16 -0
  135. package/dist/mirror/domain/dirent-guard.js.map +1 -0
  136. package/dist/mirror/domain/dist-filesystem.js +2 -0
  137. package/dist/mirror/domain/dist-filesystem.js.map +1 -0
  138. package/dist/mirror/domain/errors.js +19 -0
  139. package/dist/mirror/domain/errors.js.map +1 -0
  140. package/dist/mirror/domain/exports.js +284 -0
  141. package/dist/mirror/domain/exports.js.map +1 -0
  142. package/dist/mirror/domain/package-display-name.js +10 -0
  143. package/dist/mirror/domain/package-display-name.js.map +1 -0
  144. package/dist/mirror/domain/path-normalizer.js +8 -0
  145. package/dist/mirror/domain/path-normalizer.js.map +1 -0
  146. package/dist/mirror/domain/types.js +2 -0
  147. package/dist/mirror/domain/types.js.map +1 -0
  148. package/dist/mirror/output.js +47 -0
  149. package/dist/mirror/output.js.map +1 -0
  150. package/dist/mirror/package-path.js +40 -0
  151. package/dist/mirror/package-path.js.map +1 -0
  152. package/dist/mirror/prepare.js +37 -0
  153. package/dist/mirror/prepare.js.map +1 -0
  154. package/dist/mirror/supplement-exports.js +157 -0
  155. package/dist/mirror/supplement-exports.js.map +1 -0
  156. package/dist/mirror/sync-reporter.js +125 -0
  157. package/dist/mirror/sync-reporter.js.map +1 -0
  158. package/dist/mirror/sync-types.js +2 -0
  159. package/dist/mirror/sync-types.js.map +1 -0
  160. package/dist/mirror/sync-workspace-package.js +117 -0
  161. package/dist/mirror/sync-workspace-package.js.map +1 -0
  162. package/dist/mirror/sync.js +90 -0
  163. package/dist/mirror/sync.js.map +1 -0
  164. package/dist/mirror/write-exports.js +145 -0
  165. package/dist/mirror/write-exports.js.map +1 -0
  166. package/dist/tag/cli-result.js +12 -0
  167. package/dist/tag/cli-result.js.map +1 -0
  168. package/dist/tag/cli-schema.js +13 -0
  169. package/dist/tag/cli-schema.js.map +1 -0
  170. package/dist/tag/command.js +69 -0
  171. package/dist/tag/command.js.map +1 -0
  172. package/dist/tag/domain/types.js +2 -0
  173. package/dist/tag/domain/types.js.map +1 -0
  174. package/dist/tag/output.js +101 -0
  175. package/dist/tag/output.js.map +1 -0
  176. package/dist/tag/prepare.js +30 -0
  177. package/dist/tag/prepare.js.map +1 -0
  178. package/dist/tag/resolve-target-path.js +14 -0
  179. package/dist/tag/resolve-target-path.js.map +1 -0
  180. package/dist/tag/since-writer.js +231 -0
  181. package/dist/tag/since-writer.js.map +1 -0
  182. package/dist/tag/sync.js +166 -0
  183. package/dist/tag/sync.js.map +1 -0
  184. package/dist/tag/target-candidates.js +79 -0
  185. package/dist/tag/target-candidates.js.map +1 -0
  186. package/dist/tag/target-runner.js +25 -0
  187. package/dist/tag/target-runner.js.map +1 -0
  188. package/dist/tag/version-resolver.js +28 -0
  189. package/dist/tag/version-resolver.js.map +1 -0
  190. package/package.json +25 -20
  191. package/dist/arrange/analyze.mjs +0 -24
  192. package/dist/arrange/cli-schema.mjs +0 -27
  193. package/dist/arrange/command.mjs +0 -130
  194. package/dist/arrange/domain/analyze-service.mjs +0 -102
  195. package/dist/arrange/domain/ast/ast-node.mjs +0 -215
  196. package/dist/arrange/domain/ast/collectors-cn.mjs +0 -64
  197. package/dist/arrange/domain/ast/collectors-jsx.mjs +0 -23
  198. package/dist/arrange/domain/ast/collectors-tv.mjs +0 -189
  199. package/dist/arrange/domain/ast/helpers.mjs +0 -108
  200. package/dist/arrange/domain/ast/simplify-targets.mjs +0 -109
  201. package/dist/arrange/domain/ast/targets.mjs +0 -134
  202. package/dist/arrange/domain/constants.mjs +0 -213
  203. package/dist/arrange/domain/grouping-service.mjs +0 -121
  204. package/dist/arrange/domain/grouping.mjs +0 -338
  205. package/dist/arrange/domain/imports.mjs +0 -107
  206. package/dist/arrange/domain/source-text-formatters.mjs +0 -88
  207. package/dist/arrange/domain/tailwind-token.mjs +0 -40
  208. package/dist/arrange/domain/token-classifier.mjs +0 -218
  209. package/dist/arrange/domain/types.mjs +0 -1
  210. package/dist/arrange/output.mjs +0 -87
  211. package/dist/arrange/process-file.mjs +0 -42
  212. package/dist/arrange/resolve-target.mjs +0 -24
  213. package/dist/arrange/scan-target.mjs +0 -29
  214. package/dist/arrange/simplify-process-file.mjs +0 -35
  215. package/dist/arrange/simplify-sync.mjs +0 -32
  216. package/dist/arrange/source-parse.mjs +0 -18
  217. package/dist/arrange/suggest.mjs +0 -15
  218. package/dist/arrange/sync.mjs +0 -51
  219. package/dist/arrange/typescript-ast-translator.mjs +0 -354
  220. package/dist/arrange/workspace.mjs +0 -31
  221. package/dist/cli.mjs +0 -34
  222. package/dist/core/cli/format-error.mjs +0 -15
  223. package/dist/core/cli/global-options.mjs +0 -10
  224. package/dist/core/cli/positional.mjs +0 -11
  225. package/dist/core/cli/result-handle.mjs +0 -51
  226. package/dist/core/config/loader.mjs +0 -79
  227. package/dist/core/config/schema.mjs +0 -60
  228. package/dist/core/config/warnings.mjs +0 -12
  229. package/dist/core/config.mjs +0 -19
  230. package/dist/core/errors.mjs +0 -35
  231. package/dist/core/exit-codes.mjs +0 -17
  232. package/dist/core/filesystem/node.mjs +0 -32
  233. package/dist/core/filesystem/port.mjs +0 -1
  234. package/dist/core/glob.mjs +0 -20
  235. package/dist/core/logger.mjs +0 -15
  236. package/dist/core/result.mjs +0 -21
  237. package/dist/core/schema-parse.mjs +0 -18
  238. package/dist/core/source-text-edit.mjs +0 -56
  239. package/dist/core/verbose-diagnostics.mjs +0 -11
  240. package/dist/core/workspace/resolver.mjs +0 -177
  241. package/dist/core/workspace/typescript-walk.mjs +0 -36
  242. package/dist/mirror/cli-result.mjs +0 -22
  243. package/dist/mirror/cli-schema.mjs +0 -13
  244. package/dist/mirror/command.mjs +0 -58
  245. package/dist/mirror/dist-filesystem-impl.mjs +0 -42
  246. package/dist/mirror/domain/constants.mjs +0 -31
  247. package/dist/mirror/domain/dirent-guard.mjs +0 -16
  248. package/dist/mirror/domain/dist-filesystem.mjs +0 -1
  249. package/dist/mirror/domain/errors.mjs +0 -21
  250. package/dist/mirror/domain/exports.mjs +0 -226
  251. package/dist/mirror/domain/package-display-name.mjs +0 -12
  252. package/dist/mirror/domain/path-normalizer.mjs +0 -10
  253. package/dist/mirror/domain/types.mjs +0 -1
  254. package/dist/mirror/output.mjs +0 -48
  255. package/dist/mirror/package-path.mjs +0 -32
  256. package/dist/mirror/prepare.mjs +0 -33
  257. package/dist/mirror/supplement-exports.mjs +0 -114
  258. package/dist/mirror/sync-reporter.mjs +0 -107
  259. package/dist/mirror/sync-types.mjs +0 -1
  260. package/dist/mirror/sync-workspace-package.mjs +0 -109
  261. package/dist/mirror/sync.mjs +0 -88
  262. package/dist/mirror/write-exports.mjs +0 -94
  263. package/dist/tag/cli-result.mjs +0 -11
  264. package/dist/tag/cli-schema.mjs +0 -15
  265. package/dist/tag/command.mjs +0 -56
  266. package/dist/tag/domain/types.mjs +0 -1
  267. package/dist/tag/output.mjs +0 -87
  268. package/dist/tag/prepare.mjs +0 -29
  269. package/dist/tag/resolve-target-path.mjs +0 -12
  270. package/dist/tag/since-writer.mjs +0 -131
  271. package/dist/tag/sync.mjs +0 -149
  272. package/dist/tag/target-candidates.mjs +0 -68
  273. package/dist/tag/target-runner.mjs +0 -26
  274. package/dist/tag/version-resolver.mjs +0 -25
@@ -0,0 +1,79 @@
1
+ import path from "node:path";
2
+ import { z } from "zod";
3
+ import { listWorkspacePackageDirectories } from "#/core/workspace/resolver";
4
+ const packageJsonFileName = "package.json";
5
+ const packageJsonNameSchema = z.looseObject({
6
+ name: z.string().min(1).optional(),
7
+ });
8
+ function toPosix(filePath) {
9
+ return filePath.split(path.sep).join("/");
10
+ }
11
+ function readPackageName(fs, packageDir) {
12
+ const packageJsonPath = path.join(packageDir, packageJsonFileName);
13
+ if (!fs.existsSync(packageJsonPath)) {
14
+ return null;
15
+ }
16
+ try {
17
+ const rawPackageJson = fs.readFileSync(packageJsonPath, "utf8");
18
+ const parsedPackageJson = JSON.parse(rawPackageJson);
19
+ const parsedPackageName = packageJsonNameSchema.safeParse(parsedPackageJson);
20
+ if (!parsedPackageName.success) {
21
+ return null;
22
+ }
23
+ return parsedPackageName.data.name ?? null;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ function toRootRelativePath(rootDir, absolutePath) {
30
+ const relativePath = path.relative(rootDir, absolutePath);
31
+ return relativePath ? toPosix(relativePath) : ".";
32
+ }
33
+ function toPackageTargetCandidate(fs, rootDir, packageDir) {
34
+ const packageName = readPackageName(fs, packageDir);
35
+ return {
36
+ candidatePath: packageDir,
37
+ rootRelativeCandidatePath: toRootRelativePath(rootDir, packageDir),
38
+ source: "workspace-package",
39
+ packageDir,
40
+ packageName,
41
+ };
42
+ }
43
+ /**
44
+ * @since 0.3.16-canary.0
45
+ */
46
+ export async function resolveTagTargetCandidates(fs, rootDir, explicitTarget) {
47
+ if (explicitTarget) {
48
+ const resolvedExplicitTarget = path.resolve(explicitTarget);
49
+ return [
50
+ {
51
+ candidatePath: resolvedExplicitTarget,
52
+ rootRelativeCandidatePath: toRootRelativePath(rootDir, resolvedExplicitTarget),
53
+ source: "explicit-target",
54
+ packageDir: null,
55
+ packageName: null,
56
+ },
57
+ ];
58
+ }
59
+ const outcome = await listWorkspacePackageDirectories(rootDir, fs, true);
60
+ const packageDirs = [...outcome.packageDirectoryPathsAbsolute];
61
+ const hasWorkspaceFile = outcome.hasPnpmWorkspaceYamlFile;
62
+ if (packageDirs.length === 0) {
63
+ if (hasWorkspaceFile) {
64
+ return [];
65
+ }
66
+ const repoSourceDir = path.join(rootDir, "src");
67
+ return [
68
+ {
69
+ candidatePath: repoSourceDir,
70
+ rootRelativeCandidatePath: toRootRelativePath(rootDir, repoSourceDir),
71
+ source: "repo-src-fallback",
72
+ packageDir: null,
73
+ packageName: null,
74
+ },
75
+ ];
76
+ }
77
+ return packageDirs.map((packageDir) => toPackageTargetCandidate(fs, rootDir, packageDir));
78
+ }
79
+ //# sourceMappingURL=target-candidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-candidates.js","sourceRoot":"","sources":["../../src/tag/target-candidates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import path from "node:path";
2
+ import { walkTsxFiles } from "#/core/workspace/typescript-walk";
3
+ import { TagSinceWriter } from "#/tag/since-writer";
4
+ import { resolveNearestPackageVersion } from "#/tag/version-resolver";
5
+ /**
6
+ * @since 0.3.16-canary.0
7
+ */
8
+ export function runTagOnTarget(fs, targetPath, opts) {
9
+ const resolvedTarget = path.resolve(targetPath);
10
+ const version = resolveNearestPackageVersion(fs, resolvedTarget);
11
+ const files = fs.statSync(resolvedTarget).isDirectory() ? walkTsxFiles(resolvedTarget, fs) : [resolvedTarget];
12
+ const tsFiles = files.filter((filePath) => filePath.endsWith(".ts") || filePath.endsWith(".tsx"));
13
+ const sinceWriter = new TagSinceWriter(fs);
14
+ const fileResults = tsFiles.map((filePath) => sinceWriter.applySinceTagsToFile(filePath, version, opts.write));
15
+ const filesChanged = fileResults.filter((result) => result.changed).length;
16
+ const taggedDeclarations = fileResults.reduce((sum, result) => sum + result.taggedDeclarations, 0);
17
+ return {
18
+ version,
19
+ filesScanned: tsFiles.length,
20
+ filesChanged,
21
+ taggedDeclarations,
22
+ fileResults,
23
+ };
24
+ }
25
+ //# sourceMappingURL=target-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-runner.js","sourceRoot":"","sources":["../../src/tag/target-runner.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEtE;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAkB,EAAE,UAAkB,EAAE,IAAmB;IACxF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,4BAA4B,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAEjE,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC9G,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAElG,MAAM,WAAW,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/G,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAEnG,OAAO;QACL,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,YAAY;QACZ,kBAAkB;QAClB,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import path from "node:path";
2
+ const packageJsonFileName = "package.json";
3
+ /**
4
+ * @since 0.3.16-canary.0
5
+ */
6
+ export function resolveNearestPackageVersion(fs, targetPath) {
7
+ const resolved = path.resolve(targetPath);
8
+ const startDir = fs.statSync(resolved).isDirectory() ? resolved : path.dirname(resolved);
9
+ let current = startDir;
10
+ while (true) {
11
+ const packageJsonPath = path.join(current, packageJsonFileName);
12
+ if (fs.existsSync(packageJsonPath)) {
13
+ const raw = fs.readFileSync(packageJsonPath, "utf8");
14
+ const version = JSON.parse(raw).version;
15
+ if (typeof version === "string" && version.length > 0) {
16
+ return version;
17
+ }
18
+ throw new Error(`Missing or invalid version in ${packageJsonPath}`);
19
+ }
20
+ const parent = path.dirname(current);
21
+ if (parent === current) {
22
+ break;
23
+ }
24
+ current = parent;
25
+ }
26
+ throw new Error(`Unable to locate ${packageJsonFileName} from target: ${targetPath}`);
27
+ }
28
+ //# sourceMappingURL=version-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-resolver.js","sourceRoot":"","sources":["../../src/tag/version-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,EAAkB,EAAE,UAAkB;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEzF,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAChE,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC,OAAO,CAAC;YACnE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,eAAe,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM;QACR,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oBAAoB,mBAAmB,iBAAiB,UAAU,EAAE,CAAC,CAAC;AACxF,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@codefast/cli",
3
- "version": "0.5.0-canary.5",
4
- "description": "Developer CLI for the Codefast monorepo (arrange, mirror, tag)",
3
+ "version": "0.5.0-canary.7",
4
+ "description": "Developer CLI for the Codefast monorepo (arrange, audit, mirror, tag)",
5
5
  "keywords": [
6
6
  "cli",
7
7
  "codefast",
@@ -22,7 +22,7 @@
22
22
  "directory": "packages/cli"
23
23
  },
24
24
  "bin": {
25
- "codefast": "./dist/bin.mjs"
25
+ "codefast": "./dist/bin.js"
26
26
  },
27
27
  "files": [
28
28
  "dist",
@@ -39,13 +39,19 @@
39
39
  "./tests/*/index.ts",
40
40
  "./tests/*/index.tsx"
41
41
  ],
42
- "#/*": [
43
- "./src/*",
44
- "./src/*.ts",
45
- "./src/*.tsx",
46
- "./src/*/index.ts",
47
- "./src/*/index.tsx"
48
- ]
42
+ "#/*": {
43
+ "source": [
44
+ "./src/*",
45
+ "./src/*.ts",
46
+ "./src/*.tsx",
47
+ "./src/*/index.ts",
48
+ "./src/*/index.tsx"
49
+ ],
50
+ "default": [
51
+ "./dist/*.js",
52
+ "./dist/*/index.js"
53
+ ]
54
+ }
49
55
  },
50
56
  "publishConfig": {
51
57
  "access": "public"
@@ -53,27 +59,26 @@
53
59
  "dependencies": {
54
60
  "commander": "^15.0.0",
55
61
  "jiti": "^2.7.0",
62
+ "oxc-parser": "^0.141.0",
56
63
  "picomatch": "^4.0.5",
57
- "typescript": "^6.0.3",
58
64
  "yaml": "^2.9.0",
59
65
  "zod": "^4.4.3"
60
66
  },
61
67
  "devDependencies": {
62
- "@types/node": "^26.1.0",
68
+ "@types/node": "^26.1.1",
63
69
  "@types/picomatch": "^4.0.3",
64
- "@typescript/native-preview": "7.0.0-dev.20260704.1",
65
- "@vitest/coverage-v8": "^4.1.9",
66
- "tsdown": "^0.22.3",
67
- "vite": "^8.1.3",
68
- "vitest": "^4.1.9",
69
- "@codefast/typescript-config": "0.5.0-canary.5"
70
+ "@vitest/coverage-v8": "^4.1.10",
71
+ "typescript": "^7.0.2",
72
+ "vite": "^8.1.5",
73
+ "vitest": "^4.1.10",
74
+ "@codefast/typescript-config": "0.5.0-canary.7"
70
75
  },
71
76
  "engines": {
72
77
  "node": ">=24.0.0"
73
78
  },
74
79
  "scripts": {
75
- "build": "tsdown",
76
- "check-types": "tsgo --noEmit",
80
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
81
+ "check-types": "tsc --noEmit",
77
82
  "clean": "rm -rf dist",
78
83
  "test": "vitest run",
79
84
  "test:coverage": "vitest run --coverage",
@@ -1,24 +0,0 @@
1
- import { accumulateAnalyzeReportForSourceFile, createEmptyAnalyzeReport } from "./domain/analyze-service.mjs";
2
- import { AppError, messageFrom } from "../core/errors.mjs";
3
- import { scanArrangeTargets } from "./scan-target.mjs";
4
- import { parseDomainSourceFile } from "./source-parse.mjs";
5
- import { err, ok } from "../core/result.mjs";
6
- //#region src/arrange/analyze.ts
7
- /**
8
- * @since 0.3.16-canary.0
9
- */
10
- function analyzeDirectory(fs, analyzeRootPath) {
11
- const report = createEmptyAnalyzeReport();
12
- try {
13
- const files = scanArrangeTargets(fs, analyzeRootPath);
14
- for (const filePath of files) {
15
- const sourceText = fs.readFileSync(filePath, "utf8");
16
- accumulateAnalyzeReportForSourceFile(report, parseDomainSourceFile(filePath, sourceText), sourceText, filePath);
17
- }
18
- return ok(report);
19
- } catch (caughtError) {
20
- return err(new AppError("INFRA_FAILURE", messageFrom(caughtError), caughtError));
21
- }
22
- }
23
- //#endregion
24
- export { analyzeDirectory };
@@ -1,27 +0,0 @@
1
- import { z } from "zod";
2
- //#region src/arrange/cli-schema.ts
3
- /**
4
- * @since 0.3.16-canary.0
5
- */
6
- const arrangeAnalyzeDirectoryRequestSchema = z.object({ analyzeRootPath: z.string().min(1, "analyzeRootPath is required") });
7
- /**
8
- * @since 0.3.16-canary.0
9
- */
10
- const arrangeSyncRunRequestSchema = z.object({
11
- rootDir: z.string().min(1),
12
- targetPath: z.string().min(1),
13
- write: z.boolean(),
14
- withClassName: z.boolean().optional(),
15
- cnImport: z.string().optional(),
16
- config: z.unknown().optional()
17
- });
18
- /**
19
- * @since 0.3.16-canary.0
20
- */
21
- const arrangeSuggestGroupsRequestSchema = z.object({
22
- inlineClasses: z.string().min(1, "Pass a class string. Example: codefast arrange group \"flex gap-2 text-sm rounded-md\""),
23
- emitTvStyleArray: z.boolean(),
24
- trailingClassName: z.boolean()
25
- });
26
- //#endregion
27
- export { arrangeAnalyzeDirectoryRequestSchema, arrangeSuggestGroupsRequestSchema, arrangeSyncRunRequestSchema };
@@ -1,130 +0,0 @@
1
- import { logger } from "../core/logger.mjs";
2
- import { analyzeDirectory } from "./analyze.mjs";
3
- import { arrangeAnalyzeDirectoryRequestSchema, arrangeSuggestGroupsRequestSchema, arrangeSyncRunRequestSchema } from "./cli-schema.mjs";
4
- import { printAnalyzeReport, printGroupFilePreviewFromWork, printSimplifyResult, printSyncResult } from "./output.mjs";
5
- import { runArrangeSimplify } from "./simplify-sync.mjs";
6
- import { suggestCnGroupsFromCli } from "./suggest.mjs";
7
- import { runArrangeSync } from "./sync.mjs";
8
- import { prepareArrangeWorkspace } from "./workspace.mjs";
9
- import { readOptionalPositionalArg } from "../core/cli/positional.mjs";
10
- import "../core/exit-codes.mjs";
11
- import { consumeCliAppError, runCliResultAsync } from "../core/cli/result-handle.mjs";
12
- import { nodeFilesystem } from "../core/filesystem/node.mjs";
13
- import { parseWithSchema } from "../core/schema-parse.mjs";
14
- import process from "node:process";
15
- import { Command } from "commander";
16
- //#region src/arrange/command.ts
17
- /**
18
- * @since 0.3.16-canary.0
19
- */
20
- function createArrangeCommand() {
21
- const cmd = new Command("arrange").description("Regroup Tailwind classes in cn() / tv() calls in render-pipeline order").enablePositionalOptions().argument("[target]", "Directory or file (default: nearest package directory from cwd)").option("--dry-run", "Preview suggested replacements without writing files", false).option("--with-classname, --with-class-name", "Append className as final cn() argument", false).option("--cn-import <spec>", "Override module specifier when adding cn import").option("--json", "Print one JSON object on stdout (suppresses human progress)", false).action(async (target, opts) => {
22
- const write = !opts.dryRun;
23
- const prelude = await prepareArrangeWorkspace(nodeFilesystem, {
24
- currentWorkingDirectory: process.cwd(),
25
- rawTarget: readOptionalPositionalArg(target)
26
- });
27
- if (!consumeCliAppError(prelude)) return;
28
- const { resolvedTarget, rootDir, config } = prelude.value;
29
- const parsed = parseWithSchema(arrangeSyncRunRequestSchema, {
30
- rootDir,
31
- targetPath: resolvedTarget,
32
- write,
33
- withClassName: opts.withClassName,
34
- cnImport: opts.cnImport,
35
- config: config.arrange ?? {}
36
- });
37
- if (!consumeCliAppError(parsed)) return;
38
- await runCliResultAsync(runArrangeSync(nodeFilesystem, parsed.value), (value) => {
39
- if (!write) for (const plan of value.previewPlans) printGroupFilePreviewFromWork(plan);
40
- if (opts.json) {
41
- logger.out(formatArrangeSyncJsonOutput(value, write));
42
- return exitCodeForArrangeSyncResult(value);
43
- }
44
- printSyncResult(value, write);
45
- return exitCodeForArrangeSyncResult(value);
46
- });
47
- });
48
- cmd.command("inspect").description("Report long strings, nested cn in tv(), and related findings (read-only)").argument("[target]", "Directory or file (default: nearest package directory from cwd)").option("--json", "Print one JSON object on stdout instead of a human report", false).action(async (target, opts) => {
49
- const prelude = await prepareArrangeWorkspace(nodeFilesystem, {
50
- currentWorkingDirectory: process.cwd(),
51
- rawTarget: readOptionalPositionalArg(target)
52
- });
53
- if (!consumeCliAppError(prelude)) return;
54
- const { resolvedTarget } = prelude.value;
55
- const parsed = parseWithSchema(arrangeAnalyzeDirectoryRequestSchema, { analyzeRootPath: resolvedTarget });
56
- if (!consumeCliAppError(parsed)) return;
57
- const outcome = analyzeDirectory(nodeFilesystem, parsed.value.analyzeRootPath);
58
- if (!consumeCliAppError(outcome)) return;
59
- if (opts.json) logger.out(formatArrangeAnalyzeJsonOutput(resolvedTarget, outcome.value));
60
- else printAnalyzeReport(resolvedTarget, outcome.value);
61
- });
62
- cmd.command("simplify").description("Flatten grouped arrays and static-only cn() calls back to plain strings in tv() slots").argument("[target]", "Directory or file (default: nearest package directory from cwd)").option("--dry-run", "Show what simplify would change without writing files", false).option("--json", "Print one JSON object on stdout (suppresses human progress)", false).action(async (target, opts) => {
63
- const write = !opts.dryRun;
64
- const prelude = await prepareArrangeWorkspace(nodeFilesystem, {
65
- currentWorkingDirectory: process.cwd(),
66
- rawTarget: readOptionalPositionalArg(target)
67
- });
68
- if (!consumeCliAppError(prelude)) return;
69
- const { resolvedTarget } = prelude.value;
70
- await runCliResultAsync(runArrangeSimplify(nodeFilesystem, {
71
- targetPath: resolvedTarget,
72
- write
73
- }), (value) => {
74
- if (opts.json) {
75
- logger.out(JSON.stringify({
76
- schemaVersion: 1,
77
- ok: true,
78
- write,
79
- result: value
80
- }));
81
- return 0;
82
- }
83
- printSimplifyResult(value, write);
84
- return 0;
85
- });
86
- });
87
- cmd.command("group").description("Try grouping on a pasted class string (stdout: cn(...) or tv array with --tv)").argument("<tokens...>", "Class tokens (quote a single string if it contains spaces)").option("--tv", "Emit tv()-style array instead of cn() call", false).option("--with-classname, --with-class-name", "Append className as final cn() argument", false).option("--json", "Print one JSON object on stdout instead of plain lines", false).action(async (classTokenSeries, opts) => {
88
- const parsed = parseWithSchema(arrangeSuggestGroupsRequestSchema, {
89
- inlineClasses: classTokenSeries.join(" ").trim(),
90
- emitTvStyleArray: !!opts.tv,
91
- trailingClassName: !!opts.withClassName
92
- });
93
- if (!consumeCliAppError(parsed)) return;
94
- const output = suggestCnGroupsFromCli(parsed.value);
95
- if (opts.json) logger.out(formatArrangeGroupJsonOutput(output));
96
- else {
97
- logger.out(output.primaryLine);
98
- logger.out(output.bucketsCommentLine);
99
- }
100
- });
101
- return cmd;
102
- }
103
- function formatArrangeAnalyzeJsonOutput(analyzeRootPath, report) {
104
- return JSON.stringify({
105
- schemaVersion: 1,
106
- analyzeRootPath,
107
- report
108
- });
109
- }
110
- function formatArrangeSyncJsonOutput(result, write) {
111
- const { previewPlans: _plans, ...serializableResult } = result;
112
- return JSON.stringify({
113
- schemaVersion: 1,
114
- ok: result.hookError === null,
115
- write,
116
- result: serializableResult
117
- });
118
- }
119
- function formatArrangeGroupJsonOutput(output) {
120
- return JSON.stringify({
121
- schemaVersion: 1,
122
- primaryLine: output.primaryLine,
123
- bucketsCommentLine: output.bucketsCommentLine
124
- });
125
- }
126
- function exitCodeForArrangeSyncResult(result) {
127
- return result.hookError !== null ? 1 : 0;
128
- }
129
- //#endregion
130
- export { createArrangeCommand };
@@ -1,102 +0,0 @@
1
- import { forEachDomainChild, isDomainCallExpression, isDomainJsxAttribute, isDomainObjectLiteralExpression } from "./ast/ast-node.mjs";
2
- import "./constants.mjs";
3
- import { forEachStringLiteralInClassExpression } from "./ast/collectors-cn.mjs";
4
- import { jsxClassNameStaticLiteral } from "./ast/collectors-jsx.mjs";
5
- import { buildKnownCnTvBindings, isCnOrTvIdentifier, lineOf } from "./ast/helpers.mjs";
6
- import { tokenizeClassString } from "./tailwind-token.mjs";
7
- import { collectCnCallsInsideTv, traverseTvObject } from "./ast/collectors-tv.mjs";
8
- //#region src/arrange/domain/analyze-service.ts
9
- /**
10
- * Rich domain: Tailwind/cn/tv analysis rules (counts, long literals, nested cn in tv).
11
- * Pure orchestration of domain collectors and invariants — no I/O.
12
- */
13
- const PREVIEW_MAX_LENGTH = 72;
14
- function previewText(text) {
15
- return text.length > PREVIEW_MAX_LENGTH ? `${text.slice(0, PREVIEW_MAX_LENGTH)}…` : text;
16
- }
17
- /**
18
- * @since 0.3.16-canary.0
19
- */
20
- function createEmptyAnalyzeReport() {
21
- return {
22
- files: 0,
23
- cnCallExpressions: 0,
24
- tvCallExpressions: 0,
25
- cnInsideTvCalls: [],
26
- longCnStringLiterals: [],
27
- longTvStringLiterals: [],
28
- longJsxClassNameLiterals: []
29
- };
30
- }
31
- function analyzeCnCall(domainSf, call, report) {
32
- for (const arg of call.arguments) forEachStringLiteralInClassExpression(arg, (lit) => {
33
- const text = lit.text;
34
- const tokenCount = tokenizeClassString(text).length;
35
- if (tokenCount >= 18) report.longCnStringLiterals.push({
36
- file: domainSf.fileName,
37
- line: lineOf(domainSf, lit),
38
- tokenCount,
39
- preview: previewText(text)
40
- });
41
- });
42
- }
43
- function visitCallExpressionForArrangeAnalyze(callExpression, domainSf, sourceText, knownBindings, report) {
44
- if (isCnOrTvIdentifier(callExpression.expression, "cn", knownBindings)) {
45
- report.cnCallExpressions++;
46
- analyzeCnCall(domainSf, callExpression, report);
47
- return;
48
- }
49
- if (!isCnOrTvIdentifier(callExpression.expression, "tv", knownBindings)) return;
50
- report.tvCallExpressions++;
51
- const arg0 = callExpression.arguments[0];
52
- if (!arg0 || !isDomainObjectLiteralExpression(arg0)) return;
53
- for (const nestedCn of collectCnCallsInsideTv(domainSf, arg0, knownBindings, 0)) {
54
- const src = sourceText.slice(nestedCn.pos, nestedCn.end);
55
- report.cnInsideTvCalls.push({
56
- file: domainSf.fileName,
57
- line: lineOf(domainSf, nestedCn),
58
- argCount: nestedCn.arguments.length,
59
- preview: previewText(src)
60
- });
61
- }
62
- traverseTvObject(domainSf, arg0, (classLiteral) => {
63
- const text = classLiteral.text;
64
- const tokenCount = tokenizeClassString(text).length;
65
- if (tokenCount >= 18) report.longTvStringLiterals.push({
66
- file: domainSf.fileName,
67
- line: lineOf(domainSf, classLiteral),
68
- tokenCount,
69
- preview: previewText(text)
70
- });
71
- }, 0, knownBindings);
72
- }
73
- function visitJsxAttributeForArrangeAnalyze(jsxClassAttribute, domainSf, filePath, report) {
74
- if (!filePath.endsWith(".tsx")) return;
75
- const parsed = jsxClassNameStaticLiteral(jsxClassAttribute);
76
- if (!parsed) return;
77
- const text = parsed.lit.text;
78
- const tokenCount = tokenizeClassString(text).length;
79
- if (tokenCount >= 18) report.longJsxClassNameLiterals.push({
80
- file: domainSf.fileName,
81
- line: lineOf(domainSf, parsed.lit),
82
- tokenCount,
83
- preview: previewText(text)
84
- });
85
- }
86
- /**
87
- * Accumulates findings for one parsed source file into `report` (mutates report).
88
- *
89
- * @since 0.3.16-canary.0
90
- */
91
- function accumulateAnalyzeReportForSourceFile(report, domainSf, sourceText, filePath) {
92
- report.files++;
93
- const knownBindings = buildKnownCnTvBindings(domainSf);
94
- const visitTypeScriptSubtree = (tsNode) => {
95
- if (isDomainCallExpression(tsNode)) visitCallExpressionForArrangeAnalyze(tsNode, domainSf, sourceText, knownBindings, report);
96
- if (isDomainJsxAttribute(tsNode)) visitJsxAttributeForArrangeAnalyze(tsNode, domainSf, filePath, report);
97
- forEachDomainChild(tsNode, visitTypeScriptSubtree);
98
- };
99
- for (const stmt of domainSf.statements) visitTypeScriptSubtree(stmt);
100
- }
101
- //#endregion
102
- export { accumulateAnalyzeReportForSourceFile, createEmptyAnalyzeReport };