@glubean/cli 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/dist/commands/contracts.d.ts.map +1 -1
- package/dist/commands/contracts.js +28 -4
- package/dist/commands/contracts.js.map +1 -1
- package/dist/commands/migrate.d.ts +31 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +516 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +11 -4
- package/dist/commands/run.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +15 -0
- package/dist/main.js.map +1 -1
- package/package.json +14 -5
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { basename, dirname, extname, join, relative, resolve } from "node:path";
|
|
4
|
+
async function loadTypeScript(rootDir) {
|
|
5
|
+
// Try the project's own `typescript` first — a globally or npx-installed
|
|
6
|
+
// `glubean` would otherwise resolve to the CLI package itself, missing the
|
|
7
|
+
// version the project uses (or failing entirely if the project has TS but
|
|
8
|
+
// the CLI doesn't carry it as a dependency).
|
|
9
|
+
const candidates = [
|
|
10
|
+
// Project-local: resolves from the project being migrated
|
|
11
|
+
() => createRequire(join(rootDir, "package.json")).resolve("typescript"),
|
|
12
|
+
// CLI-local fallback: bare `require` is undefined in ESM; use createRequire rooted at this file
|
|
13
|
+
() => createRequire(import.meta.url).resolve("typescript"),
|
|
14
|
+
];
|
|
15
|
+
for (const candidate of candidates) {
|
|
16
|
+
try {
|
|
17
|
+
const resolved = candidate();
|
|
18
|
+
return (await import(resolved)).default;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// try next
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
throw new Error("glubean migrate requires the `typescript` package. Run `npm install -D typescript` (or pnpm/yarn equivalent) and retry.");
|
|
25
|
+
}
|
|
26
|
+
const colors = {
|
|
27
|
+
reset: "\x1b[0m",
|
|
28
|
+
bold: "\x1b[1m",
|
|
29
|
+
dim: "\x1b[2m",
|
|
30
|
+
green: "\x1b[32m",
|
|
31
|
+
yellow: "\x1b[33m",
|
|
32
|
+
cyan: "\x1b[36m",
|
|
33
|
+
};
|
|
34
|
+
const IGNORED_DIRS = new Set([
|
|
35
|
+
".git",
|
|
36
|
+
".glubean",
|
|
37
|
+
"coverage",
|
|
38
|
+
"dist",
|
|
39
|
+
"node_modules",
|
|
40
|
+
"out",
|
|
41
|
+
]);
|
|
42
|
+
const CONTRACT_PLUGIN_IMPORTS = {
|
|
43
|
+
"@glubean/grpc": { packageName: "@glubean/grpc", localName: "grpcPlugin" },
|
|
44
|
+
"@glubean/graphql": { packageName: "@glubean/graphql", localName: "graphqlPlugin" },
|
|
45
|
+
};
|
|
46
|
+
export async function migrateCommand(options = {}) {
|
|
47
|
+
const rootDir = resolve(options.dir ?? ".");
|
|
48
|
+
const apply = options.apply === true;
|
|
49
|
+
const plan = await planMigration(rootDir);
|
|
50
|
+
const changedFiles = plan.files.filter((file) => file.original !== file.next);
|
|
51
|
+
const fixes = plan.files.flatMap((file) => file.fixes);
|
|
52
|
+
const manual = plan.files.flatMap((file) => file.manual);
|
|
53
|
+
console.log(`${colors.bold}Glubean migrate${colors.reset} v0.1.x -> v10`);
|
|
54
|
+
console.log(`${colors.dim}Mode: ${apply ? "apply" : "dry-run"}${colors.reset}`);
|
|
55
|
+
console.log("");
|
|
56
|
+
if (fixes.length === 0 && manual.length === 0) {
|
|
57
|
+
console.log(`${colors.green}No legacy patterns found.${colors.reset}`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (fixes.length > 0) {
|
|
61
|
+
console.log(`${colors.bold}Automatic changes${colors.reset}`);
|
|
62
|
+
for (const fix of fixes) {
|
|
63
|
+
console.log(` ${colors.cyan}${relative(rootDir, fix.file)}:${fix.line}${colors.reset} ${fix.message}`);
|
|
64
|
+
}
|
|
65
|
+
console.log("");
|
|
66
|
+
}
|
|
67
|
+
if (manual.length > 0) {
|
|
68
|
+
console.log(`${colors.bold}Manual review${colors.reset}`);
|
|
69
|
+
for (const item of manual) {
|
|
70
|
+
console.log(` ${colors.yellow}${relative(rootDir, item.file)}:${item.line}${colors.reset} ${item.message}`);
|
|
71
|
+
}
|
|
72
|
+
console.log("");
|
|
73
|
+
}
|
|
74
|
+
if (changedFiles.length > 0) {
|
|
75
|
+
console.log(`${colors.bold}Preview diff${colors.reset}`);
|
|
76
|
+
for (const file of changedFiles) {
|
|
77
|
+
process.stdout.write(renderDiff(relative(rootDir, file.file), file.original, file.next));
|
|
78
|
+
}
|
|
79
|
+
console.log("");
|
|
80
|
+
}
|
|
81
|
+
if (apply) {
|
|
82
|
+
for (const file of changedFiles) {
|
|
83
|
+
await mkdir(dirname(file.file), { recursive: true });
|
|
84
|
+
await writeFile(file.file, file.next, "utf-8");
|
|
85
|
+
}
|
|
86
|
+
console.log(`${colors.green}Applied${colors.reset} ${changedFiles.length} file(s).`);
|
|
87
|
+
}
|
|
88
|
+
else if (changedFiles.length > 0) {
|
|
89
|
+
console.log(`${colors.dim}Run ${colors.cyan}glubean migrate --apply${colors.dim} to write these changes.${colors.reset}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export async function planMigration(rootDir) {
|
|
93
|
+
const ts = await loadTypeScript(rootDir);
|
|
94
|
+
const files = await collectTypeScriptFiles(rootDir);
|
|
95
|
+
const filePlans = [];
|
|
96
|
+
const setupPlugins = new Set();
|
|
97
|
+
for (const file of files) {
|
|
98
|
+
const source = await readFile(file, "utf-8");
|
|
99
|
+
const plan = planFileMigration(ts, rootDir, file, source);
|
|
100
|
+
for (const plugin of plan.setupPlugins)
|
|
101
|
+
setupPlugins.add(plugin);
|
|
102
|
+
filePlans.push({
|
|
103
|
+
file,
|
|
104
|
+
original: source,
|
|
105
|
+
next: applyReplacements(source, plan.replacements),
|
|
106
|
+
fixes: plan.fixes,
|
|
107
|
+
manual: plan.manual,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (setupPlugins.size > 0) {
|
|
111
|
+
const setupPath = resolve(rootDir, "glubean.setup.ts");
|
|
112
|
+
const existing = filePlans.find((file) => file.file === setupPath);
|
|
113
|
+
if (existing) {
|
|
114
|
+
const next = ensureSetupInstalls(existing.next, setupPlugins);
|
|
115
|
+
if (next !== existing.next) {
|
|
116
|
+
existing.fixes.push({
|
|
117
|
+
file: setupPath,
|
|
118
|
+
line: 1,
|
|
119
|
+
message: "Install contract plugin manifests from glubean.setup.ts.",
|
|
120
|
+
});
|
|
121
|
+
existing.next = next;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const source = ensureSetupInstalls("", setupPlugins);
|
|
126
|
+
filePlans.push({
|
|
127
|
+
file: setupPath,
|
|
128
|
+
original: "",
|
|
129
|
+
next: source,
|
|
130
|
+
fixes: [
|
|
131
|
+
{
|
|
132
|
+
file: setupPath,
|
|
133
|
+
line: 1,
|
|
134
|
+
message: "Create glubean.setup.ts with contract plugin manifests.",
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
manual: [],
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return { rootDir, files: filePlans, setupPlugins };
|
|
142
|
+
}
|
|
143
|
+
function planFileMigration(ts, rootDir, file, source) {
|
|
144
|
+
const sourceFile = ts.createSourceFile(file, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
145
|
+
const replacements = [];
|
|
146
|
+
const fixes = [];
|
|
147
|
+
const manual = [];
|
|
148
|
+
const setupPlugins = new Set();
|
|
149
|
+
const legacyHttpCalls = [];
|
|
150
|
+
const removedImports = new Set();
|
|
151
|
+
// Track the LOCAL binding names bound to `@glubean/sdk`'s `definePlugin`.
|
|
152
|
+
// Using a Set handles `import { definePlugin as glubeanPlugin }` aliases —
|
|
153
|
+
// the old single-flag approach only checked for a callee named literally
|
|
154
|
+
// "definePlugin", so aliases were missed and unrelated `definePlugin` from
|
|
155
|
+
// other libraries could still be false-positived when the file also imported
|
|
156
|
+
// the SDK symbol under an alias.
|
|
157
|
+
const definePluginLocals = new Set();
|
|
158
|
+
// Detect whether the file already declares its own scoped HTTP instance via
|
|
159
|
+
// `contract.http.with(...)`. If so, the user is past the trivial-bare-call
|
|
160
|
+
// pattern and an empty `contract.http.with("<stem>", {})` synthesised by
|
|
161
|
+
// migrate would clobber meaningful local config. Refuse the auto-rewrite —
|
|
162
|
+
// surface a manual review instead.
|
|
163
|
+
let hasExistingHttpWith = false;
|
|
164
|
+
const visit = (node) => {
|
|
165
|
+
if (ts.isImportDeclaration(node)) {
|
|
166
|
+
const specifier = stringLiteralText(ts, node.moduleSpecifier);
|
|
167
|
+
if (!node.importClause && specifier && CONTRACT_PLUGIN_IMPORTS[specifier]) {
|
|
168
|
+
setupPlugins.add(specifier);
|
|
169
|
+
removedImports.add(node);
|
|
170
|
+
replacements.push(removeStatementReplacement(source, node));
|
|
171
|
+
fixes.push({
|
|
172
|
+
file,
|
|
173
|
+
line: lineOf(ts, sourceFile, node),
|
|
174
|
+
message: `Move ${specifier} side-effect plugin import to glubean.setup.ts installPlugin(...).`,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
if (specifier === "@glubean/sdk" && node.importClause?.namedBindings && ts.isNamedImports(node.importClause.namedBindings)) {
|
|
178
|
+
for (const element of node.importClause.namedBindings.elements) {
|
|
179
|
+
// Track the LOCAL name (after `as`) so aliased imports are caught:
|
|
180
|
+
// `import { definePlugin as dp } from "@glubean/sdk"` → locals has "dp"
|
|
181
|
+
const original = element.propertyName?.text ?? element.name.text;
|
|
182
|
+
if (original === "definePlugin") {
|
|
183
|
+
definePluginLocals.add(element.name.text);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (ts.isCallExpression(node)) {
|
|
189
|
+
if (isLegacyHttpCall(ts, node)) {
|
|
190
|
+
legacyHttpCalls.push(node);
|
|
191
|
+
}
|
|
192
|
+
if (isExistingHttpWithCall(ts, node)) {
|
|
193
|
+
hasExistingHttpWith = true;
|
|
194
|
+
}
|
|
195
|
+
if (definePluginLocals.size > 0 && isLegacyDefinePluginCall(ts, node, definePluginLocals)) {
|
|
196
|
+
manual.push({
|
|
197
|
+
file,
|
|
198
|
+
line: lineOf(ts, sourceFile, node),
|
|
199
|
+
code: "legacy-plugin",
|
|
200
|
+
message: "definePlugin((runtime) => ...) was removed; migrate to definePlugin({ matchers, protocols, setup }).",
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
205
|
+
collectCaseFindings(ts, sourceFile, file, node, manual);
|
|
206
|
+
}
|
|
207
|
+
ts.forEachChild(node, visit);
|
|
208
|
+
};
|
|
209
|
+
visit(sourceFile);
|
|
210
|
+
if (legacyHttpCalls.length > 0) {
|
|
211
|
+
if (hasExistingHttpWith) {
|
|
212
|
+
// Bail on the auto-rewrite — the file already has a scoped HTTP instance,
|
|
213
|
+
// so the synthesised `migratedHttp = contract.http.with("<stem>", {})`
|
|
214
|
+
// would either collide with an existing identifier or contradict the
|
|
215
|
+
// user's intentional local setup. Report each legacy call as manual.
|
|
216
|
+
for (const call of legacyHttpCalls) {
|
|
217
|
+
manual.push({
|
|
218
|
+
file,
|
|
219
|
+
line: lineOf(ts, sourceFile, call),
|
|
220
|
+
code: "legacy-http-bare",
|
|
221
|
+
message: 'Bare contract.http("id", spec) call found alongside an existing contract.http.with(...) instance. Rebind manually onto the scoped instance to preserve your client/baseUrl config.',
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
const instanceName = uniqueIdentifier(source, "migratedHttp");
|
|
227
|
+
const importEnd = findImportInsertionOffset(ts, sourceFile, removedImports);
|
|
228
|
+
const instanceLabel = scopedInstanceLabel(file, rootDir);
|
|
229
|
+
replacements.push({
|
|
230
|
+
start: importEnd,
|
|
231
|
+
end: importEnd,
|
|
232
|
+
text: `${source[importEnd - 1] === "\n" ? "" : "\n"}\nconst ${instanceName} = contract.http.with("${instanceLabel}", {});\n`,
|
|
233
|
+
});
|
|
234
|
+
for (const call of legacyHttpCalls) {
|
|
235
|
+
replacements.push({
|
|
236
|
+
start: call.expression.getStart(sourceFile),
|
|
237
|
+
end: call.expression.getEnd(),
|
|
238
|
+
text: instanceName,
|
|
239
|
+
});
|
|
240
|
+
fixes.push({
|
|
241
|
+
file,
|
|
242
|
+
line: lineOf(ts, sourceFile, call),
|
|
243
|
+
message: 'Rewrite contract.http("id", spec) to a scoped contract.http.with(...) instance.',
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
// Always surface the synthesised instance config for review — the empty
|
|
247
|
+
// `{}` is a placeholder. If the user previously relied on plugin-level
|
|
248
|
+
// HTTP defaults (a global client manifest), this is fine. If they were
|
|
249
|
+
// bringing per-file http config they will need to add it here.
|
|
250
|
+
manual.push({
|
|
251
|
+
file,
|
|
252
|
+
line: lineOf(ts, sourceFile, legacyHttpCalls[0]),
|
|
253
|
+
code: "legacy-http-bare",
|
|
254
|
+
message: `Created ${instanceName} = contract.http.with("${instanceLabel}", {}). Review the empty options object and add client/baseUrl/headers as needed.`,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return { replacements, fixes, manual, setupPlugins };
|
|
259
|
+
}
|
|
260
|
+
function collectCaseFindings(ts, sourceFile, file, object, manual) {
|
|
261
|
+
for (const property of object.properties) {
|
|
262
|
+
if (!ts.isPropertyAssignment(property))
|
|
263
|
+
continue;
|
|
264
|
+
if (propertyName(ts, property.name) !== "cases")
|
|
265
|
+
continue;
|
|
266
|
+
if (!ts.isObjectLiteralExpression(property.initializer))
|
|
267
|
+
continue;
|
|
268
|
+
for (const caseProp of property.initializer.properties) {
|
|
269
|
+
if (!ts.isPropertyAssignment(caseProp))
|
|
270
|
+
continue;
|
|
271
|
+
const value = caseProp.initializer;
|
|
272
|
+
if (ts.isCallExpression(value) && ts.isIdentifier(value.expression) && value.expression.text === "defineHttpCase") {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (!ts.isObjectLiteralExpression(value))
|
|
276
|
+
continue;
|
|
277
|
+
for (const field of value.properties) {
|
|
278
|
+
if (!ts.isPropertyAssignment(field))
|
|
279
|
+
continue;
|
|
280
|
+
const name = propertyName(ts, field.name);
|
|
281
|
+
if (name === "setup" || name === "teardown") {
|
|
282
|
+
manual.push({
|
|
283
|
+
file,
|
|
284
|
+
line: lineOf(ts, sourceFile, field),
|
|
285
|
+
code: "legacy-lifecycle",
|
|
286
|
+
message: `Case-level ${name} was removed; extract lifecycle work into a bootstrap overlay or session.`,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
if (name === "needs") {
|
|
290
|
+
manual.push({
|
|
291
|
+
file,
|
|
292
|
+
line: lineOf(ts, sourceFile, field),
|
|
293
|
+
code: "needs-factory",
|
|
294
|
+
message: "Case has needs; wrap the case in defineHttpCase<Needs>(...) to preserve body/input typing.",
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function isLegacyHttpCall(ts, node) {
|
|
302
|
+
const expression = node.expression;
|
|
303
|
+
if (!ts.isPropertyAccessExpression(expression))
|
|
304
|
+
return false;
|
|
305
|
+
if (expression.name.text !== "http")
|
|
306
|
+
return false;
|
|
307
|
+
return ts.isIdentifier(expression.expression) && expression.expression.text === "contract";
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Match `contract.http.with(...)` — the v10 scoped instance constructor.
|
|
311
|
+
* Used to detect "user already declared a scoped http instance in this file"
|
|
312
|
+
* so we don't auto-rewrite over their config.
|
|
313
|
+
*/
|
|
314
|
+
function isExistingHttpWithCall(ts, node) {
|
|
315
|
+
const expression = node.expression;
|
|
316
|
+
if (!ts.isPropertyAccessExpression(expression))
|
|
317
|
+
return false;
|
|
318
|
+
if (expression.name.text !== "with")
|
|
319
|
+
return false;
|
|
320
|
+
if (!ts.isPropertyAccessExpression(expression.expression))
|
|
321
|
+
return false;
|
|
322
|
+
if (expression.expression.name.text !== "http")
|
|
323
|
+
return false;
|
|
324
|
+
return ts.isIdentifier(expression.expression.expression) && expression.expression.expression.text === "contract";
|
|
325
|
+
}
|
|
326
|
+
function isLegacyDefinePluginCall(ts, node, locals) {
|
|
327
|
+
if (!ts.isIdentifier(node.expression) || !locals.has(node.expression.text))
|
|
328
|
+
return false;
|
|
329
|
+
const first = node.arguments[0];
|
|
330
|
+
return !!first && (ts.isArrowFunction(first) || ts.isFunctionExpression(first));
|
|
331
|
+
}
|
|
332
|
+
async function collectTypeScriptFiles(rootDir) {
|
|
333
|
+
const files = [];
|
|
334
|
+
async function walk(dir) {
|
|
335
|
+
let entries;
|
|
336
|
+
try {
|
|
337
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
for (const entry of entries) {
|
|
343
|
+
const path = join(dir, entry.name);
|
|
344
|
+
if (entry.isDirectory()) {
|
|
345
|
+
if (!IGNORED_DIRS.has(entry.name))
|
|
346
|
+
await walk(path);
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
if (!entry.isFile())
|
|
350
|
+
continue;
|
|
351
|
+
if (!isMigratableTsFile(path))
|
|
352
|
+
continue;
|
|
353
|
+
files.push(path);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
await walk(rootDir);
|
|
357
|
+
files.sort();
|
|
358
|
+
return files;
|
|
359
|
+
}
|
|
360
|
+
function isMigratableTsFile(path) {
|
|
361
|
+
if (!path.endsWith(".ts") || path.endsWith(".d.ts"))
|
|
362
|
+
return false;
|
|
363
|
+
const name = basename(path);
|
|
364
|
+
// Migratable file conventions:
|
|
365
|
+
// - `glubean.setup.ts` — for installPlugin manifest rewrites
|
|
366
|
+
// - `*.contract.ts` / `*.flow.ts` — contract-layer files
|
|
367
|
+
// - `*.test.ts` / `*.spec.ts` — tests that may import contract surfaces
|
|
368
|
+
// - `*.plugin.ts` / `*.plugins.ts` — plugin authoring (legacy `definePlugin`).
|
|
369
|
+
// Pre-fix used `name.includes("plugin")` which over-matched any file
|
|
370
|
+
// whose name happened to contain "plugin" (e.g. `eslint-plugin.ts`,
|
|
371
|
+
// `plugin-utils.ts`). Now we only match a `.plugin.ts` / `.plugins.ts`
|
|
372
|
+
// suffix — the conventional Glubean plugin naming.
|
|
373
|
+
return name === "glubean.setup.ts" ||
|
|
374
|
+
name.endsWith(".contract.ts") ||
|
|
375
|
+
name.endsWith(".flow.ts") ||
|
|
376
|
+
name.endsWith(".test.ts") ||
|
|
377
|
+
name.endsWith(".spec.ts") ||
|
|
378
|
+
name.endsWith(".plugin.ts") ||
|
|
379
|
+
name.endsWith(".plugins.ts");
|
|
380
|
+
}
|
|
381
|
+
function ensureSetupInstalls(source, plugins) {
|
|
382
|
+
const specs = [...plugins].filter((plugin) => CONTRACT_PLUGIN_IMPORTS[plugin]);
|
|
383
|
+
if (specs.length === 0)
|
|
384
|
+
return source;
|
|
385
|
+
const trimmed = source.trim().length > 0 ? source : "";
|
|
386
|
+
const linesToPrepend = [];
|
|
387
|
+
if (!/from\s+["']@glubean\/sdk["']/.test(source) || !/\binstallPlugin\b/.test(source)) {
|
|
388
|
+
linesToPrepend.push('import { installPlugin } from "@glubean/sdk";');
|
|
389
|
+
}
|
|
390
|
+
const pluginNames = [];
|
|
391
|
+
for (const spec of specs) {
|
|
392
|
+
const plugin = CONTRACT_PLUGIN_IMPORTS[spec];
|
|
393
|
+
if (!new RegExp(`import\\s+${plugin.localName}\\s+from\\s+["']${escapeRegExp(plugin.packageName)}["']`).test(source)) {
|
|
394
|
+
linesToPrepend.push(`import ${plugin.localName} from "${plugin.packageName}";`);
|
|
395
|
+
}
|
|
396
|
+
pluginNames.push(plugin.localName);
|
|
397
|
+
}
|
|
398
|
+
const missingPluginNames = pluginNames.filter((name) => !new RegExp(`installPlugin\\([^)]*\\b${name}\\b`, "s").test(source));
|
|
399
|
+
const installLine = missingPluginNames.length > 0 ? `await installPlugin(${missingPluginNames.join(", ")});` : "";
|
|
400
|
+
const prefix = linesToPrepend.length > 0 ? `${linesToPrepend.join("\n")}\n${trimmed ? "\n" : ""}` : "";
|
|
401
|
+
const body = trimmed ? ensureTrailingNewline(trimmed) : "";
|
|
402
|
+
const suffix = installLine ? `${body && !body.endsWith("\n\n") ? "\n" : ""}${installLine}\n` : "";
|
|
403
|
+
return prefix + body + suffix;
|
|
404
|
+
}
|
|
405
|
+
function applyReplacements(source, replacements) {
|
|
406
|
+
if (replacements.length === 0)
|
|
407
|
+
return source;
|
|
408
|
+
const sorted = [...replacements].sort((a, b) => b.start - a.start);
|
|
409
|
+
let next = source;
|
|
410
|
+
let lastStart = Number.POSITIVE_INFINITY;
|
|
411
|
+
for (const replacement of sorted) {
|
|
412
|
+
if (replacement.end > lastStart) {
|
|
413
|
+
throw new Error("Internal migrate error: overlapping replacements");
|
|
414
|
+
}
|
|
415
|
+
next = next.slice(0, replacement.start) + replacement.text + next.slice(replacement.end);
|
|
416
|
+
lastStart = replacement.start;
|
|
417
|
+
}
|
|
418
|
+
return next;
|
|
419
|
+
}
|
|
420
|
+
function renderDiff(file, oldText, newText) {
|
|
421
|
+
if (oldText === newText)
|
|
422
|
+
return "";
|
|
423
|
+
const oldLines = splitLines(oldText);
|
|
424
|
+
const newLines = splitLines(newText);
|
|
425
|
+
let prefix = 0;
|
|
426
|
+
while (prefix < oldLines.length && prefix < newLines.length && oldLines[prefix] === newLines[prefix]) {
|
|
427
|
+
prefix++;
|
|
428
|
+
}
|
|
429
|
+
let suffix = 0;
|
|
430
|
+
while (suffix < oldLines.length - prefix &&
|
|
431
|
+
suffix < newLines.length - prefix &&
|
|
432
|
+
oldLines[oldLines.length - 1 - suffix] === newLines[newLines.length - 1 - suffix]) {
|
|
433
|
+
suffix++;
|
|
434
|
+
}
|
|
435
|
+
const contextBefore = Math.max(0, prefix - 3);
|
|
436
|
+
const oldEnd = oldLines.length - suffix;
|
|
437
|
+
const newEnd = newLines.length - suffix;
|
|
438
|
+
const contextAfterOld = Math.min(oldLines.length, oldEnd + 3);
|
|
439
|
+
const contextAfterNew = Math.min(newLines.length, newEnd + 3);
|
|
440
|
+
const out = [
|
|
441
|
+
`--- ${file}\n`,
|
|
442
|
+
`+++ ${file}\n`,
|
|
443
|
+
`@@ -${contextBefore + 1},${contextAfterOld - contextBefore} +${contextBefore + 1},${contextAfterNew - contextBefore} @@\n`,
|
|
444
|
+
];
|
|
445
|
+
for (let i = contextBefore; i < prefix; i++)
|
|
446
|
+
out.push(` ${oldLines[i]}`);
|
|
447
|
+
for (let i = prefix; i < oldEnd; i++)
|
|
448
|
+
out.push(`-${oldLines[i]}`);
|
|
449
|
+
for (let i = prefix; i < newEnd; i++)
|
|
450
|
+
out.push(`+${newLines[i]}`);
|
|
451
|
+
for (let i = oldEnd; i < contextAfterOld; i++)
|
|
452
|
+
out.push(` ${oldLines[i]}`);
|
|
453
|
+
return out.join("");
|
|
454
|
+
}
|
|
455
|
+
function splitLines(text) {
|
|
456
|
+
if (text.length === 0)
|
|
457
|
+
return [];
|
|
458
|
+
const lines = text.match(/.*(?:\n|$)/g) ?? [];
|
|
459
|
+
return lines.filter((line) => line.length > 0);
|
|
460
|
+
}
|
|
461
|
+
function findImportInsertionOffset(ts, sourceFile, skip) {
|
|
462
|
+
let offset = 0;
|
|
463
|
+
for (const statement of sourceFile.statements) {
|
|
464
|
+
if (ts.isImportDeclaration(statement) && !skip.has(statement)) {
|
|
465
|
+
offset = statement.end;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return offset;
|
|
469
|
+
}
|
|
470
|
+
function removeStatementReplacement(source, node) {
|
|
471
|
+
let end = node.end;
|
|
472
|
+
if (source[end] === "\r" && source[end + 1] === "\n")
|
|
473
|
+
end += 2;
|
|
474
|
+
else if (source[end] === "\n")
|
|
475
|
+
end += 1;
|
|
476
|
+
return { start: node.getStart(), end, text: "" };
|
|
477
|
+
}
|
|
478
|
+
function stringLiteralText(ts, node) {
|
|
479
|
+
return ts.isStringLiteral(node) ? node.text : undefined;
|
|
480
|
+
}
|
|
481
|
+
function propertyName(ts, name) {
|
|
482
|
+
if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name))
|
|
483
|
+
return name.text;
|
|
484
|
+
return undefined;
|
|
485
|
+
}
|
|
486
|
+
function lineOf(_ts, sourceFile, node) {
|
|
487
|
+
return sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
|
|
488
|
+
}
|
|
489
|
+
function uniqueIdentifier(source, base) {
|
|
490
|
+
if (!new RegExp(`\\b${escapeRegExp(base)}\\b`).test(source))
|
|
491
|
+
return base;
|
|
492
|
+
for (let i = 2; i < 100; i++) {
|
|
493
|
+
const candidate = `${base}${i}`;
|
|
494
|
+
if (!new RegExp(`\\b${escapeRegExp(candidate)}\\b`).test(source))
|
|
495
|
+
return candidate;
|
|
496
|
+
}
|
|
497
|
+
throw new Error(`Unable to find a free identifier for ${base}`);
|
|
498
|
+
}
|
|
499
|
+
function scopedInstanceLabel(file, rootDir) {
|
|
500
|
+
const rel = relative(rootDir, file);
|
|
501
|
+
const base = basename(rel)
|
|
502
|
+
.replace(/\.contract\.ts$/, "")
|
|
503
|
+
.replace(/\.flow\.ts$/, "")
|
|
504
|
+
.replace(/\.test\.ts$/, "")
|
|
505
|
+
.replace(/\.spec\.ts$/, "")
|
|
506
|
+
.replace(extname(rel), "");
|
|
507
|
+
const cleaned = base.replace(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
508
|
+
return cleaned || "migrated-http";
|
|
509
|
+
}
|
|
510
|
+
function ensureTrailingNewline(text) {
|
|
511
|
+
return text.endsWith("\n") ? text : `${text}\n`;
|
|
512
|
+
}
|
|
513
|
+
function escapeRegExp(value) {
|
|
514
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
515
|
+
}
|
|
516
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AA+CA,UAAU,UAAU;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAyID,UAAU,kBAAkB;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAkG/E;AA+ED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CA44Cf"}
|
package/dist/commands/run.js
CHANGED
|
@@ -8,7 +8,7 @@ import { resolveEnvFileName } from "../lib/active_env.js";
|
|
|
8
8
|
import { shouldSkipTest } from "../lib/skip.js";
|
|
9
9
|
import { CLI_VERSION } from "../version.js";
|
|
10
10
|
import { extractContractCases, extractFromSource } from "@glubean/scanner/static";
|
|
11
|
-
import { extractContractFromFile, loadProjectOverlays } from "@glubean/scanner";
|
|
11
|
+
import { extractContractFromFile, findTemplateMatch, loadProjectOverlays, matchesTemplateFilter, } from "@glubean/scanner";
|
|
12
12
|
import { applyEnvTemplating } from "@glubean/runner";
|
|
13
13
|
// ANSI color codes for pretty output
|
|
14
14
|
const colors = {
|
|
@@ -203,14 +203,14 @@ export async function discoverTests(filePath) {
|
|
|
203
203
|
timeout: m.timeout,
|
|
204
204
|
skip: m.skip,
|
|
205
205
|
only: m.only,
|
|
206
|
-
groupId: m.groupId,
|
|
206
|
+
groupId: m.groupId ?? (m.variant === "pick" || m.parallel ? m.id : undefined),
|
|
207
207
|
parallel: m.parallel,
|
|
208
208
|
},
|
|
209
209
|
}));
|
|
210
210
|
}
|
|
211
211
|
function matchesFilter(testItem, filter) {
|
|
212
212
|
const lowerFilter = filter.toLowerCase();
|
|
213
|
-
if (testItem.meta.id
|
|
213
|
+
if (matchesTemplateFilter(testItem.meta.id, lowerFilter))
|
|
214
214
|
return true;
|
|
215
215
|
if (testItem.meta.name?.toLowerCase().includes(lowerFilter))
|
|
216
216
|
return true;
|
|
@@ -229,6 +229,10 @@ function getLogFilePath(testFilePath) {
|
|
|
229
229
|
return testFilePath + ".log";
|
|
230
230
|
return testFilePath.slice(0, lastDot) + ".log";
|
|
231
231
|
}
|
|
232
|
+
function findFileTestByRuntimeId(tests, runtimeId) {
|
|
233
|
+
const match = findTemplateMatch(tests.map((ft) => ({ id: ft.test.meta.id, ft })), runtimeId);
|
|
234
|
+
return match?.ft;
|
|
235
|
+
}
|
|
232
236
|
function resolveOutputPath(userPath, cwd) {
|
|
233
237
|
if (isAbsolute(userPath)) {
|
|
234
238
|
return resolve(userPath);
|
|
@@ -676,6 +680,7 @@ export async function runCommand(target, options = {}) {
|
|
|
676
680
|
// "start" event inside file:event handlers.
|
|
677
681
|
let currentGroupFilePath = "";
|
|
678
682
|
let currentTestMap;
|
|
683
|
+
let currentTestItems;
|
|
679
684
|
let testId = "";
|
|
680
685
|
let testName = "";
|
|
681
686
|
let testItem = null;
|
|
@@ -881,6 +886,7 @@ export async function runCommand(target, options = {}) {
|
|
|
881
886
|
currentGroupFilePath = ev.filePath;
|
|
882
887
|
startedFiles.add(ev.filePath);
|
|
883
888
|
const runnable = runnableByFile.get(ev.filePath) ?? [];
|
|
889
|
+
currentTestItems = runnable;
|
|
884
890
|
currentTestMap = new Map(runnable.map((ft) => [ft.test.meta.id, ft]));
|
|
885
891
|
if (isMultiFile) {
|
|
886
892
|
const relPath = relative(process.cwd(), ev.filePath);
|
|
@@ -913,7 +919,8 @@ export async function runCommand(target, options = {}) {
|
|
|
913
919
|
const event = ev.event;
|
|
914
920
|
switch (event.type) {
|
|
915
921
|
case "start": {
|
|
916
|
-
const entry = currentTestMap?.get(event.id)
|
|
922
|
+
const entry = currentTestMap?.get(event.id) ??
|
|
923
|
+
(currentTestItems ? findFileTestByRuntimeId(currentTestItems, event.id) : undefined);
|
|
917
924
|
testId = event.id;
|
|
918
925
|
testName = entry?.test.meta.name || event.name || event.id;
|
|
919
926
|
testItem = entry?.test || null;
|