@glubean/scanner 0.4.0 → 0.5.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/ast.d.ts +120 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +312 -0
- package/dist/ast.js.map +1 -0
- package/dist/contract-extraction.d.ts +23 -0
- package/dist/contract-extraction.d.ts.map +1 -1
- package/dist/contract-extraction.js +39 -0
- package/dist/contract-extraction.js.map +1 -1
- package/dist/extractor-ast.d.ts +59 -0
- package/dist/extractor-ast.d.ts.map +1 -0
- package/dist/extractor-ast.js +579 -0
- package/dist/extractor-ast.js.map +1 -0
- package/dist/extractor-static.d.ts +22 -95
- package/dist/extractor-static.d.ts.map +1 -1
- package/dist/extractor-static.js +11 -753
- package/dist/extractor-static.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +2 -1
- package/dist/scanner.js.map +1 -1
- package/dist/static.d.ts +3 -2
- package/dist/static.d.ts.map +1 -1
- package/dist/static.js +6 -1
- package/dist/static.js.map +1 -1
- package/package.json +9 -1
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST-based test extractor — the @babel/parser replacement for the regex
|
|
3
|
+
* `extractFromSource` in `extractor-static.ts`. Recognizes the same patterns and
|
|
4
|
+
* produces the byte-identical `ExportMeta` shape (the 138 conformance tests run
|
|
5
|
+
* unchanged against this module), but via a real parser so modern TS
|
|
6
|
+
* (`satisfies`, generics, decorators, …) never trips it up.
|
|
7
|
+
*
|
|
8
|
+
* Scope: this owns `extractFromSource` + `createStaticExtractor`. The cheap
|
|
9
|
+
* over-all-files guards (`isGlubeanFile`, `extractAliasesFromSource`) stay regex
|
|
10
|
+
* in `extractor-static.ts` — they only match import/declaration patterns (no TS
|
|
11
|
+
* expression parsing) and run on every candidate file, so parsing them would be
|
|
12
|
+
* a needless perf cost. `extractPickExamples` / `extractContractCases` are
|
|
13
|
+
* AST-migrated in later phases.
|
|
14
|
+
*/
|
|
15
|
+
import { parseSource, forEachExportedConst, unwrapExpression, stringFromExpression, objectFromExpression, objectProperty, stringProperty, propertyNameText, findPropertyCall, walk, lineOf, } from "./ast.js";
|
|
16
|
+
import { resolveDataPath } from "./data-path.js";
|
|
17
|
+
const BASE_FNS = new Set(["test", "task"]);
|
|
18
|
+
/** Whether a factory identifier name is a recognized test/task function. */
|
|
19
|
+
function isTestFnName(name, customFns) {
|
|
20
|
+
if (customFns)
|
|
21
|
+
return customFns.has(name);
|
|
22
|
+
// Convention fallback: test | task | *Test | *Task (capitalized suffix).
|
|
23
|
+
return BASE_FNS.has(name) || /(?:Test|Task)$/.test(name);
|
|
24
|
+
}
|
|
25
|
+
/** Parse `{ id, name, tags, timeout, requires, defaultRun }` from a TestMeta object literal. */
|
|
26
|
+
function parseMetaObject(obj) {
|
|
27
|
+
const out = {};
|
|
28
|
+
const id = stringProperty(obj, "id");
|
|
29
|
+
if (id !== undefined)
|
|
30
|
+
out.id = id;
|
|
31
|
+
const name = stringProperty(obj, "name");
|
|
32
|
+
if (name !== undefined)
|
|
33
|
+
out.name = name;
|
|
34
|
+
const tagsProp = objectProperty(obj, "tags");
|
|
35
|
+
if (tagsProp) {
|
|
36
|
+
const value = unwrapExpression(tagsProp.value);
|
|
37
|
+
if (value?.type === "ArrayExpression") {
|
|
38
|
+
const elements = value.elements ?? [];
|
|
39
|
+
const tags = elements
|
|
40
|
+
.map((el) => (el ? stringFromExpression(el) : undefined))
|
|
41
|
+
.filter((t) => typeof t === "string");
|
|
42
|
+
if (tags.length > 0)
|
|
43
|
+
out.tags = tags;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const single = stringFromExpression(tagsProp.value);
|
|
47
|
+
if (single !== undefined)
|
|
48
|
+
out.tags = [single];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const timeoutProp = objectProperty(obj, "timeout");
|
|
52
|
+
if (timeoutProp) {
|
|
53
|
+
const value = unwrapExpression(timeoutProp.value);
|
|
54
|
+
if (value?.type === "NumericLiteral" && typeof value.value === "number") {
|
|
55
|
+
out.timeout = value.value;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const requires = stringProperty(obj, "requires");
|
|
59
|
+
if (requires === "headless" || requires === "browser" || requires === "out-of-band") {
|
|
60
|
+
out.requires = requires;
|
|
61
|
+
}
|
|
62
|
+
const defaultRun = stringProperty(obj, "defaultRun");
|
|
63
|
+
if (defaultRun === "always" || defaultRun === "opt-in")
|
|
64
|
+
out.defaultRun = defaultRun;
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
/** Builder `.meta({...})` fields (name/tags/timeout/requires/defaultRun) from the chain. */
|
|
68
|
+
function builderMeta(init) {
|
|
69
|
+
const metaCall = findPropertyCall(init, "meta");
|
|
70
|
+
if (!metaCall)
|
|
71
|
+
return {};
|
|
72
|
+
const args = metaCall.arguments ?? [];
|
|
73
|
+
const obj = objectFromExpression(args[0]);
|
|
74
|
+
return obj ? parseMetaObject(obj) : {};
|
|
75
|
+
}
|
|
76
|
+
/** Flat list of `.step("name", ...)` leaf names in source order (matches the regex baseline). */
|
|
77
|
+
function extractSteps(init) {
|
|
78
|
+
const found = [];
|
|
79
|
+
walk(init, (node) => {
|
|
80
|
+
if (node.type !== "CallExpression")
|
|
81
|
+
return;
|
|
82
|
+
const callee = unwrapExpression(node.callee);
|
|
83
|
+
if (!callee || callee.type !== "MemberExpression" || callee.computed === true)
|
|
84
|
+
return;
|
|
85
|
+
const property = callee.property;
|
|
86
|
+
if (property.type !== "Identifier" || property.name !== "step")
|
|
87
|
+
return;
|
|
88
|
+
const args = node.arguments ?? [];
|
|
89
|
+
const name = stringFromExpression(args[0]);
|
|
90
|
+
// Order by the NAME argument's position, not the call's: chained calls
|
|
91
|
+
// (`a().step("x").step("y")`) all share the chain-root start, so the call's
|
|
92
|
+
// own start can't order them.
|
|
93
|
+
if (name !== undefined)
|
|
94
|
+
found.push({ name, start: args[0]?.start ?? 0 });
|
|
95
|
+
});
|
|
96
|
+
found.sort((a, b) => a.start - b.start);
|
|
97
|
+
return found.map(({ name }) => ({ name }));
|
|
98
|
+
}
|
|
99
|
+
/** Descend the builder-method chain (`.step`/`.meta`/…) to the head call. */
|
|
100
|
+
function chainHead(init) {
|
|
101
|
+
let node = unwrapExpression(init);
|
|
102
|
+
while (node && node.type === "CallExpression") {
|
|
103
|
+
const callee = unwrapExpression(node.callee);
|
|
104
|
+
if (callee?.type === "MemberExpression") {
|
|
105
|
+
node = unwrapExpression(callee.object);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
break; // callee is an Identifier (simple) or a CallExpression (curried each/pick)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return node;
|
|
112
|
+
}
|
|
113
|
+
function parseTestDeclaration(decl, statement, customFns) {
|
|
114
|
+
const exportName = decl.id?.name;
|
|
115
|
+
if (!exportName)
|
|
116
|
+
return undefined;
|
|
117
|
+
const init = decl.init;
|
|
118
|
+
if (!init)
|
|
119
|
+
return undefined;
|
|
120
|
+
const head = chainHead(init);
|
|
121
|
+
if (!head || head.type !== "CallExpression")
|
|
122
|
+
return undefined;
|
|
123
|
+
let variant;
|
|
124
|
+
let factoryName;
|
|
125
|
+
let metaArg;
|
|
126
|
+
let eachArgs;
|
|
127
|
+
const headCallee = unwrapExpression(head.callee);
|
|
128
|
+
if (!headCallee)
|
|
129
|
+
return undefined;
|
|
130
|
+
if (headCallee.type === "Identifier") {
|
|
131
|
+
// Simple / builder: `test("id", ...)` / `test("id").step(...)`.
|
|
132
|
+
factoryName = headCallee.name;
|
|
133
|
+
metaArg = head.arguments?.[0];
|
|
134
|
+
}
|
|
135
|
+
else if (headCallee.type === "CallExpression") {
|
|
136
|
+
// Curried: `test.each(data)(...)` / `test.pick(examples)(...)`.
|
|
137
|
+
const factoryCallee = unwrapExpression(headCallee.callee);
|
|
138
|
+
if (!factoryCallee || factoryCallee.type !== "MemberExpression" || factoryCallee.computed === true) {
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
const object = factoryCallee.object;
|
|
142
|
+
const property = factoryCallee.property;
|
|
143
|
+
if (object.type !== "Identifier" || property.type !== "Identifier")
|
|
144
|
+
return undefined;
|
|
145
|
+
if (property.name !== "each" && property.name !== "pick")
|
|
146
|
+
return undefined;
|
|
147
|
+
factoryName = object.name;
|
|
148
|
+
variant = property.name;
|
|
149
|
+
eachArgs = headCallee.arguments ?? [];
|
|
150
|
+
metaArg = head.arguments?.[0];
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
if (!factoryName || !isTestFnName(factoryName, customFns))
|
|
156
|
+
return undefined;
|
|
157
|
+
// Resolve id + inline meta from the first argument (string id or TestMeta obj).
|
|
158
|
+
let fields = {};
|
|
159
|
+
const metaObj = objectFromExpression(metaArg);
|
|
160
|
+
if (metaObj) {
|
|
161
|
+
fields = parseMetaObject(metaObj);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const id = stringFromExpression(metaArg);
|
|
165
|
+
if (id !== undefined)
|
|
166
|
+
fields.id = id;
|
|
167
|
+
}
|
|
168
|
+
// Builder `.meta({...})` fills any gaps (positional/inline wins).
|
|
169
|
+
const bMeta = builderMeta(init);
|
|
170
|
+
if (fields.name === undefined && bMeta.name !== undefined)
|
|
171
|
+
fields.name = bMeta.name;
|
|
172
|
+
if (fields.tags === undefined && bMeta.tags !== undefined)
|
|
173
|
+
fields.tags = bMeta.tags;
|
|
174
|
+
if (fields.timeout === undefined && bMeta.timeout !== undefined)
|
|
175
|
+
fields.timeout = bMeta.timeout;
|
|
176
|
+
if (fields.requires === undefined && bMeta.requires !== undefined)
|
|
177
|
+
fields.requires = bMeta.requires;
|
|
178
|
+
if (fields.defaultRun === undefined && bMeta.defaultRun !== undefined)
|
|
179
|
+
fields.defaultRun = bMeta.defaultRun;
|
|
180
|
+
if (fields.id === undefined)
|
|
181
|
+
return undefined;
|
|
182
|
+
// `.each(data, { parallel: true })`.
|
|
183
|
+
let parallel = false;
|
|
184
|
+
if (variant === "each" && eachArgs && eachArgs.length > 1) {
|
|
185
|
+
const optsObj = objectFromExpression(eachArgs[1]);
|
|
186
|
+
const parallelProp = optsObj ? objectProperty(optsObj, "parallel") : undefined;
|
|
187
|
+
const value = parallelProp ? unwrapExpression(parallelProp.value) : undefined;
|
|
188
|
+
if (value?.type === "BooleanLiteral" && value.value === true)
|
|
189
|
+
parallel = true;
|
|
190
|
+
}
|
|
191
|
+
const steps = extractSteps(init);
|
|
192
|
+
const result = {
|
|
193
|
+
type: "test",
|
|
194
|
+
id: fields.id,
|
|
195
|
+
exportName,
|
|
196
|
+
location: { line: lineOf(statement), col: 1 },
|
|
197
|
+
};
|
|
198
|
+
if (fields.name !== undefined)
|
|
199
|
+
result.name = fields.name;
|
|
200
|
+
if (fields.tags && fields.tags.length > 0)
|
|
201
|
+
result.tags = fields.tags;
|
|
202
|
+
if (fields.timeout !== undefined)
|
|
203
|
+
result.timeout = fields.timeout;
|
|
204
|
+
if (fields.requires !== undefined)
|
|
205
|
+
result.requires = fields.requires;
|
|
206
|
+
if (fields.defaultRun !== undefined)
|
|
207
|
+
result.defaultRun = fields.defaultRun;
|
|
208
|
+
if (variant)
|
|
209
|
+
result.variant = variant;
|
|
210
|
+
if (steps.length > 0)
|
|
211
|
+
result.steps = steps;
|
|
212
|
+
if (parallel)
|
|
213
|
+
result.parallel = true;
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Extract test metadata from TypeScript source via @babel/parser AST.
|
|
218
|
+
* Drop-in replacement for the regex `extractFromSource` — same `ExportMeta[]`.
|
|
219
|
+
* On a parse error (unparseable / unsupported syntax) returns `[]` — never throws
|
|
220
|
+
* — so a malformed file is skipped, not fatal (mirrors the regex version, which
|
|
221
|
+
* never threw).
|
|
222
|
+
*/
|
|
223
|
+
export function extractFromSource(content, customFns) {
|
|
224
|
+
let source;
|
|
225
|
+
try {
|
|
226
|
+
source = parseSource(content);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
const fns = customFns && customFns.length > 0 ? new Set([...BASE_FNS, ...customFns]) : undefined;
|
|
232
|
+
const results = [];
|
|
233
|
+
forEachExportedConst(source, (statement, declaration) => {
|
|
234
|
+
const meta = parseTestDeclaration(declaration, statement, fns);
|
|
235
|
+
if (meta)
|
|
236
|
+
results.push(meta);
|
|
237
|
+
});
|
|
238
|
+
return results;
|
|
239
|
+
}
|
|
240
|
+
/** Find the `contract.<protocol>(...)` call in a chain (object named `contract`). */
|
|
241
|
+
function findContractCall(init) {
|
|
242
|
+
let node = unwrapExpression(init);
|
|
243
|
+
while (node && node.type === "CallExpression") {
|
|
244
|
+
const callee = unwrapExpression(node.callee);
|
|
245
|
+
if (!callee)
|
|
246
|
+
break;
|
|
247
|
+
if (callee.type === "MemberExpression") {
|
|
248
|
+
const object = callee.object;
|
|
249
|
+
const property = callee.property;
|
|
250
|
+
// Non-computed only: `contract.http(...)`, not `contract[protocol](...)`
|
|
251
|
+
// (a computed access' property is a variable, not a literal protocol name).
|
|
252
|
+
if (callee.computed !== true &&
|
|
253
|
+
object.type === "Identifier" &&
|
|
254
|
+
object.name === "contract" &&
|
|
255
|
+
property.type === "Identifier") {
|
|
256
|
+
return { protocol: property.name, call: node };
|
|
257
|
+
}
|
|
258
|
+
node = unwrapExpression(object);
|
|
259
|
+
}
|
|
260
|
+
else if (callee.type === "CallExpression") {
|
|
261
|
+
node = callee;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return undefined;
|
|
268
|
+
}
|
|
269
|
+
const _REQUIRES = new Set(["headless", "browser", "out-of-band"]);
|
|
270
|
+
const _DEFAULT_RUN = new Set(["always", "opt-in"]);
|
|
271
|
+
/** Parse the `cases: { key: { ... } }` object into ContractCaseStaticMeta[]. */
|
|
272
|
+
function readCases(casesObj) {
|
|
273
|
+
const out = [];
|
|
274
|
+
const properties = casesObj.properties ?? [];
|
|
275
|
+
for (const property of properties) {
|
|
276
|
+
if (property.type !== "ObjectProperty")
|
|
277
|
+
continue;
|
|
278
|
+
const key = propertyNameText(property);
|
|
279
|
+
const body = objectFromExpression(property.value);
|
|
280
|
+
if (key === undefined || !body)
|
|
281
|
+
continue;
|
|
282
|
+
const meta = { key, line: lineOf(property.value) };
|
|
283
|
+
const description = stringProperty(body, "description");
|
|
284
|
+
if (description !== undefined)
|
|
285
|
+
meta.description = description;
|
|
286
|
+
// Status lives under `expect: { status: N }` (BaseCaseSpec); fall back to a
|
|
287
|
+
// top-level `status` if present.
|
|
288
|
+
const expectObj = objectFromExpression(objectProperty(body, "expect")?.value);
|
|
289
|
+
const statusProp = (expectObj && objectProperty(expectObj, "status")) ?? objectProperty(body, "status");
|
|
290
|
+
const statusVal = statusProp ? unwrapExpression(statusProp.value) : undefined;
|
|
291
|
+
if (statusVal?.type === "NumericLiteral" && typeof statusVal.value === "number") {
|
|
292
|
+
meta.expectStatus = statusVal.value;
|
|
293
|
+
}
|
|
294
|
+
const deferred = stringProperty(body, "deferred");
|
|
295
|
+
if (deferred !== undefined)
|
|
296
|
+
meta.deferred = deferred;
|
|
297
|
+
const requires = stringProperty(body, "requires");
|
|
298
|
+
if (requires !== undefined && _REQUIRES.has(requires))
|
|
299
|
+
meta.requires = requires;
|
|
300
|
+
const defaultRun = stringProperty(body, "defaultRun");
|
|
301
|
+
if (defaultRun !== undefined && _DEFAULT_RUN.has(defaultRun))
|
|
302
|
+
meta.defaultRun = defaultRun;
|
|
303
|
+
const given = stringProperty(body, "given");
|
|
304
|
+
if (given !== undefined)
|
|
305
|
+
meta.given = given;
|
|
306
|
+
out.push(meta);
|
|
307
|
+
}
|
|
308
|
+
return out;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* AST replacement for the regex `extractContractCases`. Extracts
|
|
312
|
+
* `contract.<protocol>("id", { endpoint, description, feature, cases })` exports
|
|
313
|
+
* → `ContractStaticMeta[]` (same fields the regex set: contract id/exportName/
|
|
314
|
+
* line/endpoint/protocol/description/feature + per-case key/line/description/
|
|
315
|
+
* expectStatus/deferred/requires/defaultRun/given). Returns [] on parse error.
|
|
316
|
+
*/
|
|
317
|
+
export function extractContractCases(content) {
|
|
318
|
+
let source;
|
|
319
|
+
try {
|
|
320
|
+
source = parseSource(content);
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return [];
|
|
324
|
+
}
|
|
325
|
+
const results = [];
|
|
326
|
+
forEachExportedConst(source, (statement, declaration) => {
|
|
327
|
+
const exportName = declaration.id?.name;
|
|
328
|
+
const init = declaration.init;
|
|
329
|
+
if (!exportName || !init)
|
|
330
|
+
return;
|
|
331
|
+
const found = findContractCall(init);
|
|
332
|
+
if (!found)
|
|
333
|
+
return;
|
|
334
|
+
const args = found.call.arguments ?? [];
|
|
335
|
+
const contractId = stringFromExpression(args[0]);
|
|
336
|
+
const spec = objectFromExpression(args[1]);
|
|
337
|
+
if (contractId === undefined || !spec)
|
|
338
|
+
return;
|
|
339
|
+
const casesObj = objectFromExpression(objectProperty(spec, "cases")?.value);
|
|
340
|
+
const meta = {
|
|
341
|
+
contractId,
|
|
342
|
+
exportName,
|
|
343
|
+
line: lineOf(statement),
|
|
344
|
+
endpoint: stringProperty(spec, "endpoint") ?? "",
|
|
345
|
+
protocol: found.protocol,
|
|
346
|
+
cases: casesObj ? readCases(casesObj) : [],
|
|
347
|
+
};
|
|
348
|
+
const description = stringProperty(spec, "description");
|
|
349
|
+
if (description !== undefined)
|
|
350
|
+
meta.description = description;
|
|
351
|
+
const feature = stringProperty(spec, "feature");
|
|
352
|
+
if (feature !== undefined)
|
|
353
|
+
meta.feature = feature;
|
|
354
|
+
results.push(meta);
|
|
355
|
+
});
|
|
356
|
+
return results;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Structural (marker-free) flow extraction: every `export const X = <fn>.flow("id")…`
|
|
360
|
+
* → `FlowStaticMeta`. Replaces vscode's `// @flow`-gated extractMarkedFlows — AST
|
|
361
|
+
* recognizes the `.flow("id")` call shape directly, so no magic comment is needed
|
|
362
|
+
* (aligns vscode discovery with the CLI, which never required markers). Returns []
|
|
363
|
+
* on parse error.
|
|
364
|
+
*/
|
|
365
|
+
export function extractFlows(content) {
|
|
366
|
+
let source;
|
|
367
|
+
try {
|
|
368
|
+
source = parseSource(content);
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
return [];
|
|
372
|
+
}
|
|
373
|
+
const results = [];
|
|
374
|
+
forEachExportedConst(source, (statement, declaration) => {
|
|
375
|
+
const exportName = declaration.id?.name;
|
|
376
|
+
const init = declaration.init;
|
|
377
|
+
if (!exportName || !init)
|
|
378
|
+
return;
|
|
379
|
+
const flowCall = findPropertyCall(init, "flow");
|
|
380
|
+
if (!flowCall)
|
|
381
|
+
return;
|
|
382
|
+
const flowId = stringFromExpression(flowCall.arguments?.[0]);
|
|
383
|
+
if (flowId === undefined)
|
|
384
|
+
return;
|
|
385
|
+
const metaCall = findPropertyCall(init, "meta");
|
|
386
|
+
const metaObj = metaCall
|
|
387
|
+
? objectFromExpression(metaCall.arguments?.[0])
|
|
388
|
+
: undefined;
|
|
389
|
+
const skip = metaObj ? stringProperty(metaObj, "skip") : undefined;
|
|
390
|
+
const meta = { exportName, line: lineOf(statement), flowId };
|
|
391
|
+
if (skip !== undefined)
|
|
392
|
+
meta.skip = skip;
|
|
393
|
+
results.push(meta);
|
|
394
|
+
});
|
|
395
|
+
return results;
|
|
396
|
+
}
|
|
397
|
+
/** Classify a data-loader call (`fromDir(...)`, `fromYaml.map(...)`, …) → {type, raw path}. */
|
|
398
|
+
function classifyLoader(call) {
|
|
399
|
+
const callee = unwrapExpression(call.callee);
|
|
400
|
+
if (!callee)
|
|
401
|
+
return undefined;
|
|
402
|
+
const path = stringFromExpression(call.arguments?.[0]);
|
|
403
|
+
if (path === undefined)
|
|
404
|
+
return undefined;
|
|
405
|
+
if (callee.type === "Identifier") {
|
|
406
|
+
if (callee.name === "fromDir")
|
|
407
|
+
return { type: "dir", path };
|
|
408
|
+
if (callee.name === "fromJson")
|
|
409
|
+
return { type: "json-loader", path };
|
|
410
|
+
}
|
|
411
|
+
else if (callee.type === "MemberExpression" && callee.computed !== true) {
|
|
412
|
+
const object = callee.object;
|
|
413
|
+
const property = callee.property;
|
|
414
|
+
if (object.type === "Identifier" && property.type === "Identifier") {
|
|
415
|
+
if (object.name === "fromDir" && property.name === "merge")
|
|
416
|
+
return { type: "dir-merge", path };
|
|
417
|
+
if (object.name === "fromDir" && property.name === "concat")
|
|
418
|
+
return { type: "dir-concat", path };
|
|
419
|
+
if (object.name === "fromYaml" && property.name === "map")
|
|
420
|
+
return { type: "yaml-map", path };
|
|
421
|
+
if (object.name === "fromJson" && property.name === "map")
|
|
422
|
+
return { type: "json-map", path };
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return undefined;
|
|
426
|
+
}
|
|
427
|
+
/** Map a variable name → its data source: default `.json` imports + `await from*(...)` loaders. */
|
|
428
|
+
function buildDataSources(source) {
|
|
429
|
+
const map = new Map();
|
|
430
|
+
// TOP-LEVEL bindings only (in source order, last-wins): a top-level
|
|
431
|
+
// `test.pick(examples)` references the module-level `examples`, not a
|
|
432
|
+
// same-named binding shadowed inside a nested function/block.
|
|
433
|
+
const body = source.program.body ?? [];
|
|
434
|
+
for (const statement of body) {
|
|
435
|
+
if (statement.type === "ImportDeclaration") {
|
|
436
|
+
const importPath = statement.source?.value;
|
|
437
|
+
if (typeof importPath === "string" && importPath.endsWith(".json")) {
|
|
438
|
+
for (const sp of statement.specifiers ?? []) {
|
|
439
|
+
if (sp.type === "ImportDefaultSpecifier" && sp.local?.type === "Identifier") {
|
|
440
|
+
map.set(sp.local.name, { type: "json-import", path: importPath });
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
continue;
|
|
445
|
+
}
|
|
446
|
+
// `const x = …` or `export const x = …`
|
|
447
|
+
const varDecl = statement.type === "VariableDeclaration"
|
|
448
|
+
? statement
|
|
449
|
+
: statement.type === "ExportNamedDeclaration" &&
|
|
450
|
+
statement.declaration?.type === "VariableDeclaration"
|
|
451
|
+
? statement.declaration
|
|
452
|
+
: undefined;
|
|
453
|
+
if (!varDecl)
|
|
454
|
+
continue;
|
|
455
|
+
for (const declarator of varDecl.declarations ?? []) {
|
|
456
|
+
const id = declarator.id;
|
|
457
|
+
if (id?.type !== "Identifier")
|
|
458
|
+
continue;
|
|
459
|
+
// Strip TS wrappers (`as`/`satisfies`/`!`) around the whole initializer
|
|
460
|
+
// (`await from*(...) as T`) before reading the await/call.
|
|
461
|
+
let call = unwrapExpression(declarator.init);
|
|
462
|
+
if (call?.type === "AwaitExpression")
|
|
463
|
+
call = unwrapExpression(call.argument);
|
|
464
|
+
if (call?.type !== "CallExpression")
|
|
465
|
+
continue;
|
|
466
|
+
const loader = classifyLoader(call);
|
|
467
|
+
if (loader)
|
|
468
|
+
map.set(id.name, loader);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return map;
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* AST replacement for the regex `extractPickExamples` — discovers
|
|
475
|
+
* `<fn>.pick(data)("id-template", ...)` exports for CodeLens. Inline object data
|
|
476
|
+
* → keys + `{type:"inline"}`; a variable referencing a `.json` import or a
|
|
477
|
+
* `from*` loader → keys:null + the resolved dataSource path; an unknown simple
|
|
478
|
+
* variable → keys:null + no dataSource. Non-object / non-identifier data args are
|
|
479
|
+
* not recorded (mirrors the regex). Returns [] on parse error.
|
|
480
|
+
*/
|
|
481
|
+
export function extractPickExamples(content, options) {
|
|
482
|
+
let source;
|
|
483
|
+
try {
|
|
484
|
+
source = parseSource(content, options?.filePath);
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
return [];
|
|
488
|
+
}
|
|
489
|
+
const fns = options?.customFns && options.customFns.length > 0
|
|
490
|
+
? new Set([...BASE_FNS, ...options.customFns])
|
|
491
|
+
: undefined;
|
|
492
|
+
const dataSources = buildDataSources(source);
|
|
493
|
+
const results = [];
|
|
494
|
+
forEachExportedConst(source, (statement, declaration) => {
|
|
495
|
+
const exportName = declaration.id?.name;
|
|
496
|
+
const init = declaration.init;
|
|
497
|
+
if (!exportName || !init)
|
|
498
|
+
return;
|
|
499
|
+
// `<fn>.pick(data)(idTemplate, ...)` — a curried call whose factory is `<fn>.pick`.
|
|
500
|
+
const head = chainHead(init);
|
|
501
|
+
if (!head || head.type !== "CallExpression")
|
|
502
|
+
return;
|
|
503
|
+
const headCallee = unwrapExpression(head.callee);
|
|
504
|
+
if (headCallee?.type !== "CallExpression")
|
|
505
|
+
return;
|
|
506
|
+
const factoryCallee = unwrapExpression(headCallee.callee);
|
|
507
|
+
if (!factoryCallee || factoryCallee.type !== "MemberExpression" || factoryCallee.computed === true) {
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
const object = factoryCallee.object;
|
|
511
|
+
const property = factoryCallee.property;
|
|
512
|
+
if (object.type !== "Identifier" || property.type !== "Identifier" || property.name !== "pick")
|
|
513
|
+
return;
|
|
514
|
+
if (!isTestFnName(object.name, fns))
|
|
515
|
+
return;
|
|
516
|
+
// Test ID from the curried call's first arg (string or `{ id }`).
|
|
517
|
+
const idArg = head.arguments?.[0];
|
|
518
|
+
let testId = stringFromExpression(idArg);
|
|
519
|
+
if (testId === undefined) {
|
|
520
|
+
const idObj = objectFromExpression(idArg);
|
|
521
|
+
if (idObj)
|
|
522
|
+
testId = stringProperty(idObj, "id");
|
|
523
|
+
}
|
|
524
|
+
if (testId === undefined)
|
|
525
|
+
return;
|
|
526
|
+
const line = lineOf(statement);
|
|
527
|
+
const pickArg = headCallee.arguments?.[0];
|
|
528
|
+
const inlineObj = objectFromExpression(pickArg);
|
|
529
|
+
if (inlineObj) {
|
|
530
|
+
const keys = (inlineObj.properties ?? [])
|
|
531
|
+
.filter((p) => p.type === "ObjectProperty")
|
|
532
|
+
.map((p) => propertyNameText(p))
|
|
533
|
+
.filter((k) => typeof k === "string");
|
|
534
|
+
results.push({
|
|
535
|
+
testId,
|
|
536
|
+
line,
|
|
537
|
+
exportName,
|
|
538
|
+
keys: keys.length > 0 ? keys : null,
|
|
539
|
+
dataSource: keys.length > 0 ? { type: "inline" } : undefined,
|
|
540
|
+
});
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
const pickVar = unwrapExpression(pickArg);
|
|
544
|
+
if (pickVar?.type === "Identifier") {
|
|
545
|
+
const loader = dataSources.get(pickVar.name);
|
|
546
|
+
results.push({
|
|
547
|
+
testId,
|
|
548
|
+
line,
|
|
549
|
+
exportName,
|
|
550
|
+
keys: null,
|
|
551
|
+
dataSource: loader
|
|
552
|
+
? {
|
|
553
|
+
type: loader.type,
|
|
554
|
+
path: resolveDataPath(loader.path, {
|
|
555
|
+
filePath: options?.filePath,
|
|
556
|
+
projectRoot: options?.projectRoot,
|
|
557
|
+
}).resolvedPath,
|
|
558
|
+
}
|
|
559
|
+
: undefined,
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
// Any other data-arg shape (member access, call, …) is not recorded.
|
|
563
|
+
});
|
|
564
|
+
return results;
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Create a static metadata extractor that reads files via `readFile`. Merges
|
|
568
|
+
* construction-time `customFns` with call-time `runtimeFns` (alias discovery).
|
|
569
|
+
*/
|
|
570
|
+
export function createStaticExtractor(readFile, customFns) {
|
|
571
|
+
return async (filePath, runtimeFns) => {
|
|
572
|
+
const content = await readFile(filePath);
|
|
573
|
+
const merged = customFns || runtimeFns
|
|
574
|
+
? [...new Set([...(customFns ?? []), ...(runtimeFns ?? [])])]
|
|
575
|
+
: undefined;
|
|
576
|
+
return extractFromSource(content, merged);
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=extractor-ast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor-ast.js","sourceRoot":"","sources":["../src/extractor-ast.ts"],"names":[],"mappings":"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"}
|