@typokit/cli 0.1.4
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/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +13 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/build.d.ts +42 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +302 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +106 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +536 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/generate.d.ts +65 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +430 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/inspect.d.ts +26 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +579 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/migrate.d.ts +70 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +570 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/scaffold.d.ts +70 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +483 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/test.d.ts +56 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +248 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +69 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +245 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +12 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +33 -0
- package/dist/logger.js.map +1 -0
- package/package.json +33 -0
- package/src/bin.ts +22 -0
- package/src/commands/build.ts +433 -0
- package/src/commands/dev.ts +822 -0
- package/src/commands/generate.ts +640 -0
- package/src/commands/inspect.ts +885 -0
- package/src/commands/migrate.ts +800 -0
- package/src/commands/scaffold.ts +627 -0
- package/src/commands/test.ts +353 -0
- package/src/config.ts +93 -0
- package/src/dev.test.ts +285 -0
- package/src/env.d.ts +86 -0
- package/src/generate.test.ts +304 -0
- package/src/index.test.ts +217 -0
- package/src/index.ts +397 -0
- package/src/inspect.test.ts +411 -0
- package/src/logger.ts +49 -0
- package/src/migrate.test.ts +205 -0
- package/src/scaffold.test.ts +256 -0
- package/src/test.test.ts +230 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// @typokit/cli — Test Commands
|
|
2
|
+
/**
|
|
3
|
+
* Config file patterns used to auto-detect test runners.
|
|
4
|
+
*/
|
|
5
|
+
const RUNNER_CONFIG_PATTERNS = {
|
|
6
|
+
jest: [
|
|
7
|
+
"jest.config.js",
|
|
8
|
+
"jest.config.ts",
|
|
9
|
+
"jest.config.mjs",
|
|
10
|
+
"jest.config.cjs",
|
|
11
|
+
],
|
|
12
|
+
vitest: [
|
|
13
|
+
"vitest.config.js",
|
|
14
|
+
"vitest.config.ts",
|
|
15
|
+
"vitest.config.mjs",
|
|
16
|
+
"vitest.config.cjs",
|
|
17
|
+
],
|
|
18
|
+
rstest: [
|
|
19
|
+
"rstest.config.js",
|
|
20
|
+
"rstest.config.ts",
|
|
21
|
+
"rstest.config.mjs",
|
|
22
|
+
"rstest.config.cjs",
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Auto-detect the test runner by checking for config files in the project root.
|
|
27
|
+
* Returns the first match found, or "vitest" as default.
|
|
28
|
+
*/
|
|
29
|
+
export async function detectTestRunner(rootDir) {
|
|
30
|
+
const { join } = (await import(/* @vite-ignore */ "path"));
|
|
31
|
+
const { existsSync } = (await import(/* @vite-ignore */ "fs"));
|
|
32
|
+
for (const [runner, patterns] of Object.entries(RUNNER_CONFIG_PATTERNS)) {
|
|
33
|
+
for (const pattern of patterns) {
|
|
34
|
+
if (existsSync(join(rootDir, pattern))) {
|
|
35
|
+
return runner;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return "vitest";
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Build the command and arguments for each test runner.
|
|
43
|
+
*/
|
|
44
|
+
export function buildRunnerCommand(runner, subcommand, rootDir, verbose) {
|
|
45
|
+
const args = [];
|
|
46
|
+
switch (runner) {
|
|
47
|
+
case "jest": {
|
|
48
|
+
const cmd = "jest";
|
|
49
|
+
if (subcommand === "contracts") {
|
|
50
|
+
args.push("--testPathPattern", "__generated__/.*\\.contract\\.test");
|
|
51
|
+
}
|
|
52
|
+
else if (subcommand === "integration") {
|
|
53
|
+
args.push("--testPathPattern", "integration");
|
|
54
|
+
}
|
|
55
|
+
if (verbose) {
|
|
56
|
+
args.push("--verbose");
|
|
57
|
+
}
|
|
58
|
+
args.push("--passWithNoTests");
|
|
59
|
+
return { command: cmd, args };
|
|
60
|
+
}
|
|
61
|
+
case "vitest": {
|
|
62
|
+
const cmd = "vitest";
|
|
63
|
+
args.push("run");
|
|
64
|
+
if (subcommand === "contracts") {
|
|
65
|
+
args.push("__generated__/");
|
|
66
|
+
}
|
|
67
|
+
else if (subcommand === "integration") {
|
|
68
|
+
args.push("--dir", "tests/integration");
|
|
69
|
+
}
|
|
70
|
+
if (verbose) {
|
|
71
|
+
args.push("--reporter", "verbose");
|
|
72
|
+
}
|
|
73
|
+
args.push("--passWithNoTests");
|
|
74
|
+
return { command: cmd, args };
|
|
75
|
+
}
|
|
76
|
+
case "rstest": {
|
|
77
|
+
const cmd = "rstest";
|
|
78
|
+
args.push("run");
|
|
79
|
+
if (subcommand === "contracts") {
|
|
80
|
+
args.push("--testPathPattern", "__generated__/.*\\.contract\\.test");
|
|
81
|
+
}
|
|
82
|
+
else if (subcommand === "integration") {
|
|
83
|
+
args.push("--testPathPattern", "integration");
|
|
84
|
+
}
|
|
85
|
+
args.push("--passWithNoTests");
|
|
86
|
+
return { command: cmd, args };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check whether schemas have changed since last contract test generation.
|
|
92
|
+
* Compares the content hash in .typokit/build-cache.json against current type files.
|
|
93
|
+
*/
|
|
94
|
+
export async function schemasChanged(rootDir, config) {
|
|
95
|
+
const { join } = (await import(/* @vite-ignore */ "path"));
|
|
96
|
+
const { existsSync } = (await import(/* @vite-ignore */ "fs"));
|
|
97
|
+
const cacheFile = join(rootDir, config.outputDir, "build-cache.json");
|
|
98
|
+
// If no cache exists, schemas have effectively "changed" (never built)
|
|
99
|
+
if (!existsSync(cacheFile)) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
// If the generated contracts directory doesn't exist, need to regenerate
|
|
103
|
+
const generatedDir = join(rootDir, "__generated__");
|
|
104
|
+
if (!existsSync(generatedDir)) {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
// Cache exists and generated dir exists — assume up to date
|
|
108
|
+
// A full implementation would compare file hashes, but for now
|
|
109
|
+
// we rely on the build pipeline's cache mechanism
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Regenerate contract tests by invoking the generate:tests pipeline.
|
|
114
|
+
*/
|
|
115
|
+
async function regenerateContracts(options) {
|
|
116
|
+
const { logger, rootDir, config, verbose } = options;
|
|
117
|
+
logger.step("test", "Regenerating contract tests from schemas...");
|
|
118
|
+
try {
|
|
119
|
+
const { executeGenerate } = await import("./generate.js");
|
|
120
|
+
const result = await executeGenerate({
|
|
121
|
+
rootDir,
|
|
122
|
+
config,
|
|
123
|
+
logger,
|
|
124
|
+
subcommand: "tests",
|
|
125
|
+
flags: options.flags,
|
|
126
|
+
verbose,
|
|
127
|
+
});
|
|
128
|
+
if (!result.success) {
|
|
129
|
+
return { success: false, errors: result.errors };
|
|
130
|
+
}
|
|
131
|
+
logger.success(`Contract tests regenerated — ${result.filesWritten.length} files`);
|
|
132
|
+
return { success: true, errors: [] };
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
136
|
+
return {
|
|
137
|
+
success: false,
|
|
138
|
+
errors: [`Failed to regenerate contracts: ${message}`],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Execute test commands.
|
|
144
|
+
*
|
|
145
|
+
* Subcommands:
|
|
146
|
+
* "all" — runs all tests
|
|
147
|
+
* "contracts" — runs only contract tests from __generated__/
|
|
148
|
+
* "integration" — runs integration tests with in-memory database
|
|
149
|
+
*/
|
|
150
|
+
export async function executeTest(options) {
|
|
151
|
+
const startTime = Date.now();
|
|
152
|
+
const { logger, rootDir, config, flags, verbose } = options;
|
|
153
|
+
const subcommand = options.subcommand || "all";
|
|
154
|
+
const errors = [];
|
|
155
|
+
let contractsRegenerated = false;
|
|
156
|
+
// Determine test runner: --runner flag overrides auto-detection
|
|
157
|
+
let runner;
|
|
158
|
+
if (typeof flags["runner"] === "string") {
|
|
159
|
+
const requested = flags["runner"];
|
|
160
|
+
if (requested === "jest" ||
|
|
161
|
+
requested === "vitest" ||
|
|
162
|
+
requested === "rstest") {
|
|
163
|
+
runner = requested;
|
|
164
|
+
logger.step("test", `Using runner: ${runner} (from --runner flag)`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
logger.error(`Unknown test runner: ${requested}. Use jest, vitest, or rstest.`);
|
|
168
|
+
return {
|
|
169
|
+
success: false,
|
|
170
|
+
runner: "vitest",
|
|
171
|
+
duration: Date.now() - startTime,
|
|
172
|
+
errors: [`Unknown test runner: ${requested}`],
|
|
173
|
+
contractsRegenerated: false,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
runner = await detectTestRunner(rootDir);
|
|
179
|
+
logger.step("test", `Auto-detected runner: ${runner}`);
|
|
180
|
+
}
|
|
181
|
+
// Regenerate contract tests if schemas have changed
|
|
182
|
+
if (subcommand === "all" || subcommand === "contracts") {
|
|
183
|
+
const changed = await schemasChanged(rootDir, config);
|
|
184
|
+
if (changed) {
|
|
185
|
+
const regenResult = await regenerateContracts(options);
|
|
186
|
+
contractsRegenerated = true;
|
|
187
|
+
if (!regenResult.success) {
|
|
188
|
+
logger.warn("Contract test regeneration failed — running existing tests");
|
|
189
|
+
for (const e of regenResult.errors) {
|
|
190
|
+
errors.push(e);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Build runner command
|
|
196
|
+
const { command, args } = buildRunnerCommand(runner, subcommand, rootDir, verbose);
|
|
197
|
+
logger.step("test", `Running: ${command} ${args.join(" ")}`);
|
|
198
|
+
// Execute the test runner
|
|
199
|
+
const { spawnSync } = (await import(/* @vite-ignore */ "child_process"));
|
|
200
|
+
const result = spawnSync(command, args, {
|
|
201
|
+
cwd: rootDir,
|
|
202
|
+
encoding: "utf-8",
|
|
203
|
+
stdio: "pipe",
|
|
204
|
+
});
|
|
205
|
+
if (result.error) {
|
|
206
|
+
logger.error(`Failed to start test runner: ${result.error.message}`);
|
|
207
|
+
return {
|
|
208
|
+
success: false,
|
|
209
|
+
runner,
|
|
210
|
+
duration: Date.now() - startTime,
|
|
211
|
+
errors: [`Failed to start ${runner}: ${result.error.message}`],
|
|
212
|
+
contractsRegenerated,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// Output test results
|
|
216
|
+
if (result.stdout) {
|
|
217
|
+
// Print test output lines
|
|
218
|
+
for (const line of result.stdout.split("\n")) {
|
|
219
|
+
if (line.trim()) {
|
|
220
|
+
logger.info(line);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (result.stderr && (verbose || result.status !== 0)) {
|
|
225
|
+
for (const line of result.stderr.split("\n")) {
|
|
226
|
+
if (line.trim()) {
|
|
227
|
+
logger.error(line);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const success = result.status === 0;
|
|
232
|
+
const duration = Date.now() - startTime;
|
|
233
|
+
if (success) {
|
|
234
|
+
logger.success(`Tests passed in ${duration}ms`);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
logger.error(`Tests failed (exit code: ${result.status})`);
|
|
238
|
+
errors.push(`Test runner exited with code ${result.status}`);
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
success,
|
|
242
|
+
runner,
|
|
243
|
+
duration,
|
|
244
|
+
errors,
|
|
245
|
+
contractsRegenerated,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface TypoKitConfig {
|
|
2
|
+
/** Glob patterns or paths for type definition files */
|
|
3
|
+
typeFiles?: string[];
|
|
4
|
+
/** Glob patterns or paths for route contract files */
|
|
5
|
+
routeFiles?: string[];
|
|
6
|
+
/** Output directory for generated files (default: ".typokit") */
|
|
7
|
+
outputDir?: string;
|
|
8
|
+
/** Output directory for compiled output (default: "dist") */
|
|
9
|
+
distDir?: string;
|
|
10
|
+
/** TypeScript compiler to use: "tsc" | "tsup" | "swc" (default: "tsc") */
|
|
11
|
+
compiler?: "tsc" | "tsup" | "swc";
|
|
12
|
+
/** Additional compiler args */
|
|
13
|
+
compilerArgs?: string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load TypoKit configuration from typokit.config.ts or package.json.
|
|
17
|
+
* Searches in the given root directory.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadConfig(rootDir: string): Promise<Required<TypoKitConfig>>;
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAClC,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAWD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAiDlC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// @typokit/cli — Configuration loading
|
|
2
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
3
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
4
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
5
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
return path;
|
|
9
|
+
};
|
|
10
|
+
const DEFAULT_CONFIG = {
|
|
11
|
+
typeFiles: ["src/**/*.types.ts", "src/**/types.ts"],
|
|
12
|
+
routeFiles: ["src/**/*.routes.ts", "src/**/routes.ts", "src/**/contracts.ts"],
|
|
13
|
+
outputDir: ".typokit",
|
|
14
|
+
distDir: "dist",
|
|
15
|
+
compiler: "tsc",
|
|
16
|
+
compilerArgs: [],
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Load TypoKit configuration from typokit.config.ts or package.json.
|
|
20
|
+
* Searches in the given root directory.
|
|
21
|
+
*/
|
|
22
|
+
export async function loadConfig(rootDir) {
|
|
23
|
+
const { join } = (await import(/* @vite-ignore */ "path"));
|
|
24
|
+
const { existsSync, readFileSync } = (await import(
|
|
25
|
+
/* @vite-ignore */ "fs"));
|
|
26
|
+
// Try typokit.config.ts (compiled to .js)
|
|
27
|
+
const configTsPath = join(rootDir, "typokit.config.ts");
|
|
28
|
+
const configJsPath = join(rootDir, "typokit.config.js");
|
|
29
|
+
if (existsSync(configJsPath)) {
|
|
30
|
+
try {
|
|
31
|
+
const { pathToFileURL } = (await import(/* @vite-ignore */ "url"));
|
|
32
|
+
const mod = (await import(__rewriteRelativeImportExtension(pathToFileURL(configJsPath).href)));
|
|
33
|
+
return mergeConfig(mod.default ?? {});
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Fall through to package.json
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (existsSync(configTsPath)) {
|
|
40
|
+
// Config exists as TS but not compiled — return defaults with a note
|
|
41
|
+
// Users should compile it or use package.json field
|
|
42
|
+
}
|
|
43
|
+
// Try package.json "typokit" field
|
|
44
|
+
const pkgPath = join(rootDir, "package.json");
|
|
45
|
+
if (existsSync(pkgPath)) {
|
|
46
|
+
try {
|
|
47
|
+
const pkgContent = readFileSync(pkgPath, "utf-8");
|
|
48
|
+
const pkg = JSON.parse(pkgContent);
|
|
49
|
+
if (pkg["typokit"] && typeof pkg["typokit"] === "object") {
|
|
50
|
+
return mergeConfig(pkg["typokit"]);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Fall through to defaults
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { ...DEFAULT_CONFIG };
|
|
58
|
+
}
|
|
59
|
+
function mergeConfig(partial) {
|
|
60
|
+
return {
|
|
61
|
+
typeFiles: partial.typeFiles ?? DEFAULT_CONFIG.typeFiles,
|
|
62
|
+
routeFiles: partial.routeFiles ?? DEFAULT_CONFIG.routeFiles,
|
|
63
|
+
outputDir: partial.outputDir ?? DEFAULT_CONFIG.outputDir,
|
|
64
|
+
distDir: partial.distDir ?? DEFAULT_CONFIG.distDir,
|
|
65
|
+
compiler: partial.compiler ?? DEFAULT_CONFIG.compiler,
|
|
66
|
+
compilerArgs: partial.compilerArgs ?? DEFAULT_CONFIG.compilerArgs,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,uCAAuC;;;;;;;;;AAiBvC,MAAM,cAAc,GAA4B;IAC9C,SAAS,EAAE,CAAC,mBAAmB,EAAE,iBAAiB,CAAC;IACnD,UAAU,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,qBAAqB,CAAC;IAC7E,SAAS,EAAE,UAAU;IACrB,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,EAAE;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe;IAEf,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAExD,CAAC;IACF,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,MAAM;IAChD,kBAAkB,CAAC,IAAI,CACxB,CAGA,CAAC;IAEF,0CAA0C;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAExD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAEhE,CAAC;YACF,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,kCAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,EAAC,CAE1D,CAAC;YACF,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,qEAAqE;QACrE,oDAAoD;IACtD,CAAC;IAED,mCAAmC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAA4B,CAAC;YAC9D,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACzD,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,CAAkB,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB;IACzC,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC,SAAS;QACxD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC,UAAU;QAC3D,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC,SAAS;QACxD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO;QAClD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ;QACrD,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,cAAc,CAAC,YAAY;KAClE,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export { createLogger } from "./logger.js";
|
|
2
|
+
export type { CliLogger } from "./logger.js";
|
|
3
|
+
export { loadConfig } from "./config.js";
|
|
4
|
+
export type { TypoKitConfig } from "./config.js";
|
|
5
|
+
export { executeBuild } from "./commands/build.js";
|
|
6
|
+
export type { BuildCommandOptions, BuildError } from "./commands/build.js";
|
|
7
|
+
export { executeDev, createDevState, detectChangedFiles, updateTrackedFiles, buildDepGraph, getAffectedOutputs, isCacheValid, updateCache, } from "./commands/dev.js";
|
|
8
|
+
export type { DevCommandOptions, DevServerState } from "./commands/dev.js";
|
|
9
|
+
export { executeInspect, inspectRoutes, inspectRoute, inspectMiddleware, inspectDependencies, inspectSchema, inspectErrors, inspectPerformance, inspectServer, inspectBuildPipeline, } from "./commands/inspect.js";
|
|
10
|
+
export type { InspectOptions, InspectResult } from "./commands/inspect.js";
|
|
11
|
+
export { executeGenerate, generateDb, generateClient, generateOpenapi, generateTests, generateClientCode, } from "./commands/generate.js";
|
|
12
|
+
export type { GenerateCommandOptions, GenerateResult, } from "./commands/generate.js";
|
|
13
|
+
export { executeMigrate, migrateGenerate, migrateDiff, migrateApply, } from "./commands/migrate.js";
|
|
14
|
+
export type { MigrateCommandOptions, MigrateResult, } from "./commands/migrate.js";
|
|
15
|
+
export { executeScaffold, scaffoldInit, scaffoldRoute, scaffoldService, generateRouteContracts, generateRouteHandlers, generateRouteMiddleware, generateService, generatePackageJson, generateTsconfig, generateAppTs, generateTypesTs, toPascalCase, toCamelCase, } from "./commands/scaffold.js";
|
|
16
|
+
export type { ScaffoldCommandOptions, ScaffoldResult, InitOptions, } from "./commands/scaffold.js";
|
|
17
|
+
export { executeTest, detectTestRunner, buildRunnerCommand, schemasChanged, } from "./commands/test.js";
|
|
18
|
+
export type { TestCommandOptions, TestResult, TestRunner, } from "./commands/test.js";
|
|
19
|
+
/** Parse CLI arguments into a structured object */
|
|
20
|
+
export declare function parseArgs(argv: string[]): {
|
|
21
|
+
command: string;
|
|
22
|
+
flags: Record<string, string | boolean>;
|
|
23
|
+
positional: string[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Run the CLI with the given argv.
|
|
27
|
+
* Returns the exit code (0 = success, 1 = failure).
|
|
28
|
+
*/
|
|
29
|
+
export declare function run(argv: string[]): Promise<number>;
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EACL,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EACL,eAAe,EACf,UAAU,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,sBAAsB,EACtB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,qBAAqB,EACrB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CA8BA;AAED;;;GAGG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4QzD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// @typokit/cli — Main entry point
|
|
2
|
+
export { createLogger } from "./logger.js";
|
|
3
|
+
export { loadConfig } from "./config.js";
|
|
4
|
+
export { executeBuild } from "./commands/build.js";
|
|
5
|
+
export { executeDev, createDevState, detectChangedFiles, updateTrackedFiles, buildDepGraph, getAffectedOutputs, isCacheValid, updateCache, } from "./commands/dev.js";
|
|
6
|
+
export { executeInspect, inspectRoutes, inspectRoute, inspectMiddleware, inspectDependencies, inspectSchema, inspectErrors, inspectPerformance, inspectServer, inspectBuildPipeline, } from "./commands/inspect.js";
|
|
7
|
+
export { executeGenerate, generateDb, generateClient, generateOpenapi, generateTests, generateClientCode, } from "./commands/generate.js";
|
|
8
|
+
export { executeMigrate, migrateGenerate, migrateDiff, migrateApply, } from "./commands/migrate.js";
|
|
9
|
+
export { executeScaffold, scaffoldInit, scaffoldRoute, scaffoldService, generateRouteContracts, generateRouteHandlers, generateRouteMiddleware, generateService, generatePackageJson, generateTsconfig, generateAppTs, generateTypesTs, toPascalCase, toCamelCase, } from "./commands/scaffold.js";
|
|
10
|
+
export { executeTest, detectTestRunner, buildRunnerCommand, schemasChanged, } from "./commands/test.js";
|
|
11
|
+
/** Parse CLI arguments into a structured object */
|
|
12
|
+
export function parseArgs(argv) {
|
|
13
|
+
const flags = {};
|
|
14
|
+
const positional = [];
|
|
15
|
+
let command = "";
|
|
16
|
+
// Skip node and script path (argv[0], argv[1])
|
|
17
|
+
const args = argv.slice(2);
|
|
18
|
+
for (let i = 0; i < args.length; i++) {
|
|
19
|
+
const arg = args[i];
|
|
20
|
+
if (arg.startsWith("--")) {
|
|
21
|
+
const key = arg.slice(2);
|
|
22
|
+
const next = args[i + 1];
|
|
23
|
+
if (next && !next.startsWith("-")) {
|
|
24
|
+
flags[key] = next;
|
|
25
|
+
i++;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
flags[key] = true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (arg.startsWith("-")) {
|
|
32
|
+
const key = arg.slice(1);
|
|
33
|
+
flags[key] = true;
|
|
34
|
+
}
|
|
35
|
+
else if (!command) {
|
|
36
|
+
command = arg;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
positional.push(arg);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { command, flags, positional };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Run the CLI with the given argv.
|
|
46
|
+
* Returns the exit code (0 = success, 1 = failure).
|
|
47
|
+
*/
|
|
48
|
+
export async function run(argv) {
|
|
49
|
+
const { resolve } = (await import(/* @vite-ignore */ "path"));
|
|
50
|
+
const { command, flags, positional } = parseArgs(argv);
|
|
51
|
+
const verbose = flags["verbose"] === true || flags["v"] === true;
|
|
52
|
+
const { createLogger: createLog } = await import("./logger.js");
|
|
53
|
+
const logger = createLog({ verbose });
|
|
54
|
+
if (!command || command === "help") {
|
|
55
|
+
logger.info("Usage: typokit <command> [options]");
|
|
56
|
+
logger.info("");
|
|
57
|
+
logger.info("Commands:");
|
|
58
|
+
logger.info(" build Run the full build pipeline");
|
|
59
|
+
logger.info(" dev Start dev server with watch mode");
|
|
60
|
+
logger.info(" generate:<sub> Generate specific artifacts");
|
|
61
|
+
logger.info(" generate:db Generate DB schema from types");
|
|
62
|
+
logger.info(" generate:client Generate API client from contracts");
|
|
63
|
+
logger.info(" generate:openapi Generate OpenAPI spec (--output <path>)");
|
|
64
|
+
logger.info(" generate:tests Regenerate contract tests");
|
|
65
|
+
logger.info(" migrate:<sub> Database migration management");
|
|
66
|
+
logger.info(" migrate:generate Generate migration from type diff (--name <name>)");
|
|
67
|
+
logger.info(" migrate:diff Show pending schema changes (--json for JSON)");
|
|
68
|
+
logger.info(" migrate:apply Apply pending migrations (--force for destructive)");
|
|
69
|
+
logger.info(" inspect <sub> Inspect framework state (routes, schema, etc.)");
|
|
70
|
+
logger.info(" test Run all tests (auto-detects runner)");
|
|
71
|
+
logger.info(" test:contracts Run generated contract tests only");
|
|
72
|
+
logger.info(" test:integration Run integration tests");
|
|
73
|
+
logger.info(" init [name] Create a new TypoKit project from template");
|
|
74
|
+
logger.info(" add route <name> Scaffold a new route module");
|
|
75
|
+
logger.info(" add service <name> Scaffold a new service file");
|
|
76
|
+
logger.info("");
|
|
77
|
+
logger.info("Options:");
|
|
78
|
+
logger.info(" --verbose, -v Show detailed output");
|
|
79
|
+
logger.info(" --root <dir> Project root directory (default: cwd)");
|
|
80
|
+
logger.info(" --json Output as JSON (for inspect commands)");
|
|
81
|
+
logger.info(" --format json Alias for --json");
|
|
82
|
+
logger.info(" --runner <runner> Override test runner (jest|vitest|rstest)");
|
|
83
|
+
logger.info(" --debug-port <port> Debug sidecar port (default: 9800)");
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
if (command === "build") {
|
|
87
|
+
const g = globalThis;
|
|
88
|
+
const proc = g["process"];
|
|
89
|
+
const cwd = proc?.cwd() ?? ".";
|
|
90
|
+
const rootDir = typeof flags["root"] === "string" ? resolve(flags["root"]) : cwd;
|
|
91
|
+
const { loadConfig: loadConf } = await import("./config.js");
|
|
92
|
+
const config = await loadConf(rootDir);
|
|
93
|
+
const { executeBuild: execBuild } = await import("./commands/build.js");
|
|
94
|
+
const result = await execBuild({
|
|
95
|
+
rootDir,
|
|
96
|
+
config,
|
|
97
|
+
logger,
|
|
98
|
+
verbose,
|
|
99
|
+
});
|
|
100
|
+
return result.success ? 0 : 1;
|
|
101
|
+
}
|
|
102
|
+
if (command === "dev") {
|
|
103
|
+
const g = globalThis;
|
|
104
|
+
const proc = g["process"];
|
|
105
|
+
const cwd = proc?.cwd() ?? ".";
|
|
106
|
+
const rootDir = typeof flags["root"] === "string" ? resolve(flags["root"]) : cwd;
|
|
107
|
+
const debugPort = typeof flags["debug-port"] === "string"
|
|
108
|
+
? parseInt(flags["debug-port"], 10)
|
|
109
|
+
: 9800;
|
|
110
|
+
const { loadConfig: loadConf } = await import("./config.js");
|
|
111
|
+
const config = await loadConf(rootDir);
|
|
112
|
+
const { executeDev: execDev } = await import("./commands/dev.js");
|
|
113
|
+
const { state } = await execDev({
|
|
114
|
+
rootDir,
|
|
115
|
+
config,
|
|
116
|
+
logger,
|
|
117
|
+
verbose,
|
|
118
|
+
debugPort,
|
|
119
|
+
});
|
|
120
|
+
// Keep running until stopped (dev mode is long-running)
|
|
121
|
+
// The executeDev function sets up watchers and signal handlers
|
|
122
|
+
// We return 0 when it stops
|
|
123
|
+
if (!state.running) {
|
|
124
|
+
return 1;
|
|
125
|
+
}
|
|
126
|
+
// In a real scenario, we'd await a signal here
|
|
127
|
+
// For now, return 0 to indicate successful start
|
|
128
|
+
return 0;
|
|
129
|
+
}
|
|
130
|
+
if (command.startsWith("generate:")) {
|
|
131
|
+
const g = globalThis;
|
|
132
|
+
const proc = g["process"];
|
|
133
|
+
const cwd = proc?.cwd() ?? ".";
|
|
134
|
+
const rootDir = typeof flags["root"] === "string" ? resolve(flags["root"]) : cwd;
|
|
135
|
+
const { loadConfig: loadConf } = await import("./config.js");
|
|
136
|
+
const config = await loadConf(rootDir);
|
|
137
|
+
const subcommand = command.slice("generate:".length);
|
|
138
|
+
const { executeGenerate: execGenerate } = await import("./commands/generate.js");
|
|
139
|
+
const result = await execGenerate({
|
|
140
|
+
rootDir,
|
|
141
|
+
config,
|
|
142
|
+
logger,
|
|
143
|
+
subcommand,
|
|
144
|
+
flags,
|
|
145
|
+
verbose,
|
|
146
|
+
});
|
|
147
|
+
return result.success ? 0 : 1;
|
|
148
|
+
}
|
|
149
|
+
if (command.startsWith("migrate:")) {
|
|
150
|
+
const g = globalThis;
|
|
151
|
+
const proc = g["process"];
|
|
152
|
+
const cwd = proc?.cwd() ?? ".";
|
|
153
|
+
const rootDir = typeof flags["root"] === "string" ? resolve(flags["root"]) : cwd;
|
|
154
|
+
const { loadConfig: loadConf } = await import("./config.js");
|
|
155
|
+
const config = await loadConf(rootDir);
|
|
156
|
+
const subcommand = command.slice("migrate:".length);
|
|
157
|
+
const { executeMigrate: execMigrate } = await import("./commands/migrate.js");
|
|
158
|
+
const result = await execMigrate({
|
|
159
|
+
rootDir,
|
|
160
|
+
config,
|
|
161
|
+
logger,
|
|
162
|
+
subcommand,
|
|
163
|
+
flags,
|
|
164
|
+
verbose,
|
|
165
|
+
});
|
|
166
|
+
return result.success ? 0 : 1;
|
|
167
|
+
}
|
|
168
|
+
if (command === "inspect") {
|
|
169
|
+
const g = globalThis;
|
|
170
|
+
const proc = g["process"];
|
|
171
|
+
const cwd = proc?.cwd() ?? ".";
|
|
172
|
+
const rootDir = typeof flags["root"] === "string" ? resolve(flags["root"]) : cwd;
|
|
173
|
+
const { loadConfig: loadConf } = await import("./config.js");
|
|
174
|
+
const config = await loadConf(rootDir);
|
|
175
|
+
const { executeInspect: execInspect } = await import("./commands/inspect.js");
|
|
176
|
+
const subcommand = positional[0] ?? "";
|
|
177
|
+
const subPositional = positional.slice(1);
|
|
178
|
+
const result = await execInspect({
|
|
179
|
+
rootDir,
|
|
180
|
+
config,
|
|
181
|
+
logger,
|
|
182
|
+
subcommand,
|
|
183
|
+
positional: subPositional,
|
|
184
|
+
flags,
|
|
185
|
+
});
|
|
186
|
+
return result.success ? 0 : 1;
|
|
187
|
+
}
|
|
188
|
+
if (command === "init") {
|
|
189
|
+
const g = globalThis;
|
|
190
|
+
const proc = g["process"];
|
|
191
|
+
const cwd = proc?.cwd() ?? ".";
|
|
192
|
+
const rootDir = typeof flags["root"] === "string" ? resolve(flags["root"]) : cwd;
|
|
193
|
+
const { executeScaffold: execScaffold } = await import("./commands/scaffold.js");
|
|
194
|
+
const result = await execScaffold({
|
|
195
|
+
rootDir,
|
|
196
|
+
logger,
|
|
197
|
+
subcommand: "init",
|
|
198
|
+
positional,
|
|
199
|
+
flags,
|
|
200
|
+
verbose,
|
|
201
|
+
});
|
|
202
|
+
return result.success ? 0 : 1;
|
|
203
|
+
}
|
|
204
|
+
if (command === "add") {
|
|
205
|
+
const g = globalThis;
|
|
206
|
+
const proc = g["process"];
|
|
207
|
+
const cwd = proc?.cwd() ?? ".";
|
|
208
|
+
const rootDir = typeof flags["root"] === "string" ? resolve(flags["root"]) : cwd;
|
|
209
|
+
const subcommand = positional[0] ?? "";
|
|
210
|
+
const subPositional = positional.slice(1);
|
|
211
|
+
const { executeScaffold: execScaffold } = await import("./commands/scaffold.js");
|
|
212
|
+
const result = await execScaffold({
|
|
213
|
+
rootDir,
|
|
214
|
+
logger,
|
|
215
|
+
subcommand,
|
|
216
|
+
positional: subPositional,
|
|
217
|
+
flags,
|
|
218
|
+
verbose,
|
|
219
|
+
});
|
|
220
|
+
return result.success ? 0 : 1;
|
|
221
|
+
}
|
|
222
|
+
if (command === "test" || command.startsWith("test:")) {
|
|
223
|
+
const g = globalThis;
|
|
224
|
+
const proc = g["process"];
|
|
225
|
+
const cwd = proc?.cwd() ?? ".";
|
|
226
|
+
const rootDir = typeof flags["root"] === "string" ? resolve(flags["root"]) : cwd;
|
|
227
|
+
const { loadConfig: loadConf } = await import("./config.js");
|
|
228
|
+
const config = await loadConf(rootDir);
|
|
229
|
+
const subcommand = command === "test" ? "all" : command.slice("test:".length);
|
|
230
|
+
const { executeTest: execTest } = await import("./commands/test.js");
|
|
231
|
+
const result = await execTest({
|
|
232
|
+
rootDir,
|
|
233
|
+
config,
|
|
234
|
+
logger,
|
|
235
|
+
subcommand,
|
|
236
|
+
flags,
|
|
237
|
+
verbose,
|
|
238
|
+
});
|
|
239
|
+
return result.success ? 0 : 1;
|
|
240
|
+
}
|
|
241
|
+
logger.error(`Unknown command: ${command}`);
|
|
242
|
+
logger.info("Run 'typokit help' for usage information.");
|
|
243
|
+
return 1;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=index.js.map
|