@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.
Files changed (64) hide show
  1. package/dist/bin.d.ts +3 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +13 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/commands/build.d.ts +42 -0
  6. package/dist/commands/build.d.ts.map +1 -0
  7. package/dist/commands/build.js +302 -0
  8. package/dist/commands/build.js.map +1 -0
  9. package/dist/commands/dev.d.ts +106 -0
  10. package/dist/commands/dev.d.ts.map +1 -0
  11. package/dist/commands/dev.js +536 -0
  12. package/dist/commands/dev.js.map +1 -0
  13. package/dist/commands/generate.d.ts +65 -0
  14. package/dist/commands/generate.d.ts.map +1 -0
  15. package/dist/commands/generate.js +430 -0
  16. package/dist/commands/generate.js.map +1 -0
  17. package/dist/commands/inspect.d.ts +26 -0
  18. package/dist/commands/inspect.d.ts.map +1 -0
  19. package/dist/commands/inspect.js +579 -0
  20. package/dist/commands/inspect.js.map +1 -0
  21. package/dist/commands/migrate.d.ts +70 -0
  22. package/dist/commands/migrate.d.ts.map +1 -0
  23. package/dist/commands/migrate.js +570 -0
  24. package/dist/commands/migrate.js.map +1 -0
  25. package/dist/commands/scaffold.d.ts +70 -0
  26. package/dist/commands/scaffold.d.ts.map +1 -0
  27. package/dist/commands/scaffold.js +483 -0
  28. package/dist/commands/scaffold.js.map +1 -0
  29. package/dist/commands/test.d.ts +56 -0
  30. package/dist/commands/test.d.ts.map +1 -0
  31. package/dist/commands/test.js +248 -0
  32. package/dist/commands/test.js.map +1 -0
  33. package/dist/config.d.ts +20 -0
  34. package/dist/config.d.ts.map +1 -0
  35. package/dist/config.js +69 -0
  36. package/dist/config.js.map +1 -0
  37. package/dist/index.d.ts +30 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +245 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/logger.d.ts +12 -0
  42. package/dist/logger.d.ts.map +1 -0
  43. package/dist/logger.js +33 -0
  44. package/dist/logger.js.map +1 -0
  45. package/package.json +33 -0
  46. package/src/bin.ts +22 -0
  47. package/src/commands/build.ts +433 -0
  48. package/src/commands/dev.ts +822 -0
  49. package/src/commands/generate.ts +640 -0
  50. package/src/commands/inspect.ts +885 -0
  51. package/src/commands/migrate.ts +800 -0
  52. package/src/commands/scaffold.ts +627 -0
  53. package/src/commands/test.ts +353 -0
  54. package/src/config.ts +93 -0
  55. package/src/dev.test.ts +285 -0
  56. package/src/env.d.ts +86 -0
  57. package/src/generate.test.ts +304 -0
  58. package/src/index.test.ts +217 -0
  59. package/src/index.ts +397 -0
  60. package/src/inspect.test.ts +411 -0
  61. package/src/logger.ts +49 -0
  62. package/src/migrate.test.ts +205 -0
  63. package/src/scaffold.test.ts +256 -0
  64. 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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"}
@@ -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"}
@@ -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