swaggerizer 1.0.1 → 1.1.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 +28 -1
- package/dist/admin.d.ts +2 -1
- package/dist/admin.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +651 -33
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +7 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/config.mjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +654 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +651 -35
- package/dist/index.mjs.map +1 -1
- package/dist/server.d.ts +9 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/types.d.ts +30 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/app.css +10 -0
- package/dist/ui/app.js +25 -0
- package/dist/validate.d.ts +33 -0
- package/dist/validate.d.ts.map +1 -0
- package/package.json +3 -1
package/dist/types.d.ts
CHANGED
|
@@ -128,11 +128,38 @@ export interface SwaggerizerState {
|
|
|
128
128
|
operations: OperationState[];
|
|
129
129
|
lastReload?: string;
|
|
130
130
|
changes: ChangeReport[];
|
|
131
|
+
validation: ValidationInfo;
|
|
131
132
|
}
|
|
132
133
|
export interface ScenarioSelection extends Scenario {
|
|
133
134
|
method: string;
|
|
134
135
|
route: string;
|
|
135
136
|
}
|
|
137
|
+
/** How requests are checked against the spec: never, recorded only, or rejected with a 400. */
|
|
138
|
+
export type ValidationMode = "off" | "warn" | "enforce";
|
|
139
|
+
/** One contract violation found in a request. */
|
|
140
|
+
export interface ValidationIssue {
|
|
141
|
+
/** Dotted location: "query.limit", "body.ownerId", "header.x-tenant". */
|
|
142
|
+
location: string;
|
|
143
|
+
message: string;
|
|
144
|
+
/** Ajv keyword: "required", "type", "enum", "format"… */
|
|
145
|
+
keyword?: string;
|
|
146
|
+
}
|
|
147
|
+
export interface ValidationSummary {
|
|
148
|
+
request: ValidationIssue[];
|
|
149
|
+
/** Why a check did not run: "unsupported-media-type", "object-style", "form-nesting", "invalid-schema". */
|
|
150
|
+
skipped?: string;
|
|
151
|
+
}
|
|
152
|
+
/** What the admin page and `GET {endpoint}/api/validation` report about the active configuration. */
|
|
153
|
+
export interface ValidationInfo {
|
|
154
|
+
mode: ValidationMode;
|
|
155
|
+
/** Specs that override `mode`. */
|
|
156
|
+
perSpec: Record<string, ValidationMode>;
|
|
157
|
+
operations: Array<{
|
|
158
|
+
specId: string;
|
|
159
|
+
key: string;
|
|
160
|
+
hasRequestSchema: boolean;
|
|
161
|
+
}>;
|
|
162
|
+
}
|
|
136
163
|
export interface RequestLogEntry {
|
|
137
164
|
id: number;
|
|
138
165
|
time: string;
|
|
@@ -140,13 +167,15 @@ export interface RequestLogEntry {
|
|
|
140
167
|
path: string;
|
|
141
168
|
route?: string;
|
|
142
169
|
status: number;
|
|
143
|
-
/** Variant served, or "custom" / "proxy" / "unmatched". */
|
|
170
|
+
/** Variant served, or "custom" / "proxy" / "unmatched" / "validation". */
|
|
144
171
|
example: string;
|
|
145
172
|
specId?: string;
|
|
146
173
|
contentType?: string;
|
|
147
174
|
/** "server" for the Node mock server, "msw" for requests reported by the MSW runtime. */
|
|
148
175
|
source: "server" | "msw";
|
|
149
176
|
ms?: number;
|
|
177
|
+
/** Present when validation ran and found issues, or could not check part of the request. */
|
|
178
|
+
validation?: ValidationSummary;
|
|
150
179
|
}
|
|
151
180
|
export type ChangeSeverity = "breaking" | "warning" | "info";
|
|
152
181
|
export type ChangeKind = "operation-added" | "operation-removed" | "operation-renamed" | "operation-deprecated" | "parameter-added" | "parameter-removed" | "parameter-changed" | "request-body-added" | "request-body-removed" | "request-body-changed" | "response-added" | "response-removed" | "response-changed";
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/app.css
CHANGED
|
@@ -1117,3 +1117,13 @@ pre.code {
|
|
|
1117
1117
|
color: #0d1117;
|
|
1118
1118
|
}
|
|
1119
1119
|
}
|
|
1120
|
+
|
|
1121
|
+
/* Request validation chip in the live-request log. */
|
|
1122
|
+
.log-invalid {
|
|
1123
|
+
font: 700 11px/1 var(--mono);
|
|
1124
|
+
padding: 2px 6px;
|
|
1125
|
+
border-radius: 999px;
|
|
1126
|
+
background: var(--warn-soft);
|
|
1127
|
+
color: var(--warn);
|
|
1128
|
+
cursor: help;
|
|
1129
|
+
}
|
package/dist/ui/app.js
CHANGED
|
@@ -103,6 +103,21 @@
|
|
|
103
103
|
return "status status-" + ("12345".indexOf(first) >= 0 ? first : "5");
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
+
/* Request validation: one chip whose tooltip lists the contract violations. */
|
|
107
|
+
function validationChip(validation) {
|
|
108
|
+
if (!validation) return null;
|
|
109
|
+
var issues = validation.request || [];
|
|
110
|
+
if (!issues.length && !validation.skipped) return null;
|
|
111
|
+
var title = issues.length
|
|
112
|
+
? issues.map(function (issue) { return issue.location + ": " + issue.message; }).join("\n")
|
|
113
|
+
: "Not checked: " + validation.skipped;
|
|
114
|
+
return h("span", {
|
|
115
|
+
class: "log-invalid",
|
|
116
|
+
title: title,
|
|
117
|
+
text: issues.length ? "⚠ " + issues.length : "?"
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
106
121
|
function methodBadge(method) {
|
|
107
122
|
var m = String(method).toLowerCase();
|
|
108
123
|
return h("span", { class: "method method-" + m, text: m.toUpperCase() });
|
|
@@ -258,10 +273,19 @@
|
|
|
258
273
|
var active = ops.filter(function (o) { return o.active; });
|
|
259
274
|
var changed = active.filter(function (o) { return o.modified; }).length;
|
|
260
275
|
var breaking = (ui.data.changes || []).reduce(function (n, r) { return n + r.counts.breaking; }, 0);
|
|
276
|
+
var validation = ui.data.validation || {};
|
|
277
|
+
var mode = validation.mode || "off";
|
|
278
|
+
var perSpec = validation.perSpec || {};
|
|
279
|
+
var specModes = Object.keys(perSpec).map(function (id) { return perSpec[id]; }).filter(function (m) { return m !== mode; });
|
|
280
|
+
// Shown only when something is checked; specs that differ from the server mode are listed after it.
|
|
281
|
+
var showMode = mode !== "off" || specModes.some(function (m) { return m !== "off"; });
|
|
282
|
+
var modeTitle = "Requests are checked against the spec: off, warn or enforce" +
|
|
283
|
+
Object.keys(perSpec).map(function (id) { return "\n" + id + ": " + perSpec[id]; }).join("");
|
|
261
284
|
el.stats.replaceChildren(
|
|
262
285
|
h("span", null, h("strong", { text: String(enabled) }), " / " + specs.length + " specs on"),
|
|
263
286
|
h("span", null, h("strong", { text: String(active.length) }), " endpoints served"),
|
|
264
287
|
h("span", null, h("strong", { text: String(changed) }), " switched"),
|
|
288
|
+
showMode ? h("span", { title: modeTitle }, "validation ", h("strong", { text: mode + (specModes.length ? " +" + specModes.length : "") })) : null,
|
|
265
289
|
breaking ? h("span", { class: "status-5" }, h("strong", { text: String(breaking) }), " breaking change" + (breaking === 1 ? "" : "s")) : null
|
|
266
290
|
);
|
|
267
291
|
}
|
|
@@ -711,6 +735,7 @@
|
|
|
711
735
|
return h("li", { class: ui.freshLogIds.has(entry.id) ? "is-new" : "" },
|
|
712
736
|
methodBadge(entry.method),
|
|
713
737
|
h("span", { class: statusClass(entry.status), text: entry.status ? String(entry.status) : "→" }),
|
|
738
|
+
validationChip(entry.validation),
|
|
714
739
|
h("span", { class: "log-path", text: entry.path }),
|
|
715
740
|
h("span", { class: "log-meta" },
|
|
716
741
|
entry.source === "msw" ? h("span", { class: "log-source", title: "Answered by MSW in a browser or test", text: "msw" }) : null,
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { CatalogueOperation, ValidationIssue, ValidationMode, ValidationSummary } from "./types";
|
|
2
|
+
export declare const VALIDATION_HEADER = "x-swaggerizer-validation";
|
|
3
|
+
export interface ValidationInput {
|
|
4
|
+
/** Path parameters, already extracted for the matched route. */
|
|
5
|
+
params: Record<string, string>;
|
|
6
|
+
query: URLSearchParams;
|
|
7
|
+
headers: Record<string, string | string[] | undefined>;
|
|
8
|
+
/** Parsed JSON or form fields; undefined when the request carried no body. */
|
|
9
|
+
body?: unknown;
|
|
10
|
+
/** Set when the body could not be parsed. Reported as an issue rather than guessed at. */
|
|
11
|
+
bodyError?: string;
|
|
12
|
+
contentType?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface Validator {
|
|
15
|
+
validateRequest: (op: CatalogueOperation, input: ValidationInput) => ValidationSummary;
|
|
16
|
+
/** True when the operation declares any parameter or a request body. */
|
|
17
|
+
hasRequestSchema: (op: CatalogueOperation) => boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function normaliseContentType(value: string | undefined): string | undefined;
|
|
20
|
+
/** The declared media type this request should be checked against, if any. */
|
|
21
|
+
export declare function matchMediaType(declared: string[], actual: string | undefined): string | undefined;
|
|
22
|
+
/** True when the operation (or its path item) declares any parameter or a request body. */
|
|
23
|
+
export declare function hasRequestSchema(doc: any, op: Pick<CatalogueOperation, "route" | "method">): boolean;
|
|
24
|
+
/** `X-Swaggerizer-Validation: off | warn | enforce`; unknown values fall back to the configured mode. */
|
|
25
|
+
export declare function parseValidationMode(value: string | undefined): ValidationMode | undefined;
|
|
26
|
+
/** True when one of `validateIgnore`'s operationIds or `"METHOD /route"` entries covers `op`. */
|
|
27
|
+
export declare function matchesIgnore(ignore: string[] | undefined, op: Pick<CatalogueOperation, "operationId" | "method" | "route" | "key">): boolean;
|
|
28
|
+
/** `validateIgnore` entries that match no operation, reported as a spec warning. */
|
|
29
|
+
export declare function unmatchedIgnore(ignore: string[] | undefined, operations: CatalogueOperation[]): string[];
|
|
30
|
+
/** "query.limit: must be integer" — used for log tooltips and CLI output. */
|
|
31
|
+
export declare function formatIssues(issues: ValidationIssue[]): string;
|
|
32
|
+
export declare function createValidator(doc: any, specId: string, specVersion?: string): Validator;
|
|
33
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEtG,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAQ5D,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,8EAA8E;IAC9E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,CAAC,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe,KAAK,iBAAiB,CAAC;IACvF,wEAAwE;IACxE,gBAAgB,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC;CACvD;AAmND,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKlF;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAYjG;AAaD,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,GAAG,QAAQ,CAAC,GAAG,OAAO,CAQpG;AA+BD,yGAAyG;AACzG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAIzF;AAED,iGAAiG;AACjG,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAC5B,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC,GACvE,OAAO,CAMT;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAWxG;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAE9D;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAgLzF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "swaggerizer",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A strategizer for OpenAPI/Swagger: live-switchable mock APIs with an admin page and debug menu, orval-generated clients and MSW mocks, and contract-change warnings before you regenerate",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"openapi",
|
|
@@ -71,6 +71,8 @@
|
|
|
71
71
|
"homepage": "https://github.com/jayjaybeeuk/swaggerizer#readme",
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@apidevtools/swagger-parser": "^13.1.0",
|
|
74
|
+
"ajv": "^8.20.0",
|
|
75
|
+
"ajv-formats": "^3.0.1",
|
|
74
76
|
"jiti": "^2.7.0",
|
|
75
77
|
"orval": "^8.47.0",
|
|
76
78
|
"swagger2openapi": "^7.0.8",
|