Skip to content

Commit f3c799f

Browse files
authored
feat(ls): add allowed fields lint rule for OpenAPI 2.0 Schema Object (#3709)
Refs #3613
1 parent f32ee83 commit f3c799f

File tree

5 files changed

+128
-5
lines changed

5 files changed

+128
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI2 } from '../../../openapi/target-specs';
6+
7+
// eslint-disable-next-line @typescript-eslint/naming-convention
8+
const allowedFieldsOpenAPI2_0Lint: LinterMeta = {
9+
code: ApilintCodes.NOT_ALLOWED_FIELDS,
10+
source: 'apilint',
11+
message: 'Object includes not allowed fields',
12+
/**
13+
* Technically additional JSON Schema keywords can be present, they are just unsupported.
14+
* That's why we use Warning severity here instead of Error.
15+
*/
16+
severity: DiagnosticSeverity.Warning,
17+
linterFunction: 'allowedFields',
18+
linterParams: [
19+
[
20+
'$ref',
21+
'format',
22+
'title',
23+
'description',
24+
'default',
25+
'multipleOf',
26+
'maximum',
27+
'exclusiveMaximum',
28+
'minimum',
29+
'exclusiveMinimum',
30+
'maxLength',
31+
'minLength',
32+
'pattern',
33+
'maxItems',
34+
'minItems',
35+
'uniqueItems',
36+
'maxProperties',
37+
'minProperties',
38+
'required',
39+
'enum',
40+
'type',
41+
'items',
42+
'allOf',
43+
'properties',
44+
'additionalProperties',
45+
'discriminator',
46+
'readOnly',
47+
'xml',
48+
'externalDocs',
49+
'example',
50+
],
51+
'x-',
52+
],
53+
marker: 'key',
54+
targetSpecs: OpenAPI2,
55+
};
56+
57+
export default allowedFieldsOpenAPI2_0Lint;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { DiagnosticSeverity } from 'vscode-languageserver-types';
2+
3+
import ApilintCodes from '../../../codes';
4+
import { LinterMeta } from '../../../../apidom-language-types';
5+
import { OpenAPI30 } from '../../../openapi/target-specs';
6+
7+
// eslint-disable-next-line @typescript-eslint/naming-convention
8+
const allowedFieldsOpenAPI3_0Lint: LinterMeta = {
9+
code: ApilintCodes.NOT_ALLOWED_FIELDS,
10+
source: 'apilint',
11+
message: 'Object includes not allowed fields',
12+
/**
13+
* Technically additional JSON Schema keywords can be present, they are just unsupported.
14+
* That's why we use Warning severity here instead of Error.
15+
*/
16+
severity: DiagnosticSeverity.Warning,
17+
linterFunction: 'allowedFields',
18+
linterParams: [
19+
[
20+
'$ref',
21+
'title',
22+
'multipleOf',
23+
'maximum',
24+
'exclusiveMaximum',
25+
'minimum',
26+
'exclusiveMinimum',
27+
'maxLength',
28+
'minLength',
29+
'pattern',
30+
'maxItems',
31+
'minItems',
32+
'uniqueItems',
33+
'maxProperties',
34+
'minProperties',
35+
'required',
36+
'enum',
37+
'type',
38+
'allOf',
39+
'oneOf',
40+
'anyOf',
41+
'not',
42+
'items',
43+
'properties',
44+
'additionalProperties',
45+
'description',
46+
'format',
47+
'default',
48+
'nullable',
49+
'discriminator',
50+
'readOnly',
51+
'writeOnly',
52+
'xml',
53+
'externalDocs',
54+
'example',
55+
'deprecated',
56+
],
57+
'x-',
58+
],
59+
marker: 'key',
60+
targetSpecs: OpenAPI30,
61+
};
62+
63+
export default allowedFieldsOpenAPI3_0Lint;

packages/apidom-ls/src/config/common/schema/lint/discriminator--type-openapi-2--asyncapi-2.ts renamed to packages/apidom-ls/src/config/common/schema/lint/discriminator--type-openapi-2-0--asyncapi-2.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { AsyncAPI2 } from '../../../asyncapi/target-specs';
66
import { OpenAPI2 } from '../../../openapi/target-specs';
77

88
// eslint-disable-next-line @typescript-eslint/naming-convention
9-
const discriminatorTypeOpenAPI2__AsyncAPI2Lint: LinterMeta = {
9+
const discriminatorTypeOpenAPI2_0__AsyncAPI2Lint: LinterMeta = {
1010
code: ApilintCodes.SCHEMA_DISCRIMINATOR,
1111
source: 'apilint',
1212
message: "'discriminator' value must be a string",
@@ -19,4 +19,4 @@ const discriminatorTypeOpenAPI2__AsyncAPI2Lint: LinterMeta = {
1919
targetSpecs: [...AsyncAPI2, ...OpenAPI2],
2020
};
2121

22-
export default discriminatorTypeOpenAPI2__AsyncAPI2Lint;
22+
export default discriminatorTypeOpenAPI2_0__AsyncAPI2Lint;

packages/apidom-ls/src/config/common/schema/lint/index.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import allowedFieldsOpenAPI2_0Lint from './allowed-fields-openapi-2-0';
2+
import allowedFieldsOpenAPI3_0Lint from './allowed-fields-openapi-3-0';
13
import $idFormatURILint from './$id--format-uri';
24
import $refValidLint from './$ref--valid';
35
import $refNoSiblingsLint from './$ref--no-siblings';
@@ -15,7 +17,7 @@ import containsTypeLint from './contains--type';
1517
import containsTypeOpenAPI3_1__AsyncAPI2Lint from './contains--type-openapi-3-1--asyncapi-2';
1618
import descriptionTypeLint from './description--type';
1719
import discriminatorExistInRequiredLint from './discriminator--exist-in-required';
18-
import discriminatorTypeOpenAPI2__AsyncAPI2Lint from './discriminator--type-openapi-2--asyncapi-2';
20+
import discriminatorTypeOpenAPI2_0__AsyncAPI2Lint from './discriminator--type-openapi-2-0--asyncapi-2';
1921
import discriminatorTypeOpenAPI3Lint from './discriminator--type-openapi-3';
2022
import elseNonIfLint from './else--non-if';
2123
import elseTypeLint from './else--type';
@@ -80,6 +82,8 @@ import writeOnlyTypeLint from './write-only--type';
8082
import exampleDeprecatedLint from './example--deprecated';
8183

8284
const schemaLints = [
85+
allowedFieldsOpenAPI2_0Lint,
86+
allowedFieldsOpenAPI3_0Lint,
8387
$idFormatURILint,
8488
$refValidLint,
8589
$refNoSiblingsLint,
@@ -97,7 +101,7 @@ const schemaLints = [
97101
containsTypeOpenAPI3_1__AsyncAPI2Lint,
98102
descriptionTypeLint,
99103
discriminatorExistInRequiredLint,
100-
discriminatorTypeOpenAPI2__AsyncAPI2Lint,
104+
discriminatorTypeOpenAPI2_0__AsyncAPI2Lint,
101105
discriminatorTypeOpenAPI3Lint,
102106
elseNonIfLint,
103107
elseTypeLint,

packages/apidom-ls/test/validate.ts

-1
Original file line numberDiff line numberDiff line change
@@ -3750,7 +3750,6 @@ describe('apidom-ls-validate', function () {
37503750
source: 'apilint',
37513751
},
37523752
];
3753-
console.log(JSON.stringify(result, null, 2));
37543753
assert.deepEqual(result, expected as Diagnostic[]);
37553754

37563755
languageService.terminate();

0 commit comments

Comments
 (0)