neuron-inspector 1.0.0 → 1.2.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/README.md +31 -8
- package/dist/collections/__tests__/merge.test.d.ts +1 -0
- package/dist/collections/__tests__/merge.test.js +411 -0
- package/dist/collections/__tests__/merge.test.js.map +1 -0
- package/dist/collections/index.d.ts +2 -0
- package/dist/collections/index.js +1 -0
- package/dist/collections/index.js.map +1 -1
- package/dist/collections/merge.d.ts +21 -0
- package/dist/collections/merge.js +220 -0
- package/dist/collections/merge.js.map +1 -0
- package/dist/collections/tools.js +73 -0
- package/dist/collections/tools.js.map +1 -1
- package/dist/monitor.d.ts +45 -4
- package/dist/monitor.js +138 -35
- package/dist/monitor.js.map +1 -1
- package/dist/server.js +140 -6
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -102,7 +102,7 @@ Each bridge logs its data directory on startup so you can confirm isolation:
|
|
|
102
102
|
|
|
103
103
|
```
|
|
104
104
|
[bridge] Data directory: /Users/you/.neuron/letschop
|
|
105
|
-
[bridge] Primary mode — WebSocket server on 127.0.0.1:7378
|
|
105
|
+
[bridge] Primary mode — HTTP + WebSocket server on 127.0.0.1:7378
|
|
106
106
|
```
|
|
107
107
|
|
|
108
108
|
Data layout:
|
|
@@ -157,13 +157,21 @@ The agent calls `neuron_perf_snapshot` and gets back Core Web Vitals, render-blo
|
|
|
157
157
|
|
|
158
158
|
### Monitor and track
|
|
159
159
|
|
|
160
|
-
> "
|
|
160
|
+
> "Alert me when a 500 hits /api/orders"
|
|
161
161
|
|
|
162
|
-
`
|
|
162
|
+
`neuron_monitor_create` with `request_match` condition — watches the ring buffers for HTTP requests matching a URL pattern and status range. No tab opened.
|
|
163
163
|
|
|
164
|
-
> "
|
|
164
|
+
> "Alert when a console error matching PaymentFailed appears"
|
|
165
165
|
|
|
166
|
-
`
|
|
166
|
+
`neuron_monitor_create` with `console_match` condition — watches console logs for matching messages. No tab opened.
|
|
167
|
+
|
|
168
|
+
> "Trigger actions from a Google Sheet edit"
|
|
169
|
+
|
|
170
|
+
Every monitor gets a webhook URL. Apps Script calls `POST http://127.0.0.1:7377/hooks/:monitorId` with a JSON payload and the monitor's action chain executes.
|
|
171
|
+
|
|
172
|
+
> "Watch this page for price drops and auto-screenshot when it triggers"
|
|
173
|
+
|
|
174
|
+
`neuron_monitor_create` with `price_below` condition and a `screenshot` action. The monitor opens the page, checks the price, and runs the action chain if triggered.
|
|
167
175
|
|
|
168
176
|
> "Track who mentions our brand across platforms"
|
|
169
177
|
|
|
@@ -411,7 +419,7 @@ Manage and run recipe workflows — purpose-built agents that get better with ev
|
|
|
411
419
|
|
|
412
420
|
| Tool | What it does |
|
|
413
421
|
|------|-------------|
|
|
414
|
-
| `neuron_monitor_create` | Create a page
|
|
422
|
+
| `neuron_monitor_create` | Create a monitor (page, traffic, or console). Returns a webhook URL for external triggers |
|
|
415
423
|
| `neuron_monitor_list` | List all monitors |
|
|
416
424
|
| `neuron_monitor_get` | Get monitor details |
|
|
417
425
|
| `neuron_monitor_update` | Update monitor config |
|
|
@@ -420,6 +428,21 @@ Manage and run recipe workflows — purpose-built agents that get better with ev
|
|
|
420
428
|
| `neuron_monitor_check` | Force an immediate check |
|
|
421
429
|
| `neuron_monitor_alerts` | Get recent alerts |
|
|
422
430
|
|
|
431
|
+
**Condition types:**
|
|
432
|
+
|
|
433
|
+
| Type | What it watches | Needs a tab? |
|
|
434
|
+
|------|----------------|--------------|
|
|
435
|
+
| `content_change` | Any change in page content | Yes |
|
|
436
|
+
| `text_appears` | Specific text appears on page | Yes |
|
|
437
|
+
| `text_disappears` | Specific text disappears from page | Yes |
|
|
438
|
+
| `price_below` | Price drops below a threshold | Yes |
|
|
439
|
+
| `new_items` | New items in a list/feed | Yes |
|
|
440
|
+
| `selector_change` | Specific CSS selector content changes | Yes |
|
|
441
|
+
| `request_match` | HTTP requests matching URL pattern, method, status range | No — queries ring buffers |
|
|
442
|
+
| `console_match` | Console messages matching search text and log levels | No — queries ring buffers |
|
|
443
|
+
|
|
444
|
+
**Inbound webhook:** Every monitor exposes `POST /hooks/:monitorId` on the bridge's HTTP server. External systems (Google Sheets Apps Script, n8n, Zapier, cron jobs) can POST to this endpoint to trigger the monitor's action chain. The webhook URL is returned on creation and shown in the UI.
|
|
445
|
+
|
|
423
446
|
### Control Tools (4 tools)
|
|
424
447
|
|
|
425
448
|
| Tool | What it does |
|
|
@@ -537,14 +560,14 @@ npx tsc --noEmit
|
|
|
537
560
|
|
|
538
561
|
| File | Purpose |
|
|
539
562
|
|------|---------|
|
|
540
|
-
| `server.ts` | MCP server, WebSocket bridge, tool registration |
|
|
563
|
+
| `server.ts` | MCP server, HTTP + WebSocket bridge, webhook handler, tool registration |
|
|
541
564
|
| `tools.ts` | Browser primitive definitions + name mapping |
|
|
542
565
|
| `compound-tools.ts` | Compound tools (research, search, fill, audit, media) |
|
|
543
566
|
| `business-tools.ts` | 29 business intelligence and developer tools |
|
|
544
567
|
| `recipe-tools.ts` | Recipe management + rules + profile |
|
|
545
568
|
| `scheduler.ts` | Cron-like recipe scheduling |
|
|
546
569
|
| `session-state.ts` | Session state persistence |
|
|
547
|
-
| `monitor.ts` | Page monitoring with alerts |
|
|
570
|
+
| `monitor.ts` | Page, traffic, and console monitoring with alerts and action chains |
|
|
548
571
|
| `killswitch.ts` | Emergency stop, pause, resume |
|
|
549
572
|
| `resilience.ts` | Retry, wait, health check helpers |
|
|
550
573
|
| `correlation.ts` | WebSocket request/response correlation |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { mergeCollections } from "../merge.js";
|
|
3
|
+
function makeCollection(overrides = {}) {
|
|
4
|
+
return { name: "Base", ...overrides };
|
|
5
|
+
}
|
|
6
|
+
// ── Additive merge (no overlap) ──────────────────────────────────
|
|
7
|
+
describe("additive merge (no overlap)", () => {
|
|
8
|
+
it("adds new folders from incoming", () => {
|
|
9
|
+
const base = makeCollection({
|
|
10
|
+
folders: {
|
|
11
|
+
auth: { endpoints: [{ name: "Login", method: "POST", path: "/login" }] },
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
const incoming = makeCollection({
|
|
15
|
+
name: "Incoming",
|
|
16
|
+
folders: {
|
|
17
|
+
orders: { endpoints: [{ name: "List Orders", method: "GET", path: "/orders" }] },
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
const result = mergeCollections(base, incoming);
|
|
21
|
+
expect(result.collection.folders).toHaveProperty("auth");
|
|
22
|
+
expect(result.collection.folders).toHaveProperty("orders");
|
|
23
|
+
expect(result.stats.folders_added).toBe(1);
|
|
24
|
+
expect(result.stats.endpoints_added).toBe(1);
|
|
25
|
+
expect(result.stats.endpoints_updated).toBe(0);
|
|
26
|
+
});
|
|
27
|
+
it("adds new environments from incoming", () => {
|
|
28
|
+
const base = makeCollection({
|
|
29
|
+
environments: { dev: { base_url: "http://localhost:3000" } },
|
|
30
|
+
});
|
|
31
|
+
const incoming = makeCollection({
|
|
32
|
+
name: "Incoming",
|
|
33
|
+
environments: { staging: { base_url: "https://staging.example.com" } },
|
|
34
|
+
});
|
|
35
|
+
const result = mergeCollections(base, incoming);
|
|
36
|
+
expect(result.collection.environments).toHaveProperty("dev");
|
|
37
|
+
expect(result.collection.environments).toHaveProperty("staging");
|
|
38
|
+
expect(result.stats.environments_added).toBe(1);
|
|
39
|
+
});
|
|
40
|
+
it("adds new scenarios from incoming", () => {
|
|
41
|
+
const base = makeCollection({
|
|
42
|
+
scenarios: {
|
|
43
|
+
login: { steps: [{ ref: "auth/POST /login" }] },
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
const incoming = makeCollection({
|
|
47
|
+
name: "Incoming",
|
|
48
|
+
scenarios: {
|
|
49
|
+
checkout: { steps: [{ ref: "orders/POST /checkout" }] },
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
const result = mergeCollections(base, incoming);
|
|
53
|
+
expect(result.collection.scenarios).toHaveProperty("login");
|
|
54
|
+
expect(result.collection.scenarios).toHaveProperty("checkout");
|
|
55
|
+
expect(result.stats.scenarios_added).toBe(1);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
// ── Endpoint conflict ────────────────────────────────────────────
|
|
59
|
+
describe("endpoint conflict (same method+path)", () => {
|
|
60
|
+
it("replaces endpoint with incoming version when method+path match", () => {
|
|
61
|
+
const base = makeCollection({
|
|
62
|
+
folders: {
|
|
63
|
+
auth: {
|
|
64
|
+
endpoints: [
|
|
65
|
+
{ name: "Login", method: "POST", path: "/login", body: { email: "old" } },
|
|
66
|
+
{ name: "Me", method: "GET", path: "/me" },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
const incoming = makeCollection({
|
|
72
|
+
name: "Incoming",
|
|
73
|
+
folders: {
|
|
74
|
+
auth: {
|
|
75
|
+
endpoints: [
|
|
76
|
+
{ name: "Login V2", method: "POST", path: "/login", body: { email: "new", mfa: true } },
|
|
77
|
+
{ name: "Register", method: "POST", path: "/register" },
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
const result = mergeCollections(base, incoming);
|
|
83
|
+
const authEndpoints = result.collection.folders.auth.endpoints;
|
|
84
|
+
expect(authEndpoints).toHaveLength(3);
|
|
85
|
+
const loginEp = authEndpoints.find((ep) => ep.method === "POST" && ep.path === "/login");
|
|
86
|
+
expect(loginEp.name).toBe("Login V2");
|
|
87
|
+
expect(loginEp.body).toEqual({ email: "new", mfa: true });
|
|
88
|
+
expect(result.stats.endpoints_updated).toBe(1);
|
|
89
|
+
expect(result.stats.endpoints_added).toBe(1);
|
|
90
|
+
});
|
|
91
|
+
it("matches endpoints case-insensitively on method", () => {
|
|
92
|
+
const base = makeCollection({
|
|
93
|
+
folders: {
|
|
94
|
+
api: { endpoints: [{ name: "Get Items", method: "get", path: "/items" }] },
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
const incoming = makeCollection({
|
|
98
|
+
name: "Incoming",
|
|
99
|
+
folders: {
|
|
100
|
+
api: { endpoints: [{ name: "Get Items V2", method: "GET", path: "/items" }] },
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
const result = mergeCollections(base, incoming);
|
|
104
|
+
expect(result.collection.folders.api.endpoints).toHaveLength(1);
|
|
105
|
+
expect(result.collection.folders.api.endpoints[0].name).toBe("Get Items V2");
|
|
106
|
+
expect(result.stats.endpoints_updated).toBe(1);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
// ── Environment deep merge ───────────────────────────────────────
|
|
110
|
+
describe("environment deep merge", () => {
|
|
111
|
+
it("deep-merges variables and headers within existing environments", () => {
|
|
112
|
+
const base = makeCollection({
|
|
113
|
+
environments: {
|
|
114
|
+
dev: {
|
|
115
|
+
base_url: "http://localhost:3000",
|
|
116
|
+
variables: { api_key: "base-key", debug: "true" },
|
|
117
|
+
headers: { "X-Custom": "base-value" },
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
const incoming = makeCollection({
|
|
122
|
+
name: "Incoming",
|
|
123
|
+
environments: {
|
|
124
|
+
dev: {
|
|
125
|
+
base_url: "http://incoming:4000",
|
|
126
|
+
variables: { api_key: "incoming-key", version: "2" },
|
|
127
|
+
headers: { "X-New": "new-value" },
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
const result = mergeCollections(base, incoming);
|
|
132
|
+
const dev = result.collection.environments.dev;
|
|
133
|
+
// base_url: base keeps its own (it already has one)
|
|
134
|
+
expect(dev.base_url).toBe("http://localhost:3000");
|
|
135
|
+
// variables deep-merged, incoming wins on conflict
|
|
136
|
+
expect(dev.variables).toEqual({ api_key: "incoming-key", debug: "true", version: "2" });
|
|
137
|
+
// headers deep-merged
|
|
138
|
+
expect(dev.headers).toEqual({ "X-Custom": "base-value", "X-New": "new-value" });
|
|
139
|
+
expect(result.stats.environments_updated).toBe(1);
|
|
140
|
+
});
|
|
141
|
+
it("takes base_url from incoming when base env has none", () => {
|
|
142
|
+
const base = makeCollection({
|
|
143
|
+
environments: {
|
|
144
|
+
dev: { base_url: "" },
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
const incoming = makeCollection({
|
|
148
|
+
name: "Incoming",
|
|
149
|
+
environments: {
|
|
150
|
+
dev: { base_url: "http://incoming:4000" },
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
const result = mergeCollections(base, incoming);
|
|
154
|
+
// Empty string is falsy, so incoming wins
|
|
155
|
+
expect(result.collection.environments.dev.base_url).toBe("http://incoming:4000");
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
// ── Scenario skip ────────────────────────────────────────────────
|
|
159
|
+
describe("scenario merge", () => {
|
|
160
|
+
it("keeps base scenario when names conflict", () => {
|
|
161
|
+
const base = makeCollection({
|
|
162
|
+
scenarios: {
|
|
163
|
+
login: { steps: [{ ref: "auth/POST /login" }] },
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
const incoming = makeCollection({
|
|
167
|
+
name: "Incoming",
|
|
168
|
+
scenarios: {
|
|
169
|
+
login: { steps: [{ ref: "auth/POST /login" }, { ref: "auth/GET /me" }] },
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
const result = mergeCollections(base, incoming);
|
|
173
|
+
// Base scenario kept (1 step, not 2)
|
|
174
|
+
expect(result.collection.scenarios.login.steps).toHaveLength(1);
|
|
175
|
+
expect(result.stats.scenarios_skipped).toBe(1);
|
|
176
|
+
expect(result.stats.scenarios_added).toBe(0);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
// ── Defaults deep merge ─────────────────────────────────────────
|
|
180
|
+
describe("defaults merge", () => {
|
|
181
|
+
it("deep-merges headers and variables, keeps base scalars", () => {
|
|
182
|
+
const base = makeCollection({
|
|
183
|
+
defaults: {
|
|
184
|
+
headers: { Authorization: "Bearer base" },
|
|
185
|
+
variables: { env: "base" },
|
|
186
|
+
timeout_ms: 5000,
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
const incoming = makeCollection({
|
|
190
|
+
name: "Incoming",
|
|
191
|
+
defaults: {
|
|
192
|
+
headers: { "X-New": "header", Authorization: "Bearer incoming" },
|
|
193
|
+
variables: { region: "us" },
|
|
194
|
+
timeout_ms: 10000,
|
|
195
|
+
auth: { type: "bearer", token: "tok" },
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
const result = mergeCollections(base, incoming);
|
|
199
|
+
const defaults = result.collection.defaults;
|
|
200
|
+
// Headers deep-merged, incoming wins per key
|
|
201
|
+
expect(defaults.headers).toEqual({ Authorization: "Bearer incoming", "X-New": "header" });
|
|
202
|
+
// Variables deep-merged
|
|
203
|
+
expect(defaults.variables).toEqual({ env: "base", region: "us" });
|
|
204
|
+
// Scalar: base keeps its timeout
|
|
205
|
+
expect(defaults.timeout_ms).toBe(5000);
|
|
206
|
+
// Auth: base had none, so take incoming
|
|
207
|
+
expect(defaults.auth).toEqual({ type: "bearer", token: "tok" });
|
|
208
|
+
});
|
|
209
|
+
it("takes incoming defaults wholesale when base has none", () => {
|
|
210
|
+
const base = makeCollection({});
|
|
211
|
+
const incoming = makeCollection({
|
|
212
|
+
name: "Incoming",
|
|
213
|
+
defaults: {
|
|
214
|
+
headers: { "X-Test": "val" },
|
|
215
|
+
timeout_ms: 3000,
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
const result = mergeCollections(base, incoming);
|
|
219
|
+
expect(result.collection.defaults).toEqual({ headers: { "X-Test": "val" }, timeout_ms: 3000 });
|
|
220
|
+
});
|
|
221
|
+
it("returns base defaults unchanged when incoming has none", () => {
|
|
222
|
+
const base = makeCollection({
|
|
223
|
+
defaults: { timeout_ms: 5000 },
|
|
224
|
+
});
|
|
225
|
+
const incoming = makeCollection({ name: "Incoming" });
|
|
226
|
+
const result = mergeCollections(base, incoming);
|
|
227
|
+
expect(result.collection.defaults).toEqual({ timeout_ms: 5000 });
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
// ── Stats accuracy ──────────────────────────────────────────────
|
|
231
|
+
describe("stats accuracy", () => {
|
|
232
|
+
it("counts all operations correctly in a mixed merge", () => {
|
|
233
|
+
const base = makeCollection({
|
|
234
|
+
folders: {
|
|
235
|
+
auth: {
|
|
236
|
+
endpoints: [
|
|
237
|
+
{ name: "Login", method: "POST", path: "/login" },
|
|
238
|
+
{ name: "Me", method: "GET", path: "/me" },
|
|
239
|
+
],
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
environments: { dev: { base_url: "http://localhost" } },
|
|
243
|
+
scenarios: { "login-flow": { steps: [{ ref: "auth/POST /login" }] } },
|
|
244
|
+
});
|
|
245
|
+
const incoming = makeCollection({
|
|
246
|
+
name: "Incoming",
|
|
247
|
+
folders: {
|
|
248
|
+
auth: {
|
|
249
|
+
endpoints: [
|
|
250
|
+
{ name: "Login New", method: "POST", path: "/login" },
|
|
251
|
+
{ name: "Register", method: "POST", path: "/register" },
|
|
252
|
+
],
|
|
253
|
+
},
|
|
254
|
+
orders: {
|
|
255
|
+
endpoints: [{ name: "List", method: "GET", path: "/orders" }],
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
environments: {
|
|
259
|
+
dev: { base_url: "http://incoming", variables: { key: "val" } },
|
|
260
|
+
staging: { base_url: "https://staging.example.com" },
|
|
261
|
+
},
|
|
262
|
+
scenarios: {
|
|
263
|
+
"login-flow": { steps: [{ ref: "auth/POST /login" }, { ref: "auth/GET /me" }] },
|
|
264
|
+
"order-flow": { steps: [{ ref: "orders/GET /orders" }] },
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
const result = mergeCollections(base, incoming);
|
|
268
|
+
expect(result.stats).toEqual({
|
|
269
|
+
endpoints_added: 2, // POST /register + GET /orders (from new folder)
|
|
270
|
+
endpoints_updated: 1, // POST /login replaced
|
|
271
|
+
environments_added: 1, // staging
|
|
272
|
+
environments_updated: 1, // dev
|
|
273
|
+
folders_added: 1, // orders
|
|
274
|
+
scenarios_added: 1, // order-flow
|
|
275
|
+
scenarios_skipped: 1, // login-flow kept base
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
// ── Empty collections ───────────────────────────────────────────
|
|
280
|
+
describe("empty collections", () => {
|
|
281
|
+
it("handles merging two empty collections", () => {
|
|
282
|
+
const base = makeCollection({});
|
|
283
|
+
const incoming = makeCollection({ name: "Incoming" });
|
|
284
|
+
const result = mergeCollections(base, incoming);
|
|
285
|
+
expect(result.collection.name).toBe("Base");
|
|
286
|
+
expect(result.stats).toEqual({
|
|
287
|
+
endpoints_added: 0,
|
|
288
|
+
endpoints_updated: 0,
|
|
289
|
+
environments_added: 0,
|
|
290
|
+
environments_updated: 0,
|
|
291
|
+
folders_added: 0,
|
|
292
|
+
scenarios_added: 0,
|
|
293
|
+
scenarios_skipped: 0,
|
|
294
|
+
});
|
|
295
|
+
expect(result.conflicts).toHaveLength(0);
|
|
296
|
+
});
|
|
297
|
+
it("handles merging into empty base from populated incoming", () => {
|
|
298
|
+
const base = makeCollection({});
|
|
299
|
+
const incoming = makeCollection({
|
|
300
|
+
name: "Incoming",
|
|
301
|
+
folders: {
|
|
302
|
+
auth: { endpoints: [{ name: "Login", method: "POST", path: "/login" }] },
|
|
303
|
+
},
|
|
304
|
+
environments: { dev: { base_url: "http://localhost" } },
|
|
305
|
+
scenarios: { flow: { steps: [{ ref: "auth/POST /login" }] } },
|
|
306
|
+
});
|
|
307
|
+
const result = mergeCollections(base, incoming);
|
|
308
|
+
expect(result.collection.name).toBe("Base");
|
|
309
|
+
expect(result.collection.folders).toHaveProperty("auth");
|
|
310
|
+
expect(result.collection.environments).toHaveProperty("dev");
|
|
311
|
+
expect(result.collection.scenarios).toHaveProperty("flow");
|
|
312
|
+
expect(result.stats.folders_added).toBe(1);
|
|
313
|
+
expect(result.stats.endpoints_added).toBe(1);
|
|
314
|
+
expect(result.stats.environments_added).toBe(1);
|
|
315
|
+
expect(result.stats.scenarios_added).toBe(1);
|
|
316
|
+
});
|
|
317
|
+
it("returns base unchanged when incoming is empty", () => {
|
|
318
|
+
const base = makeCollection({
|
|
319
|
+
folders: {
|
|
320
|
+
auth: { endpoints: [{ name: "Login", method: "POST", path: "/login" }] },
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
const incoming = makeCollection({ name: "Incoming" });
|
|
324
|
+
const result = mergeCollections(base, incoming);
|
|
325
|
+
expect(result.collection.folders.auth.endpoints).toHaveLength(1);
|
|
326
|
+
expect(result.stats.endpoints_added).toBe(0);
|
|
327
|
+
expect(result.stats.endpoints_updated).toBe(0);
|
|
328
|
+
expect(result.conflicts).toHaveLength(0);
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
// ── Identity and immutability ───────────────────────────────────
|
|
332
|
+
describe("identity preservation", () => {
|
|
333
|
+
it("keeps base name, version, and active_environment", () => {
|
|
334
|
+
const base = makeCollection({
|
|
335
|
+
name: "My API",
|
|
336
|
+
version: "2.0.0",
|
|
337
|
+
active_environment: "dev",
|
|
338
|
+
});
|
|
339
|
+
const incoming = makeCollection({
|
|
340
|
+
name: "Their API",
|
|
341
|
+
version: "3.0.0",
|
|
342
|
+
active_environment: "staging",
|
|
343
|
+
});
|
|
344
|
+
const result = mergeCollections(base, incoming);
|
|
345
|
+
expect(result.collection.name).toBe("My API");
|
|
346
|
+
expect(result.collection.version).toBe("2.0.0");
|
|
347
|
+
expect(result.collection.active_environment).toBe("dev");
|
|
348
|
+
});
|
|
349
|
+
it("does not mutate the input collections", () => {
|
|
350
|
+
const base = makeCollection({
|
|
351
|
+
folders: {
|
|
352
|
+
auth: { endpoints: [{ name: "Login", method: "POST", path: "/login" }] },
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
const incoming = makeCollection({
|
|
356
|
+
name: "Incoming",
|
|
357
|
+
folders: {
|
|
358
|
+
auth: { endpoints: [{ name: "Register", method: "POST", path: "/register" }] },
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
const baseSnapshot = JSON.stringify(base);
|
|
362
|
+
const incomingSnapshot = JSON.stringify(incoming);
|
|
363
|
+
mergeCollections(base, incoming);
|
|
364
|
+
expect(JSON.stringify(base)).toBe(baseSnapshot);
|
|
365
|
+
expect(JSON.stringify(incoming)).toBe(incomingSnapshot);
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
// ── Folder-level headers/variables merge ────────────────────────
|
|
369
|
+
describe("folder-level metadata merge", () => {
|
|
370
|
+
it("deep-merges folder headers and variables", () => {
|
|
371
|
+
const base = makeCollection({
|
|
372
|
+
folders: {
|
|
373
|
+
auth: {
|
|
374
|
+
headers: { Authorization: "Bearer base" },
|
|
375
|
+
variables: { host: "base-host" },
|
|
376
|
+
endpoints: [],
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
});
|
|
380
|
+
const incoming = makeCollection({
|
|
381
|
+
name: "Incoming",
|
|
382
|
+
folders: {
|
|
383
|
+
auth: {
|
|
384
|
+
headers: { "X-New": "val", Authorization: "Bearer incoming" },
|
|
385
|
+
variables: { version: "2" },
|
|
386
|
+
endpoints: [],
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
});
|
|
390
|
+
const result = mergeCollections(base, incoming);
|
|
391
|
+
const auth = result.collection.folders.auth;
|
|
392
|
+
expect(auth.headers).toEqual({ Authorization: "Bearer incoming", "X-New": "val" });
|
|
393
|
+
expect(auth.variables).toEqual({ host: "base-host", version: "2" });
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
// ── Description merge ───────────────────────────────────────────
|
|
397
|
+
describe("description merge", () => {
|
|
398
|
+
it("takes incoming description when base has none", () => {
|
|
399
|
+
const base = makeCollection({});
|
|
400
|
+
const incoming = makeCollection({ name: "Incoming", description: "From incoming" });
|
|
401
|
+
const result = mergeCollections(base, incoming);
|
|
402
|
+
expect(result.collection.description).toBe("From incoming");
|
|
403
|
+
});
|
|
404
|
+
it("keeps base description when both have one", () => {
|
|
405
|
+
const base = makeCollection({ description: "Base desc" });
|
|
406
|
+
const incoming = makeCollection({ name: "Incoming", description: "Incoming desc" });
|
|
407
|
+
const result = mergeCollections(base, incoming);
|
|
408
|
+
expect(result.collection.description).toBe("Base desc");
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
//# sourceMappingURL=merge.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.test.js","sourceRoot":"","sources":["../../../src/collections/__tests__/merge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,3 +10,5 @@ export { buildDefaultRegistry, DynamicVarRegistry } from "./dynamic-vars.js";
|
|
|
10
10
|
export { DeclarativeScriptRunner, JsScriptRunner } from "./scripts.js";
|
|
11
11
|
export { executeEndpoint, executeFolder, executeCollection, executeScenario } from "./executor.js";
|
|
12
12
|
export { fromPostmanV21, toPostmanV21 } from "./postman.js";
|
|
13
|
+
export { mergeCollections } from "./merge.js";
|
|
14
|
+
export type { MergeConflict, MergeStats, MergeResult } from "./merge.js";
|
|
@@ -24,4 +24,5 @@ export { buildDefaultRegistry, DynamicVarRegistry } from "./dynamic-vars.js";
|
|
|
24
24
|
export { DeclarativeScriptRunner, JsScriptRunner } from "./scripts.js";
|
|
25
25
|
export { executeEndpoint, executeFolder, executeCollection, executeScenario } from "./executor.js";
|
|
26
26
|
export { fromPostmanV21, toPostmanV21 } from "./postman.js";
|
|
27
|
+
export { mergeCollections } from "./merge.js";
|
|
27
28
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +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,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,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,cAAc,EAAE,CAAC;AAE1C,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,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
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,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,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,cAAc,EAAE,CAAC;AAE1C,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,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Collection } from "./types.js";
|
|
2
|
+
export interface MergeConflict {
|
|
3
|
+
path: string;
|
|
4
|
+
type: "overwritten" | "added" | "skipped";
|
|
5
|
+
detail: string;
|
|
6
|
+
}
|
|
7
|
+
export interface MergeStats {
|
|
8
|
+
endpoints_added: number;
|
|
9
|
+
endpoints_updated: number;
|
|
10
|
+
environments_added: number;
|
|
11
|
+
environments_updated: number;
|
|
12
|
+
folders_added: number;
|
|
13
|
+
scenarios_added: number;
|
|
14
|
+
scenarios_skipped: number;
|
|
15
|
+
}
|
|
16
|
+
export interface MergeResult {
|
|
17
|
+
collection: Collection;
|
|
18
|
+
conflicts: MergeConflict[];
|
|
19
|
+
stats: MergeStats;
|
|
20
|
+
}
|
|
21
|
+
export declare function mergeCollections(base: Collection, incoming: Collection): MergeResult;
|