diff --git a/packages/apidom-ls/src/config/common/schema/lint/allowed-fields-openapi-2-0.ts b/packages/apidom-ls/src/config/common/schema/lint/allowed-fields-openapi-2-0.ts new file mode 100644 index 000000000..4b1084c92 --- /dev/null +++ b/packages/apidom-ls/src/config/common/schema/lint/allowed-fields-openapi-2-0.ts @@ -0,0 +1,57 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI2 } from '../../../openapi/target-specs'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +const allowedFieldsOpenAPI2_0Lint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + /** + * Technically additional JSON Schema keywords can be present, they are just unsupported. + * That's why we use Warning severity here instead of Error. + */ + severity: DiagnosticSeverity.Warning, + linterFunction: 'allowedFields', + linterParams: [ + [ + '$ref', + 'format', + 'title', + 'description', + 'default', + 'multipleOf', + 'maximum', + 'exclusiveMaximum', + 'minimum', + 'exclusiveMinimum', + 'maxLength', + 'minLength', + 'pattern', + 'maxItems', + 'minItems', + 'uniqueItems', + 'maxProperties', + 'minProperties', + 'required', + 'enum', + 'type', + 'items', + 'allOf', + 'properties', + 'additionalProperties', + 'discriminator', + 'readOnly', + 'xml', + 'externalDocs', + 'example', + ], + 'x-', + ], + marker: 'key', + targetSpecs: OpenAPI2, +}; + +export default allowedFieldsOpenAPI2_0Lint; diff --git a/packages/apidom-ls/src/config/common/schema/lint/allowed-fields-openapi-3-0.ts b/packages/apidom-ls/src/config/common/schema/lint/allowed-fields-openapi-3-0.ts new file mode 100644 index 000000000..56f2e443d --- /dev/null +++ b/packages/apidom-ls/src/config/common/schema/lint/allowed-fields-openapi-3-0.ts @@ -0,0 +1,63 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; +import { OpenAPI30 } from '../../../openapi/target-specs'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +const allowedFieldsOpenAPI3_0Lint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + /** + * Technically additional JSON Schema keywords can be present, they are just unsupported. + * That's why we use Warning severity here instead of Error. + */ + severity: DiagnosticSeverity.Warning, + linterFunction: 'allowedFields', + linterParams: [ + [ + '$ref', + 'title', + 'multipleOf', + 'maximum', + 'exclusiveMaximum', + 'minimum', + 'exclusiveMinimum', + 'maxLength', + 'minLength', + 'pattern', + 'maxItems', + 'minItems', + 'uniqueItems', + 'maxProperties', + 'minProperties', + 'required', + 'enum', + 'type', + 'allOf', + 'oneOf', + 'anyOf', + 'not', + 'items', + 'properties', + 'additionalProperties', + 'description', + 'format', + 'default', + 'nullable', + 'discriminator', + 'readOnly', + 'writeOnly', + 'xml', + 'externalDocs', + 'example', + 'deprecated', + ], + 'x-', + ], + marker: 'key', + targetSpecs: OpenAPI30, +}; + +export default allowedFieldsOpenAPI3_0Lint; diff --git a/packages/apidom-ls/src/config/common/schema/lint/discriminator--type-openapi-2--asyncapi-2.ts b/packages/apidom-ls/src/config/common/schema/lint/discriminator--type-openapi-2-0--asyncapi-2.ts similarity index 84% rename from packages/apidom-ls/src/config/common/schema/lint/discriminator--type-openapi-2--asyncapi-2.ts rename to packages/apidom-ls/src/config/common/schema/lint/discriminator--type-openapi-2-0--asyncapi-2.ts index 0ec3635ea..26ab4709d 100644 --- a/packages/apidom-ls/src/config/common/schema/lint/discriminator--type-openapi-2--asyncapi-2.ts +++ b/packages/apidom-ls/src/config/common/schema/lint/discriminator--type-openapi-2-0--asyncapi-2.ts @@ -6,7 +6,7 @@ import { AsyncAPI2 } from '../../../asyncapi/target-specs'; import { OpenAPI2 } from '../../../openapi/target-specs'; // eslint-disable-next-line @typescript-eslint/naming-convention -const discriminatorTypeOpenAPI2__AsyncAPI2Lint: LinterMeta = { +const discriminatorTypeOpenAPI2_0__AsyncAPI2Lint: LinterMeta = { code: ApilintCodes.SCHEMA_DISCRIMINATOR, source: 'apilint', message: "'discriminator' value must be a string", @@ -19,4 +19,4 @@ const discriminatorTypeOpenAPI2__AsyncAPI2Lint: LinterMeta = { targetSpecs: [...AsyncAPI2, ...OpenAPI2], }; -export default discriminatorTypeOpenAPI2__AsyncAPI2Lint; +export default discriminatorTypeOpenAPI2_0__AsyncAPI2Lint; diff --git a/packages/apidom-ls/src/config/common/schema/lint/index.ts b/packages/apidom-ls/src/config/common/schema/lint/index.ts index ecc3a771d..875450a73 100644 --- a/packages/apidom-ls/src/config/common/schema/lint/index.ts +++ b/packages/apidom-ls/src/config/common/schema/lint/index.ts @@ -1,3 +1,5 @@ +import allowedFieldsOpenAPI2_0Lint from './allowed-fields-openapi-2-0'; +import allowedFieldsOpenAPI3_0Lint from './allowed-fields-openapi-3-0'; import $idFormatURILint from './$id--format-uri'; import $refValidLint from './$ref--valid'; import $refNoSiblingsLint from './$ref--no-siblings'; @@ -15,7 +17,7 @@ import containsTypeLint from './contains--type'; import containsTypeOpenAPI3_1__AsyncAPI2Lint from './contains--type-openapi-3-1--asyncapi-2'; import descriptionTypeLint from './description--type'; import discriminatorExistInRequiredLint from './discriminator--exist-in-required'; -import discriminatorTypeOpenAPI2__AsyncAPI2Lint from './discriminator--type-openapi-2--asyncapi-2'; +import discriminatorTypeOpenAPI2_0__AsyncAPI2Lint from './discriminator--type-openapi-2-0--asyncapi-2'; import discriminatorTypeOpenAPI3Lint from './discriminator--type-openapi-3'; import elseNonIfLint from './else--non-if'; import elseTypeLint from './else--type'; @@ -80,6 +82,8 @@ import writeOnlyTypeLint from './write-only--type'; import exampleDeprecatedLint from './example--deprecated'; const schemaLints = [ + allowedFieldsOpenAPI2_0Lint, + allowedFieldsOpenAPI3_0Lint, $idFormatURILint, $refValidLint, $refNoSiblingsLint, @@ -97,7 +101,7 @@ const schemaLints = [ containsTypeOpenAPI3_1__AsyncAPI2Lint, descriptionTypeLint, discriminatorExistInRequiredLint, - discriminatorTypeOpenAPI2__AsyncAPI2Lint, + discriminatorTypeOpenAPI2_0__AsyncAPI2Lint, discriminatorTypeOpenAPI3Lint, elseNonIfLint, elseTypeLint, diff --git a/packages/apidom-ls/test/validate.ts b/packages/apidom-ls/test/validate.ts index 58502e357..1f39a34bc 100644 --- a/packages/apidom-ls/test/validate.ts +++ b/packages/apidom-ls/test/validate.ts @@ -3750,7 +3750,6 @@ describe('apidom-ls-validate', function () { source: 'apilint', }, ]; - console.log(JSON.stringify(result, null, 2)); assert.deepEqual(result, expected as Diagnostic[]); languageService.terminate();