diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-3-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-3-0/allowed-fields.ts new file mode 100644 index 0000000000..021dca1b84 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-3-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: 'This object MUST NOT contain any properties. Its name is reserved for future use.', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [[]], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-3-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-3-0/index.ts new file mode 100644 index 0000000000..47f7d48761 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-3-0/index.ts @@ -0,0 +1,5 @@ +import allowedFieldsLint from './allowed-fields.ts'; + +const lints = [allowedFieldsLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-4-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-4-0/allowed-fields.ts new file mode 100644 index 0000000000..b8588cd886 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/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: 'This object MUST NOT contain any properties. Its name is reserved for future use.', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [[]], + 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/solace/channel-binding/lint/0-4-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-4-0/index.ts new file mode 100644 index 0000000000..47f7d48761 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/0-4-0/index.ts @@ -0,0 +1,5 @@ +import allowedFieldsLint from './allowed-fields.ts'; + +const lints = [allowedFieldsLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/index.ts index d0bd7888fb..10d54b6d55 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/channel-binding/lint/index.ts @@ -1,10 +1,14 @@ 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 channelBindingLatestLints from './latest/index.ts'; const lints = [ ...channelBinding0_1_0Lints, ...channelBinding0_2_0Lints, + ...channelBinding0_3_0Lints, + ...channelBinding0_4_0Lints, ...channelBindingLatestLints, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-3-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-3-0/allowed-fields.ts new file mode 100644 index 0000000000..021dca1b84 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-3-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: 'This object MUST NOT contain any properties. Its name is reserved for future use.', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [[]], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-3-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-3-0/index.ts new file mode 100644 index 0000000000..47f7d48761 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-3-0/index.ts @@ -0,0 +1,5 @@ +import allowedFieldsLint from './allowed-fields.ts'; + +const lints = [allowedFieldsLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-4-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-4-0/allowed-fields.ts new file mode 100644 index 0000000000..b8588cd886 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-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: 'This object MUST NOT contain any properties. Its name is reserved for future use.', + severity: DiagnosticSeverity.Error, + linterFunction: 'allowedFields', + linterParams: [[]], + 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/solace/message-binding/lint/0-4-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-4-0/index.ts new file mode 100644 index 0000000000..47f7d48761 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/0-4-0/index.ts @@ -0,0 +1,5 @@ +import allowedFieldsLint from './allowed-fields.ts'; + +const lints = [allowedFieldsLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/index.ts index e5a1ce96ea..b21354af69 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/message-binding/lint/index.ts @@ -1,10 +1,14 @@ 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 messageBindingLatestLints from './latest/index.ts'; const lints = [ ...messageBinding0_1_0Lints, ...messageBinding0_2_0Lints, + ...messageBinding0_3_0Lints, + ...messageBinding0_4_0Lints, ...messageBindingLatestLints, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-1-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-1-0.ts index f9a78bc96f..e9509e5efe 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-1-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-1-0.ts @@ -15,7 +15,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'List of [Destination Objects](https://github.com/asyncapi/bindings/tree/master/solace#example-with-two-destinations).', + 'List of [Destination Objects](https://github.com/asyncapi/bindings/blob/7dcae3ac9938ada9f3ff431a3f66c3859b5775f9/solace/README.md#destination-object).', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-2-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-2-0.ts index d6c49c8e80..f078b8a3f8 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-2-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-2-0.ts @@ -15,7 +15,7 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'List of [Destination Objects](https://github.com/asyncapi/bindings/tree/master/solace#example-with-two-destinations).', + 'List of [Destination Objects](https://github.com/asyncapi/bindings/blob/0dcef46499747b1b22170def503e0193b14eba10/solace/README.md#destination-object).', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-3-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-3-0.ts new file mode 100644 index 0000000000..4c50939295 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-3-0.ts @@ -0,0 +1,30 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'destinations', + insertText: 'destinations', + kind: 14, + format: CompletionFormat.ARRAY, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + 'List of [Destination Objects](https://github.com/asyncapi/bindings/blob/37cdb1db7f1377d4b9f347dd68cf2fcb9b8b58cc/solace/README.md#destination-object).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-4-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-4-0.ts new file mode 100644 index 0000000000..87393e520d --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/0-4-0.ts @@ -0,0 +1,135 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; +import { AsyncAPI2, AsyncAPI3 } from '../../../../target-specs.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'destinations', + insertText: 'destinations', + kind: 14, + format: CompletionFormat.ARRAY, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + 'List of [Destination Objects](https://github.com/asyncapi/bindings/tree/master/solace#destination-object).', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'timeToLive', + insertText: 'timeToLive', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer` | [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) | [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nInterval in milliseconds or a [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) containing the definition of the lifetime of the message.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'timeToLive', + insertText: 'timeToLive', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer` | [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\\\nInterval in milliseconds or a [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) containing the definition of the lifetime of the message.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'priority', + insertText: 'priority', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer` | [Schema Object](https://v2.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 valid priority value range is 0-255 with 0 as the lowest priority and 255 as the highest, or a [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) containing the definition of the priority.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'priority', + insertText: 'priority', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer` | [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 valid priority value range is 0-255 with 0 as the lowest priority and 255 as the highest, or a [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) containing the definition of the priority.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'dmqEligible', + insertText: 'dmqEligible', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`boolean`\n\\\n\\\nSet the message to be eligible to be moved to a Dead Message Queue. The default value is false.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/index.ts index 1d212e602b..1ef7c9cadf 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/index.ts @@ -1,5 +1,7 @@ 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 completionLatestItems from './latest.ts'; import { ApidomCompletionItem, @@ -10,6 +12,8 @@ import { const completion: ApidomCompletionItem[] = [ ...completion0_1_0Items, ...completion0_2_0Items, + ...completion0_3_0Items, + ...completion0_4_0Items, ...completionLatestItems, { label: 'bindingVersion', @@ -20,7 +24,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The current version is `0.2.0`', + value: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.4.0" MUST be assumed.', }, }, { @@ -41,6 +45,24 @@ const completion: ApidomCompletionItem[] = [ type: CompletionType.VALUE, insertTextFormat: 2, }, + { + target: 'bindingVersion', + label: '0.3.0', + insertText: '0.3.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + 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, + }, ]; export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/latest.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/latest.ts index 9e5be88051..eb82fb43c3 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/completion/latest.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/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[] = [ { @@ -15,7 +16,106 @@ const completion: ApidomCompletionItem[] = [ documentation: { kind: 'markdown', value: - 'List of [Destination Objects](https://github.com/asyncapi/bindings/tree/master/solace#example-with-two-destinations).', + 'List of [Destination Objects](https://github.com/asyncapi/bindings/tree/master/solace#destination-object).', + }, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, + { + label: 'timeToLive', + insertText: 'timeToLive', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer` | [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) | [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nInterval in milliseconds or a [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) containing the definition of the lifetime of the message.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, + { + label: 'timeToLive', + insertText: 'timeToLive', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer` | [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\\\nInterval in milliseconds or a [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) containing the definition of the lifetime of the message.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, + { + label: 'priority', + insertText: 'priority', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer` | [Schema Object](https://v2.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 valid priority value range is 0-255 with 0 as the lowest priority and 255 as the highest, or a [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) containing the definition of the priority.', + }, + targetSpecs: AsyncAPI2, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, + { + label: 'priority', + insertText: 'priority', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`integer` | [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 valid priority value range is 0-255 with 0 as the lowest priority and 255 as the highest, or a [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) containing the definition of the priority.', + }, + targetSpecs: AsyncAPI3, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, + { + label: 'dmqEligible', + insertText: 'dmqEligible', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`boolean`\n\\\n\\\nSet the message to be eligible to be moved to a Dead Message Queue. The default value is false.', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/documentation.ts index d1eeeb04a4..caeb255eb5 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/documentation.ts @@ -1,14 +1,45 @@ +import { AsyncAPI2, AsyncAPI3 } from '../../../target-specs.ts'; + const documentation = [ { target: 'destinations', - docs: 'List of [Destination Objects](https://github.com/asyncapi/bindings/tree/master/solace#example-with-two-destinations).', + docs: 'List of [Destination Objects](https://github.com/asyncapi/bindings/tree/master/solace#destination-object).', + }, + { + target: 'timeToLive', + docs: '`integer` | [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) | [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)\n\\\n\\\nInterval in milliseconds or a [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) containing the definition of the lifetime of the message.', + targetSpecs: AsyncAPI2, + }, + { + target: 'timeToLive', + docs: '`integer` | [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\\\nInterval in milliseconds or a [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) containing the definition of the lifetime of the message.', + targetSpecs: AsyncAPI3, + }, + { + target: 'priority', + docs: '`integer` | [Schema Object](https://v2.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 valid priority value range is 0-255 with 0 as the lowest priority and 255 as the highest, or a [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) containing the definition of the priority.', + targetSpecs: AsyncAPI2, + }, + { + target: 'priority', + docs: '`integer` | [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 valid priority value range is 0-255 with 0 as the lowest priority and 255 as the highest, or a [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) containing the definition of the priority.', + targetSpecs: AsyncAPI3, + }, + { + target: 'dmqEligible', + docs: '`boolean`\n\\\n\\\nSet the message to be eligible to be moved to a Dead Message Queue. The default value is false.', }, { target: 'bindingVersion', - docs: 'The current version is 0.2.0.', + docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.4.0" MUST be assumed.', + }, + { + docs: '#### [Operation Binding Object](https://github.com/asyncapi/bindings/tree/master/solace#operation-binding-object)\n\nWe need the ability to support several bindings for each operation, see the [Example](https://github.com/asyncapi/bindings/tree/master/solace#example) section below for details.\n\nField Name | Type | Description\n---|---|---\n`bindingVersion`|String|The version of this binding. If omitted, "0.4.0" MUST be assumed.\n`destinations`|List of [Destination Objects](https://github.com/asyncapi/bindings/tree/master/solace#destination-object)|Destination Objects are described next.\n`timeToLive`|Integer \\| [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)|Interval in milliseconds or a [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) containing the definition of the lifetime of the message.\n`priority`|Integer \\| [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) \\| [Reference Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#referenceObject)|The valid priority value range is 0-255 with 0 as the lowest priority and 255 as the highest, or a [Schema Object](https://v2.asyncapi.com/docs/reference/specification/v2.6.0#schemaObject) containing the definition of the priority.\n`dmqEligible`|Boolean|Set the message to be eligible to be moved to a Dead Message Queue. The default value is false.', + targetSpecs: AsyncAPI2, }, { - docs: '#### [Operation Binding Object](https://github.com/asyncapi/bindings/tree/master/solace#operation-binding-object)\n\nWe need the ability to support several bindings for each operation, see the [Example](https://github.com/asyncapi/bindings/tree/master/solace#example) section below for details.\n\nField Name | Type | Description\n---|---|---\n`bindingVersion`|String|The current version is 0.2.0\n`destinations`|List of Destination Objects|Destination Objects are described next.', + docs: '#### [Operation Binding Object](https://github.com/asyncapi/bindings/tree/master/solace#operation-binding-object)\n\nWe need the ability to support several bindings for each operation, see the [Example](https://github.com/asyncapi/bindings/tree/master/solace#example) section below for details.\n\nField Name | Type | Description\n---|---|---\n`bindingVersion`|String|The version of this binding. If omitted, "0.4.0" MUST be assumed.\n`destinations`|List of [Destination Objects](https://github.com/asyncapi/bindings/tree/master/solace#destination-object)|Destination Objects are described next.\n`timeToLive`|Integer \\| [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)|Interval in milliseconds or a [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) containing the definition of the lifetime of the message.\n`priority`|Integer \\| [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 valid priority value range is 0-255 with 0 as the lowest priority and 255 as the highest, or a [Schema Object](https://www.asyncapi.com/docs/reference/specification/v3.0.0#schemaObject) containing the definition of the priority.\n`dmqEligible`|Boolean|Set the message to be eligible to be moved to a Dead Message Queue. The default value is false.', + targetSpecs: AsyncAPI3, }, ]; export default documentation; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-3-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-3-0/allowed-fields.ts new file mode 100644 index 0000000000..f6d1fd4058 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-3-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: [['destinations', 'bindingVersion']], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-3-0/destinations--items-type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-3-0/destinations--items-type.ts new file mode 100644 index 0000000000..5575524a14 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-3-0/destinations--items-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 destinationsItemsTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_DESTINATIONS_TYPE, + source: 'apilint', + message: "'destinations' value must be a list of Destination Objects", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintArrayOfElementsOrClasses', + linterParams: [['object']], + marker: 'value', + target: 'destinations', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], +}; + +export default destinationsItemsTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-3-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-3-0/index.ts new file mode 100644 index 0000000000..e0a25625a1 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-3-0/index.ts @@ -0,0 +1,6 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import destinationsItemsTypeLint from './destinations--items-type.ts'; + +const lints = [allowedFieldsLint, destinationsItemsTypeLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/allowed-fields.ts new file mode 100644 index 0000000000..f7fd0e845d --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/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: [['destinations', 'timeToLive', 'priority', 'dmqEligible', '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/solace/operation-binding/lint/0-4-0/destinations--items-type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/destinations--items-type.ts new file mode 100644 index 0000000000..a825e41c1c --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/destinations--items-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 destinationsItemsTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_DESTINATIONS_TYPE, + source: 'apilint', + message: "'destinations' value must be a list of Destination Objects", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintArrayOfElementsOrClasses', + linterParams: [['object']], + marker: 'value', + target: 'destinations', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default destinationsItemsTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/dmq-eligible--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/dmq-eligible--type.ts new file mode 100644 index 0000000000..5832444f05 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/dmq-eligible--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 dmqEligibleTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_DMQ_ELIGIBLE_TYPE, + source: 'apilint', + message: "'dmqEligible' value must be a boolean", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['boolean'], + marker: 'value', + target: 'dmqEligible', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default dmqEligibleTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/index.ts new file mode 100644 index 0000000000..b1e66ad8e2 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/index.ts @@ -0,0 +1,15 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import destinationsItemsTypeLint from './destinations--items-type.ts'; +import timeToLiveTypeLint from './time-to-live--type.ts'; +import priorityTypeLint from './priority--type.ts'; +import dmqEligibleTypeLint from './dmq-eligible--type.ts'; + +const lints = [ + allowedFieldsLint, + destinationsItemsTypeLint, + timeToLiveTypeLint, + priorityTypeLint, + dmqEligibleTypeLint, +]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/priority--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/priority--type.ts new file mode 100644 index 0000000000..0ec8daa387 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/priority--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 priorityTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_PRIORITY_TYPE, + source: 'apilint', + message: "'priority' must be an integer or a Schema Object", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'number']], + marker: 'value', + target: 'priority', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default priorityTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/time-to-live--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/time-to-live--type.ts new file mode 100644 index 0000000000..528e8b240b --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/0-4-0/time-to-live--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 timeToLiveTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_TIME_TO_LIVE_TYPE, + source: 'apilint', + message: "'timeToLive' must be an integer or a Schema Object", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'number']], + marker: 'value', + target: 'timeToLive', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default timeToLiveTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/index.ts index 45e73af3d8..c59404024c 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/index.ts @@ -1,11 +1,15 @@ 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 operationBindingLatestLints from './latest/index.ts'; import bindingVersionTypeLint from './binding-version--type.ts'; const lints = [ ...operationBinding0_1_0Lints, ...operationBinding0_2_0Lints, + ...operationBinding0_3_0Lints, + ...operationBinding0_4_0Lints, ...operationBindingLatestLints, bindingVersionTypeLint, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/allowed-fields.ts index a7cd61aef3..6025fefdfb 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/allowed-fields.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-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: [['destinations', 'bindingVersion']], + linterParams: [['destinations', 'timeToLive', 'priority', 'dmqEligible', 'bindingVersion']], marker: 'key', conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/dmq-eligible--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/dmq-eligible--type.ts new file mode 100644 index 0000000000..be665ffe60 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/dmq-eligible--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 dmqEligibleTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_DMQ_ELIGIBLE_TYPE, + source: 'apilint', + message: "'dmqEligible' value must be a boolean", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['boolean'], + marker: 'value', + target: 'dmqEligible', + data: {}, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], +}; + +export default dmqEligibleTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/index.ts index e0a25625a1..b1e66ad8e2 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/index.ts @@ -1,6 +1,15 @@ import allowedFieldsLint from './allowed-fields.ts'; import destinationsItemsTypeLint from './destinations--items-type.ts'; +import timeToLiveTypeLint from './time-to-live--type.ts'; +import priorityTypeLint from './priority--type.ts'; +import dmqEligibleTypeLint from './dmq-eligible--type.ts'; -const lints = [allowedFieldsLint, destinationsItemsTypeLint]; +const lints = [ + allowedFieldsLint, + destinationsItemsTypeLint, + timeToLiveTypeLint, + priorityTypeLint, + dmqEligibleTypeLint, +]; export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/priority--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/priority--type.ts new file mode 100644 index 0000000000..85c3109885 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/priority--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 priorityTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_PRIORITY_TYPE, + source: 'apilint', + message: "'priority' must be an integer or a Schema Object", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'number']], + marker: 'value', + target: 'priority', + data: {}, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], +}; + +export default priorityTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/time-to-live--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/time-to-live--type.ts new file mode 100644 index 0000000000..9507d6e763 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/operation-binding/lint/latest/time-to-live--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 timeToLiveTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_TIME_TO_LIVE_TYPE, + source: 'apilint', + message: "'timeToLive' must be an integer or a Schema Object", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintElementOrClass', + linterParams: [['schema', 'number']], + marker: 'value', + target: 'timeToLive', + data: {}, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], +}; + +export default timeToLiveTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-1-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-1-0.ts index 8575d4e96f..5a1b64bd92 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-1-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-1-0.ts @@ -14,7 +14,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The Virtual Private Network name on the Solace broker.', + value: '`string`\n\\\n\\\nThe Virtual Private Network name on the Solace broker.', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-2-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-2-0.ts index 1d03a80115..477ff9e8df 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-2-0.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-2-0.ts @@ -14,7 +14,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The Virtual Private Network name on the Solace broker.', + value: '`string`\n\\\n\\\nThe Virtual Private Network name on the Solace broker.', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-3-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-3-0.ts new file mode 100644 index 0000000000..d108b10e54 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-3-0.ts @@ -0,0 +1,29 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'msgVpn', + insertText: 'msgVpn', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: '`string`\n\\\n\\\nThe Virtual Private Network name on the Solace broker.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-4-0.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-4-0.ts new file mode 100644 index 0000000000..435c3ef08f --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/0-4-0.ts @@ -0,0 +1,49 @@ +import { + ApidomCompletionItem, + CompletionFormat, + CompletionType, +} from '../../../../../../apidom-language-types.ts'; + +const completion: ApidomCompletionItem[] = [ + { + label: 'msgVpn', + insertText: 'msgVpn', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: '`string`\n\\\n\\\nThe Virtual Private Network name on the Solace broker.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, + { + label: 'clientName', + insertText: 'clientName', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nA unique client name to use to register to the appliance. If specified, it must be a valid Topic name, and a maximum of 160 bytes in length when encoded as UTF-8.', + }, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], + }, +]; + +export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/index.ts index 1d212e602b..1ef7c9cadf 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/index.ts @@ -1,5 +1,7 @@ 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 completionLatestItems from './latest.ts'; import { ApidomCompletionItem, @@ -10,6 +12,8 @@ import { const completion: ApidomCompletionItem[] = [ ...completion0_1_0Items, ...completion0_2_0Items, + ...completion0_3_0Items, + ...completion0_4_0Items, ...completionLatestItems, { label: 'bindingVersion', @@ -20,7 +24,7 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The current version is `0.2.0`', + value: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.4.0" MUST be assumed.', }, }, { @@ -41,6 +45,24 @@ const completion: ApidomCompletionItem[] = [ type: CompletionType.VALUE, insertTextFormat: 2, }, + { + target: 'bindingVersion', + label: '0.3.0', + insertText: '0.3.0', + kind: 12, + format: CompletionFormat.QUOTED_FORCED, + 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, + }, ]; export default completion; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/latest.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/latest.ts index 15e959de59..19afb707b5 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/latest.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/completion/latest.ts @@ -14,7 +14,26 @@ const completion: ApidomCompletionItem[] = [ insertTextFormat: 2, documentation: { kind: 'markdown', - value: 'The Virtual Private Network name on the Solace broker.', + value: '`string`\n\\\n\\\nThe Virtual Private Network name on the Solace broker.', + }, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], + }, + { + label: 'clientName', + insertText: 'clientName', + kind: 14, + format: CompletionFormat.QUOTED, + type: CompletionType.PROPERTY, + insertTextFormat: 2, + documentation: { + kind: 'markdown', + value: + '`string`\n\\\n\\\nA unique client name to use to register to the appliance. If specified, it must be a valid Topic name, and a maximum of 160 bytes in length when encoded as UTF-8.', }, conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/documentation.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/documentation.ts index a5bbbd7b23..28a6fa08b0 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/documentation.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/documentation.ts @@ -1,14 +1,18 @@ const documentation = [ { target: 'msgVpn', - docs: 'The Virtual Private Network name on the Solace broker.', + docs: '`string`\n\\\n\\\nThe Virtual Private Network name on the Solace broker.', + }, + { + target: 'clientName', + docs: '`string`\n\\\n\\\nA unique client name to use to register to the appliance. If specified, it must be a valid Topic name, and a maximum of 160 bytes in length when encoded as UTF-8.', }, { target: 'bindingVersion', - docs: 'The current version is 0.2.0.', + docs: '`string`\n\\\n\\\nThe version of this binding. If omitted, "0.4.0" MUST be assumed.', }, { - docs: '#### [Server Binding Object](https://github.com/asyncapi/bindings/tree/master/solace#server-binding-object)\n\nField Name | Type | Description\n---|---|---\n`bindingVersion`|String|The current version is 0.2.0\n`msgVpn`|String|The Virtual Private Network name on the Solace broker.', + docs: '#### [Server Binding Object](https://github.com/asyncapi/bindings/tree/master/solace#server-binding-object)\n\nField Name | Type | Description\n---|---|---\n`bindingVersion`|String|The version of this binding. If omitted, "0.4.0" MUST be assumed.\n`msgVpn`|String|The Virtual Private Network name on the Solace broker.\n`clientName`|String|A unique client name to use to register to the appliance. If specified, it must be a valid Topic name, and a maximum of 160 bytes in length when encoded as UTF-8.', }, ]; export default documentation; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-3-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-3-0/allowed-fields.ts new file mode 100644 index 0000000000..90329e0ca3 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-3-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: [['msgVpn', 'bindingVersion']], + marker: 'key', + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], +}; + +export default allowedFieldsLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-3-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-3-0/index.ts new file mode 100644 index 0000000000..8b9bbf4155 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-3-0/index.ts @@ -0,0 +1,6 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import msgVpnTypeLint from './msg-vpn--type.ts'; + +const lints = [allowedFieldsLint, msgVpnTypeLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-3-0/msg-vpn--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-3-0/msg-vpn--type.ts new file mode 100644 index 0000000000..7ae57026a9 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-3-0/msg-vpn--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 msgVpnTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_SERVER_BINDING_FIELD_MSG_VPN_TYPE, + source: 'apilint', + message: "'msgVpn' value must be a string", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'msgVpn', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.3.0']], + }, + ], +}; + +export default msgVpnTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/allowed-fields.ts new file mode 100644 index 0000000000..b36e232dac --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/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: [['msgVpn', 'clientName', '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/solace/server-binding/lint/0-4-0/client-name--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/client-name--type.ts new file mode 100644 index 0000000000..e7ceef5c5a --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/client-name--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 clientNameTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_SERVER_BINDING_FIELD_CLIENT_NAME_TYPE, + source: 'apilint', + message: "'clientName' value must be a string", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'clientName', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default clientNameTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/index.ts new file mode 100644 index 0000000000..7ec1621ff0 --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/index.ts @@ -0,0 +1,7 @@ +import allowedFieldsLint from './allowed-fields.ts'; +import msgVpnTypeLint from './msg-vpn--type.ts'; +import clientNameTypeLint from './client-name--type.ts'; + +const lints = [allowedFieldsLint, msgVpnTypeLint, clientNameTypeLint]; + +export default lints; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/msg-vpn--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/msg-vpn--type.ts new file mode 100644 index 0000000000..a5db91742a --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/0-4-0/msg-vpn--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 msgVpnTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_SERVER_BINDING_FIELD_MSG_VPN_TYPE, + source: 'apilint', + message: "'msgVpn' value must be a string", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'msgVpn', + data: {}, + conditions: [ + { + targets: [{ path: 'bindingVersion' }], + function: 'apilintValueOrArray', + params: [['0.4.0']], + }, + ], +}; + +export default msgVpnTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/index.ts index 382d4f7a15..c37192ccd3 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/index.ts @@ -1,11 +1,15 @@ 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 serverBindingLatestLints from './latest/index.ts'; import bindingVersionTypeLint from './binding-version--type.ts'; const lints = [ ...serverBinding0_1_0Lints, ...serverBinding0_2_0Lints, + ...serverBinding0_3_0Lints, + ...serverBinding0_4_0Lints, ...serverBindingLatestLints, bindingVersionTypeLint, ]; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/allowed-fields.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/allowed-fields.ts index c50ace126f..5a995f8bc1 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/allowed-fields.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-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: [['msgVpn', 'bindingVersion']], + linterParams: [['msgVpn', 'clientName', 'bindingVersion']], marker: 'key', conditions: [ { diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/client-name--type.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/client-name--type.ts new file mode 100644 index 0000000000..39fe4fb23d --- /dev/null +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/client-name--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 clientNameTypeLint: LinterMeta = { + code: ApilintCodes.ASYNCAPI2_SOLACE_SERVER_BINDING_FIELD_CLIENT_NAME_TYPE, + source: 'apilint', + message: "'clientName' value must be a string", + severity: DiagnosticSeverity.Error, + linterFunction: 'apilintType', + linterParams: ['string'], + marker: 'value', + target: 'clientName', + data: {}, + conditions: [ + { + function: 'missingField', + params: ['bindingVersion'], + }, + ], +}; + +export default clientNameTypeLint; diff --git a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/index.ts b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/index.ts index 8b9bbf4155..7ec1621ff0 100644 --- a/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/index.ts +++ b/packages/apidom-ls/src/config/asyncapi/bindings/solace/server-binding/lint/latest/index.ts @@ -1,6 +1,7 @@ import allowedFieldsLint from './allowed-fields.ts'; import msgVpnTypeLint from './msg-vpn--type.ts'; +import clientNameTypeLint from './client-name--type.ts'; -const lints = [allowedFieldsLint, msgVpnTypeLint]; +const lints = [allowedFieldsLint, msgVpnTypeLint, clientNameTypeLint]; export default lints; diff --git a/packages/apidom-ls/src/config/codes.ts b/packages/apidom-ls/src/config/codes.ts index e7617adbb9..e94960bae1 100644 --- a/packages/apidom-ls/src/config/codes.ts +++ b/packages/apidom-ls/src/config/codes.ts @@ -543,10 +543,14 @@ enum ApilintCodes { ASYNCAPI2_SOLACE_OPERATION_BINDING = 810000, ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_DESTINATIONS_TYPE = 810100, ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_BINDING_VERSION_TYPE = 810200, + ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_TIME_TO_LIVE_TYPE = 810300, + ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_PRIORITY_TYPE = 810400, + ASYNCAPI2_SOLACE_OPERATION_BINDING_FIELD_DMQ_ELIGIBLE_TYPE = 810500, ASYNCAPI2_SOLACE_SERVER_BINDING = 820000, ASYNCAPI2_SOLACE_SERVER_BINDING_FIELD_MSG_VPN_TYPE = 820100, ASYNCAPI2_SOLACE_SERVER_BINDING_FIELD_BINDING_VERSION_TYPE = 820200, + ASYNCAPI2_SOLACE_SERVER_BINDING_FIELD_CLIENT_NAME_TYPE = 820300, ASYNCAPI2_SQS_CHANNEL_BINDING = 830000, ASYNCAPI2_SQS_MESSAGE_BINDING = 840000, diff --git a/packages/apidom-ls/test/asyncapi-solace-bindings.ts b/packages/apidom-ls/test/asyncapi-solace-bindings.ts new file mode 100644 index 0000000000..450395ba47 --- /dev/null +++ b/packages/apidom-ls/test/asyncapi-solace-bindings.ts @@ -0,0 +1,803 @@ +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', + 'solace', +); + +describe('asyncapi solace 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(); + }); + + // Server binding - allowed fields + it('test solace server binding allowed fields (0.1.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-server-binding-allowed-fields-0-1-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-server-binding-allowed-fields-0-1-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test solace server binding allowed fields (0.2.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-server-binding-allowed-fields-0-2-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-server-binding-allowed-fields-0-2-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test solace server binding allowed fields (0.3.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-server-binding-allowed-fields-0-3-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-server-binding-allowed-fields-0-3-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test solace server binding allowed fields (0.4.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-server-binding-allowed-fields-0-4-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-server-binding-allowed-fields-0-4-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test solace server binding allowed fields (latest)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-server-binding-allowed-fields-latest.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-server-binding-allowed-fields-latest.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 9, character: 6 }, + end: { line: 9, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + // Server binding - field types + it("test solace server binding 'msgVpn' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-server-binding-msg-vpn-type.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-server-binding-msg-vpn-type.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 10, character: 16 }, + end: { line: 10, character: 19 }, + }, + message: "'msgVpn' value must be a string", + severity: 1, + code: 820100, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test solace server binding 'clientName' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-server-binding-client-name-type.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-server-binding-client-name-type.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 10, character: 20 }, + end: { line: 10, character: 23 }, + }, + message: "'clientName' value must be a string", + severity: 1, + code: 820300, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test solace server binding 'bindingVersion' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-server-binding-binding-version-type.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-server-binding-binding-version-type.yaml')) + .toString(), + ); + + 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: 820200, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + // Channel binding - allowed fields + it('test solace channel binding allowed fields (0.1.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-channel-binding-allowed-fields-0-1-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-channel-binding-allowed-fields-0-1-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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 solace channel binding allowed fields (0.2.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-channel-binding-allowed-fields-0-2-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-channel-binding-allowed-fields-0-2-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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 solace channel binding allowed fields (0.3.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-channel-binding-allowed-fields-0-3-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-channel-binding-allowed-fields-0-3-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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 solace channel binding allowed fields (0.4.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-channel-binding-allowed-fields-0-4-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-channel-binding-allowed-fields-0-4-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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 solace channel binding allowed fields (latest)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-channel-binding-allowed-fields-latest.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-channel-binding-allowed-fields-latest.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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); + }); + + // Message binding - allowed fields + it('test solace message binding allowed fields (0.1.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-message-binding-allowed-fields-0-1-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-message-binding-allowed-fields-0-1-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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 solace message binding allowed fields (0.2.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-message-binding-allowed-fields-0-2-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-message-binding-allowed-fields-0-2-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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 solace message binding allowed fields (0.3.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-message-binding-allowed-fields-0-3-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-message-binding-allowed-fields-0-3-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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 solace message binding allowed fields (0.4.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-message-binding-allowed-fields-0-4-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-message-binding-allowed-fields-0-4-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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 solace message binding allowed fields (latest)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-message-binding-allowed-fields-latest.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-message-binding-allowed-fields-latest.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + 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); + }); + + // Operation binding - allowed fields + it('test solace operation binding allowed fields (0.1.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-allowed-fields-0-1-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-operation-binding-allowed-fields-0-1-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test solace operation binding allowed fields (0.2.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-allowed-fields-0-2-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-operation-binding-allowed-fields-0-2-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test solace operation binding allowed fields (0.3.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-allowed-fields-0-3-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-operation-binding-allowed-fields-0-3-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test solace operation binding allowed fields (0.4.0)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-allowed-fields-0-4-0.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-operation-binding-allowed-fields-0-4-0.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + it('test solace operation binding allowed fields (latest)', async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-allowed-fields-latest.yaml', + 'yaml', + 0, + fs + .readFileSync( + path.join(bindingsPath, 'solace-operation-binding-allowed-fields-latest.yaml'), + ) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 7, character: 6 }, + end: { line: 7, character: 12 }, + }, + message: 'Object includes not allowed fields', + severity: 1, + code: 15000, + source: 'apilint', + }, + ]; + assert.deepEqual(result, expected); + }); + + // Operation binding - field types + it("test solace operation binding 'destinations' items type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-destinations-items-type.yaml', + 'yaml', + 0, + fs + .readFileSync( + path.join(bindingsPath, 'solace-operation-binding-destinations-items-type.yaml'), + ) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 22 }, + end: { line: 8, character: 31 }, + }, + message: "'destinations' value must be a list of Destination Objects", + severity: 1, + code: 810100, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test solace operation binding 'timeToLive' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-time-to-live-type.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-operation-binding-time-to-live-type.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 20 }, + end: { line: 8, character: 29 }, + }, + message: "'timeToLive' must be an integer or a Schema Object", + severity: 1, + code: 810300, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test solace operation binding 'priority' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-priority-type.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-operation-binding-priority-type.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 18 }, + end: { line: 8, character: 27 }, + }, + message: "'priority' must be an integer or a Schema Object", + severity: 1, + code: 810400, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test solace operation binding 'dmqEligible' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-dmq-eligible-type.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-operation-binding-dmq-eligible-type.yaml')) + .toString(), + ); + + const result = await languageService.doValidation(doc, validationContext); + const expected: Diagnostic[] = [ + { + range: { + start: { line: 8, character: 21 }, + end: { line: 8, character: 30 }, + }, + message: "'dmqEligible' value must be a boolean", + severity: 1, + code: 810500, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); + + it("test solace operation binding 'bindingVersion' type", async function () { + const doc: TextDocument = TextDocument.create( + 'foo://bar/solace-operation-binding-binding-version-type.yaml', + 'yaml', + 0, + fs + .readFileSync(path.join(bindingsPath, 'solace-operation-binding-binding-version-type.yaml')) + .toString(), + ); + + 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: 810200, + source: 'apilint', + data: {}, + }, + ]; + assert.deepEqual(result, expected); + }); +}); diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-0-1-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-0-1-0.yaml new file mode 100644 index 0000000000..01b4dd2586 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.1.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-0-2-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-0-2-0.yaml new file mode 100644 index 0000000000..17e1c49a5e --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.2.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-0-3-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-0-3-0.yaml new file mode 100644 index 0000000000..cf47056b5c --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.3.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-0-4-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-0-4-0.yaml new file mode 100644 index 0000000000..3a55fb711d --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-latest.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-channel-binding-allowed-fields-latest.yaml new file mode 100644 index 0000000000..bbcbbc1240 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-0-1-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-0-1-0.yaml new file mode 100644 index 0000000000..22a75f3132 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.1.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-0-2-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-0-2-0.yaml new file mode 100644 index 0000000000..9b30b99fdd --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.2.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-0-3-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-0-3-0.yaml new file mode 100644 index 0000000000..6698f8fa64 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.3.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-0-4-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-0-4-0.yaml new file mode 100644 index 0000000000..98cc2bb173 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-latest.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-message-binding-allowed-fields-latest.yaml new file mode 100644 index 0000000000..ca65301c50 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-0-1-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-0-1-0.yaml new file mode 100644 index 0000000000..07421aa016 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.1.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-0-2-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-0-2-0.yaml new file mode 100644 index 0000000000..3b29081e08 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.2.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-0-3-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-0-3-0.yaml new file mode 100644 index 0000000000..910f329f4c --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.3.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-0-4-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-0-4-0.yaml new file mode 100644 index 0000000000..9d132c10c9 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-latest.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-allowed-fields-latest.yaml new file mode 100644 index 0000000000..94a44c636e --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + foo: bar diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-binding-version-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-binding-version-type.yaml new file mode 100644 index 0000000000..11e891b564 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: + solace: + bindingVersion: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-destinations-items-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-destinations-items-type.yaml new file mode 100644 index 0000000000..adab73922f --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-destinations-items-type.yaml @@ -0,0 +1,9 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + solace: + destinations: 'invalid' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-dmq-eligible-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-dmq-eligible-type.yaml new file mode 100644 index 0000000000..4f23136350 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-dmq-eligible-type.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + solace: + dmqEligible: 'invalid' + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-priority-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-priority-type.yaml new file mode 100644 index 0000000000..dd54ea6c9a --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-priority-type.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + solace: + priority: 'invalid' + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-time-to-live-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-time-to-live-type.yaml new file mode 100644 index 0000000000..55a5573d89 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-operation-binding-time-to-live-type.yaml @@ -0,0 +1,10 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +components: + operationBindings: + bindings1: + solace: + timeToLive: 'invalid' + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-0-1-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-0-1-0.yaml new file mode 100644 index 0000000000..c2b8dab4c2 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: http + bindings: + solace: + foo: bar + bindingVersion: '0.1.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-0-2-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-0-2-0.yaml new file mode 100644 index 0000000000..76719eb498 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: http + bindings: + solace: + foo: bar + bindingVersion: '0.2.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-0-3-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-0-3-0.yaml new file mode 100644 index 0000000000..1b2667a769 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: http + bindings: + solace: + foo: bar + bindingVersion: '0.3.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-0-4-0.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-0-4-0.yaml new file mode 100644 index 0000000000..ac30a163c9 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: http + bindings: + solace: + foo: bar + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-latest.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-allowed-fields-latest.yaml new file mode 100644 index 0000000000..9acc11d029 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: http + bindings: + solace: + foo: bar diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-binding-version-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-binding-version-type.yaml new file mode 100644 index 0000000000..7ad8484e68 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-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: http + bindings: + solace: + bindingVersion: 123 diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-client-name-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-client-name-type.yaml new file mode 100644 index 0000000000..857b81cb84 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-client-name-type.yaml @@ -0,0 +1,12 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: http + bindings: + solace: + clientName: 123 + bindingVersion: '0.4.0' diff --git a/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-msg-vpn-type.yaml b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-msg-vpn-type.yaml new file mode 100644 index 0000000000..349eb87480 --- /dev/null +++ b/packages/apidom-ls/test/fixtures/validation/asyncapi/bindings/solace/solace-server-binding-msg-vpn-type.yaml @@ -0,0 +1,11 @@ +asyncapi: 3.0.0 +info: + title: Sample AsyncAPI + version: '1.0.0' +servers: + server1: + host: example.com + protocol: http + bindings: + solace: + msgVpn: 123 diff --git a/packages/apidom-ns-asyncapi-2/src/elements/bindings/solace/SolaceOperationBinding.ts b/packages/apidom-ns-asyncapi-2/src/elements/bindings/solace/SolaceOperationBinding.ts index e1066fae6b..56c0d03c69 100644 --- a/packages/apidom-ns-asyncapi-2/src/elements/bindings/solace/SolaceOperationBinding.ts +++ b/packages/apidom-ns-asyncapi-2/src/elements/bindings/solace/SolaceOperationBinding.ts @@ -1,11 +1,16 @@ import { ObjectElement, ArrayElement, + BooleanElement, + NumberElement, StringElement, Attributes, Meta, } from '@swagger-api/apidom-core'; +import SchemaElement from '../../Schema.ts'; +import ReferenceElement from '../../Reference.ts'; + /** * @public */ @@ -31,6 +36,30 @@ class SolaceOperationBinding extends ObjectElement { set destinations(destinations: ArrayElement | undefined) { this.set('destinations', destinations); } + + get timeToLive(): NumberElement | SchemaElement | ReferenceElement | undefined { + return this.get('timeToLive'); + } + + set timeToLive(timeToLive: NumberElement | SchemaElement | ReferenceElement | undefined) { + this.set('timeToLive', timeToLive); + } + + get priority(): NumberElement | SchemaElement | ReferenceElement | undefined { + return this.get('priority'); + } + + set priority(priority: NumberElement | SchemaElement | ReferenceElement | undefined) { + this.set('priority', priority); + } + + get dmqEligible(): BooleanElement | undefined { + return this.get('dmqEligible'); + } + + set dmqEligible(dmqEligible: BooleanElement | undefined) { + this.set('dmqEligible', dmqEligible); + } } export default SolaceOperationBinding; diff --git a/packages/apidom-ns-asyncapi-2/src/elements/bindings/solace/SolaceServerBinding.ts b/packages/apidom-ns-asyncapi-2/src/elements/bindings/solace/SolaceServerBinding.ts index b170fcf06b..8aa0016a00 100644 --- a/packages/apidom-ns-asyncapi-2/src/elements/bindings/solace/SolaceServerBinding.ts +++ b/packages/apidom-ns-asyncapi-2/src/elements/bindings/solace/SolaceServerBinding.ts @@ -25,6 +25,14 @@ class SolaceServerBinding extends ObjectElement { set msgVpn(msgVpn: StringElement | undefined) { this.set('msgVpn', msgVpn); } + + get clientName(): StringElement | undefined { + return this.get('clientName'); + } + + set clientName(clientName: StringElement | undefined) { + this.set('clientName', clientName); + } } export default SolaceServerBinding; 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..165d59bbec 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 @@ -861,6 +861,12 @@ const schema = { destinations(...args: any[]) { return new ArrayElement(...args); }, + timeToLive(...args: Record[]) { + return new SchemaElement(...args); + }, + priority(...args: Record[]) { + return new SchemaElement(...args); + }, }, GooglepubsubChannelBindingElement: { labels(...args: any[]) { diff --git a/packages/apidom-ns-asyncapi-2/src/refractor/specification.ts b/packages/apidom-ns-asyncapi-2/src/refractor/specification.ts index 34fcfdd6ef..32320daaa5 100644 --- a/packages/apidom-ns-asyncapi-2/src/refractor/specification.ts +++ b/packages/apidom-ns-asyncapi-2/src/refractor/specification.ts @@ -1215,6 +1215,9 @@ const specification = { msgVpn: { $ref: '#/visitors/value', }, + clientName: { + $ref: '#/visitors/value', + }, }, }, ChannelBinding: { @@ -1229,6 +1232,11 @@ const specification = { destinations: { $ref: '#/visitors/value', }, + timeToLive: SchemaOrReferenceVisitor, + priority: SchemaOrReferenceVisitor, + dmqEligible: { + $ref: '#/visitors/value', + }, }, }, MessageBinding: { diff --git a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceOperationBinding/__snapshots__/index.ts.snap b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceOperationBinding/__snapshots__/index.ts.snap index ee3ad06807..d8678b8014 100644 --- a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceOperationBinding/__snapshots__/index.ts.snap +++ b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceOperationBinding/__snapshots__/index.ts.snap @@ -1,5 +1,51 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`refractor elements SolaceOperationBindingElement given timeToLive and priority fields of type ReferenceElement should refract to semantic ApiDOM tree 1`] = ` +(SolaceOperationBindingElement + (MemberElement + (StringElement) + (StringElement)) + (MemberElement + (StringElement) + (ArrayElement + (ObjectElement))) + (MemberElement + (StringElement) + (ReferenceElement + (MemberElement + (StringElement) + (StringElement)))) + (MemberElement + (StringElement) + (ReferenceElement + (MemberElement + (StringElement) + (StringElement)))) + (MemberElement + (StringElement) + (BooleanElement))) +`; + +exports[`refractor elements SolaceOperationBindingElement given timeToLive and priority fields of type SchemaElement should refract to semantic ApiDOM tree 1`] = ` +(SolaceOperationBindingElement + (MemberElement + (StringElement) + (StringElement)) + (MemberElement + (StringElement) + (ArrayElement + (ObjectElement))) + (MemberElement + (StringElement) + (SchemaElement)) + (MemberElement + (StringElement) + (SchemaElement)) + (MemberElement + (StringElement) + (BooleanElement))) +`; + exports[`refractor elements SolaceOperationBindingElement should refract to semantic ApiDOM tree 1`] = ` (SolaceOperationBindingElement (MemberElement @@ -8,5 +54,14 @@ exports[`refractor elements SolaceOperationBindingElement should refract to sema (MemberElement (StringElement) (ArrayElement - (ObjectElement)))) + (ObjectElement))) + (MemberElement + (StringElement) + (NumberElement)) + (MemberElement + (StringElement) + (NumberElement)) + (MemberElement + (StringElement) + (BooleanElement))) `; diff --git a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceOperationBinding/index.ts b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceOperationBinding/index.ts index 40623f719c..f59d13627f 100644 --- a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceOperationBinding/index.ts +++ b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceOperationBinding/index.ts @@ -8,12 +8,47 @@ describe('refractor', function () { context('SolaceOperationBindingElement', function () { specify('should refract to semantic ApiDOM tree', function () { const solaceOperationBindingElement = SolaceOperationBindingElement.refract({ - bindingVersion: '0.2.0', + bindingVersion: '0.4.0', destinations: [{}], + timeToLive: 1000, + priority: 100, + dmqEligible: true, }); expect(sexprs(solaceOperationBindingElement)).toMatchSnapshot(); }); + + context('given timeToLive and priority fields of type SchemaElement', function () { + specify('should refract to semantic ApiDOM tree', function () { + const solaceOperationBindingElement = SolaceOperationBindingElement.refract({ + bindingVersion: '0.4.0', + destinations: [{}], + timeToLive: {}, + priority: {}, + dmqEligible: true, + }); + + expect(sexprs(solaceOperationBindingElement)).toMatchSnapshot(); + }); + }); + + context('given timeToLive and priority fields of type ReferenceElement', function () { + specify('should refract to semantic ApiDOM tree', function () { + const solaceOperationBindingElement = SolaceOperationBindingElement.refract({ + bindingVersion: '0.4.0', + destinations: [{}], + timeToLive: { + $ref: '#/pointer', + }, + priority: { + $ref: '#/pointer', + }, + dmqEligible: true, + }); + + expect(sexprs(solaceOperationBindingElement)).toMatchSnapshot(); + }); + }); }); }); }); diff --git a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceServerBinding/__snapshots__/index.ts.snap b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceServerBinding/__snapshots__/index.ts.snap index 8f49a62a2c..cab7f6b129 100644 --- a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceServerBinding/__snapshots__/index.ts.snap +++ b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceServerBinding/__snapshots__/index.ts.snap @@ -5,6 +5,9 @@ exports[`refractor elements SolaceServerBindingElement should refract to semanti (MemberElement (StringElement) (StringElement)) + (MemberElement + (StringElement) + (StringElement)) (MemberElement (StringElement) (StringElement))) diff --git a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceServerBinding/index.ts b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceServerBinding/index.ts index 38ea333e13..72ce229e2d 100644 --- a/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceServerBinding/index.ts +++ b/packages/apidom-ns-asyncapi-2/test/refractor/elements/bindings/solace/SolaceServerBinding/index.ts @@ -8,8 +8,9 @@ describe('refractor', function () { context('SolaceServerBindingElement', function () { specify('should refract to semantic ApiDOM tree', function () { const solaceServerBindingElement = SolaceServerBindingElement.refract({ - bindingVersion: '0.2.0', + bindingVersion: '0.4.0', msgVpn: 'network1', + clientName: 'my-client', }); expect(sexprs(solaceServerBindingElement)).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..27afc5487f 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 @@ -956,6 +956,12 @@ const schema: Record = { destinations(...args: ConstructorParameters) { return new ArrayElement(...args); }, + timeToLive(...args: Record[]) { + return new SchemaElement(...args); + }, + priority(...args: Record[]) { + return new SchemaElement(...args); + }, }, GooglepubsubChannelBindingElement: { diff --git a/packages/apidom-ns-asyncapi-3/src/refractor/specification.ts b/packages/apidom-ns-asyncapi-3/src/refractor/specification.ts index 9aa4a275f1..cbcee34fc5 100644 --- a/packages/apidom-ns-asyncapi-3/src/refractor/specification.ts +++ b/packages/apidom-ns-asyncapi-3/src/refractor/specification.ts @@ -1273,6 +1273,9 @@ const specification = { msgVpn: { $ref: '#/visitors/value', }, + clientName: { + $ref: '#/visitors/value', + }, }, }, ChannelBinding: { @@ -1287,6 +1290,11 @@ const specification = { destinations: { $ref: '#/visitors/value', }, + timeToLive: SchemaOrReferenceVisitor, + priority: SchemaOrReferenceVisitor, + dmqEligible: { + $ref: '#/visitors/value', + }, }, }, MessageBinding: { diff --git a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceOperationBinding/__snapshots__/index.ts.snap b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceOperationBinding/__snapshots__/index.ts.snap index ee3ad06807..d8678b8014 100644 --- a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceOperationBinding/__snapshots__/index.ts.snap +++ b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceOperationBinding/__snapshots__/index.ts.snap @@ -1,5 +1,51 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`refractor elements SolaceOperationBindingElement given timeToLive and priority fields of type ReferenceElement should refract to semantic ApiDOM tree 1`] = ` +(SolaceOperationBindingElement + (MemberElement + (StringElement) + (StringElement)) + (MemberElement + (StringElement) + (ArrayElement + (ObjectElement))) + (MemberElement + (StringElement) + (ReferenceElement + (MemberElement + (StringElement) + (StringElement)))) + (MemberElement + (StringElement) + (ReferenceElement + (MemberElement + (StringElement) + (StringElement)))) + (MemberElement + (StringElement) + (BooleanElement))) +`; + +exports[`refractor elements SolaceOperationBindingElement given timeToLive and priority fields of type SchemaElement should refract to semantic ApiDOM tree 1`] = ` +(SolaceOperationBindingElement + (MemberElement + (StringElement) + (StringElement)) + (MemberElement + (StringElement) + (ArrayElement + (ObjectElement))) + (MemberElement + (StringElement) + (SchemaElement)) + (MemberElement + (StringElement) + (SchemaElement)) + (MemberElement + (StringElement) + (BooleanElement))) +`; + exports[`refractor elements SolaceOperationBindingElement should refract to semantic ApiDOM tree 1`] = ` (SolaceOperationBindingElement (MemberElement @@ -8,5 +54,14 @@ exports[`refractor elements SolaceOperationBindingElement should refract to sema (MemberElement (StringElement) (ArrayElement - (ObjectElement)))) + (ObjectElement))) + (MemberElement + (StringElement) + (NumberElement)) + (MemberElement + (StringElement) + (NumberElement)) + (MemberElement + (StringElement) + (BooleanElement))) `; diff --git a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceOperationBinding/index.ts b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceOperationBinding/index.ts index 40623f719c..f59d13627f 100644 --- a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceOperationBinding/index.ts +++ b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceOperationBinding/index.ts @@ -8,12 +8,47 @@ describe('refractor', function () { context('SolaceOperationBindingElement', function () { specify('should refract to semantic ApiDOM tree', function () { const solaceOperationBindingElement = SolaceOperationBindingElement.refract({ - bindingVersion: '0.2.0', + bindingVersion: '0.4.0', destinations: [{}], + timeToLive: 1000, + priority: 100, + dmqEligible: true, }); expect(sexprs(solaceOperationBindingElement)).toMatchSnapshot(); }); + + context('given timeToLive and priority fields of type SchemaElement', function () { + specify('should refract to semantic ApiDOM tree', function () { + const solaceOperationBindingElement = SolaceOperationBindingElement.refract({ + bindingVersion: '0.4.0', + destinations: [{}], + timeToLive: {}, + priority: {}, + dmqEligible: true, + }); + + expect(sexprs(solaceOperationBindingElement)).toMatchSnapshot(); + }); + }); + + context('given timeToLive and priority fields of type ReferenceElement', function () { + specify('should refract to semantic ApiDOM tree', function () { + const solaceOperationBindingElement = SolaceOperationBindingElement.refract({ + bindingVersion: '0.4.0', + destinations: [{}], + timeToLive: { + $ref: '#/pointer', + }, + priority: { + $ref: '#/pointer', + }, + dmqEligible: true, + }); + + expect(sexprs(solaceOperationBindingElement)).toMatchSnapshot(); + }); + }); }); }); }); diff --git a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceServerBinding/__snapshots__/index.ts.snap b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceServerBinding/__snapshots__/index.ts.snap index 8f49a62a2c..cab7f6b129 100644 --- a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceServerBinding/__snapshots__/index.ts.snap +++ b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceServerBinding/__snapshots__/index.ts.snap @@ -5,6 +5,9 @@ exports[`refractor elements SolaceServerBindingElement should refract to semanti (MemberElement (StringElement) (StringElement)) + (MemberElement + (StringElement) + (StringElement)) (MemberElement (StringElement) (StringElement))) diff --git a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceServerBinding/index.ts b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceServerBinding/index.ts index 38ea333e13..72ce229e2d 100644 --- a/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceServerBinding/index.ts +++ b/packages/apidom-ns-asyncapi-3/test/refractor/elements/bindings/solace/SolaceServerBinding/index.ts @@ -8,8 +8,9 @@ describe('refractor', function () { context('SolaceServerBindingElement', function () { specify('should refract to semantic ApiDOM tree', function () { const solaceServerBindingElement = SolaceServerBindingElement.refract({ - bindingVersion: '0.2.0', + bindingVersion: '0.4.0', msgVpn: 'network1', + clientName: 'my-client', }); expect(sexprs(solaceServerBindingElement)).toMatchSnapshot();