diff --git a/.changeset/sour-pandas-wave.md b/.changeset/sour-pandas-wave.md new file mode 100644 index 00000000..457c0000 --- /dev/null +++ b/.changeset/sour-pandas-wave.md @@ -0,0 +1,6 @@ +--- +"@redocly/openapi-core": patch +"@redocly/cli": patch +--- + +Fixed an issue where `patternProperties` incorrectly caused linting errors due to a missing `PatternProperties` node. diff --git a/.gitignore b/.gitignore index 3fb1ee71..1a8b6f97 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,7 @@ output/ *.tgz redoc-static.html packages/cli/README.md -redocly.yaml -.redocly.yaml -redocly.yml -.redocly.yml +/redocly.yaml +/.redocly.yaml +/redocly.yml +/.redocly.yml diff --git a/__tests__/check-config/wrong-config-type-extensions-in-assertions/snapshot.js b/__tests__/check-config/wrong-config-type-extensions-in-assertions/snapshot.js index 2fd1aa2e..1d06f0cc 100644 --- a/__tests__/check-config/wrong-config-type-extensions-in-assertions/snapshot.js +++ b/__tests__/check-config/wrong-config-type-extensions-in-assertions/snapshot.js @@ -4,7 +4,7 @@ exports[`E2E check-config wrong config type extension in assertions 1`] = ` [1] redocly.yaml:10:13 at #/rules/rule~1metadata-lifecycle/subject/type -\`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", "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", "Root.info", "Root.sourceDescriptions_items_0", "Root.sourceDescriptions_items_1", "Root.sourceDescriptions_items_2", "Root.sourceDescriptions", "Root.x-parameters_items_0", "Root.x-parameters_items_1", "Root.x-parameters", "Root.workflows_items.parameters_items_0", "Root.workflows_items.parameters_items_1", "Root.workflows_items.parameters", "Root.workflows_items.inputs", "Root.workflows_items.outputs", "Root.workflows_items.steps_items.parameters_items_0", "Root.workflows_items.steps_items.parameters_items_1", "Root.workflows_items.steps_items.parameters", "Root.workflows_items.steps_items.successCriteria_items.type_1", "Root.workflows_items.steps_items.successCriteria_items.type_2", "Root.workflows_items.steps_items.successCriteria_items", "Root.workflows_items.steps_items.successCriteria", "Root.workflows_items.steps_items.onSuccess_items.criteria_items.type_1", "Root.workflows_items.steps_items.onSuccess_items.criteria_items.type_2", "Root.workflows_items.steps_items.onSuccess_items.criteria_items", "Root.workflows_items.steps_items.onSuccess_items.criteria", "Root.workflows_items.steps_items.onSuccess_items", "Root.workflows_items.steps_items.onSuccess", "Root.workflows_items.steps_items.onFailure_items.criteria_items.type_1", "Root.workflows_items.steps_items.onFailure_items.criteria_items.type_2", "Root.workflows_items.steps_items.onFailure_items.criteria_items", "Root.workflows_items.steps_items.onFailure_items.criteria", "Root.workflows_items.steps_items.onFailure_items", "Root.workflows_items.steps_items.onFailure", "Root.workflows_items.steps_items.outputs", "Root.workflows_items.steps_items.x-expect", "Root.workflows_items.steps_items.x-operation", "Root.workflows_items.steps_items.requestBody.replacements_items", "Root.workflows_items.steps_items.requestBody.replacements", "Root.workflows_items.steps_items.requestBody", "Root.workflows_items.steps_items", "Root.workflows_items.steps", "Root.workflows_items.successActions_items.criteria_items.type_1", "Root.workflows_items.successActions_items.criteria_items.type_2", "Root.workflows_items.successActions_items.criteria_items", "Root.workflows_items.successActions_items.criteria", "Root.workflows_items.successActions_items", "Root.workflows_items.successActions", "Root.workflows_items.failureActions_items.criteria_items.type_1", "Root.workflows_items.failureActions_items.criteria_items.type_2", "Root.workflows_items.failureActions_items.criteria_items", "Root.workflows_items.failureActions_items.criteria", "Root.workflows_items.failureActions_items", "Root.workflows_items.failureActions", "Root.workflows_items", "Root.workflows", "Root.components.inputs_additionalProperties", "Root.components.inputs", "Root.components.parameters_additionalProperties_0", "Root.components.parameters_additionalProperties_1", "Root.components.parameters", "Root.components.successActions_additionalProperties.criteria_items.type_1", "Root.components.successActions_additionalProperties.criteria_items.type_2", "Root.components.successActions_additionalProperties.criteria_items", "Root.components.successActions_additionalProperties.criteria", "Root.components.successActions_additionalProperties", "Root.components.successActions", "Root.components.failureActions_additionalProperties.criteria_items.type_1", "Root.components.failureActions_additionalProperties.criteria_items.type_2", "Root.components.failureActions_additionalProperties.criteria_items", "Root.components.failureActions_additionalProperties.criteria", "Root.components.failureActions_additionalProperties", "Root.components.failureActions", "Root.components", "SpecExtension". +\`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", "Root.info", "Root.sourceDescriptions_items_0", "Root.sourceDescriptions_items_1", "Root.sourceDescriptions_items_2", "Root.sourceDescriptions", "Root.x-parameters_items_0", "Root.x-parameters_items_1", "Root.x-parameters", "Root.workflows_items.parameters_items_0", "Root.workflows_items.parameters_items_1", "Root.workflows_items.parameters", "Root.workflows_items.inputs", "Root.workflows_items.outputs", "Root.workflows_items.steps_items.parameters_items_0", "Root.workflows_items.steps_items.parameters_items_1", "Root.workflows_items.steps_items.parameters", "Root.workflows_items.steps_items.successCriteria_items.type_1", "Root.workflows_items.steps_items.successCriteria_items.type_2", "Root.workflows_items.steps_items.successCriteria_items", "Root.workflows_items.steps_items.successCriteria", "Root.workflows_items.steps_items.onSuccess_items.criteria_items.type_1", "Root.workflows_items.steps_items.onSuccess_items.criteria_items.type_2", "Root.workflows_items.steps_items.onSuccess_items.criteria_items", "Root.workflows_items.steps_items.onSuccess_items.criteria", "Root.workflows_items.steps_items.onSuccess_items", "Root.workflows_items.steps_items.onSuccess", "Root.workflows_items.steps_items.onFailure_items.criteria_items.type_1", "Root.workflows_items.steps_items.onFailure_items.criteria_items.type_2", "Root.workflows_items.steps_items.onFailure_items.criteria_items", "Root.workflows_items.steps_items.onFailure_items.criteria", "Root.workflows_items.steps_items.onFailure_items", "Root.workflows_items.steps_items.onFailure", "Root.workflows_items.steps_items.outputs", "Root.workflows_items.steps_items.x-expect", "Root.workflows_items.steps_items.x-operation", "Root.workflows_items.steps_items.requestBody.replacements_items", "Root.workflows_items.steps_items.requestBody.replacements", "Root.workflows_items.steps_items.requestBody", "Root.workflows_items.steps_items", "Root.workflows_items.steps", "Root.workflows_items.successActions_items.criteria_items.type_1", "Root.workflows_items.successActions_items.criteria_items.type_2", "Root.workflows_items.successActions_items.criteria_items", "Root.workflows_items.successActions_items.criteria", "Root.workflows_items.successActions_items", "Root.workflows_items.successActions", "Root.workflows_items.failureActions_items.criteria_items.type_1", "Root.workflows_items.failureActions_items.criteria_items.type_2", "Root.workflows_items.failureActions_items.criteria_items", "Root.workflows_items.failureActions_items.criteria", "Root.workflows_items.failureActions_items", "Root.workflows_items.failureActions", "Root.workflows_items", "Root.workflows", "Root.components.inputs_additionalProperties", "Root.components.inputs", "Root.components.parameters_additionalProperties_0", "Root.components.parameters_additionalProperties_1", "Root.components.parameters", "Root.components.successActions_additionalProperties.criteria_items.type_1", "Root.components.successActions_additionalProperties.criteria_items.type_2", "Root.components.successActions_additionalProperties.criteria_items", "Root.components.successActions_additionalProperties.criteria", "Root.components.successActions_additionalProperties", "Root.components.successActions", "Root.components.failureActions_additionalProperties.criteria_items.type_1", "Root.components.failureActions_additionalProperties.criteria_items.type_2", "Root.components.failureActions_additionalProperties.criteria_items", "Root.components.failureActions_additionalProperties.criteria", "Root.components.failureActions_additionalProperties", "Root.components.failureActions", "Root.components", "SpecExtension". 8 | rule/metadata-lifecycle: 9 | subject: diff --git a/__tests__/lint-config/invalid-config-assertation-config-type/snapshot.js b/__tests__/lint-config/invalid-config-assertation-config-type/snapshot.js index 582839e3..bec6ab82 100644 --- a/__tests__/lint-config/invalid-config-assertation-config-type/snapshot.js +++ b/__tests__/lint-config/invalid-config-assertation-config-type/snapshot.js @@ -6,7 +6,7 @@ exports[`E2E lint-config test with option: { dirName: 'invalid-config-assertatio The 'assert/' syntax in assert/path-item-mutually-required is deprecated. Update your configuration to use 'rule/' instead. Examples and more information: https://redocly.com/docs/cli/rules/configurable-rules/ [1] .redocly.yaml:9:17 at #/rules/assert~1path-item-mutually-required/where/0/subject/type -\`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", "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", "Root.info", "Root.sourceDescriptions_items_0", "Root.sourceDescriptions_items_1", "Root.sourceDescriptions_items_2", "Root.sourceDescriptions", "Root.x-parameters_items_0", "Root.x-parameters_items_1", "Root.x-parameters", "Root.workflows_items.parameters_items_0", "Root.workflows_items.parameters_items_1", "Root.workflows_items.parameters", "Root.workflows_items.inputs", "Root.workflows_items.outputs", "Root.workflows_items.steps_items.parameters_items_0", "Root.workflows_items.steps_items.parameters_items_1", "Root.workflows_items.steps_items.parameters", "Root.workflows_items.steps_items.successCriteria_items.type_1", "Root.workflows_items.steps_items.successCriteria_items.type_2", "Root.workflows_items.steps_items.successCriteria_items", "Root.workflows_items.steps_items.successCriteria", "Root.workflows_items.steps_items.onSuccess_items.criteria_items.type_1", "Root.workflows_items.steps_items.onSuccess_items.criteria_items.type_2", "Root.workflows_items.steps_items.onSuccess_items.criteria_items", "Root.workflows_items.steps_items.onSuccess_items.criteria", "Root.workflows_items.steps_items.onSuccess_items", "Root.workflows_items.steps_items.onSuccess", "Root.workflows_items.steps_items.onFailure_items.criteria_items.type_1", "Root.workflows_items.steps_items.onFailure_items.criteria_items.type_2", "Root.workflows_items.steps_items.onFailure_items.criteria_items", "Root.workflows_items.steps_items.onFailure_items.criteria", "Root.workflows_items.steps_items.onFailure_items", "Root.workflows_items.steps_items.onFailure", "Root.workflows_items.steps_items.outputs", "Root.workflows_items.steps_items.x-expect", "Root.workflows_items.steps_items.x-operation", "Root.workflows_items.steps_items.requestBody.replacements_items", "Root.workflows_items.steps_items.requestBody.replacements", "Root.workflows_items.steps_items.requestBody", "Root.workflows_items.steps_items", "Root.workflows_items.steps", "Root.workflows_items.successActions_items.criteria_items.type_1", "Root.workflows_items.successActions_items.criteria_items.type_2", "Root.workflows_items.successActions_items.criteria_items", "Root.workflows_items.successActions_items.criteria", "Root.workflows_items.successActions_items", "Root.workflows_items.successActions", "Root.workflows_items.failureActions_items.criteria_items.type_1", "Root.workflows_items.failureActions_items.criteria_items.type_2", "Root.workflows_items.failureActions_items.criteria_items", "Root.workflows_items.failureActions_items.criteria", "Root.workflows_items.failureActions_items", "Root.workflows_items.failureActions", "Root.workflows_items", "Root.workflows", "Root.components.inputs_additionalProperties", "Root.components.inputs", "Root.components.parameters_additionalProperties_0", "Root.components.parameters_additionalProperties_1", "Root.components.parameters", "Root.components.successActions_additionalProperties.criteria_items.type_1", "Root.components.successActions_additionalProperties.criteria_items.type_2", "Root.components.successActions_additionalProperties.criteria_items", "Root.components.successActions_additionalProperties.criteria", "Root.components.successActions_additionalProperties", "Root.components.successActions", "Root.components.failureActions_additionalProperties.criteria_items.type_1", "Root.components.failureActions_additionalProperties.criteria_items.type_2", "Root.components.failureActions_additionalProperties.criteria_items", "Root.components.failureActions_additionalProperties.criteria", "Root.components.failureActions_additionalProperties", "Root.components.failureActions", "Root.components", "SpecExtension". +\`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", "Root.info", "Root.sourceDescriptions_items_0", "Root.sourceDescriptions_items_1", "Root.sourceDescriptions_items_2", "Root.sourceDescriptions", "Root.x-parameters_items_0", "Root.x-parameters_items_1", "Root.x-parameters", "Root.workflows_items.parameters_items_0", "Root.workflows_items.parameters_items_1", "Root.workflows_items.parameters", "Root.workflows_items.inputs", "Root.workflows_items.outputs", "Root.workflows_items.steps_items.parameters_items_0", "Root.workflows_items.steps_items.parameters_items_1", "Root.workflows_items.steps_items.parameters", "Root.workflows_items.steps_items.successCriteria_items.type_1", "Root.workflows_items.steps_items.successCriteria_items.type_2", "Root.workflows_items.steps_items.successCriteria_items", "Root.workflows_items.steps_items.successCriteria", "Root.workflows_items.steps_items.onSuccess_items.criteria_items.type_1", "Root.workflows_items.steps_items.onSuccess_items.criteria_items.type_2", "Root.workflows_items.steps_items.onSuccess_items.criteria_items", "Root.workflows_items.steps_items.onSuccess_items.criteria", "Root.workflows_items.steps_items.onSuccess_items", "Root.workflows_items.steps_items.onSuccess", "Root.workflows_items.steps_items.onFailure_items.criteria_items.type_1", "Root.workflows_items.steps_items.onFailure_items.criteria_items.type_2", "Root.workflows_items.steps_items.onFailure_items.criteria_items", "Root.workflows_items.steps_items.onFailure_items.criteria", "Root.workflows_items.steps_items.onFailure_items", "Root.workflows_items.steps_items.onFailure", "Root.workflows_items.steps_items.outputs", "Root.workflows_items.steps_items.x-expect", "Root.workflows_items.steps_items.x-operation", "Root.workflows_items.steps_items.requestBody.replacements_items", "Root.workflows_items.steps_items.requestBody.replacements", "Root.workflows_items.steps_items.requestBody", "Root.workflows_items.steps_items", "Root.workflows_items.steps", "Root.workflows_items.successActions_items.criteria_items.type_1", "Root.workflows_items.successActions_items.criteria_items.type_2", "Root.workflows_items.successActions_items.criteria_items", "Root.workflows_items.successActions_items.criteria", "Root.workflows_items.successActions_items", "Root.workflows_items.successActions", "Root.workflows_items.failureActions_items.criteria_items.type_1", "Root.workflows_items.failureActions_items.criteria_items.type_2", "Root.workflows_items.failureActions_items.criteria_items", "Root.workflows_items.failureActions_items.criteria", "Root.workflows_items.failureActions_items", "Root.workflows_items.failureActions", "Root.workflows_items", "Root.workflows", "Root.components.inputs_additionalProperties", "Root.components.inputs", "Root.components.parameters_additionalProperties_0", "Root.components.parameters_additionalProperties_1", "Root.components.parameters", "Root.components.successActions_additionalProperties.criteria_items.type_1", "Root.components.successActions_additionalProperties.criteria_items.type_2", "Root.components.successActions_additionalProperties.criteria_items", "Root.components.successActions_additionalProperties.criteria", "Root.components.successActions_additionalProperties", "Root.components.successActions", "Root.components.failureActions_additionalProperties.criteria_items.type_1", "Root.components.failureActions_additionalProperties.criteria_items.type_2", "Root.components.failureActions_additionalProperties.criteria_items", "Root.components.failureActions_additionalProperties.criteria", "Root.components.failureActions_additionalProperties", "Root.components.failureActions", "Root.components", "SpecExtension". 7 | where: 8 | - subject: diff --git a/__tests__/lint/assertions-patternProperties/openapi.yaml b/__tests__/lint/assertions-patternProperties/openapi.yaml new file mode 100644 index 00000000..0a3d413c --- /dev/null +++ b/__tests__/lint/assertions-patternProperties/openapi.yaml @@ -0,0 +1,12 @@ +openapi: 3.1.0 +info: {} +paths: + /test: + get: + responses: + default: + description: test + content: + application/json: + schema: + $ref: schema.json diff --git a/__tests__/lint/assertions-patternProperties/redocly.yaml b/__tests__/lint/assertions-patternProperties/redocly.yaml new file mode 100644 index 00000000..65e643fc --- /dev/null +++ b/__tests__/lint/assertions-patternProperties/redocly.yaml @@ -0,0 +1,10 @@ +apis: + main: + root: ./openapi.yaml + +rules: + rule/response-in-snake_case: + subject: + type: SchemaProperties + assertions: + casing: snake_case diff --git a/__tests__/lint/assertions-patternProperties/schema.json b/__tests__/lint/assertions-patternProperties/schema.json new file mode 100644 index 00000000..2a7a5056 --- /dev/null +++ b/__tests__/lint/assertions-patternProperties/schema.json @@ -0,0 +1,16 @@ +{ + "type": "object", + "properties": { + "incorrectlyNamedProperty": { + "type": "string" + }, + "a_property_in_snake_case": { + "type": "string" + } + }, + "patternProperties": { + "^.+$": { + "type": "string" + } + } +} diff --git a/__tests__/lint/assertions-patternProperties/snapshot.js b/__tests__/lint/assertions-patternProperties/snapshot.js new file mode 100644 index 00000000..e42ea5ad --- /dev/null +++ b/__tests__/lint/assertions-patternProperties/snapshot.js @@ -0,0 +1,26 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`E2E lint assertions-patternProperties 1`] = ` + +validating /openapi.yaml... +[1] schema.json:4:5 at #/properties/incorrectlyNamedProperty + +rule/response-in-snake_case failed because the SchemaProperties didn't meet the assertions: "incorrectlyNamedProperty" should use snake_case + +2 | "type": "object", +3 | "properties": { +4 | "incorrectlyNamedProperty": { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ +5 | "type": "string" +6 | }, + +Error was generated by the rule/response-in-snake_case rule. + + +/openapi.yaml: validated in ms + +❌ Validation failed with 1 error. +run \`redocly lint --generate-ignore-file\` to add all problems to the ignore file. + + +`; diff --git a/packages/core/src/types/oas3_1.ts b/packages/core/src/types/oas3_1.ts index 3eb5000a..80d87a56 100755 --- a/packages/core/src/types/oas3_1.ts +++ b/packages/core/src/types/oas3_1.ts @@ -139,7 +139,7 @@ const Schema: NodeType = { contains: 'Schema', minContains: { type: 'integer', minimum: 0 }, maxContains: { type: 'integer', minimum: 0 }, - patternProperties: 'SchemaProperties', + patternProperties: 'PatternProperties', propertyNames: 'Schema', unevaluatedItems: (value: unknown) => { if (typeof value === 'boolean') { @@ -278,6 +278,7 @@ export const Oas3_1Types: Record = { Root, Schema, SchemaProperties, + PatternProperties: SchemaProperties, License, Components, NamedPathItems: mapOf('PathItem'), diff --git a/packages/core/src/types/redocly-yaml.ts b/packages/core/src/types/redocly-yaml.ts index 20e69aa2..a8970961 100644 --- a/packages/core/src/types/redocly-yaml.ts +++ b/packages/core/src/types/redocly-yaml.ts @@ -234,6 +234,7 @@ const oas3_1NodeTypesList = [ 'Root', 'Schema', 'SchemaProperties', + 'PatternProperties', 'Info', 'License', 'Components',