@decaf-ts/integrations 0.12.0 → 0.14.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 (156) hide show
  1. package/dist/integrations.cjs +1 -1
  2. package/lib/cjs/calendar/environment.cjs +48 -0
  3. package/lib/cjs/calendar/environment.cjs.map +1 -0
  4. package/lib/cjs/calendar/google-calendar/GoogleCalendarService.cjs +338 -0
  5. package/lib/cjs/calendar/google-calendar/GoogleCalendarService.cjs.map +1 -0
  6. package/lib/cjs/calendar/google-calendar/index.cjs +20 -0
  7. package/lib/cjs/calendar/google-calendar/index.cjs.map +1 -0
  8. package/lib/cjs/comms/discord/DiscordService.cjs +318 -0
  9. package/lib/cjs/comms/discord/DiscordService.cjs.map +1 -0
  10. package/lib/cjs/comms/discord/index.cjs +19 -0
  11. package/lib/cjs/comms/discord/index.cjs.map +1 -0
  12. package/lib/cjs/comms/environment.cjs +16 -0
  13. package/lib/cjs/comms/environment.cjs.map +1 -1
  14. package/lib/cjs/comms/index.cjs +3 -0
  15. package/lib/cjs/comms/index.cjs.map +1 -1
  16. package/lib/cjs/comms/outlook/MicrosoftOutlookService.cjs +325 -0
  17. package/lib/cjs/comms/outlook/MicrosoftOutlookService.cjs.map +1 -0
  18. package/lib/cjs/comms/outlook/index.cjs +19 -0
  19. package/lib/cjs/comms/outlook/index.cjs.map +1 -0
  20. package/lib/cjs/comms/whatsapp/WhatsAppService.cjs +274 -0
  21. package/lib/cjs/comms/whatsapp/WhatsAppService.cjs.map +1 -0
  22. package/lib/cjs/comms/whatsapp/index.cjs +19 -0
  23. package/lib/cjs/comms/whatsapp/index.cjs.map +1 -0
  24. package/lib/cjs/index.cjs +3 -3
  25. package/lib/cjs/io/confluence/ConfluenceService.cjs +317 -0
  26. package/lib/cjs/io/confluence/ConfluenceService.cjs.map +1 -0
  27. package/lib/cjs/io/confluence/index.cjs +19 -0
  28. package/lib/cjs/io/confluence/index.cjs.map +1 -0
  29. package/lib/cjs/io/environment.cjs +28 -0
  30. package/lib/cjs/io/environment.cjs.map +1 -1
  31. package/lib/cjs/io/google-docs/GoogleDocsService.cjs +275 -0
  32. package/lib/cjs/io/google-docs/GoogleDocsService.cjs.map +1 -0
  33. package/lib/cjs/io/google-docs/index.cjs +19 -0
  34. package/lib/cjs/io/google-docs/index.cjs.map +1 -0
  35. package/lib/cjs/io/index.cjs +5 -0
  36. package/lib/cjs/io/index.cjs.map +1 -1
  37. package/lib/cjs/io/jira/JiraService.cjs +354 -0
  38. package/lib/cjs/io/jira/JiraService.cjs.map +1 -0
  39. package/lib/cjs/io/jira/index.cjs +19 -0
  40. package/lib/cjs/io/jira/index.cjs.map +1 -0
  41. package/lib/cjs/io/microsoft-excel/MicrosoftExcelService.cjs +253 -0
  42. package/lib/cjs/io/microsoft-excel/MicrosoftExcelService.cjs.map +1 -0
  43. package/lib/cjs/io/microsoft-excel/index.cjs +19 -0
  44. package/lib/cjs/io/microsoft-excel/index.cjs.map +1 -0
  45. package/lib/cjs/io/microsoft-sharepoint/MicrosoftSharePointService.cjs +261 -0
  46. package/lib/cjs/io/microsoft-sharepoint/MicrosoftSharePointService.cjs.map +1 -0
  47. package/lib/cjs/io/microsoft-sharepoint/index.cjs +19 -0
  48. package/lib/cjs/io/microsoft-sharepoint/index.cjs.map +1 -0
  49. package/lib/cjs/sftp/aws/index.cjs +24 -0
  50. package/lib/cjs/sftp/aws/index.cjs.map +1 -0
  51. package/lib/cjs/sftp/ssh2/index.cjs +24 -0
  52. package/lib/cjs/sftp/ssh2/index.cjs.map +1 -0
  53. package/lib/esm/calendar/environment.js +44 -0
  54. package/lib/esm/calendar/environment.js.map +1 -0
  55. package/lib/esm/calendar/google-calendar/GoogleCalendarService.js +333 -0
  56. package/lib/esm/calendar/google-calendar/GoogleCalendarService.js.map +1 -0
  57. package/lib/esm/calendar/google-calendar/index.js +3 -0
  58. package/lib/esm/calendar/google-calendar/index.js.map +1 -0
  59. package/lib/esm/comms/discord/DiscordService.js +313 -0
  60. package/lib/esm/comms/discord/DiscordService.js.map +1 -0
  61. package/lib/esm/comms/discord/index.js +2 -0
  62. package/lib/esm/comms/discord/index.js.map +1 -0
  63. package/lib/esm/comms/environment.js +16 -0
  64. package/lib/esm/comms/environment.js.map +1 -1
  65. package/lib/esm/comms/index.js +3 -0
  66. package/lib/esm/comms/index.js.map +1 -1
  67. package/lib/esm/comms/outlook/MicrosoftOutlookService.js +320 -0
  68. package/lib/esm/comms/outlook/MicrosoftOutlookService.js.map +1 -0
  69. package/lib/esm/comms/outlook/index.js +2 -0
  70. package/lib/esm/comms/outlook/index.js.map +1 -0
  71. package/lib/esm/comms/whatsapp/WhatsAppService.js +269 -0
  72. package/lib/esm/comms/whatsapp/WhatsAppService.js.map +1 -0
  73. package/lib/esm/comms/whatsapp/index.js +2 -0
  74. package/lib/esm/comms/whatsapp/index.js.map +1 -0
  75. package/lib/esm/index.js +3 -3
  76. package/lib/esm/io/confluence/ConfluenceService.js +312 -0
  77. package/lib/esm/io/confluence/ConfluenceService.js.map +1 -0
  78. package/lib/esm/io/confluence/index.js +2 -0
  79. package/lib/esm/io/confluence/index.js.map +1 -0
  80. package/lib/esm/io/environment.js +28 -0
  81. package/lib/esm/io/environment.js.map +1 -1
  82. package/lib/esm/io/google-docs/GoogleDocsService.js +270 -0
  83. package/lib/esm/io/google-docs/GoogleDocsService.js.map +1 -0
  84. package/lib/esm/io/google-docs/index.js +2 -0
  85. package/lib/esm/io/google-docs/index.js.map +1 -0
  86. package/lib/esm/io/index.js +5 -0
  87. package/lib/esm/io/index.js.map +1 -1
  88. package/lib/esm/io/jira/JiraService.js +349 -0
  89. package/lib/esm/io/jira/JiraService.js.map +1 -0
  90. package/lib/esm/io/jira/index.js +2 -0
  91. package/lib/esm/io/jira/index.js.map +1 -0
  92. package/lib/esm/io/microsoft-excel/MicrosoftExcelService.js +248 -0
  93. package/lib/esm/io/microsoft-excel/MicrosoftExcelService.js.map +1 -0
  94. package/lib/esm/io/microsoft-excel/index.js +2 -0
  95. package/lib/esm/io/microsoft-excel/index.js.map +1 -0
  96. package/lib/esm/io/microsoft-sharepoint/MicrosoftSharePointService.js +256 -0
  97. package/lib/esm/io/microsoft-sharepoint/MicrosoftSharePointService.js.map +1 -0
  98. package/lib/esm/io/microsoft-sharepoint/index.js +2 -0
  99. package/lib/esm/io/microsoft-sharepoint/index.js.map +1 -0
  100. package/lib/esm/sftp/aws/index.js +7 -0
  101. package/lib/esm/sftp/aws/index.js.map +1 -0
  102. package/lib/esm/sftp/ssh2/index.js +7 -0
  103. package/lib/esm/sftp/ssh2/index.js.map +1 -0
  104. package/lib/types/calendar/environment.d.cts +48 -0
  105. package/lib/types/calendar/environment.d.mts +48 -0
  106. package/lib/types/calendar/google-calendar/GoogleCalendarService.d.cts +316 -0
  107. package/lib/types/calendar/google-calendar/GoogleCalendarService.d.mts +316 -0
  108. package/lib/types/calendar/google-calendar/index.d.cts +2 -0
  109. package/lib/types/calendar/google-calendar/index.d.mts +2 -0
  110. package/lib/types/comms/discord/DiscordService.d.cts +285 -0
  111. package/lib/types/comms/discord/DiscordService.d.mts +285 -0
  112. package/lib/types/comms/discord/index.d.cts +1 -0
  113. package/lib/types/comms/discord/index.d.mts +1 -0
  114. package/lib/types/comms/environment.d.cts +34 -8
  115. package/lib/types/comms/environment.d.mts +34 -8
  116. package/lib/types/comms/index.d.cts +3 -0
  117. package/lib/types/comms/index.d.mts +3 -0
  118. package/lib/types/comms/outlook/MicrosoftOutlookService.d.cts +282 -0
  119. package/lib/types/comms/outlook/MicrosoftOutlookService.d.mts +282 -0
  120. package/lib/types/comms/outlook/index.d.cts +1 -0
  121. package/lib/types/comms/outlook/index.d.mts +1 -0
  122. package/lib/types/comms/whatsapp/WhatsAppService.d.cts +258 -0
  123. package/lib/types/comms/whatsapp/WhatsAppService.d.mts +258 -0
  124. package/lib/types/comms/whatsapp/index.d.cts +1 -0
  125. package/lib/types/comms/whatsapp/index.d.mts +1 -0
  126. package/lib/types/index.d.cts +2 -2
  127. package/lib/types/index.d.mts +2 -2
  128. package/lib/types/io/confluence/ConfluenceService.d.cts +250 -0
  129. package/lib/types/io/confluence/ConfluenceService.d.mts +250 -0
  130. package/lib/types/io/confluence/index.d.cts +1 -0
  131. package/lib/types/io/confluence/index.d.mts +1 -0
  132. package/lib/types/io/environment.d.cts +52 -12
  133. package/lib/types/io/environment.d.mts +52 -12
  134. package/lib/types/io/google-docs/GoogleDocsService.d.cts +188 -0
  135. package/lib/types/io/google-docs/GoogleDocsService.d.mts +188 -0
  136. package/lib/types/io/google-docs/index.d.cts +1 -0
  137. package/lib/types/io/google-docs/index.d.mts +1 -0
  138. package/lib/types/io/index.d.cts +5 -0
  139. package/lib/types/io/index.d.mts +5 -0
  140. package/lib/types/io/jira/JiraService.d.cts +300 -0
  141. package/lib/types/io/jira/JiraService.d.mts +300 -0
  142. package/lib/types/io/jira/index.d.cts +1 -0
  143. package/lib/types/io/jira/index.d.mts +1 -0
  144. package/lib/types/io/microsoft-excel/MicrosoftExcelService.d.cts +230 -0
  145. package/lib/types/io/microsoft-excel/MicrosoftExcelService.d.mts +230 -0
  146. package/lib/types/io/microsoft-excel/index.d.cts +1 -0
  147. package/lib/types/io/microsoft-excel/index.d.mts +1 -0
  148. package/lib/types/io/microsoft-sharepoint/MicrosoftSharePointService.d.cts +226 -0
  149. package/lib/types/io/microsoft-sharepoint/MicrosoftSharePointService.d.mts +226 -0
  150. package/lib/types/io/microsoft-sharepoint/index.d.cts +1 -0
  151. package/lib/types/io/microsoft-sharepoint/index.d.mts +1 -0
  152. package/lib/types/sftp/aws/index.d.cts +6 -0
  153. package/lib/types/sftp/aws/index.d.mts +6 -0
  154. package/lib/types/sftp/ssh2/index.d.cts +6 -0
  155. package/lib/types/sftp/ssh2/index.d.mts +6 -0
  156. package/package.json +263 -59
@@ -0,0 +1,325 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MicrosoftOutlookService = void 0;
4
+ /**
5
+ * @module integrations/comms/outlook/service
6
+ * @summary Microsoft Outlook mail and calendar integration service (Microsoft Graph).
7
+ * @description Exposes Outlook mail (`sendMail`, `listMessages`, `getMessage`)
8
+ * and calendar (`listEvents`, `createEvent`, `deleteEvent`) operations through
9
+ * Microsoft Graph `v1.0` as an undecorated client-based service built on
10
+ * {@link HttpApiService}. Configuration comes from an explicit
11
+ * `OutlookServiceConfig` or the `comms.outlook` environment slice; the access
12
+ * token is sent as `Authorization: Bearer <token>`. Credentials are referenced
13
+ * from configuration (and, from as-graph nodes, from the resolved
14
+ * `microsoft-outlook` credential secret) and are never embedded in source.
15
+ * Failures are mapped to decaf errors via {@link httpError}.
16
+ */
17
+ const db_decorators_1 = require("@decaf-ts/db-decorators");
18
+ const environment_js_1 = require("./../environment.cjs");
19
+ const environmentValue_js_1 = require("./../../shared/environmentValue.cjs");
20
+ const index_js_1 = require("./../../shared/http/index.cjs");
21
+ /**
22
+ * @description Normalizes Outlook recipient addresses into Graph recipients
23
+ * @summary Accepts a single address, an array, or a comma/semicolon-separated
24
+ * string, trims entries, drops blanks, and maps each address to the Graph
25
+ * `{ emailAddress: { address } }` envelope.
26
+ * @param {string | string[] | undefined} value - The raw recipient value.
27
+ * @returns {Array<{ emailAddress: { address: string } }>} The Graph recipient envelopes.
28
+ */
29
+ function recipientList(value) {
30
+ if (!value)
31
+ return [];
32
+ const values = Array.isArray(value)
33
+ ? value
34
+ : value.split(/[,;]/).map((entry) => entry.trim());
35
+ return values
36
+ .map((entry) => entry.trim())
37
+ .filter((entry) => entry.length > 0)
38
+ .map((address) => ({ emailAddress: { address } }));
39
+ }
40
+ /**
41
+ * @description Microsoft Outlook (Graph) mail and calendar integration service
42
+ * @summary An undecorated HTTP service for sending and reading mail and for
43
+ * listing, creating, and deleting calendar events on the signed-in user
44
+ * (`/me`). Every operation requires a Graph access token; missing credentials
45
+ * or identifiers raise `InternalError`, and transport failures are mapped to
46
+ * decaf errors via {@link httpError}.
47
+ * @class MicrosoftOutlookService
48
+ * @extends HttpApiService
49
+ * @category Comms
50
+ * @example
51
+ * ```ts
52
+ * import { MicrosoftOutlookService } from "@decaf-ts/integrations/comms/outlook";
53
+ *
54
+ * const outlook = new MicrosoftOutlookService();
55
+ * await outlook.initialize({
56
+ * token: process.env.GRAPH_CREDENTIAL_MICROSOFT_OUTLOOK_TOKEN,
57
+ * });
58
+ * await outlook.sendMail({
59
+ * to: "team@example.com",
60
+ * subject: "Deployment finished",
61
+ * body: "Release 1.2.0 is live",
62
+ * });
63
+ * ```
64
+ * @mermaid
65
+ * sequenceDiagram
66
+ * autonumber
67
+ * participant Caller
68
+ * participant Service as MicrosoftOutlookService
69
+ * participant Graph as Microsoft Graph
70
+ * Caller->>Service: sendMail(input)
71
+ * activate Service
72
+ * Service->>Service: requireAccessToken()
73
+ * Service->>Graph: POST /me/sendMail
74
+ * activate Graph
75
+ * Graph-->>Service: 202 Accepted
76
+ * deactivate Graph
77
+ * Service-->>Caller: { sent, to, subject }
78
+ * deactivate Service
79
+ * @memberOf module:integrations/comms/outlook/service
80
+ */
81
+ class MicrosoftOutlookService extends index_js_1.HttpApiService {
82
+ constructor() {
83
+ super(...arguments);
84
+ /**
85
+ * @description The provider name used in error messages
86
+ */
87
+ this.serviceName = "Microsoft Outlook";
88
+ }
89
+ /**
90
+ * @description The Microsoft Graph base URL
91
+ * @summary Used when the resolved config carries no `baseUrl`.
92
+ * @returns {string} `"https://graph.microsoft.com/v1.0"`.
93
+ */
94
+ defaultBaseUrl() {
95
+ return "https://graph.microsoft.com/v1.0";
96
+ }
97
+ /**
98
+ * @description Builds the Microsoft Graph bearer authorization headers
99
+ * @summary Returns `Authorization: Bearer <token>` when configured, and no
100
+ * headers otherwise.
101
+ * @param {OutlookServiceConfig} config - The resolved service configuration.
102
+ * @returns {Record<string, string>} The authorization headers (empty without a token).
103
+ */
104
+ authHeaders(config) {
105
+ return config.token ? { Authorization: `Bearer ${config.token}` } : {};
106
+ }
107
+ /**
108
+ * @description Reads the Outlook credentials and defaults from the environment
109
+ * @summary Reads the `comms.outlook` slice and returns a partial config when
110
+ * an access token is configured, `undefined` otherwise. Values pass through
111
+ * `envString`/`envNumber` to reject unset-leaf proxies.
112
+ * @returns {Partial<OutlookServiceConfig> | undefined} A partial config, or `undefined` when no Outlook token is configured.
113
+ */
114
+ configFromEnvironment() {
115
+ const env = environment_js_1.CommsEnvironment.comms.outlook;
116
+ const token = (0, environmentValue_js_1.envString)(env?.token);
117
+ if (!token)
118
+ return undefined;
119
+ return {
120
+ token,
121
+ baseUrl: (0, environmentValue_js_1.envString)(env.baseUrl),
122
+ timeout: (0, environmentValue_js_1.envNumber)(env.timeout),
123
+ };
124
+ }
125
+ /**
126
+ * @description Asserts that a Microsoft Graph access token is configured
127
+ * @summary Delegates to the shared `requireToken()` guard used by every
128
+ * operation.
129
+ * @returns {void}
130
+ * @throws {InternalError} When the resolved config has no `token`.
131
+ */
132
+ requireAccessToken() {
133
+ this.requireToken();
134
+ }
135
+ /**
136
+ * @description Sends a mail message through Outlook
137
+ * @summary `POST`s the message to `/me/sendMail`; recipients are normalized
138
+ * to Graph envelopes and `saveToSentItems` defaults to `true`.
139
+ * @param {OutlookMailInput} input - The recipients, subject, body, and content options.
140
+ * @returns {Promise<unknown>} `{ sent: true, to, subject }` on success.
141
+ * @throws {InternalError} When no token is configured, or recipients or subject are missing.
142
+ * @throws {BadRequestError} When Graph rejects the request.
143
+ * @example
144
+ * ```ts
145
+ * await outlook.sendMail({
146
+ * to: ["a@example.com", "b@example.com"],
147
+ * subject: "Status",
148
+ * body: "All systems operational",
149
+ * contentType: "Text",
150
+ * });
151
+ * ```
152
+ */
153
+ async sendMail(input) {
154
+ this.requireAccessToken();
155
+ if (!input.to || !input.subject) {
156
+ throw new db_decorators_1.InternalError("Microsoft Outlook sendMail requires recipients and a subject");
157
+ }
158
+ try {
159
+ await this.client.post("/me/sendMail", {
160
+ message: {
161
+ subject: input.subject,
162
+ body: {
163
+ contentType: input.contentType ?? "Text",
164
+ content: input.body ?? "",
165
+ },
166
+ toRecipients: recipientList(input.to),
167
+ ...(input.cc ? { ccRecipients: recipientList(input.cc) } : {}),
168
+ ...(input.bcc ? { bccRecipients: recipientList(input.bcc) } : {}),
169
+ },
170
+ saveToSentItems: input.saveToSentItems ?? true,
171
+ });
172
+ return { sent: true, to: input.to, subject: input.subject };
173
+ }
174
+ catch (error) {
175
+ throw (0, index_js_1.httpError)("Microsoft Outlook", "send mail", error);
176
+ }
177
+ }
178
+ /**
179
+ * @description Lists messages in an Outlook mail folder
180
+ * @summary `GET`s `/me/mailFolders/<folder>/messages` (default `inbox`)
181
+ * applying the optional `$top`, `$filter`, and `$search` parameters.
182
+ * @param {OutlookListInput} [input] - The folder and OData query options.
183
+ * @returns {Promise<unknown>} The Graph message collection.
184
+ * @throws {InternalError} When no token is configured.
185
+ * @throws {NotFoundError} When the folder does not exist (HTTP 404).
186
+ * @throws {BadRequestError} When Graph rejects the query.
187
+ */
188
+ async listMessages(input = {}) {
189
+ this.requireAccessToken();
190
+ const folder = input.folderId ?? "inbox";
191
+ try {
192
+ const response = await this.client.get(`/me/mailFolders/${encodeURIComponent(folder)}/messages`, {
193
+ params: {
194
+ ...(input.top !== undefined ? { $top: input.top } : {}),
195
+ ...(input.filter ? { $filter: input.filter } : {}),
196
+ ...(input.search ? { $search: input.search } : {}),
197
+ },
198
+ });
199
+ return response.data;
200
+ }
201
+ catch (error) {
202
+ throw (0, index_js_1.httpError)("Microsoft Outlook", "list messages", error);
203
+ }
204
+ }
205
+ /**
206
+ * @description Fetches a single Outlook message
207
+ * @summary `GET`s `/me/messages/<id>` and returns the message payload.
208
+ * @param {string} messageId - The Graph message ID.
209
+ * @returns {Promise<unknown>} The message payload.
210
+ * @throws {InternalError} When no token is configured or the message ID is empty.
211
+ * @throws {NotFoundError} When the message does not exist (HTTP 404).
212
+ * @throws {BadRequestError} When Graph rejects the request.
213
+ */
214
+ async getMessage(messageId) {
215
+ this.requireAccessToken();
216
+ if (!messageId) {
217
+ throw new db_decorators_1.InternalError("Microsoft Outlook requires a message id");
218
+ }
219
+ try {
220
+ const response = await this.client.get(`/me/messages/${encodeURIComponent(messageId)}`);
221
+ return response.data;
222
+ }
223
+ catch (error) {
224
+ throw (0, index_js_1.httpError)("Microsoft Outlook", "get message", error);
225
+ }
226
+ }
227
+ /**
228
+ * @description Lists Outlook calendar events
229
+ * @summary `GET`s `/me/events` applying the optional `$top`, `$filter`, and
230
+ * `$search` parameters; the mail `folderId` is not used.
231
+ * @param {OutlookListInput} [input] - The OData query options.
232
+ * @returns {Promise<unknown>} The Graph event collection.
233
+ * @throws {InternalError} When no token is configured.
234
+ * @throws {BadRequestError} When Graph rejects the query.
235
+ */
236
+ async listEvents(input = {}) {
237
+ this.requireAccessToken();
238
+ try {
239
+ const response = await this.client.get("/me/events", {
240
+ params: {
241
+ ...(input.top !== undefined ? { $top: input.top } : {}),
242
+ ...(input.filter ? { $filter: input.filter } : {}),
243
+ ...(input.search ? { $search: input.search } : {}),
244
+ },
245
+ });
246
+ return response.data;
247
+ }
248
+ catch (error) {
249
+ throw (0, index_js_1.httpError)("Microsoft Outlook", "list events", error);
250
+ }
251
+ }
252
+ /**
253
+ * @description Creates an Outlook calendar event
254
+ * @summary `POST`s the event to `/me/events`; `start`/`end` are sent with the
255
+ * configured or default (`UTC`) time zone and attendees as required.
256
+ * @param {OutlookEventInput} input - The event definition.
257
+ * @returns {Promise<unknown>} The created Graph event.
258
+ * @throws {InternalError} When no token is configured, or subject, start, or end is missing.
259
+ * @throws {BadRequestError} When Graph rejects the event.
260
+ * @example
261
+ * ```ts
262
+ * await outlook.createEvent({
263
+ * subject: "Release review",
264
+ * start: "2026-11-01T09:00:00",
265
+ * end: "2026-11-01T10:00:00",
266
+ * timeZone: "Europe/Lisbon",
267
+ * });
268
+ * ```
269
+ */
270
+ async createEvent(input) {
271
+ this.requireAccessToken();
272
+ if (!input.subject || !input.start || !input.end) {
273
+ throw new db_decorators_1.InternalError("Microsoft Outlook createEvent requires subject, start, and end");
274
+ }
275
+ const timeZone = input.timeZone ?? "UTC";
276
+ try {
277
+ const response = await this.client.post("/me/events", {
278
+ subject: input.subject,
279
+ ...(input.body
280
+ ? { body: { contentType: "Text", content: input.body } }
281
+ : {}),
282
+ start: { dateTime: input.start, timeZone },
283
+ end: { dateTime: input.end, timeZone },
284
+ ...(input.location ? { location: { displayName: input.location } } : {}),
285
+ ...(input.attendees
286
+ ? {
287
+ attendees: recipientList(input.attendees).map((entry) => ({
288
+ emailAddress: entry.emailAddress,
289
+ type: "required",
290
+ })),
291
+ }
292
+ : {}),
293
+ });
294
+ return response.data;
295
+ }
296
+ catch (error) {
297
+ throw (0, index_js_1.httpError)("Microsoft Outlook", "create event", error);
298
+ }
299
+ }
300
+ /**
301
+ * @description Deletes an Outlook calendar event
302
+ * @summary `DELETE`s `/me/events/<id>` and returns `{ deleted: true, eventId }`.
303
+ * @param {string} eventId - The Graph event ID.
304
+ * @returns {Promise<unknown>} `{ deleted: true, eventId }` on success.
305
+ * @throws {InternalError} When no token is configured or the event ID is empty.
306
+ * @throws {NotFoundError} When the event does not exist (HTTP 404).
307
+ * @throws {BadRequestError} When Graph rejects the request.
308
+ */
309
+ async deleteEvent(eventId) {
310
+ this.requireAccessToken();
311
+ if (!eventId) {
312
+ throw new db_decorators_1.InternalError("Microsoft Outlook requires an event id");
313
+ }
314
+ try {
315
+ await this.client.delete(`/me/events/${encodeURIComponent(eventId)}`);
316
+ return { deleted: true, eventId };
317
+ }
318
+ catch (error) {
319
+ throw (0, index_js_1.httpError)("Microsoft Outlook", "delete event", error);
320
+ }
321
+ }
322
+ }
323
+ exports.MicrosoftOutlookService = MicrosoftOutlookService;
324
+ //# sourceMappingURL=MicrosoftOutlookService.js.map
325
+ //# sourceMappingURL=MicrosoftOutlookService.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comms/outlook/MicrosoftOutlookService.cjs","sourceRoot":"","sources":["comms/outlook/MicrosoftOutlookService.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./MicrosoftOutlookService.cjs"), exports);
18
+ //# sourceMappingURL=index.js.map
19
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comms/outlook/index.cjs","sourceRoot":"","sources":["comms/outlook/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,iCAAiC"}
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WhatsAppService = void 0;
4
+ /**
5
+ * @module integrations/comms/whatsapp/service
6
+ * @summary WhatsApp Cloud API integration service for text, template, and media messages.
7
+ * @description Exposes the Meta WhatsApp Cloud API (Graph `v19.0`) as an
8
+ * undecorated client-based service built on {@link HttpApiService}.
9
+ * Configuration comes from an explicit `WhatsAppServiceConfig` or the
10
+ * `comms.whatsApp` environment slice; the access token is sent as
11
+ * `Authorization: Bearer <token>` and the sender is identified by the
12
+ * configured `phoneNumberId`. Credentials are referenced from configuration
13
+ * (and, from as-graph nodes, from the resolved `whatsapp` credential secret)
14
+ * and are never embedded in source. Failures are mapped to decaf errors via
15
+ * {@link httpError}.
16
+ */
17
+ const db_decorators_1 = require("@decaf-ts/db-decorators");
18
+ const environment_js_1 = require("./../environment.cjs");
19
+ const environmentValue_js_1 = require("./../../shared/environmentValue.cjs");
20
+ const index_js_1 = require("./../../shared/http/index.cjs");
21
+ /**
22
+ * @description WhatsApp Cloud API integration service
23
+ * @summary An undecorated HTTP service for text, template, and media
24
+ * messages, read receipts, and media metadata. Every message operation needs
25
+ * both the access token and the sender phone number ID; missing credentials or
26
+ * identifiers raise `InternalError`, and transport failures are mapped to decaf
27
+ * errors via {@link httpError}.
28
+ * @class WhatsAppService
29
+ * @extends HttpApiService
30
+ * @category Comms
31
+ * @example
32
+ * ```ts
33
+ * import { WhatsAppService } from "@decaf-ts/integrations/comms/whatsapp";
34
+ *
35
+ * const whatsapp = new WhatsAppService();
36
+ * await whatsapp.initialize({
37
+ * token: process.env.GRAPH_CREDENTIAL_WHATSAPP_TOKEN,
38
+ * phoneNumberId: process.env.WHATSAPP_PHONE_NUMBER_ID,
39
+ * });
40
+ * await whatsapp.sendText({ to: "15551234567", text: "Hello" });
41
+ * ```
42
+ * @mermaid
43
+ * sequenceDiagram
44
+ * autonumber
45
+ * participant Caller
46
+ * participant Service as WhatsAppService
47
+ * participant Graph as WhatsApp Cloud API
48
+ * Caller->>Service: sendText(input)
49
+ * activate Service
50
+ * Service->>Service: requireTokenAndPhone()
51
+ * Service->>Graph: POST /{phoneNumberId}/messages
52
+ * activate Graph
53
+ * Graph-->>Service: message payload
54
+ * deactivate Graph
55
+ * Service-->>Caller: message payload
56
+ * deactivate Service
57
+ * @memberOf module:integrations/comms/whatsapp/service
58
+ */
59
+ class WhatsAppService extends index_js_1.HttpApiService {
60
+ constructor() {
61
+ super(...arguments);
62
+ /**
63
+ * @description The provider name used in error messages
64
+ */
65
+ this.serviceName = "WhatsApp";
66
+ }
67
+ /**
68
+ * @description The WhatsApp Cloud API base URL
69
+ * @summary Used when the resolved config carries no `baseUrl`.
70
+ * @returns {string} `"https://graph.facebook.com/v19.0"`.
71
+ */
72
+ defaultBaseUrl() {
73
+ return "https://graph.facebook.com/v19.0";
74
+ }
75
+ /**
76
+ * @description Builds the WhatsApp bearer authorization headers
77
+ * @summary Returns `Authorization: Bearer <token>` when configured, and no
78
+ * headers otherwise.
79
+ * @param {WhatsAppServiceConfig} config - The resolved service configuration.
80
+ * @returns {Record<string, string>} The authorization headers (empty without a token).
81
+ */
82
+ authHeaders(config) {
83
+ return config.token ? { Authorization: `Bearer ${config.token}` } : {};
84
+ }
85
+ /**
86
+ * @description Reads the WhatsApp credentials and defaults from the environment
87
+ * @summary Reads the `comms.whatsApp` slice and returns a partial config
88
+ * when a token or phone number ID is configured, `undefined` otherwise.
89
+ * Values pass through `envString`/`envNumber` to reject unset-leaf proxies.
90
+ * @returns {Partial<WhatsAppServiceConfig> | undefined} A partial config, or `undefined` when neither credential is configured.
91
+ */
92
+ configFromEnvironment() {
93
+ const env = environment_js_1.CommsEnvironment.comms.whatsApp;
94
+ const token = (0, environmentValue_js_1.envString)(env?.token);
95
+ const phoneNumberId = (0, environmentValue_js_1.envString)(env?.phoneNumberId);
96
+ if (!token && !phoneNumberId)
97
+ return undefined;
98
+ return {
99
+ token,
100
+ phoneNumberId,
101
+ baseUrl: (0, environmentValue_js_1.envString)(env.baseUrl),
102
+ timeout: (0, environmentValue_js_1.envNumber)(env.timeout),
103
+ };
104
+ }
105
+ /**
106
+ * @description Asserts the access token and sender phone number ID
107
+ * @summary Calls `requireToken()` and returns the configured
108
+ * `phoneNumberId` used to build the messages path.
109
+ * @returns {string} The configured sender phone number ID.
110
+ * @throws {InternalError} When no token or phone number ID is configured.
111
+ */
112
+ requireTokenAndPhone() {
113
+ this.requireToken();
114
+ const phoneNumberId = this.config.phoneNumberId;
115
+ if (!phoneNumberId) {
116
+ throw new db_decorators_1.InternalError("WhatsApp requires a phone number id");
117
+ }
118
+ return phoneNumberId;
119
+ }
120
+ /**
121
+ * @description Builds the encoded messages path for a sender
122
+ * @summary Encodes the phone number ID into `/<id>/messages`.
123
+ * @param {string} phoneNumberId - The sender phone number ID.
124
+ * @returns {string} The messages API path.
125
+ */
126
+ messagesPath(phoneNumberId) {
127
+ return `/${encodeURIComponent(phoneNumberId)}/messages`;
128
+ }
129
+ /**
130
+ * @description Sends a WhatsApp text message
131
+ * @summary `POST`s a `text` message to the sender's `/messages` endpoint
132
+ * and returns the WhatsApp message payload.
133
+ * @param {WhatsAppTextInput} input - The recipient, text, and preview flag.
134
+ * @returns {Promise<unknown>} The WhatsApp message payload.
135
+ * @throws {InternalError} When credentials or the phone number ID are missing.
136
+ * @throws {BadRequestError} When WhatsApp rejects the message.
137
+ * @example
138
+ * ```ts
139
+ * await whatsapp.sendText({ to: "15551234567", text: "Deployment finished" });
140
+ * ```
141
+ */
142
+ async sendText(input) {
143
+ const phoneNumberId = this.requireTokenAndPhone();
144
+ try {
145
+ const response = await this.client.post(this.messagesPath(phoneNumberId), {
146
+ messaging_product: "whatsapp",
147
+ recipient_type: "individual",
148
+ to: input.to,
149
+ type: "text",
150
+ text: {
151
+ body: input.text,
152
+ preview_url: input.previewUrl ?? false,
153
+ },
154
+ });
155
+ return response.data;
156
+ }
157
+ catch (error) {
158
+ throw (0, index_js_1.httpError)("WhatsApp", "send text message", error);
159
+ }
160
+ }
161
+ /**
162
+ * @description Sends a WhatsApp template message
163
+ * @summary `POST`s a `template` message referencing an approved template
164
+ * name and language, with optional components.
165
+ * @param {WhatsAppTemplateInput} input - The recipient and template definition.
166
+ * @returns {Promise<unknown>} The WhatsApp message payload.
167
+ * @throws {InternalError} When credentials or the phone number ID are missing.
168
+ * @throws {BadRequestError} When WhatsApp rejects the template message.
169
+ */
170
+ async sendTemplate(input) {
171
+ const phoneNumberId = this.requireTokenAndPhone();
172
+ try {
173
+ const response = await this.client.post(this.messagesPath(phoneNumberId), {
174
+ messaging_product: "whatsapp",
175
+ to: input.to,
176
+ type: "template",
177
+ template: {
178
+ name: input.templateName,
179
+ language: { code: input.languageCode },
180
+ ...(input.components ? { components: input.components } : {}),
181
+ },
182
+ });
183
+ return response.data;
184
+ }
185
+ catch (error) {
186
+ throw (0, index_js_1.httpError)("WhatsApp", "send template message", error);
187
+ }
188
+ }
189
+ /**
190
+ * @description Sends a WhatsApp media message
191
+ * @summary `POST`s an `image`/`audio`/`video`/`document` message using
192
+ * either an uploaded `mediaId` or a public `link`, with optional caption and
193
+ * filename.
194
+ * @param {WhatsAppMediaInput} input - The recipient and media reference.
195
+ * @returns {Promise<unknown>} The WhatsApp message payload.
196
+ * @throws {InternalError} When credentials or the phone number ID are missing, or neither `mediaId` nor `link` is provided.
197
+ * @throws {BadRequestError} When WhatsApp rejects the media message.
198
+ */
199
+ async sendMedia(input) {
200
+ const phoneNumberId = this.requireTokenAndPhone();
201
+ if (!input.mediaId && !input.link) {
202
+ throw new db_decorators_1.InternalError("WhatsApp media messages require a media id or link");
203
+ }
204
+ try {
205
+ const response = await this.client.post(this.messagesPath(phoneNumberId), {
206
+ messaging_product: "whatsapp",
207
+ recipient_type: "individual",
208
+ to: input.to,
209
+ type: input.type,
210
+ [input.type]: {
211
+ ...(input.mediaId ? { id: input.mediaId } : { link: input.link }),
212
+ ...(input.caption ? { caption: input.caption } : {}),
213
+ ...(input.filename ? { filename: input.filename } : {}),
214
+ },
215
+ });
216
+ return response.data;
217
+ }
218
+ catch (error) {
219
+ throw (0, index_js_1.httpError)("WhatsApp", "send media message", error);
220
+ }
221
+ }
222
+ /**
223
+ * @description Marks an inbound WhatsApp message as read
224
+ * @summary `POST`s a `read` status for the message to the sender's
225
+ * `/messages` endpoint.
226
+ * @param {WhatsAppReadInput} input - The inbound message ID to acknowledge.
227
+ * @returns {Promise<unknown>} The WhatsApp status payload.
228
+ * @throws {InternalError} When credentials, the phone number ID, or the message ID are missing.
229
+ * @throws {BadRequestError} When WhatsApp rejects the request.
230
+ */
231
+ async markAsRead(input) {
232
+ const phoneNumberId = this.requireTokenAndPhone();
233
+ if (!input.messageId) {
234
+ throw new db_decorators_1.InternalError("WhatsApp requires a message id");
235
+ }
236
+ try {
237
+ const response = await this.client.post(this.messagesPath(phoneNumberId), {
238
+ messaging_product: "whatsapp",
239
+ status: "read",
240
+ message_id: input.messageId,
241
+ });
242
+ return response.data;
243
+ }
244
+ catch (error) {
245
+ throw (0, index_js_1.httpError)("WhatsApp", "mark message as read", error);
246
+ }
247
+ }
248
+ /**
249
+ * @description Fetches WhatsApp media metadata
250
+ * @summary `GET`s the media descriptor (URL, MIME type, size) by media ID;
251
+ * the descriptor's URL is then used to download the binary.
252
+ * @param {string} mediaId - The WhatsApp media ID.
253
+ * @returns {Promise<unknown>} The media metadata payload.
254
+ * @throws {InternalError} When no token is configured or the media ID is empty.
255
+ * @throws {NotFoundError} When the media does not exist (HTTP 404).
256
+ * @throws {BadRequestError} When WhatsApp rejects the request.
257
+ */
258
+ async getMedia(mediaId) {
259
+ this.requireToken();
260
+ if (!mediaId) {
261
+ throw new db_decorators_1.InternalError("WhatsApp requires a media id");
262
+ }
263
+ try {
264
+ const response = await this.client.get(`/${encodeURIComponent(mediaId)}`);
265
+ return response.data;
266
+ }
267
+ catch (error) {
268
+ throw (0, index_js_1.httpError)("WhatsApp", "get media", error);
269
+ }
270
+ }
271
+ }
272
+ exports.WhatsAppService = WhatsAppService;
273
+ //# sourceMappingURL=WhatsAppService.js.map
274
+ //# sourceMappingURL=WhatsAppService.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comms/whatsapp/WhatsAppService.cjs","sourceRoot":"","sources":["comms/whatsapp/WhatsAppService.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./WhatsAppService.cjs"), exports);
18
+ //# sourceMappingURL=index.js.map
19
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comms/whatsapp/index.cjs","sourceRoot":"","sources":["comms/whatsapp/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,iCAAiC"}