@voyantjs/notifications 0.3.0 → 0.3.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/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/provider-resolution.d.ts +5 -0
- package/dist/provider-resolution.d.ts.map +1 -1
- package/dist/provider-resolution.js +22 -0
- package/dist/providers/twilio.d.ts +24 -0
- package/dist/providers/twilio.d.ts.map +1 -0
- package/dist/providers/twilio.js +48 -0
- package/package.json +6 -6
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { HonoModule } from "@voyantjs/hono/module";
|
|
2
2
|
import { createNotificationsRoutes } from "./routes.js";
|
|
3
3
|
export type { DefaultNotificationProviderOptions } from "./provider-resolution.js";
|
|
4
|
-
export { createDefaultNotificationProviders, createResendProviderFromEnv, } from "./provider-resolution.js";
|
|
4
|
+
export { createDefaultNotificationProviders, createResendProviderFromEnv, createTwilioProviderFromEnv, } from "./provider-resolution.js";
|
|
5
5
|
export type { LocalProviderOptions } from "./providers/local.js";
|
|
6
6
|
export { createLocalProvider } from "./providers/local.js";
|
|
7
7
|
export type { ResendFetch, ResendProviderOptions, ResendRenderedEmail, } from "./providers/resend.js";
|
|
8
8
|
export { createResendProvider } from "./providers/resend.js";
|
|
9
|
+
export type { TwilioFetch, TwilioProviderOptions, TwilioRenderedSms } from "./providers/twilio.js";
|
|
10
|
+
export { createTwilioProvider } from "./providers/twilio.js";
|
|
9
11
|
export { createNotificationsRoutes } from "./routes.js";
|
|
10
12
|
export type { NewNotificationDelivery, NewNotificationReminderRule, NewNotificationReminderRun, NewNotificationTemplate, NotificationDelivery, NotificationReminderRule, NotificationReminderRun, NotificationsHonoModule, NotificationTemplate, } from "./schema.js";
|
|
11
13
|
export { notificationChannelEnum, notificationDeliveries, notificationDeliveryStatusEnum, notificationReminderRules, notificationReminderRunStatusEnum, notificationReminderRuns, notificationReminderStatusEnum, notificationReminderTargetTypeEnum, notificationsModule, notificationTargetTypeEnum, notificationTemplateStatusEnum, notificationTemplates, } from "./schema.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAGvD,YAAY,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,EACL,kCAAkC,EAClC,2BAA2B,GAC5B,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AACvD,YAAY,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,0BAA0B,EAC1B,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EAC9B,yBAAyB,EACzB,iCAAiC,EACjC,wBAAwB,EACxB,8BAA8B,EAC9B,kCAAkC,EAClC,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAA;AAC/D,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,oCAAoC,EACpC,gCAAgC,EAChC,yBAAyB,EACzB,mCAAmC,EACnC,gCAAgC,EAChC,uCAAuC,EACvC,sCAAsC,EACtC,mCAAmC,EACnC,gCAAgC,EAChC,oCAAoC,EACpC,4BAA4B,EAC5B,mCAAmC,EACnC,gCAAgC,EAChC,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,EACtB,oCAAoC,EACpC,oCAAoC,EACpC,gCAAgC,GACjC,MAAM,iBAAiB,CAAA;AAExB,wBAAgB,6BAA6B,CAC3C,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,GACxD,UAAU,CAKZ"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAGvD,YAAY,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAA;AAClF,OAAO,EACL,kCAAkC,EAClC,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AACvD,YAAY,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,0BAA0B,EAC1B,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EAC9B,yBAAyB,EACzB,iCAAiC,EACjC,wBAAwB,EACxB,8BAA8B,EAC9B,kCAAkC,EAClC,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAA;AAC/D,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,oCAAoC,EACpC,gCAAgC,EAChC,yBAAyB,EACzB,mCAAmC,EACnC,gCAAgC,EAChC,uCAAuC,EACvC,sCAAsC,EACtC,mCAAmC,EACnC,gCAAgC,EAChC,oCAAoC,EACpC,4BAA4B,EAC5B,mCAAmC,EACnC,gCAAgC,EAChC,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,EACtB,oCAAoC,EACpC,oCAAoC,EACpC,gCAAgC,GACjC,MAAM,iBAAiB,CAAA;AAExB,wBAAgB,6BAA6B,CAC3C,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,GACxD,UAAU,CAKZ"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createNotificationsRoutes } from "./routes.js";
|
|
2
2
|
import { notificationsModule } from "./schema.js";
|
|
3
|
-
export { createDefaultNotificationProviders, createResendProviderFromEnv, } from "./provider-resolution.js";
|
|
3
|
+
export { createDefaultNotificationProviders, createResendProviderFromEnv, createTwilioProviderFromEnv, } from "./provider-resolution.js";
|
|
4
4
|
export { createLocalProvider } from "./providers/local.js";
|
|
5
5
|
export { createResendProvider } from "./providers/resend.js";
|
|
6
|
+
export { createTwilioProvider } from "./providers/twilio.js";
|
|
6
7
|
export { createNotificationsRoutes } from "./routes.js";
|
|
7
8
|
export { notificationChannelEnum, notificationDeliveries, notificationDeliveryStatusEnum, notificationReminderRules, notificationReminderRunStatusEnum, notificationReminderRuns, notificationReminderStatusEnum, notificationReminderTargetTypeEnum, notificationsModule, notificationTargetTypeEnum, notificationTemplateStatusEnum, notificationTemplates, } from "./schema.js";
|
|
8
9
|
export { createNotificationService, NotificationError, notificationsService, renderNotificationTemplate, } from "./service.js";
|
|
@@ -2,13 +2,18 @@ import type { NotificationProvider } from "./types.js";
|
|
|
2
2
|
type NotificationProviderEnv = {
|
|
3
3
|
RESEND_API_KEY?: unknown;
|
|
4
4
|
EMAIL_FROM?: unknown;
|
|
5
|
+
TWILIO_ACCOUNT_SID?: unknown;
|
|
6
|
+
TWILIO_AUTH_TOKEN?: unknown;
|
|
7
|
+
TWILIO_SMS_FROM?: unknown;
|
|
5
8
|
};
|
|
6
9
|
export interface DefaultNotificationProviderOptions {
|
|
7
10
|
includeLocal?: boolean;
|
|
8
11
|
emailProvider?: "resend" | null;
|
|
12
|
+
smsProvider?: "twilio" | null;
|
|
9
13
|
customProviders?: ReadonlyArray<NotificationProvider>;
|
|
10
14
|
}
|
|
11
15
|
export declare function createResendProviderFromEnv(env: NotificationProviderEnv): NotificationProvider | null;
|
|
16
|
+
export declare function createTwilioProviderFromEnv(env: NotificationProviderEnv): NotificationProvider | null;
|
|
12
17
|
export declare function createDefaultNotificationProviders(env: NotificationProviderEnv, options?: DefaultNotificationProviderOptions): NotificationProvider[];
|
|
13
18
|
export {};
|
|
14
19
|
//# sourceMappingURL=provider-resolution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-resolution.d.ts","sourceRoot":"","sources":["../src/provider-resolution.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider-resolution.d.ts","sourceRoot":"","sources":["../src/provider-resolution.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEtD,KAAK,uBAAuB,GAAG;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,MAAM,WAAW,kCAAkC;IACjD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC/B,WAAW,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC7B,eAAe,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAA;CACtD;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,uBAAuB,+BAcvE;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,uBAAuB,+BAiBvE;AAED,wBAAgB,kCAAkC,CAChD,GAAG,EAAE,uBAAuB,EAC5B,OAAO,GAAE,kCAAuC,0BA2BjD"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createLocalProvider } from "./providers/local.js";
|
|
2
2
|
import { createResendProvider } from "./providers/resend.js";
|
|
3
|
+
import { createTwilioProvider } from "./providers/twilio.js";
|
|
3
4
|
export function createResendProviderFromEnv(env) {
|
|
4
5
|
if (typeof env.RESEND_API_KEY === "string" &&
|
|
5
6
|
env.RESEND_API_KEY &&
|
|
@@ -12,6 +13,21 @@ export function createResendProviderFromEnv(env) {
|
|
|
12
13
|
}
|
|
13
14
|
return null;
|
|
14
15
|
}
|
|
16
|
+
export function createTwilioProviderFromEnv(env) {
|
|
17
|
+
if (typeof env.TWILIO_ACCOUNT_SID === "string" &&
|
|
18
|
+
env.TWILIO_ACCOUNT_SID &&
|
|
19
|
+
typeof env.TWILIO_AUTH_TOKEN === "string" &&
|
|
20
|
+
env.TWILIO_AUTH_TOKEN &&
|
|
21
|
+
typeof env.TWILIO_SMS_FROM === "string" &&
|
|
22
|
+
env.TWILIO_SMS_FROM) {
|
|
23
|
+
return createTwilioProvider({
|
|
24
|
+
accountSid: env.TWILIO_ACCOUNT_SID,
|
|
25
|
+
authToken: env.TWILIO_AUTH_TOKEN,
|
|
26
|
+
from: env.TWILIO_SMS_FROM,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
15
31
|
export function createDefaultNotificationProviders(env, options = {}) {
|
|
16
32
|
const providers = [];
|
|
17
33
|
if (options.includeLocal !== false) {
|
|
@@ -23,6 +39,12 @@ export function createDefaultNotificationProviders(env, options = {}) {
|
|
|
23
39
|
providers.push(resend);
|
|
24
40
|
}
|
|
25
41
|
}
|
|
42
|
+
if (options.smsProvider === "twilio") {
|
|
43
|
+
const twilio = createTwilioProviderFromEnv(env);
|
|
44
|
+
if (twilio) {
|
|
45
|
+
providers.push(twilio);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
26
48
|
if (options.customProviders?.length) {
|
|
27
49
|
providers.push(...options.customProviders);
|
|
28
50
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { NotificationProvider } from "../types.js";
|
|
2
|
+
export type TwilioFetch = (input: string, init: {
|
|
3
|
+
method: string;
|
|
4
|
+
headers: Record<string, string>;
|
|
5
|
+
body: string;
|
|
6
|
+
}) => Promise<{
|
|
7
|
+
ok: boolean;
|
|
8
|
+
status: number;
|
|
9
|
+
json: () => Promise<unknown>;
|
|
10
|
+
text: () => Promise<string>;
|
|
11
|
+
}>;
|
|
12
|
+
export interface TwilioRenderedSms {
|
|
13
|
+
text: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TwilioProviderOptions {
|
|
16
|
+
accountSid: string;
|
|
17
|
+
authToken: string;
|
|
18
|
+
from: string;
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
fetch?: TwilioFetch;
|
|
21
|
+
renderTemplate?: (template: string, data: unknown) => Promise<TwilioRenderedSms> | TwilioRenderedSms;
|
|
22
|
+
}
|
|
23
|
+
export declare function createTwilioProvider(options: TwilioProviderOptions): NotificationProvider;
|
|
24
|
+
//# sourceMappingURL=twilio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twilio.d.ts","sourceRoot":"","sources":["../../src/providers/twilio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,aAAa,CAAA;AAE3E,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;CACb,KACE,OAAO,CAAC;IACX,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5B,CAAC,CAAA;AAEF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,cAAc,CAAC,EAAE,CACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,KACV,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAA;CACpD;AA0BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,oBAAoB,CA4CzF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
function toBase64(value) {
|
|
2
|
+
if (typeof btoa === "function") {
|
|
3
|
+
return btoa(value);
|
|
4
|
+
}
|
|
5
|
+
const globals = globalThis;
|
|
6
|
+
if (globals.Buffer) {
|
|
7
|
+
return globals.Buffer.from(value).toString("base64");
|
|
8
|
+
}
|
|
9
|
+
throw new Error("Twilio provider requires a base64 encoder");
|
|
10
|
+
}
|
|
11
|
+
export function createTwilioProvider(options) {
|
|
12
|
+
const baseUrl = options.baseUrl ?? "https://api.twilio.com/2010-04-01";
|
|
13
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
14
|
+
return {
|
|
15
|
+
name: "twilio",
|
|
16
|
+
channels: ["sms"],
|
|
17
|
+
async send(payload) {
|
|
18
|
+
if (payload.channel !== "sms") {
|
|
19
|
+
throw new Error(`Twilio provider only supports the "sms" channel, got "${payload.channel}"`);
|
|
20
|
+
}
|
|
21
|
+
if (!fetchImpl) {
|
|
22
|
+
throw new Error("Twilio provider requires a fetch implementation");
|
|
23
|
+
}
|
|
24
|
+
const rendered = options.renderTemplate
|
|
25
|
+
? await options.renderTemplate(payload.template, payload.data)
|
|
26
|
+
: { text: payload.text ?? JSON.stringify(payload.data ?? {}) };
|
|
27
|
+
const body = new URLSearchParams({
|
|
28
|
+
To: payload.to,
|
|
29
|
+
From: payload.from ?? options.from,
|
|
30
|
+
Body: payload.text ?? rendered.text,
|
|
31
|
+
});
|
|
32
|
+
const response = await fetchImpl(`${baseUrl}/Accounts/${options.accountSid}/Messages.json`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Basic ${toBase64(`${options.accountSid}:${options.authToken}`)}`,
|
|
36
|
+
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
|
|
37
|
+
},
|
|
38
|
+
body: body.toString(),
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
const text = await response.text().catch(() => "");
|
|
42
|
+
throw new Error(`Twilio send failed (${response.status}): ${text}`);
|
|
43
|
+
}
|
|
44
|
+
const data = (await response.json());
|
|
45
|
+
return { id: data.sid, provider: "twilio" };
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/notifications",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"license": "FSL-1.1-Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -49,11 +49,11 @@
|
|
|
49
49
|
"drizzle-orm": "^0.45.2",
|
|
50
50
|
"hono": "^4.12.10",
|
|
51
51
|
"zod": "^4.3.6",
|
|
52
|
-
"@voyantjs/bookings": "0.3.
|
|
53
|
-
"@voyantjs/core": "0.3.
|
|
54
|
-
"@voyantjs/db": "0.3.
|
|
55
|
-
"@voyantjs/finance": "0.3.
|
|
56
|
-
"@voyantjs/hono": "0.3.
|
|
52
|
+
"@voyantjs/bookings": "0.3.1",
|
|
53
|
+
"@voyantjs/core": "0.3.1",
|
|
54
|
+
"@voyantjs/db": "0.3.1",
|
|
55
|
+
"@voyantjs/finance": "0.3.1",
|
|
56
|
+
"@voyantjs/hono": "0.3.1"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"typescript": "^6.0.2",
|