From 9815998e6d9b7ddc8db4bf5a8281dcac0e98ba92 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Tue, 2 Jan 2024 14:56:13 +0100 Subject: [PATCH] feat(ls): add lint rules for OpenAPI 2.0 Parameter Object Refs #3104 --- packages/apidom-ls/src/config/codes.ts | 30 +++++++++++ .../parameter/lint/allow-empty-value--type.ts | 6 +-- .../parameter/lint/allowed-fields-2-0.ts | 47 +++++++++++++++++ .../lint/collection-format--equals.ts | 21 ++++++++ .../parameter/lint/description--type.ts | 6 +-- .../openapi/parameter/lint/enum--type.ts | 20 ++++++++ .../parameter/lint/exclusive-maximum--type.ts | 20 ++++++++ .../parameter/lint/exclusive-minimum--type.ts | 20 ++++++++ .../lint/{in--type.ts => format--type.ts} | 14 +++--- .../openapi/parameter/lint/in--equals-2-0.ts | 21 ++++++++ .../parameter/lint/in--equals-3-0--3-1.ts | 21 ++++++++ .../openapi/parameter/lint/in--required.ts | 6 +-- .../openapi/parameter/lint/in--valid.ts | 31 ++++++++++++ .../config/openapi/parameter/lint/index.ts | 46 +++++++++++++++-- .../openapi/parameter/lint/items--required.ts | 39 +++++++++++++++ .../openapi/parameter/lint/items--type.ts | 20 ++++++++ .../parameter/lint/max-length--type.ts | 20 ++++++++ .../openapi/parameter/lint/maximum--type.ts | 20 ++++++++ .../parameter/lint/min-length--type.ts | 20 ++++++++ .../openapi/parameter/lint/minimum--type.ts | 20 ++++++++ .../parameter/lint/multiple-of--type.ts | 20 ++++++++ .../openapi/parameter/lint/name--required.ts | 6 +-- .../openapi/parameter/lint/name--type.ts | 6 +-- .../parameter/lint/required--equals.ts | 6 +-- .../parameter/lint/required--required.ts | 6 +-- .../openapi/parameter/lint/required--type.ts | 6 +-- ...-fields.ts => required-fields-3-0--3-1.ts} | 5 +- .../parameter/lint/schema--required.ts | 39 +++++++++++++++ .../openapi/parameter/lint/schema--type.ts | 6 +-- .../openapi/parameter/lint/type--equals.ts | 20 ++++++++ .../openapi/parameter/lint/type--required.ts | 39 +++++++++++++++ .../parameter/lint/unique-items--type.ts | 20 ++++++++ .../oas/path-template-all-defined-2-0.yaml | 50 +++++++------------ packages/apidom-ls/test/validate.ts | 8 +-- 34 files changed, 609 insertions(+), 76 deletions(-) create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/allowed-fields-2-0.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/collection-format--equals.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/enum--type.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/exclusive-maximum--type.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/exclusive-minimum--type.ts rename packages/apidom-ls/src/config/openapi/parameter/lint/{in--type.ts => format--type.ts} (56%) create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/in--equals-2-0.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/in--equals-3-0--3-1.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/in--valid.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/items--required.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/items--type.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/max-length--type.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/maximum--type.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/min-length--type.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/minimum--type.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/multiple-of--type.ts rename packages/apidom-ls/src/config/openapi/parameter/lint/{required-fields.ts => required-fields-3-0--3-1.ts} (85%) create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/schema--required.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/type--equals.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/type--required.ts create mode 100644 packages/apidom-ls/src/config/openapi/parameter/lint/unique-items--type.ts diff --git a/packages/apidom-ls/src/config/codes.ts b/packages/apidom-ls/src/config/codes.ts index 494bec9c1..c6e3b7338 100644 --- a/packages/apidom-ls/src/config/codes.ts +++ b/packages/apidom-ls/src/config/codes.ts @@ -706,6 +706,35 @@ enum ApilintCodes { OPENAPI2_EXTERNAL_DOCUMENTATION_FIELD_URL_FORMAT_URI = 3090200, OPENAPI2_EXTERNAL_DOCUMENTATION_FIELD_URL_REQUIRED, + OPENAPI2_PARAMETER = 3100000, + OPENAPI2_PARAMETER_FIELD_NAME_TYPE = 3100100, + OPENAPI2_PARAMETER_FIELD_NAME_REQUIRED, + OPENAPI2_PARAMETER_FIELD_IN_EQUALS = 3100200, + OPENAPI2_PARAMETER_FIELD_IN_REQUIRED, + OPENAPI2_PARAMETER_FIELD_IN_VALID, + OPENAPI2_PARAMETER_FIELD_DESCRIPTION_TYPE = 3100300, + OPENAPI2_PARAMETER_FIELD_REQUIRED_TYPE = 3100400, + OPENAPI2_PARAMETER_FIELD_REQUIRED_REQUIRED, + OPENAPI2_PARAMETER_FIELD_REQUIRED_EQUALS, + OPENAPI2_PARAMETER_FIELD_SCHEMA_TYPE = 3100500, + OPENAPI2_PARAMETER_FIELD_SCHEMA_REQUIRED, + OPENAPI2_PARAMETER_FIELD_TYPE_EQUALS = 3100600, + OPENAPI2_PARAMETER_FIELD_TYPE_REQUIRED, + OPENAPI2_PARAMETER_FIELD_FORMAT_TYPE = 3100700, + OPENAPI2_PARAMETER_FIELD_ALLOW_EMPTY_VALUE_TYPE = 3100800, + OPENAPI2_PARAMETER_FIELD_ITEMS_TYPE = 3100900, + OPENAPI2_PARAMETER_FIELD_ITEMS_REQUIRED, + OPENAPI2_PARAMETER_FIELD_COLLECTION_FORMAT_EQUALS = 3101000, + OPENAPI2_PARAMETER_FIELD_MAXIMUM_TYPE = 3101100, + OPENAPI2_PARAMETER_FIELD_EXCLUSIVE_MAXIMUM_TYPE = 3101200, + OPENAPI2_PARAMETER_FIELD_MINIMUM_TYPE = 3101300, + OPENAPI2_PARAMETER_FIELD_EXCLUSIVE_MINIMUM_TYPE = 3101400, + OPENAPI2_PARAMETER_FIELD_MAX_LENGTH_TYPE = 3101500, + OPENAPI2_PARAMETER_FIELD_MIN_LENGTH_TYPE = 3101600, + OPENAPI2_PARAMETER_FIELD_UNIQUE_ITEMS_TYPE = 3101700, + OPENAPI2_PARAMETER_FIELD_ENUM_TYPE = 3101800, + OPENAPI2_PARAMETER_FIELD_MULTIPLE_OF_TYPE = 3101900, + OPENAPI3_0 = 5000000, OPENAPI3_0_OPENAPI_VALUE_PATTERN_3_0_0 = 5000100, @@ -838,6 +867,7 @@ enum ApilintCodes { OPENAPI3_0_PARAMETER_FIELD_NAME_REQUIRED, OPENAPI3_0_PARAMETER_FIELD_IN_TYPE = 5150300, OPENAPI3_0_PARAMETER_FIELD_IN_REQUIRED, + OPENAPI3_0_PARAMETER_FIELD_IN_EQUALS, OPENAPI3_0_PARAMETER_FIELD_DESCRIPTION_TYPE = 5150400, OPENAPI3_0_PARAMETER_FIELD_REQUIRED_TYPE = 5150500, OPENAPI3_0_PARAMETER_FIELD_REQUIRED_REQUIRED, diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/allow-empty-value--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/allow-empty-value--type.ts index fb3c0e4af..dfd2b7720 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/allow-empty-value--type.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/allow-empty-value--type.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 allowEmptyValueTypeLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_ALLOW_EMPTY_VALUE_TYPE, + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_ALLOW_EMPTY_VALUE_TYPE, source: 'apilint', message: 'allowEmptyValue must be a boolean', severity: DiagnosticSeverity.Error, @@ -14,7 +14,7 @@ const allowEmptyValueTypeLint: LinterMeta = { marker: 'value', target: 'allowEmptyValue', data: {}, - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default allowEmptyValueTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/allowed-fields-2-0.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/allowed-fields-2-0.ts new file mode 100644 index 000000000..d6de82742 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/allowed-fields-2-0.ts @@ -0,0 +1,47 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +const allowedFields2_0Lint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [ + [ + 'name', + 'in', + 'description', + 'required', + 'schema', + 'type', + 'format', + 'allowEmptyValue', + 'items', + 'collectionFormat', + 'default', + 'maximum', + 'exclusiveMaximum', + 'minimum', + 'exclusiveMinimum', + 'maxLength', + 'minLength', + 'pattern', + 'maxItems', + 'minItems', + 'uniqueItems', + 'enum', + 'multipleOf', + '$ref', + ], + 'x-', + ], + marker: 'key', + targetSpecs: OpenAPI2, +}; + +export default allowedFields2_0Lint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/collection-format--equals.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/collection-format--equals.ts new file mode 100644 index 000000000..292096c35 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/collection-format--equals.ts @@ -0,0 +1,21 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const collectionFormatEqualsLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_COLLECTION_FORMAT_EQUALS, + source: 'apilint', + message: + "'collectionFormat' must be one of allowed values: 'csv', 'ssv', 'tsv', 'pipes', 'multi'", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintValueOrArray', + linterParams: [['csv', 'ssv', 'tsv', 'pipes', 'multi']], + marker: 'value', + target: 'collectionFormat', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default collectionFormatEqualsLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/description--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/description--type.ts index db3117d72..1f0771c3a 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/description--type.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/description--type.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 descriptionTypeLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_DESCRIPTION_TYPE, + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_DESCRIPTION_TYPE, source: 'apilint', message: 'description must be a string', severity: DiagnosticSeverity.Error, @@ -14,7 +14,7 @@ const descriptionTypeLint: LinterMeta = { marker: 'value', target: 'description', data: {}, - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default descriptionTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/enum--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/enum--type.ts new file mode 100644 index 000000000..a9d5d8152 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/enum--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const enumTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_ENUM_TYPE, + source: 'apilint', + message: 'enum must be an array', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['array'], + marker: 'value', + target: 'enum', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default enumTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/exclusive-maximum--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/exclusive-maximum--type.ts new file mode 100644 index 000000000..efd038928 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/exclusive-maximum--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const exclusiveMaximumTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_EXCLUSIVE_MAXIMUM_TYPE, + source: 'apilint', + message: 'exclusiveMaximum must be a boolean', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['boolean'], + marker: 'value', + target: 'exclusiveMaximum', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default exclusiveMaximumTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/exclusive-minimum--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/exclusive-minimum--type.ts new file mode 100644 index 000000000..da0b2fa14 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/exclusive-minimum--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const exclusiveMinimumTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_EXCLUSIVE_MINIMUM_TYPE, + source: 'apilint', + message: 'exclusiveMinimum must be a boolean', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['boolean'], + marker: 'value', + target: 'exclusiveMinimum', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default exclusiveMinimumTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/in--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/format--type.ts similarity index 56% rename from packages/apidom-ls/src/config/openapi/parameter/lint/in--type.ts rename to packages/apidom-ls/src/config/openapi/parameter/lint/format--type.ts index 346bbefb9..f080438f9 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/in--type.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/format--type.ts @@ -2,19 +2,19 @@ import { DiagnosticSeverity } from 'vscode-languageserver-types'; import ApilintCodes from '../../../codes'; import { LinterMeta } from '../../../../apidom-language-types'; -import { OpenAPI3 } from '../../target-specs'; +import { OpenAPI2 } from '../../target-specs'; -const inTypeLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_IN_TYPE, +const formatTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_FORMAT_TYPE, source: 'apilint', - message: 'in must be a string', + message: 'explode must be a string', severity: DiagnosticSeverity.Error, linterFunction: 'apilintType', linterParams: ['string'], marker: 'value', - target: 'in', + target: 'format', data: {}, - targetSpecs: OpenAPI3, + targetSpecs: OpenAPI2, }; -export default inTypeLint; +export default formatTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/in--equals-2-0.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/in--equals-2-0.ts new file mode 100644 index 000000000..aefccabfa --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/in--equals-2-0.ts @@ -0,0 +1,21 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +const inEquals2_0Lint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_IN_EQUALS, + source: 'apilint', + message: "'in' must be one of allowed values: query, header, path, formData, body", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintValueOrArray', + linterParams: [['query', 'header', 'path', 'formData', 'body']], + marker: 'value', + target: 'in', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default inEquals2_0Lint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/in--equals-3-0--3-1.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/in--equals-3-0--3-1.ts new file mode 100644 index 000000000..c3762d8d2 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/in--equals-3-0--3-1.ts @@ -0,0 +1,21 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI3 } from '../../target-specs'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +const inEquals3_0__3_1Lint: LinterMeta = { + code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_IN_EQUALS, + source: 'apilint', + message: "'in' must be one of allowed values: query, header, path, cookie", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintValueOrArray', + linterParams: [['query', 'header', 'path', 'cookie']], + marker: 'value', + target: 'in', + data: {}, + targetSpecs: OpenAPI3, +}; + +export default inEquals3_0__3_1Lint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/in--required.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/in--required.ts index f94216025..b279afafb 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/in--required.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/in--required.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 inRequiredLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_IN_REQUIRED, + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_IN_REQUIRED, source: 'apilint', message: "should always have an 'in'", severity: DiagnosticSeverity.Error, @@ -28,7 +28,7 @@ const inRequiredLint: LinterMeta = { params: ['$ref'], }, ], - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default inRequiredLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/in--valid.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/in--valid.ts new file mode 100644 index 000000000..dfcaf77fd --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/in--valid.ts @@ -0,0 +1,31 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const inValidLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_IN_VALID, + source: 'apilint', + message: "'in' field must contain 'formData' value for 'type'=file", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintContainsValue', + linterParams: ['formData'], + marker: 'value', + target: 'in', + data: {}, + conditions: [ + { + targets: [{ path: 'type' }], + function: 'apilintContainsValue', + params: ['file'], + }, + { + function: 'missingField', + params: ['$ref'], + }, + ], + targetSpecs: OpenAPI2, +}; + +export default inValidLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/index.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/index.ts index fc233c0fb..b36f86963 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/index.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/index.ts @@ -1,10 +1,13 @@ +import allowedFields2_0Lint from './allowed-fields-2-0'; import allowedFields3_0Lint from './allowed-fields-3-0'; import allowedFields3_1Lint from './allowed-fields-3-1'; -import requiredFieldsLint from './required-fields'; +import requiredFields3_0__3_1Lint from './required-fields-3-0--3-1'; import nameTypeLint from './name--type'; import nameRequiredLint from './name--required'; -import inTypeLint from './in--type'; +import inEquals2_0Lint from './in--equals-2-0'; +import inEquals3_0__3_1Lint from './in--equals-3-0--3-1'; import inRequiredLint from './in--required'; +import inValidLint from './in--valid'; import descriptionTypeLint from './description--type'; import requiredTypeLint from './required--type'; import requiredRequiredLint from './required--required'; @@ -15,18 +18,36 @@ import styleTypeLint from './style--type'; import explodeTypeLint from './explode--type'; import allowReservedTypeLint from './allow-reserved--type'; import schemaTypeLint from './schema--type'; +import schemaRequiredLint from './schema--required'; import schemaMutuallyExclusiveLint from './schema--mutually-exclusive'; import examplesValuesTypeLint from './examples--values-type'; import examplesMutuallyExclusiveLint from './examples--mutually-exclusive'; import contentValuesTypeLint from './content--values-type'; import contentAllowedFields3_0Lint from './content--allowed-fields-3-0'; import contentAllowedFields3_1Lint from './content--allowed-fields-3-1'; +import typeEqualsLint from './type--equals'; +import typeRequiredLint from './type--required'; +import formatTypeLint from './format--type'; +import itemsTypeLint from './items--type'; +import itemsRequiredLint from './items--required'; +import collectionFormatEqualsLint from './collection-format--equals'; +import maximumTypeLint from './maximum--type'; +import exclusiveMaximumTypeLint from './exclusive-maximum--type'; +import minimumTypeLint from './minimum--type'; +import exclusiveMinimumTypeLint from './exclusive-minimum--type'; +import maxLengthTypeLint from './max-length--type'; +import minLengthTypeLint from './min-length--type'; +import uniqueItemsTypeLint from './unique-items--type'; +import enumTypeLint from './enum--type'; +import multipleOfTypeLint from './multiple-of--type'; const lints = [ nameTypeLint, nameRequiredLint, - inTypeLint, + inEquals2_0Lint, + inEquals3_0__3_1Lint, inRequiredLint, + inValidLint, descriptionTypeLint, requiredTypeLint, requiredRequiredLint, @@ -37,13 +58,30 @@ const lints = [ explodeTypeLint, allowReservedTypeLint, schemaTypeLint, + schemaRequiredLint, schemaMutuallyExclusiveLint, examplesValuesTypeLint, examplesMutuallyExclusiveLint, contentValuesTypeLint, contentAllowedFields3_0Lint, contentAllowedFields3_1Lint, - requiredFieldsLint, + typeEqualsLint, + typeRequiredLint, + formatTypeLint, + itemsTypeLint, + itemsRequiredLint, + collectionFormatEqualsLint, + maximumTypeLint, + exclusiveMaximumTypeLint, + minimumTypeLint, + exclusiveMinimumTypeLint, + maxLengthTypeLint, + minLengthTypeLint, + uniqueItemsTypeLint, + enumTypeLint, + multipleOfTypeLint, + requiredFields3_0__3_1Lint, + allowedFields2_0Lint, allowedFields3_0Lint, allowedFields3_1Lint, ]; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/items--required.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/items--required.ts new file mode 100644 index 000000000..b160ec4ec --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/items--required.ts @@ -0,0 +1,39 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const itemsRequiredLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_ITEMS_REQUIRED, + source: 'apilint', + message: "should have an 'items' if 'type'=array", + severity: DiagnosticSeverity.Error, + linterFunction: 'hasRequiredField', + linterParams: ['items'], + marker: 'key', + conditions: [ + { + targets: [{ path: 'type' }], + function: 'apilintContainsValue', + params: ['array'], + }, + { + function: 'missingField', + params: ['$ref'], + }, + ], + data: { + quickFix: [ + { + message: "add 'items' field", + action: 'addChild', + snippetYaml: 'items: \n \n', + snippetJson: '"items": {\n \n },\n', + }, + ], + }, + targetSpecs: OpenAPI2, +}; + +export default itemsRequiredLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/items--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/items--type.ts new file mode 100644 index 000000000..482dc8680 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/items--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const itemsTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_ITEMS_TYPE, + source: 'apilint', + message: "'items' must be an object", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: ['items'], + marker: 'value', + target: 'items', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default itemsTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/max-length--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/max-length--type.ts new file mode 100644 index 000000000..b2e52f78a --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/max-length--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const maxLengthTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_MAX_LENGTH_TYPE, + source: 'apilint', + message: 'maxLength must be an integer', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintNumber', + linterParams: [true, true, true], + marker: 'value', + target: 'maxLength', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default maxLengthTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/maximum--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/maximum--type.ts new file mode 100644 index 000000000..b045012f7 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/maximum--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const maximumTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_MAXIMUM_TYPE, + source: 'apilint', + message: 'maximum must be a number', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['number'], + marker: 'value', + target: 'maximum', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default maximumTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/min-length--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/min-length--type.ts new file mode 100644 index 000000000..9fbec8b4b --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/min-length--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const minLengthTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_MIN_LENGTH_TYPE, + source: 'apilint', + message: 'minLength must be an integer', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintNumber', + linterParams: [true, true, true], + marker: 'value', + target: 'minLength', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default minLengthTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/minimum--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/minimum--type.ts new file mode 100644 index 000000000..ce4a73eb5 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/minimum--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const minimumTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_MINIMUM_TYPE, + source: 'apilint', + message: 'minimum must be a number', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['number'], + marker: 'value', + target: 'minimum', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default minimumTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/multiple-of--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/multiple-of--type.ts new file mode 100644 index 000000000..292158ddd --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/multiple-of--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const multipleOfTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_MULTIPLE_OF_TYPE, + source: 'apilint', + message: 'multipleOf must be a number', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['number'], + marker: 'value', + target: 'multipleOf', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default multipleOfTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/name--required.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/name--required.ts index 6f5c3056c..88df5daa8 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/name--required.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/name--required.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 nameRequiredLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_NAME_REQUIRED, + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_NAME_REQUIRED, source: 'apilint', message: "should always have a 'name'", severity: DiagnosticSeverity.Error, @@ -28,7 +28,7 @@ const nameRequiredLint: LinterMeta = { params: ['$ref'], }, ], - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default nameRequiredLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/name--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/name--type.ts index 9bbd21b85..731a4a971 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/name--type.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/name--type.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 nameTypeLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_NAME_TYPE, + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_NAME_TYPE, source: 'apilint', message: 'name must be a string', severity: DiagnosticSeverity.Error, @@ -14,7 +14,7 @@ const nameTypeLint: LinterMeta = { marker: 'value', target: 'name', data: {}, - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default nameTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/required--equals.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/required--equals.ts index 7f9ba6b79..6b01c7d41 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/required--equals.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/required--equals.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 requiredEqualsLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_REQUIRED_EQUALS, + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_REQUIRED_EQUALS, source: 'apilint', message: "'required' must be true", severity: DiagnosticSeverity.Error, @@ -21,7 +21,7 @@ const requiredEqualsLint: LinterMeta = { }, ], data: {}, - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default requiredEqualsLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/required--required.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/required--required.ts index ee2cfff42..61c85a7dc 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/required--required.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/required--required.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 requiredRequiredLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_REQUIRED_REQUIRED, + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_REQUIRED_REQUIRED, source: 'apilint', message: "should always have a 'required'", severity: DiagnosticSeverity.Error, @@ -33,7 +33,7 @@ const requiredRequiredLint: LinterMeta = { }, ], }, - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default requiredRequiredLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/required--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/required--type.ts index eaaed8b1a..a97a4f6ee 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/required--type.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/required--type.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 requiredTypeLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_REQUIRED_TYPE, + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_REQUIRED_TYPE, source: 'apilint', message: 'required must be a boolean', severity: DiagnosticSeverity.Error, @@ -14,7 +14,7 @@ const requiredTypeLint: LinterMeta = { marker: 'value', target: 'required', data: {}, - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default requiredTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/required-fields.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/required-fields-3-0--3-1.ts similarity index 85% rename from packages/apidom-ls/src/config/openapi/parameter/lint/required-fields.ts rename to packages/apidom-ls/src/config/openapi/parameter/lint/required-fields-3-0--3-1.ts index e8ecd6880..e983dbb27 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/required-fields.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/required-fields-3-0--3-1.ts @@ -4,7 +4,8 @@ import ApilintCodes from '../../../codes'; import { LinterMeta } from '../../../../apidom-language-types'; import { OpenAPI3 } from '../../target-specs'; -const requiredFieldsLint: LinterMeta = { +// eslint-disable-next-line @typescript-eslint/naming-convention +const requiredFields3_0__3_1Lint: LinterMeta = { code: ApilintCodes.OPENAPI3_0_PARAMETER_REQUIRED_FIELDS, source: 'apilint', message: 'Parameter Object must contain one of the following fields: content, schema', @@ -35,4 +36,4 @@ const requiredFieldsLint: LinterMeta = { targetSpecs: OpenAPI3, }; -export default requiredFieldsLint; +export default requiredFields3_0__3_1Lint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/schema--required.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/schema--required.ts new file mode 100644 index 000000000..83b389757 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/schema--required.ts @@ -0,0 +1,39 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const schemaRequiredLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_SCHEMA_REQUIRED, + source: 'apilint', + message: "should have a 'schema' if `in` is 'body'", + severity: DiagnosticSeverity.Error, + linterFunction: 'hasRequiredField', + linterParams: ['schema'], + marker: 'key', + conditions: [ + { + targets: [{ path: 'in' }], + function: 'apilintContainsValue', + params: ['body'], + }, + { + function: 'missingField', + params: ['$ref'], + }, + ], + data: { + quickFix: [ + { + message: "add 'schema' field", + action: 'addChild', + snippetYaml: 'schema: \n \n', + snippetJson: '"schema": {\n \n },\n', + }, + ], + }, + targetSpecs: OpenAPI2, +}; + +export default schemaRequiredLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/schema--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/schema--type.ts index 448d4be9d..608251473 100644 --- a/packages/apidom-ls/src/config/openapi/parameter/lint/schema--type.ts +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/schema--type.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 schemaTypeLint: LinterMeta = { - code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_SCHEMA_TYPE, + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_SCHEMA_TYPE, source: 'apilint', message: 'schema must be an object', severity: DiagnosticSeverity.Error, @@ -14,7 +14,7 @@ const schemaTypeLint: LinterMeta = { marker: 'value', target: 'schema', data: {}, - targetSpecs: OpenAPI3, + targetSpecs: [...OpenAPI2, ...OpenAPI3], }; export default schemaTypeLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/type--equals.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/type--equals.ts new file mode 100644 index 000000000..d0657b271 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/type--equals.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const typeEqualsLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_TYPE_EQUALS, + source: 'apilint', + message: "'in' must be one of allowed values: query, header, path, formData, body", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintValueOrArray', + linterParams: [['string', 'number', 'integer', 'boolean', 'array', 'file']], + marker: 'value', + target: 'type', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default typeEqualsLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/type--required.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/type--required.ts new file mode 100644 index 000000000..bd77283d4 --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/type--required.ts @@ -0,0 +1,39 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const typeRequiredLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_TYPE_REQUIRED, + source: 'apilint', + message: "should always have a 'type' if 'in' is any value other than 'body'", + severity: DiagnosticSeverity.Error, + linterFunction: 'hasRequiredField', + linterParams: ['type'], + marker: 'key', + conditions: [ + { + targets: [{ path: 'in' }], + function: 'apilintValueOrArray', + params: [['query', 'header', 'path', 'formData']], + }, + { + function: 'missingField', + params: ['$ref'], + }, + ], + data: { + quickFix: [ + { + message: "add 'type' field", + action: 'addChild', + snippetYaml: 'type: \n ', + snippetJson: '"type": ,\n ', + }, + ], + }, + targetSpecs: OpenAPI2, +}; + +export default typeRequiredLint; diff --git a/packages/apidom-ls/src/config/openapi/parameter/lint/unique-items--type.ts b/packages/apidom-ls/src/config/openapi/parameter/lint/unique-items--type.ts new file mode 100644 index 000000000..73bcca06d --- /dev/null +++ b/packages/apidom-ls/src/config/openapi/parameter/lint/unique-items--type.ts @@ -0,0 +1,20 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../target-specs'; + +const uniqueItemsTypeLint: LinterMeta = { + code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_UNIQUE_ITEMS_TYPE, + source: 'apilint', + message: 'uniqueItems must be a boolean', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['boolean'], + marker: 'value', + target: 'uniqueItems', + data: {}, + targetSpecs: OpenAPI2, +}; + +export default uniqueItemsTypeLint; diff --git a/packages/apidom-ls/test/fixtures/validation/oas/path-template-all-defined-2-0.yaml b/packages/apidom-ls/test/fixtures/validation/oas/path-template-all-defined-2-0.yaml index 45ddea638..6ad8de281 100644 --- a/packages/apidom-ls/test/fixtures/validation/oas/path-template-all-defined-2-0.yaml +++ b/packages/apidom-ls/test/fixtures/validation/oas/path-template-all-defined-2-0.yaml @@ -3,14 +3,12 @@ info: title: Foo version: 0.1.0 parameters: - test_id: - name: test_id - in: path - required: true - schema: - type: string - format: uuid - title: Test Id + test_id: + name: test_id + in: path + required: true + type: string + format: uuid paths: /foo/bar/{baz}/test/{foo_id}/baz/{bar_id}: delete: @@ -20,17 +18,13 @@ paths: - name: foo_id in: path required: true - schema: - type: string - format: uuid - title: Foo Id + type: string + format: uuid - name: bar_id in: path required: true - schema: - type: string - format: uuid - title: Bar Id + type: string + format: uuid responses: '200': description: Successful Response @@ -45,10 +39,8 @@ paths: - name: foo_id in: path required: true - schema: - type: string - format: uuid - title: Foo Id + type: string + format: uuid responses: '200': description: Successful Response @@ -72,10 +64,8 @@ paths: - name: x_id in: path required: true - schema: - type: string - format: uuid - title: X Id + type: string + format: uuid /both_parameters_and_operations_object/{a_id}/{b_id}/{c_id}: get: summary: Get both parameters and operations object a b c @@ -84,10 +74,8 @@ paths: - name: b_id in: path required: true - schema: - type: string - format: uuid - title: B Id + type: string + format: uuid responses: '200': description: Successful Response @@ -98,7 +86,5 @@ paths: - name: a_id in: path required: true - schema: - type: string - format: uuid - title: A Id + type: string + format: uuid diff --git a/packages/apidom-ls/test/validate.ts b/packages/apidom-ls/test/validate.ts index 38084135b..7c19689d3 100644 --- a/packages/apidom-ls/test/validate.ts +++ b/packages/apidom-ls/test/validate.ts @@ -3403,28 +3403,28 @@ describe('apidom-ls-validate', function () { const result = await languageService.doValidation(doc, validationContext); const expected: Diagnostic[] = [ { - range: { start: { line: 14, character: 2 }, end: { line: 14, character: 43 } }, + range: { start: { line: 12, character: 2 }, end: { line: 12, character: 43 } }, message: 'path template expressions is not matched with Parameter Object(s)', severity: 1, code: 3040101, source: 'apilint', }, { - range: { start: { line: 39, character: 2 }, end: { line: 39, character: 25 } }, + range: { start: { line: 33, character: 2 }, end: { line: 33, character: 25 } }, message: 'path template expressions is not matched with Parameter Object(s)', severity: 1, code: 3040101, source: 'apilint', }, { - range: { start: { line: 69, character: 2 }, end: { line: 69, character: 39 } }, + range: { start: { line: 61, character: 2 }, end: { line: 61, character: 39 } }, message: 'path template expressions is not matched with Parameter Object(s)', severity: 1, code: 3040101, source: 'apilint', }, { - range: { start: { line: 78, character: 2 }, end: { line: 78, character: 61 } }, + range: { start: { line: 68, character: 2 }, end: { line: 68, character: 61 } }, message: 'path template expressions is not matched with Parameter Object(s)', severity: 1, code: 3040101,