@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.
- package/LICENSE.md +21 -0
- package/README.md +62 -0
- package/dist/ast-imports.d.ts +15 -0
- package/dist/ast-imports.d.ts.map +1 -0
- package/dist/ast-imports.js +12 -0
- package/dist/ast-imports.js.map +1 -0
- package/dist/bundle.d.ts +25 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +60 -0
- package/dist/bundle.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +88 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +50 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +73 -0
- package/dist/init.js.map +1 -0
- package/dist/loadtest-scaffold.d.ts +48 -0
- package/dist/loadtest-scaffold.d.ts.map +1 -0
- package/dist/loadtest-scaffold.js +121 -0
- package/dist/loadtest-scaffold.js.map +1 -0
- package/dist/operation-map.d.ts +6 -0
- package/dist/operation-map.d.ts.map +1 -0
- package/dist/operation-map.js +27 -0
- package/dist/operation-map.js.map +1 -0
- package/dist/print.d.ts +4 -0
- package/dist/print.d.ts.map +1 -0
- package/dist/print.js +14 -0
- package/dist/print.js.map +1 -0
- package/dist/rename-report.d.ts +26 -0
- package/dist/rename-report.d.ts.map +1 -0
- package/dist/rename-report.js +30 -0
- package/dist/rename-report.js.map +1 -0
- package/dist/run.d.ts +27 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +30 -0
- package/dist/run.js.map +1 -0
- package/dist/scaffold/ast-helpers.d.ts +10 -0
- package/dist/scaffold/ast-helpers.d.ts.map +1 -0
- package/dist/scaffold/ast-helpers.js +21 -0
- package/dist/scaffold/ast-helpers.js.map +1 -0
- package/dist/scaffold/chains.d.ts +10 -0
- package/dist/scaffold/chains.d.ts.map +1 -0
- package/dist/scaffold/chains.js +92 -0
- package/dist/scaffold/chains.js.map +1 -0
- package/dist/scaffold/cli-handler.d.ts +4 -0
- package/dist/scaffold/cli-handler.d.ts.map +1 -0
- package/dist/scaffold/cli-handler.js +204 -0
- package/dist/scaffold/cli-handler.js.map +1 -0
- package/dist/scaffold/scenario.d.ts +34 -0
- package/dist/scaffold/scenario.d.ts.map +1 -0
- package/dist/scaffold/scenario.js +67 -0
- package/dist/scaffold/scenario.js.map +1 -0
- package/dist/scaffold/spec-tags.d.ts +15 -0
- package/dist/scaffold/spec-tags.d.ts.map +1 -0
- package/dist/scaffold/spec-tags.js +23 -0
- package/dist/scaffold/spec-tags.js.map +1 -0
- package/dist/scaffold/wizard.d.ts +25 -0
- package/dist/scaffold/wizard.d.ts.map +1 -0
- package/dist/scaffold/wizard.js +156 -0
- package/dist/scaffold/wizard.js.map +1 -0
- package/dist/snapshot.d.ts +6 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +35 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/spawn-k6.d.ts +30 -0
- package/dist/spawn-k6.d.ts.map +1 -0
- package/dist/spawn-k6.js +46 -0
- package/dist/spawn-k6.js.map +1 -0
- package/dist/sync-cli.d.ts +2 -0
- package/dist/sync-cli.d.ts.map +1 -0
- package/dist/sync-cli.js +137 -0
- package/dist/sync-cli.js.map +1 -0
- package/dist/sync.d.ts +23 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +37 -0
- package/dist/sync.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { namedImport, namespaceImport } from "./ast-imports.js";
|
|
3
|
+
import { printStatements } from "./print.js";
|
|
4
|
+
import { defaultExportProp, objLit, reExportConst, varConst, } from "./scaffold/ast-helpers.js";
|
|
5
|
+
const f = ts.factory;
|
|
6
|
+
/** Render a starter `loadtest.ts` via `ts.factory` — no template strings. */
|
|
7
|
+
export function scaffoldLoadtest(opts) {
|
|
8
|
+
const pace = opts.pace ?? "smoke";
|
|
9
|
+
const symbols = ["defineLoadTest", "flow", pace];
|
|
10
|
+
if (opts.auth !== "none")
|
|
11
|
+
symbols.push("useAuth");
|
|
12
|
+
const stmts = [
|
|
13
|
+
k6FrameworkImport(symbols),
|
|
14
|
+
namespaceImport("api", opts.clientImportPath),
|
|
15
|
+
];
|
|
16
|
+
if (opts.auth !== "none")
|
|
17
|
+
stmts.push(authVarDecl(opts));
|
|
18
|
+
stmts.push(loadtestDecl(opts, pace));
|
|
19
|
+
stmts.push(reExportConst("options", "lt", "options"));
|
|
20
|
+
stmts.push(defaultExportProp("lt", "default"));
|
|
21
|
+
return printStatements(stmts);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compose the `import { defineLoadTest, flow, smoke, useAuth, batch?, ... }
|
|
25
|
+
* from "@ir-kit/k6"` line. Shared across both `scaffoldLoadtest` and
|
|
26
|
+
* `scaffoldScenario`. The caller chooses which framework symbols to add.
|
|
27
|
+
*/
|
|
28
|
+
export function k6FrameworkImport(symbols) {
|
|
29
|
+
return namedImport(Array.from(new Set(symbols)).map((name) => ({ name })), "@ir-kit/k6");
|
|
30
|
+
}
|
|
31
|
+
/** `const auth = useAuth.<flavor>({ … });` */
|
|
32
|
+
export function authVarDecl(opts) {
|
|
33
|
+
return varConst("auth", authCallExpr(opts));
|
|
34
|
+
}
|
|
35
|
+
function authCallExpr(opts) {
|
|
36
|
+
const useAuth = f.createIdentifier("useAuth");
|
|
37
|
+
switch (opts.auth) {
|
|
38
|
+
case "bearer":
|
|
39
|
+
return useAuthCall(useAuth, "bearer", [
|
|
40
|
+
objLit({ env: f.createStringLiteral(opts.bearerEnv ?? "API_TOKEN") }),
|
|
41
|
+
]);
|
|
42
|
+
case "basic":
|
|
43
|
+
return useAuthCall(useAuth, "basic", [
|
|
44
|
+
objLit({
|
|
45
|
+
user: objLit({ env: f.createStringLiteral("API_USER") }),
|
|
46
|
+
pass: objLit({ env: f.createStringLiteral("API_PASS") }),
|
|
47
|
+
}),
|
|
48
|
+
]);
|
|
49
|
+
case "apiKey":
|
|
50
|
+
return useAuthCall(useAuth, "apiKey", [
|
|
51
|
+
objLit({
|
|
52
|
+
name: f.createStringLiteral(opts.apiKeyHeader ?? "X-API-Key"),
|
|
53
|
+
env: f.createStringLiteral(opts.apiKeyEnv ?? "API_KEY"),
|
|
54
|
+
}),
|
|
55
|
+
]);
|
|
56
|
+
case "session":
|
|
57
|
+
return useAuthCall(useAuth, "session", [
|
|
58
|
+
objLit({
|
|
59
|
+
signIn: f.createArrowFunction(undefined, undefined, [], undefined, f.createToken(ts.SyntaxKind.EqualsGreaterThanToken), f.createBlock([
|
|
60
|
+
f.createReturnStatement(f.createStringLiteral("/* obtain session cookie */")),
|
|
61
|
+
], true)),
|
|
62
|
+
}),
|
|
63
|
+
]);
|
|
64
|
+
default:
|
|
65
|
+
throw new Error(`Unknown auth flavor: ${opts.auth}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function useAuthCall(useAuth, fn, args) {
|
|
69
|
+
return f.createCallExpression(f.createPropertyAccessExpression(useAuth, f.createIdentifier(fn)), undefined, args);
|
|
70
|
+
}
|
|
71
|
+
function loadtestDecl(opts, pace) {
|
|
72
|
+
const duration = opts.duration ?? "30s";
|
|
73
|
+
const props = [];
|
|
74
|
+
if (opts.auth !== "none")
|
|
75
|
+
props.push(useEntry());
|
|
76
|
+
if (opts.scenarios && opts.scenarios.length > 0) {
|
|
77
|
+
props.push(scenariosEntry(opts.scenarios, pace, duration, opts.seedOperation));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
props.push(paceEntry(pace, duration), budgetsEntry(), flowEntry(opts.seedOperation));
|
|
81
|
+
}
|
|
82
|
+
return varConst("lt", f.createCallExpression(f.createIdentifier("defineLoadTest"), undefined, [
|
|
83
|
+
f.createObjectLiteralExpression(props, true),
|
|
84
|
+
]));
|
|
85
|
+
}
|
|
86
|
+
function useEntry() {
|
|
87
|
+
return f.createPropertyAssignment("use", f.createArrayLiteralExpression([f.createIdentifier("auth")], false));
|
|
88
|
+
}
|
|
89
|
+
function paceEntry(pace, duration) {
|
|
90
|
+
return f.createPropertyAssignment("scenario", f.createCallExpression(f.createIdentifier(pace), undefined, [
|
|
91
|
+
objLit({ duration: f.createStringLiteral(duration) }),
|
|
92
|
+
]));
|
|
93
|
+
}
|
|
94
|
+
function budgetsEntry() {
|
|
95
|
+
return f.createPropertyAssignment("budgets", objLit({
|
|
96
|
+
p95: f.createStringLiteral("500ms"),
|
|
97
|
+
errors: f.createStringLiteral("1%"),
|
|
98
|
+
},
|
|
99
|
+
/* multiline */ true));
|
|
100
|
+
}
|
|
101
|
+
function flowEntry(seedOp) {
|
|
102
|
+
return f.createPropertyAssignment("flow", flowExpr(seedOp));
|
|
103
|
+
}
|
|
104
|
+
function flowExpr(seedOp) {
|
|
105
|
+
const stepLabel = seedOp ?? "health";
|
|
106
|
+
return f.createCallExpression(f.createPropertyAccessExpression(f.createCallExpression(f.createIdentifier("flow"), undefined, []), f.createIdentifier("step")), undefined, [
|
|
107
|
+
f.createStringLiteral(stepLabel),
|
|
108
|
+
f.createArrowFunction(undefined, undefined, [], undefined, f.createToken(ts.SyntaxKind.EqualsGreaterThanToken), f.createBlock(seedOp ? [seededCallStatement(seedOp)] : [], true)),
|
|
109
|
+
]);
|
|
110
|
+
}
|
|
111
|
+
function seededCallStatement(opName) {
|
|
112
|
+
return f.createExpressionStatement(f.createCallExpression(f.createPropertyAccessExpression(f.createIdentifier("api"), f.createIdentifier(opName)), undefined, []));
|
|
113
|
+
}
|
|
114
|
+
function scenariosEntry(names, pace, duration, seedOp) {
|
|
115
|
+
const scenarioObj = f.createObjectLiteralExpression(names.map((name) => f.createPropertyAssignment(name, objLit({
|
|
116
|
+
scenario: f.createCallExpression(f.createIdentifier(pace), undefined, [objLit({ duration: f.createStringLiteral(duration) })]),
|
|
117
|
+
flow: flowExpr(seedOp),
|
|
118
|
+
}, true))), true);
|
|
119
|
+
return f.createPropertyAssignment("scenarios", scenarioObj);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=loadtest-scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadtest-scaffold.js","sourceRoot":"","sources":["../src/loadtest-scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { IR } from "@ir-kit/openapi-tools";
|
|
2
|
+
/** `"GET /pets/{id}" → "getPetById"`. */
|
|
3
|
+
export type OperationMap = Map<string, string>;
|
|
4
|
+
/** Build the op-id map for rename detection. Drops missing/blank operationIds. */
|
|
5
|
+
export declare function extractOperationMap(ir: IR.Model): OperationMap;
|
|
6
|
+
//# sourceMappingURL=operation-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-map.d.ts","sourceRoot":"","sources":["../src/operation-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAYhD,yCAAyC;AACzC,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,YAAY,CAc9D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const HTTP_METHODS = [
|
|
2
|
+
"get",
|
|
3
|
+
"put",
|
|
4
|
+
"post",
|
|
5
|
+
"delete",
|
|
6
|
+
"options",
|
|
7
|
+
"head",
|
|
8
|
+
"patch",
|
|
9
|
+
];
|
|
10
|
+
/** Build the op-id map for rename detection. Drops missing/blank operationIds. */
|
|
11
|
+
export function extractOperationMap(ir) {
|
|
12
|
+
const out = new Map();
|
|
13
|
+
const paths = ir.paths ?? {};
|
|
14
|
+
for (const [path, pathItem] of Object.entries(paths)) {
|
|
15
|
+
if (!pathItem)
|
|
16
|
+
continue;
|
|
17
|
+
for (const method of HTTP_METHODS) {
|
|
18
|
+
const op = pathItem[method];
|
|
19
|
+
const id = op?.operationId?.trim();
|
|
20
|
+
if (!id)
|
|
21
|
+
continue;
|
|
22
|
+
out.set(`${method.toUpperCase()} ${path}`, id);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=operation-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-map.js","sourceRoot":"","sources":["../src/operation-map.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG;IACnB,KAAK;IACL,KAAK;IACL,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;CACC,CAAC;AAKX,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,EAAY;IAC9C,MAAM,GAAG,GAAiB,IAAI,GAAG,EAAE,CAAC;IACpC,MAAM,KAAK,GACR,EAA0D,CAAC,KAAK,IAAI,EAAE,CAAC;IAC1E,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAyC,CAAC;YACpE,MAAM,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,EAAE;gBAAE,SAAS;YAClB,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/print.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.d.ts","sourceRoot":"","sources":["../src/print.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAO5B,0DAA0D;AAC1D,wBAAgB,eAAe,CAC7B,UAAU,EAAE,aAAa,CAAC,EAAE,CAAC,SAAS,CAAC,EACvC,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAYR"}
|
package/dist/print.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
const printer = ts.createPrinter({
|
|
3
|
+
newLine: ts.NewLineKind.LineFeed,
|
|
4
|
+
removeComments: false,
|
|
5
|
+
});
|
|
6
|
+
/** Render TS AST statements into a source-file string. */
|
|
7
|
+
export function printStatements(statements, header) {
|
|
8
|
+
const source = ts.createSourceFile("out.ts", "", ts.ScriptTarget.ES2022, false, ts.ScriptKind.TS);
|
|
9
|
+
const body = statements
|
|
10
|
+
.map((stmt) => printer.printNode(ts.EmitHint.Unspecified, stmt, source))
|
|
11
|
+
.join("\n\n");
|
|
12
|
+
return header ? `${header}\n\n${body}\n` : `${body}\n`;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=print.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.js","sourceRoot":"","sources":["../src/print.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC;IAC/B,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ;IAChC,cAAc,EAAE,KAAK;CACtB,CAAC,CAAC;AAEH,0DAA0D;AAC1D,MAAM,UAAU,eAAe,CAC7B,UAAuC,EACvC,MAAe;IAEf,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,CAChC,QAAQ,EACR,EAAE,EACF,EAAE,CAAC,YAAY,CAAC,MAAM,EACtB,KAAK,EACL,EAAE,CAAC,UAAU,CAAC,EAAE,CACjB,CAAC;IACF,MAAM,IAAI,GAAG,UAAU;SACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;SACvE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { OperationMap } from "./operation-map.js";
|
|
2
|
+
export interface RenameEntry {
|
|
3
|
+
method: string;
|
|
4
|
+
path: string;
|
|
5
|
+
from: string;
|
|
6
|
+
to: string;
|
|
7
|
+
}
|
|
8
|
+
export interface OperationDiff {
|
|
9
|
+
/** Same (method, path) — operationId changed. */
|
|
10
|
+
renamed: RenameEntry[];
|
|
11
|
+
/** Endpoints that existed before but no longer do. */
|
|
12
|
+
removed: Array<{
|
|
13
|
+
method: string;
|
|
14
|
+
path: string;
|
|
15
|
+
operationId: string;
|
|
16
|
+
}>;
|
|
17
|
+
/** Endpoints that didn't exist before. */
|
|
18
|
+
added: Array<{
|
|
19
|
+
method: string;
|
|
20
|
+
path: string;
|
|
21
|
+
operationId: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
/** Diff two op-id maps. Rename = same (method, path), different operationId. */
|
|
25
|
+
export declare function diffOperationIds(prev: OperationMap, next: OperationMap): OperationDiff;
|
|
26
|
+
//# sourceMappingURL=rename-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename-report.d.ts","sourceRoot":"","sources":["../src/rename-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,sDAAsD;IACtD,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,0CAA0C;IAC1C,KAAK,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,YAAY,GACjB,aAAa,CAwBf"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Diff two op-id maps. Rename = same (method, path), different operationId. */
|
|
2
|
+
export function diffOperationIds(prev, next) {
|
|
3
|
+
const renamed = [];
|
|
4
|
+
const removed = [];
|
|
5
|
+
const added = [];
|
|
6
|
+
for (const [key, prevId] of prev) {
|
|
7
|
+
const nextId = next.get(key);
|
|
8
|
+
if (!nextId) {
|
|
9
|
+
const [method, path] = splitKey(key);
|
|
10
|
+
removed.push({ method, path, operationId: prevId });
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (nextId !== prevId) {
|
|
14
|
+
const [method, path] = splitKey(key);
|
|
15
|
+
renamed.push({ method, path, from: prevId, to: nextId });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
for (const [key, nextId] of next) {
|
|
19
|
+
if (prev.has(key))
|
|
20
|
+
continue;
|
|
21
|
+
const [method, path] = splitKey(key);
|
|
22
|
+
added.push({ method, path, operationId: nextId });
|
|
23
|
+
}
|
|
24
|
+
return { renamed, removed, added };
|
|
25
|
+
}
|
|
26
|
+
function splitKey(key) {
|
|
27
|
+
const i = key.indexOf(" ");
|
|
28
|
+
return [key.slice(0, i), key.slice(i + 1)];
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=rename-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename-report.js","sourceRoot":"","sources":["../src/rename-report.ts"],"names":[],"mappings":"AAkBA,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAC9B,IAAkB,EAClB,IAAkB;IAElB,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/run.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type BundleOpts } from "./bundle.js";
|
|
2
|
+
import { type K6FlagArgs, type SpawnK6Opts } from "./spawn-k6.js";
|
|
3
|
+
export interface RunK6Options extends K6FlagArgs {
|
|
4
|
+
/** Source entry to bundle. Required. */
|
|
5
|
+
entry: string;
|
|
6
|
+
/** Extra bundler options forwarded to tsdown. `entry` from here is ignored. */
|
|
7
|
+
bundle?: Omit<BundleOpts, "entry">;
|
|
8
|
+
/** Where to spawn from. Default: process.cwd(). */
|
|
9
|
+
cwd?: string;
|
|
10
|
+
/** Path/name of the k6 binary. Default: "k6". */
|
|
11
|
+
binary?: string;
|
|
12
|
+
/** Inherit/pipe k6 stdio. Default: "inherit". */
|
|
13
|
+
stdio?: SpawnK6Opts["stdio"];
|
|
14
|
+
}
|
|
15
|
+
export interface RunK6Result {
|
|
16
|
+
/** Exit code; signal-killed processes resolve to `128 + signum`. */
|
|
17
|
+
exitCode: number;
|
|
18
|
+
/** Where the bundle was written. */
|
|
19
|
+
outfile: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Bundle a k6 loadtest with tsdown, then spawn the k6 binary against
|
|
23
|
+
* the resulting file. One call covers what `k6-tools run` does at the
|
|
24
|
+
* CLI level.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runK6(opts: RunK6Options): Promise<RunK6Result>;
|
|
27
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAU,MAAM,aAAa,CAAC;AACtD,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,WAAW,EAEjB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnC,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAuBpE"}
|
package/dist/run.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { bundle } from "./bundle.js";
|
|
3
|
+
import { buildK6Args, spawnK6, } from "./spawn-k6.js";
|
|
4
|
+
/**
|
|
5
|
+
* Bundle a k6 loadtest with tsdown, then spawn the k6 binary against
|
|
6
|
+
* the resulting file. One call covers what `k6-tools run` does at the
|
|
7
|
+
* CLI level.
|
|
8
|
+
*/
|
|
9
|
+
export async function runK6(opts) {
|
|
10
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
11
|
+
const { outfile } = await bundle({
|
|
12
|
+
...(opts.bundle ?? {}),
|
|
13
|
+
entry: resolve(cwd, opts.entry),
|
|
14
|
+
});
|
|
15
|
+
const k6Args = buildK6Args(outfile, {
|
|
16
|
+
baseUrl: opts.baseUrl,
|
|
17
|
+
vus: opts.vus,
|
|
18
|
+
duration: opts.duration,
|
|
19
|
+
out: opts.out,
|
|
20
|
+
summary: opts.summary,
|
|
21
|
+
extraArgs: opts.extraArgs,
|
|
22
|
+
});
|
|
23
|
+
const exitCode = await spawnK6(k6Args, {
|
|
24
|
+
binary: opts.binary,
|
|
25
|
+
cwd,
|
|
26
|
+
stdio: opts.stdio,
|
|
27
|
+
});
|
|
28
|
+
return { exitCode, outfile };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=run.js.map
|
package/dist/run.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAmB,MAAM,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,WAAW,EAGX,OAAO,GACR,MAAM,eAAe,CAAC;AAsBvB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAkB;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACtB,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;KAChC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE;QAClC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;QACrC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG;QACH,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
/** `{ k: v, … }` — multiline optional. Shared by loadtest scaffolders. */
|
|
3
|
+
export declare function objLit(props: Record<string, ts.Expression>, multiline?: boolean): ts.ObjectLiteralExpression;
|
|
4
|
+
/** `const <name> = <init>;` */
|
|
5
|
+
export declare function varConst(name: string, init: ts.Expression): ts.Statement;
|
|
6
|
+
/** `export const <localName> = <sourceVar>.<sourceProp>;` */
|
|
7
|
+
export declare function reExportConst(localName: string, sourceVar: string, sourceProp: string): ts.Statement;
|
|
8
|
+
/** `export default <sourceVar>.<sourceProp>;` */
|
|
9
|
+
export declare function defaultExportProp(sourceVar: string, sourceProp: string): ts.Statement;
|
|
10
|
+
//# sourceMappingURL=ast-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-helpers.d.ts","sourceRoot":"","sources":["../../src/scaffold/ast-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,0EAA0E;AAC1E,wBAAgB,MAAM,CACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,EACpC,SAAS,UAAQ,GAChB,EAAE,CAAC,uBAAuB,CAK5B;AAED,+BAA+B;AAC/B,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,SAAS,CAQxE;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,EAAE,CAAC,SAAS,CAkBd;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,EAAE,CAAC,SAAS,CASd"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
const f = ts.factory;
|
|
3
|
+
/** `{ k: v, … }` — multiline optional. Shared by loadtest scaffolders. */
|
|
4
|
+
export function objLit(props, multiline = false) {
|
|
5
|
+
return f.createObjectLiteralExpression(Object.entries(props).map(([k, v]) => f.createPropertyAssignment(k, v)), multiline);
|
|
6
|
+
}
|
|
7
|
+
/** `const <name> = <init>;` */
|
|
8
|
+
export function varConst(name, init) {
|
|
9
|
+
return f.createVariableStatement(undefined, f.createVariableDeclarationList([f.createVariableDeclaration(name, undefined, undefined, init)], ts.NodeFlags.Const));
|
|
10
|
+
}
|
|
11
|
+
/** `export const <localName> = <sourceVar>.<sourceProp>;` */
|
|
12
|
+
export function reExportConst(localName, sourceVar, sourceProp) {
|
|
13
|
+
return f.createVariableStatement([f.createModifier(ts.SyntaxKind.ExportKeyword)], f.createVariableDeclarationList([
|
|
14
|
+
f.createVariableDeclaration(localName, undefined, undefined, f.createPropertyAccessExpression(f.createIdentifier(sourceVar), f.createIdentifier(sourceProp))),
|
|
15
|
+
], ts.NodeFlags.Const));
|
|
16
|
+
}
|
|
17
|
+
/** `export default <sourceVar>.<sourceProp>;` */
|
|
18
|
+
export function defaultExportProp(sourceVar, sourceProp) {
|
|
19
|
+
return f.createExportAssignment(undefined, false, f.createPropertyAccessExpression(f.createIdentifier(sourceVar), f.createIdentifier(sourceProp)));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ast-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-helpers.js","sourceRoot":"","sources":["../../src/scaffold/ast-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;AAErB,0EAA0E;AAC1E,MAAM,UAAU,MAAM,CACpB,KAAoC,EACpC,SAAS,GAAG,KAAK;IAEjB,OAAO,CAAC,CAAC,6BAA6B,CACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EACvE,SAAS,CACV,CAAC;AACJ,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAmB;IACxD,OAAO,CAAC,CAAC,uBAAuB,CAC9B,SAAS,EACT,CAAC,CAAC,6BAA6B,CAC7B,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,EAC/D,EAAE,CAAC,SAAS,CAAC,KAAK,CACnB,CACF,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,SAAiB,EACjB,UAAkB;IAElB,OAAO,CAAC,CAAC,uBAAuB,CAC9B,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAC/C,CAAC,CAAC,6BAA6B,CAC7B;QACE,CAAC,CAAC,yBAAyB,CACzB,SAAS,EACT,SAAS,EACT,SAAS,EACT,CAAC,CAAC,8BAA8B,CAC9B,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAC7B,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAC/B,CACF;KACF,EACD,EAAE,CAAC,SAAS,CAAC,KAAK,CACnB,CACF,CAAC;AACJ,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,UAAkB;IAElB,OAAO,CAAC,CAAC,sBAAsB,CAC7B,SAAS,EACT,KAAK,EACL,CAAC,CAAC,8BAA8B,CAC9B,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAC7B,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAC/B,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WalkedOperation } from "@ir-kit/k6-gen";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
export type ChainMode = "sequential" | "batch";
|
|
4
|
+
/**
|
|
5
|
+
* Build the `flow().step("...", ...).step(...)` or `flow().batch(...)` expression
|
|
6
|
+
* for a given set of operations. Lives next to the scaffolder so the renderer is
|
|
7
|
+
* isolated from CLI / wizard concerns.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildFlowExpression(ops: ReadonlyArray<WalkedOperation>, chain: ChainMode): ts.Expression;
|
|
10
|
+
//# sourceMappingURL=chains.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../src/scaffold/chains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,OAAO,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,aAAa,CAAC,eAAe,CAAC,EACnC,KAAK,EAAE,SAAS,GACf,EAAE,CAAC,UAAU,CAIf"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
const f = ts.factory;
|
|
3
|
+
/**
|
|
4
|
+
* Build the `flow().step("...", ...).step(...)` or `flow().batch(...)` expression
|
|
5
|
+
* for a given set of operations. Lives next to the scaffolder so the renderer is
|
|
6
|
+
* isolated from CLI / wizard concerns.
|
|
7
|
+
*/
|
|
8
|
+
export function buildFlowExpression(ops, chain) {
|
|
9
|
+
if (ops.length === 0)
|
|
10
|
+
return placeholderFlow();
|
|
11
|
+
if (chain === "batch" && ops.length > 1)
|
|
12
|
+
return batchFlow(ops);
|
|
13
|
+
return sequentialFlow(ops);
|
|
14
|
+
}
|
|
15
|
+
/** `flow().step("name", () => {})` for the empty case. */
|
|
16
|
+
function placeholderFlow() {
|
|
17
|
+
return chain(flowCall(), [step("health", arrowFn([]))]);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* `flow().step("first", () => api.first(...)).step("second", () => api.second(...))`
|
|
21
|
+
* Each step calls the op with placeholder args (path params named after the op param,
|
|
22
|
+
* body undefined — user fills these in).
|
|
23
|
+
*/
|
|
24
|
+
function sequentialFlow(ops) {
|
|
25
|
+
const stepCalls = ops.map((op) => step(op.id, arrowFn([apiCallStmt(op, /* asyncNs */ false)])));
|
|
26
|
+
return chain(flowCall(), stepCalls);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `flow().batch("page", () => ({ a: api.async.a(), b: api.async.b() }))`.
|
|
30
|
+
* Uses the `async` namespace + Promise.all-style batch for true parallel HTTP.
|
|
31
|
+
*/
|
|
32
|
+
function batchFlow(ops) {
|
|
33
|
+
const props = ops.map((op) => f.createPropertyAssignment(op.id, apiCallExpr(op, /* asyncNs */ true)));
|
|
34
|
+
const objectExpr = f.createParenthesizedExpression(f.createObjectLiteralExpression(props, true));
|
|
35
|
+
const arrow = f.createArrowFunction(undefined, undefined, [], undefined, f.createToken(ts.SyntaxKind.EqualsGreaterThanToken), objectExpr);
|
|
36
|
+
return chain(flowCall(), [
|
|
37
|
+
f.createCallExpression(f.createIdentifier("batch"), undefined, [
|
|
38
|
+
f.createStringLiteral("fan-out"),
|
|
39
|
+
arrow,
|
|
40
|
+
]),
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
function flowCall() {
|
|
44
|
+
return f.createCallExpression(f.createIdentifier("flow"), undefined, []);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Compose `base.method1(...args1).method2(...args2)` from a base expression and
|
|
48
|
+
* a list of "call segments" (each `<name>(<args>)` becomes one chained method).
|
|
49
|
+
*/
|
|
50
|
+
function chain(base, calls) {
|
|
51
|
+
return calls.reduce((acc, call) => {
|
|
52
|
+
const name = call.expression;
|
|
53
|
+
return f.createCallExpression(f.createPropertyAccessExpression(acc, name), undefined, [...call.arguments]);
|
|
54
|
+
}, base);
|
|
55
|
+
}
|
|
56
|
+
function step(label, body) {
|
|
57
|
+
return f.createCallExpression(f.createIdentifier("step"), undefined, [
|
|
58
|
+
f.createStringLiteral(label),
|
|
59
|
+
body,
|
|
60
|
+
]);
|
|
61
|
+
}
|
|
62
|
+
function arrowFn(stmts) {
|
|
63
|
+
return f.createArrowFunction(undefined, undefined, [], undefined, f.createToken(ts.SyntaxKind.EqualsGreaterThanToken), f.createBlock(stmts, true));
|
|
64
|
+
}
|
|
65
|
+
function apiCallStmt(op, asyncNs) {
|
|
66
|
+
return f.createExpressionStatement(apiCallExpr(op, asyncNs));
|
|
67
|
+
}
|
|
68
|
+
/** `api.foo(arg1, arg2)` or `api.async.foo(arg1, arg2)`. */
|
|
69
|
+
function apiCallExpr(op, asyncNs) {
|
|
70
|
+
const callee = asyncNs
|
|
71
|
+
? f.createPropertyAccessExpression(f.createPropertyAccessExpression(f.createIdentifier("api"), f.createIdentifier("async")), f.createIdentifier(op.id))
|
|
72
|
+
: f.createPropertyAccessExpression(f.createIdentifier("api"), f.createIdentifier(op.id));
|
|
73
|
+
return f.createCallExpression(callee, undefined, placeholderArgs(op));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Emit placeholder positional args matching the generated client's signature:
|
|
77
|
+
* path params (as named identifiers), query (object literal), body (object literal).
|
|
78
|
+
*/
|
|
79
|
+
function placeholderArgs(op) {
|
|
80
|
+
const args = [];
|
|
81
|
+
for (const p of op.pathParams) {
|
|
82
|
+
args.push(f.createIdentifier(/* TODO */ p.name));
|
|
83
|
+
}
|
|
84
|
+
if (op.queryParams.length > 0) {
|
|
85
|
+
args.push(f.createObjectLiteralExpression([], false));
|
|
86
|
+
}
|
|
87
|
+
if (op.body) {
|
|
88
|
+
args.push(f.createObjectLiteralExpression([], false));
|
|
89
|
+
}
|
|
90
|
+
return args;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=chains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/scaffold/chains.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|