Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions packages/apidom-ls/src/config/codes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
12 changes: 12 additions & 0 deletions packages/apidom-ls/src/services/validation/linter-functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down