@redocly/openapi-core 1.0.0-beta.99 → 1.0.0-rc.1
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/README.md +6 -6
- package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.js +0 -1
- package/lib/benchmark/benches/recommended-oas3.bench.js +1 -1
- package/lib/benchmark/benches/resolve-with-no-external.bench.js +1 -1
- package/lib/benchmark/utils.d.ts +2 -2
- package/lib/benchmark/utils.js +2 -2
- package/lib/bundle.d.ts +10 -15
- package/lib/bundle.js +32 -12
- package/lib/config/all.d.ts +2 -2
- package/lib/config/all.js +16 -6
- package/lib/config/builtIn.d.ts +2 -2
- package/lib/config/builtIn.js +2 -2
- package/lib/config/config-resolvers.d.ts +5 -5
- package/lib/config/config-resolvers.js +121 -66
- package/lib/config/config.d.ts +12 -18
- package/lib/config/config.js +42 -26
- package/lib/config/load.d.ts +16 -3
- package/lib/config/load.js +36 -14
- package/lib/config/minimal.d.ts +2 -2
- package/lib/config/minimal.js +10 -6
- package/lib/config/recommended.d.ts +2 -2
- package/lib/config/recommended.js +10 -6
- package/lib/config/rules.d.ts +7 -4
- package/lib/config/rules.js +5 -4
- package/lib/config/types.d.ts +72 -23
- package/lib/config/types.js +13 -0
- package/lib/config/utils.d.ts +6 -5
- package/lib/config/utils.js +110 -32
- package/lib/decorators/common/filters/filter-helper.d.ts +3 -0
- package/lib/decorators/common/filters/filter-helper.js +67 -0
- package/lib/decorators/common/filters/filter-in.d.ts +2 -0
- package/lib/decorators/common/filters/filter-in.js +17 -0
- package/lib/decorators/common/filters/filter-out.d.ts +2 -0
- package/lib/decorators/common/filters/filter-out.js +17 -0
- package/lib/decorators/common/info-override.d.ts +2 -0
- package/lib/decorators/common/info-override.js +28 -0
- package/lib/decorators/common/media-type-examples-override.d.ts +2 -0
- package/lib/decorators/common/media-type-examples-override.js +53 -0
- package/lib/decorators/common/registry-dependencies.js +2 -2
- package/lib/decorators/common/remove-x-internal.js +2 -2
- package/lib/decorators/oas2/index.d.ts +3 -0
- package/lib/decorators/oas2/index.js +7 -1
- package/lib/decorators/oas3/index.d.ts +4 -0
- package/lib/decorators/oas3/index.js +9 -1
- package/lib/env.d.ts +3 -0
- package/lib/env.js +8 -0
- package/lib/format/codeframes.js +16 -10
- package/lib/format/format.d.ts +1 -1
- package/lib/format/format.js +64 -32
- package/lib/index.d.ts +6 -6
- package/lib/index.js +7 -2
- package/lib/js-yaml/index.js +2 -6
- package/lib/lint.d.ts +4 -2
- package/lib/lint.js +36 -11
- package/lib/logger.d.ts +10 -0
- package/lib/logger.js +31 -0
- package/lib/output.d.ts +3 -0
- package/lib/output.js +9 -0
- package/lib/redocly/index.js +10 -9
- package/lib/redocly/registry-api-types.d.ts +28 -28
- package/lib/redocly/registry-api.d.ts +3 -3
- package/lib/redocly/registry-api.js +10 -2
- package/lib/ref-utils.d.ts +1 -0
- package/lib/ref-utils.js +7 -2
- package/lib/resolve.d.ts +1 -1
- package/lib/resolve.js +33 -3
- package/lib/rules/ajv.d.ts +2 -2
- package/lib/rules/ajv.js +12 -12
- package/lib/rules/common/assertions/asserts.d.ts +29 -4
- package/lib/rules/common/assertions/asserts.js +227 -97
- package/lib/rules/common/assertions/index.d.ts +27 -2
- package/lib/rules/common/assertions/index.js +9 -37
- package/lib/rules/common/assertions/utils.d.ts +16 -8
- package/lib/rules/common/assertions/utils.js +160 -76
- package/lib/rules/common/info-license-url.d.ts +1 -1
- package/lib/rules/common/info-license-url.js +5 -10
- package/lib/rules/common/info-license.d.ts +2 -0
- package/lib/rules/common/info-license.js +17 -0
- package/lib/rules/common/no-ambiguous-paths.js +1 -1
- package/lib/rules/common/no-enum-type-mismatch.js +1 -3
- package/lib/rules/common/no-identical-paths.js +4 -4
- package/lib/rules/common/no-invalid-parameter-examples.js +3 -3
- package/lib/rules/common/no-invalid-schema-examples.js +3 -3
- package/lib/rules/common/operation-2xx-response.js +15 -9
- package/lib/rules/common/operation-4xx-response.js +15 -9
- package/lib/rules/common/operation-operationId.js +2 -2
- package/lib/rules/common/operation-tag-defined.js +1 -1
- package/lib/rules/common/path-not-include-query.js +2 -2
- package/lib/rules/common/path-params-defined.js +7 -2
- package/lib/rules/common/paths-kebab-case.js +4 -1
- package/lib/rules/common/required-string-property-missing-min-length.d.ts +2 -0
- package/lib/rules/common/required-string-property-missing-min-length.js +37 -0
- package/lib/rules/common/response-contains-header.js +2 -2
- package/lib/rules/common/scalar-property-missing-example.js +2 -1
- package/lib/rules/common/security-defined.d.ts +2 -0
- package/lib/rules/common/{operation-security-defined.js → security-defined.js} +25 -6
- package/lib/rules/common/spec-strict-refs.d.ts +2 -0
- package/lib/rules/common/spec-strict-refs.js +30 -0
- package/lib/rules/common/spec.js +41 -18
- package/lib/rules/common/tags-alphabetical.js +1 -1
- package/lib/rules/oas2/index.d.ts +3 -2
- package/lib/rules/oas2/index.js +10 -8
- package/lib/rules/oas2/remove-unused-components.js +6 -6
- package/lib/rules/oas2/request-mime-type.d.ts +1 -1
- package/lib/rules/oas2/request-mime-type.js +1 -1
- package/lib/rules/oas2/response-mime-type.d.ts +1 -1
- package/lib/rules/oas2/response-mime-type.js +1 -1
- package/lib/rules/oas3/component-name-unique.d.ts +2 -0
- package/lib/rules/oas3/component-name-unique.js +124 -0
- package/lib/rules/oas3/index.js +18 -10
- package/lib/rules/oas3/no-empty-servers.js +2 -2
- package/lib/rules/oas3/no-invalid-media-type-examples.js +2 -2
- package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +2 -0
- package/lib/rules/oas3/{no-servers-empty-enum.js → no-server-variables-empty-enum.js} +5 -5
- package/lib/rules/oas3/no-unused-components.js +2 -2
- package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +5 -0
- package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +36 -0
- package/lib/rules/oas3/remove-unused-components.js +6 -6
- package/lib/rules/oas3/request-mime-type.d.ts +1 -1
- package/lib/rules/oas3/request-mime-type.js +1 -1
- package/lib/rules/oas3/response-mime-type.d.ts +1 -1
- package/lib/rules/oas3/response-mime-type.js +1 -1
- package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +2 -0
- package/lib/rules/oas3/spec-components-invalid-map-name.js +62 -0
- package/lib/rules/other/stats.d.ts +2 -2
- package/lib/rules/other/stats.js +45 -16
- package/lib/rules/utils.d.ts +5 -2
- package/lib/rules/utils.js +54 -6
- package/lib/types/config-external-schemas.d.ts +2193 -0
- package/lib/types/config-external-schemas.js +805 -0
- package/lib/types/index.d.ts +3 -2
- package/lib/types/index.js +9 -1
- package/lib/types/oas2.js +91 -15
- package/lib/types/oas3.js +125 -46
- package/lib/types/oas3_1.js +23 -19
- package/lib/types/redocly-yaml.js +406 -60
- package/lib/utils.d.ts +15 -4
- package/lib/utils.js +72 -8
- package/lib/visitors.d.ts +20 -16
- package/lib/visitors.js +28 -3
- package/lib/walk.d.ts +11 -19
- package/lib/walk.js +74 -53
- package/package.json +5 -6
- package/__tests__/utils.ts +0 -86
- package/lib/rules/common/info-description.d.ts +0 -2
- package/lib/rules/common/info-description.js +0 -12
- package/lib/rules/common/license-url.d.ts +0 -2
- package/lib/rules/common/license-url.js +0 -12
- package/lib/rules/common/operation-security-defined.d.ts +0 -2
- package/lib/rules/oas3/no-servers-empty-enum.d.ts +0 -2
- package/src/__tests__/__snapshots__/bundle.test.ts.snap +0 -255
- package/src/__tests__/bundle.test.ts +0 -156
- package/src/__tests__/codeframes.test.ts +0 -531
- package/src/__tests__/fixtures/extension.js +0 -24
- package/src/__tests__/fixtures/refs/definitions.yaml +0 -3
- package/src/__tests__/fixtures/refs/examples.yaml +0 -8
- package/src/__tests__/fixtures/refs/external-request-body.yaml +0 -13
- package/src/__tests__/fixtures/refs/externalref.yaml +0 -35
- package/src/__tests__/fixtures/refs/hosted.yaml +0 -35
- package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
- package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
- package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +0 -18
- package/src/__tests__/fixtures/refs/param-b.yaml +0 -1
- package/src/__tests__/fixtures/refs/param-c.yaml +0 -1
- package/src/__tests__/fixtures/refs/rename.yaml +0 -1
- package/src/__tests__/fixtures/refs/requestBody.yaml +0 -9
- package/src/__tests__/fixtures/refs/schema-a.yaml +0 -1
- package/src/__tests__/fixtures/refs/simple.yaml +0 -1
- package/src/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
- package/src/__tests__/fixtures/resolve/External.yaml +0 -10
- package/src/__tests__/fixtures/resolve/External2.yaml +0 -4
- package/src/__tests__/fixtures/resolve/description.md +0 -3
- package/src/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
- package/src/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
- package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
- package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
- package/src/__tests__/fixtures/resolve/openapi.yaml +0 -28
- package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
- package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
- package/src/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
- package/src/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
- package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
- package/src/__tests__/js-yaml.test.ts +0 -71
- package/src/__tests__/lint.test.ts +0 -195
- package/src/__tests__/login.test.ts +0 -17
- package/src/__tests__/normalizeVisitors.test.ts +0 -151
- package/src/__tests__/ref-utils.test.ts +0 -120
- package/src/__tests__/resolve-http.test.ts +0 -77
- package/src/__tests__/resolve.test.ts +0 -405
- package/src/__tests__/utils.test.ts +0 -85
- package/src/__tests__/walk.test.ts +0 -1485
- package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
- package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
- package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
- package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -36
- package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
- package/src/benchmark/benches/rebilly.yaml +0 -32267
- package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
- package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
- package/src/benchmark/benchmark.js +0 -307
- package/src/benchmark/colors.js +0 -29
- package/src/benchmark/fork.js +0 -83
- package/src/benchmark/utils.ts +0 -36
- package/src/bundle.ts +0 -386
- package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -157
- package/src/config/__tests__/config-resolvers.test.ts +0 -429
- package/src/config/__tests__/config.test.ts +0 -244
- package/src/config/__tests__/fixtures/plugin-config.yaml +0 -3
- package/src/config/__tests__/fixtures/plugin.js +0 -56
- package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -12
- package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -67
- package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -8
- package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -19
- package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -10
- package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -66
- package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -4
- package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -5
- package/src/config/__tests__/load.test.ts +0 -83
- package/src/config/__tests__/resolve-plugins.test.ts +0 -27
- package/src/config/all.ts +0 -66
- package/src/config/builtIn.ts +0 -37
- package/src/config/config-resolvers.ts +0 -359
- package/src/config/config.ts +0 -312
- package/src/config/index.ts +0 -7
- package/src/config/load.ts +0 -84
- package/src/config/minimal.ts +0 -58
- package/src/config/recommended.ts +0 -58
- package/src/config/rules.ts +0 -46
- package/src/config/types.ts +0 -168
- package/src/config/utils.ts +0 -208
- package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
- package/src/decorators/common/info-description-override.ts +0 -24
- package/src/decorators/common/operation-description-override.ts +0 -30
- package/src/decorators/common/registry-dependencies.ts +0 -25
- package/src/decorators/common/remove-x-internal.ts +0 -59
- package/src/decorators/common/tag-description-override.ts +0 -25
- package/src/decorators/oas2/index.ts +0 -14
- package/src/decorators/oas3/index.ts +0 -14
- package/src/format/codeframes.ts +0 -210
- package/src/format/format.ts +0 -339
- package/src/index.ts +0 -68
- package/src/js-yaml/index.ts +0 -18
- package/src/lint.ts +0 -125
- package/src/oas-types.ts +0 -62
- package/src/redocly/__tests__/redocly-client.test.ts +0 -140
- package/src/redocly/index.ts +0 -182
- package/src/redocly/redocly-client-types.ts +0 -10
- package/src/redocly/registry-api-types.ts +0 -32
- package/src/redocly/registry-api.ts +0 -134
- package/src/ref-utils.ts +0 -80
- package/src/resolve.ts +0 -378
- package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
- package/src/rules/__tests__/fixtures/ref.yaml +0 -1
- package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -168
- package/src/rules/ajv.ts +0 -103
- package/src/rules/common/__tests__/info-description.test.ts +0 -102
- package/src/rules/common/__tests__/info-license.test.ts +0 -62
- package/src/rules/common/__tests__/license-url.test.ts +0 -63
- package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
- package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -209
- package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
- package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
- package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -91
- package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -107
- package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
- package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
- package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
- package/src/rules/common/__tests__/operation-security-defined.test.ts +0 -69
- package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
- package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
- package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
- package/src/rules/common/__tests__/path-params-defined.test.ts +0 -133
- package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
- package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +0 -207
- package/src/rules/common/__tests__/spec.test.ts +0 -62
- package/src/rules/common/__tests__/tag-description.test.ts +0 -65
- package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
- package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -231
- package/src/rules/common/assertions/__tests__/index.test.ts +0 -65
- package/src/rules/common/assertions/__tests__/utils.test.ts +0 -89
- package/src/rules/common/assertions/asserts.ts +0 -137
- package/src/rules/common/assertions/index.ts +0 -75
- package/src/rules/common/assertions/utils.ts +0 -167
- package/src/rules/common/info-contact.ts +0 -15
- package/src/rules/common/info-description.ts +0 -10
- package/src/rules/common/info-license-url.ts +0 -15
- package/src/rules/common/license-url.ts +0 -10
- package/src/rules/common/no-ambiguous-paths.ts +0 -50
- package/src/rules/common/no-enum-type-mismatch.ts +0 -49
- package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
- package/src/rules/common/no-identical-paths.ts +0 -24
- package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
- package/src/rules/common/no-invalid-schema-examples.ts +0 -27
- package/src/rules/common/no-path-trailing-slash.ts +0 -15
- package/src/rules/common/operation-2xx-response.ts +0 -16
- package/src/rules/common/operation-4xx-response.ts +0 -17
- package/src/rules/common/operation-description.ts +0 -13
- package/src/rules/common/operation-operationId-unique.ts +0 -21
- package/src/rules/common/operation-operationId-url-safe.ts +0 -19
- package/src/rules/common/operation-operationId.ts +0 -17
- package/src/rules/common/operation-parameters-unique.ts +0 -48
- package/src/rules/common/operation-security-defined.ts +0 -45
- package/src/rules/common/operation-singular-tag.ts +0 -17
- package/src/rules/common/operation-summary.ts +0 -13
- package/src/rules/common/operation-tag-defined.ts +0 -26
- package/src/rules/common/parameter-description.ts +0 -22
- package/src/rules/common/path-declaration-must-exist.ts +0 -15
- package/src/rules/common/path-excludes-patterns.ts +0 -23
- package/src/rules/common/path-http-verbs-order.ts +0 -30
- package/src/rules/common/path-not-include-query.ts +0 -17
- package/src/rules/common/path-params-defined.ts +0 -58
- package/src/rules/common/path-segment-plural.ts +0 -31
- package/src/rules/common/paths-kebab-case.ts +0 -16
- package/src/rules/common/response-contains-header.ts +0 -30
- package/src/rules/common/scalar-property-missing-example.ts +0 -55
- package/src/rules/common/spec.ts +0 -143
- package/src/rules/common/tag-description.ts +0 -10
- package/src/rules/common/tags-alphabetical.ts +0 -20
- package/src/rules/no-unresolved-refs.ts +0 -51
- package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
- package/src/rules/oas2/__tests__/response-contains-header.test.ts +0 -174
- package/src/rules/oas2/__tests__/response-contains-property.test.ts +0 -155
- package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
- package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
- package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
- package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
- package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -31
- package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
- package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
- package/src/rules/oas2/index.ts +0 -89
- package/src/rules/oas2/remove-unused-components.ts +0 -76
- package/src/rules/oas2/request-mime-type.ts +0 -17
- package/src/rules/oas2/response-contains-property.ts +0 -36
- package/src/rules/oas2/response-mime-type.ts +0 -17
- package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
- package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
- package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
- package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
- package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -392
- package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
- package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
- package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
- package/src/rules/oas3/__tests__/response-contains-header.test.ts +0 -273
- package/src/rules/oas3/__tests__/response-contains-property.test.ts +0 -403
- package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
- package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
- package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
- package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
- package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
- package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
- package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -499
- package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -288
- package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
- package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
- package/src/rules/oas3/index.ts +0 -105
- package/src/rules/oas3/no-empty-servers.ts +0 -22
- package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
- package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -41
- package/src/rules/oas3/no-server-example.com.ts +0 -14
- package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
- package/src/rules/oas3/no-servers-empty-enum.ts +0 -67
- package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
- package/src/rules/oas3/no-unused-components.ts +0 -75
- package/src/rules/oas3/remove-unused-components.ts +0 -84
- package/src/rules/oas3/request-mime-type.ts +0 -31
- package/src/rules/oas3/response-contains-property.ts +0 -38
- package/src/rules/oas3/response-mime-type.ts +0 -31
- package/src/rules/other/stats.ts +0 -44
- package/src/rules/utils.ts +0 -123
- package/src/types/index.ts +0 -138
- package/src/types/oas2.ts +0 -397
- package/src/types/oas3.ts +0 -515
- package/src/types/oas3_1.ts +0 -253
- package/src/types/redocly-yaml.ts +0 -647
- package/src/typings/common.ts +0 -9
- package/src/typings/openapi.ts +0 -298
- package/src/typings/swagger.ts +0 -236
- package/src/utils.ts +0 -193
- package/src/visitors.ts +0 -448
- package/src/walk.ts +0 -416
- package/tsconfig.json +0 -8
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,2 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { asserts, AssertionFn } from './asserts';
|
|
2
|
+
import { Oas2Visitor, Oas3Visitor } from '../../../visitors';
|
|
3
|
+
import { RuleSeverity } from '../../../config';
|
|
4
|
+
export declare type AssertionLocators = {
|
|
5
|
+
filterInParentKeys?: (string | number)[];
|
|
6
|
+
filterOutParentKeys?: (string | number)[];
|
|
7
|
+
matchParentKeys?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare type AssertionDefinition = {
|
|
10
|
+
subject: {
|
|
11
|
+
type: string;
|
|
12
|
+
property?: string | string[];
|
|
13
|
+
} & AssertionLocators;
|
|
14
|
+
assertions: {
|
|
15
|
+
[name in keyof typeof asserts]?: AssertionFn;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare type RawAssertion = AssertionDefinition & {
|
|
19
|
+
where?: AssertionDefinition[];
|
|
20
|
+
message?: string;
|
|
21
|
+
suggest?: string[];
|
|
22
|
+
severity?: RuleSeverity;
|
|
23
|
+
};
|
|
24
|
+
export declare type Assertion = RawAssertion & {
|
|
25
|
+
assertionId: string;
|
|
26
|
+
};
|
|
27
|
+
export declare const Assertions: (opts: Record<string, Assertion>) => (Oas3Visitor | Oas2Visitor)[];
|
|
@@ -1,51 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Assertions = void 0;
|
|
4
|
-
const asserts_1 = require("./asserts");
|
|
5
4
|
const utils_1 = require("./utils");
|
|
5
|
+
const utils_2 = require("../../../utils");
|
|
6
6
|
const Assertions = (opts) => {
|
|
7
|
-
|
|
7
|
+
const visitors = [];
|
|
8
8
|
// As 'Assertions' has an array of asserts,
|
|
9
9
|
// that array spreads into an 'opts' object on init rules phase here
|
|
10
|
-
// https://github.com/Redocly/redocly-cli/blob/
|
|
10
|
+
// https://github.com/Redocly/redocly-cli/blob/main/packages/core/src/config/config.ts#L311
|
|
11
11
|
// that is why we need to iterate through 'opts' values;
|
|
12
12
|
// before - filter only object 'opts' values
|
|
13
13
|
const assertions = Object.values(opts).filter((opt) => typeof opt === 'object' && opt !== null);
|
|
14
|
-
for (const [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
throw new Error(`${assertId}: 'subject' is required`);
|
|
18
|
-
}
|
|
19
|
-
const subjects = Array.isArray(assertion.subject)
|
|
20
|
-
? assertion.subject
|
|
21
|
-
: [assertion.subject];
|
|
22
|
-
const assertsToApply = Object.keys(asserts_1.asserts)
|
|
23
|
-
.filter((assertName) => assertion[assertName] !== undefined)
|
|
24
|
-
.map((assertName) => {
|
|
25
|
-
return {
|
|
26
|
-
assertId,
|
|
27
|
-
name: assertName,
|
|
28
|
-
conditions: assertion[assertName],
|
|
29
|
-
message: assertion.message,
|
|
30
|
-
severity: assertion.severity || 'error',
|
|
31
|
-
suggest: assertion.suggest || [],
|
|
32
|
-
runsOnKeys: asserts_1.runOnKeysSet.has(assertName),
|
|
33
|
-
runsOnValues: asserts_1.runOnValuesSet.has(assertName),
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
const shouldRunOnKeys = assertsToApply.find((assert) => assert.runsOnKeys && !assert.runsOnValues);
|
|
37
|
-
const shouldRunOnValues = assertsToApply.find((assert) => assert.runsOnValues && !assert.runsOnKeys);
|
|
38
|
-
if (shouldRunOnValues && !assertion.property) {
|
|
39
|
-
throw new Error(`${shouldRunOnValues.name} can't be used on all keys. Please provide a single property.`);
|
|
40
|
-
}
|
|
41
|
-
if (shouldRunOnKeys && assertion.property) {
|
|
42
|
-
throw new Error(`${shouldRunOnKeys.name} can't be used on a single property. Please use 'property'.`);
|
|
43
|
-
}
|
|
44
|
-
for (const subject of subjects) {
|
|
45
|
-
const subjectVisitor = utils_1.buildSubjectVisitor(assertion.property, assertsToApply, assertion.context);
|
|
46
|
-
const visitorObject = utils_1.buildVisitorObject(subject, assertion.context, subjectVisitor);
|
|
47
|
-
visitors.push(visitorObject);
|
|
14
|
+
for (const [_, assertion] of assertions.entries()) {
|
|
15
|
+
if (!utils_2.isString(assertion.subject.type)) {
|
|
16
|
+
throw new Error(`${assertion.assertionId}: 'type' (String) is required`);
|
|
48
17
|
}
|
|
18
|
+
const subjectVisitor = utils_1.buildSubjectVisitor(assertion.assertionId, assertion);
|
|
19
|
+
const visitorObject = utils_1.buildVisitorObject(assertion, subjectVisitor);
|
|
20
|
+
visitors.push(visitorObject);
|
|
49
21
|
}
|
|
50
22
|
return visitors;
|
|
51
23
|
};
|
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Asserts } from './asserts';
|
|
2
|
+
import type { AssertionContext, AssertResult } from '../../../config';
|
|
3
|
+
import type { Assertion, AssertionDefinition } from '.';
|
|
4
|
+
import type { Oas2Visitor, Oas3Visitor, VisitFunction } from '../../../visitors';
|
|
2
5
|
export declare type OrderDirection = 'asc' | 'desc';
|
|
3
6
|
export declare type OrderOptions = {
|
|
4
7
|
direction: OrderDirection;
|
|
5
8
|
property: string;
|
|
6
9
|
};
|
|
7
10
|
export declare type AssertToApply = {
|
|
8
|
-
name:
|
|
9
|
-
assertId?: string;
|
|
11
|
+
name: keyof Asserts;
|
|
10
12
|
conditions: any;
|
|
11
|
-
message?: string;
|
|
12
|
-
severity?: ProblemSeverity;
|
|
13
|
-
suggest?: string[];
|
|
14
13
|
runsOnKeys: boolean;
|
|
15
14
|
runsOnValues: boolean;
|
|
16
15
|
};
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
declare type RunAssertionParams = {
|
|
17
|
+
ctx: AssertionContext;
|
|
18
|
+
assert: AssertToApply;
|
|
19
|
+
assertionProperty?: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function getAssertsToApply(assertion: AssertionDefinition): AssertToApply[];
|
|
22
|
+
export declare function buildVisitorObject(assertion: Assertion, subjectVisitor: VisitFunction<any>): Oas2Visitor | Oas3Visitor;
|
|
23
|
+
export declare function buildSubjectVisitor(assertId: string, assertion: Assertion): VisitFunction<any>;
|
|
19
24
|
export declare function getIntersectionLength(keys: string[], properties: string[]): number;
|
|
20
25
|
export declare function isOrdered(value: any[], options: OrderOptions | OrderDirection): boolean;
|
|
26
|
+
export declare function runAssertion({ assert, ctx, assertionProperty, }: RunAssertionParams): AssertResult[];
|
|
27
|
+
export declare function regexFromString(input: string): RegExp | null;
|
|
28
|
+
export {};
|
|
@@ -1,86 +1,154 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isOrdered = exports.getIntersectionLength = exports.buildSubjectVisitor = exports.buildVisitorObject = void 0;
|
|
4
|
-
const ref_utils_1 = require("../../../ref-utils");
|
|
3
|
+
exports.regexFromString = exports.runAssertion = exports.isOrdered = exports.getIntersectionLength = exports.buildSubjectVisitor = exports.buildVisitorObject = exports.getAssertsToApply = void 0;
|
|
5
4
|
const asserts_1 = require("./asserts");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
const logger_1 = require("../../../logger");
|
|
6
|
+
const ref_utils_1 = require("../../../ref-utils");
|
|
7
|
+
const utils_1 = require("../../../utils");
|
|
8
|
+
const assertionMessageTemplates = {
|
|
9
|
+
problems: '{{problems}}',
|
|
10
|
+
};
|
|
11
|
+
function getPredicatesFromLocators(locators) {
|
|
12
|
+
const { filterInParentKeys, filterOutParentKeys, matchParentKeys } = locators;
|
|
13
|
+
const keyMatcher = matchParentKeys && regexFromString(matchParentKeys);
|
|
14
|
+
const matchKeysPredicate = keyMatcher && ((key) => keyMatcher.test(key.toString()));
|
|
15
|
+
const filterInPredicate = Array.isArray(filterInParentKeys) &&
|
|
16
|
+
((key) => filterInParentKeys.includes(key.toString()));
|
|
17
|
+
const filterOutPredicate = Array.isArray(filterOutParentKeys) &&
|
|
18
|
+
((key) => !filterOutParentKeys.includes(key.toString()));
|
|
19
|
+
return [matchKeysPredicate, filterInPredicate, filterOutPredicate].filter(utils_1.isTruthy);
|
|
20
|
+
}
|
|
21
|
+
function getAssertsToApply(assertion) {
|
|
22
|
+
const assertsToApply = utils_1.keysOf(asserts_1.asserts)
|
|
23
|
+
.filter((assertName) => assertion.assertions[assertName] !== undefined)
|
|
24
|
+
.map((assertName) => {
|
|
25
|
+
return {
|
|
26
|
+
name: assertName,
|
|
27
|
+
conditions: assertion.assertions[assertName],
|
|
28
|
+
runsOnKeys: asserts_1.runOnKeysSet.has(assertName),
|
|
29
|
+
runsOnValues: asserts_1.runOnValuesSet.has(assertName),
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
const shouldRunOnKeys = assertsToApply.find((assert) => assert.runsOnKeys && !assert.runsOnValues);
|
|
33
|
+
const shouldRunOnValues = assertsToApply.find((assert) => assert.runsOnValues && !assert.runsOnKeys);
|
|
34
|
+
if (shouldRunOnValues && !assertion.subject.property) {
|
|
35
|
+
throw new Error(`${shouldRunOnValues.name} can't be used on all keys. Please provide a single property`);
|
|
36
|
+
}
|
|
37
|
+
if (shouldRunOnKeys && assertion.subject.property) {
|
|
38
|
+
throw new Error(`${shouldRunOnKeys.name} can't be used on a single property. Please use 'property'.`);
|
|
39
|
+
}
|
|
40
|
+
return assertsToApply;
|
|
41
|
+
}
|
|
42
|
+
exports.getAssertsToApply = getAssertsToApply;
|
|
43
|
+
function getAssertionProperties({ subject }) {
|
|
44
|
+
return (Array.isArray(subject.property) ? subject.property : [subject === null || subject === void 0 ? void 0 : subject.property]).filter(Boolean);
|
|
45
|
+
}
|
|
46
|
+
function applyAssertions(assertionDefinition, asserts, ctx) {
|
|
47
|
+
const properties = getAssertionProperties(assertionDefinition);
|
|
48
|
+
const assertResults = [];
|
|
49
|
+
for (const assert of asserts) {
|
|
50
|
+
if (properties.length) {
|
|
51
|
+
for (const property of properties) {
|
|
52
|
+
assertResults.push(runAssertion({
|
|
53
|
+
assert,
|
|
54
|
+
ctx,
|
|
55
|
+
assertionProperty: property,
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
assertResults.push(runAssertion({
|
|
61
|
+
assert,
|
|
62
|
+
ctx,
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return assertResults.flat();
|
|
67
|
+
}
|
|
68
|
+
function buildVisitorObject(assertion, subjectVisitor) {
|
|
69
|
+
var _a, _b;
|
|
70
|
+
const targetVisitorLocatorPredicates = getPredicatesFromLocators(assertion.subject);
|
|
71
|
+
const targetVisitorSkipFunction = targetVisitorLocatorPredicates.length
|
|
72
|
+
? (_, key) => !targetVisitorLocatorPredicates.every((predicate) => predicate(key))
|
|
73
|
+
: undefined;
|
|
74
|
+
const targetVisitor = {
|
|
75
|
+
[assertion.subject.type]: Object.assign({ enter: subjectVisitor }, (targetVisitorSkipFunction && { skip: targetVisitorSkipFunction })),
|
|
76
|
+
};
|
|
77
|
+
if (!Array.isArray(assertion.where)) {
|
|
78
|
+
return targetVisitor;
|
|
9
79
|
}
|
|
10
80
|
let currentVisitorLevel = {};
|
|
11
81
|
const visitor = currentVisitorLevel;
|
|
82
|
+
const context = assertion.where;
|
|
12
83
|
for (let index = 0; index < context.length; index++) {
|
|
13
|
-
const
|
|
14
|
-
if (
|
|
15
|
-
|
|
16
|
-
// as a workaround for that we don't create separate visitor for the last element
|
|
17
|
-
// which is the same as subject;
|
|
18
|
-
// we will check includes/excludes it in the last visitor.
|
|
19
|
-
continue;
|
|
20
|
-
}
|
|
21
|
-
const matchParentKeys = node.matchParentKeys;
|
|
22
|
-
const excludeParentKeys = node.excludeParentKeys;
|
|
23
|
-
if (matchParentKeys && excludeParentKeys) {
|
|
24
|
-
throw new Error(`Both 'matchParentKeys' and 'excludeParentKeys' can't be under one context item`);
|
|
84
|
+
const assertionDefinitionNode = context[index];
|
|
85
|
+
if (!utils_1.isString((_a = assertionDefinitionNode.subject) === null || _a === void 0 ? void 0 : _a.type)) {
|
|
86
|
+
throw new Error(`${assertion.assertionId} -> where -> [${index}]: 'type' (String) is required`);
|
|
25
87
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
88
|
+
const locatorPredicates = getPredicatesFromLocators(assertionDefinitionNode.subject);
|
|
89
|
+
const assertsToApply = getAssertsToApply(assertionDefinitionNode);
|
|
90
|
+
const skipFunction = (node, key, ctx) => !locatorPredicates.every((predicate) => predicate(key)) ||
|
|
91
|
+
!!applyAssertions(assertionDefinitionNode, assertsToApply, Object.assign(Object.assign({}, ctx), { node })).length;
|
|
92
|
+
const nodeVisitor = Object.assign({}, ((locatorPredicates.length || assertsToApply.length) && { skip: skipFunction }));
|
|
93
|
+
if (assertionDefinitionNode.subject.type === assertion.subject.type &&
|
|
94
|
+
index === context.length - 1) {
|
|
95
|
+
// We have to merge the visitors if the last node inside the `where` is the same as the subject.
|
|
96
|
+
targetVisitor[assertion.subject.type] = Object.assign({ enter: subjectVisitor }, ((nodeVisitor.skip && { skip: nodeVisitor.skip }) ||
|
|
97
|
+
(targetVisitorSkipFunction && {
|
|
98
|
+
skip: (node, key, ctx // We may have locators defined on assertion level and on where level for the same node type
|
|
99
|
+
) => { var _a; return !!(((_a = nodeVisitor.skip) === null || _a === void 0 ? void 0 : _a.call(nodeVisitor, node, key, ctx)) || (targetVisitorSkipFunction === null || targetVisitorSkipFunction === void 0 ? void 0 : targetVisitorSkipFunction(node, key))); },
|
|
100
|
+
})));
|
|
37
101
|
}
|
|
38
102
|
else {
|
|
39
|
-
currentVisitorLevel[
|
|
103
|
+
currentVisitorLevel = currentVisitorLevel[(_b = assertionDefinitionNode.subject) === null || _b === void 0 ? void 0 : _b.type] =
|
|
104
|
+
nodeVisitor;
|
|
40
105
|
}
|
|
41
|
-
currentVisitorLevel = currentVisitorLevel[node.type];
|
|
42
106
|
}
|
|
43
|
-
currentVisitorLevel[subject] =
|
|
107
|
+
currentVisitorLevel[assertion.subject.type] = targetVisitor[assertion.subject.type];
|
|
44
108
|
return visitor;
|
|
45
109
|
}
|
|
46
110
|
exports.buildVisitorObject = buildVisitorObject;
|
|
47
|
-
function buildSubjectVisitor(
|
|
48
|
-
return
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
if (properties) {
|
|
67
|
-
properties = Array.isArray(properties) ? properties : [properties];
|
|
68
|
-
}
|
|
69
|
-
for (const assert of asserts) {
|
|
70
|
-
if (properties) {
|
|
71
|
-
for (const property of properties) {
|
|
72
|
-
// we can have resolvable scalar so need to resolve value here.
|
|
73
|
-
const value = ref_utils_1.isRef(node[property]) ? (_a = resolve(node[property])) === null || _a === void 0 ? void 0 : _a.node : node[property];
|
|
74
|
-
runAssertion(value, assert, location.child(property), report);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
runAssertion(Object.keys(node), assert, location.key(), report);
|
|
111
|
+
function buildSubjectVisitor(assertId, assertion) {
|
|
112
|
+
return (node, ctx) => {
|
|
113
|
+
const properties = getAssertionProperties(assertion);
|
|
114
|
+
const defaultMessage = `${logger_1.colorize.blue(assertId)} failed because the ${logger_1.colorize.blue(assertion.subject.type)} ${logger_1.colorize.blue(properties.join(', '))} didn't meet the assertions: ${assertionMessageTemplates.problems}`.replace(/ +/g, ' ');
|
|
115
|
+
const problems = applyAssertions(assertion, getAssertsToApply(assertion), Object.assign(Object.assign({}, ctx), { node }));
|
|
116
|
+
if (problems.length) {
|
|
117
|
+
for (const problemGroup of groupProblemsByPointer(problems)) {
|
|
118
|
+
const message = assertion.message || defaultMessage;
|
|
119
|
+
const problemMessage = getProblemsMessage(problemGroup);
|
|
120
|
+
ctx.report({
|
|
121
|
+
message: message.replace(assertionMessageTemplates.problems, problemMessage),
|
|
122
|
+
location: getProblemsLocation(problemGroup) || ctx.location,
|
|
123
|
+
forceSeverity: assertion.severity || 'error',
|
|
124
|
+
suggest: assertion.suggest || [],
|
|
125
|
+
ruleId: assertId,
|
|
126
|
+
});
|
|
79
127
|
}
|
|
80
128
|
}
|
|
81
129
|
};
|
|
82
130
|
}
|
|
83
131
|
exports.buildSubjectVisitor = buildSubjectVisitor;
|
|
132
|
+
function groupProblemsByPointer(problems) {
|
|
133
|
+
const groups = {};
|
|
134
|
+
for (const problem of problems) {
|
|
135
|
+
if (!problem.location)
|
|
136
|
+
continue;
|
|
137
|
+
const pointer = problem.location.pointer;
|
|
138
|
+
groups[pointer] = groups[pointer] || [];
|
|
139
|
+
groups[pointer].push(problem);
|
|
140
|
+
}
|
|
141
|
+
return Object.values(groups);
|
|
142
|
+
}
|
|
143
|
+
function getProblemsLocation(problems) {
|
|
144
|
+
return problems.length ? problems[0].location : undefined;
|
|
145
|
+
}
|
|
146
|
+
function getProblemsMessage(problems) {
|
|
147
|
+
var _a;
|
|
148
|
+
return problems.length === 1
|
|
149
|
+
? (_a = problems[0].message) !== null && _a !== void 0 ? _a : ''
|
|
150
|
+
: problems.map((problem) => { var _a; return `\n- ${(_a = problem.message) !== null && _a !== void 0 ? _a : ''}`; }).join('');
|
|
151
|
+
}
|
|
84
152
|
function getIntersectionLength(keys, properties) {
|
|
85
153
|
const props = new Set(properties);
|
|
86
154
|
let count = 0;
|
|
@@ -99,11 +167,17 @@ function isOrdered(value, options) {
|
|
|
99
167
|
let currValue = value[i];
|
|
100
168
|
let prevVal = value[i - 1];
|
|
101
169
|
if (property) {
|
|
102
|
-
|
|
170
|
+
const currPropValue = value[i][property];
|
|
171
|
+
const prevPropValue = value[i - 1][property];
|
|
172
|
+
if (!currPropValue || !prevPropValue) {
|
|
103
173
|
return false; // property doesn't exist, so collection is not ordered
|
|
104
174
|
}
|
|
105
|
-
currValue =
|
|
106
|
-
prevVal =
|
|
175
|
+
currValue = currPropValue;
|
|
176
|
+
prevVal = prevPropValue;
|
|
177
|
+
}
|
|
178
|
+
if (typeof currValue === 'string' && typeof prevVal === 'string') {
|
|
179
|
+
currValue = currValue.toLowerCase();
|
|
180
|
+
prevVal = prevVal.toLowerCase();
|
|
107
181
|
}
|
|
108
182
|
const result = direction === 'asc' ? currValue >= prevVal : currValue <= prevVal;
|
|
109
183
|
if (!result) {
|
|
@@ -113,15 +187,25 @@ function isOrdered(value, options) {
|
|
|
113
187
|
return true;
|
|
114
188
|
}
|
|
115
189
|
exports.isOrdered = isOrdered;
|
|
116
|
-
function runAssertion(
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
});
|
|
190
|
+
function runAssertion({ assert, ctx, assertionProperty, }) {
|
|
191
|
+
var _a;
|
|
192
|
+
const currentLocation = assert.name === 'ref' ? ctx.rawLocation : ctx.location;
|
|
193
|
+
if (assertionProperty) {
|
|
194
|
+
const values = ref_utils_1.isRef(ctx.node[assertionProperty])
|
|
195
|
+
? (_a = ctx.resolve(ctx.node[assertionProperty])) === null || _a === void 0 ? void 0 : _a.node
|
|
196
|
+
: ctx.node[assertionProperty];
|
|
197
|
+
const rawValues = ctx.rawNode[assertionProperty];
|
|
198
|
+
const location = currentLocation.child(assertionProperty);
|
|
199
|
+
return asserts_1.asserts[assert.name](values, assert.conditions, Object.assign(Object.assign({}, ctx), { baseLocation: location, rawValue: rawValues }));
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const value = Array.isArray(ctx.node) ? ctx.node : Object.keys(ctx.node);
|
|
203
|
+
return asserts_1.asserts[assert.name](value, assert.conditions, Object.assign(Object.assign({}, ctx), { rawValue: ctx.rawNode, baseLocation: currentLocation }));
|
|
126
204
|
}
|
|
127
205
|
}
|
|
206
|
+
exports.runAssertion = runAssertion;
|
|
207
|
+
function regexFromString(input) {
|
|
208
|
+
const matches = input.match(/^\/(.*)\/(.*)|(.*)/);
|
|
209
|
+
return matches && new RegExp(matches[1] || matches[3], matches[2]);
|
|
210
|
+
}
|
|
211
|
+
exports.regexFromString = regexFromString;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { Oas3Rule, Oas2Rule } from '../../visitors';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const InfoLicenseUrl: Oas3Rule | Oas2Rule;
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.InfoLicenseUrl = void 0;
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
|
-
const
|
|
5
|
+
const InfoLicenseUrl = () => {
|
|
6
6
|
return {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
report({
|
|
10
|
-
message: utils_1.missingRequiredField('Info', 'license'),
|
|
11
|
-
location: { reportOnKey: true }
|
|
12
|
-
});
|
|
13
|
-
}
|
|
7
|
+
License(license, ctx) {
|
|
8
|
+
utils_1.validateDefinedAndNonEmpty('url', license, ctx);
|
|
14
9
|
},
|
|
15
10
|
};
|
|
16
11
|
};
|
|
17
|
-
exports.
|
|
12
|
+
exports.InfoLicenseUrl = InfoLicenseUrl;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InfoLicense = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const InfoLicense = () => {
|
|
6
|
+
return {
|
|
7
|
+
Info(info, { report }) {
|
|
8
|
+
if (!info.license) {
|
|
9
|
+
report({
|
|
10
|
+
message: utils_1.missingRequiredField('Info', 'license'),
|
|
11
|
+
location: { reportOnKey: true },
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
exports.InfoLicense = InfoLicense;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.NoAmbiguousPaths = void 0;
|
|
4
4
|
const NoAmbiguousPaths = () => {
|
|
5
5
|
return {
|
|
6
|
-
|
|
6
|
+
Paths(pathMap, { report, location }) {
|
|
7
7
|
const seenPaths = [];
|
|
8
8
|
for (const currentPath of Object.keys(pathMap)) {
|
|
9
9
|
const ambiguousPath = seenPaths.find((seenPath) => arePathsAmbiguous(seenPath, currentPath));
|
|
@@ -28,14 +28,12 @@ const NoEnumTypeMismatch = () => {
|
|
|
28
28
|
if (mismatchedResults[enumValue].length !== schema.type.length)
|
|
29
29
|
delete mismatchedResults[enumValue];
|
|
30
30
|
}
|
|
31
|
-
;
|
|
32
31
|
for (const mismatchedKey of Object.keys(mismatchedResults)) {
|
|
33
32
|
report({
|
|
34
|
-
message: `Enum value \`${mismatchedKey}\` must be of
|
|
33
|
+
message: `Enum value \`${mismatchedKey}\` must be of allowed types: \`${schema.type}\`.`,
|
|
35
34
|
location: location.child(['enum', schema.enum.indexOf(mismatchedKey)]),
|
|
36
35
|
});
|
|
37
36
|
}
|
|
38
|
-
;
|
|
39
37
|
}
|
|
40
38
|
},
|
|
41
39
|
};
|
|
@@ -3,11 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.NoIdenticalPaths = void 0;
|
|
4
4
|
const NoIdenticalPaths = () => {
|
|
5
5
|
return {
|
|
6
|
-
|
|
7
|
-
const
|
|
6
|
+
Paths(pathMap, { report, location }) {
|
|
7
|
+
const Paths = new Map();
|
|
8
8
|
for (const pathName of Object.keys(pathMap)) {
|
|
9
9
|
const id = pathName.replace(/{.+?}/g, '{VARIABLE}');
|
|
10
|
-
const existingSamePath =
|
|
10
|
+
const existingSamePath = Paths.get(id);
|
|
11
11
|
if (existingSamePath) {
|
|
12
12
|
report({
|
|
13
13
|
message: `The path already exists which differs only by path parameter name(s): \`${existingSamePath}\` and \`${pathName}\`.`,
|
|
@@ -15,7 +15,7 @@ const NoIdenticalPaths = () => {
|
|
|
15
15
|
});
|
|
16
16
|
}
|
|
17
17
|
else {
|
|
18
|
-
|
|
18
|
+
Paths.set(id, pathName);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
},
|
|
@@ -4,17 +4,17 @@ exports.NoInvalidParameterExamples = void 0;
|
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const NoInvalidParameterExamples = (opts) => {
|
|
6
6
|
var _a;
|
|
7
|
-
const
|
|
7
|
+
const allowAdditionalProperties = (_a = utils_1.getAdditionalPropertiesOption(opts)) !== null && _a !== void 0 ? _a : false;
|
|
8
8
|
return {
|
|
9
9
|
Parameter: {
|
|
10
10
|
leave(parameter, ctx) {
|
|
11
11
|
if (parameter.example) {
|
|
12
|
-
utils_1.validateExample(parameter.example, parameter.schema, ctx.location.child('example'), ctx,
|
|
12
|
+
utils_1.validateExample(parameter.example, parameter.schema, ctx.location.child('example'), ctx, allowAdditionalProperties);
|
|
13
13
|
}
|
|
14
14
|
if (parameter.examples) {
|
|
15
15
|
for (const [key, example] of Object.entries(parameter.examples)) {
|
|
16
16
|
if ('value' in example) {
|
|
17
|
-
utils_1.validateExample(example.value, parameter.schema, ctx.location.child(['examples', key]), ctx,
|
|
17
|
+
utils_1.validateExample(example.value, parameter.schema, ctx.location.child(['examples', key]), ctx, true);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
}
|
|
@@ -4,17 +4,17 @@ exports.NoInvalidSchemaExamples = void 0;
|
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const NoInvalidSchemaExamples = (opts) => {
|
|
6
6
|
var _a;
|
|
7
|
-
const
|
|
7
|
+
const allowAdditionalProperties = (_a = utils_1.getAdditionalPropertiesOption(opts)) !== null && _a !== void 0 ? _a : false;
|
|
8
8
|
return {
|
|
9
9
|
Schema: {
|
|
10
10
|
leave(schema, ctx) {
|
|
11
11
|
if (schema.examples) {
|
|
12
12
|
for (const example of schema.examples) {
|
|
13
|
-
utils_1.validateExample(example, schema, ctx.location.child(['examples', schema.examples.indexOf(example)]), ctx,
|
|
13
|
+
utils_1.validateExample(example, schema, ctx.location.child(['examples', schema.examples.indexOf(example)]), ctx, allowAdditionalProperties);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
if (schema.example) {
|
|
17
|
-
utils_1.validateExample(schema.example, schema, ctx.location.child('example'), ctx,
|
|
17
|
+
utils_1.validateExample(schema.example, schema, ctx.location.child('example'), ctx, true);
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
},
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Operation2xxResponse = void 0;
|
|
4
|
-
const
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const Operation2xxResponse = ({ validateWebhooks }) => {
|
|
5
6
|
return {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
7
|
+
Paths: {
|
|
8
|
+
Responses(responses, { report }) {
|
|
9
|
+
const codes = Object.keys(responses || {});
|
|
10
|
+
utils_1.validateResponseCodes(codes, '2XX', { report });
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
WebhooksMap: {
|
|
14
|
+
Responses(responses, { report }) {
|
|
15
|
+
if (!validateWebhooks)
|
|
16
|
+
return;
|
|
17
|
+
const codes = Object.keys(responses || {});
|
|
18
|
+
utils_1.validateResponseCodes(codes, '2XX', { report });
|
|
19
|
+
},
|
|
14
20
|
},
|
|
15
21
|
};
|
|
16
22
|
};
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Operation4xxResponse = void 0;
|
|
4
|
-
const
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const Operation4xxResponse = ({ validateWebhooks }) => {
|
|
5
6
|
return {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
7
|
+
Paths: {
|
|
8
|
+
Responses(responses, { report }) {
|
|
9
|
+
const codes = Object.keys(responses || {});
|
|
10
|
+
utils_1.validateResponseCodes(codes, '4XX', { report });
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
WebhooksMap: {
|
|
14
|
+
Responses(responses, { report }) {
|
|
15
|
+
if (!validateWebhooks)
|
|
16
|
+
return;
|
|
17
|
+
const codes = Object.keys(responses || {});
|
|
18
|
+
utils_1.validateResponseCodes(codes, '4XX', { report });
|
|
19
|
+
},
|
|
14
20
|
},
|
|
15
21
|
};
|
|
16
22
|
};
|
|
@@ -4,13 +4,13 @@ exports.OperationOperationId = void 0;
|
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const OperationOperationId = () => {
|
|
6
6
|
return {
|
|
7
|
-
|
|
7
|
+
Root: {
|
|
8
8
|
PathItem: {
|
|
9
9
|
Operation(operation, ctx) {
|
|
10
10
|
utils_1.validateDefinedAndNonEmpty('operationId', operation, ctx);
|
|
11
11
|
},
|
|
12
12
|
},
|
|
13
|
-
}
|
|
13
|
+
},
|
|
14
14
|
};
|
|
15
15
|
};
|
|
16
16
|
exports.OperationOperationId = OperationOperationId;
|