@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,579 @@
|
|
|
1
|
+
// @typokit/cli — Inspect Commands
|
|
2
|
+
// Subcommands for querying framework internal state as structured JSON
|
|
3
|
+
// ─── Output Formatting ──────────────────────────────────────
|
|
4
|
+
function isJsonOutput(flags) {
|
|
5
|
+
return flags["json"] === true || flags["format"] === "json";
|
|
6
|
+
}
|
|
7
|
+
function writeOutput(data, json, logger) {
|
|
8
|
+
const g = globalThis;
|
|
9
|
+
const proc = g["process"];
|
|
10
|
+
const stdout = proc?.stdout ?? { write: () => { } };
|
|
11
|
+
if (json) {
|
|
12
|
+
stdout.write(JSON.stringify(data, null, 2) + "\n");
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
formatHumanReadable(data, logger);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function formatHumanReadable(data, logger) {
|
|
19
|
+
if (Array.isArray(data)) {
|
|
20
|
+
for (const item of data) {
|
|
21
|
+
if (typeof item === "object" && item !== null) {
|
|
22
|
+
const obj = item;
|
|
23
|
+
if ("method" in obj && "path" in obj) {
|
|
24
|
+
// Route info
|
|
25
|
+
logger.info(` ${String(obj["method"])} ${String(obj["path"])}`);
|
|
26
|
+
if (obj["params"])
|
|
27
|
+
logger.info(` params: ${JSON.stringify(obj["params"])}`);
|
|
28
|
+
if (obj["handler"])
|
|
29
|
+
logger.info(` handler: ${String(obj["handler"])}`);
|
|
30
|
+
}
|
|
31
|
+
else if ("name" in obj && "priority" in obj) {
|
|
32
|
+
// Middleware info
|
|
33
|
+
logger.info(` [${String(obj["priority"])}] ${String(obj["name"])} (${String(obj["type"])})`);
|
|
34
|
+
}
|
|
35
|
+
else if ("name" in obj && "dependsOn" in obj) {
|
|
36
|
+
// Dependency node
|
|
37
|
+
const deps = obj["dependsOn"];
|
|
38
|
+
logger.info(` ${String(obj["name"])} → ${deps.length > 0 ? deps.join(", ") : "(none)"}`);
|
|
39
|
+
}
|
|
40
|
+
else if ("name" in obj && "order" in obj) {
|
|
41
|
+
// Build hook
|
|
42
|
+
logger.info(` ${String(obj["order"])}. ${String(obj["name"])}: ${String(obj["description"])}`);
|
|
43
|
+
}
|
|
44
|
+
else if ("timestamp" in obj && "code" in obj) {
|
|
45
|
+
// Error entry
|
|
46
|
+
logger.info(` [${String(obj["timestamp"])}] ${String(obj["code"])}: ${String(obj["message"])}`);
|
|
47
|
+
if (obj["route"])
|
|
48
|
+
logger.info(` route: ${String(obj["route"])}`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
logger.info(` ${JSON.stringify(obj)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
logger.info(` ${String(item)}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else if (typeof data === "object" && data !== null) {
|
|
60
|
+
const obj = data;
|
|
61
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
62
|
+
if (typeof value === "object" && value !== null) {
|
|
63
|
+
logger.info(`${key}:`);
|
|
64
|
+
formatHumanReadable(value, logger);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
logger.info(` ${key}: ${String(value)}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
logger.info(String(data));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ─── Subcommand Implementations ─────────────────────────────
|
|
76
|
+
async function readGeneratedFile(rootDir, config, relativePath) {
|
|
77
|
+
const { join } = (await import(/* @vite-ignore */ "path"));
|
|
78
|
+
const { existsSync, readFileSync } = (await import(
|
|
79
|
+
/* @vite-ignore */ "fs"));
|
|
80
|
+
const filePath = join(rootDir, config.outputDir, relativePath);
|
|
81
|
+
if (!existsSync(filePath)) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return readFileSync(filePath, "utf-8");
|
|
85
|
+
}
|
|
86
|
+
/** Parse route entries from compiled router TypeScript output */
|
|
87
|
+
function parseRoutesFromCompiled(content) {
|
|
88
|
+
const routes = [];
|
|
89
|
+
// The compiled router contains route definitions as a radix tree structure
|
|
90
|
+
// Parse the route entries from comment blocks or structured data
|
|
91
|
+
const routePattern = /\/\/ Route: (GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS) ([^\n]+)/g;
|
|
92
|
+
let match;
|
|
93
|
+
while ((match = routePattern.exec(content)) !== null) {
|
|
94
|
+
routes.push({
|
|
95
|
+
method: match[1],
|
|
96
|
+
path: match[2].trim(),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// Also try to extract from the TypeScript type annotations
|
|
100
|
+
// Pattern: "METHOD /path" in route table keys
|
|
101
|
+
const keyPattern = /"(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS) (\/[^"]+)"/g;
|
|
102
|
+
while ((match = keyPattern.exec(content)) !== null) {
|
|
103
|
+
const method = match[1];
|
|
104
|
+
const path = match[2];
|
|
105
|
+
// Avoid duplicates
|
|
106
|
+
if (!routes.some((r) => r.method === method && r.path === path)) {
|
|
107
|
+
const params = [];
|
|
108
|
+
const paramPattern = /:(\w+)/g;
|
|
109
|
+
let paramMatch;
|
|
110
|
+
while ((paramMatch = paramPattern.exec(path)) !== null) {
|
|
111
|
+
params.push(paramMatch[1]);
|
|
112
|
+
}
|
|
113
|
+
routes.push({
|
|
114
|
+
method,
|
|
115
|
+
path,
|
|
116
|
+
params: params.length > 0 ? params : undefined,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return routes;
|
|
121
|
+
}
|
|
122
|
+
/** Parse schema types from OpenAPI or type metadata files */
|
|
123
|
+
function parseSchemaFromOpenApi(content, typeName) {
|
|
124
|
+
try {
|
|
125
|
+
const spec = JSON.parse(content);
|
|
126
|
+
const schemas = [];
|
|
127
|
+
const componentSchemas = spec.components?.schemas ?? {};
|
|
128
|
+
for (const [name, schema] of Object.entries(componentSchemas)) {
|
|
129
|
+
if (typeName && name !== typeName)
|
|
130
|
+
continue;
|
|
131
|
+
const properties = {};
|
|
132
|
+
const required = schema.required ?? [];
|
|
133
|
+
if (schema.properties) {
|
|
134
|
+
for (const [propName, propDef] of Object.entries(schema.properties)) {
|
|
135
|
+
properties[propName] = {
|
|
136
|
+
type: propDef.type ?? "unknown",
|
|
137
|
+
optional: !required.includes(propName) ? true : undefined,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Find where this type is used in paths
|
|
142
|
+
const usedIn = [];
|
|
143
|
+
if (spec.paths) {
|
|
144
|
+
for (const [pathKey, methods] of Object.entries(spec.paths)) {
|
|
145
|
+
for (const [method, operation] of Object.entries(methods)) {
|
|
146
|
+
const refPattern = `#/components/schemas/${name}`;
|
|
147
|
+
const opStr = JSON.stringify(operation);
|
|
148
|
+
if (opStr.includes(refPattern)) {
|
|
149
|
+
usedIn.push(`${method.toUpperCase()} ${pathKey}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
schemas.push({ name, properties, usedIn });
|
|
155
|
+
}
|
|
156
|
+
return schemas;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export async function inspectRoutes(rootDir, config) {
|
|
163
|
+
const content = await readGeneratedFile(rootDir, config, "routes/compiled-router.ts");
|
|
164
|
+
if (!content) {
|
|
165
|
+
return {
|
|
166
|
+
success: false,
|
|
167
|
+
data: [],
|
|
168
|
+
error: "No compiled routes found. Run 'typokit build' first.",
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const routes = parseRoutesFromCompiled(content);
|
|
172
|
+
// Also try to enrich from OpenAPI spec
|
|
173
|
+
const openApiContent = await readGeneratedFile(rootDir, config, "schemas/openapi.json");
|
|
174
|
+
if (openApiContent) {
|
|
175
|
+
try {
|
|
176
|
+
const spec = JSON.parse(openApiContent);
|
|
177
|
+
if (spec.paths) {
|
|
178
|
+
for (const route of routes) {
|
|
179
|
+
const pathEntry = spec.paths[route.path];
|
|
180
|
+
if (!pathEntry)
|
|
181
|
+
continue;
|
|
182
|
+
const methodEntry = pathEntry[route.method.toLowerCase()];
|
|
183
|
+
if (!methodEntry)
|
|
184
|
+
continue;
|
|
185
|
+
// Extract query params
|
|
186
|
+
if (methodEntry.parameters) {
|
|
187
|
+
const queryParams = {};
|
|
188
|
+
for (const param of methodEntry.parameters) {
|
|
189
|
+
if (param.in === "query") {
|
|
190
|
+
queryParams[param.name] = param.schema?.type ?? "string";
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (Object.keys(queryParams).length > 0) {
|
|
194
|
+
route.query = queryParams;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Extract body ref
|
|
198
|
+
const bodyContent = methodEntry.requestBody?.content;
|
|
199
|
+
if (bodyContent) {
|
|
200
|
+
const jsonBody = bodyContent["application/json"];
|
|
201
|
+
if (jsonBody?.schema) {
|
|
202
|
+
route.body =
|
|
203
|
+
jsonBody.schema["$ref"]?.replace("#/components/schemas/", "") ??
|
|
204
|
+
jsonBody.schema.type;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Extract response ref
|
|
208
|
+
const resp200 = methodEntry.responses?.["200"];
|
|
209
|
+
if (resp200?.content) {
|
|
210
|
+
const jsonResp = resp200.content["application/json"];
|
|
211
|
+
if (jsonResp?.schema) {
|
|
212
|
+
route.response =
|
|
213
|
+
jsonResp.schema["$ref"]?.replace("#/components/schemas/", "") ??
|
|
214
|
+
jsonResp.schema.type;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// OpenAPI enrichment failed, continue with basic routes
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return { success: true, data: routes };
|
|
225
|
+
}
|
|
226
|
+
export async function inspectRoute(rootDir, config, routeKey) {
|
|
227
|
+
const result = await inspectRoutes(rootDir, config);
|
|
228
|
+
if (!result.success)
|
|
229
|
+
return result;
|
|
230
|
+
const routes = result.data;
|
|
231
|
+
// Match "GET /users/:id" format
|
|
232
|
+
const parts = routeKey.split(" ", 2);
|
|
233
|
+
const method = parts[0]?.toUpperCase() ?? "";
|
|
234
|
+
const path = parts[1] ?? "";
|
|
235
|
+
const found = routes.find((r) => r.method === method && r.path === path);
|
|
236
|
+
if (!found) {
|
|
237
|
+
return {
|
|
238
|
+
success: false,
|
|
239
|
+
data: null,
|
|
240
|
+
error: `Route not found: ${routeKey}`,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
return { success: true, data: found };
|
|
244
|
+
}
|
|
245
|
+
export async function inspectMiddleware(rootDir, config) {
|
|
246
|
+
// Middleware info is not persisted to disk during build.
|
|
247
|
+
// Return what we can infer from the build output or provide empty result.
|
|
248
|
+
const content = await readGeneratedFile(rootDir, config, "routes/compiled-router.ts");
|
|
249
|
+
const middleware = [];
|
|
250
|
+
if (content) {
|
|
251
|
+
// Check for middleware references in compiled output
|
|
252
|
+
const mwPattern = /middleware:\s*\[([^\]]*)\]/g;
|
|
253
|
+
let match;
|
|
254
|
+
let order = 0;
|
|
255
|
+
while ((match = mwPattern.exec(content)) !== null) {
|
|
256
|
+
const refs = match[1]
|
|
257
|
+
.split(",")
|
|
258
|
+
.map((s) => s.trim().replace(/['"]/g, ""))
|
|
259
|
+
.filter(Boolean);
|
|
260
|
+
for (const ref of refs) {
|
|
261
|
+
if (!middleware.some((m) => m.name === ref)) {
|
|
262
|
+
middleware.push({
|
|
263
|
+
name: ref,
|
|
264
|
+
priority: order++,
|
|
265
|
+
type: "registered",
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Always include the built-in error middleware
|
|
272
|
+
middleware.push({
|
|
273
|
+
name: "errorMiddleware",
|
|
274
|
+
priority: middleware.length,
|
|
275
|
+
type: "built-in",
|
|
276
|
+
});
|
|
277
|
+
return { success: true, data: middleware };
|
|
278
|
+
}
|
|
279
|
+
export async function inspectDependencies(rootDir, _config) {
|
|
280
|
+
const { join } = (await import(/* @vite-ignore */ "path"));
|
|
281
|
+
const { existsSync, readFileSync } = (await import(
|
|
282
|
+
/* @vite-ignore */ "fs"));
|
|
283
|
+
// Build dependency graph from package.json files in the project
|
|
284
|
+
const nodes = [];
|
|
285
|
+
const pkgPath = join(rootDir, "package.json");
|
|
286
|
+
if (existsSync(pkgPath)) {
|
|
287
|
+
try {
|
|
288
|
+
const pkgContent = readFileSync(pkgPath, "utf-8");
|
|
289
|
+
const pkg = JSON.parse(pkgContent);
|
|
290
|
+
const deps = Object.keys(pkg.dependencies ?? {}).filter((d) => d.startsWith("@typokit/"));
|
|
291
|
+
nodes.push({
|
|
292
|
+
name: pkg.name ?? "root",
|
|
293
|
+
dependsOn: deps,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// Skip unparseable
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Also check for workspace packages if we're in a monorepo
|
|
301
|
+
const packagesDir = join(rootDir, "packages");
|
|
302
|
+
const { readdirSync } = (await import(/* @vite-ignore */ "fs"));
|
|
303
|
+
if (existsSync(packagesDir)) {
|
|
304
|
+
try {
|
|
305
|
+
const packages = readdirSync(packagesDir);
|
|
306
|
+
for (const pkg of packages) {
|
|
307
|
+
const subPkgPath = join(packagesDir, pkg, "package.json");
|
|
308
|
+
if (existsSync(subPkgPath)) {
|
|
309
|
+
try {
|
|
310
|
+
const content = readFileSync(subPkgPath, "utf-8");
|
|
311
|
+
const subPkg = JSON.parse(content);
|
|
312
|
+
const deps = Object.keys(subPkg.dependencies ?? {}).filter((d) => d.startsWith("@typokit/"));
|
|
313
|
+
nodes.push({
|
|
314
|
+
name: subPkg.name ?? `@typokit/${pkg}`,
|
|
315
|
+
dependsOn: deps,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// Skip
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
// Not a monorepo root
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return { success: true, data: nodes };
|
|
329
|
+
}
|
|
330
|
+
export async function inspectSchema(rootDir, config, typeName) {
|
|
331
|
+
const openApiContent = await readGeneratedFile(rootDir, config, "schemas/openapi.json");
|
|
332
|
+
if (!openApiContent) {
|
|
333
|
+
return {
|
|
334
|
+
success: false,
|
|
335
|
+
data: null,
|
|
336
|
+
error: "No OpenAPI spec found. Run 'typokit build' first.",
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
const schemas = parseSchemaFromOpenApi(openApiContent, typeName);
|
|
340
|
+
if (schemas.length === 0) {
|
|
341
|
+
return {
|
|
342
|
+
success: false,
|
|
343
|
+
data: null,
|
|
344
|
+
error: `Schema not found: ${typeName}`,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
return { success: true, data: schemas[0] };
|
|
348
|
+
}
|
|
349
|
+
export async function inspectErrors(debugPort, lastN) {
|
|
350
|
+
// Errors require a running server with debug sidecar
|
|
351
|
+
// Attempt to fetch from the debug sidecar endpoint
|
|
352
|
+
try {
|
|
353
|
+
const url = `http://localhost:${debugPort}/_debug/errors?last=${lastN}`;
|
|
354
|
+
const response = await fetchDebugEndpoint(url);
|
|
355
|
+
return { success: true, data: response };
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
return {
|
|
359
|
+
success: false,
|
|
360
|
+
data: [],
|
|
361
|
+
error: `Could not connect to debug sidecar on port ${debugPort}. Is the server running with debug enabled?`,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
export async function inspectPerformance(debugPort, routePath) {
|
|
366
|
+
try {
|
|
367
|
+
const url = `http://localhost:${debugPort}/_debug/performance?route=${encodeURIComponent(routePath)}`;
|
|
368
|
+
const response = await fetchDebugEndpoint(url);
|
|
369
|
+
return { success: true, data: response };
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return {
|
|
373
|
+
success: false,
|
|
374
|
+
data: null,
|
|
375
|
+
error: `Could not connect to debug sidecar on port ${debugPort}. Is the server running with debug enabled?`,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
export async function inspectServer(debugPort) {
|
|
380
|
+
try {
|
|
381
|
+
const url = `http://localhost:${debugPort}/_debug/health`;
|
|
382
|
+
const response = await fetchDebugEndpoint(url);
|
|
383
|
+
return { success: true, data: response };
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
return {
|
|
387
|
+
success: false,
|
|
388
|
+
data: {
|
|
389
|
+
adapter: "unknown",
|
|
390
|
+
platform: "unknown",
|
|
391
|
+
status: "not running",
|
|
392
|
+
},
|
|
393
|
+
error: `Could not connect to debug sidecar on port ${debugPort}. Is the server running with debug enabled?`,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
export async function inspectBuildPipeline(rootDir, config) {
|
|
398
|
+
// Build pipeline hooks are defined in the plugin system
|
|
399
|
+
// Return the standard hook order from the TypoKit build pipeline
|
|
400
|
+
const hooks = [
|
|
401
|
+
{
|
|
402
|
+
name: "beforeTransform",
|
|
403
|
+
order: 1,
|
|
404
|
+
description: "Register additional type sources before parsing",
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
name: "afterTypeParse",
|
|
408
|
+
order: 2,
|
|
409
|
+
description: "Inspect or modify the schema type map after parsing",
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
name: "afterValidators",
|
|
413
|
+
order: 3,
|
|
414
|
+
description: "Add custom validators after Typia generation",
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
name: "afterRouteTable",
|
|
418
|
+
order: 4,
|
|
419
|
+
description: "Post-process the compiled route table",
|
|
420
|
+
},
|
|
421
|
+
{ name: "emit", order: 5, description: "Plugins emit their own artifacts" },
|
|
422
|
+
{
|
|
423
|
+
name: "done",
|
|
424
|
+
order: 6,
|
|
425
|
+
description: "Cleanup, reporting, and finalization",
|
|
426
|
+
},
|
|
427
|
+
];
|
|
428
|
+
// Try to detect registered plugins from config or build output
|
|
429
|
+
const { join } = (await import(/* @vite-ignore */ "path"));
|
|
430
|
+
const { existsSync } = (await import(/* @vite-ignore */ "fs"));
|
|
431
|
+
const cacheHashPath = join(rootDir, config.outputDir, ".cache-hash");
|
|
432
|
+
const lastBuild = existsSync(cacheHashPath) ? "cached" : "no build found";
|
|
433
|
+
// Try to load plugins and show their registered taps
|
|
434
|
+
let registeredTaps = [];
|
|
435
|
+
try {
|
|
436
|
+
const { createBuildPipeline, getPipelineTaps } = (await import(
|
|
437
|
+
/* @vite-ignore */ "@typokit/core"));
|
|
438
|
+
const pipeline = createBuildPipeline();
|
|
439
|
+
registeredTaps = getPipelineTaps(pipeline);
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
// Core not available — skip tap introspection
|
|
443
|
+
}
|
|
444
|
+
return {
|
|
445
|
+
success: true,
|
|
446
|
+
data: {
|
|
447
|
+
hooks,
|
|
448
|
+
registeredTaps,
|
|
449
|
+
lastBuildStatus: lastBuild,
|
|
450
|
+
outputDir: config.outputDir,
|
|
451
|
+
},
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
/** Helper to fetch from the debug sidecar HTTP endpoint */
|
|
455
|
+
async function fetchDebugEndpoint(url) {
|
|
456
|
+
// Use dynamic import for http module (no @types/node)
|
|
457
|
+
const http = (await import(/* @vite-ignore */ "http"));
|
|
458
|
+
return new Promise((resolve, reject) => {
|
|
459
|
+
const req = http.get(url, (res) => {
|
|
460
|
+
let body = "";
|
|
461
|
+
res.setEncoding("utf-8");
|
|
462
|
+
res.on("data", (chunk) => {
|
|
463
|
+
body += String(chunk);
|
|
464
|
+
});
|
|
465
|
+
res.on("end", () => {
|
|
466
|
+
try {
|
|
467
|
+
resolve(JSON.parse(body));
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
resolve(body);
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
req.on("error", (err) => {
|
|
475
|
+
reject(err);
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
// ─── Main Dispatcher ────────────────────────────────────────
|
|
480
|
+
export async function executeInspect(options) {
|
|
481
|
+
const { rootDir, config, logger, subcommand, positional, flags } = options;
|
|
482
|
+
const json = isJsonOutput(flags);
|
|
483
|
+
const debugPort = typeof flags["debug-port"] === "string"
|
|
484
|
+
? parseInt(flags["debug-port"], 10)
|
|
485
|
+
: 9800;
|
|
486
|
+
let result;
|
|
487
|
+
switch (subcommand) {
|
|
488
|
+
case "routes": {
|
|
489
|
+
logger.step("inspect", "Listing all routes...");
|
|
490
|
+
result = await inspectRoutes(rootDir, config);
|
|
491
|
+
break;
|
|
492
|
+
}
|
|
493
|
+
case "route": {
|
|
494
|
+
const routeKey = positional[0];
|
|
495
|
+
if (!routeKey) {
|
|
496
|
+
return {
|
|
497
|
+
success: false,
|
|
498
|
+
data: null,
|
|
499
|
+
error: "Usage: typokit inspect route 'GET /users/:id'",
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
logger.step("inspect", `Looking up route: ${routeKey}`);
|
|
503
|
+
result = await inspectRoute(rootDir, config, routeKey);
|
|
504
|
+
break;
|
|
505
|
+
}
|
|
506
|
+
case "middleware": {
|
|
507
|
+
logger.step("inspect", "Listing middleware chain...");
|
|
508
|
+
result = await inspectMiddleware(rootDir, config);
|
|
509
|
+
break;
|
|
510
|
+
}
|
|
511
|
+
case "dependencies":
|
|
512
|
+
case "deps": {
|
|
513
|
+
logger.step("inspect", "Building dependency graph...");
|
|
514
|
+
result = await inspectDependencies(rootDir, config);
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
case "schema": {
|
|
518
|
+
const typeName = positional[0];
|
|
519
|
+
if (!typeName) {
|
|
520
|
+
return {
|
|
521
|
+
success: false,
|
|
522
|
+
data: null,
|
|
523
|
+
error: "Usage: typokit inspect schema <TypeName>",
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
logger.step("inspect", `Looking up schema: ${typeName}`);
|
|
527
|
+
result = await inspectSchema(rootDir, config, typeName);
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
case "errors": {
|
|
531
|
+
const lastN = typeof flags["last"] === "string" ? parseInt(flags["last"], 10) : 10;
|
|
532
|
+
logger.step("inspect", `Fetching last ${lastN} errors...`);
|
|
533
|
+
result = await inspectErrors(debugPort, lastN);
|
|
534
|
+
break;
|
|
535
|
+
}
|
|
536
|
+
case "performance": {
|
|
537
|
+
const routePath = typeof flags["route"] === "string" ? flags["route"] : "/";
|
|
538
|
+
logger.step("inspect", `Fetching performance for: ${routePath}`);
|
|
539
|
+
result = await inspectPerformance(debugPort, routePath);
|
|
540
|
+
break;
|
|
541
|
+
}
|
|
542
|
+
case "server": {
|
|
543
|
+
logger.step("inspect", "Querying server info...");
|
|
544
|
+
result = await inspectServer(debugPort);
|
|
545
|
+
break;
|
|
546
|
+
}
|
|
547
|
+
case "build-pipeline": {
|
|
548
|
+
logger.step("inspect", "Listing build pipeline hooks...");
|
|
549
|
+
result = await inspectBuildPipeline(rootDir, config);
|
|
550
|
+
break;
|
|
551
|
+
}
|
|
552
|
+
default: {
|
|
553
|
+
logger.error(`Unknown inspect subcommand: ${subcommand}`);
|
|
554
|
+
logger.info("Available subcommands:");
|
|
555
|
+
logger.info(" routes List all registered routes");
|
|
556
|
+
logger.info(" route <key> Detailed single route info");
|
|
557
|
+
logger.info(" middleware Full middleware chain");
|
|
558
|
+
logger.info(" dependencies Service dependency graph");
|
|
559
|
+
logger.info(" schema <TypeName> Type details and usage");
|
|
560
|
+
logger.info(" errors --last <N> Recent errors (requires running server)");
|
|
561
|
+
logger.info(" performance --route <path> Latency percentiles (requires running server)");
|
|
562
|
+
logger.info(" server Active server adapter info");
|
|
563
|
+
logger.info(" build-pipeline Registered build hooks and order");
|
|
564
|
+
return {
|
|
565
|
+
success: false,
|
|
566
|
+
data: null,
|
|
567
|
+
error: `Unknown inspect subcommand: ${subcommand}`,
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
if (result.success) {
|
|
572
|
+
writeOutput(result.data, json, logger);
|
|
573
|
+
}
|
|
574
|
+
else if (result.error) {
|
|
575
|
+
logger.error(result.error);
|
|
576
|
+
}
|
|
577
|
+
return result;
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
|