UNPKG

@ibm-cloud/openapi-ruleset

Version:

Spectral ruleset for validating IBM Cloud services

208 lines (201 loc) 10.4 kB
/** * Copyright 2017 - 2025 IBM Corporation. * SPDX-License-Identifier: Apache2.0 */ const { oas3 } = require('@stoplight/spectral-formats'); const { oas } = require('@stoplight/spectral-rulesets'); const ibmRules = require('./rules'); // Spectral's "no-$ref-siblings" rule is configured to run on // OpenAPI 3.0.x documents (ref sibling attributes are allowed in OpenAPI 3.1.x). // However, we want to enable this rule also for OpenAPI 3.1.x documents, // so we'll just tweak Spectral's rule definition here. oas.rules['no-$ref-siblings'].formats = [oas3]; module.exports = { extends: oas, documentationUrl: 'https://github.com/IBM/openapi-validator/blob/main/docs/ibm-cloud-rules.md', formats: [oas3], rules: { // Original list created from Spectral with: // jq -r '.rules | to_entries | .[] | select(.value.recommended != false) | " \(.key): off"' src/rulesets/oas/index.json // Spectral OAS rules - IBM Custom Settings // Turn off -- duplicates no_success_response_codes 'operation-success-response': 'off', // Enable with same severity as Spectral 'oas2-operation-formData-consume-check': true, // Enable with same severity as Spectral 'operation-operationId-unique': true, // Enable with same severity as Spectral 'operation-parameters': true, // Enable with same severity as Spectral 'operation-tag-defined': true, // Turn off - exclude from ibm:oas 'info-contact': 'off', // Turn off - exclude from ibm:oas 'info-description': 'off', // Enable with same severity as Spectral 'no-eval-in-markdown': true, // Enable with same severity as Spectral 'no-script-tags-in-markdown': true, // Enable with same severity as Spectral 'openapi-tags': true, // Enable with same severity as Spectral 'operation-description': true, // Enable with same severity as Spectral 'operation-operationId': true, // Turn off - duplicates operation_id_case_convention 'operation-operationId-valid-in-url': 'off', // Enable with same severity as Spectral 'operation-tags': true, // Enable with same severity as Spectral 'path-params': true, // Enable with same severity as Spectral 'path-declarations-must-exist': true, // Enable with same severity as Spectral 'path-keys-no-trailing-slash': true, // Enable with same severity as Spectral 'path-not-include-query': true, // Enable with same severity as Spectral 'no-$ref-siblings': true, // Enable with same settings as Spectral, but override the rule to modify // the 'given' field to only check schemas - Spectral checks everything. 'typed-enum': ibmRules.typedEnum, // Enable with same severity as Spectral 'oas2-api-host': true, // Enable with same severity as Spectral 'oas2-api-schemes': true, // Enable with same severity as Spectral 'oas2-host-trailing-slash': true, // Turn off - duplicates non-configurable validation - security-ibm.js 'oas2-operation-security-defined': 'off', // Enable with warn severity 'oas2-valid-schema-example': 'warn', // Turn off 'oas2-valid-media-example': 'off', // Enable with same severity as Spectral 'oas2-anyOf': true, // Enable with same severity as Spectral 'oas2-oneOf': true, // Turn off 'oas2-schema': 'off', // Turn off - duplicates non-configurable validation in base validator 'oas2-unused-definition': true, // Enable with same severity as Spectral 'oas3-api-servers': true, // Enable with same severity as Spectral 'oas3-examples-value-or-externalValue': true, // Turn off - duplicates non-configurable validation - security-ibm.js 'oas3-operation-security-defined': 'off', // Enable with same severity as Spectral 'oas3-server-trailing-slash': true, // Enable with warn severity 'oas3-valid-media-example': 'warn', // Disable - replaced with ibm-valid-schema-example. 'oas3-valid-schema-example': 'off', // Enable with same severity as Spectral 'oas3-schema': true, // Turn off - duplicates non-configurable validation in base validator 'oas3-unused-component': true, // Turn off 'array-items' rule in favor of our 'ibm-array-attributes' rule 'array-items': 'off', // IBM Custom Rules 'ibm-accept-and-return-models': ibmRules.acceptAndReturnModels, 'ibm-anchored-patterns': ibmRules.anchoredPatterns, 'ibm-api-symmetry': ibmRules.apiSymmetry, 'ibm-array-attributes': ibmRules.arrayAttributes, 'ibm-avoid-inline-schemas': ibmRules.inlineSchemas, 'ibm-avoid-multiple-types': ibmRules.avoidMultipleTypes, 'ibm-avoid-property-name-collision': ibmRules.propertyNameCollision, 'ibm-avoid-repeating-path-parameters': ibmRules.duplicatePathParameter, 'ibm-binary-schemas': ibmRules.binarySchemas, 'ibm-collection-array-property': ibmRules.collectionArrayProperty, 'ibm-content-contains-schema': ibmRules.contentContainsSchema, 'ibm-content-type-is-specific': ibmRules.contentTypeIsSpecific, 'ibm-define-required-properties': ibmRules.requiredPropertyMissing, 'ibm-discriminator-property': ibmRules.discriminatorPropertyExists, 'ibm-dont-require-merge-patch-properties': ibmRules.mergePatchProperties, 'ibm-enum-casing-convention': ibmRules.enumCasingConvention, 'ibm-error-content-type-is-json': ibmRules.errorContentTypeIsJson, 'ibm-error-response-schemas': ibmRules.errorResponseSchemas, 'ibm-etag-header': ibmRules.etagHeaderExists, 'ibm-integer-attributes': ibmRules.integerAttributes, 'ibm-major-version-in-path': ibmRules.majorVersionInPath, 'ibm-no-accept-header': ibmRules.acceptHeader, 'ibm-no-ambiguous-paths': ibmRules.noAmbiguousPaths, 'ibm-no-array-of-arrays': ibmRules.arrayOfArrays, 'ibm-no-array-responses': ibmRules.arrayResponses, 'ibm-no-authorization-header': ibmRules.authorizationHeader, 'ibm-no-body-for-delete': ibmRules.deleteBody, 'ibm-no-circular-refs': ibmRules.circularRefs, 'ibm-no-consecutive-path-parameter-segments': ibmRules.consecutivePathSegments, 'ibm-no-content-type-header': ibmRules.contentTypeHeader, 'ibm-no-crn-path-parameters': ibmRules.pathParameterNotCRN, 'ibm-no-default-for-required-parameter': ibmRules.parameterDefault, 'ibm-no-duplicate-description-with-ref-sibling': ibmRules.refSiblingDuplicateDescription, 'ibm-no-if-modified-since-header': ibmRules.ifModifiedSinceHeader, 'ibm-no-if-unmodified-since-header': ibmRules.ifUnmodifiedSinceHeader, 'ibm-no-nullable-properties': ibmRules.noNullableProperties, 'ibm-no-operation-requestbody': ibmRules.noOperationRequestBody, 'ibm-no-optional-properties-in-required-body': ibmRules.optionalRequestBodyDeprecated, 'ibm-no-ref-in-example': ibmRules.noRefInExample, 'ibm-no-required-properties-in-optional-body': ibmRules.optionalRequestBody, 'ibm-no-space-in-example-name': ibmRules.examplesNameContainsSpace, 'ibm-no-superfluous-allof': ibmRules.noSuperfluousAllOf, 'ibm-no-unsupported-keywords': ibmRules.noUnsupportedKeywords, 'ibm-openapi-tags-used': ibmRules.unusedTags, 'ibm-operation-responses': ibmRules.operationResponses, 'ibm-operation-summary': ibmRules.operationSummaryExists, 'ibm-operation-summary-length': ibmRules.operationSummaryLength, 'ibm-operationid-casing-convention': ibmRules.operationIdCasingConvention, 'ibm-operationid-naming-convention': ibmRules.operationIdNamingConvention, 'ibm-pagination-style': ibmRules.paginationStyle, 'ibm-parameter-casing-convention': ibmRules.parameterCasingConvention, 'ibm-parameter-description': ibmRules.parameterDescriptionExists, 'ibm-parameter-order': ibmRules.parameterOrder, 'ibm-parameter-schema-or-content': ibmRules.parameterSchemaOrContentExists, 'ibm-patch-request-content-type': ibmRules.patchRequestContentType, 'ibm-path-segment-casing-convention': ibmRules.pathSegmentCasingConvention, 'ibm-pattern-properties': ibmRules.patternProperties, 'ibm-precondition-headers': ibmRules.preconditionHeader, 'ibm-prefer-token-pagination': ibmRules.preferTokenPagination, 'ibm-property-attributes': ibmRules.propertyAttributes, 'ibm-property-casing-convention': ibmRules.propertyCasingConvention, 'ibm-property-consistent-name-and-type': ibmRules.propertyConsistentNameAndType, 'ibm-property-description': ibmRules.propertyDescriptionExists, 'ibm-redirect-response-body': ibmRules.redirectResponseBody, 'ibm-ref-pattern': ibmRules.refPattern, 'ibm-request-and-response-content': ibmRules.requestAndResponseContent, 'ibm-requestbody-is-object': ibmRules.requestBodyIsObject, 'ibm-requestbody-name': ibmRules.requestBodyName, 'ibm-required-array-properties-in-response': ibmRules.requiredArrayPropertiesInResponse, 'ibm-required-enum-properties-in-response': ibmRules.requiredEnumPropertiesInResponse, 'ibm-resource-response-consistency': ibmRules.resourceResponseConsistency, 'ibm-response-status-codes': ibmRules.responseStatusCodes, 'ibm-schema-casing-convention': ibmRules.schemaCasingConvention, 'ibm-schema-description': ibmRules.schemaDescriptionExists, 'ibm-schema-keywords': ibmRules.schemaKeywords, 'ibm-schema-naming-convention': ibmRules.schemaNamingConvention, 'ibm-schema-type': ibmRules.schemaTypeExists, 'ibm-schema-type-format': ibmRules.schemaTypeFormat, 'ibm-sdk-operations': ibmRules.ibmSdkOperations, 'ibm-securityscheme-attributes': ibmRules.securitySchemeAttributes, 'ibm-securityschemes': ibmRules.securitySchemes, 'ibm-server-variable-default-value': ibmRules.serverVariableDefaultValue, 'ibm-string-attributes': ibmRules.stringAttributes, 'ibm-success-response-example': ibmRules.responseExampleExists, 'ibm-summary-sentence-style': ibmRules.summarySentenceStyle, 'ibm-unevaluated-properties': ibmRules.unevaluatedProperties, 'ibm-unique-parameter-request-property-names': ibmRules.uniqueParameterRequestPropertyNames, 'ibm-use-date-based-format': ibmRules.useDateBasedFormat, 'ibm-valid-path-segments': ibmRules.validPathSegments, 'ibm-valid-schema-example': ibmRules.validSchemaExample, 'ibm-well-defined-dictionaries': ibmRules.wellDefinedDictionaries, }, };