From 20a09d5f778947df0b7f490290381a8c56c1e15c Mon Sep 17 00:00:00 2001 From: Tim Lai Date: Tue, 18 Oct 2022 11:20:09 -0700 Subject: [PATCH] feat(ls): provide OpenAPI 3.1.0 License lint rules (#2136) --- packages/apidom-ls/src/config/codes.ts | 3 +++ .../license/lint/allowed-fields-3-1.ts | 16 ++++++++++++++ .../lint/identifier--mutually-exclusive.ts | 22 +++++++++++++++++++ .../openapi/license/lint/identifier--type.ts | 0 .../src/config/openapi/license/lint/index.ts | 11 +++++++++- .../config/openapi/license/lint/name--type.ts | 4 ++-- packages/apidom-ls/test/openapi-json.ts | 16 ++++++++++++++ packages/apidom-ls/test/openapi-yaml.ts | 16 ++++++++++++++ packages/apidom-ls/test/validate.ts | 16 ++++++++++++++ 9 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 packages/apidom-ls/src/config/openapi/license/lint/allowed-fields-3-1.ts create mode 100644 packages/apidom-ls/src/config/openapi/license/lint/identifier--mutually-exclusive.ts create mode 100644 packages/apidom-ls/src/config/openapi/license/lint/identifier--type.ts diff --git a/packages/apidom-ls/src/config/codes.ts b/packages/apidom-ls/src/config/codes.ts index ba68d7fca8..62cf5e112f 100644 --- a/packages/apidom-ls/src/config/codes.ts +++ b/packages/apidom-ls/src/config/codes.ts @@ -813,6 +813,9 @@ enum ApilintCodes { OPENAPI3_1_COMPONENTS = 7020000, OPENAPI3_1_COMPONENTS_FIELD_PATH_ITEMS_VALUES_TYPE = 7020100, + OPENAPI3_1_LICENSE_FIELD_IDENTIFIER_TYPE = 7040300, + OPENAPI3_1_LICENSE_FIELD_IDENTIFIER_MUTUALLY_EXCLUSIVE = 7040600, + ADS = 8000000, ADS_INFO = 8010000, ADS_INFO_REQUIRED = 8010010, diff --git a/packages/apidom-ls/src/config/openapi/license/lint/allowed-fields-3-1.ts b/packages/apidom-ls/src/config/openapi/license/lint/allowed-fields-3-1.ts new file mode 100644 index 0000000000..d4d2f1e097 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/license/lint/allowed-fields-3-1.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +const allowedFields3_1Lint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: 1, + linterFunction: 'allowedFields', + linterParams: [['name', 'url', 'identifier'], 'x-'], + marker: 'key', + targetSpecs: [{ namespace: 'openapi', version: '3.1.0' }], +}; + +export default allowedFields3_1Lint; diff --git a/packages/apidom-ls/src/config/openapi/license/lint/identifier--mutually-exclusive.ts b/packages/apidom-ls/src/config/openapi/license/lint/identifier--mutually-exclusive.ts new file mode 100644 index 0000000000..cd8c5e35a8 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/license/lint/identifier--mutually-exclusive.ts @@ -0,0 +1,22 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const identifierMutuallyExclusiveLint: LinterMeta = { + code: ApilintCodes.OPENAPI3_1_LICENSE_FIELD_IDENTIFIER_MUTUALLY_EXCLUSIVE, + source: 'apilint', + message: 'The identifier field and url field are mutually exclusive.', + severity: 1, + linterFunction: 'missingFields', + linterParams: [['identifier']], + marker: 'key', + markerTarget: 'identifier', + conditions: [ + { + function: 'existFields', + params: [['url']], + }, + ], + targetSpecs: [{ namespace: 'openapi', version: '3.1.0' }], +}; + +export default identifierMutuallyExclusiveLint; diff --git a/packages/apidom-ls/src/config/openapi/license/lint/identifier--type.ts b/packages/apidom-ls/src/config/openapi/license/lint/identifier--type.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/apidom-ls/src/config/openapi/license/lint/index.ts b/packages/apidom-ls/src/config/openapi/license/lint/index.ts index 8b9333dcce..5ed844eb14 100644 --- a/packages/apidom-ls/src/config/openapi/license/lint/index.ts +++ b/packages/apidom-ls/src/config/openapi/license/lint/index.ts @@ -1,8 +1,17 @@ import allowedFields3_0Lint from './allowed-fields-3-0'; +import allowedFields3_1Lint from './allowed-fields-3-1'; import nameTypeLint from './name--type'; import nameRequiredLint from './name--required'; +import identifierMutuallyExclusiveLint from './identifier--mutually-exclusive'; import urlFormatURILint from './url--format-uri'; -const lints = [nameTypeLint, nameRequiredLint, urlFormatURILint, allowedFields3_0Lint]; +const lints = [ + nameTypeLint, + nameRequiredLint, + identifierMutuallyExclusiveLint, + urlFormatURILint, + allowedFields3_0Lint, + allowedFields3_1Lint, +]; export default lints; diff --git a/packages/apidom-ls/src/config/openapi/license/lint/name--type.ts b/packages/apidom-ls/src/config/openapi/license/lint/name--type.ts index e066c6253b..1f378c3fbb 100644 --- a/packages/apidom-ls/src/config/openapi/license/lint/name--type.ts +++ b/packages/apidom-ls/src/config/openapi/license/lint/name--type.ts @@ -2,9 +2,9 @@ import ApilintCodes from '../../../codes'; import { LinterMeta } from '../../../../apidom-language-types'; const nameTypeLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_LICENSE_FIELD_NAME_TYPE, + code: ApilintCodes.OPENAPI3_1_LICENSE_FIELD_IDENTIFIER_TYPE, source: 'apilint', - message: "'name' must be a string", + message: "'identifier' must be a string", severity: 1, linterFunction: 'apilintType', linterParams: ['string'], diff --git a/packages/apidom-ls/test/openapi-json.ts b/packages/apidom-ls/test/openapi-json.ts index fb8331ce18..2caa6d904a 100644 --- a/packages/apidom-ls/test/openapi-json.ts +++ b/packages/apidom-ls/test/openapi-json.ts @@ -484,6 +484,22 @@ describe('apidom-ls', function () { severity: 1, source: 'apilint', }, + { + code: 7040600, + message: 'The identifier field and url field are mutually exclusive.', + range: { + end: { + character: 18, + line: 14, + }, + start: { + character: 6, + line: 14, + }, + }, + severity: 1, + source: 'apilint', + }, { code: 5130600, data: {}, diff --git a/packages/apidom-ls/test/openapi-yaml.ts b/packages/apidom-ls/test/openapi-yaml.ts index 611e98f037..1ba33530d7 100644 --- a/packages/apidom-ls/test/openapi-yaml.ts +++ b/packages/apidom-ls/test/openapi-yaml.ts @@ -621,6 +621,22 @@ describe('apidom-ls-yaml', function () { severity: 1, source: 'apilint', }, + { + code: 7040600, + message: 'The identifier field and url field are mutually exclusive.', + range: { + end: { + character: 14, + line: 15, + }, + start: { + character: 4, + line: 15, + }, + }, + severity: 1, + source: 'apilint', + }, { code: 5130600, data: {}, diff --git a/packages/apidom-ls/test/validate.ts b/packages/apidom-ls/test/validate.ts index 894613eeb4..0684944a0e 100644 --- a/packages/apidom-ls/test/validate.ts +++ b/packages/apidom-ls/test/validate.ts @@ -2870,6 +2870,22 @@ describe('apidom-ls-validate', function () { const result = await languageService.doValidation(doc, validationContext); const expected: Diagnostic[] = [ + { + code: 7040600, + message: 'The identifier field and url field are mutually exclusive.', + range: { + end: { + character: 14, + line: 6, + }, + start: { + character: 4, + line: 6, + }, + }, + severity: 1, + source: 'apilint', + }, { range: { start: {