From cb32ca386104e5b85e59d9294534e574be0143d7 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Mon, 24 Feb 2025 09:00:15 -0400 Subject: [PATCH] [WIP] Add Spotlight Spectral schemas Signed-off-by: Juan Cruz Viotti --- DEPENDENCIES | 1 + configuration.json | 4 + vendor/spectral-6-14-3.mask | 73 ++++++ vendor/spectral-6-14-3/packages/core/LICENSE | 190 ++++++++++++++++ .../core/src/ruleset/meta/js-extensions.json | 64 ++++++ .../src/ruleset/meta/json-extensions.json | 64 ++++++ .../core/src/ruleset/meta/rule.schema.json | 104 +++++++++ .../core/src/ruleset/meta/ruleset.schema.json | 207 ++++++++++++++++++ .../core/src/ruleset/meta/shared.json | 75 +++++++ 9 files changed, 782 insertions(+) create mode 100644 vendor/spectral-6-14-3.mask create mode 100644 vendor/spectral-6-14-3/packages/core/LICENSE create mode 100644 vendor/spectral-6-14-3/packages/core/src/ruleset/meta/js-extensions.json create mode 100644 vendor/spectral-6-14-3/packages/core/src/ruleset/meta/json-extensions.json create mode 100644 vendor/spectral-6-14-3/packages/core/src/ruleset/meta/rule.schema.json create mode 100644 vendor/spectral-6-14-3/packages/core/src/ruleset/meta/ruleset.schema.json create mode 100644 vendor/spectral-6-14-3/packages/core/src/ruleset/meta/shared.json diff --git a/DEPENDENCIES b/DEPENDENCIES index ee8f4e8..a4c961d 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -52,3 +52,4 @@ asyncapi https://github.com/asyncapi/spec-json-schemas v6.8.1 ninjs https://github.com/iptc/newsinjson v3.0.1 apis-json https://github.com/apis-json/api-json 0f64ef6a17a01f54d6bf8e67e001aec9d4bd6b27 vacuum-0-16-3 https://github.com/daveshanley/vacuum v0.16.3 +spectral-6-14-3 https://github.com/stoplightio/spectral v6.14.3 diff --git a/configuration.json b/configuration.json index 8147a8c..9dc0ea4 100644 --- a/configuration.json +++ b/configuration.json @@ -446,6 +446,10 @@ "pb33f/vacuum/v0.16.3": { "base": "https://quobix.com/vacuum/schemas", "path": "./vendor/vacuum-0-16-3" + }, + "spotlight/spectral/v6.14.3": { + "base": "@stoplight/spectral-core/meta", + "path": "./vendor/spectral-6-14-3" } } } diff --git a/vendor/spectral-6-14-3.mask b/vendor/spectral-6-14-3.mask new file mode 100644 index 0000000..7c19a24 --- /dev/null +++ b/vendor/spectral-6-14-3.mask @@ -0,0 +1,73 @@ +.circleci/ +.devcontainer/ +.husky/ +.vscode/ +.yarn/ +__karma__/ +__mocks__/ +docs/ +hooks/ +patches/ +scripts/ +test-harness/ +test-utils/ +.dockerignore +.editorconfig +.eslintignore +.eslintrc +.nvmrc +.prettierrc.json +.stoplight.json +.swcrc +.yarnrc.yml +CHANGELOG.md +commitlint.config.js +CONTRIBUTING.md +Dockerfile +jest.config.mjs +karma.conf.ts +package.json +LICENSE +README.md +toc.json +tsconfig.build.json +tsconfig.eslint.json +tsconfig.json +yarn.lock +packages/cli/ +packages/formats/ +packages/formatters/ +packages/functions/ +packages/parsers/ +packages/ref-resolver/ +packages/ruleset-bundler/ +packages/ruleset-migrator/ +packages/rulesets/ +packages/runtime/ +packages/core/CHANGELOG.md +packages/core/package.json +packages/core/tsconfig.build.json +packages/core/src/__tests__/ +packages/core/src/guards/ +packages/core/src/runner/ +packages/core/src/types/ +packages/core/src/utils/ +packages/core/src/consts.ts +packages/core/src/document.ts +packages/core/src/documentInventory.ts +packages/core/src/errorMessages.ts +packages/core/src/index.ts +packages/core/src/spectral.ts +packages/core/src/ruleset/__tests__/ +packages/core/src/ruleset/mergers/ +packages/core/src/ruleset/utils/ +packages/core/src/ruleset/validation/ +packages/core/src/ruleset/alias.ts +packages/core/src/ruleset/format.ts +packages/core/src/ruleset/formats.ts +packages/core/src/ruleset/function.ts +packages/core/src/ruleset/index.ts +packages/core/src/ruleset/rule.ts +packages/core/src/ruleset/ruleset.ts +packages/core/src/ruleset/types.ts +packages/core/src/ruleset/meta/js-extensions.json diff --git a/vendor/spectral-6-14-3/packages/core/LICENSE b/vendor/spectral-6-14-3/packages/core/LICENSE new file mode 100644 index 0000000..ba50e46 --- /dev/null +++ b/vendor/spectral-6-14-3/packages/core/LICENSE @@ -0,0 +1,190 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2018 Stoplight, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/js-extensions.json b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/js-extensions.json new file mode 100644 index 0000000..e6c717d --- /dev/null +++ b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/js-extensions.json @@ -0,0 +1,64 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "@stoplight/spectral-core/meta/extensions", + "$defs": { + "Extends": { + "$anchor": "extends", + "oneOf": [ + { + "$id": "ruleset", + "$ref": "ruleset.schema#", + "errorMessage": "must be a valid ruleset" + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "ruleset" + }, + { + "type": "array", + "minItems": 2, + "additionalItems": false, + "items": [ + { + "$ref": "ruleset" + }, + { + "type": "string", + "enum": ["off", "recommended", "all"], + "errorMessage": "allowed types are \"off\", \"recommended\" and \"all\"" + } + ] + } + ] + } + } + ], + "errorMessage": "must be a valid ruleset" + }, + "Format": { + "$anchor": "format", + "x-spectral-runtime": "format", + "errorMessage": "must be a valid format" + }, + "Function": { + "$anchor": "function", + "x-spectral-runtime": "ruleset-function", + "type": "object", + "properties": { + "function": true + }, + "required": ["function"] + }, + "Functions": { + "$anchor": "functions", + "not": {} + }, + "FunctionsDir": { + "$anchor": "functionsDir", + "not": {} + } + } +} diff --git a/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/json-extensions.json b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/json-extensions.json new file mode 100644 index 0000000..f3c6186 --- /dev/null +++ b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/json-extensions.json @@ -0,0 +1,64 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "@stoplight/spectral-core/meta/extensions", + "$defs": { + "Extends": { + "$anchor": "extends", + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "minItems": 2, + "additionalItems": false, + "items": [ + { + "type": "string" + }, + { + "enum": ["all", "recommended", "off"], + "errorMessage": "allowed types are \"off\", \"recommended\" and \"all\"" + } + ] + } + ] + } + } + ] + }, + "Format": { + "$anchor": "format", + "type": "string", + "errorMessage": "must be a valid format" + }, + "Functions": { + "$anchor": "functions", + "type": "array", + "items": { + "type": "string" + } + }, + "FunctionsDir": { + "$anchor": "functionsDir", + "type": "string" + }, + "Function": { + "$anchor": "function", + "type": "object", + "properties": { + "function": { + "type": "string" + } + }, + "required": ["function"] + } + } +} diff --git a/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/rule.schema.json b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/rule.schema.json new file mode 100644 index 0000000..d5c0700 --- /dev/null +++ b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/rule.schema.json @@ -0,0 +1,104 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "@stoplight/spectral-core/meta/rule.schema", + "$defs": { + "Then": { + "type": "object", + "allOf": [ + { + "properties": { + "field": { + "type": "string" + } + } + }, + { + "$ref": "extensions#function" + } + ] + }, + "Severity": { + "$ref": "shared#severity" + } + }, + "if": { + "type": "object" + }, + "then": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "documentationUrl": { + "type": "string", + "format": "url", + "errorMessage": "must be a valid URL" + }, + "recommended": { + "type": "boolean" + }, + "given": { + "$ref": "shared#given" + }, + "resolved": { + "type": "boolean" + }, + "severity": { + "$ref": "#/$defs/Severity" + }, + "message": { + "type": "string" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "formats": { + "$ref": "shared#formats" + }, + "then": { + "if": { + "type": "array" + }, + "then": { + "type": "array", + "items": { + "$ref": "#/$defs/Then" + } + }, + "else": { + "$ref": "#/$defs/Then" + } + }, + "type": { + "enum": ["style", "validation"], + "type": "string", + "errorMessage": "allowed types are \"style\" and \"validation\"" + }, + "extensions": { + "type": "object" + } + }, + "required": ["given", "then"], + "additionalProperties": false, + "patternProperties": { + "^x-": true + }, + "errorMessage": { + "required": "the rule must have at least \"given\" and \"then\" properties" + } + }, + "else": { + "oneOf": [ + { + "$ref": "shared#/$defs/HumanReadableSeverity" + }, + { + "type": "boolean" + } + ] + } +} diff --git a/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/ruleset.schema.json b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/ruleset.schema.json new file mode 100644 index 0000000..6fc6fcc --- /dev/null +++ b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/ruleset.schema.json @@ -0,0 +1,207 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "@stoplight/spectral-core/meta/ruleset.schema", + "type": "object", + "additionalProperties": false, + "properties": { + "documentationUrl": { + "type": "string", + "format": "url", + "errorMessage": "must be a valid URL" + }, + "description": { + "type": "string" + }, + "rules": { + "type": "object", + "additionalProperties": { + "$ref": "rule.schema#" + } + }, + "functions": { + "$ref": "extensions#functions" + }, + "functionsDir": { + "$ref": "extensions#functionsDir" + }, + "formats": { + "$ref": "shared#formats" + }, + "extends": { + "$ref": "extensions#extends" + }, + "parserOptions": { + "type": "object", + "properties": { + "duplicateKeys": { + "$ref": "shared#severity" + }, + "incompatibleValues": { + "$ref": "shared#severity" + } + }, + "additionalProperties": false + }, + "overrides": { + "type": "array", + "minItems": 1, + "items": { + "if": { + "type": "object", + "properties": { + "files": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1, + "pattern": "^[^#]+#" + }, + "errorMessage": "must be an non-empty array of glob patterns" + } + }, + "required": ["files"] + }, + "then": { + "type": "object", + "properties": { + "files": true, + "rules": { + "type": "object", + "additionalProperties": { + "$ref": "shared#severity" + }, + "errorMessage": { + "enum": "must be a valid severity level" + } + } + }, + "required": ["rules"], + "additionalProperties": false, + "errorMessage": { + "required": "must contain rules when JSON Pointers are defined", + "additionalProperties": "must not override any other property than rules when JSON Pointers are defined" + } + }, + "else": { + "allOf": [ + { + "type": "object", + "properties": { + "files": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "pattern": "[^#]", + "minLength": 1 + }, + "errorMessage": "must be an non-empty array of glob patterns" + } + }, + "required": ["files"], + "errorMessage": { + "type": "must be an override, i.e. { \"files\": [\"v2/**/*.json\"], \"rules\": {} }" + } + }, + { + "type": "object", + "properties": { + "formats": { + "$ref": "shared#formats" + }, + "extends": { + "$ref": "#/properties/extends" + }, + "rules": { + "$ref": "#/properties/rules" + }, + "parserOptions": { + "$ref": "#/properties/parserOptions" + }, + "aliases": { + "$ref": "#/properties/aliases" + } + }, + "anyOf": [ + { + "required": ["extends"] + }, + { + "required": ["rules"] + } + ] + } + ] + } + }, + "errorMessage": { + "minItems": "must not be empty" + } + }, + "aliases": { + "type": "object", + "propertyNames": { + "pattern": "^[A-Za-z][A-Za-z0-9_-]*$", + "errorMessage": { + "pattern": "to avoid confusion the name must match /^[A-Za-z][A-Za-z0-9_-]*$/ regular expression", + "minLength": "the name of an alias must not be empty" + } + }, + "additionalProperties": { + "if": { + "type": "object" + }, + "then": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "targets": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "properties": { + "formats": { + "$ref": "shared#formats" + }, + "given": { + "$ref": "shared#arrayish-given" + } + }, + "required": ["formats", "given"], + "errorMessage": "a valid target must contain given and non-empty formats" + }, + "errorMessage": { + "minItems": "targets must have at least a single alias definition" + } + } + }, + "required": ["targets"], + "errorMessage": { + "required": "targets must be present and have at least a single alias definition" + } + }, + "else": { + "$ref": "shared#arrayish-given" + } + } + } + }, + "patternProperties": { + "^x-": true + }, + "anyOf": [ + { + "required": ["extends"] + }, + { + "required": ["rules"] + }, + { + "required": ["overrides"] + } + ] +} diff --git a/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/shared.json b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/shared.json new file mode 100644 index 0000000..bd8402c --- /dev/null +++ b/vendor/spectral-6-14-3/packages/core/src/ruleset/meta/shared.json @@ -0,0 +1,75 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "@stoplight/spectral-core/meta/shared", + "$defs": { + "Formats": { + "$anchor": "formats", + "type": "array", + "items": { + "$ref": "extensions#format" + }, + "errorMessage": "must be an array of formats" + }, + "DiagnosticSeverity": { + "enum": [-1, 0, 1, 2, 3] + }, + "HumanReadableSeverity": { + "enum": ["error", "warn", "info", "hint", "off"] + }, + "Severity": { + "$anchor": "severity", + "oneOf": [ + { + "$ref": "#/$defs/DiagnosticSeverity" + }, + { + "$ref": "#/$defs/HumanReadableSeverity" + } + ], + "errorMessage": "the value has to be one of: 0, 1, 2, 3 or \"error\", \"warn\", \"info\", \"hint\", \"off\"" + }, + "Given": { + "$anchor": "given", + "if": { + "type": "array" + }, + "then": { + "$anchor": "arrayish-given", + "type": "array", + "items": { + "$ref": "path-expression" + }, + "minItems": 1, + "errorMessage": { + "minItems": "must be a non-empty array of expressions" + } + }, + "else": { + "$ref": "path-expression" + } + }, + "PathExpression": { + "$id": "path-expression", + "if": { + "type": "string" + }, + "then": { + "type": "string", + "if": { + "pattern": "^#" + }, + "then": { + "x-spectral-runtime": "alias" + }, + "else": { + "pattern": "^\\$", + "errorMessage": "must be a valid JSON Path expression or a reference to the existing Alias optionally paired with a JSON Path expression subset" + } + }, + "else": { + "not": {}, + "errorMessage": "must be a valid JSON Path expression or a reference to the existing Alias optionally paired with a JSON Path expression subset" + } + } + } +}