@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,536 @@
1
+ // @typokit/cli — Dev Command
2
+ // Starts build pipeline in watch mode + development server with hot reload
3
+ /**
4
+ * Create initial dev server state.
5
+ */
6
+ export function createDevState() {
7
+ return {
8
+ running: false,
9
+ stopWatcher: null,
10
+ trackedFiles: new Map(),
11
+ depGraph: new Map(),
12
+ astCache: new Map(),
13
+ rebuildCount: 0,
14
+ lastRebuildMs: 0,
15
+ serverPid: null,
16
+ };
17
+ }
18
+ /**
19
+ * Resolve glob patterns to actual file paths with their mtimes.
20
+ */
21
+ async function resolveFilesWithMtime(rootDir, patterns) {
22
+ const { join, resolve } = (await import(/* @vite-ignore */ "path"));
23
+ const { readdirSync, statSync, existsSync } = (await import(
24
+ /* @vite-ignore */ "fs"));
25
+ const files = [];
26
+ for (const pattern of patterns) {
27
+ if (pattern.includes("*")) {
28
+ const parts = pattern.split("/");
29
+ const hasDoubleGlob = parts.includes("**");
30
+ const lastPart = parts[parts.length - 1];
31
+ const baseParts = [];
32
+ for (const part of parts) {
33
+ if (part.includes("*"))
34
+ break;
35
+ baseParts.push(part);
36
+ }
37
+ const baseDir = baseParts.length > 0 ? join(rootDir, ...baseParts) : rootDir;
38
+ if (!existsSync(baseDir))
39
+ continue;
40
+ const entries = hasDoubleGlob
41
+ ? listFilesRecursive(baseDir, existsSync, readdirSync, statSync, join)
42
+ : readdirSync(baseDir).map((f) => join(baseDir, f));
43
+ const filePattern = lastPart.replace(/\*/g, ".*");
44
+ const regex = new RegExp(`^${filePattern}$`);
45
+ for (const entry of entries) {
46
+ const name = entry.split(/[\\/]/).pop() ?? "";
47
+ if (regex.test(name)) {
48
+ const fullPath = resolve(entry);
49
+ try {
50
+ const stat = statSync(fullPath);
51
+ if (stat.isFile()) {
52
+ files.push({ path: fullPath, mtime: stat.mtimeMs });
53
+ }
54
+ }
55
+ catch {
56
+ // Skip files that can't be stat'd
57
+ }
58
+ }
59
+ }
60
+ }
61
+ else {
62
+ const fullPath = resolve(join(rootDir, pattern));
63
+ if (existsSync(fullPath)) {
64
+ try {
65
+ const stat = statSync(fullPath);
66
+ if (stat.isFile()) {
67
+ files.push({ path: fullPath, mtime: stat.mtimeMs });
68
+ }
69
+ }
70
+ catch {
71
+ // Skip
72
+ }
73
+ }
74
+ }
75
+ }
76
+ // Deduplicate by path
77
+ const seen = new Set();
78
+ return files
79
+ .filter((f) => {
80
+ if (seen.has(f.path))
81
+ return false;
82
+ seen.add(f.path);
83
+ return true;
84
+ })
85
+ .sort((a, b) => a.path.localeCompare(b.path));
86
+ }
87
+ function listFilesRecursive(dir, existsSync, readdirSync, statSync, join) {
88
+ if (!existsSync(dir))
89
+ return [];
90
+ const results = [];
91
+ const entries = readdirSync(dir);
92
+ for (const entry of entries) {
93
+ const fullPath = join(dir, entry);
94
+ try {
95
+ const stat = statSync(fullPath);
96
+ if (stat.isDirectory()) {
97
+ if (entry !== "node_modules" &&
98
+ entry !== "dist" &&
99
+ entry !== ".typokit") {
100
+ results.push(...listFilesRecursive(fullPath, existsSync, readdirSync, statSync, join));
101
+ }
102
+ }
103
+ else if (stat.isFile()) {
104
+ results.push(fullPath);
105
+ }
106
+ }
107
+ catch {
108
+ // Skip
109
+ }
110
+ }
111
+ return results;
112
+ }
113
+ /**
114
+ * Detect which files have changed since last check.
115
+ */
116
+ export function detectChangedFiles(state, currentFiles) {
117
+ const changed = [];
118
+ const added = [];
119
+ const removed = [];
120
+ const currentPaths = new Set(currentFiles.map((f) => f.path));
121
+ // Check for changed and added files
122
+ for (const file of currentFiles) {
123
+ const tracked = state.trackedFiles.get(file.path);
124
+ if (!tracked) {
125
+ added.push(file);
126
+ }
127
+ else if (file.mtime > tracked.mtime) {
128
+ changed.push(file);
129
+ }
130
+ }
131
+ // Check for removed files
132
+ for (const path of state.trackedFiles.keys()) {
133
+ if (!currentPaths.has(path)) {
134
+ removed.push(path);
135
+ }
136
+ }
137
+ return { changed, added, removed };
138
+ }
139
+ /**
140
+ * Update the tracked files in state.
141
+ */
142
+ export function updateTrackedFiles(state, files) {
143
+ state.trackedFiles.clear();
144
+ for (const file of files) {
145
+ state.trackedFiles.set(file.path, file);
146
+ }
147
+ }
148
+ /**
149
+ * Build the dependency graph from type and route files.
150
+ * Maps each source file to the outputs it affects.
151
+ */
152
+ export function buildDepGraph(typeFiles, routeFiles) {
153
+ const graph = new Map();
154
+ for (const file of typeFiles) {
155
+ graph.set(file, {
156
+ category: "type",
157
+ affectedOutputs: ["validators", "schemas/openapi.json"],
158
+ });
159
+ }
160
+ for (const file of routeFiles) {
161
+ graph.set(file, {
162
+ category: "route",
163
+ affectedOutputs: [
164
+ "routes/compiled-router.ts",
165
+ "schemas/openapi.json",
166
+ "tests/contract.test.ts",
167
+ ],
168
+ });
169
+ }
170
+ return graph;
171
+ }
172
+ /**
173
+ * Determine which outputs need regeneration based on changed files.
174
+ */
175
+ export function getAffectedOutputs(depGraph, changedFiles) {
176
+ const affected = new Set();
177
+ for (const file of changedFiles) {
178
+ const entry = depGraph.get(file);
179
+ if (entry) {
180
+ for (const output of entry.affectedOutputs) {
181
+ affected.add(output);
182
+ }
183
+ }
184
+ }
185
+ return affected;
186
+ }
187
+ /**
188
+ * Check if a file's AST cache is still valid.
189
+ */
190
+ export function isCacheValid(cache, filePath, currentMtime) {
191
+ const entry = cache.get(filePath);
192
+ if (!entry)
193
+ return false;
194
+ return entry.mtime === currentMtime;
195
+ }
196
+ /**
197
+ * Update the AST cache for a file.
198
+ */
199
+ export function updateCache(cache, filePath, mtime) {
200
+ cache.set(filePath, {
201
+ mtime,
202
+ hash: `${filePath}:${mtime}`,
203
+ });
204
+ }
205
+ /**
206
+ * Run an incremental rebuild for changed files only.
207
+ * Returns the files that were actually re-processed.
208
+ */
209
+ export async function incrementalRebuild(options, state, changedPaths) {
210
+ const startTime = Date.now();
211
+ const { config, logger, verbose } = options;
212
+ // Determine affected outputs
213
+ const affected = getAffectedOutputs(state.depGraph, changedPaths);
214
+ if (affected.size === 0) {
215
+ logger.verbose("No affected outputs — skipping rebuild");
216
+ return { success: true, duration: 0, filesProcessed: 0 };
217
+ }
218
+ if (verbose) {
219
+ logger.verbose(`Affected outputs: ${[...affected].join(", ")}`);
220
+ }
221
+ // Filter to only changed files that aren't cache-valid
222
+ const filesToProcess = [];
223
+ for (const path of changedPaths) {
224
+ const tracked = state.trackedFiles.get(path);
225
+ if (tracked && !isCacheValid(state.astCache, path, tracked.mtime)) {
226
+ filesToProcess.push(path);
227
+ }
228
+ }
229
+ if (filesToProcess.length === 0) {
230
+ logger.verbose("All changed files still cached — skipping rebuild");
231
+ return { success: true, duration: 0, filesProcessed: 0 };
232
+ }
233
+ logger.step("rebuild", `Incremental rebuild: ${filesToProcess.length} file(s) changed`);
234
+ try {
235
+ // Re-run the native transform pipeline with all files
236
+ // (the pipeline is fast enough, and the Rust side handles caching)
237
+ const allTypeFiles = [...state.depGraph.entries()]
238
+ .filter(([, e]) => e.category === "type")
239
+ .map(([p]) => p);
240
+ const allRouteFiles = [...state.depGraph.entries()]
241
+ .filter(([, e]) => e.category === "route")
242
+ .map(([p]) => p);
243
+ const { buildPipeline } = (await import(
244
+ /* @vite-ignore */ "@typokit/transform-native"));
245
+ const result = await buildPipeline({
246
+ typeFiles: allTypeFiles,
247
+ routeFiles: allRouteFiles,
248
+ outputDir: config.outputDir,
249
+ });
250
+ // Update AST cache for processed files
251
+ for (const path of filesToProcess) {
252
+ const tracked = state.trackedFiles.get(path);
253
+ if (tracked) {
254
+ updateCache(state.astCache, path, tracked.mtime);
255
+ }
256
+ }
257
+ const duration = Date.now() - startTime;
258
+ state.lastRebuildMs = duration;
259
+ state.rebuildCount++;
260
+ if (result.regenerated) {
261
+ logger.success(`Rebuild complete in ${duration}ms — ${result.filesWritten.length} files written`);
262
+ }
263
+ else {
264
+ logger.success(`Rebuild complete in ${duration}ms — cache hit`);
265
+ }
266
+ return { success: true, duration, filesProcessed: filesToProcess.length };
267
+ }
268
+ catch (err) {
269
+ const message = err instanceof Error ? err.message : String(err);
270
+ logger.error(`Rebuild failed: ${message}`);
271
+ const duration = Date.now() - startTime;
272
+ return { success: false, duration, filesProcessed: filesToProcess.length };
273
+ }
274
+ }
275
+ /**
276
+ * Start file watching using fs.watch (recursive where supported).
277
+ * Falls back to polling on platforms that don't support recursive.
278
+ */
279
+ async function startFileWatcher(options, state, onChanges) {
280
+ const { rootDir, config, logger, verbose } = options;
281
+ // Collect directories to watch based on config patterns
282
+ const watchDirs = new Set();
283
+ const { join } = (await import(/* @vite-ignore */ "path"));
284
+ const { existsSync } = (await import(/* @vite-ignore */ "fs"));
285
+ // Watch the src directory by default
286
+ const srcDir = join(rootDir, "src");
287
+ if (existsSync(srcDir)) {
288
+ watchDirs.add(srcDir);
289
+ }
290
+ else {
291
+ watchDirs.add(rootDir);
292
+ }
293
+ if (verbose) {
294
+ logger.verbose(`Watching directories: ${[...watchDirs].join(", ")}`);
295
+ }
296
+ // Debounce timer to batch rapid changes
297
+ const g = globalThis;
298
+ let debounceTimer = null;
299
+ const pendingChanges = new Set();
300
+ const DEBOUNCE_MS = 50;
301
+ const watchers = [];
302
+ try {
303
+ const fs = (await import(/* @vite-ignore */ "fs"));
304
+ for (const dir of watchDirs) {
305
+ const watcher = fs.watch(dir, { recursive: true }, (_event, filename) => {
306
+ if (!filename)
307
+ return;
308
+ const fullPath = join(dir, filename);
309
+ // Only track .ts files matching our patterns
310
+ if (!fullPath.endsWith(".ts"))
311
+ return;
312
+ // Check if this file is in our tracked set
313
+ if (state.trackedFiles.has(fullPath) ||
314
+ state.depGraph.has(fullPath)) {
315
+ pendingChanges.add(fullPath);
316
+ }
317
+ else {
318
+ // Could be a new file matching our patterns — add it
319
+ const isTypePattern = config.typeFiles.some((p) => matchesGlobPattern(fullPath, rootDir, p));
320
+ const isRoutePattern = config.routeFiles.some((p) => matchesGlobPattern(fullPath, rootDir, p));
321
+ if (isTypePattern || isRoutePattern) {
322
+ pendingChanges.add(fullPath);
323
+ }
324
+ }
325
+ // Debounce
326
+ if (debounceTimer) {
327
+ g.clearTimeout(debounceTimer);
328
+ }
329
+ debounceTimer = g.setTimeout(() => {
330
+ const changes = [...pendingChanges];
331
+ pendingChanges.clear();
332
+ if (changes.length > 0) {
333
+ onChanges(changes);
334
+ }
335
+ }, DEBOUNCE_MS);
336
+ });
337
+ watchers.push(watcher);
338
+ }
339
+ }
340
+ catch (err) {
341
+ const message = err instanceof Error ? err.message : String(err);
342
+ logger.warn(`fs.watch failed: ${message} — falling back to polling`);
343
+ // Polling fallback
344
+ const gTimer = globalThis;
345
+ const POLL_INTERVAL = 500;
346
+ const pollTimer = gTimer.setInterval(async () => {
347
+ const typeFiles = await resolveFilesWithMtime(rootDir, config.typeFiles);
348
+ const routeFiles = await resolveFilesWithMtime(rootDir, config.routeFiles);
349
+ const allFiles = [...typeFiles, ...routeFiles];
350
+ const { changed, added, removed } = detectChangedFiles(state, allFiles);
351
+ const changedPaths = [
352
+ ...changed.map((f) => f.path),
353
+ ...added.map((f) => f.path),
354
+ ...removed,
355
+ ];
356
+ if (changedPaths.length > 0) {
357
+ updateTrackedFiles(state, allFiles);
358
+ onChanges(changedPaths);
359
+ }
360
+ }, POLL_INTERVAL);
361
+ return () => {
362
+ gTimer.clearInterval(pollTimer);
363
+ };
364
+ }
365
+ logger.step("watch", `File watcher started`);
366
+ return () => {
367
+ for (const watcher of watchers) {
368
+ watcher.close();
369
+ }
370
+ if (debounceTimer) {
371
+ g.clearTimeout(debounceTimer);
372
+ }
373
+ };
374
+ }
375
+ /**
376
+ * Simple glob pattern matching for a file against a pattern.
377
+ */
378
+ function matchesGlobPattern(filePath, rootDir, pattern) {
379
+ // Normalize separators
380
+ const normalized = filePath.replace(/\\/g, "/");
381
+ const normalizedRoot = rootDir.replace(/\\/g, "/");
382
+ // Get relative path
383
+ let relative = normalized;
384
+ if (normalized.startsWith(normalizedRoot)) {
385
+ relative = normalized.slice(normalizedRoot.length).replace(/^\//, "");
386
+ }
387
+ // Convert glob to regex
388
+ const regexStr = pattern
389
+ .replace(/\*\*/g, "___DOUBLESTAR___")
390
+ .replace(/\*/g, "[^/]*")
391
+ .replace(/___DOUBLESTAR___/g, ".*");
392
+ const regex = new RegExp(`^${regexStr}$`);
393
+ return regex.test(relative);
394
+ }
395
+ /**
396
+ * Execute the dev command.
397
+ *
398
+ * 1. Run initial full build
399
+ * 2. Start file watcher for incremental rebuilds
400
+ * 3. Start the development server (delegates to server adapter)
401
+ * 4. Handle graceful shutdown
402
+ */
403
+ export async function executeDev(options) {
404
+ const { config, rootDir, logger, verbose, debugPort } = options;
405
+ logger.step("dev", "Starting development mode...");
406
+ if (verbose) {
407
+ logger.verbose(`Debug port: ${debugPort}`);
408
+ logger.verbose(`Root: ${rootDir}`);
409
+ }
410
+ const state = createDevState();
411
+ // Step 1: Resolve all source files
412
+ logger.step("dev", "Resolving source files...");
413
+ const typeFiles = await resolveFilesWithMtime(rootDir, config.typeFiles);
414
+ const routeFiles = await resolveFilesWithMtime(rootDir, config.routeFiles);
415
+ const allFiles = [...typeFiles, ...routeFiles];
416
+ logger.step("dev", `Found ${typeFiles.length} type file(s), ${routeFiles.length} route file(s)`);
417
+ // Initialize tracked files
418
+ updateTrackedFiles(state, allFiles);
419
+ // Build dependency graph
420
+ state.depGraph = buildDepGraph(typeFiles.map((f) => f.path), routeFiles.map((f) => f.path));
421
+ // Step 2: Run initial full build
422
+ logger.step("dev", "Running initial build...");
423
+ const initialBuild = await runFullBuild(options, state);
424
+ if (!initialBuild.success) {
425
+ logger.error("Initial build failed — watching for changes to retry...");
426
+ }
427
+ else {
428
+ logger.success(`Initial build complete in ${initialBuild.duration}ms`);
429
+ }
430
+ // Step 3: Start file watcher
431
+ state.running = true;
432
+ const stopWatcher = await startFileWatcher(options, state, async (changedPaths) => {
433
+ if (!state.running)
434
+ return;
435
+ const fileNames = changedPaths
436
+ .map((p) => p.split(/[\\/]/).pop())
437
+ .join(", ");
438
+ logger.step("change", `Detected: ${fileNames}`);
439
+ // Re-resolve files to get updated mtimes
440
+ const updatedTypeFiles = await resolveFilesWithMtime(rootDir, config.typeFiles);
441
+ const updatedRouteFiles = await resolveFilesWithMtime(rootDir, config.routeFiles);
442
+ const updatedFiles = [...updatedTypeFiles, ...updatedRouteFiles];
443
+ // Update tracked files and dep graph
444
+ updateTrackedFiles(state, updatedFiles);
445
+ state.depGraph = buildDepGraph(updatedTypeFiles.map((f) => f.path), updatedRouteFiles.map((f) => f.path));
446
+ // Incremental rebuild
447
+ const result = await incrementalRebuild(options, state, changedPaths);
448
+ if (result.success) {
449
+ logger.step("ready", `Server ready — rebuild #${state.rebuildCount} (${result.duration}ms)`);
450
+ }
451
+ });
452
+ state.stopWatcher = stopWatcher;
453
+ // Step 4: Setup graceful shutdown
454
+ const stop = () => {
455
+ if (!state.running)
456
+ return;
457
+ state.running = false;
458
+ logger.step("dev", "Shutting down...");
459
+ if (state.stopWatcher) {
460
+ state.stopWatcher();
461
+ state.stopWatcher = null;
462
+ }
463
+ logger.step("dev", "Dev server stopped");
464
+ };
465
+ // Register signal handlers for graceful shutdown
466
+ const g = globalThis;
467
+ const proc = g["process"];
468
+ const sigintHandler = () => stop();
469
+ const sigtermHandler = () => stop();
470
+ if (proc) {
471
+ proc.on("SIGINT", sigintHandler);
472
+ proc.on("SIGTERM", sigtermHandler);
473
+ }
474
+ logger.success("Dev mode active — watching for changes (Ctrl+C to stop)");
475
+ logger.step("dev", `Debug sidecar port: ${debugPort}`);
476
+ return { state, stop };
477
+ }
478
+ /**
479
+ * Run a full build (used for initial build in dev mode).
480
+ */
481
+ async function runFullBuild(options, state) {
482
+ const startTime = Date.now();
483
+ const { config, logger, verbose } = options;
484
+ const outputs = [];
485
+ const errors = [];
486
+ const typeFiles = [...state.depGraph.entries()]
487
+ .filter(([, e]) => e.category === "type")
488
+ .map(([p]) => p);
489
+ const routeFiles = [...state.depGraph.entries()]
490
+ .filter(([, e]) => e.category === "route")
491
+ .map(([p]) => p);
492
+ if (typeFiles.length > 0 || routeFiles.length > 0) {
493
+ try {
494
+ const { buildPipeline } = (await import(
495
+ /* @vite-ignore */ "@typokit/transform-native"));
496
+ const result = await buildPipeline({
497
+ typeFiles,
498
+ routeFiles,
499
+ outputDir: config.outputDir,
500
+ });
501
+ if (result.regenerated) {
502
+ for (const f of result.filesWritten) {
503
+ outputs.push({ filePath: f, content: "", overwrite: true });
504
+ }
505
+ }
506
+ // Initialize AST cache for all files
507
+ for (const [path, tracked] of state.trackedFiles) {
508
+ updateCache(state.astCache, path, tracked.mtime);
509
+ }
510
+ if (verbose) {
511
+ logger.verbose(`Content hash: ${result.contentHash}`);
512
+ }
513
+ }
514
+ catch (err) {
515
+ const message = err instanceof Error ? err.message : String(err);
516
+ logger.error(`Transform failed: ${message}`);
517
+ errors.push(`Transform error: ${message}`);
518
+ return {
519
+ success: false,
520
+ outputs,
521
+ duration: Date.now() - startTime,
522
+ errors,
523
+ };
524
+ }
525
+ }
526
+ const duration = Date.now() - startTime;
527
+ state.rebuildCount++;
528
+ state.lastRebuildMs = duration;
529
+ return {
530
+ success: true,
531
+ outputs,
532
+ duration,
533
+ errors: [],
534
+ };
535
+ }
536
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { CliLogger } from "../logger.js";
2
+ import type { TypoKitConfig } from "../config.js";
3
+ export interface GenerateCommandOptions {
4
+ /** Project root directory */
5
+ rootDir: string;
6
+ /** Resolved configuration */
7
+ config: Required<TypoKitConfig>;
8
+ /** Logger instance */
9
+ logger: CliLogger;
10
+ /** Generate subcommand: db, client, openapi, tests */
11
+ subcommand: string;
12
+ /** CLI flags */
13
+ flags: Record<string, string | boolean>;
14
+ /** Whether verbose mode is enabled */
15
+ verbose: boolean;
16
+ }
17
+ export interface GenerateResult {
18
+ /** Whether the command succeeded */
19
+ success: boolean;
20
+ /** Files generated or updated */
21
+ filesWritten: string[];
22
+ /** Duration in milliseconds */
23
+ duration: number;
24
+ /** Errors encountered */
25
+ errors: string[];
26
+ }
27
+ /**
28
+ * Resolve glob patterns to actual file paths.
29
+ * Reuses the same approach as build.ts.
30
+ */
31
+ declare function resolveFilePatterns(rootDir: string, patterns: string[]): Promise<string[]>;
32
+ /**
33
+ * Generate database schema artifacts using the configured database adapter.
34
+ *
35
+ * Resolves type files, extracts type metadata, and calls the database adapter's
36
+ * generate() method. If no adapter is configured, reports a helpful error.
37
+ */
38
+ declare function generateDb(options: GenerateCommandOptions): Promise<GenerateResult>;
39
+ /**
40
+ * Generate a type-safe API client from route contracts.
41
+ *
42
+ * Reads compiled routes from the .typokit/ directory and generates
43
+ * a TypeScript client module.
44
+ */
45
+ declare function generateClient(options: GenerateCommandOptions): Promise<GenerateResult>;
46
+ /**
47
+ * Generate a type-safe fetch client TypeScript module from compiled routes.
48
+ */
49
+ declare function generateClientCode(compiledRoutes: string): string;
50
+ /**
51
+ * Generate OpenAPI 3.1 specification.
52
+ * Supports --output <path> flag for custom output location.
53
+ */
54
+ declare function generateOpenapi(options: GenerateCommandOptions): Promise<GenerateResult>;
55
+ /**
56
+ * Regenerate contract tests from route schemas.
57
+ */
58
+ declare function generateTests(options: GenerateCommandOptions): Promise<GenerateResult>;
59
+ /**
60
+ * Execute a generate subcommand.
61
+ * Dispatches to the appropriate generator based on the subcommand.
62
+ */
63
+ export declare function executeGenerate(options: GenerateCommandOptions): Promise<GenerateResult>;
64
+ export { generateDb, generateClient, generateOpenapi, generateTests, generateClientCode, resolveFilePatterns as resolveGenerateFilePatterns, };
65
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAChC,sBAAsB;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACxC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,iBAAe,mBAAmB,CAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqDnB;AA0CD;;;;;GAKG;AACH,iBAAe,UAAU,CACvB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAyHzB;AAED;;;;;GAKG;AACH,iBAAe,cAAc,CAC3B,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CA4EzB;AAED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAiF1D;AAED;;;GAGG;AACH,iBAAe,eAAe,CAC5B,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CA+EzB;AAED;;GAEG;AACH,iBAAe,aAAa,CAC1B,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAuEzB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAsBzB;AAGD,OAAO,EACL,UAAU,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,mBAAmB,IAAI,2BAA2B,GACnD,CAAC"}