@arkstack/notifications 0.12.2 → 0.12.4

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/index.d.ts CHANGED
@@ -252,5 +252,4 @@ declare const configure: <T extends DotPath<NotificationConfig>>(key: T, default
252
252
  //#region src/utils/template.d.ts
253
253
  declare const interpolate: (value: string, data?: NotificationData) => string;
254
254
  //#endregion
255
- export { AfricasTalkingSmsDriver, DbNotification, DbNotificationPayload, DbNotificationType, DriverResult, MailDriverOptions, MailNotification, MailRecipient, MailRecipientAddress, MergedTransportConfig, Notification, NotificationChannel, NotificationConfig, NotificationContract, NotificationData, NotificationDriverMap, NotificationRecipient, NotificationUser, SmsDriverName, SmsDriverOptions, SmsNotification, TwilioSmsDriver, UserNotification, UserNotificationCenter, configure, interpolate };
256
- //# sourceMappingURL=index.d.ts.map
255
+ export { AfricasTalkingSmsDriver, DbNotification, DbNotificationPayload, DbNotificationType, DriverResult, MailDriverOptions, MailNotification, MailRecipient, MailRecipientAddress, MergedTransportConfig, Notification, NotificationChannel, NotificationConfig, NotificationContract, NotificationData, NotificationDriverMap, NotificationRecipient, NotificationUser, SmsDriverName, SmsDriverOptions, SmsNotification, TwilioSmsDriver, UserNotification, UserNotificationCenter, configure, interpolate };
package/dist/index.js CHANGED
@@ -470,5 +470,3 @@ var Notification = class Notification {
470
470
  };
471
471
  //#endregion
472
472
  export { AfricasTalkingSmsDriver, DbNotification, MailNotification, Notification, NotificationContract, SmsNotification, TwilioSmsDriver, UserNotification, UserNotificationCenter, configure, interpolate };
473
-
474
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkstack/notifications",
3
- "version": "0.12.2",
3
+ "version": "0.12.4",
4
4
  "type": "module",
5
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",
@@ -34,11 +34,11 @@
34
34
  "africastalking": "^0.8.0",
35
35
  "nodemailer": "^8.0.7",
36
36
  "twilio": "^6.0.0",
37
- "@arkstack/common": "^0.12.2"
37
+ "@arkstack/common": "^0.12.4"
38
38
  },
39
39
  "peerDependencies": {
40
- "@arkstack/database": "^0.12.2",
41
- "@arkstack/contract": "^0.12.2"
40
+ "@arkstack/database": "^0.12.4",
41
+ "@arkstack/contract": "^0.12.4"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/nodemailer": "^7.0.11"
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
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 type { DbNotificationType, NotificationData } from '../types'\n\nimport { Model } from '@arkstack/database'\n\nexport abstract class UserNotification extends Model {\n [key: string]: any\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 { DotPath, DotPathValue, config } from '@arkstack/common'\n\nimport { NotificationConfig } from './types'\n\nexport const configure = <T extends DotPath<NotificationConfig>> (\n key: T,\n defaultValue: unknown,\n): DotPathValue<NotificationConfig, T> => {\n try {\n return config(`notifications.${key}`, defaultValue) as never\n } catch {\n return defaultValue as never\n }\n}\n","import { config, env } from '@arkstack/common'\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport nodemailer, { type Transporter } from 'nodemailer'\n\nimport { NotificationContract } from '../Contracts/NotificationContract'\nimport { interpolate } from '../utils/template'\nimport { configure } from '../config'\nimport type {\n MailDriverOptions,\n MailRecipient,\n MailRecipientAddress,\n MergedTransportConfig,\n NotificationData,\n} from '../types'\nimport type { User } from '@arkstack/auth'\nimport { Arkstack } from '@arkstack/contract'\n\nexport class MailNotification extends NotificationContract {\n driver: Transporter\n private fromAddress?: string\n private subjectLine?: string\n private recipients?: MailRecipient\n private ViewName: string = '~arkstack/notifications.mail'\n private htmlTemplate?: string\n private textTemplate?: string\n private fileDirectory?: string\n\n constructor(options: MailDriverOptions = {}) {\n super()\n\n const driver = configure('drivers.mail', {})\n const trpt = driver.transport ?? 'smtp'\n const transport = configure(\n `transports.${trpt}`,\n {},\n ) as MergedTransportConfig\n\n if (trpt === 'file') {\n this.fileDirectory =\n options.directory ??\n transport.directory ??\n env('MAIL_FILE_PATH', join(Arkstack.rootDir(), './storage/framework/mails'))\n\n this.fromAddress =\n options.from ??\n driver.from ??\n transport.from ??\n env('MAIL_FROM_ADDRESS', 'no-reply@example.com')\n\n this.driver = nodemailer.createTransport({\n streamTransport: true,\n buffer: true,\n })\n\n return\n }\n\n const host =\n options.host ?? transport.host ?? env('MAIL_HOST', 'localhost')\n const port = options.port ?? transport.port ?? env('MAIL_PORT', 1025)\n const secure =\n options.secure ?? transport.secure ?? env('MAIL_SECURE', false)\n\n const user =\n options.user ??\n transport.auth?.user ??\n transport.user ??\n env('MAIL_USERNAME', '')\n\n const pass =\n options.pass ??\n transport.auth?.pass ??\n transport.pass ??\n env('MAIL_PASSWORD', '')\n\n this.fromAddress =\n options.from ??\n driver.from ??\n transport.from ??\n env('MAIL_FROM_ADDRESS', 'no-reply@example.com')\n\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 /**\n * The email subject\n *\n * @param subject\n * @returns\n */\n subject (subject: string): this {\n this.subjectLine = subject\n\n return this\n }\n\n /**\n * Set email the notification recipeint\n *\n * @param recipient string or array of email addresses\n * @returns\n */\n recipient (recipient: MailRecipient): this {\n this.recipients = recipient\n\n return this\n }\n\n /**\n * Set email the notification view name\n *\n * @param view view name\n * @returns\n */\n view (view: string): this {\n this.ViewName = view\n\n return this\n }\n\n /**\n * Set email the notification html template\n *\n * @param content view name\n * @returns\n */\n html (content: string): this {\n this.htmlTemplate = content\n\n return this\n }\n\n /**\n * Set email the notification text template\n *\n * @param content view name\n * @returns\n */\n text (content: string): this {\n this.textTemplate = content\n\n return this\n }\n\n /**\n * Prepare a notification to be sent.\n *\n * @param user The recipient user(s) for the notification.\n */\n prepare (\n user?: null | string | string[] | User,\n data: Record<string, any> = {},\n ) {\n this.data(data)\n\n if (user && typeof user === 'object' && !Array.isArray(user)) {\n user = user.email\n }\n\n if (user) {\n this.recipient(user)\n }\n\n return this\n }\n\n /**\n * Send a notification to the specified recipient(s) with the given message.\n *\n * @param message The message content to be sent to the recipient(s).\n * @param subject The message subject to be sent to the recipient(s).\n * @param recipient An array of recipient identifiers\n * @param data Additioal context data\n * @returns\n */\n async send (\n message: string,\n subject?: string,\n recipient?: MailRecipient,\n data?: NotificationData,\n ) {\n const mergedData = {\n app_name: config('app.name', 'Arkstack'),\n ...this.mergeData(data),\n }\n const resolvedSubject = interpolate(\n subject ?? this.subjectLine ?? '',\n mergedData,\n )\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 const templateData = {\n ...mergedData,\n message: resolvedMessage,\n subject: resolvedSubject,\n }\n\n const textMessage = resolvedMessage.replace(/<\\/?[^>]+(>|$)/g, '')\n\n const payload = {\n to: to as never,\n subject: resolvedSubject,\n from: this.fromAddress,\n text: interpolate(this.textTemplate ?? textMessage, {\n ...templateData,\n message: textMessage,\n }),\n html: this.htmlTemplate\n ? interpolate(this.htmlTemplate, templateData)\n : await globalThis.view(this.ViewName, templateData),\n }\n const result = await this.driver.sendMail(payload)\n\n if (this.fileDirectory) {\n await this.storeFileMail(payload, result as Record<string, any>)\n }\n\n return result\n }\n\n private async storeFileMail (\n payload: Record<string, any>,\n result: Record<string, any>,\n ) {\n const now = new Date()\n const date = now.toISOString().slice(0, 10)\n const directory = join(this.fileDirectory as string, date)\n const id = String(result.messageId || now.getTime()).replace(\n /[^a-zA-Z0-9_.-]/g,\n '-',\n )\n const path = join(directory, now.getTime() + '-' + id + '.json')\n const message = result.message\n\n await mkdir(directory, { recursive: true })\n await writeFile(\n path,\n JSON.stringify(\n {\n id: result.messageId,\n date: now.toISOString(),\n envelope: result.envelope,\n accepted: result.accepted,\n rejected: result.rejected,\n pending: result.pending,\n response: result.response,\n message: {\n from: payload.from,\n to: payload.to,\n subject: payload.subject,\n text: payload.text,\n html: payload.html,\n raw: Buffer.isBuffer(message)\n ? message.toString('utf8')\n : String(message ?? ''),\n },\n },\n null,\n 2,\n ),\n 'utf8',\n )\n\n return path\n }\n\n private resolveRecipients (recipient?: MailRecipient) {\n const recipients = recipient ?? this.recipients\n const resolved = (\n Array.isArray(recipients)\n ? [...recipients]\n : recipients\n ? [recipients]\n : []\n ).flatMap((recipient) => this.normalizeRecipient(recipient) as unknown)\n\n const driver = configure('drivers.mail', {})\n const trpt = driver.transport ?? 'smtp'\n const transport = configure(\n `transports.${trpt}`,\n {},\n ) as MergedTransportConfig\n\n const testAddress =\n driver.test_address ??\n driver.test_address ??\n transport.test_address ??\n transport.test_address ??\n env<string | undefined>('MAIL_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]) => ({\n address,\n name,\n }))\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 { configure } from '../config'\nimport { env } from '@arkstack/common'\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 = configure<SmsDriverOptions>('drivers.sms', {})\n const transport = options.transport ?? driverConfig.transport ?? 'twilio'\n const transportConfig = configure<Record<string, any>>(`transports.${transport}`, {})\n const legacySmsConfig = configure<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 { configure } 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 ?? configure('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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"}