interceptr 1.5.0 → 1.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.
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
</p>
|
|
16
16
|
|
|
17
17
|
<p align="center">
|
|
18
|
-
Import your OpenAPI / Swagger spec, control each endpoint individually (pass, delay, or
|
|
18
|
+
Import your OpenAPI / Swagger spec, control each endpoint individually (pass, delay, mock, or both), and watch live traffic in real time. No code changes. No config files. Just run it and point your app at the proxy.
|
|
19
19
|
</p>
|
|
20
20
|
|
|
21
21
|
---
|
|
@@ -57,12 +57,12 @@ Interceptr runs as a **local reverse proxy** that sits between your frontend (or
|
|
|
57
57
|
## Features
|
|
58
58
|
|
|
59
59
|
- **OpenAPI / Swagger Import** — Load specs from a URL or file upload. Supports OpenAPI 3.0 and 3.1, JSON and YAML. Mock responses are auto-populated from spec examples.
|
|
60
|
-
- **Per-Endpoint Proxy Modes** — Choose **Pass** (forward to upstream), **Delay** (inject latency + jitter),
|
|
60
|
+
- **Per-Endpoint Proxy Modes** — Choose **Pass** (forward to upstream), **Delay** (inject latency + jitter), **Mock** (serve custom response), or **Delay + Mock** (mock response with simulated latency) for each endpoint individually. Delay and Mock can be combined by activating both buttons simultaneously.
|
|
61
61
|
- **Group Actions** — Apply a mode to all endpoints in a tag group at once.
|
|
62
62
|
- **Live Traffic Monitor** — Watch request/response cycles in real time. Filter by method, status code, or proxy mode. Click any entry to inspect headers and JSON body.
|
|
63
63
|
- **Presets** — Save and restore full endpoint configurations. Built-in actions: Pass All, Slow All, Error All.
|
|
64
64
|
- **Multi-Project & Multi-Spec** — Organize work into projects. Toggle multiple specs (e.g., local + staging) simultaneously.
|
|
65
|
-
- **Global Response Headers** — Inject headers (e.g., CORS) across all responses for a spec, overridable per endpoint.
|
|
65
|
+
- **Global Response Headers** — Inject headers (e.g., CORS) across all responses for a spec, overridable per endpoint. Optionally extend injection to all proxied requests — including those not in the endpoint registry — via the "Apply to all requests" toggle.
|
|
66
66
|
- **Conditional Rules** — Define per-request overrides based on request count, random failure rate, or header matching.
|
|
67
67
|
- **No Config Files** — Everything is managed from the web UI and persisted automatically as JSON.
|
|
68
68
|
- **Theme Support** — Dark mode (Midnight Blue) and high-contrast light mode.
|
|
@@ -84,6 +84,7 @@ The **Endpoints Registry** lists every operation from your spec, grouped by tag.
|
|
|
84
84
|
| **Pass** | Forwards the request to the upstream server unchanged. |
|
|
85
85
|
| **Delay** | Simulates latency. Configure milliseconds and optional jitter. |
|
|
86
86
|
| **Mock** | Returns a custom response. Use spec-defined examples or write your own JSON. |
|
|
87
|
+
| **Delay + Mock** | Returns a mock response after the configured delay. Activate by clicking both the Delay and Mock buttons simultaneously. |
|
|
87
88
|
|
|
88
89
|
Click an endpoint to open the editor. Use **group action buttons** (Pass / Delay / Mock) above each tag group to apply a mode to all endpoints at once.
|
|
89
90
|
|
|
@@ -155,7 +156,7 @@ The management API runs on port 3001. All endpoints are prefixed with `/api`.
|
|
|
155
156
|
| `POST` | `/specs` | Upload a spec (body: `{spec, name, upstreamUrl?}`) |
|
|
156
157
|
| `POST` | `/specs/url` | Import a spec from URL (body: `{url, name}`) |
|
|
157
158
|
| `POST` | `/specs/:id/reimport` | Reimport from source URL or new body |
|
|
158
|
-
| `PUT` | `/specs/:id` | Update spec metadata (body: `{name?, upstreamUrl?, active?, globalHeaders?}`) |
|
|
159
|
+
| `PUT` | `/specs/:id` | Update spec metadata (body: `{name?, upstreamUrl?, active?, globalHeaders?, applyGlobalHeadersToAll?}`) |
|
|
159
160
|
| `PUT` | `/specs/:id/toggle` | Toggle spec active state |
|
|
160
161
|
| `DELETE` | `/specs/:id` | Delete a spec |
|
|
161
162
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/openapi/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAgB,MAAM,oBAAoB,CAAC;AAOrF,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAE5D,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,GAAG,MAAM,GACzB,OAAO,CAAC;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/openapi/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAgB,MAAM,oBAAoB,CAAC;AAOrF,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AAE5D,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,GAAG,MAAM,GACzB,OAAO,CAAC;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC,CAiGlE"}
|
package/dist/openapi/parser.js
CHANGED
|
@@ -16,33 +16,62 @@ export async function parseOpenAPISpec(specInput) {
|
|
|
16
16
|
const statusCode = parseInt(statusCodeStr, 10);
|
|
17
17
|
if (isNaN(statusCode))
|
|
18
18
|
continue;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
const description = response.description || `Status ${statusCode}`;
|
|
20
|
+
const jsonContent = response.content?.['application/json'];
|
|
21
|
+
const topSchema = jsonContent?.schema;
|
|
22
|
+
const variants = topSchema?.anyOf ?? topSchema?.oneOf;
|
|
23
|
+
if (variants && Array.isArray(variants) && variants.length > 1) {
|
|
24
|
+
// Expand each variant into its own SpecResponse
|
|
25
|
+
for (let i = 0; i < variants.length; i++) {
|
|
26
|
+
const variant = variants[i];
|
|
27
|
+
let body = '';
|
|
28
|
+
if (jsonContent.example) {
|
|
29
|
+
body = JSON.stringify(jsonContent.example, null, 2);
|
|
30
|
+
}
|
|
31
|
+
else if (jsonContent.examples) {
|
|
32
|
+
const firstExample = Object.values(jsonContent.examples)[0];
|
|
33
|
+
body = JSON.stringify(firstExample.value || firstExample, null, 2);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
body = JSON.stringify(generateExampleFromSchema(variant), null, 2);
|
|
37
|
+
}
|
|
38
|
+
responses.push({
|
|
39
|
+
statusCode,
|
|
40
|
+
name: variant.title ? `${description} — ${variant.title}` : `${description} (${i + 1})`,
|
|
41
|
+
description,
|
|
42
|
+
body,
|
|
43
|
+
headers: {},
|
|
44
|
+
schema: safeClone(variant),
|
|
45
|
+
});
|
|
26
46
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
let body = '';
|
|
50
|
+
let schema;
|
|
51
|
+
if (jsonContent) {
|
|
52
|
+
if (jsonContent.example) {
|
|
53
|
+
body = JSON.stringify(jsonContent.example, null, 2);
|
|
54
|
+
}
|
|
55
|
+
else if (jsonContent.examples) {
|
|
56
|
+
const firstExample = Object.values(jsonContent.examples)[0];
|
|
57
|
+
body = JSON.stringify(firstExample.value || firstExample, null, 2);
|
|
58
|
+
}
|
|
59
|
+
else if (topSchema) {
|
|
60
|
+
body = JSON.stringify(generateExampleFromSchema(topSchema), null, 2);
|
|
61
|
+
}
|
|
62
|
+
if (topSchema) {
|
|
63
|
+
schema = safeClone(topSchema);
|
|
64
|
+
}
|
|
36
65
|
}
|
|
66
|
+
responses.push({
|
|
67
|
+
statusCode,
|
|
68
|
+
name: description,
|
|
69
|
+
description,
|
|
70
|
+
body,
|
|
71
|
+
headers: {},
|
|
72
|
+
schema,
|
|
73
|
+
});
|
|
37
74
|
}
|
|
38
|
-
responses.push({
|
|
39
|
-
statusCode,
|
|
40
|
-
name: response.description || `Status ${statusCode}`,
|
|
41
|
-
description: response.description,
|
|
42
|
-
body,
|
|
43
|
-
headers: {},
|
|
44
|
-
schema,
|
|
45
|
-
});
|
|
46
75
|
}
|
|
47
76
|
}
|
|
48
77
|
endpoints.push({
|
|
@@ -75,6 +104,8 @@ function safeClone(value) {
|
|
|
75
104
|
}
|
|
76
105
|
}
|
|
77
106
|
function generateExampleFromSchema(schema) {
|
|
107
|
+
if (schema.const !== undefined)
|
|
108
|
+
return schema.const;
|
|
78
109
|
if (schema.example)
|
|
79
110
|
return schema.example;
|
|
80
111
|
if (schema.default !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/openapi/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,wBAAwB,CAAC;AAUxD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAA0B;IAE1B,MAAM,IAAI,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,YAAY,GAAG,CAAC,MAAM,aAAa,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAA2B,CAAC;IACxG,MAAM,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpD,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBACzC,MAAM,EAAE,GAAG,GAAG,WAAW,IAAI,IAAI,EAAE,CAAC;gBAEpC,MAAM,SAAS,GAAmB,EAAE,CAAC;gBACrC,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;oBACxB,KAAK,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC5E,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;wBAC/C,IAAI,KAAK,CAAC,UAAU,CAAC;4BAAE,SAAS;wBAEhC,
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/openapi/parser.ts"],"names":[],"mappings":"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"}
|