From 999f01a5b31432af5dfab4e12109a85694043243 Mon Sep 17 00:00:00 2001 From: Oliwia Rogala Date: Thu, 19 Mar 2026 11:02:09 +0100 Subject: [PATCH 1/4] feat(ls): update Kafka bindings Co-Authored-By: Claude Sonnet 4.6 --- .../kafka/channel-binding/completion/0-3-0.ts | 2 +- .../kafka/channel-binding/completion/0-4-0.ts | 88 ++ .../kafka/channel-binding/completion/0-5-0.ts | 88 ++ .../kafka/channel-binding/completion/index.ts | 24 +- .../channel-binding/completion/latest.ts | 21 +- .../kafka/channel-binding/documentation.ts | 10 +- .../lint/0-4-0/allowed-fields.ts | 23 + .../kafka/channel-binding/lint/0-4-0/index.ts | 15 + .../lint/0-4-0/partitions--minimum.ts | 25 + .../lint/0-4-0/replicas--minimum.ts | 25 + .../channel-binding/lint/0-4-0/topic--type.ts | 25 + .../lint/0-4-0/topic-configuration--type.ts | 25 + .../lint/0-5-0/allowed-fields.ts | 23 + .../kafka/channel-binding/lint/0-5-0/index.ts | 15 + .../lint/0-5-0/partitions--minimum.ts | 25 + .../lint/0-5-0/replicas--minimum.ts | 25 + .../channel-binding/lint/0-5-0/topic--type.ts | 25 + .../lint/0-5-0/topic-configuration--type.ts | 25 + .../kafka/channel-binding/lint/index.ts | 4 + .../lint/latest/allowed-fields.ts | 2 +- .../channel-binding/lint/latest/index.ts | 9 +- .../lint/latest/topic-configuration--type.ts | 24 + .../kafka/message-binding/completion.ts | 20 +- .../kafka/message-binding/completion/0-1-0.ts | 25 +- .../kafka/message-binding/completion/0-2-0.ts | 25 +- .../kafka/message-binding/completion/0-3-0.ts | 31 +- .../kafka/message-binding/completion/0-4-0.ts | 113 ++ .../kafka/message-binding/completion/0-5-0.ts | 113 ++ .../kafka/message-binding/completion/index.ts | 24 +- .../message-binding/completion/latest.ts | 30 +- .../kafka/message-binding/documentation.ts | 25 +- .../lint/0-4-0/allowed-fields.ts | 25 + .../kafka/message-binding/lint/0-4-0/index.ts | 15 + .../message-binding/lint/0-4-0/key--type.ts | 25 + .../lint/0-4-0/schema-id-location--type.ts | 25 + .../0-4-0/schema-id-payload-encoding--type.ts | 25 + .../0-4-0/schema-lookup-strategy--type.ts | 25 + .../lint/0-5-0/allowed-fields.ts | 25 + .../kafka/message-binding/lint/0-5-0/index.ts | 15 + .../message-binding/lint/0-5-0/key--type.ts | 25 + .../lint/0-5-0/schema-id-location--type.ts | 25 + .../0-5-0/schema-id-payload-encoding--type.ts | 25 + .../0-5-0/schema-lookup-strategy--type.ts | 25 + .../kafka/message-binding/lint/index.ts | 4 + .../lint/latest/allowed-fields.ts | 4 +- .../operation-binding/completion/0-1-0.ts | 45 + .../operation-binding/completion/0-2-0.ts | 45 + .../operation-binding/completion/0-3-0.ts | 45 + .../operation-binding/completion/0-4-0.ts | 95 ++ .../operation-binding/completion/0-5-0.ts | 95 ++ .../operation-binding/completion/index.ts | 24 +- .../operation-binding/completion/latest.ts | 43 + .../kafka/operation-binding/documentation.ts | 23 +- .../lint/0-4-0/allowed-fields.ts | 23 + .../lint/0-4-0/client-id--type.ts | 25 + .../lint/0-4-0/group-id--type.ts | 25 + .../operation-binding/lint/0-4-0/index.ts | 7 + .../lint/0-5-0/allowed-fields.ts | 23 + .../lint/0-5-0/client-id--type.ts | 25 + .../lint/0-5-0/group-id--type.ts | 25 + .../operation-binding/lint/0-5-0/index.ts | 7 + .../kafka/operation-binding/lint/index.ts | 4 + .../kafka/server-binding/completion/0-3-0.ts | 4 +- .../kafka/server-binding/completion/0-4-0.ts | 114 ++ .../kafka/server-binding/completion/0-5-0.ts | 114 ++ .../kafka/server-binding/completion/index.ts | 24 +- .../kafka/server-binding/completion/latest.ts | 4 +- .../kafka/server-binding/documentation.ts | 8 +- .../kafka/server-binding/lint/0-3-0/index.ts | 4 +- ...ts => schema-registry-vendor--excluded.ts} | 25 +- .../lint/0-4-0/allowed-fields.ts | 23 + .../kafka/server-binding/lint/0-4-0/index.ts | 13 + .../0-4-0/schema-registry-url--format-uri.ts | 25 + .../0-4-0/schema-registry-vendor--excluded.ts | 28 + .../0-4-0/schema-registry-vendor--type.ts | 25 + .../lint/0-5-0/allowed-fields.ts | 23 + .../kafka/server-binding/lint/0-5-0/index.ts | 13 + .../0-5-0/schema-registry-url--format-uri.ts | 25 + .../0-5-0/schema-registry-vendor--excluded.ts | 28 + .../0-5-0/schema-registry-vendor--type.ts | 25 + .../kafka/server-binding/lint/index.ts | 4 + .../kafka/server-binding/lint/latest/index.ts | 4 +- .../schema-registry-vendor--excluded.ts | 27 + .../schema-registry-vendor--required.ts | 36 - packages/apidom-ls/src/config/codes.ts | 3 +- .../apidom-ls/test/asyncapi-kafka-bindings.ts | 1174 +++++++++++++++++ ...-channel-binding-allowed-fields-0-1-0.yaml | 10 + ...-channel-binding-allowed-fields-0-2-0.yaml | 10 + ...-channel-binding-allowed-fields-0-3-0.yaml | 10 + ...-channel-binding-allowed-fields-0-4-0.yaml | 10 + ...-channel-binding-allowed-fields-0-5-0.yaml | 10 + ...channel-binding-allowed-fields-latest.yaml | 9 + ...-channel-binding-binding-version-type.yaml | 9 + ...ka-channel-binding-partitions-minimum.yaml | 9 + ...afka-channel-binding-replicas-minimum.yaml | 9 + ...nnel-binding-replicas-partitions-type.yaml | 0 ...nnel-binding-topic-configuration-type.yaml | 9 + .../kafka-channel-binding-topic-type.yaml | 9 + ...-message-binding-allowed-fields-0-1-0.yaml | 10 + ...-message-binding-allowed-fields-0-2-0.yaml | 10 + ...-message-binding-allowed-fields-0-3-0.yaml | 10 + ...-message-binding-allowed-fields-0-4-0.yaml | 10 + ...-message-binding-allowed-fields-0-5-0.yaml | 10 + ...message-binding-allowed-fields-latest.yaml | 9 + ...-message-binding-binding-version-type.yaml | 9 + .../kafka/kafka-message-binding-key-type.yaml | 9 + ...ssage-binding-schema-id-location-type.yaml | 9 + ...nding-schema-id-payload-encoding-type.yaml | 9 + ...e-binding-schema-lookup-strategy-type.yaml | 9 + ...peration-binding-allowed-fields-0-1-0.yaml | 10 + ...peration-binding-allowed-fields-0-2-0.yaml | 10 + ...peration-binding-allowed-fields-0-3-0.yaml | 10 + ...peration-binding-allowed-fields-0-4-0.yaml | 10 + ...peration-binding-allowed-fields-0-5-0.yaml | 10 + ...eration-binding-allowed-fields-latest.yaml | 9 + ...peration-binding-binding-version-type.yaml | 9 + ...afka-operation-binding-client-id-type.yaml | 9 + ...a-server-binding-allowed-fields-0-1-0.yaml | 12 + ...a-server-binding-allowed-fields-0-2-0.yaml | 12 + ...a-server-binding-allowed-fields-0-3-0.yaml | 12 + ...a-server-binding-allowed-fields-0-4-0.yaml | 12 + ...a-server-binding-allowed-fields-0-5-0.yaml | 12 + ...-server-binding-allowed-fields-latest.yaml | 11 + ...a-server-binding-binding-version-type.yaml | 11 + ...inding-schema-registry-url-format-uri.yaml | 11 + ...nding-schema-registry-vendor-excluded.yaml | 11 + ...r-binding-schema-registry-vendor-type.yaml | 12 + packages/apidom-ls/test/validate.ts | 51 - .../bindings/kafka/KafkaChannelBinding.ts | 8 + .../plugins/replace-empty-element.ts | 5 + .../src/refractor/specification.ts | 3 + .../__snapshots__/index.ts.snap | 3 + .../kafka/KafkaChannelBinding/index.ts | 3 +- .../plugins/replace-empty-element.ts | 6 + .../src/refractor/specification.ts | 3 + .../__snapshots__/index.ts.snap | 3 + .../kafka/KafkaChannelBinding/index.ts | 3 +- 137 files changed, 3932 insertions(+), 151 deletions(-) create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-4-0.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-5-0.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/allowed-fields.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/index.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/partitions--minimum.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/replicas--minimum.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/topic--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/topic-configuration--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/allowed-fields.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/index.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/partitions--minimum.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/replicas--minimum.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/topic--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/topic-configuration--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/topic-configuration--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-4-0.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-5-0.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/allowed-fields.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/index.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/key--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-id-location--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-id-payload-encoding--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-lookup-strategy--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/allowed-fields.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/index.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/key--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-id-location--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-id-payload-encoding--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-lookup-strategy--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-4-0.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-5-0.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/allowed-fields.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/client-id--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/group-id--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/index.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/allowed-fields.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/client-id--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/group-id--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/index.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-4-0.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-5-0.ts rename packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/{schema-registry-vendor--required.ts => schema-registry-vendor--excluded.ts} (50%) create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/allowed-fields.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/index.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-url--format-uri.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-vendor--excluded.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-vendor--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/allowed-fields.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/index.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-url--format-uri.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-vendor--excluded.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-vendor--type.ts create mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/schema-registry-vendor--excluded.ts delete mode 100644 packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/schema-registry-vendor--required.ts create mode 100644 packages/apidom-ls/test/asyncapi-kafka-bindings.ts create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-1-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-2-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-3-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-4-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-5-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-latest.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-binding-version-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-partitions-minimum.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-replicas-minimum.yaml rename packages/apidom-ls/test/fixtures/validation/asyncapi/{ => bindings/kafka}/kafka-channel-binding-replicas-partitions-type.yaml (100%) create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-topic-configuration-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-topic-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-1-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-2-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-3-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-4-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-5-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-latest.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-binding-version-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-key-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-id-location-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-id-payload-encoding-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-lookup-strategy-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-1-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-2-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-3-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-4-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-5-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-latest.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-binding-version-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-client-id-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-1-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-2-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-3-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-4-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-5-0.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-latest.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-binding-version-type.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-url-format-uri.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-vendor-excluded.yaml create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-vendor-type.yaml diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-3-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-3-0.ts index c78c751d54..563cacd6ac 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-3-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-3-0.ts @@ -14,7 +14,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'Kafka topic name if different from channel name.', + value: '`string`\n\\\n\\\nKafka topic name if different from channel name.', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-4-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-4-0.ts new file mode 100644 index 0000000000..61e0a3d28f --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-4-0.ts @@ -0,0 +1,88 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'topic', + insertText: 'topic', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: '`string`\n\\\n\\\nKafka topic name if different from channel name.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'partitions', + insertText: 'partitions', + kind: 14, + format: CompletionFormat.UNQUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer`\n\\\n\\\nNumber of partitions configured on this topic (useful to know how many parallel consumers you may run).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'replicas', + insertText: 'replicas', + kind: 14, + format: CompletionFormat.UNQUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: '`integer`\n\\\n\\\nNumber of replicas configured on this topic.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'topicConfiguration', + insertText: 'topicConfiguration', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Topic Configuration Object](https://github.com/asyncapi/bindings/blob/306f1fc8333e10730a6dd953e92211f0cdb7736e/kafka/README.md#topicConfiguration-object)\n\\\n\\\nTopic configuration properties that are relevant for the API.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-5-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-5-0.ts new file mode 100644 index 0000000000..ff0916d573 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/0-5-0.ts @@ -0,0 +1,88 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'topic', + insertText: 'topic', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: '`string`\n\\\n\\\nKafka topic name if different from channel name.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'partitions', + insertText: 'partitions', + kind: 14, + format: CompletionFormat.UNQUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer`\n\\\n\\\nNumber of partitions configured on this topic (useful to know how many parallel consumers you may run).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'replicas', + insertText: 'replicas', + kind: 14, + format: CompletionFormat.UNQUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: '`integer`\n\\\n\\\nNumber of replicas configured on this topic.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'topicConfiguration', + insertText: 'topicConfiguration', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Topic Configuration Object](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#topicConfiguration-object)\n\\\n\\\nTopic configuration properties that are relevant for the API.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/index.ts index 9769bbb39c..2a97075f8e 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/index.ts @@ -1,4 +1,6 @@ import completion0_3_0Items from './0-3-0.ts'; +import completion0_4_0Items from './0-4-0.ts'; +import completion0_5_0Items from './0-5-0.ts'; import completionLatestItems from './latest.ts'; import { ApidomCompletionItem, @@ -8,6 +10,8 @@ import { const completion: ApidomCompletionItem[] = [ ...completion0_3_0Items, + ...completion0_4_0Items, + ...completion0_5_0Items, ...completionLatestItems, { label: 'bindingVersion', @@ -18,7 +22,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The version of this binding. If omitted, "0.3.0" MUST be assumed.', + value: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, }, { @@ -48,6 +52,24 @@ const completion: ApidomCompletionItem[] = [ type: CompletionType.VALUE, insertTextFormat: 2, }, + { + target: 'bindingVersion', + label: '0.4.0', + insertText: '0.4.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + type: CompletionType.VALUE, + insertTextFormat: 2, + }, + { + target: 'bindingVersion', + label: '0.5.0', + insertText: '0.5.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + type: CompletionType.VALUE, + insertTextFormat: 2, + }, ]; export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/latest.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/latest.ts index 16dab78456..d6ab016a7f 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/latest.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/completion/latest.ts @@ -14,7 +14,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'Kafka topic name if different from channel name.', + value: '`string`\n\\\n\\\nKafka topic name if different from channel name.', }, conditions: [ { @@ -60,6 +60,25 @@ const completion: ApidomCompletionItem[] = [ }, ], }, + { + label: 'topicConfiguration', + insertText: 'topicConfiguration', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Topic Configuration Object](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#topicConfiguration-object)\n\\\n\\\nTopic configuration properties that are relevant for the API.', + }, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, ]; export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/documentation.ts index 8ea42c832d..3e2076347d 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/documentation.ts @@ -1,7 +1,7 @@ const documentation = [ { target: 'topic', - docs: 'Kafka topic name if different from channel name.', + docs: '`string`\n\\\n\\\nKafka topic name if different from channel name.', }, { target: 'partitions', @@ -11,12 +11,16 @@ const documentation = [ target: 'replicas', docs: '`integer`\n\\\n\\\nNumber of replicas configured on this topic.', }, + { + target: 'topicConfiguration', + docs: '[Topic Configuration Object](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#topicConfiguration-object)\n\\\n\\\nTopic configuration properties that are relevant for the API.\n\n##### Fixed Fields\n\nField Name | Type | Description | Applicability [default] | Constraints\n---|:---:|:---:|:---:|---\n`cleanup.policy` | array | The [`cleanup.policy`](https://kafka.apache.org/documentation/#topicconfigs_cleanup.policy) configuration option. | OPTIONAL | array may only contain `delete` and/or `compact`\n`retention.ms` | long | The [`retention.ms`](https://kafka.apache.org/documentation/#topicconfigs_retention.ms) configuration option. | OPTIONAL | see kafka documentation\n`retention.bytes` | long | The [`retention.bytes`](https://kafka.apache.org/documentation/#topicconfigs_retention.bytes) configuration option. | OPTIONAL | see kafka documentation\n`delete.retention.ms` | long | The [`delete.retention.ms`](https://kafka.apache.org/documentation/#topicconfigs_delete.retention.ms) configuration option. | OPTIONAL | see kafka documentation\n`max.message.bytes` | integer | The [`max.message.bytes`](https://kafka.apache.org/documentation/#topicconfigs_max.message.bytes) configuration option. | OPTIONAL | see kafka documentation\n`confluent.key.schema.validation` | boolean | It shows whether the schema validation for the message key is enabled. Vendor specific config. | OPTIONAL | -\n`confluent.key.subject.name.strategy` | string | The name of the schema lookup strategy for the message key. Vendor specific config. | OPTIONAL | Clients should default to the vendor default if not supplied.\n`confluent.value.schema.validation` | boolean | It shows whether the schema validation for the message value is enabled. Vendor specific config. | OPTIONAL | -\n`confluent.value.subject.name.strategy` | string | The name of the schema lookup strategy for the message value. Vendor specific config. | OPTIONAL | Clients should default to the vendor default if not supplied.', + }, { target: 'bindingVersion', - docs: 'The version of this binding. If omitted, "0.3.0" MUST be assumed.', + docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, { - docs: "#### [Channel Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka#channel)\n\nThis object contains information about the channel representation in Kafka (eg. a Kafka topic).\n\n##### Fixed Fields\n\nField Name | Type | Description | Applicability [default] | Constraints\n---|:---:|:---:|:---:|---\n`topic` | string | Kafka topic name if different from channel name. | OPTIONAL | -\n`partitions` | integer | Number of partitions configured on this topic (useful to know how many parallel consumers you may run). | OPTIONAL | Must be positive\n`replicas` | integer | Number of replicas configured on this topic. | OPTIONAL | MUST be positive\n`bindingVersion` | string | The version of this binding. If omitted, \"0.3.0\" MUST be assumed. | OPTIONAL [`0.3.0`] | -\n\nThis object MUST contain only the properties defined above.\n\n##### Example\n\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n user-signedup:\n bindings:\n kafka:\n topic: 'my-specific-topic-name'\n partitions: 20\n replicas: 3\n bindingVersion: '0.3.0'\n```", + docs: "#### [Channel Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka#channel)\n\nThis object contains information about the channel representation in Kafka (eg. a Kafka topic).\n\n##### Fixed Fields\n\nField Name | Type | Description | Applicability [default] | Constraints\n---|:---:|:---:|:---:|---\n`topic` | string | Kafka topic name if different from channel name. | OPTIONAL | -\n`partitions` | integer | Number of partitions configured on this topic (useful to know how many parallel consumers you may run). | OPTIONAL | Must be positive\n`replicas` | integer | Number of replicas configured on this topic. | OPTIONAL | MUST be positive\n`topicConfiguration` | [Topic Configuration Object](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#topicConfiguration-object) | Topic configuration properties that are relevant for the API. | OPTIONAL | -\n`bindingVersion` | string | The version of this binding. If omitted, \"0.5.0\" MUST be assumed. | OPTIONAL [`0.5.0`] | -\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 kafka:\n topic: 'my-specific-topic-name'\n partitions: 20\n replicas: 3\n topicConfiguration:\n cleanup.policy:\n - delete\n - compact\n retention.ms: 604800000\n retention.bytes: 1000000000\n delete.retention.ms: 86400000\n max.message.bytes: 1048588\n bindingVersion: '0.5.0'\n```", }, ]; export default documentation; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/allowed-fields.ts new file mode 100644 index 0000000000..b9907aa4a3 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/allowed-fields.ts @@ -0,0 +1,23 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const allowedFieldsLint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [['topic', 'partitions', 'replicas', 'topicConfiguration', 'bindingVersion']], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/index.ts new file mode 100644 index 0000000000..cbef5d21b6 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/index.ts @@ -0,0 +1,15 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import topicTypeLint from './topic--type.ts'; +import partitionsMinimumLint from './partitions--minimum.ts'; +import replicasMinimumLint from './replicas--minimum.ts'; +import topicConfigurationTypeLint from './topic-configuration--type.ts'; + +const lints = [ + topicTypeLint, + partitionsMinimumLint, + replicasMinimumLint, + topicConfigurationTypeLint, + allowedFieldsLint, +]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/partitions--minimum.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/partitions--minimum.ts new file mode 100644 index 0000000000..0d20803243 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/partitions--minimum.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const partitionsMinimumLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_PARTITIONS_MINIMUM, + source: 'apilint', + message: "'partitions' value must be positive integer", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintMinimum', + linterParams: [1], + marker: 'value', + target: 'partitions', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default partitionsMinimumLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/replicas--minimum.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/replicas--minimum.ts new file mode 100644 index 0000000000..83f2a57c14 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/replicas--minimum.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const replicasMinimumLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_REPLICAS_MINIMUM, + source: 'apilint', + message: "'replicas' value must be positive integer", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintMinimum', + linterParams: [1], + marker: 'value', + target: 'replicas', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default replicasMinimumLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/topic--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/topic--type.ts new file mode 100644 index 0000000000..f58eeb800f --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/topic--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const topicTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_TOPIC_TYPE, + source: 'apilint', + message: "'topic' value must be a string", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'topic', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default topicTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/topic-configuration--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/topic-configuration--type.ts new file mode 100644 index 0000000000..b7bd180845 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-4-0/topic-configuration--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const topicConfigurationTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_TOPIC_CONFIGURATION_TYPE, + source: 'apilint', + message: "'topicConfiguration' value must be an object", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['object'], + marker: 'value', + target: 'topicConfiguration', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default topicConfigurationTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/allowed-fields.ts new file mode 100644 index 0000000000..9a5c0fe8ca --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/allowed-fields.ts @@ -0,0 +1,23 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const allowedFieldsLint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [['topic', 'partitions', 'replicas', 'topicConfiguration', 'bindingVersion']], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/index.ts new file mode 100644 index 0000000000..cbef5d21b6 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/index.ts @@ -0,0 +1,15 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import topicTypeLint from './topic--type.ts'; +import partitionsMinimumLint from './partitions--minimum.ts'; +import replicasMinimumLint from './replicas--minimum.ts'; +import topicConfigurationTypeLint from './topic-configuration--type.ts'; + +const lints = [ + topicTypeLint, + partitionsMinimumLint, + replicasMinimumLint, + topicConfigurationTypeLint, + allowedFieldsLint, +]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/partitions--minimum.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/partitions--minimum.ts new file mode 100644 index 0000000000..e7323a9a88 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/partitions--minimum.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const partitionsMinimumLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_PARTITIONS_MINIMUM, + source: 'apilint', + message: "'partitions' value must be positive integer", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintMinimum', + linterParams: [1], + marker: 'value', + target: 'partitions', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default partitionsMinimumLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/replicas--minimum.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/replicas--minimum.ts new file mode 100644 index 0000000000..765e7c64af --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/replicas--minimum.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const replicasMinimumLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_REPLICAS_MINIMUM, + source: 'apilint', + message: "'replicas' value must be positive integer", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintMinimum', + linterParams: [1], + marker: 'value', + target: 'replicas', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default replicasMinimumLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/topic--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/topic--type.ts new file mode 100644 index 0000000000..7b18ce78cf --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/topic--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const topicTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_TOPIC_TYPE, + source: 'apilint', + message: "'topic' value must be a string", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'topic', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default topicTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/topic-configuration--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/topic-configuration--type.ts new file mode 100644 index 0000000000..6f3b369fd3 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/0-5-0/topic-configuration--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const topicConfigurationTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_TOPIC_CONFIGURATION_TYPE, + source: 'apilint', + message: "'topicConfiguration' value must be an object", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['object'], + marker: 'value', + target: 'topicConfiguration', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default topicConfigurationTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/index.ts index eec31d1db9..f156c3532e 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/index.ts @@ -1,6 +1,8 @@ import channelBinding0_1_0Lints from './0-1-0/index.ts'; import channelBinding0_2_0Lints from './0-2-0/index.ts'; import channelBinding0_3_0Lints from './0-3-0/index.ts'; +import channelBinding0_4_0Lints from './0-4-0/index.ts'; +import channelBinding0_5_0Lints from './0-5-0/index.ts'; import channelBindingLatestLints from './latest/index.ts'; import bindingVersionTypeLint from './binding-version--type.ts'; @@ -8,6 +10,8 @@ const lints = [ ...channelBinding0_1_0Lints, ...channelBinding0_2_0Lints, ...channelBinding0_3_0Lints, + ...channelBinding0_4_0Lints, + ...channelBinding0_5_0Lints, ...channelBindingLatestLints, bindingVersionTypeLint, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/allowed-fields.ts index 7e7ef0abb6..38378ac185 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/allowed-fields.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/allowed-fields.ts @@ -9,7 +9,7 @@ const allowedFieldsLint: LinterMeta = { message: 'Object includes not allowed fields', severity: DiagnosticSeverity.Error, linterFunction: 'allowedFields', - linterParams: [['topic', 'partitions', 'replicas', 'bindingVersion']], + linterParams: [['topic', 'partitions', 'replicas', 'topicConfiguration', 'bindingVersion']], marker: 'key', conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/index.ts index 0c07240fa5..cbef5d21b6 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/index.ts @@ -2,7 +2,14 @@ import allowedFieldsLint from './allowed-fields.ts'; import topicTypeLint from './topic--type.ts'; import partitionsMinimumLint from './partitions--minimum.ts'; import replicasMinimumLint from './replicas--minimum.ts'; +import topicConfigurationTypeLint from './topic-configuration--type.ts'; -const lints = [topicTypeLint, partitionsMinimumLint, replicasMinimumLint, allowedFieldsLint]; +const lints = [ + topicTypeLint, + partitionsMinimumLint, + replicasMinimumLint, + topicConfigurationTypeLint, + allowedFieldsLint, +]; export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/topic-configuration--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/topic-configuration--type.ts new file mode 100644 index 0000000000..29793690e3 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/lint/latest/topic-configuration--type.ts @@ -0,0 +1,24 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const topicConfigurationTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_TOPIC_CONFIGURATION_TYPE, + source: 'apilint', + message: "'topicConfiguration' value must be an object", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['object'], + marker: 'value', + target: 'topicConfiguration', + data: {}, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], +}; + +export default topicConfigurationTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion.ts index e7c3a72907..5c73473c59 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion.ts @@ -3,6 +3,7 @@ import { CompletionFormat, CompletionType, } from '../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../target-specs.ts'; const completion: ApidomCompletionItem[] = [ { @@ -15,8 +16,23 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [AVRO Schema Object](https://avro.apache.org/docs/current/spec.html)\n\\\n\\\n The message key. **NOTE**: You can also use the [reference object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) way.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [AVRO Schema Object](https://avro.apache.org/docs/current/spec.html)\n\\\n\\\n The message key. **NOTE**: You can also use the [reference object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) way.', }, + targetSpecs: AsyncAPI2, + }, + { + label: 'key', + insertText: 'key', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [AVRO Schema Object](https://avro.apache.org/docs/current/spec.html)\n\\\n\\\n The message key. **NOTE**: You can also use the [reference object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject) way.', + }, + targetSpecs: AsyncAPI3, }, { label: 'bindingVersion', @@ -27,7 +43,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The version of this binding. If omitted, "latest" MUST be assumed.', + value: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, }, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-1-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-1-0.ts index a8efb5a903..080b6a6468 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-1-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-1-0.ts @@ -3,6 +3,7 @@ import { CompletionFormat, CompletionType, } from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; const completion: ApidomCompletionItem[] = [ { @@ -15,8 +16,30 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#schemaObject) \\| [Reference object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.1.0']], + }, + ], + }, + { + label: 'key', + insertText: 'key', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nThe message key.', + }, + targetSpecs: AsyncAPI3, conditions: [ { targets: [{ path: 'bindingVersion' }], diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-2-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-2-0.ts index 324e63457f..8b19d068cd 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-2-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-2-0.ts @@ -3,6 +3,7 @@ import { CompletionFormat, CompletionType, } from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; const completion: ApidomCompletionItem[] = [ { @@ -15,8 +16,30 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#schemaObject) \\| [Reference object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.2.0']], + }, + ], + }, + { + label: 'key', + insertText: 'key', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nThe message key.', + }, + targetSpecs: AsyncAPI3, conditions: [ { targets: [{ path: 'bindingVersion' }], diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-3-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-3-0.ts index d6b9f85b39..58304385a0 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-3-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-3-0.ts @@ -3,6 +3,7 @@ import { CompletionFormat, CompletionType, } from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; const completion: ApidomCompletionItem[] = [ { @@ -15,8 +16,30 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#schemaObject) \\| [Reference object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], + }, + { + label: 'key', + insertText: 'key', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nThe message key.', + }, + targetSpecs: AsyncAPI3, conditions: [ { targets: [{ path: 'bindingVersion' }], @@ -35,7 +58,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`).', + '`string`\n\\\n\\\nIf a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`).', }, conditions: [ { @@ -55,7 +78,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent` / `apicurio-legacy` / `apicurio-new`).', + '`string`\n\\\n\\\nNumber of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent` / `apicurio-legacy` / `apicurio-new`).', }, conditions: [ { @@ -75,7 +98,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.', + '`string`\n\\\n\\\nFreeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-4-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-4-0.ts new file mode 100644 index 0000000000..6129221e31 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-4-0.ts @@ -0,0 +1,113 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'key', + insertText: 'key', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'key', + insertText: 'key', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nThe message key.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'schemaIdLocation', + insertText: 'schemaIdLocation', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nIf a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'schemaIdPayloadEncoding', + insertText: 'schemaIdPayloadEncoding', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nNumber of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent` / `apicurio-legacy` / `apicurio-new`).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'schemaLookupStrategy', + insertText: 'schemaLookupStrategy', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nFreeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-5-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-5-0.ts new file mode 100644 index 0000000000..d07979e82d --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/0-5-0.ts @@ -0,0 +1,113 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'key', + insertText: 'key', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'key', + insertText: 'key', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nThe message key.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'schemaIdLocation', + insertText: 'schemaIdLocation', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nIf a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'schemaIdPayloadEncoding', + insertText: 'schemaIdPayloadEncoding', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nNumber of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent` / `apicurio-legacy` / `apicurio-new`).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'schemaLookupStrategy', + insertText: 'schemaLookupStrategy', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nFreeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/index.ts index 280702b0d7..a913189be7 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/index.ts @@ -1,6 +1,8 @@ import completion0_1_0Items from './0-1-0.ts'; import completion0_2_0Items from './0-2-0.ts'; import completion0_3_0Items from './0-3-0.ts'; +import completion0_4_0Items from './0-4-0.ts'; +import completion0_5_0Items from './0-5-0.ts'; import completionLatestItems from './latest.ts'; import { ApidomCompletionItem, @@ -12,6 +14,8 @@ const completion: ApidomCompletionItem[] = [ ...completion0_1_0Items, ...completion0_2_0Items, ...completion0_3_0Items, + ...completion0_4_0Items, + ...completion0_5_0Items, ...completionLatestItems, { label: 'bindingVersion', @@ -22,7 +26,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The version of this binding. If omitted, "0.3.0" MUST be assumed.', + value: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, }, { @@ -52,6 +56,24 @@ const completion: ApidomCompletionItem[] = [ type: CompletionType.VALUE, insertTextFormat: 2, }, + { + target: 'bindingVersion', + label: '0.4.0', + insertText: '0.4.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + type: CompletionType.VALUE, + insertTextFormat: 2, + }, + { + target: 'bindingVersion', + label: '0.5.0', + insertText: '0.5.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + type: CompletionType.VALUE, + insertTextFormat: 2, + }, ]; export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/latest.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/latest.ts index 36b45a8e8a..3fd14622e2 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/latest.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/completion/latest.ts @@ -3,6 +3,7 @@ import { CompletionFormat, CompletionType, } from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; const completion: ApidomCompletionItem[] = [ { @@ -15,8 +16,29 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#schemaObject) \\| [Reference object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, + { + label: 'key', + insertText: 'key', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nThe message key.', + }, + targetSpecs: AsyncAPI3, conditions: [ { function: 'missingField', @@ -34,7 +56,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`).', + '`string`\n\\\n\\\nIf a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`).', }, conditions: [ { @@ -53,7 +75,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent` / `apicurio-legacy` / `apicurio-new`).', + '`string`\n\\\n\\\nNumber of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent` / `apicurio-legacy` / `apicurio-new`).', }, conditions: [ { @@ -72,7 +94,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.', + '`string`\n\\\n\\\nFreeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts index cfe846568f..1cfdc54ddc 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts @@ -1,26 +1,39 @@ +import { AsyncAPI2, AsyncAPI3 } from '../../../target-specs.ts'; + const documentation = [ { target: 'key', - docs: '[Schema Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#schemaObject) \\| [Reference object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', + docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nThe message key.', + targetSpecs: AsyncAPI2, + }, + { + target: 'key', + docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nThe message key.', + targetSpecs: AsyncAPI3, }, { target: 'schemaIdLocation', - docs: 'If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`).', + docs: '`string`\n\\\n\\\nIf a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`).', }, { target: 'schemaIdPayloadEncoding', - docs: 'Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent` / `apicurio-legacy` / `apicurio-new`).', + docs: '`string`\n\\\n\\\nNumber of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent` / `apicurio-legacy` / `apicurio-new`).', }, { target: 'schemaLookupStrategy', - docs: 'Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.', + docs: '`string`\n\\\n\\\nFreeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.', }, { target: 'bindingVersion', - docs: 'The version of this binding. If omitted, "0.3.0" MUST be assumed.', + docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', + }, + { + docs: "#### [Message Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/#message)\n\nThis object contains information about the message representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`key` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) | The message key.\n`schemaIdLocation` | string | If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaIdPayloadEncoding` | string | Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent`/ `apicurio-legacy` / `apicurio-new`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaLookupStrategy` | string | Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied. | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\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\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: '4'\n bindingVersion: '0.3.0'\n```\n\nThis is another example that describes the use if Apicurio schema registry. We describe the `apicurio-new` way of serializing without details on how it's implemented. We reference a [specific lookup strategy](https://www.apicur.io/registry/docs/apicurio-registry/2.2.x/getting-started/assembly-using-kafka-client-serdes.html#registry-serdes-concepts-strategy_registry) that may be used to retrieve schema Id from registry during serialization.\n\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: 'apicurio-new'\n schemaLookupStrategy: 'TopicIdStrategy'\n bindingVersion: '0.3.0'\n```", + targetSpecs: AsyncAPI2, }, { - docs: "#### [Message Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/#message)\n\nThis object contains information about the message representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`key` | [Schema Object](https://github.com/asyncapi/spec/blob/master/spec/asyncapi.md#schemaObject) \\| [Reference object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) | The message key.\n`schemaIdLocation` | string | If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaIdPayloadEncoding` | string | Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent`/ `apicurio-legacy` / `apicurio-new`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaLookupStrategy` | string | Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied. | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`bindingVersion` | string | The version of this binding. If omitted, \"0.3.0\" MUST be assumed.\n\nThis object MUST contain only the properties defined above.\n\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: '4'\n bindingVersion: '0.3.0'\n```\n\nThis is another example that describes the use if Apicurio schema registry. We describe the `apicurio-new` way of serializing without details on how it's implemented. We reference a [specific lookup strategy](https://www.apicur.io/registry/docs/apicurio-registry/2.2.x/getting-started/assembly-using-kafka-client-serdes.html#registry-serdes-concepts-strategy_registry) that may be used to retrieve schema Id from registry during serialization.\n\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: 'apicurio-new'\n schemaLookupStrategy: 'TopicIdStrategy'\n bindingVersion: '0.3.0'\n```", + docs: "#### [Message Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/#message)\n\nThis object contains information about the message representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`key` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject) | The message key.\n`schemaIdLocation` | string | If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaIdPayloadEncoding` | string | Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent`/ `apicurio-legacy` / `apicurio-new`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaLookupStrategy` | string | Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied. | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\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\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: '4'\n bindingVersion: '0.3.0'\n```\n\nThis is another example that describes the use if Apicurio schema registry. We describe the `apicurio-new` way of serializing without details on how it's implemented. We reference a [specific lookup strategy](https://www.apicur.io/registry/docs/apicurio-registry/2.2.x/getting-started/assembly-using-kafka-client-serdes.html#registry-serdes-concepts-strategy_registry) that may be used to retrieve schema Id from registry during serialization.\n\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: 'apicurio-new'\n schemaLookupStrategy: 'TopicIdStrategy'\n bindingVersion: '0.3.0'\n```", + targetSpecs: AsyncAPI3, }, ]; export default documentation; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/allowed-fields.ts new file mode 100644 index 0000000000..a467ee2753 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/allowed-fields.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const allowedFieldsLint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [ + ['key', 'schemaIdLocation', 'schemaIdPayloadEncoding', 'schemaLookupStrategy', 'bindingVersion'], + ], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/index.ts new file mode 100644 index 0000000000..501671a3bd --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/index.ts @@ -0,0 +1,15 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import keyTypeLint from './key--type.ts'; +import schemaIdLocationTypeLint from './schema-id-location--type.ts'; +import schemaIdPayloadEncodingTypeLint from './schema-id-payload-encoding--type.ts'; +import schemaLookupStrategyTypeLint from './schema-lookup-strategy--type.ts'; + +const lints = [ + allowedFieldsLint, + keyTypeLint, + schemaIdLocationTypeLint, + schemaIdPayloadEncodingTypeLint, + schemaLookupStrategyTypeLint, +]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/key--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/key--type.ts new file mode 100644 index 0000000000..8fbdad3678 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/key--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const keyTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_MESSAGE_BINDING_FIELD_KEY_TYPE, + source: 'apilint', + message: 'key must be a schema object, a boolean JSON schema, or an AVRO Schema', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'boolean']], + marker: 'value', + target: 'key', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default keyTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-id-location--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-id-location--type.ts new file mode 100644 index 0000000000..84f825c8bf --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-id-location--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaIdLocationTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_MESSAGE_BINDING_FIELD_SCHEMA_ID_LOCATION_TYPE, + source: 'apilint', + message: 'schemaIdLocation value must be a string', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'schemaIdLocation', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default schemaIdLocationTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-id-payload-encoding--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-id-payload-encoding--type.ts new file mode 100644 index 0000000000..93b935605a --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-id-payload-encoding--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaIdPayloadEncodingTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_MESSAGE_BINDING_FIELD_SCHEMA_ID_PAYLOAD_ENCODING_TYPE, + source: 'apilint', + message: 'schemaIdPayloadEncoding value must be a string', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'schemaIdPayloadEncoding', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default schemaIdPayloadEncodingTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-lookup-strategy--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-lookup-strategy--type.ts new file mode 100644 index 0000000000..f8cac68b66 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/schema-lookup-strategy--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaLookupStrategyTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_MESSAGE_BINDING_FIELD_SCHEMA_LOOKUP_STRATEGY_TYPE, + source: 'apilint', + message: 'schemaLookupStrategy value must be a string', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'schemaLookupStrategy', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default schemaLookupStrategyTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/allowed-fields.ts new file mode 100644 index 0000000000..5c280c4fa8 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/allowed-fields.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const allowedFieldsLint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [ + ['key', 'schemaIdLocation', 'schemaIdPayloadEncoding', 'schemaLookupStrategy', 'bindingVersion'], + ], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/index.ts new file mode 100644 index 0000000000..501671a3bd --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/index.ts @@ -0,0 +1,15 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import keyTypeLint from './key--type.ts'; +import schemaIdLocationTypeLint from './schema-id-location--type.ts'; +import schemaIdPayloadEncodingTypeLint from './schema-id-payload-encoding--type.ts'; +import schemaLookupStrategyTypeLint from './schema-lookup-strategy--type.ts'; + +const lints = [ + allowedFieldsLint, + keyTypeLint, + schemaIdLocationTypeLint, + schemaIdPayloadEncodingTypeLint, + schemaLookupStrategyTypeLint, +]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/key--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/key--type.ts new file mode 100644 index 0000000000..c42d6ec9a7 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/key--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const keyTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_MESSAGE_BINDING_FIELD_KEY_TYPE, + source: 'apilint', + message: 'key must be a schema object, a boolean JSON schema, or an AVRO Schema', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'boolean']], + marker: 'value', + target: 'key', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default keyTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-id-location--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-id-location--type.ts new file mode 100644 index 0000000000..bbe04993ae --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-id-location--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaIdLocationTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_MESSAGE_BINDING_FIELD_SCHEMA_ID_LOCATION_TYPE, + source: 'apilint', + message: 'schemaIdLocation value must be a string', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'schemaIdLocation', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default schemaIdLocationTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-id-payload-encoding--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-id-payload-encoding--type.ts new file mode 100644 index 0000000000..58d7f346c9 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-id-payload-encoding--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaIdPayloadEncodingTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_MESSAGE_BINDING_FIELD_SCHEMA_ID_PAYLOAD_ENCODING_TYPE, + source: 'apilint', + message: 'schemaIdPayloadEncoding value must be a string', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'schemaIdPayloadEncoding', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default schemaIdPayloadEncodingTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-lookup-strategy--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-lookup-strategy--type.ts new file mode 100644 index 0000000000..633b263f66 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/schema-lookup-strategy--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaLookupStrategyTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_MESSAGE_BINDING_FIELD_SCHEMA_LOOKUP_STRATEGY_TYPE, + source: 'apilint', + message: 'schemaLookupStrategy value must be a string', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'schemaLookupStrategy', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default schemaLookupStrategyTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/index.ts index 1381961c4d..61976832d3 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/index.ts @@ -1,6 +1,8 @@ import messageBinding0_1_0Lints from './0-1-0/index.ts'; import messageBinding0_2_0Lints from './0-2-0/index.ts'; import messageBinding0_3_0Lints from './0-3-0/index.ts'; +import messageBinding0_4_0Lints from './0-4-0/index.ts'; +import messageBinding0_5_0Lints from './0-5-0/index.ts'; import messageBindingLatestLints from './latest/index.ts'; import bindingVersionTypeLint from './binding-version--type.ts'; @@ -8,6 +10,8 @@ const lints = [ ...messageBinding0_1_0Lints, ...messageBinding0_2_0Lints, ...messageBinding0_3_0Lints, + ...messageBinding0_4_0Lints, + ...messageBinding0_5_0Lints, ...messageBindingLatestLints, bindingVersionTypeLint, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/latest/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/latest/allowed-fields.ts index 7a91c47a71..6597e1ab6d 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/latest/allowed-fields.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/latest/allowed-fields.ts @@ -9,7 +9,9 @@ const allowedFieldsLint: LinterMeta = { message: 'Object includes not allowed fields', severity: DiagnosticSeverity.Error, linterFunction: 'allowedFields', - linterParams: [['key', 'bindingVersion']], + linterParams: [ + ['key', 'schemaIdLocation', 'schemaIdPayloadEncoding', 'schemaLookupStrategy', 'bindingVersion'], + ], marker: 'key', conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-1-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-1-0.ts index 91919e76dc..9dc8db5a9b 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-1-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-1-0.ts @@ -3,6 +3,7 @@ import { CompletionFormat, CompletionType, } from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; const completion: ApidomCompletionItem[] = [ { @@ -17,6 +18,28 @@ const completion: ApidomCompletionItem[] = [ value: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.1.0']], + }, + ], + }, + { + label: 'groupId', + insertText: 'groupId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + }, + targetSpecs: AsyncAPI3, conditions: [ { targets: [{ path: 'bindingVersion' }], @@ -37,6 +60,28 @@ const completion: ApidomCompletionItem[] = [ value: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.1.0']], + }, + ], + }, + { + label: 'clientId', + insertText: 'clientId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + }, + targetSpecs: AsyncAPI3, conditions: [ { targets: [{ path: 'bindingVersion' }], diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-2-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-2-0.ts index 8a3b2fc3fe..aa22b3c480 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-2-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-2-0.ts @@ -3,6 +3,7 @@ import { CompletionFormat, CompletionType, } from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; const completion: ApidomCompletionItem[] = [ { @@ -17,6 +18,28 @@ const completion: ApidomCompletionItem[] = [ value: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.2.0']], + }, + ], + }, + { + label: 'groupId', + insertText: 'groupId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + }, + targetSpecs: AsyncAPI3, conditions: [ { targets: [{ path: 'bindingVersion' }], @@ -37,6 +60,28 @@ const completion: ApidomCompletionItem[] = [ value: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.2.0']], + }, + ], + }, + { + label: 'clientId', + insertText: 'clientId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + }, + targetSpecs: AsyncAPI3, conditions: [ { targets: [{ path: 'bindingVersion' }], diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-3-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-3-0.ts index ad28c15aee..d89fa3ca17 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-3-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-3-0.ts @@ -3,6 +3,7 @@ import { CompletionFormat, CompletionType, } from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; const completion: ApidomCompletionItem[] = [ { @@ -17,6 +18,28 @@ const completion: ApidomCompletionItem[] = [ value: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], + }, + { + label: 'groupId', + insertText: 'groupId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + }, + targetSpecs: AsyncAPI3, conditions: [ { targets: [{ path: 'bindingVersion' }], @@ -37,6 +60,28 @@ const completion: ApidomCompletionItem[] = [ value: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], + }, + { + label: 'clientId', + insertText: 'clientId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + }, + targetSpecs: AsyncAPI3, conditions: [ { targets: [{ path: 'bindingVersion' }], diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-4-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-4-0.ts new file mode 100644 index 0000000000..4eb78707f1 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-4-0.ts @@ -0,0 +1,95 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'groupId', + insertText: 'groupId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'groupId', + insertText: 'groupId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'clientId', + insertText: 'clientId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'clientId', + insertText: 'clientId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-5-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-5-0.ts new file mode 100644 index 0000000000..1d36aa867c --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-5-0.ts @@ -0,0 +1,95 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'groupId', + insertText: 'groupId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'groupId', + insertText: 'groupId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'clientId', + insertText: 'clientId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'clientId', + insertText: 'clientId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/index.ts index 280702b0d7..a913189be7 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/index.ts @@ -1,6 +1,8 @@ import completion0_1_0Items from './0-1-0.ts'; import completion0_2_0Items from './0-2-0.ts'; import completion0_3_0Items from './0-3-0.ts'; +import completion0_4_0Items from './0-4-0.ts'; +import completion0_5_0Items from './0-5-0.ts'; import completionLatestItems from './latest.ts'; import { ApidomCompletionItem, @@ -12,6 +14,8 @@ const completion: ApidomCompletionItem[] = [ ...completion0_1_0Items, ...completion0_2_0Items, ...completion0_3_0Items, + ...completion0_4_0Items, + ...completion0_5_0Items, ...completionLatestItems, { label: 'bindingVersion', @@ -22,7 +26,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The version of this binding. If omitted, "0.3.0" MUST be assumed.', + value: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, }, { @@ -52,6 +56,24 @@ const completion: ApidomCompletionItem[] = [ type: CompletionType.VALUE, insertTextFormat: 2, }, + { + target: 'bindingVersion', + label: '0.4.0', + insertText: '0.4.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + type: CompletionType.VALUE, + insertTextFormat: 2, + }, + { + target: 'bindingVersion', + label: '0.5.0', + insertText: '0.5.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + type: CompletionType.VALUE, + insertTextFormat: 2, + }, ]; export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/latest.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/latest.ts index 09adcae943..4fb833ac39 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/latest.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/latest.ts @@ -3,6 +3,7 @@ import { CompletionFormat, CompletionType, } from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; const completion: ApidomCompletionItem[] = [ { @@ -17,6 +18,27 @@ const completion: ApidomCompletionItem[] = [ value: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, + { + label: 'groupId', + insertText: 'groupId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + }, + targetSpecs: AsyncAPI3, conditions: [ { function: 'missingField', @@ -36,6 +58,27 @@ const completion: ApidomCompletionItem[] = [ value: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, + targetSpecs: AsyncAPI2, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, + { + label: 'clientId', + insertText: 'clientId', + kind: 14, + format: CompletionFormat.OBJECT, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + }, + targetSpecs: AsyncAPI3, conditions: [ { function: 'missingField', diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/documentation.ts index 170f8920ee..15870b748e 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/documentation.ts @@ -1,18 +1,37 @@ +import { AsyncAPI2, AsyncAPI3 } from '../../../target-specs.ts'; + const documentation = [ { target: 'groupId', docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', + targetSpecs: AsyncAPI2, + }, + { + target: 'groupId', + docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + targetSpecs: AsyncAPI3, }, { target: 'clientId', docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + targetSpecs: AsyncAPI2, + }, + { + target: 'clientId', + docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + targetSpecs: AsyncAPI3, }, { target: 'bindingVersion', - docs: 'The version of this binding. If omitted, "0.3.0" MUST be assumed.', + docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', + }, + { + docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/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/reference/specification/v2.6.0#schemaObject) | Id of the consumer group.\n`clientId` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.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```", + targetSpecs: AsyncAPI2, }, { - docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/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/reference/specification/v2.6.0#schemaObject) | Id of the consumer group.\n`clientId` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) | Id of the consumer inside a consumer group.\n`bindingVersion` | string | The version of this binding. If omitted, \"0.3.0\" 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```", + docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/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/reference/specification/v3.0.0#schemaObject) | Id of the consumer group.\n`clientId` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.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```", + targetSpecs: AsyncAPI3, }, ]; export default documentation; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/allowed-fields.ts new file mode 100644 index 0000000000..4eeb7ca315 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/allowed-fields.ts @@ -0,0 +1,23 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const allowedFieldsLint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [['groupId', 'clientId', 'bindingVersion']], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/client-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/client-id--type.ts new file mode 100644 index 0000000000..caafc48ecf --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/client-id--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const clientIdTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_OPERATION_BINDING_FIELD_CLIENT_ID_TYPE, + source: 'apilint', + message: 'clientId must be a schema object or a boolean JSON schema', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'boolean']], + marker: 'value', + target: 'clientId', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default clientIdTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/group-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/group-id--type.ts new file mode 100644 index 0000000000..f481d3b799 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/group-id--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const groupIdTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_OPERATION_BINDING_FIELD_GROUP_ID_TYPE, + source: 'apilint', + message: 'groupId must be a schema object or a boolean JSON schema', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'boolean']], + marker: 'value', + target: 'groupdId', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default groupIdTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/index.ts new file mode 100644 index 0000000000..756cc3fac3 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/index.ts @@ -0,0 +1,7 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import groupIdTypeLint from './group-id--type.ts'; +import clientIdTypeLint from './client-id--type.ts'; + +const lints = [allowedFieldsLint, groupIdTypeLint, clientIdTypeLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/allowed-fields.ts new file mode 100644 index 0000000000..719d8a5ea2 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/allowed-fields.ts @@ -0,0 +1,23 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const allowedFieldsLint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [['groupId', 'clientId', 'bindingVersion']], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/client-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/client-id--type.ts new file mode 100644 index 0000000000..fd8a531ac0 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/client-id--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const clientIdTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_OPERATION_BINDING_FIELD_CLIENT_ID_TYPE, + source: 'apilint', + message: 'clientId must be a schema object or a boolean JSON schema', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'boolean']], + marker: 'value', + target: 'clientId', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default clientIdTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/group-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/group-id--type.ts new file mode 100644 index 0000000000..243262ba65 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/group-id--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const groupIdTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_OPERATION_BINDING_FIELD_GROUP_ID_TYPE, + source: 'apilint', + message: 'groupId must be a schema object or a boolean JSON schema', + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'boolean']], + marker: 'value', + target: 'groupdId', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default groupIdTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/index.ts new file mode 100644 index 0000000000..756cc3fac3 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/index.ts @@ -0,0 +1,7 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import groupIdTypeLint from './group-id--type.ts'; +import clientIdTypeLint from './client-id--type.ts'; + +const lints = [allowedFieldsLint, groupIdTypeLint, clientIdTypeLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/index.ts index 10556032ee..14685be960 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/index.ts @@ -1,6 +1,8 @@ import operationBinding0_1_0Lints from './0-1-0/index.ts'; import operationBinding0_2_0Lints from './0-2-0/index.ts'; import operationBinding0_3_0Lints from './0-3-0/index.ts'; +import operationBinding0_4_0Lints from './0-4-0/index.ts'; +import operationBinding0_5_0Lints from './0-5-0/index.ts'; import operationBindingLatestLints from './latest/index.ts'; import bindingVersionTypeLint from './binding-version--type.ts'; @@ -8,6 +10,8 @@ const lints = [ ...operationBinding0_1_0Lints, ...operationBinding0_2_0Lints, ...operationBinding0_3_0Lints, + ...operationBinding0_4_0Lints, + ...operationBinding0_5_0Lints, ...operationBindingLatestLints, bindingVersionTypeLint, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-3-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-3-0.ts index 8aa31b09ce..448cfce59a 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-3-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-3-0.ts @@ -15,7 +15,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'API URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used).', + '`string (url)`\n\\\n\\\nAPI URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used).', }, conditions: [ { @@ -35,7 +35,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'The vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`). MUST NOT be specified if `schemaRegistryUrl` is not specified.', + '`string`\n\\\n\\\nThe vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`). MUST NOT be specified if `schemaRegistryUrl` is not specified.', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-4-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-4-0.ts new file mode 100644 index 0000000000..b3acc4332a --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-4-0.ts @@ -0,0 +1,114 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'schemaRegistryUrl', + insertText: 'schemaRegistryUrl', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string (url)`\n\\\n\\\nAPI URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'schemaRegistryVendor', + insertText: 'schemaRegistryVendor', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nThe vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`). MUST NOT be specified if `schemaRegistryUrl` is not specified.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + target: 'schemaRegistryVendor', + label: 'apicurio', + insertText: 'apicurio', + kind: 12, + format: CompletionFormat.QUOTED, + type: CompletionType.VALUE, + insertTextFormat: 2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + target: 'schemaRegistryVendor', + label: 'confluent', + insertText: 'confluent', + kind: 12, + format: CompletionFormat.QUOTED, + type: CompletionType.VALUE, + insertTextFormat: 2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + target: 'schemaRegistryVendor', + label: 'ibm', + insertText: 'ibm', + kind: 12, + format: CompletionFormat.QUOTED, + type: CompletionType.VALUE, + insertTextFormat: 2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + target: 'schemaRegistryVendor', + label: 'karapace', + insertText: 'karapace', + kind: 12, + format: CompletionFormat.QUOTED, + type: CompletionType.VALUE, + insertTextFormat: 2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-5-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-5-0.ts new file mode 100644 index 0000000000..40d6618e5f --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/0-5-0.ts @@ -0,0 +1,114 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'schemaRegistryUrl', + insertText: 'schemaRegistryUrl', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string (url)`\n\\\n\\\nAPI URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + label: 'schemaRegistryVendor', + insertText: 'schemaRegistryVendor', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nThe vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`). MUST NOT be specified if `schemaRegistryUrl` is not specified.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + target: 'schemaRegistryVendor', + label: 'apicurio', + insertText: 'apicurio', + kind: 12, + format: CompletionFormat.QUOTED, + type: CompletionType.VALUE, + insertTextFormat: 2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + target: 'schemaRegistryVendor', + label: 'confluent', + insertText: 'confluent', + kind: 12, + format: CompletionFormat.QUOTED, + type: CompletionType.VALUE, + insertTextFormat: 2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + target: 'schemaRegistryVendor', + label: 'ibm', + insertText: 'ibm', + kind: 12, + format: CompletionFormat.QUOTED, + type: CompletionType.VALUE, + insertTextFormat: 2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, + { + target: 'schemaRegistryVendor', + label: 'karapace', + insertText: 'karapace', + kind: 12, + format: CompletionFormat.QUOTED, + type: CompletionType.VALUE, + insertTextFormat: 2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/index.ts index 699e2e53c3..a913189be7 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/index.ts @@ -1,6 +1,8 @@ import completion0_1_0Items from './0-1-0.ts'; import completion0_2_0Items from './0-2-0.ts'; import completion0_3_0Items from './0-3-0.ts'; +import completion0_4_0Items from './0-4-0.ts'; +import completion0_5_0Items from './0-5-0.ts'; import completionLatestItems from './latest.ts'; import { ApidomCompletionItem, @@ -12,6 +14,8 @@ const completion: ApidomCompletionItem[] = [ ...completion0_1_0Items, ...completion0_2_0Items, ...completion0_3_0Items, + ...completion0_4_0Items, + ...completion0_5_0Items, ...completionLatestItems, { label: 'bindingVersion', @@ -22,7 +26,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The version of this binding.', + value: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, }, { @@ -52,6 +56,24 @@ const completion: ApidomCompletionItem[] = [ type: CompletionType.VALUE, insertTextFormat: 2, }, + { + target: 'bindingVersion', + label: '0.4.0', + insertText: '0.4.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + type: CompletionType.VALUE, + insertTextFormat: 2, + }, + { + target: 'bindingVersion', + label: '0.5.0', + insertText: '0.5.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + type: CompletionType.VALUE, + insertTextFormat: 2, + }, ]; export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/latest.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/latest.ts index 58d61be4b8..7fe9944000 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/latest.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/completion/latest.ts @@ -15,7 +15,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'API URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used).', + '`string (url)`\n\\\n\\\nAPI URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used).', }, conditions: [ { @@ -34,7 +34,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'The vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`). MUST NOT be specified if `schemaRegistryUrl` is not specified.', + '`string`\n\\\n\\\nThe vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`). MUST NOT be specified if `schemaRegistryUrl` is not specified.', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/documentation.ts index bea4cf57f1..e8a7d5804d 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/documentation.ts @@ -1,18 +1,18 @@ const documentation = [ { target: 'schemaRegistryUrl', - docs: 'API URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used).', + docs: '`string (url)`\n\\\n\\\nAPI URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used).', }, { target: 'schemaRegistryVendor', - docs: 'The vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`). MUST NOT be specified if `schemaRegistryUrl` is not specified.', + docs: '`string`\n\\\n\\\nThe vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`). MUST NOT be specified if `schemaRegistryUrl` is not specified.', }, { target: 'bindingVersion', - docs: 'The version of this binding.', + docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, { - docs: "#### [Server Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka#server)\n\nThis object contains information about the server representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description | Applicability [default] | Constraints\n---|:---:|:---:|:---:|---\n`schemaRegistryUrl` | string (url) | API URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used) | OPTIONAL | -\n`schemaRegistryVendor` | string | The vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`) | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified\n`bindingVersion` | string | The version of this binding. | OPTIONAL [`0.3.0`]\n\n##### Example\n\n\n\\\nYAML\n```yaml\nservers:\n production:\n bindings:\n kafka:\n schemaRegistryUrl: 'https://my-schema-registry.com'\n schemaRegistryVendor: 'confluent'\n bindingVersion: '0.3.0'\n```", + docs: "#### [Server Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka#server)\n\nThis object contains information about the server representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description | Applicability [default] | Constraints\n---|:---:|:---:|:---:|---\n`schemaRegistryUrl` | string (url) | API URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used) | OPTIONAL | -\n`schemaRegistryVendor` | string | The vendor of Schema Registry and Kafka serdes library that should be used (e.g. `apicurio`, `confluent`, `ibm`, or `karapace`) | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified\n`bindingVersion` | string | The version of this binding. | OPTIONAL [`0.5.0`]\n\n##### Example\n\n\n\\\nYAML\n```yaml\nservers:\n production:\n bindings:\n kafka:\n schemaRegistryUrl: 'https://my-schema-registry.com'\n schemaRegistryVendor: 'confluent'\n bindingVersion: '0.5.0'\n```", }, ]; export default documentation; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/index.ts index b7a412cc89..ef18a6da1f 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/index.ts @@ -1,12 +1,12 @@ import allowedFieldsLint from './allowed-fields.ts'; import schemaRegistryUrlFormatURILint from './schema-registry-url--format-uri.ts'; import schemaRegistryVendorTypeLint from './schema-registry-vendor--type.ts'; -import schemaRegistryVendorRequiredLint from './schema-registry-vendor--required.ts'; +import schemaRegistryVendorExcludedLint from './schema-registry-vendor--excluded.ts'; const lints = [ schemaRegistryUrlFormatURILint, schemaRegistryVendorTypeLint, - schemaRegistryVendorRequiredLint, + schemaRegistryVendorExcludedLint, allowedFieldsLint, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/schema-registry-vendor--required.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/schema-registry-vendor--excluded.ts similarity index 50% rename from packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/schema-registry-vendor--required.ts rename to packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/schema-registry-vendor--excluded.ts index 9f4909c326..7121e5ce71 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/schema-registry-vendor--required.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-3-0/schema-registry-vendor--excluded.ts @@ -3,24 +3,15 @@ import { DiagnosticSeverity } from 'vscode-languageserver-types'; import ApilintCodes from '../../../../../../codes.ts'; import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; -const schemaRegistryVendorRequiredLint: LinterMeta = { - code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_REQUIRED, +const schemaRegistryVendorExcludedLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_EXCLUDED, source: 'apilint', - message: "should always have a 'asyncapi' value", + message: "'schemaRegistryVendor' MUST NOT be specified if 'schemaRegistryUrl' is not specified.", severity: DiagnosticSeverity.Error, - linterFunction: 'hasRequiredField', + linterFunction: 'missingField', linterParams: ['schemaRegistryVendor'], marker: 'key', - data: { - quickFix: [ - { - message: "add 'schemaRegistryVendor' section", - action: 'addChild', - snippetYaml: "schemaRegistryVendor: ''\n", - snippetJson: '"schemaRegistryVendor": "",\n', - }, - ], - }, + data: {}, conditions: [ { targets: [{ path: 'bindingVersion' }], @@ -28,10 +19,10 @@ const schemaRegistryVendorRequiredLint: LinterMeta = { params: [['0.3.0']], }, { - function: 'existFields', - params: [['schemaRegistryUrl']], + function: 'missingField', + params: ['schemaRegistryUrl'], }, ], }; -export default schemaRegistryVendorRequiredLint; +export default schemaRegistryVendorExcludedLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/allowed-fields.ts new file mode 100644 index 0000000000..8f4cae1ecd --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/allowed-fields.ts @@ -0,0 +1,23 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const allowedFieldsLint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields.', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [['schemaRegistryUrl', 'schemaRegistryVendor', 'bindingVersion']], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/index.ts new file mode 100644 index 0000000000..ef18a6da1f --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/index.ts @@ -0,0 +1,13 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import schemaRegistryUrlFormatURILint from './schema-registry-url--format-uri.ts'; +import schemaRegistryVendorTypeLint from './schema-registry-vendor--type.ts'; +import schemaRegistryVendorExcludedLint from './schema-registry-vendor--excluded.ts'; + +const lints = [ + schemaRegistryUrlFormatURILint, + schemaRegistryVendorTypeLint, + schemaRegistryVendorExcludedLint, + allowedFieldsLint, +]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-url--format-uri.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-url--format-uri.ts new file mode 100644 index 0000000000..13459b55b7 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-url--format-uri.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaRegistryUrlFormatURILint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_URL_FORMAT_URI, + source: 'apilint', + message: "'schemaRegistryUrl' MUST be in the format of a URL.", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintValidURI', + linterParams: [true], + marker: 'value', + target: 'schemaRegistryUrl', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default schemaRegistryUrlFormatURILint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-vendor--excluded.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-vendor--excluded.ts new file mode 100644 index 0000000000..9b24d5954a --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-vendor--excluded.ts @@ -0,0 +1,28 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaRegistryVendorExcludedLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_EXCLUDED, + source: 'apilint', + message: "'schemaRegistryVendor' MUST NOT be specified if 'schemaRegistryUrl' is not specified.", + severity: DiagnosticSeverity.Error, + linterFunction: 'missingField', + linterParams: ['schemaRegistryVendor'], + marker: 'key', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + { + function: 'missingField', + params: ['schemaRegistryUrl'], + }, + ], +}; + +export default schemaRegistryVendorExcludedLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-vendor--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-vendor--type.ts new file mode 100644 index 0000000000..ace294a304 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-4-0/schema-registry-vendor--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaRegistryVendorTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_TYPE, + source: 'apilint', + message: "'schemaRegistryVendor' value must be a string", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'schemaRegistryVendor', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default schemaRegistryVendorTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/allowed-fields.ts new file mode 100644 index 0000000000..03e360e4f8 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/allowed-fields.ts @@ -0,0 +1,23 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const allowedFieldsLint: LinterMeta = { + code: ApilintCodes.NOT_ALLOWED_FIELDS, + source: 'apilint', + message: 'Object includes not allowed fields.', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [['schemaRegistryUrl', 'schemaRegistryVendor', 'bindingVersion']], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/index.ts new file mode 100644 index 0000000000..ef18a6da1f --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/index.ts @@ -0,0 +1,13 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import schemaRegistryUrlFormatURILint from './schema-registry-url--format-uri.ts'; +import schemaRegistryVendorTypeLint from './schema-registry-vendor--type.ts'; +import schemaRegistryVendorExcludedLint from './schema-registry-vendor--excluded.ts'; + +const lints = [ + schemaRegistryUrlFormatURILint, + schemaRegistryVendorTypeLint, + schemaRegistryVendorExcludedLint, + allowedFieldsLint, +]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-url--format-uri.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-url--format-uri.ts new file mode 100644 index 0000000000..90f234553f --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-url--format-uri.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaRegistryUrlFormatURILint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_URL_FORMAT_URI, + source: 'apilint', + message: "'schemaRegistryUrl' MUST be in the format of a URL.", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintValidURI', + linterParams: [true], + marker: 'value', + target: 'schemaRegistryUrl', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default schemaRegistryUrlFormatURILint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-vendor--excluded.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-vendor--excluded.ts new file mode 100644 index 0000000000..17497dfabc --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-vendor--excluded.ts @@ -0,0 +1,28 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaRegistryVendorExcludedLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_EXCLUDED, + source: 'apilint', + message: "'schemaRegistryVendor' MUST NOT be specified if 'schemaRegistryUrl' is not specified.", + severity: DiagnosticSeverity.Error, + linterFunction: 'missingField', + linterParams: ['schemaRegistryVendor'], + marker: 'key', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + { + function: 'missingField', + params: ['schemaRegistryUrl'], + }, + ], +}; + +export default schemaRegistryVendorExcludedLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-vendor--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-vendor--type.ts new file mode 100644 index 0000000000..af9bbffe41 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/0-5-0/schema-registry-vendor--type.ts @@ -0,0 +1,25 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaRegistryVendorTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_TYPE, + source: 'apilint', + message: "'schemaRegistryVendor' value must be a string", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'schemaRegistryVendor', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.5.0']], + }, + ], +}; + +export default schemaRegistryVendorTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/index.ts index 4aeaf68136..f3ad1a31b0 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/index.ts @@ -1,6 +1,8 @@ import serverBinding0_1_0Lints from './0-1-0/index.ts'; import serverBinding0_2_0Lints from './0-2-0/index.ts'; import serverBinding0_3_0Lints from './0-3-0/index.ts'; +import serverBinding0_4_0Lints from './0-4-0/index.ts'; +import serverBinding0_5_0Lints from './0-5-0/index.ts'; import serverBindingLatestLints from './latest/index.ts'; import bindingVersionTypeLint from './binding-version--type.ts'; @@ -8,6 +10,8 @@ const lints = [ ...serverBinding0_1_0Lints, ...serverBinding0_2_0Lints, ...serverBinding0_3_0Lints, + ...serverBinding0_4_0Lints, + ...serverBinding0_5_0Lints, ...serverBindingLatestLints, bindingVersionTypeLint, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/index.ts index b7a412cc89..ef18a6da1f 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/index.ts @@ -1,12 +1,12 @@ import allowedFieldsLint from './allowed-fields.ts'; import schemaRegistryUrlFormatURILint from './schema-registry-url--format-uri.ts'; import schemaRegistryVendorTypeLint from './schema-registry-vendor--type.ts'; -import schemaRegistryVendorRequiredLint from './schema-registry-vendor--required.ts'; +import schemaRegistryVendorExcludedLint from './schema-registry-vendor--excluded.ts'; const lints = [ schemaRegistryUrlFormatURILint, schemaRegistryVendorTypeLint, - schemaRegistryVendorRequiredLint, + schemaRegistryVendorExcludedLint, allowedFieldsLint, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/schema-registry-vendor--excluded.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/schema-registry-vendor--excluded.ts new file mode 100644 index 0000000000..04f355455a --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/schema-registry-vendor--excluded.ts @@ -0,0 +1,27 @@ +import { DiagnosticSeverity } from 'vscode-languageserver-types'; + +import ApilintCodes from '../../../../../../codes.ts'; +import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; + +const schemaRegistryVendorExcludedLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_EXCLUDED, + source: 'apilint', + message: "'schemaRegistryVendor' MUST NOT be specified if 'schemaRegistryUrl' is not specified.", + severity: DiagnosticSeverity.Error, + linterFunction: 'missingField', + linterParams: ['schemaRegistryVendor'], + marker: 'key', + data: {}, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + { + function: 'missingField', + params: ['schemaRegistryUrl'], + }, + ], +}; + +export default schemaRegistryVendorExcludedLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/schema-registry-vendor--required.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/schema-registry-vendor--required.ts deleted file mode 100644 index 206c73bf59..0000000000 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/server-binding/lint/latest/schema-registry-vendor--required.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { DiagnosticSeverity } from 'vscode-languageserver-types'; - -import ApilintCodes from '../../../../../../codes.ts'; -import { LinterMeta } from '../../../../../../../apidom-language-types.ts'; - -const schemaRegistryVendorRequiredLint: LinterMeta = { - code: ApilintCodes.ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_REQUIRED, - source: 'apilint', - message: "should always have a 'asyncapi' value", - severity: DiagnosticSeverity.Error, - linterFunction: 'hasRequiredField', - linterParams: ['schemaRegistryVendor'], - marker: 'key', - data: { - quickFix: [ - { - message: "add 'schemaRegistryVendor' section", - action: 'addChild', - snippetYaml: "schemaRegistryVendor: ''\n", - snippetJson: '"schemaRegistryVendor": "",\n', - }, - ], - }, - conditions: [ - { - function: 'missingField', - params: ['bindingVersion'], - }, - { - function: 'existFields', - params: [['schemaRegistryUrl']], - }, - ], -}; - -export default schemaRegistryVendorRequiredLint; diff --git a/packages/apidom-ls/src/config/codes.ts b/packages/apidom-ls/src/config/codes.ts index e7617adbb9..e8e90d88aa 100644 --- a/packages/apidom-ls/src/config/codes.ts +++ b/packages/apidom-ls/src/config/codes.ts @@ -469,6 +469,7 @@ enum ApilintCodes { ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_PARTITIONS_MINIMUM = 510200, ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_REPLICAS_MINIMUM = 510300, ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_BINDING_VERSION_TYPE = 510400, + ASYNCAPI2_KAFKA_CHANNEL_BINDING_FIELD_TOPIC_CONFIGURATION_TYPE = 510500, ASYNCAPI2_KAFKA_MESSAGE_BINDING = 520000, ASYNCAPI2_KAFKA_MESSAGE_BINDING_FIELD_KEY_TYPE = 520100, @@ -485,7 +486,7 @@ enum ApilintCodes { ASYNCAPI2_KAFKA_SERVER_BINDING = 540000, ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_URL_FORMAT_URI = 540100, ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_TYPE = 540200, - ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_REQUIRED, + ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_SCHEMA_REGISTRY_VENDOR_EXCLUDED, ASYNCAPI2_KAFKA_SERVER_BINDING_FIELD_BINDING_VERSION_TYPE = 540300, ASYNCAPI2_MERCURE_CHANNEL_BINDING = 550000, diff --git a/packages/apidom-ls/test/asyncapi-kafka-bindings.ts b/packages/apidom-ls/test/asyncapi-kafka-bindings.ts new file mode 100644 index 0000000000..557bcba5f8 --- /dev/null +++ b/packages/apidom-ls/test/asyncapi-kafka-bindings.ts @@ -0,0 +1,1174 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { assert } from 'chai'; +import { TextDocument } from 'vscode-languageserver-textdocument'; +import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver-types'; + +import getLanguageService from '../src/apidom-language-service.ts'; +import { + LanguageService, + LanguageServiceContext, + ValidationContext, +} from '../src/apidom-language-types.ts'; +import { metadata } from './metadata.ts'; +import { logPerformance, logLevel } from './test-utils.ts'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const bindingsPath = path.join( + __dirname, + 'fixtures', + 'validation', + 'asyncapi', + 'bindings', + 'kafka', +); + +const specServerBindingAllowedFields010 = fs + .readFileSync(path.join(bindingsPath, 'kafka-server-binding-allowed-fields-0-1-0.yaml')) + .toString(); + +const specServerBindingAllowedFields020 = fs + .readFileSync(path.join(bindingsPath, 'kafka-server-binding-allowed-fields-0-2-0.yaml')) + .toString(); + +const specServerBindingAllowedFields030 = fs + .readFileSync(path.join(bindingsPath, 'kafka-server-binding-allowed-fields-0-3-0.yaml')) + .toString(); + +const specServerBindingAllowedFields040 = fs + .readFileSync(path.join(bindingsPath, 'kafka-server-binding-allowed-fields-0-4-0.yaml')) + .toString(); + +const specServerBindingAllowedFields050 = fs + .readFileSync(path.join(bindingsPath, 'kafka-server-binding-allowed-fields-0-5-0.yaml')) + .toString(); + +const specServerBindingAllowedFieldsLatest = fs + .readFileSync(path.join(bindingsPath, 'kafka-server-binding-allowed-fields-latest.yaml')) + .toString(); + +const specServerBindingSchemaRegistryUrlFormatUri = fs + .readFileSync(path.join(bindingsPath, 'kafka-server-binding-schema-registry-url-format-uri.yaml')) + .toString(); + +const specServerBindingSchemaRegistryVendorType = fs + .readFileSync(path.join(bindingsPath, 'kafka-server-binding-schema-registry-vendor-type.yaml')) + .toString(); + +const specServerBindingSchemaRegistryVendorExcluded = fs + .readFileSync( + path.join(bindingsPath, 'kafka-server-binding-schema-registry-vendor-excluded.yaml'), + ) + .toString(); + +const specServerBindingBindingVersionType = fs + .readFileSync(path.join(bindingsPath, 'kafka-server-binding-binding-version-type.yaml')) + .toString(); + +const specChannelBindingAllowedFields010 = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-allowed-fields-0-1-0.yaml')) + .toString(); + +const specChannelBindingAllowedFields020 = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-allowed-fields-0-2-0.yaml')) + .toString(); + +const specChannelBindingAllowedFields030 = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-allowed-fields-0-3-0.yaml')) + .toString(); + +const specChannelBindingAllowedFields040 = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-allowed-fields-0-4-0.yaml')) + .toString(); + +const specChannelBindingAllowedFields050 = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-allowed-fields-0-5-0.yaml')) + .toString(); + +const specChannelBindingAllowedFieldsLatest = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-allowed-fields-latest.yaml')) + .toString(); + +const specChannelBindingTopicType = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-topic-type.yaml')) + .toString(); + +const specChannelBindingReplicasPartitionsType = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-replicas-partitions-type.yaml')) + .toString(); + +const specChannelBindingTopicConfigurationType = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-topic-configuration-type.yaml')) + .toString(); + +const specChannelBindingBindingVersionType = fs + .readFileSync(path.join(bindingsPath, 'kafka-channel-binding-binding-version-type.yaml')) + .toString(); + +const specOperationBindingAllowedFields010 = fs + .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-allowed-fields-0-1-0.yaml')) + .toString(); + +const specOperationBindingAllowedFields020 = fs + .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-allowed-fields-0-2-0.yaml')) + .toString(); + +const specOperationBindingAllowedFields030 = fs + .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-allowed-fields-0-3-0.yaml')) + .toString(); + +const specOperationBindingAllowedFields040 = fs + .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-allowed-fields-0-4-0.yaml')) + .toString(); + +const specOperationBindingAllowedFields050 = fs + .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-allowed-fields-0-5-0.yaml')) + .toString(); + +const specOperationBindingAllowedFieldsLatest = fs + .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-allowed-fields-latest.yaml')) + .toString(); + +const specOperationBindingClientIdType = fs + .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-client-id-type.yaml')) + .toString(); + +const specOperationBindingBindingVersionType = fs + .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-binding-version-type.yaml')) + .toString(); + +const specMessageBindingAllowedFields010 = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-allowed-fields-0-1-0.yaml')) + .toString(); + +const specMessageBindingAllowedFields020 = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-allowed-fields-0-2-0.yaml')) + .toString(); + +const specMessageBindingAllowedFields030 = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-allowed-fields-0-3-0.yaml')) + .toString(); + +const specMessageBindingAllowedFields040 = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-allowed-fields-0-4-0.yaml')) + .toString(); + +const specMessageBindingAllowedFields050 = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-allowed-fields-0-5-0.yaml')) + .toString(); + +const specMessageBindingAllowedFieldsLatest = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-allowed-fields-latest.yaml')) + .toString(); + +const specMessageBindingKeyType = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-key-type.yaml')) + .toString(); + +const specMessageBindingSchemaIdLocationType = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-schema-id-location-type.yaml')) + .toString(); + +const specMessageBindingSchemaIdPayloadEncodingType = fs + .readFileSync( + path.join(bindingsPath, 'kafka-message-binding-schema-id-payload-encoding-type.yaml'), + ) + .toString(); + +const specMessageBindingSchemaLookupStrategyType = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-schema-lookup-strategy-type.yaml')) + .toString(); + +const specMessageBindingBindingVersionType = fs + .readFileSync(path.join(bindingsPath, 'kafka-message-binding-binding-version-type.yaml')) + .toString(); + +describe('asyncapi Kafka bindings test', function () { + const context: LanguageServiceContext = { + metadata: metadata(), + validatorProviders: [], + performanceLogs: logPerformance, + logLevel, + }; + + const languageService: LanguageService = getLanguageService(context); + + const validationContext: ValidationContext = { + comments: DiagnosticSeverity.Error, + maxNumberOfProblems: 100, + relatedInformation: false, + }; + + after(function () { + languageService.terminate(); + }); + + it('test Kafka server binding allowed fields (0.1.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-allowed-fields-0-1-0.yaml', + 'yaml', + 0, + specServerBindingAllowedFields010, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 11 }, + }, + message: + 'This object MUST NOT contain any properties. Its name is reserved for future use.', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka server binding allowed fields (0.2.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-allowed-fields-0-2-0.yaml', + 'yaml', + 0, + specServerBindingAllowedFields020, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 11 }, + }, + message: + 'This object MUST NOT contain any properties. Its name is reserved for future use.', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka server binding allowed fields (0.3.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-allowed-fields-0-3-0.yaml', + 'yaml', + 0, + specServerBindingAllowedFields030, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 11 }, + }, + message: 'Object includes not allowed fields.', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka server binding allowed fields (0.4.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-allowed-fields-0-4-0.yaml', + 'yaml', + 0, + specServerBindingAllowedFields040, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 11 }, + }, + message: 'Object includes not allowed fields.', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka server binding allowed fields (0.5.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-allowed-fields-0-5-0.yaml', + 'yaml', + 0, + specServerBindingAllowedFields050, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 11 }, + }, + message: 'Object includes not allowed fields.', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka server binding allowed fields (latest)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-allowed-fields-latest.yaml', + 'yaml', + 0, + specServerBindingAllowedFieldsLatest, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 11 }, + }, + message: 'Object includes not allowed fields.', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka server binding 'schemaRegistryUrl' format URI", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-schema-registry-url-format-uri.yaml', + 'yaml', + 0, + specServerBindingSchemaRegistryUrlFormatUri, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 10, character: 27 }, + end: { line: 10, character: 38 }, + }, + message: "'schemaRegistryUrl' MUST be in the format of a URL.", + severity: 1, + code: 540100, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka server binding 'schemaRegistryVendor' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-schema-registry-vendor-type.yaml', + 'yaml', + 0, + specServerBindingSchemaRegistryVendorType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 10, character: 30 }, + end: { line: 10, character: 33 }, + }, + message: "'schemaRegistryVendor' value must be a string", + severity: 1, + code: 540200, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka server binding 'schemaRegistryVendor' excluded without 'schemaRegistryUrl'", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-schema-registry-vendor-excluded.yaml', + 'yaml', + 0, + specServerBindingSchemaRegistryVendorExcluded, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 11 }, + }, + message: + "'schemaRegistryVendor' MUST NOT be specified if 'schemaRegistryUrl' is not specified.", + severity: 1, + code: 540201, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka server binding 'bindingVersion' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-server-binding-binding-version-type.yaml', + 'yaml', + 0, + specServerBindingBindingVersionType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 10, character: 24 }, + end: { line: 10, character: 27 }, + }, + message: "'bindingVersion' value must be a string", + severity: 1, + code: 540300, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka channel binding allowed fields (0.1.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-allowed-fields-0-1-0.yaml', + 'yaml', + 0, + specChannelBindingAllowedFields010, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: + 'This object MUST NOT contain any properties. Its name is reserved for future use.', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka channel binding allowed fields (0.2.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-allowed-fields-0-2-0.yaml', + 'yaml', + 0, + specChannelBindingAllowedFields020, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: + 'This object MUST NOT contain any properties. Its name is reserved for future use.', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka channel binding allowed fields (0.3.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-allowed-fields-0-3-0.yaml', + 'yaml', + 0, + specChannelBindingAllowedFields030, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka channel binding allowed fields (0.4.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-allowed-fields-0-4-0.yaml', + 'yaml', + 0, + specChannelBindingAllowedFields040, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka channel binding allowed fields (0.5.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-allowed-fields-0-5-0.yaml', + 'yaml', + 0, + specChannelBindingAllowedFields050, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka channel binding allowed fields (latest)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-allowed-fields-latest.yaml', + 'yaml', + 0, + specChannelBindingAllowedFieldsLatest, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka channel binding 'topic' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-topic-type.yaml', + 'yaml', + 0, + specChannelBindingTopicType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 15 }, + end: { line: 8, character: 18 }, + }, + message: "'topic' value must be a string", + severity: 1, + code: 510100, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka channel binding 'replicas' and 'partitions' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-replicas-partitions-type.yaml', + 'yaml', + 0, + specChannelBindingReplicasPartitionsType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 14, character: 20 }, + end: { line: 14, character: 23 }, + }, + message: "'partitions' value must be positive integer", + severity: 1, + code: 510200, + source: 'apilint', + data: {}, + }, + { + range: { + start: { line: 13, character: 18 }, + end: { line: 13, character: 19 }, + }, + message: "'replicas' value must be positive integer", + severity: 1, + code: 510300, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka channel binding 'topicConfiguration' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-topic-configuration-type.yaml', + 'yaml', + 0, + specChannelBindingTopicConfigurationType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 28 }, + end: { line: 8, character: 31 }, + }, + message: "'topicConfiguration' value must be an object", + severity: 1, + code: 510500, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka channel binding 'bindingVersion' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-channel-binding-binding-version-type.yaml', + 'yaml', + 0, + specChannelBindingBindingVersionType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 24 }, + end: { line: 8, character: 27 }, + }, + message: "'bindingVersion' value must be a string", + severity: 1, + code: 510400, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka operation binding allowed fields (0.1.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-operation-binding-allowed-fields-0-1-0.yaml', + 'yaml', + 0, + specOperationBindingAllowedFields010, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka operation binding allowed fields (0.2.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-operation-binding-allowed-fields-0-2-0.yaml', + 'yaml', + 0, + specOperationBindingAllowedFields020, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka operation binding allowed fields (0.3.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-operation-binding-allowed-fields-0-3-0.yaml', + 'yaml', + 0, + specOperationBindingAllowedFields030, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka operation binding allowed fields (0.4.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-operation-binding-allowed-fields-0-4-0.yaml', + 'yaml', + 0, + specOperationBindingAllowedFields040, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka operation binding allowed fields (0.5.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-operation-binding-allowed-fields-0-5-0.yaml', + 'yaml', + 0, + specOperationBindingAllowedFields050, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka operation binding allowed fields (latest)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-operation-binding-allowed-fields-latest.yaml', + 'yaml', + 0, + specOperationBindingAllowedFieldsLatest, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka operation binding 'clientId' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-operation-binding-client-id-type.yaml', + 'yaml', + 0, + specOperationBindingClientIdType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 18 }, + end: { line: 8, character: 21 }, + }, + message: 'clientId must be a schema object or a boolean JSON schema', + severity: 1, + code: 530200, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka operation binding 'bindingVersion' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-operation-binding-binding-version-type.yaml', + 'yaml', + 0, + specOperationBindingBindingVersionType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 24 }, + end: { line: 8, character: 27 }, + }, + message: "'bindingVersion' value must be a string", + severity: 1, + code: 530300, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka message binding allowed fields (0.1.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-allowed-fields-0-1-0.yaml', + 'yaml', + 0, + specMessageBindingAllowedFields010, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka message binding allowed fields (0.2.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-allowed-fields-0-2-0.yaml', + 'yaml', + 0, + specMessageBindingAllowedFields020, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka message binding allowed fields (0.3.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-allowed-fields-0-3-0.yaml', + 'yaml', + 0, + specMessageBindingAllowedFields030, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka message binding allowed fields (0.4.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-allowed-fields-0-4-0.yaml', + 'yaml', + 0, + specMessageBindingAllowedFields040, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka message binding allowed fields (0.5.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-allowed-fields-0-5-0.yaml', + 'yaml', + 0, + specMessageBindingAllowedFields050, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test Kafka message binding allowed fields (latest)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-allowed-fields-latest.yaml', + 'yaml', + 0, + specMessageBindingAllowedFieldsLatest, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 11 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka message binding 'key' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-key-type.yaml', + 'yaml', + 0, + specMessageBindingKeyType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 13 }, + end: { line: 8, character: 16 }, + }, + message: 'key must be a schema object, a boolean JSON schema, or an AVRO Schema', + severity: 1, + code: 520100, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka message binding 'schemaIdLocation' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-schema-id-location-type.yaml', + 'yaml', + 0, + specMessageBindingSchemaIdLocationType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 26 }, + end: { line: 8, character: 29 }, + }, + message: 'schemaIdLocation value must be a string', + severity: 1, + code: 520300, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka message binding 'schemaIdPayloadEncoding' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-schema-id-payload-encoding-type.yaml', + 'yaml', + 0, + specMessageBindingSchemaIdPayloadEncodingType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 33 }, + end: { line: 8, character: 36 }, + }, + message: 'schemaIdPayloadEncoding value must be a string', + severity: 1, + code: 520400, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka message binding 'schemaLookupStrategy' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-schema-lookup-strategy-type.yaml', + 'yaml', + 0, + specMessageBindingSchemaLookupStrategyType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 30 }, + end: { line: 8, character: 33 }, + }, + message: 'schemaLookupStrategy value must be a string', + severity: 1, + code: 520500, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test Kafka message binding 'bindingVersion' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-message-binding-binding-version-type.yaml', + 'yaml', + 0, + specMessageBindingBindingVersionType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 24 }, + end: { line: 8, character: 27 }, + }, + message: "'bindingVersion' value must be a string", + severity: 1, + code: 520200, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); +}); diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-1-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-1-0.yaml new file mode 100644 index 0000000000..4fe5b4d03e --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-1-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + foo: bar + bindingVersion: '0.1.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-2-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-2-0.yaml new file mode 100644 index 0000000000..ff5a5f803a --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-2-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + foo: bar + bindingVersion: '0.2.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-3-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-3-0.yaml new file mode 100644 index 0000000000..5817f37940 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-3-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + foo: bar + bindingVersion: '0.3.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-4-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-4-0.yaml new file mode 100644 index 0000000000..8ee7749008 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-4-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + foo: bar + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-5-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-5-0.yaml new file mode 100644 index 0000000000..cb66fa626a --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-0-5-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + foo: bar + bindingVersion: '0.5.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-latest.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-latest.yaml new file mode 100644 index 0000000000..5b1ba012b4 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-allowed-fields-latest.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + foo: bar diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-binding-version-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-binding-version-type.yaml new file mode 100644 index 0000000000..3e127c1bbf --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-binding-version-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + bindingVersion: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-partitions-minimum.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-partitions-minimum.yaml new file mode 100644 index 0000000000..e890808e90 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-partitions-minimum.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + partitions: 0 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-replicas-minimum.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-replicas-minimum.yaml new file mode 100644 index 0000000000..73aca8b79b --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-replicas-minimum.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + replicas: 0 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/kafka-channel-binding-replicas-partitions-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-replicas-partitions-type.yaml similarity index 100% rename from packages/apidom-ls/test/fixtures/validation/asyncapi/kafka-channel-binding-replicas-partitions-type.yaml rename to packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-replicas-partitions-type.yaml diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-topic-configuration-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-topic-configuration-type.yaml new file mode 100644 index 0000000000..f7c1082c66 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-topic-configuration-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + topicConfiguration: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-topic-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-topic-type.yaml new file mode 100644 index 0000000000..5e8ac37626 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-channel-binding-topic-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +channels: + channel1: + bindings: + kafka: + topic: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-1-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-1-0.yaml new file mode 100644 index 0000000000..2cf4e95998 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-1-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.1.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-2-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-2-0.yaml new file mode 100644 index 0000000000..5ccf325929 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-2-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.2.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-3-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-3-0.yaml new file mode 100644 index 0000000000..5bb2d29d9c --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-3-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.3.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-4-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-4-0.yaml new file mode 100644 index 0000000000..9511cfc031 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-4-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-5-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-5-0.yaml new file mode 100644 index 0000000000..d1be7be7a3 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-0-5-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.5.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-latest.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-latest.yaml new file mode 100644 index 0000000000..4649e0a85e --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-allowed-fields-latest.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + foo: bar diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-binding-version-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-binding-version-type.yaml new file mode 100644 index 0000000000..582b2422b5 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-binding-version-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + bindingVersion: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-key-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-key-type.yaml new file mode 100644 index 0000000000..b8978b84c4 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-key-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + key: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-id-location-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-id-location-type.yaml new file mode 100644 index 0000000000..be99b9862b --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-id-location-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + schemaIdLocation: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-id-payload-encoding-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-id-payload-encoding-type.yaml new file mode 100644 index 0000000000..19ce0e6baa --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-id-payload-encoding-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + schemaIdPayloadEncoding: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-lookup-strategy-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-lookup-strategy-type.yaml new file mode 100644 index 0000000000..b81dbd0aec --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-message-binding-schema-lookup-strategy-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + messageBindings: + bindings1: + kafka: + schemaLookupStrategy: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-1-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-1-0.yaml new file mode 100644 index 0000000000..46cf952a30 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-1-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.1.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-2-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-2-0.yaml new file mode 100644 index 0000000000..ea19f99c1d --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-2-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.2.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-3-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-3-0.yaml new file mode 100644 index 0000000000..8b2f79812f --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-3-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.3.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-4-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-4-0.yaml new file mode 100644 index 0000000000..cf36b2e9bb --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-4-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-5-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-5-0.yaml new file mode 100644 index 0000000000..8347b73dbc --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-0-5-0.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + kafka: + foo: bar + bindingVersion: '0.5.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-latest.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-latest.yaml new file mode 100644 index 0000000000..91a05d7f12 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-allowed-fields-latest.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + kafka: + foo: bar diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-binding-version-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-binding-version-type.yaml new file mode 100644 index 0000000000..f975795892 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-binding-version-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + kafka: + bindingVersion: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-client-id-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-client-id-type.yaml new file mode 100644 index 0000000000..7e331002f8 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-client-id-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + kafka: + clientId: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-1-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-1-0.yaml new file mode 100644 index 0000000000..d0b0034772 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-1-0.yaml @@ -0,0 +1,12 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + foo: bar + bindingVersion: '0.1.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-2-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-2-0.yaml new file mode 100644 index 0000000000..f233fbf6ad --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-2-0.yaml @@ -0,0 +1,12 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + foo: bar + bindingVersion: '0.2.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-3-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-3-0.yaml new file mode 100644 index 0000000000..d0ae1171f4 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-3-0.yaml @@ -0,0 +1,12 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + foo: bar + bindingVersion: '0.3.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-4-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-4-0.yaml new file mode 100644 index 0000000000..f1576df4ff --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-4-0.yaml @@ -0,0 +1,12 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + foo: bar + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-5-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-5-0.yaml new file mode 100644 index 0000000000..cc5ca277ac --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-0-5-0.yaml @@ -0,0 +1,12 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + foo: bar + bindingVersion: '0.5.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-latest.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-latest.yaml new file mode 100644 index 0000000000..cecb9bd390 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-allowed-fields-latest.yaml @@ -0,0 +1,11 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + foo: bar diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-binding-version-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-binding-version-type.yaml new file mode 100644 index 0000000000..1128da605b --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-binding-version-type.yaml @@ -0,0 +1,11 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + bindingVersion: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-url-format-uri.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-url-format-uri.yaml new file mode 100644 index 0000000000..0a8aac2c30 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-url-format-uri.yaml @@ -0,0 +1,11 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + schemaRegistryUrl: 'not-a-url' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-vendor-excluded.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-vendor-excluded.yaml new file mode 100644 index 0000000000..e454c0fb09 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-vendor-excluded.yaml @@ -0,0 +1,11 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + schemaRegistryVendor: 'confluent' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-vendor-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-vendor-type.yaml new file mode 100644 index 0000000000..547d82a935 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-server-binding-schema-registry-vendor-type.yaml @@ -0,0 +1,12 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: kafka + bindings: + kafka: + schemaRegistryVendor: 123 + schemaRegistryUrl: 'http://example.com' diff --git a/packages/apidom-ls/test/validate.ts b/packages/apidom-ls/test/validate.ts index 55846f9af0..e64ff7d68a 100644 --- a/packages/apidom-ls/test/validate.ts +++ b/packages/apidom-ls/test/validate.ts @@ -11262,57 +11262,6 @@ describe('apidom-ls-validate', function () { languageService.terminate(); }); - it('asyncapi - Kafka Channel Binding replicas and partitions field type', async function () { - const spec = fs - .readFileSync( - path.join( - __dirname, - 'fixtures', - 'validation', - 'asyncapi', - 'kafka-channel-binding-replicas-partitions-type.yaml', - ), - ) - .toString(); - const doc: TextDocument = TextDocument.create( - 'foo://bar/kafka-channel-binding-replicas-partitions-type.yaml', - 'yaml', - 0, - spec, - ); - - const languageService: LanguageService = getLanguageService(contextNoSchema); - - const result = await languageService.doValidation(doc); - const expected: Diagnostic[] = [ - { - range: { - start: { line: 14, character: 20 }, - end: { line: 14, character: 23 }, - }, - message: "'partitions' value must be positive integer", - severity: 1, - code: 510200, - source: 'apilint', - data: {}, - }, - { - range: { - start: { line: 13, character: 18 }, - end: { line: 13, character: 19 }, - }, - message: "'replicas' value must be positive integer", - severity: 1, - code: 510300, - source: 'apilint', - data: {}, - }, - ]; - assert.deepEqual(result, expected); - - languageService.terminate(); - }); - it('oas 3.0 / yaml - local references - every path template should be defined', async function () { const validationContext: ValidationContext = { comments: DiagnosticSeverity.Error, diff --git a/packages/apidom-ns-asyncapi-2/src/elements/bindings/kafka/KafkaChannelBinding.ts b/packages/apidom-ns-asyncapi-2/src/elements/bindings/kafka/KafkaChannelBinding.ts index 9d60a1a8f6..79c6a0019d 100644 --- a/packages/apidom-ns-asyncapi-2/src/elements/bindings/kafka/KafkaChannelBinding.ts +++ b/packages/apidom-ns-asyncapi-2/src/elements/bindings/kafka/KafkaChannelBinding.ts @@ -40,6 +40,14 @@ class KafkaChannelBinding extends ObjectElement { this.set('replicas', replicas); } + get topicConfiguration(): ObjectElement | undefined { + return this.get('topicConfiguration'); + } + + set topicConfiguration(topicConfiguration: ObjectElement | undefined) { + this.set('topicConfiguration', topicConfiguration); + } + get bindingVersion(): StringElement | undefined { return this.get('bindingVersion'); } diff --git a/packages/apidom-ns-asyncapi-2/src/refractor/plugins/replace-empty-element.ts b/packages/apidom-ns-asyncapi-2/src/refractor/plugins/replace-empty-element.ts index 77633f2d7e..c4c6ebd0f0 100644 --- a/packages/apidom-ns-asyncapi-2/src/refractor/plugins/replace-empty-element.ts +++ b/packages/apidom-ns-asyncapi-2/src/refractor/plugins/replace-empty-element.ts @@ -813,6 +813,11 @@ const schema = { return new SchemaElement(...args); }, }, + KafkaChannelBindingElement: { + topicConfiguration(...args: any[]) { + return new ObjectElement(...args); + }, + }, KafkaMessageBindingElement: { key(...args: any[]) { return new SchemaElement(...args); diff --git a/packages/apidom-ns-asyncapi-2/src/refractor/specification.ts b/packages/apidom-ns-asyncapi-2/src/refractor/specification.ts index 34fcfdd6ef..ffac77264d 100644 --- a/packages/apidom-ns-asyncapi-2/src/refractor/specification.ts +++ b/packages/apidom-ns-asyncapi-2/src/refractor/specification.ts @@ -887,6 +887,9 @@ const specification = { replicas: { $ref: '#/visitors/value', }, + topicConfiguration: { + $ref: '#/visitors/value', + }, bindingVersion: { $ref: '#/visitors/value', }, diff --git a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/kafka/KafkaChannelBinding/__snapshots__/index.ts.snap b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/kafka/KafkaChannelBinding/__snapshots__/index.ts.snap index 70cdeedf1e..4d48f3fba3 100644 --- a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/kafka/KafkaChannelBinding/__snapshots__/index.ts.snap +++ b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/kafka/KafkaChannelBinding/__snapshots__/index.ts.snap @@ -11,6 +11,9 @@ exports[`refractor elements KafkaChannelBindingElement should refract to semanti (MemberElement (StringElement) (NumberElement)) + (MemberElement + (StringElement) + (ObjectElement)) (MemberElement (StringElement) (StringElement))) diff --git a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/kafka/KafkaChannelBinding/index.ts b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/kafka/KafkaChannelBinding/index.ts index d1657accbe..0b96771666 100644 --- a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/kafka/KafkaChannelBinding/index.ts +++ b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/kafka/KafkaChannelBinding/index.ts @@ -11,7 +11,8 @@ describe('refractor', function () { topic: 'my-specific-topic-name', partitions: 20, replicas: 3, - bindingVersion: '0.3.0', + topicConfiguration: {}, + bindingVersion: '0.5.0', }); expect(sexprs(kafkaChannelBindingElement)).toMatchSnapshot(); diff --git a/packages/apidom-ns-asyncapi-3/src/refractor/plugins/replace-empty-element.ts b/packages/apidom-ns-asyncapi-3/src/refractor/plugins/replace-empty-element.ts index 3b3b6e6e66..5ab57a633e 100644 --- a/packages/apidom-ns-asyncapi-3/src/refractor/plugins/replace-empty-element.ts +++ b/packages/apidom-ns-asyncapi-3/src/refractor/plugins/replace-empty-element.ts @@ -901,6 +901,12 @@ const schema: Record = { }, }, + KafkaChannelBindingElement: { + topicConfiguration(...args: Record[]) { + return new ObjectElement(...args); + }, + }, + KafkaMessageBindingElement: { key(...args: Record[]) { return new SchemaElement(...args); diff --git a/packages/apidom-ns-asyncapi-3/src/refractor/specification.ts b/packages/apidom-ns-asyncapi-3/src/refractor/specification.ts index 9aa4a275f1..0f958bd046 100644 --- a/packages/apidom-ns-asyncapi-3/src/refractor/specification.ts +++ b/packages/apidom-ns-asyncapi-3/src/refractor/specification.ts @@ -945,6 +945,9 @@ const specification = { replicas: { $ref: '#/visitors/value', }, + topicConfiguration: { + $ref: '#/visitors/value', + }, bindingVersion: { $ref: '#/visitors/value', }, diff --git a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/kafka/KafkaChannelBinding/__snapshots__/index.ts.snap b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/kafka/KafkaChannelBinding/__snapshots__/index.ts.snap index 70cdeedf1e..4d48f3fba3 100644 --- a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/kafka/KafkaChannelBinding/__snapshots__/index.ts.snap +++ b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/kafka/KafkaChannelBinding/__snapshots__/index.ts.snap @@ -11,6 +11,9 @@ exports[`refractor elements KafkaChannelBindingElement should refract to semanti (MemberElement (StringElement) (NumberElement)) + (MemberElement + (StringElement) + (ObjectElement)) (MemberElement (StringElement) (StringElement))) diff --git a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/kafka/KafkaChannelBinding/index.ts b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/kafka/KafkaChannelBinding/index.ts index d1657accbe..0b96771666 100644 --- a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/kafka/KafkaChannelBinding/index.ts +++ b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/kafka/KafkaChannelBinding/index.ts @@ -11,7 +11,8 @@ describe('refractor', function () { topic: 'my-specific-topic-name', partitions: 20, replicas: 3, - bindingVersion: '0.3.0', + topicConfiguration: {}, + bindingVersion: '0.5.0', }); expect(sexprs(kafkaChannelBindingElement)).toMatchSnapshot(); From a8cb899d22df4f202fa78631f59431d2e2ea165c Mon Sep 17 00:00:00 2001 From: Oliwia Rogala Date: Thu, 19 Mar 2026 11:07:11 +0100 Subject: [PATCH 2/4] fix(ns-asyncapi-2): fix topicConfiguration args type --- .../src/refractor/plugins/replace-empty-element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/apidom-ns-asyncapi-2/src/refractor/plugins/replace-empty-element.ts b/packages/apidom-ns-asyncapi-2/src/refractor/plugins/replace-empty-element.ts index c4c6ebd0f0..f0ebe775e0 100644 --- a/packages/apidom-ns-asyncapi-2/src/refractor/plugins/replace-empty-element.ts +++ b/packages/apidom-ns-asyncapi-2/src/refractor/plugins/replace-empty-element.ts @@ -814,7 +814,7 @@ const schema = { }, }, KafkaChannelBindingElement: { - topicConfiguration(...args: any[]) { + topicConfiguration(...args: Record[]) { return new ObjectElement(...args); }, }, From 05a8a4b0bd64aadd47374852371c653fec886c22 Mon Sep 17 00:00:00 2001 From: Oliwia Rogala Date: Thu, 19 Mar 2026 11:37:25 +0100 Subject: [PATCH 3/4] fix(ls): fix linting and missing docs Co-Authored-By: Claude Sonnet 4.6 --- .../bindings/kafka/channel-binding/documentation.ts | 2 +- .../bindings/kafka/message-binding/documentation.ts | 4 ++-- .../message-binding/lint/0-4-0/allowed-fields.ts | 8 +++++++- .../message-binding/lint/0-5-0/allowed-fields.ts | 8 +++++++- .../message-binding/lint/latest/allowed-fields.ts | 8 +++++++- .../kafka/operation-binding/completion/0-4-0.ts | 8 ++++---- .../kafka/operation-binding/completion/0-5-0.ts | 8 ++++---- .../kafka/operation-binding/completion/latest.ts | 8 ++++---- .../kafka/operation-binding/documentation.ts | 12 ++++++------ 9 files changed, 42 insertions(+), 24 deletions(-) diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/documentation.ts index 3e2076347d..6abe7b2bf2 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/channel-binding/documentation.ts @@ -20,7 +20,7 @@ const documentation = [ docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, { - docs: "#### [Channel Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka#channel)\n\nThis object contains information about the channel representation in Kafka (eg. a Kafka topic).\n\n##### Fixed Fields\n\nField Name | Type | Description | Applicability [default] | Constraints\n---|:---:|:---:|:---:|---\n`topic` | string | Kafka topic name if different from channel name. | OPTIONAL | -\n`partitions` | integer | Number of partitions configured on this topic (useful to know how many parallel consumers you may run). | OPTIONAL | Must be positive\n`replicas` | integer | Number of replicas configured on this topic. | OPTIONAL | MUST be positive\n`topicConfiguration` | [Topic Configuration Object](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#topicConfiguration-object) | Topic configuration properties that are relevant for the API. | OPTIONAL | -\n`bindingVersion` | string | The version of this binding. If omitted, \"0.5.0\" MUST be assumed. | OPTIONAL [`0.5.0`] | -\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 kafka:\n topic: 'my-specific-topic-name'\n partitions: 20\n replicas: 3\n topicConfiguration:\n cleanup.policy:\n - delete\n - compact\n retention.ms: 604800000\n retention.bytes: 1000000000\n delete.retention.ms: 86400000\n max.message.bytes: 1048588\n bindingVersion: '0.5.0'\n```", + docs: "#### [Channel Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka#channel)\n\nThis object contains information about the channel representation in Kafka (eg. a Kafka topic).\n\n##### Fixed Fields\n\nField Name | Type | Description | Applicability [default] | Constraints\n---|:---:|:---:|:---:|---\n`topic` | string | Kafka topic name if different from channel name. | OPTIONAL | -\n`partitions` | integer | Number of partitions configured on this topic (useful to know how many parallel consumers you may run). | OPTIONAL | Must be positive\n`replicas` | integer | Number of replicas configured on this topic. | OPTIONAL | MUST be positive\n`topicConfiguration` | [Topic Configuration Object](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#topicConfiguration-object) | Topic configuration properties that are relevant for the API. | OPTIONAL | -\n`bindingVersion` | string | The version of this binding. If omitted, \"0.5.0\" MUST be assumed. | OPTIONAL [`0.5.0`] | -\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 kafka:\n topic: 'my-specific-topic-name'\n partitions: 20\n replicas: 3\n topicConfiguration:\n cleanup.policy: ['delete', 'compact']\n retention.ms: 604800000\n retention.bytes: 1000000000\n delete.retention.ms: 86400000\n max.message.bytes: 1048588\n bindingVersion: '0.5.0'\n```", }, ]; export default documentation; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts index 1cfdc54ddc..b530364f70 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts @@ -28,11 +28,11 @@ const documentation = [ docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, { - docs: "#### [Message Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/#message)\n\nThis object contains information about the message representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`key` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) | The message key.\n`schemaIdLocation` | string | If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaIdPayloadEncoding` | string | Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent`/ `apicurio-legacy` / `apicurio-new`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaLookupStrategy` | string | Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied. | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\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\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: '4'\n bindingVersion: '0.3.0'\n```\n\nThis is another example that describes the use if Apicurio schema registry. We describe the `apicurio-new` way of serializing without details on how it's implemented. We reference a [specific lookup strategy](https://www.apicur.io/registry/docs/apicurio-registry/2.2.x/getting-started/assembly-using-kafka-client-serdes.html#registry-serdes-concepts-strategy_registry) that may be used to retrieve schema Id from registry during serialization.\n\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: 'apicurio-new'\n schemaLookupStrategy: 'TopicIdStrategy'\n bindingVersion: '0.3.0'\n```", + docs: "#### [Message Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/#message)\n\nThis object contains information about the message representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`key` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) | The message key.\n`schemaIdLocation` | string | If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaIdPayloadEncoding` | string | Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent`/ `apicurio-legacy` / `apicurio-new`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaLookupStrategy` | string | Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied. | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\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\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: '4'\n bindingVersion: '0.3.0'\n```\n\nThis is another example that describes the use if Apicurio schema registry. We describe the `apicurio-new` way of serializing without details on how it's implemented. We reference a [specific lookup strategy](https://www.apicur.io/registry/docs/apicurio-registry/2.2.x/getting-started/assembly-using-kafka-client-serdes.html#registry-serdes-concepts-strategy_registry) that may be used to retrieve schema Id from registry during serialization.\n\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: 'apicurio-new'\n schemaLookupStrategy: 'TopicIdStrategy'\n bindingVersion: '0.5.0'\n```", targetSpecs: AsyncAPI2, }, { - docs: "#### [Message Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/#message)\n\nThis object contains information about the message representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`key` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject) | The message key.\n`schemaIdLocation` | string | If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaIdPayloadEncoding` | string | Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent`/ `apicurio-legacy` / `apicurio-new`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaLookupStrategy` | string | Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied. | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\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\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: '4'\n bindingVersion: '0.3.0'\n```\n\nThis is another example that describes the use if Apicurio schema registry. We describe the `apicurio-new` way of serializing without details on how it's implemented. We reference a [specific lookup strategy](https://www.apicur.io/registry/docs/apicurio-registry/2.2.x/getting-started/assembly-using-kafka-client-serdes.html#registry-serdes-concepts-strategy_registry) that may be used to retrieve schema Id from registry during serialization.\n\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: 'apicurio-new'\n schemaLookupStrategy: 'TopicIdStrategy'\n bindingVersion: '0.3.0'\n```", + docs: "#### [Message Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/#message)\n\nThis object contains information about the message representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`key` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject) | The message key.\n`schemaIdLocation` | string | If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaIdPayloadEncoding` | string | Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent`/ `apicurio-legacy` / `apicurio-new`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaLookupStrategy` | string | Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied. | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\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\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n test:\n address: test-topic\n messages:\n testMessage:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: '4'\n bindingVersion: '0.5.0'\n```\n\nThis is another example that describes the use if Apicurio schema registry. We describe the `apicurio-new` way of serializing without details on how it's implemented. We reference a [specific lookup strategy](https://www.apicur.io/registry/docs/apicurio-registry/2.2.x/getting-started/assembly-using-kafka-client-serdes.html#registry-serdes-concepts-strategy_registry) that may be used to retrieve schema Id from registry during serialization.\n\n```yaml\nchannels:\n test:\n address: test-topic\n messages:\n testMessage:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: 'apicurio-new'\n schemaLookupStrategy: 'TopicIdStrategy'\n bindingVersion: '0.5.0'\n```", targetSpecs: AsyncAPI3, }, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/allowed-fields.ts index a467ee2753..6968fdcffd 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/allowed-fields.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-4-0/allowed-fields.ts @@ -10,7 +10,13 @@ const allowedFieldsLint: LinterMeta = { severity: DiagnosticSeverity.Error, linterFunction: 'allowedFields', linterParams: [ - ['key', 'schemaIdLocation', 'schemaIdPayloadEncoding', 'schemaLookupStrategy', 'bindingVersion'], + [ + 'key', + 'schemaIdLocation', + 'schemaIdPayloadEncoding', + 'schemaLookupStrategy', + 'bindingVersion', + ], ], marker: 'key', conditions: [ diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/allowed-fields.ts index 5c280c4fa8..b8188ab548 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/allowed-fields.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-5-0/allowed-fields.ts @@ -10,7 +10,13 @@ const allowedFieldsLint: LinterMeta = { severity: DiagnosticSeverity.Error, linterFunction: 'allowedFields', linterParams: [ - ['key', 'schemaIdLocation', 'schemaIdPayloadEncoding', 'schemaLookupStrategy', 'bindingVersion'], + [ + 'key', + 'schemaIdLocation', + 'schemaIdPayloadEncoding', + 'schemaLookupStrategy', + 'bindingVersion', + ], ], marker: 'key', conditions: [ diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/latest/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/latest/allowed-fields.ts index 6597e1ab6d..4c72547f59 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/latest/allowed-fields.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/latest/allowed-fields.ts @@ -10,7 +10,13 @@ const allowedFieldsLint: LinterMeta = { severity: DiagnosticSeverity.Error, linterFunction: 'allowedFields', linterParams: [ - ['key', 'schemaIdLocation', 'schemaIdPayloadEncoding', 'schemaLookupStrategy', 'bindingVersion'], + [ + 'key', + 'schemaIdLocation', + 'schemaIdPayloadEncoding', + 'schemaLookupStrategy', + 'bindingVersion', + ], ], marker: 'key', conditions: [ diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-4-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-4-0.ts index 4eb78707f1..0ac1567ddb 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-4-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-4-0.ts @@ -16,7 +16,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nId of the consumer group.', }, targetSpecs: AsyncAPI2, conditions: [ @@ -37,7 +37,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nId of the consumer group.', }, targetSpecs: AsyncAPI3, conditions: [ @@ -58,7 +58,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, targetSpecs: AsyncAPI2, conditions: [ @@ -79,7 +79,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, targetSpecs: AsyncAPI3, conditions: [ diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-5-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-5-0.ts index 1d36aa867c..42a158db17 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-5-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/0-5-0.ts @@ -16,7 +16,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nId of the consumer group.', }, targetSpecs: AsyncAPI2, conditions: [ @@ -37,7 +37,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nId of the consumer group.', }, targetSpecs: AsyncAPI3, conditions: [ @@ -58,7 +58,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, targetSpecs: AsyncAPI2, conditions: [ @@ -79,7 +79,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, targetSpecs: AsyncAPI3, conditions: [ diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/latest.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/latest.ts index 4fb833ac39..7f9131ccea 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/latest.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/completion/latest.ts @@ -16,7 +16,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nId of the consumer group.', }, targetSpecs: AsyncAPI2, conditions: [ @@ -36,7 +36,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nId of the consumer group.', }, targetSpecs: AsyncAPI3, conditions: [ @@ -56,7 +56,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, targetSpecs: AsyncAPI2, conditions: [ @@ -76,7 +76,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nId of the consumer inside a consumer group.', }, targetSpecs: AsyncAPI3, conditions: [ diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/documentation.ts index 15870b748e..e27cbbf14a 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/documentation.ts @@ -3,22 +3,22 @@ import { AsyncAPI2, AsyncAPI3 } from '../../../target-specs.ts'; const documentation = [ { target: 'groupId', - docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer group.', + docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nId of the consumer group.', targetSpecs: AsyncAPI2, }, { target: 'groupId', - docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer group.', + docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nId of the consumer group.', targetSpecs: AsyncAPI3, }, { target: 'clientId', - docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nId of the consumer inside a consumer group.', targetSpecs: AsyncAPI2, }, { target: 'clientId', - docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject)\n\\\n\\\nId of the consumer inside a consumer group.', + docs: '[Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject)\n\\\n\\\nId of the consumer inside a consumer group.', targetSpecs: AsyncAPI3, }, { @@ -26,11 +26,11 @@ const documentation = [ docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, { - docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/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/reference/specification/v2.6.0#schemaObject) | Id of the consumer group.\n`clientId` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.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```", + docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/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/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) | Id of the consumer group.\n`clientId` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) | 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.5.0'\n```", targetSpecs: AsyncAPI2, }, { - docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/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/reference/specification/v3.0.0#schemaObject) | Id of the consumer group.\n`clientId` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.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```", + docs: "#### [Operation Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/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/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject) | Id of the consumer group.\n`clientId` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) \\| [Reference Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#referenceObject) | 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:\noperations:\n userSignup:\n action: receive\n bindings:\n kafka:\n groupId:\n type: string\n enum: ['myGroupId']\n clientId:\n type: string\n enum: ['myClientId']\n bindingVersion: '0.5.0'\n```", targetSpecs: AsyncAPI3, }, ]; From d5e76db61f20635e6b86518eff8da3741d02e75c Mon Sep 17 00:00:00 2001 From: Oliwia Rogala Date: Tue, 24 Mar 2026 15:33:25 +0100 Subject: [PATCH 4/4] fix(ls): address code review issues --- .../kafka/message-binding/documentation.ts | 2 +- .../lint/0-3-0/allowed-fields.ts | 10 ++++++- .../lint/0-1-0/group-id--type.ts | 2 +- .../lint/0-2-0/group-id--type.ts | 2 +- .../lint/0-3-0/group-id--type.ts | 2 +- .../lint/0-4-0/group-id--type.ts | 2 +- .../lint/0-5-0/group-id--type.ts | 2 +- .../lint/latest/group-id--type.ts | 2 +- .../apidom-ls/test/asyncapi-kafka-bindings.ts | 29 +++++++++++++++++++ ...kafka-operation-binding-group-id-type.yaml | 9 ++++++ 10 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-group-id-type.yaml diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts index b530364f70..af26870f3e 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/documentation.ts @@ -28,7 +28,7 @@ const documentation = [ docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.5.0" MUST be assumed.', }, { - docs: "#### [Message Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/#message)\n\nThis object contains information about the message representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`key` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) | The message key.\n`schemaIdLocation` | string | If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaIdPayloadEncoding` | string | Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent`/ `apicurio-legacy` / `apicurio-new`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaLookupStrategy` | string | Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied. | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\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\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: '4'\n bindingVersion: '0.3.0'\n```\n\nThis is another example that describes the use if Apicurio schema registry. We describe the `apicurio-new` way of serializing without details on how it's implemented. We reference a [specific lookup strategy](https://www.apicur.io/registry/docs/apicurio-registry/2.2.x/getting-started/assembly-using-kafka-client-serdes.html#registry-serdes-concepts-strategy_registry) that may be used to retrieve schema Id from registry during serialization.\n\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: 'apicurio-new'\n schemaLookupStrategy: 'TopicIdStrategy'\n bindingVersion: '0.5.0'\n```", + docs: "#### [Message Binding Object](https://github.com/asyncapi/bindings/blob/master/kafka/#message)\n\nThis object contains information about the message representation in Kafka.\n\n##### Fixed Fields\n\nField Name | Type | Description\n---|:---:|---\n`key` | [Schema Object](https://www.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject) | The message key.\n`schemaIdLocation` | string | If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. `header` or `payload`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaIdPayloadEncoding` | string | Number of bytes or vendor specific values when schema id is encoded in payload (e.g `confluent`/ `apicurio-legacy` / `apicurio-new`). | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\n`schemaLookupStrategy` | string | Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied. | OPTIONAL | MUST NOT be specified if `schemaRegistryUrl` is not specified at the Server level\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\nThis example is valid for any Confluent compatible schema registry. Here we describe the implementation using the first 4 bytes in payload to store schema identifier.\n\n\n\\\nYAML\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: '4'\n bindingVersion: '0.5.0'\n```\n\nThis is another example that describes the use if Apicurio schema registry. We describe the `apicurio-new` way of serializing without details on how it's implemented. We reference a [specific lookup strategy](https://www.apicur.io/registry/docs/apicurio-registry/2.2.x/getting-started/assembly-using-kafka-client-serdes.html#registry-serdes-concepts-strategy_registry) that may be used to retrieve schema Id from registry during serialization.\n\n```yaml\nchannels:\n test:\n publish:\n message:\n bindings:\n kafka:\n key:\n type: string\n enum: ['myKey']\n schemaIdLocation: 'payload'\n schemaIdPayloadEncoding: 'apicurio-new'\n schemaLookupStrategy: 'TopicIdStrategy'\n bindingVersion: '0.5.0'\n```", targetSpecs: AsyncAPI2, }, { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-3-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-3-0/allowed-fields.ts index 8f7139acf3..6c53be8fc5 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-3-0/allowed-fields.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/message-binding/lint/0-3-0/allowed-fields.ts @@ -9,7 +9,15 @@ const allowedFieldsLint: LinterMeta = { message: 'Object includes not allowed fields', severity: DiagnosticSeverity.Error, linterFunction: 'allowedFields', - linterParams: [['key', 'bindingVersion']], + linterParams: [ + [ + 'key', + 'schemaIdLocation', + 'schemaIdPayloadEncoding', + 'schemaLookupStrategy', + 'bindingVersion', + ], + ], marker: 'key', conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-1-0/group-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-1-0/group-id--type.ts index 1dfedde50f..9f28b9c83a 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-1-0/group-id--type.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-1-0/group-id--type.ts @@ -11,7 +11,7 @@ const groupIdTypeLint: LinterMeta = { linterFunction: 'apilintElementOrClass', linterParams: [['schema', 'boolean']], marker: 'value', - target: 'groupdId', + target: 'groupId', data: {}, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-2-0/group-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-2-0/group-id--type.ts index 3b59c2b972..660f7acefc 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-2-0/group-id--type.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-2-0/group-id--type.ts @@ -11,7 +11,7 @@ const groupIdTypeLint: LinterMeta = { linterFunction: 'apilintElementOrClass', linterParams: [['schema', 'boolean']], marker: 'value', - target: 'groupdId', + target: 'groupId', data: {}, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-3-0/group-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-3-0/group-id--type.ts index a7f893e197..91e51bf6e3 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-3-0/group-id--type.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-3-0/group-id--type.ts @@ -11,7 +11,7 @@ const groupIdTypeLint: LinterMeta = { linterFunction: 'apilintElementOrClass', linterParams: [['schema', 'boolean']], marker: 'value', - target: 'groupdId', + target: 'groupId', data: {}, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/group-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/group-id--type.ts index f481d3b799..6d24dbe856 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/group-id--type.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-4-0/group-id--type.ts @@ -11,7 +11,7 @@ const groupIdTypeLint: LinterMeta = { linterFunction: 'apilintElementOrClass', linterParams: [['schema', 'boolean']], marker: 'value', - target: 'groupdId', + target: 'groupId', data: {}, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/group-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/group-id--type.ts index 243262ba65..3feb0ac9db 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/group-id--type.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/0-5-0/group-id--type.ts @@ -11,7 +11,7 @@ const groupIdTypeLint: LinterMeta = { linterFunction: 'apilintElementOrClass', linterParams: [['schema', 'boolean']], marker: 'value', - target: 'groupdId', + target: 'groupId', data: {}, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/latest/group-id--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/latest/group-id--type.ts index ddee860f86..ffb250159d 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/latest/group-id--type.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/kafka/operation-binding/lint/latest/group-id--type.ts @@ -11,7 +11,7 @@ const groupIdTypeLint: LinterMeta = { linterFunction: 'apilintElementOrClass', linterParams: [['schema', 'boolean']], marker: 'value', - target: 'groupdId', + target: 'groupId', data: {}, conditions: [ { diff --git a/packages/apidom-ls/test/asyncapi-kafka-bindings.ts b/packages/apidom-ls/test/asyncapi-kafka-bindings.ts index 557bcba5f8..18e55e201b 100644 --- a/packages/apidom-ls/test/asyncapi-kafka-bindings.ts +++ b/packages/apidom-ls/test/asyncapi-kafka-bindings.ts @@ -131,6 +131,10 @@ const specOperationBindingAllowedFieldsLatest = fs .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-allowed-fields-latest.yaml')) .toString(); +const specOperationBindingGroupIdType = fs + .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-group-id-type.yaml')) + .toString(); + const specOperationBindingClientIdType = fs .readFileSync(path.join(bindingsPath, 'kafka-operation-binding-client-id-type.yaml')) .toString(); @@ -853,6 +857,31 @@ describe('asyncapi Kafka bindings test', function () { assert.deepEqual(result, expected); }); + it("test Kafka operation binding 'groupId' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/kafka-operation-binding-group-id-type.yaml', + 'yaml', + 0, + specOperationBindingGroupIdType, + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 17 }, + end: { line: 8, character: 20 }, + }, + message: 'groupId must be a schema object or a boolean JSON schema', + severity: 1, + code: 530100, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + it("test Kafka operation binding 'clientId' type", async function () { const doc: TextDocument = TextDocument.create( 'foo://bar/kafka-operation-binding-client-id-type.yaml', diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-group-id-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-group-id-type.yaml new file mode 100644 index 0000000000..d57ae75cea --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/kafka/kafka-operation-binding-group-id-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + kafka: + groupId: 123