From 8bb660a250e79df1ab45d9ff00c860d788db2c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Gorej?= Date: Fri, 12 Jan 2024 09:20:09 +0100 Subject: [PATCH] feat(ls): add rules for OpenAPI 2.0 Responses Definitions Object (#3661) Refs #3617 --- packages/apidom-ls/src/config/codes.ts | 3 +++ .../apidom-ls/src/config/openapi/config.ts | 2 ++ .../responses-definitions/documentation.ts | 10 ++++++++++ .../responses-definitions/lint/index.ts | 5 +++++ .../lint/values--type.ts | 19 +++++++++++++++++++ .../openapi/responses-definitions/meta.ts | 10 ++++++++++ 6 files changed, 49 insertions(+) create mode 100644 packages/apidom-ls/src/config/openapi/responses-definitions/documentation.ts create mode 100644 packages/apidom-ls/src/config/openapi/responses-definitions/lint/index.ts create mode 100644 packages/apidom-ls/src/config/openapi/responses-definitions/lint/values--type.ts create mode 100644 packages/apidom-ls/src/config/openapi/responses-definitions/meta.ts diff --git a/packages/apidom-ls/src/config/codes.ts b/packages/apidom-ls/src/config/codes.ts index 670c67cad..b1bcbd524 100644 --- a/packages/apidom-ls/src/config/codes.ts +++ b/packages/apidom-ls/src/config/codes.ts @@ -769,6 +769,9 @@ enum ApilintCodes { OPENAPI2_PARAMETERS_DEFINITIONS = 3150000, OPENAPI2_PARAMETERS_DEFINITIONS_VALUES_TYPE = 3150100, + OPENAPI2_RESPONSES_DEFINITIONS = 3160000, + OPENAPI2_RESPONSES_DEFINITIONS_VALUES_TYPE = 3160100, + OPENAPI3_0 = 5000000, OPENAPI3_0_OPENAPI_VALUE_PATTERN_3_0_0 = 5000100, diff --git a/packages/apidom-ls/src/config/openapi/config.ts b/packages/apidom-ls/src/config/openapi/config.ts index 809918ed9..9ad24873b 100644 --- a/packages/apidom-ls/src/config/openapi/config.ts +++ b/packages/apidom-ls/src/config/openapi/config.ts @@ -29,6 +29,7 @@ import pathsMeta from './paths/meta'; import requestBodyMeta from './request-body/meta'; import responseMeta from './response/meta'; import responsesMeta from './responses/meta'; +import responsesDefinitionsMeta from './responses-definitions/meta'; import securityRequirementMeta from './security-requirement/meta'; import securitySchemeMeta from './security-scheme/meta'; import serverMeta from './server/meta'; @@ -83,6 +84,7 @@ export default { requestBody: requestBodyMeta, response: responseMeta, responses: responsesMeta, + responsesDefinitions: responsesDefinitionsMeta, securityRequirement: securityRequirementMeta, securityScheme: securitySchemeMeta, server: serverMeta, diff --git a/packages/apidom-ls/src/config/openapi/responses-definitions/documentation.ts b/packages/apidom-ls/src/config/openapi/responses-definitions/documentation.ts new file mode 100644 index 000000000..65bcc8b49 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/responses-definitions/documentation.ts @@ -0,0 +1,10 @@ +import { OpenAPI2 } from '../target-specs'; + +const documentation = [ + { + docs: '#### [Responses Definitions Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#responsesDefinitionsObject)\n\nAn object to hold responses to be reused across operations. Response definitions can be referenced to the ones defined here.\n\nThis does *not* define global operation responses.\n\n##### Patterned Fields\n\nField Pattern | Type | Description\n---|:---:|---\n{name} | [Response Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#responseObject) | A single response definition, mapping a "name" to the response it defines.\n\n##### Responses Definitions Object Example\n\n```js\n{\n "NotFound": {\n "description": "Entity not found."\n },\n "IllegalInput": {\n \t"description": "Illegal input for operation."\n },\n "GeneralError": {\n \t"description": "General Error",\n \t"schema": {\n \t\t"$ref": "#/definitions/GeneralError"\n \t}\n }\n}\n```\n\n\n\\\nYAML\n```yaml\nNotFound:\n description: Entity not found.\nIllegalInput:\n description: Illegal input for operation.\nGeneralError:\n description: General Error\n schema:\n $ref: \'#/definitions/GeneralError\'\n```', + targetSpecs: OpenAPI2, + }, +]; + +export default documentation; diff --git a/packages/apidom-ls/src/config/openapi/responses-definitions/lint/index.ts b/packages/apidom-ls/src/config/openapi/responses-definitions/lint/index.ts new file mode 100644 index 000000000..f49a5fe79 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/responses-definitions/lint/index.ts @@ -0,0 +1,5 @@ +import valuesTypeLint from './values--type'; + +const lints = [valuesTypeLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/openapi/responses-definitions/lint/values--type.ts b/packages/apidom-ls/src/config/openapi/responses-definitions/lint/values--type.ts new file mode 100644 index 000000000..02e716200 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/responses-definitions/lint/values--type.ts @@ -0,0 +1,19 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const valuesTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_RESPONSES_DEFINITIONS_VALUES_TYPE, + source: 'apilint', + message: 'Responses Definitions Object values must be of Response Object shape', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintChildrenOfElementsOrClasses', + linterParams: [['response']], + marker: 'key', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default valuesTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/responses-definitions/meta.ts b/packages/apidom-ls/src/config/openapi/responses-definitions/meta.ts new file mode 100644 index 000000000..687725779 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/responses-definitions/meta.ts @@ -0,0 +1,10 @@ +import lint from './lint'; +import documentation from './documentation'; +import { FormatMeta } from '../../../apidom-language-types'; + +const meta: FormatMeta = { + lint, + documentation, +}; + +export default meta;