@thebookingkit/server 0.1.2 → 0.1.3
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 +2 -2
- package/dist/adapters/calendar-adapter.d.ts +47 -0
- package/dist/adapters/calendar-adapter.d.ts.map +1 -0
- package/dist/adapters/calendar-adapter.js +2 -0
- package/dist/adapters/calendar-adapter.js.map +1 -0
- package/dist/adapters/email-adapter.d.ts +65 -0
- package/dist/adapters/email-adapter.d.ts.map +1 -0
- package/dist/adapters/email-adapter.js +40 -0
- package/dist/adapters/email-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/job-adapter.d.ts +26 -0
- package/dist/adapters/job-adapter.d.ts.map +1 -0
- package/dist/adapters/job-adapter.js +13 -0
- package/dist/adapters/job-adapter.js.map +1 -0
- package/dist/adapters/payment-adapter.d.ts +106 -0
- package/dist/adapters/payment-adapter.d.ts.map +1 -0
- package/dist/adapters/payment-adapter.js +8 -0
- package/dist/adapters/payment-adapter.js.map +1 -0
- package/dist/adapters/sms-adapter.d.ts +33 -0
- package/dist/adapters/sms-adapter.d.ts.map +1 -0
- package/dist/adapters/sms-adapter.js +8 -0
- package/dist/adapters/sms-adapter.js.map +1 -0
- package/{src/adapters/storage-adapter.ts → dist/adapters/storage-adapter.d.ts} +5 -4
- package/dist/adapters/storage-adapter.d.ts.map +1 -0
- package/dist/adapters/storage-adapter.js +2 -0
- package/dist/adapters/storage-adapter.js.map +1 -0
- package/dist/api.d.ts +223 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +271 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +71 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +81 -0
- package/dist/auth.js.map +1 -0
- package/dist/booking-tokens.d.ts +23 -0
- package/dist/booking-tokens.d.ts.map +1 -0
- package/dist/booking-tokens.js +52 -0
- package/dist/booking-tokens.js.map +1 -0
- package/dist/email-templates.d.ts +36 -0
- package/dist/email-templates.d.ts.map +1 -0
- package/{src/email-templates.ts → dist/email-templates.js} +6 -34
- package/dist/email-templates.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/multi-tenancy.d.ts +132 -0
- package/dist/multi-tenancy.d.ts.map +1 -0
- package/dist/multi-tenancy.js +188 -0
- package/dist/multi-tenancy.js.map +1 -0
- package/dist/notification-jobs.d.ts +143 -0
- package/dist/notification-jobs.d.ts.map +1 -0
- package/dist/notification-jobs.js +278 -0
- package/dist/notification-jobs.js.map +1 -0
- package/dist/serialization-retry.d.ts +28 -0
- package/dist/serialization-retry.d.ts.map +1 -0
- package/dist/serialization-retry.js +71 -0
- package/dist/serialization-retry.js.map +1 -0
- package/dist/webhooks.d.ts +164 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +228 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/workflows.d.ts +169 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +251 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +21 -2
- package/CHANGELOG.md +0 -9
- package/src/__tests__/api.test.ts +0 -354
- package/src/__tests__/auth.test.ts +0 -111
- package/src/__tests__/concurrent-booking.test.ts +0 -170
- package/src/__tests__/multi-tenancy.test.ts +0 -267
- package/src/__tests__/serialization-retry.test.ts +0 -76
- package/src/__tests__/webhooks.test.ts +0 -412
- package/src/__tests__/workflows.test.ts +0 -422
- package/src/adapters/calendar-adapter.ts +0 -49
- package/src/adapters/email-adapter.ts +0 -108
- package/src/adapters/index.ts +0 -36
- package/src/adapters/job-adapter.ts +0 -26
- package/src/adapters/payment-adapter.ts +0 -118
- package/src/adapters/sms-adapter.ts +0 -35
- package/src/api.ts +0 -446
- package/src/auth.ts +0 -146
- package/src/booking-tokens.ts +0 -61
- package/src/index.ts +0 -192
- package/src/multi-tenancy.ts +0 -301
- package/src/notification-jobs.ts +0 -428
- package/src/serialization-retry.ts +0 -94
- package/src/webhooks.ts +0 -378
- package/src/workflows.ts +0 -441
- package/tsconfig.json +0 -9
- package/vitest.config.ts +0 -7
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ Auth, webhooks, API keys, workflows, and adapter interfaces for booking system b
|
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
[](https://www.typescriptlang.org/)
|
|
8
8
|
|
|
9
|
-
Part of [The Booking Kit](https://thebookingkit.dev) — The Headless Booking Primitive.
|
|
9
|
+
Part of [The Booking Kit](https://docs.thebookingkit.dev) — The Headless Booking Primitive.
|
|
10
10
|
|
|
11
11
|
## Install
|
|
12
12
|
|
|
@@ -43,7 +43,7 @@ const signature = signWebhookPayload(payload, secret);
|
|
|
43
43
|
|
|
44
44
|
## Documentation
|
|
45
45
|
|
|
46
|
-
[**Full Documentation**](https://thebookingkit.dev/features/webhooks/)
|
|
46
|
+
[**Full Documentation**](https://docs.thebookingkit.dev/features/webhooks/)
|
|
47
47
|
|
|
48
48
|
## License
|
|
49
49
|
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar sync adapter interface.
|
|
3
|
+
* Default implementation uses Google Calendar OAuth.
|
|
4
|
+
* Swap to Outlook Calendar or CalDAV by implementing this interface.
|
|
5
|
+
*/
|
|
6
|
+
export interface CalendarAdapter {
|
|
7
|
+
/** Create a calendar event for a booking */
|
|
8
|
+
createEvent(options: CalendarEventOptions): Promise<CalendarEventResult>;
|
|
9
|
+
/** Update an existing calendar event */
|
|
10
|
+
updateEvent(eventId: string, options: Partial<CalendarEventOptions>): Promise<CalendarEventResult>;
|
|
11
|
+
/** Delete a calendar event */
|
|
12
|
+
deleteEvent(eventId: string): Promise<void>;
|
|
13
|
+
/** Get conflicts (busy times) from external calendar */
|
|
14
|
+
getConflicts(timeMin: Date, timeMax: Date): Promise<CalendarConflict[]>;
|
|
15
|
+
}
|
|
16
|
+
/** Options for creating/updating a calendar event */
|
|
17
|
+
export interface CalendarEventOptions {
|
|
18
|
+
/** Event title */
|
|
19
|
+
title: string;
|
|
20
|
+
/** Event description/notes */
|
|
21
|
+
description?: string;
|
|
22
|
+
/** Event start time */
|
|
23
|
+
startsAt: Date;
|
|
24
|
+
/** Event end time */
|
|
25
|
+
endsAt: Date;
|
|
26
|
+
/** Event location */
|
|
27
|
+
location?: string;
|
|
28
|
+
/** Attendee email addresses */
|
|
29
|
+
attendees?: string[];
|
|
30
|
+
/** Provider's timezone */
|
|
31
|
+
timezone?: string;
|
|
32
|
+
}
|
|
33
|
+
/** Result of creating/updating a calendar event */
|
|
34
|
+
export interface CalendarEventResult {
|
|
35
|
+
/** External calendar event ID */
|
|
36
|
+
eventId: string;
|
|
37
|
+
/** Link to the calendar event */
|
|
38
|
+
eventUrl?: string;
|
|
39
|
+
}
|
|
40
|
+
/** A busy time period from an external calendar */
|
|
41
|
+
export interface CalendarConflict {
|
|
42
|
+
/** Start of busy period */
|
|
43
|
+
start: Date;
|
|
44
|
+
/** End of busy period */
|
|
45
|
+
end: Date;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=calendar-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/calendar-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACzE,wCAAwC;IACxC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnG,8BAA8B;IAC9B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,wDAAwD;IACxD,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CACzE;AAED,qDAAqD;AACrD,MAAM,WAAW,oBAAoB;IACnC,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,QAAQ,EAAE,IAAI,CAAC;IACf,qBAAqB;IACrB,MAAM,EAAE,IAAI,CAAC;IACb,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,IAAI,CAAC;IACZ,yBAAyB;IACzB,GAAG,EAAE,IAAI,CAAC;CACX"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar-adapter.js","sourceRoot":"","sources":["../../src/adapters/calendar-adapter.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email sending adapter interface.
|
|
3
|
+
* Default implementation uses Resend. Swap to SendGrid, AWS SES,
|
|
4
|
+
* or Postmark by implementing this interface.
|
|
5
|
+
*/
|
|
6
|
+
export interface EmailAdapter {
|
|
7
|
+
/** Send a single email */
|
|
8
|
+
send(options: SendEmailOptions): Promise<EmailResult>;
|
|
9
|
+
/** Send multiple emails in a batch */
|
|
10
|
+
sendBatch(emails: SendEmailOptions[]): Promise<EmailResult[]>;
|
|
11
|
+
/** Get delivery status of a previously sent email */
|
|
12
|
+
getDeliveryStatus?(messageId: string): Promise<EmailDeliveryStatus>;
|
|
13
|
+
}
|
|
14
|
+
/** Options for sending an email */
|
|
15
|
+
export interface SendEmailOptions {
|
|
16
|
+
/** Recipient email address */
|
|
17
|
+
to: string;
|
|
18
|
+
/** Subject line */
|
|
19
|
+
subject: string;
|
|
20
|
+
/** HTML body */
|
|
21
|
+
html: string;
|
|
22
|
+
/** Plain text body (fallback) */
|
|
23
|
+
text?: string;
|
|
24
|
+
/** From address (defaults to configured sender) */
|
|
25
|
+
from?: string;
|
|
26
|
+
/** Reply-to address */
|
|
27
|
+
replyTo?: string;
|
|
28
|
+
/** Additional headers (List-Unsubscribe, etc.) */
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
/** File attachments */
|
|
31
|
+
attachments?: EmailAttachment[];
|
|
32
|
+
/** Tags for categorization */
|
|
33
|
+
tags?: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
/** An email attachment */
|
|
36
|
+
export interface EmailAttachment {
|
|
37
|
+
filename: string;
|
|
38
|
+
content: string | Buffer;
|
|
39
|
+
contentType?: string;
|
|
40
|
+
}
|
|
41
|
+
/** Result of sending an email */
|
|
42
|
+
export interface EmailResult {
|
|
43
|
+
success: boolean;
|
|
44
|
+
messageId?: string;
|
|
45
|
+
error?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Delivery status of an email */
|
|
48
|
+
export interface EmailDeliveryStatus {
|
|
49
|
+
status: "sent" | "delivered" | "bounced" | "complained" | "failed";
|
|
50
|
+
timestamp: Date;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Generate an ICS calendar attachment for a booking.
|
|
54
|
+
*/
|
|
55
|
+
export declare function generateICSAttachment(booking: {
|
|
56
|
+
id: string;
|
|
57
|
+
title: string;
|
|
58
|
+
startsAt: Date;
|
|
59
|
+
endsAt: Date;
|
|
60
|
+
location?: string;
|
|
61
|
+
description?: string;
|
|
62
|
+
organizerEmail?: string;
|
|
63
|
+
attendeeEmail: string;
|
|
64
|
+
}): EmailAttachment;
|
|
65
|
+
//# sourceMappingURL=email-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,sCAAsC;IACtC,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,qDAAqD;IACrD,iBAAiB,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACrE;AAED,mCAAmC;AACnC,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,uBAAuB;IACvB,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,0BAA0B;AAC1B,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,iCAAiC;AACjC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kCAAkC;AAClC,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;IACnE,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,eAAe,CA+BlB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate an ICS calendar attachment for a booking.
|
|
3
|
+
*/
|
|
4
|
+
export function generateICSAttachment(booking) {
|
|
5
|
+
const formatICSDate = (d) => d.toISOString().replace(/[-:]/g, "").replace(/\.\d{3}/, "");
|
|
6
|
+
const ics = [
|
|
7
|
+
"BEGIN:VCALENDAR",
|
|
8
|
+
"VERSION:2.0",
|
|
9
|
+
"PRODID:-//TheBookingKit//EN",
|
|
10
|
+
"CALSCALE:GREGORIAN",
|
|
11
|
+
"METHOD:PUBLISH",
|
|
12
|
+
"BEGIN:VEVENT",
|
|
13
|
+
`UID:${booking.id}@thebookingkit`,
|
|
14
|
+
`DTSTART:${formatICSDate(booking.startsAt)}`,
|
|
15
|
+
`DTEND:${formatICSDate(booking.endsAt)}`,
|
|
16
|
+
`SUMMARY:${escapeICS(booking.title)}`,
|
|
17
|
+
booking.location ? `LOCATION:${escapeICS(booking.location)}` : "",
|
|
18
|
+
booking.description ? `DESCRIPTION:${escapeICS(booking.description)}` : "",
|
|
19
|
+
booking.organizerEmail ? `ORGANIZER:mailto:${booking.organizerEmail}` : "",
|
|
20
|
+
`ATTENDEE:mailto:${booking.attendeeEmail}`,
|
|
21
|
+
`DTSTAMP:${formatICSDate(new Date())}`,
|
|
22
|
+
"END:VEVENT",
|
|
23
|
+
"END:VCALENDAR",
|
|
24
|
+
]
|
|
25
|
+
.filter(Boolean)
|
|
26
|
+
.join("\r\n");
|
|
27
|
+
return {
|
|
28
|
+
filename: "booking.ics",
|
|
29
|
+
content: ics,
|
|
30
|
+
contentType: "text/calendar",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function escapeICS(text) {
|
|
34
|
+
return text
|
|
35
|
+
.replace(/\\/g, "\\\\")
|
|
36
|
+
.replace(/;/g, "\\;")
|
|
37
|
+
.replace(/,/g, "\\,")
|
|
38
|
+
.replace(/\n/g, "\\n");
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=email-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-adapter.js","sourceRoot":"","sources":["../../src/adapters/email-adapter.ts"],"names":[],"mappings":"AAwDA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OASrC;IACC,MAAM,aAAa,GAAG,CAAC,CAAO,EAAE,EAAE,CAChC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG;QACV,iBAAiB;QACjB,aAAa;QACb,6BAA6B;QAC7B,oBAAoB;QACpB,gBAAgB;QAChB,cAAc;QACd,OAAO,OAAO,CAAC,EAAE,gBAAgB;QACjC,WAAW,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAC5C,SAAS,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACxC,WAAW,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACrC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACjE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1E,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,oBAAoB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1E,mBAAmB,OAAO,CAAC,aAAa,EAAE;QAC1C,WAAW,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;QACtC,YAAY;QACZ,eAAe;KAChB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,GAAG;QACZ,WAAW,EAAE,eAAe;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { EmailAdapter, SendEmailOptions, EmailResult, EmailDeliveryStatus, EmailAttachment, } from "./email-adapter.js";
|
|
2
|
+
export { generateICSAttachment } from "./email-adapter.js";
|
|
3
|
+
export type { CalendarAdapter, CalendarEventOptions, CalendarEventResult, CalendarConflict, } from "./calendar-adapter.js";
|
|
4
|
+
export type { JobAdapter } from "./job-adapter.js";
|
|
5
|
+
export { JOB_NAMES } from "./job-adapter.js";
|
|
6
|
+
export type { StorageAdapter } from "./storage-adapter.js";
|
|
7
|
+
export type { SmsAdapter, SendSmsOptions, SmsResult, } from "./sms-adapter.js";
|
|
8
|
+
export type { PaymentAdapter, CreatePaymentIntentOptions, CreatePaymentIntentResult, CreateSetupIntentOptions, CreateSetupIntentResult, CaptureResult, RefundResult, } from "./payment-adapter.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,YAAY,EACV,UAAU,EACV,cAAc,EACd,SAAS,GACV,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,cAAc,EACd,0BAA0B,EAC1B,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAU3D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background job adapter interface.
|
|
3
|
+
* Default implementation uses Inngest. Swap to Trigger.dev,
|
|
4
|
+
* BullMQ, or Vercel Cron by implementing this interface.
|
|
5
|
+
*/
|
|
6
|
+
export interface JobAdapter {
|
|
7
|
+
/** Enqueue a job for immediate execution */
|
|
8
|
+
enqueue<T>(jobName: string, payload: T): Promise<void>;
|
|
9
|
+
/** Schedule a job for future execution */
|
|
10
|
+
schedule<T>(jobName: string, payload: T, runAt: Date): Promise<string>;
|
|
11
|
+
/** Cancel a previously scheduled job */
|
|
12
|
+
cancel(jobId: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/** Common job names used by The Booking Kit */
|
|
15
|
+
export declare const JOB_NAMES: {
|
|
16
|
+
readonly SEND_CONFIRMATION_EMAIL: "thebookingkit/send-confirmation-email";
|
|
17
|
+
readonly SEND_REMINDER_EMAIL: "thebookingkit/send-reminder-email";
|
|
18
|
+
readonly SEND_CANCELLATION_EMAIL: "thebookingkit/send-cancellation-email";
|
|
19
|
+
readonly SEND_RESCHEDULE_EMAIL: "thebookingkit/send-reschedule-email";
|
|
20
|
+
readonly SYNC_CALENDAR_EVENT: "thebookingkit/sync-calendar-event";
|
|
21
|
+
readonly DELETE_CALENDAR_EVENT: "thebookingkit/delete-calendar-event";
|
|
22
|
+
readonly CHECK_CALENDAR_CONFLICTS: "thebookingkit/check-calendar-conflicts";
|
|
23
|
+
readonly AUTO_REJECT_PENDING: "thebookingkit/auto-reject-pending-booking";
|
|
24
|
+
readonly PROCESS_WEBHOOK: "thebookingkit/process-webhook";
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=job-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/job-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,0CAA0C;IAC1C,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,wCAAwC;IACxC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,+CAA+C;AAC/C,eAAO,MAAM,SAAS;;;;;;;;;;CAUZ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Common job names used by The Booking Kit */
|
|
2
|
+
export const JOB_NAMES = {
|
|
3
|
+
SEND_CONFIRMATION_EMAIL: "thebookingkit/send-confirmation-email",
|
|
4
|
+
SEND_REMINDER_EMAIL: "thebookingkit/send-reminder-email",
|
|
5
|
+
SEND_CANCELLATION_EMAIL: "thebookingkit/send-cancellation-email",
|
|
6
|
+
SEND_RESCHEDULE_EMAIL: "thebookingkit/send-reschedule-email",
|
|
7
|
+
SYNC_CALENDAR_EVENT: "thebookingkit/sync-calendar-event",
|
|
8
|
+
DELETE_CALENDAR_EVENT: "thebookingkit/delete-calendar-event",
|
|
9
|
+
CHECK_CALENDAR_CONFLICTS: "thebookingkit/check-calendar-conflicts",
|
|
10
|
+
AUTO_REJECT_PENDING: "thebookingkit/auto-reject-pending-booking",
|
|
11
|
+
PROCESS_WEBHOOK: "thebookingkit/process-webhook",
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=job-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-adapter.js","sourceRoot":"","sources":["../../src/adapters/job-adapter.ts"],"names":[],"mappings":"AAcA,+CAA+C;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,uBAAuB,EAAE,uCAAuC;IAChE,mBAAmB,EAAE,mCAAmC;IACxD,uBAAuB,EAAE,uCAAuC;IAChE,qBAAqB,EAAE,qCAAqC;IAC5D,mBAAmB,EAAE,mCAAmC;IACxD,qBAAqB,EAAE,qCAAqC;IAC5D,wBAAwB,EAAE,wCAAwC;IAClE,mBAAmB,EAAE,2CAA2C;IAChE,eAAe,EAAE,+BAA+B;CACxC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract interface for payment processing.
|
|
3
|
+
*
|
|
4
|
+
* Default implementation: Stripe via `stripe` npm package.
|
|
5
|
+
* Alternatives: Square, PayPal, or mock for testing.
|
|
6
|
+
*/
|
|
7
|
+
/** Result of creating a payment intent */
|
|
8
|
+
export interface CreatePaymentIntentResult {
|
|
9
|
+
/** Stripe PaymentIntent ID (or equivalent) */
|
|
10
|
+
paymentIntentId: string;
|
|
11
|
+
/** Client secret for confirming payment on the frontend */
|
|
12
|
+
clientSecret: string;
|
|
13
|
+
/** Current status of the payment intent */
|
|
14
|
+
status: "requires_payment_method" | "requires_confirmation" | "requires_action" | "processing" | "succeeded" | "canceled";
|
|
15
|
+
}
|
|
16
|
+
/** Result of creating a setup intent for card authorization */
|
|
17
|
+
export interface CreateSetupIntentResult {
|
|
18
|
+
/** Stripe SetupIntent ID (or equivalent) */
|
|
19
|
+
setupIntentId: string;
|
|
20
|
+
/** Client secret for confirming setup on the frontend */
|
|
21
|
+
clientSecret: string;
|
|
22
|
+
}
|
|
23
|
+
/** Result of capturing a held payment */
|
|
24
|
+
export interface CaptureResult {
|
|
25
|
+
/** Whether the capture was successful */
|
|
26
|
+
captured: boolean;
|
|
27
|
+
/** The payment intent ID that was captured */
|
|
28
|
+
paymentIntentId: string;
|
|
29
|
+
}
|
|
30
|
+
/** Result of a refund operation */
|
|
31
|
+
export interface RefundResult {
|
|
32
|
+
/** Refund ID from the payment provider */
|
|
33
|
+
refundId: string;
|
|
34
|
+
/** Amount refunded in cents */
|
|
35
|
+
amountCents: number;
|
|
36
|
+
/** Status of the refund */
|
|
37
|
+
status: "succeeded" | "pending" | "failed";
|
|
38
|
+
}
|
|
39
|
+
/** Options for creating a payment intent */
|
|
40
|
+
export interface CreatePaymentIntentOptions {
|
|
41
|
+
/** Amount in smallest currency unit (e.g., cents for USD) */
|
|
42
|
+
amountCents: number;
|
|
43
|
+
/** ISO 4217 currency code */
|
|
44
|
+
currency: string;
|
|
45
|
+
/** Connected account ID (for Stripe Connect) */
|
|
46
|
+
connectedAccountId?: string;
|
|
47
|
+
/** Whether to use manual capture (for holds) */
|
|
48
|
+
captureMethod?: "automatic" | "manual";
|
|
49
|
+
/** Metadata to attach to the payment */
|
|
50
|
+
metadata?: Record<string, string>;
|
|
51
|
+
/** Customer email for receipt */
|
|
52
|
+
customerEmail?: string;
|
|
53
|
+
}
|
|
54
|
+
/** Options for creating a setup intent */
|
|
55
|
+
export interface CreateSetupIntentOptions {
|
|
56
|
+
/** Connected account ID (for Stripe Connect) */
|
|
57
|
+
connectedAccountId?: string;
|
|
58
|
+
/** Customer email */
|
|
59
|
+
customerEmail?: string;
|
|
60
|
+
/** Metadata */
|
|
61
|
+
metadata?: Record<string, string>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Payment processing adapter interface.
|
|
65
|
+
*
|
|
66
|
+
* Implementations handle creating payment intents, capturing holds,
|
|
67
|
+
* processing refunds, and managing Stripe Connect onboarding.
|
|
68
|
+
*/
|
|
69
|
+
export interface PaymentAdapter {
|
|
70
|
+
/**
|
|
71
|
+
* Create a payment intent for collecting payment.
|
|
72
|
+
* Use `captureMethod: 'manual'` for no-show fee holds.
|
|
73
|
+
*/
|
|
74
|
+
createPaymentIntent(options: CreatePaymentIntentOptions): Promise<CreatePaymentIntentResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Create a setup intent for authorizing a card without charging.
|
|
77
|
+
*/
|
|
78
|
+
createSetupIntent(options: CreateSetupIntentOptions): Promise<CreateSetupIntentResult>;
|
|
79
|
+
/**
|
|
80
|
+
* Capture a previously authorized (manual capture) payment intent.
|
|
81
|
+
* Used when marking a booking as no-show.
|
|
82
|
+
*/
|
|
83
|
+
capturePaymentIntent(paymentIntentId: string, amountCents?: number): Promise<CaptureResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Cancel a payment intent (release a hold).
|
|
86
|
+
* Used when a booking completes normally and the no-show hold should be released.
|
|
87
|
+
*/
|
|
88
|
+
cancelPaymentIntent(paymentIntentId: string): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Refund a payment intent (full or partial).
|
|
91
|
+
*/
|
|
92
|
+
refund(paymentIntentId: string, amountCents?: number): Promise<RefundResult>;
|
|
93
|
+
/**
|
|
94
|
+
* Generate a Stripe Connect onboarding URL for a provider.
|
|
95
|
+
* Returns the URL the provider should be redirected to.
|
|
96
|
+
*/
|
|
97
|
+
createConnectOnboardingUrl(options: {
|
|
98
|
+
returnUrl: string;
|
|
99
|
+
refreshUrl: string;
|
|
100
|
+
}): Promise<string>;
|
|
101
|
+
/**
|
|
102
|
+
* Disconnect a Stripe Connect account.
|
|
103
|
+
*/
|
|
104
|
+
disconnectAccount(connectedAccountId: string): Promise<void>;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=payment-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/payment-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,0CAA0C;AAC1C,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,MAAM,EAAE,yBAAyB,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,CAAC;CAC3H;AAED,+DAA+D;AAC/D,MAAM,WAAW,uBAAuB;IACtC,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;CAC5C;AAED,4CAA4C;AAC5C,MAAM,WAAW,0BAA0B;IACzC,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,aAAa,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IACvC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,iCAAiC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,wBAAwB;IACvC,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAE7F;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAEvF;;;OAGG;IACH,oBAAoB,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE5F;;;OAGG;IACH,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5D;;OAEG;IACH,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE7E;;;OAGG;IACH,0BAA0B,CAAC,OAAO,EAAE;QAClC,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpB;;OAEG;IACH,iBAAiB,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-adapter.js","sourceRoot":"","sources":["../../src/adapters/payment-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract interface for SMS delivery.
|
|
3
|
+
*
|
|
4
|
+
* Default implementation: Twilio.
|
|
5
|
+
* Alternatives: AWS SNS, Vonage, or mock for testing.
|
|
6
|
+
*/
|
|
7
|
+
/** Options for sending an SMS */
|
|
8
|
+
export interface SendSmsOptions {
|
|
9
|
+
/** Recipient phone number (E.164 format) */
|
|
10
|
+
to: string;
|
|
11
|
+
/** SMS body text */
|
|
12
|
+
body: string;
|
|
13
|
+
/** Sender phone number or alphanumeric sender ID */
|
|
14
|
+
from?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Result of an SMS send operation */
|
|
17
|
+
export interface SmsResult {
|
|
18
|
+
/** Message ID from the SMS provider */
|
|
19
|
+
messageId: string;
|
|
20
|
+
/** Delivery status */
|
|
21
|
+
status: "queued" | "sent" | "delivered" | "failed";
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* SMS delivery adapter interface.
|
|
25
|
+
*
|
|
26
|
+
* Implementations handle sending SMS messages via a provider
|
|
27
|
+
* (e.g., Twilio, AWS SNS).
|
|
28
|
+
*/
|
|
29
|
+
export interface SmsAdapter {
|
|
30
|
+
/** Send an SMS message */
|
|
31
|
+
send(options: SendSmsOptions): Promise<SmsResult>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=sms-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sms-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/sms-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iCAAiC;AACjC,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,sCAAsC;AACtC,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;CACpD;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CACnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sms-adapter.js","sourceRoot":"","sources":["../../src/adapters/sms-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Swap to AWS KMS, GCP KMS, or HashiCorp Vault by implementing this interface.
|
|
5
5
|
*/
|
|
6
6
|
export interface StorageAdapter {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
/** Encrypt a plaintext value */
|
|
8
|
+
encrypt(plaintext: string): Promise<string>;
|
|
9
|
+
/** Decrypt an encrypted value */
|
|
10
|
+
decrypt(ciphertext: string): Promise<string>;
|
|
11
11
|
}
|
|
12
|
+
//# sourceMappingURL=storage-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/storage-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,iCAAiC;IACjC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-adapter.js","sourceRoot":"","sources":["../../src/adapters/storage-adapter.ts"],"names":[],"mappings":""}
|