Skip to content

Commit 14baa34

Browse files
committed
feat(ls): provide OpenAPI 3.0.x Link lint rules
Refs #2033
1 parent 4498e55 commit 14baa34

File tree

9 files changed

+110
-1
lines changed

9 files changed

+110
-1
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,12 @@ enum ApilintCodes {
787787
OPENAPI3_0_REFERENCE_FIELD_$REF_FORMAT_URI = 5260100,
788788
OPENAPI3_0_REFERENCE_FIELD_$REF_NO_SIBLINGS,
789789

790+
OPENAPI3_0_LINK = 5270000,
791+
OPENAPI3_0_LINK_FIELD_OPERATION_REF_FORMAT_URI = 5270100,
792+
OPENAPI3_0_LINK_FIELD_OPERATION_ID_TYPE = 5270200,
793+
OPENAPI3_0_LINK_FIELD_DESCRIPTION_TYPE = 5270300,
794+
OPENAPI3_0_LINK_FIELD_SERVER_TYPE = 5270400,
795+
790796
OPENAPI3_1 = 7000000,
791797

792798
OPENAPI3_1_OPENAPI_VALUE_PATTERN_3_1_0 = 7000100,
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
// eslint-disable-next-line @typescript-eslint/naming-convention
5+
const allowedFields3_0Lint: 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+
['operationRef', 'operationId', 'parameters', 'requestBody', 'description', 'server', '$ref'],
13+
'x-',
14+
],
15+
marker: 'key',
16+
targetSpecs: [
17+
{ namespace: 'openapi', version: '3.0.0' },
18+
{ namespace: 'openapi', version: '3.0.1' },
19+
{ namespace: 'openapi', version: '3.0.2' },
20+
{ namespace: 'openapi', version: '3.0.3' },
21+
],
22+
};
23+
export default allowedFields3_0Lint;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const descriptionTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_LINK_FIELD_DESCRIPTION_TYPE,
6+
source: 'apilint',
7+
message: 'description must be a string',
8+
severity: 1,
9+
linterFunction: 'apilintType',
10+
linterParams: ['string'],
11+
marker: 'value',
12+
target: 'description',
13+
data: {},
14+
};
15+
16+
export default descriptionTypeLint;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import allowedFields3_0Lint from './allowed-fields-3-0';
2+
import operationRefFormatUriLink from './operation-ref--format-uri';
3+
import operationIdTypeLint from './operation-id--type';
4+
import descriptionTypeLint from './description--type';
5+
import serverTypeLint from './server--type';
6+
7+
const links = [
8+
operationRefFormatUriLink,
9+
operationIdTypeLint,
10+
descriptionTypeLint,
11+
serverTypeLint,
12+
allowedFields3_0Lint,
13+
];
14+
15+
export default links;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const operationIdTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_LINK_FIELD_OPERATION_ID_TYPE,
6+
source: 'apilint',
7+
message: "operationId' value must be a string",
8+
severity: 1,
9+
linterFunction: 'apilintType',
10+
linterParams: ['string'],
11+
marker: 'value',
12+
target: 'operationId',
13+
data: {},
14+
};
15+
16+
export default operationIdTypeLint;
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 operationRefFormatURILint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_LINK_FIELD_OPERATION_REF_FORMAT_URI,
6+
source: 'apilint',
7+
message: "'operationRef' value must be a valid URI-reference",
8+
severity: 1,
9+
linterFunction: 'apilintValidURI',
10+
marker: 'value',
11+
target: 'operationRef',
12+
data: {},
13+
};
14+
15+
export default operationRefFormatURILint;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import ApilintCodes from '../../../codes';
2+
import { LinterMeta } from '../../../../apidom-language-types';
3+
4+
const serverTypeLint: LinterMeta = {
5+
code: ApilintCodes.OPENAPI3_0_LINK_FIELD_SERVER_TYPE,
6+
source: 'apilint',
7+
message: 'server must be an object',
8+
severity: 1,
9+
linterFunction: 'apilintElementOrClass',
10+
linterParams: ['server'],
11+
marker: 'value',
12+
target: 'server',
13+
data: {},
14+
};
15+
16+
export default serverTypeLint;

packages/apidom-ls/src/config/openapi/link/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/security-scheme/lint/scheme--required.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
22
import { LinterMeta } from '../../../../apidom-language-types';
33

44
const schemeRequiredLint: LinterMeta = {
5-
code: ApilintCodes.OPENAPI3_SECURITY_SCHEME_FIELD_SCHEME_REQUIRED,
5+
code: ApilintCodes.OPENAPI3_0_SECURITY_SCHEME_FIELD_SCHEME_REQUIRED,
66
source: 'apilint',
77
message: "should always have a 'scheme'",
88
severity: 1,

0 commit comments

Comments
 (0)