From dbdb2a10a12500ecfb0ebe450207acaf20ff7ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Gorej?= Date: Wed, 17 Jan 2024 10:53:59 +0100 Subject: [PATCH] feat(ls): add rules for OpenAPI 2.0 Reference Object (#3685) Refs #3612 --- packages/apidom-ls/src/config/codes.ts | 3 ++ .../config/openapi/reference/completion.ts | 28 ++++++++++++++++++- .../config/openapi/reference/documentation.ts | 12 +++++++- .../reference/lint/$ref--format-uri.ts | 6 ++-- ...lings.ts => $ref-2-0--3-0--no-siblings.ts} | 8 +++--- .../config/openapi/reference/lint/index.ts | 4 +-- 6 files changed, 50 insertions(+), 11 deletions(-) rename packages/apidom-ls/src/config/openapi/reference/lint/{$ref-3-0--no-siblings.ts => $ref-2-0--3-0--no-siblings.ts} (80%) diff --git a/packages/apidom-ls/src/config/codes.ts b/packages/apidom-ls/src/config/codes.ts index 180f321cef..1846e26920 100644 --- a/packages/apidom-ls/src/config/codes.ts +++ b/packages/apidom-ls/src/config/codes.ts @@ -834,6 +834,9 @@ enum ApilintCodes { OPENAPI2_HEADER_FIELD_ENUM_TYPE = 3231600, OPENAPI2_HEADER_FIELD_MULTIPLE_OF_TYPE = 3231700, + OPENAPI2_REFERENCE = 3240000, + OPENAPI2_REFERENCE_FIELD_$REF_FORMAT_URI = 3240100, + OPENAPI3_0 = 5000000, OPENAPI3_0_OPENAPI_VALUE_PATTERN_3_0_0 = 5000100, diff --git a/packages/apidom-ls/src/config/openapi/reference/completion.ts b/packages/apidom-ls/src/config/openapi/reference/completion.ts index e614068cbd..e8549f8136 100644 --- a/packages/apidom-ls/src/config/openapi/reference/completion.ts +++ b/packages/apidom-ls/src/config/openapi/reference/completion.ts @@ -3,9 +3,35 @@ import { CompletionFormat, CompletionType, } from '../../../apidom-language-types'; -import { OpenAPI31 } from '../target-specs'; +import { OpenAPI2, OpenAPI30, OpenAPI31 } from '../target-specs'; const completion: ApidomCompletionItem[] = [ + { + label: '$ref', + insertText: '\\$ref', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: '**Required**. The reference string.', + }, + targetSpecs: OpenAPI2, + }, + { + label: '$ref', + insertText: '\\$ref', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: '**REQUIRED**. The reference string.', + }, + targetSpecs: OpenAPI30, + }, { label: '$ref', insertText: '\\$ref', diff --git a/packages/apidom-ls/src/config/openapi/reference/documentation.ts b/packages/apidom-ls/src/config/openapi/reference/documentation.ts index b78cb78bce..5045c09292 100644 --- a/packages/apidom-ls/src/config/openapi/reference/documentation.ts +++ b/packages/apidom-ls/src/config/openapi/reference/documentation.ts @@ -1,6 +1,16 @@ -import { OpenAPI31 } from '../target-specs'; +import { OpenAPI2, OpenAPI30, OpenAPI31 } from '../target-specs'; const documentation = [ + { + target: '$ref', + docs: '**Required**. The reference string.', + targetSpecs: OpenAPI2, + }, + { + target: '$ref', + docs: '**REQUIRED**. The reference string.', + targetSpecs: OpenAPI30, + }, { target: '$ref', docs: '**REQUIRED**. The reference identifier. This MUST be in the form of a URI.', diff --git a/packages/apidom-ls/src/config/openapi/reference/lint/$ref--format-uri.ts b/packages/apidom-ls/src/config/openapi/reference/lint/$ref--format-uri.ts index 575b968581..a536cc0b21 100644 --- a/packages/apidom-ls/src/config/openapi/reference/lint/$ref--format-uri.ts +++ b/packages/apidom-ls/src/config/openapi/reference/lint/$ref--format-uri.ts @@ -2,10 +2,10 @@ import { DiagnosticSeverity } from 'vscode-languageserver-types'; import ApilintCodes from '../../../codes'; import { LinterMeta } from '../../../../apidom-language-types'; -import { OpenAPI3 } from '../../target-specs'; +import { OpenAPI2, OpenAPI3 } from '../../target-specs'; const $refFormatURILint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_REFERENCE_FIELD_$REF_FORMAT_URI, + code: ApilintCodes.OPENAPI2_REFERENCE_FIELD_$REF_FORMAT_URI, source: 'apilint', message: "'$ref' value must be a valid URI-reference", severity: DiagnosticSeverity.Error, @@ -13,7 +13,7 @@ const $refFormatURILint: LinterMeta = { marker: 'value', target: '$ref', data: {}, - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default $refFormatURILint; diff --git a/packages/apidom-ls/src/config/openapi/reference/lint/$ref-3-0--no-siblings.ts b/packages/apidom-ls/src/config/openapi/reference/lint/$ref-2-0--3-0--no-siblings.ts similarity index 80% rename from packages/apidom-ls/src/config/openapi/reference/lint/$ref-3-0--no-siblings.ts rename to packages/apidom-ls/src/config/openapi/reference/lint/$ref-2-0--3-0--no-siblings.ts index 664042d32f..ef0af916b7 100644 --- a/packages/apidom-ls/src/config/openapi/reference/lint/$ref-3-0--no-siblings.ts +++ b/packages/apidom-ls/src/config/openapi/reference/lint/$ref-2-0--3-0--no-siblings.ts @@ -2,10 +2,10 @@ import { DiagnosticSeverity } from 'vscode-languageserver-types'; import ApilintCodes from '../../../codes'; import { LinterMeta } from '../../../../apidom-language-types'; -import { OpenAPI30 } from '../../target-specs'; +import { OpenAPI2, OpenAPI30 } from '../../target-specs'; // eslint-disable-next-line @typescript-eslint/naming-convention -const $ref3_0NoSiblingsLint: LinterMeta = { +const $ref2_0__3_0NoSiblingsLint: LinterMeta = { code: ApilintCodes.OPENAPI3_0_REFERENCE_FIELD_$REF_NO_SIBLINGS, source: 'apilint', message: 'All other properties in a "$ref" object are ignored', @@ -29,7 +29,7 @@ const $ref3_0NoSiblingsLint: LinterMeta = { }, ], }, - targetSpecs: OpenAPI30, + targetSpecs: [...OpenAPI2, ...OpenAPI30], }; -export default $ref3_0NoSiblingsLint; +export default $ref2_0__3_0NoSiblingsLint; diff --git a/packages/apidom-ls/src/config/openapi/reference/lint/index.ts b/packages/apidom-ls/src/config/openapi/reference/lint/index.ts index 0cff46b1e6..1efcb73383 100644 --- a/packages/apidom-ls/src/config/openapi/reference/lint/index.ts +++ b/packages/apidom-ls/src/config/openapi/reference/lint/index.ts @@ -1,12 +1,12 @@ import $refFormatURILint from './$ref--format-uri'; -import $ref3_0NoSiblingsLint from './$ref-3-0--no-siblings'; +import $ref2_0__3_0NoSiblingsLint from './$ref-2-0--3-0--no-siblings'; import $ref3_1AllowedSiblingsLint from './$ref-3-1--allowed-siblings'; import description3_1TypeLint from './description-3-1--type'; import summary3_1TypeLint from './summary-3-1--type'; const lints = [ $refFormatURILint, - $ref3_0NoSiblingsLint, + $ref2_0__3_0NoSiblingsLint, $ref3_1AllowedSiblingsLint, description3_1TypeLint, summary3_1TypeLint,