@zuplo/openapi-tools 0.0.0 → 6.40.12
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/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.spec.d.ts +2 -0
- package/dist/index.spec.d.ts.map +1 -0
- package/dist/index.spec.js +270 -0
- package/dist/index.spec.js.map +1 -0
- package/dist/interfaces.d.ts +39 -34
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js +5 -11
- package/dist/interfaces.js.map +1 -1
- package/dist/openapi-utils.d.ts +34 -0
- package/dist/openapi-utils.d.ts.map +1 -0
- package/dist/openapi-utils.js +454 -0
- package/dist/openapi-utils.js.map +1 -0
- package/package.json +12 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./
|
|
1
|
+
export * from "./openapi-utils.js";
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./
|
|
1
|
+
export * from "./openapi-utils.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.spec.d.ts","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { assert } from "chai";
|
|
2
|
+
import { getOperationKey, mergeOpenApiDocumentOnOperationId, } from "./openapi-utils.js";
|
|
3
|
+
import { ZUPLO_OPEN_API_ROUTE_KEY, } from "./interfaces.js";
|
|
4
|
+
const emptyOpenApi = {
|
|
5
|
+
openapi: "3.0.0",
|
|
6
|
+
info: {
|
|
7
|
+
title: "Test",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
},
|
|
10
|
+
paths: {},
|
|
11
|
+
};
|
|
12
|
+
const basicOpenApi = {
|
|
13
|
+
openapi: "3.0.0",
|
|
14
|
+
info: {
|
|
15
|
+
title: "Test",
|
|
16
|
+
version: "1.0.0",
|
|
17
|
+
},
|
|
18
|
+
paths: {
|
|
19
|
+
"/test": {
|
|
20
|
+
get: {
|
|
21
|
+
operationId: "getTest",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const openApiWithOperationIdsMissing = {
|
|
27
|
+
openapi: "3.0.0",
|
|
28
|
+
info: {
|
|
29
|
+
title: "Test",
|
|
30
|
+
version: "1.0.0",
|
|
31
|
+
},
|
|
32
|
+
components: {},
|
|
33
|
+
paths: {
|
|
34
|
+
"/test": {
|
|
35
|
+
get: {
|
|
36
|
+
responses: {
|
|
37
|
+
"200": {
|
|
38
|
+
description: "OK",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
const openApiWithMatchingPathMethodButDifferentOperationId = {
|
|
46
|
+
openapi: "3.0.0",
|
|
47
|
+
info: {
|
|
48
|
+
title: "Test",
|
|
49
|
+
version: "1.0.0",
|
|
50
|
+
},
|
|
51
|
+
paths: {
|
|
52
|
+
"/test": {
|
|
53
|
+
get: {
|
|
54
|
+
operationId: "get_test",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
const openApiWithSomePathsAndMethods = {
|
|
60
|
+
openapi: "3.0.0",
|
|
61
|
+
info: {
|
|
62
|
+
title: "Test",
|
|
63
|
+
version: "1.0.0",
|
|
64
|
+
},
|
|
65
|
+
paths: {
|
|
66
|
+
"/test": {
|
|
67
|
+
get: {
|
|
68
|
+
operationId: "getTest",
|
|
69
|
+
deprecated: true,
|
|
70
|
+
"x-zuplo-route": {
|
|
71
|
+
corsPolicy: "none",
|
|
72
|
+
handler: {
|
|
73
|
+
export: "urlForwardHandler",
|
|
74
|
+
module: "$import(@zuplo/runtime)",
|
|
75
|
+
options: {
|
|
76
|
+
baseUrl: "https://echo.zuplo.io",
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
delete: {
|
|
82
|
+
operationId: "deleteTest",
|
|
83
|
+
"x-zuplo-route": {
|
|
84
|
+
corsPolicy: "none",
|
|
85
|
+
handler: {
|
|
86
|
+
export: "urlForwardHandler",
|
|
87
|
+
module: "$import(@zuplo/runtime)",
|
|
88
|
+
options: {
|
|
89
|
+
baseUrl: "https://echo.zuplo.io",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
post: {
|
|
95
|
+
operationId: "postTest",
|
|
96
|
+
"x-zuplo-route": {
|
|
97
|
+
corsPolicy: "none",
|
|
98
|
+
handler: {
|
|
99
|
+
export: "urlForwardHandler",
|
|
100
|
+
module: "$import(@zuplo/runtime)",
|
|
101
|
+
options: {
|
|
102
|
+
baseUrl: "https://echo.zuplo.io",
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
"/humans": {
|
|
109
|
+
delete: {
|
|
110
|
+
operationId: "deleteHuman",
|
|
111
|
+
"x-zuplo-route": {
|
|
112
|
+
corsPolicy: "none",
|
|
113
|
+
handler: {
|
|
114
|
+
export: "urlForwardHandler",
|
|
115
|
+
module: "$import(@zuplo/runtime)",
|
|
116
|
+
options: {
|
|
117
|
+
baseUrl: "https://echo.zuplo.io",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
"/humans/{id}": {
|
|
124
|
+
parameters: [
|
|
125
|
+
{
|
|
126
|
+
name: "id",
|
|
127
|
+
in: "path",
|
|
128
|
+
required: true,
|
|
129
|
+
schema: {
|
|
130
|
+
type: "string",
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
get: {
|
|
135
|
+
operationId: "getHuman",
|
|
136
|
+
"x-zuplo-route": {
|
|
137
|
+
corsPolicy: "none",
|
|
138
|
+
handler: {
|
|
139
|
+
export: "urlForwardHandler",
|
|
140
|
+
module: "$import(@zuplo/runtime)",
|
|
141
|
+
options: {
|
|
142
|
+
baseUrl: "https://echo.zuplo.io",
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
const newOpenApiWithSomePathsAndMethods = {
|
|
151
|
+
openapi: "3.0.0",
|
|
152
|
+
info: {
|
|
153
|
+
title: "Test",
|
|
154
|
+
version: "1.0.0",
|
|
155
|
+
},
|
|
156
|
+
paths: {
|
|
157
|
+
"/test": {
|
|
158
|
+
get: {
|
|
159
|
+
operationId: "getTest",
|
|
160
|
+
deprecated: false, // Changed deprecated to false
|
|
161
|
+
},
|
|
162
|
+
post: {
|
|
163
|
+
operationId: "postTest",
|
|
164
|
+
summary: "Create a new test", // Added summary
|
|
165
|
+
// route definition is missing
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
"/humans": {
|
|
169
|
+
post: {
|
|
170
|
+
operationId: "createHuman",
|
|
171
|
+
},
|
|
172
|
+
delete: {
|
|
173
|
+
operationId: "deleteHuman",
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
"/humans/{humanId}": {
|
|
177
|
+
// Changed path parameter name
|
|
178
|
+
parameters: [
|
|
179
|
+
{
|
|
180
|
+
name: "humanId",
|
|
181
|
+
in: "path",
|
|
182
|
+
required: true,
|
|
183
|
+
schema: {
|
|
184
|
+
type: "string",
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
get: {
|
|
189
|
+
operationId: "getHuman",
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
describe("OpenAPI OperationID Merge Tests", function () {
|
|
195
|
+
it("Doesn't change the original document when merging two empty OpenAPI files", async function () {
|
|
196
|
+
const { mergedDocument, created, merged, retained } = mergeOpenApiDocumentOnOperationId(emptyOpenApi, emptyOpenApi);
|
|
197
|
+
assert.isEmpty(created, "No operations should be created");
|
|
198
|
+
assert.isEmpty(merged, "No operations should be merged");
|
|
199
|
+
assert.isEmpty(retained, "No operations should be retained");
|
|
200
|
+
assert.deepEqual(mergedDocument, emptyOpenApi, "The original document should not be changed");
|
|
201
|
+
});
|
|
202
|
+
it("Retains existing operations when merging in an empty OpenAPI file", async function () {
|
|
203
|
+
const { mergedDocument, created, merged, retained } = mergeOpenApiDocumentOnOperationId(basicOpenApi, emptyOpenApi);
|
|
204
|
+
assert.isEmpty(created, "No operations should be created");
|
|
205
|
+
assert.isEmpty(merged, "No operations should be merged");
|
|
206
|
+
assert.deepEqual(retained, new Set(["getTest"]), "The existing operation should be retained");
|
|
207
|
+
assert.deepEqual(mergedDocument, basicOpenApi, "The original document should not be changed");
|
|
208
|
+
});
|
|
209
|
+
it("Creates new operations when merging into an empty OpenAPI file", async function () {
|
|
210
|
+
const { mergedDocument, created, merged, retained } = mergeOpenApiDocumentOnOperationId(emptyOpenApi, basicOpenApi);
|
|
211
|
+
assert.isEmpty(merged, "No operations should be merged");
|
|
212
|
+
assert.isEmpty(retained, "No operations should be retained");
|
|
213
|
+
assert.deepEqual(created, new Set(["getTest"]), "The new operation should be created");
|
|
214
|
+
assert.deepEqual(mergedDocument, basicOpenApi, "The merged document should match the new document");
|
|
215
|
+
});
|
|
216
|
+
it("Throws when operations are missing operationId", async function () {
|
|
217
|
+
assert.throws(() => {
|
|
218
|
+
mergeOpenApiDocumentOnOperationId(basicOpenApi, openApiWithOperationIdsMissing);
|
|
219
|
+
}, `OperationId is required for all operations. OperationId missing on ${getOperationKey("get", "/test")}. Please add an operationId to all operations before merging.`);
|
|
220
|
+
});
|
|
221
|
+
it("Throws when operation already exists at path+method and operationIds do not match", async function () {
|
|
222
|
+
assert.throws(() => {
|
|
223
|
+
mergeOpenApiDocumentOnOperationId(basicOpenApi, openApiWithMatchingPathMethodButDifferentOperationId);
|
|
224
|
+
}, `Operation 'get_test' has a matching path/method to an existing operation at ${getOperationKey("get", "/test")}, but a different operationId. Either update the operationId on the existing operation or remove it entirely.`);
|
|
225
|
+
});
|
|
226
|
+
it("Creates new operations when merging into an OpenAPI file with operations", async function () {
|
|
227
|
+
const { mergedDocument, created } = mergeOpenApiDocumentOnOperationId(openApiWithSomePathsAndMethods, newOpenApiWithSomePathsAndMethods);
|
|
228
|
+
assert.deepEqual(created, new Set(["createHuman"]), "The new operations should be created");
|
|
229
|
+
assert.deepEqual(mergedDocument?.paths?.["/humans"]?.post, { operationId: "createHuman" }, "The new operation should be created");
|
|
230
|
+
});
|
|
231
|
+
it("Retains old operations when new document does not include those operations", async function () {
|
|
232
|
+
const { mergedDocument, retained } = mergeOpenApiDocumentOnOperationId(openApiWithSomePathsAndMethods, newOpenApiWithSomePathsAndMethods);
|
|
233
|
+
assert.deepEqual(retained, new Set(["deleteTest"]), "The existing operations should be retained");
|
|
234
|
+
assert.deepEqual(mergedDocument?.paths?.["/test"]?.delete, openApiWithSomePathsAndMethods?.paths?.["/test"]?.delete, "The existing operation should be retained");
|
|
235
|
+
});
|
|
236
|
+
it("Merges operations and updates properties", async function () {
|
|
237
|
+
const { mergedDocument, merged } = mergeOpenApiDocumentOnOperationId(openApiWithSomePathsAndMethods, newOpenApiWithSomePathsAndMethods);
|
|
238
|
+
assert.deepEqual(merged, new Set(["getTest", "postTest", "deleteHuman", "getHuman"]), "The operations should be merged");
|
|
239
|
+
assert.isFalse(mergedDocument?.paths?.["/test"]?.get?.deprecated, "The operation's 'deprecated' property should be updated");
|
|
240
|
+
assert.deepEqual(mergedDocument?.paths?.["/test"]?.post?.summary, "Create a new test", "The operation's 'summary' property should be updated");
|
|
241
|
+
assert.deepEqual(mergedDocument?.paths?.["/humans"]?.delete?.[ZUPLO_OPEN_API_ROUTE_KEY], openApiWithSomePathsAndMethods?.paths?.["/humans"]?.delete?.[ZUPLO_OPEN_API_ROUTE_KEY], "Merged operation with no changes should be the same");
|
|
242
|
+
assert.notExists(mergedDocument?.paths?.["/humans/{id}"]?.get, "The old operation should not exist in the merged document");
|
|
243
|
+
// NOTE: Parameters at the path level are not merged since operationID
|
|
244
|
+
// merging implies only operations are merged
|
|
245
|
+
assert.deepEqual(mergedDocument?.paths?.["/humans/{humanId}"], {
|
|
246
|
+
get: {
|
|
247
|
+
operationId: "getHuman",
|
|
248
|
+
"x-zuplo-route": {
|
|
249
|
+
corsPolicy: "none",
|
|
250
|
+
handler: {
|
|
251
|
+
export: "urlForwardHandler",
|
|
252
|
+
module: "$import(@zuplo/runtime)",
|
|
253
|
+
options: {
|
|
254
|
+
baseUrl: "https://echo.zuplo.io",
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
}, "The new operation should exist in the merged document");
|
|
260
|
+
});
|
|
261
|
+
it("Retains zuplo config when merging operations", async function () {
|
|
262
|
+
const { mergedDocument, merged } = mergeOpenApiDocumentOnOperationId(openApiWithSomePathsAndMethods, newOpenApiWithSomePathsAndMethods);
|
|
263
|
+
assert.deepEqual(merged, new Set(["getTest", "postTest", "deleteHuman", "getHuman"]), "The operations should be merged");
|
|
264
|
+
assert.deepEqual(mergedDocument?.paths?.["/test"]?.get?.[ZUPLO_OPEN_API_ROUTE_KEY], openApiWithSomePathsAndMethods?.paths?.["/test"]?.get?.[ZUPLO_OPEN_API_ROUTE_KEY], "The existing zuplo config should be retained");
|
|
265
|
+
assert.deepEqual(mergedDocument?.paths?.["/test"]?.post?.[ZUPLO_OPEN_API_ROUTE_KEY], openApiWithSomePathsAndMethods?.paths?.["/test"]?.post?.[ZUPLO_OPEN_API_ROUTE_KEY], "The existing zuplo config should be retained");
|
|
266
|
+
assert.deepEqual(mergedDocument?.paths?.["/humans"]?.delete?.[ZUPLO_OPEN_API_ROUTE_KEY], openApiWithSomePathsAndMethods?.paths?.["/humans"]?.delete?.[ZUPLO_OPEN_API_ROUTE_KEY], "The existing zuplo config should be retained");
|
|
267
|
+
assert.deepEqual(mergedDocument?.paths?.["/humans/{humanId}"]?.get?.[ZUPLO_OPEN_API_ROUTE_KEY], openApiWithSomePathsAndMethods?.paths?.["/humans/{id}"]?.get?.[ZUPLO_OPEN_API_ROUTE_KEY], "The existing zuplo config should be retained");
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
//# sourceMappingURL=index.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/interfaces.d.ts
CHANGED
|
@@ -1,40 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { RouteConfiguration } from "@zuplo/runtime";
|
|
2
|
+
import { ErrorObject } from "ajv";
|
|
3
|
+
import { OpenAPIV3_1 } from "openapi-types";
|
|
4
|
+
export interface ValidationResult {
|
|
5
|
+
isValid: boolean;
|
|
6
|
+
errors: ErrorObject[];
|
|
7
|
+
warnings: ErrorObject[];
|
|
6
8
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
type Modify<T, R> = Omit<T, keyof R> & R;
|
|
10
|
+
export type ZuploHttpMethods = OpenAPIV3_1.HttpMethods | string;
|
|
11
|
+
export declare const ZUPLO_OPEN_API_VENDOR_PREFIX = "x-zuplo";
|
|
12
|
+
export declare const OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG = "x-internal";
|
|
13
|
+
export declare const ZUPLO_OPEN_API_PATH_KEY: "x-zuplo-path";
|
|
14
|
+
export declare const ZUPLO_OPEN_API_ROUTE_KEY: "x-zuplo-route";
|
|
15
|
+
export type ZuploOpenApiDocument = Modify<OpenAPIV3_1.Document<ZuploOpenApiOperationExtension>, {
|
|
16
|
+
paths: ZuploOpenApiPathsObject | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export type ZuploOpenApiPathsObject = Record<string, ZuploOpenApiPathItemObject | undefined>;
|
|
19
|
+
export type ZuploOpenApiPathItemObject = Modify<OpenAPIV3_1.PathItemObject<ZuploOpenApiOperationExtension> & ZuploOpenApiPathItemExtension, {
|
|
20
|
+
get?: ZuploOpenApiOperationObject;
|
|
21
|
+
put?: ZuploOpenApiOperationObject;
|
|
22
|
+
post?: ZuploOpenApiOperationObject;
|
|
23
|
+
delete?: ZuploOpenApiOperationObject;
|
|
24
|
+
options?: ZuploOpenApiOperationObject;
|
|
25
|
+
head?: ZuploOpenApiOperationObject;
|
|
26
|
+
patch?: ZuploOpenApiOperationObject;
|
|
27
|
+
trace?: ZuploOpenApiOperationObject;
|
|
28
|
+
}>;
|
|
29
|
+
export interface ZuploOpenApiPathItemExtension {
|
|
30
|
+
[ZUPLO_OPEN_API_PATH_KEY]?: ZuploOpenApiPathItemProperties;
|
|
13
31
|
}
|
|
14
|
-
export interface
|
|
15
|
-
|
|
32
|
+
export interface ZuploOpenApiPathItemProperties {
|
|
33
|
+
pathMode: PathMode;
|
|
16
34
|
}
|
|
17
|
-
export type
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
];
|
|
24
|
-
|
|
25
|
-
info: BuildLogFn;
|
|
26
|
-
warn: BuildLogFn;
|
|
27
|
-
error: BuildLogFn;
|
|
28
|
-
}
|
|
29
|
-
export interface OutputLogger {
|
|
30
|
-
child(name: DeploymentStageName): StageOutputLogger;
|
|
31
|
-
}
|
|
32
|
-
export declare class SilentOutput implements OutputLogger {
|
|
33
|
-
child: () => {
|
|
34
|
-
info: () => void;
|
|
35
|
-
warn: () => void;
|
|
36
|
-
error: () => void;
|
|
37
|
-
};
|
|
35
|
+
export type PathMode = "open-api" | "url-pattern";
|
|
36
|
+
export type ZuploOpenApiOperationObject = Modify<OpenAPIV3_1.OperationObject<ZuploOpenApiOperationExtension>, {
|
|
37
|
+
operationId: string;
|
|
38
|
+
}>;
|
|
39
|
+
export type ZuploOpenApiOperationProperties = Omit<RouteConfiguration, "operationId" | "path" | "methods" | "label" | "key" | "summary" | "description" | "parameters" | "responses" | "tags" | "version" | "raw">;
|
|
40
|
+
export interface ZuploOpenApiOperationExtension {
|
|
41
|
+
[ZUPLO_OPEN_API_ROUTE_KEY]?: ZuploOpenApiOperationProperties;
|
|
42
|
+
[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG]?: boolean;
|
|
38
43
|
}
|
|
39
44
|
export {};
|
|
40
45
|
//# sourceMappingURL=interfaces.d.ts.map
|
package/dist/interfaces.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AACzC,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,WAAW,GAAG,MAAM,CAAC;AAGhE,eAAO,MAAM,4BAA4B,YAAY,CAAC;AACtD,eAAO,MAAM,qCAAqC,eAAe,CAAC;AAClE,eAAO,MAAM,uBAAuB,gBACa,CAAC;AAClD,eAAO,MAAM,wBAAwB,iBACa,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CACvC,WAAW,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EACpD;IACE,KAAK,EAAE,uBAAuB,GAAG,SAAS,CAAC;CAC5C,CACF,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAC1C,MAAM,EACN,0BAA0B,GAAG,SAAS,CACvC,CAAC;AACF,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAC7C,WAAW,CAAC,cAAc,CAAC,8BAA8B,CAAC,GACxD,6BAA6B,EAC/B;IACE,GAAG,CAAC,EAAE,2BAA2B,CAAC;IAClC,GAAG,CAAC,EAAE,2BAA2B,CAAC;IAClC,IAAI,CAAC,EAAE,2BAA2B,CAAC;IACnC,MAAM,CAAC,EAAE,2BAA2B,CAAC;IACrC,OAAO,CAAC,EAAE,2BAA2B,CAAC;IACtC,IAAI,CAAC,EAAE,2BAA2B,CAAC;IACnC,KAAK,CAAC,EAAE,2BAA2B,CAAC;IACpC,KAAK,CAAC,EAAE,2BAA2B,CAAC;CACrC,CACF,CAAC;AACF,MAAM,WAAW,6BAA6B;IAC5C,CAAC,uBAAuB,CAAC,CAAC,EAAE,8BAA8B,CAAC;CAC5D;AACD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,QAAQ,CAAC;CACpB;AACD,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;AAClD,MAAM,MAAM,2BAA2B,GAAG,MAAM,CAC9C,WAAW,CAAC,eAAe,CAAC,8BAA8B,CAAC,EAC3D;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CACxB,CAAC;AACF,MAAM,MAAM,+BAA+B,GAAG,IAAI,CAChD,kBAAkB,EAChB,aAAa,GACb,MAAM,GACN,SAAS,GACT,OAAO,GACP,KAAK,GACL,SAAS,GACT,aAAa,GACb,YAAY,GACZ,WAAW,GACX,MAAM,GACN,SAAS,GACT,KAAK,CACR,CAAC;AACF,MAAM,WAAW,8BAA8B;IAC7C,CAAC,wBAAwB,CAAC,CAAC,EAAE,+BAA+B,CAAC;IAC7D,CAAC,qCAAqC,CAAC,CAAC,EAAE,OAAO,CAAC;CACnD"}
|
package/dist/interfaces.js
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
info: () => { },
|
|
7
|
-
warn: () => { },
|
|
8
|
-
error: () => { },
|
|
9
|
-
/* eslint-enable @typescript-eslint/no-empty-function */
|
|
10
|
-
});
|
|
11
|
-
}
|
|
1
|
+
// TODO: This should all be moved to the backend eventually
|
|
2
|
+
export const ZUPLO_OPEN_API_VENDOR_PREFIX = "x-zuplo";
|
|
3
|
+
export const OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG = "x-internal";
|
|
4
|
+
export const ZUPLO_OPEN_API_PATH_KEY = `${ZUPLO_OPEN_API_VENDOR_PREFIX}-path`;
|
|
5
|
+
export const ZUPLO_OPEN_API_ROUTE_KEY = `${ZUPLO_OPEN_API_VENDOR_PREFIX}-route`;
|
|
12
6
|
//# sourceMappingURL=interfaces.js.map
|
package/dist/interfaces.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAaA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,4BAA4B,GAAG,SAAS,CAAC;AACtD,MAAM,CAAC,MAAM,qCAAqC,GAAG,YAAY,CAAC;AAClE,MAAM,CAAC,MAAM,uBAAuB,GAClC,GAAG,4BAA4B,OAAgB,CAAC;AAClD,MAAM,CAAC,MAAM,wBAAwB,GACnC,GAAG,4BAA4B,QAAiB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { OpenAPIV3_1 } from "openapi-types";
|
|
2
|
+
import { ZuploOpenApiDocument } from "./interfaces.js";
|
|
3
|
+
export type MergeMode = "operation-id" | "path-method";
|
|
4
|
+
export declare const OPERATION_PATH_MERGE_DELIMITER = ">";
|
|
5
|
+
export declare const parseOpenApiFile: (file: File) => Promise<ZuploOpenApiDocument | OpenAPIV3_1.Document<{}>>;
|
|
6
|
+
export declare const mergeOpenApiDocuments: (originalDocument: ZuploOpenApiDocument, newDocument: OpenAPIV3_1.Document | ZuploOpenApiDocument, mergeMode: MergeMode) => {
|
|
7
|
+
mergedDocument: ZuploOpenApiDocument;
|
|
8
|
+
created: Set<string>;
|
|
9
|
+
merged: Set<string>;
|
|
10
|
+
retained: Set<string>;
|
|
11
|
+
};
|
|
12
|
+
export declare const mergeOpenApiDocumentOnOperationId: (originalDocument: ZuploOpenApiDocument, newDocument: ZuploOpenApiDocument | OpenAPIV3_1.Document) => {
|
|
13
|
+
mergedDocument: ZuploOpenApiDocument;
|
|
14
|
+
created: Set<string>;
|
|
15
|
+
merged: Set<string>;
|
|
16
|
+
retained: Set<string>;
|
|
17
|
+
};
|
|
18
|
+
export declare const mergeOpenApiDocumentOnPathMethod: (originalDocument: ZuploOpenApiDocument, newDocument: ZuploOpenApiDocument | OpenAPIV3_1.Document) => {
|
|
19
|
+
mergedDocument: ZuploOpenApiDocument;
|
|
20
|
+
created: Set<string>;
|
|
21
|
+
merged: Set<string>;
|
|
22
|
+
retained: Set<string>;
|
|
23
|
+
};
|
|
24
|
+
export declare const getOperationKey: (method: string, path: string) => string;
|
|
25
|
+
/**
|
|
26
|
+
* Add operation ID to any operations that don't have one, this makes
|
|
27
|
+
* onboarding smoother for new users
|
|
28
|
+
*/
|
|
29
|
+
export declare const addOperationIdsAsNecessary: (openApi: OpenAPIV3_1.Document | ZuploOpenApiDocument) => ZuploOpenApiDocument;
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
export declare const removeOperationsWithoutAnId: (openApi: OpenAPIV3_1.Document | ZuploOpenApiDocument) => ZuploOpenApiDocument;
|
|
34
|
+
//# sourceMappingURL=openapi-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-utils.d.ts","sourceRoot":"","sources":["../src/openapi-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAIL,oBAAoB,EAKrB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,aAAa,CAAC;AAoBvD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,gBAAgB,SAAgB,IAAI,6DAOhD,CAAC;AAEF,eAAO,MAAM,qBAAqB,qBACd,oBAAoB,eACzB,WAAW,CAAC,QAAQ,GAAG,oBAAoB,aAC7C,SAAS;oBAYJ,oBAAoB;aAC3B,GAAG,CAAC,MAAM,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC;cACT,GAAG,CAAC,MAAM,CAAC;CATtB,CAAC;AAEF,eAAO,MAAM,iCAAiC,qBAC1B,oBAAoB,eACzB,oBAAoB,GAAG,WAAW,CAAC,QAAQ,KACvD;IACD,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAsKvB,CAAC;AAwDF,eAAO,MAAM,gCAAgC,qBACzB,oBAAoB,eACzB,oBAAoB,GAAG,WAAW,CAAC,QAAQ,KACvD;IACD,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAwEvB,CAAC;AA8MF,eAAO,MAAM,eAAe,WAAY,MAAM,QAAQ,MAAM,WACP,CAAC;AAyCtD;;;GAGG;AACH,eAAO,MAAM,0BAA0B,YAC5B,WAAW,CAAC,QAAQ,GAAG,oBAAoB,KACnD,oBA4BF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,YAC7B,WAAW,CAAC,QAAQ,GAAG,oBAAoB,KACnD,oBAmBF,CAAC"}
|
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
import yaml from "js-yaml";
|
|
2
|
+
import { v4 } from "uuid";
|
|
3
|
+
import { OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG, ZUPLO_OPEN_API_PATH_KEY, ZUPLO_OPEN_API_ROUTE_KEY, } from "./interfaces.js";
|
|
4
|
+
const METHODS = [
|
|
5
|
+
"get",
|
|
6
|
+
"put",
|
|
7
|
+
"post",
|
|
8
|
+
"delete",
|
|
9
|
+
"options",
|
|
10
|
+
"head",
|
|
11
|
+
"patch",
|
|
12
|
+
"trace",
|
|
13
|
+
];
|
|
14
|
+
export const OPERATION_PATH_MERGE_DELIMITER = ">";
|
|
15
|
+
export const parseOpenApiFile = async (file) => {
|
|
16
|
+
const fileText = await file.text();
|
|
17
|
+
const fileName = file.name;
|
|
18
|
+
if (fileName.endsWith(".json")) {
|
|
19
|
+
return JSON.parse(fileText);
|
|
20
|
+
}
|
|
21
|
+
return yaml.load(fileText);
|
|
22
|
+
};
|
|
23
|
+
export const mergeOpenApiDocuments = (originalDocument, newDocument, mergeMode) => {
|
|
24
|
+
if (mergeMode === "operation-id") {
|
|
25
|
+
return mergeOpenApiDocumentOnOperationId(originalDocument, newDocument);
|
|
26
|
+
}
|
|
27
|
+
return mergeOpenApiDocumentOnPathMethod(originalDocument, newDocument);
|
|
28
|
+
};
|
|
29
|
+
export const mergeOpenApiDocumentOnOperationId = (originalDocument, newDocument) => {
|
|
30
|
+
// Index the original operations by operationId
|
|
31
|
+
const originalIndex = indexOperationsById(originalDocument);
|
|
32
|
+
const originalPaths = originalDocument.paths || {};
|
|
33
|
+
// All original paths are retained by default
|
|
34
|
+
const mergedPaths = structuredClone(originalPaths);
|
|
35
|
+
const newPaths = newDocument.paths || {};
|
|
36
|
+
const created = new Set();
|
|
37
|
+
const merged = new Set();
|
|
38
|
+
const retained = new Set();
|
|
39
|
+
// Traverse each (path, method) in the new spec
|
|
40
|
+
for (const newPath of Object.keys(newPaths)) {
|
|
41
|
+
const newPathItemObject = newPaths[newPath];
|
|
42
|
+
METHODS.forEach((newMethod) => {
|
|
43
|
+
const newOperationObject = newPathItemObject[newMethod];
|
|
44
|
+
if (!newOperationObject) {
|
|
45
|
+
// If this method doesn't exist in the new spec, we can skip it
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const newOperationId = newOperationObject?.operationId;
|
|
49
|
+
if (!newOperationId) {
|
|
50
|
+
throw new Error(`OperationId is required for all operations. OperationId missing on ${getOperationKey(newMethod, newPath)}. Please add an operationId to all operations before merging.`);
|
|
51
|
+
}
|
|
52
|
+
const operationWithMatchingOperationId = originalIndex[newOperationId];
|
|
53
|
+
const operationAtMatchingPathMethod = originalPaths[newPath]?.[newMethod];
|
|
54
|
+
// Check if the operationId exists in the original spec
|
|
55
|
+
if (!operationWithMatchingOperationId) {
|
|
56
|
+
// If there's already an operation at the path + method, throw exception
|
|
57
|
+
if (operationAtMatchingPathMethod) {
|
|
58
|
+
throw new Error(`Operation '${newOperationId}' has a matching path/method to an existing operation at ${getOperationKey(newMethod, newPath)}, but a different operationId. Either update the operationId on the existing operation or remove it entirely.`);
|
|
59
|
+
}
|
|
60
|
+
// If there is no operation with the same operationId and nothing at the
|
|
61
|
+
// new path/method, we can safely add the new operation
|
|
62
|
+
if (!mergedPaths[newPath]) {
|
|
63
|
+
mergedPaths[newPath] = {};
|
|
64
|
+
}
|
|
65
|
+
mergedPaths[newPath] = updatePathItemForOperationIdMerge(mergedPaths[newPath], newOperationObject, newMethod);
|
|
66
|
+
created.add(newOperationId);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// If the operationID exists in the original spec and there is not
|
|
70
|
+
// an operation at the new path/method, we remove the old operation
|
|
71
|
+
// and add the new one
|
|
72
|
+
if (!operationAtMatchingPathMethod) {
|
|
73
|
+
const { path: oldPath, method: oldMethod } = operationWithMatchingOperationId;
|
|
74
|
+
const oldOperationObject = originalPaths[oldPath]?.[oldMethod];
|
|
75
|
+
if (!mergedPaths[newPath]) {
|
|
76
|
+
mergedPaths[newPath] = {};
|
|
77
|
+
}
|
|
78
|
+
mergedPaths[newPath] = updatePathItemForOperationIdMerge(mergedPaths[newPath], newOperationObject, newMethod, {
|
|
79
|
+
[ZUPLO_OPEN_API_ROUTE_KEY]: oldOperationObject?.[ZUPLO_OPEN_API_ROUTE_KEY],
|
|
80
|
+
[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG]: oldOperationObject?.[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG],
|
|
81
|
+
});
|
|
82
|
+
// The operation must have been moved to a new path or the method was
|
|
83
|
+
// changed (otherwise operationAtMatchingPathMethod would not be
|
|
84
|
+
// undefined). Remove the old operation to avoid duplicates.
|
|
85
|
+
// @ts-expect-error - We know this operation exists
|
|
86
|
+
delete mergedPaths[oldPath][oldMethod];
|
|
87
|
+
merged.add(newOperationId);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const operationAtMatchingPathMethodOperationId = operationAtMatchingPathMethod?.operationId;
|
|
91
|
+
// If the operation at the new path/method has the same operationId then
|
|
92
|
+
// its a merge
|
|
93
|
+
if (operationAtMatchingPathMethodOperationId === newOperationId) {
|
|
94
|
+
const { path: oldPath, method: oldMethod } = operationWithMatchingOperationId;
|
|
95
|
+
const oldOperationObject = originalPaths[oldPath]?.[oldMethod];
|
|
96
|
+
if (!mergedPaths[newPath]) {
|
|
97
|
+
mergedPaths[newPath] = {};
|
|
98
|
+
}
|
|
99
|
+
mergedPaths[newPath] = updatePathItemForOperationIdMerge(mergedPaths[newPath], newOperationObject, newMethod, {
|
|
100
|
+
[ZUPLO_OPEN_API_ROUTE_KEY]: oldOperationObject?.[ZUPLO_OPEN_API_ROUTE_KEY],
|
|
101
|
+
[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG]: oldOperationObject?.[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG],
|
|
102
|
+
});
|
|
103
|
+
merged.add(newOperationId);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
throw new Error(`Operation '${newOperationId}' has a matching path/method to an existing operation at ${getOperationKey(newMethod, newPath)}, but a different operationId. Either update the operationId on the existing operation or remove it entirely.`);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Every existing operation that wasn't merged is retained
|
|
110
|
+
Object.entries(originalIndex).forEach(([operationId]) => {
|
|
111
|
+
if (!merged.has(operationId) && !created.has(operationId)) {
|
|
112
|
+
retained.add(operationId);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
// NOTE: Technically we don't need to merge metadata like info, servers, etc.
|
|
116
|
+
// since the operationId merge is purely about the operations themselves. Some
|
|
117
|
+
// of these properties can be referenced by the merged operations
|
|
118
|
+
// (ex. components) so we just merge all the high level properties
|
|
119
|
+
const mergedDocument = {
|
|
120
|
+
...originalDocument,
|
|
121
|
+
info: newDocument.info,
|
|
122
|
+
openapi: mergeOpenApiVersion(originalDocument.openapi, newDocument.openapi),
|
|
123
|
+
paths: mergedPaths,
|
|
124
|
+
};
|
|
125
|
+
const mergedComponents = mergeComponents(originalDocument.components, newDocument.components);
|
|
126
|
+
if (mergedComponents) {
|
|
127
|
+
mergedDocument.components = mergedComponents;
|
|
128
|
+
}
|
|
129
|
+
if (newDocument.servers) {
|
|
130
|
+
mergedDocument.servers = newDocument.servers;
|
|
131
|
+
}
|
|
132
|
+
if (newDocument.security) {
|
|
133
|
+
mergedDocument.security = newDocument.security;
|
|
134
|
+
}
|
|
135
|
+
if (newDocument.tags) {
|
|
136
|
+
mergedDocument.tags = newDocument.tags;
|
|
137
|
+
}
|
|
138
|
+
if (newDocument.externalDocs) {
|
|
139
|
+
mergedDocument.externalDocs = newDocument.externalDocs;
|
|
140
|
+
}
|
|
141
|
+
if (newDocument.jsonSchemaDialect) {
|
|
142
|
+
mergedDocument.jsonSchemaDialect = newDocument.jsonSchemaDialect;
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
mergedDocument,
|
|
146
|
+
created,
|
|
147
|
+
merged,
|
|
148
|
+
retained,
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* @description Merges the operation into the path item. The old operation's
|
|
153
|
+
* Zuplo configuration may need to be retained through the merge process.
|
|
154
|
+
* @param currentPathItem Mid-merge path item. Can be the original, or could
|
|
155
|
+
* have been modified during the merge process
|
|
156
|
+
* @param newOperationObject The operation object we are merging in
|
|
157
|
+
* @returns
|
|
158
|
+
*/
|
|
159
|
+
const updatePathItemForOperationIdMerge = (currentPathItem, newOperationObject, method, zuploExtensionsToRetain) => {
|
|
160
|
+
// Need to do some funky type casting to make TS happy
|
|
161
|
+
const newZuploOperationObject = structuredClone(newOperationObject);
|
|
162
|
+
// Retain the zuplo extensions if they exist
|
|
163
|
+
if (zuploExtensionsToRetain) {
|
|
164
|
+
const newZuploOperationProperties = ZUPLO_OPEN_API_ROUTE_KEY in newOperationObject
|
|
165
|
+
? newOperationObject[ZUPLO_OPEN_API_ROUTE_KEY]
|
|
166
|
+
: undefined;
|
|
167
|
+
if (newZuploOperationProperties) {
|
|
168
|
+
newZuploOperationObject[ZUPLO_OPEN_API_ROUTE_KEY] =
|
|
169
|
+
newZuploOperationProperties;
|
|
170
|
+
}
|
|
171
|
+
else if (zuploExtensionsToRetain[ZUPLO_OPEN_API_ROUTE_KEY]) {
|
|
172
|
+
newZuploOperationObject[ZUPLO_OPEN_API_ROUTE_KEY] =
|
|
173
|
+
zuploExtensionsToRetain[ZUPLO_OPEN_API_ROUTE_KEY];
|
|
174
|
+
}
|
|
175
|
+
const newOpenApiInternalProperty = OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG in newOperationObject
|
|
176
|
+
? newOperationObject[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG]
|
|
177
|
+
: undefined;
|
|
178
|
+
if (newOpenApiInternalProperty) {
|
|
179
|
+
newZuploOperationObject[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG] =
|
|
180
|
+
newOpenApiInternalProperty;
|
|
181
|
+
}
|
|
182
|
+
else if (zuploExtensionsToRetain[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG]) {
|
|
183
|
+
newZuploOperationObject[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG] =
|
|
184
|
+
zuploExtensionsToRetain[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// NOTE: Unlike the path-method merge, we don't update the path item's
|
|
188
|
+
// metadata (ex. summary, description) since this is purely an operation-based
|
|
189
|
+
// merge
|
|
190
|
+
return {
|
|
191
|
+
...currentPathItem,
|
|
192
|
+
[method]: newZuploOperationObject,
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
export const mergeOpenApiDocumentOnPathMethod = (originalDocument, newDocument) => {
|
|
196
|
+
const created = new Set();
|
|
197
|
+
const merged = new Set();
|
|
198
|
+
let paths = structuredClone(originalDocument.paths);
|
|
199
|
+
if (newDocument.paths) {
|
|
200
|
+
paths = Object.entries(newDocument.paths).reduce((mergedPaths, [path, pathObject]) => {
|
|
201
|
+
const existingEntry = mergedPaths[path];
|
|
202
|
+
if (!existingEntry) {
|
|
203
|
+
mergedPaths[path] = pathObject;
|
|
204
|
+
METHODS.forEach((method) => {
|
|
205
|
+
const operation = pathObject[method];
|
|
206
|
+
if (operation) {
|
|
207
|
+
created.add(getOperationKey(method, path));
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
mergedPaths[path] = mergePathItems(existingEntry, pathObject);
|
|
213
|
+
METHODS.forEach((method) => {
|
|
214
|
+
const newOperation = pathObject[method];
|
|
215
|
+
const existingOperation = existingEntry[method];
|
|
216
|
+
if (!existingOperation && !newOperation) {
|
|
217
|
+
// Nothing changed
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (existingOperation && newOperation) {
|
|
221
|
+
// If there is a newOperation it will be merged into
|
|
222
|
+
// existingOperation
|
|
223
|
+
merged.add(getOperationKey(method, path));
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (newOperation) {
|
|
227
|
+
// If there is no existing operation, we add the new one
|
|
228
|
+
created.add(getOperationKey(method, path));
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return mergedPaths;
|
|
233
|
+
}, originalDocument.paths ?? {});
|
|
234
|
+
}
|
|
235
|
+
const retained = new Set(getAllOperationKeys(originalDocument.paths ?? {}).filter((operationKey) => !created.has(operationKey) && !merged.has(operationKey)));
|
|
236
|
+
const mergedDocument = {
|
|
237
|
+
info: newDocument.info,
|
|
238
|
+
openapi: mergeOpenApiVersion(originalDocument.openapi, newDocument.openapi),
|
|
239
|
+
components: mergeComponents(originalDocument.components, newDocument.components),
|
|
240
|
+
jsonSchemaDialect: newDocument.jsonSchemaDialect ?? originalDocument.jsonSchemaDialect,
|
|
241
|
+
servers: newDocument.servers ?? originalDocument.servers,
|
|
242
|
+
security: newDocument.security ?? originalDocument.security,
|
|
243
|
+
tags: newDocument.tags ?? originalDocument.tags,
|
|
244
|
+
externalDocs: newDocument.externalDocs ?? originalDocument.externalDocs,
|
|
245
|
+
paths,
|
|
246
|
+
};
|
|
247
|
+
return {
|
|
248
|
+
mergedDocument,
|
|
249
|
+
created,
|
|
250
|
+
merged,
|
|
251
|
+
retained,
|
|
252
|
+
};
|
|
253
|
+
};
|
|
254
|
+
const mergeComponents = (originalComponents, newComponents) => {
|
|
255
|
+
if (!originalComponents) {
|
|
256
|
+
return newComponents;
|
|
257
|
+
}
|
|
258
|
+
if (!newComponents) {
|
|
259
|
+
return originalComponents;
|
|
260
|
+
}
|
|
261
|
+
// We have to merge each component property to make sure old ones don't get
|
|
262
|
+
// get deleted
|
|
263
|
+
const { schemas, responses, parameters, examples, requestBodies, headers, securitySchemes, links, callbacks, pathItems, } = originalComponents;
|
|
264
|
+
const { schemas: newSchemas, responses: newResponses, parameters: newParameters, examples: newExamples, requestBodies: newRequestBodies, headers: newHeaders, securitySchemes: newSecuritySchemes, links: newLinks, callbacks: newCallbacks, pathItems: newPathItems, } = newComponents;
|
|
265
|
+
return {
|
|
266
|
+
schemas: schemas ? { ...schemas, ...newSchemas } : newSchemas,
|
|
267
|
+
responses: responses ? { ...responses, ...newResponses } : newResponses,
|
|
268
|
+
parameters: parameters
|
|
269
|
+
? { ...parameters, ...newParameters }
|
|
270
|
+
: newParameters,
|
|
271
|
+
examples: examples ? { ...examples, ...newExamples } : newExamples,
|
|
272
|
+
requestBodies: requestBodies
|
|
273
|
+
? { ...requestBodies, ...newRequestBodies }
|
|
274
|
+
: newRequestBodies,
|
|
275
|
+
headers: headers ? { ...headers, ...newHeaders } : newHeaders,
|
|
276
|
+
securitySchemes: securitySchemes
|
|
277
|
+
? { ...securitySchemes, ...newSecuritySchemes }
|
|
278
|
+
: newSecuritySchemes,
|
|
279
|
+
links: links ? { ...links, ...newLinks } : newLinks,
|
|
280
|
+
callbacks: callbacks ? { ...callbacks, ...newCallbacks } : newCallbacks,
|
|
281
|
+
pathItems: pathItems ? { ...pathItems, ...newPathItems } : newPathItems,
|
|
282
|
+
};
|
|
283
|
+
};
|
|
284
|
+
/**
|
|
285
|
+
* @description OpenAPI 3.1.0 is a superset of 3.0 so we should keep the
|
|
286
|
+
* document as 3.1 if it already is, or upgrade it to 3.1 if the new document is
|
|
287
|
+
*/
|
|
288
|
+
const mergeOpenApiVersion = (originalVersion, newDocumentVersion) => {
|
|
289
|
+
if (originalVersion.startsWith("3.1.")) {
|
|
290
|
+
return originalVersion;
|
|
291
|
+
}
|
|
292
|
+
if (newDocumentVersion.startsWith("3.1.")) {
|
|
293
|
+
return newDocumentVersion;
|
|
294
|
+
}
|
|
295
|
+
return originalVersion;
|
|
296
|
+
};
|
|
297
|
+
const mergePathItems = (originalPathItem, newPathItem) => {
|
|
298
|
+
const { summary, description, get, put, post, delete: deleteOperation, options, head, patch, trace, servers, parameters, } = originalPathItem;
|
|
299
|
+
const zuploPathProperties = originalPathItem[ZUPLO_OPEN_API_PATH_KEY];
|
|
300
|
+
const newZuploPathProperty = typeof newPathItem === "object" &&
|
|
301
|
+
newPathItem !== null &&
|
|
302
|
+
ZUPLO_OPEN_API_PATH_KEY in newPathItem
|
|
303
|
+
? newPathItem[ZUPLO_OPEN_API_PATH_KEY]
|
|
304
|
+
: undefined;
|
|
305
|
+
const { summary: newSummary, description: newDescription, get: newGetOperation, put: newPutOperation, post: newPostOperation, delete: newDeleteOperation, options: newOptionsOperation, head: newHeadOperation, patch: newPatchOperation, trace: newTraceOperation, servers: newServers, parameters: newParameters, } = newPathItem;
|
|
306
|
+
return {
|
|
307
|
+
summary: newSummary ?? summary,
|
|
308
|
+
description: newDescription ?? description,
|
|
309
|
+
[ZUPLO_OPEN_API_PATH_KEY]: newZuploPathProperty ?? zuploPathProperties,
|
|
310
|
+
servers: newServers ?? servers,
|
|
311
|
+
parameters: newParameters ?? parameters,
|
|
312
|
+
get: mergeOperationObjects(get, newGetOperation),
|
|
313
|
+
put: mergeOperationObjects(put, newPutOperation),
|
|
314
|
+
post: mergeOperationObjects(post, newPostOperation),
|
|
315
|
+
delete: mergeOperationObjects(deleteOperation, newDeleteOperation),
|
|
316
|
+
options: mergeOperationObjects(options, newOptionsOperation),
|
|
317
|
+
head: mergeOperationObjects(head, newHeadOperation),
|
|
318
|
+
patch: mergeOperationObjects(patch, newPatchOperation),
|
|
319
|
+
trace: mergeOperationObjects(trace, newTraceOperation),
|
|
320
|
+
};
|
|
321
|
+
};
|
|
322
|
+
const mergeOperationObjects = (originalOperationObject, newOperationObject) => {
|
|
323
|
+
if (!newOperationObject) {
|
|
324
|
+
// If it stopped existing in the new version, we leave the original untouched
|
|
325
|
+
return originalOperationObject;
|
|
326
|
+
}
|
|
327
|
+
// We preserve the gateway's behavior unless explicitly overridden
|
|
328
|
+
const originalZuploProperties = originalOperationObject?.[ZUPLO_OPEN_API_ROUTE_KEY];
|
|
329
|
+
const originalHiddenSetting = originalOperationObject?.[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG];
|
|
330
|
+
return {
|
|
331
|
+
operationId: v4(),
|
|
332
|
+
[ZUPLO_OPEN_API_ROUTE_KEY]: originalZuploProperties,
|
|
333
|
+
[OPEN_API_INTERNAL_PROPERTY_VENDOR_TAG]: originalHiddenSetting,
|
|
334
|
+
...newOperationObject,
|
|
335
|
+
};
|
|
336
|
+
};
|
|
337
|
+
const getAllOperationKeys = (pathsObject) => {
|
|
338
|
+
return Object.entries(pathsObject)
|
|
339
|
+
.map(([path, pathObject]) => {
|
|
340
|
+
const pathItemObject = pathObject;
|
|
341
|
+
const { get, put, post, delete: deleteOperation, options, head, patch, trace, } = pathItemObject;
|
|
342
|
+
const methods = [];
|
|
343
|
+
if (get) {
|
|
344
|
+
methods.push("get");
|
|
345
|
+
}
|
|
346
|
+
if (put) {
|
|
347
|
+
methods.push("put");
|
|
348
|
+
}
|
|
349
|
+
if (post) {
|
|
350
|
+
methods.push("post");
|
|
351
|
+
}
|
|
352
|
+
if (deleteOperation) {
|
|
353
|
+
methods.push("delete");
|
|
354
|
+
}
|
|
355
|
+
if (options) {
|
|
356
|
+
methods.push("options");
|
|
357
|
+
}
|
|
358
|
+
if (head) {
|
|
359
|
+
methods.push("head");
|
|
360
|
+
}
|
|
361
|
+
if (patch) {
|
|
362
|
+
methods.push("patch");
|
|
363
|
+
}
|
|
364
|
+
if (trace) {
|
|
365
|
+
methods.push("trace");
|
|
366
|
+
}
|
|
367
|
+
return methods.map((method) => getOperationKey(method, path));
|
|
368
|
+
})
|
|
369
|
+
.flat();
|
|
370
|
+
};
|
|
371
|
+
export const getOperationKey = (method, path) => `${method}${OPERATION_PATH_MERGE_DELIMITER}${path}`;
|
|
372
|
+
/**
|
|
373
|
+
* Create an index of operations by their operationId
|
|
374
|
+
*
|
|
375
|
+
* @param openapiSpec The OpenAPI specification object
|
|
376
|
+
* @returns A map of operationId -> { path, method }
|
|
377
|
+
*/
|
|
378
|
+
const indexOperationsById = (openapiSpec) => {
|
|
379
|
+
const operationsIndex = {};
|
|
380
|
+
const paths = openapiSpec.paths;
|
|
381
|
+
if (paths) {
|
|
382
|
+
Object.entries(paths).forEach(([path, pathItem]) => {
|
|
383
|
+
if (pathItem) {
|
|
384
|
+
METHODS.forEach((method) => {
|
|
385
|
+
const operation = pathItem[method];
|
|
386
|
+
if (operation?.operationId) {
|
|
387
|
+
operationsIndex[operation.operationId] = {
|
|
388
|
+
path,
|
|
389
|
+
method,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
return operationsIndex;
|
|
397
|
+
};
|
|
398
|
+
/**
|
|
399
|
+
* Add operation ID to any operations that don't have one, this makes
|
|
400
|
+
* onboarding smoother for new users
|
|
401
|
+
*/
|
|
402
|
+
export const addOperationIdsAsNecessary = (openApi) => {
|
|
403
|
+
const paths = openApi.paths;
|
|
404
|
+
if (!paths) {
|
|
405
|
+
return openApi;
|
|
406
|
+
}
|
|
407
|
+
for (const path of Object.keys(paths)) {
|
|
408
|
+
const pathItem = paths[path];
|
|
409
|
+
if (!pathItem) {
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
const methods = [
|
|
413
|
+
"get",
|
|
414
|
+
"put",
|
|
415
|
+
"post",
|
|
416
|
+
"delete",
|
|
417
|
+
"options",
|
|
418
|
+
"head",
|
|
419
|
+
"patch",
|
|
420
|
+
"trace",
|
|
421
|
+
];
|
|
422
|
+
for (const method of methods) {
|
|
423
|
+
const operation = pathItem[method];
|
|
424
|
+
if (operation && !operation.operationId) {
|
|
425
|
+
operation.operationId = v4();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return openApi;
|
|
430
|
+
};
|
|
431
|
+
/**
|
|
432
|
+
*
|
|
433
|
+
*/
|
|
434
|
+
export const removeOperationsWithoutAnId = (openApi) => {
|
|
435
|
+
const newDocument = { ...openApi };
|
|
436
|
+
const paths = newDocument.paths;
|
|
437
|
+
if (!paths) {
|
|
438
|
+
return openApi;
|
|
439
|
+
}
|
|
440
|
+
for (const path of Object.keys(paths)) {
|
|
441
|
+
const pathItem = paths[path];
|
|
442
|
+
if (!pathItem) {
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
for (const method of METHODS) {
|
|
446
|
+
const operation = pathItem[method];
|
|
447
|
+
if (operation && !operation.operationId) {
|
|
448
|
+
delete pathItem[method];
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return openApi;
|
|
453
|
+
};
|
|
454
|
+
//# sourceMappingURL=openapi-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-utils.js","sourceRoot":"","sources":["../src/openapi-utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@zuplo/openapi-tools",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "
|
|
5
|
+
"version": "6.40.12",
|
|
6
6
|
"description": "Tooling for OpenAPI files",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -22,7 +22,16 @@
|
|
|
22
22
|
"author": "Zuplo",
|
|
23
23
|
"license": "Copyright 2021",
|
|
24
24
|
"scripts": {
|
|
25
|
-
"build": "tsc --build"
|
|
25
|
+
"build": "tsc --build",
|
|
26
|
+
"test": "mocha",
|
|
27
|
+
"test:debug": "mocha --timeout 0 --parallel=false"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@zuplo/runtime": "^6.40.12",
|
|
31
|
+
"ajv": "^8.17.1",
|
|
32
|
+
"js-yaml": "^4.1.0",
|
|
33
|
+
"openapi-types": "^12.1.3",
|
|
34
|
+
"uuid": "^11.1.0"
|
|
26
35
|
},
|
|
27
36
|
"devDependencies": {
|
|
28
37
|
"@types/chai": "^5.0.0",
|
|
@@ -32,4 +41,4 @@
|
|
|
32
41
|
"mocha": "^10.7.3",
|
|
33
42
|
"typescript": "^5.6.2"
|
|
34
43
|
}
|
|
35
|
-
}
|
|
44
|
+
}
|