@ir-kit/k6-toolkit 0.1.2 → 0.2.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/README.md +2 -2
- package/dist/sync.js +2 -2
- package/dist/sync.js.map +1 -1
- package/package.json +7 -10
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -88
- package/dist/cli.js.map +0 -1
- package/dist/scaffold/cli-handler.d.ts +0 -4
- package/dist/scaffold/cli-handler.d.ts.map +0 -1
- package/dist/scaffold/cli-handler.js +0 -204
- package/dist/scaffold/cli-handler.js.map +0 -1
- package/dist/scaffold/wizard.d.ts +0 -25
- package/dist/scaffold/wizard.d.ts.map +0 -1
- package/dist/scaffold/wizard.js +0 -156
- package/dist/scaffold/wizard.js.map +0 -1
- package/dist/sync-cli.d.ts +0 -2
- package/dist/sync-cli.d.ts.map +0 -1
- package/dist/sync-cli.js +0 -137
- package/dist/sync-cli.js.map +0 -1
package/README.md
CHANGED
|
@@ -51,7 +51,7 @@ k6-ts sync ./openapi.yaml --output ./src/gen
|
|
|
51
51
|
k6-ts scaffold --spec ./openapi.yaml --tags pets --output-dir loadtests/
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
`k6-ts sync` also accepts `-` to read the spec from stdin, so it composes cleanly with [`@ir-kit/openapi-recon`](https://github.com/
|
|
54
|
+
`k6-ts sync` also accepts `-` to read the spec from stdin, so it composes cleanly with [`@ir-kit/openapi-recon`](https://github.com/ahmedrowaihi/ir-kit/tree/main/packages/openapi/recon) (HAR → spec) and similar pipes.
|
|
55
55
|
|
|
56
56
|
## Status
|
|
57
57
|
|
|
@@ -59,4 +59,4 @@ k6-ts scaffold --spec ./openapi.yaml --tags pets --output-dir loadtests/
|
|
|
59
59
|
|
|
60
60
|
## Repo
|
|
61
61
|
|
|
62
|
-
Source at [
|
|
62
|
+
Source at [ahmedrowaihi/ir-kit](https://github.com/ahmedrowaihi/ir-kit/tree/main/packages/k6/toolkit).
|
package/dist/sync.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { join, resolve } from "node:path";
|
|
2
2
|
import { generate, } from "@ir-kit/k6-gen";
|
|
3
|
-
import {
|
|
3
|
+
import { resolveOpenAPIInput } from "@ir-kit/openapi-loader";
|
|
4
4
|
import { extractOperationMap } from "./operation-map.js";
|
|
5
5
|
import { diffOperationIds } from "./rename-report.js";
|
|
6
6
|
import { loadSnapshotOps, SNAPSHOT_FILENAME, writeSnapshotOps, } from "./snapshot.js";
|
|
@@ -12,7 +12,7 @@ import { loadSnapshotOps, SNAPSHOT_FILENAME, writeSnapshotOps, } from "./snapsho
|
|
|
12
12
|
export async function sync(opts) {
|
|
13
13
|
const cwd = opts.cwd ?? process.cwd();
|
|
14
14
|
const output = resolve(cwd, opts.output);
|
|
15
|
-
const input =
|
|
15
|
+
const input = resolveOpenAPIInput(opts.input, cwd);
|
|
16
16
|
const snapshotPath = join(output, SNAPSHOT_FILENAME);
|
|
17
17
|
const prevOps = opts.reportRenames
|
|
18
18
|
? await loadSnapshotOps(snapshotPath)
|
package/dist/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAGL,QAAQ,GACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAGL,QAAQ,GACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAsB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAsBvB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAiB;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa;QAChC,CAAC,CAAC,MAAM,eAAe,CAAC,YAAY,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;QAC5B,KAAK;QACL,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;QACjD,MAAM,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa;QAC7B,CAAC,CAAC,gBAAgB,CAAC,OAAO,IAAI,IAAI,GAAG,EAAE,EAAE,OAAO,CAAC;QACjD,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ir-kit/k6-toolkit",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Programmatic toolkit for k6 workflows. Bundle loadtests (tsdown passthrough), spawn the k6 binary, sync the typed client from OpenAPI specs. One library covering the bundle → run → sync flow.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"k6",
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
"bundler",
|
|
11
11
|
"tsdown"
|
|
12
12
|
],
|
|
13
|
-
"homepage": "https://github.com/
|
|
13
|
+
"homepage": "https://github.com/ahmedrowaihi/ir-kit/tree/main/packages/k6/toolkit",
|
|
14
14
|
"bugs": {
|
|
15
|
-
"url": "https://github.com/
|
|
15
|
+
"url": "https://github.com/ahmedrowaihi/ir-kit/issues"
|
|
16
16
|
},
|
|
17
17
|
"license": "MIT",
|
|
18
18
|
"author": {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"repository": {
|
|
23
23
|
"type": "git",
|
|
24
|
-
"url": "git+https://github.com/
|
|
24
|
+
"url": "git+https://github.com/ahmedrowaihi/ir-kit.git",
|
|
25
25
|
"directory": "packages/k6/toolkit"
|
|
26
26
|
},
|
|
27
27
|
"type": "module",
|
|
@@ -35,9 +35,6 @@
|
|
|
35
35
|
},
|
|
36
36
|
"./package.json": "./package.json"
|
|
37
37
|
},
|
|
38
|
-
"bin": {
|
|
39
|
-
"k6-ts": "./dist/cli.js"
|
|
40
|
-
},
|
|
41
38
|
"files": [
|
|
42
39
|
"dist",
|
|
43
40
|
"README.md",
|
|
@@ -48,11 +45,11 @@
|
|
|
48
45
|
"provenance": true
|
|
49
46
|
},
|
|
50
47
|
"dependencies": {
|
|
51
|
-
"@clack/prompts": "^1.3.0",
|
|
52
48
|
"tinyglobby": "^0.2.10",
|
|
53
49
|
"tsdown": "^0.22.0",
|
|
54
|
-
"@ir-kit/k6-gen": "0.
|
|
55
|
-
"@ir-kit/openapi-
|
|
50
|
+
"@ir-kit/k6-gen": "0.3.1",
|
|
51
|
+
"@ir-kit/openapi-loader": "0.3.0",
|
|
52
|
+
"@ir-kit/openapi-tools": "0.3.1"
|
|
56
53
|
},
|
|
57
54
|
"devDependencies": {
|
|
58
55
|
"@types/node": "^22",
|
package/dist/cli.d.ts
DELETED
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { spawn } from "node:child_process";
|
|
3
|
-
import { existsSync } from "node:fs";
|
|
4
|
-
import { constants as osConstants } from "node:os";
|
|
5
|
-
import { resolve } from "node:path";
|
|
6
|
-
import { bundle } from "./bundle.js";
|
|
7
|
-
import { runScaffoldCommand } from "./scaffold/cli-handler.js";
|
|
8
|
-
import { runSyncCommand } from "./sync-cli.js";
|
|
9
|
-
const CACHE_DIR = ".k6-ts-cache";
|
|
10
|
-
/**
|
|
11
|
-
* Find the entry .ts file in the args. Walks right-to-left so the script's
|
|
12
|
-
* position (typically the last positional) wins over earlier flag values like
|
|
13
|
-
* `-e VAR=path.ts`.
|
|
14
|
-
*/
|
|
15
|
-
function findTsEntry(args) {
|
|
16
|
-
for (let i = args.length - 1; i >= 0; i--) {
|
|
17
|
-
const a = args[i];
|
|
18
|
-
if (a.startsWith("-"))
|
|
19
|
-
continue;
|
|
20
|
-
if (a.includes("="))
|
|
21
|
-
continue;
|
|
22
|
-
if (!a.endsWith(".ts"))
|
|
23
|
-
continue;
|
|
24
|
-
if (!existsSync(resolve(a)))
|
|
25
|
-
continue;
|
|
26
|
-
return { index: i, path: a };
|
|
27
|
-
}
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
function signalToExitCode(signal) {
|
|
31
|
-
const signum = osConstants.signals[signal] ?? 1;
|
|
32
|
-
return 128 + signum;
|
|
33
|
-
}
|
|
34
|
-
async function main() {
|
|
35
|
-
const args = process.argv.slice(2);
|
|
36
|
-
if (args[0] === "scaffold") {
|
|
37
|
-
await runScaffoldCommand(args.slice(1));
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
if (args[0] === "sync") {
|
|
41
|
-
await runSyncCommand(args.slice(1));
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
let toExec = args;
|
|
45
|
-
const tsEntry = findTsEntry(args);
|
|
46
|
-
if (tsEntry) {
|
|
47
|
-
try {
|
|
48
|
-
const { outfile } = await bundle({
|
|
49
|
-
entry: resolve(tsEntry.path),
|
|
50
|
-
outDir: CACHE_DIR,
|
|
51
|
-
});
|
|
52
|
-
toExec = [
|
|
53
|
-
...args.slice(0, tsEntry.index),
|
|
54
|
-
outfile,
|
|
55
|
-
...args.slice(tsEntry.index + 1),
|
|
56
|
-
];
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
console.error(`k6-ts: bundle failed for ${tsEntry.path}:`, err instanceof Error ? err.message : err);
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
const child = spawn("k6", [...toExec], { stdio: "inherit" });
|
|
64
|
-
for (const sig of ["SIGINT", "SIGTERM", "SIGHUP"]) {
|
|
65
|
-
process.on(sig, () => {
|
|
66
|
-
if (!child.killed)
|
|
67
|
-
child.kill(sig);
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
child.on("error", (err) => {
|
|
71
|
-
if (err.code === "ENOENT") {
|
|
72
|
-
console.error("k6-ts: k6 binary not found on PATH. Install it from https://k6.io/docs/get-started/installation/");
|
|
73
|
-
process.exit(127);
|
|
74
|
-
}
|
|
75
|
-
console.error("k6-ts: failed to spawn k6:", err.message);
|
|
76
|
-
process.exit(1);
|
|
77
|
-
});
|
|
78
|
-
child.on("exit", (code, signal) => {
|
|
79
|
-
if (signal)
|
|
80
|
-
process.exit(signalToExitCode(signal));
|
|
81
|
-
process.exit(code ?? 1);
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
main().catch((err) => {
|
|
85
|
-
console.error("k6-ts:", err instanceof Error ? err.message : err);
|
|
86
|
-
process.exit(1);
|
|
87
|
-
});
|
|
88
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-handler.d.ts","sourceRoot":"","sources":["../../src/scaffold/cli-handler.ts"],"names":[],"mappings":"AAgBA,QAAA,MAAM,IAAI,QA6BF,CAAC;AA+DT,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAwJD,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { dirname, relative, resolve } from "node:path";
|
|
3
|
-
import { intro, log, outro } from "@clack/prompts";
|
|
4
|
-
import { loadSpec } from "@ir-kit/openapi-tools";
|
|
5
|
-
import { parseSpec } from "@ir-kit/openapi-tools/parse";
|
|
6
|
-
import { scaffoldScenario, } from "./scenario.js";
|
|
7
|
-
import { readSpecOperations } from "./spec-tags.js";
|
|
8
|
-
import { confirmOverwrite, runScenarioWizard } from "./wizard.js";
|
|
9
|
-
const HELP = `
|
|
10
|
-
k6-ts scaffold — generate scenario files from your OpenAPI spec.
|
|
11
|
-
|
|
12
|
-
USAGE
|
|
13
|
-
k6-ts scaffold # interactive wizard
|
|
14
|
-
k6-ts scaffold list-ops [--json] # discover ops (grouped by tag)
|
|
15
|
-
k6-ts scaffold [flags…] # flag-driven, single scenario
|
|
16
|
-
k6-ts scaffold --tags <a,b,c> [flags…] # batch — one scenario per tag
|
|
17
|
-
|
|
18
|
-
REQUIRED (flag mode)
|
|
19
|
-
--name <slug> Scenario name (used for filename + step label)
|
|
20
|
-
--ops <a,b,c> Comma-separated operation IDs
|
|
21
|
-
|
|
22
|
-
OPTIONAL
|
|
23
|
-
--spec <path-or-url> OpenAPI spec. Default: ./openapi.yaml
|
|
24
|
-
--client-import <path> Import path for the generated client.
|
|
25
|
-
Default: ./src/gen/index.js
|
|
26
|
-
--chain sequential|batch Default: sequential
|
|
27
|
-
--pace smoke|load|stress|spike|soak Default: smoke
|
|
28
|
-
--duration <duration> Default: 30s (or 1h for soak)
|
|
29
|
-
--auth none|bearer|basic|apiKey|session|digest|ntlm Default: none
|
|
30
|
-
--output <file> Where to write (single scenario)
|
|
31
|
-
--output-dir <dir> Where to write (batch mode)
|
|
32
|
-
--force Overwrite without prompting
|
|
33
|
-
--help Show this help
|
|
34
|
-
|
|
35
|
-
BATCH MODE (--tags)
|
|
36
|
-
Generates one scenario file per tag, named after the tag. Each picks all
|
|
37
|
-
operations carrying that tag with sensible defaults (smoke, sequential).
|
|
38
|
-
`.trim();
|
|
39
|
-
function parseArgs(argv) {
|
|
40
|
-
if (argv[0] === "list-ops") {
|
|
41
|
-
return {
|
|
42
|
-
kind: "list-ops",
|
|
43
|
-
spec: pickFlag(argv, "--spec") ?? "./openapi.yaml",
|
|
44
|
-
json: argv.includes("--json"),
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
kind: "flags",
|
|
49
|
-
name: pickFlag(argv, "--name"),
|
|
50
|
-
ops: pickFlag(argv, "--ops"),
|
|
51
|
-
tags: pickFlag(argv, "--tags"),
|
|
52
|
-
spec: pickFlag(argv, "--spec") ?? "./openapi.yaml",
|
|
53
|
-
clientImport: pickFlag(argv, "--client-import") ?? "./src/gen/index.js",
|
|
54
|
-
chain: pickFlag(argv, "--chain") ?? "sequential",
|
|
55
|
-
pace: pickFlag(argv, "--pace") ?? "smoke",
|
|
56
|
-
duration: pickFlag(argv, "--duration"),
|
|
57
|
-
auth: pickFlag(argv, "--auth") ?? "none",
|
|
58
|
-
output: pickFlag(argv, "--output"),
|
|
59
|
-
outputDir: pickFlag(argv, "--output-dir"),
|
|
60
|
-
force: argv.includes("--force"),
|
|
61
|
-
showHelp: argv.includes("--help") || argv.includes("-h"),
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
function pickFlag(argv, name) {
|
|
65
|
-
const i = argv.indexOf(name);
|
|
66
|
-
if (i === -1)
|
|
67
|
-
return undefined;
|
|
68
|
-
return argv[i + 1];
|
|
69
|
-
}
|
|
70
|
-
export async function runScaffoldCommand(argv) {
|
|
71
|
-
const parsed = parseArgs(argv);
|
|
72
|
-
if (parsed.kind === "flags" && parsed.showHelp) {
|
|
73
|
-
console.log(HELP);
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
// list-ops subcommand — no I/O beyond stdout
|
|
77
|
-
if (parsed.kind === "list-ops") {
|
|
78
|
-
await listOps(parsed);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
const spec = await loadAndIndexSpec(parsed.spec);
|
|
82
|
-
// Batch mode: --tags <a,b,c>
|
|
83
|
-
if (parsed.tags) {
|
|
84
|
-
await scaffoldByTags(spec, parsed);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
// Flag mode (non-interactive): --name + --ops required
|
|
88
|
-
if (parsed.name && parsed.ops) {
|
|
89
|
-
await scaffoldFromFlags(spec, parsed);
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
// Interactive — no name/ops/tags
|
|
93
|
-
await scaffoldInteractive(spec, parsed);
|
|
94
|
-
}
|
|
95
|
-
async function loadAndIndexSpec(specPath) {
|
|
96
|
-
const bundled = await loadSpec({ input: specPath, normalize: true });
|
|
97
|
-
const ir = parseSpec(bundled);
|
|
98
|
-
return readSpecOperations(ir.paths);
|
|
99
|
-
}
|
|
100
|
-
async function listOps(parsed) {
|
|
101
|
-
const spec = await loadAndIndexSpec(parsed.spec);
|
|
102
|
-
if (parsed.json) {
|
|
103
|
-
const byTag = {};
|
|
104
|
-
for (const [tag, ops] of spec.byTag) {
|
|
105
|
-
byTag[tag] = ops.map((o) => o.id);
|
|
106
|
-
}
|
|
107
|
-
console.log(JSON.stringify({ byTag, total: spec.all.length }, null, 2));
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
for (const [tag, ops] of spec.byTag) {
|
|
111
|
-
console.log(`\n${tag} (${ops.length} ops)`);
|
|
112
|
-
for (const op of ops) {
|
|
113
|
-
console.log(` ${op.method.toUpperCase().padEnd(6)} ${op.path} · ${op.id}`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
console.log(`\n${spec.all.length} total ops`);
|
|
117
|
-
}
|
|
118
|
-
async function scaffoldFromFlags(spec, parsed) {
|
|
119
|
-
const opIds = parsed
|
|
120
|
-
.ops.split(",")
|
|
121
|
-
.map((s) => s.trim())
|
|
122
|
-
.filter(Boolean);
|
|
123
|
-
const ops = opIds
|
|
124
|
-
.map((id) => spec.byId.get(id))
|
|
125
|
-
.filter((o) => Boolean(o));
|
|
126
|
-
if (ops.length !== opIds.length) {
|
|
127
|
-
const missing = opIds.filter((id) => !spec.byId.has(id));
|
|
128
|
-
console.error(`k6-ts scaffold: unknown operationId(s): ${missing.join(", ")}`);
|
|
129
|
-
process.exit(2);
|
|
130
|
-
}
|
|
131
|
-
const slug = parsed.name.trim().replace(/[^a-zA-Z0-9-]+/g, "-");
|
|
132
|
-
const output = parsed.output ?? `${parsed.outputDir ?? "./loadtests"}/${slug}.ts`;
|
|
133
|
-
const scaffold = {
|
|
134
|
-
clientImportPath: parsed.clientImport,
|
|
135
|
-
pace: parsed.pace,
|
|
136
|
-
duration: parsed.duration,
|
|
137
|
-
ops,
|
|
138
|
-
chain: parsed.chain,
|
|
139
|
-
auth: { auth: parsed.auth },
|
|
140
|
-
};
|
|
141
|
-
await writeScenario(output, scaffold, parsed.force);
|
|
142
|
-
console.log(`Wrote ${relative(process.cwd(), output)}`);
|
|
143
|
-
}
|
|
144
|
-
async function scaffoldByTags(spec, parsed) {
|
|
145
|
-
const tags = parsed
|
|
146
|
-
.tags.split(",")
|
|
147
|
-
.map((s) => s.trim())
|
|
148
|
-
.filter(Boolean);
|
|
149
|
-
const outputDir = parsed.outputDir ?? "./loadtests";
|
|
150
|
-
const force = parsed.force;
|
|
151
|
-
for (const tag of tags) {
|
|
152
|
-
const ops = spec.byTag.get(tag);
|
|
153
|
-
if (!ops || ops.length === 0) {
|
|
154
|
-
console.error(`k6-ts scaffold: no operations under tag "${tag}"`);
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
|
-
const slug = tag.replace(/[^a-zA-Z0-9-]+/g, "-");
|
|
158
|
-
const output = `${outputDir}/${slug}.ts`;
|
|
159
|
-
await writeScenario(output, {
|
|
160
|
-
clientImportPath: parsed.clientImport,
|
|
161
|
-
pace: parsed.pace,
|
|
162
|
-
duration: parsed.duration,
|
|
163
|
-
ops,
|
|
164
|
-
chain: parsed.chain,
|
|
165
|
-
auth: { auth: parsed.auth },
|
|
166
|
-
}, force);
|
|
167
|
-
console.log(`Wrote ${relative(process.cwd(), output)} (${ops.length} ops)`);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
async function scaffoldInteractive(spec, parsed) {
|
|
171
|
-
intro("k6-ts scaffold");
|
|
172
|
-
const result = await runScenarioWizard(spec, {
|
|
173
|
-
clientImportPath: parsed.clientImport,
|
|
174
|
-
outputDir: parsed.outputDir ?? "./loadtests",
|
|
175
|
-
});
|
|
176
|
-
if (!result)
|
|
177
|
-
return;
|
|
178
|
-
await writeScenario(result.outputPath, result.scaffold, parsed.force);
|
|
179
|
-
outro([
|
|
180
|
-
`Wrote ${relative(process.cwd(), result.outputPath)}`,
|
|
181
|
-
`Run it: k6-ts run ${relative(process.cwd(), result.outputPath)}`,
|
|
182
|
-
].join("\n"));
|
|
183
|
-
}
|
|
184
|
-
async function writeScenario(output, scaffold, force) {
|
|
185
|
-
const absolute = resolve(output);
|
|
186
|
-
if (existsSync(absolute) && !force) {
|
|
187
|
-
const ok = await confirmOverwrite(relative(process.cwd(), absolute));
|
|
188
|
-
if (!ok) {
|
|
189
|
-
log.warn(`Skipped ${relative(process.cwd(), absolute)}`);
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
const content = scaffoldScenario(scaffold);
|
|
194
|
-
mkdirSync(dirname(absolute), { recursive: true });
|
|
195
|
-
writeFileSync(absolute, content, "utf8");
|
|
196
|
-
ensureFile(absolute);
|
|
197
|
-
}
|
|
198
|
-
function ensureFile(absolute) {
|
|
199
|
-
const s = statSync(absolute);
|
|
200
|
-
if (!s.isFile())
|
|
201
|
-
throw new Error(`expected a file at ${absolute}`);
|
|
202
|
-
}
|
|
203
|
-
export { HELP as SCAFFOLD_HELP };
|
|
204
|
-
//# sourceMappingURL=cli-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-handler.js","sourceRoot":"","sources":["../../src/scaffold/cli-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { ScaffoldScenarioOpts } from "./scenario.js";
|
|
2
|
-
import { type SpecOperations } from "./spec-tags.js";
|
|
3
|
-
/**
|
|
4
|
-
* Wizard answers — a fully-resolved scaffold config ready for `scaffoldScenario`
|
|
5
|
-
* plus the filesystem target (output path).
|
|
6
|
-
*/
|
|
7
|
-
export interface WizardResult {
|
|
8
|
-
outputPath: string;
|
|
9
|
-
scaffold: ScaffoldScenarioOpts;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Prompt the user through scenario authoring. Returns `null` if cancelled.
|
|
13
|
-
* Reuses `SpecOperations` for op discovery so the same source-of-truth feeds
|
|
14
|
-
* the CLI's `list-ops` subcommand.
|
|
15
|
-
*/
|
|
16
|
-
export declare function runScenarioWizard(spec: SpecOperations, defaults: {
|
|
17
|
-
clientImportPath: string;
|
|
18
|
-
outputDir: string;
|
|
19
|
-
}): Promise<WizardResult | null>;
|
|
20
|
-
/**
|
|
21
|
-
* Confirm-overwrite prompt — shared by wizard and flag-mode CLI so a single
|
|
22
|
-
* UX rules them both. Returns `true` to proceed.
|
|
23
|
-
*/
|
|
24
|
-
export declare function confirmOverwrite(path: string): Promise<boolean>;
|
|
25
|
-
//# sourceMappingURL=wizard.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/scaffold/wizard.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAc,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,KAAK,cAAc,EAAY,MAAM,gBAAgB,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAQD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE;IACR,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAkI9B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrE"}
|
package/dist/scaffold/wizard.js
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { cancel, confirm, isCancel, multiselect, select, text, } from "@clack/prompts";
|
|
2
|
-
import { UNTAGGED } from "./spec-tags.js";
|
|
3
|
-
/** Bail-out helper. */
|
|
4
|
-
function bail() {
|
|
5
|
-
cancel("Aborted.");
|
|
6
|
-
return null;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Prompt the user through scenario authoring. Returns `null` if cancelled.
|
|
10
|
-
* Reuses `SpecOperations` for op discovery so the same source-of-truth feeds
|
|
11
|
-
* the CLI's `list-ops` subcommand.
|
|
12
|
-
*/
|
|
13
|
-
export async function runScenarioWizard(spec, defaults) {
|
|
14
|
-
const tagOptions = Array.from(spec.byTag.entries()).map(([tag, ops]) => ({
|
|
15
|
-
value: tag,
|
|
16
|
-
label: `${tag === UNTAGGED ? "(untagged)" : tag} — ${ops.length} op${ops.length === 1 ? "" : "s"}`,
|
|
17
|
-
}));
|
|
18
|
-
tagOptions.push({ value: "__manual__", label: "Pick ops manually" });
|
|
19
|
-
const tagPick = await select({
|
|
20
|
-
message: "Which group should this scenario cover?",
|
|
21
|
-
options: tagOptions,
|
|
22
|
-
});
|
|
23
|
-
if (isCancel(tagPick))
|
|
24
|
-
return bail();
|
|
25
|
-
let ops;
|
|
26
|
-
if (tagPick === "__manual__") {
|
|
27
|
-
const opOptions = spec.all.map((op) => ({
|
|
28
|
-
value: op.id,
|
|
29
|
-
label: `${op.method.toUpperCase()} ${op.path} · ${op.id}`,
|
|
30
|
-
}));
|
|
31
|
-
const picked = (await multiselect({
|
|
32
|
-
message: "Which ops? (space toggles, enter confirms)",
|
|
33
|
-
options: opOptions,
|
|
34
|
-
required: true,
|
|
35
|
-
}));
|
|
36
|
-
if (isCancel(picked))
|
|
37
|
-
return bail();
|
|
38
|
-
ops = picked
|
|
39
|
-
.map((id) => spec.byId.get(id))
|
|
40
|
-
.filter((o) => o !== undefined);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
const tagOps = spec.byTag.get(tagPick) ?? [];
|
|
44
|
-
const opOptions = tagOps.map((op) => ({
|
|
45
|
-
value: op.id,
|
|
46
|
-
label: `${op.method.toUpperCase()} ${op.path} · ${op.id}`,
|
|
47
|
-
}));
|
|
48
|
-
const picked = (await multiselect({
|
|
49
|
-
message: `Ops from "${tagPick}" — keep them all or narrow?`,
|
|
50
|
-
options: opOptions,
|
|
51
|
-
initialValues: tagOps.map((o) => o.id),
|
|
52
|
-
required: true,
|
|
53
|
-
}));
|
|
54
|
-
if (isCancel(picked))
|
|
55
|
-
return bail();
|
|
56
|
-
ops = picked
|
|
57
|
-
.map((id) => spec.byId.get(id))
|
|
58
|
-
.filter((o) => o !== undefined);
|
|
59
|
-
}
|
|
60
|
-
const defaultName = tagPick === "__manual__" ? "scenario" : `${tagPick}-flow`;
|
|
61
|
-
const name = (await text({
|
|
62
|
-
message: "Scenario name?",
|
|
63
|
-
initialValue: defaultName,
|
|
64
|
-
validate: (v) => (v && v.trim().length ? undefined : "Required"),
|
|
65
|
-
}));
|
|
66
|
-
if (isCancel(name))
|
|
67
|
-
return bail();
|
|
68
|
-
const chain = (await select({
|
|
69
|
-
message: "How should they compose?",
|
|
70
|
-
options: [
|
|
71
|
-
{
|
|
72
|
-
value: "sequential",
|
|
73
|
-
label: "Sequential — chain step outputs (CRUD-style)",
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
value: "batch",
|
|
77
|
-
label: "Parallel fan-out — flow().batch() with async ops",
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
|
-
initialValue: "sequential",
|
|
81
|
-
}));
|
|
82
|
-
if (isCancel(chain))
|
|
83
|
-
return bail();
|
|
84
|
-
const pace = (await select({
|
|
85
|
-
message: "Pace preset?",
|
|
86
|
-
options: [
|
|
87
|
-
{ value: "smoke", label: "smoke 1 VU × 30s — CI sanity" },
|
|
88
|
-
{ value: "load", label: "load ramp to target VUs — steady state" },
|
|
89
|
-
{
|
|
90
|
-
value: "stress",
|
|
91
|
-
label: "stress climb to ceiling — find breaking point",
|
|
92
|
-
},
|
|
93
|
-
{ value: "spike", label: "spike baseline → peak → recover" },
|
|
94
|
-
{ value: "soak", label: "soak long-haul — leak detection" },
|
|
95
|
-
],
|
|
96
|
-
initialValue: "smoke",
|
|
97
|
-
}));
|
|
98
|
-
if (isCancel(pace))
|
|
99
|
-
return bail();
|
|
100
|
-
const duration = (await text({
|
|
101
|
-
message: "Duration?",
|
|
102
|
-
initialValue: pace === "soak" ? "1h" : "30s",
|
|
103
|
-
}));
|
|
104
|
-
if (isCancel(duration))
|
|
105
|
-
return bail();
|
|
106
|
-
const auth = (await select({
|
|
107
|
-
message: "Auth?",
|
|
108
|
-
options: [
|
|
109
|
-
{ value: "none", label: "None" },
|
|
110
|
-
{ value: "bearer", label: "Bearer (API_TOKEN env)" },
|
|
111
|
-
{ value: "basic", label: "Basic (API_USER / API_PASS env)" },
|
|
112
|
-
{ value: "apiKey", label: "API key header (X-API-Key / API_KEY env)" },
|
|
113
|
-
{ value: "session", label: "Session cookie (fill signIn yourself)" },
|
|
114
|
-
{ value: "digest", label: "HTTP Digest (API_USER / API_PASS env)" },
|
|
115
|
-
{ value: "ntlm", label: "NTLM (API_USER / API_PASS env)" },
|
|
116
|
-
],
|
|
117
|
-
initialValue: "none",
|
|
118
|
-
}));
|
|
119
|
-
if (isCancel(auth))
|
|
120
|
-
return bail();
|
|
121
|
-
const slug = String(name)
|
|
122
|
-
.trim()
|
|
123
|
-
.replace(/[^a-zA-Z0-9-]+/g, "-");
|
|
124
|
-
const outputPath = (await text({
|
|
125
|
-
message: "Output path?",
|
|
126
|
-
initialValue: `${defaults.outputDir}/${slug}.ts`,
|
|
127
|
-
}));
|
|
128
|
-
if (isCancel(outputPath))
|
|
129
|
-
return bail();
|
|
130
|
-
const authOpts = { auth: auth };
|
|
131
|
-
return {
|
|
132
|
-
outputPath: outputPath,
|
|
133
|
-
scaffold: {
|
|
134
|
-
clientImportPath: defaults.clientImportPath,
|
|
135
|
-
pace: pace,
|
|
136
|
-
duration: duration,
|
|
137
|
-
ops,
|
|
138
|
-
chain: chain,
|
|
139
|
-
auth: authOpts,
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Confirm-overwrite prompt — shared by wizard and flag-mode CLI so a single
|
|
145
|
-
* UX rules them both. Returns `true` to proceed.
|
|
146
|
-
*/
|
|
147
|
-
export async function confirmOverwrite(path) {
|
|
148
|
-
const ok = await confirm({
|
|
149
|
-
message: `${path} already exists — overwrite?`,
|
|
150
|
-
initialValue: false,
|
|
151
|
-
});
|
|
152
|
-
if (isCancel(ok))
|
|
153
|
-
return false;
|
|
154
|
-
return Boolean(ok);
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=wizard.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/scaffold/wizard.ts"],"names":[],"mappings":"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"}
|
package/dist/sync-cli.d.ts
DELETED
package/dist/sync-cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync-cli.d.ts","sourceRoot":"","sources":["../src/sync-cli.ts"],"names":[],"mappings":"AAiIA,wBAAsB,cAAc,CAClC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
|
package/dist/sync-cli.js
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { relative } from "node:path";
|
|
2
|
-
import { sync } from "./sync.js";
|
|
3
|
-
const HELP = `
|
|
4
|
-
k6-ts sync — generate the typed k6 client from an OpenAPI spec.
|
|
5
|
-
|
|
6
|
-
USAGE
|
|
7
|
-
k6-ts sync <spec> [--output ./src/gen] [options]
|
|
8
|
-
k6-ts sync - [options] # read JSON spec from stdin
|
|
9
|
-
|
|
10
|
-
OPTIONS
|
|
11
|
-
--output <dir> Where to write client.ts / types.ts / data.ts / index.ts.
|
|
12
|
-
Default: ./src/gen
|
|
13
|
-
--base-url <url> DEFAULT_BASE_URL baked into the generated client.
|
|
14
|
-
Default: spec.servers[0].url
|
|
15
|
-
--scaffold Also emit one stub loadtest per spec operation under loadtests/.
|
|
16
|
-
--no-normalize Skip the safe-normalize preset on the input spec.
|
|
17
|
-
--dry-run Build everything in memory, print results, don't write.
|
|
18
|
-
--report-renames Diff operationIds against the prior sync's snapshot.
|
|
19
|
-
--help, -h Show this help.
|
|
20
|
-
|
|
21
|
-
EXAMPLES
|
|
22
|
-
k6-ts sync ./openapi.yaml --output ./src/gen
|
|
23
|
-
k6-ts sync https://api.example.com/openapi.json --base-url https://staging.example.com
|
|
24
|
-
openapi-recon ./traffic.har | k6-ts sync - --output ./src/gen
|
|
25
|
-
`.trim();
|
|
26
|
-
function parseArgs(argv) {
|
|
27
|
-
let input = "";
|
|
28
|
-
let output = "./src/gen";
|
|
29
|
-
let baseUrl;
|
|
30
|
-
let scaffold = false;
|
|
31
|
-
let normalize = true;
|
|
32
|
-
let dryRun = false;
|
|
33
|
-
let reportRenames = false;
|
|
34
|
-
let showHelp = false;
|
|
35
|
-
for (let i = 0; i < argv.length; i++) {
|
|
36
|
-
const a = argv[i];
|
|
37
|
-
if (a === "--help" || a === "-h") {
|
|
38
|
-
showHelp = true;
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
if (a === "--scaffold") {
|
|
42
|
-
scaffold = true;
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
if (a === "--no-normalize") {
|
|
46
|
-
normalize = false;
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
if (a === "--dry-run") {
|
|
50
|
-
dryRun = true;
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
if (a === "--report-renames") {
|
|
54
|
-
reportRenames = true;
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
if (a === "--output") {
|
|
58
|
-
output = expectValue(argv, ++i, "--output");
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
if (a === "--base-url") {
|
|
62
|
-
baseUrl = expectValue(argv, ++i, "--base-url");
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
if (a.startsWith("-") && a !== "-") {
|
|
66
|
-
throw new Error(`Unknown flag: ${a}`);
|
|
67
|
-
}
|
|
68
|
-
if (input) {
|
|
69
|
-
throw new Error(`Multiple inputs given: "${input}" and "${a}"`);
|
|
70
|
-
}
|
|
71
|
-
input = a;
|
|
72
|
-
}
|
|
73
|
-
if (!showHelp && !input) {
|
|
74
|
-
throw new Error("Missing input — pass a spec path, URL, or `-` for stdin JSON.");
|
|
75
|
-
}
|
|
76
|
-
return {
|
|
77
|
-
input,
|
|
78
|
-
output,
|
|
79
|
-
baseUrl,
|
|
80
|
-
scaffold,
|
|
81
|
-
normalize,
|
|
82
|
-
dryRun,
|
|
83
|
-
reportRenames,
|
|
84
|
-
showHelp,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
function expectValue(argv, idx, flag) {
|
|
88
|
-
const v = argv[idx];
|
|
89
|
-
if (v === undefined || (v.startsWith("-") && v !== "-")) {
|
|
90
|
-
throw new Error(`${flag} requires a value`);
|
|
91
|
-
}
|
|
92
|
-
return v;
|
|
93
|
-
}
|
|
94
|
-
async function readStdinJson() {
|
|
95
|
-
const chunks = [];
|
|
96
|
-
for await (const chunk of process.stdin) {
|
|
97
|
-
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
98
|
-
}
|
|
99
|
-
return JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
100
|
-
}
|
|
101
|
-
export async function runSyncCommand(argv) {
|
|
102
|
-
let parsed;
|
|
103
|
-
try {
|
|
104
|
-
parsed = parseArgs(argv);
|
|
105
|
-
}
|
|
106
|
-
catch (err) {
|
|
107
|
-
console.error(`k6-ts sync: ${err instanceof Error ? err.message : String(err)}`);
|
|
108
|
-
console.error("Run `k6-ts sync --help` for usage.");
|
|
109
|
-
process.exit(2);
|
|
110
|
-
}
|
|
111
|
-
if (parsed.showHelp) {
|
|
112
|
-
console.log(HELP);
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
const input = parsed.input === "-" ? await readStdinJson() : parsed.input;
|
|
116
|
-
const result = await sync({
|
|
117
|
-
input,
|
|
118
|
-
output: parsed.output,
|
|
119
|
-
normalize: parsed.normalize,
|
|
120
|
-
defaultBaseUrl: parsed.baseUrl,
|
|
121
|
-
scaffold: parsed.scaffold,
|
|
122
|
-
dryRun: parsed.dryRun,
|
|
123
|
-
reportRenames: parsed.reportRenames,
|
|
124
|
-
});
|
|
125
|
-
const where = relative(process.cwd(), result.output) || result.output;
|
|
126
|
-
const action = parsed.dryRun ? "would write" : "wrote";
|
|
127
|
-
console.error(`k6-ts sync: ${action} ${result.files.length} files to ${where}`);
|
|
128
|
-
if (result.diff) {
|
|
129
|
-
for (const r of result.diff.renamed) {
|
|
130
|
-
console.warn(` renamed: ${r.method.toUpperCase()} ${r.path} — ${r.from} → ${r.to}`);
|
|
131
|
-
}
|
|
132
|
-
for (const r of result.diff.removed) {
|
|
133
|
-
console.warn(` removed: ${r.method.toUpperCase()} ${r.path} — ${r.operationId}`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
//# sourceMappingURL=sync-cli.js.map
|
package/dist/sync-cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync-cli.js","sourceRoot":"","sources":["../src/sync-cli.ts"],"names":[],"mappings":"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"}
|