@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,298 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { scanForReturns } from './scan-for-returns.js';
|
|
3
|
+
import { scanForApiReturns, scanForThrows } from './scan-for-labels.js';
|
|
4
|
+
import { expandTypeToShapeString } from './type-expand.js';
|
|
5
|
+
function getFunctionLikeSignatureTypes(fn, checker, options) {
|
|
6
|
+
const sig = checker.getSignatureFromDeclaration(fn);
|
|
7
|
+
if (!sig)
|
|
8
|
+
return undefined;
|
|
9
|
+
const params = [];
|
|
10
|
+
for (let i = 0; i < fn.parameters.length; i++) {
|
|
11
|
+
const p = fn.parameters[i];
|
|
12
|
+
const paramName = ts.isIdentifier(p.name) ? p.name.text : `arg${i}`;
|
|
13
|
+
const t = checker.getTypeAtLocation(p);
|
|
14
|
+
const fileMeta = computeFileMetaForType(t, checker, 0, new Set());
|
|
15
|
+
params.push({
|
|
16
|
+
name: paramName,
|
|
17
|
+
type: options.expandParamTypes
|
|
18
|
+
? expandTypeToShapeString(t, checker, p, {
|
|
19
|
+
...options.expandParamTypesOptions,
|
|
20
|
+
program: options.program ?? options.expandParamTypesOptions?.program,
|
|
21
|
+
})
|
|
22
|
+
: checker.typeToString(t),
|
|
23
|
+
...fileMeta,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const ret = checker.getReturnTypeOfSignature(sig);
|
|
27
|
+
const declaredReturn = checker.typeToString(ret);
|
|
28
|
+
return { params, declaredReturn };
|
|
29
|
+
}
|
|
30
|
+
const FILE_TYPE_NAMES = new Set(['File', 'Blob', 'Buffer']);
|
|
31
|
+
function isFileLikeType(t, checker) {
|
|
32
|
+
const sym = t.getSymbol() ?? t.aliasSymbol;
|
|
33
|
+
const name = sym?.getName();
|
|
34
|
+
if (name && FILE_TYPE_NAMES.has(name))
|
|
35
|
+
return true;
|
|
36
|
+
// Fallback: typeToString() can include `File`/`Blob`/`Buffer` even when symbol names vary.
|
|
37
|
+
const s = checker.typeToString(t);
|
|
38
|
+
return s === 'File' || s === 'Blob' || s === 'Buffer';
|
|
39
|
+
}
|
|
40
|
+
function computeFileMetaForType(t, checker, depth,
|
|
41
|
+
// Track by type string to avoid obvious cycles without relying on private `id`.
|
|
42
|
+
seen) {
|
|
43
|
+
if (depth > 6)
|
|
44
|
+
return {};
|
|
45
|
+
const key = checker.typeToString(t);
|
|
46
|
+
if (seen.has(key))
|
|
47
|
+
return {};
|
|
48
|
+
seen.add(key);
|
|
49
|
+
// Top-level single file
|
|
50
|
+
if (isFileLikeType(t, checker))
|
|
51
|
+
return { kind: 'file' };
|
|
52
|
+
// Top-level array of file
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
54
|
+
const anyChecker = checker;
|
|
55
|
+
if (typeof anyChecker.isArrayType === 'function' && anyChecker.isArrayType(t)) {
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
57
|
+
const el = anyChecker.getElementTypeOfArrayType(t);
|
|
58
|
+
if (el && isFileLikeType(el, checker))
|
|
59
|
+
return { kind: 'files' };
|
|
60
|
+
// Arrays of objects might contain nested files; treat via recursive scan below.
|
|
61
|
+
}
|
|
62
|
+
// Nested paths inside object types
|
|
63
|
+
const filePaths = [];
|
|
64
|
+
const fileArrayPaths = [];
|
|
65
|
+
const collect = (subType, prefix) => {
|
|
66
|
+
if (isFileLikeType(subType, checker)) {
|
|
67
|
+
filePaths.push(prefix);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (typeof anyChecker.isArrayType === 'function' && anyChecker.isArrayType(subType)) {
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
72
|
+
const el = anyChecker.getElementTypeOfArrayType(subType);
|
|
73
|
+
if (el && isFileLikeType(el, checker)) {
|
|
74
|
+
fileArrayPaths.push(prefix);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Array of objects: record nested with a representative [0] path
|
|
78
|
+
if (el) {
|
|
79
|
+
const nested = computeFileMetaForType(el, checker, depth + 1, seen);
|
|
80
|
+
for (const p of nested.filePaths ?? [])
|
|
81
|
+
filePaths.push(`${prefix}[0].${p}`);
|
|
82
|
+
for (const p of nested.fileArrayPaths ?? [])
|
|
83
|
+
fileArrayPaths.push(`${prefix}[0].${p}`);
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const nested = computeFileMetaForType(subType, checker, depth + 1, seen);
|
|
88
|
+
for (const p of nested.filePaths ?? [])
|
|
89
|
+
filePaths.push(`${prefix}.${p}`);
|
|
90
|
+
for (const p of nested.fileArrayPaths ?? [])
|
|
91
|
+
fileArrayPaths.push(`${prefix}.${p}`);
|
|
92
|
+
};
|
|
93
|
+
// Only recurse into object-ish types (primitives will have no properties)
|
|
94
|
+
for (const prop of t.getProperties()) {
|
|
95
|
+
const decl = prop.valueDeclaration ?? prop.declarations?.[0];
|
|
96
|
+
if (!decl)
|
|
97
|
+
continue;
|
|
98
|
+
const propType = checker.getTypeOfSymbolAtLocation(prop, decl);
|
|
99
|
+
collect(propType, prop.getName());
|
|
100
|
+
}
|
|
101
|
+
const out = {};
|
|
102
|
+
if (filePaths.length)
|
|
103
|
+
out.filePaths = [...new Set(filePaths)];
|
|
104
|
+
if (fileArrayPaths.length)
|
|
105
|
+
out.fileArrayPaths = [...new Set(fileArrayPaths)];
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
function getStringLiteralText(node) {
|
|
109
|
+
if (!node)
|
|
110
|
+
return undefined;
|
|
111
|
+
if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {
|
|
112
|
+
return node.text;
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
function parseFnKeyLiteral(fnKey) {
|
|
117
|
+
const dot = fnKey.indexOf('.');
|
|
118
|
+
if (dot <= 0 || dot === fnKey.length - 1)
|
|
119
|
+
return undefined;
|
|
120
|
+
return { className: fnKey.slice(0, dot), fnName: fnKey.slice(dot + 1) };
|
|
121
|
+
}
|
|
122
|
+
function tryVisitFunctionalRegistrations(node, checker, results, options) {
|
|
123
|
+
if (!ts.isCallExpression(node))
|
|
124
|
+
return;
|
|
125
|
+
if (!ts.isIdentifier(node.expression))
|
|
126
|
+
return;
|
|
127
|
+
const callee = node.expression.text;
|
|
128
|
+
if (callee === 'cat') {
|
|
129
|
+
const fnKeyText = getStringLiteralText(node.arguments[0]);
|
|
130
|
+
const fnArg = node.arguments[1];
|
|
131
|
+
if (!fnKeyText || !fnArg)
|
|
132
|
+
return;
|
|
133
|
+
const parsed = parseFnKeyLiteral(fnKeyText);
|
|
134
|
+
if (!parsed)
|
|
135
|
+
return;
|
|
136
|
+
if (!ts.isFunctionExpression(fnArg) && !ts.isArrowFunction(fnArg))
|
|
137
|
+
return;
|
|
138
|
+
const signatureTypes = getFunctionLikeSignatureTypes(fnArg, checker, options);
|
|
139
|
+
const returns = [];
|
|
140
|
+
const throws = [];
|
|
141
|
+
const apiReturns = [];
|
|
142
|
+
// FunctionExpression always has a block body; ArrowFunction may be block or expression.
|
|
143
|
+
scanForReturns(fnArg.body, checker, returns);
|
|
144
|
+
scanForThrows(fnArg.body, checker, throws);
|
|
145
|
+
scanForApiReturns(fnArg.body, checker, apiReturns);
|
|
146
|
+
results.push({
|
|
147
|
+
fnName: parsed.fnName,
|
|
148
|
+
className: parsed.className,
|
|
149
|
+
returns,
|
|
150
|
+
throws,
|
|
151
|
+
apiReturns,
|
|
152
|
+
paramsFromAst: signatureTypes?.params,
|
|
153
|
+
declaredReturnFromAst: signatureTypes?.declaredReturn,
|
|
154
|
+
});
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (callee === 'catModule') {
|
|
158
|
+
const moduleName = getStringLiteralText(node.arguments[0]);
|
|
159
|
+
const objArg = node.arguments[1];
|
|
160
|
+
if (!moduleName)
|
|
161
|
+
return;
|
|
162
|
+
if (!objArg || !ts.isObjectLiteralExpression(objArg))
|
|
163
|
+
return;
|
|
164
|
+
for (const prop of objArg.properties) {
|
|
165
|
+
if (ts.isMethodDeclaration(prop) && prop.name) {
|
|
166
|
+
const propName = ts.isIdentifier(prop.name)
|
|
167
|
+
? prop.name.text
|
|
168
|
+
: ts.isStringLiteral(prop.name)
|
|
169
|
+
? prop.name.text
|
|
170
|
+
: undefined;
|
|
171
|
+
if (!propName)
|
|
172
|
+
continue;
|
|
173
|
+
const signatureTypes = getFunctionLikeSignatureTypes(prop, checker, options);
|
|
174
|
+
const returns = [];
|
|
175
|
+
const throws = [];
|
|
176
|
+
const apiReturns = [];
|
|
177
|
+
if (prop.body) {
|
|
178
|
+
scanForReturns(prop.body, checker, returns);
|
|
179
|
+
scanForThrows(prop.body, checker, throws);
|
|
180
|
+
scanForApiReturns(prop.body, checker, apiReturns);
|
|
181
|
+
}
|
|
182
|
+
results.push({
|
|
183
|
+
fnName: propName,
|
|
184
|
+
className: moduleName,
|
|
185
|
+
returns,
|
|
186
|
+
throws,
|
|
187
|
+
apiReturns,
|
|
188
|
+
paramsFromAst: signatureTypes?.params,
|
|
189
|
+
declaredReturnFromAst: signatureTypes?.declaredReturn,
|
|
190
|
+
});
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (ts.isPropertyAssignment(prop) && prop.name) {
|
|
194
|
+
const propName = ts.isIdentifier(prop.name)
|
|
195
|
+
? prop.name.text
|
|
196
|
+
: ts.isStringLiteral(prop.name)
|
|
197
|
+
? prop.name.text
|
|
198
|
+
: undefined;
|
|
199
|
+
if (!propName)
|
|
200
|
+
continue;
|
|
201
|
+
const init = prop.initializer;
|
|
202
|
+
if (!ts.isArrowFunction(init) && !ts.isFunctionExpression(init))
|
|
203
|
+
continue;
|
|
204
|
+
const signatureTypes = getFunctionLikeSignatureTypes(init, checker, options);
|
|
205
|
+
const returns = [];
|
|
206
|
+
const throws = [];
|
|
207
|
+
const apiReturns = [];
|
|
208
|
+
scanForReturns(init.body, checker, returns);
|
|
209
|
+
scanForThrows(init.body, checker, throws);
|
|
210
|
+
scanForApiReturns(init.body, checker, apiReturns);
|
|
211
|
+
results.push({
|
|
212
|
+
fnName: propName,
|
|
213
|
+
className: moduleName,
|
|
214
|
+
returns,
|
|
215
|
+
throws,
|
|
216
|
+
apiReturns,
|
|
217
|
+
paramsFromAst: signatureTypes?.params,
|
|
218
|
+
declaredReturnFromAst: signatureTypes?.declaredReturn,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function getMethodSignatureTypes(member, checker, options) {
|
|
225
|
+
const sig = checker.getSignatureFromDeclaration(member);
|
|
226
|
+
if (!sig)
|
|
227
|
+
return undefined;
|
|
228
|
+
const params = [];
|
|
229
|
+
for (let i = 0; i < member.parameters.length; i++) {
|
|
230
|
+
const p = member.parameters[i];
|
|
231
|
+
const paramName = ts.isIdentifier(p.name) ? p.name.text : `arg${i}`;
|
|
232
|
+
const t = checker.getTypeAtLocation(p);
|
|
233
|
+
params.push({
|
|
234
|
+
name: paramName,
|
|
235
|
+
type: options.expandParamTypes
|
|
236
|
+
? expandTypeToShapeString(t, checker, p, {
|
|
237
|
+
...options.expandParamTypesOptions,
|
|
238
|
+
program: options.program ?? options.expandParamTypesOptions?.program,
|
|
239
|
+
})
|
|
240
|
+
: checker.typeToString(t),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
const ret = checker.getReturnTypeOfSignature(sig);
|
|
244
|
+
const declaredReturn = checker.typeToString(ret);
|
|
245
|
+
return { params, declaredReturn };
|
|
246
|
+
}
|
|
247
|
+
function hasCatDecorator(member) {
|
|
248
|
+
const mods = member.modifiers;
|
|
249
|
+
if (!mods)
|
|
250
|
+
return false;
|
|
251
|
+
return mods.some((mod) => {
|
|
252
|
+
if (!ts.isDecorator(mod))
|
|
253
|
+
return false;
|
|
254
|
+
const expr = mod.expression;
|
|
255
|
+
if (ts.isIdentifier(expr) && expr.text === 'Cat')
|
|
256
|
+
return true;
|
|
257
|
+
if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {
|
|
258
|
+
return expr.expression.text === 'Cat';
|
|
259
|
+
}
|
|
260
|
+
return false;
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
export function visitNode(node, _source, checker, results, options) {
|
|
264
|
+
tryVisitFunctionalRegistrations(node, checker, results, options);
|
|
265
|
+
if (ts.isClassDeclaration(node) && node.name) {
|
|
266
|
+
const className = node.name.text;
|
|
267
|
+
for (const member of node.members) {
|
|
268
|
+
if (!ts.isMethodDeclaration(member))
|
|
269
|
+
continue;
|
|
270
|
+
if (!hasCatDecorator(member))
|
|
271
|
+
continue;
|
|
272
|
+
const name = member.name;
|
|
273
|
+
if (!ts.isIdentifier(name))
|
|
274
|
+
continue;
|
|
275
|
+
const fnName = name.text;
|
|
276
|
+
const returns = [];
|
|
277
|
+
const throws = [];
|
|
278
|
+
const apiReturns = [];
|
|
279
|
+
if (member.body) {
|
|
280
|
+
scanForReturns(member.body, checker, returns);
|
|
281
|
+
scanForThrows(member.body, checker, throws);
|
|
282
|
+
scanForApiReturns(member.body, checker, apiReturns);
|
|
283
|
+
}
|
|
284
|
+
const signatureTypes = getMethodSignatureTypes(member, checker, options);
|
|
285
|
+
results.push({
|
|
286
|
+
fnName,
|
|
287
|
+
className,
|
|
288
|
+
returns,
|
|
289
|
+
throws,
|
|
290
|
+
apiReturns,
|
|
291
|
+
paramsFromAst: signatureTypes?.params,
|
|
292
|
+
declaredReturnFromAst: signatureTypes?.declaredReturn,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
ts.forEachChild(node, (child) => visitNode(child, _source, checker, results, options));
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=visit-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit-node.js","sourceRoot":"","sources":["../../src/ast/visit-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { CompilerOptions } from 'typescript';
|
|
2
|
+
import { type GetAllTsFilesOptions } from './ast/get-all-ts-files.js';
|
|
3
|
+
import type { ExpandTypeOptions } from './ast/type-expand.js';
|
|
4
|
+
import type { Logger } from './logger.js';
|
|
5
|
+
import type { FetchFileUrlOptions } from './upload/fetch-file-url.js';
|
|
6
|
+
import type { QaFileWireMode, QaMediaUploadTarget, RegistryEntry } from './types.js';
|
|
7
|
+
import { type InspectorWebSocketHandle } from './transport/ws-server.js';
|
|
8
|
+
import { type RpcSerializationOptions } from './serialize-rpc-result.js';
|
|
9
|
+
/** Host-provided object storage wiring (secrets read inside adapter from env / vault). */
|
|
10
|
+
export interface StorageAdapter {
|
|
11
|
+
createPresignedPut(input: {
|
|
12
|
+
key: string;
|
|
13
|
+
contentType?: string;
|
|
14
|
+
sizeBytes?: number;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
uploadUrl: string;
|
|
17
|
+
objectKey: string;
|
|
18
|
+
expiresAt?: string;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export interface BootstrapStorageOptions {
|
|
22
|
+
adapter?: StorageAdapter;
|
|
23
|
+
/** When set and positive, `adapter` is required (fail-fast `QA_STORAGE_NOT_CONFIGURED`). */
|
|
24
|
+
artifactThresholdBytes?: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function validateBootstrapStorage(storage: BootstrapStorageOptions | undefined): void;
|
|
27
|
+
/** S3-compatible store (e.g. Minio). Never serialize to BOOTSTRAP / catalog JSON. */
|
|
28
|
+
export interface HostMinioOptions {
|
|
29
|
+
endpoint: string;
|
|
30
|
+
region?: string;
|
|
31
|
+
accessKeyId: string;
|
|
32
|
+
secretAccessKey: string;
|
|
33
|
+
bucket: string;
|
|
34
|
+
forcePathStyle?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function validateBootstrapFileWire(options: {
|
|
37
|
+
qaFileWire?: {
|
|
38
|
+
mode?: QaFileWireMode;
|
|
39
|
+
};
|
|
40
|
+
fileUrl?: FetchFileUrlOptions | null;
|
|
41
|
+
}): void;
|
|
42
|
+
export interface BootstrapOptions {
|
|
43
|
+
/** Directories scanned for `.ts` sources (AST + optional discovery) */
|
|
44
|
+
scanRoots: string[];
|
|
45
|
+
/** WebSocket listen port */
|
|
46
|
+
wsPort: number;
|
|
47
|
+
wsHost?: string;
|
|
48
|
+
/** Start embedded WebSocket server (default true) */
|
|
49
|
+
enableWebSocket?: boolean;
|
|
50
|
+
authToken?: string;
|
|
51
|
+
/** Absolute file URLs or paths dynamically imported before AST (compiled `.js` or ESM entry) */
|
|
52
|
+
importEntryUrls?: string[];
|
|
53
|
+
getAllTsFilesOptions?: GetAllTsFilesOptions;
|
|
54
|
+
compilerOptions?: CompilerOptions;
|
|
55
|
+
expandParamTypes?: boolean;
|
|
56
|
+
expandParamTypesOptions?: ExpandTypeOptions;
|
|
57
|
+
logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
58
|
+
logger?: Logger;
|
|
59
|
+
/** Install SIGINT / SIGTERM handlers that close the WebSocket server */
|
|
60
|
+
registerSignalHandlers?: boolean;
|
|
61
|
+
/** Redact `RegistryEntry.body` from returned/transported registry (GDPR-safe). Default: true. */
|
|
62
|
+
redactBodies?: boolean;
|
|
63
|
+
/** Optional post-invoke JSON normalization for `executeRPC` `result` (BigInt, Date, plain objects, size cap). */
|
|
64
|
+
rpcSerialization?: RpcSerializationOptions;
|
|
65
|
+
/** Optional large-payload / presign wiring; validated with `artifactThresholdBytes`. */
|
|
66
|
+
storage?: BootstrapStorageOptions;
|
|
67
|
+
/** When embedded WebSocket is enabled, token bucket per connection id. */
|
|
68
|
+
invokeRateLimit?: {
|
|
69
|
+
maxInvokesPerWindow: number;
|
|
70
|
+
windowMs: number;
|
|
71
|
+
};
|
|
72
|
+
/** When set, `executeRPC` rejects handler hangs after this many ms (best-effort; handler may still run). */
|
|
73
|
+
invokeTimeoutMs?: number;
|
|
74
|
+
/** Wire mode for file RPC params. Default `ref`. */
|
|
75
|
+
qaFileWire?: {
|
|
76
|
+
mode?: QaFileWireMode;
|
|
77
|
+
};
|
|
78
|
+
/** Catalog hint: where tenant web uploads before `__qaFileUrl` (no secrets). */
|
|
79
|
+
qaMediaUpload?: {
|
|
80
|
+
target: QaMediaUploadTarget;
|
|
81
|
+
};
|
|
82
|
+
/** Invoke-time URL fetch policy for `__qaFileUrl`. Required when `qaFileWire.mode` is `url`. */
|
|
83
|
+
fileUrl?: FetchFileUrlOptions;
|
|
84
|
+
/** HTTPS URL for host-only upload route (no credentials). */
|
|
85
|
+
qaMediaUploadHostUploadUrl?: string;
|
|
86
|
+
/**
|
|
87
|
+
* Host-held Minio/S3 credentials (process memory only). Never sent on BOOTSTRAP.
|
|
88
|
+
* Used by host HTTP upload routes implemented outside this package.
|
|
89
|
+
*/
|
|
90
|
+
hostMinio?: HostMinioOptions;
|
|
91
|
+
/** In-memory QA uploads for `__qaFileRef`; enable when `qaFileWire.mode` is `ref` or alongside URL mode. */
|
|
92
|
+
upload?: {
|
|
93
|
+
enabled?: boolean;
|
|
94
|
+
maxSizeBytes?: number;
|
|
95
|
+
idleTimeoutMs?: number;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export interface BootstrapResult {
|
|
99
|
+
registry: Record<string, RegistryEntry>;
|
|
100
|
+
tree: object[];
|
|
101
|
+
ws: InspectorWebSocketHandle | undefined;
|
|
102
|
+
shutdown: () => Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
export declare function bootstrap(options: BootstrapOptions): Promise<BootstrapResult>;
|
|
105
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { pathToFileURL } from 'node:url';
|
|
2
|
+
import { getAllTsFiles } from './ast/get-all-ts-files.js';
|
|
3
|
+
import { mergeASTIntoRegistry } from './ast/merge-ast.js';
|
|
4
|
+
import { runASTScanner } from './ast/run-ast-scanner.js';
|
|
5
|
+
import { analyzeRelationships, buildTree, resolveRelationships, } from './graph/relationships.js';
|
|
6
|
+
import { createLogger } from './logger.js';
|
|
7
|
+
import { Registry } from './registry-state.js';
|
|
8
|
+
import { startInspectorWebSocket, } from './transport/ws-server.js';
|
|
9
|
+
import { configureInvokeRateLimit } from './invoke-policy.js';
|
|
10
|
+
import { setInvokeTimeoutMs } from './invoke-runtime-config.js';
|
|
11
|
+
import { resetRpcSerializationConfig, setRpcSerializationConfig, } from './serialize-rpc-result.js';
|
|
12
|
+
export function validateBootstrapStorage(storage) {
|
|
13
|
+
if (!storage)
|
|
14
|
+
return;
|
|
15
|
+
const t = storage.artifactThresholdBytes;
|
|
16
|
+
if (t !== undefined && t > 0 && !storage.adapter) {
|
|
17
|
+
throw new Error('QA_STORAGE_NOT_CONFIGURED: artifactThresholdBytes requires bootstrap.storage.adapter');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function validateBootstrapFileWire(options) {
|
|
21
|
+
const mode = options.qaFileWire?.mode ?? 'ref';
|
|
22
|
+
if (mode === 'url') {
|
|
23
|
+
const hosts = options.fileUrl?.allowedHosts;
|
|
24
|
+
if (!hosts || hosts.length === 0) {
|
|
25
|
+
throw new Error('bootstrap: qaFileWire.mode "url" requires fileUrl.allowedHosts (non-empty)');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function toRegistryRecord() {
|
|
30
|
+
return Object.fromEntries(Registry);
|
|
31
|
+
}
|
|
32
|
+
function redactRegistryBodies(registry) {
|
|
33
|
+
return Object.fromEntries(Object.entries(registry).map(([k, v]) => [k, { ...v, body: '' }]));
|
|
34
|
+
}
|
|
35
|
+
export async function bootstrap(options) {
|
|
36
|
+
const log = options.logger ?? createLogger(options.logLevel ?? 'info');
|
|
37
|
+
const enableWs = options.enableWebSocket ?? true;
|
|
38
|
+
const redactBodies = options.redactBodies ?? true;
|
|
39
|
+
validateBootstrapStorage(options.storage);
|
|
40
|
+
validateBootstrapFileWire(options);
|
|
41
|
+
for (const entry of options.importEntryUrls ?? []) {
|
|
42
|
+
const href = entry.startsWith('file:')
|
|
43
|
+
? entry
|
|
44
|
+
: pathToFileURL(entry).href;
|
|
45
|
+
log.info('dynamic import', href);
|
|
46
|
+
await import(href);
|
|
47
|
+
}
|
|
48
|
+
const roots = options.scanRoots;
|
|
49
|
+
if (roots.length === 0) {
|
|
50
|
+
throw new Error('bootstrap: scanRoots must include at least one directory');
|
|
51
|
+
}
|
|
52
|
+
const scanRoot = roots[0];
|
|
53
|
+
const files = [...new Set(roots.flatMap((r) => getAllTsFiles(r, options.getAllTsFilesOptions)))];
|
|
54
|
+
const runOpts = {
|
|
55
|
+
files,
|
|
56
|
+
getAllTsFilesOptions: options.getAllTsFilesOptions,
|
|
57
|
+
compilerOptions: options.compilerOptions,
|
|
58
|
+
expandParamTypes: options.expandParamTypes,
|
|
59
|
+
expandParamTypesOptions: options.expandParamTypesOptions,
|
|
60
|
+
};
|
|
61
|
+
log.info('AST scan', files.length, 'files');
|
|
62
|
+
const ast = runASTScanner(scanRoot, runOpts);
|
|
63
|
+
mergeASTIntoRegistry(ast);
|
|
64
|
+
await new Promise((resolve) => {
|
|
65
|
+
setImmediate(() => {
|
|
66
|
+
resolveRelationships();
|
|
67
|
+
resolve();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
const { roots: rootKeys } = analyzeRelationships();
|
|
71
|
+
const tree = rootKeys.map((k) => buildTree(k));
|
|
72
|
+
const registryRaw = toRegistryRecord();
|
|
73
|
+
const registry = redactBodies ? redactRegistryBodies(registryRaw) : registryRaw;
|
|
74
|
+
log.info('registry size', Registry.size, 'roots', rootKeys.length);
|
|
75
|
+
let ws;
|
|
76
|
+
async function shutdown() {
|
|
77
|
+
if (ws)
|
|
78
|
+
await ws.close();
|
|
79
|
+
}
|
|
80
|
+
if (options.rpcSerialization !== undefined) {
|
|
81
|
+
if (options.rpcSerialization.enabled) {
|
|
82
|
+
setRpcSerializationConfig(options.rpcSerialization);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
resetRpcSerializationConfig();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
setInvokeTimeoutMs(options.invokeTimeoutMs);
|
|
89
|
+
if (enableWs) {
|
|
90
|
+
configureInvokeRateLimit(options.invokeRateLimit ?? null);
|
|
91
|
+
ws = await startInspectorWebSocket(registry, tree, {
|
|
92
|
+
port: options.wsPort,
|
|
93
|
+
host: options.wsHost,
|
|
94
|
+
authToken: options.authToken,
|
|
95
|
+
scanRoots: options.scanRoots,
|
|
96
|
+
rpcSerialization: options.rpcSerialization,
|
|
97
|
+
invokeRateLimit: options.invokeRateLimit,
|
|
98
|
+
invokeTimeoutMs: options.invokeTimeoutMs,
|
|
99
|
+
upload: options.upload,
|
|
100
|
+
qaFileWire: options.qaFileWire,
|
|
101
|
+
qaMediaUpload: options.qaMediaUpload,
|
|
102
|
+
fileUrl: options.fileUrl,
|
|
103
|
+
qaMediaUploadHostUploadUrl: options.qaMediaUploadHostUploadUrl,
|
|
104
|
+
});
|
|
105
|
+
log.info('WebSocket listening', `${options.wsHost ?? '127.0.0.1'}:${ws.port}`);
|
|
106
|
+
}
|
|
107
|
+
if (options.registerSignalHandlers && enableWs && ws) {
|
|
108
|
+
const onSignal = () => {
|
|
109
|
+
void shutdown()
|
|
110
|
+
.then(() => process.exit(0))
|
|
111
|
+
.catch((err) => {
|
|
112
|
+
log.error('shutdown error', err);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
process.once('SIGINT', onSignal);
|
|
117
|
+
process.once('SIGTERM', onSignal);
|
|
118
|
+
}
|
|
119
|
+
return { registry, tree, ws, shutdown };
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type CatalogBootstrapPayload = {
|
|
2
|
+
event: 'BOOTSTRAP';
|
|
3
|
+
protocolVersion: number;
|
|
4
|
+
catalogHash: string;
|
|
5
|
+
registry: Record<string, unknown>;
|
|
6
|
+
tree: object[];
|
|
7
|
+
};
|
|
8
|
+
export type CatalogBootstrapCache = {
|
|
9
|
+
get: () => Promise<CatalogBootstrapPayload>;
|
|
10
|
+
refresh: () => Promise<CatalogBootstrapPayload>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Small in-memory cache for catalog bootstrap payloads, gated by a fingerprint.
|
|
14
|
+
*
|
|
15
|
+
* - `get()` computes and caches on first call.
|
|
16
|
+
* - `refresh()` recomputes the fingerprint and only rebuilds when it changed.
|
|
17
|
+
* - concurrent callers share a single in-flight promise.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createCatalogBootstrapCache(input: {
|
|
20
|
+
computeFingerprint: () => string;
|
|
21
|
+
computePayload: (catalogHash: string) => Promise<CatalogBootstrapPayload>;
|
|
22
|
+
}): CatalogBootstrapCache;
|
|
23
|
+
//# sourceMappingURL=catalog-bootstrap-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-bootstrap-cache.d.ts","sourceRoot":"","sources":["../src/catalog-bootstrap-cache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,WAAW,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,IAAI,EAAE,MAAM,EAAE,CAAA;CACd,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IACnC,GAAG,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAA;IAC3C,OAAO,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAA;CAC/C,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IAClD,kBAAkB,EAAE,MAAM,MAAM,CAAA;IAChC,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAA;CACzE,GAAG,qBAAqB,CA8CxB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small in-memory cache for catalog bootstrap payloads, gated by a fingerprint.
|
|
3
|
+
*
|
|
4
|
+
* - `get()` computes and caches on first call.
|
|
5
|
+
* - `refresh()` recomputes the fingerprint and only rebuilds when it changed.
|
|
6
|
+
* - concurrent callers share a single in-flight promise.
|
|
7
|
+
*/
|
|
8
|
+
export function createCatalogBootstrapCache(input) {
|
|
9
|
+
let lastPayload = null;
|
|
10
|
+
let lastFingerprint = null;
|
|
11
|
+
let inFlight = null;
|
|
12
|
+
async function runBuild(fingerprint) {
|
|
13
|
+
return await input.computePayload(fingerprint);
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
get: async () => {
|
|
17
|
+
if (lastPayload)
|
|
18
|
+
return lastPayload;
|
|
19
|
+
if (!inFlight) {
|
|
20
|
+
const fingerprint = input.computeFingerprint();
|
|
21
|
+
inFlight = runBuild(fingerprint)
|
|
22
|
+
.then((p) => {
|
|
23
|
+
lastPayload = p;
|
|
24
|
+
lastFingerprint = fingerprint;
|
|
25
|
+
return p;
|
|
26
|
+
})
|
|
27
|
+
.finally(() => {
|
|
28
|
+
inFlight = null;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return await inFlight;
|
|
32
|
+
},
|
|
33
|
+
refresh: async () => {
|
|
34
|
+
const fingerprint = input.computeFingerprint();
|
|
35
|
+
if (lastPayload && lastFingerprint === fingerprint)
|
|
36
|
+
return lastPayload;
|
|
37
|
+
lastPayload = null;
|
|
38
|
+
lastFingerprint = null;
|
|
39
|
+
if (!inFlight) {
|
|
40
|
+
inFlight = runBuild(fingerprint)
|
|
41
|
+
.then((p) => {
|
|
42
|
+
lastPayload = p;
|
|
43
|
+
lastFingerprint = fingerprint;
|
|
44
|
+
return p;
|
|
45
|
+
})
|
|
46
|
+
.finally(() => {
|
|
47
|
+
inFlight = null;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return await inFlight;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=catalog-bootstrap-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-bootstrap-cache.js","sourceRoot":"","sources":["../src/catalog-bootstrap-cache.ts"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAG3C;IACA,IAAI,WAAW,GAAmC,IAAI,CAAA;IACtD,IAAI,eAAe,GAAkB,IAAI,CAAA;IACzC,IAAI,QAAQ,GAA4C,IAAI,CAAA;IAE5D,KAAK,UAAU,QAAQ,CAAC,WAAmB;QAC1C,OAAO,MAAM,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;IAC/C,CAAC;IAED,OAAO;QACN,GAAG,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,WAAW;gBAAE,OAAO,WAAW,CAAA;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,WAAW,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAA;gBAC9C,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC;qBAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;oBACX,WAAW,GAAG,CAAC,CAAA;oBACf,eAAe,GAAG,WAAW,CAAA;oBAC7B,OAAO,CAAC,CAAA;gBACT,CAAC,CAAC;qBACD,OAAO,CAAC,GAAG,EAAE;oBACb,QAAQ,GAAG,IAAI,CAAA;gBAChB,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,MAAM,QAAQ,CAAA;QACtB,CAAC;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YACnB,MAAM,WAAW,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAA;YAC9C,IAAI,WAAW,IAAI,eAAe,KAAK,WAAW;gBAAE,OAAO,WAAW,CAAA;YAEtE,WAAW,GAAG,IAAI,CAAA;YAClB,eAAe,GAAG,IAAI,CAAA;YACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC;qBAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;oBACX,WAAW,GAAG,CAAC,CAAA;oBACf,eAAe,GAAG,WAAW,CAAA;oBAC7B,OAAO,CAAC,CAAA;gBACT,CAAC,CAAC;qBACD,OAAO,CAAC,GAAG,EAAE;oBACb,QAAQ,GAAG,IAAI,CAAA;gBAChB,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,MAAM,QAAQ,CAAA;QACtB,CAAC;KACD,CAAA;AACF,CAAC"}
|