@redocly/openapi-core 1.18.1 → 1.20.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/CHANGELOG.md +22 -0
- package/__tests__/utils.ts +14 -7
- package/lib/benchmark/benches/lint-with-many-rules.bench.d.ts +1 -0
- package/lib/benchmark/benches/lint-with-many-rules.bench.js +7 -3
- package/lib/benchmark/benches/lint-with-nested-rule.bench.d.ts +1 -0
- package/lib/benchmark/benches/lint-with-nested-rule.bench.js +7 -3
- package/lib/benchmark/benches/lint-with-no-rules.bench.d.ts +1 -0
- package/lib/benchmark/benches/lint-with-no-rules.bench.js +7 -3
- package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.d.ts +1 -0
- package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.js +19 -15
- package/lib/benchmark/benches/lint-with-top-level-rule.bench.d.ts +1 -0
- package/lib/benchmark/benches/lint-with-top-level-rule.bench.js +18 -14
- package/lib/benchmark/benches/recommended-oas3.bench.js +2 -2
- package/lib/benchmark/benches/resolve-with-no-external.bench.js +2 -2
- package/lib/benchmark/utils.d.ts +3 -3
- package/lib/benchmark/utils.js +10 -7
- package/lib/bundle.d.ts +2 -2
- package/lib/bundle.js +127 -120
- package/lib/config/all.js +13 -1
- package/lib/config/builtIn.js +18 -17
- package/lib/config/config-resolvers.d.ts +1 -1
- package/lib/config/config-resolvers.js +241 -158
- package/lib/config/config.d.ts +4 -3
- package/lib/config/config.js +53 -34
- package/lib/config/load.d.ts +1 -1
- package/lib/config/load.js +105 -117
- package/lib/config/minimal.js +13 -0
- package/lib/config/recommended-strict.js +14 -1
- package/lib/config/recommended.js +14 -1
- package/lib/config/rules.d.ts +3 -3
- package/lib/config/rules.js +1 -2
- package/lib/config/types.d.ts +17 -4
- package/lib/config/utils.d.ts +3 -1
- package/lib/config/utils.js +78 -49
- package/lib/decorators/async3/index.d.ts +1 -0
- package/lib/decorators/async3/index.js +4 -0
- package/lib/decorators/common/filters/filter-helper.d.ts +1 -1
- package/lib/decorators/common/filters/filter-helper.js +2 -3
- package/lib/decorators/common/filters/filter-in.d.ts +1 -1
- package/lib/decorators/common/filters/filter-in.js +1 -1
- package/lib/decorators/common/filters/filter-out.d.ts +1 -1
- package/lib/decorators/common/filters/filter-out.js +1 -1
- package/lib/decorators/common/info-description-override.d.ts +1 -1
- package/lib/decorators/common/info-override.d.ts +1 -1
- package/lib/decorators/common/info-override.js +1 -12
- package/lib/decorators/common/media-type-examples-override.d.ts +1 -1
- package/lib/decorators/common/media-type-examples-override.js +8 -2
- package/lib/decorators/common/operation-description-override.d.ts +1 -1
- package/lib/decorators/common/registry-dependencies.d.ts +1 -1
- package/lib/decorators/common/remove-x-internal.d.ts +1 -1
- package/lib/decorators/common/remove-x-internal.js +4 -5
- package/lib/decorators/common/tag-description-override.d.ts +1 -1
- package/lib/decorators/oas2/index.d.ts +1 -1
- package/lib/decorators/oas2/remove-unused-components.js +1 -2
- package/lib/decorators/oas3/index.d.ts +1 -1
- package/lib/decorators/oas3/remove-unused-components.js +1 -2
- package/lib/env.d.ts +0 -1
- package/lib/env.js +1 -1
- package/lib/format/codeframes.d.ts +1 -1
- package/lib/format/codeframes.js +10 -8
- package/lib/format/format.d.ts +1 -1
- package/lib/format/format.js +24 -16
- package/lib/index.d.ts +2 -1
- package/lib/index.js +6 -4
- package/lib/js-yaml/index.d.ts +1 -1
- package/lib/js-yaml/index.js +1 -1
- package/lib/lint.d.ts +3 -1
- package/lib/lint.js +92 -99
- package/lib/logger.js +2 -2
- package/lib/oas-types.d.ts +9 -5
- package/lib/oas-types.js +22 -12
- package/lib/redocly/domains.d.ts +1 -1
- package/lib/redocly/domains.js +6 -6
- package/lib/redocly/index.d.ts +1 -1
- package/lib/redocly/index.js +60 -73
- package/lib/redocly/registry-api.js +64 -82
- package/lib/ref-utils.d.ts +2 -2
- package/lib/ref-utils.js +14 -13
- package/lib/resolve.d.ts +2 -2
- package/lib/resolve.js +186 -205
- package/lib/rules/ajv.d.ts +1 -1
- package/lib/rules/ajv.js +10 -8
- package/lib/rules/arazzo/index.js +2 -0
- package/lib/rules/async2/channels-kebab-case.d.ts +1 -1
- package/lib/rules/async2/index.js +2 -0
- package/lib/rules/async2/no-channel-trailing-slash.d.ts +1 -1
- package/lib/rules/async3/channels-kebab-case.d.ts +2 -0
- package/lib/rules/async3/channels-kebab-case.js +19 -0
- package/lib/rules/async3/index.d.ts +3 -0
- package/lib/rules/async3/index.js +24 -0
- package/lib/rules/async3/no-channel-trailing-slash.d.ts +2 -0
- package/lib/rules/async3/no-channel-trailing-slash.js +16 -0
- package/lib/rules/common/assertions/asserts.d.ts +2 -2
- package/lib/rules/common/assertions/asserts.js +5 -5
- package/lib/rules/common/assertions/index.d.ts +4 -4
- package/lib/rules/common/assertions/utils.d.ts +1 -1
- package/lib/rules/common/assertions/utils.js +43 -28
- package/lib/rules/common/info-contact.d.ts +1 -1
- package/lib/rules/common/info-license-strict.d.ts +2 -0
- package/lib/rules/common/info-license-strict.js +26 -0
- package/lib/rules/common/info-license-url.d.ts +1 -1
- package/lib/rules/common/info-license.d.ts +1 -1
- package/lib/rules/common/no-ambiguous-paths.d.ts +1 -1
- package/lib/rules/common/no-enum-type-mismatch.d.ts +1 -1
- package/lib/rules/common/no-http-verbs-in-paths.d.ts +1 -1
- package/lib/rules/common/no-identical-paths.d.ts +1 -1
- package/lib/rules/common/no-invalid-parameter-examples.js +1 -2
- package/lib/rules/common/no-invalid-schema-examples.js +1 -2
- package/lib/rules/common/no-path-trailing-slash.d.ts +1 -1
- package/lib/rules/common/no-required-schema-properties-undefined.d.ts +1 -1
- package/lib/rules/common/no-required-schema-properties-undefined.js +1 -2
- package/lib/rules/common/operation-2xx-response.d.ts +1 -1
- package/lib/rules/common/operation-4xx-response.d.ts +1 -1
- package/lib/rules/common/operation-description.d.ts +1 -1
- package/lib/rules/common/operation-operationId-unique.d.ts +1 -1
- package/lib/rules/common/operation-operationId-url-safe.d.ts +1 -1
- package/lib/rules/common/operation-operationId-url-safe.js +1 -0
- package/lib/rules/common/operation-operationId.d.ts +1 -1
- package/lib/rules/common/operation-parameters-unique.d.ts +1 -1
- package/lib/rules/common/operation-singular-tag.d.ts +1 -1
- package/lib/rules/common/operation-summary.d.ts +1 -1
- package/lib/rules/common/operation-tag-defined.d.ts +1 -1
- package/lib/rules/common/operation-tag-defined.js +1 -2
- package/lib/rules/common/parameter-description.d.ts +1 -1
- package/lib/rules/common/path-declaration-must-exist.d.ts +1 -1
- package/lib/rules/common/path-excludes-patterns.d.ts +1 -1
- package/lib/rules/common/path-http-verbs-order.d.ts +1 -1
- package/lib/rules/common/path-http-verbs-order.js +1 -1
- package/lib/rules/common/path-not-include-query.d.ts +1 -1
- package/lib/rules/common/path-params-defined.d.ts +1 -1
- package/lib/rules/common/path-segment-plural.d.ts +1 -1
- package/lib/rules/common/paths-kebab-case.d.ts +1 -1
- package/lib/rules/common/required-string-property-missing-min-length.d.ts +1 -1
- package/lib/rules/common/required-string-property-missing-min-length.js +2 -2
- package/lib/rules/common/response-contains-header.d.ts +1 -1
- package/lib/rules/common/response-contains-header.js +2 -2
- package/lib/rules/common/security-defined.d.ts +1 -1
- package/lib/rules/common/security-defined.js +3 -7
- package/lib/rules/common/spec-strict-refs.d.ts +1 -1
- package/lib/rules/common/spec.d.ts +2 -2
- package/lib/rules/common/spec.js +6 -7
- package/lib/rules/common/tag-description.d.ts +1 -1
- package/lib/rules/common/tags-alphabetical.d.ts +1 -1
- package/lib/rules/no-unresolved-refs.d.ts +3 -3
- package/lib/rules/no-unresolved-refs.js +3 -4
- package/lib/rules/oas2/boolean-parameter-prefixes.d.ts +1 -1
- package/lib/rules/oas2/index.d.ts +1 -1
- package/lib/rules/oas2/index.js +2 -0
- package/lib/rules/oas2/response-contains-property.d.ts +1 -1
- package/lib/rules/oas2/response-contains-property.js +1 -2
- package/lib/rules/oas3/array-parameter-serialization.d.ts +1 -1
- package/lib/rules/oas3/array-parameter-serialization.js +1 -2
- package/lib/rules/oas3/boolean-parameter-prefixes.d.ts +1 -1
- package/lib/rules/oas3/component-name-unique.d.ts +1 -1
- package/lib/rules/oas3/component-name-unique.js +2 -4
- package/lib/rules/oas3/index.d.ts +1 -1
- package/lib/rules/oas3/index.js +2 -0
- package/lib/rules/oas3/no-empty-servers.d.ts +1 -1
- package/lib/rules/oas3/no-example-value-and-externalValue.d.ts +1 -1
- package/lib/rules/oas3/no-invalid-media-type-examples.d.ts +1 -1
- package/lib/rules/oas3/no-invalid-media-type-examples.js +1 -2
- package/lib/rules/oas3/no-server-example.com.d.ts +1 -1
- package/lib/rules/oas3/no-server-example.com.js +1 -0
- package/lib/rules/oas3/no-server-trailing-slash.d.ts +1 -1
- package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +1 -1
- package/lib/rules/oas3/no-server-variables-empty-enum.js +1 -2
- package/lib/rules/oas3/no-undefined-server-variable.d.ts +1 -1
- package/lib/rules/oas3/no-undefined-server-variable.js +2 -3
- package/lib/rules/oas3/no-unused-components.d.ts +1 -1
- package/lib/rules/oas3/no-unused-components.js +1 -2
- package/lib/rules/oas3/response-contains-property.d.ts +1 -1
- package/lib/rules/oas3/response-contains-property.js +1 -2
- package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +1 -1
- package/lib/rules/other/stats.d.ts +3 -3
- package/lib/rules/other/stats.js +5 -3
- package/lib/rules/spot/parameters-no-body-inside-in.d.ts +2 -0
- package/lib/rules/spot/parameters-no-body-inside-in.js +18 -0
- package/lib/rules/utils.d.ts +4 -2
- package/lib/rules/utils.js +41 -13
- package/lib/types/arazzo.d.ts +1 -2275
- package/lib/types/arazzo.js +246 -309
- package/lib/types/asyncapi2.d.ts +17 -0
- package/lib/types/{asyncapi.js → asyncapi2.js} +59 -53
- package/lib/types/asyncapi3.d.ts +2 -0
- package/lib/types/asyncapi3.js +347 -0
- package/lib/types/index.js +19 -10
- package/lib/types/json-schema-adapter.d.ts +1 -1
- package/lib/types/json-schema-adapter.js +4 -18
- package/lib/types/oas2.js +6 -6
- package/lib/types/oas3.d.ts +4 -0
- package/lib/types/oas3.js +19 -19
- package/lib/types/oas3_1.d.ts +3 -0
- package/lib/types/oas3_1.js +20 -14
- package/lib/types/redocly-yaml.d.ts +8 -6
- package/lib/types/redocly-yaml.js +135 -36
- package/lib/typings/arazzo.d.ts +145 -27
- package/lib/typings/asyncapi3.d.ts +53 -0
- package/lib/typings/asyncapi3.js +2 -0
- package/lib/typings/common.d.ts +1 -1
- package/lib/typings/swagger.d.ts +2 -2
- package/lib/utils.d.ts +4 -3
- package/lib/utils.js +55 -72
- package/lib/visitors.d.ts +29 -1
- package/lib/visitors.js +21 -8
- package/lib/walk.d.ts +3 -3
- package/lib/walk.js +30 -23
- package/package.json +3 -3
- package/src/__tests__/bundle.test.ts +144 -2
- package/src/__tests__/lint.test.ts +29 -21
- package/src/__tests__/walk.test.ts +25 -25
- package/src/benchmark/benches/lint-with-many-rules.bench.ts +7 -1
- package/src/benchmark/benches/lint-with-nested-rule.bench.ts +7 -1
- package/src/benchmark/benches/lint-with-no-rules.bench.ts +8 -1
- package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +18 -13
- package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +17 -11
- package/src/benchmark/fork.js +4 -0
- package/src/benchmark/utils.ts +6 -5
- package/src/bundle.ts +19 -4
- package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +32 -2
- package/src/config/__tests__/__snapshots__/config.test.ts.snap +24 -0
- package/src/config/__tests__/config-resolvers.test.ts +82 -0
- package/src/config/__tests__/config.test.ts +11 -0
- package/src/config/__tests__/fixtures/resolve-config/local-config-with-commonjs-export-function.yaml +2 -0
- package/src/config/__tests__/fixtures/resolve-config/local-config-with-esm.yaml +2 -0
- package/src/config/__tests__/fixtures/resolve-config/plugin-esm.mjs +10 -0
- package/src/config/__tests__/fixtures/resolve-config/plugin-with-export-function.cjs +10 -0
- package/src/config/__tests__/resolve-plugins.test.ts +4 -1
- package/src/config/all.ts +13 -1
- package/src/config/builtIn.ts +9 -8
- package/src/config/config-resolvers.ts +92 -21
- package/src/config/config.ts +31 -13
- package/src/config/load.ts +2 -2
- package/src/config/minimal.ts +13 -0
- package/src/config/recommended-strict.ts +14 -1
- package/src/config/recommended.ts +14 -1
- package/src/config/rules.ts +12 -4
- package/src/config/types.ts +34 -5
- package/src/config/utils.ts +28 -2
- package/src/decorators/__tests__/filter-in.test.ts +29 -26
- package/src/decorators/__tests__/filter-out.test.ts +32 -23
- package/src/decorators/__tests__/media-type-examples-override.test.ts +45 -45
- package/src/decorators/__tests__/remove-x-internal.test.ts +8 -5
- package/src/decorators/async3/index.ts +1 -0
- package/src/decorators/common/filters/filter-helper.ts +2 -1
- package/src/decorators/common/filters/filter-in.ts +2 -1
- package/src/decorators/common/filters/filter-out.ts +2 -1
- package/src/decorators/common/info-description-override.ts +3 -2
- package/src/decorators/common/info-override.ts +1 -1
- package/src/decorators/common/media-type-examples-override.ts +4 -3
- package/src/decorators/common/operation-description-override.ts +5 -4
- package/src/decorators/common/registry-dependencies.ts +2 -2
- package/src/decorators/common/remove-x-internal.ts +5 -4
- package/src/decorators/common/tag-description-override.ts +3 -2
- package/src/decorators/oas2/__tests__/remove-unused-components.test.ts +3 -3
- package/src/decorators/oas2/index.ts +2 -1
- package/src/decorators/oas2/remove-unused-components.ts +1 -1
- package/src/decorators/oas3/__tests__/remove-unused-components.test.ts +4 -4
- package/src/decorators/oas3/index.ts +2 -1
- package/src/decorators/oas3/remove-unused-components.ts +1 -1
- package/src/format/codeframes.ts +2 -1
- package/src/format/format.ts +9 -4
- package/src/index.ts +2 -1
- package/src/js-yaml/index.ts +3 -1
- package/src/lint.ts +28 -4
- package/src/logger.ts +2 -2
- package/src/oas-types.ts +41 -22
- package/src/redocly/domains.ts +1 -1
- package/src/redocly/index.ts +3 -3
- package/src/redocly/registry-api.ts +5 -3
- package/src/ref-utils.ts +4 -2
- package/src/resolve.ts +6 -4
- package/src/rules/__tests__/no-unresolved-refs.test.ts +21 -7
- package/src/rules/ajv.ts +2 -1
- package/src/rules/arazzo/__tests__/parameters-no-body-inside-in.test.ts +76 -0
- package/src/rules/arazzo/index.ts +6 -3
- package/src/rules/async2/__tests__/channels-kebab-case.test.ts +9 -5
- package/src/rules/async2/__tests__/no-channel-trailing-slash.test.ts +3 -3
- package/src/rules/async2/channels-kebab-case.ts +2 -2
- package/src/rules/async2/index.ts +9 -6
- package/src/rules/async2/no-channel-trailing-slash.ts +2 -2
- package/src/rules/async3/__tests__/channels-kebab-case.test.ts +145 -0
- package/src/rules/async3/__tests__/no-channel-trailing-slash.test.ts +96 -0
- package/src/rules/async3/channels-kebab-case.ts +19 -0
- package/src/rules/async3/index.ts +26 -0
- package/src/rules/async3/no-channel-trailing-slash.ts +16 -0
- package/src/rules/common/__tests__/info-license-strict.test.ts +141 -0
- package/src/rules/common/__tests__/info-license.test.ts +2 -2
- package/src/rules/common/__tests__/license-url.test.ts +2 -2
- package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +1 -1
- package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +5 -5
- package/src/rules/common/__tests__/no-identical-paths.test.ts +1 -1
- package/src/rules/common/__tests__/no-invalid-parameter-examples.test.ts +1 -1
- package/src/rules/common/__tests__/no-invalid-schema-examples.test.ts +1 -1
- package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +4 -4
- package/src/rules/common/__tests__/no-required-schema-properties-undefined.test.ts +11 -11
- package/src/rules/common/__tests__/operation-2xx-response.test.ts +8 -6
- package/src/rules/common/__tests__/operation-4xx-response.test.ts +9 -7
- package/src/rules/common/__tests__/operation-operationId-unique.test.ts +2 -2
- package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +1 -1
- package/src/rules/common/__tests__/operation-parameters-unique.test.ts +4 -4
- package/src/rules/common/__tests__/operation-singular-tag.test.ts +2 -2
- package/src/rules/common/__tests__/path-http-verbs-order.test.ts +2 -2
- package/src/rules/common/__tests__/path-not-include-query.test.ts +2 -2
- package/src/rules/common/__tests__/path-params-defined.test.ts +5 -5
- package/src/rules/common/__tests__/paths-kebab-case.test.ts +6 -4
- package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +8 -8
- package/src/rules/common/__tests__/security-defined.test.ts +14 -8
- package/src/rules/common/__tests__/spec-strict-refs.test.ts +1 -1
- package/src/rules/common/__tests__/spec.test.ts +10 -10
- package/src/rules/common/__tests__/tag-description.test.ts +2 -2
- package/src/rules/common/__tests__/tags-alphabetical.test.ts +6 -4
- package/src/rules/common/assertions/asserts.ts +5 -9
- package/src/rules/common/assertions/index.ts +12 -4
- package/src/rules/common/assertions/utils.ts +4 -2
- package/src/rules/common/info-contact.ts +2 -1
- package/src/rules/common/info-license-strict.ts +24 -0
- package/src/rules/common/info-license-url.ts +2 -1
- package/src/rules/common/info-license.ts +2 -1
- package/src/rules/common/no-ambiguous-paths.ts +4 -4
- package/src/rules/common/no-enum-type-mismatch.ts +5 -4
- package/src/rules/common/no-http-verbs-in-paths.ts +5 -4
- package/src/rules/common/no-identical-paths.ts +4 -4
- package/src/rules/common/no-invalid-parameter-examples.ts +3 -2
- package/src/rules/common/no-path-trailing-slash.ts +2 -2
- package/src/rules/common/no-required-schema-properties-undefined.ts +5 -4
- package/src/rules/common/operation-2xx-response.ts +3 -2
- package/src/rules/common/operation-4xx-response.ts +3 -2
- package/src/rules/common/operation-description.ts +5 -4
- package/src/rules/common/operation-operationId-unique.ts +4 -4
- package/src/rules/common/operation-operationId-url-safe.ts +5 -4
- package/src/rules/common/operation-operationId.ts +5 -4
- package/src/rules/common/operation-parameters-unique.ts +4 -4
- package/src/rules/common/operation-singular-tag.ts +4 -4
- package/src/rules/common/operation-summary.ts +5 -4
- package/src/rules/common/operation-tag-defined.ts +4 -4
- package/src/rules/common/parameter-description.ts +4 -4
- package/src/rules/common/path-declaration-must-exist.ts +2 -2
- package/src/rules/common/path-excludes-patterns.ts +4 -4
- package/src/rules/common/path-http-verbs-order.ts +4 -4
- package/src/rules/common/path-not-include-query.ts +2 -2
- package/src/rules/common/path-params-defined.ts +4 -4
- package/src/rules/common/path-segment-plural.ts +3 -2
- package/src/rules/common/paths-kebab-case.ts +2 -2
- package/src/rules/common/required-string-property-missing-min-length.ts +4 -4
- package/src/rules/common/response-contains-header.ts +5 -4
- package/src/rules/common/scalar-property-missing-example.ts +2 -1
- package/src/rules/common/security-defined.ts +5 -5
- package/src/rules/common/spec-strict-refs.ts +2 -1
- package/src/rules/common/spec.ts +4 -3
- package/src/rules/common/tag-description.ts +2 -1
- package/src/rules/common/tags-alphabetical.ts +4 -4
- package/src/rules/no-unresolved-refs.ts +4 -3
- package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +7 -5
- package/src/rules/oas2/__tests__/response-contains-header.test.ts +14 -8
- package/src/rules/oas2/__tests__/response-contains-property.test.ts +14 -8
- package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +3 -1
- package/src/rules/oas2/boolean-parameter-prefixes.ts +1 -1
- package/src/rules/oas2/index.ts +8 -6
- package/src/rules/oas2/request-mime-type.ts +2 -1
- package/src/rules/oas2/response-contains-property.ts +3 -2
- package/src/rules/oas2/response-mime-type.ts +2 -1
- package/src/rules/oas3/__tests__/array-parameter-serialization.test.ts +18 -6
- package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +7 -5
- package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +6 -6
- package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +2 -2
- package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +34 -24
- package/src/rules/oas3/__tests__/no-server-example.com.test.ts +3 -3
- package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +3 -3
- package/src/rules/oas3/__tests__/no-unused-components.test.ts +1 -1
- package/src/rules/oas3/__tests__/operation-4xx-problem-details-rfc7807.test.ts +3 -3
- package/src/rules/oas3/__tests__/response-contains-header.test.ts +34 -22
- package/src/rules/oas3/__tests__/response-contains-property.test.ts +34 -20
- package/src/rules/oas3/__tests__/spec/spec.test.ts +12 -3
- package/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts +9 -3
- package/src/rules/oas3/__tests__/utils/lint-document-for-test.ts +1 -1
- package/src/rules/oas3/array-parameter-serialization.ts +3 -2
- package/src/rules/oas3/boolean-parameter-prefixes.ts +1 -1
- package/src/rules/oas3/component-name-unique.ts +3 -3
- package/src/rules/oas3/index.ts +42 -38
- package/src/rules/oas3/no-empty-servers.ts +1 -1
- package/src/rules/oas3/no-example-value-and-externalValue.ts +1 -1
- package/src/rules/oas3/no-invalid-media-type-examples.ts +6 -4
- package/src/rules/oas3/no-server-example.com.ts +2 -1
- package/src/rules/oas3/no-server-trailing-slash.ts +1 -1
- package/src/rules/oas3/no-server-variables-empty-enum.ts +2 -2
- package/src/rules/oas3/no-undefined-server-variable.ts +1 -1
- package/src/rules/oas3/no-unused-components.ts +2 -2
- package/src/rules/oas3/operation-4xx-problem-details-rfc7807.ts +2 -1
- package/src/rules/oas3/request-mime-type.ts +2 -1
- package/src/rules/oas3/response-contains-property.ts +3 -2
- package/src/rules/oas3/response-mime-type.ts +2 -1
- package/src/rules/oas3/spec-components-invalid-map-name.ts +3 -3
- package/src/rules/other/stats.ts +8 -6
- package/src/rules/spot/parameters-no-body-inside-in.ts +17 -0
- package/src/rules/utils.ts +41 -4
- package/src/types/arazzo.ts +257 -334
- package/src/types/{asyncapi.ts → asyncapi2.ts} +41 -35
- package/src/types/asyncapi3.ts +383 -0
- package/src/types/json-schema-adapter.ts +2 -2
- package/src/types/oas3.ts +4 -4
- package/src/types/oas3_1.ts +5 -4
- package/src/types/redocly-yaml.ts +21 -4
- package/src/typings/arazzo.ts +169 -41
- package/src/typings/asyncapi3.ts +61 -0
- package/src/typings/common.ts +1 -0
- package/src/typings/swagger.ts +2 -2
- package/src/utils.ts +5 -3
- package/src/visitors.ts +58 -1
- package/src/walk.ts +3 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/lib/types/asyncapi.d.ts +0 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.asserts = exports.runOnValuesSet = exports.runOnKeysSet = void 0;
|
|
4
|
+
exports.buildAssertCustomFunction = buildAssertCustomFunction;
|
|
4
5
|
const utils_1 = require("../../../utils");
|
|
5
6
|
const utils_2 = require("./utils");
|
|
6
7
|
exports.runOnKeysSet = new Set([
|
|
@@ -41,7 +42,7 @@ exports.asserts = {
|
|
|
41
42
|
const values = Array.isArray(value) ? value : [value];
|
|
42
43
|
const regex = (0, utils_2.regexFromString)(condition);
|
|
43
44
|
return values
|
|
44
|
-
.map((_val) => !
|
|
45
|
+
.map((_val) => !regex?.test(_val) && {
|
|
45
46
|
message: `"${_val}" should match a regex ${condition}`,
|
|
46
47
|
location: (0, utils_1.isString)(value)
|
|
47
48
|
? baseLocation
|
|
@@ -57,7 +58,7 @@ exports.asserts = {
|
|
|
57
58
|
const values = Array.isArray(value) ? value : [value];
|
|
58
59
|
const regex = (0, utils_2.regexFromString)(condition);
|
|
59
60
|
return values
|
|
60
|
-
.map((_val) =>
|
|
61
|
+
.map((_val) => regex?.test(_val) && {
|
|
61
62
|
message: `"${_val}" should not match a regex ${condition}`,
|
|
62
63
|
location: (0, utils_1.isString)(value)
|
|
63
64
|
? baseLocation
|
|
@@ -264,7 +265,7 @@ exports.asserts = {
|
|
|
264
265
|
];
|
|
265
266
|
}
|
|
266
267
|
const regex = (0, utils_2.regexFromString)(condition);
|
|
267
|
-
const isValid = hasRef &&
|
|
268
|
+
const isValid = hasRef && regex?.test(rawValue['$ref']);
|
|
268
269
|
return isValid
|
|
269
270
|
? []
|
|
270
271
|
: [
|
|
@@ -278,4 +279,3 @@ exports.asserts = {
|
|
|
278
279
|
function buildAssertCustomFunction(fn) {
|
|
279
280
|
return (value, options, ctx) => fn.call(null, value, options, ctx);
|
|
280
281
|
}
|
|
281
|
-
exports.buildAssertCustomFunction = buildAssertCustomFunction;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { asserts, AssertionFn } from './asserts';
|
|
2
|
-
import { Oas2Visitor, Oas3Visitor } from '../../../visitors';
|
|
3
|
-
import { RuleSeverity } from '../../../config';
|
|
1
|
+
import type { asserts, AssertionFn } from './asserts';
|
|
2
|
+
import type { ArazzoVisitor, Async2Visitor, Async3Visitor, Oas2Visitor, Oas3Visitor } from '../../../visitors';
|
|
3
|
+
import type { RuleSeverity } from '../../../config';
|
|
4
4
|
export type AssertionLocators = {
|
|
5
5
|
filterInParentKeys?: (string | number)[];
|
|
6
6
|
filterOutParentKeys?: (string | number)[];
|
|
@@ -24,4 +24,4 @@ export type RawAssertion = AssertionDefinition & {
|
|
|
24
24
|
export type Assertion = RawAssertion & {
|
|
25
25
|
assertionId: string;
|
|
26
26
|
};
|
|
27
|
-
export declare const Assertions: (opts: Record<string, Assertion>) => (Oas3Visitor | Oas2Visitor)[];
|
|
27
|
+
export declare const Assertions: (opts: Record<string, Assertion>) => (Oas3Visitor | Oas2Visitor | Async2Visitor | Async3Visitor | ArazzoVisitor)[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Asserts } from './asserts';
|
|
1
|
+
import type { Asserts } from './asserts';
|
|
2
2
|
import type { AssertionContext, AssertResult } from '../../../config';
|
|
3
3
|
import type { Assertion, AssertionDefinition } from '.';
|
|
4
4
|
import type { Oas2Visitor, Oas3Visitor, VisitFunction } from '../../../visitors';
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getAssertsToApply = getAssertsToApply;
|
|
4
|
+
exports.buildVisitorObject = buildVisitorObject;
|
|
5
|
+
exports.buildSubjectVisitor = buildSubjectVisitor;
|
|
6
|
+
exports.getIntersectionLength = getIntersectionLength;
|
|
7
|
+
exports.isOrdered = isOrdered;
|
|
8
|
+
exports.runAssertion = runAssertion;
|
|
9
|
+
exports.regexFromString = regexFromString;
|
|
4
10
|
const asserts_1 = require("./asserts");
|
|
5
11
|
const logger_1 = require("../../../logger");
|
|
6
12
|
const ref_utils_1 = require("../../../ref-utils");
|
|
@@ -39,9 +45,8 @@ function getAssertsToApply(assertion) {
|
|
|
39
45
|
}
|
|
40
46
|
return assertsToApply;
|
|
41
47
|
}
|
|
42
|
-
exports.getAssertsToApply = getAssertsToApply;
|
|
43
48
|
function getAssertionProperties({ subject }) {
|
|
44
|
-
return (Array.isArray(subject.property) ? subject.property : [subject
|
|
49
|
+
return (Array.isArray(subject.property) ? subject.property : [subject?.property]).filter(Boolean);
|
|
45
50
|
}
|
|
46
51
|
function applyAssertions(assertionDefinition, asserts, ctx) {
|
|
47
52
|
const properties = getAssertionProperties(assertionDefinition);
|
|
@@ -66,13 +71,15 @@ function applyAssertions(assertionDefinition, asserts, ctx) {
|
|
|
66
71
|
return assertResults.flat();
|
|
67
72
|
}
|
|
68
73
|
function buildVisitorObject(assertion, subjectVisitor) {
|
|
69
|
-
var _a, _b;
|
|
70
74
|
const targetVisitorLocatorPredicates = getPredicatesFromLocators(assertion.subject);
|
|
71
75
|
const targetVisitorSkipFunction = targetVisitorLocatorPredicates.length
|
|
72
76
|
? (_, key) => !targetVisitorLocatorPredicates.every((predicate) => predicate(key))
|
|
73
77
|
: undefined;
|
|
74
78
|
const targetVisitor = {
|
|
75
|
-
[assertion.subject.type]:
|
|
79
|
+
[assertion.subject.type]: {
|
|
80
|
+
enter: subjectVisitor,
|
|
81
|
+
...(targetVisitorSkipFunction && { skip: targetVisitorSkipFunction }),
|
|
82
|
+
},
|
|
76
83
|
};
|
|
77
84
|
if (!Array.isArray(assertion.where)) {
|
|
78
85
|
return targetVisitor;
|
|
@@ -82,37 +89,44 @@ function buildVisitorObject(assertion, subjectVisitor) {
|
|
|
82
89
|
const context = assertion.where;
|
|
83
90
|
for (let index = 0; index < context.length; index++) {
|
|
84
91
|
const assertionDefinitionNode = context[index];
|
|
85
|
-
if (!(0, utils_1.isString)(
|
|
92
|
+
if (!(0, utils_1.isString)(assertionDefinitionNode.subject?.type)) {
|
|
86
93
|
throw new Error(`${assertion.assertionId} -> where -> [${index}]: 'type' (String) is required`);
|
|
87
94
|
}
|
|
88
95
|
const locatorPredicates = getPredicatesFromLocators(assertionDefinitionNode.subject);
|
|
89
96
|
const assertsToApply = getAssertsToApply(assertionDefinitionNode);
|
|
90
97
|
const skipFunction = (node, key, ctx) => !locatorPredicates.every((predicate) => predicate(key)) ||
|
|
91
|
-
!!applyAssertions(assertionDefinitionNode, assertsToApply,
|
|
92
|
-
const nodeVisitor =
|
|
98
|
+
!!applyAssertions(assertionDefinitionNode, assertsToApply, { ...ctx, node }).length;
|
|
99
|
+
const nodeVisitor = {
|
|
100
|
+
...((locatorPredicates.length || assertsToApply.length) && { skip: skipFunction }),
|
|
101
|
+
};
|
|
93
102
|
if (assertionDefinitionNode.subject.type === assertion.subject.type &&
|
|
94
103
|
index === context.length - 1) {
|
|
95
104
|
// We have to merge the visitors if the last node inside the `where` is the same as the subject.
|
|
96
|
-
targetVisitor[assertion.subject.type] =
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
105
|
+
targetVisitor[assertion.subject.type] = {
|
|
106
|
+
enter: subjectVisitor,
|
|
107
|
+
...((nodeVisitor.skip && { skip: nodeVisitor.skip }) ||
|
|
108
|
+
(targetVisitorSkipFunction && {
|
|
109
|
+
skip: (node, key, ctx // We may have locators defined on assertion level and on where level for the same node type
|
|
110
|
+
) => !!(nodeVisitor.skip?.(node, key, ctx) || targetVisitorSkipFunction?.(node, key)),
|
|
111
|
+
})),
|
|
112
|
+
};
|
|
101
113
|
}
|
|
102
114
|
else {
|
|
103
|
-
currentVisitorLevel = currentVisitorLevel[
|
|
115
|
+
currentVisitorLevel = currentVisitorLevel[assertionDefinitionNode.subject?.type] =
|
|
104
116
|
nodeVisitor;
|
|
105
117
|
}
|
|
106
118
|
}
|
|
107
119
|
currentVisitorLevel[assertion.subject.type] = targetVisitor[assertion.subject.type];
|
|
108
120
|
return visitor;
|
|
109
121
|
}
|
|
110
|
-
exports.buildVisitorObject = buildVisitorObject;
|
|
111
122
|
function buildSubjectVisitor(assertId, assertion) {
|
|
112
123
|
return (node, ctx) => {
|
|
113
124
|
const properties = getAssertionProperties(assertion);
|
|
114
125
|
const defaultMessage = `${logger_1.colorize.blue(assertId)} failed because the ${logger_1.colorize.blue(assertion.subject.type)} ${logger_1.colorize.blue(properties.join(', '))} didn't meet the assertions: ${assertionMessageTemplates.problems}`.replace(/ +/g, ' ');
|
|
115
|
-
const problems = applyAssertions(assertion, getAssertsToApply(assertion),
|
|
126
|
+
const problems = applyAssertions(assertion, getAssertsToApply(assertion), {
|
|
127
|
+
...ctx,
|
|
128
|
+
node,
|
|
129
|
+
});
|
|
116
130
|
if (problems.length) {
|
|
117
131
|
for (const problemGroup of groupProblemsByPointer(problems)) {
|
|
118
132
|
const message = assertion.message || defaultMessage;
|
|
@@ -128,7 +142,6 @@ function buildSubjectVisitor(assertId, assertion) {
|
|
|
128
142
|
}
|
|
129
143
|
};
|
|
130
144
|
}
|
|
131
|
-
exports.buildSubjectVisitor = buildSubjectVisitor;
|
|
132
145
|
function groupProblemsByPointer(problems) {
|
|
133
146
|
const groups = {};
|
|
134
147
|
for (const problem of problems) {
|
|
@@ -144,10 +157,9 @@ function getProblemsLocation(problems) {
|
|
|
144
157
|
return problems.length ? problems[0].location : undefined;
|
|
145
158
|
}
|
|
146
159
|
function getProblemsMessage(problems) {
|
|
147
|
-
var _a;
|
|
148
160
|
return problems.length === 1
|
|
149
|
-
?
|
|
150
|
-
: problems.map((problem) =>
|
|
161
|
+
? problems[0].message ?? ''
|
|
162
|
+
: problems.map((problem) => `\n- ${problem.message ?? ''}`).join('');
|
|
151
163
|
}
|
|
152
164
|
function getIntersectionLength(keys, properties) {
|
|
153
165
|
const props = new Set(properties);
|
|
@@ -159,7 +171,6 @@ function getIntersectionLength(keys, properties) {
|
|
|
159
171
|
}
|
|
160
172
|
return count;
|
|
161
173
|
}
|
|
162
|
-
exports.getIntersectionLength = getIntersectionLength;
|
|
163
174
|
function isOrdered(value, options) {
|
|
164
175
|
const direction = options.direction || options;
|
|
165
176
|
const property = options.property;
|
|
@@ -186,26 +197,30 @@ function isOrdered(value, options) {
|
|
|
186
197
|
}
|
|
187
198
|
return true;
|
|
188
199
|
}
|
|
189
|
-
exports.isOrdered = isOrdered;
|
|
190
200
|
function runAssertion({ assert, ctx, assertionProperty, }) {
|
|
191
|
-
var _a;
|
|
192
201
|
const currentLocation = assert.name === 'ref' ? ctx.rawLocation : ctx.location;
|
|
193
202
|
if (assertionProperty) {
|
|
194
203
|
const values = (0, ref_utils_1.isRef)(ctx.node[assertionProperty])
|
|
195
|
-
?
|
|
204
|
+
? ctx.resolve(ctx.node[assertionProperty])?.node
|
|
196
205
|
: ctx.node[assertionProperty];
|
|
197
206
|
const rawValues = ctx.rawNode[assertionProperty];
|
|
198
207
|
const location = currentLocation.child(assertionProperty);
|
|
199
|
-
return asserts_1.asserts[assert.name](values, assert.conditions,
|
|
208
|
+
return asserts_1.asserts[assert.name](values, assert.conditions, {
|
|
209
|
+
...ctx,
|
|
210
|
+
baseLocation: location,
|
|
211
|
+
rawValue: rawValues,
|
|
212
|
+
});
|
|
200
213
|
}
|
|
201
214
|
else {
|
|
202
215
|
const value = Array.isArray(ctx.node) ? ctx.node : Object.keys(ctx.node);
|
|
203
|
-
return asserts_1.asserts[assert.name](value, assert.conditions,
|
|
216
|
+
return asserts_1.asserts[assert.name](value, assert.conditions, {
|
|
217
|
+
...ctx,
|
|
218
|
+
rawValue: ctx.rawNode,
|
|
219
|
+
baseLocation: currentLocation,
|
|
220
|
+
});
|
|
204
221
|
}
|
|
205
222
|
}
|
|
206
|
-
exports.runAssertion = runAssertion;
|
|
207
223
|
function regexFromString(input) {
|
|
208
224
|
const matches = input.match(/^\/(.*)\/(.*)|(.*)/);
|
|
209
225
|
return matches && new RegExp(matches[1] || matches[3], matches[2]);
|
|
210
226
|
}
|
|
211
|
-
exports.regexFromString = regexFromString;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const InfoContact: Oas3Rule | Oas2Rule;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InfoLicenseStrict = void 0;
|
|
4
|
+
const oas_types_1 = require("../../oas-types");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
const InfoLicenseStrict = () => {
|
|
7
|
+
let specVersion;
|
|
8
|
+
return {
|
|
9
|
+
Root: {
|
|
10
|
+
enter(root) {
|
|
11
|
+
specVersion = (0, oas_types_1.detectSpec)(root);
|
|
12
|
+
},
|
|
13
|
+
License: {
|
|
14
|
+
leave(license, ctx) {
|
|
15
|
+
if (specVersion === 'oas3_1') {
|
|
16
|
+
(0, utils_1.validateOneOfDefinedAndNonEmpty)(['url', 'identifier'], license, ctx);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
(0, utils_1.validateDefinedAndNonEmpty)('url', license, ctx);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
exports.InfoLicenseStrict = InfoLicenseStrict;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const InfoLicenseUrl: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const InfoLicense: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const NoAmbiguousPaths: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const NoEnumTypeMismatch: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const NoHttpVerbsInPaths: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const NoIdenticalPaths: Oas3Rule | Oas2Rule;
|
|
@@ -3,8 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.NoInvalidParameterExamples = void 0;
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const NoInvalidParameterExamples = (opts) => {
|
|
6
|
-
|
|
7
|
-
const allowAdditionalProperties = (_a = (0, utils_1.getAdditionalPropertiesOption)(opts)) !== null && _a !== void 0 ? _a : false;
|
|
6
|
+
const allowAdditionalProperties = (0, utils_1.getAdditionalPropertiesOption)(opts) ?? false;
|
|
8
7
|
return {
|
|
9
8
|
Parameter: {
|
|
10
9
|
leave(parameter, ctx) {
|
|
@@ -3,8 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.NoInvalidSchemaExamples = void 0;
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const NoInvalidSchemaExamples = (opts) => {
|
|
6
|
-
|
|
7
|
-
const allowAdditionalProperties = (_a = (0, utils_1.getAdditionalPropertiesOption)(opts)) !== null && _a !== void 0 ? _a : false;
|
|
6
|
+
const allowAdditionalProperties = (0, utils_1.getAdditionalPropertiesOption)(opts) ?? false;
|
|
8
7
|
return {
|
|
9
8
|
Schema: {
|
|
10
9
|
leave(schema, ctx) {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const NoPathTrailingSlash: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas2Rule, Oas3Rule } from '../../visitors';
|
|
1
|
+
import type { Oas2Rule, Oas3Rule } from '../../visitors';
|
|
2
2
|
export declare const NoRequiredSchemaPropertiesUndefined: Oas3Rule | Oas2Rule;
|
|
@@ -10,7 +10,6 @@ const NoRequiredSchemaPropertiesUndefined = () => {
|
|
|
10
10
|
return;
|
|
11
11
|
const visitedSchemas = new Set();
|
|
12
12
|
const elevateProperties = (schema) => {
|
|
13
|
-
var _a, _b, _c, _d;
|
|
14
13
|
// Check if the schema has been visited before processing it
|
|
15
14
|
if (visitedSchemas.has(schema)) {
|
|
16
15
|
return {};
|
|
@@ -19,7 +18,7 @@ const NoRequiredSchemaPropertiesUndefined = () => {
|
|
|
19
18
|
if ((0, ref_utils_1.isRef)(schema)) {
|
|
20
19
|
return elevateProperties(resolve(schema).node);
|
|
21
20
|
}
|
|
22
|
-
return Object.assign({}, schema.properties, ...(
|
|
21
|
+
return Object.assign({}, schema.properties, ...(schema.allOf?.map(elevateProperties) ?? []), ...(schema.anyOf?.map(elevateProperties) ?? []));
|
|
23
22
|
};
|
|
24
23
|
const allProperties = elevateProperties(schema);
|
|
25
24
|
for (const [i, requiredProperty] of schema.required.entries()) {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const Operation2xxResponse: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const Operation4xxResponse: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const OperationDescription: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const OperationIdUnique: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const OperationIdUrlSafe: Oas3Rule | Oas2Rule;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.OperationIdUrlSafe = void 0;
|
|
4
|
+
// eslint-disable-next-line no-useless-escape
|
|
4
5
|
const validUrlSymbols = /^[A-Za-z0-9-._~:/?#\[\]@!\$&'()*+,;=]*$/;
|
|
5
6
|
const OperationIdUrlSafe = () => {
|
|
6
7
|
return {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const OperationOperationId: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const OperationParametersUnique: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const OperationSingularTag: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const OperationSummary: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const OperationTagDefined: Oas3Rule | Oas2Rule;
|
|
@@ -5,8 +5,7 @@ const OperationTagDefined = () => {
|
|
|
5
5
|
let definedTags;
|
|
6
6
|
return {
|
|
7
7
|
Root(root) {
|
|
8
|
-
|
|
9
|
-
definedTags = new Set(((_a = root.tags) !== null && _a !== void 0 ? _a : []).map((t) => t.name));
|
|
8
|
+
definedTags = new Set((root.tags ?? []).map((t) => t.name));
|
|
10
9
|
},
|
|
11
10
|
Operation(operation, { report, location }) {
|
|
12
11
|
if (operation.tags) {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const ParameterDescription: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const PathDeclarationMustExist: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas2Rule, Oas3Rule } from '../../visitors';
|
|
1
|
+
import type { Oas2Rule, Oas3Rule } from '../../visitors';
|
|
2
2
|
export declare const PathExcludesPatterns: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const PathHttpVerbsOrder: Oas3Rule | Oas2Rule;
|
|
@@ -16,7 +16,7 @@ const PathHttpVerbsOrder = (opts) => {
|
|
|
16
16
|
if (bIdx < aIdx) {
|
|
17
17
|
report({
|
|
18
18
|
message: 'Operation http verbs must be ordered.',
|
|
19
|
-
location:
|
|
19
|
+
location: { reportOnKey: true, ...location.child(httpVerbs[i + 1]) },
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const PathNotIncludeQuery: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const PathParamsDefined: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const PathSegmentPlural: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const PathsKebabCase: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule } from 'core/src/visitors';
|
|
1
|
+
import type { Oas3Rule } from 'core/src/visitors';
|
|
2
2
|
export declare const RequiredStringPropertyMissingMinLength: Oas3Rule;
|
|
@@ -7,7 +7,7 @@ const RequiredStringPropertyMissingMinLength = () => {
|
|
|
7
7
|
return {
|
|
8
8
|
Schema: {
|
|
9
9
|
enter(schema) {
|
|
10
|
-
if (!
|
|
10
|
+
if (!schema?.required) {
|
|
11
11
|
skipSchemaProperties = true;
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
@@ -21,7 +21,7 @@ const RequiredStringPropertyMissingMinLength = () => {
|
|
|
21
21
|
Schema: {
|
|
22
22
|
enter(schema, { key, location, report }) {
|
|
23
23
|
if (requiredPropertiesSet.has(key) && schema.type === 'string') {
|
|
24
|
-
if (!
|
|
24
|
+
if (!schema?.minLength) {
|
|
25
25
|
report({
|
|
26
26
|
message: 'Property minLength is required.',
|
|
27
27
|
location: location.key(),
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas2Rule, Oas3Rule } from '../../visitors';
|
|
1
|
+
import type { Oas2Rule, Oas3Rule } from '../../visitors';
|
|
2
2
|
export declare const ResponseContainsHeader: Oas3Rule | Oas2Rule;
|
|
@@ -13,8 +13,8 @@ const ResponseContainsHeader = (options) => {
|
|
|
13
13
|
names[(0, utils_1.getMatchingStatusCodeRange)(key).toLowerCase()] ||
|
|
14
14
|
[];
|
|
15
15
|
for (const expectedHeader of expectedHeaders) {
|
|
16
|
-
if (!
|
|
17
|
-
!Object.keys(response
|
|
16
|
+
if (!response?.headers ||
|
|
17
|
+
!Object.keys(response?.headers).some((header) => header.toLowerCase() === expectedHeader.toLowerCase())) {
|
|
18
18
|
report({
|
|
19
19
|
message: `Response object must contain a "${expectedHeader}" header.`,
|
|
20
20
|
location: location.child('headers').key(),
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const SecurityDefined: Oas3Rule | Oas2Rule;
|
|
@@ -52,13 +52,9 @@ const SecurityDefined = (opts) => {
|
|
|
52
52
|
path = key;
|
|
53
53
|
},
|
|
54
54
|
Operation(operation, { location, key }) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return item.path === path &&
|
|
59
|
-
(!item.methods || ((_a = item.methods) === null || _a === void 0 ? void 0 : _a.some((method) => method.toLowerCase() === key)));
|
|
60
|
-
});
|
|
61
|
-
if (!(operation === null || operation === void 0 ? void 0 : operation.security) && !isException) {
|
|
55
|
+
const isException = opts.exceptions?.some((item) => item.path === path &&
|
|
56
|
+
(!item.methods || item.methods?.some((method) => method.toLowerCase() === key)));
|
|
57
|
+
if (!operation?.security && !isException) {
|
|
62
58
|
eachOperationHasSecurity = false;
|
|
63
59
|
operationsWithoutSecurity.push(location);
|
|
64
60
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas2Rule, Oas3Rule } from '../../visitors';
|
|
1
|
+
import type { Oas2Rule, Oas3Rule } from '../../visitors';
|
|
2
2
|
export declare const SpecStrictRefs: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { Oas3Rule, Oas2Rule, Async2Rule, ArazzoRule } from '../../visitors';
|
|
2
|
-
export declare const Spec: Oas3Rule | Oas2Rule | Async2Rule | ArazzoRule;
|
|
1
|
+
import type { Oas3Rule, Oas2Rule, Async2Rule, Async3Rule, ArazzoRule } from '../../visitors';
|
|
2
|
+
export declare const Spec: Oas3Rule | Oas2Rule | Async2Rule | Async3Rule | ArazzoRule;
|
package/lib/rules/common/spec.js
CHANGED
|
@@ -8,7 +8,6 @@ const utils_2 = require("../../utils");
|
|
|
8
8
|
const Spec = () => {
|
|
9
9
|
return {
|
|
10
10
|
any(node, { report, type, location, rawLocation, key, resolve, ignoreNextVisitorsOnNode }) {
|
|
11
|
-
var _a, _b, _c, _d, _e, _f;
|
|
12
11
|
const nodeType = (0, utils_1.oasTypeOf)(node);
|
|
13
12
|
const refLocation = rawLocation !== location ? rawLocation : undefined;
|
|
14
13
|
if (type.items) {
|
|
@@ -42,7 +41,7 @@ const Spec = () => {
|
|
|
42
41
|
});
|
|
43
42
|
}
|
|
44
43
|
}
|
|
45
|
-
const allowed =
|
|
44
|
+
const allowed = type.allowed?.(node);
|
|
46
45
|
if (allowed && (0, utils_2.isPlainObject)(node)) {
|
|
47
46
|
for (const propName in node) {
|
|
48
47
|
if (allowed.includes(propName) ||
|
|
@@ -67,7 +66,7 @@ const Spec = () => {
|
|
|
67
66
|
}
|
|
68
67
|
if (!hasProperty)
|
|
69
68
|
report({
|
|
70
|
-
message: `Must contain at least one of the following fields: ${
|
|
69
|
+
message: `Must contain at least one of the following fields: ${type.requiredOneOf?.join(', ')}.`,
|
|
71
70
|
from: refLocation,
|
|
72
71
|
location: [{ reportOnKey: true }],
|
|
73
72
|
});
|
|
@@ -102,9 +101,9 @@ const Spec = () => {
|
|
|
102
101
|
if (propSchema.resolvable !== false && (0, ref_utils_1.isRef)(propValue)) {
|
|
103
102
|
propValue = resolve(propValue).node;
|
|
104
103
|
}
|
|
105
|
-
if (propSchema.items &&
|
|
104
|
+
if (propSchema.items && propSchema.items?.enum && Array.isArray(propValue)) {
|
|
106
105
|
for (let i = 0; i < propValue.length; i++) {
|
|
107
|
-
(0, utils_1.validateSchemaEnumType)(
|
|
106
|
+
(0, utils_1.validateSchemaEnumType)(propSchema.items?.enum, propValue[i], propName, refLocation, {
|
|
108
107
|
report,
|
|
109
108
|
location: location.child([propName, i]),
|
|
110
109
|
});
|
|
@@ -124,8 +123,8 @@ const Spec = () => {
|
|
|
124
123
|
});
|
|
125
124
|
ignoreNextVisitorsOnNode();
|
|
126
125
|
}
|
|
127
|
-
else if (propValueType === 'array' &&
|
|
128
|
-
const itemsType =
|
|
126
|
+
else if (propValueType === 'array' && propSchema.items?.type) {
|
|
127
|
+
const itemsType = propSchema.items?.type;
|
|
129
128
|
for (let i = 0; i < propValue.length; i++) {
|
|
130
129
|
const item = propValue[i];
|
|
131
130
|
if (!(0, utils_1.matchesJsonSchemaType)(item, itemsType, false)) {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const TagDescription: Oas3Rule | Oas2Rule;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
1
|
+
import type { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
2
|
export declare const TagsAlphabetical: Oas3Rule | Oas2Rule;
|