Skip to content

Commit 88b79b6

Browse files
authored
feat(ls): add lint rules for OpenAPI 2.0 Parameter Object (#3602)
Refs #3104
1 parent 64d59b4 commit 88b79b6

34 files changed

+609
-76
lines changed

packages/apidom-ls/src/config/codes.ts

+30
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,35 @@ enum ApilintCodes {
706706
OPENAPI2_EXTERNAL_DOCUMENTATION_FIELD_URL_FORMAT_URI = 3090200,
707707
OPENAPI2_EXTERNAL_DOCUMENTATION_FIELD_URL_REQUIRED,
708708

709+
OPENAPI2_PARAMETER = 3100000,
710+
OPENAPI2_PARAMETER_FIELD_NAME_TYPE = 3100100,
711+
OPENAPI2_PARAMETER_FIELD_NAME_REQUIRED,
712+
OPENAPI2_PARAMETER_FIELD_IN_EQUALS = 3100200,
713+
OPENAPI2_PARAMETER_FIELD_IN_REQUIRED,
714+
OPENAPI2_PARAMETER_FIELD_IN_VALID,
715+
OPENAPI2_PARAMETER_FIELD_DESCRIPTION_TYPE = 3100300,
716+
OPENAPI2_PARAMETER_FIELD_REQUIRED_TYPE = 3100400,
717+
OPENAPI2_PARAMETER_FIELD_REQUIRED_REQUIRED,
718+
OPENAPI2_PARAMETER_FIELD_REQUIRED_EQUALS,
719+
OPENAPI2_PARAMETER_FIELD_SCHEMA_TYPE = 3100500,
720+
OPENAPI2_PARAMETER_FIELD_SCHEMA_REQUIRED,
721+
OPENAPI2_PARAMETER_FIELD_TYPE_EQUALS = 3100600,
722+
OPENAPI2_PARAMETER_FIELD_TYPE_REQUIRED,
723+
OPENAPI2_PARAMETER_FIELD_FORMAT_TYPE = 3100700,
724+
OPENAPI2_PARAMETER_FIELD_ALLOW_EMPTY_VALUE_TYPE = 3100800,
725+
OPENAPI2_PARAMETER_FIELD_ITEMS_TYPE = 3100900,
726+
OPENAPI2_PARAMETER_FIELD_ITEMS_REQUIRED,
727+
OPENAPI2_PARAMETER_FIELD_COLLECTION_FORMAT_EQUALS = 3101000,
728+
OPENAPI2_PARAMETER_FIELD_MAXIMUM_TYPE = 3101100,
729+
OPENAPI2_PARAMETER_FIELD_EXCLUSIVE_MAXIMUM_TYPE = 3101200,
730+
OPENAPI2_PARAMETER_FIELD_MINIMUM_TYPE = 3101300,
731+
OPENAPI2_PARAMETER_FIELD_EXCLUSIVE_MINIMUM_TYPE = 3101400,
732+
OPENAPI2_PARAMETER_FIELD_MAX_LENGTH_TYPE = 3101500,
733+
OPENAPI2_PARAMETER_FIELD_MIN_LENGTH_TYPE = 3101600,
734+
OPENAPI2_PARAMETER_FIELD_UNIQUE_ITEMS_TYPE = 3101700,
735+
OPENAPI2_PARAMETER_FIELD_ENUM_TYPE = 3101800,
736+
OPENAPI2_PARAMETER_FIELD_MULTIPLE_OF_TYPE = 3101900,
737+
709738
OPENAPI3_0 = 5000000,
710739

711740
OPENAPI3_0_OPENAPI_VALUE_PATTERN_3_0_0 = 5000100,
@@ -838,6 +867,7 @@ enum ApilintCodes {
838867
OPENAPI3_0_PARAMETER_FIELD_NAME_REQUIRED,
839868
OPENAPI3_0_PARAMETER_FIELD_IN_TYPE = 5150300,
840869
OPENAPI3_0_PARAMETER_FIELD_IN_REQUIRED,
870+
OPENAPI3_0_PARAMETER_FIELD_IN_EQUALS,
841871
OPENAPI3_0_PARAMETER_FIELD_DESCRIPTION_TYPE = 5150400,
842872
OPENAPI3_0_PARAMETER_FIELD_REQUIRED_TYPE = 5150500,
843873
OPENAPI3_0_PARAMETER_FIELD_REQUIRED_REQUIRED,

packages/apidom-ls/src/config/openapi/parameter/lint/allow-empty-value--type.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { DiagnosticSeverity } from 'vscode-languageserver-types';
22

33
import ApilintCodes from '../../../codes';
44
import { LinterMeta } from '../../../../apidom-language-types';
5-
import { OpenAPI3 } from '../../target-specs';
5+
import { OpenAPI2, OpenAPI3 } from '../../target-specs';
66

77
const allowEmptyValueTypeLint: LinterMeta = {
8-
code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_ALLOW_EMPTY_VALUE_TYPE,
8+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_ALLOW_EMPTY_VALUE_TYPE,
99
source: 'apilint',
1010
message: 'allowEmptyValue must be a boolean',
1111
severity: DiagnosticSeverity.Error,
@@ -14,7 +14,7 @@ const allowEmptyValueTypeLint: LinterMeta = {
1414
marker: 'value',
1515
target: 'allowEmptyValue',
1616
data: {},
17-
targetSpecs: OpenAPI3,
17+
targetSpecs: [...OpenAPI2, ...OpenAPI3],
1818
};
1919

2020
export default allowEmptyValueTypeLint;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI2 } from '../../target-specs';
6+
7+
// eslint-disable-next-line @typescript-eslint/naming-convention
8+
const allowedFields2_0Lint: LinterMeta = {
9+
code: ApilintCodes.NOT_ALLOWED_FIELDS,
10+
source: 'apilint',
11+
message: 'Object includes not allowed fields',
12+
severity: DiagnosticSeverity.Error,
13+
linterFunction: 'allowedFields',
14+
linterParams: [
15+
[
16+
'name',
17+
'in',
18+
'description',
19+
'required',
20+
'schema',
21+
'type',
22+
'format',
23+
'allowEmptyValue',
24+
'items',
25+
'collectionFormat',
26+
'default',
27+
'maximum',
28+
'exclusiveMaximum',
29+
'minimum',
30+
'exclusiveMinimum',
31+
'maxLength',
32+
'minLength',
33+
'pattern',
34+
'maxItems',
35+
'minItems',
36+
'uniqueItems',
37+
'enum',
38+
'multipleOf',
39+
'$ref',
40+
],
41+
'x-',
42+
],
43+
marker: 'key',
44+
targetSpecs: OpenAPI2,
45+
};
46+
47+
export default allowedFields2_0Lint;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI2 } from '../../target-specs';
6+
7+
const collectionFormatEqualsLint: LinterMeta = {
8+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_COLLECTION_FORMAT_EQUALS,
9+
source: 'apilint',
10+
message:
11+
"'collectionFormat' must be one of allowed values: 'csv', 'ssv', 'tsv', 'pipes', 'multi'",
12+
severity: DiagnosticSeverity.Error,
13+
linterFunction: 'apilintValueOrArray',
14+
linterParams: [['csv', 'ssv', 'tsv', 'pipes', 'multi']],
15+
marker: 'value',
16+
target: 'collectionFormat',
17+
data: {},
18+
targetSpecs: OpenAPI2,
19+
};
20+
21+
export default collectionFormatEqualsLint;

packages/apidom-ls/src/config/openapi/parameter/lint/description--type.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { DiagnosticSeverity } from 'vscode-languageserver-types';
22

33
import ApilintCodes from '../../../codes';
44
import { LinterMeta } from '../../../../apidom-language-types';
5-
import { OpenAPI3 } from '../../target-specs';
5+
import { OpenAPI2, OpenAPI3 } from '../../target-specs';
66

77
const descriptionTypeLint: LinterMeta = {
8-
code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_DESCRIPTION_TYPE,
8+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_DESCRIPTION_TYPE,
99
source: 'apilint',
1010
message: 'description must be a string',
1111
severity: DiagnosticSeverity.Error,
@@ -14,7 +14,7 @@ const descriptionTypeLint: LinterMeta = {
1414
marker: 'value',
1515
target: 'description',
1616
data: {},
17-
targetSpecs: OpenAPI3,
17+
targetSpecs: [...OpenAPI2, ...OpenAPI3],
1818
};
1919

2020
export default descriptionTypeLint;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI2 } from '../../target-specs';
6+
7+
const enumTypeLint: LinterMeta = {
8+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_ENUM_TYPE,
9+
source: 'apilint',
10+
message: 'enum must be an array',
11+
severity: DiagnosticSeverity.Error,
12+
linterFunction: 'apilintType',
13+
linterParams: ['array'],
14+
marker: 'value',
15+
target: 'enum',
16+
data: {},
17+
targetSpecs: OpenAPI2,
18+
};
19+
20+
export default enumTypeLint;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI2 } from '../../target-specs';
6+
7+
const exclusiveMaximumTypeLint: LinterMeta = {
8+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_EXCLUSIVE_MAXIMUM_TYPE,
9+
source: 'apilint',
10+
message: 'exclusiveMaximum must be a boolean',
11+
severity: DiagnosticSeverity.Error,
12+
linterFunction: 'apilintType',
13+
linterParams: ['boolean'],
14+
marker: 'value',
15+
target: 'exclusiveMaximum',
16+
data: {},
17+
targetSpecs: OpenAPI2,
18+
};
19+
20+
export default exclusiveMaximumTypeLint;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI2 } from '../../target-specs';
6+
7+
const exclusiveMinimumTypeLint: LinterMeta = {
8+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_EXCLUSIVE_MINIMUM_TYPE,
9+
source: 'apilint',
10+
message: 'exclusiveMinimum must be a boolean',
11+
severity: DiagnosticSeverity.Error,
12+
linterFunction: 'apilintType',
13+
linterParams: ['boolean'],
14+
marker: 'value',
15+
target: 'exclusiveMinimum',
16+
data: {},
17+
targetSpecs: OpenAPI2,
18+
};
19+
20+
export default exclusiveMinimumTypeLint;

packages/apidom-ls/src/config/openapi/parameter/lint/in--type.ts renamed to packages/apidom-ls/src/config/openapi/parameter/lint/format--type.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@ import { DiagnosticSeverity } from 'vscode-languageserver-types';
22

33
import ApilintCodes from '../../../codes';
44
import { LinterMeta } from '../../../../apidom-language-types';
5-
import { OpenAPI3 } from '../../target-specs';
5+
import { OpenAPI2 } from '../../target-specs';
66

7-
const inTypeLint: LinterMeta = {
8-
code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_IN_TYPE,
7+
const formatTypeLint: LinterMeta = {
8+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_FORMAT_TYPE,
99
source: 'apilint',
10-
message: 'in must be a string',
10+
message: 'format must be a string',
1111
severity: DiagnosticSeverity.Error,
1212
linterFunction: 'apilintType',
1313
linterParams: ['string'],
1414
marker: 'value',
15-
target: 'in',
15+
target: 'format',
1616
data: {},
17-
targetSpecs: OpenAPI3,
17+
targetSpecs: OpenAPI2,
1818
};
1919

20-
export default inTypeLint;
20+
export default formatTypeLint;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI2 } from '../../target-specs';
6+
7+
// eslint-disable-next-line @typescript-eslint/naming-convention
8+
const inEquals2_0Lint: LinterMeta = {
9+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_IN_EQUALS,
10+
source: 'apilint',
11+
message: "'in' must be one of allowed values: query, header, path, formData, body",
12+
severity: DiagnosticSeverity.Error,
13+
linterFunction: 'apilintValueOrArray',
14+
linterParams: [['query', 'header', 'path', 'formData', 'body']],
15+
marker: 'value',
16+
target: 'in',
17+
data: {},
18+
targetSpecs: OpenAPI2,
19+
};
20+
21+
export default inEquals2_0Lint;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI3 } from '../../target-specs';
6+
7+
// eslint-disable-next-line @typescript-eslint/naming-convention
8+
const inEquals3_0__3_1Lint: LinterMeta = {
9+
code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_IN_EQUALS,
10+
source: 'apilint',
11+
message: "'in' must be one of allowed values: query, header, path, cookie",
12+
severity: DiagnosticSeverity.Error,
13+
linterFunction: 'apilintValueOrArray',
14+
linterParams: [['query', 'header', 'path', 'cookie']],
15+
marker: 'value',
16+
target: 'in',
17+
data: {},
18+
targetSpecs: OpenAPI3,
19+
};
20+
21+
export default inEquals3_0__3_1Lint;

packages/apidom-ls/src/config/openapi/parameter/lint/in--required.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { DiagnosticSeverity } from 'vscode-languageserver-types';
22

33
import ApilintCodes from '../../../codes';
44
import { LinterMeta } from '../../../../apidom-language-types';
5-
import { OpenAPI3 } from '../../target-specs';
5+
import { OpenAPI2, OpenAPI3 } from '../../target-specs';
66

77
const inRequiredLint: LinterMeta = {
8-
code: ApilintCodes.OPENAPI3_0_PARAMETER_FIELD_IN_REQUIRED,
8+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_IN_REQUIRED,
99
source: 'apilint',
1010
message: "should always have an 'in'",
1111
severity: DiagnosticSeverity.Error,
@@ -28,7 +28,7 @@ const inRequiredLint: LinterMeta = {
2828
params: ['$ref'],
2929
},
3030
],
31-
targetSpecs: OpenAPI3,
31+
targetSpecs: [...OpenAPI2, ...OpenAPI3],
3232
};
3333

3434
export default inRequiredLint;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI2 } from '../../target-specs';
6+
7+
const inValidLint: LinterMeta = {
8+
code: ApilintCodes.OPENAPI2_PARAMETER_FIELD_IN_VALID,
9+
source: 'apilint',
10+
message: "'in' field must contain 'formData' value for 'type'=file",
11+
severity: DiagnosticSeverity.Error,
12+
linterFunction: 'apilintContainsValue',
13+
linterParams: ['formData'],
14+
marker: 'value',
15+
target: 'in',
16+
data: {},
17+
conditions: [
18+
{
19+
targets: [{ path: 'type' }],
20+
function: 'apilintContainsValue',
21+
params: ['file'],
22+
},
23+
{
24+
function: 'missingField',
25+
params: ['$ref'],
26+
},
27+
],
28+
targetSpecs: OpenAPI2,
29+
};
30+
31+
export default inValidLint;

0 commit comments

Comments
 (0)