Skip to content

OpenAPI 3.0.x Link Object language service rules #2180

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 24, 2022
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
52 changes: 29 additions & 23 deletions packages/apidom-ls/src/config/codes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -763,29 +763,35 @@ enum ApilintCodes {
OPENAPI3_0_XML_FIELD_ATTRIBUTE_TYPE = 5230400,
OPENAPI3_0_XML_FIELD_WRAPPED_TYPE = 5230500,

OPENAPI3_SECURITY_SCHEME = 5240000,
OPENAPI3_SECURITY_SCHEME_FIELD_TYPE_EQUALS = 5240100,
OPENAPI3_SECURITY_SCHEME_FIELD_DESCRIPTION_TYPE = 5240200,
OPENAPI3_SECURITY_SCHEME_FIELD_NAME_TYPE = 5240300,
OPENAPI3_SECURITY_SCHEME_FIELD_NAME_REQUIRED,
OPENAPI3_SECURITY_SCHEME_FIELD_IN_EQUALS = 5240400,
OPENAPI3_SECURITY_SCHEME_FIELD_IN_REQUIRED,
OPENAPI3_SECURITY_SCHEME_FIELD_SCHEME_TYPE = 5240500,
OPENAPI3_SECURITY_SCHEME_FIELD_SCHEME_REQUIRED,
OPENAPI3_SECURITY_SCHEME_FIELD_BEARER_FORMAT_TYPE = 5240600,
OPENAPI3_SECURITY_SCHEME_FIELD_FLOWS_TYPE = 5240700,
OPENAPI3_SECURITY_SCHEME_FIELD_FLOWS_REQUIRED,
OPENAPI3_SECURITY_SCHEME_FIELD_OPEN_ID_CONNECT_URL_FORMAT_URI = 5240800,
OPENAPI3_SECURITY_SCHEME_FIELD_OPEN_ID_CONNECT_URL_REQUIRED,

OPENAPI3_DISCRIMINATOR = 5250000,
OPENAPI3_DISCRIMINATOR_FIELD_PROPERTY_NAME_TYPE = 5250100,
OPENAPI3_DISCRIMINATOR_FIELD_PROPERTY_NAME_REQUIRED,
OPENAPI3_DISCRIMINATOR_FIELD_MAPPING_TYPE = 5250200,

OPENAPI3_REFERENCE = 5260000,
OPENAPI3_REFERENCE_FIELD_$REF_FORMAT_URI = 5260100,
OPENAPI3_REFERENCE_FIELD_$REF_NO_SIBLINGS,
OPENAPI3_0_SECURITY_SCHEME = 5240000,
OPENAPI3_0_SECURITY_SCHEME_FIELD_TYPE_EQUALS = 5240100,
OPENAPI3_0_SECURITY_SCHEME_FIELD_DESCRIPTION_TYPE = 5240200,
OPENAPI3_0_SECURITY_SCHEME_FIELD_NAME_TYPE = 5240300,
OPENAPI3_0_SECURITY_SCHEME_FIELD_NAME_REQUIRED,
OPENAPI3_0_SECURITY_SCHEME_FIELD_IN_EQUALS = 5240400,
OPENAPI3_0_SECURITY_SCHEME_FIELD_IN_REQUIRED,
OPENAPI3_0_SECURITY_SCHEME_FIELD_SCHEME_TYPE = 5240500,
OPENAPI3_0_SECURITY_SCHEME_FIELD_SCHEME_REQUIRED,
OPENAPI3_0_SECURITY_SCHEME_FIELD_BEARER_FORMAT_TYPE = 5240600,
OPENAPI3_0_SECURITY_SCHEME_FIELD_FLOWS_TYPE = 5240700,
OPENAPI3_0_SECURITY_SCHEME_FIELD_FLOWS_REQUIRED,
OPENAPI3_0_SECURITY_SCHEME_FIELD_OPEN_ID_CONNECT_URL_FORMAT_URI = 5240800,
OPENAPI3_0_SECURITY_SCHEME_FIELD_OPEN_ID_CONNECT_URL_REQUIRED,

OPENAPI3_0_DISCRIMINATOR = 5250000,
OPENAPI3_0_DISCRIMINATOR_FIELD_PROPERTY_NAME_TYPE = 5250100,
OPENAPI3_0_DISCRIMINATOR_FIELD_PROPERTY_NAME_REQUIRED,
OPENAPI3_0_DISCRIMINATOR_FIELD_MAPPING_TYPE = 5250200,

OPENAPI3_0_REFERENCE = 5260000,
OPENAPI3_0_REFERENCE_FIELD_$REF_FORMAT_URI = 5260100,
OPENAPI3_0_REFERENCE_FIELD_$REF_NO_SIBLINGS,

OPENAPI3_0_LINK = 5270000,
OPENAPI3_0_LINK_FIELD_OPERATION_REF_FORMAT_URI = 5270100,
OPENAPI3_0_LINK_FIELD_OPERATION_ID_TYPE = 5270200,
OPENAPI3_0_LINK_FIELD_DESCRIPTION_TYPE = 5270300,
OPENAPI3_0_LINK_FIELD_SERVER_TYPE = 5270400,

OPENAPI3_1 = 7000000,

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const mappingTypeLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_DISCRIMINATOR_FIELD_MAPPING_TYPE,
code: ApilintCodes.OPENAPI3_0_DISCRIMINATOR_FIELD_MAPPING_TYPE,
source: 'apilint',
message: "'mapping' must be an object",
severity: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const propertyNameRequiredLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_DISCRIMINATOR_FIELD_PROPERTY_NAME_REQUIRED,
code: ApilintCodes.OPENAPI3_0_DISCRIMINATOR_FIELD_PROPERTY_NAME_REQUIRED,
source: 'apilint',
message: "should always have a 'propertyName'",
severity: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const propertyNameTypeLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_DISCRIMINATOR_FIELD_PROPERTY_NAME_TYPE,
code: ApilintCodes.OPENAPI3_0_DISCRIMINATOR_FIELD_PROPERTY_NAME_TYPE,
source: 'apilint',
message: "'propertyName' must be a string",
severity: 1,
Expand Down
106 changes: 106 additions & 0 deletions packages/apidom-ls/src/config/openapi/link/completion.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import {
ApidomCompletionItem,
CompletionFormat,
CompletionType,
} from '../../../apidom-language-types';

const completion: ApidomCompletionItem[] = [
{
label: 'operationRef',
insertText: 'operationRef',
kind: 14,
format: CompletionFormat.QUOTED,
type: CompletionType.PROPERTY,
insertTextFormat: 2,
documentation: {
kind: 'markdown',
value:
'A relative or absolute URI reference to an OAS operation. This field is mutually exclusive of the `operationId` field, and MUST point to an [Operation Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operationObject). Relative `operationRef` values MAY be used to locate an existing [Operation Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operationObject) in the OpenAPI definition.',
},
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' },
],
},
{
label: 'operationId',
insertText: 'operationId',
kind: 14,
format: CompletionFormat.QUOTED,
type: CompletionType.PROPERTY,
insertTextFormat: 2,
documentation: {
kind: 'markdown',
value:
'The name of an existing, resolvable OAS operation, as defined with a unique `operationId`. This field is mutually exclusive of the `operationRef` field.',
},
},
{
label: 'parameters',
insertText: 'parameters',
kind: 14,
format: CompletionFormat.OBJECT,
type: CompletionType.PROPERTY,
insertTextFormat: 2,
documentation: {
kind: 'markdown',
value:
'Map[`string`, Any | [`{expression}`](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#runtimeExpression)]\n\\\n\\\nA map representing parameters to pass to an operation as specified with `operationId` or identified via `operationRef`. The key is the parameter name to be used, whereas the value can be a constant or an expression to be evaluated and passed to the linked operation. The parameter name can be qualified using the [parameter location](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#parameterIn) `[{in}.]{name}` for operations that use the same parameter name in different locations (e.g. path.id).',
},
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' },
],
},
{
label: 'requestBody',
insertText: 'requestBody',
kind: 14,
format: CompletionFormat.QUOTED,
type: CompletionType.PROPERTY,
insertTextFormat: 2,
documentation: {
kind: 'markdown',
value:
'Any | [`{expression}`](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#runtimeExpression)\n\\\n\\\nA literal value or [`{expression}`](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#runtimeExpression) to use as a request body when calling the target operation.',
},
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' },
],
},
{
label: 'description',
insertText: 'description',
kind: 14,
format: CompletionFormat.QUOTED,
type: CompletionType.PROPERTY,
insertTextFormat: 2,
documentation: {
kind: 'markdown',
value:
'A description of the link. [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation.',
},
},
{
label: 'server',
insertText: 'server',
kind: 14,
format: CompletionFormat.OBJECT,
type: CompletionType.PROPERTY,
insertTextFormat: 2,
documentation: {
kind: 'markdown',
value:
'[Server Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#serverObject)\n\\\n\\\nA server object to be used by the target operation.',
},
},
];

export default completion;
58 changes: 49 additions & 9 deletions packages/apidom-ls/src/config/openapi/link/documentation.ts

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

// eslint-disable-next-line @typescript-eslint/naming-convention
const allowedFields3_0Lint: LinterMeta = {
code: ApilintCodes.NOT_ALLOWED_FIELDS,
source: 'apilint',
message: 'Object includes not allowed fields',
severity: 1,
linterFunction: 'allowedFields',
linterParams: [
['operationRef', 'operationId', 'parameters', 'requestBody', 'description', 'server', '$ref'],
'x-',
],
marker: 'key',
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 allowedFields3_0Lint;
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const descriptionTypeLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_0_LINK_FIELD_DESCRIPTION_TYPE,
source: 'apilint',
message: 'description must be a string',
severity: 1,
linterFunction: 'apilintType',
linterParams: ['string'],
marker: 'value',
target: 'description',
data: {},
};

export default descriptionTypeLint;
15 changes: 15 additions & 0 deletions packages/apidom-ls/src/config/openapi/link/lint/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import allowedFields3_0Lint from './allowed-fields-3-0';
import operationRefFormatUriLink from './operation-ref--format-uri';
import operationIdTypeLint from './operation-id--type';
import descriptionTypeLint from './description--type';
import serverTypeLint from './server--type';

const links = [
operationRefFormatUriLink,
operationIdTypeLint,
descriptionTypeLint,
serverTypeLint,
allowedFields3_0Lint,
];

export default links;
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const operationIdTypeLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_0_LINK_FIELD_OPERATION_ID_TYPE,
source: 'apilint',
message: "operationId' value must be a string",
severity: 1,
linterFunction: 'apilintType',
linterParams: ['string'],
marker: 'value',
target: 'operationId',
data: {},
};

export default operationIdTypeLint;
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const operationRefFormatURILint: LinterMeta = {
code: ApilintCodes.OPENAPI3_0_LINK_FIELD_OPERATION_REF_FORMAT_URI,
source: 'apilint',
message: "'operationRef' value must be a valid URI-reference",
severity: 1,
linterFunction: 'apilintValidURI',
marker: 'value',
target: 'operationRef',
data: {},
};

export default operationRefFormatURILint;
16 changes: 16 additions & 0 deletions packages/apidom-ls/src/config/openapi/link/lint/server--type.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const serverTypeLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_0_LINK_FIELD_SERVER_TYPE,
source: 'apilint',
message: 'server must be an object',
severity: 1,
linterFunction: 'apilintElementOrClass',
linterParams: ['server'],
marker: 'value',
target: 'server',
data: {},
};

export default serverTypeLint;
4 changes: 4 additions & 0 deletions packages/apidom-ls/src/config/openapi/link/meta.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import lint from './lint';
import completion from './completion';
import documentation from './documentation';
import { FormatMeta } from '../../../apidom-language-types';

const meta: FormatMeta = {
lint,
completion,
documentation,
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const $refFormatURILint: LinterMeta = {
code: ApilintCodes.OPENAPI3_REFERENCE_FIELD_$REF_FORMAT_URI,
code: ApilintCodes.OPENAPI3_0_REFERENCE_FIELD_$REF_FORMAT_URI,
source: 'apilint',
message: "'$ref' value must be a valid URI-reference",
severity: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { LinterMeta } from '../../../../apidom-language-types';

// eslint-disable-next-line @typescript-eslint/naming-convention
const $refNoSiblings3_0Lint: LinterMeta = {
code: ApilintCodes.OPENAPI3_REFERENCE_FIELD_$REF_NO_SIBLINGS,
code: ApilintCodes.OPENAPI3_0_REFERENCE_FIELD_$REF_NO_SIBLINGS,
source: 'apilint',
message: 'All other properties in a "$ref" object are ignored',
severity: 2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const bearerFormatTypeLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_SECURITY_SCHEME_FIELD_BEARER_FORMAT_TYPE,
code: ApilintCodes.OPENAPI3_0_SECURITY_SCHEME_FIELD_BEARER_FORMAT_TYPE,
source: 'apilint',
message: 'bearerFormat must be a string',
severity: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const descriptionTypeLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_SECURITY_SCHEME_FIELD_DESCRIPTION_TYPE,
code: ApilintCodes.OPENAPI3_0_SECURITY_SCHEME_FIELD_DESCRIPTION_TYPE,
source: 'apilint',
message: 'description must be a string',
severity: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const flowsRequiredLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_SECURITY_SCHEME_FIELD_FLOWS_REQUIRED,
code: ApilintCodes.OPENAPI3_0_SECURITY_SCHEME_FIELD_FLOWS_REQUIRED,
source: 'apilint',
message: "should always have a 'flows'",
severity: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const flowsTypeLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_SECURITY_SCHEME_FIELD_FLOWS_TYPE,
code: ApilintCodes.OPENAPI3_0_SECURITY_SCHEME_FIELD_FLOWS_TYPE,
source: 'apilint',
message: 'flows must be an object',
severity: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const inEqualsLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_SECURITY_SCHEME_FIELD_IN_EQUALS,
code: ApilintCodes.OPENAPI3_0_SECURITY_SCHEME_FIELD_IN_EQUALS,
source: 'apilint',
message: "'in' must be one of allowed values",
severity: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const inRequiredLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_SECURITY_SCHEME_FIELD_IN_REQUIRED,
code: ApilintCodes.OPENAPI3_0_SECURITY_SCHEME_FIELD_IN_REQUIRED,
source: 'apilint',
message: "should always have a 'in'",
severity: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ApilintCodes from '../../../codes';
import { LinterMeta } from '../../../../apidom-language-types';

const nameRequiredLint: LinterMeta = {
code: ApilintCodes.OPENAPI3_SECURITY_SCHEME_FIELD_NAME_REQUIRED,
code: ApilintCodes.OPENAPI3_0_SECURITY_SCHEME_FIELD_NAME_REQUIRED,
source: 'apilint',
message: "should always have a 'name'",
severity: 1,
Expand Down
Loading