@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.
- package/README.md +2 -2
- package/dist/analyzers/detectors/adonisRouteDetector.d.ts +4 -0
- package/dist/analyzers/detectors/adonisRouteDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/adonisRouteDetector.js +242 -0
- package/dist/analyzers/detectors/adonisRouteDetector.js.map +1 -0
- package/dist/analyzers/detectors/angularRouteDetector.d.ts +4 -0
- package/dist/analyzers/detectors/angularRouteDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/angularRouteDetector.js +186 -0
- package/dist/analyzers/detectors/angularRouteDetector.js.map +1 -0
- package/dist/analyzers/detectors/astUtils.d.ts +20 -0
- package/dist/analyzers/detectors/astUtils.d.ts.map +1 -1
- package/dist/analyzers/detectors/astUtils.js +38 -0
- package/dist/analyzers/detectors/astUtils.js.map +1 -1
- package/dist/analyzers/detectors/clientRouteDetector.d.ts +4 -0
- package/dist/analyzers/detectors/clientRouteDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/clientRouteDetector.js +417 -0
- package/dist/analyzers/detectors/clientRouteDetector.js.map +1 -0
- package/dist/analyzers/detectors/elysiaRouteDetector.d.ts +4 -0
- package/dist/analyzers/detectors/elysiaRouteDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/elysiaRouteDetector.js +186 -0
- package/dist/analyzers/detectors/elysiaRouteDetector.js.map +1 -0
- package/dist/analyzers/detectors/frameworkDetector.d.ts +2 -2
- package/dist/analyzers/detectors/frameworkDetector.d.ts.map +1 -1
- package/dist/analyzers/detectors/frameworkDetector.js +29 -1
- package/dist/analyzers/detectors/frameworkDetector.js.map +1 -1
- package/dist/analyzers/detectors/honoRouteDetector.d.ts.map +1 -1
- package/dist/analyzers/detectors/honoRouteDetector.js +230 -82
- package/dist/analyzers/detectors/honoRouteDetector.js.map +1 -1
- package/dist/analyzers/detectors/koaRouteDetector.d.ts +4 -0
- package/dist/analyzers/detectors/koaRouteDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/koaRouteDetector.js +216 -0
- package/dist/analyzers/detectors/koaRouteDetector.js.map +1 -0
- package/dist/analyzers/detectors/moduleBindings.d.ts +52 -0
- package/dist/analyzers/detectors/moduleBindings.d.ts.map +1 -0
- package/dist/analyzers/detectors/moduleBindings.js +295 -0
- package/dist/analyzers/detectors/moduleBindings.js.map +1 -0
- package/dist/analyzers/detectors/qwikRouteDetector.d.ts +4 -0
- package/dist/analyzers/detectors/qwikRouteDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/qwikRouteDetector.js +53 -0
- package/dist/analyzers/detectors/qwikRouteDetector.js.map +1 -0
- package/dist/analyzers/detectors/routeDetector.d.ts.map +1 -1
- package/dist/analyzers/detectors/routeDetector.js +46 -5
- package/dist/analyzers/detectors/routeDetector.js.map +1 -1
- package/dist/analyzers/detectors/routeUtils.d.ts +15 -1
- package/dist/analyzers/detectors/routeUtils.d.ts.map +1 -1
- package/dist/analyzers/detectors/routeUtils.js +51 -0
- package/dist/analyzers/detectors/routeUtils.js.map +1 -1
- package/dist/analyzers/detectors/solidStartRouteDetector.d.ts +4 -0
- package/dist/analyzers/detectors/solidStartRouteDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/solidStartRouteDetector.js +59 -0
- package/dist/analyzers/detectors/solidStartRouteDetector.js.map +1 -0
- package/dist/analyzers/graph/entryPoints.d.ts.map +1 -1
- package/dist/analyzers/graph/entryPoints.js +13 -1
- package/dist/analyzers/graph/entryPoints.js.map +1 -1
- package/dist/analyzers/pipeline/projectMap.d.ts.map +1 -1
- package/dist/analyzers/pipeline/projectMap.js +17 -6
- package/dist/analyzers/pipeline/projectMap.js.map +1 -1
- package/dist/analyzers/pipeline/projectMetadata.js +5 -0
- package/dist/analyzers/pipeline/projectMetadata.js.map +1 -1
- 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,
|
|
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":"AAAA,OAAO,EAAE,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,0EAA0E;AAC1E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;IACtC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM;IACpE,OAAO,EAAE,KAAK,EAAE,QAAQ;CAChB,CAAC;AACX,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK;
|
|
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":"
|
|
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()
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
63
|
-
|
|
64
|
-
|
|
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.
|
|
117
|
+
const key = `${path}#${node.getStart()}`;
|
|
74
118
|
if (seen.has(key))
|
|
75
119
|
return undefined;
|
|
76
120
|
seen.add(key);
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
return undefined;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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
|
|
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)
|
|
117
|
-
const
|
|
118
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
//
|
|
158
|
-
//
|
|
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
|
-
|
|
168
|
-
|
|
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(
|
|
176
|
-
const child =
|
|
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
|
-
|
|
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));
|