diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/completion.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/completion.ts new file mode 100644 index 0000000000..80a6de5bf8 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/completion.ts @@ -0,0 +1,258 @@ +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 Channel Bindings', + }, + }, + { + label: 'http', + insertText: 'http', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[HTTP Channel Binding](https://github.com/asyncapi/bindings/blob/mastechannel)\n\\\n\\\nProtocol-specific information for an HTTP channel.', + }, + }, + { + label: 'ws', + insertText: 'ws', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[WebSockets Channel Binding](https://github.com/asyncapi/bindings/blob/master/websockets#channel)\n\\\n\\\nProtocol-specific information for a WebSockets channel.', + }, + }, + { + label: 'kafka', + insertText: 'kafka', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Kafka Channel Binding](https://github.com/asyncapi/bindings/blob/master/kafka#channel)\n\\\n\\\nProtocol-specific information for a Kafka channel.', + }, + }, + { + label: 'anypointmq', + insertText: 'anypointmq', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Anypoint MQ Channel Binding](https://github.com/asyncapi/bindings/blob/master/anypointmq#channel)\n\\\n\\\nProtocol-specific information for an Anypoint MQ channel.', + }, + 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 Channel Binding](https://github.com/asyncapi/bindings/blob/master/amqp#channel)\n\\\n\\\nProtocol-specific information for an AMQP 0-9-1 channel.', + }, + }, + { + label: 'amqp1', + insertText: 'amqp1', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[AMQP 1.0 Channel Binding](https://github.com/asyncapi/bindings/blob/master/amqp1#channel)\n\\\n\\\nProtocol-specific information for an AMQP 1.0 channel.', + }, + }, + { + label: 'mqtt', + insertText: 'mqtt', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[MQTT Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt#channel)\n\\\n\\\nProtocol-specific information for an MQTT channel.', + }, + }, + { + label: 'mqtt5', + insertText: 'mqtt5', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[MQTT 5 Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5#channel)\n\\\n\\\nProtocol-specific information for an MQTT 5 channel.', + }, + }, + { + label: 'nats', + insertText: 'nats', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[NATS Channel Binding](https://github.com/asyncapi/bindings/blob/master/nats#channel)\n\\\n\\\nProtocol-specific information for a NATS channel.', + }, + }, + { + label: 'jms', + insertText: 'jms', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[JMS Channel Binding](https://github.com/asyncapi/bindings/blob/master/jms#channel)\n\\\n\\\nProtocol-specific information for a JMS channel.', + }, + }, + { + label: 'sns', + insertText: 'sns', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[SNS Channel Binding](https://github.com/asyncapi/bindings/blob/master/sns#channel)\n\\\n\\\nProtocol-specific information for an SNS channel.', + }, + }, + { + label: 'solace', + insertText: 'solace', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Solace Channel Binding](https://github.com/asyncapi/bindings/tree/master/solace#channel-binding-object)\n\\\n\\\nProtocol-specific information for a Solace channel.', + }, + 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 Channel Binding](https://github.com/asyncapi/bindings/blob/master/sqs#channel)\n\\\n\\\nProtocol-specific information for an SQS channel.', + }, + }, + { + label: 'stomp', + insertText: 'stomp', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[STOMP Channel Binding](https://github.com/asyncapi/bindings/blob/master/stomp#channel)\n\\\n\\\nProtocol-specific information for a STOMP channel.', + }, + }, + { + label: 'redis', + insertText: 'redis', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Redis Channel Binding](https://github.com/asyncapi/bindings/blob/master/redis#channel)\n\\\n\\\nProtocol-specific information for a Redis channel.', + }, + }, + { + label: 'mercure', + insertText: 'mercure', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Mercure Channel Binding](https://github.com/asyncapi/bindings/blob/master/mercure#channel)\n\\\n\\\nProtocol-specific information for a Mercure channel.', + }, + targetSpecs: [ + { namespace: 'asyncapi', version: '2.1.0' }, + { namespace: 'asyncapi', version: '2.2.0' }, + { namespace: 'asyncapi', version: '2.3.0' }, + ], + }, + { + label: 'ibmmq', + insertText: 'ibmmq', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[IBM MQ Channel Binding](https://github.com/asyncapi/bindings/tree/master/ibmmq#channel-binding-object)\n\\\n\\\nProtocol-specific information for an IBM MQ channel.', + }, + 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/channel-bindings/documentation.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/documentation.ts new file mode 100644 index 0000000000..1e8f3d9285 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/documentation.ts @@ -0,0 +1,78 @@ +const documentation = [ + { + target: '$ref', + docs: 'A reference to an Channel Bindings', + }, + { + target: 'http', + docs: '[HTTP Channel Binding](https://github.com/asyncapi/bindings/blob/master/http/README.md#channel)\n\\\n\\\nProtocol-specific information for an HTTP channel.', + }, + { + target: 'ws', + docs: '#### [Channel Binding Object](https://github.com/asyncapi/bindings/blob/master/websockets/README.md#channel)\n\nWhen using WebSockets, the channel represents the connection. Unlike other protocols that support multiple virtual channels (topics, routing keys, etc.) per connection, WebSockets doesn\'t support virtual channels or, put it another way, there\'s only one channel and its characteristics are strongly related to the protocol used for the handshake, i.e., HTTP.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`method` | string | The HTTP method to use when establishing the connection. Its value MUST be either `GET` or `POST`.\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`headers` | [Schema Object](https://www.asyncapi.com/docs/specifications/v2.3.0#schemaObject) | A Schema object containing the definitions of the HTTP headers to use when establishing the connection. 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.', + }, + { + target: 'kafka', + docs: '[Kafka Channel Binding](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#channel)\n\\\n\\\nProtocol-specific information for an HTTP channel.', + }, + { + target: 'anypointmq', + docs: "#### [Channel Binding Object](https://github.com/asyncapi/bindings/blob/master/anypointmq/README.md#channel)\n\nThe Anypoint MQ [Channel Binding Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#channel-bindings-object) is defined by a [JSON Schema](https://github.com/asyncapi/bindings/blob/master/anypointmq/json_schemas/channel.json), which defines these fields:\n\nField Name | Type | Description\n---|:---:|---\n`destination` | string | **Optional**, defaults to the channel name. The destination (queue or exchange) name for this channel. SHOULD only be specified if the channel name differs from the actual destination name, such as when the channel name is not a valid destination name in Anypoint MQ.\n`destinationType` | string | **Optional**, defaults to `queue`. The type of destination, which MUST be either `exchange` or `queue` or `fifo-queue`. SHOULD be specified to document the messaging model (publish/subscribe, point-to-point, strict message ordering) supported by this channel.\n`bindingVersion` | string | **Optional**, defaults to `latest`. The version of this binding.\n\nNote that an Anypoint MQ exchange can only be sent to, not received from. To receive messages sent to an exchange, [an intermediary queue must be defined and bound to the exchange](https://docs.mulesoft.com/mq/mq-understanding#message-exchanges). In this bindings specification, these intermediary queues are not exposed in the AsyncAPI document. Instead, it is simply assumed that whenever messages must be received from an exchange, such an intermediary queue is involved yet invisible in the AsyncAPI document.\n\n### Examples\n\nThe following example shows a `channels` object with two channels, the second having a channel binding object for `anypointmq`:\n\n\n\\\nYAML\n```yaml\nchannels:\n user/signup:\n description: |\n This application receives command messages from this channel about users to sign up.\n Minimal configuration, omitting a channel binding object.\n publish:\n #...\n user/signedup:\n description: |\n This application sends events to this channel about users that have signed up.\n Explicitly provides a channel binding object.\n bindings:\n anypointmq:\n destination: user-signup-exchg\n destinationType: exchange\n bindingVersion: '0.0.1'\n subscribe:\n #...\n```", + }, + { + target: 'amqp', + docs: '#### [Channel Binding Object](https://github.com/asyncapi/bindings/blob/master/amqp/README.md#channel)\n\nThis object contains information about the channel representation in AMQP.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`is` | string | Defines what type of channel is it. Can be either `queue` or `routingKey` (default).\n`exchange` | Map[string, any] | When `is`=`routingKey`, this object defines the exchange properties.\n`exchange.name` | string | The name of the exchange. It MUST NOT exceed 255 characters long.\n`exchange.type` | string | The type of the exchange. Can be either `topic`, `direct`, `fanout`, `default` or `headers`.\n`exchange.durable` | boolean | Whether the exchange should survive broker restarts or not.\n`exchange.autoDelete` | boolean | Whether the exchange should be deleted when the last queue is unbound from it.\n`exchange.vhost` | string | The virtual host of the exchange. Defaults to `/`.\n`queue` | Map[string, any] | When `is`=`queue`, this object defines the queue properties.\n`queue.name` | string | The name of the queue. It MUST NOT exceed 255 characters long.\n`queue.durable` | boolean | Whether the queue should survive broker restarts or not.\n`queue.exclusive` | boolean | Whether the queue should be used only by one connection or not.\n`queue.autoDelete` | boolean | Whether the queue should be deleted when the last consumer unsubscribes.\n`queue.vhost` | string | The virtual host of the queue. Defaults to `/`.\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 bindings:\n amqp:\n is: routingKey\n queue:\n name: my-queue-name\n durable: true\n exclusive: true\n autoDelete: false\n vhost: /\n exchange:\n name: myExchange\n type: topic\n durable: true\n autoDelete: false\n vhost: /\n bindingVersion: 0.2.0\n```', + }, + { + target: 'amqp1', + docs: '[AMQP 1.0 Channel Binding](https://github.com/asyncapi/bindings/blob/master/amqp1#channel)\n\\\n\\\nProtocol-specific information for an AMQP 1.0 channel.', + }, + { + target: 'mqtt', + docs: '[MQTT Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt#channel)\n\\\n\\\nProtocol-specific information for an MQTT channel.', + }, + { + target: 'mqtt5', + docs: '[MQTT 5 Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5#channel)\n\\\n\\\nProtocol-specific information for an MQTT 5 channel.', + }, + { + target: 'nats', + docs: '[NATS Channel Binding](https://github.com/asyncapi/bindings/blob/master/nats#channel)\n\\\n\\\nProtocol-specific information for a NATS channel.', + }, + { + target: 'jms', + docs: '[JMS Channel Binding](https://github.com/asyncapi/bindings/blob/master/jms#channel)\n\\\n\\\nProtocol-specific information for a JMS channel.', + }, + { + target: 'sns', + docs: '[SNS Channel Binding](https://github.com/asyncapi/bindings/blob/master/sns#channel)\n\\\n\\\nProtocol-specific information for an SNS channel.', + }, + { + target: 'solace', + docs: '[Solace Channel Binding](https://github.com/asyncapi/bindings/tree/master/solace#channel-binding-object)\n\\\n\\\nProtocol-specific information for a Solace channel.', + }, + { + target: 'sqs', + docs: '[SQS Channel Binding](https://github.com/asyncapi/bindings/blob/master/sqs#channel)\n\\\n\\\nProtocol-specific information for an SQS channel.', + }, + { + target: 'stomp', + docs: '[STOMP Channel Binding](https://github.com/asyncapi/bindings/blob/master/stomp#channel)\n\\\n\\\nProtocol-specific information for a STOMP channel.', + }, + { + target: 'redis', + docs: '[Redis Channel Binding](https://github.com/asyncapi/bindings/blob/master/redis#channel)\n\\\n\\\nProtocol-specific information for a Redis channel.', + }, + { + target: 'mercure', + docs: '[Mercure Channel Binding](https://github.com/asyncapi/bindings/blob/master/mercure#channel)\n\\\n\\\nProtocol-specific information for a Mercure channel.', + }, + { + target: 'ibmmq', + docs: '#### [Channel Binding Object](https://github.com/asyncapi/bindings/tree/master/ibmmq#channel-binding-object)\n\nThis object contains information about the channel representation in IBM MQ. Each channel corresponds to a Queue or Topic within IBM MQ.\n\n##### Fixed Fields\n\nField Name | Type | Description | Applicability [default] | Constraints\n---|:---:|---|:---|:---\n`destinationType` | string | Defines the type of AsyncAPI channel. | OPTIONAL [`topic`] | MUST be either `topic` or `queue`. For type `topic`, the AsyncAPI channel name MUST be assumed for the IBM MQ topic string unless overridden.\n`queue` | Map[string, any] | Defines the properties of a queue. | REQUIRED if `destinationType` = `queue` | `queue` and `topic` fields MUST NOT coexist within a channel binding\n`queue.objectName` | string | Defines the name of the IBM MQ queue associated with the channel. | REQUIRED | A value MUST be specified. MUST NOT exceed 48 characters in length. MUST be a valid IBM MQ queue name\n`queue.isPartitioned` | boolean | Defines if the queue is a cluster queue and therefore partitioned. If `true`, a binding option MAY be specified when accessing the queue. More information on binding options can be found on this [page](https://www.ibm.com/support/knowledgecenter/SSFKSJ_latest/com.ibm.mq.ref.dev.doc/q101870_.html#q101870___BIND_ON_OPEN) in the IBM MQ Knowledge Center. | OPTIONAL [`false`] | If `false`, binding options SHOULD NOT be specified when accessing the queue.\n`queue.exclusive` | boolean | Specifies if it is recommended to open the queue exclusively. | OPTIONAL [`false`] | -\n`topic` | Map[string, any] | Defines the properties of a topic. | OPTIONAL if `destinationType` = `topic` | `queue` and `topic` fields MUST NOT coexist within a channel binding.\n`topic.string` | string | The value of the IBM MQ topic string to be used. | OPTIONAL ; *Note: if specified, SHALL override AsyncAPI channel name.* | MUST NOT exceed 10240 characters in length. MAY coexist with `topic.objectName`\n`topic.objectName` | string | The name of the IBM MQ topic object. | OPTIONAL ; *Note: if specified, SHALL override AsyncAPI channel name.*| MUST NOT exceed 48 characters in length. MAY coexist with `topic.string`\n`topic.durablePermitted` | boolean | Defines if the subscription may be durable. | OPTIONAL [`true`] | -\n`topic.lastMsgRetained` | boolean | Defines if the last message published will be made available to new subscriptions. | OPTIONAL [`false`] | -\n`maxMsgLength` | integer | The maximum length of the physical message (in bytes) accepted by the Topic or Queue. Messages produced that are greater in size than this value may fail to be delivered. More information on the maximum message length can be found on this [page](https://www.ibm.com/support/knowledgecenter/SSFKSJ_latest/com.ibm.mq.ref.adm.doc/q085520_.html#q085520___maxmsgl) in the IBM MQ Knowledge Center. | OPTIONAL [negotiated on IBM MQ channel]| MUST be `0-104,857,600` bytes (100 MB).\n`bindingVersion` | string | The version of this binding. | OPTIONAL [`latest`] | -\n\n\nThis object MUST contain only the properties defined above.\n\n##### Example for an IBM MQ Topic where topic string is defined by AsyncAPI channel\n\n\n\\\nYAML\n```yaml\nchannels:\n user/signedup:\n```\n\n##### Example for AsyncAPI channel mapping to an IBM MQ topic with a specified MQ Topic object\n\n```yaml\nchannels:\n user/signedup:\n bindings:\n ibmmq:\n destinationType: topic\n topic:\n objectName: myTopicName\n bindingVersion: 0.1.0\n```\n\n##### Example for AsyncAPI channel mapping to an IBM MQ Queue\n\n```yaml\nchannels:\n user/signedup:\n bindings:\n ibmmq:\n destinationType: queue\n queue:\n objectName: myQueueName\n exclusive: true\n bindingVersion: 0.1.0\n```', + }, + { + docs: '#### [Channel Bindings Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#channel-bindings-object)\n\nMap describing protocol-specific definitions for a channel.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`http` | [HTTP Channel Binding](https://github.com/asyncapi/bindings/blob/master/http/README.md#channel) | Protocol-specific information for an HTTP channel.\n`ws` | [WebSockets Channel Binding](https://github.com/asyncapi/bindings/blob/master/websockets/README.md#channel) | Protocol-specific information for a WebSockets channel.\n`kafka` | [Kafka Channel Binding](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#channel) | Protocol-specific information for a Kafka channel.\n`anypointmq` | [Anypoint MQ Channel Binding](https://github.com/asyncapi/bindings/blob/master/anypointmq/README.md#channel) | Protocol-specific information for an Anypoint MQ channel.\n`amqp` | [AMQP Channel Binding](https://github.com/asyncapi/bindings/blob/master/amqp/README.md#channel) | Protocol-specific information for an AMQP 0-9-1 channel.\n`amqp1` | [AMQP 1.0 Channel Binding](https://github.com/asyncapi/bindings/blob/master/amqp1/README.md#channel) | Protocol-specific information for an AMQP 1.0 channel.\n`mqtt` | [MQTT Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt/README.md#channel) | Protocol-specific information for an MQTT channel.\n`mqtt5` | [MQTT 5 Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5#channel) | Protocol-specific information for an MQTT 5 channel.\n`nats` | [NATS Channel Binding](https://github.com/asyncapi/bindings/blob/master/nats/README.md#channel) | Protocol-specific information for a NATS channel.\n`jms` | [JMS Channel Binding](https://github.com/asyncapi/bindings/blob/master/jms/README.md#channel) | Protocol-specific information for a JMS channel.\n`sns` | [SNS Channel Binding](https://github.com/asyncapi/bindings/blob/master/sns/README.md#channel) | Protocol-specific information for an SNS channel.\n`solace` | [Solace Channel Binding](https://github.com/asyncapi/bindings/blob/master/solace#channel) | Protocol-specific information for a Solace channel.\n`sqs` | [SQS Channel Binding](https://github.com/asyncapi/bindings/blob/master/sqs/README.md#channel) | Protocol-specific information for an SQS channel.\n`stomp` | [STOMP Channel Binding](https://github.com/asyncapi/bindings/blob/master/stomp/README.md#channel) | Protocol-specific information for a STOMP channel.\n`redis` | [Redis Channel Binding](https://github.com/asyncapi/bindings/blob/master/redis#channel) | Protocol-specific information for a Redis channel.\n`mercure` | [Mercure Channel Binding](https://github.com/asyncapi/bindings/blob/master/mercure#channel) | Protocol-specific information for a Mercure channel.\n`ibmmq` | [IBM MQ Channel Binding](https://github.com/asyncapi/bindings/tree/master/ibmmq#channel-binding-object) | Protocol-specific information for an IBM MQ channel.\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/channel-bindings/lint/allowed-fields-2-0--2-1.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/allowed-fields-2-0--2-1.ts new file mode 100644 index 0000000000..2ca0a37e10 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/allowed-fields-2-0--2-1.ts @@ -0,0 +1,36 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const channelBindingsAllowedFields2021Lint: 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 channelBindingsAllowedFields2021Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/allowed-fields-2-2.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/allowed-fields-2-2.ts new file mode 100644 index 0000000000..60e6a7302d --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/allowed-fields-2-2.ts @@ -0,0 +1,35 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const channelBindingsAllowedFields22Lint: 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 channelBindingsAllowedFields22Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/allowed-fields-2-3.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/allowed-fields-2-3.ts new file mode 100644 index 0000000000..2994a6efab --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/allowed-fields-2-3.ts @@ -0,0 +1,37 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const channelBindingsAllowedFields23Lint: 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', + 'ibmmq', + ], + 'x-', + ], + marker: 'key', + targetSpecs: [{ namespace: 'asyncapi', version: '2.3.0' }], +}; + +export default channelBindingsAllowedFields23Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/amqp.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/amqp.ts new file mode 100644 index 0000000000..3acc35c9c2 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/amqp.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const amqpLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_AMQP, + source: 'apilint', + message: '"amqp" must be a AMQP Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['amqpChannelBinding'], + marker: 'value', + target: 'amqp', + data: {}, +}; + +export default amqpLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/amqp1.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/amqp1.ts new file mode 100644 index 0000000000..53874c4af9 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/amqp1.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const amqp1Lint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_AMQP1, + source: 'apilint', + message: '"amqp1" must be a AMQP 1.0 Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['amqp1ChannelBinding'], + marker: 'value', + target: 'amqp1', + data: {}, +}; + +export default amqp1Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/anypointmq.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/anypointmq.ts new file mode 100644 index 0000000000..199f704ba6 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/anypointmq.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const anypointmqLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_ANYPOINTMQ, + source: 'apilint', + message: '"anypointmq" must be a Anypoint MQ Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['anypointmqChannelBinding'], + marker: 'value', + target: 'anypointmq', + data: {}, +}; + +export default anypointmqLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/http.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/http.ts new file mode 100644 index 0000000000..68ba39eadd --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/http.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const httpLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_HTTP, + source: 'apilint', + message: '"http" must be a HTTP Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['httpChannelBinding'], + marker: 'value', + target: 'http', + data: {}, +}; + +export default httpLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ibmmq.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ibmmq.ts new file mode 100644 index 0000000000..4c676afea1 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ibmmq.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const ibmmqLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_IBMMQ, + source: 'apilint', + message: '"ibmmq" must be a IBM MQ Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['ibmmqChannelBinding'], + marker: 'value', + target: 'ibmmq', + data: {}, +}; + +export default ibmmqLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/index.ts new file mode 100644 index 0000000000..31db5cd453 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/index.ts @@ -0,0 +1,49 @@ +import channelBindings$RefLint from './ref'; +import channelBindingsRefNonSiblingsLint from './ref-non-siblings'; +import channelBindingsAllowedFields2_0__2_1Lint from './allowed-fields-2-0--2-1'; +import channelBindingsAllowedFields2_2Lint from './allowed-fields-2-2'; +import channelBindingsAllowedFields2_3Lint from './allowed-fields-2-3'; +import httpLint from './http'; +import ibmmqLint from './ibmmq'; +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 = [ + channelBindingsAllowedFields2_0__2_1Lint, + channelBindingsAllowedFields2_2Lint, + channelBindingsAllowedFields2_3Lint, + channelBindings$RefLint, + channelBindingsRefNonSiblingsLint, + httpLint, + ibmmqLint, + 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/channel-bindings/lint/jms.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/jms.ts new file mode 100644 index 0000000000..b9ef47f5c4 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/jms.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const jmsLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_JMS, + source: 'apilint', + message: '"jms" must be a JMS Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['httpChannelBinding'], + marker: 'value', + target: 'jms', + data: {}, +}; + +export default jmsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/kafka.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/kafka.ts new file mode 100644 index 0000000000..055c26f654 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/kafka.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const kafkaLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_KAFKA, + source: 'apilint', + message: '"kafka" must be a Kafka Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['kafkaChannelBinding'], + marker: 'value', + target: 'kafka', + data: {}, +}; + +export default kafkaLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/mercure.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/mercure.ts new file mode 100644 index 0000000000..1fac206616 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/mercure.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const mercureLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_MERCURE, + source: 'apilint', + message: '"mercure" must be a Mercure Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['mercureChannelBinding'], + marker: 'value', + target: 'mercure', + data: {}, +}; + +export default mercureLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/mqtt.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/mqtt.ts new file mode 100644 index 0000000000..6b103c58bd --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/mqtt.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const mqttLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_MQTT, + source: 'apilint', + message: '"mqtt" must be a MQTT Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['mqttChannelBinding'], + marker: 'value', + target: 'mqtt', + data: {}, +}; + +export default mqttLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/mqtt5.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/mqtt5.ts new file mode 100644 index 0000000000..013ebe64ef --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/mqtt5.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const mqtt5Lint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_MQTT5, + source: 'apilint', + message: '"mqtt5" must be a MQTT 5 Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['mqtt5ChannelBinding'], + marker: 'value', + target: 'mqtt5', + data: {}, +}; + +export default mqtt5Lint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/nats.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/nats.ts new file mode 100644 index 0000000000..40963edb1b --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/nats.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const natsLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_NATS, + source: 'apilint', + message: '"nats" must be a NATS Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['natsChannelBinding'], + marker: 'value', + target: 'nats', + data: {}, +}; + +export default natsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/redis.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/redis.ts new file mode 100644 index 0000000000..a5a5bd7599 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/redis.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const redisLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_REDIS, + source: 'apilint', + message: '"redis" must be a Redis Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['redisChannelBinding'], + marker: 'value', + target: 'redis', + data: {}, +}; + +export default redisLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ref-non-siblings.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ref-non-siblings.ts new file mode 100644 index 0000000000..dd42c3ff81 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ref-non-siblings.ts @@ -0,0 +1,30 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const channelBindingsRefNonSiblingsLint: LinterMeta = { + code: ApilintCodes.CHANNEL_REF_NOSIBLINGS, + 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 channelBindingsRefNonSiblingsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ref.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ref.ts new file mode 100644 index 0000000000..e4b26f737b --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ref.ts @@ -0,0 +1,15 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const channelBindings$RefLint: LinterMeta = { + code: ApilintCodes.CHANNEL_REF, + source: 'apilint', + message: "'$ref' value must be a valid URI-reference", + severity: 1, + linterFunction: 'apilintValidURI', + marker: 'value', + target: '$ref', + data: {}, +}; + +export default channelBindings$RefLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/sns.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/sns.ts new file mode 100644 index 0000000000..99cafb7b56 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/sns.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const snsLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_SNS, + source: 'apilint', + message: '"sns" must be a SNS Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['snsChannelBinding'], + marker: 'value', + target: 'sns', + data: {}, +}; + +export default snsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/solace.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/solace.ts new file mode 100644 index 0000000000..2539eac6a7 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/solace.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const solaceLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_SOLACE, + source: 'apilint', + message: '"solace" must be a Solace Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['solaceChannelBinding'], + marker: 'value', + target: 'solace', + data: {}, +}; + +export default solaceLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/sqs.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/sqs.ts new file mode 100644 index 0000000000..0c203ea0c1 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/sqs.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const sqsLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_SQS, + source: 'apilint', + message: '"sqs" must be a SQS Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['sqsChannelBinding'], + marker: 'value', + target: 'sqs', + data: {}, +}; + +export default sqsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/stomp.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/stomp.ts new file mode 100644 index 0000000000..6673c32df7 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/stomp.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const stompLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_STOMP, + source: 'apilint', + message: '"stomp" must be a STOMP Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['stompChannelBinding'], + marker: 'value', + target: 'stomp', + data: {}, +}; + +export default stompLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ws.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ws.ts new file mode 100644 index 0000000000..65e2577492 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-bindings/lint/ws.ts @@ -0,0 +1,16 @@ +import ApilintCodes from '../../../codes'; +import { LinterMeta } from '../../../../apidom-language-types'; + +const wsLint: LinterMeta = { + code: ApilintCodes.CHANNEL_BINDING_WS, + source: 'apilint', + message: '"ws" must be a WebSockets Channel Binding', + severity: 1, + linterFunction: 'apilintElementOrClass', + linterParams: ['wsChannelBinding'], + marker: 'value', + target: 'ws', + data: {}, +}; + +export default wsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/channel-bindings/meta.ts b/packages/apidom-ls/src/config/asyncapi/channel-bindings/meta.ts new file mode 100644 index 0000000000..381bda653d --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/channel-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/channel-item/completion.ts b/packages/apidom-ls/src/config/asyncapi/channel-item/completion.ts index afa8822292..f07cf93135 100644 --- a/packages/apidom-ls/src/config/asyncapi/channel-item/completion.ts +++ b/packages/apidom-ls/src/config/asyncapi/channel-item/completion.ts @@ -107,174 +107,6 @@ const completion: ApidomCompletionItem[] = [ function: 'apicompleteChannelServers', insertTextFormat: 2, }, - { - 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, - targetSpecs: [ - { namespace: 'asyncapi', version: '2.2.0' }, - { namespace: 'asyncapi', version: '2.3.0' }, - ], - }, - { - 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, - targetSpecs: [{ namespace: 'asyncapi', version: '2.3.0' }], - }, - { - 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, - targetSpecs: [ - { namespace: 'asyncapi', version: '2.1.0' }, - { namespace: 'asyncapi', version: '2.2.0' }, - { namespace: 'asyncapi', version: '2.3.0' }, - ], - }, - { - target: 'bindings', - label: 'ibmmq', - insertText: 'ibmmq', - kind: 14, - format: CompletionFormat.OBJECT, - type: CompletionType.PROPERTY, - insertTextFormat: 2, - 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/channel-item/lint/bindings.ts b/packages/apidom-ls/src/config/asyncapi/channel-item/lint/bindings.ts index 4c67e30204..8f68c4f2e2 100644 --- a/packages/apidom-ls/src/config/asyncapi/channel-item/lint/bindings.ts +++ b/packages/apidom-ls/src/config/asyncapi/channel-item/lint/bindings.ts @@ -4,10 +4,10 @@ import { LinterMeta } from '../../../../apidom-language-types'; const channelBindingsLint: LinterMeta = { code: ApilintCodes.CHANNEL_BINDINGS, source: 'apilint', - message: 'bindings members must be binding objects', + message: 'bindings must be an object', severity: 1, - linterFunction: 'apilintChildrenOfElementsOrClasess', - linterParams: [['channel-binding']], + linterFunction: 'apilintElementOrClass', + linterParams: ['channelBindings'], marker: 'key', markerTarget: 'bindings', target: 'bindings', diff --git a/packages/apidom-ls/src/config/asyncapi/config.ts b/packages/apidom-ls/src/config/asyncapi/config.ts index a19ff5eb07..da91946dbf 100644 --- a/packages/apidom-ls/src/config/asyncapi/config.ts +++ b/packages/apidom-ls/src/config/asyncapi/config.ts @@ -4,7 +4,8 @@ import jsonSchemaMeta from '../common/schema/meta'; import securitySchemeMeta from './security-scheme/meta'; import infoMeta from './info/meta'; import contactMeta from './contact/meta'; -import channelMeta from './channel-item/meta'; +import channelItemMeta from './channel-item/meta'; +import channelBindingsMeta from './channel-bindings/meta'; import serversMeta from './servers/meta'; import externalDocsMeta from './external-documentation/meta'; import licenseMeta from './license/meta'; @@ -50,7 +51,8 @@ export default { operation: operationMeta, operationBindings: operationBindingsMeta, operationTrait: operationTraitMeta, - channelItem: channelMeta, + channelItem: channelItemMeta, + channelBindings: channelBindingsMeta, channels: channelsMeta, asyncApi2: asyncapi2Meta, asyncApiVersion: asyncapiVersionMeta, diff --git a/packages/apidom-ls/src/config/asyncapi/message/lint/bindings.ts b/packages/apidom-ls/src/config/asyncapi/message/lint/bindings.ts index 4b63bd8c9a..1384c93b78 100644 --- a/packages/apidom-ls/src/config/asyncapi/message/lint/bindings.ts +++ b/packages/apidom-ls/src/config/asyncapi/message/lint/bindings.ts @@ -4,10 +4,10 @@ import { LinterMeta } from '../../../../apidom-language-types'; const messageBindingsLint: LinterMeta = { code: ApilintCodes.MESSAGE_BINDINGS, source: 'apilint', - message: 'bindings members must be Message Binding objects', + message: 'bindings must be an object', severity: 1, - linterFunction: 'apilintChildrenOfElementsOrClasess', - linterParams: [['message-binding']], + linterFunction: 'apilintElementOrClass', + linterParams: ['messageBindings'], marker: 'key', markerTarget: 'bindings', target: 'bindings', diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/completion.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/completion.ts index 68ef575917..691e1b098c 100644 --- a/packages/apidom-ls/src/config/asyncapi/operation-bindings/completion.ts +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/completion.ts @@ -96,7 +96,7 @@ const completion: ApidomCompletionItem[] = [ 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.', + '[AMQP 1.0 Operation Binding](https://github.com/asyncapi/bindings/blob/master/amqp1#operation)\n\\\n\\\nProtocol-specific information for an AMQP 1.0 operation.', }, }, { diff --git a/packages/apidom-ls/src/config/asyncapi/operation-bindings/documentation.ts b/packages/apidom-ls/src/config/asyncapi/operation-bindings/documentation.ts index 022a352f0a..15b2c29b5e 100644 --- a/packages/apidom-ls/src/config/asyncapi/operation-bindings/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/operation-bindings/documentation.ts @@ -25,7 +25,7 @@ const documentation = [ }, { 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.', + 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 operation.', }, { target: 'mqtt', diff --git a/packages/apidom-ls/src/config/asyncapi/operation/lint/bindings.ts b/packages/apidom-ls/src/config/asyncapi/operation/lint/bindings.ts index 2a6ceff9c2..59d086c650 100644 --- a/packages/apidom-ls/src/config/asyncapi/operation/lint/bindings.ts +++ b/packages/apidom-ls/src/config/asyncapi/operation/lint/bindings.ts @@ -4,7 +4,7 @@ import { LinterMeta } from '../../../../apidom-language-types'; const operationBindingsLint: LinterMeta = { code: ApilintCodes.OPERATION_BINDINGS, source: 'apilint', - message: 'bindings members must be Operation Binding objects', + message: 'bindings must be an object', severity: 1, linterFunction: 'apilintElementOrClass', linterParams: ['operationBindings'], diff --git a/packages/apidom-ls/src/config/asyncapi/server/lint/bindings-object.ts b/packages/apidom-ls/src/config/asyncapi/server/lint/bindings.ts similarity index 100% rename from packages/apidom-ls/src/config/asyncapi/server/lint/bindings-object.ts rename to packages/apidom-ls/src/config/asyncapi/server/lint/bindings.ts diff --git a/packages/apidom-ls/src/config/asyncapi/server/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/server/lint/index.ts index 082325f38d..8b1da9bb18 100644 --- a/packages/apidom-ls/src/config/asyncapi/server/lint/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/server/lint/index.ts @@ -7,7 +7,7 @@ import serverDescriptionLint from './description'; import serverVariablesLint from './variables'; import serverVariablesObjectLint from './variables-object'; import serverSecurityLint from './security'; -import serverBindingsObjectLint from './bindings-object'; +import serverBindingsObjectLint from './bindings'; import serverAllowedFieldsLint from './allowed-fields'; const lints = [ diff --git a/packages/apidom-ls/src/config/codes.ts b/packages/apidom-ls/src/config/codes.ts index b58727aaa0..42592aec60 100644 --- a/packages/apidom-ls/src/config/codes.ts +++ b/packages/apidom-ls/src/config/codes.ts @@ -240,6 +240,23 @@ enum ApilintCodes { OPERATION_BINDING_MERCURE, OPERATION_REF, OPERATION_REF_NO_SIBLINGS, + CHANNEL_BINDING_HTTP, + CHANNEL_BINDING_WS, + CHANNEL_BINDING_KAFKA, + CHANNEL_BINDING_ANYPOINTMQ, + CHANNEL_BINDING_AMQP, + CHANNEL_BINDING_AMQP1, + CHANNEL_BINDING_MQTT, + CHANNEL_BINDING_MQTT5, + CHANNEL_BINDING_NATS, + CHANNEL_BINDING_JMS, + CHANNEL_BINDING_SNS, + CHANNEL_BINDING_SOLACE, + CHANNEL_BINDING_SQS, + CHANNEL_BINDING_STOMP, + CHANNEL_BINDING_REDIS, + CHANNEL_BINDING_MERCURE, + CHANNEL_BINDING_IBMMQ, } export default ApilintCodes; diff --git a/packages/apidom-ls/test/channel.ts b/packages/apidom-ls/test/channel.ts index daffa8b3e8..701a69bbc4 100644 --- a/packages/apidom-ls/test/channel.ts +++ b/packages/apidom-ls/test/channel.ts @@ -119,95 +119,157 @@ describe('asyncapi channel test', function () { { items: [ { - target: 'bindings', + label: '$ref', + insertText: '\\$ref: $1', + kind: 14, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: 'A reference to an Channel Bindings', + }, + }, + { label: 'http', insertText: 'http: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[HTTP Channel Binding](https://github.com/asyncapi/bindings/blob/mastechannel)\n\\\n\\\nProtocol-specific information for an HTTP channel.', + }, }, { - target: 'bindings', label: 'ws', insertText: 'ws: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[WebSockets Channel Binding](https://github.com/asyncapi/bindings/blob/master/websockets#channel)\n\\\n\\\nProtocol-specific information for a WebSockets channel.', + }, }, { - target: 'bindings', label: 'kafka', insertText: 'kafka: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Kafka Channel Binding](https://github.com/asyncapi/bindings/blob/master/kafka#channel)\n\\\n\\\nProtocol-specific information for a Kafka channel.', + }, }, { - target: 'bindings', label: 'amqp', insertText: 'amqp: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[AMQP Channel Binding](https://github.com/asyncapi/bindings/blob/master/amqp#channel)\n\\\n\\\nProtocol-specific information for an AMQP 0-9-1 channel.', + }, }, { - target: 'bindings', label: 'amqp1', insertText: 'amqp1: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[AMQP 1.0 Channel Binding](https://github.com/asyncapi/bindings/blob/master/amqp1#channel)\n\\\n\\\nProtocol-specific information for an AMQP 1.0 channel.', + }, }, { - target: 'bindings', label: 'mqtt', insertText: 'mqtt: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[MQTT Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt#channel)\n\\\n\\\nProtocol-specific information for an MQTT channel.', + }, }, { - target: 'bindings', label: 'mqtt5', insertText: 'mqtt5: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[MQTT 5 Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5#channel)\n\\\n\\\nProtocol-specific information for an MQTT 5 channel.', + }, }, { - target: 'bindings', label: 'nats', insertText: 'nats: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[NATS Channel Binding](https://github.com/asyncapi/bindings/blob/master/nats#channel)\n\\\n\\\nProtocol-specific information for a NATS channel.', + }, }, { - target: 'bindings', label: 'jms', insertText: 'jms: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[JMS Channel Binding](https://github.com/asyncapi/bindings/blob/master/jms#channel)\n\\\n\\\nProtocol-specific information for a JMS channel.', + }, }, { - target: 'bindings', label: 'sns', insertText: 'sns: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[SNS Channel Binding](https://github.com/asyncapi/bindings/blob/master/sns#channel)\n\\\n\\\nProtocol-specific information for an SNS channel.', + }, }, { - target: 'bindings', label: 'sqs', insertText: 'sqs: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[SQS Channel Binding](https://github.com/asyncapi/bindings/blob/master/sqs#channel)\n\\\n\\\nProtocol-specific information for an SQS channel.', + }, }, { - target: 'bindings', label: 'stomp', insertText: 'stomp: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[STOMP Channel Binding](https://github.com/asyncapi/bindings/blob/master/stomp#channel)\n\\\n\\\nProtocol-specific information for a STOMP channel.', + }, }, { - target: 'bindings', label: 'redis', insertText: 'redis: \n $1', kind: 14, insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Redis Channel Binding](https://github.com/asyncapi/bindings/blob/master/redis#channel)\n\\\n\\\nProtocol-specific information for a Redis channel.', + }, }, ], isIncomplete: false, @@ -359,10 +421,10 @@ describe('asyncapi channel test', function () { data: {}, }, { - range: { start: { line: 40, character: 4 }, end: { line: 40, character: 12 } }, - message: 'bindings members must be binding objects', + range: { start: { line: 41, character: 12 }, end: { line: 41, character: 15 } }, + message: '"http" must be a HTTP Channel Binding', severity: 1, - code: 10133, + code: 10242, source: 'apilint', data: {}, }, 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 d607df040e..51075aeab1 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 @@ -65,14 +65,6 @@ const operationLintExpected = [ ], }, }, - { - range: { start: { line: 33, character: 6 }, end: { line: 33, character: 14 } }, - message: 'bindings members must be Operation Binding objects', - severity: 1, - code: 10141, - source: 'apilint', - data: {}, - }, { range: { start: { line: 37, character: 15 }, end: { line: 37, character: 17 } }, message: '"message" must be a Message Object',