neuron-inspector 0.5.6 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/collections/__tests__/assertions.test.d.ts +1 -0
- package/dist/collections/__tests__/assertions.test.js +203 -0
- package/dist/collections/__tests__/assertions.test.js.map +1 -0
- package/dist/collections/__tests__/dynamic-vars.test.d.ts +1 -0
- package/dist/collections/__tests__/dynamic-vars.test.js +169 -0
- package/dist/collections/__tests__/dynamic-vars.test.js.map +1 -0
- package/dist/collections/__tests__/execution.test.d.ts +1 -0
- package/dist/collections/__tests__/execution.test.js +271 -0
- package/dist/collections/__tests__/execution.test.js.map +1 -0
- package/dist/collections/__tests__/integration.test.d.ts +1 -0
- package/dist/collections/__tests__/integration.test.js +478 -0
- package/dist/collections/__tests__/integration.test.js.map +1 -0
- package/dist/collections/__tests__/resolver.test.d.ts +1 -0
- package/dist/collections/__tests__/resolver.test.js +282 -0
- package/dist/collections/__tests__/resolver.test.js.map +1 -0
- package/dist/collections/__tests__/scenario.test.d.ts +1 -0
- package/dist/collections/__tests__/scenario.test.js +367 -0
- package/dist/collections/__tests__/scenario.test.js.map +1 -0
- package/dist/collections/__tests__/scripts.test.d.ts +1 -0
- package/dist/collections/__tests__/scripts.test.js +245 -0
- package/dist/collections/__tests__/scripts.test.js.map +1 -0
- package/dist/collections/__tests__/store.test.d.ts +1 -0
- package/dist/collections/__tests__/store.test.js +313 -0
- package/dist/collections/__tests__/store.test.js.map +1 -0
- package/dist/collections/assertions.d.ts +16 -0
- package/dist/collections/assertions.js +107 -0
- package/dist/collections/assertions.js.map +1 -0
- package/dist/collections/dynamic-vars.d.ts +75 -0
- package/dist/collections/dynamic-vars.js +187 -0
- package/dist/collections/dynamic-vars.js.map +1 -0
- package/dist/collections/executor.d.ts +94 -0
- package/dist/collections/executor.js +251 -0
- package/dist/collections/executor.js.map +1 -0
- package/dist/collections/http.d.ts +4 -0
- package/dist/collections/http.js +84 -0
- package/dist/collections/http.js.map +1 -0
- package/dist/collections/index.d.ts +12 -0
- package/dist/collections/index.js +27 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/postman.d.ts +10 -0
- package/dist/collections/postman.js +288 -0
- package/dist/collections/postman.js.map +1 -0
- package/dist/collections/resolver.d.ts +74 -0
- package/dist/collections/resolver.js +253 -0
- package/dist/collections/resolver.js.map +1 -0
- package/dist/collections/scripts.d.ts +9 -0
- package/dist/collections/scripts.js +55 -0
- package/dist/collections/scripts.js.map +1 -0
- package/dist/collections/store.d.ts +40 -0
- package/dist/collections/store.js +356 -0
- package/dist/collections/store.js.map +1 -0
- package/dist/collections/tools.d.ts +8 -0
- package/dist/collections/tools.js +838 -0
- package/dist/collections/tools.js.map +1 -0
- package/dist/collections/types.d.ts +177 -0
- package/dist/collections/types.js +3 -0
- package/dist/collections/types.js.map +1 -0
- package/dist/server.js +18 -1
- package/dist/server.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postman Collection v2.1 ↔ Neuron Collection converter.
|
|
3
|
+
*
|
|
4
|
+
* Two pure functions — no dependencies beyond the Collection types.
|
|
5
|
+
*/
|
|
6
|
+
// ── Postman → Neuron ──────────────────────────────────────────────
|
|
7
|
+
/** Parse a Postman v2.1 JSON object into a Neuron Collection. */
|
|
8
|
+
export function fromPostmanV21(json) {
|
|
9
|
+
const root = json;
|
|
10
|
+
const info = root.info;
|
|
11
|
+
const name = info?.name ?? "Imported Collection";
|
|
12
|
+
const collection = {
|
|
13
|
+
name,
|
|
14
|
+
version: "1.0.0",
|
|
15
|
+
folders: {},
|
|
16
|
+
};
|
|
17
|
+
// Collection-level variables → defaults.variables
|
|
18
|
+
const variables = root.variable;
|
|
19
|
+
if (variables?.length) {
|
|
20
|
+
collection.defaults = {
|
|
21
|
+
variables: Object.fromEntries(variables.map((v) => [v.key, v.value ?? ""])),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
// Collection-level auth
|
|
25
|
+
const auth = parsePostmanAuth(root.auth);
|
|
26
|
+
if (auth) {
|
|
27
|
+
if (!collection.defaults)
|
|
28
|
+
collection.defaults = {};
|
|
29
|
+
collection.defaults.auth = auth;
|
|
30
|
+
}
|
|
31
|
+
// Process items recursively
|
|
32
|
+
const items = root.item;
|
|
33
|
+
if (items) {
|
|
34
|
+
processItems(items, collection, "");
|
|
35
|
+
}
|
|
36
|
+
return collection;
|
|
37
|
+
}
|
|
38
|
+
function processItems(items, collection, parentFolder) {
|
|
39
|
+
for (const raw of items) {
|
|
40
|
+
const item = raw;
|
|
41
|
+
const subItems = item.item;
|
|
42
|
+
if (subItems && Array.isArray(subItems)) {
|
|
43
|
+
// Folder — has nested items
|
|
44
|
+
const folderName = slugifyKey(item.name ?? "folder");
|
|
45
|
+
processItems(subItems, collection, folderName);
|
|
46
|
+
}
|
|
47
|
+
else if (item.request) {
|
|
48
|
+
// Leaf item — endpoint
|
|
49
|
+
const folderKey = parentFolder || "default";
|
|
50
|
+
if (!collection.folders)
|
|
51
|
+
collection.folders = {};
|
|
52
|
+
if (!collection.folders[folderKey]) {
|
|
53
|
+
collection.folders[folderKey] = { endpoints: [] };
|
|
54
|
+
}
|
|
55
|
+
const endpoint = parsePostmanRequest(item);
|
|
56
|
+
collection.folders[folderKey].endpoints.push(endpoint);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function parsePostmanRequest(item) {
|
|
61
|
+
const req = item.request;
|
|
62
|
+
const name = item.name ?? "Unnamed";
|
|
63
|
+
// Method
|
|
64
|
+
const method = (req.method ?? "GET").toUpperCase();
|
|
65
|
+
// URL — can be a string or an object
|
|
66
|
+
let path = "/";
|
|
67
|
+
const url = req.url;
|
|
68
|
+
if (typeof url === "string") {
|
|
69
|
+
path = url;
|
|
70
|
+
}
|
|
71
|
+
else if (url && typeof url === "object") {
|
|
72
|
+
const urlObj = url;
|
|
73
|
+
if (typeof urlObj.raw === "string") {
|
|
74
|
+
path = urlObj.raw;
|
|
75
|
+
}
|
|
76
|
+
else if (Array.isArray(urlObj.path)) {
|
|
77
|
+
path = "/" + urlObj.path.join("/");
|
|
78
|
+
}
|
|
79
|
+
// Append query parameters
|
|
80
|
+
const query = urlObj.query;
|
|
81
|
+
if (query?.length) {
|
|
82
|
+
const qs = query.map((q) => `${q.key}=${q.value ?? ""}`).join("&");
|
|
83
|
+
path += (path.includes("?") ? "&" : "?") + qs;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Strip protocol + host to keep only the path portion
|
|
87
|
+
try {
|
|
88
|
+
const parsed = new URL(path, "https://placeholder.local");
|
|
89
|
+
path = parsed.pathname + parsed.search;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Not a full URL — keep as-is
|
|
93
|
+
}
|
|
94
|
+
const endpoint = { name, method, path };
|
|
95
|
+
// Headers
|
|
96
|
+
const headers = req.header;
|
|
97
|
+
if (headers?.length) {
|
|
98
|
+
endpoint.headers = Object.fromEntries(headers.map((h) => [h.key, h.value ?? ""]));
|
|
99
|
+
}
|
|
100
|
+
// Body
|
|
101
|
+
const body = req.body;
|
|
102
|
+
if (body?.raw && typeof body.raw === "string") {
|
|
103
|
+
try {
|
|
104
|
+
endpoint.body = JSON.parse(body.raw);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
endpoint.body = body.raw;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Auth
|
|
111
|
+
const auth = parsePostmanAuth(req.auth);
|
|
112
|
+
if (auth)
|
|
113
|
+
endpoint.auth = auth;
|
|
114
|
+
// Description
|
|
115
|
+
const desc = req.description;
|
|
116
|
+
if (typeof desc === "string" && desc) {
|
|
117
|
+
endpoint.description = desc;
|
|
118
|
+
}
|
|
119
|
+
else if (desc && typeof desc === "object") {
|
|
120
|
+
const descObj = desc;
|
|
121
|
+
if (typeof descObj.content === "string")
|
|
122
|
+
endpoint.description = descObj.content;
|
|
123
|
+
}
|
|
124
|
+
// Tests — best-effort extraction from Postman test scripts
|
|
125
|
+
const events = item.event;
|
|
126
|
+
if (events) {
|
|
127
|
+
const tests = extractTestsFromEvents(events);
|
|
128
|
+
if (tests.length)
|
|
129
|
+
endpoint.tests = tests;
|
|
130
|
+
}
|
|
131
|
+
return endpoint;
|
|
132
|
+
}
|
|
133
|
+
function parsePostmanAuth(auth) {
|
|
134
|
+
if (!auth?.type)
|
|
135
|
+
return undefined;
|
|
136
|
+
const type = auth.type;
|
|
137
|
+
if (type === "bearer") {
|
|
138
|
+
const bearerArr = auth.bearer;
|
|
139
|
+
const token = bearerArr?.find((b) => b.key === "token")?.value ?? "";
|
|
140
|
+
return { type: "bearer", token };
|
|
141
|
+
}
|
|
142
|
+
if (type === "basic") {
|
|
143
|
+
const basicArr = auth.basic;
|
|
144
|
+
const username = basicArr?.find((b) => b.key === "username")?.value ?? "";
|
|
145
|
+
const password = basicArr?.find((b) => b.key === "password")?.value ?? "";
|
|
146
|
+
return { type: "basic", username, password };
|
|
147
|
+
}
|
|
148
|
+
if (type === "apikey") {
|
|
149
|
+
const apiKeyArr = auth.apikey;
|
|
150
|
+
const headerName = apiKeyArr?.find((b) => b.key === "key")?.value ?? "X-API-Key";
|
|
151
|
+
const value = apiKeyArr?.find((b) => b.key === "value")?.value ?? "";
|
|
152
|
+
return { type: "api-key", header: headerName, value };
|
|
153
|
+
}
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
/** Best-effort extraction of status checks from Postman test scripts. */
|
|
157
|
+
function extractTestsFromEvents(events) {
|
|
158
|
+
const assertions = [];
|
|
159
|
+
for (const event of events) {
|
|
160
|
+
if (event.listen !== "test")
|
|
161
|
+
continue;
|
|
162
|
+
const lines = event.script?.exec ?? [];
|
|
163
|
+
const script = lines.join("\n");
|
|
164
|
+
// Match pm.response.to.have.status(N) patterns
|
|
165
|
+
const statusMatches = script.matchAll(/pm\.response\.to\.have\.status\((\d+)\)/g);
|
|
166
|
+
for (const m of statusMatches) {
|
|
167
|
+
assertions.push({ check: "status", expect: Number(m[1]) });
|
|
168
|
+
}
|
|
169
|
+
// Match pm.expect(pm.response.code).to.eql(N) patterns
|
|
170
|
+
const codeMatches = script.matchAll(/pm\.expect\(pm\.response\.code\)\.to\.eql\((\d+)\)/g);
|
|
171
|
+
for (const m of codeMatches) {
|
|
172
|
+
assertions.push({ check: "status", expect: Number(m[1]) });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return assertions;
|
|
176
|
+
}
|
|
177
|
+
// ── Neuron → Postman ──────────────────────────────────────────────
|
|
178
|
+
const POSTMAN_SCHEMA = "https://schema.getpostman.com/json/collection/v2.1.0/collection.json";
|
|
179
|
+
/** Convert a Neuron Collection to Postman v2.1 JSON. */
|
|
180
|
+
export function toPostmanV21(collection, id) {
|
|
181
|
+
const postman = {
|
|
182
|
+
info: {
|
|
183
|
+
name: collection.name,
|
|
184
|
+
_postman_id: id,
|
|
185
|
+
schema: POSTMAN_SCHEMA,
|
|
186
|
+
...(collection.description && { description: collection.description }),
|
|
187
|
+
},
|
|
188
|
+
item: [],
|
|
189
|
+
};
|
|
190
|
+
// Folders → Postman item groups
|
|
191
|
+
const items = postman.item;
|
|
192
|
+
if (collection.folders) {
|
|
193
|
+
for (const [folderName, folder] of Object.entries(collection.folders)) {
|
|
194
|
+
const folderItem = {
|
|
195
|
+
name: folderName,
|
|
196
|
+
item: folder.endpoints.map((ep) => endpointToPostmanItem(ep, folder)),
|
|
197
|
+
};
|
|
198
|
+
if (folder.description)
|
|
199
|
+
folderItem.description = folder.description;
|
|
200
|
+
if (folder.auth)
|
|
201
|
+
folderItem.auth = authToPostman(folder.auth);
|
|
202
|
+
items.push(folderItem);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Collection-level variables
|
|
206
|
+
if (collection.defaults?.variables) {
|
|
207
|
+
postman.variable = Object.entries(collection.defaults.variables).map(([key, value]) => ({
|
|
208
|
+
key,
|
|
209
|
+
value,
|
|
210
|
+
type: "string",
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
// Collection-level auth
|
|
214
|
+
if (collection.defaults?.auth) {
|
|
215
|
+
postman.auth = authToPostman(collection.defaults.auth);
|
|
216
|
+
}
|
|
217
|
+
return postman;
|
|
218
|
+
}
|
|
219
|
+
function endpointToPostmanItem(ep, folder) {
|
|
220
|
+
const item = {
|
|
221
|
+
name: ep.name,
|
|
222
|
+
request: {
|
|
223
|
+
method: ep.method.toUpperCase(),
|
|
224
|
+
header: ep.headers
|
|
225
|
+
? Object.entries(ep.headers).map(([key, value]) => ({ key, value, type: "text" }))
|
|
226
|
+
: [],
|
|
227
|
+
url: {
|
|
228
|
+
raw: ep.path,
|
|
229
|
+
path: ep.path.split("?")[0].split("/").filter(Boolean),
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
const req = item.request;
|
|
234
|
+
// Body
|
|
235
|
+
if (ep.body !== undefined) {
|
|
236
|
+
req.body = {
|
|
237
|
+
mode: "raw",
|
|
238
|
+
raw: typeof ep.body === "string" ? ep.body : JSON.stringify(ep.body, null, 2),
|
|
239
|
+
options: { raw: { language: "json" } },
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// Auth
|
|
243
|
+
if (ep.auth) {
|
|
244
|
+
req.auth = authToPostman(ep.auth);
|
|
245
|
+
}
|
|
246
|
+
// Description
|
|
247
|
+
if (ep.description) {
|
|
248
|
+
req.description = ep.description;
|
|
249
|
+
}
|
|
250
|
+
return item;
|
|
251
|
+
}
|
|
252
|
+
function authToPostman(auth) {
|
|
253
|
+
switch (auth.type) {
|
|
254
|
+
case "bearer":
|
|
255
|
+
return {
|
|
256
|
+
type: "bearer",
|
|
257
|
+
bearer: [{ key: "token", value: auth.token ?? "", type: "string" }],
|
|
258
|
+
};
|
|
259
|
+
case "basic":
|
|
260
|
+
return {
|
|
261
|
+
type: "basic",
|
|
262
|
+
basic: [
|
|
263
|
+
{ key: "username", value: auth.username ?? "", type: "string" },
|
|
264
|
+
{ key: "password", value: auth.password ?? "", type: "string" },
|
|
265
|
+
],
|
|
266
|
+
};
|
|
267
|
+
case "api-key":
|
|
268
|
+
return {
|
|
269
|
+
type: "apikey",
|
|
270
|
+
apikey: [
|
|
271
|
+
{ key: "key", value: auth.header ?? "X-API-Key", type: "string" },
|
|
272
|
+
{ key: "value", value: auth.value ?? "", type: "string" },
|
|
273
|
+
],
|
|
274
|
+
};
|
|
275
|
+
case "none":
|
|
276
|
+
return { type: "noauth" };
|
|
277
|
+
default:
|
|
278
|
+
return { type: "noauth" };
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ── Util ──────────────────────────────────────────────────────────
|
|
282
|
+
function slugifyKey(input) {
|
|
283
|
+
return input
|
|
284
|
+
.toLowerCase()
|
|
285
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
286
|
+
.replace(/^-+|-+$/g, "");
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=postman.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postman.js","sourceRoot":"","sources":["../../src/collections/postman.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { ResolverStep, ResolverContext, ResolvedRequest, Collection, Environment, Folder, Endpoint } from "./types.js";
|
|
2
|
+
import type { DynamicVarRegistry } from "./dynamic-vars.js";
|
|
3
|
+
/** Replace all {{var}} references in a string using the resolver pipeline. */
|
|
4
|
+
export declare function resolveTemplate(template: string, steps: ResolverStep[], context: ResolverContext): string;
|
|
5
|
+
/** Recursively resolve all string values in an object/array. */
|
|
6
|
+
export declare function resolveDeep(value: unknown, steps: ResolverStep[], context: ResolverContext): unknown;
|
|
7
|
+
/** Find all unresolved {{var}} references in a string. */
|
|
8
|
+
export declare function findUnresolved(text: string): string[];
|
|
9
|
+
/** Scan all strings in a resolved request for unresolved variables. */
|
|
10
|
+
export declare function checkUnresolved(request: {
|
|
11
|
+
url: string;
|
|
12
|
+
headers: Record<string, string>;
|
|
13
|
+
body?: string;
|
|
14
|
+
}): string[];
|
|
15
|
+
/** Level 1: Global variables from ~/.neuron/profile.yaml */
|
|
16
|
+
export declare class ProfileResolver implements ResolverStep {
|
|
17
|
+
name: string;
|
|
18
|
+
private cache;
|
|
19
|
+
resolve(key: string, _context: ResolverContext): string | undefined;
|
|
20
|
+
}
|
|
21
|
+
/** Level 2: Process environment variables */
|
|
22
|
+
export declare class ProcessEnvResolver implements ResolverStep {
|
|
23
|
+
name: string;
|
|
24
|
+
resolve(key: string, _context: ResolverContext): string | undefined;
|
|
25
|
+
}
|
|
26
|
+
/** Level 3: Active environment variables */
|
|
27
|
+
export declare class EnvironmentResolver implements ResolverStep {
|
|
28
|
+
name: string;
|
|
29
|
+
resolve(key: string, context: ResolverContext): string | undefined;
|
|
30
|
+
}
|
|
31
|
+
/** Level 4: Collection-level defaults.variables */
|
|
32
|
+
export declare class CollectionDefaultsResolver implements ResolverStep {
|
|
33
|
+
name: string;
|
|
34
|
+
resolve(key: string, context: ResolverContext): string | undefined;
|
|
35
|
+
}
|
|
36
|
+
/** Level 5: Folder-level variables */
|
|
37
|
+
export declare class FolderResolver implements ResolverStep {
|
|
38
|
+
name: string;
|
|
39
|
+
resolve(key: string, context: ResolverContext): string | undefined;
|
|
40
|
+
}
|
|
41
|
+
/** Level 6: Request-level variables */
|
|
42
|
+
export declare class RequestResolver implements ResolverStep {
|
|
43
|
+
name: string;
|
|
44
|
+
resolve(key: string, context: ResolverContext): string | undefined;
|
|
45
|
+
}
|
|
46
|
+
/** Level 7: Extracted variables from previous requests */
|
|
47
|
+
export declare class ExtractedResolver implements ResolverStep {
|
|
48
|
+
name: string;
|
|
49
|
+
resolve(key: string, context: ResolverContext): string | undefined;
|
|
50
|
+
}
|
|
51
|
+
/** Level 8: Script-set variables */
|
|
52
|
+
export declare class ScriptVarResolver implements ResolverStep {
|
|
53
|
+
name: string;
|
|
54
|
+
resolve(key: string, context: ResolverContext): string | undefined;
|
|
55
|
+
}
|
|
56
|
+
/** Dynamic variable resolver: intercepts $-prefixed references and delegates to the registry. */
|
|
57
|
+
export declare class DynamicVarResolverStep implements ResolverStep {
|
|
58
|
+
private registry;
|
|
59
|
+
name: string;
|
|
60
|
+
constructor(registry: DynamicVarRegistry);
|
|
61
|
+
resolve(key: string, context: ResolverContext): string | undefined;
|
|
62
|
+
}
|
|
63
|
+
/** Build the default resolver pipeline (levels 1-8 + dynamic vars). */
|
|
64
|
+
export declare function buildDefaultPipeline(dynamicVarRegistry?: DynamicVarRegistry): ResolverStep[];
|
|
65
|
+
/** Build a fully resolved request from collection context. */
|
|
66
|
+
export declare function buildResolvedRequest(opts: {
|
|
67
|
+
collection: Collection;
|
|
68
|
+
environment: Environment;
|
|
69
|
+
folder: Folder;
|
|
70
|
+
endpoint: Endpoint;
|
|
71
|
+
pipeline: ResolverStep[];
|
|
72
|
+
extracted?: Record<string, string>;
|
|
73
|
+
scriptVars?: Record<string, string>;
|
|
74
|
+
}): ResolvedRequest;
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
4
|
+
import * as YAML from "yaml";
|
|
5
|
+
// ── Template engine ─────────────────────────────────────────────
|
|
6
|
+
const VAR_PATTERN = /\{\{([^}]+)\}\}/g;
|
|
7
|
+
/** Replace all {{var}} references in a string using the resolver pipeline. */
|
|
8
|
+
export function resolveTemplate(template, steps, context) {
|
|
9
|
+
return template.replace(VAR_PATTERN, (_match, key) => {
|
|
10
|
+
const trimmed = key.trim();
|
|
11
|
+
for (const step of steps) {
|
|
12
|
+
const value = step.resolve(trimmed, context);
|
|
13
|
+
if (value !== undefined)
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
// Leave unresolved for detection
|
|
17
|
+
return `{{${trimmed}}}`;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** Recursively resolve all string values in an object/array. */
|
|
21
|
+
export function resolveDeep(value, steps, context) {
|
|
22
|
+
if (typeof value === "string")
|
|
23
|
+
return resolveTemplate(value, steps, context);
|
|
24
|
+
if (Array.isArray(value))
|
|
25
|
+
return value.map((v) => resolveDeep(v, steps, context));
|
|
26
|
+
if (typeof value === "object" && value !== null) {
|
|
27
|
+
const result = {};
|
|
28
|
+
for (const [k, v] of Object.entries(value)) {
|
|
29
|
+
result[k] = resolveDeep(v, steps, context);
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
/** Find all unresolved {{var}} references in a string. */
|
|
36
|
+
export function findUnresolved(text) {
|
|
37
|
+
const matches = [];
|
|
38
|
+
let m;
|
|
39
|
+
const re = /\{\{([^}]+)\}\}/g;
|
|
40
|
+
while ((m = re.exec(text)) !== null) {
|
|
41
|
+
matches.push(m[1].trim());
|
|
42
|
+
}
|
|
43
|
+
return matches;
|
|
44
|
+
}
|
|
45
|
+
/** Scan all strings in a resolved request for unresolved variables. */
|
|
46
|
+
export function checkUnresolved(request) {
|
|
47
|
+
const unresolved = new Set();
|
|
48
|
+
for (const v of findUnresolved(request.url))
|
|
49
|
+
unresolved.add(v);
|
|
50
|
+
for (const val of Object.values(request.headers)) {
|
|
51
|
+
for (const v of findUnresolved(val))
|
|
52
|
+
unresolved.add(v);
|
|
53
|
+
}
|
|
54
|
+
if (request.body) {
|
|
55
|
+
for (const v of findUnresolved(request.body))
|
|
56
|
+
unresolved.add(v);
|
|
57
|
+
}
|
|
58
|
+
return [...unresolved];
|
|
59
|
+
}
|
|
60
|
+
// ── Built-in resolver steps ─────────────────────────────────────
|
|
61
|
+
/** Level 1: Global variables from ~/.neuron/profile.yaml */
|
|
62
|
+
export class ProfileResolver {
|
|
63
|
+
name = "profile";
|
|
64
|
+
cache = null;
|
|
65
|
+
resolve(key, _context) {
|
|
66
|
+
if (this.cache === null) {
|
|
67
|
+
const profilePath = join(homedir(), ".neuron", "profile.yaml");
|
|
68
|
+
if (existsSync(profilePath)) {
|
|
69
|
+
try {
|
|
70
|
+
const content = readFileSync(profilePath, "utf-8");
|
|
71
|
+
const parsed = YAML.parse(content);
|
|
72
|
+
this.cache = typeof parsed === "object" && parsed !== null
|
|
73
|
+
? Object.fromEntries(Object.entries(parsed).map(([k, v]) => [k, String(v)]))
|
|
74
|
+
: {};
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
this.cache = {};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.cache = {};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return this.cache[key];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Level 2: Process environment variables */
|
|
88
|
+
export class ProcessEnvResolver {
|
|
89
|
+
name = "process.env";
|
|
90
|
+
resolve(key, _context) {
|
|
91
|
+
return process.env[key];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Level 3: Active environment variables */
|
|
95
|
+
export class EnvironmentResolver {
|
|
96
|
+
name = "environment";
|
|
97
|
+
resolve(key, context) {
|
|
98
|
+
return context.environment?.variables?.[key];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Level 4: Collection-level defaults.variables */
|
|
102
|
+
export class CollectionDefaultsResolver {
|
|
103
|
+
name = "collection.defaults";
|
|
104
|
+
resolve(key, context) {
|
|
105
|
+
return context.collection?.defaults?.variables?.[key];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Level 5: Folder-level variables */
|
|
109
|
+
export class FolderResolver {
|
|
110
|
+
name = "folder";
|
|
111
|
+
resolve(key, context) {
|
|
112
|
+
return context.folder?.variables?.[key];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Level 6: Request-level variables */
|
|
116
|
+
export class RequestResolver {
|
|
117
|
+
name = "request";
|
|
118
|
+
resolve(key, context) {
|
|
119
|
+
return context.endpoint?.variables?.[key];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Level 7: Extracted variables from previous requests */
|
|
123
|
+
export class ExtractedResolver {
|
|
124
|
+
name = "extracted";
|
|
125
|
+
resolve(key, context) {
|
|
126
|
+
return context.extracted?.[key];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Level 8: Script-set variables */
|
|
130
|
+
export class ScriptVarResolver {
|
|
131
|
+
name = "script";
|
|
132
|
+
resolve(key, context) {
|
|
133
|
+
return context.scriptVars?.[key];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Dynamic variable resolver: intercepts $-prefixed references and delegates to the registry. */
|
|
137
|
+
export class DynamicVarResolverStep {
|
|
138
|
+
registry;
|
|
139
|
+
name = "dynamic";
|
|
140
|
+
constructor(registry) {
|
|
141
|
+
this.registry = registry;
|
|
142
|
+
}
|
|
143
|
+
resolve(key, context) {
|
|
144
|
+
if (!key.startsWith("$"))
|
|
145
|
+
return undefined;
|
|
146
|
+
return this.registry.resolve(key, context);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// ── Pipeline ────────────────────────────────────────────────────
|
|
150
|
+
/** Build the default resolver pipeline (levels 1-8 + dynamic vars). */
|
|
151
|
+
export function buildDefaultPipeline(dynamicVarRegistry) {
|
|
152
|
+
const steps = [
|
|
153
|
+
new ProfileResolver(),
|
|
154
|
+
new ProcessEnvResolver(),
|
|
155
|
+
new EnvironmentResolver(),
|
|
156
|
+
new CollectionDefaultsResolver(),
|
|
157
|
+
new FolderResolver(),
|
|
158
|
+
new RequestResolver(),
|
|
159
|
+
new ExtractedResolver(),
|
|
160
|
+
new ScriptVarResolver(),
|
|
161
|
+
];
|
|
162
|
+
// Dynamic vars are checked last — they only match $-prefixed refs
|
|
163
|
+
// that no other step resolved, so ordering is safe
|
|
164
|
+
if (dynamicVarRegistry) {
|
|
165
|
+
steps.push(new DynamicVarResolverStep(dynamicVarRegistry));
|
|
166
|
+
}
|
|
167
|
+
return steps;
|
|
168
|
+
}
|
|
169
|
+
// ── Request builder ─────────────────────────────────────────────
|
|
170
|
+
/** Merge headers with precedence: request > folder > environment > collection defaults. */
|
|
171
|
+
function mergeHeaders(...layers) {
|
|
172
|
+
const merged = {};
|
|
173
|
+
for (const layer of layers) {
|
|
174
|
+
if (layer)
|
|
175
|
+
Object.assign(merged, layer);
|
|
176
|
+
}
|
|
177
|
+
return merged;
|
|
178
|
+
}
|
|
179
|
+
/** Resolve auth config into an Authorization header value. */
|
|
180
|
+
function resolveAuth(auth, steps, context) {
|
|
181
|
+
if (!auth || auth.type === "none")
|
|
182
|
+
return null;
|
|
183
|
+
switch (auth.type) {
|
|
184
|
+
case "bearer": {
|
|
185
|
+
const token = auth.token
|
|
186
|
+
? resolveTemplate(auth.token, steps, context)
|
|
187
|
+
: "";
|
|
188
|
+
return { header: "Authorization", value: `Bearer ${token}` };
|
|
189
|
+
}
|
|
190
|
+
case "basic": {
|
|
191
|
+
const user = auth.username
|
|
192
|
+
? resolveTemplate(auth.username, steps, context)
|
|
193
|
+
: "";
|
|
194
|
+
const pass = auth.password
|
|
195
|
+
? resolveTemplate(auth.password, steps, context)
|
|
196
|
+
: "";
|
|
197
|
+
const encoded = Buffer.from(`${user}:${pass}`).toString("base64");
|
|
198
|
+
return { header: "Authorization", value: `Basic ${encoded}` };
|
|
199
|
+
}
|
|
200
|
+
case "api-key": {
|
|
201
|
+
const header = auth.header
|
|
202
|
+
? resolveTemplate(auth.header, steps, context)
|
|
203
|
+
: "X-API-Key";
|
|
204
|
+
const value = auth.value
|
|
205
|
+
? resolveTemplate(auth.value, steps, context)
|
|
206
|
+
: "";
|
|
207
|
+
return { header, value };
|
|
208
|
+
}
|
|
209
|
+
default:
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/** Build a fully resolved request from collection context. */
|
|
214
|
+
export function buildResolvedRequest(opts) {
|
|
215
|
+
const { collection, environment, folder, endpoint, pipeline, extracted, scriptVars } = opts;
|
|
216
|
+
const context = {
|
|
217
|
+
environment,
|
|
218
|
+
collection,
|
|
219
|
+
folder,
|
|
220
|
+
endpoint,
|
|
221
|
+
extracted: extracted ?? {},
|
|
222
|
+
scriptVars: scriptVars ?? {},
|
|
223
|
+
};
|
|
224
|
+
// Merge headers: collection defaults < environment < folder < endpoint
|
|
225
|
+
const rawHeaders = mergeHeaders(collection.defaults?.headers, environment.headers, folder.headers, endpoint.headers);
|
|
226
|
+
// Resolve auth (endpoint > folder > collection defaults)
|
|
227
|
+
const auth = endpoint.auth ?? folder.auth ?? collection.defaults?.auth;
|
|
228
|
+
const authHeader = resolveAuth(auth, pipeline, context);
|
|
229
|
+
if (authHeader && !rawHeaders[authHeader.header]) {
|
|
230
|
+
rawHeaders[authHeader.header] = authHeader.value;
|
|
231
|
+
}
|
|
232
|
+
// Resolve all header values
|
|
233
|
+
const headers = {};
|
|
234
|
+
for (const [k, v] of Object.entries(rawHeaders)) {
|
|
235
|
+
headers[k] = resolveTemplate(v, pipeline, context);
|
|
236
|
+
}
|
|
237
|
+
// Resolve URL
|
|
238
|
+
const path = resolveTemplate(endpoint.path, pipeline, context);
|
|
239
|
+
const url = environment.base_url.replace(/\/+$/, "") + (path.startsWith("/") ? path : `/${path}`);
|
|
240
|
+
// Resolve body
|
|
241
|
+
let body;
|
|
242
|
+
if (endpoint.body !== undefined) {
|
|
243
|
+
const resolved = resolveDeep(endpoint.body, pipeline, context);
|
|
244
|
+
body = typeof resolved === "string" ? resolved : JSON.stringify(resolved);
|
|
245
|
+
}
|
|
246
|
+
// Timeout: endpoint > environment > collection defaults > 30s
|
|
247
|
+
const timeout_ms = endpoint.timeout_ms ??
|
|
248
|
+
environment.timeout_ms ??
|
|
249
|
+
collection.defaults?.timeout_ms ??
|
|
250
|
+
30000;
|
|
251
|
+
return { url, method: endpoint.method.toUpperCase(), headers, body, timeout_ms };
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/collections/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ScriptRunner, Script, ScriptContext, ScriptResult, AssertionTarget } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Declarative script runner.
|
|
4
|
+
* Handles pre_request.set and post_response.extract/set without executing arbitrary code.
|
|
5
|
+
*/
|
|
6
|
+
export declare class DeclarativeScriptRunner implements ScriptRunner {
|
|
7
|
+
runPreRequest(script: Script, context: ScriptContext): ScriptResult;
|
|
8
|
+
runPostResponse(script: Script, response: AssertionTarget, context: ScriptContext): ScriptResult;
|
|
9
|
+
}
|