@ir-kit/k6-toolkit 0.1.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.
Files changed (83) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +62 -0
  3. package/dist/ast-imports.d.ts +15 -0
  4. package/dist/ast-imports.d.ts.map +1 -0
  5. package/dist/ast-imports.js +12 -0
  6. package/dist/ast-imports.js.map +1 -0
  7. package/dist/bundle.d.ts +25 -0
  8. package/dist/bundle.d.ts.map +1 -0
  9. package/dist/bundle.js +60 -0
  10. package/dist/bundle.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +88 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/index.d.ts +7 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +6 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/init.d.ts +50 -0
  20. package/dist/init.d.ts.map +1 -0
  21. package/dist/init.js +73 -0
  22. package/dist/init.js.map +1 -0
  23. package/dist/loadtest-scaffold.d.ts +48 -0
  24. package/dist/loadtest-scaffold.d.ts.map +1 -0
  25. package/dist/loadtest-scaffold.js +121 -0
  26. package/dist/loadtest-scaffold.js.map +1 -0
  27. package/dist/operation-map.d.ts +6 -0
  28. package/dist/operation-map.d.ts.map +1 -0
  29. package/dist/operation-map.js +27 -0
  30. package/dist/operation-map.js.map +1 -0
  31. package/dist/print.d.ts +4 -0
  32. package/dist/print.d.ts.map +1 -0
  33. package/dist/print.js +14 -0
  34. package/dist/print.js.map +1 -0
  35. package/dist/rename-report.d.ts +26 -0
  36. package/dist/rename-report.d.ts.map +1 -0
  37. package/dist/rename-report.js +30 -0
  38. package/dist/rename-report.js.map +1 -0
  39. package/dist/run.d.ts +27 -0
  40. package/dist/run.d.ts.map +1 -0
  41. package/dist/run.js +30 -0
  42. package/dist/run.js.map +1 -0
  43. package/dist/scaffold/ast-helpers.d.ts +10 -0
  44. package/dist/scaffold/ast-helpers.d.ts.map +1 -0
  45. package/dist/scaffold/ast-helpers.js +21 -0
  46. package/dist/scaffold/ast-helpers.js.map +1 -0
  47. package/dist/scaffold/chains.d.ts +10 -0
  48. package/dist/scaffold/chains.d.ts.map +1 -0
  49. package/dist/scaffold/chains.js +92 -0
  50. package/dist/scaffold/chains.js.map +1 -0
  51. package/dist/scaffold/cli-handler.d.ts +4 -0
  52. package/dist/scaffold/cli-handler.d.ts.map +1 -0
  53. package/dist/scaffold/cli-handler.js +204 -0
  54. package/dist/scaffold/cli-handler.js.map +1 -0
  55. package/dist/scaffold/scenario.d.ts +34 -0
  56. package/dist/scaffold/scenario.d.ts.map +1 -0
  57. package/dist/scaffold/scenario.js +67 -0
  58. package/dist/scaffold/scenario.js.map +1 -0
  59. package/dist/scaffold/spec-tags.d.ts +15 -0
  60. package/dist/scaffold/spec-tags.d.ts.map +1 -0
  61. package/dist/scaffold/spec-tags.js +23 -0
  62. package/dist/scaffold/spec-tags.js.map +1 -0
  63. package/dist/scaffold/wizard.d.ts +25 -0
  64. package/dist/scaffold/wizard.d.ts.map +1 -0
  65. package/dist/scaffold/wizard.js +156 -0
  66. package/dist/scaffold/wizard.js.map +1 -0
  67. package/dist/snapshot.d.ts +6 -0
  68. package/dist/snapshot.d.ts.map +1 -0
  69. package/dist/snapshot.js +35 -0
  70. package/dist/snapshot.js.map +1 -0
  71. package/dist/spawn-k6.d.ts +30 -0
  72. package/dist/spawn-k6.d.ts.map +1 -0
  73. package/dist/spawn-k6.js +46 -0
  74. package/dist/spawn-k6.js.map +1 -0
  75. package/dist/sync-cli.d.ts +2 -0
  76. package/dist/sync-cli.d.ts.map +1 -0
  77. package/dist/sync-cli.js +137 -0
  78. package/dist/sync-cli.js.map +1 -0
  79. package/dist/sync.d.ts +23 -0
  80. package/dist/sync.d.ts.map +1 -0
  81. package/dist/sync.js +37 -0
  82. package/dist/sync.js.map +1 -0
  83. package/package.json +71 -0
@@ -0,0 +1,30 @@
1
+ import { type StdioOptions } from "node:child_process";
2
+ export interface K6FlagArgs {
3
+ baseUrl?: string;
4
+ vus?: string;
5
+ duration?: string;
6
+ /** k6 `--out` sinks. Each entry is a separate `--out` flag. */
7
+ out?: ReadonlyArray<string>;
8
+ /** k6 `--summary-export=<path>`. */
9
+ summary?: string;
10
+ /** Extra args appended verbatim after the synthesized flags. */
11
+ extraArgs?: ReadonlyArray<string>;
12
+ }
13
+ /** Build the `k6 run …` argv for one bundle. */
14
+ export declare function buildK6Args(outfile: string, args?: K6FlagArgs): string[];
15
+ export interface SpawnK6Opts {
16
+ /** Where to inherit/pipe k6's stdio. Default: "inherit". */
17
+ stdio?: StdioOptions;
18
+ /** Path/name of the k6 binary. Default: "k6". */
19
+ binary?: string;
20
+ /** Working directory. */
21
+ cwd?: string;
22
+ }
23
+ /**
24
+ * Spawn k6 with the given argv. Resolves to the exit code; for
25
+ * signal-terminated processes returns `128 + signum` per POSIX so
26
+ * callers can fail-fast on Ctrl-C / SIGKILL without manual signal
27
+ * decoding.
28
+ */
29
+ export declare function spawnK6(k6Args: ReadonlyArray<string>, opts?: SpawnK6Opts): Promise<number>;
30
+ //# sourceMappingURL=spawn-k6.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-k6.d.ts","sourceRoot":"","sources":["../src/spawn-k6.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAG9D,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,SAAS,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe,GAAG,MAAM,EAAE,CAU5E;AAED,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,MAAM,CAAC,CAajB"}
@@ -0,0 +1,46 @@
1
+ import { spawn } from "node:child_process";
2
+ import { constants as osConstants } from "node:os";
3
+ /** Build the `k6 run …` argv for one bundle. */
4
+ export function buildK6Args(outfile, args = {}) {
5
+ const out = ["run"];
6
+ if (args.baseUrl)
7
+ out.push("-e", `BASE_URL=${args.baseUrl}`);
8
+ if (args.vus)
9
+ out.push("--vus", args.vus);
10
+ if (args.duration)
11
+ out.push("--duration", args.duration);
12
+ for (const sink of args.out ?? [])
13
+ out.push("--out", sink);
14
+ if (args.summary)
15
+ out.push(`--summary-export=${args.summary}`);
16
+ out.push(...(args.extraArgs ?? []));
17
+ out.push(outfile);
18
+ return out;
19
+ }
20
+ /**
21
+ * Spawn k6 with the given argv. Resolves to the exit code; for
22
+ * signal-terminated processes returns `128 + signum` per POSIX so
23
+ * callers can fail-fast on Ctrl-C / SIGKILL without manual signal
24
+ * decoding.
25
+ */
26
+ export function spawnK6(k6Args, opts = {}) {
27
+ const child = spawn(opts.binary ?? "k6", [...k6Args], {
28
+ stdio: opts.stdio ?? "inherit",
29
+ cwd: opts.cwd,
30
+ });
31
+ return new Promise((resolve, reject) => {
32
+ child.on("exit", (code, signal) => {
33
+ if (code !== null)
34
+ return resolve(code);
35
+ if (signal)
36
+ return resolve(128 + (signalNumber(signal) ?? 1));
37
+ resolve(1);
38
+ });
39
+ child.on("error", reject);
40
+ });
41
+ }
42
+ /** Look up the platform-correct signum from Node's os.constants. */
43
+ function signalNumber(signal) {
44
+ return osConstants.signals[signal];
45
+ }
46
+ //# sourceMappingURL=spawn-k6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-k6.js","sourceRoot":"","sources":["../src/spawn-k6.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AAcnD,gDAAgD;AAChD,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,OAAmB,EAAE;IAChE,MAAM,GAAG,GAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,IAAI,CAAC,OAAO;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,GAAG;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,QAAQ;QAAE,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,OAAO;QAAE,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IACpC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC;AACb,CAAC;AAWD;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CACrB,MAA6B,EAC7B,OAAoB,EAAE;IAEtB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE;QACpD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;QAC9B,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;IACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,MAAM;gBAAE,OAAO,OAAO,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oEAAoE;AACpE,SAAS,YAAY,CAAC,MAAsB;IAC1C,OAAQ,WAAW,CAAC,OAA8C,CAAC,MAAM,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runSyncCommand(argv: ReadonlyArray<string>): Promise<void>;
2
+ //# sourceMappingURL=sync-cli.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,137 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-cli.js","sourceRoot":"","sources":["../src/sync-cli.ts"],"names":[],"mappings":"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"}
package/dist/sync.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { type GenerateOptions, type GenerateResult } from "@ir-kit/k6-gen";
2
+ import { type OperationDiff } from "./rename-report.js";
3
+ export interface SyncOptions extends Pick<GenerateOptions, "input" | "normalize" | "defaultBaseUrl" | "scaffold" | "dryRun"> {
4
+ /** Output directory for the generated client. */
5
+ output: string;
6
+ /** Working directory used to resolve relative `input` / `output`. Default: `process.cwd()`. */
7
+ cwd?: string;
8
+ /** Diff operationIds against the prior sync's snapshot. */
9
+ reportRenames?: boolean;
10
+ /** Persist a fresh snapshot after generate. Default: `true`. */
11
+ writeSnapshot?: boolean;
12
+ }
13
+ export interface SyncResult extends GenerateResult {
14
+ /** Drift summary; populated only when `reportRenames` is true. */
15
+ diff?: OperationDiff;
16
+ }
17
+ /**
18
+ * Drive {@link generate} from a spec to an output directory, plus the
19
+ * snapshot bookkeeping that powers `--report-renames`. Returns the full
20
+ * `GenerateResult` (files + ir) so callers can chain.
21
+ */
22
+ export declare function sync(opts: SyncOptions): Promise<SyncResult>;
23
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EAEpB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAO1E,MAAM,WAAW,WACf,SAAQ,IAAI,CACV,eAAe,EACf,OAAO,GAAG,WAAW,GAAG,gBAAgB,GAAG,UAAU,GAAG,QAAQ,CACjE;IACD,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,kEAAkE;IAClE,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA6BjE"}
package/dist/sync.js ADDED
@@ -0,0 +1,37 @@
1
+ import { join, resolve } from "node:path";
2
+ import { generate, } from "@ir-kit/k6-gen";
3
+ import { resolveSpecInput } from "@ir-kit/openapi-tools";
4
+ import { extractOperationMap } from "./operation-map.js";
5
+ import { diffOperationIds } from "./rename-report.js";
6
+ import { loadSnapshotOps, SNAPSHOT_FILENAME, writeSnapshotOps, } from "./snapshot.js";
7
+ /**
8
+ * Drive {@link generate} from a spec to an output directory, plus the
9
+ * snapshot bookkeeping that powers `--report-renames`. Returns the full
10
+ * `GenerateResult` (files + ir) so callers can chain.
11
+ */
12
+ export async function sync(opts) {
13
+ const cwd = opts.cwd ?? process.cwd();
14
+ const output = resolve(cwd, opts.output);
15
+ const input = resolveSpecInput(opts.input, cwd);
16
+ const snapshotPath = join(output, SNAPSHOT_FILENAME);
17
+ const prevOps = opts.reportRenames
18
+ ? await loadSnapshotOps(snapshotPath)
19
+ : null;
20
+ const result = await generate({
21
+ input,
22
+ output,
23
+ normalize: opts.normalize,
24
+ defaultBaseUrl: opts.defaultBaseUrl,
25
+ scaffold: opts.scaffold,
26
+ dryRun: opts.dryRun,
27
+ });
28
+ const nextOps = extractOperationMap(result.ir);
29
+ if (!opts.dryRun && opts.writeSnapshot !== false) {
30
+ await writeSnapshotOps(snapshotPath, nextOps);
31
+ }
32
+ const diff = opts.reportRenames
33
+ ? diffOperationIds(prevOps ?? new Map(), nextOps)
34
+ : undefined;
35
+ return { ...result, diff };
36
+ }
37
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +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,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,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,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChD,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 ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@ir-kit/k6-toolkit",
3
+ "version": "0.1.0",
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
+ "keywords": [
6
+ "k6",
7
+ "load-testing",
8
+ "openapi",
9
+ "codegen",
10
+ "bundler",
11
+ "tsdown"
12
+ ],
13
+ "homepage": "https://github.com/ir-kit/ir-kit/tree/main/packages/k6/toolkit",
14
+ "bugs": {
15
+ "url": "https://github.com/ir-kit/ir-kit/issues"
16
+ },
17
+ "license": "MIT",
18
+ "author": {
19
+ "name": "Ahmed Rowaihi",
20
+ "email": "ahmedrowaihi@gmail.com"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/ir-kit/ir-kit.git",
25
+ "directory": "packages/k6/toolkit"
26
+ },
27
+ "type": "module",
28
+ "sideEffects": false,
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js"
35
+ },
36
+ "./package.json": "./package.json"
37
+ },
38
+ "bin": {
39
+ "k6-ts": "./dist/cli.js"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "README.md",
44
+ "LICENSE.md"
45
+ ],
46
+ "publishConfig": {
47
+ "access": "public",
48
+ "provenance": true
49
+ },
50
+ "dependencies": {
51
+ "@clack/prompts": "^1.3.0",
52
+ "tinyglobby": "^0.2.10",
53
+ "tsdown": "^0.22.0",
54
+ "@ir-kit/k6-gen": "0.1.0",
55
+ "@ir-kit/openapi-tools": "0.1.0"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "^22",
59
+ "vitest": "^4.0.0",
60
+ "@ir-kit/tsconfig": "0.0.0"
61
+ },
62
+ "engines": {
63
+ "node": ">=20.19.0"
64
+ },
65
+ "scripts": {
66
+ "build": "tsc -p tsconfig.build.json",
67
+ "dev": "tsc -p tsconfig.build.json --watch",
68
+ "typecheck": "tsc --noEmit",
69
+ "test": "vitest run --passWithNoTests"
70
+ }
71
+ }