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,55 @@
1
+ import { dotGet } from "./assertions.js";
2
+ /**
3
+ * Declarative script runner.
4
+ * Handles pre_request.set and post_response.extract/set without executing arbitrary code.
5
+ */
6
+ export class DeclarativeScriptRunner {
7
+ runPreRequest(script, context) {
8
+ const variables = { ...context.variables };
9
+ if (script.set) {
10
+ for (const [key, value] of Object.entries(script.set)) {
11
+ // Value may contain {{var}} references that should already be resolved
12
+ // by the pipeline before this point, but we pass through as-is here
13
+ variables[key] = value;
14
+ }
15
+ }
16
+ return { variables };
17
+ }
18
+ runPostResponse(script, response, context) {
19
+ const variables = { ...context.variables };
20
+ // Extract values from response
21
+ if (script.extract) {
22
+ for (const [varName, path] of Object.entries(script.extract)) {
23
+ const value = extractFromResponse(response, path);
24
+ if (value !== undefined && value !== null) {
25
+ variables[varName] = String(value);
26
+ }
27
+ }
28
+ }
29
+ // Set additional variables
30
+ if (script.set) {
31
+ for (const [key, value] of Object.entries(script.set)) {
32
+ variables[key] = value;
33
+ }
34
+ }
35
+ return { variables };
36
+ }
37
+ }
38
+ /** Extract a value from a response using dot notation with body.* prefix handling. */
39
+ function extractFromResponse(response, path) {
40
+ if (path === "status")
41
+ return response.status;
42
+ if (path === "body")
43
+ return response.body;
44
+ if (path.startsWith("body."))
45
+ return dotGet(response.body, path.slice(5));
46
+ if (path.startsWith("header."))
47
+ return response.headers[path.slice(7).toLowerCase()];
48
+ if (path === "timing.total")
49
+ return response.timing.total_ms;
50
+ if (path === "timing.ttfb")
51
+ return response.timing.ttfb_ms;
52
+ // Fallback: treat as body path
53
+ return dotGet(response.body, path);
54
+ }
55
+ //# sourceMappingURL=scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/collections/scripts.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAClC,aAAa,CAAC,MAAc,EAAE,OAAsB;QAClD,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QAC3C,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,uEAAuE;gBACvE,oEAAoE;gBACpE,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAED,eAAe,CAAC,MAAc,EAAE,QAAyB,EAAE,OAAsB;QAC/E,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QAE3C,+BAA+B;QAC/B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7D,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAC1C,SAAS,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;CACF;AAED,sFAAsF;AACtF,SAAS,mBAAmB,CAAC,QAAyB,EAAE,IAAY;IAClE,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAC9C,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACrF,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC7D,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IAC3D,+BAA+B;IAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { Collection, CollectionStore, CollectionSummary, Endpoint } from "./types.js";
2
+ /** Slugify a string: lowercase, replace non-alphanumeric with hyphens, collapse runs, trim. */
3
+ export declare function slugify(input: string): string;
4
+ /** Generate a human-readable name from method + path. */
5
+ export declare function generateEndpointName(method: string, path: string): string;
6
+ export declare class YamlCollectionStore implements CollectionStore {
7
+ private globalDir;
8
+ private projectDir;
9
+ constructor(globalDir?: string, projectDir?: string);
10
+ private ensureDir;
11
+ private scanDir;
12
+ list(): Promise<CollectionSummary[]>;
13
+ resolve(id: string): Promise<{
14
+ path: string;
15
+ location: "global" | "project";
16
+ } | null>;
17
+ get(id: string): Promise<{
18
+ collection: Collection;
19
+ summary: CollectionSummary;
20
+ } | null>;
21
+ save(id: string, collection: Collection, location?: "global" | "project"): Promise<string>;
22
+ delete(id: string): Promise<boolean>;
23
+ upsertEndpoint(id: string, folderName: string, endpoint: Partial<Endpoint> & {
24
+ method: string;
25
+ path: string;
26
+ }): Promise<{
27
+ action: "created" | "updated";
28
+ collection: Collection;
29
+ }>;
30
+ removeEndpoint(id: string, folderName: string, method: string, path: string): Promise<Collection>;
31
+ moveEndpoint(id: string, fromFolder: string, toFolder: string, method: string, path: string): Promise<Collection>;
32
+ setEnvironment(id: string, envName: string, env: {
33
+ base_url: string;
34
+ variables?: Record<string, string>;
35
+ headers?: Record<string, string>;
36
+ timeout_ms?: number;
37
+ }): Promise<Collection>;
38
+ removeEnvironment(id: string, envName: string): Promise<Collection>;
39
+ switchEnvironment(id: string, envName: string): Promise<Collection>;
40
+ }
@@ -0,0 +1,356 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ import { readFile, writeFile, mkdir, readdir, unlink } from "node:fs/promises";
4
+ import { existsSync } from "node:fs";
5
+ import * as YAML from "yaml";
6
+ // ── Helpers ─────────────────────────────────────────────────────
7
+ /** Slugify a string: lowercase, replace non-alphanumeric with hyphens, collapse runs, trim. */
8
+ export function slugify(input) {
9
+ return input
10
+ .toLowerCase()
11
+ .replace(/[^a-z0-9]+/g, "-")
12
+ .replace(/^-+|-+$/g, "");
13
+ }
14
+ /** Count all endpoints across all folders in a collection. */
15
+ function countEndpoints(c) {
16
+ if (!c.folders)
17
+ return 0;
18
+ return Object.values(c.folders).reduce((sum, f) => sum + (f.endpoints?.length ?? 0), 0);
19
+ }
20
+ /** Generate a human-readable name from method + path. */
21
+ export function generateEndpointName(method, path) {
22
+ // Strip variable placeholders and leading/trailing slashes
23
+ const clean = path
24
+ .replace(/\{\{[^}]+\}\}/g, "")
25
+ .replace(/^\/+|\/+$/g, "");
26
+ // Take the last meaningful segment
27
+ const segments = clean.split("/").filter(Boolean);
28
+ const last = segments[segments.length - 1] ?? "root";
29
+ // Title-case method + last segment
30
+ const title = last.replace(/[-_]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
31
+ const methodTitle = method.charAt(0).toUpperCase() + method.slice(1).toLowerCase();
32
+ return `${methodTitle} ${title}`.trim();
33
+ }
34
+ /** Validate that an object looks like a Collection. Returns an error message or null. */
35
+ function validateCollection(obj) {
36
+ if (typeof obj !== "object" || obj === null)
37
+ return "Collection must be an object";
38
+ const c = obj;
39
+ if (typeof c.name !== "string" || !c.name)
40
+ return "Collection must have a non-empty 'name' string";
41
+ if (c.folders !== undefined) {
42
+ if (typeof c.folders !== "object" || c.folders === null)
43
+ return "'folders' must be an object";
44
+ for (const [key, folder] of Object.entries(c.folders)) {
45
+ if (typeof folder !== "object" || folder === null)
46
+ return `Folder '${key}' must be an object`;
47
+ const f = folder;
48
+ if (f.endpoints !== undefined && !Array.isArray(f.endpoints)) {
49
+ return `Folder '${key}' endpoints must be an array`;
50
+ }
51
+ if (Array.isArray(f.endpoints)) {
52
+ for (let i = 0; i < f.endpoints.length; i++) {
53
+ const ep = f.endpoints[i];
54
+ if (typeof ep !== "object" || ep === null)
55
+ return `Folder '${key}' endpoint[${i}] must be an object`;
56
+ if (typeof ep.method !== "string")
57
+ return `Folder '${key}' endpoint[${i}] must have a 'method' string`;
58
+ if (typeof ep.path !== "string")
59
+ return `Folder '${key}' endpoint[${i}] must have a 'path' string`;
60
+ }
61
+ }
62
+ }
63
+ }
64
+ if (c.environments !== undefined) {
65
+ if (typeof c.environments !== "object" || c.environments === null)
66
+ return "'environments' must be an object";
67
+ for (const [key, env] of Object.entries(c.environments)) {
68
+ if (typeof env !== "object" || env === null)
69
+ return `Environment '${key}' must be an object`;
70
+ const e = env;
71
+ if (typeof e.base_url !== "string")
72
+ return `Environment '${key}' must have a 'base_url' string`;
73
+ }
74
+ }
75
+ if (c.scenarios !== undefined) {
76
+ if (typeof c.scenarios !== "object" || c.scenarios === null)
77
+ return "'scenarios' must be an object";
78
+ for (const [key, scenario] of Object.entries(c.scenarios)) {
79
+ if (typeof scenario !== "object" || scenario === null)
80
+ return `Scenario '${key}' must be an object`;
81
+ const s = scenario;
82
+ if (!Array.isArray(s.steps))
83
+ return `Scenario '${key}' must have a 'steps' array`;
84
+ }
85
+ }
86
+ return null;
87
+ }
88
+ // ── YamlCollectionStore ─────────────────────────────────────────
89
+ export class YamlCollectionStore {
90
+ globalDir;
91
+ projectDir;
92
+ constructor(globalDir, projectDir) {
93
+ this.globalDir = globalDir ?? join(homedir(), ".neuron", "collections");
94
+ this.projectDir = projectDir ?? join(process.cwd(), ".neuron", "collections");
95
+ }
96
+ async ensureDir(dir) {
97
+ if (!existsSync(dir)) {
98
+ await mkdir(dir, { recursive: true });
99
+ }
100
+ }
101
+ async scanDir(dir, location) {
102
+ if (!existsSync(dir))
103
+ return [];
104
+ const files = await readdir(dir);
105
+ const results = [];
106
+ for (const file of files) {
107
+ if (!file.endsWith(".yaml") && !file.endsWith(".yml"))
108
+ continue;
109
+ const id = file.replace(/\.(yaml|yml)$/, "");
110
+ const path = join(dir, file);
111
+ try {
112
+ const content = await readFile(path, "utf-8");
113
+ const c = YAML.parse(content);
114
+ if (!c || typeof c.name !== "string")
115
+ continue;
116
+ results.push({
117
+ id,
118
+ name: c.name,
119
+ location,
120
+ path,
121
+ folder_count: c.folders ? Object.keys(c.folders).length : 0,
122
+ endpoint_count: countEndpoints(c),
123
+ environment_count: c.environments ? Object.keys(c.environments).length : 0,
124
+ scenario_count: c.scenarios ? Object.keys(c.scenarios).length : 0,
125
+ });
126
+ }
127
+ catch {
128
+ // Skip files that can't be parsed
129
+ }
130
+ }
131
+ return results;
132
+ }
133
+ async list() {
134
+ const [global, project] = await Promise.all([
135
+ this.scanDir(this.globalDir, "global"),
136
+ this.scanDir(this.projectDir, "project"),
137
+ ]);
138
+ // Project-local wins on name collision
139
+ const seen = new Set();
140
+ const merged = [];
141
+ for (const s of project) {
142
+ seen.add(s.id);
143
+ merged.push(s);
144
+ }
145
+ for (const s of global) {
146
+ if (!seen.has(s.id))
147
+ merged.push(s);
148
+ }
149
+ return merged;
150
+ }
151
+ async resolve(id) {
152
+ // Project-local first
153
+ for (const ext of [".yaml", ".yml"]) {
154
+ const projectPath = join(this.projectDir, `${id}${ext}`);
155
+ if (existsSync(projectPath))
156
+ return { path: projectPath, location: "project" };
157
+ }
158
+ for (const ext of [".yaml", ".yml"]) {
159
+ const globalPath = join(this.globalDir, `${id}${ext}`);
160
+ if (existsSync(globalPath))
161
+ return { path: globalPath, location: "global" };
162
+ }
163
+ return null;
164
+ }
165
+ async get(id) {
166
+ const resolved = await this.resolve(id);
167
+ if (!resolved)
168
+ return null;
169
+ const content = await readFile(resolved.path, "utf-8");
170
+ let parsed;
171
+ try {
172
+ parsed = YAML.parse(content);
173
+ }
174
+ catch (e) {
175
+ const msg = e instanceof Error ? e.message : String(e);
176
+ throw new Error(`Failed to parse collection '${id}': ${msg}`);
177
+ }
178
+ const err = validateCollection(parsed);
179
+ if (err)
180
+ throw new Error(`Invalid collection '${id}': ${err}`);
181
+ const c = parsed;
182
+ return {
183
+ collection: c,
184
+ summary: {
185
+ id,
186
+ name: c.name,
187
+ location: resolved.location,
188
+ path: resolved.path,
189
+ folder_count: c.folders ? Object.keys(c.folders).length : 0,
190
+ endpoint_count: countEndpoints(c),
191
+ environment_count: c.environments ? Object.keys(c.environments).length : 0,
192
+ scenario_count: c.scenarios ? Object.keys(c.scenarios).length : 0,
193
+ },
194
+ };
195
+ }
196
+ async save(id, collection, location = "global") {
197
+ const err = validateCollection(collection);
198
+ if (err)
199
+ throw new Error(`Cannot save collection '${id}': ${err}`);
200
+ const dir = location === "project" ? this.projectDir : this.globalDir;
201
+ await this.ensureDir(dir);
202
+ const filePath = join(dir, `${id}.yaml`);
203
+ const content = YAML.stringify(collection, { lineWidth: 120 });
204
+ await writeFile(filePath, content, "utf-8");
205
+ return filePath;
206
+ }
207
+ async delete(id) {
208
+ const resolved = await this.resolve(id);
209
+ if (!resolved)
210
+ return false;
211
+ await unlink(resolved.path);
212
+ return true;
213
+ }
214
+ // ── Endpoint operations ─────────────────────────────────────
215
+ async upsertEndpoint(id, folderName, endpoint) {
216
+ const result = await this.get(id);
217
+ if (!result)
218
+ throw new Error(`Collection '${id}' not found`);
219
+ const { collection } = result;
220
+ const folderKey = slugify(folderName);
221
+ if (!collection.folders)
222
+ collection.folders = {};
223
+ if (!collection.folders[folderKey]) {
224
+ collection.folders[folderKey] = { endpoints: [] };
225
+ }
226
+ const folder = collection.folders[folderKey];
227
+ if (!folder.endpoints)
228
+ folder.endpoints = [];
229
+ const method = endpoint.method.toUpperCase();
230
+ const idx = folder.endpoints.findIndex((ep) => ep.method.toUpperCase() === method && ep.path === endpoint.path);
231
+ const full = {
232
+ name: endpoint.name ?? generateEndpointName(method, endpoint.path),
233
+ method,
234
+ path: endpoint.path,
235
+ ...(endpoint.description !== undefined && { description: endpoint.description }),
236
+ ...(endpoint.headers !== undefined && { headers: endpoint.headers }),
237
+ ...(endpoint.body !== undefined && { body: endpoint.body }),
238
+ ...(endpoint.variables !== undefined && { variables: endpoint.variables }),
239
+ ...(endpoint.tests !== undefined && { tests: endpoint.tests }),
240
+ ...(endpoint.extract !== undefined && { extract: endpoint.extract }),
241
+ ...(endpoint.pre_request !== undefined && { pre_request: endpoint.pre_request }),
242
+ ...(endpoint.post_response !== undefined && { post_response: endpoint.post_response }),
243
+ ...(endpoint.tags !== undefined && { tags: endpoint.tags }),
244
+ ...(endpoint.timeout_ms !== undefined && { timeout_ms: endpoint.timeout_ms }),
245
+ };
246
+ let action;
247
+ if (idx >= 0) {
248
+ // Merge: keep existing fields, overlay provided ones
249
+ const existing = folder.endpoints[idx];
250
+ folder.endpoints[idx] = { ...existing, ...full };
251
+ action = "updated";
252
+ }
253
+ else {
254
+ folder.endpoints.push(full);
255
+ action = "created";
256
+ }
257
+ const resolved = await this.resolve(id);
258
+ await this.save(id, collection, resolved?.location ?? "global");
259
+ return { action, collection };
260
+ }
261
+ async removeEndpoint(id, folderName, method, path) {
262
+ const result = await this.get(id);
263
+ if (!result)
264
+ throw new Error(`Collection '${id}' not found`);
265
+ const { collection } = result;
266
+ const folderKey = slugify(folderName);
267
+ const folder = collection.folders?.[folderKey];
268
+ if (!folder?.endpoints)
269
+ throw new Error(`Folder '${folderName}' not found in collection '${id}'`);
270
+ const upperMethod = method.toUpperCase();
271
+ const idx = folder.endpoints.findIndex((ep) => ep.method.toUpperCase() === upperMethod && ep.path === path);
272
+ if (idx < 0) {
273
+ throw new Error(`Endpoint ${method} ${path} not found in folder '${folderName}'`);
274
+ }
275
+ folder.endpoints.splice(idx, 1);
276
+ const resolved = await this.resolve(id);
277
+ await this.save(id, collection, resolved?.location ?? "global");
278
+ return collection;
279
+ }
280
+ async moveEndpoint(id, fromFolder, toFolder, method, path) {
281
+ const result = await this.get(id);
282
+ if (!result)
283
+ throw new Error(`Collection '${id}' not found`);
284
+ const { collection } = result;
285
+ const fromKey = slugify(fromFolder);
286
+ const toKey = slugify(toFolder);
287
+ const srcFolder = collection.folders?.[fromKey];
288
+ if (!srcFolder?.endpoints) {
289
+ throw new Error(`Source folder '${fromFolder}' not found in collection '${id}'`);
290
+ }
291
+ const upperMethod = method.toUpperCase();
292
+ const idx = srcFolder.endpoints.findIndex((ep) => ep.method.toUpperCase() === upperMethod && ep.path === path);
293
+ if (idx < 0) {
294
+ throw new Error(`Endpoint ${method} ${path} not found in folder '${fromFolder}'`);
295
+ }
296
+ const [endpoint] = srcFolder.endpoints.splice(idx, 1);
297
+ if (!collection.folders)
298
+ collection.folders = {};
299
+ if (!collection.folders[toKey]) {
300
+ collection.folders[toKey] = { endpoints: [] };
301
+ }
302
+ if (!collection.folders[toKey].endpoints) {
303
+ collection.folders[toKey].endpoints = [];
304
+ }
305
+ collection.folders[toKey].endpoints.push(endpoint);
306
+ const resolved = await this.resolve(id);
307
+ await this.save(id, collection, resolved?.location ?? "global");
308
+ return collection;
309
+ }
310
+ // ── Environment operations ──────────────────────────────────
311
+ async setEnvironment(id, envName, env) {
312
+ const result = await this.get(id);
313
+ if (!result)
314
+ throw new Error(`Collection '${id}' not found`);
315
+ const { collection } = result;
316
+ const envKey = slugify(envName);
317
+ if (!collection.environments)
318
+ collection.environments = {};
319
+ collection.environments[envKey] = env;
320
+ const resolved = await this.resolve(id);
321
+ await this.save(id, collection, resolved?.location ?? "global");
322
+ return collection;
323
+ }
324
+ async removeEnvironment(id, envName) {
325
+ const result = await this.get(id);
326
+ if (!result)
327
+ throw new Error(`Collection '${id}' not found`);
328
+ const { collection } = result;
329
+ const envKey = slugify(envName);
330
+ if (!collection.environments?.[envKey]) {
331
+ throw new Error(`Environment '${envName}' not found in collection '${id}'`);
332
+ }
333
+ delete collection.environments[envKey];
334
+ if (collection.active_environment === envKey) {
335
+ collection.active_environment = undefined;
336
+ }
337
+ const resolved = await this.resolve(id);
338
+ await this.save(id, collection, resolved?.location ?? "global");
339
+ return collection;
340
+ }
341
+ async switchEnvironment(id, envName) {
342
+ const result = await this.get(id);
343
+ if (!result)
344
+ throw new Error(`Collection '${id}' not found`);
345
+ const { collection } = result;
346
+ const envKey = slugify(envName);
347
+ if (!collection.environments?.[envKey]) {
348
+ throw new Error(`Environment '${envName}' not found in collection '${id}'`);
349
+ }
350
+ collection.active_environment = envKey;
351
+ const resolved = await this.resolve(id);
352
+ await this.save(id, collection, resolved?.location ?? "global");
353
+ return collection;
354
+ }
355
+ }
356
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/collections/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CollectionStore, HttpExecutor, ResolverStep, AssertionEvaluator, ScriptRunner } from "./types.js";
2
+ export interface CollectionToolDef {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: Record<string, unknown>;
6
+ }
7
+ export declare function buildCollectionTools(): CollectionToolDef[];
8
+ export declare function buildCollectionHandler(store: CollectionStore, httpExecutor?: HttpExecutor, pipeline?: ResolverStep[], assertionEvaluator?: AssertionEvaluator, scriptRunner?: ScriptRunner): (name: string, args: Record<string, unknown>) => Promise<unknown>;