diff --git a/packages/apidom-ls/src/config/codes.ts b/packages/apidom-ls/src/config/codes.ts index e6a5490a0d..6bc3803013 100644 --- a/packages/apidom-ls/src/config/codes.ts +++ b/packages/apidom-ls/src/config/codes.ts @@ -671,6 +671,7 @@ enum ApilintCodes { OPENAPI3_O_SERVER_VARIABLE = 5080000, OPENAPI3_O_SERVER_VARIABLE_FIELD_ENUM_TYPE = 5080100, + OPENAPI3_O_SERVER_VARIABLE_FIELD_ENUM_NON_EMPTY, OPENAPI3_O_SERVER_VARIABLE_FIELD_DEFAULT_TYPE = 5080200, OPENAPI3_O_SERVER_VARIABLE_FIELD_DEFAULT_REQUIRED, OPENAPI3_O_SERVER_VARIABLE_FIELD_DESCRIPTION_TYPE = 5080300, @@ -746,8 +747,6 @@ enum ApilintCodes { OPENAPI3_0_PARAMETER_FIELD_CONTENT_VALUES_TYPE = 5151100, OPENAPI3_0_REQUEST_BODY = 5160000, - OPENAPI3_0_REQUEST_BODY_FIELD_$REF_NO_SIBLINGS = 5160100, - OPENAPI3_0_REQUEST_BODY_FIELD_$REF_VALID, OPENAPI3_0_REQUEST_BODY_FIELD_DESCRIPTION_TYPE = 5160200, OPENAPI3_0_REQUEST_BODY_FIELD_CONTENT_VALUES_TYPE = 5160300, OPENAPI3_0_REQUEST_BODY_FIELD_CONTENT_REQUIRED, @@ -774,8 +773,6 @@ enum ApilintCodes { OPENAPI3_0_EXAMPLE_FIELD_DESCRIPTION_TYPE = 5200200, OPENAPI3_0_EXAMPLE_FIELD_VALUE_MUTUALLY_EXCLUSIVE = 5200300, OPENAPI3_0_EXAMPLE_FIELD_EXTERNAL_VALUE_FORMAT_URI = 5200400, - OPENAPI3_0_EXAMPLE_FIELD_$REF_VALID = 5200500, - OPENAPI3_0_EXAMPLE_FIELD_$REF_NO_SIBLINGS, OPENAPI3_0_OAUTH_FLOWS = 5210000, OPENAPI3_0_OAUTH_FLOWS_FIELD_IMPLICIT_TYPE = 5210100, @@ -859,16 +856,13 @@ enum ApilintCodes { OPENAPI3_1_OPEN_API_FIELD_SERVERS_TYPE = 7010200, OPENAPI3_1_OPEN_API_FIELD_SERVERS_ITEMS_TYPE, OPENAPI3_1_OPEN_API_FIELD_PATHS_TYPE = 7010300, - OPENAPI3_1_OPEN_API_FIELD_PATHS_REQUIRED, OPENAPI3_1_OPEN_API_FIELD_COMPONENTS_TYPE = 7010400, - OPENAPI3_1_OPEN_API_FIELD_COMPONENTS_REQUIRED, OPENAPI3_1_OPEN_API_FIELD_SECURITY_TYPE = 7010500, OPENAPI3_1_OPEN_API_FIELD_SECURITY_ITEMS_TYPE, OPENAPI3_1_OPEN_API_FIELD_TAGS_TYPE = 7010600, OPENAPI3_1_OPEN_API_FIELD_TAGS_ITEMS_TYPE, OPENAPI3_1_OPEN_API_FIELD_EXTERNAL_DOCS_TYPE = 7010700, OPENAPI3_1_OPEN_API_FIELD_WEBHOOKS_VALUES_TYPE = 7010800, - OPENAPI3_1_OPEN_API_FIELD_WEBHOOKS_REQUIRED, OPENAPI3_1_OPEN_API_FIELD_JSON_SCHEMA_DIALECT_FORMAT_URI = 7010900, OPENAPI3_1_INFO = 7020000, @@ -887,6 +881,9 @@ enum ApilintCodes { OPENAPI3_1_SECURITY_SCHEME = 7050000, OPENAPI3_1_SECURITY_SCHEME_FIELD_TYPE_EQUALS = 7050100, + OPENAPI3_1_SERVER_VARIABLE = 7060000, + OPENAPI3_1_SERVER_VARIABLE_FIELD_ENUM_TYPE = 7060100, + ADS = 8000000, ADS_INFO = 8010000, diff --git a/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--non-empty-3-0.ts b/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--non-empty-3-0.ts new file mode 100644 index 0000000000..5f0537e6e3 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--non-empty-3-0.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +const enumNonEmpty3_0Lint: LinterMeta = { + code: ApilintCodes.OPENAPI3_O_SERVER_VARIABLE_FIELD_ENUM_NON_EMPTY, + source: 'apilint', + message: "'enum' array should not be empty.", + severity: DiagnosticSeverity.Warning, + linterFunction: 'apilintArrayEmpty', + linterParams: [], + marker: 'key', + target: 'enum', + data: {}, + targetSpecs: [ + { namespace: 'openapi', version: '3.0.0' }, + { namespace: 'openapi', version: '3.0.1' }, + { namespace: 'openapi', version: '3.0.2' }, + { namespace: 'openapi', version: '3.0.3' }, + ], +}; + +export default enumNonEmpty3_0Lint; diff --git a/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--type.ts b/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--type-3-0.ts similarity index 51% rename from packages/apidom-ls/src/config/openapi/server-variable/lint/enum--type.ts rename to packages/apidom-ls/src/config/openapi/server-variable/lint/enum--type-3-0.ts index c66adc2c74..4e8182a24d 100644 --- a/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--type.ts +++ b/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--type-3-0.ts @@ -3,16 +3,23 @@ import { DiagnosticSeverity } from 'vscode-languageserver-types'; import ApilintCodes from '../../../codes'; import { LinterMeta } from '../../../../apidom-language-types'; -const enumTypeLint: LinterMeta = { +// eslint-disable-next-line @typescript-eslint/naming-convention +const enumType3_0Lint: LinterMeta = { code: ApilintCodes.OPENAPI3_O_SERVER_VARIABLE_FIELD_ENUM_TYPE, source: 'apilint', - message: "'enum' must be an array of strings", + message: "'enum' should be an array of strings", severity: DiagnosticSeverity.Error, linterFunction: 'apilintArrayOfType', linterParams: ['string'], marker: 'key', target: 'enum', data: {}, + targetSpecs: [ + { namespace: 'openapi', version: '3.0.0' }, + { namespace: 'openapi', version: '3.0.1' }, + { namespace: 'openapi', version: '3.0.2' }, + { namespace: 'openapi', version: '3.0.3' }, + ], }; -export default enumTypeLint; +export default enumType3_0Lint; diff --git a/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--type-3-1.ts b/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--type-3-1.ts new file mode 100644 index 0000000000..8b3af96892 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/server-variable/lint/enum--type-3-1.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +const enumType3_1Lint: LinterMeta = { + code: ApilintCodes.OPENAPI3_1_SERVER_VARIABLE_FIELD_ENUM_TYPE, + source: 'apilint', + message: "'enum' must be a non-empty array of strings", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintArrayOfType', + linterParams: ['string', true], + marker: 'key', + target: 'enum', + data: {}, + targetSpecs: [{ namespace: 'openapi', version: '3.1.0' }], +}; + +export default enumType3_1Lint; diff --git a/packages/apidom-ls/src/config/openapi/server-variable/lint/index.ts b/packages/apidom-ls/src/config/openapi/server-variable/lint/index.ts index c4ae71e7e4..77fc4a714d 100644 --- a/packages/apidom-ls/src/config/openapi/server-variable/lint/index.ts +++ b/packages/apidom-ls/src/config/openapi/server-variable/lint/index.ts @@ -1,11 +1,15 @@ import allowedFieldsLint from './allowed-fields'; -import enumTypeLint from './enum--type'; +import enumType3_0Lint from './enum--type-3-0'; +import enumNonEmpty3_0Lint from './enum--non-empty-3-0'; +import enumType3_1Lint from './enum--type-3-1'; import defaultTypeLint from './default--type'; import defaultRequiredLint from './default--required'; import descriptionTypeLint from './description--type'; const lints = [ - enumTypeLint, + enumType3_0Lint, + enumNonEmpty3_0Lint, + enumType3_1Lint, defaultTypeLint, defaultRequiredLint, descriptionTypeLint, diff --git a/packages/apidom-ls/src/services/validation/linter-functions.ts b/packages/apidom-ls/src/services/validation/linter-functions.ts index ffd5a7c348..d41cab07da 100644 --- a/packages/apidom-ls/src/services/validation/linter-functions.ts +++ b/packages/apidom-ls/src/services/validation/linter-functions.ts @@ -431,6 +431,18 @@ export const standardLinterfunctions: FunctionItem[] = [ return true; }, }, + { + functionName: 'apilintArrayEmpty', + function: (element: Element): boolean => { + if (element) { + const elValue = element.toValue(); + if (Array.isArray(elValue) && elValue.length === 0) { + return false; + } + } + return true; + }, + }, { functionName: 'apilintChildrenOfType', function: (element: Element, type: string, nonEmpty?: boolean): boolean => {