oas 38.6.1 → 39.0.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/dist/analyzer/index.cjs +22 -22
- package/dist/analyzer/index.js +2 -2
- package/dist/analyzer/types.d.cts +2 -1
- package/dist/analyzer/types.d.ts +2 -1
- package/dist/{chunk-HQEDOVWO.cjs → chunk-5ERUEBRH.cjs} +42 -40
- package/dist/chunk-5ERUEBRH.cjs.map +1 -0
- package/dist/{chunk-3X7ZLPYE.js → chunk-E6QPSOEQ.js} +64 -30
- package/dist/chunk-E6QPSOEQ.js.map +1 -0
- package/dist/{chunk-XG4HGNCN.js → chunk-IQVLGHQA.js} +1 -1
- package/dist/chunk-IQVLGHQA.js.map +1 -0
- package/dist/{chunk-5745XRSJ.js → chunk-O7F6GOHG.js} +141 -64
- package/dist/chunk-O7F6GOHG.js.map +1 -0
- package/dist/{chunk-RUHLHK66.cjs → chunk-QRWBDGLR.cjs} +331 -254
- package/dist/chunk-QRWBDGLR.cjs.map +1 -0
- package/dist/{chunk-PZR3GKKO.js → chunk-RSLFW7GA.js} +10 -8
- package/dist/chunk-RSLFW7GA.js.map +1 -0
- package/dist/{chunk-7PWF3F2W.cjs → chunk-X7BGCIJN.cjs} +1 -1
- package/dist/chunk-X7BGCIJN.cjs.map +1 -0
- package/dist/{chunk-OBYCSKPS.cjs → chunk-XEZRUXJ4.cjs} +101 -67
- package/dist/chunk-XEZRUXJ4.cjs.map +1 -0
- package/dist/extensions.d.cts +1 -1
- package/dist/extensions.d.ts +1 -1
- package/dist/{get-parameters-as-json-schema-Cbp85O99.d.cts → get-parameters-as-json-schema-BcfrBiUL.d.cts} +2 -1
- package/dist/{get-parameters-as-json-schema-BZjPPE3y.d.ts → get-parameters-as-json-schema-BfdNhqGF.d.ts} +2 -1
- package/dist/{index-BmHgGqbY.d.cts → index-CUPzkNkx.d.cts} +2 -1
- package/dist/{index-B097koLb.d.ts → index-DHxu8QSJ.d.ts} +2 -1
- package/dist/index.cjs +63 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +15 -27
- package/dist/index.js.map +1 -1
- package/dist/operation/index.cjs +4 -4
- package/dist/operation/index.d.cts +1 -1
- package/dist/operation/index.d.ts +1 -1
- package/dist/operation/index.js +3 -3
- package/dist/pruner/index.cjs +7 -6
- package/dist/pruner/index.cjs.map +1 -1
- package/dist/pruner/index.d.cts +2 -2
- package/dist/pruner/index.d.ts +2 -2
- package/dist/pruner/index.js +6 -5
- package/dist/pruner/index.js.map +1 -1
- package/dist/reducer/index.cjs +7 -6
- package/dist/reducer/index.cjs.map +1 -1
- package/dist/reducer/index.d.cts +2 -2
- package/dist/reducer/index.d.ts +2 -2
- package/dist/reducer/index.js +6 -5
- package/dist/reducer/index.js.map +1 -1
- package/dist/types.cjs +2 -2
- package/dist/types.d.cts +11 -3
- package/dist/types.d.ts +11 -3
- package/dist/types.js +1 -1
- package/dist/utils.cjs +3 -3
- package/dist/utils.d.cts +4 -4
- package/dist/utils.d.ts +4 -4
- package/dist/utils.js +2 -2
- package/package.json +4 -4
- package/dist/chunk-3X7ZLPYE.js.map +0 -1
- package/dist/chunk-5745XRSJ.js.map +0 -1
- package/dist/chunk-7PWF3F2W.cjs.map +0 -1
- package/dist/chunk-HQEDOVWO.cjs.map +0 -1
- package/dist/chunk-OBYCSKPS.cjs.map +0 -1
- package/dist/chunk-PZR3GKKO.js.map +0 -1
- package/dist/chunk-RUHLHK66.cjs.map +0 -1
- package/dist/chunk-XG4HGNCN.js.map +0 -1
package/dist/analyzer/index.cjs
CHANGED
|
@@ -8,12 +8,12 @@ var _chunkCOHEPMUPcjs = require('../chunk-COHEPMUP.cjs');
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _chunkXEZRUXJ4cjs = require('../chunk-XEZRUXJ4.cjs');
|
|
12
12
|
require('../chunk-47FD2BIN.cjs');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _chunkX7BGCIJNcjs = require('../chunk-X7BGCIJN.cjs');
|
|
17
17
|
|
|
18
18
|
// src/analyzer/dereference.ts
|
|
19
19
|
var _openapiparser = require('@readme/openapi-parser');
|
|
@@ -116,7 +116,7 @@ function queryCached(queries, definition) {
|
|
|
116
116
|
// src/analyzer/scope.ts
|
|
117
117
|
var _jsonpointer = require('jsonpointer'); var _jsonpointer2 = _interopRequireDefault(_jsonpointer);
|
|
118
118
|
function canonicalizeRefPointer($ref) {
|
|
119
|
-
const pointer =
|
|
119
|
+
const pointer = _chunkXEZRUXJ4cjs.toPointer.call(void 0, $ref);
|
|
120
120
|
try {
|
|
121
121
|
return decodeURIComponent(pointer);
|
|
122
122
|
} catch (e) {
|
|
@@ -124,13 +124,13 @@ function canonicalizeRefPointer($ref) {
|
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
function resolvePathItemTargetPointer(raw, definition) {
|
|
127
|
-
if (!
|
|
127
|
+
if (!_chunkX7BGCIJNcjs.isRef.call(void 0, raw)) {
|
|
128
128
|
return void 0;
|
|
129
129
|
}
|
|
130
130
|
let current = raw;
|
|
131
131
|
let lastRef = raw.$ref;
|
|
132
132
|
const seen = /* @__PURE__ */ new Set();
|
|
133
|
-
while (
|
|
133
|
+
while (_chunkX7BGCIJNcjs.isRef.call(void 0, current)) {
|
|
134
134
|
const ref = current.$ref;
|
|
135
135
|
if (seen.has(ref)) {
|
|
136
136
|
break;
|
|
@@ -143,7 +143,7 @@ function resolvePathItemTargetPointer(raw, definition) {
|
|
|
143
143
|
} catch (e2) {
|
|
144
144
|
break;
|
|
145
145
|
}
|
|
146
|
-
if (next === void 0 || !
|
|
146
|
+
if (next === void 0 || !_chunkX7BGCIJNcjs.isRef.call(void 0, next)) {
|
|
147
147
|
break;
|
|
148
148
|
}
|
|
149
149
|
current = next;
|
|
@@ -154,15 +154,15 @@ function resolveKey(keys, target) {
|
|
|
154
154
|
return keys.find((key) => key === target) || keys.find((key) => key.toLowerCase() === target.toLowerCase());
|
|
155
155
|
}
|
|
156
156
|
function resolvePathItem(raw, definition) {
|
|
157
|
-
const resolved =
|
|
158
|
-
if (!resolved || typeof resolved !== "object" ||
|
|
157
|
+
const resolved = _chunkXEZRUXJ4cjs.dereferenceRef.call(void 0, raw, definition);
|
|
158
|
+
if (!resolved || typeof resolved !== "object" || _chunkX7BGCIJNcjs.isRef.call(void 0, resolved)) {
|
|
159
159
|
return void 0;
|
|
160
160
|
}
|
|
161
161
|
return resolved;
|
|
162
162
|
}
|
|
163
163
|
function resolveMethodKey(container, method) {
|
|
164
164
|
const methodKey = resolveKey(Object.keys(container), method);
|
|
165
|
-
if (!methodKey || !
|
|
165
|
+
if (!methodKey || !_chunkXEZRUXJ4cjs.supportedMethods.includes(methodKey.toLowerCase())) {
|
|
166
166
|
return void 0;
|
|
167
167
|
}
|
|
168
168
|
return methodKey;
|
|
@@ -178,14 +178,14 @@ function accumulateReachableRefs(definition, seeds) {
|
|
|
178
178
|
reachable.add(ref);
|
|
179
179
|
let resolved;
|
|
180
180
|
try {
|
|
181
|
-
resolved = _jsonpointer2.default.get(definition,
|
|
181
|
+
resolved = _jsonpointer2.default.get(definition, _chunkXEZRUXJ4cjs.toPointer.call(void 0, ref));
|
|
182
182
|
} catch (e3) {
|
|
183
183
|
continue;
|
|
184
184
|
}
|
|
185
185
|
if (resolved === void 0) {
|
|
186
186
|
continue;
|
|
187
187
|
}
|
|
188
|
-
|
|
188
|
+
_chunkXEZRUXJ4cjs.collectRefsInSchema.call(void 0, resolved).forEach((nestedRef) => {
|
|
189
189
|
if (!reachable.has(nestedRef)) {
|
|
190
190
|
queue.push(nestedRef);
|
|
191
191
|
}
|
|
@@ -195,7 +195,7 @@ function accumulateReachableRefs(definition, seeds) {
|
|
|
195
195
|
}
|
|
196
196
|
function buildAnchors(rootPointer, extraPointers, reachableRefs) {
|
|
197
197
|
const anchors = [rootPointer, ...extraPointers];
|
|
198
|
-
reachableRefs.forEach((ref) => anchors.push(
|
|
198
|
+
reachableRefs.forEach((ref) => anchors.push(_chunkXEZRUXJ4cjs.toPointer.call(void 0, ref)));
|
|
199
199
|
return { anchors, anchorPrefixes: anchors.map((anchor) => `${anchor}/`) };
|
|
200
200
|
}
|
|
201
201
|
function collectSecuritySchemeRefs(security) {
|
|
@@ -230,16 +230,16 @@ function computeOperationScope(definition, path, method) {
|
|
|
230
230
|
if (!operation || typeof operation !== "object") {
|
|
231
231
|
throw new Error(`Operation \`${method} ${path}\` not found.`);
|
|
232
232
|
}
|
|
233
|
-
const rootPointer = `/paths/${
|
|
233
|
+
const rootPointer = `/paths/${_chunkXEZRUXJ4cjs.encodePointer.call(void 0, pathKey)}/${methodKey}`;
|
|
234
234
|
const extraPointers = [];
|
|
235
|
-
const seeds = new Set(
|
|
235
|
+
const seeds = new Set(_chunkXEZRUXJ4cjs.collectRefsInSchema.call(void 0, operation));
|
|
236
236
|
const targetPointer = resolvePathItemTargetPointer(rawPathItem, definition);
|
|
237
237
|
if (targetPointer) {
|
|
238
238
|
extraPointers.push(`${targetPointer}/${methodKey}`);
|
|
239
239
|
}
|
|
240
240
|
if (pathItem.parameters) {
|
|
241
|
-
extraPointers.push(targetPointer ? `${targetPointer}/parameters` : `/paths/${
|
|
242
|
-
|
|
241
|
+
extraPointers.push(targetPointer ? `${targetPointer}/parameters` : `/paths/${_chunkXEZRUXJ4cjs.encodePointer.call(void 0, pathKey)}/parameters`);
|
|
242
|
+
_chunkXEZRUXJ4cjs.collectRefsInSchema.call(void 0, pathItem.parameters).forEach((ref) => seeds.add(ref));
|
|
243
243
|
}
|
|
244
244
|
const security = "security" in operation ? operation.security : definition.security;
|
|
245
245
|
collectSecuritySchemeRefs(security).forEach((ref) => seeds.add(ref));
|
|
@@ -265,18 +265,18 @@ function computeWebhookScope(definition, webhookName, method) {
|
|
|
265
265
|
if (!operation || typeof operation !== "object") {
|
|
266
266
|
throw new Error(`Webhook operation \`${method} ${webhookName}\` not found.`);
|
|
267
267
|
}
|
|
268
|
-
const rootPointer = `/webhooks/${
|
|
268
|
+
const rootPointer = `/webhooks/${_chunkXEZRUXJ4cjs.encodePointer.call(void 0, webhookKey)}/${methodKey}`;
|
|
269
269
|
const extraPointers = [];
|
|
270
|
-
const seeds = new Set(
|
|
270
|
+
const seeds = new Set(_chunkXEZRUXJ4cjs.collectRefsInSchema.call(void 0, operation));
|
|
271
271
|
const targetPointer = resolvePathItemTargetPointer(rawWebhook, definition);
|
|
272
272
|
if (targetPointer) {
|
|
273
273
|
extraPointers.push(`${targetPointer}/${methodKey}`);
|
|
274
274
|
}
|
|
275
275
|
if (webhook.parameters) {
|
|
276
276
|
extraPointers.push(
|
|
277
|
-
targetPointer ? `${targetPointer}/parameters` : `/webhooks/${
|
|
277
|
+
targetPointer ? `${targetPointer}/parameters` : `/webhooks/${_chunkXEZRUXJ4cjs.encodePointer.call(void 0, webhookKey)}/parameters`
|
|
278
278
|
);
|
|
279
|
-
|
|
279
|
+
_chunkXEZRUXJ4cjs.collectRefsInSchema.call(void 0, webhook.parameters).forEach((ref) => seeds.add(ref));
|
|
280
280
|
}
|
|
281
281
|
const security = "security" in operation ? operation.security : definition.security;
|
|
282
282
|
collectSecuritySchemeRefs(security).forEach((ref) => seeds.add(ref));
|
|
@@ -467,7 +467,7 @@ async function buildAnalysis(definition, query2, scope) {
|
|
|
467
467
|
}
|
|
468
468
|
if (!query2 || query2.includes("circularRefs")) {
|
|
469
469
|
const { circularRefs: dereferencedCircularRefs } = await dereferenceOasShared(definition);
|
|
470
|
-
const circularRefs = (scope ? dereferencedCircularRefs.filter((ref) => isPointerInScope(
|
|
470
|
+
const circularRefs = (scope ? dereferencedCircularRefs.filter((ref) => isPointerInScope(_chunkXEZRUXJ4cjs.toPointer.call(void 0, ref), scope)) : [...dereferencedCircularRefs]).toSorted();
|
|
471
471
|
analysis.circularRefs = {
|
|
472
472
|
present: !!circularRefs.length,
|
|
473
473
|
locations: circularRefs
|
|
@@ -568,7 +568,7 @@ async function analyzeWebhookOperation(definition, {
|
|
|
568
568
|
method,
|
|
569
569
|
query: query2
|
|
570
570
|
}) {
|
|
571
|
-
if (!
|
|
571
|
+
if (!_chunkX7BGCIJNcjs.isOpenAPI31.call(void 0, definition)) {
|
|
572
572
|
throw new TypeError("The supplied definition is not a OpenAPI 3.1 definition.");
|
|
573
573
|
}
|
|
574
574
|
const scope = computeWebhookScope(definition, webhookName, method);
|
package/dist/analyzer/index.js
CHANGED
|
@@ -8,12 +8,12 @@ import {
|
|
|
8
8
|
encodePointer,
|
|
9
9
|
supportedMethods,
|
|
10
10
|
toPointer
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-E6QPSOEQ.js";
|
|
12
12
|
import "../chunk-JHDEAXSK.js";
|
|
13
13
|
import {
|
|
14
14
|
isOpenAPI31,
|
|
15
15
|
isRef
|
|
16
|
-
} from "../chunk-
|
|
16
|
+
} from "../chunk-IQVLGHQA.js";
|
|
17
17
|
|
|
18
18
|
// src/analyzer/dereference.ts
|
|
19
19
|
import { dereference } from "@readme/openapi-parser";
|
|
@@ -28,4 +28,5 @@ interface OASAnalysis {
|
|
|
28
28
|
webhooks?: OASAnalysisFeature;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
export { AnalyzerQueries
|
|
31
|
+
export { AnalyzerQueries };
|
|
32
|
+
export type { AnalyzerQuery, OASAnalysis, OASAnalysisFeature, OASAnalysisGeneral };
|
package/dist/analyzer/types.d.ts
CHANGED
|
@@ -28,4 +28,5 @@ interface OASAnalysis {
|
|
|
28
28
|
webhooks?: OASAnalysisFeature;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
export { AnalyzerQueries
|
|
31
|
+
export { AnalyzerQueries };
|
|
32
|
+
export type { AnalyzerQuery, OASAnalysis, OASAnalysisFeature, OASAnalysisGeneral };
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
var _chunkCOHEPMUPcjs = require('./chunk-COHEPMUP.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkQRWBDGLRcjs = require('./chunk-QRWBDGLR.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunkXEZRUXJ4cjs = require('./chunk-XEZRUXJ4.cjs');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _chunkX7BGCIJNcjs = require('./chunk-X7BGCIJN.cjs');
|
|
17
17
|
|
|
18
18
|
// src/lib/transformer/index.ts
|
|
19
19
|
var _jsonpointer = require('jsonpointer'); var _jsonpointer2 = _interopRequireDefault(_jsonpointer);
|
|
@@ -156,7 +156,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
156
156
|
constructor(definition, options) {;_class2.prototype.__init2.call(this);_class2.prototype.__init3.call(this);_class2.prototype.__init4.call(this);_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);_class2.prototype.__init10.call(this);_class2.prototype.__init11.call(this);_class2.prototype.__init12.call(this);_class2.prototype.__init13.call(this);_class2.prototype.__init14.call(this);_class2.prototype.__init15.call(this);_class2.prototype.__init16.call(this);
|
|
157
157
|
this.definition = structuredClone(definition);
|
|
158
158
|
this.mode = options.mode;
|
|
159
|
-
const { children, refs } =
|
|
159
|
+
const { children, refs } = _chunkXEZRUXJ4cjs.findDiscriminatorChildren.call(void 0, this.definition);
|
|
160
160
|
children.forEach((childNames, parentName) => {
|
|
161
161
|
const parentRef = refs.get(parentName);
|
|
162
162
|
if (parentRef) {
|
|
@@ -267,7 +267,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
267
267
|
if ("components" in this.definition) {
|
|
268
268
|
Object.keys(this.definition.components || {}).forEach((componentType) => {
|
|
269
269
|
Object.keys(_optionalChain([this, 'access', _3 => _3.definition, 'access', _4 => _4.components, 'optionalAccess', _5 => _5[componentType]]) || {}).forEach((component) => {
|
|
270
|
-
const componentPointer = `#/components/${componentType}/${
|
|
270
|
+
const componentPointer = `#/components/${componentType}/${_chunkXEZRUXJ4cjs.encodePointer.call(void 0, component)}`;
|
|
271
271
|
const refIsUsed = this.$refs.has(componentPointer) || Array.from(this.$refs).some((ref) => {
|
|
272
272
|
return ref.startsWith(`${componentPointer}/`);
|
|
273
273
|
});
|
|
@@ -363,12 +363,12 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
363
363
|
if (!_optionalChain([match, 'optionalAccess', _19 => _19[1]])) {
|
|
364
364
|
return null;
|
|
365
365
|
}
|
|
366
|
-
const path =
|
|
366
|
+
const path = _chunkXEZRUXJ4cjs.decodePointer.call(void 0, match[1]);
|
|
367
367
|
const segment = match[2];
|
|
368
368
|
if (!segment) {
|
|
369
369
|
return { path, retention: "all" };
|
|
370
370
|
}
|
|
371
|
-
if (
|
|
371
|
+
if (_chunkXEZRUXJ4cjs.supportedMethods.includes(segment.toLowerCase())) {
|
|
372
372
|
return { path, method: segment, retention: "operation" };
|
|
373
373
|
}
|
|
374
374
|
return { path, retention: "container" };
|
|
@@ -385,12 +385,12 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
385
385
|
if (!_optionalChain([match, 'optionalAccess', _20 => _20[1]])) {
|
|
386
386
|
return null;
|
|
387
387
|
}
|
|
388
|
-
const name =
|
|
388
|
+
const name = _chunkXEZRUXJ4cjs.decodePointer.call(void 0, match[1]);
|
|
389
389
|
const segment = match[2];
|
|
390
390
|
if (!segment) {
|
|
391
391
|
return { name, retention: "all" };
|
|
392
392
|
}
|
|
393
|
-
if (
|
|
393
|
+
if (_chunkXEZRUXJ4cjs.supportedMethods.includes(segment.toLowerCase())) {
|
|
394
394
|
return { name, method: segment, retention: "operation" };
|
|
395
395
|
}
|
|
396
396
|
return { name, retention: "container" };
|
|
@@ -402,7 +402,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
402
402
|
* remains as a dangling `$ref`.
|
|
403
403
|
*/
|
|
404
404
|
retainReferencedPathItem(pathItem) {
|
|
405
|
-
if (!
|
|
405
|
+
if (!_chunkX7BGCIJNcjs.isRef.call(void 0, pathItem) || this.$refs.has(pathItem.$ref)) {
|
|
406
406
|
return;
|
|
407
407
|
}
|
|
408
408
|
this.$refs.add(pathItem.$ref);
|
|
@@ -413,7 +413,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
413
413
|
* so they match the same form used for authored `$ref`s (`foo/bar` → `foo~1bar`).
|
|
414
414
|
*/
|
|
415
415
|
retainSecurityScheme(scheme) {
|
|
416
|
-
this.$refs.add(`#/components/securitySchemes/${
|
|
416
|
+
this.$refs.add(`#/components/securitySchemes/${_chunkXEZRUXJ4cjs.encodePointer.call(void 0, scheme)}`);
|
|
417
417
|
}
|
|
418
418
|
/** Record a `#/paths` `$ref` so the target Path Item or operation is not dropped. */
|
|
419
419
|
recordPathRef($ref) {
|
|
@@ -457,7 +457,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
457
457
|
}
|
|
458
458
|
/** Look up a webhook Path Item by name, ignoring key casing. */
|
|
459
459
|
findWebhook(name) {
|
|
460
|
-
if (!
|
|
460
|
+
if (!_chunkX7BGCIJNcjs.isOpenAPI31.call(void 0, this.definition) || !this.definition.webhooks) {
|
|
461
461
|
return void 0;
|
|
462
462
|
}
|
|
463
463
|
const nameLC = name.toLowerCase();
|
|
@@ -472,13 +472,13 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
472
472
|
if (!pathItem) {
|
|
473
473
|
return;
|
|
474
474
|
}
|
|
475
|
-
if (
|
|
475
|
+
if (_chunkX7BGCIJNcjs.isRef.call(void 0, pathItem)) {
|
|
476
476
|
this.$refs.add(pathItem.$ref);
|
|
477
477
|
this.accumulateUsedRefs(this.definition, this.$refs, pathItem.$ref);
|
|
478
478
|
return;
|
|
479
479
|
}
|
|
480
480
|
Object.entries(pathItem).forEach(([key, value]) => {
|
|
481
|
-
if (
|
|
481
|
+
if (_chunkXEZRUXJ4cjs.supportedMethods.includes(key.toLowerCase()) || value === void 0) {
|
|
482
482
|
return;
|
|
483
483
|
}
|
|
484
484
|
this.queryForRefPointers(value).forEach(({ value: ref }) => {
|
|
@@ -534,7 +534,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
534
534
|
shouldRetainOperation(selection, key, method, operation) {
|
|
535
535
|
if (this.mode === "reduce") {
|
|
536
536
|
if (selection.hasSelections && !selection.matches(key, method)) return false;
|
|
537
|
-
if (this.hasOperationIdSelection && !this.operationIdSelection.has(
|
|
537
|
+
if (this.hasOperationIdSelection && !this.operationIdSelection.has(_chunkQRWBDGLRcjs.Operation.getOperationId(key, method, operation))) {
|
|
538
538
|
return false;
|
|
539
539
|
}
|
|
540
540
|
if (this.hasTagSelection && !(operation.tags || []).some((tag) => this.tagSelection.includes(tag.toLowerCase()))) {
|
|
@@ -542,7 +542,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
542
542
|
}
|
|
543
543
|
} else {
|
|
544
544
|
if (selection.hasSelections && selection.matches(key, method)) return false;
|
|
545
|
-
if (this.hasOperationIdSelection && this.operationIdSelection.has(
|
|
545
|
+
if (this.hasOperationIdSelection && this.operationIdSelection.has(_chunkQRWBDGLRcjs.Operation.getOperationId(key, method, operation))) {
|
|
546
546
|
return false;
|
|
547
547
|
}
|
|
548
548
|
if (this.hasTagSelection && (operation.tags || []).some((tag) => this.tagSelection.includes(tag.toLowerCase()))) {
|
|
@@ -553,7 +553,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
553
553
|
}
|
|
554
554
|
/** Determine whether a path item contains at least one HTTP operation. */
|
|
555
555
|
hasOperations(pathItem) {
|
|
556
|
-
return Boolean(pathItem &&
|
|
556
|
+
return Boolean(pathItem && _chunkXEZRUXJ4cjs.supportedMethods.some((method) => method in pathItem));
|
|
557
557
|
}
|
|
558
558
|
/**
|
|
559
559
|
* Accumulate any `$ref` pointers that are used by common Path Item parameters.
|
|
@@ -590,7 +590,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
590
590
|
return;
|
|
591
591
|
}
|
|
592
592
|
const pathItem = _optionalChain([this, 'access', _24 => _24.definition, 'access', _25 => _25.paths, 'optionalAccess', _26 => _26[path]]);
|
|
593
|
-
if (
|
|
593
|
+
if (_chunkX7BGCIJNcjs.isRef.call(void 0, pathItem)) {
|
|
594
594
|
this.$refs.add(pathItem.$ref);
|
|
595
595
|
this.accumulateUsedRefs(this.definition, this.$refs, pathItem.$ref);
|
|
596
596
|
}
|
|
@@ -598,7 +598,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
598
598
|
this.accumulateParameterRefs(_optionalChain([pathItem, 'optionalAccess', _27 => _27.parameters]));
|
|
599
599
|
}
|
|
600
600
|
Object.keys(pathItem || {}).forEach((method) => {
|
|
601
|
-
if (method === "parameters" || !
|
|
601
|
+
if (method === "parameters" || !_chunkXEZRUXJ4cjs.supportedMethods.includes(method.toLowerCase())) {
|
|
602
602
|
return;
|
|
603
603
|
}
|
|
604
604
|
const operation = _optionalChain([this, 'access', _28 => _28.definition, 'access', _29 => _29.paths, 'optionalAccess', _30 => _30[path], 'optionalAccess', _31 => _31[method]]);
|
|
@@ -635,7 +635,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
635
635
|
*
|
|
636
636
|
*/
|
|
637
637
|
walkWebhooks() {
|
|
638
|
-
if (!
|
|
638
|
+
if (!_chunkX7BGCIJNcjs.isOpenAPI31.call(void 0, this.definition)) {
|
|
639
639
|
return;
|
|
640
640
|
} else if (!("webhooks" in this.definition) || !this.definition.webhooks) {
|
|
641
641
|
return;
|
|
@@ -657,7 +657,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
657
657
|
this.accumulateParameterRefs(webhook.parameters);
|
|
658
658
|
}
|
|
659
659
|
Object.keys(webhook).forEach((method) => {
|
|
660
|
-
if (method === "parameters" || !
|
|
660
|
+
if (method === "parameters" || !_chunkXEZRUXJ4cjs.supportedMethods.includes(method.toLowerCase())) {
|
|
661
661
|
return;
|
|
662
662
|
}
|
|
663
663
|
const operation = webhook[method];
|
|
@@ -705,20 +705,21 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
705
705
|
return;
|
|
706
706
|
}
|
|
707
707
|
const pathItem = _optionalChain([this, 'access', _38 => _38.definition, 'access', _39 => _39.paths, 'optionalAccess', _40 => _40[path]]);
|
|
708
|
-
if (
|
|
708
|
+
if (_chunkX7BGCIJNcjs.isRef.call(void 0, pathItem)) {
|
|
709
709
|
if (excludePathItem && !this.isPathRetainedByRef(pathLC)) {
|
|
710
710
|
_optionalChainDelete([this, 'access', _41 => _41.definition, 'access', _42 => _42.paths, 'optionalAccess', _43 => delete _43[path]]);
|
|
711
711
|
}
|
|
712
712
|
return;
|
|
713
713
|
}
|
|
714
|
+
const pathOperations = pathItem;
|
|
714
715
|
let removedOperation = false;
|
|
715
716
|
Object.keys(pathItem || {}).forEach((method) => {
|
|
716
717
|
const methodLC = method.toLowerCase();
|
|
717
|
-
if (method === "parameters" || !
|
|
718
|
+
if (method === "parameters" || !_chunkXEZRUXJ4cjs.supportedMethods.includes(methodLC)) {
|
|
718
719
|
return;
|
|
719
720
|
}
|
|
720
721
|
const retainedByRef = this.isPathOperationRetainedByRef(pathLC, methodLC);
|
|
721
|
-
const operation = _optionalChain([
|
|
722
|
+
const operation = _optionalChain([pathOperations, 'optionalAccess', _44 => _44[method]]);
|
|
722
723
|
if (!operation) {
|
|
723
724
|
throw new Error(`Operation \`${method} ${path}\` not found`);
|
|
724
725
|
}
|
|
@@ -727,14 +728,14 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
727
728
|
throw new Error(`Cannot remove operation \`${method.toUpperCase()} ${path}\` because it is referenced.`);
|
|
728
729
|
}
|
|
729
730
|
if (!retainedByRef) {
|
|
730
|
-
_optionalChainDelete([
|
|
731
|
+
_optionalChainDelete([pathOperations, 'optionalAccess', _45 => delete _45[method]]);
|
|
731
732
|
removedOperation = true;
|
|
732
733
|
return;
|
|
733
734
|
}
|
|
734
735
|
}
|
|
735
|
-
this.accumulateParameterRefs(_optionalChain([pathItem, 'optionalAccess',
|
|
736
|
+
this.accumulateParameterRefs(_optionalChain([pathItem, 'optionalAccess', _46 => _46.parameters]));
|
|
736
737
|
if ("tags" in operation) {
|
|
737
|
-
_optionalChain([operation, 'access',
|
|
738
|
+
_optionalChain([operation, 'access', _47 => _47.tags, 'optionalAccess', _48 => _48.forEach, 'call', _49 => _49((tag) => {
|
|
738
739
|
this.usedTags.add(tag);
|
|
739
740
|
})]);
|
|
740
741
|
}
|
|
@@ -746,8 +747,8 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
746
747
|
});
|
|
747
748
|
}
|
|
748
749
|
});
|
|
749
|
-
if (!this.isPathContainerKept(pathLC) && ((removedOperation || this.mode === "reduce" && excludePathItem) && !this.hasOperations(pathItem) || this.mode === "reduce" && !Object.keys(_optionalChain([this, 'access',
|
|
750
|
-
_optionalChainDelete([this, 'access',
|
|
750
|
+
if (!this.isPathContainerKept(pathLC) && ((removedOperation || this.mode === "reduce" && excludePathItem) && !this.hasOperations(pathItem) || this.mode === "reduce" && !Object.keys(_optionalChain([this, 'access', _50 => _50.definition, 'access', _51 => _51.paths, 'optionalAccess', _52 => _52[path]]) || {}).length)) {
|
|
751
|
+
_optionalChainDelete([this, 'access', _53 => _53.definition, 'access', _54 => _54.paths, 'optionalAccess', _55 => delete _55[path]]);
|
|
751
752
|
}
|
|
752
753
|
});
|
|
753
754
|
if (!Object.keys(this.definition.paths || {}).length) {
|
|
@@ -765,7 +766,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
765
766
|
* Transform our `webhooks` object according to the webhooks and operations that we've selected.
|
|
766
767
|
*/
|
|
767
768
|
transformWebhooks() {
|
|
768
|
-
if (!
|
|
769
|
+
if (!_chunkX7BGCIJNcjs.isOpenAPI31.call(void 0, this.definition)) {
|
|
769
770
|
return;
|
|
770
771
|
} else if (!("webhooks" in this.definition) || !this.definition.webhooks) {
|
|
771
772
|
return;
|
|
@@ -778,26 +779,27 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
778
779
|
if (this.isWebhookRetainedByRef(nameLC)) {
|
|
779
780
|
throw new Error(`Cannot remove webhook \`${webhookName}\` because one of its operations is referenced.`);
|
|
780
781
|
}
|
|
781
|
-
_optionalChainDelete([definition, 'access',
|
|
782
|
+
_optionalChainDelete([definition, 'access', _56 => _56.webhooks, 'optionalAccess', _57 => delete _57[webhookName]]);
|
|
782
783
|
return;
|
|
783
784
|
}
|
|
784
|
-
const webhook = _optionalChain([definition, 'access',
|
|
785
|
+
const webhook = _optionalChain([definition, 'access', _58 => _58.webhooks, 'optionalAccess', _59 => _59[webhookName]]);
|
|
785
786
|
if (!webhook || typeof webhook !== "object") {
|
|
786
787
|
return;
|
|
787
788
|
}
|
|
788
|
-
if (
|
|
789
|
+
if (_chunkX7BGCIJNcjs.isRef.call(void 0, webhook)) {
|
|
789
790
|
if (excludeWebhook && !this.isWebhookRetainedByRef(nameLC)) {
|
|
790
|
-
_optionalChainDelete([definition, 'access',
|
|
791
|
+
_optionalChainDelete([definition, 'access', _60 => _60.webhooks, 'optionalAccess', _61 => delete _61[webhookName]]);
|
|
791
792
|
}
|
|
792
793
|
return;
|
|
793
794
|
}
|
|
795
|
+
const webhookOperations = webhook;
|
|
794
796
|
let removedOperation = false;
|
|
795
797
|
Object.keys(webhook).forEach((method) => {
|
|
796
798
|
const methodLC = method.toLowerCase();
|
|
797
|
-
if (method === "parameters" || !
|
|
799
|
+
if (method === "parameters" || !_chunkXEZRUXJ4cjs.supportedMethods.includes(methodLC)) {
|
|
798
800
|
return;
|
|
799
801
|
}
|
|
800
|
-
const operation =
|
|
802
|
+
const operation = webhookOperations[method];
|
|
801
803
|
if (!operation) {
|
|
802
804
|
throw new Error(`Webhook operation \`${method} ${webhookName}\` not found`);
|
|
803
805
|
}
|
|
@@ -809,7 +811,7 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
809
811
|
);
|
|
810
812
|
}
|
|
811
813
|
if (!retainedByRef) {
|
|
812
|
-
delete
|
|
814
|
+
delete webhookOperations[method];
|
|
813
815
|
removedOperation = true;
|
|
814
816
|
return;
|
|
815
817
|
}
|
|
@@ -824,8 +826,8 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
824
826
|
});
|
|
825
827
|
});
|
|
826
828
|
});
|
|
827
|
-
if (!this.isWebhookContainerKept(nameLC) && ((removedOperation || this.mode === "reduce" && excludeWebhook) && !this.hasOperations(webhook) || this.mode === "reduce" && !Object.keys(_optionalChain([definition, 'access',
|
|
828
|
-
_optionalChainDelete([definition, 'access',
|
|
829
|
+
if (!this.isWebhookContainerKept(nameLC) && ((removedOperation || this.mode === "reduce" && excludeWebhook) && !this.hasOperations(webhook) || this.mode === "reduce" && !Object.keys(_optionalChain([definition, 'access', _62 => _62.webhooks, 'optionalAccess', _63 => _63[webhookName]]) || {}).length)) {
|
|
830
|
+
_optionalChainDelete([definition, 'access', _64 => _64.webhooks, 'optionalAccess', _65 => delete _65[webhookName]]);
|
|
829
831
|
}
|
|
830
832
|
});
|
|
831
833
|
if (definition.webhooks && !Object.keys(definition.webhooks).length) {
|
|
@@ -837,4 +839,4 @@ var OpenAPITransformer = (_class2 = class {
|
|
|
837
839
|
|
|
838
840
|
|
|
839
841
|
exports.OpenAPITransformer = OpenAPITransformer;
|
|
840
|
-
//# sourceMappingURL=chunk-
|
|
842
|
+
//# sourceMappingURL=chunk-5ERUEBRH.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas/dist/chunk-5ERUEBRH.cjs","../src/lib/transformer/index.ts","../src/lib/transformer/operation-selection.ts"],"names":[],"mappings":"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","file":"/Users/erunion/code/readme/oas/packages/oas/dist/chunk-5ERUEBRH.cjs","sourcesContent":[null,"import type {\n ComponentsObject,\n HttpMethods,\n OASDocument,\n OperationObject,\n PathItemObject,\n TagObject,\n} from '../../types.js';\nimport type { OpenAPIV3_1 } from 'openapi-types';\n\nimport jsonPointer from 'jsonpointer';\n\nimport { query } from '../../analyzer/util.js';\nimport { Operation } from '../../operation/index.js';\nimport { isOpenAPI31, isRef } from '../../types.js';\nimport { supportedMethods } from '../../utils.js';\nimport { findDiscriminatorChildren } from '../build-discriminator-one-of.js';\nimport { decodePointer, encodePointer } from '../refs.js';\n\nimport { OperationSelection } from './operation-selection.js';\n\ninterface OpenAPITransformerOptions {\n /** Whether selected paths, operations, and webhooks should be retained or removed. */\n mode: 'prune' | 'reduce';\n}\n\n/**\n * Internal engine for selecting operations and transforming an OpenAPI definition down to its\n * reachable paths, webhooks, components, and tags. Extended by `OpenAPIPruner` and\n * `OpenAPIReducer`.\n */\nexport class OpenAPITransformer {\n private definition: OASDocument;\n\n private readonly mode: 'prune' | 'reduce';\n\n /**\n * A collection of `$ref` pointers that are used within our transformed API definition. This is\n * used to ensure that all referenced schemas are retained in our resulting API definition. Not\n * retaining them would result in an invalid OpenAPI definition.\n */\n private $refs: Set<string> = new Set();\n\n /** Inheritance dependencies discovered by the same helper used for JSON Schema generation. */\n private discriminatorChildrenByParentRef = new Map<string, string[]>();\n\n /**\n * A collection of OpenAPI tags that are used within the transformed API definition.\n */\n private usedTags: Set<string> = new Set();\n\n /**\n * A collection of OpenAPI paths and operations that are cross-referenced from any other paths\n * and operations that we're retaining. This collection is used to ensure that those operations\n * are retained in our resulting API definition. Not retaining them would result in an invalid\n * OpenAPI definition.\n *\n * A `*` method means the entire Path Item is referenced (e.g. `$ref: '#/paths/~1pets'`).\n */\n private retainPathMethods: Set<`${string}|${string}`> = new Set();\n\n /**\n * Paths whose Path Item *fields* (parameters, servers, summary, …) are referenced without\n * targeting a specific operation. The path container must remain even if every HTTP operation is\n * filtered out.\n */\n private retainPathContainers: Set<string> = new Set();\n\n /**\n * A collection of OpenAPI webhook names and methods that are cross-referenced from any other\n * schemas. This collection, like `retainPathMethods`, is used to ensure that those operations are\n * retained in our resulting API definition. Not retaining them would result in an invalid\n * OpenAPI definition.\n *\n * A `*` method means the entire webhook Path Item is referenced (e.g. `$ref: '#/webhooks/newPet'`).\n */\n private retainWebhookMethods: Set<`${string}|${string}`> = new Set();\n\n /**\n * Webhooks whose Path Item fields are referenced without targeting a specific operation.\n */\n private retainWebhookContainers: Set<string> = new Set();\n\n /** An array of OpenAPI tags selected for the current transformation. */\n private tagSelection: string[] = [];\n\n /** A collection of operation IDs selected for the current transformation. */\n private operationIdSelection = new Set<string>();\n\n /** A collection of OpenAPI paths and operations selected for the current transformation. */\n private pathSelection = new OperationSelection();\n\n /** A collection of OpenAPI webhooks selected for the current transformation. */\n private webhookSelection = new OperationSelection();\n\n private hasTagSelection: boolean = false;\n private hasOperationIdSelection: boolean = false;\n private hasPathSelection: boolean = false;\n private hasWebhookSelection: boolean = false;\n\n /**\n * @param definition OpenAPI definition to transform.\n * @param options Transformation mode.\n */\n protected constructor(definition: OASDocument, options: OpenAPITransformerOptions) {\n this.definition = structuredClone(definition);\n this.mode = options.mode;\n\n const { children, refs } = findDiscriminatorChildren(this.definition);\n children.forEach((childNames, parentName) => {\n const parentRef = refs.get(parentName);\n if (parentRef) {\n this.discriminatorChildrenByParentRef.set(\n parentRef,\n childNames.flatMap(name => refs.get(name) ?? []),\n );\n }\n });\n }\n\n /**\n * Select an OpenAPI tag. Operations with this tag are retained when reducing and removed when\n * pruning. Tag casing does not matter.\n *\n * @param tag Tag to select.\n */\n protected selectTag(tag: string): void {\n this.tagSelection.push(tag.toLowerCase());\n }\n\n /**\n * Select an entire OpenAPI path and all operations that it contains. Selected paths are retained\n * when reducing and removed when pruning. Path casing does not matter.\n *\n * @param path Path to select.\n */\n protected selectPath(path: string): void {\n this.pathSelection.addAll(path);\n }\n\n /**\n * Select a single OpenAPI operation. Selected operations are retained when reducing and removed\n * when pruning. Path and method casing does not matter.\n *\n * In reduce mode, selecting an operation after its entire path replaces the all-operation\n * selection with that operation and any operations selected afterward. Prune mode keeps the\n * entire path selected.\n *\n * @param path Path containing the operation.\n * @param method HTTP method of the operation to select.\n */\n protected selectOperation(path: string, method: string): void {\n if (this.mode === 'reduce' && this.pathSelection.matchesAll(path)) {\n this.pathSelection.clear(path);\n }\n\n this.pathSelection.addOperation(path, method);\n }\n\n /**\n * Select an OpenAPI operation by its operation ID. IDs are matched exactly and are generated\n * from the operation path and method when one is not authored in the definition.\n *\n * @param operationId Operation ID to select.\n */\n protected selectOperationId(operationId: string): void {\n this.operationIdSelection.add(operationId);\n }\n\n /**\n * Select an OpenAPI webhook or one of its operations. Selected webhooks are retained when\n * reducing and removed when pruning. Webhook and method casing does not matter.\n *\n * @param webhookName Webhook to select.\n * @param method Optional HTTP method of an individual webhook operation to select.\n */\n protected selectWebhook(webhookName: string, method?: string): void {\n if (!method) {\n this.webhookSelection.addAll(webhookName);\n return;\n }\n\n if (this.mode === 'reduce' && this.webhookSelection.matchesAll(webhookName)) {\n this.webhookSelection.clear(webhookName);\n }\n\n this.webhookSelection.addOperation(webhookName, method);\n }\n\n /** Transform the OpenAPI definition according to the configured mode and selections. */\n protected transform(): OASDocument {\n if (!this.definition.openapi) {\n throw new Error('Sorry, only OpenAPI definitions are supported.');\n }\n\n this.hasTagSelection = Boolean(this.tagSelection.length);\n this.hasOperationIdSelection = this.operationIdSelection.size > 0;\n this.hasPathSelection = this.pathSelection.hasSelections;\n this.hasWebhookSelection = this.webhookSelection.hasSelections;\n\n // Retain any root-level security definitions, regardless if they're used or not on operations\n // that we're retaining.\n if ('security' in this.definition) {\n Object.values(this.definition.security || {}).forEach(sec => {\n Object.keys(sec).forEach(scheme => {\n this.retainSecurityScheme(scheme);\n });\n });\n }\n\n this.walkPaths();\n this.walkWebhooks();\n\n // Recursively accumulate any components that are in use.\n this.$refs.forEach($ref => {\n this.accumulateUsedRefs(this.definition, this.$refs, $ref);\n });\n\n this.$refs.forEach(ref => {\n this.recordPathRef(ref);\n this.recordWebhookRef(ref);\n });\n\n /**\n * @fixme Resolve referenced Path Items so their operations can be transformed individually.\n * Targets of those `$ref`s are already retained (see `retainReferencedPathItem`).\n */\n this.transformPaths();\n this.transformWebhooks();\n\n // Require at least one path or one webhook in the result.\n const hasPaths = Boolean(this.definition.paths && Object.keys(this.definition.paths).length);\n const hasWebhooks = Boolean(\n 'webhooks' in this.definition && this.definition.webhooks && Object.keys(this.definition.webhooks).length,\n );\n\n // If we don't have any paths or webhooks left, retain the reducer's no-match error to help catch\n // invalid selections. An empty definition is valid OpenAPI so we allow it when pruning.\n if (this.mode === 'reduce' && !hasPaths && !hasWebhooks) {\n throw new Error(\n 'All paths and webhooks in the API definition were removed. Did you supply the right path, operation, or webhook to reduce by?',\n );\n }\n\n // Remove any unused components.\n if ('components' in this.definition) {\n Object.keys(this.definition.components || {}).forEach(componentType => {\n Object.keys(this.definition.components?.[componentType as keyof ComponentsObject] || {}).forEach(component => {\n // Authored `$ref`s JSON-Pointer-encode `/` and `~` in the component name\n // (`foo/bar` → `foo~1bar`). Compare against that encoded form or cleanup\n // deletes a still-referenced target.\n const componentPointer = `#/components/${componentType}/${encodePointer(component)}`;\n const refIsUsed =\n this.$refs.has(componentPointer) ||\n Array.from(this.$refs).some(ref => {\n // Because you can have a `$ref` like `#/components/examples/event-min/value`, which\n // would be accumulated via our `$refs` query, we want to make sure we account for them.\n // If we don't look for these then we'll end up removing them from the transformed\n // definition, resulting in data loss and schema corruption.\n return ref.startsWith(`${componentPointer}/`);\n });\n\n if (!refIsUsed) {\n delete this.definition.components?.[componentType as keyof ComponentsObject]?.[component];\n }\n });\n\n // If this component group is now empty, delete it.\n if (!Object.keys(this.definition.components?.[componentType as keyof ComponentsObject] || {}).length) {\n delete this.definition.components?.[componentType as keyof ComponentsObject];\n }\n });\n\n // If this path no longer has any components, delete it.\n if (!Object.keys(this.definition.components || {}).length) {\n delete this.definition.components;\n }\n }\n\n // Remove any unused tags.\n if ('tags' in this.definition) {\n this.definition.tags = (this.definition.tags ?? []).filter((tag): tag is TagObject => {\n return Boolean(tag) && this.usedTags.has(tag.name);\n });\n\n if (!this.definition.tags?.length) {\n delete this.definition.tags;\n }\n }\n\n return this.definition;\n }\n\n /**\n * Recursively process a `$ref` pointer and accumulate any other `$ref` pointers that it or its\n * children use. This handles circular references by skipping `$ref` pointers we have already seen.\n * Additionally when a `$ref` points to `#/paths` we record the used path + method so we can\n * retain cross-operation references within the transformed definition.\n *\n * @param schema JSON Schema object to look for and accumulate any `$ref` pointers that it may have.\n * @param $refs Known set of `$ref` pointers.\n * @param $ref `$ref` pointer to fetch a schema from out of the supplied schema.\n */\n private accumulateUsedRefs(schema: Record<string, unknown>, $refs: Set<string>, $ref: string): void {\n // Record `$ref` pointers aimed at `#/paths` or `#/webhooks` so we can retain any\n // cross-operation or Path Item references.\n this.recordPathRef($ref);\n this.recordWebhookRef($ref);\n\n let $refSchema: unknown;\n if (typeof $ref === 'string') $refSchema = jsonPointer.get(schema, $ref.substring(1));\n if ($refSchema === undefined) {\n // If the schema we have wasn't fully dereferenced or bundled for whatever reason and this\n // `$ref` that we have doesn't exist here we shouldn't try to search for more `$ref` pointers\n // in a schema that doesn't exist.\n return;\n }\n\n const referencedValues = this.queryForRefPointers($refSchema).map(({ value }) => value);\n // allOf children point back to their parent, so ordinary forward $ref traversal misses them.\n referencedValues.push(...(this.discriminatorChildrenByParentRef.get($ref) ?? []));\n\n referencedValues.forEach(currRef => {\n // Because it's possible to have a schema property named `$ref` that is not a `$ref` pointer,\n // which our JSONPath query would pick up as a false positive, we want to exclude that from\n // `$ref` matching as it's not a reference pointer.\n const foundRef = this.toRefString(currRef);\n if (!foundRef) {\n return;\n }\n\n // If we've already processed this `$ref` then don't send us into an infinite loop of processing\n // circular references.\n if ($refs.has(foundRef)) {\n return;\n }\n\n $refs.add(foundRef);\n this.accumulateUsedRefs(schema, $refs, foundRef);\n });\n }\n\n /**\n * Query a JSON Schema object for any `$ref` pointers using JSONPath and return any pointers that\n * exist.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc9535}\n * @param schema JSON Schema object to look for any `$ref` pointers within it.\n */\n private queryForRefPointers(schema: any) {\n return query([\"$..['$ref']\"], schema);\n }\n\n /**\n * Normalize a value from a `jsonpath-plus` `$ref` query to a `$ref` pointer because JSONPath\n * queries may return the property value or the parent.\n *\n */\n private toRefString(value: unknown): string | null {\n if (typeof value === 'string') {\n return value;\n } else if (value && typeof value === 'object' && '$ref' in value && typeof value.$ref === 'string') {\n return value.$ref;\n }\n\n return null;\n }\n\n /**\n * If the given `$ref` points into a path, classify how that path must be retained:\n *\n * - `#/paths/~1pets` — the entire Path Item (operations included)\n * - `#/paths/~1pets/get/...` — a single operation\n * - `#/paths/~1pets/parameters/...` — a Path Item field, so the container must remain\n */\n private parsePathRef(\n $ref: string,\n ):\n | { path: string; retention: 'all' }\n | { path: string; retention: 'operation'; method: string }\n | { path: string; retention: 'container' }\n | null {\n if (typeof $ref !== 'string' || !$ref.startsWith('#/paths/')) {\n return null;\n }\n\n const match = $ref.match(/^#\\/paths\\/([^/]+)(?:\\/([^/]+))?(?:\\/|$)/);\n if (!match?.[1]) {\n return null;\n }\n\n const path = decodePointer(match[1]);\n const segment = match[2];\n if (!segment) {\n return { path, retention: 'all' };\n }\n\n if (supportedMethods.includes(segment.toLowerCase() as HttpMethods)) {\n return { path, method: segment, retention: 'operation' };\n }\n\n return { path, retention: 'container' };\n }\n\n /**\n * If the given `$ref` points into webhooks, classify how that webhook must be retained. Same\n * retention rules as {@link parsePathRef}.\n */\n private parseWebhookRef(\n $ref: string,\n ):\n | { name: string; retention: 'all' }\n | { name: string; retention: 'operation'; method: string }\n | { name: string; retention: 'container' }\n | null {\n if (typeof $ref !== 'string' || !$ref.startsWith('#/webhooks/')) {\n return null;\n }\n\n const match = $ref.match(/^#\\/webhooks\\/([^/]+)(?:\\/([^/]+))?(?:\\/|$)/);\n if (!match?.[1]) {\n return null;\n }\n\n const name = decodePointer(match[1]);\n const segment = match[2];\n if (!segment) {\n return { name, retention: 'all' };\n }\n\n if (supportedMethods.includes(segment.toLowerCase() as HttpMethods)) {\n return { name, method: segment, retention: 'operation' };\n }\n\n return { name, retention: 'container' };\n }\n\n /**\n * If a Path Item we must keep is itself a `$ref`, retain that target and walk it for further\n * `$ref`s. `#/paths/~1foo/get/…` (and the webhook equivalent) do not resolve through a\n * ref-only `/foo` via JSON Pointer, so without this the component is deleted while `/foo`\n * remains as a dangling `$ref`.\n */\n private retainReferencedPathItem(pathItem: PathItemObject | undefined): void {\n if (!isRef(pathItem) || this.$refs.has(pathItem.$ref)) {\n return;\n }\n\n this.$refs.add(pathItem.$ref);\n this.accumulateUsedRefs(this.definition, this.$refs, pathItem.$ref);\n }\n\n /**\n * Record a security scheme so component cleanup keeps it. Scheme names are JSON-Pointer-encoded\n * so they match the same form used for authored `$ref`s (`foo/bar` → `foo~1bar`).\n */\n private retainSecurityScheme(scheme: string): void {\n this.$refs.add(`#/components/securitySchemes/${encodePointer(scheme)}`);\n }\n\n /** Record a `#/paths` `$ref` so the target Path Item or operation is not dropped. */\n private recordPathRef($ref: string): void {\n const parsed = this.parsePathRef($ref);\n if (!parsed) {\n return;\n }\n\n const pathLC = parsed.path.toLowerCase();\n if (parsed.retention === 'all') {\n this.retainPathMethods.add(`${pathLC}|*`);\n } else if (parsed.retention === 'operation') {\n this.retainPathMethods.add(`${pathLC}|${parsed.method.toLowerCase()}`);\n } else if (!this.retainPathContainers.has(pathLC)) {\n // Field-level pointers keep every sibling Path Item field, so walk those fields for\n // component `$ref`s. Traversing only the pointed-to entry would let component cleanup\n // delete a sibling's target and leave a dangling pointer.\n this.retainPathContainers.add(pathLC);\n this.accumulateContainerFieldRefs(this.findPathItem(parsed.path));\n }\n\n this.retainReferencedPathItem(this.findPathItem(parsed.path));\n }\n\n /** Record a `#/webhooks` `$ref` so the target webhook Path Item or operation is not dropped. */\n private recordWebhookRef($ref: string): void {\n const parsed = this.parseWebhookRef($ref);\n if (!parsed) {\n return;\n }\n\n const nameLC = parsed.name.toLowerCase();\n if (parsed.retention === 'all') {\n this.retainWebhookMethods.add(`${nameLC}|*`);\n } else if (parsed.retention === 'operation') {\n this.retainWebhookMethods.add(`${nameLC}|${parsed.method.toLowerCase()}`);\n } else if (!this.retainWebhookContainers.has(nameLC)) {\n this.retainWebhookContainers.add(nameLC);\n this.accumulateContainerFieldRefs(this.findWebhook(parsed.name));\n }\n\n this.retainReferencedPathItem(this.findWebhook(parsed.name));\n }\n\n /** Look up a Path Item by its path, ignoring key casing. */\n private findPathItem(path: string): PathItemObject | undefined {\n const pathLC = path.toLowerCase();\n const key = Object.keys(this.definition.paths || {}).find(candidate => candidate.toLowerCase() === pathLC);\n return key ? this.definition.paths?.[key] : undefined;\n }\n\n /** Look up a webhook Path Item by name, ignoring key casing. */\n private findWebhook(name: string): PathItemObject | undefined {\n if (!isOpenAPI31(this.definition) || !this.definition.webhooks) {\n return undefined;\n }\n\n const nameLC = name.toLowerCase();\n const key = Object.keys(this.definition.webhooks).find(candidate => candidate.toLowerCase() === nameLC);\n return key ? (this.definition.webhooks[key] as PathItemObject | undefined) : undefined;\n }\n\n /**\n * Accumulate `$ref` pointers from the Path Item fields we keep when a container is retained\n * (parameters, servers, summary, … — everything except HTTP operations).\n */\n private accumulateContainerFieldRefs(pathItem: PathItemObject | undefined): void {\n if (!pathItem) {\n return;\n }\n\n if (isRef(pathItem)) {\n this.$refs.add(pathItem.$ref);\n this.accumulateUsedRefs(this.definition, this.$refs, pathItem.$ref);\n return;\n }\n\n Object.entries(pathItem).forEach(([key, value]) => {\n if (supportedMethods.includes(key.toLowerCase() as HttpMethods) || value === undefined) {\n return;\n }\n\n this.queryForRefPointers(value).forEach(({ value: ref }) => {\n const refStr = this.toRefString(ref);\n if (!refStr) {\n return;\n }\n\n this.$refs.add(refStr);\n this.accumulateUsedRefs(this.definition, this.$refs, refStr);\n });\n });\n }\n\n /** Whether any `$ref` requires this path (or one of its operations) to remain. */\n private isPathRetainedByRef(pathLC: string): boolean {\n return (\n this.retainPathContainers.has(pathLC) ||\n Array.from(this.retainPathMethods).some(key => key.startsWith(`${pathLC}|`))\n );\n }\n\n /** Whether a `$ref` requires this specific path operation — or the entire Path Item — to remain. */\n private isPathOperationRetainedByRef(pathLC: string, methodLC: string): boolean {\n return this.retainPathMethods.has(`${pathLC}|*`) || this.retainPathMethods.has(`${pathLC}|${methodLC}`);\n }\n\n /**\n * Whether the path container must remain after its operations have been filtered. Whole-path\n * `$ref`s also keep the container (and its operations).\n */\n private isPathContainerKept(pathLC: string): boolean {\n return this.retainPathContainers.has(pathLC) || this.retainPathMethods.has(`${pathLC}|*`);\n }\n\n /** Whether any `$ref` requires this webhook (or one of its operations) to remain. */\n private isWebhookRetainedByRef(nameLC: string): boolean {\n return (\n this.retainWebhookContainers.has(nameLC) ||\n Array.from(this.retainWebhookMethods).some(key => key.startsWith(`${nameLC}|`))\n );\n }\n\n /** Whether a `$ref` requires this specific webhook operation — or the entire webhook — to remain. */\n private isWebhookOperationRetainedByRef(nameLC: string, methodLC: string): boolean {\n return this.retainWebhookMethods.has(`${nameLC}|*`) || this.retainWebhookMethods.has(`${nameLC}|${methodLC}`);\n }\n\n /**\n * Whether the webhook container must remain after its operations have been filtered.\n */\n private isWebhookContainerKept(nameLC: string): boolean {\n return this.retainWebhookContainers.has(nameLC) || this.retainWebhookMethods.has(`${nameLC}|*`);\n }\n\n /** Determine whether a path or webhook is excluded in the current transformation mode. */\n private isContainerExcluded(selection: OperationSelection, key: string): boolean {\n if (this.mode === 'prune') {\n return selection.matchesAll(key);\n }\n\n return !selection.has(key);\n }\n\n /**\n * Determine whether an operation passes the configured filters before cross-operation references\n * are considered.\n */\n private shouldRetainOperation(\n selection: OperationSelection,\n key: string,\n method: string,\n operation: OperationObject,\n ): boolean {\n if (this.mode === 'reduce') {\n // Reduction filters intersect, so an operation must match every configured filter.\n if (selection.hasSelections && !selection.matches(key, method)) return false;\n if (\n this.hasOperationIdSelection &&\n !this.operationIdSelection.has(Operation.getOperationId(key, method, operation))\n ) {\n return false;\n }\n if (this.hasTagSelection && !(operation.tags || []).some(tag => this.tagSelection.includes(tag.toLowerCase()))) {\n return false;\n }\n } else {\n // Pruning filters are additive, so matching any configured filter removes an operation.\n if (selection.hasSelections && selection.matches(key, method)) return false;\n if (\n this.hasOperationIdSelection &&\n this.operationIdSelection.has(Operation.getOperationId(key, method, operation))\n ) {\n return false;\n }\n if (this.hasTagSelection && (operation.tags || []).some(tag => this.tagSelection.includes(tag.toLowerCase()))) {\n return false;\n }\n }\n\n // No configured filter excluded this operation, so retain it in the transformed definition.\n return true;\n }\n\n /** Determine whether a path item contains at least one HTTP operation. */\n private hasOperations(pathItem: PathItemObject | undefined): boolean {\n return Boolean(pathItem && supportedMethods.some(method => method in pathItem));\n }\n\n /**\n * Accumulate any `$ref` pointers that are used by common Path Item parameters.\n *\n * @param parameters Common Path Item parameters to inspect for `$ref` pointers.\n */\n private accumulateParameterRefs(parameters: PathItemObject['parameters'] | undefined): void {\n if (!parameters) {\n return;\n }\n\n this.queryForRefPointers(parameters).forEach(({ value: ref }) => {\n const refStr = this.toRefString(ref);\n if (!refStr) {\n return;\n }\n\n this.$refs.add(refStr);\n this.accumulateUsedRefs(this.definition, this.$refs, refStr);\n });\n }\n\n /**\n * Walk through the `paths` in our OpenAPI definition and determine which operations we want to\n * retain. Accumulate any `$ref` pointers that they use so their referenced schemas can also be\n * retained in our resulting API definition.\n *\n */\n private walkPaths(): void {\n if (!('paths' in this.definition) || !this.definition.paths) {\n return;\n }\n\n Object.keys(this.definition.paths).forEach(path => {\n // When only webhooks were requested (no path/operation filter), ignore all paths, but don't\n // delete them yet because a selected webhook may reference one of their operations. We'll\n // remove any that aren't referenced later.\n if (this.mode === 'reduce' && this.hasWebhookSelection && !this.hasPathSelection) {\n return;\n } else if (this.hasPathSelection && this.isContainerExcluded(this.pathSelection, path)) {\n return;\n }\n\n const pathItem = this.definition.paths?.[path];\n\n /**\n * Referenced Path Items that remain in the result are preserved intact rather than partially\n * transformed. Retain the target and continue walking any local sibling fields so that we\n * retain their dependencies too.\n * @fixme Resolve referenced Path Items so their operations can be transformed individually.\n */\n if (isRef(pathItem)) {\n this.$refs.add(pathItem.$ref);\n this.accumulateUsedRefs(this.definition, this.$refs, pathItem.$ref);\n }\n\n // If this Path Item has no operations then it will remain in our resulting API definition,\n // so we need to retain any components referenced by its common parameters.\n if (!this.hasOperations(pathItem)) {\n this.accumulateParameterRefs(pathItem?.parameters);\n }\n\n Object.keys(pathItem || {}).forEach(method => {\n // Only process operations and retain any common path-level common properties like\n // `parameters`, `servers`, `summary`, etc.\n if (method === 'parameters' || !supportedMethods.includes(method.toLowerCase() as HttpMethods)) {\n return;\n }\n\n const operation = (this.definition.paths?.[path] as PathItemObject | undefined)?.[\n method as HttpMethods\n ] as OperationObject;\n if (!operation) {\n throw new Error(`Operation \\`${method} ${path}\\` not found`);\n }\n\n // If this operation isn't part of our resulting API definition then ignore it. We'll\n // remove it later.\n if (!this.shouldRetainOperation(this.pathSelection, path, method, operation)) {\n return;\n }\n\n (operation.tags || []).forEach((tag: string) => {\n this.usedTags.add(tag);\n });\n\n // Skipped by the `method === 'parameters'` guard above; accumulate here so refs are only\n // retained when at least one operation on this path passes all filters.\n this.accumulateParameterRefs(pathItem?.parameters);\n\n this.queryForRefPointers(operation).forEach(({ value: ref }) => {\n const refStr = this.toRefString(ref);\n if (!refStr) {\n return;\n }\n\n this.$refs.add(refStr);\n\n // Re-run through any `$ref` pointers that we found within this operation and search for\n // any `$ref` pointers that they also may be using. This also records `#/paths` and\n // `#/webhooks` targets so they are retained.\n this.accumulateUsedRefs(this.definition, this.$refs, refStr);\n });\n\n Object.values(operation.security || {}).forEach(sec => {\n Object.keys(sec).forEach(scheme => {\n this.retainSecurityScheme(scheme);\n });\n });\n });\n });\n }\n\n /**\n * Walk through the `webhooks` in our OpenAPI definition and determine which operations we want\n * to retain. Accumulate any `$ref` pointers that they use so their referenced schemas can also be\n * retained in our resulting API definition.\n *\n */\n private walkWebhooks() {\n if (!isOpenAPI31(this.definition)) {\n return;\n } else if (!('webhooks' in this.definition) || !this.definition.webhooks) {\n return;\n }\n\n const definition = this.definition satisfies OpenAPIV3_1.Document;\n\n Object.keys(definition.webhooks || {}).forEach(webhookName => {\n if (this.hasWebhookSelection && this.isContainerExcluded(this.webhookSelection, webhookName)) {\n return;\n }\n\n const webhook: PathItemObject | undefined = definition.webhooks?.[webhookName];\n if (!webhook || typeof webhook !== 'object') {\n return;\n }\n\n /**\n * Referenced webhook Path Items that remain in the result are preserved intact rather than\n * partially transformed. Retain the target and continue walking any local sibling fields so\n * that we retain their dependencies too.\n * @fixme Resolve referenced Path Items so their operations can be transformed individually.\n */\n if (typeof webhook.$ref === 'string') {\n this.$refs.add(webhook.$ref);\n this.accumulateUsedRefs(definition, this.$refs, webhook.$ref);\n }\n\n // If this webhook has no operations then it will remain in our resulting API definition, so\n // we need to retain any components referenced by its common parameters.\n if (!this.hasOperations(webhook)) {\n this.accumulateParameterRefs(webhook.parameters);\n }\n\n Object.keys(webhook).forEach(method => {\n // Only process operations and retain any common path-level common properties like\n // `parameters`, `servers`, `summary`, etc.\n if (method === 'parameters' || !supportedMethods.includes(method.toLowerCase() as HttpMethods)) {\n return;\n }\n\n const operation = webhook[method as HttpMethods] as OperationObject;\n if (!operation) {\n throw new Error(`Webhook operation \\`${method} ${webhookName}\\` not found`);\n }\n\n // If this operation isn't part of our resulting API definition then ignore it. We'll\n // remove it later.\n if (!this.shouldRetainOperation(this.webhookSelection, webhookName, method, operation)) {\n return;\n }\n\n (operation.tags || []).forEach((tag: string) => {\n this.usedTags.add(tag);\n });\n\n // Skipped by the `method === 'parameters'` guard above; accumulate here so refs are only\n // retained when at least one operation on this webhook passes all filters.\n this.accumulateParameterRefs(webhook.parameters);\n\n this.queryForRefPointers(operation).forEach(({ value: ref }) => {\n const refStr = this.toRefString(ref);\n if (!refStr) {\n return;\n }\n\n this.$refs.add(refStr);\n this.accumulateUsedRefs(definition, this.$refs, refStr);\n });\n\n Object.values(operation.security || {}).forEach(sec => {\n Object.keys(sec).forEach(scheme => {\n this.retainSecurityScheme(scheme);\n });\n });\n });\n });\n }\n\n /**\n * Transform our `paths` object according to the paths and operations that we've selected.\n */\n private transformPaths(): void {\n if (!('paths' in this.definition) || !this.definition.paths) {\n return;\n }\n\n Object.keys(this.definition.paths).forEach(path => {\n const pathLC = path.toLowerCase();\n const excludePathItem =\n (this.hasPathSelection && this.isContainerExcluded(this.pathSelection, path)) ||\n (this.mode === 'reduce' && this.hasWebhookSelection && !this.hasPathSelection);\n\n if (this.mode === 'prune' && excludePathItem) {\n if (this.isPathRetainedByRef(pathLC)) {\n throw new Error(`Cannot remove path \\`${path}\\` because one of its operations is referenced.`);\n }\n\n delete this.definition.paths?.[path];\n return;\n }\n\n const pathItem = this.definition.paths?.[path];\n\n /**\n * Referenced Path Items are preserved intact during operation-level filtering. If the whole\n * Path Item is excluded, remove it unless a surviving operation references it.\n * @fixme Resolve referenced Path Items so their operations can be transformed individually.\n */\n if (isRef(pathItem)) {\n if (excludePathItem && !this.isPathRetainedByRef(pathLC)) {\n delete this.definition.paths?.[path];\n }\n\n return;\n }\n\n // `PathItemObject` also describes the OpenAPI 3.2 `query` operation.\n const pathOperations: PathItemObject | undefined = pathItem;\n let removedOperation = false;\n Object.keys(pathItem || {}).forEach(method => {\n const methodLC = method.toLowerCase();\n\n // Only process operations and retain any common path-level common properties like\n // `parameters`, `servers`, `summary`, etc.\n if (method === 'parameters' || !supportedMethods.includes(methodLC as HttpMethods)) {\n return;\n }\n\n const retainedByRef = this.isPathOperationRetainedByRef(pathLC, methodLC);\n\n const operation = pathOperations?.[method as HttpMethods];\n if (!operation) {\n throw new Error(`Operation \\`${method} ${path}\\` not found`);\n }\n\n if (excludePathItem || !this.shouldRetainOperation(this.pathSelection, path, method, operation)) {\n if (this.mode === 'prune' && retainedByRef) {\n throw new Error(`Cannot remove operation \\`${method.toUpperCase()} ${path}\\` because it is referenced.`);\n }\n\n if (!retainedByRef) {\n delete pathOperations?.[method as HttpMethods];\n removedOperation = true;\n return;\n }\n }\n\n // This operation remains in the transformed definition, so retain any components\n // referenced by its common Path Item parameters.\n this.accumulateParameterRefs(pathItem?.parameters);\n\n // Accumulate a list of used tags so we can filter out any ones that we don't need later.\n if ('tags' in operation) {\n operation.tags?.forEach((tag: string) => {\n this.usedTags.add(tag);\n });\n }\n\n // Accumulate any used operation-level security schemas that we need to retain.\n if ('security' in operation) {\n Object.values(operation.security || {}).forEach(sec => {\n Object.keys(sec).forEach(scheme => {\n this.retainSecurityScheme(scheme);\n });\n });\n }\n });\n\n // If filtering removed every operation from this path then remove its path-level properties\n // as well. We leave path items that were authored without operations untouched.\n if (\n !this.isPathContainerKept(pathLC) &&\n (((removedOperation || (this.mode === 'reduce' && excludePathItem)) && !this.hasOperations(pathItem)) ||\n (this.mode === 'reduce' && !Object.keys(this.definition.paths?.[path] || {}).length))\n ) {\n delete this.definition.paths?.[path];\n }\n });\n\n // If we don't have any paths left then retain the reducer's no-match error. An empty Paths\n // Object is valid OpenAPI so we allow it when pruning.\n if (!Object.keys(this.definition.paths || {}).length) {\n if (this.mode === 'reduce' && !(this.definition.webhooks && Object.keys(this.definition.webhooks).length)) {\n throw new Error(\n 'All paths in the API definition were removed. Did you supply the right path name to reduce by?',\n );\n }\n\n if (this.definition.webhooks && Object.keys(this.definition.webhooks).length) {\n delete this.definition.paths;\n }\n }\n }\n\n /**\n * Transform our `webhooks` object according to the webhooks and operations that we've selected.\n */\n private transformWebhooks(): void {\n if (!isOpenAPI31(this.definition)) {\n return;\n } else if (!('webhooks' in this.definition) || !this.definition.webhooks) {\n return;\n }\n\n const definition = this.definition satisfies OpenAPIV3_1.Document;\n\n Object.keys(definition.webhooks || {}).forEach(webhookName => {\n const nameLC = webhookName.toLowerCase();\n const excludeWebhook = this.hasWebhookSelection && this.isContainerExcluded(this.webhookSelection, webhookName);\n\n if (this.mode === 'prune' && excludeWebhook) {\n if (this.isWebhookRetainedByRef(nameLC)) {\n throw new Error(`Cannot remove webhook \\`${webhookName}\\` because one of its operations is referenced.`);\n }\n\n delete definition.webhooks?.[webhookName];\n return;\n }\n\n const webhook = definition.webhooks?.[webhookName];\n if (!webhook || typeof webhook !== 'object') {\n return;\n }\n\n /**\n * Referenced webhook Path Items are preserved intact during operation-level filtering. If\n * the whole webhook is excluded, remove it unless a surviving operation references it.\n * @fixme Resolve referenced Path Items so their operations can be transformed individually.\n */\n if (isRef(webhook)) {\n if (excludeWebhook && !this.isWebhookRetainedByRef(nameLC)) {\n delete definition.webhooks?.[webhookName];\n }\n\n return;\n }\n\n // `PathItemObject` also describes the OpenAPI 3.2 `query` operation.\n const webhookOperations: PathItemObject = webhook;\n let removedOperation = false;\n Object.keys(webhook).forEach(method => {\n const methodLC = method.toLowerCase();\n if (method === 'parameters' || !supportedMethods.includes(methodLC as HttpMethods)) {\n return;\n }\n\n const operation = webhookOperations[method as HttpMethods];\n if (!operation) {\n throw new Error(`Webhook operation \\`${method} ${webhookName}\\` not found`);\n }\n\n const retainedByRef = this.isWebhookOperationRetainedByRef(nameLC, methodLC);\n if (excludeWebhook || !this.shouldRetainOperation(this.webhookSelection, webhookName, method, operation)) {\n if (this.mode === 'prune' && retainedByRef) {\n throw new Error(\n `Cannot remove operation \\`${method.toUpperCase()} ${webhookName}\\` because it is referenced.`,\n );\n }\n\n if (!retainedByRef) {\n delete webhookOperations[method as HttpMethods];\n removedOperation = true;\n return;\n }\n }\n\n // This operation remains in the transformed definition, so retain any components\n // referenced by its common Path Item parameters.\n this.accumulateParameterRefs(webhook.parameters);\n\n (operation.tags || []).forEach((tag: string) => {\n this.usedTags.add(tag);\n });\n\n Object.values(operation.security || {}).forEach(sec => {\n Object.keys(sec).forEach(scheme => {\n this.retainSecurityScheme(scheme);\n });\n });\n });\n\n if (\n !this.isWebhookContainerKept(nameLC) &&\n (((removedOperation || (this.mode === 'reduce' && excludeWebhook)) && !this.hasOperations(webhook)) ||\n (this.mode === 'reduce' && !Object.keys(definition.webhooks?.[webhookName] || {}).length))\n ) {\n delete definition.webhooks?.[webhookName];\n }\n });\n\n if (definition.webhooks && !Object.keys(definition.webhooks).length) {\n delete definition.webhooks;\n }\n }\n}\n","/**\n * Track selected HTTP operations within OpenAPI paths or webhooks. Container keys and HTTP methods\n * are matched without regard to casing.\n */\nexport class OperationSelection {\n private selections: Map<string, '*' | Set<string>> = new Map();\n\n /** Whether any paths or webhooks have been selected. */\n get hasSelections(): boolean {\n return this.selections.size > 0;\n }\n\n /**\n * Select every operation within a path or webhook.\n *\n * @param key Path or webhook key whose operations should be selected.\n */\n addAll(key: string): void {\n this.selections.set(this.normalize(key), '*');\n }\n\n /**\n * Add an operation to the selection for a path or webhook. If every operation for the key is\n * already selected, that selection remains unchanged.\n *\n * @param key Path or webhook key that contains the operation.\n * @param method HTTP method of the operation to select.\n */\n addOperation(key: string, method: string): void {\n const normalizedKey = this.normalize(key);\n const normalizedMethod = this.normalize(method);\n const selection = this.selections.get(normalizedKey);\n\n if (selection === '*') {\n return;\n }\n\n if (selection instanceof Set) {\n selection.add(normalizedMethod);\n return;\n }\n\n this.selections.set(normalizedKey, new Set([normalizedMethod]));\n }\n\n /**\n * Clear every operation selection for a path or webhook.\n *\n * @param key Path or webhook key to clear.\n */\n clear(key: string): void {\n this.selections.delete(this.normalize(key));\n }\n\n /**\n * Determine whether a path or webhook has any selected operations.\n *\n * @param key Path or webhook key to check.\n */\n has(key: string): boolean {\n return this.selections.has(this.normalize(key));\n }\n\n /**\n * Determine whether every operation within a path or webhook is selected.\n *\n * @param key Path or webhook key to check.\n */\n matchesAll(key: string): boolean {\n return this.selections.get(this.normalize(key)) === '*';\n }\n\n /**\n * Determine whether an operation is selected.\n *\n * @param key Path or webhook key that contains the operation.\n * @param method HTTP method of the operation to check.\n */\n matches(key: string, method: string): boolean {\n const selection = this.selections.get(this.normalize(key));\n return selection === '*' || Boolean(selection?.has(this.normalize(method)));\n }\n\n /** Normalize path, webhook, and method casing for comparisons. */\n private normalize(value: string): string {\n return value.toLowerCase();\n }\n}\n"]}
|