@appport/assessment 0.0.0-stage → 0.1.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/dist/http.js ADDED
@@ -0,0 +1,306 @@
1
+ /**
2
+ * HTTP-route candidates (scanner 2): the routes a JavaScript or TypeScript application registers, as assessment candidates.
3
+ *
4
+ * `js.ts` reads each file; this module composes them. A router's routes carry the prefixes of every `app.use(prefix, router)` that
5
+ * leads to it, found across files through relative imports and the repository's own `jsconfig.json` / `tsconfig.json` path aliases.
6
+ *
7
+ * A route is evidence that an entry point exists. It is not evidence of what the entry point accepts or does: the handler's body is
8
+ * not read, what a middleware enforces is not established, and the request and response shapes are unknown unless the route's own
9
+ * text states them (a path parameter). So a route is at best `investigate`, never `exposure-candidate`, and says why. The effect
10
+ * proposed for it follows the HTTP method by convention and is marked inferred.
11
+ */
12
+ import { posix } from "node:path";
13
+ import {} from "./artifact.js";
14
+ import { joinPaths, pathParameters } from "./js.js";
15
+ const EXTENSIONS = ["", ".js", ".mjs", ".cjs", ".ts", ".mts", ".cts"];
16
+ const order = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
17
+ const SAFE = new Set(["get", "head", "options"]);
18
+ /** `compilerOptions.paths` of the nearest `jsconfig.json` / `tsconfig.json` above `dir`, as `[prefix, targetDirectory]` pairs. */
19
+ function aliasesFor(dir, sources, cache) {
20
+ const hit = cache.get(dir);
21
+ if (hit)
22
+ return hit;
23
+ let found = [];
24
+ for (const name of ["jsconfig.json", "tsconfig.json"]) {
25
+ const path = posix.join(dir, name);
26
+ const text = sources.paths.has(path) ? sources.text(path) : undefined;
27
+ if (text === undefined)
28
+ continue;
29
+ try {
30
+ const options = JSON.parse(text.replace(/^\s*\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "").replace(/,(\s*[}\]])/g, "$1")).compilerOptions;
31
+ const base = posix.join(dir, options?.baseUrl ?? ".");
32
+ for (const [alias, targets] of Object.entries(options?.paths ?? {})) {
33
+ const target = targets[0];
34
+ if (target)
35
+ found.push([alias.replace(/\*$/, ""), posix.join(base, target.replace(/\*$/, ""))]);
36
+ }
37
+ if (options?.baseUrl && !found.length)
38
+ found.push(["", base]);
39
+ break;
40
+ }
41
+ catch {
42
+ // A config this reader cannot parse contributes no aliases; imports through them stay unresolved.
43
+ }
44
+ }
45
+ if (!found.length && dir !== "." && dir !== "")
46
+ found = aliasesFor(posix.dirname(dir), sources, cache);
47
+ cache.set(dir, found);
48
+ return found;
49
+ }
50
+ export function httpCandidates(sources, sink) {
51
+ const { record, at } = sink;
52
+ const aliasCache = new Map();
53
+ const findings = [];
54
+ const resolveModule = (from, specifier) => {
55
+ const candidates = [];
56
+ if (specifier.startsWith("."))
57
+ candidates.push(posix.join(posix.dirname(from), specifier));
58
+ else
59
+ for (const [prefix, target] of aliasesFor(posix.dirname(from), sources, aliasCache))
60
+ if (prefix && specifier.startsWith(prefix))
61
+ candidates.push(posix.join(target, specifier.slice(prefix.length)));
62
+ for (const base of candidates)
63
+ for (const ext of EXTENSIONS)
64
+ for (const path of [`${base}${ext}`, ...(ext ? [] : EXTENSIONS.slice(1).map((e) => `${base}/index${e}`))])
65
+ if (sources.paths.has(path))
66
+ return path;
67
+ return undefined;
68
+ };
69
+ const edges = [];
70
+ const key = (n) => `${n.file}\0${n.receiver}`;
71
+ for (const [file, js] of sources.files) {
72
+ for (const mount of js.mounts) {
73
+ let child;
74
+ if (js.receivers.has(mount.target))
75
+ child = { file, receiver: mount.target };
76
+ else {
77
+ const head = mount.target.split(".")[0];
78
+ const imported = js.imports.get(head);
79
+ const module = imported ? resolveModule(file, imported.specifier) : undefined;
80
+ const target = module ? sources.files.get(module) : undefined;
81
+ if (module && target) {
82
+ const named = imported.imported && imported.imported !== "default" ? imported.imported : mount.target.split(".")[1];
83
+ if (named && target.receivers.has(named))
84
+ child = { file: module, receiver: named };
85
+ else if (target.exports && target.receivers.has(target.exports))
86
+ child = { file: module, receiver: target.exports };
87
+ }
88
+ }
89
+ if (child)
90
+ edges.push({ parent: { file, receiver: mount.receiver }, child, mount, file });
91
+ }
92
+ }
93
+ const parentsOf = new Map();
94
+ for (const e of edges)
95
+ parentsOf.set(key(e.child), [...(parentsOf.get(key(e.child)) ?? []), e]);
96
+ /** Every way a receiver is reached from a root: the chain of mounts, outermost first. */
97
+ const contexts = (node, seen = new Set()) => {
98
+ const k = key(node);
99
+ const parents = parentsOf.get(k) ?? [];
100
+ const kind = sources.files.get(node.file)?.receivers.get(node.receiver)?.kind;
101
+ if (!parents.length || seen.has(k) || seen.size > 8)
102
+ return [{ chain: [], root: kind === "app" ? "app" : "router" }];
103
+ const next = new Set(seen).add(k);
104
+ return parents.flatMap((edge) => contexts(edge.parent, next).map((c) => ({ chain: [...c.chain, edge], root: c.root })));
105
+ };
106
+ // ---- locating a handler's definition ----
107
+ const lines = (path) => sources.text(path)?.split("\n");
108
+ const definitionIn = (module, name) => {
109
+ const text = lines(module);
110
+ if (!text)
111
+ return undefined;
112
+ const escaped = name.replace(/[$]/g, "\\$");
113
+ const patterns = [
114
+ new RegExp(`(?:module\\.)?exports\\.${escaped}\\s*=`),
115
+ new RegExp(`\\b(?:const|let|var|function\\*?|async function)\\s+${escaped}\\b`),
116
+ new RegExp(`^\\s*(?:async\\s+)?${escaped}\\s*\\(`),
117
+ new RegExp(`^\\s*${escaped}\\s*:`),
118
+ new RegExp(`^\\s*export\\s+(?:async\\s+)?(?:function|const)\\s+${escaped}\\b`)
119
+ ];
120
+ const at_ = text.findIndex((l) => patterns.some((p) => p.test(l)));
121
+ return at_ >= 0 ? { line: at_ + 1 } : undefined;
122
+ };
123
+ const candidates = [];
124
+ const used = new Map();
125
+ let routes = 0;
126
+ let unresolvedHandlers = 0;
127
+ const dynamic = [];
128
+ const templated = new Set();
129
+ const unmounted = new Set();
130
+ for (const [file, js] of [...sources.files].sort(([a], [b]) => order(a, b))) {
131
+ for (const route of js.routes) {
132
+ const node = { file, receiver: route.receiver };
133
+ if (route.path.resolution === "unknown") {
134
+ dynamic.push({ file, line: route.startLine });
135
+ continue;
136
+ }
137
+ for (const ctx of route.controller ? [{ chain: [], root: "app" }] : contexts(node)) {
138
+ if (ctx.root === "router" && !route.controller)
139
+ unmounted.add(file);
140
+ const prefixes = ctx.chain.map((e) => e.mount.prefix);
141
+ if (prefixes.some((p) => p.resolution === "unknown")) {
142
+ dynamic.push({ file, line: route.startLine });
143
+ continue;
144
+ }
145
+ const placeholders = [...new Set([...prefixes.flatMap((p) => p.placeholders), ...route.path.placeholders])];
146
+ for (const p of placeholders)
147
+ templated.add(p);
148
+ const path = joinPaths(...prefixes.map((p) => p.value), route.path.value);
149
+ routes++;
150
+ candidates.push(buildCandidate(file, js, route, path, placeholders, ctx));
151
+ }
152
+ }
153
+ }
154
+ function textHas(path, startLine, endLine, subject) {
155
+ return (lines(path) ?? []).slice(startLine - 1, endLine).join("\n").includes(subject);
156
+ }
157
+ function evidenceFor(path, startLine, endLine, e) {
158
+ // An observed record's subject must occur in the lines it cites; a subject that is not literally there is left out.
159
+ const subject = e.subject !== undefined && textHas(path, startLine, endLine, e.subject) ? e.subject : undefined;
160
+ const { subject: _drop, ...rest } = e;
161
+ return record({ ...rest, ...(subject !== undefined ? { subject } : {}), location: at(path, startLine, endLine) });
162
+ }
163
+ function buildCandidate(file, js, route, path, placeholders, ctx) {
164
+ const method = route.method.toUpperCase();
165
+ const subject = `${method} ${path}`;
166
+ const routeEvidence = evidenceFor(file, route.startLine, route.endLine, {
167
+ class: "observed",
168
+ kind: "js.route",
169
+ subject: route.path.raw || undefined,
170
+ observation: `${route.framework} route ${subject} is registered on ${route.receiver}${ctx.chain.length ? ` (mounted through ${ctx.chain.map((e) => `${e.file}:${e.mount.line}`).join(" -> ")})` : ""}`,
171
+ method: "js-static"
172
+ });
173
+ const mountEvidence = ctx.chain.map((e) => evidenceFor(e.file, e.mount.line, e.mount.line, { class: "observed", kind: "js.mount", subject: e.mount.prefix.raw || undefined, observation: `${e.parent.receiver} mounts ${e.mount.target}${e.mount.prefix.raw ? ` at ${e.mount.prefix.raw}` : ""}`, method: "js-static" }));
174
+ // Middleware: named, never characterized. What a middleware enforces is not established.
175
+ const middleware = [
176
+ ...ctx.chain.flatMap((e) => e.mount.middleware.map((m) => ({ m, file: e.file, scope: "mount" }))),
177
+ ...route.middleware.map((m) => ({ m, file, scope: "route" }))
178
+ ];
179
+ const middlewareEvidence = middleware.map(({ m, file: f, scope }) => evidenceFor(f, m.line, m.line, { class: "observed", kind: "js.middleware", subject: m.text.replace(/\(…\)$/, ""), observation: `${m.text} runs before the handler (registered on the ${scope})`, method: "js-static" }));
180
+ // The handler: inline (its lines are the implementation), or a reference followed one import to a definition when it can be.
181
+ let implementation;
182
+ const handler = route.handler;
183
+ const evidenceIds = [routeEvidence, ...mountEvidence, ...middlewareEvidence];
184
+ if (handler?.kind === "inline") {
185
+ const definitionEvidence = evidenceFor(file, handler.startLine, handler.endLine, { class: "observed", kind: "js.handler", observation: `an inline handler is defined here for ${subject}`, method: "js-static" });
186
+ implementation = { symbol: `${file}:${subject}`, location: at(file, handler.startLine, handler.endLine), link: "route-inline", evidence: [definitionEvidence] };
187
+ }
188
+ else if (handler?.kind === "reference" && handler.reference) {
189
+ const [head, ...rest] = handler.reference.split(".");
190
+ const imported = js.imports.get(head);
191
+ const member = rest.length ? rest[rest.length - 1] : imported?.imported && imported.imported !== "default" ? imported.imported : head;
192
+ if (route.controller) {
193
+ const definitionEvidence = evidenceFor(file, handler.startLine, handler.endLine, { class: "observed", kind: "js.handler", subject: member, observation: `${handler.reference} is the controller method for ${subject}`, method: "js-static" });
194
+ implementation = { symbol: `${file}:${handler.reference}`, location: at(file, handler.startLine, handler.endLine), link: "route-handler-reference", evidence: [definitionEvidence] };
195
+ }
196
+ else {
197
+ const module = imported ? resolveModule(file, imported.specifier) : undefined;
198
+ const found = module ? definitionIn(module, member) : !imported ? (() => { const d = definitionIn(file, member); return d ? { line: d.line } : undefined; })() : undefined;
199
+ const where = module && found ? module : !imported && found ? file : undefined;
200
+ if (where && found) {
201
+ const definitionEvidence = evidenceFor(where, found.line, found.line, { class: "observed", kind: "js.definition", subject: member, observation: `${member} is defined here; ${subject} references it as ${handler.reference}`, method: "js-static" });
202
+ implementation = { symbol: `${where}#${member}`, location: at(where, found.line, found.line), link: "route-handler-reference", evidence: [definitionEvidence] };
203
+ }
204
+ }
205
+ }
206
+ if (!implementation)
207
+ unresolvedHandlers++;
208
+ if (implementation)
209
+ evidenceIds.push(...implementation.evidence);
210
+ // The proposed effect follows the method by convention. It is inferred, and says the handler was not read.
211
+ const safe = SAFE.has(route.method);
212
+ const effect = safe ? "observation" : "consequential";
213
+ const effectEvidence = record({
214
+ class: "inferred",
215
+ kind: "http.effect",
216
+ location: at(file, route.startLine, route.endLine),
217
+ observation: safe ? `${method} is safe by HTTP convention; the handler was not read, so nothing says it has no side effect` : `${method} is not safe by HTTP convention, so it is assumed to change state; the handler was not read`,
218
+ method: "derivation",
219
+ basis: [routeEvidence],
220
+ limitations: ["a handler can break the convention in either direction"]
221
+ });
222
+ evidenceIds.push(effectEvidence);
223
+ // Everything the route text does not say is an unknown, recorded as such.
224
+ const unknown = (kind, observation) => record({ class: "unknown", kind, location: at(file, route.startLine, route.endLine), subject: subject, observation, method: "js-static" });
225
+ const unknownIds = [
226
+ unknown("unknown.handler", implementation ? "the handler's body was not read: the assessment reads route registrations, not what a handler does" : `the handler${handler?.reference ? ` ${handler.reference}` : ""} could not be located (it is built by a function, imported through a re-export, or not a name this reader follows)`),
227
+ unknown("unknown.request-shape", "the request body and query this route accepts are not stated in the route's text"),
228
+ unknown("unknown.response-shape", "what this route returns is not stated in the route's text"),
229
+ unknown("unknown.authorization", middleware.length ? `${middleware.map((x) => x.m.text).join(", ")} run before the handler; what they enforce is not established` : "no middleware is registered on this route or its mounts; whether the handler checks a caller is not established")
230
+ ];
231
+ for (const id of unknownIds)
232
+ evidenceIds.push(id);
233
+ if (placeholders.length) {
234
+ const id = unknown("unknown.path-placeholder", `the path contains ${placeholders.map((p) => `{${p}}`).join(", ")}: names whose values come from code this reader did not evaluate`);
235
+ unknownIds.push(id);
236
+ evidenceIds.push(id);
237
+ }
238
+ // The request shape the route text does state: its path parameters.
239
+ const fields = pathParameters(path).map((p) => ({ name: p.name, jsonName: p.name, type: "string", label: p.optional ? "optional" : "required", behaviors: ["path-parameter"], evidence: [routeEvidence] }));
240
+ for (const read of handler?.kind === "inline" ? handler.reads : []) {
241
+ const [where, name] = read.split(".");
242
+ const id = evidenceFor(file, handler.startLine, handler.endLine, { class: "observed", kind: "js.request-read", subject: `${where}.${name}`, observation: `the inline handler reads request ${where}.${name}`, method: "js-static" });
243
+ evidenceIds.push(id);
244
+ fields.push({ name, jsonName: name, type: "unknown", label: "optional", behaviors: [where === "body" ? "body" : where === "query" ? "query" : "path-parameter"], evidence: [id] });
245
+ }
246
+ const inputs = { message: `${subject} request`, resolved: false, fields, unresolvedTypes: [], evidence: [routeEvidence] };
247
+ // Readiness: an entry point and (perhaps) a located handler are all the route text establishes.
248
+ const satisfied = (criterion, ok, reason, ev) => ({ criterion, satisfied: ok, reason, evidence: ev });
249
+ const criteria = [
250
+ satisfied("entry-point", true, "http-route-registered", [routeEvidence]),
251
+ satisfied("implementation", Boolean(implementation), implementation ? (implementation.link === "route-inline" ? "inline-handler" : "handler-reference-located") : "handler-not-located", implementation?.evidence ?? [unknownIds[0]]),
252
+ satisfied("io-schema", false, "no-request-or-response-schema-in-source", [unknownIds[1], unknownIds[2]]),
253
+ satisfied("validation", false, "validation-not-established", [unknownIds[1]]),
254
+ satisfied("authorization", false, "authorization-not-established", [unknownIds[3]]),
255
+ satisfied("tests", false, "tests-not-searched-for-http-routes", []),
256
+ satisfied("reachability-complete", false, "handler-body-not-analyzed", [unknownIds[0]]),
257
+ satisfied("small-surface", false, "handler-body-not-analyzed", [unknownIds[0]])
258
+ ];
259
+ const concerns = safe ? [] : [{ concern: "writes-state", evidence: [effectEvidence] }];
260
+ const readinessClass = implementation ? "investigate" : "insufficient-evidence";
261
+ const slug = subject.replace(/[^A-Za-z0-9]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase();
262
+ let id = `cand-http.${slug}`;
263
+ const n = (used.get(id) ?? 0) + 1;
264
+ used.set(id, n);
265
+ if (n > 1)
266
+ id = `${id}.${n}`;
267
+ const operation = { kind: "http", method, path, framework: route.framework, placeholders };
268
+ return {
269
+ id,
270
+ name: subject,
271
+ description: `${route.framework} route ${subject}, registered on ${route.receiver} in ${file}`,
272
+ operation,
273
+ entryPoints: [{ kind: "http-route", subject, evidence: [routeEvidence, ...mountEvidence] }],
274
+ ...(implementation ? { implementation } : {}),
275
+ inputs,
276
+ dependencies: { reachableFunctions: [], externalPackages: [], unresolvedCalls: 0, truncated: false },
277
+ sideEffects: { persistence: [], outboundHttp: [], async: [] },
278
+ authorization: { denials: [], policyReferences: [] },
279
+ validation: { rejections: [] },
280
+ tests: [],
281
+ evidence: [...new Set(evidenceIds)].sort(order),
282
+ confidence: implementation?.link === "route-inline" ? "linked" : implementation ? "weakly-linked" : "unlinked",
283
+ readiness: { class: readinessClass, criteria, concerns },
284
+ unknowns: [...new Set(unknownIds)].sort(order),
285
+ exposure: {
286
+ status: "proposed",
287
+ authoritative: false,
288
+ effectBasis: { effect, reasons: [safe ? "http-method-safe-by-convention" : "http-method-unsafe-by-convention", "handler-not-read"], evidence: [effectEvidence] },
289
+ missing: ["capability-name", "input-schema", "output-schema", "permissions", "fulfillment-claim", "verification-method", "contract-tests"]
290
+ }
291
+ };
292
+ }
293
+ candidates.sort((a, b) => order(a.id, b.id));
294
+ // ---- findings ----
295
+ if (dynamic.length)
296
+ findings.push({ code: "ROUTE_PATH_UNREADABLE", severity: "info", message: `${dynamic.length} route registrations have a path that is not a string, a template or a + of those, so no route was recorded for them (${dynamic.slice(0, 5).map((d) => `${d.file}:${d.line}`).join(", ")}${dynamic.length > 5 ? ", …" : ""})` });
297
+ if (templated.size)
298
+ findings.push({ code: "ROUTE_PATH_PLACEHOLDER", severity: "info", message: `paths contain names whose values were not evaluated (${[...templated].sort().map((p) => `{${p}}`).join(", ")}): each such route is one template, not one route per value` });
299
+ if (unmounted.size)
300
+ findings.push({ code: "ROUTER_NOT_MOUNTED", severity: "info", message: `routers in ${[...unmounted].sort().join(", ")} are not mounted by any file read here, so their routes carry no prefix` });
301
+ const unreadable = [...sources.files].flatMap(([file, js]) => js.unreadable.map((u) => ({ file, ...u })));
302
+ if (unreadable.length)
303
+ findings.push({ code: "ROUTE_REGISTRATION_UNREADABLE", severity: "info", message: `${unreadable.length} registrations could not be read (${unreadable.slice(0, 3).map((u) => `${u.file}:${u.line} ${u.reason}`).join("; ")}${unreadable.length > 3 ? "; …" : ""})` });
304
+ return { candidates, findings, routes, unresolvedHandlers };
305
+ }
306
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from "./artifact.js";
2
+ export { assessRepository, DEFAULTS, LIMITATIONS, limitationsFor, type AssessOptions } from "./analyze.js";
3
+ export { DEFAULT_EXCLUDED_DIRECTORIES, DEFAULT_MAX_FILE_BYTES, RepositoryError, type SkipReason } from "./files.js";
4
+ export { proposeCapabilityName, messageSchema } from "./proposal.js";
5
+ export { gitIdentity, isInside, readRepositoryFile, repositoryRoot } from "./files.js";
6
+ export { main as assessmentCli, type CliIO } from "./cli.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACpH,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from "./artifact.js";
2
+ export { assessRepository, DEFAULTS, LIMITATIONS, limitationsFor } from "./analyze.js";
3
+ export { DEFAULT_EXCLUDED_DIRECTORIES, DEFAULT_MAX_FILE_BYTES, RepositoryError } from "./files.js";
4
+ export { proposeCapabilityName, messageSchema } from "./proposal.js";
5
+ export { gitIdentity, isInside, readRepositoryFile, repositoryRoot } from "./files.js";
6
+ export { main as assessmentCli } from "./cli.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAsB,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AACpH,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,IAAI,IAAI,aAAa,EAAc,MAAM,UAAU,CAAC"}
package/dist/js.d.ts ADDED
@@ -0,0 +1,115 @@
1
+ /**
2
+ * A reader for the part of JavaScript and TypeScript that registers HTTP routes: a tokenizer and a recognizer over its tokens.
3
+ * It reads text only; it never runs, resolves packages or follows anything outside the repository.
4
+ *
5
+ * What it recognizes (and nothing else):
6
+ * - receivers, by how they are declared: `express()`, `express.Router()`, `Router()`, `new Router()`, `fastify()`, `Fastify()`, `new Hono()`.
7
+ * A call such as `cache.get('key')` is not a route, because `cache` is not a receiver;
8
+ * - routes on a receiver: `r.get('/p', ...)`, `r.route('/p').get(...).post(...)`, Fastify's `r.route({ method, url, handler })`;
9
+ * - NestJS: `@Controller('prefix')` classes with `@Get('p')` and the like on their methods;
10
+ * - mounts: `app.use('/prefix', ...middleware, router)`, where `router` is declared here or imported from a relative module (or a path
11
+ * alias the caller supplies), so a router's routes carry the prefixes that lead to it.
12
+ *
13
+ * What it does not do: evaluate anything. A path that is not a string, a template or a `+` of strings and names has no known value and
14
+ * is reported as `dynamic`; a name inside a path (`/${entity}/create`) is kept as a `{entity}` placeholder, never guessed. Routes
15
+ * registered in a loop, by a helper or by reflection are found only as far as the registration call itself is literal.
16
+ */
17
+ export type TokenKind = "id" | "str" | "tpl" | "num" | "p" | "re";
18
+ export interface Token {
19
+ kind: TokenKind;
20
+ /** Identifier, punctuator or number text; a string's value; a template's raw source between the backticks. */
21
+ value: string;
22
+ line: number;
23
+ endLine: number;
24
+ /** Template literals: the source of each `${…}` expression and the text between them. */
25
+ exprs?: string[];
26
+ quasis?: string[];
27
+ }
28
+ export declare class JsSyntaxError extends Error {
29
+ readonly line: number;
30
+ constructor(message: string, line: number);
31
+ }
32
+ /** @throws JsSyntaxError for an unterminated string, template, comment or regular expression. */
33
+ export declare function tokenize(text: string): Token[];
34
+ export declare const HTTP_METHODS: readonly ["get", "post", "put", "patch", "delete", "head", "options", "all"];
35
+ export type Framework = "express" | "fastify" | "koa-router" | "hono" | "nest";
36
+ /** The value a path argument has in the source, when it has one. */
37
+ export interface PathValue {
38
+ /** The path with each name in it kept as `{name}`. Meaningless when `dynamic` is `unknown`. */
39
+ value: string;
40
+ /** Names that stand in the path and whose values this reader does not know (`/${entity}/list` has `entity`). */
41
+ placeholders: string[];
42
+ /** `known`: only literals; `placeholders`: literals and names; `unknown`: not a string, a template or a `+` of those. */
43
+ resolution: "known" | "placeholders" | "unknown";
44
+ /** The path as written, for citing: it occurs in the cited lines. */
45
+ raw: string;
46
+ }
47
+ export interface Handler {
48
+ /** What the handler argument is. */
49
+ kind: "inline" | "reference";
50
+ /** For a reference: `ns.name` or `name`. */
51
+ reference?: string;
52
+ /** A call the handler is wrapped in (`catchErrors(…)`), by its callee. */
53
+ wrapper?: string;
54
+ startLine: number;
55
+ endLine: number;
56
+ /** Request properties an inline handler reads: `body.x`, `query.y`, `params.z`. */
57
+ reads: string[];
58
+ }
59
+ export interface Middleware {
60
+ /** The callee or reference as written: `adminAuth.isValidAuthToken`, `singleStorageUpload(…)`. */
61
+ text: string;
62
+ line: number;
63
+ }
64
+ export interface RouteSite {
65
+ receiver: string;
66
+ framework: Framework;
67
+ method: string;
68
+ path: PathValue;
69
+ startLine: number;
70
+ endLine: number;
71
+ middleware: Middleware[];
72
+ handler?: Handler;
73
+ /** The route was found in a class decorated `@Controller` (its path already includes the controller's prefix). */
74
+ controller?: string;
75
+ }
76
+ export interface MountSite {
77
+ receiver: string;
78
+ prefix: PathValue;
79
+ /** Identifier mounted: a local receiver or an imported name. */
80
+ target: string;
81
+ middleware: Middleware[];
82
+ line: number;
83
+ }
84
+ export interface ImportRef {
85
+ /** The module specifier as written. */
86
+ specifier: string;
87
+ /** For `const { a: b } = require('m')` or `import { a as b }`: the exported name `a`. */
88
+ imported?: string;
89
+ }
90
+ export interface JsFile {
91
+ receivers: Map<string, {
92
+ framework: Framework;
93
+ kind: "app" | "router";
94
+ line: number;
95
+ }>;
96
+ routes: RouteSite[];
97
+ mounts: MountSite[];
98
+ imports: Map<string, ImportRef>;
99
+ /** The receiver this module exports as a whole (`module.exports = router`, `export default router`). */
100
+ exports?: string;
101
+ /** Mentions of `app.use(...)`-style mounts or route calls that could not be read, with the reason. */
102
+ unreadable: Array<{
103
+ line: number;
104
+ reason: string;
105
+ }>;
106
+ }
107
+ export declare function readJs(tokens: Token[]): JsFile;
108
+ /** Joins mount prefixes and a route path into one path: `/api` + `/login` = `/api/login`. */
109
+ export declare function joinPaths(...parts: string[]): string;
110
+ /** Express path parameters of a path: `:id`, `:settingKey?`. */
111
+ export declare function pathParameters(path: string): Array<{
112
+ name: string;
113
+ optional: boolean;
114
+ }>;
115
+ //# sourceMappingURL=js.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js.d.ts","sourceRoot":"","sources":["../src/js.ts"],"names":[],"mappings":"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"}