@redocly/openapi-core 1.0.0-beta.98 → 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 +12 -15
- package/lib/bundle.js +38 -15
- package/lib/config/all.d.ts +2 -2
- package/lib/config/all.js +17 -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 +8 -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.d.ts +2 -0
- package/lib/rules/common/response-contains-header.js +29 -0
- package/lib/rules/common/scalar-property-missing-example.d.ts +2 -0
- package/lib/rules/common/scalar-property-missing-example.js +42 -0
- 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 +6 -2
- package/lib/rules/oas2/index.js +16 -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-contains-property.d.ts +2 -0
- package/lib/rules/oas2/response-contains-property.js +38 -0
- 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 +24 -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-contains-property.d.ts +2 -0
- package/lib/rules/oas3/response-contains-property.js +40 -0
- 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 +139 -49
- package/lib/types/oas3_1.js +32 -26
- package/lib/types/redocly-yaml.js +414 -58
- package/lib/typings/openapi.d.ts +3 -2
- package/lib/utils.d.ts +15 -3
- package/lib/utils.js +73 -7
- 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__/__snapshots__/bundle.test.ts.snap +0 -229
- package/__tests__/bundle.test.ts +0 -132
- package/__tests__/codeframes.test.ts +0 -531
- package/__tests__/fixtures/extension.js +0 -24
- package/__tests__/fixtures/refs/definitions.yaml +0 -3
- package/__tests__/fixtures/refs/examples.yaml +0 -8
- package/__tests__/fixtures/refs/external-request-body.yaml +0 -13
- package/__tests__/fixtures/refs/externalref.yaml +0 -35
- package/__tests__/fixtures/refs/hosted.yaml +0 -35
- package/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
- package/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
- package/__tests__/fixtures/refs/param-b.yaml +0 -1
- package/__tests__/fixtures/refs/param-c.yaml +0 -1
- package/__tests__/fixtures/refs/rename.yaml +0 -1
- package/__tests__/fixtures/refs/requestBody.yaml +0 -9
- package/__tests__/fixtures/refs/schema-a.yaml +0 -1
- package/__tests__/fixtures/refs/simple.yaml +0 -1
- package/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
- package/__tests__/fixtures/resolve/External.yaml +0 -10
- package/__tests__/fixtures/resolve/External2.yaml +0 -4
- package/__tests__/fixtures/resolve/description.md +0 -3
- package/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
- package/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
- package/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
- package/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
- package/__tests__/fixtures/resolve/openapi.yaml +0 -28
- package/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
- package/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
- package/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
- package/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
- package/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
- package/__tests__/lint.test.ts +0 -17
- package/__tests__/login.test.ts +0 -17
- package/__tests__/normalizeVisitors.test.ts +0 -151
- package/__tests__/ref-utils.test.ts +0 -120
- package/__tests__/resolve-http.test.ts +0 -77
- package/__tests__/resolve.test.ts +0 -405
- package/__tests__/utils.ts +0 -86
- package/__tests__/walk.test.ts +0 -1485
- 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__/js-yaml.test.ts +0 -71
- package/src/__tests__/lint.test.ts +0 -182
- package/src/__tests__/utils.test.ts +0 -74
- 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 -371
- 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 -65
- 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 -79
- 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__/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/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__/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 -83
- 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-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__/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 -99
- 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-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 -506
- package/src/types/oas3_1.ts +0 -251
- package/src/types/redocly-yaml.ts +0 -637
- package/src/typings/common.ts +0 -9
- package/src/typings/openapi.ts +0 -297
- package/src/typings/swagger.ts +0 -236
- package/src/utils.ts +0 -190
- package/src/visitors.ts +0 -448
- package/src/walk.ts +0 -416
- package/tsconfig.json +0 -8
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -20,62 +20,87 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
20
20
|
return t;
|
|
21
21
|
};
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.resolvePreset = exports.
|
|
23
|
+
exports.resolvePreset = exports.resolveStyleguideConfig = exports.resolveApis = exports.resolvePlugins = exports.resolveConfig = void 0;
|
|
24
24
|
const path = require("path");
|
|
25
|
-
const colorette_1 = require("colorette");
|
|
26
25
|
const ref_utils_1 = require("../ref-utils");
|
|
26
|
+
const utils_1 = require("../utils");
|
|
27
27
|
const resolve_1 = require("../resolve");
|
|
28
28
|
const builtIn_1 = require("./builtIn");
|
|
29
|
-
const
|
|
30
|
-
const
|
|
29
|
+
const utils_2 = require("./utils");
|
|
30
|
+
const env_1 = require("../env");
|
|
31
|
+
const utils_3 = require("../utils");
|
|
31
32
|
const config_1 = require("./config");
|
|
33
|
+
const logger_1 = require("../logger");
|
|
34
|
+
const asserts_1 = require("../rules/common/assertions/asserts");
|
|
32
35
|
function resolveConfig(rawConfig, configPath) {
|
|
33
|
-
var _a, _b
|
|
36
|
+
var _a, _b;
|
|
34
37
|
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
-
if ((_b = (_a = rawConfig.
|
|
38
|
+
if ((_b = (_a = rawConfig.styleguide) === null || _a === void 0 ? void 0 : _a.extends) === null || _b === void 0 ? void 0 : _b.some(utils_3.isNotString)) {
|
|
36
39
|
throw new Error(`Error configuration format not detected in extends value must contain strings`);
|
|
37
40
|
}
|
|
38
|
-
const resolver = new resolve_1.BaseResolver(
|
|
39
|
-
const configExtends = (_d = (_c = rawConfig === null || rawConfig === void 0 ? void 0 : rawConfig.lint) === null || _c === void 0 ? void 0 : _c.extends) !== null && _d !== void 0 ? _d : ['recommended'];
|
|
40
|
-
const recommendedFallback = !((_e = rawConfig === null || rawConfig === void 0 ? void 0 : rawConfig.lint) === null || _e === void 0 ? void 0 : _e.extends);
|
|
41
|
-
const lintConfig = Object.assign(Object.assign({}, rawConfig === null || rawConfig === void 0 ? void 0 : rawConfig.lint), { extends: configExtends, recommendedFallback });
|
|
41
|
+
const resolver = new resolve_1.BaseResolver(utils_2.getResolveConfig(rawConfig.resolve));
|
|
42
42
|
const apis = yield resolveApis({
|
|
43
|
-
rawConfig
|
|
43
|
+
rawConfig,
|
|
44
44
|
configPath,
|
|
45
45
|
resolver,
|
|
46
46
|
});
|
|
47
|
-
const
|
|
48
|
-
|
|
47
|
+
const styleguide = yield resolveStyleguideConfig({
|
|
48
|
+
styleguideConfig: rawConfig.styleguide,
|
|
49
49
|
configPath,
|
|
50
50
|
resolver,
|
|
51
51
|
});
|
|
52
52
|
return new config_1.Config(Object.assign(Object.assign({}, rawConfig), { apis,
|
|
53
|
-
|
|
53
|
+
styleguide }), configPath);
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
56
|
exports.resolveConfig = resolveConfig;
|
|
57
57
|
function resolvePlugins(plugins, configPath = '') {
|
|
58
58
|
if (!plugins)
|
|
59
59
|
return [];
|
|
60
|
-
//
|
|
61
|
-
const requireFunc =
|
|
60
|
+
// TODO: implement or reuse Resolver approach so it will work in node and browser envs
|
|
61
|
+
const requireFunc = (plugin) => {
|
|
62
|
+
if (env_1.isBrowser && utils_3.isString(plugin)) {
|
|
63
|
+
logger_1.logger.error(`Cannot load ${plugin}. Plugins aren't supported in browser yet.`);
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
if (utils_3.isString(plugin)) {
|
|
67
|
+
try {
|
|
68
|
+
const absoltePluginPath = path.resolve(path.dirname(configPath), plugin);
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
70
|
+
// @ts-ignore
|
|
71
|
+
return typeof __webpack_require__ === 'function'
|
|
72
|
+
? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
73
|
+
// @ts-ignore
|
|
74
|
+
__non_webpack_require__(absoltePluginPath)
|
|
75
|
+
: require(absoltePluginPath);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
if (e instanceof SyntaxError) {
|
|
79
|
+
throw e;
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`Failed to load plugin "${plugin}". Please provide a valid path`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return plugin;
|
|
85
|
+
};
|
|
62
86
|
const seenPluginIds = new Map();
|
|
63
87
|
return plugins
|
|
64
88
|
.map((p) => {
|
|
65
|
-
if (
|
|
66
|
-
throw new Error(
|
|
89
|
+
if (utils_3.isString(p) && ref_utils_1.isAbsoluteUrl(p)) {
|
|
90
|
+
throw new Error(logger_1.colorize.red(`We don't support remote plugins yet.`));
|
|
67
91
|
}
|
|
68
92
|
// TODO: resolve npm packages similar to eslint
|
|
69
|
-
const pluginModule =
|
|
70
|
-
|
|
71
|
-
|
|
93
|
+
const pluginModule = requireFunc(p);
|
|
94
|
+
if (!pluginModule) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
72
97
|
const id = pluginModule.id;
|
|
73
98
|
if (typeof id !== 'string') {
|
|
74
|
-
throw new Error(
|
|
99
|
+
throw new Error(logger_1.colorize.red(`Plugin must define \`id\` property in ${logger_1.colorize.blue(p.toString())}.`));
|
|
75
100
|
}
|
|
76
101
|
if (seenPluginIds.has(id)) {
|
|
77
102
|
const pluginPath = seenPluginIds.get(id);
|
|
78
|
-
throw new Error(
|
|
103
|
+
throw new Error(logger_1.colorize.red(`Plugin "id" must be unique. Plugin ${logger_1.colorize.blue(p.toString())} uses id "${logger_1.colorize.blue(id)}" already seen in ${logger_1.colorize.blue(pluginPath)}`));
|
|
79
104
|
}
|
|
80
105
|
seenPluginIds.set(id, p.toString());
|
|
81
106
|
const plugin = Object.assign(Object.assign({ id }, (pluginModule.configs ? { configs: pluginModule.configs } : {})), (pluginModule.typeExtension ? { typeExtension: pluginModule.typeExtension } : {}));
|
|
@@ -85,10 +110,10 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
85
110
|
}
|
|
86
111
|
plugin.rules = {};
|
|
87
112
|
if (pluginModule.rules.oas3) {
|
|
88
|
-
plugin.rules.oas3 =
|
|
113
|
+
plugin.rules.oas3 = utils_2.prefixRules(pluginModule.rules.oas3, id);
|
|
89
114
|
}
|
|
90
115
|
if (pluginModule.rules.oas2) {
|
|
91
|
-
plugin.rules.oas2 =
|
|
116
|
+
plugin.rules.oas2 = utils_2.prefixRules(pluginModule.rules.oas2, id);
|
|
92
117
|
}
|
|
93
118
|
}
|
|
94
119
|
if (pluginModule.preprocessors) {
|
|
@@ -97,10 +122,10 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
97
122
|
}
|
|
98
123
|
plugin.preprocessors = {};
|
|
99
124
|
if (pluginModule.preprocessors.oas3) {
|
|
100
|
-
plugin.preprocessors.oas3 =
|
|
125
|
+
plugin.preprocessors.oas3 = utils_2.prefixRules(pluginModule.preprocessors.oas3, id);
|
|
101
126
|
}
|
|
102
127
|
if (pluginModule.preprocessors.oas2) {
|
|
103
|
-
plugin.preprocessors.oas2 =
|
|
128
|
+
plugin.preprocessors.oas2 = utils_2.prefixRules(pluginModule.preprocessors.oas2, id);
|
|
104
129
|
}
|
|
105
130
|
}
|
|
106
131
|
if (pluginModule.decorators) {
|
|
@@ -109,50 +134,53 @@ function resolvePlugins(plugins, configPath = '') {
|
|
|
109
134
|
}
|
|
110
135
|
plugin.decorators = {};
|
|
111
136
|
if (pluginModule.decorators.oas3) {
|
|
112
|
-
plugin.decorators.oas3 =
|
|
137
|
+
plugin.decorators.oas3 = utils_2.prefixRules(pluginModule.decorators.oas3, id);
|
|
113
138
|
}
|
|
114
139
|
if (pluginModule.decorators.oas2) {
|
|
115
|
-
plugin.decorators.oas2 =
|
|
140
|
+
plugin.decorators.oas2 = utils_2.prefixRules(pluginModule.decorators.oas2, id);
|
|
116
141
|
}
|
|
117
142
|
}
|
|
143
|
+
if (pluginModule.assertions) {
|
|
144
|
+
plugin.assertions = pluginModule.assertions;
|
|
145
|
+
}
|
|
118
146
|
return plugin;
|
|
119
147
|
})
|
|
120
|
-
.filter(
|
|
148
|
+
.filter(utils_3.isDefined);
|
|
121
149
|
}
|
|
122
150
|
exports.resolvePlugins = resolvePlugins;
|
|
123
151
|
function resolveApis({ rawConfig, configPath = '', resolver, }) {
|
|
124
152
|
var _a, _b;
|
|
125
153
|
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
-
const { apis = {},
|
|
127
|
-
|
|
154
|
+
const { apis = {}, styleguide: styleguideConfig = {} } = rawConfig;
|
|
155
|
+
const resolvedApis = {};
|
|
128
156
|
for (const [apiName, apiContent] of Object.entries(apis || {})) {
|
|
129
|
-
if ((_b = (_a = apiContent.
|
|
157
|
+
if ((_b = (_a = apiContent.styleguide) === null || _a === void 0 ? void 0 : _a.extends) === null || _b === void 0 ? void 0 : _b.some(utils_3.isNotString)) {
|
|
130
158
|
throw new Error(`Error configuration format not detected in extends value must contain strings`);
|
|
131
159
|
}
|
|
132
|
-
const
|
|
133
|
-
const
|
|
134
|
-
|
|
160
|
+
const rawStyleguideConfig = getMergedRawStyleguideConfig(styleguideConfig, apiContent.styleguide);
|
|
161
|
+
const resolvedApiConfig = yield resolveStyleguideConfig({
|
|
162
|
+
styleguideConfig: rawStyleguideConfig,
|
|
135
163
|
configPath,
|
|
136
164
|
resolver,
|
|
137
165
|
});
|
|
138
|
-
resolvedApis[apiName] = Object.assign(Object.assign({}, apiContent), {
|
|
166
|
+
resolvedApis[apiName] = Object.assign(Object.assign({}, apiContent), { styleguide: resolvedApiConfig });
|
|
139
167
|
}
|
|
140
168
|
return resolvedApis;
|
|
141
169
|
});
|
|
142
170
|
}
|
|
143
171
|
exports.resolveApis = resolveApis;
|
|
144
|
-
function
|
|
172
|
+
function resolveAndMergeNestedStyleguideConfig({ styleguideConfig, configPath = '', resolver = new resolve_1.BaseResolver(), }, parentConfigPaths = [], extendPaths = []) {
|
|
145
173
|
var _a, _b, _c;
|
|
146
174
|
return __awaiter(this, void 0, void 0, function* () {
|
|
147
175
|
if (parentConfigPaths.includes(configPath)) {
|
|
148
176
|
throw new Error(`Circular dependency in config file: "${configPath}"`);
|
|
149
177
|
}
|
|
150
|
-
const plugins =
|
|
151
|
-
const pluginPaths = (_a =
|
|
178
|
+
const plugins = utils_2.getUniquePlugins(resolvePlugins([...((styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.plugins) || []), builtIn_1.defaultPlugin], configPath));
|
|
179
|
+
const pluginPaths = (_a = styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.plugins) === null || _a === void 0 ? void 0 : _a.filter(utils_3.isString).map((p) => path.resolve(path.dirname(configPath), p));
|
|
152
180
|
const resolvedConfigPath = ref_utils_1.isAbsoluteUrl(configPath)
|
|
153
181
|
? configPath
|
|
154
182
|
: configPath && path.resolve(configPath);
|
|
155
|
-
const extendConfigs = yield Promise.all(((_b =
|
|
183
|
+
const extendConfigs = yield Promise.all(((_b = styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.extends) === null || _b === void 0 ? void 0 : _b.map((presetItem) => __awaiter(this, void 0, void 0, function* () {
|
|
156
184
|
if (!ref_utils_1.isAbsoluteUrl(presetItem) && !path.extname(presetItem)) {
|
|
157
185
|
return resolvePreset(presetItem, plugins);
|
|
158
186
|
}
|
|
@@ -161,63 +189,65 @@ function resolveAndMergeNestedLint({ lintConfig, configPath = '', resolver = new
|
|
|
161
189
|
: ref_utils_1.isAbsoluteUrl(configPath)
|
|
162
190
|
? new URL(presetItem, configPath).href
|
|
163
191
|
: path.resolve(path.dirname(configPath), presetItem);
|
|
164
|
-
const
|
|
165
|
-
return yield
|
|
166
|
-
|
|
192
|
+
const extendedStyleguideConfig = yield loadExtendStyleguideConfig(pathItem, resolver);
|
|
193
|
+
return yield resolveAndMergeNestedStyleguideConfig({
|
|
194
|
+
styleguideConfig: extendedStyleguideConfig,
|
|
167
195
|
configPath: pathItem,
|
|
168
196
|
resolver: resolver,
|
|
169
197
|
}, [...parentConfigPaths, resolvedConfigPath], extendPaths);
|
|
170
198
|
}))) || []);
|
|
171
|
-
const _d =
|
|
199
|
+
const _d = utils_2.mergeExtends([
|
|
172
200
|
...extendConfigs,
|
|
173
|
-
Object.assign(Object.assign({},
|
|
174
|
-
]), { plugins: mergedPlugins = [] } = _d,
|
|
175
|
-
return Object.assign(Object.assign({},
|
|
201
|
+
Object.assign(Object.assign({}, styleguideConfig), { plugins, extends: undefined, extendPaths: [...parentConfigPaths, resolvedConfigPath], pluginPaths }),
|
|
202
|
+
]), { plugins: mergedPlugins = [] } = _d, styleguide = __rest(_d, ["plugins"]);
|
|
203
|
+
return Object.assign(Object.assign({}, styleguide), { extendPaths: (_c = styleguide.extendPaths) === null || _c === void 0 ? void 0 : _c.filter((path) => path && !ref_utils_1.isAbsoluteUrl(path)), plugins: utils_2.getUniquePlugins(mergedPlugins), recommendedFallback: styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.recommendedFallback, doNotResolveExamples: styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.doNotResolveExamples });
|
|
176
204
|
});
|
|
177
205
|
}
|
|
178
|
-
function
|
|
206
|
+
function resolveStyleguideConfig(opts, parentConfigPaths = [], extendPaths = []) {
|
|
179
207
|
return __awaiter(this, void 0, void 0, function* () {
|
|
180
|
-
const
|
|
181
|
-
return Object.assign(Object.assign({},
|
|
208
|
+
const resolvedStyleguideConfig = yield resolveAndMergeNestedStyleguideConfig(opts, parentConfigPaths, extendPaths);
|
|
209
|
+
return Object.assign(Object.assign({}, resolvedStyleguideConfig), { rules: resolvedStyleguideConfig.rules && groupStyleguideAssertionRules(resolvedStyleguideConfig) });
|
|
182
210
|
});
|
|
183
211
|
}
|
|
184
|
-
exports.
|
|
212
|
+
exports.resolveStyleguideConfig = resolveStyleguideConfig;
|
|
185
213
|
function resolvePreset(presetName, plugins) {
|
|
186
214
|
var _a;
|
|
187
|
-
const { pluginId, configName } =
|
|
215
|
+
const { pluginId, configName } = utils_2.parsePresetName(presetName);
|
|
188
216
|
const plugin = plugins.find((p) => p.id === pluginId);
|
|
189
217
|
if (!plugin) {
|
|
190
|
-
throw new Error(`Invalid config ${
|
|
218
|
+
throw new Error(`Invalid config ${logger_1.colorize.red(presetName)}: plugin ${pluginId} is not included.`);
|
|
191
219
|
}
|
|
192
220
|
const preset = (_a = plugin.configs) === null || _a === void 0 ? void 0 : _a[configName];
|
|
193
221
|
if (!preset) {
|
|
194
222
|
throw new Error(pluginId
|
|
195
|
-
? `Invalid config ${
|
|
196
|
-
: `Invalid config ${
|
|
223
|
+
? `Invalid config ${logger_1.colorize.red(presetName)}: plugin ${pluginId} doesn't export config with name ${configName}.`
|
|
224
|
+
: `Invalid config ${logger_1.colorize.red(presetName)}: there is no such built-in config.`);
|
|
197
225
|
}
|
|
198
226
|
return preset;
|
|
199
227
|
}
|
|
200
228
|
exports.resolvePreset = resolvePreset;
|
|
201
|
-
function
|
|
229
|
+
function loadExtendStyleguideConfig(filePath, resolver) {
|
|
202
230
|
return __awaiter(this, void 0, void 0, function* () {
|
|
203
231
|
try {
|
|
204
232
|
const fileSource = yield resolver.loadExternalRef(filePath);
|
|
205
|
-
const rawConfig =
|
|
206
|
-
if (!rawConfig.
|
|
207
|
-
throw new Error(`
|
|
233
|
+
const rawConfig = utils_2.transformConfig(utils_3.parseYaml(fileSource.body));
|
|
234
|
+
if (!rawConfig.styleguide) {
|
|
235
|
+
throw new Error(`Styleguide configuration format not detected: "${filePath}"`);
|
|
208
236
|
}
|
|
209
|
-
return rawConfig.
|
|
237
|
+
return rawConfig.styleguide;
|
|
210
238
|
}
|
|
211
239
|
catch (error) {
|
|
212
240
|
throw new Error(`Failed to load "${filePath}": ${error.message}`);
|
|
213
241
|
}
|
|
214
242
|
});
|
|
215
243
|
}
|
|
216
|
-
function
|
|
217
|
-
const resultLint = Object.assign(Object.assign(Object.assign({},
|
|
244
|
+
function getMergedRawStyleguideConfig(rootStyleguideConfig, apiStyleguideConfig) {
|
|
245
|
+
const resultLint = Object.assign(Object.assign(Object.assign({}, rootStyleguideConfig), utils_1.pickDefined(apiStyleguideConfig)), { rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.rules), oas2Rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas2Rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas2Rules), oas3_0Rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_0Rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_0Rules), oas3_1Rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_1Rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_1Rules), preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.preprocessors), oas2Preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas2Preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas2Preprocessors), oas3_0Preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_0Preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_0Preprocessors), oas3_1Preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_1Preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_1Preprocessors), decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.decorators), oas2Decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas2Decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas2Decorators), oas3_0Decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_0Decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_0Decorators), oas3_1Decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_1Decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_1Decorators), recommendedFallback: (apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.extends)
|
|
246
|
+
? false
|
|
247
|
+
: rootStyleguideConfig.recommendedFallback });
|
|
218
248
|
return resultLint;
|
|
219
249
|
}
|
|
220
|
-
function
|
|
250
|
+
function groupStyleguideAssertionRules({ rules, plugins, }) {
|
|
221
251
|
if (!rules) {
|
|
222
252
|
return rules;
|
|
223
253
|
}
|
|
@@ -226,9 +256,19 @@ function groupLintAssertionRules(rules) {
|
|
|
226
256
|
// Collect assertion rules
|
|
227
257
|
const assertions = [];
|
|
228
258
|
for (const [ruleKey, rule] of Object.entries(rules)) {
|
|
229
|
-
|
|
259
|
+
// keep the old assert/ syntax as an alias
|
|
260
|
+
if ((ruleKey.startsWith('rule/') || ruleKey.startsWith('assert/')) &&
|
|
261
|
+
typeof rule === 'object' &&
|
|
262
|
+
rule !== null) {
|
|
230
263
|
const assertion = rule;
|
|
231
|
-
|
|
264
|
+
if (plugins) {
|
|
265
|
+
registerCustomAssertions(plugins, assertion);
|
|
266
|
+
// We may have custom assertion inside where block
|
|
267
|
+
for (const context of assertion.where || []) {
|
|
268
|
+
registerCustomAssertions(plugins, context);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
assertions.push(Object.assign(Object.assign({}, assertion), { assertionId: ruleKey }));
|
|
232
272
|
}
|
|
233
273
|
else {
|
|
234
274
|
// If it's not an assertion, keep it as is
|
|
@@ -240,3 +280,18 @@ function groupLintAssertionRules(rules) {
|
|
|
240
280
|
}
|
|
241
281
|
return transformedRules;
|
|
242
282
|
}
|
|
283
|
+
function registerCustomAssertions(plugins, assertion) {
|
|
284
|
+
for (const field of utils_3.keysOf(assertion.assertions)) {
|
|
285
|
+
const [pluginId, fn] = field.split('/');
|
|
286
|
+
if (!pluginId || !fn)
|
|
287
|
+
continue;
|
|
288
|
+
const plugin = plugins.find((plugin) => plugin.id === pluginId);
|
|
289
|
+
if (!plugin) {
|
|
290
|
+
throw Error(logger_1.colorize.red(`Plugin ${logger_1.colorize.blue(pluginId)} isn't found.`));
|
|
291
|
+
}
|
|
292
|
+
if (!plugin.assertions || !plugin.assertions[fn]) {
|
|
293
|
+
throw Error(`Plugin ${logger_1.colorize.red(pluginId)} doesn't export assertions function with name ${logger_1.colorize.red(fn)}.`);
|
|
294
|
+
}
|
|
295
|
+
asserts_1.asserts[field] = asserts_1.buildAssertCustomFunction(plugin.assertions[fn]);
|
|
296
|
+
}
|
|
297
|
+
}
|
package/lib/config/config.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
import { NormalizedProblem } from '../walk';
|
|
3
2
|
import { OasVersion, OasMajorVersion, Oas2RuleSet, Oas3RuleSet } from '../oas-types';
|
|
4
3
|
import type { NodeType } from '../types';
|
|
5
|
-
import type { DecoratorConfig, Plugin, PreprocessorConfig, Region, ResolveConfig, ResolvedApi, ResolvedConfig,
|
|
6
|
-
export declare const env: NodeJS.ProcessEnv;
|
|
4
|
+
import type { DecoratorConfig, Plugin, PreprocessorConfig, Region, ResolveConfig, ResolvedApi, ResolvedConfig, ResolvedStyleguideConfig, RuleConfig, RuleSettings, Telemetry, ThemeRawConfig } from './types';
|
|
7
5
|
export declare const IGNORE_FILE = ".redocly.lint-ignore.yaml";
|
|
8
6
|
export declare const DEFAULT_REGION = "us";
|
|
9
7
|
export declare const DOMAINS: {
|
|
@@ -11,8 +9,8 @@ export declare const DOMAINS: {
|
|
|
11
9
|
eu: string;
|
|
12
10
|
};
|
|
13
11
|
export declare const AVAILABLE_REGIONS: Region[];
|
|
14
|
-
export declare class
|
|
15
|
-
rawConfig:
|
|
12
|
+
export declare class StyleguideConfig {
|
|
13
|
+
rawConfig: ResolvedStyleguideConfig;
|
|
16
14
|
configFile?: string | undefined;
|
|
17
15
|
plugins: Plugin[];
|
|
18
16
|
ignore: Record<string, Record<string, Set<string>>>;
|
|
@@ -25,20 +23,15 @@ export declare class LintConfig {
|
|
|
25
23
|
recommendedFallback: boolean;
|
|
26
24
|
extendPaths: string[];
|
|
27
25
|
pluginPaths: string[];
|
|
28
|
-
constructor(rawConfig:
|
|
26
|
+
constructor(rawConfig: ResolvedStyleguideConfig, configFile?: string | undefined);
|
|
27
|
+
resolveIgnore(ignoreFile?: string): void;
|
|
29
28
|
saveIgnore(): void;
|
|
30
29
|
addIgnore(problem: NormalizedProblem): void;
|
|
31
30
|
addProblemToIgnore(problem: NormalizedProblem): NormalizedProblem;
|
|
32
31
|
extendTypes(types: Record<string, NodeType>, version: OasVersion): Record<string, NodeType>;
|
|
33
|
-
getRuleSettings(ruleId: string, oasVersion: OasVersion):
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
getPreprocessorSettings(ruleId: string, oasVersion: OasVersion): {
|
|
37
|
-
severity: import("../walk").ProblemSeverity | "off";
|
|
38
|
-
};
|
|
39
|
-
getDecoratorSettings(ruleId: string, oasVersion: OasVersion): {
|
|
40
|
-
severity: import("../walk").ProblemSeverity | "off";
|
|
41
|
-
};
|
|
32
|
+
getRuleSettings(ruleId: string, oasVersion: OasVersion): RuleSettings;
|
|
33
|
+
getPreprocessorSettings(ruleId: string, oasVersion: OasVersion): RuleSettings;
|
|
34
|
+
getDecoratorSettings(ruleId: string, oasVersion: OasVersion): RuleSettings;
|
|
42
35
|
getUnusedRules(): {
|
|
43
36
|
rules: string[];
|
|
44
37
|
preprocessors: string[];
|
|
@@ -53,12 +46,13 @@ export declare class Config {
|
|
|
53
46
|
rawConfig: ResolvedConfig;
|
|
54
47
|
configFile?: string | undefined;
|
|
55
48
|
apis: Record<string, ResolvedApi>;
|
|
56
|
-
|
|
49
|
+
styleguide: StyleguideConfig;
|
|
57
50
|
resolve: ResolveConfig;
|
|
58
51
|
licenseKey?: string;
|
|
59
52
|
region?: Region;
|
|
60
|
-
|
|
61
|
-
'features.mockServer'?: Record<string, any>;
|
|
53
|
+
theme: ThemeRawConfig;
|
|
62
54
|
organization?: string;
|
|
55
|
+
files: string[];
|
|
56
|
+
telemetry?: Telemetry;
|
|
63
57
|
constructor(rawConfig: ResolvedConfig, configFile?: string | undefined);
|
|
64
58
|
}
|
package/lib/config/config.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Config = exports.
|
|
3
|
+
exports.Config = exports.StyleguideConfig = exports.AVAILABLE_REGIONS = exports.DOMAINS = exports.DEFAULT_REGION = exports.IGNORE_FILE = void 0;
|
|
4
4
|
const fs = require("fs");
|
|
5
5
|
const path = require("path");
|
|
6
6
|
const js_yaml_1 = require("../js-yaml");
|
|
7
7
|
const utils_1 = require("../utils");
|
|
8
8
|
const oas_types_1 = require("../oas-types");
|
|
9
|
+
const env_1 = require("../env");
|
|
9
10
|
const utils_2 = require("./utils");
|
|
10
|
-
|
|
11
|
-
exports.env = typeof process !== 'undefined' ? process.env || {} : {};
|
|
11
|
+
const ref_utils_1 = require("../ref-utils");
|
|
12
12
|
exports.IGNORE_FILE = '.redocly.lint-ignore.yaml';
|
|
13
13
|
const IGNORE_BANNER = `# This file instructs Redocly's linter to ignore the rules contained for specific parts of your API.\n` +
|
|
14
14
|
`# See https://redoc.ly/docs/cli/ for more information.\n`;
|
|
@@ -19,7 +19,7 @@ function getDomains() {
|
|
|
19
19
|
eu: 'eu.redocly.com',
|
|
20
20
|
};
|
|
21
21
|
// FIXME: temporary fix for our lab environments
|
|
22
|
-
const domain =
|
|
22
|
+
const domain = env_1.env.REDOCLY_DOMAIN;
|
|
23
23
|
if (domain === null || domain === void 0 ? void 0 : domain.endsWith('.redocly.host')) {
|
|
24
24
|
domains[domain.split('.')[0]] = domain;
|
|
25
25
|
}
|
|
@@ -28,9 +28,19 @@ function getDomains() {
|
|
|
28
28
|
}
|
|
29
29
|
return domains;
|
|
30
30
|
}
|
|
31
|
+
function getIgnoreFilePath(configFile) {
|
|
32
|
+
if (configFile) {
|
|
33
|
+
return utils_1.doesYamlFileExist(configFile)
|
|
34
|
+
? path.join(path.dirname(configFile), exports.IGNORE_FILE)
|
|
35
|
+
: path.join(configFile, exports.IGNORE_FILE);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return env_1.isBrowser ? undefined : path.join(process.cwd(), exports.IGNORE_FILE);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
31
41
|
exports.DOMAINS = getDomains();
|
|
32
42
|
exports.AVAILABLE_REGIONS = Object.keys(exports.DOMAINS);
|
|
33
|
-
class
|
|
43
|
+
class StyleguideConfig {
|
|
34
44
|
constructor(rawConfig, configFile) {
|
|
35
45
|
this.rawConfig = rawConfig;
|
|
36
46
|
this.configFile = configFile;
|
|
@@ -57,21 +67,20 @@ class LintConfig {
|
|
|
57
67
|
};
|
|
58
68
|
this.extendPaths = rawConfig.extendPaths || [];
|
|
59
69
|
this.pluginPaths = rawConfig.pluginPaths || [];
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
for (const
|
|
71
|
-
this.ignore[
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
70
|
+
this.resolveIgnore(getIgnoreFilePath(configFile));
|
|
71
|
+
}
|
|
72
|
+
resolveIgnore(ignoreFile) {
|
|
73
|
+
if (!ignoreFile || !utils_1.doesYamlFileExist(ignoreFile))
|
|
74
|
+
return;
|
|
75
|
+
this.ignore =
|
|
76
|
+
js_yaml_1.parseYaml(fs.readFileSync(ignoreFile, 'utf-8')) || {};
|
|
77
|
+
// resolve ignore paths
|
|
78
|
+
for (const fileName of Object.keys(this.ignore)) {
|
|
79
|
+
this.ignore[ref_utils_1.isAbsoluteUrl(fileName) ? fileName : path.resolve(path.dirname(ignoreFile), fileName)] = this.ignore[fileName];
|
|
80
|
+
for (const ruleId of Object.keys(this.ignore[fileName])) {
|
|
81
|
+
this.ignore[fileName][ruleId] = new Set(this.ignore[fileName][ruleId]);
|
|
82
|
+
}
|
|
83
|
+
if (!ref_utils_1.isAbsoluteUrl(fileName)) {
|
|
75
84
|
delete this.ignore[fileName];
|
|
76
85
|
}
|
|
77
86
|
}
|
|
@@ -81,8 +90,10 @@ class LintConfig {
|
|
|
81
90
|
const ignoreFile = path.join(dir, exports.IGNORE_FILE);
|
|
82
91
|
const mapped = {};
|
|
83
92
|
for (const absFileName of Object.keys(this.ignore)) {
|
|
84
|
-
const
|
|
85
|
-
|
|
93
|
+
const mappedDefinitionName = ref_utils_1.isAbsoluteUrl(absFileName)
|
|
94
|
+
? absFileName
|
|
95
|
+
: utils_1.slash(path.relative(dir, absFileName));
|
|
96
|
+
const ignoredRules = (mapped[mappedDefinitionName] = this.ignore[absFileName]);
|
|
86
97
|
for (const ruleId of Object.keys(ignoredRules)) {
|
|
87
98
|
ignoredRules[ruleId] = Array.from(ignoredRules[ruleId]);
|
|
88
99
|
}
|
|
@@ -118,10 +129,12 @@ class LintConfig {
|
|
|
118
129
|
if (!plugin.typeExtension.oas3)
|
|
119
130
|
continue;
|
|
120
131
|
extendedTypes = plugin.typeExtension.oas3(extendedTypes, version);
|
|
132
|
+
break;
|
|
121
133
|
case oas_types_1.OasVersion.Version2:
|
|
122
134
|
if (!plugin.typeExtension.oas2)
|
|
123
135
|
continue;
|
|
124
136
|
extendedTypes = plugin.typeExtension.oas2(extendedTypes, version);
|
|
137
|
+
break;
|
|
125
138
|
default:
|
|
126
139
|
throw new Error('Not implemented');
|
|
127
140
|
}
|
|
@@ -186,12 +199,14 @@ class LintConfig {
|
|
|
186
199
|
getRulesForOasVersion(version) {
|
|
187
200
|
switch (version) {
|
|
188
201
|
case oas_types_1.OasMajorVersion.Version3:
|
|
202
|
+
// eslint-disable-next-line no-case-declarations
|
|
189
203
|
const oas3Rules = []; // default ruleset
|
|
190
204
|
this.plugins.forEach((p) => { var _a; return ((_a = p.preprocessors) === null || _a === void 0 ? void 0 : _a.oas3) && oas3Rules.push(p.preprocessors.oas3); });
|
|
191
205
|
this.plugins.forEach((p) => { var _a; return ((_a = p.rules) === null || _a === void 0 ? void 0 : _a.oas3) && oas3Rules.push(p.rules.oas3); });
|
|
192
206
|
this.plugins.forEach((p) => { var _a; return ((_a = p.decorators) === null || _a === void 0 ? void 0 : _a.oas3) && oas3Rules.push(p.decorators.oas3); });
|
|
193
207
|
return oas3Rules;
|
|
194
208
|
case oas_types_1.OasMajorVersion.Version2:
|
|
209
|
+
// eslint-disable-next-line no-case-declarations
|
|
195
210
|
const oas2Rules = []; // default ruleset
|
|
196
211
|
this.plugins.forEach((p) => { var _a; return ((_a = p.preprocessors) === null || _a === void 0 ? void 0 : _a.oas2) && oas2Rules.push(p.preprocessors.oas2); });
|
|
197
212
|
this.plugins.forEach((p) => { var _a; return ((_a = p.rules) === null || _a === void 0 ? void 0 : _a.oas2) && oas2Rules.push(p.rules.oas2); });
|
|
@@ -227,18 +242,19 @@ class LintConfig {
|
|
|
227
242
|
}
|
|
228
243
|
}
|
|
229
244
|
}
|
|
230
|
-
exports.
|
|
245
|
+
exports.StyleguideConfig = StyleguideConfig;
|
|
231
246
|
class Config {
|
|
232
247
|
constructor(rawConfig, configFile) {
|
|
233
248
|
this.rawConfig = rawConfig;
|
|
234
249
|
this.configFile = configFile;
|
|
235
250
|
this.apis = rawConfig.apis || {};
|
|
236
|
-
this.
|
|
237
|
-
this
|
|
238
|
-
this['features.mockServer'] = rawConfig['features.mockServer'] || {};
|
|
251
|
+
this.styleguide = new StyleguideConfig(rawConfig.styleguide || {}, configFile);
|
|
252
|
+
this.theme = rawConfig.theme || {};
|
|
239
253
|
this.resolve = utils_2.getResolveConfig(rawConfig === null || rawConfig === void 0 ? void 0 : rawConfig.resolve);
|
|
240
254
|
this.region = rawConfig.region;
|
|
241
255
|
this.organization = rawConfig.organization;
|
|
256
|
+
this.files = rawConfig.files || [];
|
|
257
|
+
this.telemetry = rawConfig.telemetry;
|
|
242
258
|
}
|
|
243
259
|
}
|
|
244
260
|
exports.Config = Config;
|
package/lib/config/load.d.ts
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import { Config } from './config';
|
|
2
|
-
import type { RawConfig } from './types';
|
|
3
|
-
|
|
2
|
+
import type { RawConfig, Region } from './types';
|
|
3
|
+
import { RegionalTokenWithValidity } from '../redocly/redocly-client-types';
|
|
4
|
+
export declare function loadConfig(options?: {
|
|
5
|
+
configPath?: string;
|
|
6
|
+
customExtends?: string[];
|
|
7
|
+
processRawConfig?: (rawConfig: RawConfig) => void | Promise<void>;
|
|
8
|
+
files?: string[];
|
|
9
|
+
region?: Region;
|
|
10
|
+
}): Promise<Config>;
|
|
4
11
|
export declare const CONFIG_FILE_NAMES: string[];
|
|
5
12
|
export declare function findConfig(dir?: string): string | undefined;
|
|
6
|
-
export declare function getConfig(configPath?: string | undefined): Promise<RawConfig>;
|
|
13
|
+
export declare function getConfig(configPath?: string | undefined, processRawConfig?: (rawConfig: RawConfig) => void | Promise<void>): Promise<RawConfig>;
|
|
14
|
+
declare type CreateConfigOptions = {
|
|
15
|
+
extends?: string[];
|
|
16
|
+
tokens?: RegionalTokenWithValidity[];
|
|
17
|
+
};
|
|
18
|
+
export declare function createConfig(config: string | RawConfig, options?: CreateConfigOptions): Promise<Config>;
|
|
19
|
+
export {};
|