Skip to content

Commit e75ea6c

Browse files
committed
wip for OAS 3.2 updates
1 parent 85f12d6 commit e75ea6c

File tree

22 files changed

+541
-110
lines changed

22 files changed

+541
-110
lines changed
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11

2-
✅ Your config is valid.
2+
Something went wrong when processing :
3+
4+
- Error parsing config file at 'redocly.yaml': Not implemented
5+
Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,6 @@
1-
[1] redocly.yaml:10:13 at #/rules/rule~1metadata-lifecycle/subject/type
2-
3-
`type` can be one of the following only: "any", "Root", "Tag", "TagList", "TagGroups", "TagGroup", "ExternalDocs", "Example", "ExamplesMap", "EnumDescriptions", "SecurityRequirement", "SecurityRequirementList", "Info", "Contact", "License", "Logo", "Paths", "PathItem", "Parameter", "ParameterItems", "ParameterList", "Operation", "Examples", "Header", "Responses", "Response", "Schema", "Xml", "SchemaProperties", "NamedSchemas", "NamedResponses", "NamedParameters", "NamedSecuritySchemes", "SecurityScheme", "XCodeSample", "XCodeSampleList", "XServerList", "XServer", "Server", "ServerList", "ServerVariable", "ServerVariablesMap", "Callback", "CallbacksMap", "RequestBody", "MediaTypesMap", "MediaType", "Encoding", "EncodingMap", "HeadersMap", "Link", "DiscriminatorMapping", "Discriminator", "Components", "LinksMap", "NamedExamples", "NamedRequestBodies", "NamedHeaders", "NamedLinks", "NamedCallbacks", "ImplicitFlow", "PasswordFlow", "ClientCredentials", "AuthorizationCode", "OAuth2Flows", "XUsePkce", "WebhooksMap", "XMetaData", "PatternProperties", "NamedPathItems", "DependentRequired", "HttpServerBinding", "HttpChannelBinding", "HttpMessageBinding", "HttpOperationBinding", "WsServerBinding", "WsChannelBinding", "WsMessageBinding", "WsOperationBinding", "KafkaServerBinding", "KafkaTopicConfiguration", "KafkaChannelBinding", "KafkaMessageBinding", "KafkaOperationBinding", "AnypointmqServerBinding", "AnypointmqChannelBinding", "AnypointmqMessageBinding", "AnypointmqOperationBinding", "AmqpServerBinding", "AmqpChannelBinding", "AmqpMessageBinding", "AmqpOperationBinding", "Amqp1ServerBinding", "Amqp1ChannelBinding", "Amqp1MessageBinding", "Amqp1OperationBinding", "MqttServerBindingLastWill", "MqttServerBinding", "MqttChannelBinding", "MqttMessageBinding", "MqttOperationBinding", "Mqtt5ServerBinding", "Mqtt5ChannelBinding", "Mqtt5MessageBinding", "Mqtt5OperationBinding", "NatsServerBinding", "NatsChannelBinding", "NatsMessageBinding", "NatsOperationBinding", "JmsServerBinding", "JmsChannelBinding", "JmsMessageBinding", "JmsOperationBinding", "SolaceServerBinding", "SolaceChannelBinding", "SolaceMessageBinding", "SolaceDestination", "SolaceOperationBinding", "StompServerBinding", "StompChannelBinding", "StompMessageBinding", "StompOperationBinding", "RedisServerBinding", "RedisChannelBinding", "RedisMessageBinding", "RedisOperationBinding", "MercureServerBinding", "MercureChannelBinding", "MercureMessageBinding", "MercureOperationBinding", "ServerBindings", "ChannelBindings", "MessageBindings", "OperationBindings", "ServerMap", "ChannelMap", "Channel", "ParametersMap", "MessageExample", "NamedMessages", "NamedMessageTraits", "NamedOperationTraits", "NamedCorrelationIds", "SecuritySchemeFlows", "Message", "OperationTrait", "OperationTraitList", "MessageTrait", "MessageTraitList", "MessageExampleList", "CorrelationId", "Dependencies", "OperationReply", "OperationReplyAddress", "NamedTags", "NamedExternalDocs", "NamedChannels", "NamedOperations", "NamedOperationReplies", "NamedOperationRelyAddresses", "SecuritySchemeList", "MessageList", "SourceDescriptions", "OpenAPISourceDescription", "ArazzoSourceDescription", "Parameters", "ReusableObject", "Workflows", "Workflow", "Steps", "Step", "Replacement", "ExtendedOperation", "Outputs", "CriterionObject", "XPathCriterion", "JSONPathCriterion", "SuccessActionObject", "OnSuccessActionList", "FailureActionObject", "OnFailureActionList", "NamedInputs", "NamedSuccessActions", "NamedFailureActions", "Actions", "Action", "SpecExtension".
4-
5-
8 | rule/metadata-lifecycle:
6-
9 | subject:
7-
10 | type: WrongXMetaData
8-
| ^^^^^^^^^^^^^^
9-
11 | property: 'lifecycle'
10-
12 | assertions:
11-
12-
Error was generated by the configuration struct rule.
13-
14-
151

162
Deprecated plugin format detected: type-extension
17-
❌ Your config has 1 error.
3+
Something went wrong when processing :
4+
5+
- Error parsing config file at 'redocly.yaml': Not implemented
186

__tests__/lint-config/invalid-config-assertation-config-type/snapshot.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[1] .redocly.yaml:9:17 at #/rules/rule~1path-item-mutually-required/where/0/subject/type
22

3-
`type` can be one of the following only: "any", "Root", "Tag", "TagList", "TagGroups", "TagGroup", "ExternalDocs", "Example", "ExamplesMap", "EnumDescriptions", "SecurityRequirement", "SecurityRequirementList", "Info", "Contact", "License", "Logo", "Paths", "PathItem", "Parameter", "ParameterItems", "ParameterList", "Operation", "Examples", "Header", "Responses", "Response", "Schema", "Xml", "SchemaProperties", "NamedSchemas", "NamedResponses", "NamedParameters", "NamedSecuritySchemes", "SecurityScheme", "XCodeSample", "XCodeSampleList", "XServerList", "XServer", "Server", "ServerList", "ServerVariable", "ServerVariablesMap", "Callback", "CallbacksMap", "RequestBody", "MediaTypesMap", "MediaType", "Encoding", "EncodingMap", "HeadersMap", "Link", "DiscriminatorMapping", "Discriminator", "Components", "LinksMap", "NamedExamples", "NamedRequestBodies", "NamedHeaders", "NamedLinks", "NamedCallbacks", "ImplicitFlow", "PasswordFlow", "ClientCredentials", "AuthorizationCode", "OAuth2Flows", "XUsePkce", "WebhooksMap", "PatternProperties", "NamedPathItems", "DependentRequired", "HttpServerBinding", "HttpChannelBinding", "HttpMessageBinding", "HttpOperationBinding", "WsServerBinding", "WsChannelBinding", "WsMessageBinding", "WsOperationBinding", "KafkaServerBinding", "KafkaTopicConfiguration", "KafkaChannelBinding", "KafkaMessageBinding", "KafkaOperationBinding", "AnypointmqServerBinding", "AnypointmqChannelBinding", "AnypointmqMessageBinding", "AnypointmqOperationBinding", "AmqpServerBinding", "AmqpChannelBinding", "AmqpMessageBinding", "AmqpOperationBinding", "Amqp1ServerBinding", "Amqp1ChannelBinding", "Amqp1MessageBinding", "Amqp1OperationBinding", "MqttServerBindingLastWill", "MqttServerBinding", "MqttChannelBinding", "MqttMessageBinding", "MqttOperationBinding", "Mqtt5ServerBinding", "Mqtt5ChannelBinding", "Mqtt5MessageBinding", "Mqtt5OperationBinding", "NatsServerBinding", "NatsChannelBinding", "NatsMessageBinding", "NatsOperationBinding", "JmsServerBinding", "JmsChannelBinding", "JmsMessageBinding", "JmsOperationBinding", "SolaceServerBinding", "SolaceChannelBinding", "SolaceMessageBinding", "SolaceDestination", "SolaceOperationBinding", "StompServerBinding", "StompChannelBinding", "StompMessageBinding", "StompOperationBinding", "RedisServerBinding", "RedisChannelBinding", "RedisMessageBinding", "RedisOperationBinding", "MercureServerBinding", "MercureChannelBinding", "MercureMessageBinding", "MercureOperationBinding", "ServerBindings", "ChannelBindings", "MessageBindings", "OperationBindings", "ServerMap", "ChannelMap", "Channel", "ParametersMap", "MessageExample", "NamedMessages", "NamedMessageTraits", "NamedOperationTraits", "NamedCorrelationIds", "SecuritySchemeFlows", "Message", "OperationTrait", "OperationTraitList", "MessageTrait", "MessageTraitList", "MessageExampleList", "CorrelationId", "Dependencies", "OperationReply", "OperationReplyAddress", "NamedTags", "NamedExternalDocs", "NamedChannels", "NamedOperations", "NamedOperationReplies", "NamedOperationRelyAddresses", "SecuritySchemeList", "MessageList", "SourceDescriptions", "OpenAPISourceDescription", "ArazzoSourceDescription", "Parameters", "ReusableObject", "Workflows", "Workflow", "Steps", "Step", "Replacement", "ExtendedOperation", "Outputs", "CriterionObject", "XPathCriterion", "JSONPathCriterion", "SuccessActionObject", "OnSuccessActionList", "FailureActionObject", "OnFailureActionList", "NamedInputs", "NamedSuccessActions", "NamedFailureActions", "Actions", "Action", "SpecExtension".
3+
`type` can be one of the following only: "any", "Root", "Tag", "TagList", "TagGroups", "TagGroup", "ExternalDocs", "Example", "ExamplesMap", "EnumDescriptions", "SecurityRequirement", "SecurityRequirementList", "Info", "Contact", "License", "Logo", "Paths", "PathItem", "Parameter", "ParameterItems", "ParameterList", "Operation", "Examples", "Header", "Responses", "Response", "Schema", "Xml", "SchemaProperties", "NamedSchemas", "NamedResponses", "NamedParameters", "NamedSecuritySchemes", "SecurityScheme", "XCodeSample", "XCodeSampleList", "XServerList", "XServer", "Server", "ServerList", "ServerVariable", "ServerVariablesMap", "Callback", "CallbacksMap", "RequestBody", "MediaTypesMap", "MediaType", "Encoding", "EncodingMap", "HeadersMap", "Link", "DiscriminatorMapping", "Discriminator", "Components", "LinksMap", "NamedExamples", "NamedRequestBodies", "NamedHeaders", "NamedLinks", "NamedCallbacks", "ImplicitFlow", "PasswordFlow", "ClientCredentials", "AuthorizationCode", "OAuth2Flows", "XUsePkce", "WebhooksMap", "PatternProperties", "NamedPathItems", "DependentRequired", "DeviceAuthorization", "HttpServerBinding", "HttpChannelBinding", "HttpMessageBinding", "HttpOperationBinding", "WsServerBinding", "WsChannelBinding", "WsMessageBinding", "WsOperationBinding", "KafkaServerBinding", "KafkaTopicConfiguration", "KafkaChannelBinding", "KafkaMessageBinding", "KafkaOperationBinding", "AnypointmqServerBinding", "AnypointmqChannelBinding", "AnypointmqMessageBinding", "AnypointmqOperationBinding", "AmqpServerBinding", "AmqpChannelBinding", "AmqpMessageBinding", "AmqpOperationBinding", "Amqp1ServerBinding", "Amqp1ChannelBinding", "Amqp1MessageBinding", "Amqp1OperationBinding", "MqttServerBindingLastWill", "MqttServerBinding", "MqttChannelBinding", "MqttMessageBinding", "MqttOperationBinding", "Mqtt5ServerBinding", "Mqtt5ChannelBinding", "Mqtt5MessageBinding", "Mqtt5OperationBinding", "NatsServerBinding", "NatsChannelBinding", "NatsMessageBinding", "NatsOperationBinding", "JmsServerBinding", "JmsChannelBinding", "JmsMessageBinding", "JmsOperationBinding", "SolaceServerBinding", "SolaceChannelBinding", "SolaceMessageBinding", "SolaceDestination", "SolaceOperationBinding", "StompServerBinding", "StompChannelBinding", "StompMessageBinding", "StompOperationBinding", "RedisServerBinding", "RedisChannelBinding", "RedisMessageBinding", "RedisOperationBinding", "MercureServerBinding", "MercureChannelBinding", "MercureMessageBinding", "MercureOperationBinding", "ServerBindings", "ChannelBindings", "MessageBindings", "OperationBindings", "ServerMap", "ChannelMap", "Channel", "ParametersMap", "MessageExample", "NamedMessages", "NamedMessageTraits", "NamedOperationTraits", "NamedCorrelationIds", "SecuritySchemeFlows", "Message", "OperationTrait", "OperationTraitList", "MessageTrait", "MessageTraitList", "MessageExampleList", "CorrelationId", "Dependencies", "OperationReply", "OperationReplyAddress", "NamedTags", "NamedExternalDocs", "NamedChannels", "NamedOperations", "NamedOperationReplies", "NamedOperationRelyAddresses", "SecuritySchemeList", "MessageList", "SourceDescriptions", "OpenAPISourceDescription", "ArazzoSourceDescription", "Parameters", "ReusableObject", "Workflows", "Workflow", "Steps", "Step", "Replacement", "ExtendedOperation", "Outputs", "CriterionObject", "XPathCriterion", "JSONPathCriterion", "SuccessActionObject", "OnSuccessActionList", "FailureActionObject", "OnFailureActionList", "NamedInputs", "NamedSuccessActions", "NamedFailureActions", "Actions", "Action", "SpecExtension".
44

55
7 | where:
66
8 | - subject:
Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,6 @@
1-
[1] museum.yaml:8:3 at #/info/wrong-key
2-
3-
Property `wrong-key` is not expected here.
4-
5-
6 | and information. Built with love by Redocly.
6-
7 | version: 1.0.0
7-
8 | wrong-key: wrong-value
8-
| ^^^^^^^^^
9-
9 | metadata:
10-
10 | lifecycle: production
11-
12-
Error was generated by the struct rule.
13-
14-
151

162
Deprecated plugin format detected: type-extension
17-
validating museum.yaml...
18-
museum.yaml: validated in <test>ms
3+
Something went wrong when processing :
194

20-
❌ Validation failed with 1 error.
21-
run `redocly lint --generate-ignore-file` to add all problems to the ignore file.
5+
- Error parsing config file at 'redocly.yaml': Not implemented
226

packages/cli/src/__tests__/utils.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ describe('checkIfRulesetExist', () => {
488488
oas2: {},
489489
oas3_0: {},
490490
oas3_1: {},
491+
oas3_2: {},
491492
async2: {},
492493
async3: {},
493494
arazzo1: {},
@@ -503,6 +504,7 @@ describe('checkIfRulesetExist', () => {
503504
oas2: { 'operation-4xx-response': 'error' },
504505
oas3_0: {},
505506
oas3_1: {},
507+
oas3_2: {},
506508
} as any;
507509
checkIfRulesetExist(rules);
508510
});

packages/cli/src/commands/join.ts

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,15 @@ import type {
3131
BundleResult,
3232
Oas3Definition,
3333
Oas3_1Definition,
34+
Oas3_2Definition,
3435
Oas3Parameter,
36+
Oas3_2Parameter,
3537
Oas3PathItem,
38+
Oas3_2PathItem,
3639
Oas3Server,
40+
Oas3_2Server,
3741
Oas3Tag,
42+
Oas3_2Tag,
3843
} from '@redocly/openapi-core';
3944
import type { CommandArgs } from '../wrapper.js';
4045
import type { VerifyConfigOptions } from '../types.js';
@@ -47,7 +52,7 @@ type JoinDocumentContext = {
4752
api: string;
4853
apiFilename: string;
4954
apiTitle?: string;
50-
tags: Oas3Tag[];
55+
tags: Oas3Tag[] | Oas3_2Tag[];
5156
potentialConflicts: any;
5257
tagsPrefix: string;
5358
componentsPrefix: string | undefined;
@@ -109,13 +114,15 @@ export async function handleJoin({
109114
const decorators = new Set([
110115
...Object.keys(config.styleguide.decorators.oas3_0),
111116
...Object.keys(config.styleguide.decorators.oas3_1),
117+
...Object.keys(config.styleguide.decorators.oas3_2),
112118
...Object.keys(config.styleguide.decorators.oas2),
113119
]);
114120
config.styleguide.skipDecorators(Array.from(decorators));
115121

116122
const preprocessors = new Set([
117123
...Object.keys(config.styleguide.preprocessors.oas3_0),
118124
...Object.keys(config.styleguide.preprocessors.oas3_1),
125+
...Object.keys(config.styleguide.preprocessors.oas3_2),
119126
...Object.keys(config.styleguide.preprocessors.oas2),
120127
]);
121128
config.styleguide.skipPreprocessors(Array.from(preprocessors));
@@ -152,9 +159,9 @@ export async function handleJoin({
152159
try {
153160
const version = detectSpec(document.parsed);
154161
collectSpecData?.(document.parsed);
155-
if (version !== SpecVersion.OAS3_0 && version !== SpecVersion.OAS3_1) {
162+
if (version !== SpecVersion.OAS3_0 && version !== SpecVersion.OAS3_1 && version !== SpecVersion.OAS3_2) {
156163
return exitWithError(
157-
`Only OpenAPI 3.0 and OpenAPI 3.1 are supported: ${blue(document.source.absoluteRef)}.`
164+
`Only OpenAPI 3.0, OpenAPI 3.1, and OpenAPI 3.2 are supported: ${blue(document.source.absoluteRef)}.`
158165
);
159166
}
160167

@@ -250,7 +257,7 @@ export async function handleJoin({
250257
tag.description = addComponentsPrefix(tag.description, componentsPrefix!);
251258
}
252259

253-
const tagDuplicate = joinedDef.tags.find((t: Oas3Tag) => t.name === entrypointTagName);
260+
const tagDuplicate = joinedDef.tags.find((t: Oas3Tag|Oas3_2Tag) => t.name === entrypointTagName);
254261

255262
if (tagDuplicate && withoutXTagGroups) {
256263
// If tag already exist and `without-x-tag-groups` option,
@@ -313,13 +320,13 @@ export async function handleJoin({
313320

314321
function populateXTagGroups(entrypointTagName: string, indexGroup: number) {
315322
if (
316-
!joinedDef[xTagGroups][indexGroup][Tags].find((t: Oas3Tag) => t.name === entrypointTagName)
323+
!joinedDef[xTagGroups][indexGroup][Tags].find((t: Oas3Tag|Oas3_2Tag) => t.name === entrypointTagName)
317324
) {
318325
joinedDef[xTagGroups][indexGroup][Tags].push(entrypointTagName);
319326
}
320327
}
321328

322-
function collectServers(openapi: Oas3Definition | Oas3_1Definition) {
329+
function collectServers(openapi: Oas3Definition | Oas3_1Definition | Oas3_2Definition) {
323330
const { servers } = openapi;
324331
if (servers) {
325332
if (!joinedDef.hasOwnProperty('servers')) {
@@ -334,7 +341,7 @@ export async function handleJoin({
334341
}
335342

336343
function collectExternalDocs(
337-
openapi: Oas3Definition | Oas3_1Definition,
344+
openapi: Oas3Definition | Oas3_1Definition | Oas3_2Definition,
338345
{ api }: JoinDocumentContext
339346
) {
340347
const { externalDocs } = openapi;
@@ -348,7 +355,7 @@ export async function handleJoin({
348355
}
349356

350357
function collectPaths(
351-
openapi: Oas3Definition | Oas3_1Definition,
358+
openapi: Oas3Definition | Oas3_1Definition | Oas3_2Definition,
352359
{
353360
apiFilename,
354361
apiTitle,
@@ -373,7 +380,7 @@ export async function handleJoin({
373380
potentialConflicts.paths[path] = {};
374381
}
375382

376-
const pathItem = paths[path] as Oas3PathItem;
383+
const pathItem = paths[path] as Oas3PathItem | Oas3_2PathItem;
377384

378385
for (const field of keysOf(pathItem)) {
379386
if (operationsSet.has(field as OPENAPI3_METHOD)) {
@@ -393,9 +400,9 @@ export async function handleJoin({
393400
}
394401

395402
function collectPathStringFields(
396-
pathItem: Oas3PathItem,
403+
pathItem: Oas3PathItem | Oas3_2PathItem,
397404
path: string | number,
398-
field: keyof Oas3PathItem
405+
field: keyof Oas3PathItem | Oas3_2PathItem
399406
) {
400407
const fieldValue = pathItem[field];
401408
if (
@@ -408,7 +415,7 @@ export async function handleJoin({
408415
joinedDef.paths[path][field] = fieldValue;
409416
}
410417

411-
function collectPathServers(pathItem: Oas3PathItem, path: string | number) {
418+
function collectPathServers(pathItem: Oas3PathItem | Oas3_2PathItem, path: string | number) {
412419
if (!pathItem.servers) {
413420
return;
414421
}
@@ -434,19 +441,19 @@ export async function handleJoin({
434441
}
435442
}
436443

437-
function collectPathParameters(pathItem: Oas3PathItem, path: string | number) {
444+
function collectPathParameters(pathItem: Oas3PathItem | Oas3_2PathItem, path: string | number) {
438445
if (!pathItem.parameters) {
439446
return;
440447
}
441448
if (!joinedDef.paths[path].hasOwnProperty('parameters')) {
442449
joinedDef.paths[path].parameters = [];
443450
}
444451

445-
for (const parameter of pathItem.parameters as Referenced<Oas3Parameter>[]) {
452+
for (const parameter of pathItem.parameters as Referenced<Oas3Parameter | Oas3_2Parameter>[]) {
446453
let isFoundParameter = false;
447454

448455
for (const pathParameter of joinedDef.paths[path]
449-
.parameters as Referenced<Oas3Parameter>[]) {
456+
.parameters as Referenced<Oas3Parameter | Oas3_2Parameter>[]) {
450457
// Compare $ref only if both are reference objects
451458
if (isRef(pathParameter) && isRef(parameter)) {
452459
if (pathParameter['$ref'] === parameter['$ref']) {
@@ -471,7 +478,7 @@ export async function handleJoin({
471478
}
472479

473480
function collectPathOperation(
474-
pathItem: Oas3PathItem,
481+
pathItem: Oas3PathItem | Oas3_2PathItem,
475482
path: string | number,
476483
operation: OPENAPI3_METHOD
477484
) {
@@ -540,7 +547,7 @@ export async function handleJoin({
540547
}
541548
}
542549

543-
function isServersEqual(serverOne: Oas3Server, serverTwo: Oas3Server) {
550+
function isServersEqual(serverOne: Oas3Server | Oas3_2Server, serverTwo: Oas3Server | Oas3_2Server) {
544551
if (serverOne.description === serverTwo.description) {
545552
return dequal(serverOne.variables, serverTwo.variables);
546553
}
@@ -549,7 +556,7 @@ export async function handleJoin({
549556
}
550557

551558
function collectComponents(
552-
openapi: Oas3Definition,
559+
openapi: Oas3Definition | Oas3_1Definition | Oas3_2Definition,
553560
{ api, potentialConflicts, componentsPrefix }: JoinDocumentContext
554561
) {
555562
const { components } = openapi;
@@ -576,7 +583,7 @@ export async function handleJoin({
576583

577584
function collectWebhooks(
578585
oasVersion: SpecVersion,
579-
openapi: StrictObject<Oas3Definition | Oas3_1Definition>,
586+
openapi: StrictObject<Oas3Definition | Oas3_1Definition | Oas3_2Definition>,
580587
{
581588
apiFilename,
582589
apiTitle,
@@ -586,7 +593,7 @@ export async function handleJoin({
586593
componentsPrefix,
587594
}: JoinDocumentContext
588595
) {
589-
const webhooks = oasVersion === SpecVersion.OAS3_1 ? 'webhooks' : 'x-webhooks';
596+
const webhooks = (oasVersion === SpecVersion.OAS3_1 || oasVersion === SpecVersion.OAS3_2) ? 'webhooks' : 'x-webhooks';
590597
const openapiWebhooks = openapi[webhooks];
591598
if (openapiWebhooks) {
592599
if (!joinedDef.hasOwnProperty(webhooks)) {

0 commit comments

Comments
 (0)