@reliverse/dler 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +3 -0
- package/dist/cmds/build/cmd.d.ts +2 -0
- package/dist/cmds/build/cmd.js +564 -0
- package/dist/cmds/clean/cmd.d.ts +2 -0
- package/dist/cmds/clean/cmd.js +146 -0
- package/dist/cmds/clean/impl.d.ts +2 -0
- package/dist/cmds/clean/impl.js +627 -0
- package/dist/cmds/clean/presets.d.ts +10 -0
- package/dist/cmds/clean/presets.js +112 -0
- package/dist/cmds/clean/types.d.ts +62 -0
- package/dist/cmds/clean/types.js +0 -0
- package/dist/cmds/init/cmd.d.ts +3 -0
- package/dist/cmds/init/cmd.js +56 -0
- package/dist/cmds/init/impl/config.d.ts +45 -0
- package/dist/cmds/init/impl/config.js +99 -0
- package/dist/cmds/init/impl/generators.d.ts +6 -0
- package/dist/cmds/init/impl/generators.js +178 -0
- package/dist/cmds/init/impl/prompts.d.ts +2 -0
- package/dist/cmds/init/impl/prompts.js +98 -0
- package/dist/cmds/init/impl/types.d.ts +22 -0
- package/dist/cmds/init/impl/types.js +0 -0
- package/dist/cmds/init/impl/utils.d.ts +4 -0
- package/dist/cmds/init/impl/utils.js +11 -0
- package/dist/cmds/init/impl/validators.d.ts +4 -0
- package/dist/cmds/init/impl/validators.js +42 -0
- package/dist/cmds/integrate/cmd.d.ts +3 -0
- package/dist/cmds/integrate/cmd.js +70 -0
- package/dist/cmds/integrate/impl.d.ts +7 -0
- package/dist/cmds/integrate/impl.js +127 -0
- package/dist/cmds/integrate/integrations/base.d.ts +13 -0
- package/dist/cmds/integrate/integrations/base.js +41 -0
- package/dist/cmds/integrate/integrations/nextjs.d.ts +16 -0
- package/dist/cmds/integrate/integrations/nextjs.js +167 -0
- package/dist/cmds/integrate/integrations/registry.d.ts +7 -0
- package/dist/cmds/integrate/integrations/registry.js +31 -0
- package/dist/cmds/integrate/integrations/ultracite.d.ts +11 -0
- package/dist/cmds/integrate/integrations/ultracite.js +40 -0
- package/dist/cmds/integrate/types.d.ts +39 -0
- package/dist/cmds/integrate/types.js +0 -0
- package/dist/cmds/integrate/utils/biome.d.ts +4 -0
- package/dist/cmds/integrate/utils/biome.js +140 -0
- package/dist/cmds/integrate/utils/context.d.ts +3 -0
- package/dist/cmds/integrate/utils/context.js +111 -0
- package/dist/cmds/integrate/utils/temp.d.ts +3 -0
- package/dist/cmds/integrate/utils/temp.js +36 -0
- package/dist/cmds/perf/analysis/bundle.d.ts +20 -0
- package/dist/cmds/perf/analysis/bundle.js +225 -0
- package/dist/cmds/perf/analysis/filesystem.d.ts +27 -0
- package/dist/cmds/perf/analysis/filesystem.js +246 -0
- package/dist/cmds/perf/analysis/monorepo.d.ts +29 -0
- package/dist/cmds/perf/analysis/monorepo.js +307 -0
- package/dist/cmds/perf/benchmarks/command.d.ts +21 -0
- package/dist/cmds/perf/benchmarks/command.js +162 -0
- package/dist/cmds/perf/benchmarks/memory.d.ts +41 -0
- package/dist/cmds/perf/benchmarks/memory.js +169 -0
- package/dist/cmds/perf/benchmarks/runner.d.ts +22 -0
- package/dist/cmds/perf/benchmarks/runner.js +157 -0
- package/dist/cmds/perf/cmd.d.ts +2 -0
- package/dist/cmds/perf/cmd.js +238 -0
- package/dist/cmds/perf/impl.d.ts +24 -0
- package/dist/cmds/perf/impl.js +304 -0
- package/dist/cmds/perf/reporters/console.d.ts +12 -0
- package/dist/cmds/perf/reporters/console.js +257 -0
- package/dist/cmds/perf/reporters/html.d.ts +27 -0
- package/dist/cmds/perf/reporters/html.js +881 -0
- package/dist/cmds/perf/reporters/json.d.ts +9 -0
- package/dist/cmds/perf/reporters/json.js +32 -0
- package/dist/cmds/perf/types.d.ts +184 -0
- package/dist/cmds/perf/types.js +0 -0
- package/dist/cmds/perf/utils/cache.d.ts +23 -0
- package/dist/cmds/perf/utils/cache.js +171 -0
- package/dist/cmds/perf/utils/formatter.d.ts +17 -0
- package/dist/cmds/perf/utils/formatter.js +134 -0
- package/dist/cmds/perf/utils/stats.d.ts +15 -0
- package/dist/cmds/perf/utils/stats.js +101 -0
- package/dist/cmds/publish/cmd.d.ts +3 -0
- package/dist/cmds/publish/cmd.js +189 -0
- package/dist/cmds/shell/cmd.d.ts +3 -0
- package/dist/cmds/shell/cmd.js +50 -0
- package/dist/cmds/tsc/cache.d.ts +27 -0
- package/dist/cmds/tsc/cache.js +160 -0
- package/dist/cmds/tsc/cmd.d.ts +2 -0
- package/dist/cmds/tsc/cmd.js +111 -0
- package/dist/cmds/tsc/impl.d.ts +41 -0
- package/dist/cmds/tsc/impl.js +572 -0
- package/dist/cmds/tsc/types.d.ts +57 -0
- package/dist/cmds/tsc/types.js +0 -0
- package/package.json +4 -11
- package/src/cli.ts +8 -0
- package/src/cmds/build/cmd.ts +582 -0
- package/src/cmds/clean/cmd.ts +166 -0
- package/src/cmds/clean/impl.ts +900 -0
- package/src/cmds/clean/presets.ts +158 -0
- package/src/cmds/clean/types.ts +71 -0
- package/src/cmds/init/cmd.ts +68 -0
- package/src/cmds/init/impl/config.ts +105 -0
- package/src/cmds/init/impl/generators.ts +220 -0
- package/src/cmds/init/impl/prompts.ts +137 -0
- package/src/cmds/init/impl/types.ts +25 -0
- package/src/cmds/init/impl/utils.ts +17 -0
- package/src/cmds/init/impl/validators.ts +55 -0
- package/src/cmds/integrate/cmd.ts +82 -0
- package/src/cmds/integrate/impl.ts +204 -0
- package/src/cmds/integrate/integrations/base.ts +69 -0
- package/src/cmds/integrate/integrations/nextjs.ts +227 -0
- package/src/cmds/integrate/integrations/registry.ts +45 -0
- package/src/cmds/integrate/integrations/ultracite.ts +53 -0
- package/src/cmds/integrate/types.ts +48 -0
- package/src/cmds/integrate/utils/biome.ts +173 -0
- package/src/cmds/integrate/utils/context.ts +148 -0
- package/src/cmds/integrate/utils/temp.ts +47 -0
- package/src/cmds/perf/analysis/bundle.ts +311 -0
- package/src/cmds/perf/analysis/filesystem.ts +324 -0
- package/src/cmds/perf/analysis/monorepo.ts +439 -0
- package/src/cmds/perf/benchmarks/command.ts +230 -0
- package/src/cmds/perf/benchmarks/memory.ts +249 -0
- package/src/cmds/perf/benchmarks/runner.ts +220 -0
- package/src/cmds/perf/cmd.ts +285 -0
- package/src/cmds/perf/impl.ts +411 -0
- package/src/cmds/perf/reporters/console.ts +331 -0
- package/src/cmds/perf/reporters/html.ts +984 -0
- package/src/cmds/perf/reporters/json.ts +42 -0
- package/src/cmds/perf/types.ts +220 -0
- package/src/cmds/perf/utils/cache.ts +234 -0
- package/src/cmds/perf/utils/formatter.ts +190 -0
- package/src/cmds/perf/utils/stats.ts +153 -0
- package/src/cmds/publish/cmd.ts +215 -0
- package/src/cmds/shell/cmd.ts +61 -0
- package/src/cmds/tsc/cache.ts +237 -0
- package/src/cmds/tsc/cmd.ts +139 -0
- package/src/cmds/tsc/impl.ts +855 -0
- package/src/cmds/tsc/types.ts +66 -0
- package/tsconfig.json +9 -0
- package/cli.js +0 -1316
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import {
|
|
3
|
+
defineCmd,
|
|
4
|
+
defineCmdArgs,
|
|
5
|
+
defineCmdCfg
|
|
6
|
+
} from "@reliverse/dler-launcher";
|
|
7
|
+
import { logger } from "@reliverse/dler-logger";
|
|
8
|
+
import {
|
|
9
|
+
publishAllPackages
|
|
10
|
+
} from "@reliverse/dler-publish";
|
|
11
|
+
const publishCmd = async (args) => {
|
|
12
|
+
try {
|
|
13
|
+
if (typeof process.versions.bun === "undefined") {
|
|
14
|
+
logger.error("\u274C This command requires Bun runtime. Sorry.");
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const options = {
|
|
18
|
+
dryRun: args.dryRun,
|
|
19
|
+
tag: args.tag,
|
|
20
|
+
access: args.access,
|
|
21
|
+
otp: args.otp,
|
|
22
|
+
authType: args.authType,
|
|
23
|
+
verbose: args.verbose,
|
|
24
|
+
bump: args.bump,
|
|
25
|
+
concurrency: args.concurrency,
|
|
26
|
+
registry: args.registry,
|
|
27
|
+
kind: args.kind,
|
|
28
|
+
bumpDisable: args.bumpDisable
|
|
29
|
+
};
|
|
30
|
+
const results = await publishAllPackages(args.cwd, args.ignore, options);
|
|
31
|
+
if (results.warningCount > 0) {
|
|
32
|
+
for (const result of results.results) {
|
|
33
|
+
if (result.warning) {
|
|
34
|
+
logger.warn(` \u26A0\uFE0F ${result.packageName}: ${result.warning}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (results.hasErrors) {
|
|
39
|
+
logger.error(
|
|
40
|
+
`
|
|
41
|
+
\u274C Publishing failed: ${results.errorCount} error(s), ${results.successCount} success(es)`
|
|
42
|
+
);
|
|
43
|
+
for (const result of results.results) {
|
|
44
|
+
if (!result.success) {
|
|
45
|
+
logger.error(` \u274C ${result.packageName}: ${result.error}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
logger.success(
|
|
51
|
+
`
|
|
52
|
+
\u2705 All packages published successfully! (${results.successCount} packages)`
|
|
53
|
+
);
|
|
54
|
+
if (args.verbose) {
|
|
55
|
+
for (const result of results.results) {
|
|
56
|
+
if (result.success && !result.warning) {
|
|
57
|
+
logger.log(` \u2705 ${result.packageName}@${result.version}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
} catch (error) {
|
|
62
|
+
logger.error("\n\u274C Publish failed:");
|
|
63
|
+
if (error instanceof Error) {
|
|
64
|
+
logger.error(error.message);
|
|
65
|
+
} else {
|
|
66
|
+
logger.error(String(error));
|
|
67
|
+
}
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const publishCmdArgs = defineCmdArgs({
|
|
72
|
+
ignore: {
|
|
73
|
+
type: "string",
|
|
74
|
+
description: "Package(s) to ignore (supports wildcards like @reliverse/*)"
|
|
75
|
+
},
|
|
76
|
+
cwd: {
|
|
77
|
+
type: "string",
|
|
78
|
+
description: "Working directory (monorepo root)"
|
|
79
|
+
},
|
|
80
|
+
bump: {
|
|
81
|
+
type: "string",
|
|
82
|
+
description: "Version bump type: major, minor, patch, premajor, preminor, prepatch, prerelease"
|
|
83
|
+
},
|
|
84
|
+
tag: {
|
|
85
|
+
type: "string",
|
|
86
|
+
description: "npm dist-tag (default: latest)"
|
|
87
|
+
},
|
|
88
|
+
access: {
|
|
89
|
+
type: "string",
|
|
90
|
+
description: "Access level: public or restricted (default: public)"
|
|
91
|
+
},
|
|
92
|
+
dryRun: {
|
|
93
|
+
type: "boolean",
|
|
94
|
+
description: "Simulate publishing without actually publishing (default: false)"
|
|
95
|
+
},
|
|
96
|
+
otp: {
|
|
97
|
+
type: "string",
|
|
98
|
+
description: "One-time password for 2FA authentication"
|
|
99
|
+
},
|
|
100
|
+
authType: {
|
|
101
|
+
type: "string",
|
|
102
|
+
description: "Authentication method: web or legacy (default: web)"
|
|
103
|
+
},
|
|
104
|
+
concurrency: {
|
|
105
|
+
type: "number",
|
|
106
|
+
description: "Number of packages to publish concurrently (default: 3)"
|
|
107
|
+
},
|
|
108
|
+
verbose: {
|
|
109
|
+
type: "boolean",
|
|
110
|
+
description: "Verbose mode (default: false)"
|
|
111
|
+
},
|
|
112
|
+
registry: {
|
|
113
|
+
type: "string",
|
|
114
|
+
description: "Registry to publish to: npm, jsr, vercel, npm-jsr, or none (default: npm)"
|
|
115
|
+
},
|
|
116
|
+
kind: {
|
|
117
|
+
type: "string",
|
|
118
|
+
description: "Package kind: library, browser-app, native-app, or cli (default: library)"
|
|
119
|
+
},
|
|
120
|
+
bumpDisable: {
|
|
121
|
+
type: "boolean",
|
|
122
|
+
description: "Disable version bumping for all published packages, overwrites config (default: false)"
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
const publishCmdCfg = defineCmdCfg({
|
|
126
|
+
name: "publish",
|
|
127
|
+
description: "Publish workspace packages to npm registry using Bun's native publish command. Automatically handles version bumping, package.json modification, and dist folder validation. Supports dler.ts configuration for per-package settings.",
|
|
128
|
+
examples: [
|
|
129
|
+
"dler publish",
|
|
130
|
+
'dler publish --ignore "@reliverse/*"',
|
|
131
|
+
'dler publish --ignore "@reliverse/dler-colors" --ignore "@reliverse/dler-v1"',
|
|
132
|
+
'dler publish --ignore "@reliverse/dler-colors @reliverse/dler-v1"',
|
|
133
|
+
"dler publish --cwd /path/to/monorepo",
|
|
134
|
+
"dler publish --cwd /path/to/monorepo --ignore @reliverse/*",
|
|
135
|
+
"dler publish --bump patch",
|
|
136
|
+
"dler publish --bump minor --tag next",
|
|
137
|
+
"dler publish --bump major --access public",
|
|
138
|
+
"dler publish --dry-run",
|
|
139
|
+
"dler publish --dry-run --verbose",
|
|
140
|
+
"dler publish --tag alpha",
|
|
141
|
+
"dler publish --access restricted",
|
|
142
|
+
"dler publish --otp 123456",
|
|
143
|
+
"dler publish --auth-type legacy",
|
|
144
|
+
"dler publish --concurrency 3",
|
|
145
|
+
"dler publish --verbose",
|
|
146
|
+
"dler publish --bump patch --tag next --dry-run --verbose",
|
|
147
|
+
"dler publish --ignore @reliverse/* --bump minor --concurrency 2",
|
|
148
|
+
"dler publish --registry npm",
|
|
149
|
+
"dler publish --registry jsr",
|
|
150
|
+
"dler publish --registry vercel",
|
|
151
|
+
"dler publish --registry npm-jsr",
|
|
152
|
+
"dler publish --registry none",
|
|
153
|
+
"dler publish --kind library",
|
|
154
|
+
"dler publish --kind browser-app",
|
|
155
|
+
"dler publish --kind native-app",
|
|
156
|
+
"dler publish --kind cli",
|
|
157
|
+
"dler publish --kind library --registry npm",
|
|
158
|
+
"dler publish --kind browser-app --registry vercel",
|
|
159
|
+
"dler publish --kind cli --registry jsr",
|
|
160
|
+
"dler publish --bumpDisable",
|
|
161
|
+
"dler publish --bumpDisable --dry-run",
|
|
162
|
+
"dler publish --bumpDisable --tag next",
|
|
163
|
+
"",
|
|
164
|
+
"# Configuration Examples:",
|
|
165
|
+
"# Create dler.ts in your monorepo root:",
|
|
166
|
+
"# export default {",
|
|
167
|
+
"# publish: {",
|
|
168
|
+
"# global: { access: 'public', tag: 'latest', registry: 'npm', kind: 'library' },",
|
|
169
|
+
"# packages: { ",
|
|
170
|
+
"# 'my-library': { tag: 'next', bump: 'minor', registry: 'jsr', kind: 'library' },",
|
|
171
|
+
"# 'my-web-app': { registry: 'vercel', kind: 'browser-app' },",
|
|
172
|
+
"# 'my-native-app': { registry: 'none', kind: 'native-app' },",
|
|
173
|
+
"# 'my-cli-tool': { registry: 'npm', kind: 'cli' },",
|
|
174
|
+
"# 'my-library': { bumpDisable: true, tag: 'next' }",
|
|
175
|
+
"# },",
|
|
176
|
+
"# patterns: [{ pattern: '*example*', config: { dryRun: true, registry: 'vercel', kind: 'browser-app' } }]",
|
|
177
|
+
"# }",
|
|
178
|
+
"# }",
|
|
179
|
+
"",
|
|
180
|
+
"# Note: Make sure to run 'dler build --prepareForPublish' first to:",
|
|
181
|
+
"# - Generate dist folders and declaration files",
|
|
182
|
+
"# - Transform package.json exports field for built files",
|
|
183
|
+
"# - Add bin field for CLI packages",
|
|
184
|
+
"# - Set private: false and publishConfig",
|
|
185
|
+
"# The publish command will then handle version bumping and registry publishing",
|
|
186
|
+
"# CLI flags override dler.ts configuration settings"
|
|
187
|
+
]
|
|
188
|
+
});
|
|
189
|
+
export default defineCmd(publishCmd, publishCmdArgs, publishCmdCfg);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import {
|
|
3
|
+
defineCmd,
|
|
4
|
+
defineCmdArgs,
|
|
5
|
+
defineCmdCfg
|
|
6
|
+
} from "@reliverse/dler-launcher";
|
|
7
|
+
import { logger } from "@reliverse/dler-logger";
|
|
8
|
+
import { $ } from "bun";
|
|
9
|
+
const shellCmd = async (args) => {
|
|
10
|
+
try {
|
|
11
|
+
const commandParts = args.x.split(/\s+/);
|
|
12
|
+
const [command, ...commandArgs] = commandParts;
|
|
13
|
+
await $`${command} ${commandArgs.join(" ")}`;
|
|
14
|
+
} catch (error) {
|
|
15
|
+
logger.error("\n\u274C Command failed:");
|
|
16
|
+
if (error instanceof Error) {
|
|
17
|
+
if ("exitCode" in error) {
|
|
18
|
+
logger.error(`Exit code: ${error.exitCode}`);
|
|
19
|
+
if (error.stdout) {
|
|
20
|
+
logger.error(`STDOUT: ${error.stdout.toString()}`);
|
|
21
|
+
}
|
|
22
|
+
if (error.stderr) {
|
|
23
|
+
logger.error(`STDERR: ${error.stderr.toString()}`);
|
|
24
|
+
}
|
|
25
|
+
} else {
|
|
26
|
+
logger.error(error.message);
|
|
27
|
+
}
|
|
28
|
+
} else {
|
|
29
|
+
logger.error(String(error));
|
|
30
|
+
}
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const shellCmdArgs = defineCmdArgs({
|
|
35
|
+
x: {
|
|
36
|
+
type: "string",
|
|
37
|
+
required: true,
|
|
38
|
+
description: "Shell command to execute"
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
const shellCmdCfg = defineCmdCfg({
|
|
42
|
+
name: "shell",
|
|
43
|
+
description: "Execute shell commands using Bun Shell API",
|
|
44
|
+
examples: [
|
|
45
|
+
'dler shell --x "echo Hello World"',
|
|
46
|
+
'dler shell --x "ls -la"',
|
|
47
|
+
'dler shell --x "cat package.json | grep name"'
|
|
48
|
+
]
|
|
49
|
+
});
|
|
50
|
+
export default defineCmd(shellCmd, shellCmdArgs, shellCmdCfg);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { PackageInfo } from "./impl.js";
|
|
2
|
+
import type { PackageCacheEntry, TscCacheOptions } from "./types.js";
|
|
3
|
+
export declare class TscCache {
|
|
4
|
+
private options;
|
|
5
|
+
private metadata;
|
|
6
|
+
private metadataPath;
|
|
7
|
+
constructor(options?: Partial<TscCacheOptions>);
|
|
8
|
+
initialize(): Promise<void>;
|
|
9
|
+
private loadMetadata;
|
|
10
|
+
private saveMetadata;
|
|
11
|
+
private getSourceFiles;
|
|
12
|
+
private hasSourceFilesChanged;
|
|
13
|
+
shouldSkipPackage(pkg: PackageInfo): Promise<boolean>;
|
|
14
|
+
getCachedResult(pkg: PackageInfo): Promise<PackageCacheEntry | null>;
|
|
15
|
+
updatePackageCache(pkg: PackageInfo, result: {
|
|
16
|
+
success: boolean;
|
|
17
|
+
errorCount: number;
|
|
18
|
+
warningCount: number;
|
|
19
|
+
output?: string;
|
|
20
|
+
filteredOutput?: string;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
clearCache(): Promise<void>;
|
|
23
|
+
getCacheStats(): {
|
|
24
|
+
totalPackages: number;
|
|
25
|
+
successfulPackages: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { existsSync, statSync } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const CACHE_VERSION = "1.0.0";
|
|
5
|
+
const DEFAULT_CACHE_DIR = "node_modules/.cache/dler-tsc";
|
|
6
|
+
const DEFAULT_MAX_AGE = 24 * 60 * 60 * 1e3;
|
|
7
|
+
export class TscCache {
|
|
8
|
+
options;
|
|
9
|
+
metadata = null;
|
|
10
|
+
metadataPath;
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
this.options = {
|
|
13
|
+
enabled: options.enabled ?? true,
|
|
14
|
+
cacheDir: options.cacheDir ?? DEFAULT_CACHE_DIR,
|
|
15
|
+
maxAge: options.maxAge ?? DEFAULT_MAX_AGE
|
|
16
|
+
};
|
|
17
|
+
this.metadataPath = join(this.options.cacheDir, "metadata.json");
|
|
18
|
+
}
|
|
19
|
+
async initialize() {
|
|
20
|
+
if (!this.options.enabled) return;
|
|
21
|
+
try {
|
|
22
|
+
await mkdir(this.options.cacheDir, { recursive: true });
|
|
23
|
+
await this.loadMetadata();
|
|
24
|
+
} catch (error) {
|
|
25
|
+
this.options.enabled = false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async loadMetadata() {
|
|
29
|
+
if (!existsSync(this.metadataPath)) {
|
|
30
|
+
this.metadata = {
|
|
31
|
+
version: CACHE_VERSION,
|
|
32
|
+
lastUpdated: Date.now(),
|
|
33
|
+
packages: {}
|
|
34
|
+
};
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const content = await readFile(this.metadataPath, "utf-8");
|
|
39
|
+
this.metadata = JSON.parse(content);
|
|
40
|
+
if (Date.now() - this.metadata.lastUpdated > this.options.maxAge) {
|
|
41
|
+
this.metadata = {
|
|
42
|
+
version: CACHE_VERSION,
|
|
43
|
+
lastUpdated: Date.now(),
|
|
44
|
+
packages: {}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
} catch {
|
|
48
|
+
this.metadata = {
|
|
49
|
+
version: CACHE_VERSION,
|
|
50
|
+
lastUpdated: Date.now(),
|
|
51
|
+
packages: {}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async saveMetadata() {
|
|
56
|
+
if (!this.options.enabled || !this.metadata) return;
|
|
57
|
+
try {
|
|
58
|
+
this.metadata.lastUpdated = Date.now();
|
|
59
|
+
await writeFile(
|
|
60
|
+
this.metadataPath,
|
|
61
|
+
JSON.stringify(this.metadata, null, 2),
|
|
62
|
+
"utf-8"
|
|
63
|
+
);
|
|
64
|
+
} catch {
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async getSourceFiles(packagePath) {
|
|
68
|
+
const sourceFiles = [];
|
|
69
|
+
const tsConfigPath = join(packagePath, "tsconfig.json");
|
|
70
|
+
if (!existsSync(tsConfigPath)) {
|
|
71
|
+
return sourceFiles;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const glob = new Bun.Glob("**/*.{ts,tsx}");
|
|
75
|
+
const matches = glob.scanSync({
|
|
76
|
+
cwd: packagePath,
|
|
77
|
+
onlyFiles: true
|
|
78
|
+
});
|
|
79
|
+
for (const match of matches) {
|
|
80
|
+
const filePath = join(packagePath, match);
|
|
81
|
+
if (existsSync(filePath)) {
|
|
82
|
+
const stats = statSync(filePath);
|
|
83
|
+
sourceFiles.push({
|
|
84
|
+
path: match,
|
|
85
|
+
mtime: stats.mtime.getTime(),
|
|
86
|
+
size: stats.size
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
} catch {
|
|
91
|
+
}
|
|
92
|
+
return sourceFiles;
|
|
93
|
+
}
|
|
94
|
+
hasSourceFilesChanged(cached, current) {
|
|
95
|
+
if (cached.length !== current.length) return true;
|
|
96
|
+
const currentMap = new Map(current.map((file) => [file.path, file]));
|
|
97
|
+
for (const cachedFile of cached) {
|
|
98
|
+
const currentFile = currentMap.get(cachedFile.path);
|
|
99
|
+
if (!currentFile || currentFile.mtime !== cachedFile.mtime || currentFile.size !== cachedFile.size) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
async shouldSkipPackage(pkg) {
|
|
106
|
+
if (!this.options.enabled || !this.metadata) return false;
|
|
107
|
+
const cacheEntry = this.metadata.packages[pkg.name];
|
|
108
|
+
if (!cacheEntry || !cacheEntry.lastSuccess) return false;
|
|
109
|
+
const timeSinceLastSuccess = Date.now() - cacheEntry.lastSuccess;
|
|
110
|
+
if (timeSinceLastSuccess > this.options.maxAge) return false;
|
|
111
|
+
const currentSourceFiles = await this.getSourceFiles(pkg.path);
|
|
112
|
+
if (this.hasSourceFilesChanged(cacheEntry.sourceFiles, currentSourceFiles)) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
async getCachedResult(pkg) {
|
|
118
|
+
if (!this.options.enabled || !this.metadata) return null;
|
|
119
|
+
const cacheEntry = this.metadata.packages[pkg.name];
|
|
120
|
+
if (!cacheEntry) return null;
|
|
121
|
+
const currentSourceFiles = await this.getSourceFiles(pkg.path);
|
|
122
|
+
if (this.hasSourceFilesChanged(cacheEntry.sourceFiles, currentSourceFiles)) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
return cacheEntry;
|
|
126
|
+
}
|
|
127
|
+
async updatePackageCache(pkg, result) {
|
|
128
|
+
if (!this.options.enabled || !this.metadata) return;
|
|
129
|
+
const sourceFiles = await this.getSourceFiles(pkg.path);
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
this.metadata.packages[pkg.name] = {
|
|
132
|
+
lastCheck: now,
|
|
133
|
+
lastSuccess: result.success ? now : this.metadata.packages[pkg.name]?.lastSuccess ?? null,
|
|
134
|
+
sourceFiles,
|
|
135
|
+
hasErrors: !result.success,
|
|
136
|
+
errorCount: result.errorCount,
|
|
137
|
+
warningCount: result.warningCount,
|
|
138
|
+
output: result.output,
|
|
139
|
+
filteredOutput: result.filteredOutput
|
|
140
|
+
};
|
|
141
|
+
await this.saveMetadata();
|
|
142
|
+
}
|
|
143
|
+
async clearCache() {
|
|
144
|
+
if (!this.options.enabled) return;
|
|
145
|
+
this.metadata = {
|
|
146
|
+
version: CACHE_VERSION,
|
|
147
|
+
lastUpdated: Date.now(),
|
|
148
|
+
packages: {}
|
|
149
|
+
};
|
|
150
|
+
await this.saveMetadata();
|
|
151
|
+
}
|
|
152
|
+
getCacheStats() {
|
|
153
|
+
if (!this.metadata) return { totalPackages: 0, successfulPackages: 0 };
|
|
154
|
+
const totalPackages = Object.keys(this.metadata.packages).length;
|
|
155
|
+
const successfulPackages = Object.values(this.metadata.packages).filter(
|
|
156
|
+
(entry) => entry.lastSuccess !== null
|
|
157
|
+
).length;
|
|
158
|
+
return { totalPackages, successfulPackages };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineCmd,
|
|
3
|
+
defineCmdArgs,
|
|
4
|
+
defineCmdCfg
|
|
5
|
+
} from "@reliverse/dler-launcher";
|
|
6
|
+
import { logger } from "@reliverse/dler-logger";
|
|
7
|
+
import { runTscOnAllPackages } from "./impl.js";
|
|
8
|
+
const tscCmd = async (args) => {
|
|
9
|
+
try {
|
|
10
|
+
if (typeof process.versions.bun === "undefined") {
|
|
11
|
+
logger.error("\u274C This command requires Bun runtime. Sorry.");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const results = await runTscOnAllPackages(args.ignore, args.cwd, {
|
|
15
|
+
concurrency: args.concurrency,
|
|
16
|
+
stopOnError: args.stopOnError,
|
|
17
|
+
verbose: args.verbose,
|
|
18
|
+
copyLogs: args.copyLogs,
|
|
19
|
+
cache: args.cache,
|
|
20
|
+
incremental: args.incremental,
|
|
21
|
+
autoConcurrency: args.autoConcurrency,
|
|
22
|
+
skipUnchanged: args.skipUnchanged,
|
|
23
|
+
buildMode: args.buildMode
|
|
24
|
+
});
|
|
25
|
+
if (results.hasErrors) {
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
logger.success("\n\u2705 All packages passed type checking!");
|
|
29
|
+
} catch (error) {
|
|
30
|
+
logger.error("\n\u274C TypeScript check failed:");
|
|
31
|
+
if (error instanceof Error) {
|
|
32
|
+
logger.error(error.message);
|
|
33
|
+
} else {
|
|
34
|
+
logger.error(String(error));
|
|
35
|
+
}
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const tscCmdArgs = defineCmdArgs({
|
|
40
|
+
ignore: {
|
|
41
|
+
type: "string",
|
|
42
|
+
description: "Package(s) to ignore (supports wildcards like @reliverse/*)"
|
|
43
|
+
},
|
|
44
|
+
cwd: {
|
|
45
|
+
type: "string",
|
|
46
|
+
description: "Working directory (monorepo root)"
|
|
47
|
+
},
|
|
48
|
+
concurrency: {
|
|
49
|
+
type: "number",
|
|
50
|
+
description: "Number of packages to check concurrently (default: CPU cores)"
|
|
51
|
+
},
|
|
52
|
+
stopOnError: {
|
|
53
|
+
type: "boolean",
|
|
54
|
+
description: "Stop on first error instead of collecting all errors (default: false)"
|
|
55
|
+
},
|
|
56
|
+
verbose: {
|
|
57
|
+
type: "boolean",
|
|
58
|
+
description: "Verbose mode (default: false)"
|
|
59
|
+
},
|
|
60
|
+
copyLogs: {
|
|
61
|
+
type: "boolean",
|
|
62
|
+
description: "Copy failed package logs to clipboard (default: false)"
|
|
63
|
+
},
|
|
64
|
+
cache: {
|
|
65
|
+
type: "boolean",
|
|
66
|
+
description: "Enable caching for faster subsequent runs (default: true)"
|
|
67
|
+
},
|
|
68
|
+
incremental: {
|
|
69
|
+
type: "boolean",
|
|
70
|
+
description: "Use TypeScript incremental compilation (default: true)"
|
|
71
|
+
},
|
|
72
|
+
autoConcurrency: {
|
|
73
|
+
type: "boolean",
|
|
74
|
+
description: "Auto-detect optimal concurrency based on CPU cores (default: false)"
|
|
75
|
+
},
|
|
76
|
+
skipUnchanged: {
|
|
77
|
+
type: "boolean",
|
|
78
|
+
description: "Skip packages with no changes since last check (default: true)"
|
|
79
|
+
},
|
|
80
|
+
buildMode: {
|
|
81
|
+
type: "boolean",
|
|
82
|
+
description: "Use tsc --build for project references (default: false)"
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
const tscCmdCfg = defineCmdCfg({
|
|
86
|
+
name: "tsc",
|
|
87
|
+
description: "Run TypeScript type checking on all workspace packages",
|
|
88
|
+
examples: [
|
|
89
|
+
"dler tsc",
|
|
90
|
+
'dler tsc --ignore "@reliverse/*"',
|
|
91
|
+
'dler tsc --ignore "@reliverse/dler-colors" --ignore "@reliverse/dler-v1"',
|
|
92
|
+
'dler tsc --ignore "@reliverse/dler-colors @reliverse/dler-v1"',
|
|
93
|
+
"dler tsc --cwd /path/to/monorepo",
|
|
94
|
+
"dler tsc --cwd /path/to/monorepo --ignore @reliverse/*",
|
|
95
|
+
"dler tsc --concurrency 8",
|
|
96
|
+
"dler tsc --concurrency 2 --stopOnError",
|
|
97
|
+
"dler tsc --ignore @reliverse/* --concurrency 6 --stopOnError",
|
|
98
|
+
"dler tsc --verbose",
|
|
99
|
+
"dler tsc --verbose --ignore @reliverse/*",
|
|
100
|
+
"dler tsc --verbose --concurrency 2 --stopOnError",
|
|
101
|
+
"dler tsc --copy-logs",
|
|
102
|
+
"dler tsc --copy-logs --verbose",
|
|
103
|
+
"dler tsc --auto-concurrency",
|
|
104
|
+
"dler tsc --no-cache",
|
|
105
|
+
"dler tsc --no-incremental",
|
|
106
|
+
"dler tsc --build-mode",
|
|
107
|
+
"dler tsc --skip-unchanged",
|
|
108
|
+
"dler tsc --auto-concurrency --build-mode --verbose"
|
|
109
|
+
]
|
|
110
|
+
});
|
|
111
|
+
export default defineCmd(tscCmd, tscCmdArgs, tscCmdCfg);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface PackageInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
path: string;
|
|
4
|
+
hasTsConfig: boolean;
|
|
5
|
+
}
|
|
6
|
+
interface TscResult {
|
|
7
|
+
package: PackageInfo;
|
|
8
|
+
success: boolean;
|
|
9
|
+
skipped: boolean;
|
|
10
|
+
cached: boolean;
|
|
11
|
+
totalErrors: number;
|
|
12
|
+
totalWarnings: number;
|
|
13
|
+
filteredErrors: number;
|
|
14
|
+
filteredWarnings: number;
|
|
15
|
+
output: string;
|
|
16
|
+
filteredOutput: string;
|
|
17
|
+
executionTime: number;
|
|
18
|
+
}
|
|
19
|
+
interface TscSummary {
|
|
20
|
+
totalPackages: number;
|
|
21
|
+
failedPackages: number;
|
|
22
|
+
successfulPackages: number;
|
|
23
|
+
skippedPackages: number;
|
|
24
|
+
totalErrors: number;
|
|
25
|
+
totalWarnings: number;
|
|
26
|
+
hasErrors: boolean;
|
|
27
|
+
results: TscResult[];
|
|
28
|
+
}
|
|
29
|
+
interface TscOptions {
|
|
30
|
+
concurrency?: number;
|
|
31
|
+
stopOnError?: boolean;
|
|
32
|
+
verbose?: boolean;
|
|
33
|
+
copyLogs?: boolean;
|
|
34
|
+
cache?: boolean;
|
|
35
|
+
incremental?: boolean;
|
|
36
|
+
autoConcurrency?: boolean;
|
|
37
|
+
skipUnchanged?: boolean;
|
|
38
|
+
buildMode?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare const runTscOnAllPackages: (ignore?: string | string[], cwd?: string, options?: TscOptions) => Promise<TscSummary>;
|
|
41
|
+
export {};
|