@gloocan/cat-inspector 0.1.1
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/artifact-helpers.d.ts +4 -0
- package/dist/artifact-helpers.d.ts.map +1 -0
- package/dist/artifact-helpers.js +21 -0
- package/dist/artifact-helpers.js.map +1 -0
- package/dist/ast/get-all-ts-files.d.ts +5 -0
- package/dist/ast/get-all-ts-files.d.ts.map +1 -0
- package/dist/ast/get-all-ts-files.js +36 -0
- package/dist/ast/get-all-ts-files.js.map +1 -0
- package/dist/ast/merge-ast.d.ts +3 -0
- package/dist/ast/merge-ast.d.ts.map +1 -0
- package/dist/ast/merge-ast.js +40 -0
- package/dist/ast/merge-ast.js.map +1 -0
- package/dist/ast/run-ast-scanner.d.ts +15 -0
- package/dist/ast/run-ast-scanner.d.ts.map +1 -0
- package/dist/ast/run-ast-scanner.js +44 -0
- package/dist/ast/run-ast-scanner.js.map +1 -0
- package/dist/ast/scan-for-labels.d.ts +20 -0
- package/dist/ast/scan-for-labels.d.ts.map +1 -0
- package/dist/ast/scan-for-labels.js +88 -0
- package/dist/ast/scan-for-labels.js.map +1 -0
- package/dist/ast/scan-for-returns.d.ts +13 -0
- package/dist/ast/scan-for-returns.d.ts.map +1 -0
- package/dist/ast/scan-for-returns.js +48 -0
- package/dist/ast/scan-for-returns.js.map +1 -0
- package/dist/ast/type-expand.d.ts +16 -0
- package/dist/ast/type-expand.d.ts.map +1 -0
- package/dist/ast/type-expand.js +118 -0
- package/dist/ast/type-expand.js.map +1 -0
- package/dist/ast/visit-node.d.ts +31 -0
- package/dist/ast/visit-node.d.ts.map +1 -0
- package/dist/ast/visit-node.js +298 -0
- package/dist/ast/visit-node.js.map +1 -0
- package/dist/bootstrap.d.ts +105 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +121 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/catalog-bootstrap-cache.d.ts +23 -0
- package/dist/catalog-bootstrap-cache.d.ts.map +1 -0
- package/dist/catalog-bootstrap-cache.js +54 -0
- package/dist/catalog-bootstrap-cache.js.map +1 -0
- package/dist/catalog-fingerprint.d.ts +20 -0
- package/dist/catalog-fingerprint.d.ts.map +1 -0
- package/dist/catalog-fingerprint.js +57 -0
- package/dist/catalog-fingerprint.js.map +1 -0
- package/dist/coverage/compute-coverage.d.ts +41 -0
- package/dist/coverage/compute-coverage.d.ts.map +1 -0
- package/dist/coverage/compute-coverage.js +229 -0
- package/dist/coverage/compute-coverage.js.map +1 -0
- package/dist/coverage/scan-all-service-candidates.d.ts +15 -0
- package/dist/coverage/scan-all-service-candidates.d.ts.map +1 -0
- package/dist/coverage/scan-all-service-candidates.js +73 -0
- package/dist/coverage/scan-all-service-candidates.js.map +1 -0
- package/dist/coverage/scan-express-candidates.d.ts +17 -0
- package/dist/coverage/scan-express-candidates.d.ts.map +1 -0
- package/dist/coverage/scan-express-candidates.js +300 -0
- package/dist/coverage/scan-express-candidates.js.map +1 -0
- package/dist/coverage/scan-reachable-services.d.ts +13 -0
- package/dist/coverage/scan-reachable-services.d.ts.map +1 -0
- package/dist/coverage/scan-reachable-services.js +469 -0
- package/dist/coverage/scan-reachable-services.js.map +1 -0
- package/dist/coverage/types.d.ts +32 -0
- package/dist/coverage/types.d.ts.map +1 -0
- package/dist/coverage/types.js +2 -0
- package/dist/coverage/types.js.map +1 -0
- package/dist/decorators/cat-class.d.ts +11 -0
- package/dist/decorators/cat-class.d.ts.map +1 -0
- package/dist/decorators/cat-class.js +20 -0
- package/dist/decorators/cat-class.js.map +1 -0
- package/dist/decorators/cat.d.ts +3 -0
- package/dist/decorators/cat.d.ts.map +1 -0
- package/dist/decorators/cat.js +102 -0
- package/dist/decorators/cat.js.map +1 -0
- package/dist/express-inspector-correlation.d.ts +23 -0
- package/dist/express-inspector-correlation.d.ts.map +1 -0
- package/dist/express-inspector-correlation.js +50 -0
- package/dist/express-inspector-correlation.js.map +1 -0
- package/dist/express-playground-mocks.d.ts +28 -0
- package/dist/express-playground-mocks.d.ts.map +1 -0
- package/dist/express-playground-mocks.js +55 -0
- package/dist/express-playground-mocks.js.map +1 -0
- package/dist/express-qa-host-minio-upload.d.ts +16 -0
- package/dist/express-qa-host-minio-upload.d.ts.map +1 -0
- package/dist/express-qa-host-minio-upload.js +56 -0
- package/dist/express-qa-host-minio-upload.js.map +1 -0
- package/dist/express.d.ts +21 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +167 -0
- package/dist/express.js.map +1 -0
- package/dist/functional.d.ts +15 -0
- package/dist/functional.d.ts.map +1 -0
- package/dist/functional.js +165 -0
- package/dist/functional.js.map +1 -0
- package/dist/graph/relationships.d.ts +9 -0
- package/dist/graph/relationships.d.ts.map +1 -0
- package/dist/graph/relationships.js +92 -0
- package/dist/graph/relationships.js.map +1 -0
- package/dist/http-bridge-registry.d.ts +26 -0
- package/dist/http-bridge-registry.d.ts.map +1 -0
- package/dist/http-bridge-registry.js +39 -0
- package/dist/http-bridge-registry.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/invoke-policy.d.ts +34 -0
- package/dist/invoke-policy.d.ts.map +1 -0
- package/dist/invoke-policy.js +72 -0
- package/dist/invoke-policy.js.map +1 -0
- package/dist/invoke-runtime-config.d.ts +4 -0
- package/dist/invoke-runtime-config.d.ts.map +1 -0
- package/dist/invoke-runtime-config.js +15 -0
- package/dist/invoke-runtime-config.js.map +1 -0
- package/dist/jobs/in-memory-job-registry.d.ts +21 -0
- package/dist/jobs/in-memory-job-registry.d.ts.map +1 -0
- package/dist/jobs/in-memory-job-registry.js +44 -0
- package/dist/jobs/in-memory-job-registry.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +17 -0
- package/dist/logger.js.map +1 -0
- package/dist/openapi/registry-to-openapi.d.ts +11 -0
- package/dist/openapi/registry-to-openapi.d.ts.map +1 -0
- package/dist/openapi/registry-to-openapi.js +61 -0
- package/dist/openapi/registry-to-openapi.js.map +1 -0
- package/dist/registry-state.d.ts +107 -0
- package/dist/registry-state.d.ts.map +1 -0
- package/dist/registry-state.js +302 -0
- package/dist/registry-state.js.map +1 -0
- package/dist/return.d.ts +14 -0
- package/dist/return.d.ts.map +1 -0
- package/dist/return.js +107 -0
- package/dist/return.js.map +1 -0
- package/dist/rpc.d.ts +7 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +287 -0
- package/dist/rpc.js.map +1 -0
- package/dist/serialize-rpc-result.d.ts +38 -0
- package/dist/serialize-rpc-result.d.ts.map +1 -0
- package/dist/serialize-rpc-result.js +132 -0
- package/dist/serialize-rpc-result.js.map +1 -0
- package/dist/session-store.d.ts +9 -0
- package/dist/session-store.d.ts.map +1 -0
- package/dist/session-store.js +19 -0
- package/dist/session-store.js.map +1 -0
- package/dist/source-utils.d.ts +19 -0
- package/dist/source-utils.d.ts.map +1 -0
- package/dist/source-utils.js +65 -0
- package/dist/source-utils.js.map +1 -0
- package/dist/transport/remote-bridge-cli.d.ts +2 -0
- package/dist/transport/remote-bridge-cli.d.ts.map +1 -0
- package/dist/transport/remote-bridge-cli.js +12 -0
- package/dist/transport/remote-bridge-cli.js.map +1 -0
- package/dist/transport/remote-inspector-bridge.d.ts +18 -0
- package/dist/transport/remote-inspector-bridge.d.ts.map +1 -0
- package/dist/transport/remote-inspector-bridge.js +71 -0
- package/dist/transport/remote-inspector-bridge.js.map +1 -0
- package/dist/transport/socket-io-playground.d.ts +78 -0
- package/dist/transport/socket-io-playground.d.ts.map +1 -0
- package/dist/transport/socket-io-playground.js +875 -0
- package/dist/transport/socket-io-playground.js.map +1 -0
- package/dist/transport/socket-io.d.ts +4 -0
- package/dist/transport/socket-io.d.ts.map +1 -0
- package/dist/transport/socket-io.js +4 -0
- package/dist/transport/socket-io.js.map +1 -0
- package/dist/transport/ws-server.d.ts +42 -0
- package/dist/transport/ws-server.d.ts.map +1 -0
- package/dist/transport/ws-server.js +429 -0
- package/dist/transport/ws-server.js.map +1 -0
- package/dist/type-string-normalize.d.ts +24 -0
- package/dist/type-string-normalize.d.ts.map +1 -0
- package/dist/type-string-normalize.js +178 -0
- package/dist/type-string-normalize.js.map +1 -0
- package/dist/types.d.ts +218 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/upload/fetch-file-url.d.ts +24 -0
- package/dist/upload/fetch-file-url.d.ts.map +1 -0
- package/dist/upload/fetch-file-url.js +130 -0
- package/dist/upload/fetch-file-url.js.map +1 -0
- package/dist/upload/host-minio-client.d.ts +30 -0
- package/dist/upload/host-minio-client.d.ts.map +1 -0
- package/dist/upload/host-minio-client.js +56 -0
- package/dist/upload/host-minio-client.js.map +1 -0
- package/dist/upload/materialize.d.ts +110 -0
- package/dist/upload/materialize.d.ts.map +1 -0
- package/dist/upload/materialize.js +466 -0
- package/dist/upload/materialize.js.map +1 -0
- package/dist/upload/upload-store.d.ts +44 -0
- package/dist/upload/upload-store.d.ts.map +1 -0
- package/dist/upload/upload-store.js +86 -0
- package/dist/upload/upload-store.js.map +1 -0
- package/dist/validate-params-json-schema.d.ts +13 -0
- package/dist/validate-params-json-schema.d.ts.map +1 -0
- package/dist/validate-params-json-schema.js +37 -0
- package/dist/validate-params-json-schema.js.map +1 -0
- package/dist/validate-return-json-schema.d.ts +9 -0
- package/dist/validate-return-json-schema.d.ts.map +1 -0
- package/dist/validate-return-json-schema.js +33 -0
- package/dist/validate-return-json-schema.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import ts from 'typescript';
|
|
4
|
+
import { getAllTsFiles } from '../ast/get-all-ts-files.js';
|
|
5
|
+
import { scanExpressCandidates, } from './scan-express-candidates.js';
|
|
6
|
+
function isImportOrExportDeclaration(decl) {
|
|
7
|
+
return (ts.isImportSpecifier(decl) ||
|
|
8
|
+
ts.isNamespaceImport(decl) ||
|
|
9
|
+
ts.isImportClause(decl) ||
|
|
10
|
+
ts.isNamespaceExport(decl) ||
|
|
11
|
+
ts.isExportSpecifier(decl) ||
|
|
12
|
+
ts.isExportAssignment(decl));
|
|
13
|
+
}
|
|
14
|
+
function bestCallableDeclaration(decls) {
|
|
15
|
+
for (const d of decls) {
|
|
16
|
+
if (ts.isFunctionDeclaration(d))
|
|
17
|
+
return d;
|
|
18
|
+
if (ts.isMethodDeclaration(d))
|
|
19
|
+
return d;
|
|
20
|
+
if (ts.isFunctionExpression(d))
|
|
21
|
+
return d;
|
|
22
|
+
if (ts.isArrowFunction(d))
|
|
23
|
+
return d;
|
|
24
|
+
if (ts.isVariableDeclaration(d) && d.initializer)
|
|
25
|
+
return d;
|
|
26
|
+
}
|
|
27
|
+
return decls[0] ?? null;
|
|
28
|
+
}
|
|
29
|
+
function resolveSymbolToCallableDeclaration(checker, program, sym) {
|
|
30
|
+
let cur = sym;
|
|
31
|
+
// Safety bound; alias chains can get weird in complex projects.
|
|
32
|
+
for (let i = 0; i < 10 && cur; i++) {
|
|
33
|
+
if (cur.flags & ts.SymbolFlags.Alias) {
|
|
34
|
+
cur = checker.getAliasedSymbol(cur);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const decls = cur.getDeclarations?.() ?? [];
|
|
38
|
+
const best = bestCallableDeclaration(decls);
|
|
39
|
+
if (!best)
|
|
40
|
+
return null;
|
|
41
|
+
// If the only thing we can see is an import/export declaration, try once more:
|
|
42
|
+
// TypeScript usually marks these as Alias symbols; but in some cases the decl list
|
|
43
|
+
// still contains import/export nodes as the first entry. Fall back to resolving
|
|
44
|
+
// a symbol at the declaration name site.
|
|
45
|
+
if (isImportOrExportDeclaration(best)) {
|
|
46
|
+
// Special-case: for some NodeNext setups (notably when TS source imports use `.js`
|
|
47
|
+
// specifiers), the checker may not fully resolve the alias. Try a best-effort
|
|
48
|
+
// manual resolution from ImportSpecifier -> exported declaration in the module.
|
|
49
|
+
if (ts.isImportSpecifier(best)) {
|
|
50
|
+
const imp = best;
|
|
51
|
+
const namedImport = imp.propertyName?.text ?? imp.name.text;
|
|
52
|
+
const importDecl = imp.parent?.parent?.parent;
|
|
53
|
+
if (importDecl && ts.isImportDeclaration(importDecl)) {
|
|
54
|
+
const mod = importDecl.moduleSpecifier;
|
|
55
|
+
if (ts.isStringLiteral(mod) || ts.isNoSubstitutionTemplateLiteral(mod)) {
|
|
56
|
+
const fromFile = importDecl.getSourceFile().fileName;
|
|
57
|
+
const fromDir = path.dirname(fromFile);
|
|
58
|
+
const spec = mod.text;
|
|
59
|
+
const candidates = [];
|
|
60
|
+
// Common case: TS file imports with `.js` extension.
|
|
61
|
+
if (spec.endsWith('.js'))
|
|
62
|
+
candidates.push(spec.slice(0, -3) + '.ts');
|
|
63
|
+
candidates.push(spec);
|
|
64
|
+
// Resolve to absolute paths and try to find a source file in the current program.
|
|
65
|
+
for (const rel of candidates) {
|
|
66
|
+
const abs = path.resolve(fromDir, rel);
|
|
67
|
+
const sf = program.getSourceFile(abs);
|
|
68
|
+
if (!sf)
|
|
69
|
+
continue;
|
|
70
|
+
// Find `export function namedImport` or `export const namedImport = ...`
|
|
71
|
+
for (const st of sf.statements) {
|
|
72
|
+
if (ts.isFunctionDeclaration(st) &&
|
|
73
|
+
st.name &&
|
|
74
|
+
st.name.text === namedImport &&
|
|
75
|
+
(st.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false)) {
|
|
76
|
+
return st;
|
|
77
|
+
}
|
|
78
|
+
if (ts.isVariableStatement(st)) {
|
|
79
|
+
const isExported = st.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false;
|
|
80
|
+
if (!isExported)
|
|
81
|
+
continue;
|
|
82
|
+
for (const decl of st.declarationList.declarations) {
|
|
83
|
+
if (ts.isIdentifier(decl.name) && decl.name.text === namedImport) {
|
|
84
|
+
return decl;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const nameNode = (ts.isImportSpecifier(best) || ts.isExportSpecifier(best)) && best.name
|
|
94
|
+
? best.name
|
|
95
|
+
: ts.isNamespaceImport(best)
|
|
96
|
+
? best.name
|
|
97
|
+
: ts.isImportClause(best) && best.name
|
|
98
|
+
? best.name
|
|
99
|
+
: null;
|
|
100
|
+
if (nameNode) {
|
|
101
|
+
const next = checker.getSymbolAtLocation(nameNode) ?? null;
|
|
102
|
+
if (next && next !== cur) {
|
|
103
|
+
cur = next;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return best;
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
function loadCompilerOptions(rootDir, extra) {
|
|
113
|
+
const configPath = ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.json');
|
|
114
|
+
if (!configPath) {
|
|
115
|
+
return {
|
|
116
|
+
...(extra ?? {}),
|
|
117
|
+
target: ts.ScriptTarget.ES2022,
|
|
118
|
+
module: ts.ModuleKind.NodeNext,
|
|
119
|
+
moduleResolution: ts.ModuleResolutionKind.NodeNext,
|
|
120
|
+
strict: true,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const read = ts.readConfigFile(configPath, (p) => fs.readFileSync(p, 'utf8'));
|
|
124
|
+
if (read.error) {
|
|
125
|
+
throw new Error(ts.formatDiagnostic(read.error, ts.createCompilerHost({})));
|
|
126
|
+
}
|
|
127
|
+
const parsed = ts.parseJsonConfigFileContent(read.config, ts.sys, path.dirname(configPath), undefined, configPath);
|
|
128
|
+
return { ...parsed.options, ...extra };
|
|
129
|
+
}
|
|
130
|
+
function posOf(source, node) {
|
|
131
|
+
const lc = source.getLineAndCharacterOfPosition(node.getStart(source, false));
|
|
132
|
+
return {
|
|
133
|
+
file: source.fileName,
|
|
134
|
+
line: lc.line + 1,
|
|
135
|
+
col: lc.character + 1,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function declarationId(source, node) {
|
|
139
|
+
const p = posOf(source, node);
|
|
140
|
+
return `${p.file}:${p.line}:${p.col}:${node.kind}`;
|
|
141
|
+
}
|
|
142
|
+
function isDeclWithBody(node) {
|
|
143
|
+
return (ts.isFunctionDeclaration(node) ||
|
|
144
|
+
ts.isFunctionExpression(node) ||
|
|
145
|
+
ts.isArrowFunction(node) ||
|
|
146
|
+
ts.isMethodDeclaration(node) ||
|
|
147
|
+
ts.isVariableDeclaration(node));
|
|
148
|
+
}
|
|
149
|
+
function bestServiceName(checker, decl) {
|
|
150
|
+
if (ts.isVariableDeclaration(decl) && ts.isIdentifier(decl.name)) {
|
|
151
|
+
return decl.name.text;
|
|
152
|
+
}
|
|
153
|
+
if (ts.isMethodDeclaration(decl) && ts.isIdentifier(decl.name)) {
|
|
154
|
+
// catModule('X', { method(){...} }) methods live in an object literal, not a class.
|
|
155
|
+
// Try to recover `X.method` by walking up the AST.
|
|
156
|
+
const p1 = decl.parent;
|
|
157
|
+
const p2 = p1 && ts.isObjectLiteralExpression(p1) ? p1.parent : null;
|
|
158
|
+
if (p2 && ts.isCallExpression(p2) && ts.isIdentifier(p2.expression) && p2.expression.text === 'catModule') {
|
|
159
|
+
const modArg = p2.arguments[0];
|
|
160
|
+
if (modArg && (ts.isStringLiteral(modArg) || ts.isNoSubstitutionTemplateLiteral(modArg))) {
|
|
161
|
+
return `${modArg.text}.${decl.name.text}`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const cls = decl.parent;
|
|
165
|
+
if (ts.isClassDeclaration(cls) && cls.name)
|
|
166
|
+
return `${cls.name.text}.${decl.name.text}`;
|
|
167
|
+
return decl.name.text;
|
|
168
|
+
}
|
|
169
|
+
if (ts.isFunctionDeclaration(decl) && decl.name)
|
|
170
|
+
return decl.name.text;
|
|
171
|
+
const sym = checker.getSymbolAtLocation(decl.name ?? decl);
|
|
172
|
+
return sym?.getName?.() ?? 'anonymous';
|
|
173
|
+
}
|
|
174
|
+
function isOwnedSourceFile(fileName, ownedRoots) {
|
|
175
|
+
const norm = fileName.split(path.sep).join('/');
|
|
176
|
+
if (norm.includes('/node_modules/'))
|
|
177
|
+
return false;
|
|
178
|
+
if (ownedRoots.length === 0)
|
|
179
|
+
return true;
|
|
180
|
+
const abs = path.resolve(fileName);
|
|
181
|
+
return ownedRoots.some((r) => abs === r || abs.startsWith(r + path.sep));
|
|
182
|
+
}
|
|
183
|
+
function unwrapCatInitializerToCallableBody(init) {
|
|
184
|
+
// cat('X.Y', fn)
|
|
185
|
+
if (ts.isCallExpression(init) && ts.isIdentifier(init.expression) && init.expression.text === 'cat') {
|
|
186
|
+
const fnArg = init.arguments[1];
|
|
187
|
+
if (fnArg && (ts.isFunctionExpression(fnArg) || ts.isArrowFunction(fnArg)))
|
|
188
|
+
return fnArg;
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
// inline: const f = () => {} or function(){}
|
|
192
|
+
if (ts.isArrowFunction(init) || ts.isFunctionExpression(init))
|
|
193
|
+
return init;
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
function buildCatModuleMethodMap(varDecl) {
|
|
197
|
+
// const pricing = catModule('PricingService', { applyTax(){...}, quoteTotal(){...} })
|
|
198
|
+
if (!varDecl.initializer)
|
|
199
|
+
return null;
|
|
200
|
+
const init = varDecl.initializer;
|
|
201
|
+
if (!ts.isCallExpression(init))
|
|
202
|
+
return null;
|
|
203
|
+
if (!ts.isIdentifier(init.expression) || init.expression.text !== 'catModule')
|
|
204
|
+
return null;
|
|
205
|
+
const moduleArg = init.arguments[0];
|
|
206
|
+
const objArg = init.arguments[1];
|
|
207
|
+
if (!moduleArg || !objArg)
|
|
208
|
+
return null;
|
|
209
|
+
if (!ts.isStringLiteral(moduleArg) && !ts.isNoSubstitutionTemplateLiteral(moduleArg))
|
|
210
|
+
return null;
|
|
211
|
+
if (!ts.isObjectLiteralExpression(objArg))
|
|
212
|
+
return null;
|
|
213
|
+
const moduleName = moduleArg.text;
|
|
214
|
+
const methods = new Map();
|
|
215
|
+
for (const prop of objArg.properties) {
|
|
216
|
+
if (ts.isMethodDeclaration(prop) && prop.name && prop.body) {
|
|
217
|
+
const name = ts.isIdentifier(prop.name)
|
|
218
|
+
? prop.name.text
|
|
219
|
+
: ts.isStringLiteral(prop.name)
|
|
220
|
+
? prop.name.text
|
|
221
|
+
: null;
|
|
222
|
+
if (name)
|
|
223
|
+
methods.set(name, prop);
|
|
224
|
+
}
|
|
225
|
+
if (ts.isPropertyAssignment(prop) && prop.name) {
|
|
226
|
+
const name = ts.isIdentifier(prop.name)
|
|
227
|
+
? prop.name.text
|
|
228
|
+
: ts.isStringLiteral(prop.name)
|
|
229
|
+
? prop.name.text
|
|
230
|
+
: null;
|
|
231
|
+
if (!name)
|
|
232
|
+
continue;
|
|
233
|
+
const rhs = prop.initializer;
|
|
234
|
+
if (ts.isArrowFunction(rhs) || ts.isFunctionExpression(rhs)) {
|
|
235
|
+
methods.set(name, rhs);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return { moduleName, methods };
|
|
240
|
+
}
|
|
241
|
+
function resolveCalledDeclaration(checker, program, call) {
|
|
242
|
+
// Resolve `foo()` or `obj.method()`.
|
|
243
|
+
let target = call.expression;
|
|
244
|
+
if (ts.isPropertyAccessExpression(call.expression)) {
|
|
245
|
+
target = call.expression.name;
|
|
246
|
+
}
|
|
247
|
+
const sym = checker.getSymbolAtLocation(target);
|
|
248
|
+
if (!sym)
|
|
249
|
+
return null;
|
|
250
|
+
return resolveSymbolToCallableDeclaration(checker, program, sym);
|
|
251
|
+
}
|
|
252
|
+
function resolveHandlerToDeclaration(checker, program, expr) {
|
|
253
|
+
// Inline functions are their own declarations.
|
|
254
|
+
if (ts.isArrowFunction(expr) || ts.isFunctionExpression(expr))
|
|
255
|
+
return expr;
|
|
256
|
+
// `ctrl.create` -> resolve the symbol on `create`.
|
|
257
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
258
|
+
const sym = checker.getSymbolAtLocation(expr.name);
|
|
259
|
+
if (!sym)
|
|
260
|
+
return null;
|
|
261
|
+
return resolveSymbolToCallableDeclaration(checker, program, sym);
|
|
262
|
+
}
|
|
263
|
+
// `createOrder` -> resolve identifier.
|
|
264
|
+
if (ts.isIdentifier(expr)) {
|
|
265
|
+
const sym = checker.getSymbolAtLocation(expr);
|
|
266
|
+
if (!sym)
|
|
267
|
+
return null;
|
|
268
|
+
return resolveSymbolToCallableDeclaration(checker, program, sym);
|
|
269
|
+
}
|
|
270
|
+
// Factories / higher-order handlers: `makeMw()` are not safely resolvable.
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
function collectCalls(body) {
|
|
274
|
+
const out = [];
|
|
275
|
+
const visit = (n) => {
|
|
276
|
+
if (ts.isCallExpression(n))
|
|
277
|
+
out.push(n);
|
|
278
|
+
ts.forEachChild(n, visit);
|
|
279
|
+
};
|
|
280
|
+
visit(body);
|
|
281
|
+
return out;
|
|
282
|
+
}
|
|
283
|
+
export function scanReachableServices(rootDir, options = {}) {
|
|
284
|
+
// Reuse express candidate scanning to find entrypoints (controllers + middleware).
|
|
285
|
+
const httpCandidates = scanExpressCandidates(rootDir, options);
|
|
286
|
+
const files = options.files ?? getAllTsFiles(rootDir, options.getAllTsFilesOptions);
|
|
287
|
+
const compilerOptions = loadCompilerOptions(rootDir, options.compilerOptions);
|
|
288
|
+
const program = ts.createProgram(files, compilerOptions);
|
|
289
|
+
const checker = program.getTypeChecker();
|
|
290
|
+
const ownedRoots = (options.ownedRoots ?? []).map((p) => path.resolve(p));
|
|
291
|
+
const maxNodes = options.maxNodes ?? 5_000;
|
|
292
|
+
let nodesVisited = 0;
|
|
293
|
+
const services = [];
|
|
294
|
+
const seenDecl = new Set();
|
|
295
|
+
// For resolving pricing.applyTax() where pricing is catModule(...)
|
|
296
|
+
const catModuleBindings = new Map();
|
|
297
|
+
// Pre-scan for catModule bindings in owned files.
|
|
298
|
+
for (const sf of program.getSourceFiles()) {
|
|
299
|
+
if (!isOwnedSourceFile(sf.fileName, ownedRoots))
|
|
300
|
+
continue;
|
|
301
|
+
const visit = (n) => {
|
|
302
|
+
if (ts.isVariableDeclaration(n) && ts.isIdentifier(n.name)) {
|
|
303
|
+
const map = buildCatModuleMethodMap(n);
|
|
304
|
+
if (map) {
|
|
305
|
+
catModuleBindings.set(n.name.text, map);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
ts.forEachChild(n, visit);
|
|
309
|
+
};
|
|
310
|
+
visit(sf);
|
|
311
|
+
}
|
|
312
|
+
function enqueueServiceDecl(decl) {
|
|
313
|
+
const src = decl.getSourceFile();
|
|
314
|
+
const id = declarationId(src, decl);
|
|
315
|
+
if (seenDecl.has(id))
|
|
316
|
+
return;
|
|
317
|
+
seenDecl.add(id);
|
|
318
|
+
}
|
|
319
|
+
function addServiceCandidate(decl) {
|
|
320
|
+
const src = decl.getSourceFile();
|
|
321
|
+
if (!isOwnedSourceFile(src.fileName, ownedRoots))
|
|
322
|
+
return;
|
|
323
|
+
const callable = resolveToCallable(decl);
|
|
324
|
+
if (!callable)
|
|
325
|
+
return;
|
|
326
|
+
const body = callable.body;
|
|
327
|
+
if (!body)
|
|
328
|
+
return;
|
|
329
|
+
const id = declarationId(src, decl);
|
|
330
|
+
if (seenDecl.has(id))
|
|
331
|
+
return;
|
|
332
|
+
seenDecl.add(id);
|
|
333
|
+
services.push({
|
|
334
|
+
kind: 'service',
|
|
335
|
+
name: bestServiceName(checker, decl),
|
|
336
|
+
source: posOf(src, decl),
|
|
337
|
+
resolvedFnKey: ts.isMethodDeclaration(callable) || ts.isFunctionDeclaration(callable)
|
|
338
|
+
? bestServiceName(checker, callable)
|
|
339
|
+
: null,
|
|
340
|
+
_nodeKind: decl.kind,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
function resolveToCallable(decl) {
|
|
344
|
+
if (ts.isFunctionDeclaration(decl) || ts.isFunctionExpression(decl) || ts.isArrowFunction(decl)) {
|
|
345
|
+
return decl;
|
|
346
|
+
}
|
|
347
|
+
if (ts.isMethodDeclaration(decl))
|
|
348
|
+
return decl;
|
|
349
|
+
if (ts.isVariableDeclaration(decl) && decl.initializer) {
|
|
350
|
+
const unwrapped = unwrapCatInitializerToCallableBody(decl.initializer);
|
|
351
|
+
if (unwrapped)
|
|
352
|
+
return unwrapped;
|
|
353
|
+
}
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
function walkFromDecl(decl) {
|
|
357
|
+
if (nodesVisited >= maxNodes)
|
|
358
|
+
return;
|
|
359
|
+
nodesVisited++;
|
|
360
|
+
const callable = resolveToCallable(decl);
|
|
361
|
+
if (!callable || !callable.body)
|
|
362
|
+
return;
|
|
363
|
+
const body = callable.body;
|
|
364
|
+
for (const call of collectCalls(body)) {
|
|
365
|
+
let calledDecl = resolveCalledDeclaration(checker, program, call);
|
|
366
|
+
// If the checker resolves to a signature/type-only declaration (no body),
|
|
367
|
+
// treat it as unresolved so we can fall back to catModule bindings.
|
|
368
|
+
if (calledDecl && !isDeclWithBody(calledDecl)) {
|
|
369
|
+
calledDecl = null;
|
|
370
|
+
}
|
|
371
|
+
// Fallback for catModule objects: pricing.applyTax(...)
|
|
372
|
+
if (!calledDecl && ts.isPropertyAccessExpression(call.expression)) {
|
|
373
|
+
const recv = call.expression.expression;
|
|
374
|
+
const method = call.expression.name.text;
|
|
375
|
+
if (ts.isIdentifier(recv)) {
|
|
376
|
+
const binding = catModuleBindings.get(recv.text);
|
|
377
|
+
const fn = binding?.methods.get(method) ?? null;
|
|
378
|
+
if (binding && fn) {
|
|
379
|
+
// Record as a service candidate with a stable fnKey and recurse into the body.
|
|
380
|
+
const src = fn.getSourceFile();
|
|
381
|
+
if (isOwnedSourceFile(src.fileName, ownedRoots)) {
|
|
382
|
+
const id = declarationId(src, fn);
|
|
383
|
+
if (!seenDecl.has(id)) {
|
|
384
|
+
seenDecl.add(id);
|
|
385
|
+
services.push({
|
|
386
|
+
kind: 'service',
|
|
387
|
+
name: `${binding.moduleName}.${method}`,
|
|
388
|
+
source: posOf(src, fn),
|
|
389
|
+
resolvedFnKey: `${binding.moduleName}.${method}`,
|
|
390
|
+
_nodeKind: fn.kind,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// Recurse into the method body even if it was already seen.
|
|
395
|
+
walkFromDecl(fn);
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (!calledDecl)
|
|
401
|
+
continue;
|
|
402
|
+
// Only treat function/method-like declarations as service candidates.
|
|
403
|
+
if (!isDeclWithBody(calledDecl))
|
|
404
|
+
continue;
|
|
405
|
+
addServiceCandidate(calledDecl);
|
|
406
|
+
walkFromDecl(calledDecl);
|
|
407
|
+
if (nodesVisited >= maxNodes)
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// Roots: handler expressions discovered earlier. We don’t have AST nodes here, so re-parse
|
|
412
|
+
// the handler by using the recorded file+line (best-effort). Instead, resolve by rescanning
|
|
413
|
+
// each candidate’s file and finding the first node at/after that position.
|
|
414
|
+
//
|
|
415
|
+
// This is intentionally best-effort; it favors correctness when it can resolve, and otherwise
|
|
416
|
+
// gracefully undercounts nested services rather than producing incorrect links.
|
|
417
|
+
function tryResolveCandidateDecl(c) {
|
|
418
|
+
const src = program.getSourceFile(c.source.file) ??
|
|
419
|
+
program.getSourceFile(path.resolve(c.source.file));
|
|
420
|
+
if (!src)
|
|
421
|
+
return null;
|
|
422
|
+
const pos = ts.getPositionOfLineAndCharacter(src, c.source.line - 1, c.source.col - 1);
|
|
423
|
+
let found = null;
|
|
424
|
+
const visit = (n) => {
|
|
425
|
+
const start = n.getStart(src, false);
|
|
426
|
+
const end = n.getEnd();
|
|
427
|
+
if (pos < start || pos > end)
|
|
428
|
+
return;
|
|
429
|
+
found = n;
|
|
430
|
+
ts.forEachChild(n, visit);
|
|
431
|
+
};
|
|
432
|
+
visit(src);
|
|
433
|
+
if (!found)
|
|
434
|
+
return null;
|
|
435
|
+
const f = found;
|
|
436
|
+
// Candidate positions point at the handler expression, not necessarily a declaration.
|
|
437
|
+
// Try resolving common shapes.
|
|
438
|
+
if (ts.isIdentifier(f))
|
|
439
|
+
return resolveHandlerToDeclaration(checker, program, f);
|
|
440
|
+
if (ts.isPropertyAccessExpression(f))
|
|
441
|
+
return resolveHandlerToDeclaration(checker, program, f);
|
|
442
|
+
if (ts.isCallExpression(f)) {
|
|
443
|
+
const call = f;
|
|
444
|
+
// If position points to `.bind(...)` call, unwrap to expression.
|
|
445
|
+
const callee = call.expression;
|
|
446
|
+
if (ts.isPropertyAccessExpression(callee) && callee.name.text === 'bind') {
|
|
447
|
+
const inner = callee.expression;
|
|
448
|
+
if (ts.isPropertyAccessExpression(inner) || ts.isIdentifier(inner)) {
|
|
449
|
+
return resolveHandlerToDeclaration(checker, program, inner);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return null;
|
|
453
|
+
}
|
|
454
|
+
if (ts.isArrowFunction(f) || ts.isFunctionExpression(f))
|
|
455
|
+
return f;
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
for (const c of [...httpCandidates.middleware, ...httpCandidates.controllers]) {
|
|
459
|
+
const decl = tryResolveCandidateDecl(c);
|
|
460
|
+
if (!decl)
|
|
461
|
+
continue;
|
|
462
|
+
enqueueServiceDecl(decl);
|
|
463
|
+
walkFromDecl(decl);
|
|
464
|
+
if (nodesVisited >= maxNodes)
|
|
465
|
+
break;
|
|
466
|
+
}
|
|
467
|
+
return { services, meta: { nodesVisited } };
|
|
468
|
+
}
|
|
469
|
+
//# sourceMappingURL=scan-reachable-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-reachable-services.js","sourceRoot":"","sources":["../../src/coverage/scan-reachable-services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
export type CandidateKind = 'middleware' | 'controller' | 'service';
|
|
3
|
+
export interface SourcePos {
|
|
4
|
+
file: string;
|
|
5
|
+
line: number;
|
|
6
|
+
col: number;
|
|
7
|
+
}
|
|
8
|
+
export interface RouteInfo {
|
|
9
|
+
method: string;
|
|
10
|
+
path: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CandidateRef {
|
|
13
|
+
kind: CandidateKind;
|
|
14
|
+
name: string;
|
|
15
|
+
source: SourcePos;
|
|
16
|
+
route?: RouteInfo;
|
|
17
|
+
/** Best-effort stable id when derivable; for Cat this is typically `Class.method`. */
|
|
18
|
+
resolvedFnKey?: string | null;
|
|
19
|
+
/** Internal: raw node kind for debugging */
|
|
20
|
+
_nodeKind?: ts.SyntaxKind;
|
|
21
|
+
}
|
|
22
|
+
export interface CoverageCandidates {
|
|
23
|
+
middleware: CandidateRef[];
|
|
24
|
+
controllers: CandidateRef[];
|
|
25
|
+
services: CandidateRef[];
|
|
26
|
+
meta: {
|
|
27
|
+
filesScanned: number;
|
|
28
|
+
unresolvedHandlers: number;
|
|
29
|
+
droppedThirdParty: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/coverage/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,CAAA;AAEnE,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACX;AAED,MAAM,WAAW,SAAS;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,aAAa,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,CAAA;IACjB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,EAAE,CAAC,UAAU,CAAA;CACzB;AAED,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,WAAW,EAAE,YAAY,EAAE,CAAA;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,IAAI,EAAE;QACL,YAAY,EAAE,MAAM,CAAA;QACpB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,iBAAiB,EAAE,MAAM,CAAA;KACzB,CAAA;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/coverage/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional class decorator to enable singleton fallback construction for `@Cat` RPC.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* @CatClass()
|
|
6
|
+
* class UserService { ... }
|
|
7
|
+
*/
|
|
8
|
+
export declare function CatClass(): ClassDecorator;
|
|
9
|
+
/** Alias for readability in app code */
|
|
10
|
+
export declare const CatService: typeof CatClass;
|
|
11
|
+
//# sourceMappingURL=cat-class.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cat-class.d.ts","sourceRoot":"","sources":["../../src/decorators/cat-class.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,QAAQ,IAAI,cAAc,CAOzC;AAED,wCAAwC;AACxC,eAAO,MAAM,UAAU,iBAAW,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { registerClassConstructor } from '../registry-state.js';
|
|
2
|
+
/**
|
|
3
|
+
* Optional class decorator to enable singleton fallback construction for `@Cat` RPC.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* @CatClass()
|
|
7
|
+
* class UserService { ... }
|
|
8
|
+
*/
|
|
9
|
+
export function CatClass() {
|
|
10
|
+
return (target) => {
|
|
11
|
+
const ctor = target;
|
|
12
|
+
const name = ctor.name ?? '';
|
|
13
|
+
if (!name)
|
|
14
|
+
return;
|
|
15
|
+
registerClassConstructor(name, ctor);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Alias for readability in app code */
|
|
19
|
+
export const CatService = CatClass;
|
|
20
|
+
//# sourceMappingURL=cat-class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cat-class.js","sourceRoot":"","sources":["../../src/decorators/cat-class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ;IACvB,OAAO,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,IAAI,GAAG,MAAgD,CAAA;QAC7D,MAAM,IAAI,GAAI,IAA0B,CAAC,IAAI,IAAI,EAAE,CAAA;QACnD,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,wBAAwB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACrC,CAAC,CAAA;AACF,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cat.d.ts","sourceRoot":"","sources":["../../src/decorators/cat.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA;AAkBzB,wBAAgB,GAAG,CAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,kBAAkB,GAC5B,kBAAkB,CAwGpB"}
|