@codefast/cli 0.5.0-canary.5 → 0.5.0-canary.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -480
- package/dist/arrange/analyze.js +25 -0
- package/dist/arrange/analyze.js.map +1 -0
- package/dist/arrange/cli-schema.js +29 -0
- package/dist/arrange/cli-schema.js.map +1 -0
- package/dist/arrange/command.js +170 -0
- package/dist/arrange/command.js.map +1 -0
- package/dist/arrange/domain/analyze-service.js +122 -0
- package/dist/arrange/domain/analyze-service.js.map +1 -0
- package/dist/arrange/domain/ast/ast-node.js +240 -0
- package/dist/arrange/domain/ast/ast-node.js.map +1 -0
- package/dist/arrange/domain/ast/collectors-cn.js +81 -0
- package/dist/arrange/domain/ast/collectors-cn.js.map +1 -0
- package/dist/arrange/domain/ast/collectors-jsx.js +24 -0
- package/dist/arrange/domain/ast/collectors-jsx.js.map +1 -0
- package/dist/arrange/domain/ast/collectors-tv.js +319 -0
- package/dist/arrange/domain/ast/collectors-tv.js.map +1 -0
- package/dist/arrange/domain/ast/helpers.js +151 -0
- package/dist/arrange/domain/ast/helpers.js.map +1 -0
- package/dist/arrange/domain/ast/simplify-targets.js +161 -0
- package/dist/arrange/domain/ast/simplify-targets.js.map +1 -0
- package/dist/arrange/domain/ast/targets.js +182 -0
- package/dist/arrange/domain/ast/targets.js.map +1 -0
- package/dist/arrange/domain/constants.js +225 -0
- package/dist/arrange/domain/constants.js.map +1 -0
- package/dist/arrange/domain/grouping-service.js +128 -0
- package/dist/arrange/domain/grouping-service.js.map +1 -0
- package/dist/arrange/domain/grouping.js +435 -0
- package/dist/arrange/domain/grouping.js.map +1 -0
- package/dist/arrange/domain/imports.js +160 -0
- package/dist/arrange/domain/imports.js.map +1 -0
- package/dist/arrange/domain/source-text-formatters.js +100 -0
- package/dist/arrange/domain/source-text-formatters.js.map +1 -0
- package/dist/arrange/domain/tailwind-token.js +50 -0
- package/dist/arrange/domain/tailwind-token.js.map +1 -0
- package/dist/arrange/domain/token-classifier.js +448 -0
- package/dist/arrange/domain/token-classifier.js.map +1 -0
- package/dist/arrange/domain/types.js +11 -0
- package/dist/arrange/domain/types.js.map +1 -0
- package/dist/arrange/output.js +120 -0
- package/dist/arrange/output.js.map +1 -0
- package/dist/arrange/process-file.js +44 -0
- package/dist/arrange/process-file.js.map +1 -0
- package/dist/arrange/resolve-target.js +33 -0
- package/dist/arrange/resolve-target.js.map +1 -0
- package/dist/arrange/scan-target.js +30 -0
- package/dist/arrange/scan-target.js.map +1 -0
- package/dist/arrange/simplify-process-file.js +29 -0
- package/dist/arrange/simplify-process-file.js.map +1 -0
- package/dist/arrange/simplify-sync.js +29 -0
- package/dist/arrange/simplify-sync.js.map +1 -0
- package/dist/arrange/source-parse.js +17 -0
- package/dist/arrange/source-parse.js.map +1 -0
- package/dist/arrange/suggest.js +14 -0
- package/dist/arrange/suggest.js.map +1 -0
- package/dist/arrange/sync.js +48 -0
- package/dist/arrange/sync.js.map +1 -0
- package/dist/arrange/typescript-ast-translator.js +455 -0
- package/dist/arrange/typescript-ast-translator.js.map +1 -0
- package/dist/arrange/workspace.js +31 -0
- package/dist/arrange/workspace.js.map +1 -0
- package/dist/audit/cli-schema.js +22 -0
- package/dist/audit/cli-schema.js.map +1 -0
- package/dist/audit/command.js +60 -0
- package/dist/audit/command.js.map +1 -0
- package/dist/audit/domain/audit-file.js +101 -0
- package/dist/audit/domain/audit-file.js.map +1 -0
- package/dist/audit/domain/mappings.js +103 -0
- package/dist/audit/domain/mappings.js.map +1 -0
- package/dist/audit/domain/tokenize.js +83 -0
- package/dist/audit/domain/tokenize.js.map +1 -0
- package/dist/audit/domain/types.js +2 -0
- package/dist/audit/domain/types.js.map +1 -0
- package/dist/audit/output.js +44 -0
- package/dist/audit/output.js.map +1 -0
- package/dist/audit/prepare.js +42 -0
- package/dist/audit/prepare.js.map +1 -0
- package/dist/audit/run.js +57 -0
- package/dist/audit/run.js.map +1 -0
- package/dist/{bin.mjs → bin.js} +2 -4
- package/dist/bin.js.map +1 -0
- package/dist/cli.js +45 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/cli/format-error.js +19 -0
- package/dist/core/cli/format-error.js.map +1 -0
- package/dist/core/cli/global-options.js +10 -0
- package/dist/core/cli/global-options.js.map +1 -0
- package/dist/core/cli/positional.js +9 -0
- package/dist/core/cli/positional.js.map +1 -0
- package/dist/core/cli/result-handle.js +69 -0
- package/dist/core/cli/result-handle.js.map +1 -0
- package/dist/core/config/loader.js +88 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/schema.js +97 -0
- package/dist/core/config/schema.js.map +1 -0
- package/dist/core/config/warnings.js +12 -0
- package/dist/core/config/warnings.js.map +1 -0
- package/dist/core/config.js +18 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.js +58 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/exit-codes.js +15 -0
- package/dist/core/exit-codes.js.map +1 -0
- package/dist/core/filesystem/node.js +33 -0
- package/dist/core/filesystem/node.js.map +1 -0
- package/dist/core/filesystem/port.js +2 -0
- package/dist/core/filesystem/port.js.map +1 -0
- package/dist/core/glob.js +20 -0
- package/dist/core/glob.js.map +1 -0
- package/dist/core/logger.js +13 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/result.js +16 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/schema-parse.js +21 -0
- package/dist/core/schema-parse.js.map +1 -0
- package/dist/core/source-text-edit.js +62 -0
- package/dist/core/source-text-edit.js.map +1 -0
- package/dist/core/verbose-diagnostics.js +9 -0
- package/dist/core/verbose-diagnostics.js.map +1 -0
- package/dist/core/workspace/resolver.js +208 -0
- package/dist/core/workspace/resolver.js.map +1 -0
- package/dist/core/workspace/typescript-walk.js +41 -0
- package/dist/core/workspace/typescript-walk.js.map +1 -0
- package/dist/mirror/cli-result.js +20 -0
- package/dist/mirror/cli-result.js.map +1 -0
- package/dist/mirror/cli-schema.js +11 -0
- package/dist/mirror/cli-schema.js.map +1 -0
- package/dist/mirror/command.js +73 -0
- package/dist/mirror/command.js.map +1 -0
- package/dist/mirror/dist-filesystem-impl.js +53 -0
- package/dist/mirror/dist-filesystem-impl.js.map +1 -0
- package/dist/mirror/domain/constants.js +21 -0
- package/dist/mirror/domain/constants.js.map +1 -0
- package/dist/mirror/domain/dirent-guard.js +16 -0
- package/dist/mirror/domain/dirent-guard.js.map +1 -0
- package/dist/mirror/domain/dist-filesystem.js +2 -0
- package/dist/mirror/domain/dist-filesystem.js.map +1 -0
- package/dist/mirror/domain/errors.js +19 -0
- package/dist/mirror/domain/errors.js.map +1 -0
- package/dist/mirror/domain/exports.js +284 -0
- package/dist/mirror/domain/exports.js.map +1 -0
- package/dist/mirror/domain/package-display-name.js +10 -0
- package/dist/mirror/domain/package-display-name.js.map +1 -0
- package/dist/mirror/domain/path-normalizer.js +8 -0
- package/dist/mirror/domain/path-normalizer.js.map +1 -0
- package/dist/mirror/domain/types.js +2 -0
- package/dist/mirror/domain/types.js.map +1 -0
- package/dist/mirror/output.js +47 -0
- package/dist/mirror/output.js.map +1 -0
- package/dist/mirror/package-path.js +40 -0
- package/dist/mirror/package-path.js.map +1 -0
- package/dist/mirror/prepare.js +37 -0
- package/dist/mirror/prepare.js.map +1 -0
- package/dist/mirror/supplement-exports.js +157 -0
- package/dist/mirror/supplement-exports.js.map +1 -0
- package/dist/mirror/sync-reporter.js +125 -0
- package/dist/mirror/sync-reporter.js.map +1 -0
- package/dist/mirror/sync-types.js +2 -0
- package/dist/mirror/sync-types.js.map +1 -0
- package/dist/mirror/sync-workspace-package.js +117 -0
- package/dist/mirror/sync-workspace-package.js.map +1 -0
- package/dist/mirror/sync.js +90 -0
- package/dist/mirror/sync.js.map +1 -0
- package/dist/mirror/write-exports.js +145 -0
- package/dist/mirror/write-exports.js.map +1 -0
- package/dist/tag/cli-result.js +12 -0
- package/dist/tag/cli-result.js.map +1 -0
- package/dist/tag/cli-schema.js +13 -0
- package/dist/tag/cli-schema.js.map +1 -0
- package/dist/tag/command.js +69 -0
- package/dist/tag/command.js.map +1 -0
- package/dist/tag/domain/types.js +2 -0
- package/dist/tag/domain/types.js.map +1 -0
- package/dist/tag/output.js +101 -0
- package/dist/tag/output.js.map +1 -0
- package/dist/tag/prepare.js +30 -0
- package/dist/tag/prepare.js.map +1 -0
- package/dist/tag/resolve-target-path.js +14 -0
- package/dist/tag/resolve-target-path.js.map +1 -0
- package/dist/tag/since-writer.js +231 -0
- package/dist/tag/since-writer.js.map +1 -0
- package/dist/tag/sync.js +166 -0
- package/dist/tag/sync.js.map +1 -0
- package/dist/tag/target-candidates.js +79 -0
- package/dist/tag/target-candidates.js.map +1 -0
- package/dist/tag/target-runner.js +25 -0
- package/dist/tag/target-runner.js.map +1 -0
- package/dist/tag/version-resolver.js +28 -0
- package/dist/tag/version-resolver.js.map +1 -0
- package/package.json +25 -20
- package/dist/arrange/analyze.mjs +0 -24
- package/dist/arrange/cli-schema.mjs +0 -27
- package/dist/arrange/command.mjs +0 -130
- package/dist/arrange/domain/analyze-service.mjs +0 -102
- package/dist/arrange/domain/ast/ast-node.mjs +0 -215
- package/dist/arrange/domain/ast/collectors-cn.mjs +0 -64
- package/dist/arrange/domain/ast/collectors-jsx.mjs +0 -23
- package/dist/arrange/domain/ast/collectors-tv.mjs +0 -189
- package/dist/arrange/domain/ast/helpers.mjs +0 -108
- package/dist/arrange/domain/ast/simplify-targets.mjs +0 -109
- package/dist/arrange/domain/ast/targets.mjs +0 -134
- package/dist/arrange/domain/constants.mjs +0 -213
- package/dist/arrange/domain/grouping-service.mjs +0 -121
- package/dist/arrange/domain/grouping.mjs +0 -338
- package/dist/arrange/domain/imports.mjs +0 -107
- package/dist/arrange/domain/source-text-formatters.mjs +0 -88
- package/dist/arrange/domain/tailwind-token.mjs +0 -40
- package/dist/arrange/domain/token-classifier.mjs +0 -218
- package/dist/arrange/domain/types.mjs +0 -1
- package/dist/arrange/output.mjs +0 -87
- package/dist/arrange/process-file.mjs +0 -42
- package/dist/arrange/resolve-target.mjs +0 -24
- package/dist/arrange/scan-target.mjs +0 -29
- package/dist/arrange/simplify-process-file.mjs +0 -35
- package/dist/arrange/simplify-sync.mjs +0 -32
- package/dist/arrange/source-parse.mjs +0 -18
- package/dist/arrange/suggest.mjs +0 -15
- package/dist/arrange/sync.mjs +0 -51
- package/dist/arrange/typescript-ast-translator.mjs +0 -354
- package/dist/arrange/workspace.mjs +0 -31
- package/dist/cli.mjs +0 -34
- package/dist/core/cli/format-error.mjs +0 -15
- package/dist/core/cli/global-options.mjs +0 -10
- package/dist/core/cli/positional.mjs +0 -11
- package/dist/core/cli/result-handle.mjs +0 -51
- package/dist/core/config/loader.mjs +0 -79
- package/dist/core/config/schema.mjs +0 -60
- package/dist/core/config/warnings.mjs +0 -12
- package/dist/core/config.mjs +0 -19
- package/dist/core/errors.mjs +0 -35
- package/dist/core/exit-codes.mjs +0 -17
- package/dist/core/filesystem/node.mjs +0 -32
- package/dist/core/filesystem/port.mjs +0 -1
- package/dist/core/glob.mjs +0 -20
- package/dist/core/logger.mjs +0 -15
- package/dist/core/result.mjs +0 -21
- package/dist/core/schema-parse.mjs +0 -18
- package/dist/core/source-text-edit.mjs +0 -56
- package/dist/core/verbose-diagnostics.mjs +0 -11
- package/dist/core/workspace/resolver.mjs +0 -177
- package/dist/core/workspace/typescript-walk.mjs +0 -36
- package/dist/mirror/cli-result.mjs +0 -22
- package/dist/mirror/cli-schema.mjs +0 -13
- package/dist/mirror/command.mjs +0 -58
- package/dist/mirror/dist-filesystem-impl.mjs +0 -42
- package/dist/mirror/domain/constants.mjs +0 -31
- package/dist/mirror/domain/dirent-guard.mjs +0 -16
- package/dist/mirror/domain/dist-filesystem.mjs +0 -1
- package/dist/mirror/domain/errors.mjs +0 -21
- package/dist/mirror/domain/exports.mjs +0 -226
- package/dist/mirror/domain/package-display-name.mjs +0 -12
- package/dist/mirror/domain/path-normalizer.mjs +0 -10
- package/dist/mirror/domain/types.mjs +0 -1
- package/dist/mirror/output.mjs +0 -48
- package/dist/mirror/package-path.mjs +0 -32
- package/dist/mirror/prepare.mjs +0 -33
- package/dist/mirror/supplement-exports.mjs +0 -114
- package/dist/mirror/sync-reporter.mjs +0 -107
- package/dist/mirror/sync-types.mjs +0 -1
- package/dist/mirror/sync-workspace-package.mjs +0 -109
- package/dist/mirror/sync.mjs +0 -88
- package/dist/mirror/write-exports.mjs +0 -94
- package/dist/tag/cli-result.mjs +0 -11
- package/dist/tag/cli-schema.mjs +0 -15
- package/dist/tag/command.mjs +0 -56
- package/dist/tag/domain/types.mjs +0 -1
- package/dist/tag/output.mjs +0 -87
- package/dist/tag/prepare.mjs +0 -29
- package/dist/tag/resolve-target-path.mjs +0 -12
- package/dist/tag/since-writer.mjs +0 -131
- package/dist/tag/sync.mjs +0 -149
- package/dist/tag/target-candidates.mjs +0 -68
- package/dist/tag/target-runner.mjs +0 -26
- 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.
|
|
4
|
-
"description": "Developer CLI for the Codefast monorepo (arrange, mirror, tag)",
|
|
3
|
+
"version": "0.5.0-canary.6",
|
|
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.
|
|
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
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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.140.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.
|
|
68
|
+
"@types/node": "^26.1.1",
|
|
63
69
|
"@types/picomatch": "^4.0.3",
|
|
64
|
-
"@
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
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.6"
|
|
70
75
|
},
|
|
71
76
|
"engines": {
|
|
72
77
|
"node": ">=24.0.0"
|
|
73
78
|
},
|
|
74
79
|
"scripts": {
|
|
75
|
-
"build": "
|
|
76
|
-
"check-types": "
|
|
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",
|
package/dist/arrange/analyze.mjs
DELETED
|
@@ -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 };
|
package/dist/arrange/command.mjs
DELETED
|
@@ -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 };
|