@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,99 +1,101 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
-
var t = {};
|
|
13
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
-
t[p] = s[p];
|
|
15
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
-
t[p[i]] = s[p[i]];
|
|
19
|
-
}
|
|
20
|
-
return t;
|
|
21
|
-
};
|
|
22
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.
|
|
3
|
+
exports.resolveConfigFileAndRefs = resolveConfigFileAndRefs;
|
|
4
|
+
exports.resolveConfig = resolveConfig;
|
|
5
|
+
exports.resolvePlugins = resolvePlugins;
|
|
6
|
+
exports.resolveApis = resolveApis;
|
|
7
|
+
exports.resolveStyleguideConfig = resolveStyleguideConfig;
|
|
8
|
+
exports.resolvePreset = resolvePreset;
|
|
24
9
|
const path = require("path");
|
|
10
|
+
const fs_1 = require("fs");
|
|
25
11
|
const ref_utils_1 = require("../ref-utils");
|
|
26
12
|
const utils_1 = require("../utils");
|
|
27
13
|
const resolve_1 = require("../resolve");
|
|
28
14
|
const builtIn_1 = require("./builtIn");
|
|
29
15
|
const utils_2 = require("./utils");
|
|
30
16
|
const env_1 = require("../env");
|
|
31
|
-
const utils_3 = require("../utils");
|
|
32
17
|
const config_1 = require("./config");
|
|
33
18
|
const logger_1 = require("../logger");
|
|
34
19
|
const asserts_1 = require("../rules/common/assertions/asserts");
|
|
35
20
|
const types_1 = require("../types");
|
|
36
21
|
const redocly_yaml_1 = require("../types/redocly-yaml");
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
22
|
+
const DEFAULT_PROJECT_PLUGIN_PATHS = ['@theme/plugin.js', '@theme/plugin.cjs', '@theme/plugin.mjs'];
|
|
23
|
+
// Workaround for dynamic imports being transpiled to require by Typescript: https://github.com/microsoft/TypeScript/issues/43329#issuecomment-811606238
|
|
24
|
+
const _importDynamic = new Function('modulePath', 'return import(modulePath)');
|
|
25
|
+
async function resolveConfigFileAndRefs({ configPath, externalRefResolver = new resolve_1.BaseResolver(), base = null, }) {
|
|
26
|
+
if (!configPath) {
|
|
27
|
+
throw new Error('Reference to a config is required.\n');
|
|
28
|
+
}
|
|
29
|
+
const document = await externalRefResolver.resolveDocument(base, configPath, true);
|
|
30
|
+
if (document instanceof Error) {
|
|
31
|
+
throw document;
|
|
32
|
+
}
|
|
33
|
+
const types = (0, types_1.normalizeTypes)(redocly_yaml_1.ConfigTypes);
|
|
34
|
+
const resolvedRefMap = await (0, resolve_1.resolveDocument)({
|
|
35
|
+
rootDocument: document,
|
|
36
|
+
rootType: types.ConfigRoot,
|
|
37
|
+
externalRefResolver,
|
|
53
38
|
});
|
|
39
|
+
return { document, resolvedRefMap };
|
|
54
40
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
styleguideConfig: rawConfig.styleguide,
|
|
70
|
-
configPath,
|
|
71
|
-
resolver,
|
|
72
|
-
});
|
|
73
|
-
return new config_1.Config(Object.assign(Object.assign({}, rawConfig), { apis,
|
|
74
|
-
styleguide }), configPath);
|
|
41
|
+
async function resolveConfig({ rawConfig, configPath, externalRefResolver, }) {
|
|
42
|
+
if (rawConfig.styleguide?.extends?.some(utils_1.isNotString)) {
|
|
43
|
+
throw new Error(`Error configuration format not detected in extends value must contain strings`);
|
|
44
|
+
}
|
|
45
|
+
const resolver = externalRefResolver ?? new resolve_1.BaseResolver((0, utils_2.getResolveConfig)(rawConfig.resolve));
|
|
46
|
+
const apis = await resolveApis({
|
|
47
|
+
rawConfig,
|
|
48
|
+
configPath,
|
|
49
|
+
resolver,
|
|
50
|
+
});
|
|
51
|
+
const styleguide = await resolveStyleguideConfig({
|
|
52
|
+
styleguideConfig: rawConfig.styleguide,
|
|
53
|
+
configPath,
|
|
54
|
+
resolver,
|
|
75
55
|
});
|
|
56
|
+
return new config_1.Config({
|
|
57
|
+
...rawConfig,
|
|
58
|
+
apis,
|
|
59
|
+
styleguide,
|
|
60
|
+
}, configPath);
|
|
76
61
|
}
|
|
77
|
-
|
|
78
|
-
|
|
62
|
+
function getDefaultPluginPath(configPath) {
|
|
63
|
+
for (const pluginPath of DEFAULT_PROJECT_PLUGIN_PATHS) {
|
|
64
|
+
const absolutePluginPath = path.resolve(path.dirname(configPath), pluginPath);
|
|
65
|
+
if ((0, fs_1.existsSync)(absolutePluginPath)) {
|
|
66
|
+
return pluginPath;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
async function resolvePlugins(plugins, configPath = '') {
|
|
79
72
|
if (!plugins)
|
|
80
73
|
return [];
|
|
81
74
|
// TODO: implement or reuse Resolver approach so it will work in node and browser envs
|
|
82
|
-
const requireFunc = (plugin) => {
|
|
83
|
-
if (env_1.isBrowser && (0,
|
|
75
|
+
const requireFunc = async (plugin) => {
|
|
76
|
+
if (env_1.isBrowser && (0, utils_1.isString)(plugin)) {
|
|
84
77
|
logger_1.logger.error(`Cannot load ${plugin}. Plugins aren't supported in browser yet.`);
|
|
85
78
|
return undefined;
|
|
86
79
|
}
|
|
87
|
-
if ((0,
|
|
80
|
+
if ((0, utils_1.isString)(plugin)) {
|
|
88
81
|
try {
|
|
89
|
-
const
|
|
82
|
+
const maybeAbsolutePluginPath = path.resolve(path.dirname(configPath), plugin);
|
|
83
|
+
const absolutePluginPath = (0, fs_1.existsSync)(maybeAbsolutePluginPath)
|
|
84
|
+
? maybeAbsolutePluginPath
|
|
85
|
+
: // For plugins imported from packages specifically
|
|
86
|
+
require.resolve(plugin);
|
|
90
87
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
91
88
|
// @ts-ignore
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
89
|
+
if (typeof __webpack_require__ === 'function') {
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
91
|
+
// @ts-ignore
|
|
92
|
+
return __non_webpack_require__(absolutePluginPath);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// you can import both cjs and mjs
|
|
96
|
+
const mod = await _importDynamic(absolutePluginPath);
|
|
97
|
+
return mod.default || mod;
|
|
98
|
+
}
|
|
97
99
|
}
|
|
98
100
|
catch (e) {
|
|
99
101
|
if (e instanceof SyntaxError) {
|
|
@@ -105,16 +107,37 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
105
107
|
return plugin;
|
|
106
108
|
};
|
|
107
109
|
const seenPluginIds = new Map();
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
/**
|
|
111
|
+
* Include the default plugin automatically if it's not in configuration
|
|
112
|
+
*/
|
|
113
|
+
const defaultPluginPath = getDefaultPluginPath(configPath);
|
|
114
|
+
if (defaultPluginPath) {
|
|
115
|
+
plugins.push(defaultPluginPath);
|
|
116
|
+
}
|
|
117
|
+
const resolvedPlugins = new Set();
|
|
118
|
+
const instances = await Promise.all(plugins.map(async (p) => {
|
|
119
|
+
if ((0, utils_1.isString)(p)) {
|
|
120
|
+
if ((0, ref_utils_1.isAbsoluteUrl)(p)) {
|
|
121
|
+
throw new Error(logger_1.colorize.red(`We don't support remote plugins yet.`));
|
|
122
|
+
}
|
|
123
|
+
if (resolvedPlugins.has(p)) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
resolvedPlugins.add(p);
|
|
112
127
|
}
|
|
113
|
-
|
|
114
|
-
const
|
|
128
|
+
const requiredPlugin = await requireFunc(p);
|
|
129
|
+
const pluginCreatorOptions = { contentDir: path.dirname(configPath) };
|
|
130
|
+
const pluginModule = (0, utils_2.isDeprecatedPluginFormat)(requiredPlugin)
|
|
131
|
+
? requiredPlugin
|
|
132
|
+
: (0, utils_2.isCommonJsPlugin)(requiredPlugin)
|
|
133
|
+
? await requiredPlugin(pluginCreatorOptions)
|
|
134
|
+
: await requiredPlugin?.default?.(pluginCreatorOptions);
|
|
115
135
|
if (!pluginModule) {
|
|
116
136
|
return;
|
|
117
137
|
}
|
|
138
|
+
if ((0, utils_1.isString)(p) && pluginModule.id && (0, utils_2.isDeprecatedPluginFormat)(requiredPlugin)) {
|
|
139
|
+
logger_1.logger.info(`Deprecated plugin format detected: ${pluginModule.id}\n`);
|
|
140
|
+
}
|
|
118
141
|
const id = pluginModule.id;
|
|
119
142
|
if (typeof id !== 'string') {
|
|
120
143
|
throw new Error(logger_1.colorize.red(`Plugin must define \`id\` property in ${logger_1.colorize.blue(p.toString())}.`));
|
|
@@ -124,10 +147,14 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
124
147
|
throw new Error(logger_1.colorize.red(`Plugin "id" must be unique. Plugin ${logger_1.colorize.blue(p.toString())} uses id "${logger_1.colorize.blue(id)}" already seen in ${logger_1.colorize.blue(pluginPath)}`));
|
|
125
148
|
}
|
|
126
149
|
seenPluginIds.set(id, p.toString());
|
|
127
|
-
const plugin =
|
|
150
|
+
const plugin = {
|
|
151
|
+
id,
|
|
152
|
+
...(pluginModule.configs ? { configs: pluginModule.configs } : {}),
|
|
153
|
+
...(pluginModule.typeExtension ? { typeExtension: pluginModule.typeExtension } : {}),
|
|
154
|
+
};
|
|
128
155
|
if (pluginModule.rules) {
|
|
129
156
|
if (!pluginModule.rules.oas3 && !pluginModule.rules.oas2 && !pluginModule.rules.async2) {
|
|
130
|
-
throw new Error(`Plugin rules must have \`oas3\`, \`oas2\`, \`async2\`, or \`arazzo\` rules "${p}.`);
|
|
157
|
+
throw new Error(`Plugin rules must have \`oas3\`, \`oas2\`, \`async2\`, \`async3\` or \`arazzo\` rules "${p}.`);
|
|
131
158
|
}
|
|
132
159
|
plugin.rules = {};
|
|
133
160
|
if (pluginModule.rules.oas3) {
|
|
@@ -139,6 +166,9 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
139
166
|
if (pluginModule.rules.async2) {
|
|
140
167
|
plugin.rules.async2 = (0, utils_2.prefixRules)(pluginModule.rules.async2, id);
|
|
141
168
|
}
|
|
169
|
+
if (pluginModule.rules.async3) {
|
|
170
|
+
plugin.rules.async3 = (0, utils_2.prefixRules)(pluginModule.rules.async3, id);
|
|
171
|
+
}
|
|
142
172
|
if (pluginModule.rules.arazzo) {
|
|
143
173
|
plugin.rules.arazzo = (0, utils_2.prefixRules)(pluginModule.rules.arazzo, id);
|
|
144
174
|
}
|
|
@@ -147,6 +177,7 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
147
177
|
if (!pluginModule.preprocessors.oas3 &&
|
|
148
178
|
!pluginModule.preprocessors.oas2 &&
|
|
149
179
|
!pluginModule.preprocessors.async2 &&
|
|
180
|
+
!pluginModule.preprocessors.async3 &&
|
|
150
181
|
!pluginModule.preprocessors.arazzo) {
|
|
151
182
|
throw new Error(`Plugin \`preprocessors\` must have \`oas3\`, \`oas2\` or \`async2\` preprocessors "${p}.`);
|
|
152
183
|
}
|
|
@@ -160,6 +191,9 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
160
191
|
if (pluginModule.preprocessors.async2) {
|
|
161
192
|
plugin.preprocessors.async2 = (0, utils_2.prefixRules)(pluginModule.preprocessors.async2, id);
|
|
162
193
|
}
|
|
194
|
+
if (pluginModule.preprocessors.async3) {
|
|
195
|
+
plugin.preprocessors.async3 = (0, utils_2.prefixRules)(pluginModule.preprocessors.async3, id);
|
|
196
|
+
}
|
|
163
197
|
if (pluginModule.preprocessors.arazzo) {
|
|
164
198
|
plugin.preprocessors.arazzo = (0, utils_2.prefixRules)(pluginModule.preprocessors.arazzo, id);
|
|
165
199
|
}
|
|
@@ -168,8 +202,9 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
168
202
|
if (!pluginModule.decorators.oas3 &&
|
|
169
203
|
!pluginModule.decorators.oas2 &&
|
|
170
204
|
!pluginModule.decorators.async2 &&
|
|
205
|
+
!pluginModule.decorators.async3 &&
|
|
171
206
|
!pluginModule.decorators.arazzo) {
|
|
172
|
-
throw new Error(`Plugin \`decorators\` must have \`oas3\`, \`oas2\` or \`
|
|
207
|
+
throw new Error(`Plugin \`decorators\` must have \`oas3\`, \`oas2\`, \`async2\` or \`async3\` decorators "${p}.`);
|
|
173
208
|
}
|
|
174
209
|
plugin.decorators = {};
|
|
175
210
|
if (pluginModule.decorators.oas3) {
|
|
@@ -181,6 +216,9 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
181
216
|
if (pluginModule.decorators.async2) {
|
|
182
217
|
plugin.decorators.async2 = (0, utils_2.prefixRules)(pluginModule.decorators.async2, id);
|
|
183
218
|
}
|
|
219
|
+
if (pluginModule.decorators.async3) {
|
|
220
|
+
plugin.decorators.async3 = (0, utils_2.prefixRules)(pluginModule.decorators.async3, id);
|
|
221
|
+
}
|
|
184
222
|
if (pluginModule.decorators.arazzo) {
|
|
185
223
|
plugin.decorators.arazzo = (0, utils_2.prefixRules)(pluginModule.decorators.arazzo, id);
|
|
186
224
|
}
|
|
@@ -189,80 +227,85 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
189
227
|
plugin.assertions = pluginModule.assertions;
|
|
190
228
|
}
|
|
191
229
|
return plugin;
|
|
192
|
-
})
|
|
193
|
-
|
|
230
|
+
}));
|
|
231
|
+
return instances.filter(utils_1.isDefined);
|
|
194
232
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
for (const [apiName, apiContent] of Object.entries(apis || {})) {
|
|
202
|
-
if ((_b = (_a = apiContent.styleguide) === null || _a === void 0 ? void 0 : _a.extends) === null || _b === void 0 ? void 0 : _b.some(utils_3.isNotString)) {
|
|
203
|
-
throw new Error(`Error configuration format not detected in extends value must contain strings`);
|
|
204
|
-
}
|
|
205
|
-
const rawStyleguideConfig = getMergedRawStyleguideConfig(styleguideConfig, apiContent.styleguide);
|
|
206
|
-
const resolvedApiConfig = yield resolveStyleguideConfig({
|
|
207
|
-
styleguideConfig: rawStyleguideConfig,
|
|
208
|
-
configPath,
|
|
209
|
-
resolver,
|
|
210
|
-
});
|
|
211
|
-
resolvedApis[apiName] = Object.assign(Object.assign({}, apiContent), { styleguide: resolvedApiConfig });
|
|
233
|
+
async function resolveApis({ rawConfig, configPath = '', resolver, }) {
|
|
234
|
+
const { apis = {}, styleguide: styleguideConfig = {} } = rawConfig;
|
|
235
|
+
const resolvedApis = {};
|
|
236
|
+
for (const [apiName, apiContent] of Object.entries(apis || {})) {
|
|
237
|
+
if (apiContent.styleguide?.extends?.some(utils_1.isNotString)) {
|
|
238
|
+
throw new Error(`Error configuration format not detected in extends value must contain strings`);
|
|
212
239
|
}
|
|
213
|
-
|
|
214
|
-
|
|
240
|
+
const rawStyleguideConfig = getMergedRawStyleguideConfig(styleguideConfig, apiContent.styleguide);
|
|
241
|
+
const resolvedApiConfig = await resolveStyleguideConfig({
|
|
242
|
+
styleguideConfig: rawStyleguideConfig,
|
|
243
|
+
configPath,
|
|
244
|
+
resolver,
|
|
245
|
+
});
|
|
246
|
+
resolvedApis[apiName] = { ...apiContent, styleguide: resolvedApiConfig };
|
|
247
|
+
}
|
|
248
|
+
return resolvedApis;
|
|
215
249
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
250
|
+
async function resolveAndMergeNestedStyleguideConfig({ styleguideConfig, configPath = '', resolver = new resolve_1.BaseResolver(), }, parentConfigPaths = [], extendPaths = []) {
|
|
251
|
+
if (parentConfigPaths.includes(configPath)) {
|
|
252
|
+
throw new Error(`Circular dependency in config file: "${configPath}"`);
|
|
253
|
+
}
|
|
254
|
+
const plugins = (0, utils_2.getUniquePlugins)(await resolvePlugins([...(styleguideConfig?.plugins || []), builtIn_1.defaultPlugin], configPath));
|
|
255
|
+
const pluginPaths = styleguideConfig?.plugins
|
|
256
|
+
?.filter(utils_1.isString)
|
|
257
|
+
.map((p) => path.resolve(path.dirname(configPath), p));
|
|
258
|
+
const resolvedConfigPath = (0, ref_utils_1.isAbsoluteUrl)(configPath)
|
|
259
|
+
? configPath
|
|
260
|
+
: configPath && path.resolve(configPath);
|
|
261
|
+
const extendConfigs = await Promise.all(styleguideConfig?.extends?.map(async (presetItem) => {
|
|
262
|
+
if (!(0, ref_utils_1.isAbsoluteUrl)(presetItem) && !path.extname(presetItem)) {
|
|
263
|
+
return resolvePreset(presetItem, plugins);
|
|
222
264
|
}
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
const
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
265
|
+
const pathItem = (0, ref_utils_1.isAbsoluteUrl)(presetItem)
|
|
266
|
+
? presetItem
|
|
267
|
+
: (0, ref_utils_1.isAbsoluteUrl)(configPath)
|
|
268
|
+
? new URL(presetItem, configPath).href
|
|
269
|
+
: path.resolve(path.dirname(configPath), presetItem);
|
|
270
|
+
const extendedStyleguideConfig = await loadExtendStyleguideConfig(pathItem, resolver);
|
|
271
|
+
return await resolveAndMergeNestedStyleguideConfig({
|
|
272
|
+
styleguideConfig: extendedStyleguideConfig,
|
|
273
|
+
configPath: pathItem,
|
|
274
|
+
resolver: resolver,
|
|
275
|
+
}, [...parentConfigPaths, resolvedConfigPath], extendPaths);
|
|
276
|
+
}) || []);
|
|
277
|
+
const { plugins: mergedPlugins = [], ...styleguide } = (0, utils_2.mergeExtends)([
|
|
278
|
+
...extendConfigs,
|
|
279
|
+
{
|
|
280
|
+
...styleguideConfig,
|
|
281
|
+
plugins,
|
|
282
|
+
extends: undefined,
|
|
283
|
+
extendPaths: [...parentConfigPaths, resolvedConfigPath],
|
|
284
|
+
pluginPaths,
|
|
285
|
+
},
|
|
286
|
+
]);
|
|
287
|
+
return {
|
|
288
|
+
...styleguide,
|
|
289
|
+
extendPaths: styleguide.extendPaths?.filter((path) => path && !(0, ref_utils_1.isAbsoluteUrl)(path)),
|
|
290
|
+
plugins: (0, utils_2.getUniquePlugins)(mergedPlugins),
|
|
291
|
+
recommendedFallback: styleguideConfig?.recommendedFallback,
|
|
292
|
+
doNotResolveExamples: styleguideConfig?.doNotResolveExamples,
|
|
293
|
+
};
|
|
250
294
|
}
|
|
251
|
-
function resolveStyleguideConfig(opts, parentConfigPaths = [], extendPaths = []) {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
295
|
+
async function resolveStyleguideConfig(opts, parentConfigPaths = [], extendPaths = []) {
|
|
296
|
+
const resolvedStyleguideConfig = await resolveAndMergeNestedStyleguideConfig(opts, parentConfigPaths, extendPaths);
|
|
297
|
+
return {
|
|
298
|
+
...resolvedStyleguideConfig,
|
|
299
|
+
rules: resolvedStyleguideConfig.rules && groupStyleguideAssertionRules(resolvedStyleguideConfig),
|
|
300
|
+
};
|
|
256
301
|
}
|
|
257
|
-
exports.resolveStyleguideConfig = resolveStyleguideConfig;
|
|
258
302
|
function resolvePreset(presetName, plugins) {
|
|
259
|
-
var _a;
|
|
260
303
|
const { pluginId, configName } = (0, utils_2.parsePresetName)(presetName);
|
|
261
304
|
const plugin = plugins.find((p) => p.id === pluginId);
|
|
262
305
|
if (!plugin) {
|
|
263
306
|
throw new Error(`Invalid config ${logger_1.colorize.red(presetName)}: plugin ${pluginId} is not included.`);
|
|
264
307
|
}
|
|
265
|
-
const preset =
|
|
308
|
+
const preset = plugin.configs?.[configName];
|
|
266
309
|
if (!preset) {
|
|
267
310
|
throw new Error(pluginId
|
|
268
311
|
? `Invalid config ${logger_1.colorize.red(presetName)}: plugin ${pluginId} doesn't export config with name ${configName}.`
|
|
@@ -270,26 +313,63 @@ function resolvePreset(presetName, plugins) {
|
|
|
270
313
|
}
|
|
271
314
|
return preset;
|
|
272
315
|
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
if (!rawConfig.styleguide) {
|
|
280
|
-
throw new Error(`Styleguide configuration format not detected: "${filePath}"`);
|
|
281
|
-
}
|
|
282
|
-
return rawConfig.styleguide;
|
|
283
|
-
}
|
|
284
|
-
catch (error) {
|
|
285
|
-
throw new Error(`Failed to load "${filePath}": ${error.message}`);
|
|
316
|
+
async function loadExtendStyleguideConfig(filePath, resolver) {
|
|
317
|
+
try {
|
|
318
|
+
const { parsed } = (await resolver.resolveDocument(null, filePath));
|
|
319
|
+
const rawConfig = (0, utils_2.transformConfig)(parsed);
|
|
320
|
+
if (!rawConfig.styleguide) {
|
|
321
|
+
throw new Error(`Styleguide configuration format not detected: "${filePath}"`);
|
|
286
322
|
}
|
|
287
|
-
|
|
323
|
+
return rawConfig.styleguide;
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
throw new Error(`Failed to load "${filePath}": ${error.message}`);
|
|
327
|
+
}
|
|
288
328
|
}
|
|
289
329
|
function getMergedRawStyleguideConfig(rootStyleguideConfig, apiStyleguideConfig) {
|
|
290
|
-
const resultLint =
|
|
330
|
+
const resultLint = {
|
|
331
|
+
...rootStyleguideConfig,
|
|
332
|
+
...(0, utils_1.pickDefined)(apiStyleguideConfig),
|
|
333
|
+
rules: { ...rootStyleguideConfig?.rules, ...apiStyleguideConfig?.rules },
|
|
334
|
+
oas2Rules: { ...rootStyleguideConfig?.oas2Rules, ...apiStyleguideConfig?.oas2Rules },
|
|
335
|
+
oas3_0Rules: { ...rootStyleguideConfig?.oas3_0Rules, ...apiStyleguideConfig?.oas3_0Rules },
|
|
336
|
+
oas3_1Rules: { ...rootStyleguideConfig?.oas3_1Rules, ...apiStyleguideConfig?.oas3_1Rules },
|
|
337
|
+
async2Rules: { ...rootStyleguideConfig?.async2Rules, ...apiStyleguideConfig?.async2Rules },
|
|
338
|
+
async3Rules: { ...rootStyleguideConfig?.async3Rules, ...apiStyleguideConfig?.async3Rules },
|
|
339
|
+
arazzoRules: { ...rootStyleguideConfig?.arazzoRules, ...apiStyleguideConfig?.arazzoRules },
|
|
340
|
+
preprocessors: {
|
|
341
|
+
...rootStyleguideConfig?.preprocessors,
|
|
342
|
+
...apiStyleguideConfig?.preprocessors,
|
|
343
|
+
},
|
|
344
|
+
oas2Preprocessors: {
|
|
345
|
+
...rootStyleguideConfig?.oas2Preprocessors,
|
|
346
|
+
...apiStyleguideConfig?.oas2Preprocessors,
|
|
347
|
+
},
|
|
348
|
+
oas3_0Preprocessors: {
|
|
349
|
+
...rootStyleguideConfig?.oas3_0Preprocessors,
|
|
350
|
+
...apiStyleguideConfig?.oas3_0Preprocessors,
|
|
351
|
+
},
|
|
352
|
+
oas3_1Preprocessors: {
|
|
353
|
+
...rootStyleguideConfig?.oas3_1Preprocessors,
|
|
354
|
+
...apiStyleguideConfig?.oas3_1Preprocessors,
|
|
355
|
+
},
|
|
356
|
+
decorators: { ...rootStyleguideConfig?.decorators, ...apiStyleguideConfig?.decorators },
|
|
357
|
+
oas2Decorators: {
|
|
358
|
+
...rootStyleguideConfig?.oas2Decorators,
|
|
359
|
+
...apiStyleguideConfig?.oas2Decorators,
|
|
360
|
+
},
|
|
361
|
+
oas3_0Decorators: {
|
|
362
|
+
...rootStyleguideConfig?.oas3_0Decorators,
|
|
363
|
+
...apiStyleguideConfig?.oas3_0Decorators,
|
|
364
|
+
},
|
|
365
|
+
oas3_1Decorators: {
|
|
366
|
+
...rootStyleguideConfig?.oas3_1Decorators,
|
|
367
|
+
...apiStyleguideConfig?.oas3_1Decorators,
|
|
368
|
+
},
|
|
369
|
+
recommendedFallback: apiStyleguideConfig?.extends
|
|
291
370
|
? false
|
|
292
|
-
: rootStyleguideConfig.recommendedFallback
|
|
371
|
+
: rootStyleguideConfig.recommendedFallback,
|
|
372
|
+
};
|
|
293
373
|
return resultLint;
|
|
294
374
|
}
|
|
295
375
|
function groupStyleguideAssertionRules({ rules, plugins, }) {
|
|
@@ -313,7 +393,10 @@ function groupStyleguideAssertionRules({ rules, plugins, }) {
|
|
|
313
393
|
registerCustomAssertions(plugins, context);
|
|
314
394
|
}
|
|
315
395
|
}
|
|
316
|
-
assertions.push(
|
|
396
|
+
assertions.push({
|
|
397
|
+
...assertion,
|
|
398
|
+
assertionId: ruleKey,
|
|
399
|
+
});
|
|
317
400
|
}
|
|
318
401
|
else {
|
|
319
402
|
// If it's not an assertion, keep it as is
|
|
@@ -326,7 +409,7 @@ function groupStyleguideAssertionRules({ rules, plugins, }) {
|
|
|
326
409
|
return transformedRules;
|
|
327
410
|
}
|
|
328
411
|
function registerCustomAssertions(plugins, assertion) {
|
|
329
|
-
for (const field of (0,
|
|
412
|
+
for (const field of (0, utils_1.keysOf)(assertion.assertions)) {
|
|
330
413
|
const [pluginId, fn] = field.split('/');
|
|
331
414
|
if (!pluginId || !fn)
|
|
332
415
|
continue;
|
package/lib/config/config.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { SpecVersion, SpecMajorVersion } from '../oas-types';
|
|
2
|
+
import type { NormalizedProblem } from '../walk';
|
|
3
|
+
import type { Oas2RuleSet, Oas3RuleSet, Async3RuleSet, ArazzoRuleSet } from '../oas-types';
|
|
3
4
|
import type { NodeType } from '../types';
|
|
4
5
|
import type { DecoratorConfig, Plugin, PreprocessorConfig, Region, ResolveConfig, ResolvedApi, ResolvedConfig, ResolvedStyleguideConfig, RuleConfig, RuleSettings, Telemetry, ThemeRawConfig } from './types';
|
|
5
6
|
export declare const IGNORE_FILE = ".redocly.lint-ignore.yaml";
|
|
@@ -31,7 +32,7 @@ export declare class StyleguideConfig {
|
|
|
31
32
|
preprocessors: string[];
|
|
32
33
|
decorators: string[];
|
|
33
34
|
};
|
|
34
|
-
getRulesForOasVersion(version: SpecMajorVersion): Oas3RuleSet[] | Oas2RuleSet[] |
|
|
35
|
+
getRulesForOasVersion(version: SpecMajorVersion): Oas3RuleSet[] | Oas2RuleSet[] | Async3RuleSet[] | ArazzoRuleSet[];
|
|
35
36
|
skipRules(rules?: string[]): void;
|
|
36
37
|
skipPreprocessors(preprocessors?: string[]): void;
|
|
37
38
|
skipDecorators(decorators?: string[]): void;
|