@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,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"}
|