neuron-inspector 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/collections/__tests__/assertions.test.d.ts +1 -0
  2. package/dist/collections/__tests__/assertions.test.js +203 -0
  3. package/dist/collections/__tests__/assertions.test.js.map +1 -0
  4. package/dist/collections/__tests__/dynamic-vars.test.d.ts +1 -0
  5. package/dist/collections/__tests__/dynamic-vars.test.js +169 -0
  6. package/dist/collections/__tests__/dynamic-vars.test.js.map +1 -0
  7. package/dist/collections/__tests__/execution.test.d.ts +1 -0
  8. package/dist/collections/__tests__/execution.test.js +271 -0
  9. package/dist/collections/__tests__/execution.test.js.map +1 -0
  10. package/dist/collections/__tests__/integration.test.d.ts +1 -0
  11. package/dist/collections/__tests__/integration.test.js +478 -0
  12. package/dist/collections/__tests__/integration.test.js.map +1 -0
  13. package/dist/collections/__tests__/resolver.test.d.ts +1 -0
  14. package/dist/collections/__tests__/resolver.test.js +282 -0
  15. package/dist/collections/__tests__/resolver.test.js.map +1 -0
  16. package/dist/collections/__tests__/scenario.test.d.ts +1 -0
  17. package/dist/collections/__tests__/scenario.test.js +367 -0
  18. package/dist/collections/__tests__/scenario.test.js.map +1 -0
  19. package/dist/collections/__tests__/scripts.test.d.ts +1 -0
  20. package/dist/collections/__tests__/scripts.test.js +245 -0
  21. package/dist/collections/__tests__/scripts.test.js.map +1 -0
  22. package/dist/collections/__tests__/store.test.d.ts +1 -0
  23. package/dist/collections/__tests__/store.test.js +313 -0
  24. package/dist/collections/__tests__/store.test.js.map +1 -0
  25. package/dist/collections/assertions.d.ts +16 -0
  26. package/dist/collections/assertions.js +107 -0
  27. package/dist/collections/assertions.js.map +1 -0
  28. package/dist/collections/dynamic-vars.d.ts +75 -0
  29. package/dist/collections/dynamic-vars.js +187 -0
  30. package/dist/collections/dynamic-vars.js.map +1 -0
  31. package/dist/collections/executor.d.ts +94 -0
  32. package/dist/collections/executor.js +251 -0
  33. package/dist/collections/executor.js.map +1 -0
  34. package/dist/collections/http.d.ts +4 -0
  35. package/dist/collections/http.js +84 -0
  36. package/dist/collections/http.js.map +1 -0
  37. package/dist/collections/index.d.ts +12 -0
  38. package/dist/collections/index.js +27 -0
  39. package/dist/collections/index.js.map +1 -0
  40. package/dist/collections/postman.d.ts +10 -0
  41. package/dist/collections/postman.js +288 -0
  42. package/dist/collections/postman.js.map +1 -0
  43. package/dist/collections/resolver.d.ts +74 -0
  44. package/dist/collections/resolver.js +253 -0
  45. package/dist/collections/resolver.js.map +1 -0
  46. package/dist/collections/scripts.d.ts +9 -0
  47. package/dist/collections/scripts.js +55 -0
  48. package/dist/collections/scripts.js.map +1 -0
  49. package/dist/collections/store.d.ts +40 -0
  50. package/dist/collections/store.js +356 -0
  51. package/dist/collections/store.js.map +1 -0
  52. package/dist/collections/tools.d.ts +8 -0
  53. package/dist/collections/tools.js +838 -0
  54. package/dist/collections/tools.js.map +1 -0
  55. package/dist/collections/types.d.ts +177 -0
  56. package/dist/collections/types.js +3 -0
  57. package/dist/collections/types.js.map +1 -0
  58. package/dist/server.js +3 -0
  59. package/dist/server.js.map +1 -1
  60. package/package.json +2 -2
@@ -0,0 +1,251 @@
1
+ import { buildResolvedRequest, checkUnresolved } from "./resolver.js";
2
+ import { dotGet } from "./assertions.js";
3
+ // ── Single endpoint execution ───────────────────────────────────
4
+ export async function executeEndpoint(opts) {
5
+ const { collection, environment, folder, endpoint, httpExecutor, pipeline, assertionEvaluator, scriptRunner, extracted } = opts;
6
+ let scriptVars = {};
7
+ // Run pre-request script
8
+ if (scriptRunner && endpoint.pre_request) {
9
+ const preResult = scriptRunner.runPreRequest(endpoint.pre_request, {
10
+ variables: { ...(extracted ?? {}) },
11
+ });
12
+ scriptVars = preResult.variables;
13
+ }
14
+ // Build resolved request (includes script-set vars)
15
+ const resolved = buildResolvedRequest({
16
+ collection,
17
+ environment,
18
+ folder,
19
+ endpoint,
20
+ pipeline,
21
+ extracted,
22
+ scriptVars,
23
+ });
24
+ // Check for unresolved variables (skip $-prefixed dynamic vars that returned placeholder text)
25
+ const unresolved = checkUnresolved(resolved);
26
+ if (unresolved.length > 0) {
27
+ return {
28
+ endpoint: { method: endpoint.method, path: endpoint.path, name: endpoint.name },
29
+ request: { url: resolved.url, method: resolved.method },
30
+ response: { status: 0, statusText: "error", headers: {}, body: null, timing: { total_ms: 0, ttfb_ms: 0 } },
31
+ error: `Unresolved variables: ${unresolved.join(", ")}`,
32
+ };
33
+ }
34
+ // Execute HTTP request
35
+ const response = await httpExecutor.execute(resolved);
36
+ // Parse body
37
+ let parsedBody = response.body;
38
+ if (response.body) {
39
+ try {
40
+ parsedBody = JSON.parse(response.body);
41
+ }
42
+ catch {
43
+ // Keep as string
44
+ }
45
+ }
46
+ const target = {
47
+ status: response.status,
48
+ headers: response.headers,
49
+ body: parsedBody,
50
+ timing: response.timing,
51
+ };
52
+ // Run post-response script
53
+ if (scriptRunner && endpoint.post_response) {
54
+ const postResult = scriptRunner.runPostResponse(endpoint.post_response, target, {
55
+ variables: { ...(extracted ?? {}), ...scriptVars },
56
+ });
57
+ Object.assign(scriptVars, postResult.variables);
58
+ }
59
+ // Run assertions
60
+ let assertions;
61
+ if (endpoint.tests?.length) {
62
+ assertions = endpoint.tests.map((t) => assertionEvaluator.evaluate(t, target));
63
+ }
64
+ // Extract variables
65
+ let extractedVars;
66
+ if (endpoint.extract) {
67
+ extractedVars = {};
68
+ for (const [varName, path] of Object.entries(endpoint.extract)) {
69
+ const value = dotGet(parsedBody, path.replace(/^body\./, ""));
70
+ if (value !== undefined && value !== null) {
71
+ extractedVars[varName] = String(value);
72
+ }
73
+ }
74
+ }
75
+ return {
76
+ endpoint: { method: endpoint.method, path: endpoint.path, name: endpoint.name },
77
+ request: { url: resolved.url, method: resolved.method },
78
+ response: {
79
+ status: response.status,
80
+ statusText: response.statusText,
81
+ headers: response.headers,
82
+ body: parsedBody,
83
+ timing: response.timing,
84
+ },
85
+ assertions,
86
+ extracted: {
87
+ ...(extractedVars ?? {}),
88
+ // Script-set variables also carry forward
89
+ ...(Object.keys(scriptVars).length > 0 ? scriptVars : {}),
90
+ },
91
+ error: response.status === 0 ? response.statusText : undefined,
92
+ };
93
+ }
94
+ // ── Folder execution ────────────────────────────────────────────
95
+ export async function executeFolder(opts) {
96
+ const { folderKey, collection, environment, folder, httpExecutor, pipeline, assertionEvaluator, scriptRunner } = opts;
97
+ const extracted = { ...(opts.extracted ?? {}) };
98
+ const results = [];
99
+ let passed = 0;
100
+ let failed = 0;
101
+ let errors = 0;
102
+ for (const endpoint of folder.endpoints ?? []) {
103
+ const result = await executeEndpoint({
104
+ collection,
105
+ environment,
106
+ folder,
107
+ endpoint,
108
+ httpExecutor,
109
+ pipeline,
110
+ assertionEvaluator,
111
+ scriptRunner,
112
+ extracted,
113
+ });
114
+ // Accumulate extracted variables for subsequent endpoints
115
+ if (result.extracted) {
116
+ Object.assign(extracted, result.extracted);
117
+ }
118
+ // Count results
119
+ if (result.error) {
120
+ errors++;
121
+ }
122
+ else if (result.assertions?.some((a) => !a.passed)) {
123
+ failed++;
124
+ }
125
+ else {
126
+ passed++;
127
+ }
128
+ results.push(result);
129
+ // Folder execution continues on failure (unlike scenarios)
130
+ }
131
+ return { folder: folderKey, results, passed, failed, errors };
132
+ }
133
+ // ── Collection execution ────────────────────────────────────────
134
+ export async function executeCollection(opts) {
135
+ const { collectionId, collection, environment, httpExecutor, pipeline, assertionEvaluator, scriptRunner } = opts;
136
+ const folders = [];
137
+ let totalPassed = 0;
138
+ let totalFailed = 0;
139
+ let totalErrors = 0;
140
+ for (const [folderKey, folder] of Object.entries(collection.folders ?? {})) {
141
+ const result = await executeFolder({
142
+ folderKey,
143
+ collection,
144
+ environment,
145
+ folder,
146
+ httpExecutor,
147
+ pipeline,
148
+ assertionEvaluator,
149
+ scriptRunner,
150
+ });
151
+ folders.push(result);
152
+ totalPassed += result.passed;
153
+ totalFailed += result.failed;
154
+ totalErrors += result.errors;
155
+ }
156
+ return {
157
+ collection: collectionId,
158
+ environment: collection.active_environment ?? "unknown",
159
+ folders,
160
+ total_passed: totalPassed,
161
+ total_failed: totalFailed,
162
+ total_errors: totalErrors,
163
+ };
164
+ }
165
+ // ── Scenario execution ──────────────────────────────────────────
166
+ function resolveStepRef(collection, ref) {
167
+ // ref format: "folder/endpoint-name"
168
+ const slashIdx = ref.indexOf("/");
169
+ if (slashIdx < 0)
170
+ return null;
171
+ const folderKey = ref.slice(0, slashIdx);
172
+ const endpointName = ref.slice(slashIdx + 1);
173
+ const folder = collection.folders?.[folderKey];
174
+ if (!folder)
175
+ return null;
176
+ const endpoint = folder.endpoints?.find((ep) => ep.name === endpointName);
177
+ if (!endpoint)
178
+ return null;
179
+ return { folderKey, folder, endpoint };
180
+ }
181
+ export async function executeScenario(opts) {
182
+ const { scenarioKey, steps, collectionId, collection, environment, httpExecutor, pipeline, assertionEvaluator, scriptRunner } = opts;
183
+ const extracted = {};
184
+ const results = [];
185
+ let halted = false;
186
+ let haltedAt;
187
+ for (let i = 0; i < steps.length; i++) {
188
+ const step = steps[i];
189
+ const resolved = resolveStepRef(collection, step.ref);
190
+ if (!resolved) {
191
+ results.push({
192
+ step: i,
193
+ ref: step.ref,
194
+ endpoint: { method: "?", path: "?", name: step.ref },
195
+ request: { url: "", method: "" },
196
+ response: { status: 0, statusText: "error", headers: {}, body: null, timing: { total_ms: 0, ttfb_ms: 0 } },
197
+ error: `Could not resolve step ref '${step.ref}'`,
198
+ });
199
+ halted = true;
200
+ haltedAt = i;
201
+ break;
202
+ }
203
+ // Apply step overrides
204
+ let endpoint = { ...resolved.endpoint };
205
+ if (step.overrides) {
206
+ if (step.overrides.path)
207
+ endpoint.path = step.overrides.path;
208
+ if (step.overrides.headers)
209
+ endpoint = { ...endpoint, headers: { ...endpoint.headers, ...step.overrides.headers } };
210
+ if (step.overrides.body !== undefined)
211
+ endpoint.body = step.overrides.body;
212
+ if (step.overrides.tests)
213
+ endpoint.tests = step.overrides.tests;
214
+ if (step.overrides.variables)
215
+ endpoint.variables = { ...endpoint.variables, ...step.overrides.variables };
216
+ }
217
+ const result = await executeEndpoint({
218
+ collection,
219
+ environment,
220
+ folder: resolved.folder,
221
+ endpoint,
222
+ httpExecutor,
223
+ scriptRunner,
224
+ pipeline,
225
+ assertionEvaluator,
226
+ extracted,
227
+ });
228
+ // Accumulate extracted variables
229
+ if (result.extracted) {
230
+ Object.assign(extracted, result.extracted);
231
+ }
232
+ results.push({ ...result, step: i, ref: step.ref });
233
+ // Check if this step failed (HTTP error or assertion failure)
234
+ const stepFailed = result.error || result.assertions?.some((a) => !a.passed);
235
+ if (stepFailed) {
236
+ halted = true;
237
+ haltedAt = i;
238
+ break;
239
+ }
240
+ }
241
+ return {
242
+ scenario: scenarioKey,
243
+ collection: collectionId,
244
+ environment: collection.active_environment ?? "unknown",
245
+ steps: results,
246
+ passed: !halted,
247
+ halted_at: haltedAt,
248
+ extracted,
249
+ };
250
+ }
251
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/collections/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { HttpExecutor, ResolvedRequest, HttpResponse } from "./types.js";
2
+ export declare class FetchHttpExecutor implements HttpExecutor {
3
+ execute(request: ResolvedRequest): Promise<HttpResponse>;
4
+ }
@@ -0,0 +1,84 @@
1
+ const MAX_BODY_BYTES = 100 * 1024; // 100KB truncation limit
2
+ const MAX_REDIRECTS = 5;
3
+ export class FetchHttpExecutor {
4
+ async execute(request) {
5
+ const controller = new AbortController();
6
+ const timer = setTimeout(() => controller.abort(), request.timeout_ms);
7
+ const startTime = performance.now();
8
+ let ttfbTime = 0;
9
+ try {
10
+ const res = await fetch(request.url, {
11
+ method: request.method,
12
+ headers: request.headers,
13
+ body: request.body ?? undefined,
14
+ signal: controller.signal,
15
+ redirect: "follow",
16
+ // @ts-expect-error -- Node.js fetch supports follow limit
17
+ follow: MAX_REDIRECTS,
18
+ });
19
+ ttfbTime = performance.now() - startTime;
20
+ // Read body with truncation
21
+ let body = null;
22
+ try {
23
+ const raw = await res.text();
24
+ if (raw.length > MAX_BODY_BYTES) {
25
+ body = raw.slice(0, MAX_BODY_BYTES) + `\n...[truncated at ${MAX_BODY_BYTES} bytes]`;
26
+ }
27
+ else {
28
+ body = raw;
29
+ }
30
+ }
31
+ catch {
32
+ body = null;
33
+ }
34
+ const totalTime = performance.now() - startTime;
35
+ // Flatten response headers to Record<string, string>
36
+ const headers = {};
37
+ res.headers.forEach((value, key) => {
38
+ headers[key.toLowerCase()] = value;
39
+ });
40
+ return {
41
+ status: res.status,
42
+ statusText: res.statusText,
43
+ headers,
44
+ body,
45
+ timing: {
46
+ total_ms: Math.round(totalTime),
47
+ ttfb_ms: Math.round(ttfbTime),
48
+ },
49
+ };
50
+ }
51
+ catch (err) {
52
+ const totalTime = performance.now() - startTime;
53
+ clearTimeout(timer);
54
+ if (err instanceof DOMException && err.name === "AbortError") {
55
+ return {
56
+ status: 0,
57
+ statusText: "timeout",
58
+ headers: {},
59
+ body: null,
60
+ timing: {
61
+ total_ms: request.timeout_ms,
62
+ ttfb_ms: 0,
63
+ },
64
+ };
65
+ }
66
+ // Connection refused, DNS failure, TLS errors, etc.
67
+ const message = err instanceof Error ? err.message : String(err);
68
+ return {
69
+ status: 0,
70
+ statusText: "error",
71
+ headers: {},
72
+ body: JSON.stringify({ error: message }),
73
+ timing: {
74
+ total_ms: Math.round(totalTime),
75
+ ttfb_ms: 0,
76
+ },
77
+ };
78
+ }
79
+ finally {
80
+ clearTimeout(timer);
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/collections/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type { CollectionToolDef } from "./tools.js";
2
+ export declare const COLLECTION_TOOLS: import("./tools.js").CollectionToolDef[];
3
+ export declare const handleCollectionTool: (name: string, args: Record<string, unknown>) => Promise<unknown>;
4
+ export type { Collection, CollectionStore, CollectionSummary, Endpoint, Folder, Environment, Scenario, HttpExecutor, ResolverStep, ResolverContext, ResolvedRequest, HttpResponse, AssertionEvaluator, AssertionResult, AssertionTarget, DynamicVarProvider, ScriptRunner, } from "./types.js";
5
+ export { YamlCollectionStore, slugify, generateEndpointName } from "./store.js";
6
+ export { FetchHttpExecutor } from "./http.js";
7
+ export { buildDefaultPipeline, buildResolvedRequest, resolveTemplate, checkUnresolved } from "./resolver.js";
8
+ export { OperatorRegistry, dotGet, extractCheckValue } from "./assertions.js";
9
+ export { buildDefaultRegistry, DynamicVarRegistry } from "./dynamic-vars.js";
10
+ export { DeclarativeScriptRunner } from "./scripts.js";
11
+ export { executeEndpoint, executeFolder, executeCollection, executeScenario } from "./executor.js";
12
+ export { fromPostmanV21, toPostmanV21 } from "./postman.js";
@@ -0,0 +1,27 @@
1
+ import { YamlCollectionStore } from "./store.js";
2
+ import { FetchHttpExecutor } from "./http.js";
3
+ import { buildDefaultPipeline } from "./resolver.js";
4
+ import { OperatorRegistry } from "./assertions.js";
5
+ import { buildDefaultRegistry } from "./dynamic-vars.js";
6
+ import { DeclarativeScriptRunner } from "./scripts.js";
7
+ import { buildCollectionTools, buildCollectionHandler } from "./tools.js";
8
+ // ── Composition root ────────────────────────────────────────────
9
+ // All concrete implementations are wired here.
10
+ // Nothing outside this file imports a concrete class directly.
11
+ const store = new YamlCollectionStore();
12
+ const httpExecutor = new FetchHttpExecutor();
13
+ const dynamicVarRegistry = buildDefaultRegistry();
14
+ const pipeline = buildDefaultPipeline(dynamicVarRegistry);
15
+ const assertionEvaluator = new OperatorRegistry();
16
+ const scriptRunner = new DeclarativeScriptRunner();
17
+ export const COLLECTION_TOOLS = buildCollectionTools();
18
+ export const handleCollectionTool = buildCollectionHandler(store, httpExecutor, pipeline, assertionEvaluator, scriptRunner);
19
+ export { YamlCollectionStore, slugify, generateEndpointName } from "./store.js";
20
+ export { FetchHttpExecutor } from "./http.js";
21
+ export { buildDefaultPipeline, buildResolvedRequest, resolveTemplate, checkUnresolved } from "./resolver.js";
22
+ export { OperatorRegistry, dotGet, extractCheckValue } from "./assertions.js";
23
+ export { buildDefaultRegistry, DynamicVarRegistry } from "./dynamic-vars.js";
24
+ export { DeclarativeScriptRunner } from "./scripts.js";
25
+ export { executeEndpoint, executeFolder, executeCollection, executeScenario } from "./executor.js";
26
+ export { fromPostmanV21, toPostmanV21 } from "./postman.js";
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAI1E,mEAAmE;AACnE,+CAA+C;AAC/C,+DAA+D;AAE/D,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;AACxC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAC7C,MAAM,kBAAkB,GAAG,oBAAoB,EAAE,CAAC;AAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;AAC1D,MAAM,kBAAkB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,uBAAuB,EAAE,CAAC;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,EAAE,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;AAuB5H,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Postman Collection v2.1 ↔ Neuron Collection converter.
3
+ *
4
+ * Two pure functions — no dependencies beyond the Collection types.
5
+ */
6
+ import type { Collection } from "./types.js";
7
+ /** Parse a Postman v2.1 JSON object into a Neuron Collection. */
8
+ export declare function fromPostmanV21(json: unknown): Collection;
9
+ /** Convert a Neuron Collection to Postman v2.1 JSON. */
10
+ export declare function toPostmanV21(collection: Collection, id: string): unknown;