@thebookingkit/server 0.1.1 → 0.1.2

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.
Files changed (104) hide show
  1. package/README.md +50 -0
  2. package/package.json +1 -1
  3. package/src/__tests__/api.test.ts +6 -6
  4. package/src/adapters/email-adapter.ts +2 -2
  5. package/src/adapters/job-adapter.ts +10 -10
  6. package/src/api.ts +5 -5
  7. package/.turbo/turbo-build.log +0 -6
  8. package/.turbo/turbo-test.log +0 -20
  9. package/dist/__tests__/api.test.d.ts +0 -2
  10. package/dist/__tests__/api.test.d.ts.map +0 -1
  11. package/dist/__tests__/api.test.js +0 -280
  12. package/dist/__tests__/api.test.js.map +0 -1
  13. package/dist/__tests__/auth.test.d.ts +0 -2
  14. package/dist/__tests__/auth.test.d.ts.map +0 -1
  15. package/dist/__tests__/auth.test.js +0 -78
  16. package/dist/__tests__/auth.test.js.map +0 -1
  17. package/dist/__tests__/concurrent-booking.test.d.ts +0 -2
  18. package/dist/__tests__/concurrent-booking.test.d.ts.map +0 -1
  19. package/dist/__tests__/concurrent-booking.test.js +0 -111
  20. package/dist/__tests__/concurrent-booking.test.js.map +0 -1
  21. package/dist/__tests__/multi-tenancy.test.d.ts +0 -2
  22. package/dist/__tests__/multi-tenancy.test.d.ts.map +0 -1
  23. package/dist/__tests__/multi-tenancy.test.js +0 -196
  24. package/dist/__tests__/multi-tenancy.test.js.map +0 -1
  25. package/dist/__tests__/serialization-retry.test.d.ts +0 -2
  26. package/dist/__tests__/serialization-retry.test.d.ts.map +0 -1
  27. package/dist/__tests__/serialization-retry.test.js +0 -53
  28. package/dist/__tests__/serialization-retry.test.js.map +0 -1
  29. package/dist/__tests__/webhooks.test.d.ts +0 -2
  30. package/dist/__tests__/webhooks.test.d.ts.map +0 -1
  31. package/dist/__tests__/webhooks.test.js +0 -286
  32. package/dist/__tests__/webhooks.test.js.map +0 -1
  33. package/dist/__tests__/workflows.test.d.ts +0 -2
  34. package/dist/__tests__/workflows.test.d.ts.map +0 -1
  35. package/dist/__tests__/workflows.test.js +0 -299
  36. package/dist/__tests__/workflows.test.js.map +0 -1
  37. package/dist/adapters/calendar-adapter.d.ts +0 -47
  38. package/dist/adapters/calendar-adapter.d.ts.map +0 -1
  39. package/dist/adapters/calendar-adapter.js +0 -2
  40. package/dist/adapters/calendar-adapter.js.map +0 -1
  41. package/dist/adapters/email-adapter.d.ts +0 -65
  42. package/dist/adapters/email-adapter.d.ts.map +0 -1
  43. package/dist/adapters/email-adapter.js +0 -40
  44. package/dist/adapters/email-adapter.js.map +0 -1
  45. package/dist/adapters/index.d.ts +0 -9
  46. package/dist/adapters/index.d.ts.map +0 -1
  47. package/dist/adapters/index.js +0 -3
  48. package/dist/adapters/index.js.map +0 -1
  49. package/dist/adapters/job-adapter.d.ts +0 -26
  50. package/dist/adapters/job-adapter.d.ts.map +0 -1
  51. package/dist/adapters/job-adapter.js +0 -13
  52. package/dist/adapters/job-adapter.js.map +0 -1
  53. package/dist/adapters/payment-adapter.d.ts +0 -106
  54. package/dist/adapters/payment-adapter.d.ts.map +0 -1
  55. package/dist/adapters/payment-adapter.js +0 -8
  56. package/dist/adapters/payment-adapter.js.map +0 -1
  57. package/dist/adapters/sms-adapter.d.ts +0 -33
  58. package/dist/adapters/sms-adapter.d.ts.map +0 -1
  59. package/dist/adapters/sms-adapter.js +0 -8
  60. package/dist/adapters/sms-adapter.js.map +0 -1
  61. package/dist/adapters/storage-adapter.d.ts +0 -12
  62. package/dist/adapters/storage-adapter.d.ts.map +0 -1
  63. package/dist/adapters/storage-adapter.js +0 -2
  64. package/dist/adapters/storage-adapter.js.map +0 -1
  65. package/dist/api.d.ts +0 -223
  66. package/dist/api.d.ts.map +0 -1
  67. package/dist/api.js +0 -271
  68. package/dist/api.js.map +0 -1
  69. package/dist/auth.d.ts +0 -71
  70. package/dist/auth.d.ts.map +0 -1
  71. package/dist/auth.js +0 -81
  72. package/dist/auth.js.map +0 -1
  73. package/dist/booking-tokens.d.ts +0 -23
  74. package/dist/booking-tokens.d.ts.map +0 -1
  75. package/dist/booking-tokens.js +0 -52
  76. package/dist/booking-tokens.js.map +0 -1
  77. package/dist/email-templates.d.ts +0 -36
  78. package/dist/email-templates.d.ts.map +0 -1
  79. package/dist/email-templates.js +0 -112
  80. package/dist/email-templates.js.map +0 -1
  81. package/dist/index.d.ts +0 -13
  82. package/dist/index.d.ts.map +0 -1
  83. package/dist/index.js +0 -22
  84. package/dist/index.js.map +0 -1
  85. package/dist/multi-tenancy.d.ts +0 -132
  86. package/dist/multi-tenancy.d.ts.map +0 -1
  87. package/dist/multi-tenancy.js +0 -188
  88. package/dist/multi-tenancy.js.map +0 -1
  89. package/dist/notification-jobs.d.ts +0 -143
  90. package/dist/notification-jobs.d.ts.map +0 -1
  91. package/dist/notification-jobs.js +0 -278
  92. package/dist/notification-jobs.js.map +0 -1
  93. package/dist/serialization-retry.d.ts +0 -28
  94. package/dist/serialization-retry.d.ts.map +0 -1
  95. package/dist/serialization-retry.js +0 -71
  96. package/dist/serialization-retry.js.map +0 -1
  97. package/dist/webhooks.d.ts +0 -164
  98. package/dist/webhooks.d.ts.map +0 -1
  99. package/dist/webhooks.js +0 -228
  100. package/dist/webhooks.js.map +0 -1
  101. package/dist/workflows.d.ts +0 -169
  102. package/dist/workflows.d.ts.map +0 -1
  103. package/dist/workflows.js +0 -251
  104. package/dist/workflows.js.map +0 -1
package/dist/workflows.js DELETED
@@ -1,251 +0,0 @@
1
- /**
2
- * Workflow automation engine.
3
- *
4
- * Trigger-condition-action framework that automates tasks
5
- * based on booking lifecycle events.
6
- */
7
- // ---------------------------------------------------------------------------
8
- // Errors
9
- // ---------------------------------------------------------------------------
10
- /** Error thrown when workflow validation fails */
11
- export class WorkflowValidationError extends Error {
12
- constructor(message) {
13
- super(message);
14
- this.name = "WorkflowValidationError";
15
- }
16
- }
17
- // ---------------------------------------------------------------------------
18
- // Template Variables
19
- // ---------------------------------------------------------------------------
20
- /** Standard template variables available in workflow messages */
21
- export const TEMPLATE_VARIABLES = [
22
- "{booking.title}",
23
- "{booking.startTime}",
24
- "{booking.endTime}",
25
- "{booking.date}",
26
- "{attendee.name}",
27
- "{attendee.email}",
28
- "{host.name}",
29
- "{event.location}",
30
- "{event.duration}",
31
- "{booking.managementUrl}",
32
- ];
33
- /**
34
- * Resolve template variables in a string using workflow context.
35
- *
36
- * Missing variables are replaced with empty strings.
37
- *
38
- * @param template - The template string with `{variable}` placeholders
39
- * @param context - The workflow context with booking/event data
40
- * @returns The resolved string
41
- */
42
- export function resolveTemplateVariables(template, context) {
43
- const vars = {
44
- "{booking.title}": context.eventTitle ?? "",
45
- "{booking.startTime}": context.startsAt
46
- ? formatTime(context.startsAt)
47
- : "",
48
- "{booking.endTime}": context.endsAt ? formatTime(context.endsAt) : "",
49
- "{booking.date}": context.startsAt ? formatDate(context.startsAt) : "",
50
- "{attendee.name}": context.customerName ?? "",
51
- "{attendee.email}": context.customerEmail ?? "",
52
- "{host.name}": context.hostName ?? "",
53
- "{event.location}": context.eventLocation ?? "",
54
- "{event.duration}": context.eventDuration
55
- ? `${context.eventDuration} minutes`
56
- : "",
57
- "{booking.managementUrl}": context.managementUrl ?? "",
58
- };
59
- let result = template;
60
- for (const [key, value] of Object.entries(vars)) {
61
- result = result.replaceAll(key, value);
62
- }
63
- return result;
64
- }
65
- function formatTime(date) {
66
- return date.toLocaleTimeString("en-US", {
67
- hour: "numeric",
68
- minute: "2-digit",
69
- hour12: true,
70
- });
71
- }
72
- function formatDate(date) {
73
- return date.toLocaleDateString("en-US", {
74
- weekday: "long",
75
- year: "numeric",
76
- month: "long",
77
- day: "numeric",
78
- });
79
- }
80
- // ---------------------------------------------------------------------------
81
- // Default Templates
82
- // ---------------------------------------------------------------------------
83
- /** Default workflow templates for common scenarios */
84
- export const DEFAULT_TEMPLATES = {
85
- confirmation: {
86
- subject: "Booking Confirmed: {booking.title}",
87
- body: "Hi {attendee.name},\n\nYour booking for {booking.title} on {booking.date} at {booking.startTime} has been confirmed.\n\nDuration: {event.duration}\nLocation: {event.location}\n\nManage your booking: {booking.managementUrl}\n\nBest regards,\n{host.name}",
88
- },
89
- reminder_24h: {
90
- subject: "Reminder: {booking.title} tomorrow",
91
- body: "Hi {attendee.name},\n\nThis is a reminder that you have a booking for {booking.title} tomorrow at {booking.startTime}.\n\nLocation: {event.location}\n\nManage your booking: {booking.managementUrl}\n\nSee you soon,\n{host.name}",
92
- },
93
- reminder_1h: {
94
- subject: "Reminder: {booking.title} in 1 hour",
95
- body: "Hi {attendee.name},\n\nYour booking for {booking.title} starts in 1 hour at {booking.startTime}.\n\nLocation: {event.location}\n\nSee you soon,\n{host.name}",
96
- },
97
- cancellation: {
98
- subject: "Booking Cancelled: {booking.title}",
99
- body: "Hi {attendee.name},\n\nYour booking for {booking.title} on {booking.date} at {booking.startTime} has been cancelled.\n\nIf you'd like to rebook, please visit our booking page.\n\nBest regards,\n{host.name}",
100
- },
101
- followup: {
102
- subject: "How was your {booking.title}?",
103
- body: "Hi {attendee.name},\n\nThank you for your recent {booking.title} with {host.name}.\n\nWe hope you had a great experience! If you'd like to book again, we'd love to see you.\n\nBest regards,\n{host.name}",
104
- },
105
- };
106
- // ---------------------------------------------------------------------------
107
- // Condition Evaluation
108
- // ---------------------------------------------------------------------------
109
- /**
110
- * Evaluate whether a workflow's conditions are met for the given context.
111
- *
112
- * If no conditions are defined, returns true (unconditional trigger).
113
- * All conditions must match (AND logic).
114
- *
115
- * @param conditions - Array of workflow conditions
116
- * @param context - The workflow context data
117
- * @returns Whether all conditions are satisfied
118
- */
119
- export function evaluateConditions(conditions, context) {
120
- if (conditions.length === 0)
121
- return true;
122
- return conditions.every((condition) => {
123
- const fieldValue = String(context[condition.field] ?? "");
124
- switch (condition.operator) {
125
- case "equals":
126
- return fieldValue === String(condition.value);
127
- case "not_equals":
128
- return fieldValue !== String(condition.value);
129
- case "contains":
130
- return fieldValue
131
- .toLowerCase()
132
- .includes(String(condition.value).toLowerCase());
133
- case "in": {
134
- const values = Array.isArray(condition.value)
135
- ? condition.value
136
- : [condition.value];
137
- return values.includes(fieldValue);
138
- }
139
- default:
140
- return false;
141
- }
142
- });
143
- }
144
- // ---------------------------------------------------------------------------
145
- // Workflow Validation
146
- // ---------------------------------------------------------------------------
147
- /** Valid triggers for workflows */
148
- const VALID_TRIGGERS = [
149
- "booking_created",
150
- "booking_confirmed",
151
- "booking_cancelled",
152
- "booking_rescheduled",
153
- "before_event",
154
- "after_event",
155
- "payment_received",
156
- "payment_failed",
157
- "no_show_confirmed",
158
- "form_submitted",
159
- ];
160
- /** Valid action types */
161
- const VALID_ACTION_TYPES = [
162
- "send_email",
163
- "send_sms",
164
- "fire_webhook",
165
- "update_status",
166
- "create_calendar_event",
167
- ];
168
- /**
169
- * Validate a workflow definition.
170
- *
171
- * @param workflow - The workflow to validate
172
- * @throws {WorkflowValidationError} If the workflow is invalid
173
- */
174
- export function validateWorkflow(workflow) {
175
- if (!workflow.name || workflow.name.trim().length === 0) {
176
- throw new WorkflowValidationError("Workflow name is required");
177
- }
178
- if (!VALID_TRIGGERS.includes(workflow.trigger)) {
179
- throw new WorkflowValidationError(`Invalid trigger: "${workflow.trigger}". Must be one of: ${VALID_TRIGGERS.join(", ")}`);
180
- }
181
- if (!Array.isArray(workflow.actions) || workflow.actions.length === 0) {
182
- throw new WorkflowValidationError("Workflow must have at least one action");
183
- }
184
- for (const action of workflow.actions) {
185
- if (!VALID_ACTION_TYPES.includes(action.type)) {
186
- throw new WorkflowValidationError(`Invalid action type: "${action.type}"`);
187
- }
188
- validateAction(action);
189
- }
190
- for (const condition of workflow.conditions) {
191
- if (!condition.field || condition.field.trim().length === 0) {
192
- throw new WorkflowValidationError("Condition field is required");
193
- }
194
- if (!["equals", "not_equals", "contains", "in"].includes(condition.operator)) {
195
- throw new WorkflowValidationError(`Invalid condition operator: "${condition.operator}"`);
196
- }
197
- }
198
- }
199
- function validateAction(action) {
200
- switch (action.type) {
201
- case "send_email":
202
- if (!action.to) {
203
- throw new WorkflowValidationError("Email action requires 'to' field");
204
- }
205
- if (!action.subject) {
206
- throw new WorkflowValidationError("Email action requires 'subject' field");
207
- }
208
- if (!action.body) {
209
- throw new WorkflowValidationError("Email action requires 'body' field");
210
- }
211
- break;
212
- case "send_sms":
213
- if (!action.to) {
214
- throw new WorkflowValidationError("SMS action requires 'to' field");
215
- }
216
- if (!action.body) {
217
- throw new WorkflowValidationError("SMS action requires 'body' field");
218
- }
219
- break;
220
- case "fire_webhook":
221
- if (!action.url) {
222
- throw new WorkflowValidationError("Webhook action requires 'url' field");
223
- }
224
- break;
225
- case "update_status":
226
- if (!action.status) {
227
- throw new WorkflowValidationError("Status update action requires 'status' field");
228
- }
229
- break;
230
- case "create_calendar_event":
231
- // No required fields
232
- break;
233
- }
234
- }
235
- // ---------------------------------------------------------------------------
236
- // Workflow Matching
237
- // ---------------------------------------------------------------------------
238
- /**
239
- * Find all active workflows that match a given trigger and context.
240
- *
241
- * @param workflows - All available workflows
242
- * @param trigger - The trigger event that occurred
243
- * @param context - The workflow context data
244
- * @returns Workflows that should be executed
245
- */
246
- export function matchWorkflows(workflows, trigger, context) {
247
- return workflows.filter((w) => w.isActive &&
248
- w.trigger === trigger &&
249
- evaluateConditions(w.conditions, context));
250
- }
251
- //# sourceMappingURL=workflows.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"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"}