@arkstack/notifications 0.4.3 → 0.5.1
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/README.md +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.js +1 -12
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/index.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @arkstack/notifications
|
|
2
2
|
|
|
3
|
-
Framework-
|
|
3
|
+
Framework-agnostic notification module for Arkstack and Nodejs, providing support for multi-channel notification delivery.
|
|
4
4
|
|
|
5
5
|
```ts
|
|
6
6
|
import { Notification } from '@arkstack/notifications';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as arkormx from "arkormx";
|
|
1
|
+
import * as _$arkormx from "arkormx";
|
|
2
2
|
import { Model } from "arkormx";
|
|
3
3
|
import { Transporter } from "nodemailer";
|
|
4
|
-
import * as twilio_lib_rest_api_v2010_account_message0 from "twilio/lib/rest/api/v2010/account/message";
|
|
4
|
+
import * as _$twilio_lib_rest_api_v2010_account_message0 from "twilio/lib/rest/api/v2010/account/message.js";
|
|
5
5
|
|
|
6
6
|
//#region src/Contracts/UserNotification.d.ts
|
|
7
7
|
declare abstract class UserNotification extends Model {
|
|
@@ -97,8 +97,8 @@ declare class DbNotification extends NotificationContract<UserNotification> {
|
|
|
97
97
|
type(type: DbNotificationPayload['type']): this;
|
|
98
98
|
action(text?: string | null, link?: string | null): this;
|
|
99
99
|
meta(meta?: NotificationData | null): this;
|
|
100
|
-
create(user: NotificationUser, payload: DbNotificationPayload): Promise<UserNotification & arkormx.Model<any, any>>;
|
|
101
|
-
send(message: string, subject?: string, _recipient?: NotificationRecipient, data?: NotificationData): Promise<UserNotification & arkormx.Model<any, any>>;
|
|
100
|
+
create(user: NotificationUser, payload: DbNotificationPayload): Promise<UserNotification & _$arkormx.Model<any, any>>;
|
|
101
|
+
send(message: string, subject?: string, _recipient?: NotificationRecipient, data?: NotificationData): Promise<UserNotification & _$arkormx.Model<any, any>>;
|
|
102
102
|
}
|
|
103
103
|
//#endregion
|
|
104
104
|
//#region src/drivers/MailNotification.d.ts
|
|
@@ -130,7 +130,7 @@ declare class TwilioSmsDriver {
|
|
|
130
130
|
private client;
|
|
131
131
|
private fromNumber;
|
|
132
132
|
constructor(options?: SmsDriverOptions['twilio']);
|
|
133
|
-
send(message: string, recipient: NotificationRecipient, data?: NotificationData): Promise<twilio_lib_rest_api_v2010_account_message0.MessageInstance[]>;
|
|
133
|
+
send(message: string, recipient: NotificationRecipient, data?: NotificationData): Promise<_$twilio_lib_rest_api_v2010_account_message0.MessageInstance[]>;
|
|
134
134
|
}
|
|
135
135
|
//#endregion
|
|
136
136
|
//#region src/drivers/SmsNotification.d.ts
|
|
@@ -170,9 +170,9 @@ declare class Notification<D extends keyof DriverMap = keyof DriverMap> {
|
|
|
170
170
|
//#region src/UserNotificationCenter.d.ts
|
|
171
171
|
declare class UserNotificationCenter {
|
|
172
172
|
private static getModel;
|
|
173
|
-
static create(user: NotificationUser, payload: DbNotificationPayload): Promise<UserNotification & arkormx.Model<any, any>>;
|
|
174
|
-
static forUser(user: NotificationUser): Promise<arkormx.ArkormCollection<UserNotification & arkormx.Model<any, any>, (UserNotification & arkormx.Model<any, any>)[]>>;
|
|
175
|
-
static unreadForUser(user: NotificationUser): Promise<arkormx.ArkormCollection<UserNotification & arkormx.Model<any, any>, (UserNotification & arkormx.Model<any, any>)[]>>;
|
|
173
|
+
static create(user: NotificationUser, payload: DbNotificationPayload): Promise<UserNotification & _$arkormx.Model<any, any>>;
|
|
174
|
+
static forUser(user: NotificationUser): Promise<_$arkormx.ArkormCollection<UserNotification & _$arkormx.Model<any, any>, (UserNotification & _$arkormx.Model<any, any>)[]>>;
|
|
175
|
+
static unreadForUser(user: NotificationUser): Promise<_$arkormx.ArkormCollection<UserNotification & _$arkormx.Model<any, any>, (UserNotification & _$arkormx.Model<any, any>)[]>>;
|
|
176
176
|
static markRead(notification: UserNotification | UserNotification['id']): Promise<void>;
|
|
177
177
|
static markAllRead(user: NotificationUser): Promise<void>;
|
|
178
178
|
static delete(notification: UserNotification | UserNotification['id']): Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,6 @@ import { Model } from "arkormx";
|
|
|
3
3
|
import nodemailer from "nodemailer";
|
|
4
4
|
import africastalking from "africastalking";
|
|
5
5
|
import twilio from "twilio";
|
|
6
|
-
|
|
7
6
|
//#region src/Contracts/NotificationContract.ts
|
|
8
7
|
var NotificationContract = class {
|
|
9
8
|
contextData = {};
|
|
@@ -19,14 +18,12 @@ var NotificationContract = class {
|
|
|
19
18
|
};
|
|
20
19
|
}
|
|
21
20
|
};
|
|
22
|
-
|
|
23
21
|
//#endregion
|
|
24
22
|
//#region src/Contracts/UserNotification.ts
|
|
25
23
|
var UserNotification = class extends Model {
|
|
26
24
|
static table = "user_notifications";
|
|
27
25
|
casts = { meta: "json" };
|
|
28
26
|
};
|
|
29
|
-
|
|
30
27
|
//#endregion
|
|
31
28
|
//#region src/UserNotificationCenter.ts
|
|
32
29
|
var UserNotificationCenter = class {
|
|
@@ -72,7 +69,6 @@ var UserNotificationCenter = class {
|
|
|
72
69
|
await Model.query().where({ id }).delete();
|
|
73
70
|
}
|
|
74
71
|
};
|
|
75
|
-
|
|
76
72
|
//#endregion
|
|
77
73
|
//#region src/utils/template.ts
|
|
78
74
|
const interpolate = (value, data = {}) => {
|
|
@@ -81,7 +77,6 @@ const interpolate = (value, data = {}) => {
|
|
|
81
77
|
return replacement === void 0 || replacement === null ? match : String(replacement);
|
|
82
78
|
});
|
|
83
79
|
};
|
|
84
|
-
|
|
85
80
|
//#endregion
|
|
86
81
|
//#region src/drivers/DbNotification.ts
|
|
87
82
|
var DbNotification = class extends NotificationContract {
|
|
@@ -131,7 +126,6 @@ var DbNotification = class extends NotificationContract {
|
|
|
131
126
|
});
|
|
132
127
|
}
|
|
133
128
|
};
|
|
134
|
-
|
|
135
129
|
//#endregion
|
|
136
130
|
//#region src/config.ts
|
|
137
131
|
const notificationConfig = (key, defaultValue) => {
|
|
@@ -141,7 +135,6 @@ const notificationConfig = (key, defaultValue) => {
|
|
|
141
135
|
return defaultValue;
|
|
142
136
|
}
|
|
143
137
|
};
|
|
144
|
-
|
|
145
138
|
//#endregion
|
|
146
139
|
//#region src/drivers/MailNotification.ts
|
|
147
140
|
var MailNotification = class extends NotificationContract {
|
|
@@ -235,7 +228,6 @@ var MailNotification = class extends NotificationContract {
|
|
|
235
228
|
}));
|
|
236
229
|
}
|
|
237
230
|
};
|
|
238
|
-
|
|
239
231
|
//#endregion
|
|
240
232
|
//#region src/drivers/sms/AfricasTalkingSmsDriver.ts
|
|
241
233
|
var AfricasTalkingSmsDriver = class {
|
|
@@ -265,7 +257,6 @@ var AfricasTalkingSmsDriver = class {
|
|
|
265
257
|
});
|
|
266
258
|
}
|
|
267
259
|
};
|
|
268
|
-
|
|
269
260
|
//#endregion
|
|
270
261
|
//#region src/drivers/sms/TwilioSmsDriver.ts
|
|
271
262
|
var TwilioSmsDriver = class {
|
|
@@ -287,7 +278,6 @@ var TwilioSmsDriver = class {
|
|
|
287
278
|
})));
|
|
288
279
|
}
|
|
289
280
|
};
|
|
290
|
-
|
|
291
281
|
//#endregion
|
|
292
282
|
//#region src/drivers/SmsNotification.ts
|
|
293
283
|
var SmsNotification = class extends NotificationContract {
|
|
@@ -335,7 +325,6 @@ var SmsNotification = class extends NotificationContract {
|
|
|
335
325
|
});
|
|
336
326
|
}
|
|
337
327
|
};
|
|
338
|
-
|
|
339
328
|
//#endregion
|
|
340
329
|
//#region src/Notification.ts
|
|
341
330
|
var Notification = class Notification {
|
|
@@ -381,7 +370,7 @@ var Notification = class Notification {
|
|
|
381
370
|
}
|
|
382
371
|
}
|
|
383
372
|
};
|
|
384
|
-
|
|
385
373
|
//#endregion
|
|
386
374
|
export { AfricasTalkingSmsDriver, DbNotification, MailNotification, Notification, NotificationContract, SmsNotification, TwilioSmsDriver, UserNotification, UserNotificationCenter, interpolate, notificationConfig };
|
|
375
|
+
|
|
387
376
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/Contracts/NotificationContract.ts","../src/Contracts/UserNotification.ts","../src/UserNotificationCenter.ts","../src/utils/template.ts","../src/drivers/DbNotification.ts","../src/config.ts","../src/drivers/MailNotification.ts","../src/drivers/sms/AfricasTalkingSmsDriver.ts","../src/drivers/sms/TwilioSmsDriver.ts","../src/drivers/SmsNotification.ts","../src/Notification.ts"],"sourcesContent":["import type { DriverResult, NotificationData, NotificationRecipient } from '../types'\n\nexport abstract class NotificationContract<TResult = DriverResult> {\n protected contextData: NotificationData = {}\n\n abstract send (\n message: string,\n subject?: string,\n recipient?: NotificationRecipient,\n data?: NotificationData\n ): Promise<TResult>\n\n abstract from (from: string): this\n abstract subject (subject: string): this\n abstract recipient (recipient: NotificationRecipient): this\n\n data (data: NotificationData): this {\n this.contextData = data\n\n return this\n }\n\n protected mergeData (data?: NotificationData) {\n return {\n ...this.contextData,\n ...data,\n year: new Date().getFullYear(),\n }\n }\n}\n","import { Model } from 'arkormx'\n\nimport type { DbNotificationType, NotificationData } from '../types'\n\nexport abstract class UserNotification extends Model {\n declare id: number | string\n declare userId: number | string\n declare type: DbNotificationType | null\n declare title: string\n declare description: string\n declare actionText: string | null\n declare actionLink: string | null\n declare meta: NotificationData | null\n declare readAt: Date | null\n declare createdAt: Date\n declare updatedAt: Date\n\n protected static table?: string | undefined = 'user_notifications'\n\n protected casts = {\n meta: 'json',\n } as const\n}\n","import { getModel } from '@arkstack/common'\n\nimport { UserNotification } from './Contracts/UserNotification'\nimport type { DbNotificationPayload, NotificationUser } from './types'\n\nexport class UserNotificationCenter {\n private static async getModel () {\n return await getModel<typeof UserNotification>('UserNotification')\n }\n\n static async create (user: NotificationUser, payload: DbNotificationPayload) {\n const Model = await this.getModel()\n\n return await Model.query().create({\n userId: user.id,\n type: payload.type ?? null,\n title: payload.title,\n description: payload.description,\n actionText: payload.actionText ?? null,\n actionLink: payload.actionLink ?? null,\n meta: payload.meta ?? null,\n })\n }\n\n static async forUser (user: NotificationUser) {\n const Model = await this.getModel()\n\n return await Model.query().where({ userId: user.id }).get()\n }\n\n static async unreadForUser (user: NotificationUser) {\n const Model = await this.getModel()\n\n return await Model.query().where({ userId: user.id, readAt: null }).get()\n }\n\n static async markRead (notification: UserNotification | UserNotification['id']) {\n const Model = await this.getModel()\n const id = notification instanceof UserNotification ? notification.id : notification\n const readAt = new Date()\n\n await Model.query().where({ id }).update({ readAt })\n\n if (notification instanceof UserNotification) {\n notification.readAt = readAt\n }\n }\n\n static async markAllRead (user: NotificationUser) {\n const Model = await this.getModel()\n\n await Model.query().where({ userId: user.id, readAt: null }).update({ readAt: new Date() })\n }\n\n static async delete (notification: UserNotification | UserNotification['id']) {\n const Model = await this.getModel()\n const id = notification instanceof UserNotification ? notification.id : notification\n\n await Model.query().where({ id }).delete()\n }\n}\n","import type { NotificationData } from '../types'\n\nexport const interpolate = (value: string, data: NotificationData = {}) => {\n return value.replace(/\\{([^{}]+)\\}/g, (match, key) => {\n const replacement = data[key.trim()]\n\n return replacement === undefined || replacement === null ? match : String(replacement)\n })\n}\n","import type { DbNotificationPayload, NotificationData, NotificationRecipient, NotificationUser } from '../types'\n\nimport { NotificationContract } from '../Contracts/NotificationContract'\nimport { UserNotification } from '../Contracts/UserNotification'\nimport { UserNotificationCenter } from '../UserNotificationCenter'\nimport { getModel } from '@arkstack/common'\nimport { interpolate } from '../utils/template'\n\nexport class DbNotification extends NotificationContract<UserNotification> {\n private user?: NotificationUser\n private payload: Partial<DbNotificationPayload> = {}\n\n from (_from: string): this {\n return this\n }\n\n subject (subject: string): this {\n this.payload.title = subject\n\n return this\n }\n\n recipient (recipient: NotificationRecipient | NotificationUser): this {\n if (typeof recipient === 'object' && !Array.isArray(recipient) && 'id' in recipient) {\n this.user = recipient\n\n return this\n }\n\n throw new Error('Database notifications require a user recipient')\n }\n\n type (type: DbNotificationPayload['type']): this {\n this.payload.type = type\n\n return this\n }\n\n action (text?: string | null, link?: string | null): this {\n this.payload.actionText = text\n this.payload.actionLink = link\n\n return this\n }\n\n meta (meta?: NotificationData | null): this {\n this.payload.meta = meta\n\n return this\n }\n\n async create (user: NotificationUser, payload: DbNotificationPayload) {\n await getModel<typeof UserNotification>('UserNotification')\n\n return await UserNotificationCenter.create(user, payload)\n }\n\n async send (\n message: string,\n subject?: string,\n _recipient?: NotificationRecipient,\n data?: NotificationData\n ) {\n if (!this.user) {\n throw new Error('No user recipient provided for database notification')\n }\n\n const mergedData = this.mergeData(data)\n\n return await this.create(this.user, {\n type: this.payload.type ?? null,\n title: interpolate(subject ?? this.payload.title ?? '', mergedData),\n description: interpolate(message, mergedData),\n actionText: this.payload.actionText ?? null,\n actionLink: this.payload.actionLink ?? null,\n meta: this.payload.meta ?? null,\n })\n }\n}\n","import { config } from '@arkstack/common'\n\nexport const notificationConfig = <T = unknown> (key: string, defaultValue: T): T => {\n try {\n return config(`notifications.${key}`, defaultValue) as T\n } catch {\n return defaultValue\n }\n}\n","import { env } from '@arkstack/common'\nimport nodemailer, { type Transporter } from 'nodemailer'\n\nimport { NotificationContract } from '../Contracts/NotificationContract'\nimport { interpolate } from '../utils/template'\nimport { notificationConfig } from '../config'\nimport type { MailDriverOptions, MailRecipient, MailRecipientAddress, NotificationData } from '../types'\n\nexport class MailNotification extends NotificationContract {\n driver: Transporter\n private fromAddress?: string\n private subjectLine?: string\n private recipients?: MailRecipient\n static defaultHtmlTemplate = [\n '<!doctype html>',\n '<html>',\n '<body style=\"font-family:Arial,sans-serif;line-height:1.5;color:#111827\">',\n '<h2>{subject}</h2>',\n '<div>{message}</div>',\n '<p style=\"color:#6b7280;font-size:12px\">© {year} {app_name}</p>',\n '</body>',\n '</html>',\n ].join('')\n\n constructor(options: MailDriverOptions = {}) {\n super()\n\n const driverConfig = notificationConfig<Record<string, any>>('drivers.mail', {})\n const transport = options.transport ?? driverConfig.transport ?? 'smtp'\n const transportConfig = notificationConfig<Record<string, any>>(`transports.${transport}`, {})\n const legacyMailConfig = notificationConfig<Record<string, any>>('mail', {})\n const legacySmtpConfig = notificationConfig<Record<string, any>>('smtp', {})\n const smtpConfig = {\n ...legacySmtpConfig,\n ...(legacyMailConfig.smtp ?? {}),\n ...transportConfig,\n }\n const host = options.host ?? smtpConfig.host ?? env('SMTP_HOST', 'localhost')\n const port = options.port ?? smtpConfig.port ?? env('SMTP_PORT', 1025)\n const secure = options.secure ?? smtpConfig.secure ?? env('SMTP_SECURE', false)\n const user = options.user ?? smtpConfig.auth?.user ?? smtpConfig.user ?? env('SMTP_USERNAME', '')\n const pass = options.pass ?? smtpConfig.auth?.pass ?? smtpConfig.pass ?? env('SMTP_PASSWORD', '')\n\n this.fromAddress = options.from ?? driverConfig.from ?? legacyMailConfig.from ?? smtpConfig.from ?? env('SMTP_FROM_ADDRESS', 'no-reply@example.com')\n this.driver = nodemailer.createTransport({\n host,\n port: Number(port),\n secure: Boolean(secure),\n auth: user || pass ? { user, pass } : undefined,\n })\n }\n\n from (from: string): this {\n this.fromAddress = from\n\n return this\n }\n\n subject (subject: string): this {\n this.subjectLine = subject\n\n return this\n }\n\n recipient (recipient: MailRecipient): this {\n this.recipients = recipient\n\n return this\n }\n\n async send (\n message: string,\n subject?: string,\n recipient?: MailRecipient,\n data?: NotificationData\n ) {\n const mergedData = {\n app_name: env('APP_NAME', 'Arkstack'),\n ...this.mergeData(data),\n }\n const resolvedSubject = interpolate(subject ?? this.subjectLine ?? '', mergedData)\n const resolvedMessage = interpolate(message, mergedData)\n const to = this.resolveRecipients(recipient)\n\n if (to.length < 1) {\n throw new Error('No recipient provided for mail notification')\n }\n\n return await this.driver.sendMail({\n to: to as never,\n subject: resolvedSubject,\n from: this.fromAddress,\n text: resolvedMessage.replace(/<\\/?[^>]+(>|$)/g, ''),\n html: interpolate(await globalThis.view('~arkstack/notifications.mail', {\n ...mergedData,\n message: resolvedMessage,\n subject: resolvedSubject,\n })),\n })\n }\n\n private resolveRecipients (recipient?: MailRecipient) {\n const recipients = recipient ?? this.recipients\n const resolved = (Array.isArray(recipients)\n ? [...recipients]\n : recipients\n ? [recipients]\n : []\n ).flatMap(recipient => this.normalizeRecipient(recipient) as unknown)\n\n const driverConfig = notificationConfig<Record<string, any>>('drivers.mail', {})\n const transport = driverConfig.transport ?? 'smtp'\n const transportConfig = notificationConfig<Record<string, any>>(`transports.${transport}`, {})\n const testAddress = driverConfig.testAddress\n ?? driverConfig.test_address\n ?? transportConfig.testAddress\n ?? transportConfig.test_address\n ?? env<string | undefined>('SMTP_TEST_ADDRESS')\n\n if (env('NODE_ENV') !== 'production' && testAddress) {\n resolved.push(testAddress)\n }\n\n return resolved\n }\n\n private normalizeRecipient (recipient: string | MailRecipientAddress) {\n if (typeof recipient === 'string') {\n return [recipient]\n }\n\n return Object.entries(recipient).map(([address, name]) => ({ address, name }))\n }\n}\n","import { env } from '@arkstack/common'\nimport africastalking from 'africastalking'\n\nimport { interpolate } from '../../utils/template'\nimport type { NotificationData, NotificationRecipient, SmsDriverOptions } from '../../types'\n\nexport class AfricasTalkingSmsDriver {\n private driver: {\n send: (payload: { to: string; from?: string; message: string }) => Promise<unknown>\n sendBulk: (payload: { to: string[]; from?: string; message: string }) => Promise<unknown>\n }\n private senderId?: string\n\n constructor(options: SmsDriverOptions['africastalking'] = {}) {\n const username = options.username ?? env('AFRICASTALKING_USERNAME', 'sandbox')\n const apiKey = options.apiKey ?? env('AFRICASTALKING_API_KEY', 'sandbox')\n\n this.senderId = options.senderId ?? env('AFRICASTALKING_SENDER_ID', env('SMS_FROM', 'Arkstack'))\n this.driver = (africastalking as (config: { username: string; apiKey: string }) => {\n SMS: AfricasTalkingSmsDriver['driver']\n })({ username, apiKey }).SMS\n }\n\n async send (message: string, recipient: NotificationRecipient, data: NotificationData = {}) {\n const recipients = Array.isArray(recipient) ? recipient : [recipient]\n const resolvedMessage = interpolate(message, data)\n\n if (recipients.length > 1) {\n return await this.driver.sendBulk({\n to: recipients,\n from: this.senderId,\n message: resolvedMessage,\n })\n }\n\n return await this.driver.send({\n to: recipients[0],\n from: this.senderId,\n message: resolvedMessage,\n })\n }\n}\n","import type { NotificationData, NotificationRecipient, SmsDriverOptions } from '../../types'\n\nimport { env } from '@arkstack/common'\nimport { interpolate } from '../../utils/template'\nimport twilio from 'twilio'\n\nexport class TwilioSmsDriver {\n private client: ReturnType<typeof twilio>\n private fromNumber: string\n\n constructor(options: SmsDriverOptions['twilio'] = {}) {\n const accountSid = options.accountSid ?? env('TWILIO_ACCOUNT_SID', '')\n const authToken = options.authToken ?? env('TWILIO_AUTH_TOKEN', '')\n\n this.fromNumber = options.from ?? env('TWILIO_FROM', env('SMS_FROM', ''))\n this.client = twilio(accountSid, authToken)\n }\n\n async send (message: string, recipient: NotificationRecipient, data: NotificationData = {}) {\n const recipients = Array.isArray(recipient) ? recipient : [recipient]\n const resolvedMessage = interpolate(message, data)\n\n return await Promise.all(recipients.map(async to => await this.client.messages.create({\n body: resolvedMessage,\n from: this.fromNumber,\n to,\n })))\n }\n}\n","import type { NotificationData, NotificationRecipient, SmsDriverOptions } from '../types'\n\nimport { AfricasTalkingSmsDriver } from './sms/AfricasTalkingSmsDriver'\nimport { NotificationContract } from '../Contracts/NotificationContract'\nimport { TwilioSmsDriver } from './sms/TwilioSmsDriver'\nimport { env } from '@arkstack/common'\nimport { notificationConfig } from '../config'\n\ntype SmsProvider = AfricasTalkingSmsDriver | TwilioSmsDriver\n\nexport class SmsNotification extends NotificationContract {\n driver: SmsProvider\n private recipients?: NotificationRecipient\n private fromValue?: string\n\n constructor(options: SmsDriverOptions = {}) {\n super()\n\n const driverConfig = notificationConfig<SmsDriverOptions>('drivers.sms', {})\n const transport = options.transport ?? driverConfig.transport ?? 'twilio'\n const transportConfig = notificationConfig<Record<string, any>>(`transports.${transport}`, {})\n const legacySmsConfig = notificationConfig<SmsDriverOptions>('sms', {})\n const from = options.from ?? driverConfig.from ?? legacySmsConfig.from\n\n this.fromValue = from\n this.driver = transport === 'twilio'\n ? new TwilioSmsDriver({\n ...legacySmsConfig.twilio,\n ...transportConfig,\n ...options.twilio,\n from: options.twilio?.from ?? transportConfig.from ?? legacySmsConfig.twilio?.from ?? from,\n })\n : new AfricasTalkingSmsDriver({\n ...legacySmsConfig.africastalking,\n ...transportConfig,\n ...options.africastalking,\n senderId: options.africastalking?.senderId ?? transportConfig.senderId ?? legacySmsConfig.africastalking?.senderId ?? from,\n })\n }\n\n from (from: string): this {\n this.fromValue = from\n\n return this\n }\n\n subject (_subject: string): this {\n return this\n }\n\n recipient (recipient: NotificationRecipient): this {\n this.recipients = recipient\n\n return this\n }\n\n async send (\n message: string,\n _subject?: string,\n recipient?: NotificationRecipient,\n data?: NotificationData\n ) {\n const resolvedRecipient = recipient ?? this.recipients\n\n if (!resolvedRecipient) {\n throw new Error('No recipient provided for SMS notification')\n }\n\n return await this.driver.send(message, resolvedRecipient, {\n app_name: env('APP_NAME', 'Arkstack'),\n from: this.fromValue,\n ...this.mergeData(data),\n })\n }\n}\n","import type { MailDriverOptions, MailRecipient, NotificationChannel, NotificationData, NotificationRecipient, NotificationUser, SmsDriverOptions } from './types'\n\nimport { DbNotification } from './drivers/DbNotification'\nimport { DriverMap } from './Contracts/Maps'\nimport { MailNotification } from './drivers/MailNotification'\nimport { SmsNotification } from './drivers/SmsNotification'\nimport { notificationConfig } from './config'\n\nexport class Notification<D extends keyof DriverMap = keyof DriverMap> {\n private driver: DriverMap[D]\n\n constructor(driver: D, options: MailDriverOptions | SmsDriverOptions = {}) {\n this.driver = Notification.createDriver(driver, options) as DriverMap[D]\n }\n\n static mail (options?: MailDriverOptions) {\n return new MailNotification(options)\n }\n\n static email (options?: MailDriverOptions) {\n return this.mail(options)\n }\n\n static sms (options?: SmsDriverOptions) {\n return new SmsNotification(options)\n }\n\n static db () {\n return new DbNotification()\n }\n\n static channel (\n channel?: NotificationChannel | 'email',\n options?: MailDriverOptions | SmsDriverOptions\n ) {\n return Notification.createDriver(channel ?? notificationConfig<NotificationChannel>('default_driver', 'mail'), options)\n }\n\n prepare (\n recipient?: null | MailRecipient | NotificationRecipient | NotificationUser,\n data: NotificationData = {}\n ) {\n this.driver.data(data)\n\n if (recipient && typeof recipient === 'object' && !Array.isArray(recipient) && 'id' in recipient) {\n if (this.driver instanceof MailNotification) {\n if (recipient.email) {\n this.driver.recipient(recipient.email)\n }\n } else if (this.driver instanceof SmsNotification) {\n if (recipient.phone) {\n this.driver.recipient(recipient.phone)\n }\n } else {\n this.driver.recipient(recipient as never)\n }\n\n return this.driver\n }\n\n if (recipient) {\n this.driver.recipient(recipient as NotificationRecipient)\n }\n\n return this.driver\n }\n\n private static createDriver (\n driver: NotificationChannel | 'email',\n options: MailDriverOptions | SmsDriverOptions = {}\n ) {\n switch (driver) {\n case 'mail':\n case 'email':\n return new MailNotification(options as MailDriverOptions)\n case 'sms':\n return new SmsNotification(options as SmsDriverOptions)\n case 'db':\n return new DbNotification()\n default:\n throw new Error(`Unsupported notification driver: ${driver}`)\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/Contracts/NotificationContract.ts","../src/Contracts/UserNotification.ts","../src/UserNotificationCenter.ts","../src/utils/template.ts","../src/drivers/DbNotification.ts","../src/config.ts","../src/drivers/MailNotification.ts","../src/drivers/sms/AfricasTalkingSmsDriver.ts","../src/drivers/sms/TwilioSmsDriver.ts","../src/drivers/SmsNotification.ts","../src/Notification.ts"],"sourcesContent":["import type { DriverResult, NotificationData, NotificationRecipient } from '../types'\n\nexport abstract class NotificationContract<TResult = DriverResult> {\n protected contextData: NotificationData = {}\n\n abstract send (\n message: string,\n subject?: string,\n recipient?: NotificationRecipient,\n data?: NotificationData\n ): Promise<TResult>\n\n abstract from (from: string): this\n abstract subject (subject: string): this\n abstract recipient (recipient: NotificationRecipient): this\n\n data (data: NotificationData): this {\n this.contextData = data\n\n return this\n }\n\n protected mergeData (data?: NotificationData) {\n return {\n ...this.contextData,\n ...data,\n year: new Date().getFullYear(),\n }\n }\n}\n","import { Model } from 'arkormx'\n\nimport type { DbNotificationType, NotificationData } from '../types'\n\nexport abstract class UserNotification extends Model {\n declare id: number | string\n declare userId: number | string\n declare type: DbNotificationType | null\n declare title: string\n declare description: string\n declare actionText: string | null\n declare actionLink: string | null\n declare meta: NotificationData | null\n declare readAt: Date | null\n declare createdAt: Date\n declare updatedAt: Date\n\n protected static table?: string | undefined = 'user_notifications'\n\n protected casts = {\n meta: 'json',\n } as const\n}\n","import { getModel } from '@arkstack/common'\n\nimport { UserNotification } from './Contracts/UserNotification'\nimport type { DbNotificationPayload, NotificationUser } from './types'\n\nexport class UserNotificationCenter {\n private static async getModel () {\n return await getModel<typeof UserNotification>('UserNotification')\n }\n\n static async create (user: NotificationUser, payload: DbNotificationPayload) {\n const Model = await this.getModel()\n\n return await Model.query().create({\n userId: user.id,\n type: payload.type ?? null,\n title: payload.title,\n description: payload.description,\n actionText: payload.actionText ?? null,\n actionLink: payload.actionLink ?? null,\n meta: payload.meta ?? null,\n })\n }\n\n static async forUser (user: NotificationUser) {\n const Model = await this.getModel()\n\n return await Model.query().where({ userId: user.id }).get()\n }\n\n static async unreadForUser (user: NotificationUser) {\n const Model = await this.getModel()\n\n return await Model.query().where({ userId: user.id, readAt: null }).get()\n }\n\n static async markRead (notification: UserNotification | UserNotification['id']) {\n const Model = await this.getModel()\n const id = notification instanceof UserNotification ? notification.id : notification\n const readAt = new Date()\n\n await Model.query().where({ id }).update({ readAt })\n\n if (notification instanceof UserNotification) {\n notification.readAt = readAt\n }\n }\n\n static async markAllRead (user: NotificationUser) {\n const Model = await this.getModel()\n\n await Model.query().where({ userId: user.id, readAt: null }).update({ readAt: new Date() })\n }\n\n static async delete (notification: UserNotification | UserNotification['id']) {\n const Model = await this.getModel()\n const id = notification instanceof UserNotification ? notification.id : notification\n\n await Model.query().where({ id }).delete()\n }\n}\n","import type { NotificationData } from '../types'\n\nexport const interpolate = (value: string, data: NotificationData = {}) => {\n return value.replace(/\\{([^{}]+)\\}/g, (match, key) => {\n const replacement = data[key.trim()]\n\n return replacement === undefined || replacement === null ? match : String(replacement)\n })\n}\n","import type { DbNotificationPayload, NotificationData, NotificationRecipient, NotificationUser } from '../types'\n\nimport { NotificationContract } from '../Contracts/NotificationContract'\nimport { UserNotification } from '../Contracts/UserNotification'\nimport { UserNotificationCenter } from '../UserNotificationCenter'\nimport { getModel } from '@arkstack/common'\nimport { interpolate } from '../utils/template'\n\nexport class DbNotification extends NotificationContract<UserNotification> {\n private user?: NotificationUser\n private payload: Partial<DbNotificationPayload> = {}\n\n from (_from: string): this {\n return this\n }\n\n subject (subject: string): this {\n this.payload.title = subject\n\n return this\n }\n\n recipient (recipient: NotificationRecipient | NotificationUser): this {\n if (typeof recipient === 'object' && !Array.isArray(recipient) && 'id' in recipient) {\n this.user = recipient\n\n return this\n }\n\n throw new Error('Database notifications require a user recipient')\n }\n\n type (type: DbNotificationPayload['type']): this {\n this.payload.type = type\n\n return this\n }\n\n action (text?: string | null, link?: string | null): this {\n this.payload.actionText = text\n this.payload.actionLink = link\n\n return this\n }\n\n meta (meta?: NotificationData | null): this {\n this.payload.meta = meta\n\n return this\n }\n\n async create (user: NotificationUser, payload: DbNotificationPayload) {\n await getModel<typeof UserNotification>('UserNotification')\n\n return await UserNotificationCenter.create(user, payload)\n }\n\n async send (\n message: string,\n subject?: string,\n _recipient?: NotificationRecipient,\n data?: NotificationData\n ) {\n if (!this.user) {\n throw new Error('No user recipient provided for database notification')\n }\n\n const mergedData = this.mergeData(data)\n\n return await this.create(this.user, {\n type: this.payload.type ?? null,\n title: interpolate(subject ?? this.payload.title ?? '', mergedData),\n description: interpolate(message, mergedData),\n actionText: this.payload.actionText ?? null,\n actionLink: this.payload.actionLink ?? null,\n meta: this.payload.meta ?? null,\n })\n }\n}\n","import { config } from '@arkstack/common'\n\nexport const notificationConfig = <T = unknown> (key: string, defaultValue: T): T => {\n try {\n return config(`notifications.${key}`, defaultValue) as T\n } catch {\n return defaultValue\n }\n}\n","import { env } from '@arkstack/common'\nimport nodemailer, { type Transporter } from 'nodemailer'\n\nimport { NotificationContract } from '../Contracts/NotificationContract'\nimport { interpolate } from '../utils/template'\nimport { notificationConfig } from '../config'\nimport type { MailDriverOptions, MailRecipient, MailRecipientAddress, NotificationData } from '../types'\n\nexport class MailNotification extends NotificationContract {\n driver: Transporter\n private fromAddress?: string\n private subjectLine?: string\n private recipients?: MailRecipient\n static defaultHtmlTemplate = [\n '<!doctype html>',\n '<html>',\n '<body style=\"font-family:Arial,sans-serif;line-height:1.5;color:#111827\">',\n '<h2>{subject}</h2>',\n '<div>{message}</div>',\n '<p style=\"color:#6b7280;font-size:12px\">© {year} {app_name}</p>',\n '</body>',\n '</html>',\n ].join('')\n\n constructor(options: MailDriverOptions = {}) {\n super()\n\n const driverConfig = notificationConfig<Record<string, any>>('drivers.mail', {})\n const transport = options.transport ?? driverConfig.transport ?? 'smtp'\n const transportConfig = notificationConfig<Record<string, any>>(`transports.${transport}`, {})\n const legacyMailConfig = notificationConfig<Record<string, any>>('mail', {})\n const legacySmtpConfig = notificationConfig<Record<string, any>>('smtp', {})\n const smtpConfig = {\n ...legacySmtpConfig,\n ...(legacyMailConfig.smtp ?? {}),\n ...transportConfig,\n }\n const host = options.host ?? smtpConfig.host ?? env('SMTP_HOST', 'localhost')\n const port = options.port ?? smtpConfig.port ?? env('SMTP_PORT', 1025)\n const secure = options.secure ?? smtpConfig.secure ?? env('SMTP_SECURE', false)\n const user = options.user ?? smtpConfig.auth?.user ?? smtpConfig.user ?? env('SMTP_USERNAME', '')\n const pass = options.pass ?? smtpConfig.auth?.pass ?? smtpConfig.pass ?? env('SMTP_PASSWORD', '')\n\n this.fromAddress = options.from ?? driverConfig.from ?? legacyMailConfig.from ?? smtpConfig.from ?? env('SMTP_FROM_ADDRESS', 'no-reply@example.com')\n this.driver = nodemailer.createTransport({\n host,\n port: Number(port),\n secure: Boolean(secure),\n auth: user || pass ? { user, pass } : undefined,\n })\n }\n\n from (from: string): this {\n this.fromAddress = from\n\n return this\n }\n\n subject (subject: string): this {\n this.subjectLine = subject\n\n return this\n }\n\n recipient (recipient: MailRecipient): this {\n this.recipients = recipient\n\n return this\n }\n\n async send (\n message: string,\n subject?: string,\n recipient?: MailRecipient,\n data?: NotificationData\n ) {\n const mergedData = {\n app_name: env('APP_NAME', 'Arkstack'),\n ...this.mergeData(data),\n }\n const resolvedSubject = interpolate(subject ?? this.subjectLine ?? '', mergedData)\n const resolvedMessage = interpolate(message, mergedData)\n const to = this.resolveRecipients(recipient)\n\n if (to.length < 1) {\n throw new Error('No recipient provided for mail notification')\n }\n\n return await this.driver.sendMail({\n to: to as never,\n subject: resolvedSubject,\n from: this.fromAddress,\n text: resolvedMessage.replace(/<\\/?[^>]+(>|$)/g, ''),\n html: interpolate(await globalThis.view('~arkstack/notifications.mail', {\n ...mergedData,\n message: resolvedMessage,\n subject: resolvedSubject,\n })),\n })\n }\n\n private resolveRecipients (recipient?: MailRecipient) {\n const recipients = recipient ?? this.recipients\n const resolved = (Array.isArray(recipients)\n ? [...recipients]\n : recipients\n ? [recipients]\n : []\n ).flatMap(recipient => this.normalizeRecipient(recipient) as unknown)\n\n const driverConfig = notificationConfig<Record<string, any>>('drivers.mail', {})\n const transport = driverConfig.transport ?? 'smtp'\n const transportConfig = notificationConfig<Record<string, any>>(`transports.${transport}`, {})\n const testAddress = driverConfig.testAddress\n ?? driverConfig.test_address\n ?? transportConfig.testAddress\n ?? transportConfig.test_address\n ?? env<string | undefined>('SMTP_TEST_ADDRESS')\n\n if (env('NODE_ENV') !== 'production' && testAddress) {\n resolved.push(testAddress)\n }\n\n return resolved\n }\n\n private normalizeRecipient (recipient: string | MailRecipientAddress) {\n if (typeof recipient === 'string') {\n return [recipient]\n }\n\n return Object.entries(recipient).map(([address, name]) => ({ address, name }))\n }\n}\n","import { env } from '@arkstack/common'\nimport africastalking from 'africastalking'\n\nimport { interpolate } from '../../utils/template'\nimport type { NotificationData, NotificationRecipient, SmsDriverOptions } from '../../types'\n\nexport class AfricasTalkingSmsDriver {\n private driver: {\n send: (payload: { to: string; from?: string; message: string }) => Promise<unknown>\n sendBulk: (payload: { to: string[]; from?: string; message: string }) => Promise<unknown>\n }\n private senderId?: string\n\n constructor(options: SmsDriverOptions['africastalking'] = {}) {\n const username = options.username ?? env('AFRICASTALKING_USERNAME', 'sandbox')\n const apiKey = options.apiKey ?? env('AFRICASTALKING_API_KEY', 'sandbox')\n\n this.senderId = options.senderId ?? env('AFRICASTALKING_SENDER_ID', env('SMS_FROM', 'Arkstack'))\n this.driver = (africastalking as (config: { username: string; apiKey: string }) => {\n SMS: AfricasTalkingSmsDriver['driver']\n })({ username, apiKey }).SMS\n }\n\n async send (message: string, recipient: NotificationRecipient, data: NotificationData = {}) {\n const recipients = Array.isArray(recipient) ? recipient : [recipient]\n const resolvedMessage = interpolate(message, data)\n\n if (recipients.length > 1) {\n return await this.driver.sendBulk({\n to: recipients,\n from: this.senderId,\n message: resolvedMessage,\n })\n }\n\n return await this.driver.send({\n to: recipients[0],\n from: this.senderId,\n message: resolvedMessage,\n })\n }\n}\n","import type { NotificationData, NotificationRecipient, SmsDriverOptions } from '../../types'\n\nimport { env } from '@arkstack/common'\nimport { interpolate } from '../../utils/template'\nimport twilio from 'twilio'\n\nexport class TwilioSmsDriver {\n private client: ReturnType<typeof twilio>\n private fromNumber: string\n\n constructor(options: SmsDriverOptions['twilio'] = {}) {\n const accountSid = options.accountSid ?? env('TWILIO_ACCOUNT_SID', '')\n const authToken = options.authToken ?? env('TWILIO_AUTH_TOKEN', '')\n\n this.fromNumber = options.from ?? env('TWILIO_FROM', env('SMS_FROM', ''))\n this.client = twilio(accountSid, authToken)\n }\n\n async send (message: string, recipient: NotificationRecipient, data: NotificationData = {}) {\n const recipients = Array.isArray(recipient) ? recipient : [recipient]\n const resolvedMessage = interpolate(message, data)\n\n return await Promise.all(recipients.map(async to => await this.client.messages.create({\n body: resolvedMessage,\n from: this.fromNumber,\n to,\n })))\n }\n}\n","import type { NotificationData, NotificationRecipient, SmsDriverOptions } from '../types'\n\nimport { AfricasTalkingSmsDriver } from './sms/AfricasTalkingSmsDriver'\nimport { NotificationContract } from '../Contracts/NotificationContract'\nimport { TwilioSmsDriver } from './sms/TwilioSmsDriver'\nimport { env } from '@arkstack/common'\nimport { notificationConfig } from '../config'\n\ntype SmsProvider = AfricasTalkingSmsDriver | TwilioSmsDriver\n\nexport class SmsNotification extends NotificationContract {\n driver: SmsProvider\n private recipients?: NotificationRecipient\n private fromValue?: string\n\n constructor(options: SmsDriverOptions = {}) {\n super()\n\n const driverConfig = notificationConfig<SmsDriverOptions>('drivers.sms', {})\n const transport = options.transport ?? driverConfig.transport ?? 'twilio'\n const transportConfig = notificationConfig<Record<string, any>>(`transports.${transport}`, {})\n const legacySmsConfig = notificationConfig<SmsDriverOptions>('sms', {})\n const from = options.from ?? driverConfig.from ?? legacySmsConfig.from\n\n this.fromValue = from\n this.driver = transport === 'twilio'\n ? new TwilioSmsDriver({\n ...legacySmsConfig.twilio,\n ...transportConfig,\n ...options.twilio,\n from: options.twilio?.from ?? transportConfig.from ?? legacySmsConfig.twilio?.from ?? from,\n })\n : new AfricasTalkingSmsDriver({\n ...legacySmsConfig.africastalking,\n ...transportConfig,\n ...options.africastalking,\n senderId: options.africastalking?.senderId ?? transportConfig.senderId ?? legacySmsConfig.africastalking?.senderId ?? from,\n })\n }\n\n from (from: string): this {\n this.fromValue = from\n\n return this\n }\n\n subject (_subject: string): this {\n return this\n }\n\n recipient (recipient: NotificationRecipient): this {\n this.recipients = recipient\n\n return this\n }\n\n async send (\n message: string,\n _subject?: string,\n recipient?: NotificationRecipient,\n data?: NotificationData\n ) {\n const resolvedRecipient = recipient ?? this.recipients\n\n if (!resolvedRecipient) {\n throw new Error('No recipient provided for SMS notification')\n }\n\n return await this.driver.send(message, resolvedRecipient, {\n app_name: env('APP_NAME', 'Arkstack'),\n from: this.fromValue,\n ...this.mergeData(data),\n })\n }\n}\n","import type { MailDriverOptions, MailRecipient, NotificationChannel, NotificationData, NotificationRecipient, NotificationUser, SmsDriverOptions } from './types'\n\nimport { DbNotification } from './drivers/DbNotification'\nimport { DriverMap } from './Contracts/Maps'\nimport { MailNotification } from './drivers/MailNotification'\nimport { SmsNotification } from './drivers/SmsNotification'\nimport { notificationConfig } from './config'\n\nexport class Notification<D extends keyof DriverMap = keyof DriverMap> {\n private driver: DriverMap[D]\n\n constructor(driver: D, options: MailDriverOptions | SmsDriverOptions = {}) {\n this.driver = Notification.createDriver(driver, options) as DriverMap[D]\n }\n\n static mail (options?: MailDriverOptions) {\n return new MailNotification(options)\n }\n\n static email (options?: MailDriverOptions) {\n return this.mail(options)\n }\n\n static sms (options?: SmsDriverOptions) {\n return new SmsNotification(options)\n }\n\n static db () {\n return new DbNotification()\n }\n\n static channel (\n channel?: NotificationChannel | 'email',\n options?: MailDriverOptions | SmsDriverOptions\n ) {\n return Notification.createDriver(channel ?? notificationConfig<NotificationChannel>('default_driver', 'mail'), options)\n }\n\n prepare (\n recipient?: null | MailRecipient | NotificationRecipient | NotificationUser,\n data: NotificationData = {}\n ) {\n this.driver.data(data)\n\n if (recipient && typeof recipient === 'object' && !Array.isArray(recipient) && 'id' in recipient) {\n if (this.driver instanceof MailNotification) {\n if (recipient.email) {\n this.driver.recipient(recipient.email)\n }\n } else if (this.driver instanceof SmsNotification) {\n if (recipient.phone) {\n this.driver.recipient(recipient.phone)\n }\n } else {\n this.driver.recipient(recipient as never)\n }\n\n return this.driver\n }\n\n if (recipient) {\n this.driver.recipient(recipient as NotificationRecipient)\n }\n\n return this.driver\n }\n\n private static createDriver (\n driver: NotificationChannel | 'email',\n options: MailDriverOptions | SmsDriverOptions = {}\n ) {\n switch (driver) {\n case 'mail':\n case 'email':\n return new MailNotification(options as MailDriverOptions)\n case 'sms':\n return new SmsNotification(options as SmsDriverOptions)\n case 'db':\n return new DbNotification()\n default:\n throw new Error(`Unsupported notification driver: ${driver}`)\n }\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arkstack/notifications",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Framework-agnostic notification module for Arkstack and Nodejs, providing support for multi-channel notification delivery.",
|
|
6
6
|
"homepage": "https://arkstack.toneflix.net/guide/notifications",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -33,16 +33,16 @@
|
|
|
33
33
|
"africastalking": "^0.8.0",
|
|
34
34
|
"nodemailer": "^8.0.7",
|
|
35
35
|
"twilio": "^6.0.0",
|
|
36
|
-
"@arkstack/common": "^0.
|
|
36
|
+
"@arkstack/common": "^0.5.1"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"
|
|
39
|
+
"@arkstack/database": "^0.5.1"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/nodemailer": "^7.0.11"
|
|
43
43
|
},
|
|
44
44
|
"scripts": {
|
|
45
|
-
"build": "tsdown --config-loader
|
|
45
|
+
"build": "tsdown --config-loader unrun",
|
|
46
46
|
"test": "vitest",
|
|
47
47
|
"version:patch": "pnpm version patch"
|
|
48
48
|
}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/Contracts/UserNotification.ts","../src/types.ts","../src/Contracts/NotificationContract.ts","../src/drivers/DbNotification.ts","../src/drivers/MailNotification.ts","../src/drivers/sms/AfricasTalkingSmsDriver.ts","../src/drivers/sms/TwilioSmsDriver.ts","../src/drivers/SmsNotification.ts","../src/Contracts/Maps.ts","../src/Notification.ts","../src/UserNotificationCenter.ts","../src/config.ts","../src/utils/template.ts"],"mappings":"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"}
|