@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,8 +1,9 @@
|
|
|
1
|
-
import { Oas3Decorator } from '../../visitors';
|
|
2
|
-
import { Oas3Operation, Oas3RequestBody, Oas3Response } from '../../typings/openapi';
|
|
3
1
|
import { yamlAndJsonSyncReader } from '../../utils';
|
|
4
2
|
import { isRef } from '../../ref-utils';
|
|
5
|
-
|
|
3
|
+
|
|
4
|
+
import type { Oas3Decorator } from '../../visitors';
|
|
5
|
+
import type { Oas3Operation, Oas3RequestBody, Oas3Response } from '../../typings/openapi';
|
|
6
|
+
import type { NonUndefined, ResolveFn, UserContext } from '../../walk';
|
|
6
7
|
|
|
7
8
|
export const MediaTypeExamplesOverride: Oas3Decorator = ({ operationIds }) => {
|
|
8
9
|
return {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { Oas3Decorator, Oas2Decorator } from '../../visitors';
|
|
2
|
-
import { Oas2Operation } from '../../typings/swagger';
|
|
3
|
-
import { Oas3Operation } from '../../typings/openapi';
|
|
4
1
|
import { readFileAsStringSync } from '../../utils';
|
|
5
|
-
|
|
2
|
+
|
|
3
|
+
import type { Oas3Decorator, Oas2Decorator } from '../../visitors';
|
|
4
|
+
import type { Oas2Operation } from '../../typings/swagger';
|
|
5
|
+
import type { Oas3Operation } from '../../typings/openapi';
|
|
6
|
+
import type { UserContext } from '../../walk';
|
|
6
7
|
|
|
7
8
|
export const OperationDescriptionOverride: Oas3Decorator | Oas2Decorator = ({ operationIds }) => {
|
|
8
9
|
return {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { UserContext } from '../../walk';
|
|
2
1
|
import { isRedoclyRegistryURL } from '../../redocly/domains';
|
|
3
2
|
|
|
4
|
-
import {
|
|
3
|
+
import type { UserContext } from '../../walk';
|
|
4
|
+
import type { Oas3Decorator, Oas2Decorator } from '../../visitors';
|
|
5
5
|
|
|
6
6
|
export const RegistryDependencies: Oas3Decorator | Oas2Decorator = () => {
|
|
7
7
|
const registryDependencies = new Set<string>();
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { Oas3Decorator, Oas2Decorator } from '../../visitors';
|
|
2
1
|
import { isEmptyArray, isEmptyObject, isPlainObject } from '../../utils';
|
|
3
|
-
import { UserContext } from '../../walk';
|
|
4
2
|
import { isRef } from '../../ref-utils';
|
|
5
3
|
|
|
4
|
+
import type { Oas3Decorator, Oas2Decorator } from '../../visitors';
|
|
5
|
+
import type { UserContext } from '../../walk';
|
|
6
|
+
|
|
6
7
|
const DEFAULT_INTERNAL_PROPERTY_NAME = 'x-internal';
|
|
7
8
|
|
|
8
9
|
export const RemoveXInternal: Oas3Decorator | Oas2Decorator = ({ internalFlagProperty }) => {
|
|
9
|
-
const hiddenTag = internalFlagProperty || DEFAULT_INTERNAL_PROPERTY_NAME;
|
|
10
|
+
const hiddenTag: string = internalFlagProperty || DEFAULT_INTERNAL_PROPERTY_NAME;
|
|
10
11
|
|
|
11
12
|
function removeInternal(node: any, ctx: UserContext) {
|
|
12
13
|
const { parent, key } = ctx;
|
|
@@ -31,7 +32,7 @@ export const RemoveXInternal: Oas3Decorator | Oas2Decorator = ({ internalFlagPro
|
|
|
31
32
|
for (const key of Object.keys(node)) {
|
|
32
33
|
node = node as any;
|
|
33
34
|
if (isRef(node[key])) {
|
|
34
|
-
const resolved = ctx.resolve(node[key]);
|
|
35
|
+
const resolved = ctx.resolve<any>(node[key]);
|
|
35
36
|
if (resolved.node?.[hiddenTag]) {
|
|
36
37
|
delete node[key];
|
|
37
38
|
didDelete = true;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Oas3Decorator, Oas2Decorator } from '../../visitors';
|
|
2
1
|
import { readFileAsStringSync } from '../../utils';
|
|
3
|
-
|
|
2
|
+
|
|
3
|
+
import type { Oas3Decorator, Oas2Decorator } from '../../visitors';
|
|
4
|
+
import type { UserContext } from '../../walk';
|
|
4
5
|
|
|
5
6
|
export const TagDescriptionOverride: Oas3Decorator | Oas2Decorator = ({ tagNames }) => {
|
|
6
7
|
return {
|
|
@@ -38,7 +38,7 @@ describe('oas2 remove-unused-components', () => {
|
|
|
38
38
|
const results = await bundleDocument({
|
|
39
39
|
externalRefResolver: new BaseResolver(),
|
|
40
40
|
document,
|
|
41
|
-
config: await makeConfig({}),
|
|
41
|
+
config: await makeConfig({ rules: {} }),
|
|
42
42
|
removeUnusedComponents: true,
|
|
43
43
|
});
|
|
44
44
|
|
|
@@ -111,7 +111,7 @@ describe('oas2 remove-unused-components', () => {
|
|
|
111
111
|
const results = await bundleDocument({
|
|
112
112
|
externalRefResolver: new BaseResolver(),
|
|
113
113
|
document,
|
|
114
|
-
config: await makeConfig({}),
|
|
114
|
+
config: await makeConfig({ rules: {} }),
|
|
115
115
|
removeUnusedComponents: true,
|
|
116
116
|
});
|
|
117
117
|
|
|
@@ -192,7 +192,7 @@ describe('oas2 remove-unused-components', () => {
|
|
|
192
192
|
const results = await bundleDocument({
|
|
193
193
|
externalRefResolver: new BaseResolver(),
|
|
194
194
|
document,
|
|
195
|
-
config: await makeConfig({}),
|
|
195
|
+
config: await makeConfig({ rules: {} }),
|
|
196
196
|
removeUnusedComponents: true,
|
|
197
197
|
});
|
|
198
198
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Oas2Decorator } from '../../visitors';
|
|
2
1
|
import { RegistryDependencies } from '../common/registry-dependencies';
|
|
3
2
|
import { OperationDescriptionOverride } from '../common/operation-description-override';
|
|
4
3
|
import { TagDescriptionOverride } from '../common/tag-description-override';
|
|
@@ -8,6 +7,8 @@ import { RemoveXInternal } from '../common/remove-x-internal';
|
|
|
8
7
|
import { FilterIn } from '../common/filters/filter-in';
|
|
9
8
|
import { FilterOut } from '../common/filters/filter-out';
|
|
10
9
|
|
|
10
|
+
import type { Oas2Decorator } from '../../visitors';
|
|
11
|
+
|
|
11
12
|
export const decorators = {
|
|
12
13
|
'registry-dependencies': RegistryDependencies as Oas2Decorator,
|
|
13
14
|
'operation-description-override': OperationDescriptionOverride as Oas2Decorator,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Location } from '../../ref-utils';
|
|
2
1
|
import { isEmptyObject } from '../../utils';
|
|
3
2
|
|
|
3
|
+
import type { Location } from '../../ref-utils';
|
|
4
4
|
import type { Oas2Decorator } from '../../visitors';
|
|
5
5
|
import type { Oas2Components, Oas2Definition } from '../../typings/swagger';
|
|
6
6
|
|
|
@@ -42,7 +42,7 @@ describe('oas3 remove-unused-components', () => {
|
|
|
42
42
|
const results = await bundleDocument({
|
|
43
43
|
externalRefResolver: new BaseResolver(),
|
|
44
44
|
document,
|
|
45
|
-
config: await makeConfig({}),
|
|
45
|
+
config: await makeConfig({ rules: {} }),
|
|
46
46
|
removeUnusedComponents: true,
|
|
47
47
|
});
|
|
48
48
|
|
|
@@ -121,7 +121,7 @@ describe('oas3 remove-unused-components', () => {
|
|
|
121
121
|
const results = await bundleDocument({
|
|
122
122
|
externalRefResolver: new BaseResolver(),
|
|
123
123
|
document,
|
|
124
|
-
config: await makeConfig({}),
|
|
124
|
+
config: await makeConfig({ rules: {} }),
|
|
125
125
|
removeUnusedComponents: true,
|
|
126
126
|
});
|
|
127
127
|
|
|
@@ -204,7 +204,7 @@ describe('oas3 remove-unused-components', () => {
|
|
|
204
204
|
const results = await bundleDocument({
|
|
205
205
|
externalRefResolver: new BaseResolver(),
|
|
206
206
|
document,
|
|
207
|
-
config: await makeConfig({}),
|
|
207
|
+
config: await makeConfig({ rules: {} }),
|
|
208
208
|
removeUnusedComponents: true,
|
|
209
209
|
});
|
|
210
210
|
|
|
@@ -270,7 +270,7 @@ describe('oas3 remove-unused-components', () => {
|
|
|
270
270
|
const results = await bundleDocument({
|
|
271
271
|
externalRefResolver: new BaseResolver(),
|
|
272
272
|
document,
|
|
273
|
-
config: await makeConfig({}),
|
|
273
|
+
config: await makeConfig({ rules: {} }),
|
|
274
274
|
removeUnusedComponents: true,
|
|
275
275
|
});
|
|
276
276
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Oas3Decorator } from '../../visitors';
|
|
2
1
|
import { RegistryDependencies } from '../common/registry-dependencies';
|
|
3
2
|
import { OperationDescriptionOverride } from '../common/operation-description-override';
|
|
4
3
|
import { TagDescriptionOverride } from '../common/tag-description-override';
|
|
@@ -9,6 +8,8 @@ import { FilterIn } from '../common/filters/filter-in';
|
|
|
9
8
|
import { FilterOut } from '../common/filters/filter-out';
|
|
10
9
|
import { MediaTypeExamplesOverride } from '../common/media-type-examples-override';
|
|
11
10
|
|
|
11
|
+
import type { Oas3Decorator } from '../../visitors';
|
|
12
|
+
|
|
12
13
|
export const decorators = {
|
|
13
14
|
'registry-dependencies': RegistryDependencies as Oas3Decorator,
|
|
14
15
|
'operation-description-override': OperationDescriptionOverride as Oas3Decorator,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Location } from '../../ref-utils';
|
|
2
1
|
import { isEmptyObject } from '../../utils';
|
|
3
2
|
|
|
3
|
+
import type { Location } from '../../ref-utils';
|
|
4
4
|
import type { Oas3Decorator } from '../../visitors';
|
|
5
5
|
import type { Oas3Components, Oas3Definition } from '../../typings/openapi';
|
|
6
6
|
|
package/src/format/codeframes.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as yamlAst from 'yaml-ast-parser';
|
|
2
2
|
import { unescapePointer } from '../ref-utils';
|
|
3
|
-
import { LineColLocationObject, Loc, LocationObject } from '../walk';
|
|
4
3
|
import { colorize, colorOptions } from '../logger';
|
|
5
4
|
|
|
5
|
+
import type { LineColLocationObject, Loc, LocationObject } from '../walk';
|
|
6
|
+
|
|
6
7
|
type YAMLMapping = yamlAst.YAMLMapping & { kind: yamlAst.Kind.MAPPING };
|
|
7
8
|
type YAMLMap = yamlAst.YamlMap & { kind: yamlAst.Kind.MAP };
|
|
8
9
|
type YAMLAnchorReference = yamlAst.YAMLAnchorReference & { kind: yamlAst.Kind.ANCHOR_REF };
|
package/src/format/format.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import { colorOptions, colorize, logger } from '../logger';
|
|
3
3
|
import { output } from '../output';
|
|
4
|
-
|
|
5
|
-
const coreVersion = require('../../package.json').version;
|
|
6
|
-
|
|
7
|
-
import { NormalizedProblem, ProblemSeverity, LineColLocationObject, LocationObject } from '../walk';
|
|
8
4
|
import { getCodeframe, getLineColLocation } from './codeframes';
|
|
9
5
|
import { env, isBrowser } from '../env';
|
|
10
6
|
import { isAbsoluteUrl } from '../ref-utils';
|
|
11
7
|
|
|
8
|
+
import type {
|
|
9
|
+
NormalizedProblem,
|
|
10
|
+
ProblemSeverity,
|
|
11
|
+
LineColLocationObject,
|
|
12
|
+
LocationObject,
|
|
13
|
+
} from '../walk';
|
|
14
|
+
|
|
15
|
+
const coreVersion = require('../../package.json').version;
|
|
16
|
+
|
|
12
17
|
export type Totals = {
|
|
13
18
|
errors: number;
|
|
14
19
|
warnings: number;
|
package/src/index.ts
CHANGED
|
@@ -11,7 +11,8 @@ export { Oas3_1Types } from './types/oas3_1';
|
|
|
11
11
|
export { ArazzoTypes } from './types/arazzo';
|
|
12
12
|
export { Oas3Types } from './types/oas3';
|
|
13
13
|
export { Oas2Types } from './types/oas2';
|
|
14
|
-
export { AsyncApi2Types } from './types/
|
|
14
|
+
export { AsyncApi2Types } from './types/asyncapi2';
|
|
15
|
+
export { AsyncApi3Types } from './types/asyncapi3';
|
|
15
16
|
export { ConfigTypes } from './types/redocly-yaml';
|
|
16
17
|
export type {
|
|
17
18
|
Oas3Definition,
|
package/src/js-yaml/index.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// TODO: add a type for "types" https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/js-yaml/index.d.ts
|
|
2
2
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
3
3
|
// @ts-ignore
|
|
4
|
-
import { JSON_SCHEMA, types,
|
|
4
|
+
import { JSON_SCHEMA, types, load, dump } from 'js-yaml';
|
|
5
|
+
|
|
6
|
+
import type { LoadOptions, DumpOptions } from 'js-yaml';
|
|
5
7
|
|
|
6
8
|
const DEFAULT_SCHEMA_WITHOUT_TIMESTAMP = JSON_SCHEMA.extend({
|
|
7
9
|
implicit: [types.merge],
|
package/src/lint.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { rootRedoclyConfigSchema } from '@redocly/config';
|
|
1
2
|
import { BaseResolver, resolveDocument, makeDocumentFromString } from './resolve';
|
|
2
3
|
import { normalizeVisitors } from './visitors';
|
|
3
4
|
import { walkDocument } from './walk';
|
|
4
|
-
import {
|
|
5
|
+
import { initRules } from './config';
|
|
5
6
|
import { normalizeTypes } from './types';
|
|
6
7
|
import { releaseAjvInstance } from './rules/ajv';
|
|
7
8
|
import { SpecVersion, getMajorSpecVersion, detectSpec, getTypes } from './oas-types';
|
|
@@ -9,19 +10,30 @@ import { createConfigTypes } from './types/redocly-yaml';
|
|
|
9
10
|
import { Spec } from './rules/common/spec';
|
|
10
11
|
import { NoUnresolvedRefs } from './rules/no-unresolved-refs';
|
|
11
12
|
|
|
13
|
+
import type { StyleguideConfig, Config } from './config';
|
|
12
14
|
import type { Document, ResolvedRefMap } from './resolve';
|
|
13
15
|
import type { ProblemSeverity, WalkContext } from './walk';
|
|
14
16
|
import type { NodeType } from './types';
|
|
15
|
-
import type {
|
|
16
|
-
|
|
17
|
+
import type {
|
|
18
|
+
ArazzoVisitor,
|
|
19
|
+
Async2Visitor,
|
|
20
|
+
Async3Visitor,
|
|
21
|
+
NestedVisitObject,
|
|
22
|
+
Oas2Visitor,
|
|
23
|
+
Oas3Visitor,
|
|
24
|
+
RuleInstanceConfig,
|
|
25
|
+
} from './visitors';
|
|
26
|
+
import type { CollectFn } from './utils';
|
|
17
27
|
|
|
18
28
|
export async function lint(opts: {
|
|
19
29
|
ref: string;
|
|
20
30
|
config: Config;
|
|
21
31
|
externalRefResolver?: BaseResolver;
|
|
32
|
+
collectSpecData?: CollectFn;
|
|
22
33
|
}) {
|
|
23
34
|
const { ref, externalRefResolver = new BaseResolver(opts.config.resolve) } = opts;
|
|
24
35
|
const document = (await externalRefResolver.resolveDocument(null, ref, true)) as Document;
|
|
36
|
+
opts.collectSpecData?.(document.parsed);
|
|
25
37
|
|
|
26
38
|
return lintDocument({
|
|
27
39
|
document,
|
|
@@ -130,7 +142,19 @@ export async function lintConfig(opts: {
|
|
|
130
142
|
);
|
|
131
143
|
|
|
132
144
|
const rules: (RuleInstanceConfig & {
|
|
133
|
-
visitor: NestedVisitObject<
|
|
145
|
+
visitor: NestedVisitObject<
|
|
146
|
+
unknown,
|
|
147
|
+
| Oas3Visitor
|
|
148
|
+
| Oas3Visitor[]
|
|
149
|
+
| Oas2Visitor
|
|
150
|
+
| Oas2Visitor[]
|
|
151
|
+
| Async2Visitor
|
|
152
|
+
| Async2Visitor[]
|
|
153
|
+
| Async3Visitor
|
|
154
|
+
| Async3Visitor[]
|
|
155
|
+
| ArazzoVisitor
|
|
156
|
+
| ArazzoVisitor[]
|
|
157
|
+
>;
|
|
134
158
|
})[] = [
|
|
135
159
|
{
|
|
136
160
|
severity: severity || 'error',
|
package/src/logger.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as colorette from 'colorette';
|
|
2
|
-
export { options as colorOptions } from 'colorette';
|
|
3
|
-
|
|
4
2
|
import { isBrowser } from './env';
|
|
5
3
|
import { identity } from './utils';
|
|
6
4
|
|
|
5
|
+
export { options as colorOptions } from 'colorette';
|
|
6
|
+
|
|
7
7
|
export const colorize = new Proxy(colorette, {
|
|
8
8
|
get(target: typeof colorette, prop: string): typeof identity {
|
|
9
9
|
if (isBrowser) {
|
package/src/oas-types.ts
CHANGED
|
@@ -1,33 +1,38 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Oas3Rule,
|
|
3
|
-
Oas3Preprocessor,
|
|
4
|
-
Oas2Rule,
|
|
5
|
-
Oas2Preprocessor,
|
|
6
|
-
Async2Preprocessor,
|
|
7
|
-
Async2Rule,
|
|
8
|
-
ArazzoPreprocessor,
|
|
9
|
-
ArazzoRule,
|
|
10
|
-
} from './visitors';
|
|
11
1
|
import { Oas2Types } from './types/oas2';
|
|
12
2
|
import { Oas3Types } from './types/oas3';
|
|
13
3
|
import { Oas3_1Types } from './types/oas3_1';
|
|
14
|
-
import { AsyncApi2Types } from './types/
|
|
4
|
+
import { AsyncApi2Types } from './types/asyncapi2';
|
|
5
|
+
import { AsyncApi3Types } from './types/asyncapi3';
|
|
15
6
|
import { ArazzoTypes } from './types/arazzo';
|
|
16
|
-
import {
|
|
7
|
+
import { isPlainObject } from './utils';
|
|
8
|
+
|
|
9
|
+
import type {
|
|
17
10
|
BuiltInAsync2RuleId,
|
|
11
|
+
BuiltInAsync3RuleId,
|
|
18
12
|
BuiltInCommonOASRuleId,
|
|
19
13
|
BuiltInArazzoRuleId,
|
|
20
14
|
BuiltInOAS2RuleId,
|
|
21
15
|
BuiltInOAS3RuleId,
|
|
22
16
|
} from './types/redocly-yaml';
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
import type {
|
|
18
|
+
Oas3Rule,
|
|
19
|
+
Oas3Preprocessor,
|
|
20
|
+
Oas2Rule,
|
|
21
|
+
Oas2Preprocessor,
|
|
22
|
+
Async2Preprocessor,
|
|
23
|
+
Async2Rule,
|
|
24
|
+
Async3Preprocessor,
|
|
25
|
+
Async3Rule,
|
|
26
|
+
ArazzoPreprocessor,
|
|
27
|
+
ArazzoRule,
|
|
28
|
+
} from './visitors';
|
|
25
29
|
|
|
26
30
|
export enum SpecVersion {
|
|
27
31
|
OAS2 = 'oas2',
|
|
28
32
|
OAS3_0 = 'oas3_0',
|
|
29
33
|
OAS3_1 = 'oas3_1',
|
|
30
|
-
Async2 = 'async2',
|
|
34
|
+
Async2 = 'async2',
|
|
35
|
+
Async3 = 'async3',
|
|
31
36
|
Arazzo = 'arazzo',
|
|
32
37
|
}
|
|
33
38
|
|
|
@@ -35,6 +40,7 @@ export enum SpecMajorVersion {
|
|
|
35
40
|
OAS2 = 'oas2',
|
|
36
41
|
OAS3 = 'oas3',
|
|
37
42
|
Async2 = 'async2',
|
|
43
|
+
Async3 = 'async3',
|
|
38
44
|
Arazzo = 'arazzo',
|
|
39
45
|
}
|
|
40
46
|
|
|
@@ -43,6 +49,7 @@ const typesMap = {
|
|
|
43
49
|
[SpecVersion.OAS3_0]: Oas3Types,
|
|
44
50
|
[SpecVersion.OAS3_1]: Oas3_1Types,
|
|
45
51
|
[SpecVersion.Async2]: AsyncApi2Types,
|
|
52
|
+
[SpecVersion.Async3]: AsyncApi3Types,
|
|
46
53
|
[SpecVersion.Arazzo]: ArazzoTypes,
|
|
47
54
|
};
|
|
48
55
|
|
|
@@ -65,6 +72,11 @@ export type Async2RuleSet<T = undefined> = RuleMap<
|
|
|
65
72
|
Async2Rule,
|
|
66
73
|
T
|
|
67
74
|
>;
|
|
75
|
+
export type Async3RuleSet<T = undefined> = RuleMap<
|
|
76
|
+
BuiltInAsync3RuleId | 'assertions',
|
|
77
|
+
Async3Rule,
|
|
78
|
+
T
|
|
79
|
+
>;
|
|
68
80
|
export type ArazzoRuleSet<T = undefined> = RuleMap<
|
|
69
81
|
BuiltInArazzoRuleId | 'assertions',
|
|
70
82
|
ArazzoRule,
|
|
@@ -74,15 +86,17 @@ export type ArazzoRuleSet<T = undefined> = RuleMap<
|
|
|
74
86
|
export type Oas3PreprocessorsSet = Record<string, Oas3Preprocessor>;
|
|
75
87
|
export type Oas2PreprocessorsSet = Record<string, Oas2Preprocessor>;
|
|
76
88
|
export type Async2PreprocessorsSet = Record<string, Async2Preprocessor>;
|
|
89
|
+
export type Async3PreprocessorsSet = Record<string, Async3Preprocessor>;
|
|
77
90
|
export type ArazzoPreprocessorsSet = Record<string, ArazzoPreprocessor>;
|
|
78
91
|
|
|
79
92
|
export type Oas3DecoratorsSet = Record<string, Oas3Preprocessor>;
|
|
80
93
|
export type Oas2DecoratorsSet = Record<string, Oas2Preprocessor>;
|
|
81
94
|
export type Async2DecoratorsSet = Record<string, Async2Preprocessor>;
|
|
95
|
+
export type Async3DecoratorsSet = Record<string, Async3Preprocessor>;
|
|
82
96
|
export type ArazzoDecoratorsSet = Record<string, ArazzoPreprocessor>;
|
|
83
97
|
|
|
84
|
-
export function detectSpec(root:
|
|
85
|
-
if (
|
|
98
|
+
export function detectSpec(root: unknown): SpecVersion {
|
|
99
|
+
if (!isPlainObject(root)) {
|
|
86
100
|
throw new Error(`Document must be JSON object, got ${typeof root}`);
|
|
87
101
|
}
|
|
88
102
|
|
|
@@ -90,11 +104,11 @@ export function detectSpec(root: any): SpecVersion {
|
|
|
90
104
|
throw new Error(`Invalid OpenAPI version: should be a string but got "${typeof root.openapi}"`);
|
|
91
105
|
}
|
|
92
106
|
|
|
93
|
-
if (root.openapi && root.openapi.startsWith('3.0')) {
|
|
107
|
+
if (typeof root.openapi === 'string' && root.openapi.startsWith('3.0')) {
|
|
94
108
|
return SpecVersion.OAS3_0;
|
|
95
109
|
}
|
|
96
110
|
|
|
97
|
-
if (root.openapi && root.openapi.startsWith('3.1')) {
|
|
111
|
+
if (typeof root.openapi === 'string' && root.openapi.startsWith('3.1')) {
|
|
98
112
|
return SpecVersion.OAS3_1;
|
|
99
113
|
}
|
|
100
114
|
|
|
@@ -102,20 +116,23 @@ export function detectSpec(root: any): SpecVersion {
|
|
|
102
116
|
return SpecVersion.OAS2;
|
|
103
117
|
}
|
|
104
118
|
|
|
105
|
-
// if not detected yet
|
|
106
119
|
if (root.openapi || root.swagger) {
|
|
107
120
|
throw new Error(`Unsupported OpenAPI version: ${root.openapi || root.swagger}`);
|
|
108
121
|
}
|
|
109
122
|
|
|
110
|
-
if (root.asyncapi && root.asyncapi.startsWith('2.')) {
|
|
123
|
+
if (typeof root.asyncapi === 'string' && root.asyncapi.startsWith('2.')) {
|
|
111
124
|
return SpecVersion.Async2;
|
|
112
125
|
}
|
|
113
126
|
|
|
127
|
+
if (typeof root.asyncapi === 'string' && root.asyncapi.startsWith('3.')) {
|
|
128
|
+
return SpecVersion.Async3;
|
|
129
|
+
}
|
|
130
|
+
|
|
114
131
|
if (root.asyncapi) {
|
|
115
132
|
throw new Error(`Unsupported AsyncAPI version: ${root.asyncapi}`);
|
|
116
133
|
}
|
|
117
134
|
|
|
118
|
-
if (root.arazzo && root.arazzo.startsWith('1.')) {
|
|
135
|
+
if (typeof root.arazzo === 'string' && root.arazzo.startsWith('1.')) {
|
|
119
136
|
return SpecVersion.Arazzo;
|
|
120
137
|
}
|
|
121
138
|
|
|
@@ -127,6 +144,8 @@ export function getMajorSpecVersion(version: SpecVersion): SpecMajorVersion {
|
|
|
127
144
|
return SpecMajorVersion.OAS2;
|
|
128
145
|
} else if (version === SpecVersion.Async2) {
|
|
129
146
|
return SpecMajorVersion.Async2;
|
|
147
|
+
} else if (version === SpecVersion.Async3) {
|
|
148
|
+
return SpecMajorVersion.Async3;
|
|
130
149
|
} else if (version === SpecVersion.Arazzo) {
|
|
131
150
|
return SpecMajorVersion.Arazzo;
|
|
132
151
|
} else {
|
package/src/redocly/domains.ts
CHANGED
package/src/redocly/index.ts
CHANGED
|
@@ -3,11 +3,8 @@ import { resolve } from 'path';
|
|
|
3
3
|
import { homedir } from 'os';
|
|
4
4
|
import { RegistryApi } from './registry-api';
|
|
5
5
|
import { env } from '../env';
|
|
6
|
-
import { RegionalToken, RegionalTokenWithValidity } from './redocly-client-types';
|
|
7
6
|
import { isNotEmptyObject } from '../utils';
|
|
8
7
|
import { colorize } from '../logger';
|
|
9
|
-
|
|
10
|
-
import type { AccessTokens, Region } from '../config/types';
|
|
11
8
|
import {
|
|
12
9
|
AVAILABLE_REGIONS,
|
|
13
10
|
DEFAULT_REGION,
|
|
@@ -16,6 +13,9 @@ import {
|
|
|
16
13
|
setRedoclyDomain,
|
|
17
14
|
} from './domains';
|
|
18
15
|
|
|
16
|
+
import type { RegionalToken, RegionalTokenWithValidity } from './redocly-client-types';
|
|
17
|
+
import type { AccessTokens, Region } from '../config/types';
|
|
18
|
+
|
|
19
19
|
export const TOKEN_FILENAME = '.redocly-config.json';
|
|
20
20
|
|
|
21
21
|
export class RedoclyClient {
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import fetch
|
|
1
|
+
import fetch from 'node-fetch';
|
|
2
|
+
import { getProxyAgent, isNotEmptyObject } from '../utils';
|
|
3
|
+
import { getRedoclyDomain } from './domains';
|
|
4
|
+
|
|
5
|
+
import type { RequestInit, HeadersInit } from 'node-fetch';
|
|
2
6
|
import type {
|
|
3
7
|
NotFoundProblemResponse,
|
|
4
8
|
PrepareFileuploadOKResponse,
|
|
@@ -6,8 +10,6 @@ import type {
|
|
|
6
10
|
PushApiParams,
|
|
7
11
|
} from './registry-api-types';
|
|
8
12
|
import type { AccessTokens, Region } from '../config/types';
|
|
9
|
-
import { getProxyAgent, isNotEmptyObject } from '../utils';
|
|
10
|
-
import { getRedoclyDomain } from './domains';
|
|
11
13
|
|
|
12
14
|
const version = require('../../package.json').version;
|
|
13
15
|
|
package/src/ref-utils.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Source } from './resolve';
|
|
2
|
-
import { OasRef } from './typings/openapi';
|
|
3
1
|
import { isTruthy } from './utils';
|
|
4
2
|
|
|
3
|
+
import type { Source } from './resolve';
|
|
4
|
+
import type { OasRef } from './typings/openapi';
|
|
5
|
+
|
|
5
6
|
export function joinPointer(base: string, key: string | number) {
|
|
6
7
|
if (base === '') base = '#/';
|
|
7
8
|
return base[base.length - 1] === '/' ? base + key : base + '/' + key;
|
|
@@ -60,6 +61,7 @@ export function pointerBaseName(pointer: string) {
|
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
export function refBaseName(ref: string) {
|
|
64
|
+
// eslint-disable-next-line no-useless-escape
|
|
63
65
|
const parts = ref.split(/[\/\\]/); // split by '\' and '/'
|
|
64
66
|
return parts[parts.length - 1].replace(/\.[^.]+$/, ''); // replace extension with empty string
|
|
65
67
|
}
|
package/src/resolve.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import { OasRef } from './typings/openapi';
|
|
4
3
|
import { isRef, joinPointer, escapePointer, parseRef, isAbsoluteUrl, isAnchor } from './ref-utils';
|
|
5
|
-
import
|
|
6
|
-
import { NormalizedNodeType, isNamedType, SpecExtension } from './types';
|
|
4
|
+
import { isNamedType, SpecExtension } from './types';
|
|
7
5
|
import { readFileFromUrl, parseYaml, nextTick } from './utils';
|
|
8
|
-
|
|
6
|
+
|
|
7
|
+
import type { YAMLNode, LoadOptions } from 'yaml-ast-parser';
|
|
8
|
+
import type { NormalizedNodeType } from './types';
|
|
9
|
+
import type { ResolveConfig } from './config/types';
|
|
10
|
+
import type { OasRef } from './typings/openapi';
|
|
9
11
|
|
|
10
12
|
export type CollectedRefs = Map<string /* absoluteFilePath */, Document>;
|
|
11
13
|
|
|
@@ -22,7 +22,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
|
|
|
22
22
|
externalRefResolver: new BaseResolver(),
|
|
23
23
|
document,
|
|
24
24
|
config: await makeConfig({
|
|
25
|
-
|
|
25
|
+
rules: {
|
|
26
|
+
'no-unresolved-refs': 'error',
|
|
27
|
+
},
|
|
26
28
|
}),
|
|
27
29
|
});
|
|
28
30
|
|
|
@@ -62,7 +64,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
|
|
|
62
64
|
externalRefResolver: new BaseResolver(),
|
|
63
65
|
document,
|
|
64
66
|
config: await makeConfig({
|
|
65
|
-
|
|
67
|
+
rules: {
|
|
68
|
+
'no-unresolved-refs': 'error',
|
|
69
|
+
},
|
|
66
70
|
}),
|
|
67
71
|
});
|
|
68
72
|
|
|
@@ -119,7 +123,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
|
|
|
119
123
|
externalRefResolver: new BaseResolver(),
|
|
120
124
|
document,
|
|
121
125
|
config: await makeConfig({
|
|
122
|
-
|
|
126
|
+
rules: {
|
|
127
|
+
'no-unresolved-refs': 'error',
|
|
128
|
+
},
|
|
123
129
|
}),
|
|
124
130
|
});
|
|
125
131
|
|
|
@@ -143,7 +149,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
|
|
|
143
149
|
externalRefResolver: new BaseResolver(),
|
|
144
150
|
document,
|
|
145
151
|
config: await makeConfig({
|
|
146
|
-
|
|
152
|
+
rules: {
|
|
153
|
+
'no-unresolved-refs': 'error',
|
|
154
|
+
},
|
|
147
155
|
}),
|
|
148
156
|
});
|
|
149
157
|
|
|
@@ -190,7 +198,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
|
|
|
190
198
|
externalRefResolver: new BaseResolver(),
|
|
191
199
|
document,
|
|
192
200
|
config: await makeConfig({
|
|
193
|
-
|
|
201
|
+
rules: {
|
|
202
|
+
'no-unresolved-refs': 'error',
|
|
203
|
+
},
|
|
194
204
|
}),
|
|
195
205
|
});
|
|
196
206
|
|
|
@@ -219,7 +229,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
|
|
|
219
229
|
externalRefResolver: new BaseResolver(),
|
|
220
230
|
document,
|
|
221
231
|
config: await makeConfig({
|
|
222
|
-
|
|
232
|
+
rules: {
|
|
233
|
+
'no-unresolved-refs': 'error',
|
|
234
|
+
},
|
|
223
235
|
}),
|
|
224
236
|
});
|
|
225
237
|
|
|
@@ -248,7 +260,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
|
|
|
248
260
|
externalRefResolver: new BaseResolver(),
|
|
249
261
|
document,
|
|
250
262
|
config: await makeConfig({
|
|
251
|
-
|
|
263
|
+
rules: {
|
|
264
|
+
'no-unresolved-refs': 'error',
|
|
265
|
+
},
|
|
252
266
|
}),
|
|
253
267
|
});
|
|
254
268
|
|
package/src/rules/ajv.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Ajv from '@redocly/ajv/dist/2020';
|
|
2
|
-
import {
|
|
2
|
+
import { escapePointer } from '../ref-utils';
|
|
3
3
|
|
|
4
|
+
import type { Location } from '../ref-utils';
|
|
4
5
|
import type { ValidateFunction, ErrorObject } from '@redocly/ajv/dist/2020';
|
|
5
6
|
import type { ResolveFn } from '../walk';
|
|
6
7
|
|