@decaf-ts/integrations 0.12.0 → 0.14.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.
- package/dist/integrations.cjs +1 -1
- package/lib/cjs/calendar/environment.cjs +48 -0
- package/lib/cjs/calendar/environment.cjs.map +1 -0
- package/lib/cjs/calendar/google-calendar/GoogleCalendarService.cjs +338 -0
- package/lib/cjs/calendar/google-calendar/GoogleCalendarService.cjs.map +1 -0
- package/lib/cjs/calendar/google-calendar/index.cjs +20 -0
- package/lib/cjs/calendar/google-calendar/index.cjs.map +1 -0
- package/lib/cjs/comms/discord/DiscordService.cjs +318 -0
- package/lib/cjs/comms/discord/DiscordService.cjs.map +1 -0
- package/lib/cjs/comms/discord/index.cjs +19 -0
- package/lib/cjs/comms/discord/index.cjs.map +1 -0
- package/lib/cjs/comms/environment.cjs +16 -0
- package/lib/cjs/comms/environment.cjs.map +1 -1
- package/lib/cjs/comms/index.cjs +3 -0
- package/lib/cjs/comms/index.cjs.map +1 -1
- package/lib/cjs/comms/outlook/MicrosoftOutlookService.cjs +325 -0
- package/lib/cjs/comms/outlook/MicrosoftOutlookService.cjs.map +1 -0
- package/lib/cjs/comms/outlook/index.cjs +19 -0
- package/lib/cjs/comms/outlook/index.cjs.map +1 -0
- package/lib/cjs/comms/whatsapp/WhatsAppService.cjs +274 -0
- package/lib/cjs/comms/whatsapp/WhatsAppService.cjs.map +1 -0
- package/lib/cjs/comms/whatsapp/index.cjs +19 -0
- package/lib/cjs/comms/whatsapp/index.cjs.map +1 -0
- package/lib/cjs/index.cjs +3 -3
- package/lib/cjs/io/confluence/ConfluenceService.cjs +317 -0
- package/lib/cjs/io/confluence/ConfluenceService.cjs.map +1 -0
- package/lib/cjs/io/confluence/index.cjs +19 -0
- package/lib/cjs/io/confluence/index.cjs.map +1 -0
- package/lib/cjs/io/environment.cjs +28 -0
- package/lib/cjs/io/environment.cjs.map +1 -1
- package/lib/cjs/io/google-docs/GoogleDocsService.cjs +275 -0
- package/lib/cjs/io/google-docs/GoogleDocsService.cjs.map +1 -0
- package/lib/cjs/io/google-docs/index.cjs +19 -0
- package/lib/cjs/io/google-docs/index.cjs.map +1 -0
- package/lib/cjs/io/index.cjs +5 -0
- package/lib/cjs/io/index.cjs.map +1 -1
- package/lib/cjs/io/jira/JiraService.cjs +354 -0
- package/lib/cjs/io/jira/JiraService.cjs.map +1 -0
- package/lib/cjs/io/jira/index.cjs +19 -0
- package/lib/cjs/io/jira/index.cjs.map +1 -0
- package/lib/cjs/io/microsoft-excel/MicrosoftExcelService.cjs +253 -0
- package/lib/cjs/io/microsoft-excel/MicrosoftExcelService.cjs.map +1 -0
- package/lib/cjs/io/microsoft-excel/index.cjs +19 -0
- package/lib/cjs/io/microsoft-excel/index.cjs.map +1 -0
- package/lib/cjs/io/microsoft-sharepoint/MicrosoftSharePointService.cjs +261 -0
- package/lib/cjs/io/microsoft-sharepoint/MicrosoftSharePointService.cjs.map +1 -0
- package/lib/cjs/io/microsoft-sharepoint/index.cjs +19 -0
- package/lib/cjs/io/microsoft-sharepoint/index.cjs.map +1 -0
- package/lib/esm/calendar/environment.js +44 -0
- package/lib/esm/calendar/environment.js.map +1 -0
- package/lib/esm/calendar/google-calendar/GoogleCalendarService.js +333 -0
- package/lib/esm/calendar/google-calendar/GoogleCalendarService.js.map +1 -0
- package/lib/esm/calendar/google-calendar/index.js +3 -0
- package/lib/esm/calendar/google-calendar/index.js.map +1 -0
- package/lib/esm/comms/discord/DiscordService.js +313 -0
- package/lib/esm/comms/discord/DiscordService.js.map +1 -0
- package/lib/esm/comms/discord/index.js +2 -0
- package/lib/esm/comms/discord/index.js.map +1 -0
- package/lib/esm/comms/environment.js +16 -0
- package/lib/esm/comms/environment.js.map +1 -1
- package/lib/esm/comms/index.js +3 -0
- package/lib/esm/comms/index.js.map +1 -1
- package/lib/esm/comms/outlook/MicrosoftOutlookService.js +320 -0
- package/lib/esm/comms/outlook/MicrosoftOutlookService.js.map +1 -0
- package/lib/esm/comms/outlook/index.js +2 -0
- package/lib/esm/comms/outlook/index.js.map +1 -0
- package/lib/esm/comms/whatsapp/WhatsAppService.js +269 -0
- package/lib/esm/comms/whatsapp/WhatsAppService.js.map +1 -0
- package/lib/esm/comms/whatsapp/index.js +2 -0
- package/lib/esm/comms/whatsapp/index.js.map +1 -0
- package/lib/esm/index.js +3 -3
- package/lib/esm/io/confluence/ConfluenceService.js +312 -0
- package/lib/esm/io/confluence/ConfluenceService.js.map +1 -0
- package/lib/esm/io/confluence/index.js +2 -0
- package/lib/esm/io/confluence/index.js.map +1 -0
- package/lib/esm/io/environment.js +28 -0
- package/lib/esm/io/environment.js.map +1 -1
- package/lib/esm/io/google-docs/GoogleDocsService.js +270 -0
- package/lib/esm/io/google-docs/GoogleDocsService.js.map +1 -0
- package/lib/esm/io/google-docs/index.js +2 -0
- package/lib/esm/io/google-docs/index.js.map +1 -0
- package/lib/esm/io/index.js +5 -0
- package/lib/esm/io/index.js.map +1 -1
- package/lib/esm/io/jira/JiraService.js +349 -0
- package/lib/esm/io/jira/JiraService.js.map +1 -0
- package/lib/esm/io/jira/index.js +2 -0
- package/lib/esm/io/jira/index.js.map +1 -0
- package/lib/esm/io/microsoft-excel/MicrosoftExcelService.js +248 -0
- package/lib/esm/io/microsoft-excel/MicrosoftExcelService.js.map +1 -0
- package/lib/esm/io/microsoft-excel/index.js +2 -0
- package/lib/esm/io/microsoft-excel/index.js.map +1 -0
- package/lib/esm/io/microsoft-sharepoint/MicrosoftSharePointService.js +256 -0
- package/lib/esm/io/microsoft-sharepoint/MicrosoftSharePointService.js.map +1 -0
- package/lib/esm/io/microsoft-sharepoint/index.js +2 -0
- package/lib/esm/io/microsoft-sharepoint/index.js.map +1 -0
- package/lib/types/calendar/environment.d.cts +48 -0
- package/lib/types/calendar/environment.d.mts +48 -0
- package/lib/types/calendar/google-calendar/GoogleCalendarService.d.cts +316 -0
- package/lib/types/calendar/google-calendar/GoogleCalendarService.d.mts +316 -0
- package/lib/types/calendar/google-calendar/index.d.cts +2 -0
- package/lib/types/calendar/google-calendar/index.d.mts +2 -0
- package/lib/types/comms/discord/DiscordService.d.cts +285 -0
- package/lib/types/comms/discord/DiscordService.d.mts +285 -0
- package/lib/types/comms/discord/index.d.cts +1 -0
- package/lib/types/comms/discord/index.d.mts +1 -0
- package/lib/types/comms/environment.d.cts +34 -8
- package/lib/types/comms/environment.d.mts +34 -8
- package/lib/types/comms/index.d.cts +3 -0
- package/lib/types/comms/index.d.mts +3 -0
- package/lib/types/comms/outlook/MicrosoftOutlookService.d.cts +282 -0
- package/lib/types/comms/outlook/MicrosoftOutlookService.d.mts +282 -0
- package/lib/types/comms/outlook/index.d.cts +1 -0
- package/lib/types/comms/outlook/index.d.mts +1 -0
- package/lib/types/comms/whatsapp/WhatsAppService.d.cts +258 -0
- package/lib/types/comms/whatsapp/WhatsAppService.d.mts +258 -0
- package/lib/types/comms/whatsapp/index.d.cts +1 -0
- package/lib/types/comms/whatsapp/index.d.mts +1 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/lib/types/io/confluence/ConfluenceService.d.cts +250 -0
- package/lib/types/io/confluence/ConfluenceService.d.mts +250 -0
- package/lib/types/io/confluence/index.d.cts +1 -0
- package/lib/types/io/confluence/index.d.mts +1 -0
- package/lib/types/io/environment.d.cts +52 -12
- package/lib/types/io/environment.d.mts +52 -12
- package/lib/types/io/google-docs/GoogleDocsService.d.cts +188 -0
- package/lib/types/io/google-docs/GoogleDocsService.d.mts +188 -0
- package/lib/types/io/google-docs/index.d.cts +1 -0
- package/lib/types/io/google-docs/index.d.mts +1 -0
- package/lib/types/io/index.d.cts +5 -0
- package/lib/types/io/index.d.mts +5 -0
- package/lib/types/io/jira/JiraService.d.cts +300 -0
- package/lib/types/io/jira/JiraService.d.mts +300 -0
- package/lib/types/io/jira/index.d.cts +1 -0
- package/lib/types/io/jira/index.d.mts +1 -0
- package/lib/types/io/microsoft-excel/MicrosoftExcelService.d.cts +230 -0
- package/lib/types/io/microsoft-excel/MicrosoftExcelService.d.mts +230 -0
- package/lib/types/io/microsoft-excel/index.d.cts +1 -0
- package/lib/types/io/microsoft-excel/index.d.mts +1 -0
- package/lib/types/io/microsoft-sharepoint/MicrosoftSharePointService.d.cts +226 -0
- package/lib/types/io/microsoft-sharepoint/MicrosoftSharePointService.d.mts +226 -0
- package/lib/types/io/microsoft-sharepoint/index.d.cts +1 -0
- package/lib/types/io/microsoft-sharepoint/index.d.mts +1 -0
- package/package.json +101 -5
|
@@ -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"}
|