@redocly/openapi-core 1.0.0-beta.99 → 1.0.0-rc.2
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
|
@@ -30,8 +30,14 @@ class RegistryApi {
|
|
|
30
30
|
return this;
|
|
31
31
|
}
|
|
32
32
|
request(path = '', options = {}, region) {
|
|
33
|
+
var _a, _b;
|
|
33
34
|
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
-
const
|
|
35
|
+
const currentCommand = typeof process !== 'undefined' ? ((_a = process.env) === null || _a === void 0 ? void 0 : _a.REDOCLY_CLI_COMMAND) || '' : '';
|
|
36
|
+
const redoclyEnv = typeof process !== 'undefined' ? ((_b = process.env) === null || _b === void 0 ? void 0 : _b.REDOCLY_ENVIRONMENT) || '' : '';
|
|
37
|
+
const headers = Object.assign({}, options.headers || {}, {
|
|
38
|
+
'x-redocly-cli-version': version,
|
|
39
|
+
'user-agent': `redocly-cli / ${version} ${currentCommand} ${redoclyEnv}`,
|
|
40
|
+
});
|
|
35
41
|
if (!headers.hasOwnProperty('authorization')) {
|
|
36
42
|
throw new Error('Unauthorized');
|
|
37
43
|
}
|
|
@@ -80,7 +86,7 @@ class RegistryApi {
|
|
|
80
86
|
throw new Error('Could not prepare file upload');
|
|
81
87
|
});
|
|
82
88
|
}
|
|
83
|
-
pushApi({ organizationId, name, version, rootFilePath, filePaths, branch, isUpsert, isPublic, }) {
|
|
89
|
+
pushApi({ organizationId, name, version, rootFilePath, filePaths, branch, isUpsert, isPublic, batchId, batchSize, }) {
|
|
84
90
|
return __awaiter(this, void 0, void 0, function* () {
|
|
85
91
|
const response = yield this.request(`/${organizationId}/${name}/${version}`, {
|
|
86
92
|
method: 'PUT',
|
|
@@ -94,6 +100,8 @@ class RegistryApi {
|
|
|
94
100
|
branch,
|
|
95
101
|
isUpsert,
|
|
96
102
|
isPublic,
|
|
103
|
+
batchId,
|
|
104
|
+
batchSize,
|
|
97
105
|
}),
|
|
98
106
|
}, this.region);
|
|
99
107
|
if (response.ok) {
|
package/lib/ref-utils.d.ts
CHANGED
|
@@ -23,3 +23,4 @@ export declare function pointerBaseName(pointer: string): string;
|
|
|
23
23
|
export declare function refBaseName(ref: string): string;
|
|
24
24
|
export declare function isAbsoluteUrl(ref: string): boolean;
|
|
25
25
|
export declare function isMappingRef(mapping: string): boolean;
|
|
26
|
+
export declare function isAnchor(ref: string): boolean;
|
package/lib/ref-utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isMappingRef = exports.isAbsoluteUrl = exports.refBaseName = exports.pointerBaseName = exports.parsePointer = exports.parseRef = exports.escapePointer = exports.unescapePointer = exports.Location = exports.isRef = exports.joinPointer = void 0;
|
|
3
|
+
exports.isAnchor = exports.isMappingRef = exports.isAbsoluteUrl = exports.refBaseName = exports.pointerBaseName = exports.parsePointer = exports.parseRef = exports.escapePointer = exports.unescapePointer = exports.Location = exports.isRef = exports.joinPointer = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
4
5
|
function joinPointer(base, key) {
|
|
5
6
|
if (base === '')
|
|
6
7
|
base = '#/';
|
|
@@ -41,7 +42,7 @@ function parseRef(ref) {
|
|
|
41
42
|
const [uri, pointer] = ref.split('#/');
|
|
42
43
|
return {
|
|
43
44
|
uri: uri || null,
|
|
44
|
-
pointer: pointer ? pointer.split('/').map(unescapePointer).filter(
|
|
45
|
+
pointer: pointer ? pointer.split('/').map(unescapePointer).filter(utils_1.isTruthy) : [],
|
|
45
46
|
};
|
|
46
47
|
}
|
|
47
48
|
exports.parseRef = parseRef;
|
|
@@ -73,3 +74,7 @@ function isMappingRef(mapping) {
|
|
|
73
74
|
mapping.indexOf('/') > -1);
|
|
74
75
|
}
|
|
75
76
|
exports.isMappingRef = isMappingRef;
|
|
77
|
+
function isAnchor(ref) {
|
|
78
|
+
return /^#[A-Za-z][A-Za-z0-9\-_:.]*$/.test(ref);
|
|
79
|
+
}
|
|
80
|
+
exports.isAnchor = isAnchor;
|
package/lib/resolve.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export declare function makeDocumentFromString(sourceString: string, absoluteRef
|
|
|
33
33
|
parsed: unknown;
|
|
34
34
|
};
|
|
35
35
|
export declare class BaseResolver {
|
|
36
|
-
|
|
36
|
+
protected config: ResolveConfig;
|
|
37
37
|
cache: Map<string, Promise<Document | ResolveError>>;
|
|
38
38
|
constructor(config?: ResolveConfig);
|
|
39
39
|
getFiles(): Set<string>;
|
package/lib/resolve.js
CHANGED
|
@@ -110,10 +110,16 @@ class BaseResolver {
|
|
|
110
110
|
return new Source(absoluteRef, body, mimeType);
|
|
111
111
|
}
|
|
112
112
|
else {
|
|
113
|
-
|
|
113
|
+
if (fs.lstatSync(absoluteRef).isDirectory()) {
|
|
114
|
+
throw new Error(`Expected a file but received a folder at ${absoluteRef}`);
|
|
115
|
+
}
|
|
116
|
+
const content = yield fs.promises.readFile(absoluteRef, 'utf-8');
|
|
117
|
+
// In some cases file have \r\n line delimeters like on windows, we should skip it.
|
|
118
|
+
return new Source(absoluteRef, content.replace(/\r\n/g, '\n'));
|
|
114
119
|
}
|
|
115
120
|
}
|
|
116
121
|
catch (error) {
|
|
122
|
+
error.message = error.message.replace(', lstat', '');
|
|
117
123
|
throw new ResolveError(error);
|
|
118
124
|
}
|
|
119
125
|
});
|
|
@@ -184,6 +190,7 @@ function resolveDocument(opts) {
|
|
|
184
190
|
return resolvedRefMap;
|
|
185
191
|
function resolveRefsInParallel(rootNode, rootNodeDocument, rootNodePointer, type) {
|
|
186
192
|
const rootNodeDocAbsoluteRef = rootNodeDocument.source.absoluteRef;
|
|
193
|
+
const anchorRefsMap = new Map();
|
|
187
194
|
walk(rootNode, type, rootNodeDocAbsoluteRef + rootNodePointer);
|
|
188
195
|
function walk(node, type, nodeAbsoluteRef) {
|
|
189
196
|
if (typeof node !== 'object' || node === null) {
|
|
@@ -194,10 +201,14 @@ function resolveDocument(opts) {
|
|
|
194
201
|
return;
|
|
195
202
|
}
|
|
196
203
|
seedNodes.add(nodeId);
|
|
204
|
+
const [_, anchor] = Object.entries(node).find(([key]) => key === '$anchor') || [];
|
|
205
|
+
if (anchor) {
|
|
206
|
+
anchorRefsMap.set(`#${anchor}`, node);
|
|
207
|
+
}
|
|
197
208
|
if (Array.isArray(node)) {
|
|
198
209
|
const itemsType = type.items;
|
|
199
210
|
// we continue resolving unknown types, but stop early on known scalars
|
|
200
|
-
if (type !== unknownType &&
|
|
211
|
+
if (itemsType === undefined && type !== unknownType && type !== types_1.SpecExtension) {
|
|
201
212
|
return;
|
|
202
213
|
}
|
|
203
214
|
for (let i = 0; i < node.length; i++) {
|
|
@@ -214,6 +225,11 @@ function resolveDocument(opts) {
|
|
|
214
225
|
propType = propType(propValue, propName);
|
|
215
226
|
if (propType === undefined)
|
|
216
227
|
propType = unknownType;
|
|
228
|
+
if (type.extensionsPrefix &&
|
|
229
|
+
propName.startsWith(type.extensionsPrefix) &&
|
|
230
|
+
propType === unknownType) {
|
|
231
|
+
propType = types_1.SpecExtension;
|
|
232
|
+
}
|
|
217
233
|
if (!types_1.isNamedType(propType) && (propType === null || propType === void 0 ? void 0 : propType.directResolveAs)) {
|
|
218
234
|
propType = propType.directResolveAs;
|
|
219
235
|
propValue = { $ref: propValue };
|
|
@@ -243,6 +259,20 @@ function resolveDocument(opts) {
|
|
|
243
259
|
if (hasRef(refStack.prev, ref)) {
|
|
244
260
|
throw new Error('Self-referencing circular pointer');
|
|
245
261
|
}
|
|
262
|
+
if (ref_utils_1.isAnchor(ref.$ref)) {
|
|
263
|
+
// Wait for all anchors in the document to be collected firstly.
|
|
264
|
+
yield utils_1.nextTick();
|
|
265
|
+
const resolvedRef = {
|
|
266
|
+
resolved: true,
|
|
267
|
+
isRemote: false,
|
|
268
|
+
node: anchorRefsMap.get(ref.$ref),
|
|
269
|
+
document,
|
|
270
|
+
nodePointer: ref.$ref,
|
|
271
|
+
};
|
|
272
|
+
const refId = makeRefId(document.source.absoluteRef, ref.$ref);
|
|
273
|
+
resolvedRefMap.set(refId, resolvedRef);
|
|
274
|
+
return resolvedRef;
|
|
275
|
+
}
|
|
246
276
|
const { uri, pointer } = ref_utils_1.parseRef(ref.$ref);
|
|
247
277
|
const isRemote = uri !== null;
|
|
248
278
|
let targetDoc;
|
|
@@ -271,7 +301,7 @@ function resolveDocument(opts) {
|
|
|
271
301
|
};
|
|
272
302
|
let target = targetDoc.parsed;
|
|
273
303
|
const segments = pointer;
|
|
274
|
-
for (
|
|
304
|
+
for (const segment of segments) {
|
|
275
305
|
if (typeof target !== 'object') {
|
|
276
306
|
target = undefined;
|
|
277
307
|
break;
|
package/lib/rules/ajv.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ErrorObject } from '@redocly/ajv';
|
|
1
|
+
import { ErrorObject } from '@redocly/ajv/dist/2020';
|
|
2
2
|
import { Location } from '../ref-utils';
|
|
3
3
|
import { ResolveFn } from '../walk';
|
|
4
4
|
export declare function releaseAjvInstance(): void;
|
|
5
|
-
export declare function validateJsonSchema(data: any, schema: any, schemaLoc: Location, instancePath: string, resolve: ResolveFn
|
|
5
|
+
export declare function validateJsonSchema(data: any, schema: any, schemaLoc: Location, instancePath: string, resolve: ResolveFn, allowAdditionalProperties: boolean): {
|
|
6
6
|
valid: boolean;
|
|
7
7
|
errors: (ErrorObject & {
|
|
8
8
|
suggest?: string[];
|
package/lib/rules/ajv.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateJsonSchema = exports.releaseAjvInstance = void 0;
|
|
4
|
-
const
|
|
4
|
+
const _2020_1 = require("@redocly/ajv/dist/2020");
|
|
5
5
|
const ref_utils_1 = require("../ref-utils");
|
|
6
6
|
let ajvInstance = null;
|
|
7
7
|
function releaseAjvInstance() {
|
|
8
8
|
ajvInstance = null;
|
|
9
9
|
}
|
|
10
10
|
exports.releaseAjvInstance = releaseAjvInstance;
|
|
11
|
-
function getAjv(resolve,
|
|
11
|
+
function getAjv(resolve, allowAdditionalProperties) {
|
|
12
12
|
if (!ajvInstance) {
|
|
13
|
-
ajvInstance = new
|
|
13
|
+
ajvInstance = new _2020_1.default({
|
|
14
14
|
schemaId: '$id',
|
|
15
15
|
meta: true,
|
|
16
16
|
allErrors: true,
|
|
@@ -20,11 +20,11 @@ function getAjv(resolve, disallowAdditionalProperties) {
|
|
|
20
20
|
discriminator: true,
|
|
21
21
|
allowUnionTypes: true,
|
|
22
22
|
validateFormats: false,
|
|
23
|
-
|
|
23
|
+
defaultUnevaluatedProperties: allowAdditionalProperties,
|
|
24
24
|
loadSchemaSync(base, $ref) {
|
|
25
25
|
const resolvedRef = resolve({ $ref }, base.split('#')[0]);
|
|
26
26
|
if (!resolvedRef || !resolvedRef.location)
|
|
27
|
-
return
|
|
27
|
+
return false;
|
|
28
28
|
return Object.assign({ $id: resolvedRef.location.absolutePointer }, resolvedRef.node);
|
|
29
29
|
},
|
|
30
30
|
logger: false,
|
|
@@ -32,15 +32,15 @@ function getAjv(resolve, disallowAdditionalProperties) {
|
|
|
32
32
|
}
|
|
33
33
|
return ajvInstance;
|
|
34
34
|
}
|
|
35
|
-
function getAjvValidator(schema, loc, resolve,
|
|
36
|
-
const ajv = getAjv(resolve,
|
|
35
|
+
function getAjvValidator(schema, loc, resolve, allowAdditionalProperties) {
|
|
36
|
+
const ajv = getAjv(resolve, allowAdditionalProperties);
|
|
37
37
|
if (!ajv.getSchema(loc.absolutePointer)) {
|
|
38
38
|
ajv.addSchema(Object.assign({ $id: loc.absolutePointer }, schema), loc.absolutePointer);
|
|
39
39
|
}
|
|
40
40
|
return ajv.getSchema(loc.absolutePointer);
|
|
41
41
|
}
|
|
42
|
-
function validateJsonSchema(data, schema, schemaLoc, instancePath, resolve,
|
|
43
|
-
const validate = getAjvValidator(schema, schemaLoc, resolve,
|
|
42
|
+
function validateJsonSchema(data, schema, schemaLoc, instancePath, resolve, allowAdditionalProperties) {
|
|
43
|
+
const validate = getAjvValidator(schema, schemaLoc, resolve, allowAdditionalProperties);
|
|
44
44
|
if (!validate)
|
|
45
45
|
return { valid: true, errors: [] }; // unresolved refs are reported
|
|
46
46
|
const valid = validate(data, {
|
|
@@ -56,7 +56,7 @@ function validateJsonSchema(data, schema, schemaLoc, instancePath, resolve, disa
|
|
|
56
56
|
};
|
|
57
57
|
function beatifyErrorMessage(error) {
|
|
58
58
|
let message = error.message;
|
|
59
|
-
|
|
59
|
+
const suggest = error.keyword === 'enum' ? error.params.allowedValues : undefined;
|
|
60
60
|
if (suggest) {
|
|
61
61
|
message += ` ${suggest.map((e) => `"${e}"`).join(', ')}`;
|
|
62
62
|
}
|
|
@@ -68,8 +68,8 @@ function validateJsonSchema(data, schema, schemaLoc, instancePath, resolve, disa
|
|
|
68
68
|
if (propName) {
|
|
69
69
|
message = `\`${propName}\` property ${message}`;
|
|
70
70
|
}
|
|
71
|
-
if (error.keyword === 'additionalProperties') {
|
|
72
|
-
const property = error.params.additionalProperty;
|
|
71
|
+
if (error.keyword === 'additionalProperties' || error.keyword === 'unevaluatedProperties') {
|
|
72
|
+
const property = error.params.additionalProperty || error.params.unevaluatedProperty;
|
|
73
73
|
message = `${message} \`${property}\``;
|
|
74
74
|
error.instancePath += '/' + ref_utils_1.escapePointer(property);
|
|
75
75
|
}
|
|
@@ -1,5 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export declare
|
|
1
|
+
import { AssertionContext, AssertResult, CustomFunction } from 'core/src/config/types';
|
|
2
|
+
import { Location } from '../../../ref-utils';
|
|
3
|
+
export declare type AssertionFnContext = AssertionContext & {
|
|
4
|
+
baseLocation: Location;
|
|
5
|
+
rawValue?: any;
|
|
6
|
+
};
|
|
7
|
+
export declare type AssertionFn = (value: any, condition: any, ctx: AssertionFnContext) => AssertResult[];
|
|
8
|
+
export declare type Asserts = {
|
|
9
|
+
pattern: AssertionFn;
|
|
10
|
+
notPattern: AssertionFn;
|
|
11
|
+
enum: AssertionFn;
|
|
12
|
+
defined: AssertionFn;
|
|
13
|
+
required: AssertionFn;
|
|
14
|
+
disallowed: AssertionFn;
|
|
15
|
+
undefined: AssertionFn;
|
|
16
|
+
nonEmpty: AssertionFn;
|
|
17
|
+
minLength: AssertionFn;
|
|
18
|
+
maxLength: AssertionFn;
|
|
19
|
+
casing: AssertionFn;
|
|
20
|
+
sortOrder: AssertionFn;
|
|
21
|
+
mutuallyExclusive: AssertionFn;
|
|
22
|
+
mutuallyRequired: AssertionFn;
|
|
23
|
+
requireAny: AssertionFn;
|
|
24
|
+
ref: AssertionFn;
|
|
25
|
+
const: AssertionFn;
|
|
26
|
+
};
|
|
27
|
+
export declare const runOnKeysSet: Set<keyof Asserts>;
|
|
28
|
+
export declare const runOnValuesSet: Set<keyof Asserts>;
|
|
4
29
|
export declare const asserts: Asserts;
|
|
5
|
-
export
|
|
30
|
+
export declare function buildAssertCustomFunction(fn: CustomFunction): AssertionFn;
|
|
@@ -1,21 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.asserts = exports.runOnValuesSet = exports.runOnKeysSet = void 0;
|
|
4
|
-
const utils_1 = require("
|
|
3
|
+
exports.buildAssertCustomFunction = exports.asserts = exports.runOnValuesSet = exports.runOnKeysSet = void 0;
|
|
4
|
+
const utils_1 = require("../../../utils");
|
|
5
|
+
const utils_2 = require("./utils");
|
|
5
6
|
exports.runOnKeysSet = new Set([
|
|
6
7
|
'mutuallyExclusive',
|
|
7
8
|
'mutuallyRequired',
|
|
8
9
|
'enum',
|
|
9
10
|
'pattern',
|
|
11
|
+
'notPattern',
|
|
10
12
|
'minLength',
|
|
11
13
|
'maxLength',
|
|
12
14
|
'casing',
|
|
13
15
|
'sortOrder',
|
|
14
16
|
'disallowed',
|
|
15
17
|
'required',
|
|
18
|
+
'requireAny',
|
|
19
|
+
'ref',
|
|
20
|
+
'const',
|
|
21
|
+
'defined', // In case if `property` for assertions is not added
|
|
16
22
|
]);
|
|
17
23
|
exports.runOnValuesSet = new Set([
|
|
18
24
|
'pattern',
|
|
25
|
+
'notPattern',
|
|
19
26
|
'enum',
|
|
20
27
|
'defined',
|
|
21
28
|
'undefined',
|
|
@@ -24,120 +31,243 @@ exports.runOnValuesSet = new Set([
|
|
|
24
31
|
'maxLength',
|
|
25
32
|
'casing',
|
|
26
33
|
'sortOrder',
|
|
34
|
+
'ref',
|
|
35
|
+
'const',
|
|
27
36
|
]);
|
|
28
37
|
exports.asserts = {
|
|
29
|
-
pattern: (value, condition) => {
|
|
30
|
-
if (typeof value === 'undefined')
|
|
31
|
-
return
|
|
32
|
-
const values =
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
return true;
|
|
38
|
+
pattern: (value, condition, { baseLocation }) => {
|
|
39
|
+
if (typeof value === 'undefined' || utils_1.isPlainObject(value))
|
|
40
|
+
return []; // property doesn't exist or is an object, no need to lint it with this assert
|
|
41
|
+
const values = Array.isArray(value) ? value : [value];
|
|
42
|
+
const regex = utils_2.regexFromString(condition);
|
|
43
|
+
return values
|
|
44
|
+
.map((_val) => !(regex === null || regex === void 0 ? void 0 : regex.test(_val)) && {
|
|
45
|
+
message: `"${_val}" should match a regex ${condition}`,
|
|
46
|
+
location: utils_1.isString(value) ? baseLocation : baseLocation.key(),
|
|
47
|
+
})
|
|
48
|
+
.filter(utils_1.isTruthy);
|
|
42
49
|
},
|
|
43
|
-
|
|
44
|
-
if (typeof value === 'undefined')
|
|
45
|
-
return
|
|
46
|
-
const values =
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
notPattern: (value, condition, { baseLocation }) => {
|
|
51
|
+
if (typeof value === 'undefined' || utils_1.isPlainObject(value))
|
|
52
|
+
return []; // property doesn't exist or is an object, no need to lint it with this assert
|
|
53
|
+
const values = Array.isArray(value) ? value : [value];
|
|
54
|
+
const regex = utils_2.regexFromString(condition);
|
|
55
|
+
return values
|
|
56
|
+
.map((_val) => (regex === null || regex === void 0 ? void 0 : regex.test(_val)) && {
|
|
57
|
+
message: `"${_val}" should not match a regex ${condition}`,
|
|
58
|
+
location: utils_1.isString(value) ? baseLocation : baseLocation.key(),
|
|
59
|
+
})
|
|
60
|
+
.filter(utils_1.isTruthy);
|
|
61
|
+
},
|
|
62
|
+
enum: (value, condition, { baseLocation }) => {
|
|
63
|
+
if (typeof value === 'undefined' || utils_1.isPlainObject(value))
|
|
64
|
+
return []; // property doesn't exist or is an object, no need to lint it with this assert
|
|
65
|
+
const values = Array.isArray(value) ? value : [value];
|
|
66
|
+
return values
|
|
67
|
+
.map((_val) => !condition.includes(_val) && {
|
|
68
|
+
message: `"${_val}" should be one of the predefined values`,
|
|
69
|
+
location: utils_1.isString(value) ? baseLocation : baseLocation.child(_val).key(),
|
|
70
|
+
})
|
|
71
|
+
.filter(utils_1.isTruthy);
|
|
53
72
|
},
|
|
54
|
-
defined: (value, condition = true) => {
|
|
73
|
+
defined: (value, condition = true, { baseLocation }) => {
|
|
55
74
|
const isDefined = typeof value !== 'undefined';
|
|
56
|
-
|
|
75
|
+
const isValid = condition ? isDefined : !isDefined;
|
|
76
|
+
return isValid
|
|
77
|
+
? []
|
|
78
|
+
: [
|
|
79
|
+
{
|
|
80
|
+
message: condition ? `Should be defined` : 'Should be not defined',
|
|
81
|
+
location: baseLocation,
|
|
82
|
+
},
|
|
83
|
+
];
|
|
57
84
|
},
|
|
58
|
-
required: (value, keys) => {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
85
|
+
required: (value, keys, { baseLocation }) => {
|
|
86
|
+
return keys
|
|
87
|
+
.map((requiredKey) => !value.includes(requiredKey) && {
|
|
88
|
+
message: `${requiredKey} is required`,
|
|
89
|
+
location: baseLocation.key(),
|
|
90
|
+
})
|
|
91
|
+
.filter(utils_1.isTruthy);
|
|
92
|
+
},
|
|
93
|
+
disallowed: (value, condition, { baseLocation }) => {
|
|
94
|
+
if (typeof value === 'undefined' || utils_1.isPlainObject(value))
|
|
95
|
+
return []; // property doesn't exist or is an object, no need to lint it with this assert
|
|
96
|
+
const values = Array.isArray(value) ? value : [value];
|
|
97
|
+
return values
|
|
98
|
+
.map((_val) => condition.includes(_val) && {
|
|
99
|
+
message: `"${_val}" is disallowed`,
|
|
100
|
+
location: utils_1.isString(value) ? baseLocation : baseLocation.child(_val).key(),
|
|
101
|
+
})
|
|
102
|
+
.filter(utils_1.isTruthy);
|
|
65
103
|
},
|
|
66
|
-
|
|
104
|
+
const: (value, condition, { baseLocation }) => {
|
|
67
105
|
if (typeof value === 'undefined')
|
|
68
|
-
return
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
106
|
+
return [];
|
|
107
|
+
if (Array.isArray(value)) {
|
|
108
|
+
return value
|
|
109
|
+
.map((_val) => condition !== _val && {
|
|
110
|
+
message: `"${_val}" should be equal ${condition} `,
|
|
111
|
+
location: utils_1.isString(value) ? baseLocation : baseLocation.child(_val).key(),
|
|
112
|
+
})
|
|
113
|
+
.filter(utils_1.isTruthy);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
return value !== condition
|
|
117
|
+
? [
|
|
118
|
+
{
|
|
119
|
+
message: `${value} should be equal ${condition}`,
|
|
120
|
+
location: baseLocation,
|
|
121
|
+
},
|
|
122
|
+
]
|
|
123
|
+
: [];
|
|
74
124
|
}
|
|
75
|
-
return true;
|
|
76
125
|
},
|
|
77
|
-
undefined: (value, condition = true) => {
|
|
126
|
+
undefined: (value, condition = true, { baseLocation }) => {
|
|
78
127
|
const isUndefined = typeof value === 'undefined';
|
|
79
|
-
|
|
128
|
+
const isValid = condition ? isUndefined : !isUndefined;
|
|
129
|
+
return isValid
|
|
130
|
+
? []
|
|
131
|
+
: [
|
|
132
|
+
{
|
|
133
|
+
message: condition ? `Should not be defined` : 'Should be defined',
|
|
134
|
+
location: baseLocation,
|
|
135
|
+
},
|
|
136
|
+
];
|
|
80
137
|
},
|
|
81
|
-
nonEmpty: (value, condition = true) => {
|
|
138
|
+
nonEmpty: (value, condition = true, { baseLocation }) => {
|
|
82
139
|
const isEmpty = typeof value === 'undefined' || value === null || value === '';
|
|
83
|
-
|
|
140
|
+
const isValid = condition ? !isEmpty : isEmpty;
|
|
141
|
+
return isValid
|
|
142
|
+
? []
|
|
143
|
+
: [
|
|
144
|
+
{
|
|
145
|
+
message: condition ? `Should not be empty` : 'Should be empty',
|
|
146
|
+
location: baseLocation,
|
|
147
|
+
},
|
|
148
|
+
];
|
|
84
149
|
},
|
|
85
|
-
minLength: (value, condition) => {
|
|
86
|
-
if (typeof value === 'undefined')
|
|
87
|
-
return
|
|
88
|
-
return
|
|
150
|
+
minLength: (value, condition, { baseLocation }) => {
|
|
151
|
+
if (typeof value === 'undefined' || value.length >= condition)
|
|
152
|
+
return []; // property doesn't exist, no need to lint it with this assert
|
|
153
|
+
return [
|
|
154
|
+
{
|
|
155
|
+
message: `Should have at least ${condition} characters`,
|
|
156
|
+
location: baseLocation,
|
|
157
|
+
},
|
|
158
|
+
];
|
|
89
159
|
},
|
|
90
|
-
maxLength: (value, condition) => {
|
|
91
|
-
if (typeof value === 'undefined')
|
|
92
|
-
return
|
|
93
|
-
return
|
|
160
|
+
maxLength: (value, condition, { baseLocation }) => {
|
|
161
|
+
if (typeof value === 'undefined' || value.length <= condition)
|
|
162
|
+
return []; // property doesn't exist, no need to lint it with this assert
|
|
163
|
+
return [
|
|
164
|
+
{
|
|
165
|
+
message: `Should have at most ${condition} characters`,
|
|
166
|
+
location: baseLocation,
|
|
167
|
+
},
|
|
168
|
+
];
|
|
94
169
|
},
|
|
95
|
-
casing: (value, condition) => {
|
|
96
|
-
if (typeof value === 'undefined')
|
|
97
|
-
return
|
|
98
|
-
const values =
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
case 'MACRO_CASE':
|
|
115
|
-
matchCase = !!_val.match(/^([A-Z][A-Z0-9]*)(_[A-Z0-9]+)*$/g);
|
|
116
|
-
break;
|
|
117
|
-
case 'COBOL-CASE':
|
|
118
|
-
matchCase = !!_val.match(/^([A-Z][A-Z0-9]*)(-[A-Z0-9]+)*$/g);
|
|
119
|
-
break;
|
|
120
|
-
case 'flatcase':
|
|
121
|
-
matchCase = !!_val.match(/^[a-z][a-z0-9]+$/g);
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
if (!matchCase) {
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return true;
|
|
170
|
+
casing: (value, condition, { baseLocation }) => {
|
|
171
|
+
if (typeof value === 'undefined' || utils_1.isPlainObject(value))
|
|
172
|
+
return []; // property doesn't exist or is an object, no need to lint it with this assert
|
|
173
|
+
const values = Array.isArray(value) ? value : [value];
|
|
174
|
+
const casingRegexes = {
|
|
175
|
+
camelCase: /^[a-z][a-zA-Z0-9]+$/g,
|
|
176
|
+
'kebab-case': /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/g,
|
|
177
|
+
snake_case: /^([a-z][a-z0-9]*)(_[a-z0-9]+)*$/g,
|
|
178
|
+
PascalCase: /^[A-Z][a-zA-Z0-9]+$/g,
|
|
179
|
+
MACRO_CASE: /^([A-Z][A-Z0-9]*)(_[A-Z0-9]+)*$/g,
|
|
180
|
+
'COBOL-CASE': /^([A-Z][A-Z0-9]*)(-[A-Z0-9]+)*$/g,
|
|
181
|
+
flatcase: /^[a-z][a-z0-9]+$/g,
|
|
182
|
+
};
|
|
183
|
+
return values
|
|
184
|
+
.map((_val) => !_val.match(casingRegexes[condition]) && {
|
|
185
|
+
message: `"${_val}" should use ${condition}`,
|
|
186
|
+
location: utils_1.isString(value) ? baseLocation : baseLocation.child(_val).key(),
|
|
187
|
+
})
|
|
188
|
+
.filter(utils_1.isTruthy);
|
|
129
189
|
},
|
|
130
|
-
sortOrder: (value, condition) => {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
190
|
+
sortOrder: (value, condition, { baseLocation }) => {
|
|
191
|
+
const direction = condition.direction || condition;
|
|
192
|
+
const property = condition.property;
|
|
193
|
+
if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object' && !property) {
|
|
194
|
+
return [
|
|
195
|
+
{
|
|
196
|
+
message: `Please define a property to sort objects by`,
|
|
197
|
+
location: baseLocation,
|
|
198
|
+
},
|
|
199
|
+
];
|
|
200
|
+
}
|
|
201
|
+
if (typeof value === 'undefined' || utils_2.isOrdered(value, condition))
|
|
202
|
+
return [];
|
|
203
|
+
return [
|
|
204
|
+
{
|
|
205
|
+
message: `Should be sorted in ${direction === 'asc' ? 'an ascending' : 'a descending'} order${property ? ` by property ${property}` : ''}`,
|
|
206
|
+
location: baseLocation,
|
|
207
|
+
},
|
|
208
|
+
];
|
|
134
209
|
},
|
|
135
|
-
mutuallyExclusive: (value, condition) => {
|
|
136
|
-
|
|
210
|
+
mutuallyExclusive: (value, condition, { baseLocation }) => {
|
|
211
|
+
if (utils_2.getIntersectionLength(value, condition) < 2)
|
|
212
|
+
return [];
|
|
213
|
+
return [
|
|
214
|
+
{
|
|
215
|
+
message: `${condition.join(', ')} keys should be mutually exclusive`,
|
|
216
|
+
location: baseLocation.key(),
|
|
217
|
+
},
|
|
218
|
+
];
|
|
137
219
|
},
|
|
138
|
-
mutuallyRequired: (value, condition) => {
|
|
139
|
-
|
|
140
|
-
?
|
|
220
|
+
mutuallyRequired: (value, condition, { baseLocation }) => {
|
|
221
|
+
const isValid = utils_2.getIntersectionLength(value, condition) > 0
|
|
222
|
+
? utils_2.getIntersectionLength(value, condition) === condition.length
|
|
141
223
|
: true;
|
|
224
|
+
return isValid
|
|
225
|
+
? []
|
|
226
|
+
: [
|
|
227
|
+
{
|
|
228
|
+
message: `Properties ${condition.join(', ')} are mutually required`,
|
|
229
|
+
location: baseLocation.key(),
|
|
230
|
+
},
|
|
231
|
+
];
|
|
232
|
+
},
|
|
233
|
+
requireAny: (value, condition, { baseLocation }) => {
|
|
234
|
+
return utils_2.getIntersectionLength(value, condition) >= 1
|
|
235
|
+
? []
|
|
236
|
+
: [
|
|
237
|
+
{
|
|
238
|
+
message: `Should have any of ${condition.join(', ')}`,
|
|
239
|
+
location: baseLocation.key(),
|
|
240
|
+
},
|
|
241
|
+
];
|
|
242
|
+
},
|
|
243
|
+
ref: (_value, condition, { baseLocation, rawValue }) => {
|
|
244
|
+
if (typeof rawValue === 'undefined')
|
|
245
|
+
return []; // property doesn't exist, no need to lint it with this assert
|
|
246
|
+
const hasRef = rawValue.hasOwnProperty('$ref');
|
|
247
|
+
if (typeof condition === 'boolean') {
|
|
248
|
+
const isValid = condition ? hasRef : !hasRef;
|
|
249
|
+
return isValid
|
|
250
|
+
? []
|
|
251
|
+
: [
|
|
252
|
+
{
|
|
253
|
+
message: condition ? `should use $ref` : 'should not use $ref',
|
|
254
|
+
location: hasRef ? baseLocation : baseLocation.key(),
|
|
255
|
+
},
|
|
256
|
+
];
|
|
257
|
+
}
|
|
258
|
+
const regex = utils_2.regexFromString(condition);
|
|
259
|
+
const isValid = hasRef && (regex === null || regex === void 0 ? void 0 : regex.test(rawValue['$ref']));
|
|
260
|
+
return isValid
|
|
261
|
+
? []
|
|
262
|
+
: [
|
|
263
|
+
{
|
|
264
|
+
message: `$ref value should match ${condition}`,
|
|
265
|
+
location: hasRef ? baseLocation : baseLocation.key(),
|
|
266
|
+
},
|
|
267
|
+
];
|
|
142
268
|
},
|
|
143
269
|
};
|
|
270
|
+
function buildAssertCustomFunction(fn) {
|
|
271
|
+
return (value, options, ctx) => fn.call(null, value, options, ctx);
|
|
272
|
+
}
|
|
273
|
+
exports.buildAssertCustomFunction = buildAssertCustomFunction;
|