silon-sdk 0.2.0

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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +560 -0
  3. package/dist/client.d.ts +141 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +249 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/errors.d.ts +117 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +199 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/index.d.ts +51 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +36 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/internal/utils.d.ts +24 -0
  16. package/dist/internal/utils.d.ts.map +1 -0
  17. package/dist/internal/utils.js +58 -0
  18. package/dist/internal/utils.js.map +1 -0
  19. package/dist/pagination.d.ts +52 -0
  20. package/dist/pagination.d.ts.map +1 -0
  21. package/dist/pagination.js +80 -0
  22. package/dist/pagination.js.map +1 -0
  23. package/dist/resources/auth.d.ts +20 -0
  24. package/dist/resources/auth.d.ts.map +1 -0
  25. package/dist/resources/auth.js +41 -0
  26. package/dist/resources/auth.js.map +1 -0
  27. package/dist/resources/broadcasts.d.ts +63 -0
  28. package/dist/resources/broadcasts.d.ts.map +1 -0
  29. package/dist/resources/broadcasts.js +103 -0
  30. package/dist/resources/broadcasts.js.map +1 -0
  31. package/dist/resources/bulk.d.ts +60 -0
  32. package/dist/resources/bulk.d.ts.map +1 -0
  33. package/dist/resources/bulk.js +137 -0
  34. package/dist/resources/bulk.js.map +1 -0
  35. package/dist/resources/client-groups.d.ts +50 -0
  36. package/dist/resources/client-groups.d.ts.map +1 -0
  37. package/dist/resources/client-groups.js +97 -0
  38. package/dist/resources/client-groups.js.map +1 -0
  39. package/dist/resources/clients.d.ts +51 -0
  40. package/dist/resources/clients.d.ts.map +1 -0
  41. package/dist/resources/clients.js +99 -0
  42. package/dist/resources/clients.js.map +1 -0
  43. package/dist/resources/events.d.ts +22 -0
  44. package/dist/resources/events.d.ts.map +1 -0
  45. package/dist/resources/events.js +38 -0
  46. package/dist/resources/events.js.map +1 -0
  47. package/dist/resources/messages.d.ts +99 -0
  48. package/dist/resources/messages.d.ts.map +1 -0
  49. package/dist/resources/messages.js +167 -0
  50. package/dist/resources/messages.js.map +1 -0
  51. package/dist/resources/otp.d.ts +26 -0
  52. package/dist/resources/otp.d.ts.map +1 -0
  53. package/dist/resources/otp.js +40 -0
  54. package/dist/resources/otp.js.map +1 -0
  55. package/dist/resources/profile.d.ts +18 -0
  56. package/dist/resources/profile.d.ts.map +1 -0
  57. package/dist/resources/profile.js +40 -0
  58. package/dist/resources/profile.js.map +1 -0
  59. package/dist/resources/push.d.ts +45 -0
  60. package/dist/resources/push.d.ts.map +1 -0
  61. package/dist/resources/push.js +103 -0
  62. package/dist/resources/push.js.map +1 -0
  63. package/dist/resources/reports.d.ts +44 -0
  64. package/dist/resources/reports.d.ts.map +1 -0
  65. package/dist/resources/reports.js +127 -0
  66. package/dist/resources/reports.js.map +1 -0
  67. package/dist/resources/suppressions.d.ts +54 -0
  68. package/dist/resources/suppressions.d.ts.map +1 -0
  69. package/dist/resources/suppressions.js +79 -0
  70. package/dist/resources/suppressions.js.map +1 -0
  71. package/dist/resources/templates.d.ts +58 -0
  72. package/dist/resources/templates.d.ts.map +1 -0
  73. package/dist/resources/templates.js +96 -0
  74. package/dist/resources/templates.js.map +1 -0
  75. package/dist/resources/webhook-endpoints.d.ts +54 -0
  76. package/dist/resources/webhook-endpoints.d.ts.map +1 -0
  77. package/dist/resources/webhook-endpoints.js +96 -0
  78. package/dist/resources/webhook-endpoints.js.map +1 -0
  79. package/dist/resources/whatsapp-templates.d.ts +20 -0
  80. package/dist/resources/whatsapp-templates.d.ts.map +1 -0
  81. package/dist/resources/whatsapp-templates.js +33 -0
  82. package/dist/resources/whatsapp-templates.js.map +1 -0
  83. package/dist/types/auth.d.ts +34 -0
  84. package/dist/types/auth.d.ts.map +1 -0
  85. package/dist/types/auth.js +8 -0
  86. package/dist/types/auth.js.map +1 -0
  87. package/dist/types/broadcasts.d.ts +174 -0
  88. package/dist/types/broadcasts.d.ts.map +1 -0
  89. package/dist/types/broadcasts.js +8 -0
  90. package/dist/types/broadcasts.js.map +1 -0
  91. package/dist/types/bulk.d.ts +161 -0
  92. package/dist/types/bulk.d.ts.map +1 -0
  93. package/dist/types/bulk.js +8 -0
  94. package/dist/types/bulk.js.map +1 -0
  95. package/dist/types/client-groups.d.ts +52 -0
  96. package/dist/types/client-groups.d.ts.map +1 -0
  97. package/dist/types/client-groups.js +8 -0
  98. package/dist/types/client-groups.js.map +1 -0
  99. package/dist/types/clients.d.ts +64 -0
  100. package/dist/types/clients.d.ts.map +1 -0
  101. package/dist/types/clients.js +8 -0
  102. package/dist/types/clients.js.map +1 -0
  103. package/dist/types/events.d.ts +64 -0
  104. package/dist/types/events.d.ts.map +1 -0
  105. package/dist/types/events.js +9 -0
  106. package/dist/types/events.js.map +1 -0
  107. package/dist/types/messages.d.ts +334 -0
  108. package/dist/types/messages.d.ts.map +1 -0
  109. package/dist/types/messages.js +8 -0
  110. package/dist/types/messages.js.map +1 -0
  111. package/dist/types/otp.d.ts +61 -0
  112. package/dist/types/otp.d.ts.map +1 -0
  113. package/dist/types/otp.js +8 -0
  114. package/dist/types/otp.js.map +1 -0
  115. package/dist/types/profile.d.ts +37 -0
  116. package/dist/types/profile.d.ts.map +1 -0
  117. package/dist/types/profile.js +8 -0
  118. package/dist/types/profile.js.map +1 -0
  119. package/dist/types/push.d.ts +90 -0
  120. package/dist/types/push.d.ts.map +1 -0
  121. package/dist/types/push.js +8 -0
  122. package/dist/types/push.js.map +1 -0
  123. package/dist/types/reports.d.ts +109 -0
  124. package/dist/types/reports.d.ts.map +1 -0
  125. package/dist/types/reports.js +8 -0
  126. package/dist/types/reports.js.map +1 -0
  127. package/dist/types/suppressions.d.ts +72 -0
  128. package/dist/types/suppressions.d.ts.map +1 -0
  129. package/dist/types/suppressions.js +8 -0
  130. package/dist/types/suppressions.js.map +1 -0
  131. package/dist/types/templates.d.ts +96 -0
  132. package/dist/types/templates.d.ts.map +1 -0
  133. package/dist/types/templates.js +9 -0
  134. package/dist/types/templates.js.map +1 -0
  135. package/dist/types/webhook-endpoints.d.ts +123 -0
  136. package/dist/types/webhook-endpoints.d.ts.map +1 -0
  137. package/dist/types/webhook-endpoints.js +8 -0
  138. package/dist/types/webhook-endpoints.js.map +1 -0
  139. package/dist/types/whatsapp-templates.d.ts +59 -0
  140. package/dist/types/whatsapp-templates.d.ts.map +1 -0
  141. package/dist/types/whatsapp-templates.js +8 -0
  142. package/dist/types/whatsapp-templates.js.map +1 -0
  143. package/dist/version.d.ts +3 -0
  144. package/dist/version.d.ts.map +1 -0
  145. package/dist/version.js +3 -0
  146. package/dist/version.js.map +1 -0
  147. package/dist/webhooks.d.ts +48 -0
  148. package/dist/webhooks.d.ts.map +1 -0
  149. package/dist/webhooks.js +97 -0
  150. package/dist/webhooks.js.map +1 -0
  151. package/package.json +60 -0
@@ -0,0 +1,63 @@
1
+ /** The Broadcasts resource — create, aggregate status and per-recipient deliveries. */
2
+ import type { Silon } from "../client.js";
3
+ import { Page } from "../pagination.js";
4
+ import type { Broadcast, BroadcastAccepted, BroadcastCreateParams, BroadcastDeliveriesParams, BroadcastDelivery } from "../types/broadcasts.js";
5
+ /** `client.broadcasts` — send one piece of content to an audience and track it. */
6
+ export declare class Broadcasts {
7
+ #private;
8
+ constructor(client: Silon);
9
+ /**
10
+ * Send a broadcast — one piece of content fanned out to an audience — on
11
+ * any channel (`POST /api/v1/broadcasts/`).
12
+ *
13
+ * `audience` selects the recipients: `{type: "client_group", slug}`,
14
+ * `{type: "client_ids", client_ids: [...]}` or `{type: "recipients",
15
+ * recipients: [{phone_number} | {email} | {client_id}, ...]}` (max 1,000
16
+ * rows; a malformed row fails the whole request with a per-index pointer
17
+ * like `audience.recipients[3].phone_number`).
18
+ *
19
+ * Pass `send_at` (an ISO-8601 date-time string with a UTC offset, strictly
20
+ * in the future, at most 90 days ahead — else `422 send-at-invalid`) to
21
+ * schedule the broadcast: the envelope answers `status: "scheduled"`
22
+ * (`target_count` / `skipped_count` may be null when the audience resolves
23
+ * at dispatch time) and the same `id` tracks it through dispatch; cancel
24
+ * while still scheduled via {@link cancel}.
25
+ *
26
+ * An `Idempotency-Key` header is always sent (auto-generated UUIDv4 when
27
+ * `idempotency_key` is not given), which makes automatic retries safe.
28
+ * Channel-specific fields not covered by the typed params can be passed
29
+ * through `extra_body`, which is merged into the JSON body last.
30
+ */
31
+ create(params: BroadcastCreateParams): Promise<BroadcastAccepted>;
32
+ /**
33
+ * Aggregate delivery counts for a broadcast
34
+ * (`GET /api/v1/broadcasts/{broadcast_id}/`). A broadcast created with
35
+ * `send_at` answers `status: "scheduled"` until dispatch, then the normal
36
+ * lifecycle — the id is stable across it.
37
+ */
38
+ retrieve(broadcastId: string): Promise<Broadcast>;
39
+ /**
40
+ * Cancel a scheduled broadcast
41
+ * (`POST /api/v1/broadcasts/{broadcast_id}/cancel/`).
42
+ *
43
+ * Allowed only while the broadcast is still `"scheduled"`: resolves with
44
+ * the envelope showing `status: "canceled"`; a canceled broadcast never
45
+ * dispatches and emits a `broadcast.canceled` event. Canceling an
46
+ * already-canceled broadcast is safe and resolves with the same envelope
47
+ * again (cancel is idempotent by nature — no `Idempotency-Key` is sent).
48
+ * Once dispatched (or for an immediate broadcast's id) the server rejects
49
+ * with `409 not-cancellable`; an unknown id rejects with `404`.
50
+ */
51
+ cancel(broadcastId: string): Promise<BroadcastAccepted>;
52
+ /**
53
+ * Per-recipient delivery rows for a broadcast, cursor-paginated
54
+ * (`GET /api/v1/broadcasts/{broadcast_id}/deliveries/`).
55
+ *
56
+ * ```ts
57
+ * const page = await client.broadcasts.deliveries("br_01J1", { limit: 100 });
58
+ * for await (const delivery of page.autoPaging()) { ... }
59
+ * ```
60
+ */
61
+ deliveries(broadcastId: string, params?: BroadcastDeliveriesParams): Promise<Page<BroadcastDelivery>>;
62
+ }
63
+ //# sourceMappingURL=broadcasts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcasts.d.ts","sourceRoot":"","sources":["../../src/resources/broadcasts.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAIvF,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAIhC,mFAAmF;AACnF,qBAAa,UAAU;;gBAGT,MAAM,EAAE,KAAK;IAIzB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyBvE;;;;;OAKG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQvD;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQ7D;;;;;;;;OAQG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,yBAA8B,GACrC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;CAQpC"}
@@ -0,0 +1,103 @@
1
+ /** The Broadcasts resource — create, aggregate status and per-recipient deliveries. */
2
+ import { randomUUID } from "node:crypto";
3
+ import { dropNull } from "../internal/utils.js";
4
+ import { Page } from "../pagination.js";
5
+ const BROADCASTS_PATH = "/api/v1/broadcasts/";
6
+ /** `client.broadcasts` — send one piece of content to an audience and track it. */
7
+ export class Broadcasts {
8
+ #client;
9
+ constructor(client) {
10
+ this.#client = client;
11
+ }
12
+ /**
13
+ * Send a broadcast — one piece of content fanned out to an audience — on
14
+ * any channel (`POST /api/v1/broadcasts/`).
15
+ *
16
+ * `audience` selects the recipients: `{type: "client_group", slug}`,
17
+ * `{type: "client_ids", client_ids: [...]}` or `{type: "recipients",
18
+ * recipients: [{phone_number} | {email} | {client_id}, ...]}` (max 1,000
19
+ * rows; a malformed row fails the whole request with a per-index pointer
20
+ * like `audience.recipients[3].phone_number`).
21
+ *
22
+ * Pass `send_at` (an ISO-8601 date-time string with a UTC offset, strictly
23
+ * in the future, at most 90 days ahead — else `422 send-at-invalid`) to
24
+ * schedule the broadcast: the envelope answers `status: "scheduled"`
25
+ * (`target_count` / `skipped_count` may be null when the audience resolves
26
+ * at dispatch time) and the same `id` tracks it through dispatch; cancel
27
+ * while still scheduled via {@link cancel}.
28
+ *
29
+ * An `Idempotency-Key` header is always sent (auto-generated UUIDv4 when
30
+ * `idempotency_key` is not given), which makes automatic retries safe.
31
+ * Channel-specific fields not covered by the typed params can be passed
32
+ * through `extra_body`, which is merged into the JSON body last.
33
+ */
34
+ async create(params) {
35
+ const { idempotency_key, extra_body, ...fields } = params;
36
+ const body = dropNull({
37
+ channel: fields.channel,
38
+ audience: fields.audience,
39
+ content: fields.content,
40
+ template: fields.template,
41
+ provider: fields.provider,
42
+ sender: fields.sender,
43
+ application: fields.application,
44
+ widget_key: fields.widget_key,
45
+ priority: fields.priority,
46
+ ttl: fields.ttl,
47
+ whatsapp: fields.whatsapp,
48
+ whatsapp_template: fields.whatsapp_template,
49
+ send_at: fields.send_at,
50
+ });
51
+ if (extra_body)
52
+ Object.assign(body, extra_body);
53
+ const data = await this.#client.request("POST", BROADCASTS_PATH, {
54
+ body,
55
+ headers: { "Idempotency-Key": idempotency_key ?? randomUUID() },
56
+ });
57
+ return data;
58
+ }
59
+ /**
60
+ * Aggregate delivery counts for a broadcast
61
+ * (`GET /api/v1/broadcasts/{broadcast_id}/`). A broadcast created with
62
+ * `send_at` answers `status: "scheduled"` until dispatch, then the normal
63
+ * lifecycle — the id is stable across it.
64
+ */
65
+ async retrieve(broadcastId) {
66
+ const data = await this.#client.request("GET", `${BROADCASTS_PATH}${encodeURIComponent(broadcastId)}/`);
67
+ return data;
68
+ }
69
+ /**
70
+ * Cancel a scheduled broadcast
71
+ * (`POST /api/v1/broadcasts/{broadcast_id}/cancel/`).
72
+ *
73
+ * Allowed only while the broadcast is still `"scheduled"`: resolves with
74
+ * the envelope showing `status: "canceled"`; a canceled broadcast never
75
+ * dispatches and emits a `broadcast.canceled` event. Canceling an
76
+ * already-canceled broadcast is safe and resolves with the same envelope
77
+ * again (cancel is idempotent by nature — no `Idempotency-Key` is sent).
78
+ * Once dispatched (or for an immediate broadcast's id) the server rejects
79
+ * with `409 not-cancellable`; an unknown id rejects with `404`.
80
+ */
81
+ async cancel(broadcastId) {
82
+ const data = await this.#client.request("POST", `${BROADCASTS_PATH}${encodeURIComponent(broadcastId)}/cancel/`);
83
+ return data;
84
+ }
85
+ /**
86
+ * Per-recipient delivery rows for a broadcast, cursor-paginated
87
+ * (`GET /api/v1/broadcasts/{broadcast_id}/deliveries/`).
88
+ *
89
+ * ```ts
90
+ * const page = await client.broadcasts.deliveries("br_01J1", { limit: 100 });
91
+ * for await (const delivery of page.autoPaging()) { ... }
92
+ * ```
93
+ */
94
+ async deliveries(broadcastId, params = {}) {
95
+ const path = `${BROADCASTS_PATH}${encodeURIComponent(broadcastId)}/deliveries/`;
96
+ const query = dropNull({ cursor: params.cursor, limit: params.limit });
97
+ const data = (await this.#client.request("GET", path, {
98
+ query,
99
+ }));
100
+ return new Page(this.#client, path, query, data);
101
+ }
102
+ }
103
+ //# sourceMappingURL=broadcasts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcasts.js","sourceRoot":"","sources":["../../src/resources/broadcasts.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAS7D,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAE9C,mFAAmF;AACnF,MAAM,OAAO,UAAU;IACZ,OAAO,CAAQ;IAExB,YAAY,MAAa;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,MAAM,CAAC,MAA6B;QACxC,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;QAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,IAAI,UAAU;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE;YAC/D,IAAI;YACJ,OAAO,EAAE,EAAE,iBAAiB,EAAE,eAAe,IAAI,UAAU,EAAE,EAAE;SAChE,CAAC,CAAC;QACH,OAAO,IAAyB,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,WAAmB;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACrC,KAAK,EACL,GAAG,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,GAAG,CACxD,CAAC;QACF,OAAO,IAAiB,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACrC,MAAM,EACN,GAAG,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,UAAU,CAC/D,CAAC;QACF,OAAO,IAAyB,CAAC;IACnC,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,UAAU,CACd,WAAmB,EACnB,SAAoC,EAAE;QAEtC,MAAM,IAAI,GAAG,GAAG,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,cAAc,CAAC;QAChF,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAgB,CAAC;QACtF,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE;YACpD,KAAK;SACN,CAAC,CAAsC,CAAC;QACzC,OAAO,IAAI,IAAI,CAAoB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;CACF"}
@@ -0,0 +1,60 @@
1
+ /** The Bulk resource — CSV batches, saved files, and per-recipient rows. */
2
+ import type { Silon } from "../client.js";
3
+ import type { BulkBatch, BulkBatchDetail, BulkFileInput, BulkFileList, BulkFileUpload, BulkFileUploadOptions, BulkRecipientDetail, BulkSendParams, BulkSendResult } from "../types/bulk.js";
4
+ /** `client.bulk.files` — CSVs saved for later bulk sends. */
5
+ export declare class BulkFiles {
6
+ #private;
7
+ constructor(client: Silon);
8
+ /** List saved CSVs (`GET /api/v1/bulk/files/` -> `{count, results}`). */
9
+ list(): Promise<BulkFileList>;
10
+ /**
11
+ * Upload a CSV for later bulk sends (`POST /api/v1/bulk/files/`,
12
+ * multipart field `file`, content type `text/csv`).
13
+ *
14
+ * `file` may be raw content (`string`, `Uint8Array`/`Buffer`) or a
15
+ * `{filename, content}` pair; the filename defaults to `recipients.csv`
16
+ * and can be overridden via `options.filename`. The response `name` is
17
+ * the saved filename to pass as `bulk_file` to {@link Bulk.send}.
18
+ */
19
+ upload(file: BulkFileInput, options?: BulkFileUploadOptions): Promise<BulkFileUpload>;
20
+ }
21
+ /** `client.bulk.recipients` — per-recipient rows of a bulk batch. */
22
+ export declare class BulkRecipients {
23
+ #private;
24
+ constructor(client: Silon);
25
+ /** Fetch one recipient row (`GET /api/v1/bulk/recipient/{id}/`). */
26
+ retrieve(recipientId: number): Promise<BulkRecipientDetail>;
27
+ }
28
+ /** `client.bulk` — bulk (CSV) sends: batches, saved files, recipients. */
29
+ export declare class Bulk {
30
+ #private;
31
+ /** Saved CSV files for bulk sends. */
32
+ readonly files: BulkFiles;
33
+ /** Per-recipient rows of a batch. */
34
+ readonly recipients: BulkRecipients;
35
+ constructor(client: Silon);
36
+ /** List batches (`GET /api/v1/bulk/` — a bare JSON array). */
37
+ list(): Promise<BulkBatch[]>;
38
+ /** Full batch detail incl. recipients (`GET /api/v1/bulk/{id}/`). */
39
+ retrieve(bulkId: number): Promise<BulkBatchDetail>;
40
+ /**
41
+ * Start a bulk batch (`POST /api/v1/bulk/send/`).
42
+ *
43
+ * Supply recipients either inline via `recipients` (each row a
44
+ * column->value map) or by referencing a previously uploaded CSV via
45
+ * `bulk_file` — exactly one of the two, enforced client-side. The
46
+ * WhatsApp template fields (`provider`, `whatsapp_template`,
47
+ * `whatsapp_template_language`, `whatsapp_template_variables`) are sent
48
+ * as query parameters, everything else in the JSON body.
49
+ *
50
+ * @deprecated Prefer `client.messages.sendBatch` — inline rows via
51
+ * `messages`, or an uploaded CSV via `file` (`bulk.files.upload` stays
52
+ * the ingestion path). Calling this emits a one-time
53
+ * `DeprecationWarning`.
54
+ *
55
+ * @throws {SilonError} when neither or both of `recipients` / `bulk_file`
56
+ * are given.
57
+ */
58
+ send(params: BulkSendParams): Promise<BulkSendResult>;
59
+ }
60
+ //# sourceMappingURL=bulk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.d.ts","sourceRoot":"","sources":["../../src/resources/bulk.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAGvD,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,MAAM,kBAAkB,CAAC;AAS1B,6DAA6D;AAC7D,qBAAa,SAAS;;gBAGR,MAAM,EAAE,KAAK;IAIzB,yEAAyE;IACnE,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IAKnC;;;;;;;;OAQG;IACG,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,cAAc,CAAC;CAmBhG;AAED,qEAAqE;AACrE,qBAAa,cAAc;;gBAGb,MAAM,EAAE,KAAK;IAIzB,oEAAoE;IAC9D,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAIlE;AAED,0EAA0E;AAC1E,qBAAa,IAAI;;IAGf,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;gBAExB,MAAM,EAAE,KAAK;IAMzB,8DAA8D;IACxD,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKlC,qEAAqE;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAKxD;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;CAwC5D"}
@@ -0,0 +1,137 @@
1
+ /** The Bulk resource — CSV batches, saved files, and per-recipient rows. */
2
+ import { SilonError } from "../errors.js";
3
+ import { dropNull, emitDeprecationWarning } from "../internal/utils.js";
4
+ const BULK_PATH = "/api/v1/bulk/";
5
+ const FILES_PATH = "/api/v1/bulk/files/";
6
+ const SEND_PATH = "/api/v1/bulk/send/";
7
+ const RECIPIENT_PATH = "/api/v1/bulk/recipient/";
8
+ const DEFAULT_UPLOAD_FILENAME = "recipients.csv";
9
+ /** `client.bulk.files` — CSVs saved for later bulk sends. */
10
+ export class BulkFiles {
11
+ #client;
12
+ constructor(client) {
13
+ this.#client = client;
14
+ }
15
+ /** List saved CSVs (`GET /api/v1/bulk/files/` -> `{count, results}`). */
16
+ async list() {
17
+ const data = await this.#client.request("GET", FILES_PATH);
18
+ return data;
19
+ }
20
+ /**
21
+ * Upload a CSV for later bulk sends (`POST /api/v1/bulk/files/`,
22
+ * multipart field `file`, content type `text/csv`).
23
+ *
24
+ * `file` may be raw content (`string`, `Uint8Array`/`Buffer`) or a
25
+ * `{filename, content}` pair; the filename defaults to `recipients.csv`
26
+ * and can be overridden via `options.filename`. The response `name` is
27
+ * the saved filename to pass as `bulk_file` to {@link Bulk.send}.
28
+ */
29
+ async upload(file, options = {}) {
30
+ let content;
31
+ let inputName;
32
+ if (typeof file === "object" && !(file instanceof Uint8Array)) {
33
+ content = file.content;
34
+ inputName = file.filename;
35
+ }
36
+ else {
37
+ content = file;
38
+ }
39
+ const filename = options.filename ?? inputName ?? DEFAULT_UPLOAD_FILENAME;
40
+ // Copy byte input so the Blob part is backed by a plain ArrayBuffer
41
+ // (Uint8Array views over SharedArrayBuffer are not valid BlobParts).
42
+ const part = typeof content === "string" ? content : new Uint8Array(content);
43
+ const formData = new FormData();
44
+ formData.append("file", new Blob([part], { type: "text/csv" }), filename);
45
+ const data = await this.#client.request("POST", FILES_PATH, { formData });
46
+ return data;
47
+ }
48
+ }
49
+ /** `client.bulk.recipients` — per-recipient rows of a bulk batch. */
50
+ export class BulkRecipients {
51
+ #client;
52
+ constructor(client) {
53
+ this.#client = client;
54
+ }
55
+ /** Fetch one recipient row (`GET /api/v1/bulk/recipient/{id}/`). */
56
+ async retrieve(recipientId) {
57
+ const data = await this.#client.request("GET", `${RECIPIENT_PATH}${recipientId}/`);
58
+ return data;
59
+ }
60
+ }
61
+ /** `client.bulk` — bulk (CSV) sends: batches, saved files, recipients. */
62
+ export class Bulk {
63
+ #client;
64
+ /** Saved CSV files for bulk sends. */
65
+ files;
66
+ /** Per-recipient rows of a batch. */
67
+ recipients;
68
+ constructor(client) {
69
+ this.#client = client;
70
+ this.files = new BulkFiles(client);
71
+ this.recipients = new BulkRecipients(client);
72
+ }
73
+ /** List batches (`GET /api/v1/bulk/` — a bare JSON array). */
74
+ async list() {
75
+ const data = await this.#client.request("GET", BULK_PATH);
76
+ return data;
77
+ }
78
+ /** Full batch detail incl. recipients (`GET /api/v1/bulk/{id}/`). */
79
+ async retrieve(bulkId) {
80
+ const data = await this.#client.request("GET", `${BULK_PATH}${bulkId}/`);
81
+ return data;
82
+ }
83
+ /**
84
+ * Start a bulk batch (`POST /api/v1/bulk/send/`).
85
+ *
86
+ * Supply recipients either inline via `recipients` (each row a
87
+ * column->value map) or by referencing a previously uploaded CSV via
88
+ * `bulk_file` — exactly one of the two, enforced client-side. The
89
+ * WhatsApp template fields (`provider`, `whatsapp_template`,
90
+ * `whatsapp_template_language`, `whatsapp_template_variables`) are sent
91
+ * as query parameters, everything else in the JSON body.
92
+ *
93
+ * @deprecated Prefer `client.messages.sendBatch` — inline rows via
94
+ * `messages`, or an uploaded CSV via `file` (`bulk.files.upload` stays
95
+ * the ingestion path). Calling this emits a one-time
96
+ * `DeprecationWarning`.
97
+ *
98
+ * @throws {SilonError} when neither or both of `recipients` / `bulk_file`
99
+ * are given.
100
+ */
101
+ async send(params) {
102
+ emitDeprecationWarning("SILON_BULK_SEND", "silon: bulk.send() (POST /api/v1/bulk/send/) is deprecated - prefer " +
103
+ "messages.sendBatch() (POST /api/v1/messages/batch/) with inline 'messages' " +
104
+ "rows or an uploaded CSV via 'file'.");
105
+ if ((params.recipients == null) === (params.bulk_file == null)) {
106
+ throw new SilonError("Provide exactly one of 'recipients' (inline rows) or 'bulk_file' (a saved CSV name).");
107
+ }
108
+ const body = dropNull({
109
+ recipients: params.recipients,
110
+ bulk_file: params.bulk_file,
111
+ channel: params.channel,
112
+ message: params.message,
113
+ template: params.template,
114
+ subject: params.subject,
115
+ sender: params.sender,
116
+ group: params.group,
117
+ application: params.application,
118
+ web_application: params.web_application,
119
+ language: params.language,
120
+ files: params.files,
121
+ name: params.name,
122
+ expire: params.expire,
123
+ remove_duplicates: params.remove_duplicates,
124
+ scheduled_at: params.scheduled_at,
125
+ timezone: params.timezone,
126
+ });
127
+ const query = dropNull({
128
+ provider: params.provider,
129
+ whatsapp_template: params.whatsapp_template,
130
+ whatsapp_template_language: params.whatsapp_template_language,
131
+ whatsapp_template_variables: params.whatsapp_template_variables,
132
+ });
133
+ const data = await this.#client.request("POST", SEND_PATH, { body, query });
134
+ return data;
135
+ }
136
+ }
137
+ //# sourceMappingURL=bulk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../src/resources/bulk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /** The ClientGroups resource — CRM client groups (broadcast audiences). */
2
+ import type { Silon } from "../client.js";
3
+ import { Page } from "../pagination.js";
4
+ import type { ClientGroup, ClientGroupCreateParams, ClientGroupListParams, ClientGroupReplaceParams, ClientGroupUpdateParams } from "../types/client-groups.js";
5
+ /** `client.clientGroups` — group contacts into broadcast audiences. */
6
+ export declare class ClientGroups {
7
+ #private;
8
+ constructor(client: Silon);
9
+ /**
10
+ * List every group as a bare array (`GET /api/v1/crm/group/`).
11
+ *
12
+ * This eagerly returns ALL groups as a plain `ClientGroup[]` from the
13
+ * deprecated singular route (frozen: never cursor-paginated). Its call
14
+ * signature and return type are preserved for back-compat.
15
+ *
16
+ * @deprecated Prefer {@link ClientGroups.listPaginated}, which pages the
17
+ * canonical `GET /api/v1/crm/groups/` route lazily. Calling this emits a
18
+ * one-time `DeprecationWarning`.
19
+ */
20
+ list(): Promise<ClientGroup[]>;
21
+ /**
22
+ * List groups, cursor-paginated, newest first
23
+ * (`GET /api/v1/crm/groups/` — the canonical C2 route). Returns a
24
+ * {@link Page} you can walk manually or drain with `autoPaging()`.
25
+ *
26
+ * ```ts
27
+ * const page = await client.clientGroups.listPaginated({ limit: 100 });
28
+ * for (const group of page.results) { ... } // this page only
29
+ * for await (const group of page.autoPaging()) { ... } // every page, lazily
30
+ * ```
31
+ */
32
+ listPaginated(params?: ClientGroupListParams): Promise<Page<ClientGroup>>;
33
+ /**
34
+ * Create a group (`POST /api/v1/crm/groups/`). Membership is written via
35
+ * the write-only `client_ids` list; the response echoes full `clients`.
36
+ */
37
+ create(params: ClientGroupCreateParams): Promise<ClientGroup>;
38
+ /** Fetch one group (`GET /api/v1/crm/groups/{id}/`). */
39
+ retrieve(groupId: number): Promise<ClientGroup>;
40
+ /**
41
+ * Partial update (`PATCH /api/v1/crm/groups/{id}/`). When `client_ids` is
42
+ * given it REPLACES the whole membership.
43
+ */
44
+ update(groupId: number, params?: ClientGroupUpdateParams): Promise<ClientGroup>;
45
+ /** Full replace (`PUT /api/v1/crm/groups/{id}/`). */
46
+ replace(groupId: number, params: ClientGroupReplaceParams): Promise<ClientGroup>;
47
+ /** Delete a group (`DELETE /api/v1/crm/groups/{id}/`, 204). */
48
+ delete(groupId: number): Promise<void>;
49
+ }
50
+ //# sourceMappingURL=client-groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-groups.d.ts","sourceRoot":"","sources":["../../src/resources/client-groups.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AAiBnC,uEAAuE;AACvE,qBAAa,YAAY;;gBAGX,MAAM,EAAE,KAAK;IAIzB;;;;;;;;;;OAUG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAWpC;;;;;;;;;;OAUG;IACG,aAAa,CAAC,MAAM,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAWnF;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IAKnE,wDAAwD;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAKrD;;;OAGG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,uBAA4B,GAAG,OAAO,CAAC,WAAW,CAAC;IAOzF,qDAAqD;IAC/C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC;IAOtF,+DAA+D;IACzD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG7C"}
@@ -0,0 +1,97 @@
1
+ /** The ClientGroups resource — CRM client groups (broadcast audiences). */
2
+ import { dropNull, emitDeprecationWarning } from "../internal/utils.js";
3
+ import { Page } from "../pagination.js";
4
+ // Canonical plural route (C2): cursor-paginated LIST + all single-object CRUD.
5
+ const GROUPS_PATH = "/api/v1/crm/groups/";
6
+ // Deprecated singular route, frozen: its LIST returns a bare JSON array.
7
+ const GROUPS_LEGACY_PATH = "/api/v1/crm/group/";
8
+ /** Build a group body, omitting absent fields (SPEC 7). */
9
+ function groupBody(params) {
10
+ return dropNull({
11
+ name: params.name,
12
+ slug: params.slug,
13
+ client_ids: params.client_ids,
14
+ is_active: params.is_active,
15
+ });
16
+ }
17
+ /** `client.clientGroups` — group contacts into broadcast audiences. */
18
+ export class ClientGroups {
19
+ #client;
20
+ constructor(client) {
21
+ this.#client = client;
22
+ }
23
+ /**
24
+ * List every group as a bare array (`GET /api/v1/crm/group/`).
25
+ *
26
+ * This eagerly returns ALL groups as a plain `ClientGroup[]` from the
27
+ * deprecated singular route (frozen: never cursor-paginated). Its call
28
+ * signature and return type are preserved for back-compat.
29
+ *
30
+ * @deprecated Prefer {@link ClientGroups.listPaginated}, which pages the
31
+ * canonical `GET /api/v1/crm/groups/` route lazily. Calling this emits a
32
+ * one-time `DeprecationWarning`.
33
+ */
34
+ async list() {
35
+ emitDeprecationWarning("SILON_CRM_GROUPS_LIST", "silon: clientGroups.list() (GET /api/v1/crm/group/) returns a bare, " +
36
+ "unpaginated array from the deprecated singular route - prefer " +
37
+ "clientGroups.listPaginated() (GET /api/v1/crm/groups/), which is cursor-paginated.");
38
+ const data = await this.#client.request("GET", GROUPS_LEGACY_PATH);
39
+ return data;
40
+ }
41
+ /**
42
+ * List groups, cursor-paginated, newest first
43
+ * (`GET /api/v1/crm/groups/` — the canonical C2 route). Returns a
44
+ * {@link Page} you can walk manually or drain with `autoPaging()`.
45
+ *
46
+ * ```ts
47
+ * const page = await client.clientGroups.listPaginated({ limit: 100 });
48
+ * for (const group of page.results) { ... } // this page only
49
+ * for await (const group of page.autoPaging()) { ... } // every page, lazily
50
+ * ```
51
+ */
52
+ async listPaginated(params = {}) {
53
+ const query = dropNull({
54
+ cursor: params.cursor,
55
+ limit: params.limit,
56
+ });
57
+ const data = (await this.#client.request("GET", GROUPS_PATH, {
58
+ query,
59
+ }));
60
+ return new Page(this.#client, GROUPS_PATH, query, data);
61
+ }
62
+ /**
63
+ * Create a group (`POST /api/v1/crm/groups/`). Membership is written via
64
+ * the write-only `client_ids` list; the response echoes full `clients`.
65
+ */
66
+ async create(params) {
67
+ const data = await this.#client.request("POST", GROUPS_PATH, { body: groupBody(params) });
68
+ return data;
69
+ }
70
+ /** Fetch one group (`GET /api/v1/crm/groups/{id}/`). */
71
+ async retrieve(groupId) {
72
+ const data = await this.#client.request("GET", `${GROUPS_PATH}${groupId}/`);
73
+ return data;
74
+ }
75
+ /**
76
+ * Partial update (`PATCH /api/v1/crm/groups/{id}/`). When `client_ids` is
77
+ * given it REPLACES the whole membership.
78
+ */
79
+ async update(groupId, params = {}) {
80
+ const data = await this.#client.request("PATCH", `${GROUPS_PATH}${groupId}/`, {
81
+ body: groupBody(params),
82
+ });
83
+ return data;
84
+ }
85
+ /** Full replace (`PUT /api/v1/crm/groups/{id}/`). */
86
+ async replace(groupId, params) {
87
+ const data = await this.#client.request("PUT", `${GROUPS_PATH}${groupId}/`, {
88
+ body: groupBody(params),
89
+ });
90
+ return data;
91
+ }
92
+ /** Delete a group (`DELETE /api/v1/crm/groups/{id}/`, 204). */
93
+ async delete(groupId) {
94
+ await this.#client.request("DELETE", `${GROUPS_PATH}${groupId}/`);
95
+ }
96
+ }
97
+ //# sourceMappingURL=client-groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-groups.js","sourceRoot":"","sources":["../../src/resources/client-groups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /** The Clients resource — CRM contact profiles. */
2
+ import type { Silon } from "../client.js";
3
+ import { Page } from "../pagination.js";
4
+ import type { ClientCreateParams, ClientListParams, ClientProfile, ClientUpdateParams } from "../types/clients.js";
5
+ /** `client.clients` — manage CRM contact profiles. */
6
+ export declare class Clients {
7
+ #private;
8
+ constructor(client: Silon);
9
+ /**
10
+ * List every contact as a bare array (`GET /api/v1/crm/client/`).
11
+ *
12
+ * This eagerly returns ALL contacts as a plain `ClientProfile[]` from the
13
+ * deprecated singular route (frozen: never cursor-paginated). Its call
14
+ * signature and return type are preserved for back-compat.
15
+ *
16
+ * @deprecated Prefer {@link Clients.listPaginated}, which pages the canonical
17
+ * `GET /api/v1/crm/clients/` route lazily and scales past the singular
18
+ * route's unbounded response. Calling this emits a one-time
19
+ * `DeprecationWarning`.
20
+ */
21
+ list(): Promise<ClientProfile[]>;
22
+ /**
23
+ * List contacts, cursor-paginated, newest first
24
+ * (`GET /api/v1/crm/clients/` — the canonical C2 route). Returns a
25
+ * {@link Page} you can walk manually or drain with `autoPaging()`.
26
+ *
27
+ * ```ts
28
+ * const page = await client.clients.listPaginated({ limit: 100 });
29
+ * for (const contact of page.results) { ... } // this page only
30
+ * for await (const contact of page.autoPaging()) { ... } // every page, lazily
31
+ * ```
32
+ */
33
+ listPaginated(params?: ClientListParams): Promise<Page<ClientProfile>>;
34
+ /** Create a contact (`POST /api/v1/crm/clients/`). */
35
+ create(params: ClientCreateParams): Promise<ClientProfile>;
36
+ /** Fetch one contact (`GET /api/v1/crm/clients/{client_id}/`). */
37
+ retrieve(clientId: string): Promise<ClientProfile>;
38
+ /**
39
+ * Partial update (`PATCH /api/v1/crm/clients/{client_id}/`) — only the
40
+ * given fields change.
41
+ */
42
+ update(clientId: string, params?: ClientUpdateParams): Promise<ClientProfile>;
43
+ /**
44
+ * Full replace (`PUT /api/v1/crm/clients/{client_id}/`). `client_id` itself
45
+ * is immutable.
46
+ */
47
+ replace(clientId: string, params?: ClientUpdateParams): Promise<ClientProfile>;
48
+ /** Delete a contact (`DELETE /api/v1/crm/clients/{client_id}/`, 204). */
49
+ delete(clientId: string): Promise<void>;
50
+ }
51
+ //# sourceMappingURL=clients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/resources/clients.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAsB7B,sDAAsD;AACtD,qBAAa,OAAO;;gBAGN,MAAM,EAAE,KAAK;IAIzB;;;;;;;;;;;OAWG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAWtC;;;;;;;;;;OAUG;IACG,aAAa,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAWhF,sDAAsD;IAChD,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAKhE,kEAAkE;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQxD;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,aAAa,CAAC;IASvF;;;OAGG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,aAAa,CAAC;IASxF,yEAAyE;IACnE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9C"}