@flaid/devmap 0.6.0 → 0.8.0

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 (84) hide show
  1. package/README.md +2 -2
  2. package/dist/analyzers/detectors/adonisRouteDetector.d.ts +4 -0
  3. package/dist/analyzers/detectors/adonisRouteDetector.d.ts.map +1 -0
  4. package/dist/analyzers/detectors/adonisRouteDetector.js +242 -0
  5. package/dist/analyzers/detectors/adonisRouteDetector.js.map +1 -0
  6. package/dist/analyzers/detectors/angularRouteDetector.d.ts +4 -0
  7. package/dist/analyzers/detectors/angularRouteDetector.d.ts.map +1 -0
  8. package/dist/analyzers/detectors/angularRouteDetector.js +186 -0
  9. package/dist/analyzers/detectors/angularRouteDetector.js.map +1 -0
  10. package/dist/analyzers/detectors/astUtils.d.ts +31 -0
  11. package/dist/analyzers/detectors/astUtils.d.ts.map +1 -0
  12. package/dist/analyzers/detectors/astUtils.js +85 -0
  13. package/dist/analyzers/detectors/astUtils.js.map +1 -0
  14. package/dist/analyzers/detectors/clientRouteDetector.d.ts +4 -0
  15. package/dist/analyzers/detectors/clientRouteDetector.d.ts.map +1 -0
  16. package/dist/analyzers/detectors/clientRouteDetector.js +417 -0
  17. package/dist/analyzers/detectors/clientRouteDetector.js.map +1 -0
  18. package/dist/analyzers/detectors/elysiaRouteDetector.d.ts +4 -0
  19. package/dist/analyzers/detectors/elysiaRouteDetector.d.ts.map +1 -0
  20. package/dist/analyzers/detectors/elysiaRouteDetector.js +186 -0
  21. package/dist/analyzers/detectors/elysiaRouteDetector.js.map +1 -0
  22. package/dist/analyzers/detectors/expoRouteDetector.d.ts +4 -0
  23. package/dist/analyzers/detectors/expoRouteDetector.d.ts.map +1 -0
  24. package/dist/analyzers/detectors/expoRouteDetector.js +119 -0
  25. package/dist/analyzers/detectors/expoRouteDetector.js.map +1 -0
  26. package/dist/analyzers/detectors/frameworkDetector.d.ts +2 -2
  27. package/dist/analyzers/detectors/frameworkDetector.d.ts.map +1 -1
  28. package/dist/analyzers/detectors/frameworkDetector.js +86 -3
  29. package/dist/analyzers/detectors/frameworkDetector.js.map +1 -1
  30. package/dist/analyzers/detectors/honoRouteDetector.d.ts +4 -0
  31. package/dist/analyzers/detectors/honoRouteDetector.d.ts.map +1 -0
  32. package/dist/analyzers/detectors/honoRouteDetector.js +485 -0
  33. package/dist/analyzers/detectors/honoRouteDetector.js.map +1 -0
  34. package/dist/analyzers/detectors/koaRouteDetector.d.ts +4 -0
  35. package/dist/analyzers/detectors/koaRouteDetector.d.ts.map +1 -0
  36. package/dist/analyzers/detectors/koaRouteDetector.js +216 -0
  37. package/dist/analyzers/detectors/koaRouteDetector.js.map +1 -0
  38. package/dist/analyzers/detectors/moduleBindings.d.ts +52 -0
  39. package/dist/analyzers/detectors/moduleBindings.d.ts.map +1 -0
  40. package/dist/analyzers/detectors/moduleBindings.js +295 -0
  41. package/dist/analyzers/detectors/moduleBindings.js.map +1 -0
  42. package/dist/analyzers/detectors/qwikRouteDetector.d.ts +4 -0
  43. package/dist/analyzers/detectors/qwikRouteDetector.d.ts.map +1 -0
  44. package/dist/analyzers/detectors/qwikRouteDetector.js +53 -0
  45. package/dist/analyzers/detectors/qwikRouteDetector.js.map +1 -0
  46. package/dist/analyzers/detectors/reactRouterRouteDetector.d.ts +4 -0
  47. package/dist/analyzers/detectors/reactRouterRouteDetector.d.ts.map +1 -0
  48. package/dist/analyzers/detectors/reactRouterRouteDetector.js +142 -0
  49. package/dist/analyzers/detectors/reactRouterRouteDetector.js.map +1 -0
  50. package/dist/analyzers/detectors/remixRouteDetector.d.ts +42 -0
  51. package/dist/analyzers/detectors/remixRouteDetector.d.ts.map +1 -0
  52. package/dist/analyzers/detectors/remixRouteDetector.js +123 -0
  53. package/dist/analyzers/detectors/remixRouteDetector.js.map +1 -0
  54. package/dist/analyzers/detectors/routeDetector.d.ts.map +1 -1
  55. package/dist/analyzers/detectors/routeDetector.js +61 -66
  56. package/dist/analyzers/detectors/routeDetector.js.map +1 -1
  57. package/dist/analyzers/detectors/routeUtils.d.ts +43 -0
  58. package/dist/analyzers/detectors/routeUtils.d.ts.map +1 -0
  59. package/dist/analyzers/detectors/routeUtils.js +162 -0
  60. package/dist/analyzers/detectors/routeUtils.js.map +1 -0
  61. package/dist/analyzers/detectors/solidStartRouteDetector.d.ts +4 -0
  62. package/dist/analyzers/detectors/solidStartRouteDetector.d.ts.map +1 -0
  63. package/dist/analyzers/detectors/solidStartRouteDetector.js +59 -0
  64. package/dist/analyzers/detectors/solidStartRouteDetector.js.map +1 -0
  65. package/dist/analyzers/detectors/tanstackRouteDetector.d.ts +4 -0
  66. package/dist/analyzers/detectors/tanstackRouteDetector.d.ts.map +1 -0
  67. package/dist/analyzers/detectors/tanstackRouteDetector.js +100 -0
  68. package/dist/analyzers/detectors/tanstackRouteDetector.js.map +1 -0
  69. package/dist/analyzers/graph/aliasResolver.d.ts.map +1 -1
  70. package/dist/analyzers/graph/aliasResolver.js +3 -0
  71. package/dist/analyzers/graph/aliasResolver.js.map +1 -1
  72. package/dist/analyzers/graph/bundlerAliases.d.ts +12 -0
  73. package/dist/analyzers/graph/bundlerAliases.d.ts.map +1 -0
  74. package/dist/analyzers/graph/bundlerAliases.js +328 -0
  75. package/dist/analyzers/graph/bundlerAliases.js.map +1 -0
  76. package/dist/analyzers/graph/entryPoints.d.ts.map +1 -1
  77. package/dist/analyzers/graph/entryPoints.js +34 -3
  78. package/dist/analyzers/graph/entryPoints.js.map +1 -1
  79. package/dist/analyzers/pipeline/projectMap.d.ts.map +1 -1
  80. package/dist/analyzers/pipeline/projectMap.js +17 -6
  81. package/dist/analyzers/pipeline/projectMap.js.map +1 -1
  82. package/dist/analyzers/pipeline/projectMetadata.js +11 -0
  83. package/dist/analyzers/pipeline/projectMetadata.js.map +1 -1
  84. package/package.json +1 -1
@@ -0,0 +1,485 @@
1
+ import { ts } from "ts-morph";
2
+ import { isArchitectureSource } from "../graph/index.js";
3
+ import { parseSource, propertyKeyName, stringValue, unwrapExpression } from "./astUtils.js";
4
+ import { joinRoutePaths, resolveImportedFile, sortRoutes } from "./routeUtils.js";
5
+ /**
6
+ * Hono apps are plain values, so they are followed the way the runtime builds
7
+ * them instead of by pattern:
8
+ *
9
+ * const book = new Hono() one app per `new Hono()`
10
+ * book.get('/', h).post('/', h) chains hand back the same app
11
+ * const v1 = app.basePath('/v1') a view of the same app with a prefix
12
+ * app.route('/book', book) book's routes join app under /book
13
+ * app.route('/api', api) // import api from './api' ...also across files
14
+ * app.openapi(createRoute({ method, path }), h) @hono/zod-openapi
15
+ *
16
+ * const users = createRouter() a function that returns an app: each call is its own app
17
+ * registerAuth(app.basePath('/auth')) a function that registers routes on the app it is given
18
+ *
19
+ * Only apps nobody mounts are walked from the top, so each endpoint is listed
20
+ * once, under its full URL. Handlers must be registered on a value this module
21
+ * can trace to `new Hono()`, `createFactory().createApp()` or a function that
22
+ * returns one; anything else (an app picked from an array, built from options
23
+ * at runtime) is not followed.
24
+ */
25
+ const HONO_MODULE = /^(?:hono|hono\/.+|@hono\/.+)$/;
26
+ const HONO_CLASSES = new Set(["Hono", "OpenAPIHono"]);
27
+ const VERB_METHODS = new Set(["get", "post", "put", "patch", "delete", "options", "all"]);
28
+ /**
29
+ * What a name refers to at the place it is used, innermost scope first. A
30
+ * name that is not declared in the file comes from an import (or a global).
31
+ */
32
+ function declarationOf(id) {
33
+ const name = id.text;
34
+ for (let node = id.parent; node; node = node.parent) {
35
+ if (ts.isFunctionLike(node)) {
36
+ const index = node.parameters.findIndex((parameter) => ts.isIdentifier(parameter.name) && parameter.name.text === name);
37
+ if (index >= 0)
38
+ return { kind: "param", fn: node, index };
39
+ }
40
+ const statements = ts.isSourceFile(node) || ts.isBlock(node) || ts.isModuleBlock(node) ? node.statements : undefined;
41
+ if (!statements)
42
+ continue;
43
+ for (const statement of statements) {
44
+ if (ts.isVariableStatement(statement)) {
45
+ for (const declaration of statement.declarationList.declarations) {
46
+ if (ts.isIdentifier(declaration.name) && declaration.name.text === name && declaration.initializer) {
47
+ return { kind: "value", expression: declaration.initializer };
48
+ }
49
+ }
50
+ }
51
+ else if (ts.isFunctionDeclaration(statement) && statement.name?.text === name) {
52
+ return { kind: "function", node: statement };
53
+ }
54
+ }
55
+ }
56
+ return undefined;
57
+ }
58
+ /** The value a function hands back: `=> new Hono()` or its last top-level `return`. */
59
+ function returnedExpression(fn) {
60
+ const body = fn.body;
61
+ if (!body)
62
+ return undefined;
63
+ if (!ts.isBlock(body))
64
+ return body;
65
+ for (let index = body.statements.length - 1; index >= 0; index -= 1) {
66
+ const statement = body.statements[index];
67
+ if (ts.isReturnStatement(statement) && statement.expression)
68
+ return statement.expression;
69
+ }
70
+ return undefined;
71
+ }
72
+ export function detectHonoRoutes(files, graph) {
73
+ const sources = files.filter((file) => isArchitectureSource(file.path) && /\.[cm]?[jt]sx?$/.test(file.path));
74
+ const byPath = new Map(sources.map((file) => [file.path, file]));
75
+ const localPaths = new Set(byPath.keys());
76
+ const models = new Map();
77
+ const model = (path) => {
78
+ const cached = models.get(path);
79
+ if (cached)
80
+ return cached;
81
+ const file = byPath.get(path);
82
+ if (!file)
83
+ return undefined;
84
+ const built = buildModel(file);
85
+ models.set(path, built);
86
+ return built;
87
+ };
88
+ const apps = new Map();
89
+ /** Routes a function registers on one of its parameters, replayed at each call. */
90
+ const paramRoutes = new Map();
91
+ const handles = new Map();
92
+ const resolving = new Set();
93
+ const appAt = (file, node) => {
94
+ const key = `${file}@${node.getStart()}-${node.end}`;
95
+ let app = apps.get(key);
96
+ if (!app) {
97
+ app = { routes: [], mounts: [], mounted: false };
98
+ apps.set(key, app);
99
+ }
100
+ return app;
101
+ };
102
+ const resolveImport = (from, specifier) => resolveImportedFile(from, specifier, localPaths, graph);
103
+ /** The file and export an imported name refers to. */
104
+ const importedBinding = (path, name) => {
105
+ const imported = model(path)?.imports.get(name);
106
+ if (!imported)
107
+ return undefined;
108
+ const targetPath = resolveImport(path, imported.specifier);
109
+ const target = targetPath ? model(targetPath) : undefined;
110
+ return targetPath && target ? { targetPath, target, imported: imported.imported } : undefined;
111
+ };
112
+ /** Follow identifiers (and imports) until an expression that is not a name. */
113
+ const resolveValue = (path, expression, seen = new Set()) => {
114
+ const node = unwrapExpression(expression);
115
+ if (!ts.isIdentifier(node))
116
+ return { path, expression: node };
117
+ const key = `${path}#${node.getStart()}`;
118
+ if (seen.has(key))
119
+ return undefined;
120
+ seen.add(key);
121
+ const declaration = declarationOf(node);
122
+ if (declaration) {
123
+ return declaration.kind === "value" ? resolveValue(path, declaration.expression, seen) : undefined;
124
+ }
125
+ const binding = importedBinding(path, node.text);
126
+ if (!binding)
127
+ return undefined;
128
+ const { targetPath, target, imported } = binding;
129
+ if (imported === "default") {
130
+ return target.defaultExport ? resolveValue(targetPath, target.defaultExport, seen) : undefined;
131
+ }
132
+ const localName = target.exports.get(imported);
133
+ const initializer = localName ? target.variables.get(localName) : undefined;
134
+ return initializer ? resolveValue(targetPath, initializer, seen) : undefined;
135
+ };
136
+ /** Follow a name to the function it calls, through variables and imports. */
137
+ const resolveFunction = (path, expression, seen = new Set()) => {
138
+ const node = unwrapExpression(expression);
139
+ if (ts.isArrowFunction(node) || ts.isFunctionExpression(node))
140
+ return { path, fn: node };
141
+ if (!ts.isIdentifier(node))
142
+ return undefined;
143
+ const key = `${path}#${node.getStart()}`;
144
+ if (seen.has(key))
145
+ return undefined;
146
+ seen.add(key);
147
+ const declaration = declarationOf(node);
148
+ if (declaration?.kind === "function")
149
+ return { path, fn: declaration.node };
150
+ if (declaration?.kind === "value")
151
+ return resolveFunction(path, declaration.expression, seen);
152
+ if (declaration)
153
+ return undefined;
154
+ const binding = importedBinding(path, node.text);
155
+ if (!binding)
156
+ return undefined;
157
+ const { targetPath, target, imported } = binding;
158
+ if (imported === "default") {
159
+ if (target.defaultFunction)
160
+ return { path: targetPath, fn: target.defaultFunction };
161
+ return target.defaultExport ? resolveFunction(targetPath, target.defaultExport, seen) : undefined;
162
+ }
163
+ const localName = target.exports.get(imported);
164
+ if (!localName)
165
+ return undefined;
166
+ const declared = target.functions.get(localName);
167
+ if (declared)
168
+ return { path: targetPath, fn: declared };
169
+ const initializer = target.variables.get(localName);
170
+ return initializer ? resolveFunction(targetPath, initializer, seen) : undefined;
171
+ };
172
+ /** `createFactory()` or a variable holding it. */
173
+ const isFactory = (path, expression) => {
174
+ const resolved = resolveValue(path, expression);
175
+ const node = resolved?.expression;
176
+ return Boolean(node && ts.isCallExpression(node) && /(^|\.)createFactory$/.test(node.expression.getText()));
177
+ };
178
+ /** Which app (and base path) an expression evaluates to, if any. */
179
+ const handleOf = (path, expression) => {
180
+ const resolved = resolveValue(path, expression);
181
+ if (!resolved)
182
+ return undefined;
183
+ const node = resolved.expression;
184
+ // `new Hono().basePath("/x")` starts where `new Hono()` does: key on the span.
185
+ const key = `${resolved.path}@${node.getStart()}-${node.end}`;
186
+ const cached = handles.get(key);
187
+ if (cached !== undefined)
188
+ return cached ?? undefined;
189
+ if (resolving.has(key))
190
+ return undefined;
191
+ resolving.add(key);
192
+ let handle;
193
+ const home = model(resolved.path);
194
+ if (home && ts.isNewExpression(node) && ts.isIdentifier(node.expression) && home.honoClasses.has(node.expression.text)) {
195
+ handle = { app: appAt(resolved.path, node), base: "" };
196
+ }
197
+ else if (ts.isCallExpression(node)) {
198
+ const callee = node.expression;
199
+ const receiver = ts.isPropertyAccessExpression(callee) ? handleOf(resolved.path, callee.expression) : undefined;
200
+ if (ts.isPropertyAccessExpression(callee) && callee.name.text === "createApp" && isFactory(resolved.path, callee.expression)) {
201
+ handle = { app: appAt(resolved.path, node), base: "" };
202
+ }
203
+ else if (receiver && ts.isPropertyAccessExpression(callee)) {
204
+ handle = callee.name.text === "basePath"
205
+ ? { app: receiver.app, base: joinRoutePaths(receiver.base, stringValue(node.arguments[0]) ?? "") }
206
+ : receiver;
207
+ }
208
+ else {
209
+ // `createRouter()`: every call is its own app, wrapping what the function builds.
210
+ const target = resolveFunction(resolved.path, callee);
211
+ const returned = target ? returnedExpression(target.fn) : undefined;
212
+ const built = target && returned ? handleOf(target.path, returned) : undefined;
213
+ if (built) {
214
+ const wrapper = appAt(resolved.path, node);
215
+ wrapper.mounts.push({ prefix: "/", target: built.app });
216
+ built.app.mounted = true;
217
+ handle = { app: wrapper, base: built.base };
218
+ }
219
+ }
220
+ }
221
+ resolving.delete(key);
222
+ handles.set(key, handle ?? null);
223
+ return handle;
224
+ };
225
+ /** `{ method, path }` of an `@hono/zod-openapi` route definition. */
226
+ const openApiRoute = (path, expression) => {
227
+ const resolved = resolveValue(path, expression);
228
+ let node = resolved?.expression;
229
+ if (node && ts.isCallExpression(node) && node.arguments[0]) {
230
+ node = unwrapExpression(node.arguments[0]);
231
+ }
232
+ if (!node || !ts.isObjectLiteralExpression(node))
233
+ return undefined;
234
+ let method;
235
+ let routePath;
236
+ for (const property of node.properties) {
237
+ if (!ts.isPropertyAssignment(property))
238
+ continue;
239
+ const name = propertyKeyName(property.name);
240
+ if (name === "method")
241
+ method = stringValue(property.initializer)?.toUpperCase();
242
+ if (name === "path")
243
+ routePath = stringValue(property.initializer);
244
+ }
245
+ return routePath === undefined ? undefined : { path: routePath, ...(method ? { method } : {}) };
246
+ };
247
+ /** The routes one call registers, relative to `base`; empty when it is not a route call. */
248
+ const routesOf = (path, call, method, base) => {
249
+ const args = call.arguments;
250
+ if (method === "openapi") {
251
+ const definition = args[0] ? openApiRoute(path, args[0]) : undefined;
252
+ return definition
253
+ ? [{ path: joinRoutePaths(base, openApiPath(definition.path)), ...(definition.method ? { method: definition.method } : {}), file: path }]
254
+ : [];
255
+ }
256
+ if (method === "on") {
257
+ const methods = stringList(args[0]);
258
+ return stringList(args[1]).flatMap((routePath) => (methods.length > 0 ? methods : [undefined]).map((verb) => ({
259
+ path: joinRoutePaths(base, routePath),
260
+ ...(verb ? { method: verb.toUpperCase() } : {}),
261
+ file: path
262
+ })));
263
+ }
264
+ // `c.get('user')` and friends take a key, not a path, but never resolve
265
+ // to an app, so anything that gets here is a route.
266
+ const routePath = stringValue(args[0]);
267
+ if (routePath === undefined)
268
+ return [];
269
+ return [{
270
+ path: joinRoutePaths(base, routePath),
271
+ ...(method === "all" ? {} : { method: method.toUpperCase() }),
272
+ file: path
273
+ }];
274
+ };
275
+ const isRouteMethod = (method) => VERB_METHODS.has(method) || method === "on" || method === "openapi";
276
+ /** `app.get(...).post(...)` where `app` is a parameter of the surrounding function. */
277
+ const parameterReceiver = (expression) => {
278
+ let node = unwrapExpression(expression);
279
+ while (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression) && isRouteMethod(node.expression.name.text)) {
280
+ node = unwrapExpression(node.expression.expression);
281
+ }
282
+ if (!ts.isIdentifier(node))
283
+ return undefined;
284
+ const declaration = declarationOf(node);
285
+ return declaration?.kind === "param" ? { fn: declaration.fn, index: declaration.index } : undefined;
286
+ };
287
+ const candidates = sources.filter((file) => /hono/i.test(file.content));
288
+ // Pass 1: functions that register routes on a parameter, so a call such as
289
+ // `registerUsers(app)` can replay them wherever it happens.
290
+ for (const file of candidates) {
291
+ const current = model(file.path);
292
+ if (!current)
293
+ continue;
294
+ walk(current.source, (node) => {
295
+ if (!ts.isCallExpression(node) || !ts.isPropertyAccessExpression(node.expression))
296
+ return;
297
+ const method = node.expression.name.text;
298
+ if (!isRouteMethod(method))
299
+ return;
300
+ const parameter = parameterReceiver(node.expression.expression);
301
+ if (!parameter || handleOf(file.path, node.expression.expression))
302
+ return;
303
+ const found = routesOf(file.path, node, method, "/").filter((route) => /^\/|^\*/.test(route.path.replace(/^\//, "") === "" ? "/" : route.path));
304
+ const key = parameter.fn;
305
+ const list = paramRoutes.get(key) ?? [];
306
+ list.push(...found.map((route) => ({ index: parameter.index, route })));
307
+ paramRoutes.set(key, list);
308
+ });
309
+ }
310
+ // Pass 2: every call is judged on its own. `handleOf` resolves the receiver
311
+ // without side effects, so a chain like `app.get().post()` registers each
312
+ // call once.
313
+ for (const file of candidates) {
314
+ const current = model(file.path);
315
+ if (!current)
316
+ continue;
317
+ walk(current.source, (node) => {
318
+ if (!ts.isCallExpression(node))
319
+ return;
320
+ // registerUsers(app, ...): replay what the function registers on its parameters.
321
+ if (paramRoutes.size > 0 && !ts.isPropertyAccessExpression(node.expression)) {
322
+ const target = resolveFunction(file.path, node.expression);
323
+ const recorded = target ? paramRoutes.get(target.fn) : undefined;
324
+ if (recorded) {
325
+ for (const { index, route } of recorded) {
326
+ const argument = node.arguments[index];
327
+ const handle = argument ? handleOf(file.path, argument) : undefined;
328
+ if (handle) {
329
+ handle.app.routes.push({ ...route, path: joinRoutePaths(handle.base, route.path) });
330
+ }
331
+ }
332
+ }
333
+ return;
334
+ }
335
+ if (!ts.isPropertyAccessExpression(node.expression))
336
+ return;
337
+ const method = node.expression.name.text;
338
+ if (!isRouteMethod(method) && method !== "route")
339
+ return;
340
+ const receiver = handleOf(file.path, node.expression.expression);
341
+ if (!receiver)
342
+ return;
343
+ if (method === "route") {
344
+ const prefix = stringValue(node.arguments[0]);
345
+ const child = node.arguments[1] ? handleOf(file.path, node.arguments[1]) : undefined;
346
+ if (prefix === undefined || !child || child.app === receiver.app)
347
+ return;
348
+ child.app.mounted = true;
349
+ receiver.app.mounts.push({ prefix: joinRoutePaths(receiver.base, prefix), target: child.app });
350
+ return;
351
+ }
352
+ receiver.app.routes.push(...routesOf(file.path, node, method, receiver.base));
353
+ });
354
+ }
355
+ const routes = new Map();
356
+ const emit = (app, prefix, trail) => {
357
+ if (trail.has(app))
358
+ return;
359
+ trail.add(app);
360
+ for (const route of app.routes) {
361
+ const path = honoPath(joinRoutePaths(prefix, route.path));
362
+ const key = `${path}\0${route.file}`;
363
+ const existing = routes.get(key);
364
+ if (existing) {
365
+ if (route.method && existing.methods && !existing.methods.includes(route.method)) {
366
+ existing.methods = [...existing.methods, route.method].sort();
367
+ }
368
+ continue;
369
+ }
370
+ routes.set(key, {
371
+ path,
372
+ file: route.file,
373
+ kind: "api",
374
+ ...(route.method ? { methods: [route.method] } : {})
375
+ });
376
+ }
377
+ for (const mount of app.mounts)
378
+ emit(mount.target, joinRoutePaths(prefix, mount.prefix), trail);
379
+ trail.delete(app);
380
+ };
381
+ for (const app of apps.values()) {
382
+ if (!app.mounted)
383
+ emit(app, "/", new Set());
384
+ }
385
+ return sortRoutes([...routes.values()]);
386
+ }
387
+ function buildModel(file) {
388
+ const source = parseSource(file.path, file.content);
389
+ const model = {
390
+ file,
391
+ source,
392
+ honoClasses: new Set(),
393
+ imports: new Map(),
394
+ variables: new Map(),
395
+ functions: new Map(),
396
+ exports: new Map()
397
+ };
398
+ for (const statement of source.statements) {
399
+ if (ts.isImportDeclaration(statement)) {
400
+ const specifier = stringValue(statement.moduleSpecifier);
401
+ const clause = statement.importClause;
402
+ if (!specifier || !clause)
403
+ continue;
404
+ if (clause.name)
405
+ model.imports.set(clause.name.text, { specifier, imported: "default" });
406
+ if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {
407
+ for (const element of clause.namedBindings.elements) {
408
+ const imported = (element.propertyName ?? element.name).text;
409
+ model.imports.set(element.name.text, { specifier, imported });
410
+ if (HONO_MODULE.test(specifier) && HONO_CLASSES.has(imported)) {
411
+ model.honoClasses.add(element.name.text);
412
+ }
413
+ }
414
+ }
415
+ }
416
+ else if (ts.isFunctionDeclaration(statement) && (statement.name || hasModifier(statement, ts.SyntaxKind.DefaultKeyword))) {
417
+ if (statement.name)
418
+ model.functions.set(statement.name.text, statement);
419
+ if (hasModifier(statement, ts.SyntaxKind.DefaultKeyword))
420
+ model.defaultFunction = statement;
421
+ else if (statement.name && hasModifier(statement, ts.SyntaxKind.ExportKeyword)) {
422
+ model.exports.set(statement.name.text, statement.name.text);
423
+ }
424
+ }
425
+ else if (ts.isVariableStatement(statement)) {
426
+ const exported = statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword);
427
+ for (const declaration of statement.declarationList.declarations) {
428
+ if (!ts.isIdentifier(declaration.name) || !declaration.initializer)
429
+ continue;
430
+ model.variables.set(declaration.name.text, declaration.initializer);
431
+ if (exported)
432
+ model.exports.set(declaration.name.text, declaration.name.text);
433
+ }
434
+ }
435
+ else if (ts.isExportAssignment(statement) && !statement.isExportEquals) {
436
+ model.defaultExport = statement.expression;
437
+ }
438
+ else if (ts.isExportDeclaration(statement)
439
+ && !statement.moduleSpecifier
440
+ && statement.exportClause
441
+ && ts.isNamedExports(statement.exportClause)) {
442
+ for (const element of statement.exportClause.elements) {
443
+ const local = (element.propertyName ?? element.name).text;
444
+ if (element.name.text === "default") {
445
+ const initializer = model.variables.get(local);
446
+ if (initializer)
447
+ model.defaultExport = initializer;
448
+ }
449
+ else {
450
+ model.exports.set(element.name.text, local);
451
+ }
452
+ }
453
+ }
454
+ }
455
+ return model;
456
+ }
457
+ function hasModifier(node, kind) {
458
+ return ts.canHaveModifiers(node) && Boolean(ts.getModifiers(node)?.some((modifier) => modifier.kind === kind));
459
+ }
460
+ function walk(node, visit) {
461
+ visit(node);
462
+ ts.forEachChild(node, (child) => walk(child, visit));
463
+ }
464
+ /** `'GET'` or `['GET', 'POST']`. */
465
+ function stringList(node) {
466
+ if (!node)
467
+ return [];
468
+ const unwrapped = unwrapExpression(node);
469
+ const single = stringValue(unwrapped);
470
+ if (single !== undefined)
471
+ return [single];
472
+ if (ts.isArrayLiteralExpression(unwrapped)) {
473
+ return unwrapped.elements.flatMap((element) => stringValue(element) ?? []);
474
+ }
475
+ return [];
476
+ }
477
+ /** OpenAPI writes `/users/{id}`; Hono routes use `/users/:id`. */
478
+ function openApiPath(path) {
479
+ return path.replace(/\{([^}]+)\}/g, ":$1");
480
+ }
481
+ /** `:id{[0-9]+}` is a constrained param; show it as `:id`. */
482
+ function honoPath(path) {
483
+ return path.replace(/(:[A-Za-z_]\w*)\{[^}]*\}/g, "$1");
484
+ }
485
+ //# sourceMappingURL=honoRouteDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"honoRouteDetector.js","sourceRoot":"","sources":["../../../src/analyzers/detectors/honoRouteDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ScannedFile } from "../analysis/index.js";
2
+ import type { RouteInfo } from "./routeDetector.js";
3
+ export declare function detectKoaRoutes(files: ScannedFile[], graph?: Record<string, string[]>): RouteInfo[];
4
+ //# sourceMappingURL=koaRouteDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koaRouteDetector.d.ts","sourceRoot":"","sources":["../../../src/analyzers/detectors/koaRouteDetector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA6BpD,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,EAAE,CAuKnG"}