@flaid/devmap 0.7.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 (60) 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 +20 -0
  11. package/dist/analyzers/detectors/astUtils.d.ts.map +1 -1
  12. package/dist/analyzers/detectors/astUtils.js +38 -0
  13. package/dist/analyzers/detectors/astUtils.js.map +1 -1
  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/frameworkDetector.d.ts +2 -2
  23. package/dist/analyzers/detectors/frameworkDetector.d.ts.map +1 -1
  24. package/dist/analyzers/detectors/frameworkDetector.js +29 -1
  25. package/dist/analyzers/detectors/frameworkDetector.js.map +1 -1
  26. package/dist/analyzers/detectors/honoRouteDetector.d.ts.map +1 -1
  27. package/dist/analyzers/detectors/honoRouteDetector.js +230 -82
  28. package/dist/analyzers/detectors/honoRouteDetector.js.map +1 -1
  29. package/dist/analyzers/detectors/koaRouteDetector.d.ts +4 -0
  30. package/dist/analyzers/detectors/koaRouteDetector.d.ts.map +1 -0
  31. package/dist/analyzers/detectors/koaRouteDetector.js +216 -0
  32. package/dist/analyzers/detectors/koaRouteDetector.js.map +1 -0
  33. package/dist/analyzers/detectors/moduleBindings.d.ts +52 -0
  34. package/dist/analyzers/detectors/moduleBindings.d.ts.map +1 -0
  35. package/dist/analyzers/detectors/moduleBindings.js +295 -0
  36. package/dist/analyzers/detectors/moduleBindings.js.map +1 -0
  37. package/dist/analyzers/detectors/qwikRouteDetector.d.ts +4 -0
  38. package/dist/analyzers/detectors/qwikRouteDetector.d.ts.map +1 -0
  39. package/dist/analyzers/detectors/qwikRouteDetector.js +53 -0
  40. package/dist/analyzers/detectors/qwikRouteDetector.js.map +1 -0
  41. package/dist/analyzers/detectors/routeDetector.d.ts.map +1 -1
  42. package/dist/analyzers/detectors/routeDetector.js +46 -5
  43. package/dist/analyzers/detectors/routeDetector.js.map +1 -1
  44. package/dist/analyzers/detectors/routeUtils.d.ts +15 -1
  45. package/dist/analyzers/detectors/routeUtils.d.ts.map +1 -1
  46. package/dist/analyzers/detectors/routeUtils.js +51 -0
  47. package/dist/analyzers/detectors/routeUtils.js.map +1 -1
  48. package/dist/analyzers/detectors/solidStartRouteDetector.d.ts +4 -0
  49. package/dist/analyzers/detectors/solidStartRouteDetector.d.ts.map +1 -0
  50. package/dist/analyzers/detectors/solidStartRouteDetector.js +59 -0
  51. package/dist/analyzers/detectors/solidStartRouteDetector.js.map +1 -0
  52. package/dist/analyzers/graph/entryPoints.d.ts.map +1 -1
  53. package/dist/analyzers/graph/entryPoints.js +13 -1
  54. package/dist/analyzers/graph/entryPoints.js.map +1 -1
  55. package/dist/analyzers/pipeline/projectMap.d.ts.map +1 -1
  56. package/dist/analyzers/pipeline/projectMap.js +17 -6
  57. package/dist/analyzers/pipeline/projectMap.js.map +1 -1
  58. package/dist/analyzers/pipeline/projectMetadata.js +5 -0
  59. package/dist/analyzers/pipeline/projectMetadata.js.map +1 -1
  60. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elysiaRouteDetector.js","sourceRoot":"","sources":["../../../src/analyzers/detectors/elysiaRouteDetector.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { type ScannedFile } from "../analysis/index.js";
2
- export declare const FRONTEND_FRAMEWORKS: readonly ["nextjs", "nuxt", "sveltekit", "astro", "remix", "react-router", "tanstack-start", "tanstack-router", "expo", "react", "vue", "svelte"];
3
- export declare const BACKEND_FRAMEWORKS: readonly ["nestjs", "fastify", "express", "hono", "koa"];
2
+ export declare const FRONTEND_FRAMEWORKS: readonly ["nextjs", "nuxt", "sveltekit", "astro", "remix", "react-router", "tanstack-start", "tanstack-router", "expo", "solid-start", "qwik", "angular", "react", "vue", "svelte"];
3
+ export declare const BACKEND_FRAMEWORKS: readonly ["nestjs", "adonisjs", "fastify", "express", "hono", "elysia", "koa"];
4
4
  export type FrontendFramework = typeof FRONTEND_FRAMEWORKS[number];
5
5
  export type BackendFramework = typeof BACKEND_FRAMEWORKS[number];
6
6
  export type Framework = FrontendFramework | BackendFramework | "unknown";
@@ -1 +1 @@
1
- {"version":3,"file":"frameworkDetector.d.ts","sourceRoot":"","sources":["../../../src/analyzers/detectors/frameworkDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKvE,eAAO,MAAM,mBAAmB,mJAItB,CAAC;AACX,eAAO,MAAM,kBAAkB,0DAErB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACnE,MAAM,MAAM,gBAAgB,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,CAAC;AACzE,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB,aAAuC,CAAC;AAC3E,eAAO,MAAM,qBAAqB,aAAsC,CAAC;AAEzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,CAG/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAkK1E"}
1
+ {"version":3,"file":"frameworkDetector.d.ts","sourceRoot":"","sources":["../../../src/analyzers/detectors/frameworkDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKvE,eAAO,MAAM,mBAAmB,qLAKtB,CAAC;AACX,eAAO,MAAM,kBAAkB,gFAErB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACnE,MAAM,MAAM,gBAAgB,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,CAAC;AACzE,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB,aAAuC,CAAC;AAC3E,eAAO,MAAM,qBAAqB,aAAsC,CAAC;AAEzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,CAG/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAyL1E"}
@@ -5,10 +5,11 @@ import { isArchitectureSource } from "../graph/index.js";
5
5
  export const FRONTEND_FRAMEWORKS = [
6
6
  "nextjs", "nuxt", "sveltekit", "astro",
7
7
  "remix", "react-router", "tanstack-start", "tanstack-router", "expo",
8
+ "solid-start", "qwik", "angular",
8
9
  "react", "vue", "svelte"
9
10
  ];
10
11
  export const BACKEND_FRAMEWORKS = [
11
- "nestjs", "fastify", "express", "hono", "koa"
12
+ "nestjs", "adonisjs", "fastify", "express", "hono", "elysia", "koa"
12
13
  ];
13
14
  export const FRONTEND_FRAMEWORK_SET = new Set(FRONTEND_FRAMEWORKS);
14
15
  export const BACKEND_FRAMEWORK_SET = new Set(BACKEND_FRAMEWORKS);
@@ -48,6 +49,23 @@ export function detectFrameworks(files) {
48
49
  detected.add("sveltekit");
49
50
  if ("hono" in dependencies)
50
51
  detected.add("hono");
52
+ if ("elysia" in dependencies)
53
+ detected.add("elysia");
54
+ if ("koa" in dependencies)
55
+ detected.add("koa");
56
+ if (ADONIS_PACKAGES.some((name) => name in dependencies))
57
+ detected.add("adonisjs");
58
+ // SolidStart, Qwik City and Angular are full frameworks with their own router;
59
+ // plain `solid-js` / `@builder.io/qwik` are just component libraries.
60
+ if ("@solidjs/start" in dependencies || "solid-start" in dependencies)
61
+ detected.add("solid-start");
62
+ if (QWIK_PACKAGES.some((name) => name in dependencies))
63
+ detected.add("qwik");
64
+ // `@angular/core` alone is also what an Angular library lists, so an app needs its platform or CLI.
65
+ if ("@angular/core" in dependencies
66
+ && ("@angular/platform-browser" in dependencies || "@angular/cli" in dependencies || "@angular/build" in dependencies)) {
67
+ detected.add("angular");
68
+ }
51
69
  // Remix v2 lives under `@remix-run/*`; `@remix-run/router` is React Router's
52
70
  // own internal package and says nothing about Remix.
53
71
  if (REMIX_PACKAGES.some((name) => name in dependencies))
@@ -161,6 +179,13 @@ export function detectFrameworks(files) {
161
179
  if (files.some((file) => /(^|\/)app(?:\.config\.[cm]?[jt]s|\.json)$/.test(file.path) && file.content.includes("expo-router"))) {
162
180
  detected.add("expo");
163
181
  }
182
+ // Angular's workspace file and AdonisJS's rc file are specific to each framework.
183
+ if (files.some((file) => /(^|\/)angular\.json$/.test(file.path))) {
184
+ detected.add("angular");
185
+ }
186
+ if (files.some((file) => /(^|\/)\.?adonisrc\.(?:json|[cm]?[jt]s)$/.test(file.path))) {
187
+ detected.add("adonisjs");
188
+ }
164
189
  // Hono: like Express, the import is only trusted when no manifest can confirm it.
165
190
  if (!hasReliableManifest && sourceFiles.some((file) => /from\s+["']hono["']/.test(file.content))) {
166
191
  detected.add("hono");
@@ -174,6 +199,9 @@ const REMIX_PACKAGES = [
174
199
  "@remix-run/dev", "@remix-run/react", "@remix-run/serve",
175
200
  "@remix-run/node", "@remix-run/cloudflare", "@remix-run/deno"
176
201
  ];
202
+ const QWIK_PACKAGES = ["@builder.io/qwik-city", "@builder.io/qwik", "@qwik.dev/router", "@qwik.dev/core"];
203
+ // v6 ships `@adonisjs/core`; v4 and v5 ship `@adonisjs/framework` / `@adonisjs/core` too.
204
+ const ADONIS_PACKAGES = ["@adonisjs/core", "@adonisjs/framework"];
177
205
  const TANSTACK_ROUTER_PACKAGES = [
178
206
  "@tanstack/react-router", "@tanstack/solid-router",
179
207
  "@tanstack/router-plugin", "@tanstack/router-vite-plugin", "@tanstack/router-cli"
@@ -1 +1 @@
1
- {"version":3,"file":"frameworkDetector.js","sourceRoot":"","sources":["../../../src/analyzers/detectors/frameworkDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frameworkDetector.js","sourceRoot":"","sources":["../../../src/analyzers/detectors/frameworkDetector.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"honoRouteDetector.d.ts","sourceRoot":"","sources":["../../../src/analyzers/detectors/honoRouteDetector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAgDpD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC/B,SAAS,EAAE,CA2Ob"}
1
+ {"version":3,"file":"honoRouteDetector.d.ts","sourceRoot":"","sources":["../../../src/analyzers/detectors/honoRouteDetector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAsGpD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC/B,SAAS,EAAE,CA6Ub"}
@@ -1,9 +1,7 @@
1
- import { posix } from "node:path";
2
1
  import { ts } from "ts-morph";
3
2
  import { isArchitectureSource } from "../graph/index.js";
4
- import { matchLocalPath, normalizePath } from "../graph/localPaths.js";
5
3
  import { parseSource, propertyKeyName, stringValue, unwrapExpression } from "./astUtils.js";
6
- import { joinRoutePaths, sortRoutes } from "./routeUtils.js";
4
+ import { joinRoutePaths, resolveImportedFile, sortRoutes } from "./routeUtils.js";
7
5
  /**
8
6
  * Hono apps are plain values, so they are followed the way the runtime builds
9
7
  * them instead of by pattern:
@@ -15,13 +13,62 @@ import { joinRoutePaths, sortRoutes } from "./routeUtils.js";
15
13
  * app.route('/api', api) // import api from './api' ...also across files
16
14
  * app.openapi(createRoute({ method, path }), h) @hono/zod-openapi
17
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
+ *
18
19
  * Only apps nobody mounts are walked from the top, so each endpoint is listed
19
20
  * once, under its full URL. Handlers must be registered on a value this module
20
- * can trace to `new Hono()`: apps built by a factory function are not followed.
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.
21
24
  */
22
25
  const HONO_MODULE = /^(?:hono|hono\/.+|@hono\/.+)$/;
23
26
  const HONO_CLASSES = new Set(["Hono", "OpenAPIHono"]);
24
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
+ }
25
72
  export function detectHonoRoutes(files, graph) {
26
73
  const sources = files.filter((file) => isArchitectureSource(file.path) && /\.[cm]?[jt]sx?$/.test(file.path));
27
74
  const byPath = new Map(sources.map((file) => [file.path, file]));
@@ -39,6 +86,8 @@ export function detectHonoRoutes(files, graph) {
39
86
  return built;
40
87
  };
41
88
  const apps = new Map();
89
+ /** Routes a function registers on one of its parameters, replayed at each call. */
90
+ const paramRoutes = new Map();
42
91
  const handles = new Map();
43
92
  const resolving = new Set();
44
93
  const appAt = (file, node) => {
@@ -50,50 +99,82 @@ export function detectHonoRoutes(files, graph) {
50
99
  }
51
100
  return app;
52
101
  };
53
- const resolveImport = (from, specifier) => {
54
- if (specifier.startsWith(".")) {
55
- const target = normalizePath(posix.join(posix.dirname(from), specifier));
56
- return target === null ? undefined : matchLocalPath(target, localPaths) ?? undefined;
57
- }
58
- // Aliased specifier (`@/server/api`): pick the one graph edge it can be.
59
- const tail = specifier.replace(/^[@~#$][^/]*\//, "").replace(/^\/+/, "");
60
- if (!tail || tail === specifier)
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)
61
107
  return undefined;
62
- const matches = (graph?.[from] ?? []).filter((path) => {
63
- const bare = path.replace(/\.[cm]?[jt]sx?$/, "").replace(/\/index$/, "");
64
- return bare === tail || bare.endsWith(`/${tail}`);
65
- });
66
- return matches.length === 1 ? matches[0] : 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;
67
111
  };
68
112
  /** Follow identifiers (and imports) until an expression that is not a name. */
69
113
  const resolveValue = (path, expression, seen = new Set()) => {
70
114
  const node = unwrapExpression(expression);
71
115
  if (!ts.isIdentifier(node))
72
116
  return { path, expression: node };
73
- const key = `${path}#${node.text}`;
117
+ const key = `${path}#${node.getStart()}`;
74
118
  if (seen.has(key))
75
119
  return undefined;
76
120
  seen.add(key);
77
- const current = model(path);
78
- if (!current)
79
- return undefined;
80
- const local = current.variables.get(node.text);
81
- if (local)
82
- return resolveValue(path, local, seen);
83
- const imported = current.imports.get(node.text);
84
- if (!imported)
85
- return undefined;
86
- const targetPath = resolveImport(path, imported.specifier);
87
- const target = targetPath ? model(targetPath) : undefined;
88
- if (!targetPath || !target)
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)
89
127
  return undefined;
90
- if (imported.imported === "default") {
128
+ const { targetPath, target, imported } = binding;
129
+ if (imported === "default") {
91
130
  return target.defaultExport ? resolveValue(targetPath, target.defaultExport, seen) : undefined;
92
131
  }
93
- const localName = target.exports.get(imported.imported);
132
+ const localName = target.exports.get(imported);
94
133
  const initializer = localName ? target.variables.get(localName) : undefined;
95
134
  return initializer ? resolveValue(targetPath, initializer, seen) : undefined;
96
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
+ };
97
178
  /** Which app (and base path) an expression evaluates to, if any. */
98
179
  const handleOf = (path, expression) => {
99
180
  const resolved = resolveValue(path, expression);
@@ -113,17 +194,27 @@ export function detectHonoRoutes(files, graph) {
113
194
  if (home && ts.isNewExpression(node) && ts.isIdentifier(node.expression) && home.honoClasses.has(node.expression.text)) {
114
195
  handle = { app: appAt(resolved.path, node), base: "" };
115
196
  }
116
- else if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {
117
- const method = node.expression.name.text;
118
- if (method === "createApp" && /\bcreateFactory\b/.test(node.expression.expression.getText())) {
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)) {
119
201
  handle = { app: appAt(resolved.path, node), base: "" };
120
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
+ }
121
208
  else {
122
- const receiver = handleOf(resolved.path, node.expression.expression);
123
- if (receiver) {
124
- handle = method === "basePath"
125
- ? { app: receiver.app, base: joinRoutePaths(receiver.base, stringValue(node.arguments[0]) ?? "") }
126
- : receiver;
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 };
127
218
  }
128
219
  }
129
220
  }
@@ -153,9 +244,49 @@ export function detectHonoRoutes(files, graph) {
153
244
  }
154
245
  return routePath === undefined ? undefined : { path: routePath, ...(method ? { method } : {}) };
155
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
+ };
156
287
  const candidates = sources.filter((file) => /hono/i.test(file.content));
157
- // Every call is judged on its own: `handleOf` resolves the receiver without
158
- // side effects, so a chain like `app.get().post()` registers each call once.
288
+ // Pass 1: functions that register routes on a parameter, so a call such as
289
+ // `registerUsers(app)` can replay them wherever it happens.
159
290
  for (const file of candidates) {
160
291
  const current = model(file.path);
161
292
  if (!current)
@@ -164,57 +295,61 @@ export function detectHonoRoutes(files, graph) {
164
295
  if (!ts.isCallExpression(node) || !ts.isPropertyAccessExpression(node.expression))
165
296
  return;
166
297
  const method = node.expression.name.text;
167
- const isVerb = VERB_METHODS.has(method);
168
- if (!isVerb && method !== "on" && method !== "route" && method !== "openapi")
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")
169
339
  return;
170
340
  const receiver = handleOf(file.path, node.expression.expression);
171
341
  if (!receiver)
172
342
  return;
173
- const args = node.arguments;
174
343
  if (method === "route") {
175
- const prefix = stringValue(args[0]);
176
- const child = args[1] ? handleOf(file.path, args[1]) : undefined;
344
+ const prefix = stringValue(node.arguments[0]);
345
+ const child = node.arguments[1] ? handleOf(file.path, node.arguments[1]) : undefined;
177
346
  if (prefix === undefined || !child || child.app === receiver.app)
178
347
  return;
179
348
  child.app.mounted = true;
180
349
  receiver.app.mounts.push({ prefix: joinRoutePaths(receiver.base, prefix), target: child.app });
181
350
  return;
182
351
  }
183
- if (method === "openapi") {
184
- const definition = args[0] ? openApiRoute(file.path, args[0]) : undefined;
185
- if (!definition)
186
- return;
187
- receiver.app.routes.push({
188
- path: joinRoutePaths(receiver.base, openApiPath(definition.path)),
189
- ...(definition.method ? { method: definition.method } : {}),
190
- file: file.path
191
- });
192
- return;
193
- }
194
- if (method === "on") {
195
- const methods = stringList(args[0]);
196
- const paths = stringList(args[1]);
197
- for (const path of paths) {
198
- for (const verb of methods.length > 0 ? methods : [undefined]) {
199
- receiver.app.routes.push({
200
- path: joinRoutePaths(receiver.base, path),
201
- ...(verb ? { method: verb.toUpperCase() } : {}),
202
- file: file.path
203
- });
204
- }
205
- }
206
- return;
207
- }
208
- // `c.get('user')` and friends take a key, not a path, but never resolve
209
- // to an app, so anything that gets here is a route.
210
- const path = stringValue(args[0]);
211
- if (path === undefined)
212
- return;
213
- receiver.app.routes.push({
214
- path: joinRoutePaths(receiver.base, path),
215
- ...(method === "all" ? {} : { method: method.toUpperCase() }),
216
- file: file.path
217
- });
352
+ receiver.app.routes.push(...routesOf(file.path, node, method, receiver.base));
218
353
  });
219
354
  }
220
355
  const routes = new Map();
@@ -257,6 +392,7 @@ function buildModel(file) {
257
392
  honoClasses: new Set(),
258
393
  imports: new Map(),
259
394
  variables: new Map(),
395
+ functions: new Map(),
260
396
  exports: new Map()
261
397
  };
262
398
  for (const statement of source.statements) {
@@ -277,6 +413,15 @@ function buildModel(file) {
277
413
  }
278
414
  }
279
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
+ }
280
425
  else if (ts.isVariableStatement(statement)) {
281
426
  const exported = statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword);
282
427
  for (const declaration of statement.declarationList.declarations) {
@@ -309,6 +454,9 @@ function buildModel(file) {
309
454
  }
310
455
  return model;
311
456
  }
457
+ function hasModifier(node, kind) {
458
+ return ts.canHaveModifiers(node) && Boolean(ts.getModifiers(node)?.some((modifier) => modifier.kind === kind));
459
+ }
312
460
  function walk(node, visit) {
313
461
  visit(node);
314
462
  ts.forEachChild(node, (child) => walk(child, visit));