@tertiumorganum/typespec-amqp-ws 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +291 -0
  3. package/dist/src/amqp/builder.d.ts +4 -0
  4. package/dist/src/amqp/builder.d.ts.map +1 -0
  5. package/dist/src/amqp/builder.js +121 -0
  6. package/dist/src/amqp/builder.js.map +1 -0
  7. package/dist/src/amqp/decorators.d.ts +32 -0
  8. package/dist/src/amqp/decorators.d.ts.map +1 -0
  9. package/dist/src/amqp/decorators.js +38 -0
  10. package/dist/src/amqp/decorators.js.map +1 -0
  11. package/dist/src/amqp/index.d.ts +5 -0
  12. package/dist/src/amqp/index.d.ts.map +1 -0
  13. package/dist/src/amqp/index.js +7 -0
  14. package/dist/src/amqp/index.js.map +1 -0
  15. package/dist/src/index.d.ts +3 -0
  16. package/dist/src/index.d.ts.map +1 -0
  17. package/dist/src/index.js +5 -0
  18. package/dist/src/index.js.map +1 -0
  19. package/dist/src/shared/asyncapi-emitter.d.ts +5 -0
  20. package/dist/src/shared/asyncapi-emitter.d.ts.map +1 -0
  21. package/dist/src/shared/asyncapi-emitter.js +70 -0
  22. package/dist/src/shared/asyncapi-emitter.js.map +1 -0
  23. package/dist/src/shared/decorators-service.d.ts +33 -0
  24. package/dist/src/shared/decorators-service.d.ts.map +1 -0
  25. package/dist/src/shared/decorators-service.js +13 -0
  26. package/dist/src/shared/decorators-service.js.map +1 -0
  27. package/dist/src/shared/document.d.ts +134 -0
  28. package/dist/src/shared/document.d.ts.map +1 -0
  29. package/dist/src/shared/document.js +4 -0
  30. package/dist/src/shared/document.js.map +1 -0
  31. package/dist/src/shared/lib.d.ts +250 -0
  32. package/dist/src/shared/lib.d.ts.map +1 -0
  33. package/dist/src/shared/lib.js +108 -0
  34. package/dist/src/shared/lib.js.map +1 -0
  35. package/dist/src/shared/options.d.ts +8 -0
  36. package/dist/src/shared/options.d.ts.map +1 -0
  37. package/dist/src/shared/options.js +25 -0
  38. package/dist/src/shared/options.js.map +1 -0
  39. package/dist/src/shared/schema-emitter.d.ts +34 -0
  40. package/dist/src/shared/schema-emitter.d.ts.map +1 -0
  41. package/dist/src/shared/schema-emitter.js +351 -0
  42. package/dist/src/shared/schema-emitter.js.map +1 -0
  43. package/dist/src/shared/state.d.ts +13 -0
  44. package/dist/src/shared/state.d.ts.map +1 -0
  45. package/dist/src/shared/state.js +14 -0
  46. package/dist/src/shared/state.js.map +1 -0
  47. package/dist/src/shared/yaml-writer.d.ts +7 -0
  48. package/dist/src/shared/yaml-writer.d.ts.map +1 -0
  49. package/dist/src/shared/yaml-writer.js +8 -0
  50. package/dist/src/shared/yaml-writer.js.map +1 -0
  51. package/dist/src/testing.d.ts +2 -0
  52. package/dist/src/testing.d.ts.map +1 -0
  53. package/dist/src/testing.js +6 -0
  54. package/dist/src/testing.js.map +1 -0
  55. package/dist/src/ws/builder.d.ts +4 -0
  56. package/dist/src/ws/builder.d.ts.map +1 -0
  57. package/dist/src/ws/builder.js +94 -0
  58. package/dist/src/ws/builder.js.map +1 -0
  59. package/dist/src/ws/decorators.d.ts +12 -0
  60. package/dist/src/ws/decorators.d.ts.map +1 -0
  61. package/dist/src/ws/decorators.js +18 -0
  62. package/dist/src/ws/decorators.js.map +1 -0
  63. package/dist/src/ws/index.d.ts +5 -0
  64. package/dist/src/ws/index.d.ts.map +1 -0
  65. package/dist/src/ws/index.js +7 -0
  66. package/dist/src/ws/index.js.map +1 -0
  67. package/lib/amqp.tsp +83 -0
  68. package/lib/main.tsp +65 -0
  69. package/lib/ws.tsp +42 -0
  70. package/package.json +57 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 typespec-amqp-ws contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,291 @@
1
+ # @tertiumorganum/typespec-amqp-ws
2
+
3
+ TypeSpec-эмиттер для генерации **AsyncAPI 3.0** спецификаций из лаконичных TypeSpec-описаний. Поддерживает два транспорта:
4
+
5
+ - **AMQP** (RabbitMQ): publish в exchange, consume из queue, типы exchange `direct` и `fanout`.
6
+ - **WebSocket**: единый канал `/`, дискриминатор сообщений через literal-типы, request/reply, бинарные сообщения.
7
+
8
+ Эмиттер сознательно **ограничен** — поддерживает только то подмножество AsyncAPI, которое реально применяется на практике в типичных микросервисах с RabbitMQ и WebSocket. Это упрощает реализацию, валидацию и сопровождение.
9
+
10
+ ## Установка
11
+
12
+ ```bash
13
+ npm install -D @tertiumorganum/typespec-amqp-ws @typespec/compiler @typespec/asset-emitter
14
+ ```
15
+
16
+ Требования: Node.js 22+.
17
+
18
+ ## Конфигурация
19
+
20
+ В `tspconfig.yaml` сервиса выбирается один из двух emit-таргетов:
21
+
22
+ ```yaml
23
+ # Для сервиса с AMQP/RabbitMQ:
24
+ emit:
25
+ - "@tertiumorganum/typespec-amqp-ws/amqp"
26
+ options:
27
+ "@tertiumorganum/typespec-amqp-ws/amqp":
28
+ file-type: yaml # yaml | json. Default: yaml
29
+ output-file: "asyncapi.yaml"
30
+ new-line: "lf" # lf | crlf. Default: lf
31
+ output-dir: "{project-root}/tsp-output"
32
+ ```
33
+
34
+ ```yaml
35
+ # Для сервиса с WebSocket-API:
36
+ emit:
37
+ - "@tertiumorganum/typespec-amqp-ws/ws"
38
+ output-dir: "{project-root}/tsp-output"
39
+ ```
40
+
41
+ Запуск:
42
+
43
+ ```bash
44
+ tsp compile .
45
+ ```
46
+
47
+ Полученный `asyncapi.yaml` можно скармливать `@asyncapi/cli` для генерации моделей на Go/TypeScript и `@redocly/cli` для документации.
48
+
49
+ ## Полный AMQP-пример
50
+
51
+ ```typespec
52
+ import "@tertiumorganum/typespec-amqp-ws";
53
+
54
+ using TspAsyncApi;
55
+ using TspAsyncApi.Amqp;
56
+
57
+ @service(#{ title: "Notifications Service" })
58
+ @info(#{
59
+ version: "1.0.0",
60
+ description: "Сервис рассылки уведомлений через RabbitMQ",
61
+ })
62
+ @server("rabbit", #{
63
+ host: "rabbit.example.com:5672",
64
+ pathname: "/notifications",
65
+ protocol: "amqp",
66
+ description: "RabbitMQ-сервер",
67
+ })
68
+ namespace Notifications;
69
+
70
+ @doc("Уведомление пользователю")
71
+ model Notification {
72
+ @doc("Идентификатор уведомления")
73
+ notificationId: string;
74
+
75
+ @doc("Текст уведомления")
76
+ text: string;
77
+ }
78
+
79
+ // PUBLISH: один декоратор содержит всё — routing key, exchange, тип.
80
+ @publish(#{
81
+ routingKey: "notifications.created",
82
+ exchange: #{
83
+ name: "notifications-exchange",
84
+ type: "direct",
85
+ durable: true,
86
+ },
87
+ })
88
+ @summary("Опубликовать новое уведомление")
89
+ op sendNotification(): Notification;
90
+
91
+ // CONSUME: чтение из именованной очереди, биндинг по routing key.
92
+ @consume(#{
93
+ routingKey: "notifications.acknowledge",
94
+ queue: #{
95
+ name: "notifications-ack-queue",
96
+ durable: true,
97
+ autoDelete: false,
98
+ },
99
+ })
100
+ @summary("Обработать подтверждение доставки")
101
+ op handleAck(): Notification;
102
+ ```
103
+
104
+ Результат компиляции — валидный AsyncAPI 3.0 YAML с двумя каналами, операциями и AMQP-биндингами.
105
+
106
+ ## Полный WebSocket-пример
107
+
108
+ ```typespec
109
+ import "@tertiumorganum/typespec-amqp-ws";
110
+
111
+ using TspAsyncApi;
112
+ using TspAsyncApi.WebSocket;
113
+
114
+ @service(#{ title: "Chat WS" })
115
+ @info(#{ version: "1.0.0" })
116
+ @server("public", #{
117
+ host: "localhost:{port}",
118
+ protocol: "ws",
119
+ pathname: "/chat",
120
+ variables: #{
121
+ port: #{ `default`: "8080", description: "Порт WS-сервера" },
122
+ },
123
+ })
124
+ namespace Chat;
125
+
126
+ // Дискриминатор сообщения — обычное поле литерального типа.
127
+ // Эмиттер выведет { type: "string", const: "userJoined" } в JSON Schema.
128
+ model UserJoined {
129
+ eventType: "userJoined";
130
+ msgUid: string;
131
+ userId: string;
132
+ nickname: string;
133
+ }
134
+
135
+ model SendMessage {
136
+ eventType: "sendMessage";
137
+ msgUid: string;
138
+ text: string;
139
+ }
140
+
141
+ model SendMessageResponse {
142
+ eventType: "sendMessageResponse";
143
+ msgUid: string;
144
+ ok: boolean;
145
+ }
146
+
147
+ // Receive: сервер получает сообщение от клиента
148
+ @consume
149
+ @summary("Пользователь подключился к чату")
150
+ op userJoined(): UserJoined;
151
+
152
+ // Send + reply: request/reply pattern
153
+ @publish
154
+ @reply(SendMessageResponse)
155
+ @summary("Отправить сообщение в чат")
156
+ op sendMessage(): SendMessage;
157
+ ```
158
+
159
+ Все WebSocket-операции автоматически складываются на единый канал `/`. Это типичный паттерн WebSocket-API, где дискриминация сообщений происходит через literal-поле модели (например, `eventType`).
160
+
161
+ ## Поддерживаемые TypeSpec-типы
162
+
163
+ | TypeSpec | JSON Schema | Кодген (Go / TS / C++) |
164
+ |---|---|---|
165
+ | `string` | `{ type: string }` | `string` / `string` / `std::string` |
166
+ | `boolean` | `{ type: boolean }` | `bool` / `boolean` / `bool` |
167
+ | `integer` | `{ type: integer }` | `int32` / `number` / `int` |
168
+ | `bytes` | `{ type: string, format: binary }` | `[]byte` / `Uint8Array` / `std::vector<uint8_t>` |
169
+ | `enum X { A, B }` | `{ type: string, enum: [A, B] }` | string-typedef |
170
+ | `scalar X extends string` | именованная схема `{ type: string }` | string-typedef |
171
+ | `model X { ... }` | `{ type: object, properties, required, additionalProperties: false }` | struct/interface |
172
+ | `T[]` | `{ type: array, items: <T> }` | slice/array |
173
+ | `Record<T>` | `{ type: object, additionalProperties: <T> }` | `map[string]T` / `Record<string, T>` |
174
+ | literal `"foo"` | `{ type: string, const: "foo" }` | константа |
175
+ | `T \| null` | `{ type: [<base>, null] }` | pointer / nullable |
176
+ | `foo?: T` | поле не входит в `required` | опциональное поле |
177
+
178
+ ### Запрещённые типы
179
+
180
+ Эти типы вызывают **ошибку компиляции** — намеренно, ради переносимости между языками:
181
+
182
+ | Тип | Почему запрещён |
183
+ |---|---|
184
+ | `int8`/`int16`/`int32`, `uint8`/`uint16`/`uint32` | Codegen всё равно генерирует signed `int32` / `number` для всех ширин. Размер-специфичные типы создают ложное ожидание сохранения семантики. Используйте `integer`. |
185
+ | `int64`/`uint64` | 64-битные числа должны передаваться как `string` (JS не умеет точно представлять 64-битные числа в JSON). Поясните формат в `@doc`. |
186
+ | `float32`/`float64`/`decimal`/`decimal128` | Числа с плавающей точкой — через `string` во избежание потерь точности на границе языков. |
187
+ | `safeint`/`numeric` | Неоднозначно для кодогенерации. Используйте `integer`. |
188
+ | `utcDateTime`/`plainDate`/`plainTime`/`duration` | Дата/время — это `string` в RFC-3339. TypeScript-codegen иначе подставляет `Date`, что ломает разбор в разных локалях. |
189
+ | `url` | URL — это `string`. |
190
+
191
+ ### Запрет анонимных моделей
192
+
193
+ ```typespec
194
+ // ❌ Нельзя — ошибка эмиттера
195
+ model M {
196
+ payload: { foo: string };
197
+ }
198
+
199
+ // ✅ Только через явно объявленную модель
200
+ model MPayload { foo: string; }
201
+ model M { payload: MPayload; }
202
+ ```
203
+
204
+ Обоснование: детерминированные имена в выводе важнее лаконичности. `modelina` (генератор моделей AsyncAPI) требует осмысленных имён, и авто-генерация ненадёжна.
205
+
206
+ ## Декораторы
207
+
208
+ ### Сервис
209
+
210
+ | Декоратор | Назначение |
211
+ |---|---|
212
+ | `@service(#{ title })` | Стандартный из `@typespec/compiler`. Маркирует namespace как сервис. |
213
+ | `@info(#{ version, description?, contact?, license?, externalDocs? })` | Метаданные info-блока AsyncAPI. |
214
+ | `@server(name, #{ host, protocol, pathname?, description?, variables? })` | Описание одного брокера/сервера. Можно вызывать несколько раз. |
215
+
216
+ ### AMQP
217
+
218
+ | Декоратор | Назначение |
219
+ |---|---|
220
+ | `@publish(#{ channelName?, routingKey?, exchange })` | Операция-publisher → `action: send`. Exchange-типы: `direct`, `fanout`. |
221
+ | `@consume(#{ channelName?, routingKey?, queue })` | Операция-consumer → `action: receive`. |
222
+ | `@summary(text)` | Стандартный из `@typespec/compiler`. Short summary операции. |
223
+ | `@message(#{ name?, summary? })` | Override параметров сгенерированного message. |
224
+ | `@doc(text)` | Стандартный. Длинное описание (description). |
225
+
226
+ ### WebSocket
227
+
228
+ | Декоратор | Назначение |
229
+ |---|---|
230
+ | `@publish` | Без аргументов. Операция → `action: send`. |
231
+ | `@consume` | Без аргументов. Операция → `action: receive`. |
232
+ | `@reply(MessageModel)` | Указывает модель сообщения-ответа (request/reply pattern). |
233
+ | `@binary` | Помечает сообщение как бинарное → `contentType: application/octet-stream`. |
234
+ | `@message`, `@summary`, `@doc` | Как в AMQP. |
235
+
236
+ ## Принципы преобразования
237
+
238
+ 1. **`additionalProperties: false`** — по умолчанию на всех моделях. Намеренное отличие от `@typespec/openapi3`: мы не разрешаем произвольные поля без явного указания.
239
+ 2. **Поле с `@doc`, ссылающееся на скаляр** — оборачивается в `allOf` с описанием. Копия поведения `@typespec/openapi3`: JSON Schema не допускает соседства `$ref` с `description`.
240
+ 3. **Namespace prefix**: вложенные namespace дают префикс через точку (`outer.Inner`). Top-level service-namespace в префикс не входит. Соответствует `@typespec/openapi3`.
241
+ 4. **AsyncAPI 3.0.0** — выбранная версия. 3.1 backward-совместима, но 3.0 проверена на широкой инструментальной поддержке.
242
+
243
+ ## Диагностика
244
+
245
+ Все диагностики с префиксом `@tertiumorganum/typespec-amqp-ws/`:
246
+
247
+ - `unsupported-sized-int`, `unsupported-int64`, `unsupported-float`, `unsupported-fuzzy-numeric`, `unsupported-temporal`, `unsupported-url` — попытка использовать запрещённый тип.
248
+ - `anonymous-model`, `anonymous-return` — анонимная inline-модель.
249
+ - `non-string-enum`, `invalid-enum-value` — некорректный enum.
250
+ - `unknown-exchange-type` — неподдерживаемый тип exchange (только `direct`, `fanout`).
251
+ - `unsupported-union` — union, не являющийся `T | null`.
252
+ - `missing-doc` (warning) — модель/enum без `@doc`.
253
+
254
+ ## Out of scope (v1)
255
+
256
+ Намеренно **не реализовано** в v1 — добавляется при реальной потребности:
257
+
258
+ - Транспорты Kafka, MQTT, HTTP/SSE, SNS/SQS.
259
+ - Exchange types `topic`, `headers`.
260
+ - AsyncAPI security schemes.
261
+ - `correlationId`.
262
+ - Traits (`channelTraits`, `operationTraits`, `messageTraits`).
263
+ - AsyncAPI extensions (`x-` properties).
264
+ - Polymorphism: пользовательские `oneOf`/`anyOf`/`allOf`.
265
+ - TypeSpec `@versioned` интеграция.
266
+ - Numeric-валуированные enum.
267
+ - `@tag` на operations.
268
+ - AsyncAPI 3.1.
269
+ - JSON output (только YAML).
270
+
271
+ ## Документация
272
+
273
+ Подробная документация — в [docs/](docs/):
274
+ - [docs/usage.md](docs/usage.md) — установка, конфигурация, синтаксис, поддерживаемые типы, типичные сценарии.
275
+ - [docs/architecture.md](docs/architecture.md) — внутреннее устройство эмиттера, ключевые решения, точки расширения.
276
+
277
+ ## Примеры
278
+
279
+ В [examples/](examples/):
280
+ - `amqp-publish.tsp` — простой AMQP publisher.
281
+ - `amqp-consume.tsp` — простой AMQP consumer.
282
+ - `ws-discriminator.tsp` — WebSocket с literal-дискриминатором.
283
+ - `ws-reply.tsp` — WebSocket с request/reply.
284
+
285
+ ## Контрибьюции
286
+
287
+ Pull-requests и issues приветствуются. Это утилита под конкретный воркфлоу; решения по новым фичам принимаются исходя из того, насколько они вписываются в принцип "узкий набор фич для типичных кейсов".
288
+
289
+ ## Лицензия
290
+
291
+ [MIT](LICENSE).
@@ -0,0 +1,4 @@
1
+ import type { Program } from "@typespec/compiler";
2
+ import type { AsyncApiDoc } from "../shared/document.js";
3
+ export declare function buildAmqp(program: Program, doc: AsyncApiDoc): void;
4
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/amqp/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,oBAAoB,CAAC;AAG7D,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,uBAAuB,CAAC;AAU/B,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CASlE"}
@@ -0,0 +1,121 @@
1
+ import { navigateProgram, getDoc, getSummary } from "@typespec/compiler";
2
+ import { AmqpPublishKey, AmqpConsumeKey, MessageKey } from "../shared/state.js";
3
+ import { reportDiagnostic } from "../shared/lib.js";
4
+ export function buildAmqp(program, doc) {
5
+ navigateProgram(program, {
6
+ operation(op) {
7
+ const pub = program.stateMap(AmqpPublishKey).get(op);
8
+ const con = program.stateMap(AmqpConsumeKey).get(op);
9
+ if (pub)
10
+ attachPublish(program, doc, op, pub);
11
+ else if (con)
12
+ attachConsume(program, doc, op, con);
13
+ },
14
+ });
15
+ }
16
+ function attachPublish(program, doc, op, config) {
17
+ const ctx = prepareCommon(program, doc, op, config.channelName);
18
+ if (!ctx)
19
+ return;
20
+ const { channelKey, messageKey, returnTypeName } = ctx;
21
+ const channel = doc.channels[channelKey] ?? {};
22
+ if (config.routingKey)
23
+ channel.address = config.routingKey;
24
+ channel.bindings = {
25
+ ...(channel.bindings ?? {}),
26
+ amqp: {
27
+ is: "routingKey",
28
+ exchange: cleanExchange(config.exchange),
29
+ },
30
+ };
31
+ channel.messages = channel.messages ?? {};
32
+ channel.messages[messageKey] = { $ref: `#/components/messages/${messageKey}` };
33
+ doc.channels[channelKey] = channel;
34
+ registerMessage(program, doc, op, messageKey, returnTypeName);
35
+ registerOperation(program, doc, op, channelKey, messageKey, "send");
36
+ }
37
+ function attachConsume(program, doc, op, config) {
38
+ const ctx = prepareCommon(program, doc, op, config.channelName);
39
+ if (!ctx)
40
+ return;
41
+ const { channelKey, messageKey, returnTypeName } = ctx;
42
+ const channel = doc.channels[channelKey] ?? {};
43
+ if (config.routingKey)
44
+ channel.address = config.routingKey;
45
+ channel.bindings = {
46
+ ...(channel.bindings ?? {}),
47
+ amqp: {
48
+ is: "queue",
49
+ queue: cleanQueue(config.queue),
50
+ },
51
+ };
52
+ channel.messages = channel.messages ?? {};
53
+ channel.messages[messageKey] = { $ref: `#/components/messages/${messageKey}` };
54
+ doc.channels[channelKey] = channel;
55
+ registerMessage(program, doc, op, messageKey, returnTypeName);
56
+ registerOperation(program, doc, op, channelKey, messageKey, "receive");
57
+ }
58
+ function prepareCommon(program, doc, op, channelNameOverride) {
59
+ const rt = op.returnType;
60
+ if (rt.kind !== "Model" || !rt.name) {
61
+ reportDiagnostic(program, {
62
+ code: "anonymous-return",
63
+ target: op,
64
+ format: { op: op.name },
65
+ });
66
+ return undefined;
67
+ }
68
+ const channelKey = channelNameOverride ?? op.name;
69
+ const override = program.stateMap(MessageKey).get(op);
70
+ const messageKey = override?.name ?? lowerFirst(rt.name);
71
+ doc.channels = doc.channels ?? {};
72
+ doc.operations = doc.operations ?? {};
73
+ doc.components = doc.components ?? {};
74
+ doc.components.messages = doc.components.messages ?? {};
75
+ return { channelKey, messageKey, returnTypeName: rt.name };
76
+ }
77
+ function registerMessage(program, doc, op, messageKey, returnTypeName) {
78
+ const override = program.stateMap(MessageKey).get(op);
79
+ const message = {
80
+ payload: { $ref: `#/components/schemas/${returnTypeName}` },
81
+ };
82
+ if (override?.summary)
83
+ message.summary = override.summary;
84
+ doc.components.messages[messageKey] = message;
85
+ }
86
+ function registerOperation(program, doc, op, channelKey, messageKey, action) {
87
+ const summary = getSummary(program, op);
88
+ const description = getDoc(program, op);
89
+ const operation = {
90
+ action,
91
+ channel: { $ref: `#/channels/${channelKey}` },
92
+ messages: [{ $ref: `#/channels/${channelKey}/messages/${messageKey}` }],
93
+ };
94
+ if (summary)
95
+ operation.summary = summary;
96
+ if (description)
97
+ operation.description = description;
98
+ doc.operations[op.name] = operation;
99
+ }
100
+ function cleanExchange(e) {
101
+ const out = { name: e.name, type: e.type };
102
+ if (e.durable !== undefined)
103
+ out.durable = e.durable;
104
+ if (e.autoDelete !== undefined)
105
+ out.autoDelete = e.autoDelete;
106
+ return out;
107
+ }
108
+ function cleanQueue(q) {
109
+ const out = { name: q.name };
110
+ if (q.durable !== undefined)
111
+ out.durable = q.durable;
112
+ if (q.autoDelete !== undefined)
113
+ out.autoDelete = q.autoDelete;
114
+ if (q.exclusive !== undefined)
115
+ out.exclusive = q.exclusive;
116
+ return out;
117
+ }
118
+ function lowerFirst(s) {
119
+ return s.length === 0 ? s : s[0].toLowerCase() + s.slice(1);
120
+ }
121
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/amqp/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { DecoratorContext, Operation } from "@typespec/compiler";
2
+ export declare const namespace = "TspAsyncApi.Amqp";
3
+ export interface ExchangeConfig {
4
+ name: string;
5
+ type: string;
6
+ durable?: boolean;
7
+ autoDelete?: boolean;
8
+ }
9
+ export interface QueueConfig {
10
+ name: string;
11
+ durable?: boolean;
12
+ autoDelete?: boolean;
13
+ exclusive?: boolean;
14
+ }
15
+ export interface PublishConfig {
16
+ channelName?: string;
17
+ routingKey?: string;
18
+ exchange?: ExchangeConfig;
19
+ }
20
+ export interface ConsumeConfig {
21
+ channelName?: string;
22
+ routingKey?: string;
23
+ queue?: QueueConfig;
24
+ }
25
+ export declare function $publish(context: DecoratorContext, target: Operation, config: PublishConfig): void;
26
+ export declare function $consume(context: DecoratorContext, target: Operation, config: ConsumeConfig): void;
27
+ export interface MessageOverride {
28
+ name?: string;
29
+ summary?: string;
30
+ }
31
+ export declare function $message(context: DecoratorContext, target: Operation, config: MessageOverride): void;
32
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../../src/amqp/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAItE,eAAO,MAAM,SAAS,qBAAqB,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAID,wBAAgB,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,aAAa,GACpB,IAAI,CAkBN;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,aAAa,GACpB,IAAI,CAUN;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,GACtB,IAAI,CAEN"}
@@ -0,0 +1,38 @@
1
+ import { AmqpPublishKey, AmqpConsumeKey, MessageKey } from "../shared/state.js";
2
+ import { reportDiagnostic } from "../shared/lib.js";
3
+ export const namespace = "TspAsyncApi.Amqp";
4
+ const ALLOWED_EXCHANGE_TYPES = new Set(["direct", "fanout"]);
5
+ export function $publish(context, target, config) {
6
+ if (!config.exchange) {
7
+ reportDiagnostic(context.program, {
8
+ code: "publish-without-exchange",
9
+ target,
10
+ format: {},
11
+ });
12
+ return;
13
+ }
14
+ if (!ALLOWED_EXCHANGE_TYPES.has(config.exchange.type)) {
15
+ reportDiagnostic(context.program, {
16
+ code: "unknown-exchange-type",
17
+ target,
18
+ format: { type: config.exchange.type },
19
+ });
20
+ return;
21
+ }
22
+ context.program.stateMap(AmqpPublishKey).set(target, config);
23
+ }
24
+ export function $consume(context, target, config) {
25
+ if (!config.queue) {
26
+ reportDiagnostic(context.program, {
27
+ code: "consume-without-queue",
28
+ target,
29
+ format: {},
30
+ });
31
+ return;
32
+ }
33
+ context.program.stateMap(AmqpConsumeKey).set(target, config);
34
+ }
35
+ export function $message(context, target, config) {
36
+ context.program.stateMap(MessageKey).set(target, config);
37
+ }
38
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../../src/amqp/decorators.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,kBAAkB,CAAC;AA4B5C,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE7D,MAAM,UAAU,QAAQ,CACtB,OAAyB,EACzB,MAAiB,EACjB,MAAqB;IAErB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,IAAI,EAAE,0BAA0B;YAChC,MAAM;YACN,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,IAAI,EAAE,uBAAuB;YAC7B,MAAM;YACN,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;SACvC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,OAAyB,EACzB,MAAiB,EACjB,MAAqB;IAErB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE;YAChC,IAAI,EAAE,uBAAuB;YAC7B,MAAM;YACN,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAOD,MAAM,UAAU,QAAQ,CACtB,OAAyB,EACzB,MAAiB,EACjB,MAAuB;IAEvB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EmitContext } from "@typespec/compiler";
2
+ import { $lib, type EmitterOptions } from "../shared/lib.js";
3
+ export { $lib };
4
+ export declare function $onEmit(context: EmitContext<EmitterOptions>): Promise<void>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/amqp/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,EAAE,IAAI,EAAE,CAAC;AAEhB,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjF"}
@@ -0,0 +1,7 @@
1
+ import { $lib } from "../shared/lib.js";
2
+ import { emitAsyncApi } from "../shared/asyncapi-emitter.js";
3
+ export { $lib };
4
+ export async function $onEmit(context) {
5
+ await emitAsyncApi(context, "amqp");
6
+ }
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/amqp/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,IAAI,EAAE,CAAC;AAEhB,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoC;IAChE,MAAM,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { $lib } from "./shared/lib.js";
2
+ export type { EmitterOptions } from "./shared/lib.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // Корневая точка пакета. Регистрирует $lib (общая на оба emit-таргета).
2
+ // Декораторы JS реализованы в отдельных модулях (./shared/decorators-service.ts, ./amqp/decorators.ts, ./ws/decorators.ts),
3
+ // чтобы у каждого было своё `export const namespace = "..."` для TypeSpec-связки.
4
+ export { $lib } from "./shared/lib.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,4HAA4H;AAC5H,kFAAkF;AAElF,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EmitContext } from "@typespec/compiler";
2
+ import type { EmitterOptions } from "./options.js";
3
+ export type EmitTarget = "amqp" | "ws";
4
+ export declare function emitAsyncApi(context: EmitContext<EmitterOptions>, target: EmitTarget): Promise<void>;
5
+ //# sourceMappingURL=asyncapi-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncapi-emitter.d.ts","sourceRoot":"","sources":["../../../src/shared/asyncapi-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,oBAAoB,CAAC;AAcjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;AAEvC,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,CAAC,cAAc,CAAC,EACpC,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAmCf"}