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 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/resources/push.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,4BAA4B,EAC5B,kBAAkB,EAClB,gBAAgB,EAEhB,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAc1B,6EAA6E;AAC7E,qBAAa,IAAI;;gBAGH,MAAM,EAAE,KAAK;IAIzB;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,eAAe,CAAC;IAMpF;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;IAU5E;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAYhF,2EAA2E;IACrE,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAOnE;;;;;;;;;OASG;IACG,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAU9B;;;;;;OAMG;IACG,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAcjF"}
@@ -0,0 +1,103 @@
1
+ /** The Push resource — device registration and native notification feeds. */
2
+ import { SilonError } from "../errors.js";
3
+ import { dropNull, emitDeprecationWarning } from "../internal/utils.js";
4
+ /**
5
+ * Resolve the legacy notification-feed path, validating `platform`
6
+ * client-side (before any deprecation warning or HTTP call — SPEC 7).
7
+ */
8
+ function notificationsPath(slug, platform) {
9
+ const encoded = encodeURIComponent(slug);
10
+ if (platform === "android")
11
+ return `/api/v1/push/android/${encoded}/`;
12
+ if (platform === "ios")
13
+ return `/api/v1/push/ios/${encoded}/`;
14
+ if (platform === null || platform === undefined)
15
+ return `/api/v1/push/list/${encoded}/`;
16
+ throw new SilonError("platform must be 'android', 'ios' or omitted (combined list).");
17
+ }
18
+ /** `client.push` — mobile / web push registration and notification feeds. */
19
+ export class Push {
20
+ #client;
21
+ constructor(client) {
22
+ this.#client = client;
23
+ }
24
+ /**
25
+ * Register an Android device token for the app `slug`
26
+ * (`POST /api/v1/subscribe/android/`).
27
+ */
28
+ async subscribeAndroid(params) {
29
+ const body = dropNull({ slug: params.slug, token: params.token });
30
+ const data = await this.#client.request("POST", "/api/v1/subscribe/android/", { body });
31
+ return data;
32
+ }
33
+ /**
34
+ * Register an iOS device token (`POST /api/v1/subscribe/ios/`).
35
+ * `environment`: `"dev"` or `"prod"`.
36
+ */
37
+ async subscribeIos(params) {
38
+ const body = dropNull({
39
+ slug: params.slug,
40
+ token: params.token,
41
+ environment: params.environment,
42
+ });
43
+ const data = await this.#client.request("POST", "/api/v1/subscribe/ios/", { body });
44
+ return data;
45
+ }
46
+ /**
47
+ * Register (or prune, with `keep_devices: false`) a client's devices
48
+ * (`POST /api/v1/push/client/`).
49
+ */
50
+ async upsertDevices(params) {
51
+ const body = dropNull({
52
+ client_id: params.client_id,
53
+ slug: params.slug,
54
+ device_type: params.device_type,
55
+ device_id: params.device_id,
56
+ keep_devices: params.keep_devices,
57
+ });
58
+ const data = await this.#client.request("POST", "/api/v1/push/client/", { body });
59
+ return data;
60
+ }
61
+ /** Mark a native push notification as read (`POST /api/v1/push/read/`). */
62
+ async markRead(params) {
63
+ const data = await this.#client.request("POST", "/api/v1/push/read/", {
64
+ body: { slug: params.slug },
65
+ });
66
+ return data;
67
+ }
68
+ /**
69
+ * List native push notifications (`GET /api/v1/push/android/{slug}/`,
70
+ * `/api/v1/push/ios/{slug}/`, or the combined `/api/v1/push/list/{slug}/`
71
+ * when `platform` is omitted) — a bare JSON array.
72
+ *
73
+ * @deprecated The native push notification list endpoints are legacy;
74
+ * calling this emits a one-time `DeprecationWarning`.
75
+ * @throws {SilonError} when `platform` is anything other than
76
+ * `"android"`, `"ios"` or omitted.
77
+ */
78
+ async listNotifications(slug, options = {}) {
79
+ const path = notificationsPath(slug, options.platform);
80
+ emitDeprecationWarning("SILON_PUSH_LIST_NOTIFICATIONS", "silon: push.listNotifications() uses the deprecated native push notification list endpoints.");
81
+ const data = await this.#client.request("GET", path);
82
+ return data;
83
+ }
84
+ /**
85
+ * Register a browser subscription for a client
86
+ * (`POST /api/v1/webpush/client/`).
87
+ *
88
+ * @deprecated Legacy endpoint — register web push subscriptions through
89
+ * the widget instead. Calling this emits a one-time `DeprecationWarning`.
90
+ */
91
+ async subscribeWeb(params) {
92
+ emitDeprecationWarning("SILON_PUSH_SUBSCRIBE_WEB", "silon: push.subscribeWeb() (POST /api/v1/webpush/client/) is a legacy endpoint; " +
93
+ "register web push subscriptions through the widget instead.");
94
+ const body = dropNull({
95
+ client_id: params.client_id,
96
+ slug: params.slug,
97
+ subscription_info: params.subscription_info,
98
+ });
99
+ const data = await this.#client.request("POST", "/api/v1/webpush/client/", { body });
100
+ return data;
101
+ }
102
+ }
103
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/resources/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /** The Reports resource — activity reports and provider balances. */
2
+ import type { Silon } from "../client.js";
3
+ import type { ProviderBalance, Report, ReportAwsUsageParams, ReportChannelsParams, ReportClientsParams, ReportDateRangeParams, ReportMessagesParams, ReportSpecificBulksParams, ReportSubscriptionsParams } from "../types/reports.js";
4
+ /** `client.reports` — activity reports (POST endpoints share a date-range filter). */
5
+ export declare class Reports {
6
+ #private;
7
+ constructor(client: Silon);
8
+ /**
9
+ * Messages activity (`POST /api/v1/reports/messages/`). `report_type`:
10
+ * `"phone"` (SMS/TTS/WhatsApp), `"email"`, `"mobile"` (push) or `"web"`
11
+ * (web push).
12
+ */
13
+ messages(params: ReportMessagesParams): Promise<Report>;
14
+ /** Per-channel activity (`POST /api/v1/reports/channels/`). */
15
+ channels(params?: ReportChannelsParams): Promise<Report>;
16
+ /** Contact activity (`POST /api/v1/reports/clients/`). */
17
+ clients(params?: ReportClientsParams): Promise<Report>;
18
+ /** Dashboard-user activity (`POST /api/v1/reports/users/`). */
19
+ users(params?: ReportDateRangeParams): Promise<Report>;
20
+ /** Bulk-batch activity (`POST /api/v1/reports/bulks/`). */
21
+ bulks(params?: ReportDateRangeParams): Promise<Report>;
22
+ /**
23
+ * Per-recipient rows of one bulk batch
24
+ * (`POST /api/v1/reports/specific-bulks/`).
25
+ */
26
+ specificBulks(params: ReportSpecificBulksParams): Promise<Report>;
27
+ /**
28
+ * Push-subscription activity (`POST /api/v1/reports/subscriptions/`).
29
+ * `report_type`: `"mobile"` or `"web"`.
30
+ */
31
+ subscriptions(params: ReportSubscriptionsParams): Promise<Report>;
32
+ /**
33
+ * AWS end-user-messaging usage
34
+ * (`POST /api/v1/reports/aws-usage-statistics/`). `page` travels as a
35
+ * query parameter — the request has no body.
36
+ */
37
+ awsUsage(params?: ReportAwsUsageParams): Promise<Report>;
38
+ /**
39
+ * Upstream balance for a provider account
40
+ * (`GET /api/v1/reports/balance/{slug}/`).
41
+ */
42
+ balance(slug: string): Promise<ProviderBalance>;
43
+ }
44
+ //# sourceMappingURL=reports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/resources/reports.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EACV,eAAe,EACf,MAAM,EACN,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,qBAAqB,CAAC;AAI7B,sFAAsF;AACtF,qBAAa,OAAO;;gBAGN,MAAM,EAAE,KAAK;IAIzB;;;;OAIG;IACG,QAAQ,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAe7D,+DAA+D;IACzD,QAAQ,CAAC,MAAM,GAAE,oBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IAUlE,0DAA0D;IACpD,OAAO,CAAC,MAAM,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;IAahE,+DAA+D;IACzD,KAAK,CAAC,MAAM,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAUhE,2DAA2D;IACrD,KAAK,CAAC,MAAM,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAUhE;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvE;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvE;;;;OAIG;IACG,QAAQ,CAAC,MAAM,GAAE,oBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQlE;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAOtD"}
@@ -0,0 +1,127 @@
1
+ /** The Reports resource — activity reports and provider balances. */
2
+ import { dropNull } from "../internal/utils.js";
3
+ const REPORTS_PATH = "/api/v1/reports";
4
+ /** `client.reports` — activity reports (POST endpoints share a date-range filter). */
5
+ export class Reports {
6
+ #client;
7
+ constructor(client) {
8
+ this.#client = client;
9
+ }
10
+ /**
11
+ * Messages activity (`POST /api/v1/reports/messages/`). `report_type`:
12
+ * `"phone"` (SMS/TTS/WhatsApp), `"email"`, `"mobile"` (push) or `"web"`
13
+ * (web push).
14
+ */
15
+ async messages(params) {
16
+ const body = dropNull({
17
+ report_type: params.report_type,
18
+ date_from: params.date_from,
19
+ date_to: params.date_to,
20
+ search: params.search,
21
+ device: params.device,
22
+ status: params.status,
23
+ template: params.template,
24
+ source: params.source,
25
+ });
26
+ const data = await this.#client.request("POST", `${REPORTS_PATH}/messages/`, { body });
27
+ return data;
28
+ }
29
+ /** Per-channel activity (`POST /api/v1/reports/channels/`). */
30
+ async channels(params = {}) {
31
+ const body = dropNull({
32
+ date_from: params.date_from,
33
+ date_to: params.date_to,
34
+ channel_name: params.channel_name,
35
+ });
36
+ const data = await this.#client.request("POST", `${REPORTS_PATH}/channels/`, { body });
37
+ return data;
38
+ }
39
+ /** Contact activity (`POST /api/v1/reports/clients/`). */
40
+ async clients(params = {}) {
41
+ const body = dropNull({
42
+ date_from: params.date_from,
43
+ date_to: params.date_to,
44
+ search: params.search,
45
+ language: params.language,
46
+ device: params.device,
47
+ web_subscription: params.web_subscription,
48
+ });
49
+ const data = await this.#client.request("POST", `${REPORTS_PATH}/clients/`, { body });
50
+ return data;
51
+ }
52
+ /** Dashboard-user activity (`POST /api/v1/reports/users/`). */
53
+ async users(params = {}) {
54
+ const body = dropNull({
55
+ date_from: params.date_from,
56
+ date_to: params.date_to,
57
+ search: params.search,
58
+ });
59
+ const data = await this.#client.request("POST", `${REPORTS_PATH}/users/`, { body });
60
+ return data;
61
+ }
62
+ /** Bulk-batch activity (`POST /api/v1/reports/bulks/`). */
63
+ async bulks(params = {}) {
64
+ const body = dropNull({
65
+ date_from: params.date_from,
66
+ date_to: params.date_to,
67
+ search: params.search,
68
+ });
69
+ const data = await this.#client.request("POST", `${REPORTS_PATH}/bulks/`, { body });
70
+ return data;
71
+ }
72
+ /**
73
+ * Per-recipient rows of one bulk batch
74
+ * (`POST /api/v1/reports/specific-bulks/`).
75
+ */
76
+ async specificBulks(params) {
77
+ const body = dropNull({
78
+ bulks_file: params.bulks_file,
79
+ date_from: params.date_from,
80
+ date_to: params.date_to,
81
+ search: params.search,
82
+ mobile_app: params.mobile_app,
83
+ web_app: params.web_app,
84
+ status: params.status,
85
+ });
86
+ const data = await this.#client.request("POST", `${REPORTS_PATH}/specific-bulks/`, { body });
87
+ return data;
88
+ }
89
+ /**
90
+ * Push-subscription activity (`POST /api/v1/reports/subscriptions/`).
91
+ * `report_type`: `"mobile"` or `"web"`.
92
+ */
93
+ async subscriptions(params) {
94
+ const body = dropNull({
95
+ report_type: params.report_type,
96
+ date_from: params.date_from,
97
+ date_to: params.date_to,
98
+ search: params.search,
99
+ mobile_app: params.mobile_app,
100
+ web_app: params.web_app,
101
+ device_type: params.device_type,
102
+ });
103
+ const data = await this.#client.request("POST", `${REPORTS_PATH}/subscriptions/`, { body });
104
+ return data;
105
+ }
106
+ /**
107
+ * AWS end-user-messaging usage
108
+ * (`POST /api/v1/reports/aws-usage-statistics/`). `page` travels as a
109
+ * query parameter — the request has no body.
110
+ */
111
+ async awsUsage(params = {}) {
112
+ const query = dropNull({ page: params.page });
113
+ const data = await this.#client.request("POST", `${REPORTS_PATH}/aws-usage-statistics/`, {
114
+ query,
115
+ });
116
+ return data;
117
+ }
118
+ /**
119
+ * Upstream balance for a provider account
120
+ * (`GET /api/v1/reports/balance/{slug}/`).
121
+ */
122
+ async balance(slug) {
123
+ const data = await this.#client.request("GET", `${REPORTS_PATH}/balance/${encodeURIComponent(slug)}/`);
124
+ return data;
125
+ }
126
+ }
127
+ //# sourceMappingURL=reports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/resources/reports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /** The Suppressions resource — the workspace do-not-contact list. */
2
+ import type { Silon } from "../client.js";
3
+ import { Page } from "../pagination.js";
4
+ import type { Suppression, SuppressionCreateParams, SuppressionListParams } from "../types/suppressions.js";
5
+ /**
6
+ * `client.suppressions` — manage the do-not-contact list.
7
+ *
8
+ * A suppression matches sends on (address, channel), or on the address alone
9
+ * when `channel` is null (all channels). Enforcement is automatic on every
10
+ * send path: a single-recipient send (`messages.send` with `to`, `otp.send`)
11
+ * to a suppressed address rejects `422 recipient-suppressed`, while fan-outs
12
+ * (broadcasts, batches, legacy bulk) silently SKIP suppressed recipients and
13
+ * itemise them in the envelope's `skipped.suppressed` count.
14
+ *
15
+ * Rows are livemode-scoped: `sk_test_` keys list, manage and enforce
16
+ * test-mode suppressions only, live keys live ones.
17
+ */
18
+ export declare class Suppressions {
19
+ #private;
20
+ constructor(client: Silon);
21
+ /**
22
+ * List suppressions, cursor-paginated, newest first
23
+ * (`GET /api/v1/suppressions/`; scope `suppressions:read`). Filter with
24
+ * `address`, `channel` and/or `reason`.
25
+ *
26
+ * ```ts
27
+ * const page = await client.suppressions.list({ reason: "stop" });
28
+ * for await (const row of page.autoPaging()) { ... }
29
+ * ```
30
+ */
31
+ list(params?: SuppressionListParams): Promise<Page<Suppression>>;
32
+ /**
33
+ * Add an address to the do-not-contact list
34
+ * (`POST /api/v1/suppressions/`; scope `suppressions:write`).
35
+ *
36
+ * `address` is an E.164 phone number or an email. Omit `channel` to
37
+ * suppress across every channel, or pass one (e.g. `"sms"`) to scope the
38
+ * row. `reason` defaults to `"manual"`.
39
+ *
40
+ * Create is IDEMPOTENT BY NATURE: a new row answers `201`; re-creating the
41
+ * same (address, channel) pair in the same mode answers `200` with the
42
+ * EXISTING suppression object — never an error, so no `Idempotency-Key`
43
+ * header is sent (none is needed).
44
+ */
45
+ create(params: SuppressionCreateParams): Promise<Suppression>;
46
+ /**
47
+ * Remove an address from the do-not-contact list
48
+ * (`DELETE /api/v1/suppressions/{id}/`, 204; scope `suppressions:write`).
49
+ * Sends to it are accepted again immediately. An unknown — or
50
+ * mode-mismatched — id rejects with `404`.
51
+ */
52
+ delete(suppressionId: string): Promise<void>;
53
+ }
54
+ //# sourceMappingURL=suppressions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppressions.d.ts","sourceRoot":"","sources":["../../src/resources/suppressions.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,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,EACtB,MAAM,0BAA0B,CAAC;AAKlC;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;;gBAGX,MAAM,EAAE,KAAK;IAIzB;;;;;;;;;OASG;IACG,IAAI,CAAC,MAAM,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAc1E;;;;;;;;;;;;OAYG;IACG,MAAM,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IAUnE;;;;;OAKG;IACG,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMnD"}
@@ -0,0 +1,79 @@
1
+ /** The Suppressions resource — the workspace do-not-contact list. */
2
+ import { dropNull } from "../internal/utils.js";
3
+ import { Page } from "../pagination.js";
4
+ // NOTE: trailing slashes on this resource (SPEC 7).
5
+ const SUPPRESSIONS_PATH = "/api/v1/suppressions/";
6
+ /**
7
+ * `client.suppressions` — manage the do-not-contact list.
8
+ *
9
+ * A suppression matches sends on (address, channel), or on the address alone
10
+ * when `channel` is null (all channels). Enforcement is automatic on every
11
+ * send path: a single-recipient send (`messages.send` with `to`, `otp.send`)
12
+ * to a suppressed address rejects `422 recipient-suppressed`, while fan-outs
13
+ * (broadcasts, batches, legacy bulk) silently SKIP suppressed recipients and
14
+ * itemise them in the envelope's `skipped.suppressed` count.
15
+ *
16
+ * Rows are livemode-scoped: `sk_test_` keys list, manage and enforce
17
+ * test-mode suppressions only, live keys live ones.
18
+ */
19
+ export class Suppressions {
20
+ #client;
21
+ constructor(client) {
22
+ this.#client = client;
23
+ }
24
+ /**
25
+ * List suppressions, cursor-paginated, newest first
26
+ * (`GET /api/v1/suppressions/`; scope `suppressions:read`). Filter with
27
+ * `address`, `channel` and/or `reason`.
28
+ *
29
+ * ```ts
30
+ * const page = await client.suppressions.list({ reason: "stop" });
31
+ * for await (const row of page.autoPaging()) { ... }
32
+ * ```
33
+ */
34
+ async list(params = {}) {
35
+ const query = dropNull({
36
+ address: params.address,
37
+ channel: params.channel,
38
+ reason: params.reason,
39
+ cursor: params.cursor,
40
+ limit: params.limit,
41
+ });
42
+ const data = (await this.#client.request("GET", SUPPRESSIONS_PATH, {
43
+ query,
44
+ }));
45
+ return new Page(this.#client, SUPPRESSIONS_PATH, query, data);
46
+ }
47
+ /**
48
+ * Add an address to the do-not-contact list
49
+ * (`POST /api/v1/suppressions/`; scope `suppressions:write`).
50
+ *
51
+ * `address` is an E.164 phone number or an email. Omit `channel` to
52
+ * suppress across every channel, or pass one (e.g. `"sms"`) to scope the
53
+ * row. `reason` defaults to `"manual"`.
54
+ *
55
+ * Create is IDEMPOTENT BY NATURE: a new row answers `201`; re-creating the
56
+ * same (address, channel) pair in the same mode answers `200` with the
57
+ * EXISTING suppression object — never an error, so no `Idempotency-Key`
58
+ * header is sent (none is needed).
59
+ */
60
+ async create(params) {
61
+ const body = dropNull({
62
+ address: params.address,
63
+ channel: params.channel,
64
+ reason: params.reason,
65
+ });
66
+ const data = await this.#client.request("POST", SUPPRESSIONS_PATH, { body });
67
+ return data;
68
+ }
69
+ /**
70
+ * Remove an address from the do-not-contact list
71
+ * (`DELETE /api/v1/suppressions/{id}/`, 204; scope `suppressions:write`).
72
+ * Sends to it are accepted again immediately. An unknown — or
73
+ * mode-mismatched — id rejects with `404`.
74
+ */
75
+ async delete(suppressionId) {
76
+ await this.#client.request("DELETE", `${SUPPRESSIONS_PATH}${encodeURIComponent(suppressionId)}/`);
77
+ }
78
+ }
79
+ //# sourceMappingURL=suppressions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppressions.js","sourceRoot":"","sources":["../../src/resources/suppressions.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAGrE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAO7D,oDAAoD;AACpD,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAElD;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,YAAY;IACd,OAAO,CAAQ;IAExB,YAAY,MAAa;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI,CAAC,SAAgC,EAAE;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAgB,CAAC;QAClB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,EAAE;YACjE,KAAK;SACN,CAAC,CAAgC,CAAC;QACnC,OAAO,IAAI,IAAI,CAAc,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,MAAM,CAAC,MAA+B;QAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,OAAO,IAAmB,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACxB,QAAQ,EACR,GAAG,iBAAiB,GAAG,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAC5D,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,58 @@
1
+ /** The Templates resource — slug-keyed message templates with immutable versions. */
2
+ import type { Silon } from "../client.js";
3
+ import { Page } from "../pagination.js";
4
+ import type { TemplateCreateParams, TemplateDetail, TemplateListParams, TemplateRow, TemplateUpdateParams } from "../types/templates.js";
5
+ /**
6
+ * `client.templates` — reusable message templates that sends render for
7
+ * `template: {slug}`.
8
+ *
9
+ * Templates carry an IMMUTABLE version spine: content edits mint a new version
10
+ * (starting at 1) rather than mutating the old one, and a send can pin an
11
+ * older revision via `template: {slug, version: N}` (honoured on every send
12
+ * path — `messages.send`, `broadcasts.create`, batch rows/defaults). Deleting
13
+ * is a soft archive: the slug stays reserved and history survives, but the
14
+ * template reads as MISSING everywhere afterwards.
15
+ */
16
+ export declare class Templates {
17
+ #private;
18
+ constructor(client: Silon);
19
+ /**
20
+ * List templates, cursor-paginated (`GET /api/v1/templates/`; scope
21
+ * `templates:read`). Filter with `channel` and/or `q` (slug-prefix search).
22
+ *
23
+ * ```ts
24
+ * const page = await client.templates.list({ q: "welcome" });
25
+ * for await (const row of page.autoPaging()) { ... }
26
+ * ```
27
+ */
28
+ list(params?: TemplateListParams): Promise<Page<TemplateRow>>;
29
+ /**
30
+ * Create a template (`POST /api/v1/templates/`; scope `templates:write`) —
31
+ * returns the detail at version 1. A duplicate slug (including an archived
32
+ * one) rejects `409 template-exists`.
33
+ */
34
+ create(params: TemplateCreateParams): Promise<TemplateDetail>;
35
+ /**
36
+ * Fetch one template with its content + version history
37
+ * (`GET /api/v1/templates/{slug}/`; scope `templates:read`). An unknown or
38
+ * archived slug rejects `404 template-not-found`.
39
+ */
40
+ retrieve(slug: string): Promise<TemplateDetail>;
41
+ /**
42
+ * Partial update (`PATCH /api/v1/templates/{slug}/`; scope
43
+ * `templates:write`). Pass at least one field. Changing a CONTENT field
44
+ * (`subject`, `body`, `body_md`) mints a new immutable version; `channel`
45
+ * is metadata and never bumps the version; a no-op content PATCH mints
46
+ * nothing. An unknown or archived slug rejects `404 template-not-found`.
47
+ */
48
+ update(slug: string, params?: TemplateUpdateParams): Promise<TemplateDetail>;
49
+ /**
50
+ * Soft-archive a template (`DELETE /api/v1/templates/{slug}/`, 204; scope
51
+ * `templates:write`). The slug stays reserved (re-create rejects
52
+ * `409 template-exists`) and history + delivery-log FKs survive, but the
53
+ * template reads as MISSING everywhere afterwards. An unknown or already
54
+ * archived slug rejects `404 template-not-found`.
55
+ */
56
+ delete(slug: string): Promise<void>;
57
+ }
58
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/resources/templates.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAK/B;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;;gBAGR,MAAM,EAAE,KAAK;IAIzB;;;;;;;;OAQG;IACG,IAAI,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAavE;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAYnE;;;;OAIG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQrD;;;;;;OAMG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,oBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC;IAetF;;;;;;OAMG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAM1C"}
@@ -0,0 +1,96 @@
1
+ /** The Templates resource — slug-keyed message templates with immutable versions. */
2
+ import { dropNull } from "../internal/utils.js";
3
+ import { Page } from "../pagination.js";
4
+ // NOTE: trailing slashes on this resource (SPEC 7; trailing-slash-optional).
5
+ const TEMPLATES_PATH = "/api/v1/templates/";
6
+ /**
7
+ * `client.templates` — reusable message templates that sends render for
8
+ * `template: {slug}`.
9
+ *
10
+ * Templates carry an IMMUTABLE version spine: content edits mint a new version
11
+ * (starting at 1) rather than mutating the old one, and a send can pin an
12
+ * older revision via `template: {slug, version: N}` (honoured on every send
13
+ * path — `messages.send`, `broadcasts.create`, batch rows/defaults). Deleting
14
+ * is a soft archive: the slug stays reserved and history survives, but the
15
+ * template reads as MISSING everywhere afterwards.
16
+ */
17
+ export class Templates {
18
+ #client;
19
+ constructor(client) {
20
+ this.#client = client;
21
+ }
22
+ /**
23
+ * List templates, cursor-paginated (`GET /api/v1/templates/`; scope
24
+ * `templates:read`). Filter with `channel` and/or `q` (slug-prefix search).
25
+ *
26
+ * ```ts
27
+ * const page = await client.templates.list({ q: "welcome" });
28
+ * for await (const row of page.autoPaging()) { ... }
29
+ * ```
30
+ */
31
+ async list(params = {}) {
32
+ const query = dropNull({
33
+ channel: params.channel,
34
+ q: params.q,
35
+ cursor: params.cursor,
36
+ limit: params.limit,
37
+ });
38
+ const data = (await this.#client.request("GET", TEMPLATES_PATH, {
39
+ query,
40
+ }));
41
+ return new Page(this.#client, TEMPLATES_PATH, query, data);
42
+ }
43
+ /**
44
+ * Create a template (`POST /api/v1/templates/`; scope `templates:write`) —
45
+ * returns the detail at version 1. A duplicate slug (including an archived
46
+ * one) rejects `409 template-exists`.
47
+ */
48
+ async create(params) {
49
+ const body = dropNull({
50
+ slug: params.slug,
51
+ channel: params.channel,
52
+ subject: params.subject,
53
+ body: params.body,
54
+ body_md: params.body_md,
55
+ });
56
+ const data = await this.#client.request("POST", TEMPLATES_PATH, { body });
57
+ return data;
58
+ }
59
+ /**
60
+ * Fetch one template with its content + version history
61
+ * (`GET /api/v1/templates/{slug}/`; scope `templates:read`). An unknown or
62
+ * archived slug rejects `404 template-not-found`.
63
+ */
64
+ async retrieve(slug) {
65
+ const data = await this.#client.request("GET", `${TEMPLATES_PATH}${encodeURIComponent(slug)}/`);
66
+ return data;
67
+ }
68
+ /**
69
+ * Partial update (`PATCH /api/v1/templates/{slug}/`; scope
70
+ * `templates:write`). Pass at least one field. Changing a CONTENT field
71
+ * (`subject`, `body`, `body_md`) mints a new immutable version; `channel`
72
+ * is metadata and never bumps the version; a no-op content PATCH mints
73
+ * nothing. An unknown or archived slug rejects `404 template-not-found`.
74
+ */
75
+ async update(slug, params = {}) {
76
+ const body = dropNull({
77
+ channel: params.channel,
78
+ subject: params.subject,
79
+ body: params.body,
80
+ body_md: params.body_md,
81
+ });
82
+ const data = await this.#client.request("PATCH", `${TEMPLATES_PATH}${encodeURIComponent(slug)}/`, { body });
83
+ return data;
84
+ }
85
+ /**
86
+ * Soft-archive a template (`DELETE /api/v1/templates/{slug}/`, 204; scope
87
+ * `templates:write`). The slug stays reserved (re-create rejects
88
+ * `409 template-exists`) and history + delivery-log FKs survive, but the
89
+ * template reads as MISSING everywhere afterwards. An unknown or already
90
+ * archived slug rejects `404 template-not-found`.
91
+ */
92
+ async delete(slug) {
93
+ await this.#client.request("DELETE", `${TEMPLATES_PATH}${encodeURIComponent(slug)}/`);
94
+ }
95
+ }
96
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/resources/templates.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAGrF,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAS7D,6EAA6E;AAC7E,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,MAAM,OAAO,SAAS;IACX,OAAO,CAAQ;IAExB,YAAY,MAAa;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,SAA6B,EAAE;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAgB,CAAC;QAClB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE;YAC9D,KAAK;SACN,CAAC,CAAgC,CAAC;QACnC,OAAO,IAAI,IAAI,CAAc,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,MAA4B;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAsB,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACrC,KAAK,EACL,GAAG,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAChD,CAAC;QACF,OAAO,IAAsB,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,SAA+B,EAAE;QAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACrC,OAAO,EACP,GAAG,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAC/C,EAAE,IAAI,EAAE,CACT,CAAC;QACF,OAAO,IAAsB,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACxB,QAAQ,EACR,GAAG,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAChD,CAAC;IACJ,CAAC;CACF"}