callman-core 1.26.0 → 1.28.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/ai-packs/db-queries.md +10 -1
- package/ai-packs/diagram-components.md +373 -0
- package/dist/curl/bodyFormat.d.ts +4 -0
- package/dist/curl/bodyFormat.d.ts.map +1 -0
- package/dist/curl/bodyFormat.js +80 -0
- package/dist/curl/bodyFormat.js.map +1 -0
- package/dist/curl/index.d.ts +5 -0
- package/dist/curl/index.d.ts.map +1 -0
- package/dist/curl/index.js +4 -0
- package/dist/curl/index.js.map +1 -0
- package/dist/curl/parseCurl.d.ts +4 -0
- package/dist/curl/parseCurl.d.ts.map +1 -0
- package/dist/curl/parseCurl.js +288 -0
- package/dist/curl/parseCurl.js.map +1 -0
- package/dist/curl/rows.d.ts +6 -0
- package/dist/curl/rows.d.ts.map +1 -0
- package/dist/curl/rows.js +23 -0
- package/dist/curl/rows.js.map +1 -0
- package/dist/curl/types.d.ts +21 -0
- package/dist/curl/types.d.ts.map +1 -0
- package/dist/curl/types.js +6 -0
- package/dist/curl/types.js.map +1 -0
- package/dist/diagram/componentCatalog.d.ts +31 -0
- package/dist/diagram/componentCatalog.d.ts.map +1 -0
- package/dist/diagram/componentCatalog.data.d.ts +3 -0
- package/dist/diagram/componentCatalog.data.d.ts.map +1 -0
- package/dist/diagram/componentCatalog.data.js +287 -0
- package/dist/diagram/componentCatalog.data.js.map +1 -0
- package/dist/diagram/componentCatalog.js +71 -0
- package/dist/diagram/componentCatalog.js.map +1 -0
- package/dist/diagram/edgeSemantics.d.ts +28 -0
- package/dist/diagram/edgeSemantics.d.ts.map +1 -0
- package/dist/diagram/edgeSemantics.js +78 -0
- package/dist/diagram/edgeSemantics.js.map +1 -0
- package/dist/diagram/elkGraph.d.ts +80 -0
- package/dist/diagram/elkGraph.d.ts.map +1 -0
- package/dist/diagram/elkGraph.js +283 -0
- package/dist/diagram/elkGraph.js.map +1 -0
- package/dist/diagram/index.d.ts +7 -0
- package/dist/diagram/index.d.ts.map +1 -0
- package/dist/diagram/index.js +13 -0
- package/dist/diagram/index.js.map +1 -0
- package/dist/diagram/migrations.d.ts +3 -0
- package/dist/diagram/migrations.d.ts.map +1 -0
- package/dist/diagram/migrations.js +33 -0
- package/dist/diagram/migrations.js.map +1 -0
- package/dist/diagram/normalize.d.ts +4 -0
- package/dist/diagram/normalize.d.ts.map +1 -0
- package/dist/diagram/normalize.js +68 -0
- package/dist/diagram/normalize.js.map +1 -0
- package/dist/diagram/schema.d.ts +116 -0
- package/dist/diagram/schema.d.ts.map +1 -0
- package/dist/diagram/schema.js +135 -0
- package/dist/diagram/schema.js.map +1 -0
- package/dist/http-file/detect.d.ts +12 -0
- package/dist/http-file/detect.d.ts.map +1 -0
- package/dist/http-file/detect.js +108 -0
- package/dist/http-file/detect.js.map +1 -0
- package/dist/http-file/flatImport.d.ts +32 -0
- package/dist/http-file/flatImport.d.ts.map +1 -0
- package/dist/http-file/flatImport.js +102 -0
- package/dist/http-file/flatImport.js.map +1 -0
- package/dist/http-file/index.d.ts +4 -0
- package/dist/http-file/index.d.ts.map +1 -0
- package/dist/http-file/index.js +7 -0
- package/dist/http-file/index.js.map +1 -0
- package/dist/http-file/parseHttpFile.d.ts +12 -0
- package/dist/http-file/parseHttpFile.d.ts.map +1 -0
- package/dist/http-file/parseHttpFile.js +122 -0
- package/dist/http-file/parseHttpFile.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/scenario-runner/adapters/request-executor.d.ts.map +1 -1
- package/dist/scenario-runner/adapters/request-executor.js +41 -0
- package/dist/scenario-runner/adapters/request-executor.js.map +1 -1
- package/dist/scenario-runner/runScenario.d.ts.map +1 -1
- package/dist/scenario-runner/runScenario.js +112 -0
- package/dist/scenario-runner/runScenario.js.map +1 -1
- package/dist/scenario-runner/types.d.ts +17 -0
- package/dist/scenario-runner/types.d.ts.map +1 -1
- package/dist-cjs/curl/bodyFormat.js +85 -0
- package/dist-cjs/curl/bodyFormat.js.map +1 -0
- package/dist-cjs/curl/index.js +15 -0
- package/dist-cjs/curl/index.js.map +1 -0
- package/dist-cjs/curl/parseCurl.js +293 -0
- package/dist-cjs/curl/parseCurl.js.map +1 -0
- package/dist-cjs/curl/rows.js +30 -0
- package/dist-cjs/curl/rows.js.map +1 -0
- package/dist-cjs/curl/types.js +7 -0
- package/dist-cjs/curl/types.js.map +1 -0
- package/dist-cjs/diagram/componentCatalog.data.js +290 -0
- package/dist-cjs/diagram/componentCatalog.data.js.map +1 -0
- package/dist-cjs/diagram/componentCatalog.js +79 -0
- package/dist-cjs/diagram/componentCatalog.js.map +1 -0
- package/dist-cjs/diagram/edgeSemantics.js +86 -0
- package/dist-cjs/diagram/edgeSemantics.js.map +1 -0
- package/dist-cjs/diagram/elkGraph.js +293 -0
- package/dist-cjs/diagram/elkGraph.js.map +1 -0
- package/dist-cjs/diagram/index.js +33 -0
- package/dist-cjs/diagram/index.js.map +1 -0
- package/dist-cjs/diagram/migrations.js +37 -0
- package/dist-cjs/diagram/migrations.js.map +1 -0
- package/dist-cjs/diagram/normalize.js +73 -0
- package/dist-cjs/diagram/normalize.js.map +1 -0
- package/dist-cjs/diagram/schema.js +144 -0
- package/dist-cjs/diagram/schema.js.map +1 -0
- package/dist-cjs/http-file/detect.js +113 -0
- package/dist-cjs/http-file/detect.js.map +1 -0
- package/dist-cjs/http-file/flatImport.js +109 -0
- package/dist-cjs/http-file/flatImport.js.map +1 -0
- package/dist-cjs/http-file/index.js +20 -0
- package/dist-cjs/http-file/index.js.map +1 -0
- package/dist-cjs/http-file/parseHttpFile.js +127 -0
- package/dist-cjs/http-file/parseHttpFile.js.map +1 -0
- package/dist-cjs/index.js +5 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/scenario-runner/adapters/request-executor.js +41 -0
- package/dist-cjs/scenario-runner/adapters/request-executor.js.map +1 -1
- package/dist-cjs/scenario-runner/runScenario.js +112 -0
- package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// The diagram DSL — the single source of truth for a diagram. A plain,
|
|
3
|
+
// versioned, git-diffable JSON model that is independent of any renderer
|
|
4
|
+
// (maxGraph in the desktop is just an editor of this document). AI generation,
|
|
5
|
+
// the MCP server and DB persistence produce/consume exactly this shape.
|
|
6
|
+
//
|
|
7
|
+
// Moved here from the desktop so every host validates with ONE validator.
|
|
8
|
+
// zod is intentionally NOT used: the hand validator keeps the module
|
|
9
|
+
// dependency-free and CSP-safe (it runs in the Electron renderer).
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.parseDiagramDocument = exports.safeParseDiagramDocument = exports.DiagramValidationError = exports.createEmptyDocument = exports.genId = exports.nowIso = exports.SCHEMA_VERSION = void 0;
|
|
12
|
+
exports.SCHEMA_VERSION = 1;
|
|
13
|
+
// --- id + time helpers -----------------------------------------------------
|
|
14
|
+
const nowIso = () => new Date().toISOString();
|
|
15
|
+
exports.nowIso = nowIso;
|
|
16
|
+
const randomBytes = (length) => {
|
|
17
|
+
const bytes = new Uint8Array(length);
|
|
18
|
+
const webCrypto = globalThis
|
|
19
|
+
.crypto;
|
|
20
|
+
if (webCrypto && typeof webCrypto.getRandomValues === "function") {
|
|
21
|
+
webCrypto.getRandomValues(bytes);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Node 18 without a global `crypto` — ids only need to be unique, not secret.
|
|
25
|
+
for (let index = 0; index < length; index += 1) {
|
|
26
|
+
bytes[index] = Math.floor(Math.random() * 256);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return bytes;
|
|
30
|
+
};
|
|
31
|
+
const genId = (prefix = "id") => {
|
|
32
|
+
const bytes = randomBytes(6);
|
|
33
|
+
let s = "";
|
|
34
|
+
for (const b of bytes)
|
|
35
|
+
s += b.toString(36).padStart(2, "0");
|
|
36
|
+
return `${prefix}_${s.slice(0, 8)}`;
|
|
37
|
+
};
|
|
38
|
+
exports.genId = genId;
|
|
39
|
+
// --- factories -------------------------------------------------------------
|
|
40
|
+
const createEmptyDocument = (title = "Untitled diagram") => {
|
|
41
|
+
const ts = (0, exports.nowIso)();
|
|
42
|
+
return {
|
|
43
|
+
schemaVersion: exports.SCHEMA_VERSION,
|
|
44
|
+
id: (0, exports.genId)("doc"),
|
|
45
|
+
meta: { title, createdAt: ts, updatedAt: ts },
|
|
46
|
+
canvas: { background: "dots", gridSize: 16 },
|
|
47
|
+
nodes: [],
|
|
48
|
+
edges: [],
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
exports.createEmptyDocument = createEmptyDocument;
|
|
52
|
+
// --- validation ------------------------------------------------------------
|
|
53
|
+
class DiagramValidationError extends Error {
|
|
54
|
+
errors;
|
|
55
|
+
constructor(errors) {
|
|
56
|
+
super(`Invalid DiagramDocument:\n- ${errors.join("\n- ")}`);
|
|
57
|
+
this.name = "DiagramValidationError";
|
|
58
|
+
this.errors = errors;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.DiagramValidationError = DiagramValidationError;
|
|
62
|
+
const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
63
|
+
const isNum = (v) => typeof v === "number" && Number.isFinite(v);
|
|
64
|
+
const isStr = (v) => typeof v === "string";
|
|
65
|
+
const validateNode = (n, i, errors) => {
|
|
66
|
+
if (!isObject(n))
|
|
67
|
+
return void errors.push(`nodes[${i}] is not an object`);
|
|
68
|
+
if (!isStr(n.id))
|
|
69
|
+
errors.push(`nodes[${i}].id must be a string`);
|
|
70
|
+
if (!isStr(n.type))
|
|
71
|
+
errors.push(`nodes[${i}].type must be a string`);
|
|
72
|
+
if (!isObject(n.position) || !isNum(n.position.x) || !isNum(n.position.y))
|
|
73
|
+
errors.push(`nodes[${i}].position must be { x:number, y:number }`);
|
|
74
|
+
if (!isObject(n.size) || !isNum(n.size.width) || !isNum(n.size.height))
|
|
75
|
+
errors.push(`nodes[${i}].size must be { width:number, height:number }`);
|
|
76
|
+
};
|
|
77
|
+
const isPoint = (v) => isObject(v) && isNum(v.x) && isNum(v.y);
|
|
78
|
+
const validateEdge = (e, i, ids, errors) => {
|
|
79
|
+
if (!isObject(e))
|
|
80
|
+
return void errors.push(`edges[${i}] is not an object`);
|
|
81
|
+
if (!isStr(e.id))
|
|
82
|
+
errors.push(`edges[${i}].id must be a string`);
|
|
83
|
+
// Each endpoint is EITHER a cell id (node OR another edge) OR a free point
|
|
84
|
+
// (a standalone "Line" component). At least one of the two must be present.
|
|
85
|
+
if (e.source !== undefined) {
|
|
86
|
+
if (!isStr(e.source))
|
|
87
|
+
errors.push(`edges[${i}].source must be a string`);
|
|
88
|
+
else if (!ids.has(e.source))
|
|
89
|
+
errors.push(`edges[${i}].source "${e.source}" has no matching node/edge`);
|
|
90
|
+
}
|
|
91
|
+
else if (!isPoint(e.sourcePoint)) {
|
|
92
|
+
errors.push(`edges[${i}] needs a source id or a sourcePoint { x, y }`);
|
|
93
|
+
}
|
|
94
|
+
if (e.target !== undefined) {
|
|
95
|
+
if (!isStr(e.target))
|
|
96
|
+
errors.push(`edges[${i}].target must be a string`);
|
|
97
|
+
else if (!ids.has(e.target))
|
|
98
|
+
errors.push(`edges[${i}].target "${e.target}" has no matching node/edge`);
|
|
99
|
+
}
|
|
100
|
+
else if (!isPoint(e.targetPoint)) {
|
|
101
|
+
errors.push(`edges[${i}] needs a target id or a targetPoint { x, y }`);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const safeParseDiagramDocument = (input) => {
|
|
105
|
+
const errors = [];
|
|
106
|
+
if (!isObject(input))
|
|
107
|
+
return { ok: false, errors: ["document is not an object"] };
|
|
108
|
+
if (!isNum(input.schemaVersion))
|
|
109
|
+
errors.push("schemaVersion must be a number");
|
|
110
|
+
if (!isStr(input.id))
|
|
111
|
+
errors.push("id must be a string");
|
|
112
|
+
if (!isObject(input.meta) || !isStr(input.meta.title))
|
|
113
|
+
errors.push("meta.title must be a string");
|
|
114
|
+
if (!Array.isArray(input.nodes))
|
|
115
|
+
errors.push("nodes must be an array");
|
|
116
|
+
if (!Array.isArray(input.edges))
|
|
117
|
+
errors.push("edges must be an array");
|
|
118
|
+
if (errors.length)
|
|
119
|
+
return { ok: false, errors };
|
|
120
|
+
const nodes = input.nodes;
|
|
121
|
+
const edges = input.edges;
|
|
122
|
+
nodes.forEach((n, i) => validateNode(n, i, errors));
|
|
123
|
+
// Valid edge terminals = node ids + edge ids (edges may connect to edges).
|
|
124
|
+
const terminalIds = new Set();
|
|
125
|
+
for (const n of nodes)
|
|
126
|
+
if (isObject(n) && isStr(n.id))
|
|
127
|
+
terminalIds.add(n.id);
|
|
128
|
+
for (const e of edges)
|
|
129
|
+
if (isObject(e) && isStr(e.id))
|
|
130
|
+
terminalIds.add(e.id);
|
|
131
|
+
edges.forEach((e, i) => validateEdge(e, i, terminalIds, errors));
|
|
132
|
+
if (errors.length)
|
|
133
|
+
return { ok: false, errors };
|
|
134
|
+
return { ok: true, document: input };
|
|
135
|
+
};
|
|
136
|
+
exports.safeParseDiagramDocument = safeParseDiagramDocument;
|
|
137
|
+
const parseDiagramDocument = (input) => {
|
|
138
|
+
const result = (0, exports.safeParseDiagramDocument)(input);
|
|
139
|
+
if (!result.ok)
|
|
140
|
+
throw new DiagramValidationError(result.errors);
|
|
141
|
+
return result.document;
|
|
142
|
+
};
|
|
143
|
+
exports.parseDiagramDocument = parseDiagramDocument;
|
|
144
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/diagram/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectImportFormat = exports.importFormatLabel = exports.IMPORT_FORMAT_LABELS = void 0;
|
|
4
|
+
// "Which tool did this file come from?" — the single detector every import
|
|
5
|
+
// entry point (desktop drop zones, MCP `import_content`) routes through, so the
|
|
6
|
+
// format is auto-detected once and the user never has to pick a tool.
|
|
7
|
+
// YAML is only needed for OpenAPI / Insomnia v5; core has no YAML dependency,
|
|
8
|
+
// so the caller injects a loader (js-yaml's `load`) when it has one.
|
|
9
|
+
const parseCurl_js_1 = require("../curl/parseCurl.js");
|
|
10
|
+
// Product-facing tool names ("<label> import started — <file>").
|
|
11
|
+
exports.IMPORT_FORMAT_LABELS = {
|
|
12
|
+
postman: "Postman",
|
|
13
|
+
internal: "Callman",
|
|
14
|
+
scenario: "Callman scenario",
|
|
15
|
+
openapi: "OpenAPI",
|
|
16
|
+
insomnia: "Insomnia",
|
|
17
|
+
bruno: "Bruno",
|
|
18
|
+
curl: "cURL",
|
|
19
|
+
http: "HTTP file",
|
|
20
|
+
environment: "Environment",
|
|
21
|
+
unknown: "Unknown",
|
|
22
|
+
};
|
|
23
|
+
const importFormatLabel = (format) => exports.IMPORT_FORMAT_LABELS[format];
|
|
24
|
+
exports.importFormatLabel = importFormatLabel;
|
|
25
|
+
const extensionOf = (fileName) => {
|
|
26
|
+
const lower = fileName.toLowerCase();
|
|
27
|
+
const dot = lower.lastIndexOf(".");
|
|
28
|
+
return dot === -1 ? "" : lower.slice(dot);
|
|
29
|
+
};
|
|
30
|
+
const asObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value)
|
|
31
|
+
? value
|
|
32
|
+
: null;
|
|
33
|
+
const tryJson = (text) => {
|
|
34
|
+
try {
|
|
35
|
+
return asObject(JSON.parse(text));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
// JSON is valid YAML, but JSON is tried first (cheaper, and avoids YAML
|
|
42
|
+
// coercing numbers/dates).
|
|
43
|
+
const tryYaml = (text, parseYaml) => {
|
|
44
|
+
if (!parseYaml)
|
|
45
|
+
return null;
|
|
46
|
+
try {
|
|
47
|
+
return asObject(parseYaml(text));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
// A cURL script (.sh/.txt) often opens with a shebang, comments and shell
|
|
54
|
+
// variable assignments before the first `curl`, so every line is scanned.
|
|
55
|
+
const hasCurlLine = (text) => text.split(/\r?\n/).some((line) => (0, parseCurl_js_1.isCurlCommand)(line));
|
|
56
|
+
const HTTP_REQUEST_LINE = /(^|\n)\s*(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE|CONNECT)\s+\S+/i;
|
|
57
|
+
const detect = (fileName, text, options) => {
|
|
58
|
+
const ext = extensionOf(fileName);
|
|
59
|
+
// 1. Unambiguous extensions — content-sniffing these is unreliable
|
|
60
|
+
// (.bru is a custom grammar; .http/.rest have no JSON/YAML shape).
|
|
61
|
+
if (ext === ".bru")
|
|
62
|
+
return "bruno";
|
|
63
|
+
if (ext === ".http" || ext === ".rest")
|
|
64
|
+
return "http";
|
|
65
|
+
// 2. Structured (JSON or YAML) formats. First match wins; order chosen so
|
|
66
|
+
// the shapes can't collide (internal is checked before Postman because
|
|
67
|
+
// both mention a "collection"; Postman uses `item`, Bruno uses `items`).
|
|
68
|
+
const doc = tryJson(text) ?? tryYaml(text, options.parseYaml);
|
|
69
|
+
if (doc) {
|
|
70
|
+
if (doc.kind === "callman.scenario")
|
|
71
|
+
return "scenario";
|
|
72
|
+
if ("collection" in doc && "requests" in doc && "folders" in doc)
|
|
73
|
+
return "internal";
|
|
74
|
+
const info = asObject(doc.info);
|
|
75
|
+
const schema = info && typeof info.schema === "string" ? info.schema : "";
|
|
76
|
+
if (schema.includes("schema.getpostman.com"))
|
|
77
|
+
return "postman";
|
|
78
|
+
if (info && Array.isArray(doc.item))
|
|
79
|
+
return "postman";
|
|
80
|
+
if (doc._type === "export" && "__export_format" in doc)
|
|
81
|
+
return "insomnia";
|
|
82
|
+
if (typeof doc.type === "string" && doc.type.startsWith("collection.insomnia"))
|
|
83
|
+
return "insomnia";
|
|
84
|
+
if (typeof doc.openapi === "string")
|
|
85
|
+
return "openapi";
|
|
86
|
+
if (doc.swagger === "2.0")
|
|
87
|
+
return "openapi";
|
|
88
|
+
if (Array.isArray(doc.items) && "version" in doc)
|
|
89
|
+
return "bruno";
|
|
90
|
+
// Environment export — checked AFTER every collection shape so a
|
|
91
|
+
// collection carrying its own `variable` array can't be mistaken for an
|
|
92
|
+
// env. Postman environment (`values` array / scope marker) or callman's
|
|
93
|
+
// env export (`{ name, variables: {…} }`).
|
|
94
|
+
if (Array.isArray(doc.values) ||
|
|
95
|
+
doc._postman_variable_scope === "environment" ||
|
|
96
|
+
asObject(doc.variables) !== null) {
|
|
97
|
+
return "environment";
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// 3. Plain-text formats. cURL is checked before .http because a cURL line
|
|
101
|
+
// ("curl -X POST https://…") also matches the HTTP request-line regex.
|
|
102
|
+
if (hasCurlLine(text))
|
|
103
|
+
return "curl";
|
|
104
|
+
if (/(^|\n)\s*###/.test(text) || HTTP_REQUEST_LINE.test(text))
|
|
105
|
+
return "http";
|
|
106
|
+
return "unknown";
|
|
107
|
+
};
|
|
108
|
+
const detectImportFormat = (fileName, text, options = {}) => {
|
|
109
|
+
const format = detect(fileName, text, options);
|
|
110
|
+
return { format, label: exports.IMPORT_FORMAT_LABELS[format] };
|
|
111
|
+
};
|
|
112
|
+
exports.detectImportFormat = detectImportFormat;
|
|
113
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/http-file/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.inferBodyStateFromRaw = exports.parseCurlFile = exports.splitCurlCommands = exports.requestNameFor = exports.collectionNameFromFileName = exports.toPersistedRequestBody = void 0;
|
|
4
|
+
// The flat payload the backend's `format: "requests"` import accepts — a plain
|
|
5
|
+
// list of requests, which is exactly what a cURL script or `.http` file
|
|
6
|
+
// amounts to. The server validates each entry with the same schema
|
|
7
|
+
// `POST /requests` uses, so anything valid for a single request is valid here.
|
|
8
|
+
// Parsers are PURE: they create nothing, so a file that fails partway leaves
|
|
9
|
+
// nothing behind (the caller sends the whole payload in one request).
|
|
10
|
+
const bodyFormat_js_1 = require("../curl/bodyFormat.js");
|
|
11
|
+
Object.defineProperty(exports, "inferBodyStateFromRaw", { enumerable: true, get: function () { return bodyFormat_js_1.inferBodyStateFromRaw; } });
|
|
12
|
+
const parseCurl_js_1 = require("../curl/parseCurl.js");
|
|
13
|
+
const rows_js_1 = require("../curl/rows.js");
|
|
14
|
+
// Editor body state → persisted body (mirror of the desktop's
|
|
15
|
+
// `serializeBodyState`, requestDraft.ts).
|
|
16
|
+
const toPersistedRequestBody = (body) => {
|
|
17
|
+
switch (body.mode) {
|
|
18
|
+
case "raw": {
|
|
19
|
+
if (!body.raw.trim())
|
|
20
|
+
return null;
|
|
21
|
+
const rawLanguage = body.rawLanguage ?? "json";
|
|
22
|
+
if (rawLanguage !== "json") {
|
|
23
|
+
return { mode: "raw", raw: body.raw, rawLanguage };
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(body.raw);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return body.raw;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
case "formdata":
|
|
33
|
+
return { mode: "formdata", formEntries: body.formEntries.filter((entry) => entry.key.trim()) };
|
|
34
|
+
case "urlencoded":
|
|
35
|
+
return { mode: "urlencoded", formEntries: body.formEntries.filter((entry) => entry.key.trim()) };
|
|
36
|
+
case "none":
|
|
37
|
+
default:
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.toPersistedRequestBody = toPersistedRequestBody;
|
|
42
|
+
const collectionNameFromFileName = (fileName, fallback) => fileName.replace(/\.[^.]+$/, "").trim() || fallback;
|
|
43
|
+
exports.collectionNameFromFileName = collectionNameFromFileName;
|
|
44
|
+
// Best-effort human name from the URL path; falls back for templated
|
|
45
|
+
// ({{base}}/…) or malformed URLs that `new URL` can't parse.
|
|
46
|
+
const requestNameFor = (method, url, index) => {
|
|
47
|
+
try {
|
|
48
|
+
const parsed = new URL(url);
|
|
49
|
+
const path = parsed.pathname && parsed.pathname !== "/" ? parsed.pathname : parsed.hostname;
|
|
50
|
+
return `${method} ${path}`;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return `${method} request ${index + 1}`;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
exports.requestNameFor = requestNameFor;
|
|
57
|
+
// A .sh/.txt file may hold one or many cURL commands. Each command starts on
|
|
58
|
+
// a line beginning with `curl`; `parseCurl` handles `\`-continued lines within
|
|
59
|
+
// a command, so this only splits the file into command chunks.
|
|
60
|
+
const splitCurlCommands = (text) => {
|
|
61
|
+
const commands = [];
|
|
62
|
+
let current = [];
|
|
63
|
+
const flush = () => {
|
|
64
|
+
// Drop trailing blank / comment-only lines that sit between commands so a
|
|
65
|
+
// comment like `# 5) GET with -G --data-urlencode` can't leak flag-looking
|
|
66
|
+
// tokens into the preceding command.
|
|
67
|
+
while (current.length > 0 && /^\s*(#|$)/.test(current[current.length - 1])) {
|
|
68
|
+
current.pop();
|
|
69
|
+
}
|
|
70
|
+
const joined = current.join("\n").trim();
|
|
71
|
+
if (joined)
|
|
72
|
+
commands.push(joined);
|
|
73
|
+
current = [];
|
|
74
|
+
};
|
|
75
|
+
for (const line of text.split(/\r?\n/)) {
|
|
76
|
+
if (/^\s*curl(\s|$)/i.test(line)) {
|
|
77
|
+
flush();
|
|
78
|
+
current.push(line);
|
|
79
|
+
}
|
|
80
|
+
else if (current.length > 0) {
|
|
81
|
+
current.push(line); // continuation / body / header lines of the current command
|
|
82
|
+
}
|
|
83
|
+
// Lines before the first `curl` (shebang, comments) are ignored.
|
|
84
|
+
}
|
|
85
|
+
flush();
|
|
86
|
+
return commands;
|
|
87
|
+
};
|
|
88
|
+
exports.splitCurlCommands = splitCurlCommands;
|
|
89
|
+
const parseCurlFile = (fileName, text) => {
|
|
90
|
+
const commands = (0, exports.splitCurlCommands)(text).filter(parseCurl_js_1.isCurlCommand);
|
|
91
|
+
if (commands.length === 0) {
|
|
92
|
+
throw new Error("No cURL commands found in the file");
|
|
93
|
+
}
|
|
94
|
+
const parsed = commands.map((command) => (0, parseCurl_js_1.parseCurl)(command));
|
|
95
|
+
return {
|
|
96
|
+
collectionName: (0, exports.collectionNameFromFileName)(fileName, "Imported cURL"),
|
|
97
|
+
requests: parsed.map((request, index) => ({
|
|
98
|
+
name: (0, exports.requestNameFor)(request.method, request.url, index),
|
|
99
|
+
method: request.method,
|
|
100
|
+
url: request.url,
|
|
101
|
+
// Strip the trailing empty editor row — the backend rejects blank keys.
|
|
102
|
+
headers: (0, rows_js_1.filledRows)(request.headers),
|
|
103
|
+
query: (0, rows_js_1.filledRows)(request.query),
|
|
104
|
+
body: (0, exports.toPersistedRequestBody)(request.body),
|
|
105
|
+
})),
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
exports.parseCurlFile = parseCurlFile;
|
|
109
|
+
//# sourceMappingURL=flatImport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatImport.js","sourceRoot":"","sources":["../../src/http-file/flatImport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.importFormatLabel = exports.IMPORT_FORMAT_LABELS = exports.detectImportFormat = exports.parseHttpRequests = exports.parseHttpFile = exports.toPersistedRequestBody = exports.splitCurlCommands = exports.requestNameFor = exports.parseCurlFile = exports.collectionNameFromFileName = void 0;
|
|
4
|
+
// File importers (cURL scripts, .http/.rest files) + format detection —
|
|
5
|
+
// shared by the desktop, the MCP server and the backend. CSP-safe (see
|
|
6
|
+
// ../curl/index.ts).
|
|
7
|
+
var flatImport_js_1 = require("./flatImport.js");
|
|
8
|
+
Object.defineProperty(exports, "collectionNameFromFileName", { enumerable: true, get: function () { return flatImport_js_1.collectionNameFromFileName; } });
|
|
9
|
+
Object.defineProperty(exports, "parseCurlFile", { enumerable: true, get: function () { return flatImport_js_1.parseCurlFile; } });
|
|
10
|
+
Object.defineProperty(exports, "requestNameFor", { enumerable: true, get: function () { return flatImport_js_1.requestNameFor; } });
|
|
11
|
+
Object.defineProperty(exports, "splitCurlCommands", { enumerable: true, get: function () { return flatImport_js_1.splitCurlCommands; } });
|
|
12
|
+
Object.defineProperty(exports, "toPersistedRequestBody", { enumerable: true, get: function () { return flatImport_js_1.toPersistedRequestBody; } });
|
|
13
|
+
var parseHttpFile_js_1 = require("./parseHttpFile.js");
|
|
14
|
+
Object.defineProperty(exports, "parseHttpFile", { enumerable: true, get: function () { return parseHttpFile_js_1.parseHttpFile; } });
|
|
15
|
+
Object.defineProperty(exports, "parseHttpRequests", { enumerable: true, get: function () { return parseHttpFile_js_1.parseHttpRequests; } });
|
|
16
|
+
var detect_js_1 = require("./detect.js");
|
|
17
|
+
Object.defineProperty(exports, "detectImportFormat", { enumerable: true, get: function () { return detect_js_1.detectImportFormat; } });
|
|
18
|
+
Object.defineProperty(exports, "IMPORT_FORMAT_LABELS", { enumerable: true, get: function () { return detect_js_1.IMPORT_FORMAT_LABELS; } });
|
|
19
|
+
Object.defineProperty(exports, "importFormatLabel", { enumerable: true, get: function () { return detect_js_1.importFormatLabel; } });
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http-file/index.ts"],"names":[],"mappings":";;;AAAA,wEAAwE;AACxE,uEAAuE;AACvE,qBAAqB;AACrB,iDAUyB;AATvB,2HAAA,0BAA0B,OAAA;AAI1B,8GAAA,aAAa,OAAA;AAEb,+GAAA,cAAc,OAAA;AACd,kHAAA,iBAAiB,OAAA;AACjB,uHAAA,sBAAsB,OAAA;AAExB,uDAA8F;AAA7D,iHAAA,aAAa,OAAA;AAAE,qHAAA,iBAAiB,OAAA;AACjE,yCAOqB;AALnB,+GAAA,kBAAkB,OAAA;AAClB,iHAAA,oBAAoB,OAAA;AAGpB,8GAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseHttpFile = exports.parseHttpRequests = void 0;
|
|
4
|
+
// Importer for the VS Code REST Client / JetBrains ".http" (aka ".rest")
|
|
5
|
+
// format: requests separated by `###`, each with a `METHOD url` line, header
|
|
6
|
+
// lines, a blank line, then a body. `{{var}}` references map straight onto
|
|
7
|
+
// callman's templating, so no rewriting is needed.
|
|
8
|
+
const bodyFormat_js_1 = require("../curl/bodyFormat.js");
|
|
9
|
+
const rows_js_1 = require("../curl/rows.js");
|
|
10
|
+
const urlQuery_js_1 = require("../utils/urlQuery.js");
|
|
11
|
+
const flatImport_js_1 = require("./flatImport.js");
|
|
12
|
+
const REQUEST_LINE = /^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE|CONNECT)\s+(\S.*)$/i;
|
|
13
|
+
// Split on `###` delimiter lines. Any trailing text on the delimiter line
|
|
14
|
+
// (`### Get user`) becomes the block title. Content before the first `###`
|
|
15
|
+
// is its own (untitled) block, since many .http files omit the leading one.
|
|
16
|
+
const splitBlocks = (text) => {
|
|
17
|
+
const blocks = [];
|
|
18
|
+
let title = "";
|
|
19
|
+
let lines = [];
|
|
20
|
+
let started = false;
|
|
21
|
+
const push = () => {
|
|
22
|
+
if (started)
|
|
23
|
+
blocks.push({ title, lines });
|
|
24
|
+
};
|
|
25
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
26
|
+
const delimiter = raw.match(/^\s*###+(.*)$/);
|
|
27
|
+
if (delimiter) {
|
|
28
|
+
push();
|
|
29
|
+
title = delimiter[1].trim();
|
|
30
|
+
lines = [];
|
|
31
|
+
started = true;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
started = true;
|
|
35
|
+
lines.push(raw);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
push();
|
|
39
|
+
return blocks;
|
|
40
|
+
};
|
|
41
|
+
const parseBlock = (block) => {
|
|
42
|
+
const headers = [];
|
|
43
|
+
let name = block.title;
|
|
44
|
+
let index = 0;
|
|
45
|
+
// Skip leading comments / file-variable definitions, capturing an explicit
|
|
46
|
+
// `# @name foo` if present.
|
|
47
|
+
for (; index < block.lines.length; index += 1) {
|
|
48
|
+
const line = block.lines[index].trim();
|
|
49
|
+
if (!line)
|
|
50
|
+
continue;
|
|
51
|
+
if (line.startsWith("#") || line.startsWith("//")) {
|
|
52
|
+
const nameMatch = line.match(/@name\s*=?\s*(.+)$/);
|
|
53
|
+
if (nameMatch && !name)
|
|
54
|
+
name = nameMatch[1].trim();
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (/^@[\w-]+\s*=/.test(line))
|
|
58
|
+
continue; // `@base = https://…` file variable
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
if (index >= block.lines.length)
|
|
62
|
+
return null;
|
|
63
|
+
// Request line: `METHOD url [HTTP/1.1]` or a bare url (defaults to GET).
|
|
64
|
+
const requestLine = block.lines[index].trim().replace(/\s+HTTP\/[\d.]+$/i, "");
|
|
65
|
+
const match = requestLine.match(REQUEST_LINE);
|
|
66
|
+
let method;
|
|
67
|
+
let url;
|
|
68
|
+
if (match) {
|
|
69
|
+
method = match[1].toUpperCase();
|
|
70
|
+
url = match[2].trim();
|
|
71
|
+
}
|
|
72
|
+
else if (/^(https?:\/\/|\{\{)/i.test(requestLine)) {
|
|
73
|
+
method = "GET";
|
|
74
|
+
url = requestLine;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
index += 1;
|
|
80
|
+
// Header lines up to the first blank line.
|
|
81
|
+
for (; index < block.lines.length; index += 1) {
|
|
82
|
+
const line = block.lines[index];
|
|
83
|
+
if (!line.trim()) {
|
|
84
|
+
index += 1;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
const separator = line.indexOf(":");
|
|
88
|
+
if (separator > 0) {
|
|
89
|
+
headers.push({
|
|
90
|
+
key: line.slice(0, separator).trim(),
|
|
91
|
+
value: line.slice(separator + 1).trim(),
|
|
92
|
+
enabled: true,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const bodyRaw = block.lines.slice(index).join("\n").trim();
|
|
97
|
+
if (!name)
|
|
98
|
+
name = `${method} ${url}`;
|
|
99
|
+
return { name, method, url, headers, bodyRaw };
|
|
100
|
+
};
|
|
101
|
+
const parseHttpRequests = (text) => splitBlocks(text)
|
|
102
|
+
.map(parseBlock)
|
|
103
|
+
.filter((request) => request !== null);
|
|
104
|
+
exports.parseHttpRequests = parseHttpRequests;
|
|
105
|
+
const parseHttpFile = (fileName, text) => {
|
|
106
|
+
const parsed = (0, exports.parseHttpRequests)(text);
|
|
107
|
+
if (parsed.length === 0) {
|
|
108
|
+
throw new Error("No requests found in the .http file");
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
collectionName: (0, flatImport_js_1.collectionNameFromFileName)(fileName, "Imported HTTP file"),
|
|
112
|
+
requests: parsed.map((request) => {
|
|
113
|
+
const bodyState = (0, bodyFormat_js_1.inferBodyStateFromRaw)(request.bodyRaw, request.headers);
|
|
114
|
+
return {
|
|
115
|
+
name: request.name,
|
|
116
|
+
method: request.method,
|
|
117
|
+
url: (0, urlQuery_js_1.stripUrlQuery)(request.url),
|
|
118
|
+
// Strip blank rows — the backend rejects headers/query with empty keys.
|
|
119
|
+
headers: (0, rows_js_1.filledRows)(request.headers),
|
|
120
|
+
query: (0, rows_js_1.filledRows)((0, rows_js_1.queryRowsFromUrl)(request.url)),
|
|
121
|
+
body: (0, flatImport_js_1.toPersistedRequestBody)(bodyState),
|
|
122
|
+
};
|
|
123
|
+
}),
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
exports.parseHttpFile = parseHttpFile;
|
|
127
|
+
//# sourceMappingURL=parseHttpFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseHttpFile.js","sourceRoot":"","sources":["../../src/http-file/parseHttpFile.ts"],"names":[],"mappings":"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"}
|
package/dist-cjs/index.js
CHANGED
|
@@ -96,6 +96,11 @@ Object.defineProperty(exports, "getSoapEnvelopeTemplate", { enumerable: true, ge
|
|
|
96
96
|
// extraction (jsonRepair) — one source for backend hosted generation and
|
|
97
97
|
// desktop local-CLI generation.
|
|
98
98
|
__exportStar(require("./ai/index.js"), exports);
|
|
99
|
+
// Import parsers (cURL, .http) + format detection and the diagram document
|
|
100
|
+
// contract — shared by the desktop, the MCP server and the backend.
|
|
101
|
+
__exportStar(require("./curl/index.js"), exports);
|
|
102
|
+
__exportStar(require("./http-file/index.js"), exports);
|
|
103
|
+
__exportStar(require("./diagram/index.js"), exports);
|
|
99
104
|
__exportStar(require("./ui-test/compose.js"), exports);
|
|
100
105
|
__exportStar(require("./scenario-runner/index.js"), exports);
|
|
101
106
|
__exportStar(require("./host/index.js"), exports);
|
package/dist-cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,8EAA0E;AAAjE,iIAAA,qBAAqB,OAAA;AAC9B,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,iDAQ6B;AAP3B,+GAAA,kBAAkB,OAAA;AAClB,oHAAA,uBAAuB,OAAA;AACvB,wGAAA,WAAW,OAAA;AAMb,yCAMwB;AALtB,0GAAA,gBAAgB,OAAA;AAChB,kGAAA,QAAQ,OAAA;AACR,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAGpB,6CAAoD;AAA3C,4GAAA,gBAAgB,OAAA;AACzB,mDAK6B;AAJ3B,4GAAA,aAAa,OAAA;AACb,mHAAA,oBAAoB,OAAA;AACpB,sHAAA,uBAAuB,OAAA;AAGzB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,wDAAsC;AACtC,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AACtC,kEAAgE;AAAvD,uHAAA,iBAAiB,OAAA;AAE1B,0DAAmF;AAA1E,wHAAA,sBAAsB,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AA8BjD,kEAKqC;AAJnC,qHAAA,eAAe,OAAA;AAKjB,oEAGsC;AAFpC,2HAAA,oBAAoB,OAAA;AAGtB,8CAI2B;AAHzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAEtB,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAKyC;AAJvC,yHAAA,iBAAiB,OAAA;AACjB,iIAAA,yBAAyB,OAAA;AACzB,6HAAA,qBAAqB,OAAA;AAGvB,8DAKoC;AAJlC,sHAAA,mBAAmB,OAAA;AACnB,yHAAA,sBAAsB,OAAA;AACtB,2HAAA,wBAAwB,OAAA;AAG1B,oDAK+B;AAJ7B,uHAAA,yBAAyB,OAAA;AACzB,+GAAA,iBAAiB,OAAA;AACjB,8GAAA,gBAAgB,OAAA;AAGlB,gEAA2F;AAAlF,0HAAA,sBAAsB,OAAA;AAC/B,kDAAkD;AAClD,oDAI6B;AAH3B,0HAAA,0BAA0B,OAAA;AAI5B,sDAK8B;AAJ5B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAIxB,kDAI4B;AAH1B,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,sHAAA,uBAAuB,OAAA;AAEzB,8EAA8E;AAC9E,yEAAyE;AACzE,gCAAgC;AAChC,gDAA8B;AAC9B,uDAAqC;AACrC,6DAA2C;AAC3C,kDAAgC;AAChC,mDAAiC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,8DAA0D;AAAjD,iHAAA,aAAa,OAAA;AACtB,8DAAuD;AAA9C,8GAAA,UAAU,OAAA;AACnB,8EAA0E;AAAjE,iIAAA,qBAAqB,OAAA;AAC9B,iEAA6D;AAApD,mHAAA,cAAc,OAAA;AACvB,iDAQ6B;AAP3B,+GAAA,kBAAkB,OAAA;AAClB,oHAAA,uBAAuB,OAAA;AACvB,wGAAA,WAAW,OAAA;AAMb,yCAMwB;AALtB,0GAAA,gBAAgB,OAAA;AAChB,kGAAA,QAAQ,OAAA;AACR,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAGpB,6CAAoD;AAA3C,4GAAA,gBAAgB,OAAA;AACzB,mDAK6B;AAJ3B,4GAAA,aAAa,OAAA;AACb,mHAAA,oBAAoB,OAAA;AACpB,sHAAA,uBAAuB,OAAA;AAGzB,uDAAmD;AAA1C,uGAAA,QAAQ,OAAA;AACjB,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,wDAAsC;AACtC,oDAAqE;AAA5D,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AACtC,kEAAgE;AAAvD,uHAAA,iBAAiB,OAAA;AAE1B,0DAAmF;AAA1E,wHAAA,sBAAsB,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AA8BjD,kEAKqC;AAJnC,qHAAA,eAAe,OAAA;AAKjB,oEAGsC;AAFpC,2HAAA,oBAAoB,OAAA;AAGtB,8CAI2B;AAHzB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AACpB,gHAAA,oBAAoB,OAAA;AAEtB,iEAA+E;AAAtE,4GAAA,WAAW,OAAA;AAAE,gHAAA,eAAe,OAAA;AACrC,uDAGoC;AAFlC,uHAAA,2BAA2B,OAAA;AAC3B,+GAAA,mBAAmB,OAAA;AAErB,yEAG6C;AAF3C,mIAAA,8BAA8B,OAAA;AAC9B,2HAAA,sBAAsB,OAAA;AAExB,wEAKyC;AAJvC,yHAAA,iBAAiB,OAAA;AACjB,iIAAA,yBAAyB,OAAA;AACzB,6HAAA,qBAAqB,OAAA;AAGvB,8DAKoC;AAJlC,sHAAA,mBAAmB,OAAA;AACnB,yHAAA,sBAAsB,OAAA;AACtB,2HAAA,wBAAwB,OAAA;AAG1B,oDAK+B;AAJ7B,uHAAA,yBAAyB,OAAA;AACzB,+GAAA,iBAAiB,OAAA;AACjB,8GAAA,gBAAgB,OAAA;AAGlB,gEAA2F;AAAlF,0HAAA,sBAAsB,OAAA;AAC/B,kDAAkD;AAClD,oDAI6B;AAH3B,0HAAA,0BAA0B,OAAA;AAI5B,sDAK8B;AAJ5B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAIxB,kDAI4B;AAH1B,wHAAA,yBAAyB,OAAA;AACzB,wHAAA,yBAAyB,OAAA;AACzB,sHAAA,uBAAuB,OAAA;AAEzB,8EAA8E;AAC9E,yEAAyE;AACzE,gCAAgC;AAChC,gDAA8B;AAC9B,2EAA2E;AAC3E,oEAAoE;AACpE,kDAAgC;AAChC,uDAAqC;AACrC,qDAAmC;AACnC,uDAAqC;AACrC,6DAA2C;AAC3C,kDAAgC;AAChC,mDAAiC"}
|
|
@@ -41,6 +41,43 @@ const httpResultToExecuteRequestResult = (http) => ({
|
|
|
41
41
|
rawText: http.rawText,
|
|
42
42
|
bodyKind: http.bodyKind,
|
|
43
43
|
});
|
|
44
|
+
// Serialisable picture of the request as it left the executor — the step's
|
|
45
|
+
// `resolvedInput`. Multipart bodies are described (part keys, file names)
|
|
46
|
+
// rather than copied, and anything non-JSON collapses to a label.
|
|
47
|
+
const describeRequestBody = (body) => {
|
|
48
|
+
if (body === null || body === undefined)
|
|
49
|
+
return null;
|
|
50
|
+
if (typeof body === "string")
|
|
51
|
+
return body;
|
|
52
|
+
if (typeof FormData !== "undefined" && body instanceof FormData) {
|
|
53
|
+
const parts = [];
|
|
54
|
+
body.forEach((value, key) => {
|
|
55
|
+
parts.push({
|
|
56
|
+
key,
|
|
57
|
+
value: typeof value === "string"
|
|
58
|
+
? value
|
|
59
|
+
: `[file${value.name ? `: ${value.name}` : ""}]`,
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
return { mode: "formdata", parts };
|
|
63
|
+
}
|
|
64
|
+
if (typeof URLSearchParams !== "undefined" && body instanceof URLSearchParams) {
|
|
65
|
+
return body.toString();
|
|
66
|
+
}
|
|
67
|
+
if (typeof body === "object") {
|
|
68
|
+
if (ArrayBuffer.isView(body) || body instanceof ArrayBuffer)
|
|
69
|
+
return "[binary]";
|
|
70
|
+
return body;
|
|
71
|
+
}
|
|
72
|
+
return String(body);
|
|
73
|
+
};
|
|
74
|
+
const describeResolvedRequest = (runtimeRequest, sentHeaders) => ({
|
|
75
|
+
method: runtimeRequest.method,
|
|
76
|
+
url: runtimeRequest.url,
|
|
77
|
+
query: runtimeRequest.query,
|
|
78
|
+
headers: sentHeaders ?? runtimeRequest.headers,
|
|
79
|
+
body: describeRequestBody(runtimeRequest.body),
|
|
80
|
+
});
|
|
44
81
|
const buildRequestExecutor = (options) => async (input) => {
|
|
45
82
|
// We can't directly call the canonical scriptExecutor from here —
|
|
46
83
|
// it lives on the same factory result and may be the host's override.
|
|
@@ -192,9 +229,12 @@ const buildRequestExecutor = (options) => async (input) => {
|
|
|
192
229
|
}, oauth2TokenCache);
|
|
193
230
|
return { ...runtimeRequest.headers, Authorization: `Bearer ${token}` };
|
|
194
231
|
};
|
|
232
|
+
// Headers as actually sent (OAuth2 bearer applied) — for `resolvedInput`.
|
|
233
|
+
let sentHeaders = null;
|
|
195
234
|
const runHttp = async () => {
|
|
196
235
|
try {
|
|
197
236
|
const headers = await resolveAuthHeaders();
|
|
237
|
+
sentHeaders = headers;
|
|
198
238
|
const httpResult = await (0, abort_js_1.withAbortAndTimeout)(options.drivers.httpExecutor({
|
|
199
239
|
method: runtimeRequest.method,
|
|
200
240
|
url: runtimeRequest.url,
|
|
@@ -318,6 +358,7 @@ const buildRequestExecutor = (options) => async (input) => {
|
|
|
318
358
|
prefetchedKafkaResults,
|
|
319
359
|
failureMessage,
|
|
320
360
|
statusExpectation,
|
|
361
|
+
resolvedInput: describeResolvedRequest(runtimeRequest, sentHeaders),
|
|
321
362
|
};
|
|
322
363
|
};
|
|
323
364
|
exports.buildRequestExecutor = buildRequestExecutor;
|