@thupham/volley-mcp 1.0.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.
Files changed (61) hide show
  1. package/dist/collections.d.ts +50 -0
  2. package/dist/collections.js +125 -0
  3. package/dist/collections.js.map +1 -0
  4. package/dist/curl.d.ts +14 -0
  5. package/dist/curl.js +90 -0
  6. package/dist/curl.js.map +1 -0
  7. package/dist/format.d.ts +10 -0
  8. package/dist/format.js +70 -0
  9. package/dist/format.js.map +1 -0
  10. package/dist/importers.d.ts +75 -0
  11. package/dist/importers.js +164 -0
  12. package/dist/importers.js.map +1 -0
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.js +40 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/junit.d.ts +5 -0
  17. package/dist/junit.js +30 -0
  18. package/dist/junit.js.map +1 -0
  19. package/dist/native.d.ts +56 -0
  20. package/dist/native.js +44 -0
  21. package/dist/native.js.map +1 -0
  22. package/dist/session.d.ts +52 -0
  23. package/dist/session.js +135 -0
  24. package/dist/session.js.map +1 -0
  25. package/dist/tools/collections.d.ts +3 -0
  26. package/dist/tools/collections.js +50 -0
  27. package/dist/tools/collections.js.map +1 -0
  28. package/dist/tools/env.d.ts +3 -0
  29. package/dist/tools/env.js +33 -0
  30. package/dist/tools/env.js.map +1 -0
  31. package/dist/tools/graphql.d.ts +3 -0
  32. package/dist/tools/graphql.js +44 -0
  33. package/dist/tools/graphql.js.map +1 -0
  34. package/dist/tools/importCurl.d.ts +3 -0
  35. package/dist/tools/importCurl.js +36 -0
  36. package/dist/tools/importCurl.js.map +1 -0
  37. package/dist/tools/importers.d.ts +2 -0
  38. package/dist/tools/importers.js +62 -0
  39. package/dist/tools/importers.js.map +1 -0
  40. package/dist/tools/inspect.d.ts +3 -0
  41. package/dist/tools/inspect.js +102 -0
  42. package/dist/tools/inspect.js.map +1 -0
  43. package/dist/tools/ping.d.ts +6 -0
  44. package/dist/tools/ping.js +29 -0
  45. package/dist/tools/ping.js.map +1 -0
  46. package/dist/tools/policy.d.ts +3 -0
  47. package/dist/tools/policy.js +28 -0
  48. package/dist/tools/policy.js.map +1 -0
  49. package/dist/tools/request.d.ts +3 -0
  50. package/dist/tools/request.js +111 -0
  51. package/dist/tools/request.js.map +1 -0
  52. package/dist/tools/save.d.ts +3 -0
  53. package/dist/tools/save.js +67 -0
  54. package/dist/tools/save.js.map +1 -0
  55. package/dist/tools/stream.d.ts +3 -0
  56. package/dist/tools/stream.js +76 -0
  57. package/dist/tools/stream.js.map +1 -0
  58. package/dist/tools/ws.d.ts +3 -0
  59. package/dist/tools/ws.js +68 -0
  60. package/dist/tools/ws.js.map +1 -0
  61. package/package.json +38 -0
@@ -0,0 +1,50 @@
1
+ import type { Session } from "./session.js";
2
+ export interface Step {
3
+ id?: string;
4
+ type?: "http" | "graphql" | "ws" | "sse";
5
+ request?: Record<string, unknown>;
6
+ assert?: unknown[];
7
+ extract?: Record<string, string>;
8
+ tags?: string[];
9
+ skip?: boolean;
10
+ continueOnError?: boolean;
11
+ }
12
+ export interface Collection {
13
+ name?: string;
14
+ vars?: Record<string, unknown>;
15
+ defaults?: {
16
+ headers?: Record<string, unknown>;
17
+ timeoutMs?: number;
18
+ };
19
+ steps?: Step[];
20
+ }
21
+ export declare function loadCollection(path: string): Collection;
22
+ export declare function listCollectionFiles(dir: string): string[];
23
+ export interface StepReport {
24
+ id: string;
25
+ type: string;
26
+ ok: boolean;
27
+ status?: number | null;
28
+ assertions?: {
29
+ passed: number;
30
+ failed: number;
31
+ skipped: number;
32
+ };
33
+ failures?: string[];
34
+ note?: string | null;
35
+ error?: string | null;
36
+ skipped?: boolean;
37
+ }
38
+ export interface RunReport {
39
+ name: string;
40
+ ok: boolean;
41
+ passed: number;
42
+ failed: number;
43
+ skipped: number;
44
+ steps: StepReport[];
45
+ }
46
+ export declare function runCollection(session: Session, path: string, opts?: {
47
+ env?: string;
48
+ only?: string[];
49
+ tags?: string[];
50
+ }): Promise<RunReport>;
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Declarative collection loading and execution. Collections are YAML/JSON files describing
3
+ * ordered steps with per-step assertions and variable extraction (see docs/collection-format.md).
4
+ */
5
+ import { readFileSync, readdirSync, statSync } from "node:fs";
6
+ import { join, extname, resolve } from "node:path";
7
+ import { parse as parseYaml } from "yaml";
8
+ import { httpRequest, graphqlRequest, wsSession, sseSession } from "./native.js";
9
+ const PLACEHOLDER = /\{\{\s*([^}]+?)\s*\}\}/g;
10
+ function lookup(base, path) {
11
+ return path.split(".").reduce((acc, seg) => {
12
+ if (acc && typeof acc === "object")
13
+ return acc[seg];
14
+ return undefined;
15
+ }, base);
16
+ }
17
+ /** Resolve {{...}} inside collection var values against the current variable base. */
18
+ function resolveColVars(vars, base) {
19
+ const out = {};
20
+ for (const [k, v] of Object.entries(vars)) {
21
+ if (typeof v === "string") {
22
+ out[k] = v.replace(PLACEHOLDER, (_m, expr) => {
23
+ const val = lookup(base, String(expr).trim());
24
+ return val === undefined ? "" : typeof val === "string" ? val : JSON.stringify(val);
25
+ });
26
+ }
27
+ else {
28
+ out[k] = v;
29
+ }
30
+ }
31
+ return out;
32
+ }
33
+ export function loadCollection(path) {
34
+ const text = readFileSync(path, "utf8");
35
+ if (extname(path) === ".json")
36
+ return JSON.parse(text);
37
+ return parseYaml(text);
38
+ }
39
+ export function listCollectionFiles(dir) {
40
+ const root = resolve(dir);
41
+ const out = [];
42
+ const walk = (d, depth) => {
43
+ if (depth > 3)
44
+ return;
45
+ for (const entry of readdirSync(d)) {
46
+ if (entry === "node_modules" || entry.startsWith("."))
47
+ continue;
48
+ const p = join(d, entry);
49
+ const st = statSync(p);
50
+ if (st.isDirectory())
51
+ walk(p, depth + 1);
52
+ else if ([".yaml", ".yml", ".json"].includes(extname(p)))
53
+ out.push(p);
54
+ }
55
+ };
56
+ try {
57
+ walk(root, 0);
58
+ }
59
+ catch {
60
+ /* ignore */
61
+ }
62
+ return out;
63
+ }
64
+ async function execStep(step, vars, defaults) {
65
+ const req = { ...(step.request ?? {}) };
66
+ req.headers = { ...(defaults?.headers ?? {}), ...(req.headers ?? {}) };
67
+ if (defaults?.timeoutMs && req.timeoutMs === undefined)
68
+ req.timeoutMs = defaults.timeoutMs;
69
+ const spec = { ...req, assert: step.assert, extract: step.extract, vars };
70
+ switch (step.type ?? "http") {
71
+ case "graphql":
72
+ return graphqlRequest(spec);
73
+ case "ws":
74
+ return wsSession(spec);
75
+ case "sse":
76
+ return sseSession(spec);
77
+ default:
78
+ return httpRequest(spec);
79
+ }
80
+ }
81
+ export async function runCollection(session, path, opts = {}) {
82
+ const col = loadCollection(path);
83
+ const steps = col.steps ?? [];
84
+ const report = { name: col.name ?? path, ok: true, passed: 0, failed: 0, skipped: 0, steps: [] };
85
+ for (let i = 0; i < steps.length; i++) {
86
+ const step = steps[i];
87
+ const id = step.id ?? `step-${i + 1}`;
88
+ const selected = (!opts.only || opts.only.includes(id)) &&
89
+ (!opts.tags || (step.tags ?? []).some((t) => opts.tags.includes(t)));
90
+ if (step.skip || !selected) {
91
+ report.skipped++;
92
+ report.steps.push({ id, type: step.type ?? "http", ok: true, skipped: true });
93
+ continue;
94
+ }
95
+ const base = session.mergedVars(opts.env);
96
+ const colVars = resolveColVars(col.vars ?? {}, base);
97
+ const vars = { ...colVars, ...base };
98
+ const result = await execStep(step, vars, col.defaults);
99
+ session.applyExtracted(result.extracted);
100
+ const failures = (result.assertions?.results ?? []).filter((r) => !r.ok && !r.skipped).map((r) => `${r.desc}: ${r.detail ?? ""}`);
101
+ const ok = !result.error && (result.ok ?? false);
102
+ report.steps.push({
103
+ id,
104
+ type: step.type ?? "http",
105
+ ok,
106
+ status: result.status,
107
+ assertions: result.assertions
108
+ ? { passed: result.assertions.passed, failed: result.assertions.failed, skipped: result.assertions.skipped }
109
+ : undefined,
110
+ failures: failures.length ? failures : undefined,
111
+ note: result.note,
112
+ error: result.error,
113
+ });
114
+ if (ok)
115
+ report.passed++;
116
+ else {
117
+ report.failed++;
118
+ report.ok = false;
119
+ if (!step.continueOnError)
120
+ break;
121
+ }
122
+ }
123
+ return report;
124
+ }
125
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
package/dist/curl.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /** Minimal `curl` command parser -> structured http_request spec. */
2
+ export interface ParsedCurl {
3
+ method: string;
4
+ url: string;
5
+ headers: Record<string, string>;
6
+ body?: unknown;
7
+ bodyType?: "json" | "text";
8
+ auth?: {
9
+ type: "basic";
10
+ username: string;
11
+ password?: string;
12
+ };
13
+ }
14
+ export declare function parseCurl(command: string): ParsedCurl;
package/dist/curl.js ADDED
@@ -0,0 +1,90 @@
1
+ /** Minimal `curl` command parser -> structured http_request spec. */
2
+ /** Tokenize a shell-ish command respecting single/double quotes and line continuations. */
3
+ function tokenize(input) {
4
+ const cleaned = input.replace(/\\\r?\n/g, " ");
5
+ const tokens = [];
6
+ let cur = "";
7
+ let quote = null;
8
+ for (let i = 0; i < cleaned.length; i++) {
9
+ const c = cleaned[i];
10
+ if (quote) {
11
+ if (c === quote)
12
+ quote = null;
13
+ else
14
+ cur += c;
15
+ }
16
+ else if (c === '"' || c === "'") {
17
+ quote = c;
18
+ }
19
+ else if (/\s/.test(c)) {
20
+ if (cur)
21
+ tokens.push(cur), (cur = "");
22
+ }
23
+ else {
24
+ cur += c;
25
+ }
26
+ }
27
+ if (cur)
28
+ tokens.push(cur);
29
+ return tokens;
30
+ }
31
+ export function parseCurl(command) {
32
+ const tokens = tokenize(command.trim());
33
+ const out = { method: "", url: "", headers: {} };
34
+ const dataParts = [];
35
+ for (let i = 0; i < tokens.length; i++) {
36
+ const t = tokens[i];
37
+ const next = () => tokens[++i];
38
+ if (t === "curl")
39
+ continue;
40
+ if (t === "-X" || t === "--request")
41
+ out.method = next().toUpperCase();
42
+ else if (t === "-H" || t === "--header") {
43
+ const h = next();
44
+ const idx = h.indexOf(":");
45
+ if (idx > 0)
46
+ out.headers[h.slice(0, idx).trim()] = h.slice(idx + 1).trim();
47
+ }
48
+ else if (t === "-d" || t === "--data" || t === "--data-raw" || t === "--data-binary" || t === "--data-ascii") {
49
+ dataParts.push(next());
50
+ }
51
+ else if (t === "-u" || t === "--user") {
52
+ const [username, password] = next().split(":");
53
+ out.auth = { type: "basic", username, password };
54
+ }
55
+ else if (t === "--url") {
56
+ out.url = next();
57
+ }
58
+ else if (t === "--compressed" || t === "-L" || t === "--location" || t === "-s" || t === "--silent" || t === "-k" || t === "--insecure") {
59
+ /* flags without values, ignore */
60
+ }
61
+ else if (t.startsWith("-")) {
62
+ // Unknown flag; skip a following value if it isn't another flag or the URL.
63
+ if (tokens[i + 1] && !tokens[i + 1].startsWith("-") && !/^https?:\/\//.test(tokens[i + 1]))
64
+ i++;
65
+ }
66
+ else if (!out.url && /^https?:\/\//.test(t)) {
67
+ out.url = t;
68
+ }
69
+ else if (!out.url) {
70
+ out.url = t;
71
+ }
72
+ }
73
+ if (dataParts.length) {
74
+ const raw = dataParts.join("&");
75
+ try {
76
+ out.body = JSON.parse(raw);
77
+ out.bodyType = "json";
78
+ }
79
+ catch {
80
+ out.body = raw;
81
+ out.bodyType = "text";
82
+ }
83
+ if (!out.method)
84
+ out.method = "POST";
85
+ }
86
+ if (!out.method)
87
+ out.method = "GET";
88
+ return out;
89
+ }
90
+ //# sourceMappingURL=curl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curl.js","sourceRoot":"","sources":["../src/curl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shapes an ExecResult into a token-efficient object for the model, honoring `verbosity`.
3
+ * Full bodies live in the response store; only summaries/handles are surfaced by default.
4
+ * Arrays (frames, events) are capped to prevent token blow-up.
5
+ */
6
+ import type { ExecResult } from "./native.js";
7
+ import type { Verbosity } from "./session.js";
8
+ export declare function formatHttp(result: ExecResult, verbosity: Verbosity, handle: string): Record<string, unknown>;
9
+ export declare function formatWs(result: ExecResult, verbosity: Verbosity, handle: string): Record<string, unknown>;
10
+ export declare function formatSse(result: ExecResult, verbosity: Verbosity, handle: string): Record<string, unknown>;
package/dist/format.js ADDED
@@ -0,0 +1,70 @@
1
+ const MAX_FRAMES_PREVIEW = 10;
2
+ const MAX_EVENTS_PREVIEW = 10;
3
+ function capArray(arr, max) {
4
+ if (!arr || arr.length <= max)
5
+ return arr;
6
+ return [...arr.slice(0, max), `…(+${arr.length - max} more, use inspect_response)`];
7
+ }
8
+ function assertionSummary(a, verbosity) {
9
+ if (!a)
10
+ return undefined;
11
+ const failed = a.results.filter((r) => !r.ok && !r.skipped);
12
+ return {
13
+ passed: a.passed,
14
+ failed: a.failed,
15
+ skipped: a.skipped,
16
+ // Always surface failures; surface all results only when full.
17
+ results: verbosity === "full" ? a.results : failed,
18
+ };
19
+ }
20
+ export function formatHttp(result, verbosity, handle) {
21
+ if (result.error)
22
+ return { ok: false, error: result.error };
23
+ const out = {
24
+ ok: result.ok,
25
+ status: result.status,
26
+ statusText: result.statusText,
27
+ timeMs: result.timeMs,
28
+ assertions: assertionSummary(result.assertions, verbosity),
29
+ extracted: result.extracted && Object.keys(result.extracted).length ? result.extracted : undefined,
30
+ bodyShape: result.bodyShape,
31
+ bodyBytes: result.bodyBytes,
32
+ responseHandle: handle,
33
+ hint: "Use inspect_response with this handle + a jsonpath to read more of the body.",
34
+ };
35
+ if (result.graphqlErrors)
36
+ out.graphqlErrors = result.graphqlErrors;
37
+ if (verbosity === "headers" || verbosity === "full")
38
+ out.headers = result.headers;
39
+ if (verbosity === "full")
40
+ out.body = result.bodyJson ?? result.bodyText ?? result.bodyPreview;
41
+ return out;
42
+ }
43
+ export function formatWs(result, verbosity, handle) {
44
+ if (result.error)
45
+ return { ok: false, connected: false, error: result.error };
46
+ return {
47
+ ok: result.ok,
48
+ connected: result.connected,
49
+ frameCount: result.frameCount,
50
+ assertions: assertionSummary(result.assertions, verbosity),
51
+ note: result.note,
52
+ responseHandle: handle,
53
+ frames: verbosity === "full" ? capArray(result.frames, MAX_FRAMES_PREVIEW) : result.framesPreview,
54
+ };
55
+ }
56
+ export function formatSse(result, verbosity, handle) {
57
+ if (result.error)
58
+ return { ok: false, connected: false, error: result.error };
59
+ return {
60
+ ok: result.ok,
61
+ connected: result.connected,
62
+ status: result.status,
63
+ eventCount: result.eventCount,
64
+ assertions: assertionSummary(result.assertions, verbosity),
65
+ note: result.note,
66
+ responseHandle: handle,
67
+ events: verbosity === "full" ? capArray(result.events, MAX_EVENTS_PREVIEW) : result.eventsPreview,
68
+ };
69
+ }
70
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import type { Collection } from "./collections.js";
2
+ interface OpenApiPathItem {
3
+ summary?: string;
4
+ operationId?: string;
5
+ tags?: string[];
6
+ parameters?: {
7
+ name: string;
8
+ in: string;
9
+ required?: boolean;
10
+ schema?: Record<string, unknown>;
11
+ }[];
12
+ requestBody?: {
13
+ content?: Record<string, {
14
+ schema?: Record<string, unknown>;
15
+ example?: unknown;
16
+ }>;
17
+ };
18
+ responses?: Record<string, unknown>;
19
+ }
20
+ type OpenApiPaths = Record<string, Record<string, OpenApiPathItem>>;
21
+ interface OpenApiDoc {
22
+ openapi?: string;
23
+ swagger?: string;
24
+ info?: {
25
+ title?: string;
26
+ version?: string;
27
+ };
28
+ servers?: {
29
+ url: string;
30
+ }[];
31
+ host?: string;
32
+ basePath?: string;
33
+ paths?: OpenApiPaths;
34
+ components?: {
35
+ securitySchemes?: Record<string, unknown>;
36
+ };
37
+ }
38
+ /** Convert an OpenAPI/Swagger document (parsed) into a Volley Collection. */
39
+ export declare function openApiToCollection(doc: OpenApiDoc, opts?: {
40
+ includeTags?: string[];
41
+ maxSteps?: number;
42
+ }): Collection;
43
+ export declare function loadOpenApi(path: string): OpenApiDoc;
44
+ interface HarEntry {
45
+ request: {
46
+ method: string;
47
+ url: string;
48
+ headers?: {
49
+ name: string;
50
+ value: string;
51
+ }[];
52
+ queryString?: {
53
+ name: string;
54
+ value: string;
55
+ }[];
56
+ postData?: {
57
+ mimeType: string;
58
+ text?: string;
59
+ };
60
+ };
61
+ response?: {
62
+ status: number;
63
+ };
64
+ }
65
+ interface HarDoc {
66
+ log?: {
67
+ entries?: HarEntry[];
68
+ };
69
+ }
70
+ export declare function harToCollection(har: HarDoc, opts?: {
71
+ maxSteps?: number;
72
+ filter?: (e: HarEntry) => boolean;
73
+ }): Collection;
74
+ export declare function loadHar(path: string): HarDoc;
75
+ export {};
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Importers that convert OpenAPI/Swagger and HAR documents into Volley collection files.
3
+ * The output is a Collection object (see collections.ts) that can be serialized to YAML/JSON
4
+ * and run with `run_collection`.
5
+ */
6
+ import { readFileSync } from "node:fs";
7
+ import { extname } from "node:path";
8
+ import { parse as parseYaml } from "yaml";
9
+ function exampleForSchema(schema) {
10
+ if (!schema)
11
+ return undefined;
12
+ if (schema.example !== undefined)
13
+ return schema.example;
14
+ if (schema.default !== undefined)
15
+ return schema.default;
16
+ const type = schema.type;
17
+ if (type === "object" && schema.properties) {
18
+ const obj = {};
19
+ for (const [k, v] of Object.entries(schema.properties)) {
20
+ const ex = exampleForSchema(v);
21
+ if (ex !== undefined)
22
+ obj[k] = ex;
23
+ }
24
+ return obj;
25
+ }
26
+ if (type === "array" && schema.items) {
27
+ const ex = exampleForSchema(schema.items);
28
+ return ex !== undefined ? [ex] : [];
29
+ }
30
+ if (type === "string")
31
+ return "";
32
+ if (type === "integer" || type === "number")
33
+ return 0;
34
+ if (type === "boolean")
35
+ return false;
36
+ return undefined;
37
+ }
38
+ function joinUrl(base, path) {
39
+ if (!base)
40
+ return path;
41
+ if (base.endsWith("/") && path.startsWith("/"))
42
+ return base + path.slice(1);
43
+ if (!base.endsWith("/") && !path.startsWith("/"))
44
+ return `${base}/${path}`;
45
+ return base + path;
46
+ }
47
+ function buildBase(doc) {
48
+ if (doc.servers && doc.servers.length)
49
+ return doc.servers[0].url;
50
+ if (doc.host)
51
+ return `https://${doc.host}${doc.basePath ?? ""}`;
52
+ return "";
53
+ }
54
+ /** Convert an OpenAPI/Swagger document (parsed) into a Volley Collection. */
55
+ export function openApiToCollection(doc, opts = {}) {
56
+ const base = buildBase(doc);
57
+ const steps = [];
58
+ const paths = doc.paths ?? {};
59
+ const max = opts.maxSteps ?? 200;
60
+ for (const [path, methods] of Object.entries(paths)) {
61
+ for (const [method, op] of Object.entries(methods)) {
62
+ if (!["get", "post", "put", "patch", "delete", "head", "options"].includes(method))
63
+ continue;
64
+ if (opts.includeTags && opts.includeTags.length && !(op.tags ?? []).some((t) => opts.includeTags.includes(t)))
65
+ continue;
66
+ if (steps.length >= max)
67
+ break;
68
+ const url = joinUrl(base, path);
69
+ const request = { method: method.toUpperCase(), url };
70
+ // Query parameters.
71
+ const query = {};
72
+ for (const p of op.parameters ?? []) {
73
+ if (p.in === "query")
74
+ query[p.name] = exampleForSchema(p.schema);
75
+ else if (p.in === "header" && p.required) {
76
+ request.headers = { ...request.headers, [p.name]: `{{${p.name}}}` };
77
+ }
78
+ }
79
+ if (Object.keys(query).length)
80
+ request.query = query;
81
+ // Request body.
82
+ const jsonBody = op.requestBody?.content?.["application/json"];
83
+ if (jsonBody) {
84
+ const body = jsonBody.example ?? exampleForSchema(jsonBody.schema);
85
+ if (body !== undefined)
86
+ request.body = body;
87
+ }
88
+ const id = op.operationId ?? `${method}_${path.replace(/[^a-zA-Z0-9]+/g, "_").replace(/^_|_$/g, "")}`;
89
+ steps.push({
90
+ id,
91
+ type: "http",
92
+ request,
93
+ tags: op.tags,
94
+ // Light default assertion: expect a 2xx.
95
+ assert: [{ status: { gte: 200, lt: 300 } }],
96
+ });
97
+ }
98
+ }
99
+ return { name: doc.info?.title ?? "imported-openapi", steps };
100
+ }
101
+ export function loadOpenApi(path) {
102
+ const text = readFileSync(path, "utf8");
103
+ if (extname(path) === ".json")
104
+ return JSON.parse(text);
105
+ return parseYaml(text);
106
+ }
107
+ export function harToCollection(har, opts = {}) {
108
+ const entries = har.log?.entries ?? [];
109
+ const max = opts.maxSteps ?? 200;
110
+ const steps = [];
111
+ for (let i = 0; i < entries.length && steps.length < max; i++) {
112
+ const e = entries[i];
113
+ if (opts.filter && !opts.filter(e))
114
+ continue;
115
+ const req = e.request;
116
+ let parsedUrl = req.url;
117
+ try {
118
+ const u = new URL(req.url);
119
+ // Reconstruct without query string; we'll move it to `query`.
120
+ parsedUrl = `${u.origin}${u.pathname}`;
121
+ }
122
+ catch {
123
+ /* keep raw */
124
+ }
125
+ const request = { method: (req.method || "GET").toUpperCase(), url: parsedUrl };
126
+ if (req.queryString && req.queryString.length) {
127
+ const q = {};
128
+ for (const item of req.queryString)
129
+ q[item.name] = item.value;
130
+ request.query = q;
131
+ }
132
+ if (req.headers && req.headers.length) {
133
+ const h = {};
134
+ for (const item of req.headers) {
135
+ const lower = item.name.toLowerCase();
136
+ if (lower === "content-type" || lower === "content-length")
137
+ continue;
138
+ h[item.name] = item.value;
139
+ }
140
+ if (Object.keys(h).length)
141
+ request.headers = h;
142
+ }
143
+ if (req.postData?.text) {
144
+ try {
145
+ request.body = JSON.parse(req.postData.text);
146
+ }
147
+ catch {
148
+ request.body = req.postData.text;
149
+ request.bodyType = "text";
150
+ }
151
+ }
152
+ steps.push({
153
+ id: `har-${i + 1}`,
154
+ type: "http",
155
+ request,
156
+ assert: [{ status: { gte: 200, lt: 300 } }],
157
+ });
158
+ }
159
+ return { name: "imported-har", steps };
160
+ }
161
+ export function loadHar(path) {
162
+ return JSON.parse(readFileSync(path, "utf8"));
163
+ }
164
+ //# sourceMappingURL=importers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importers.js","sourceRoot":"","sources":["../src/importers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};