Skip to content

Commit d59ea33

Browse files
committed
feat(ls): provide OpenAPI 3.0.x Components lint rules
Refs #2033
1 parent b281f76 commit d59ea33

15 files changed

+249
-0
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,18 @@ enum ApilintCodes {
615615
OPENAPI3_0_EXTERNAL_DOCUMENTATION_FIELD_URL_FORMAT_URI = 5050200,
616616
OPENAPI3_0_EXTERNAL_DOCUMENTATION_FIELD_URL_REQUIRED,
617617

618+
OPENAPI3_0_COMPONENTS = 5060000,
619+
OPENAPI3_0_COMPONENTS_KEYS_PATTERN,
620+
OPENAPI3_0_COMPONENTS_FIELD_SCHEMAS_VALUES_TYPE = 5060100,
621+
OPENAPI3_0_COMPONENTS_FIELD_RESPONSES_VALUES_TYPE = 5060200,
622+
OPENAPI3_0_COMPONENTS_FIELD_PARAMETERS_VALUES_TYPE = 5060300,
623+
OPENAPI3_0_COMPONENTS_FIELD_EXAMPLES_VALUES_TYPE = 5060400,
624+
OPENAPI3_0_COMPONENTS_FIELD_REQUEST_BODIES_VALUES_TYPE = 5060500,
625+
OPENAPI3_0_COMPONENTS_FIELD_HEADERS_VALUES_TYPE = 5060600,
626+
OPENAPI3_0_COMPONENTS_FIELD_SECURITY_SCHEMES_VALUES_TYPE = 5060700,
627+
OPENAPI3_0_COMPONENTS_FIELD_LINKS_VALUES_TYPE = 5060800,
628+
OPENAPI3_0_COMPONENTS_FIELD_CALLBACKS_VALUES_TYPE = 5060900,
629+
618630
OPENAPI3_1 = 7000000,
619631

620632
OPENAPI3_1_OPENAPI_VALUE_PATTERN_3_1_0 = 7000100,
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
// eslint-disable-next-line @typescript-eslint/naming-convention
5+
const allowedFieldsLint3_0: LinterMeta = {
6+
code: ApilintCodes.NOT_ALLOWED_FIELDS,
7+
source: 'apilint',
8+
message: 'Object includes not allowed fields',
9+
severity: 1,
10+
linterFunction: 'allowedFields',
11+
linterParams: [
12+
[
13+
'schemas',
14+
'responses',
15+
'parameters',
16+
'examples',
17+
'requestBodies',
18+
'headers',
19+
'securitySchemes',
20+
'links',
21+
'callbacks',
22+
],
23+
'x-',
24+
],
25+
marker: 'key',
26+
targetSpecs: [
27+
{ namespace: 'openapi', version: '3.0.0' },
28+
{ namespace: 'openapi', version: '3.0.1' },
29+
{ namespace: 'openapi', version: '3.0.2' },
30+
{ namespace: 'openapi', version: '3.0.3' },
31+
],
32+
};
33+
34+
export default allowedFieldsLint3_0;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const callbacksValuesTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_FIELD_CALLBACKS_VALUES_TYPE,
6+
source: 'apilint',
7+
message: '"callbacks" members must be Callback Object',
8+
severity: 1,
9+
linterFunction: 'apilintChildrenOfElementsOrClasses',
10+
linterParams: [['callback']],
11+
marker: 'key',
12+
markerTarget: 'callbacks',
13+
target: 'callbacks',
14+
data: {},
15+
};
16+
17+
export default callbacksValuesTypeLint;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const examplesValuesTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_FIELD_EXAMPLES_VALUES_TYPE,
6+
source: 'apilint',
7+
message: '"examples" members must be Example Object',
8+
severity: 1,
9+
linterFunction: 'apilintChildrenOfElementsOrClasses',
10+
linterParams: [['example']],
11+
marker: 'key',
12+
markerTarget: 'examples',
13+
target: 'examples',
14+
data: {},
15+
};
16+
17+
export default examplesValuesTypeLint;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const headersValuesTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_FIELD_HEADERS_VALUES_TYPE,
6+
source: 'apilint',
7+
message: '"headers" members must be Parameter Object',
8+
severity: 1,
9+
linterFunction: 'apilintChildrenOfElementsOrClasses',
10+
linterParams: [['header']],
11+
marker: 'key',
12+
markerTarget: 'headers',
13+
target: 'headers',
14+
data: {},
15+
};
16+
17+
export default headersValuesTypeLint;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import allowedFields3_0Lint from './allowed-fields-3-0';
2+
import schemasValuesTypeLint from './schemas--values-type';
3+
import responsesValuesTypeLint from './responses--values-type';
4+
import parametersValuesTypeLint from './parameters--values-type';
5+
import examplesValuesTypeLint from './examples--values-type';
6+
import requestBodiesValuesTypeLint from './request-bodies--values-type';
7+
import headersValuesTypeLint from './headers--values-type';
8+
import securitySchemesValuesType from './security-schemes--values-type';
9+
import linksValuesTypeLint from './links--values-type';
10+
import callbacksValuesTypeLint from './callbacks--values-type';
11+
import keysPatternLint from './keys--pattern';
12+
13+
const lints = [
14+
schemasValuesTypeLint,
15+
responsesValuesTypeLint,
16+
parametersValuesTypeLint,
17+
examplesValuesTypeLint,
18+
requestBodiesValuesTypeLint,
19+
headersValuesTypeLint,
20+
securitySchemesValuesType,
21+
linksValuesTypeLint,
22+
callbacksValuesTypeLint,
23+
keysPatternLint,
24+
allowedFields3_0Lint,
25+
];
26+
27+
export default lints;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const keysPatternLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_KEYS_PATTERN,
6+
source: 'apilint',
7+
message: 'components keys must match the regular expression: `^[a-zA-Z0-9\\.\\-_]+$`',
8+
severity: 1,
9+
linterFunction: 'apilintMembersKeysRegex',
10+
linterParams: ['^[a-zA-Z0-9\\.\\-_]+$'],
11+
marker: 'key',
12+
data: {},
13+
};
14+
15+
export default keysPatternLint;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const linksValuesTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_FIELD_LINKS_VALUES_TYPE,
6+
source: 'apilint',
7+
message: '"links" members must be Link Object',
8+
severity: 1,
9+
linterFunction: 'apilintChildrenOfElementsOrClasses',
10+
linterParams: [['link']],
11+
marker: 'key',
12+
markerTarget: 'links',
13+
target: 'links',
14+
data: {},
15+
};
16+
17+
export default linksValuesTypeLint;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const parametersValuesTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_FIELD_PARAMETERS_VALUES_TYPE,
6+
source: 'apilint',
7+
message: '"parameters" members must be Parameter Object',
8+
severity: 1,
9+
linterFunction: 'apilintChildrenOfElementsOrClasses',
10+
linterParams: [['parameter']],
11+
marker: 'key',
12+
markerTarget: 'parameters',
13+
target: 'parameters',
14+
data: {},
15+
};
16+
17+
export default parametersValuesTypeLint;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const requestBodiesValuesTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_FIELD_REQUEST_BODIES_VALUES_TYPE,
6+
source: 'apilint',
7+
message: '"requestBodies" members must be Request Body Object',
8+
severity: 1,
9+
linterFunction: 'apilintChildrenOfElementsOrClasses',
10+
linterParams: [['requestBody']],
11+
marker: 'key',
12+
markerTarget: 'requestBodies',
13+
target: 'requestBodies',
14+
data: {},
15+
};
16+
17+
export default requestBodiesValuesTypeLint;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const responsesValuesTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_FIELD_RESPONSES_VALUES_TYPE,
6+
source: 'apilint',
7+
message: '"responses" members must be Response Object',
8+
severity: 1,
9+
linterFunction: 'apilintChildrenOfElementsOrClasses',
10+
linterParams: [['response']],
11+
marker: 'key',
12+
markerTarget: 'responses',
13+
target: 'responses',
14+
data: {},
15+
};
16+
17+
export default responsesValuesTypeLint;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const schemasValuesTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_FIELD_SCHEMAS_VALUES_TYPE,
6+
source: 'apilint',
7+
message: '"schemas" members must be Schema Object',
8+
severity: 1,
9+
linterFunction: 'apilintChildrenOfElementsOrClasses',
10+
linterParams: [['schema']],
11+
marker: 'key',
12+
markerTarget: 'schemas',
13+
target: 'schemas',
14+
data: {},
15+
};
16+
17+
export default schemasValuesTypeLint;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const securitySchemesValuesTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_COMPONENTS_FIELD_SECURITY_SCHEMES_VALUES_TYPE,
6+
source: 'apilint',
7+
message: '"securitySchemes" members must be Security Scheme Object',
8+
severity: 1,
9+
linterFunction: 'apilintChildrenOfElementsOrClasses',
10+
linterParams: [['securityScheme']],
11+
marker: 'key',
12+
markerTarget: 'securitySchemes',
13+
target: 'securitySchemes',
14+
data: {},
15+
};
16+
17+
export default securitySchemesValuesTypeLint;

packages/apidom-ls/src/config/openapi/components/meta.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import lint from './lint';
12
import completion from './completion';
23
import documentation from './documentation';
34
import { FormatMeta } from '../../../apidom-language-types';
45

56
const meta: FormatMeta = {
7+
lint,
68
completion,
79
documentation,
810
};

packages/apidom-ls/src/config/openapi/license/lint/allowed-fields-3-0.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ const allowedFields3_0Lint: LinterMeta = {
1010
linterFunction: 'allowedFields',
1111
linterParams: [['name', 'url'], 'x-'],
1212
marker: 'key',
13+
targetSpecs: [
14+
{ namespace: 'openapi', version: '3.0.0' },
15+
{ namespace: 'openapi', version: '3.0.1' },
16+
{ namespace: 'openapi', version: '3.0.2' },
17+
{ namespace: 'openapi', version: '3.0.3' },
18+
],
1319
};
1420

1521
export default allowedFields3_0Lint;

0 commit comments

Comments
 (0)