From 49dac77db6db4d1da6232b64f519c9b530776643 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Mon, 25 Apr 2022 11:28:03 +0200 Subject: [PATCH] feat(apidom-ls): add Operation Bindings meta config This change is specific to AsyncAPI specification. Closes #1370 --- .../apidom-ls/src/config/asyncapi/config.ts | 2 + .../asyncapi/operation-bindings/completion.ts | 240 ++++++++++++++++++ .../operation-bindings/documentation.ts | 74 ++++++ .../lint/allowed-fields-2-0--2-1.ts | 36 +++ .../lint/allowed-fields-2-2.ts | 35 +++ .../lint/allowed-fields-2-3.ts | 36 +++ .../asyncapi/operation-bindings/lint/amqp.ts | 16 ++ .../asyncapi/operation-bindings/lint/amqp1.ts | 16 ++ .../operation-bindings/lint/anypointmq.ts | 16 ++ .../asyncapi/operation-bindings/lint/http.ts | 16 ++ .../asyncapi/operation-bindings/lint/index.ts | 47 ++++ .../asyncapi/operation-bindings/lint/jms.ts | 16 ++ .../asyncapi/operation-bindings/lint/kafka.ts | 16 ++ .../operation-bindings/lint/mercure.ts | 16 ++ .../asyncapi/operation-bindings/lint/mqtt.ts | 16 ++ .../asyncapi/operation-bindings/lint/mqtt5.ts | 16 ++ .../asyncapi/operation-bindings/lint/nats.ts | 16 ++ .../asyncapi/operation-bindings/lint/redis.ts | 16 ++ .../lint/ref-non-siblings.ts | 30 +++ .../asyncapi/operation-bindings/lint/ref.ts | 15 ++ .../asyncapi/operation-bindings/lint/sns.ts | 16 ++ .../operation-bindings/lint/solace.ts | 16 ++ .../asyncapi/operation-bindings/lint/sqs.ts | 16 ++ .../asyncapi/operation-bindings/lint/stomp.ts | 16 ++ .../asyncapi/operation-bindings/lint/ws.ts | 16 ++ .../asyncapi/operation-bindings/meta.ts | 12 + .../config/asyncapi/operation/completion.ts | 144 ----------- packages/apidom-ls/src/config/codes.ts | 18 ++ .../operation/operation-lint-expected.ts | 8 + 29 files changed, 809 insertions(+), 144 deletions(-) create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/completion.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/documentation.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-0--2-1.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-2.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-3.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/amqp.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/amqp1.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/anypointmq.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/http.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/index.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/jms.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/kafka.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mercure.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mqtt.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mqtt5.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/nats.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/redis.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ref-non-siblings.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ref.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/sns.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/solace.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/sqs.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/stomp.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ws.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/operation-bindings/meta.ts diff --git a/packages/apidom-ls/src/config/asyncapi/config.ts b/packages/apidom-ls/src/config/asyncapi/config.ts index 270b8b345c..a19ff5eb07 100644 --- a/packages/apidom-ls/src/config/asyncapi/config.ts +++ b/packages/apidom-ls/src/config/asyncapi/config.ts @@ -14,6 +14,7 @@ import serverVariableMeta from './server-variable/meta'; import channelsMeta from './channels/meta'; import parameterMeta from './parameter/meta'; import operationMeta from './operation/meta'; +import operationBindingsMeta from './operation-bindings/meta'; import operationTraitMeta from './operation-trait/meta'; import serverBindingsMeta from './server-bindings/meta'; import httpServerBindingMeta from './http-server-binding/meta'; @@ -47,6 +48,7 @@ export default { contact: contactMeta, license: licenseMeta, operation: operationMeta, + operationBindings: operationBindingsMeta, operationTrait: operationTraitMeta, channelItem: channelMeta, channels: channelsMeta, diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/completion.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/completion.ts new file mode 100644 index 0000000000..68ef575917 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/completion.ts @@ -0,0 +1,240 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../apidom-language-types'; + +const completion: ApidomCompletionItem[] = [ + { + label: '$ref', + insertText: '\\$ref', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: 'A reference to an Operation Bindings', + }, + }, + { + label: 'http', + insertText: 'http', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[HTTP Operation Binding](https://github.com/asyncapi/bindings/blob/master/http#operation)\n\\\n\\\nProtocol-specific information for an HTTP operation.', + }, + }, + { + label: 'ws', + insertText: 'ws', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[WebSockets Operation Binding](https://github.com/asyncapi/bindings/blob/master/websockets#operation)\n\\\n\\\nProtocol-specific information for a WebSockets operation.', + }, + }, + { + label: 'kafka', + insertText: 'kafka', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Kafka Operation Binding](https://github.com/asyncapi/bindings/blob/master/kafka#operation)\n\\\n\\\nProtocol-specific information for a Kafka operation.', + }, + }, + { + label: 'anypointmq', + insertText: 'anypointmq', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Anypoint MQ Operation Binding](https://github.com/asyncapi/bindings/blob/master/anypointmq#operation)\n\\\n\\\nProtocol-specific information for an Anypoint MQ operation.', + }, + targetSpecs: [ + { namespace: 'asyncapi', version: '2.2.0' }, + { namespace: 'asyncapi', version: '2.3.0' }, + ], + }, + { + label: 'amqp', + insertText: 'amqp', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[AMQP Operation Binding](https://github.com/asyncapi/bindings/blob/master/amqp#operation)\n\\\n\\\nProtocol-specific information for an AMQP 0-9-1 operation.', + }, + }, + { + label: 'amqp1', + insertText: 'amqp1', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[AMQP 1.0 Operation Binding](https://github.com/asyncapi/bindings/blob/master/amqp1#operation)\n\\\n\\\nProtocol-specific information for an AMQP 1.0 operaiton.', + }, + }, + { + label: 'mqtt', + insertText: 'mqtt', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[MQTT Operation Binding](https://github.com/asyncapi/bindings/blob/master/mqtt#operation)\n\\\n\\\nProtocol-specific information for an MQTT operation.', + }, + }, + { + label: 'mqtt5', + insertText: 'mqtt5', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[MQTT 5 Operation Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5#operation)\n\\\n\\\nProtocol-specific information for an MQTT 5 operation.', + }, + }, + { + label: 'nats', + insertText: 'nats', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[NATS Operation Binding](https://github.com/asyncapi/bindings/blob/master/nats#operation)\n\\\n\\\nProtocol-specific information for a NATS operation.', + }, + }, + { + label: 'jms', + insertText: 'jms', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[JMS Operation Binding](https://github.com/asyncapi/bindings/blob/master/jms#operation)\n\\\n\\\nProtocol-specific information for a JMS operation.', + }, + }, + { + label: 'sns', + insertText: 'sns', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[SNS Operation Binding](https://github.com/asyncapi/bindings/blob/master/sns#operation)\n\\\n\\\nProtocol-specific information for an SNS operation.', + }, + }, + { + label: 'solace', + insertText: 'solace', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Solace Operation Binding](https://github.com/asyncapi/bindings/tree/master/solace#operation-binding-object)\n\\\n\\\nProtocol-specific information for a Solace operation.', + }, + targetSpecs: [{ namespace: 'asyncapi', version: '2.3.0' }], + }, + { + label: 'sqs', + insertText: 'sqs', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[SQS Operation Binding](https://github.com/asyncapi/bindings/blob/master/sqs#operation)\n\\\n\\\nProtocol-specific information for an SQS operation.', + }, + }, + { + label: 'stomp', + insertText: 'stomp', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[STOMP Operation Binding](https://github.com/asyncapi/bindings/blob/master/stomp#operation)\n\\\n\\\nProtocol-specific information for a STOMP operation.', + }, + }, + { + label: 'redis', + insertText: 'redis', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Redis Operation Binding](https://github.com/asyncapi/bindings/blob/master/redis#operation)\n\\\n\\\nProtocol-specific information for a Redis operation.', + }, + }, + { + label: 'mercure', + insertText: 'mercure', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Mercure Operation Binding](https://github.com/asyncapi/bindings/blob/master/mercure#operation)\n\\\n\\\nProtocol-specific information for a Mercure operation.', + }, + targetSpecs: [ + { namespace: 'asyncapi', version: '2.1.0' }, + { namespace: 'asyncapi', version: '2.2.0' }, + { namespace: 'asyncapi', version: '2.3.0' }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/documentation.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/documentation.ts new file mode 100644 index 0000000000..1ff9197303 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/documentation.ts @@ -0,0 +1,74 @@ +const documentation = [ + { + target: '$ref', + docs: 'A reference to an Operation Bindings', + }, + { + target: 'http', + docs: '#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/http/README.md#operation-binding-object)\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`type` | string | **Required**. Type of operation. Its value MUST be either `request` or `response`.\n`method` | string | When `type` is `request`, this is the HTTP method, otherwise it MUST be ignored. Its value MUST be one of `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, `HEAD`, `OPTIONS`, `CONNECT`, and `TRACE`.\n`query` | [Schema Object](https://www.asyncapi.com/docs/specifications/v2.3.0#schemaObject) | A Schema object containing the definitions for each query parameter. This schema MUST be of type `object` and have a `properties` key.\n`bindingVersion` | string | The version of this binding. If omitted, "latest" MUST be assumed.\n\nThis object MUST contain only the properties defined above.\n\n##### Example\n\n\n\\\nYAML\n```yaml\nchannels:\n /employees:\n subscribe:\n bindings:\n http:\n type: request\n method: GET\n query:\n type: object\n required:\n - companyId\n properties:\n companyId:\n type: number\n minimum: 1\n description: The Id of the company.\n additionalProperties: false\n bindingVersion: \'0.1.0\'\n```', + }, + { + target: 'ws', + docs: '[WebSockets Operation Binding](https://github.com/asyncapi/bindings/blob/master/websockets#operation)\n\\\n\\\nProtocol-specific information for a WebSockets operation.', + }, + { + target: 'kafka', + docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/http/README.md#operation-binding-object)\n\nThis object contains information about the operation representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`groupId` | [Schema Object](https://www.asyncapi.com/docs/specifications/v2.3.0#schemaObject) | Id of the consumer group.\n`clientId` | [Schema Object](https://www.asyncapi.com/docs/specifications/v2.3.0#schemaObject) | Id of the consumer inside a consumer group.\n`bindingVersion` | string | The version of this binding. If omitted, \"latest\" MUST be assumed.\n\nThis object MUST contain only the properties defined above.\n\n##### Example\n\n\n\\\nYAML\n```yaml\nchannels:\n user-signedup:\n publish:\n bindings:\n kafka:\n groupId:\n type: string\n enum: ['myGroupId']\n clientId:\n type: string\n enum: ['myClientId']\n bindingVersion: '0.1.0'\n```", + }, + { + target: 'anypointmq', + docs: '[Anypoint MQ Operation Binding](https://github.com/asyncapi/bindings/blob/master/anypointmq#operation)\n\\\n\\\nProtocol-specific information for an Anypoint MQ operation.', + }, + { + target: 'amqp', + docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/amqp/README.md#operation-binding-object)\n\nThis object contains information about the operation representation in AMQP.\n\n##### Fixed Fields\n\nField Name | Type | Applies To | Description\n---|:---:|:---:|---\n`expiration` | integer | Publish, Subscribe | TTL (Time-To-Live) for the message. It MUST be greater than or equal to zero.\n`userId` | string | Publish, Subscribe | Identifies the user who has sent the message.\n`cc` | [string] | Publish, Subscribe | The routing keys the message should be routed to at the time of publishing.\n`priority` | integer | Publish, Subscribe | A priority for the message.\n`deliveryMode` | integer | Publish, Subscribe | Delivery mode of the message. Its value MUST be either 1 (transient) or 2 (persistent).\n`mandatory` | boolean | Publish | Whether the message is mandatory or not.\n`bcc` | [string] | Publish | Like [cc](https://github.com/asyncapi/bindings/blob/master/amqp/README.md#operationBindingObjectCC) but consumers will not receive this information.\n`replyTo` | string | Publish, Subscribe | Name of the queue where the consumer should send the response.\n`timestamp` | boolean | Publish, Subscribe | Whether the message should include a timestamp or not.\n`ack` | boolean | Subscribe | Whether the consumer should ack the message or not.\n`bindingVersion` | string | Publish, Subscribe | The version of this binding. If omitted, \"latest\" MUST be assumed.\n\nThis object MUST contain only the properties defined above.\n\n##### Example\n\n\n\\\nYAML\n```yaml\nchannels:\n user/signup:\n publish:\n bindings:\n amqp:\n expiration: 100000\n userId: guest\n cc: ['user.logs']\n priority: 10\n deliveryMode: 2\n mandatory: false\n bcc: ['external.audit']\n replyTo: user.signedup\n timestamp: true\n ack: false\n bindingVersion: 0.2.0\n```", + }, + { + target: 'amqp1', + docs: '[AMQP 1.0 Operation Binding](https://github.com/asyncapi/bindings/blob/master/amqp1#operation)\n\\\n\\\nProtocol-specific information for an AMQP 1.0 operaiton.', + }, + { + target: 'mqtt', + docs: '#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/mqtt/README.md#operation-binding-object)\n\nThis object contains information about the operation representation in MQTT.\n\n##### Fixed Fields\n\nField Name | Type | Applies To | Description\n---|:---:|:---:|---\n`qos` | integer | Publish, Subscribe | Defines the Quality of Service (QoS) levels for the message flow between client and server. Its value MUST be either 0 (At most once delivery), 1 (At least once delivery), or 2 (Exactly once delivery).\n`retain` | boolean | Publish, Subscribe | Whether the broker should retain the message or not.\n`bindingVersion` | string | Publish, Subscribe | The version of this binding. If omitted, "latest" MUST be assumed.\n\nThis object MUST contain only the properties defined above.\n\n##### Example\n\n\n\\\nYAML\n```yaml\nchannels:\n user/signup:\n publish:\n bindings:\n mqtt:\n qos: 2\n retain: true\n bindingVersion: 0.1.0\n```', + }, + { + target: 'mqtt5', + docs: '[MQTT 5 Operation Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5#operation)\n\\\n\\\nProtocol-specific information for an MQTT 5 operation.', + }, + { + target: 'nats', + docs: '#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/nats/README.md#operation-binding-object)\n\nField Name | Type | Description\n---|:---:|---\n| `queue` | string | Defines the name of the queue to use. It MUST NOT exceed 255 characters. |\n| `bindingVersion` | string | The version of this binding. If omitted, "latest" MUST be assumed. |', + }, + { + target: 'jms', + docs: '[JMS Operation Binding](https://github.com/asyncapi/bindings/blob/master/jms#operation)\n\\\n\\\nProtocol-specific information for a JMS operation.', + }, + { + target: 'sns', + docs: '[SNS Operation Binding](https://github.com/asyncapi/bindings/blob/master/sns#operation)\n\\\n\\\nProtocol-specific information for an SNS operation.', + }, + { + target: 'solace', + docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/solace/README.md#operation-binding-object)\n\nWe need the ability to support several bindings for each operation, see the [Example](https://github.com/asyncapi/bindings/blob/master/solace/README.md#example) section below for details.\n\nField Name | Type | Description\n---|---|---\n`bindingVersion`|String|The current version is 0.2.0\n`destinations`|List of Destination Objects|Destination Objects are described next.\n\n#### Destination Object\n\nEach destination has the following structure. Note that bindings under a 'subscribe' operation define the behaviour of publishers, and those under a 'publish' operation define how subscribers are configured.\n\nField Name | Type | Description | Applicable Operation\n---|---|---|---\n`destinationType`|Enum|'queue' or 'topic'. If the type is queue, then the subscriber can bind to the queue, which in turn will subscribe to the topic as represented by the channel name or to the provided topicSubscriptions.|publish\n`deliveryMode`|Enum|'direct' or 'persistent'. This determines the quality of service for publishing messages as documented [here.](https://docs.solace.com/PubSub-Basics/Core-Concepts-Message-Delivery-Modes.htm) Default is 'persistent'.|subscribe\n`queue.name`|String|The name of the queue, only applicable when destinationType is 'queue'.|publish\n`queue.topicSubscriptions`|List of String|A list of topics that the queue subscribes to, only applicable when destinationType is 'queue'. If none is given, the queue subscribes to the topic as represented by the channel name.|publish\n`queue.accessType`|Enum|'exclusive' or 'nonexclusive'. This is documented [here.](https://docs.solace.com/PubSub-Basics/Endpoints.htm) Only applicable when destinationType is 'queue'.|publish\n`topic.topicSubscriptions`|List of String|A list of topics that the client subscribes to, only applicable when destinationType is 'topic'. If none is given, the client subscribes to the topic as represented by the channel name.|publish", + }, + { + target: 'sqs', + docs: '[SQS Operation Binding](https://github.com/asyncapi/bindings/blob/master/sqs#operation)\n\\\n\\\nProtocol-specific information for an SQS operation.', + }, + { + target: 'stomp', + docs: '[STOMP Operation Binding](https://github.com/asyncapi/bindings/blob/master/stomp#operation)\n\\\n\\\nProtocol-specific information for a STOMP operation.', + }, + { + target: 'redis', + docs: '[Redis Operation Binding](https://github.com/asyncapi/bindings/blob/master/redis#operation)\n\\\n\\\nProtocol-specific information for a Redis operation.', + }, + { + target: 'mercure', + docs: '[Mercure Operation Binding](https://github.com/asyncapi/bindings/blob/master/mercure#operation)\n\\\n\\\nProtocol-specific information for a Mercure operation.', + }, + { + docs: '#### [Operation Bindings Object](https://github.com/asyncapi/spec/blob/v2.3.0/spec/asyncapi.md#operationBindingsObject)\n\nMap describing protocol-specific definitions for an operation.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`http` | [HTTP Operation Binding](https://github.com/asyncapi/bindings/blob/master/http/README.md#operation) | Protocol-specific information for an HTTP operation.\n`ws` | [WebSockets Operation Binding](https://github.com/asyncapi/bindings/blob/master/websockets/README.md#operation) | Protocol-specific information for a WebSockets operation.\n`kafka` | [Kafka Operation Binding](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#operation) | Protocol-specific information for a Kafka operation.\n`anypointmq` | [Anypoint MQ Operation Binding](https://github.com/asyncapi/bindings/blob/master/anypointmq/README.md#operation) | Protocol-specific information for an Anypoint MQ operation.\n`amqp` | [AMQP Operation Binding](https://github.com/asyncapi/bindings/blob/master/amqp/README.md#operation) | Protocol-specific information for an AMQP 0-9-1 operation.\n`amqp1` | [AMQP 1.0 Operation Binding](https://github.com/asyncapi/bindings/blob/master/amqp1/README.md#operation) | Protocol-specific information for an AMQP 1.0 operation.\n`mqtt` | [MQTT Operation Binding](https://github.com/asyncapi/bindings/blob/master/mqtt/README.md#operation) | Protocol-specific information for an MQTT operation.\n`mqtt5` | [MQTT 5 Operation Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5/README.md#operation) | Protocol-specific information for an MQTT 5 operation.\n`nats` | [NATS Operation Binding](https://github.com/asyncapi/bindings/blob/master/nats/README.md#operation) | Protocol-specific information for a NATS operation.\n`jms` | [JMS Operation Binding](https://github.com/asyncapi/bindings/blob/master/jms/README.md#operation) | Protocol-specific information for a JMS operation.\n`sns` | [SNS Operation Binding](https://github.com/asyncapi/bindings/blob/master/sns/README.md#operation) | Protocol-specific information for an SNS operation.\n`solace` | [Solace Operation Binding](https://github.com/asyncapi/bindings/blob/master/solace#operation) | Protocol-specific information for a Solace operation.\n`sqs` | [SQS Operation Binding](https://github.com/asyncapi/bindings/blob/master/sqs/README.md#operation) | Protocol-specific information for an SQS operation.\n`stomp` | [STOMP Operation Binding](https://github.com/asyncapi/bindings/blob/master/stomp/README.md#operation) | Protocol-specific information for a STOMP operation.\n`redis` | [Redis Operation Binding](https://github.com/asyncapi/bindings/blob/master/redis#operation) | Protocol-specific information for a Redis operation.\n`mercure` | [Mercure Operation Binding](https://github.com/asyncapi/bindings/blob/master/mercure#operation) | Protocol-specific information for a Mercure operation.\n\nThis object can be extended with [Specification Extensions](https://www.asyncapi.com/docs/specifications/v2.3.0#specificationExtensions).', + }, +]; +export default documentation; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-0--2-1.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-0--2-1.ts new file mode 100644 index 0000000000..7bede23a8f --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-0--2-1.ts @@ -0,0 +1,36 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const operationBindingsAllowedFields2021Lint: LinterMeta = { + code: ApilintCodes.ALL_NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: 1, + linterFunction: 'allowedFields', + linterParams: [ + [ + '$ref', + 'http', + 'ws', + 'kafka', + 'amqp', + 'amqp1', + 'mqtt', + 'mqtt5', + 'nats', + 'jms', + 'sns', + 'sqs', + 'stomp', + 'redis', + ], + 'x-', + ], + marker: 'key', + targetSpecs: [ + { namespace: 'asyncapi', version: '2.0.0' }, + { namespace: 'asyncapi', version: '2.1.0' }, + ], +}; + +export default operationBindingsAllowedFields2021Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-2.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-2.ts new file mode 100644 index 0000000000..d24c2b5328 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-2.ts @@ -0,0 +1,35 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const operationBindingsAllowedFields22Lint: LinterMeta = { + code: ApilintCodes.ALL_NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: 1, + linterFunction: 'allowedFields', + linterParams: [ + [ + '$ref', + 'http', + 'ws', + 'kafka', + 'anypointmq', + 'amqp', + 'amqp1', + 'mqtt', + 'mqtt5', + 'nats', + 'jms', + 'sns', + 'sqs', + 'stomp', + 'redis', + 'mercure', + ], + 'x-', + ], + marker: 'key', + targetSpecs: [{ namespace: 'asyncapi', version: '2.2.0' }], +}; + +export default operationBindingsAllowedFields22Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-3.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-3.ts new file mode 100644 index 0000000000..0bc20a671e --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/allowed-fields-2-3.ts @@ -0,0 +1,36 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const operationBindingsAllowedFields23Lint: LinterMeta = { + code: ApilintCodes.ALL_NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: 1, + linterFunction: 'allowedFields', + linterParams: [ + [ + '$ref', + 'http', + 'ws', + 'kafka', + 'anypointmq', + 'amqp', + 'amqp1', + 'mqtt', + 'mqtt5', + 'nats', + 'jms', + 'sns', + 'solace', + 'sqs', + 'stomp', + 'redis', + 'mercure', + ], + 'x-', + ], + marker: 'key', + targetSpecs: [{ namespace: 'asyncapi', version: '2.3.0' }], +}; + +export default operationBindingsAllowedFields23Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/amqp.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/amqp.ts new file mode 100644 index 0000000000..e9589e54f8 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/amqp.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const amqpLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_AMQP, + source: 'apilint', + message: '"amqp" must be a AMQP Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['amqpOperationBinding'], + marker: 'value', + target: 'amqp', + data: {}, +}; + +export default amqpLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/amqp1.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/amqp1.ts new file mode 100644 index 0000000000..7a15e1b549 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/amqp1.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const amqp1Lint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_AMQP1, + source: 'apilint', + message: '"amqp1" must be a AMQP 1.0 Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['amqp1OperationBinding'], + marker: 'value', + target: 'amqp1', + data: {}, +}; + +export default amqp1Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/anypointmq.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/anypointmq.ts new file mode 100644 index 0000000000..5e01d89a2c --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/anypointmq.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const anypointmqLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_ANYPOINTMQ, + source: 'apilint', + message: '"anypointmq" must be a Anypoint MQ Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['anypointmqOperationBinding'], + marker: 'value', + target: 'anypointmq', + data: {}, +}; + +export default anypointmqLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/http.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/http.ts new file mode 100644 index 0000000000..790c5fb699 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/http.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const httpLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_HTTP, + source: 'apilint', + message: '"http" must be a HTTP Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['httpOperationBinding'], + marker: 'value', + target: 'http', + data: {}, +}; + +export default httpLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/index.ts new file mode 100644 index 0000000000..ae16b42f9d --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/index.ts @@ -0,0 +1,47 @@ +import operationBindings$RefLint from './ref'; +import operationBindingsRefNonSiblingsLint from './ref-non-siblings'; +import operationBindingsAllowedFields2_0__2_1Lint from './allowed-fields-2-0--2-1'; +import operationBindingsAllowedFields2_2Lint from './allowed-fields-2-2'; +import operationBindingsAllowedFields2_3Lint from './allowed-fields-2-3'; +import httpLint from './http'; +import amqpLint from './amqp'; +import amqp1Lint from './amqp1'; +import anypointmqLint from './anypointmq'; +import jmsLint from './jms'; +import kafkaLint from './kafka'; +import mercureLint from './mercure'; +import mqttLint from './mqtt'; +import mqtt5Lint from './mqtt5'; +import natsLint from './nats'; +import redisLint from './redis'; +import snsLint from './sns'; +import solaceLint from './solace'; +import sqsLint from './sqs'; +import stompLint from './stomp'; +import wsLint from './ws'; + +const lints = [ + operationBindingsAllowedFields2_0__2_1Lint, + operationBindingsAllowedFields2_2Lint, + operationBindingsAllowedFields2_3Lint, + operationBindings$RefLint, + operationBindingsRefNonSiblingsLint, + httpLint, + amqpLint, + amqp1Lint, + anypointmqLint, + jmsLint, + kafkaLint, + mercureLint, + mqttLint, + mqtt5Lint, + natsLint, + redisLint, + snsLint, + solaceLint, + sqsLint, + stompLint, + wsLint, +]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/jms.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/jms.ts new file mode 100644 index 0000000000..3e77b54c6a --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/jms.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const jmsLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_JMS, + source: 'apilint', + message: '"jms" must be a JMS Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['httpOperationBinding'], + marker: 'value', + target: 'jms', + data: {}, +}; + +export default jmsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/kafka.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/kafka.ts new file mode 100644 index 0000000000..f28f8e0bea --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/kafka.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const kafkaLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_KAFKA, + source: 'apilint', + message: '"kafka" must be a Kafka Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['kafkaOperationBinding'], + marker: 'value', + target: 'kafka', + data: {}, +}; + +export default kafkaLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mercure.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mercure.ts new file mode 100644 index 0000000000..87b01996c9 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mercure.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const mercureLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_MERCURE, + source: 'apilint', + message: '"mercure" must be a Mercure Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['mercureOperationBinding'], + marker: 'value', + target: 'mercure', + data: {}, +}; + +export default mercureLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mqtt.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mqtt.ts new file mode 100644 index 0000000000..41257af553 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mqtt.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const mqttLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_MQTT, + source: 'apilint', + message: '"mqtt" must be a MQTT Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['mqttOperationBinding'], + marker: 'value', + target: 'mqtt', + data: {}, +}; + +export default mqttLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mqtt5.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mqtt5.ts new file mode 100644 index 0000000000..4108e7b6c1 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/mqtt5.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const mqtt5Lint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_MQTT5, + source: 'apilint', + message: '"mqtt5" must be a MQTT 5 Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['mqtt5OperationBinding'], + marker: 'value', + target: 'mqtt5', + data: {}, +}; + +export default mqtt5Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/nats.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/nats.ts new file mode 100644 index 0000000000..60452a3dc7 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/nats.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const natsLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_NATS, + source: 'apilint', + message: '"nats" must be a NATS Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['natsOperationBinding'], + marker: 'value', + target: 'nats', + data: {}, +}; + +export default natsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/redis.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/redis.ts new file mode 100644 index 0000000000..f431fe3f7c --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/redis.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const redisLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_REDIS, + source: 'apilint', + message: '"redis" must be a Redis Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['redisOperationBinding'], + marker: 'value', + target: 'redis', + data: {}, +}; + +export default redisLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ref-non-siblings.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ref-non-siblings.ts new file mode 100644 index 0000000000..ffe4c73cee --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ref-non-siblings.ts @@ -0,0 +1,30 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const operationBindingsRefNonSiblingsLint: LinterMeta = { + code: ApilintCodes.OPERATION_REF_NO_SIBLINGS, + source: 'apilint', + message: 'All other properties in a "$ref" object are ignored', + severity: 2, + linterFunction: 'allowedFields', + linterParams: [['$ref']], + marker: 'key', + conditions: [ + { + function: 'existFields', + params: [['$ref']], + }, + ], + data: { + quickFix: [ + { + message: 'remove $ref', + action: 'removeChild', + functionParams: ['$ref'], + target: 'parent', + }, + ], + }, +}; + +export default operationBindingsRefNonSiblingsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ref.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ref.ts new file mode 100644 index 0000000000..26be0cb041 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ref.ts @@ -0,0 +1,15 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const operationBindings$RefLint: LinterMeta = { + code: ApilintCodes.OPERATION_REF, + source: 'apilint', + message: "'$ref' value must be a valid URI-reference", + severity: 1, + linterFunction: 'apilintValidURI', + marker: 'value', + target: '$ref', + data: {}, +}; + +export default operationBindings$RefLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/sns.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/sns.ts new file mode 100644 index 0000000000..1db6d6d126 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/sns.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const snsLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_SNS, + source: 'apilint', + message: '"sns" must be a SNS Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['snsOperationBinding'], + marker: 'value', + target: 'sns', + data: {}, +}; + +export default snsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/solace.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/solace.ts new file mode 100644 index 0000000000..d9e65bf5d7 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/solace.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const solaceLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_SOLACE, + source: 'apilint', + message: '"solace" must be a Solace Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['solaceOperationBinding'], + marker: 'value', + target: 'solace', + data: {}, +}; + +export default solaceLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/sqs.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/sqs.ts new file mode 100644 index 0000000000..a60a164532 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/sqs.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const sqsLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_SQS, + source: 'apilint', + message: '"sqs" must be a SQS Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['sqsOperationBinding'], + marker: 'value', + target: 'sqs', + data: {}, +}; + +export default sqsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/stomp.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/stomp.ts new file mode 100644 index 0000000000..1807d6cb8a --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/stomp.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const stompLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_STOMP, + source: 'apilint', + message: '"stomp" must be a STOMP Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['stompOperationBinding'], + marker: 'value', + target: 'stomp', + data: {}, +}; + +export default stompLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ws.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ws.ts new file mode 100644 index 0000000000..4bcabd6342 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/lint/ws.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const wsLint: LinterMeta = { + code: ApilintCodes.OPERATION_BINDING_WS, + source: 'apilint', + message: '"ws" must be a WebSockets Operation Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['wsOperationBinding'], + marker: 'value', + target: 'ws', + data: {}, +}; + +export default wsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/meta.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/meta.ts new file mode 100644 index 0000000000..381bda653d --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/meta.ts @@ -0,0 +1,12 @@ +import lint from './lint'; +import completion from './completion'; +import documentation from './documentation'; +import { FormatMeta } from '../../../apidom-language-types'; + +const meta: FormatMeta = { + lint, + completion, + documentation, +}; + +export default meta; diff --git a/packages/apidom-ls/src/config/asyncapi/operation/completion.ts b/packages/apidom-ls/src/config/asyncapi/operation/completion.ts index e0fed1c56e..826111eadf 100644 --- a/packages/apidom-ls/src/config/asyncapi/operation/completion.ts +++ b/packages/apidom-ls/src/config/asyncapi/operation/completion.ts @@ -82,150 +82,6 @@ const completion: ApidomCompletionItem[] = [ '[Operation Bindings Object](https://www.asyncapi.com/docs/specifications/v2.3.0#operationBindingsObject) | [Reference Object](https://www.asyncapi.com/docs/specifications/v2.3.0#referenceObject)\n\\\n\\\nA map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the operation.', }, }, - { - target: 'bindings', - label: 'http', - insertText: 'http', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'ws', - insertText: 'ws', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'kafka', - insertText: 'kafka', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'anypointmq', - insertText: 'anypointmq', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'amqp', - insertText: 'amqp', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'amqp1', - insertText: 'amqp1', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'mqtt', - insertText: 'mqtt', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'mqtt5', - insertText: 'mqtt5', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'nats', - insertText: 'nats', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'jms', - insertText: 'jms', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'sns', - insertText: 'sns', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'solace', - insertText: 'solace', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'sqs', - insertText: 'sqs', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'stomp', - insertText: 'stomp', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'redis', - insertText: 'redis', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, - { - target: 'bindings', - label: 'mercure', - insertText: 'mercure', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - }, { label: 'traits', insertText: 'traits', diff --git a/packages/apidom-ls/src/config/codes.ts b/packages/apidom-ls/src/config/codes.ts index d7f971c85e..b58727aaa0 100644 --- a/packages/apidom-ls/src/config/codes.ts +++ b/packages/apidom-ls/src/config/codes.ts @@ -222,6 +222,24 @@ enum ApilintCodes { COMPONENTS_MESSAGEBINDINGS, DUPLICATE_KEYS, SCHEMA_REQUIRED_WITHOUT_PROPERTIES, + OPERATION_BINDING_HTTP, + OPERATION_BINDING_WS, + OPERATION_BINDING_KAFKA, + OPERATION_BINDING_ANYPOINTMQ, + OPERATION_BINDING_AMQP, + OPERATION_BINDING_AMQP1, + OPERATION_BINDING_MQTT, + OPERATION_BINDING_MQTT5, + OPERATION_BINDING_NATS, + OPERATION_BINDING_JMS, + OPERATION_BINDING_SNS, + OPERATION_BINDING_SOLACE, + OPERATION_BINDING_SQS, + OPERATION_BINDING_STOMP, + OPERATION_BINDING_REDIS, + OPERATION_BINDING_MERCURE, + OPERATION_REF, + OPERATION_REF_NO_SIBLINGS, } export default ApilintCodes; diff --git a/packages/apidom-ls/test/fixtures/async/operation/operation-lint-expected.ts b/packages/apidom-ls/test/fixtures/async/operation/operation-lint-expected.ts index 8eb3bd5494..d607df040e 100644 --- a/packages/apidom-ls/test/fixtures/async/operation/operation-lint-expected.ts +++ b/packages/apidom-ls/test/fixtures/async/operation/operation-lint-expected.ts @@ -98,6 +98,14 @@ const operationLintExpected = [ ], }, }, + { + code: 10226, + data: {}, + message: '"kafka" must be a Kafka Operation Binding', + range: { end: { character: 16, line: 34 }, start: { character: 15, line: 34 } }, + severity: 1, + source: 'apilint', + }, { range: { start: { line: 54, character: 13 }, end: { line: 54, character: 16 } }, message: '"publish" must be an operation',