@automate.ax/integration-contracts 0.144.2 → 0.145.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.
@@ -0,0 +1,414 @@
1
+ import { encodableSchema } from "@automate.ax/codec";
2
+ import * as z from "zod";
3
+ export const CALCOM_WEBHOOK_TRIGGER_TYPES = [
4
+ "AFTER_GUESTS_CAL_VIDEO_NO_SHOW",
5
+ "AFTER_HOSTS_CAL_VIDEO_NO_SHOW",
6
+ "BOOKING_CANCELLED",
7
+ "BOOKING_CREATED",
8
+ "BOOKING_LOCATION_UPDATED",
9
+ "BOOKING_NO_SHOW_UPDATED",
10
+ "BOOKING_PAID",
11
+ "BOOKING_PAYMENT_INITIATED",
12
+ "BOOKING_REASSIGNED",
13
+ "BOOKING_REJECTED",
14
+ "BOOKING_REQUESTED",
15
+ "BOOKING_RESCHEDULED",
16
+ "CALENDAR_ENTRY_REJECTED",
17
+ "DELEGATION_CREDENTIAL_ERROR",
18
+ "DELEGATION_CREDENTIAL_ROTATION_REQUIRED",
19
+ "DELEGATION_CREDENTIAL_SECRET_ROTATED",
20
+ "DELEGATION_CREDENTIAL_SECRET_ROTATION_FAILED",
21
+ "FORM_SUBMITTED",
22
+ "FORM_SUBMITTED_NO_EVENT",
23
+ "INSTANT_MEETING",
24
+ "INSTANT_MEETING_ACCEPTED",
25
+ "MEETING_ENDED",
26
+ "MEETING_STARTED",
27
+ "OOO_CREATED",
28
+ "RECORDING_READY",
29
+ "RECORDING_TRANSCRIPTION_GENERATED",
30
+ "ROUTING_FORM_FALLBACK_HIT",
31
+ "WRONG_ASSIGNMENT_REPORT",
32
+ ];
33
+ const CALCOM_WEBHOOK_TRIGGER_TYPE_SET = new Set(CALCOM_WEBHOOK_TRIGGER_TYPES);
34
+ const CALCOM_PERSON_SCHEMA = z.looseObject({
35
+ email: z.email(),
36
+ id: z.number().int().optional(),
37
+ language: z.looseObject({ locale: z.string() }),
38
+ name: z.string(),
39
+ phoneNumber: z.string().nullable().optional(),
40
+ timeZone: z.string(),
41
+ username: z.string().nullable().optional(),
42
+ utcOffset: z.number().optional(),
43
+ });
44
+ const CALCOM_OUT_OF_OFFICE_COVER_SCHEMA = z.looseObject({
45
+ email: z.email().optional(),
46
+ id: z.number().int(),
47
+ name: z.string().nullable().optional(),
48
+ timeZone: z.string().optional(),
49
+ username: z.string().nullable().optional(),
50
+ });
51
+ const CALCOM_OUT_OF_OFFICE_USER_SCHEMA = CALCOM_PERSON_SCHEMA.extend({
52
+ id: z.number().int(),
53
+ name: z.string().nullable(),
54
+ timeZone: z.string(),
55
+ username: z.string().nullable(),
56
+ });
57
+ const ENCODABLE_RECORD_SCHEMA = z.record(z.string(), encodableSchema);
58
+ const BOOKING_PAYLOAD_SCHEMA = z.looseObject({
59
+ additionalNotes: z.string().optional(),
60
+ attendees: CALCOM_PERSON_SCHEMA.array(),
61
+ bookingId: z.number().int(),
62
+ customInputs: ENCODABLE_RECORD_SCHEMA.nullable().optional(),
63
+ description: z.string(),
64
+ endTime: z.string(),
65
+ eventDescription: z.string().nullable().optional(),
66
+ eventTitle: z.string().optional(),
67
+ eventTypeId: z.number().int().nullable().optional(),
68
+ location: encodableSchema.optional(),
69
+ metadata: ENCODABLE_RECORD_SCHEMA.optional(),
70
+ organizer: CALCOM_PERSON_SCHEMA,
71
+ responses: ENCODABLE_RECORD_SCHEMA.nullable().optional(),
72
+ startTime: z.string(),
73
+ status: z.string(),
74
+ title: z.string(),
75
+ type: z.string(),
76
+ uid: z.string(),
77
+ });
78
+ const BOOKING_PAYLOAD_WITH_ICS_SCHEMA = BOOKING_PAYLOAD_SCHEMA.extend({
79
+ attendeeIcsContent: z.string().optional(),
80
+ organizerIcsContent: z.string().optional(),
81
+ });
82
+ const FORM_SUBMISSION_PAYLOAD_SCHEMA = z.looseObject({
83
+ formId: z.string(),
84
+ formName: z.string(),
85
+ responses: ENCODABLE_RECORD_SCHEMA,
86
+ teamId: z.number().int().nullable().optional(),
87
+ });
88
+ const DELEGATION_CREDENTIAL_SCHEMA = z.looseObject({
89
+ domain: z.string(),
90
+ id: z.string(),
91
+ organizationId: z.number().int(),
92
+ secretExpiresAt: z.iso.datetime({ offset: true }),
93
+ workspacePlatform: z.string(),
94
+ });
95
+ const CAL_VIDEO_NO_SHOW_SCHEMA = z.looseObject({
96
+ attendees: CALCOM_PERSON_SCHEMA.array(),
97
+ bookingId: z.number().int(),
98
+ bookingUid: z.string(),
99
+ endTime: z.string(),
100
+ message: z.string(),
101
+ participants: encodableSchema.array(),
102
+ startTime: z.string(),
103
+ title: z.string(),
104
+ webhook: z.looseObject({
105
+ id: z.union([z.number(), z.string()]),
106
+ subscriberUrl: z.url(),
107
+ time: z.number(),
108
+ timeUnit: z.string(),
109
+ }),
110
+ });
111
+ const CALCOM_MEETING_EVENT_SCHEMA = z.looseObject({
112
+ attendees: CALCOM_PERSON_SCHEMA.array(),
113
+ createdAt: z.iso.datetime({ offset: true }),
114
+ endTime: z.string(),
115
+ id: z.number().int(),
116
+ startTime: z.string(),
117
+ title: z.string(),
118
+ uid: z.string(),
119
+ });
120
+ const CALCOM_PAYLOAD_SCHEMAS = {
121
+ AFTER_GUESTS_CAL_VIDEO_NO_SHOW: CAL_VIDEO_NO_SHOW_SCHEMA,
122
+ AFTER_HOSTS_CAL_VIDEO_NO_SHOW: CAL_VIDEO_NO_SHOW_SCHEMA.extend({
123
+ hostEmail: z.email(),
124
+ noShowHost: z.boolean(),
125
+ }),
126
+ BOOKING_CANCELLED: BOOKING_PAYLOAD_WITH_ICS_SCHEMA.extend({
127
+ cancelledBy: z.string().optional(),
128
+ cancellationReason: z.string().optional(),
129
+ requestReschedule: z.boolean(),
130
+ }),
131
+ BOOKING_CREATED: BOOKING_PAYLOAD_WITH_ICS_SCHEMA,
132
+ BOOKING_LOCATION_UPDATED: BOOKING_PAYLOAD_SCHEMA.extend({
133
+ previousLocation: encodableSchema,
134
+ }),
135
+ BOOKING_NO_SHOW_UPDATED: z.looseObject({
136
+ attendees: z.looseObject({ email: z.email(), noShow: z.boolean() }).array(),
137
+ bookingId: z.number().int().optional(),
138
+ bookingUid: z.string(),
139
+ message: z.string(),
140
+ }),
141
+ BOOKING_PAID: BOOKING_PAYLOAD_WITH_ICS_SCHEMA.extend({
142
+ paymentData: ENCODABLE_RECORD_SCHEMA.optional(),
143
+ paymentId: z.number().int().optional(),
144
+ }),
145
+ BOOKING_PAYMENT_INITIATED: BOOKING_PAYLOAD_SCHEMA.extend({
146
+ paymentData: ENCODABLE_RECORD_SCHEMA.optional(),
147
+ paymentId: z.number().int().optional(),
148
+ }),
149
+ BOOKING_REASSIGNED: BOOKING_PAYLOAD_WITH_ICS_SCHEMA.extend({
150
+ addedHostUserIds: z.number().int().array(),
151
+ removedHostUserIds: z.number().int().array(),
152
+ }),
153
+ BOOKING_REJECTED: BOOKING_PAYLOAD_SCHEMA.extend({
154
+ rejectionReason: z.string().optional(),
155
+ }),
156
+ BOOKING_REQUESTED: BOOKING_PAYLOAD_SCHEMA.extend({
157
+ requiresConfirmation: z.boolean(),
158
+ }),
159
+ BOOKING_RESCHEDULED: BOOKING_PAYLOAD_WITH_ICS_SCHEMA.extend({
160
+ rescheduleId: z.number().int().optional(),
161
+ rescheduleEndTime: z.string().optional(),
162
+ rescheduleStartTime: z.string().optional(),
163
+ rescheduleUid: z.string().optional(),
164
+ rescheduledBy: z.string().optional(),
165
+ }),
166
+ CALENDAR_ENTRY_REJECTED: z.looseObject({}),
167
+ DELEGATION_CREDENTIAL_ERROR: z.looseObject({
168
+ credential: z.looseObject({
169
+ appId: z.string(),
170
+ delegationCredentialId: z.string(),
171
+ id: z.number().int(),
172
+ type: z.string(),
173
+ }),
174
+ error: z.looseObject({ message: z.string(), type: z.string() }),
175
+ user: z.looseObject({
176
+ email: z.email(),
177
+ id: z.number().int(),
178
+ organizationId: z.number().int(),
179
+ }),
180
+ }),
181
+ DELEGATION_CREDENTIAL_ROTATION_REQUIRED: z.looseObject({
182
+ delegationCredential: DELEGATION_CREDENTIAL_SCHEMA,
183
+ }),
184
+ DELEGATION_CREDENTIAL_SECRET_ROTATED: z.looseObject({
185
+ delegationCredential: DELEGATION_CREDENTIAL_SCHEMA,
186
+ }),
187
+ DELEGATION_CREDENTIAL_SECRET_ROTATION_FAILED: z.looseObject({
188
+ delegationCredential: DELEGATION_CREDENTIAL_SCHEMA,
189
+ error: z.looseObject({
190
+ code: z.enum(["SECRET_MINT_FAILED", "SECRET_PROMOTION_FAILED"]),
191
+ message: z.string(),
192
+ }),
193
+ }),
194
+ FORM_SUBMITTED: FORM_SUBMISSION_PAYLOAD_SCHEMA,
195
+ FORM_SUBMITTED_NO_EVENT: FORM_SUBMISSION_PAYLOAD_SCHEMA.extend({
196
+ redirect: ENCODABLE_RECORD_SCHEMA.optional(),
197
+ responseId: z.number().int().optional(),
198
+ }),
199
+ INSTANT_MEETING: z.looseObject({
200
+ connectAndJoinUrl: z.url(),
201
+ customInputs: ENCODABLE_RECORD_SCHEMA,
202
+ eventTypeId: z.number().int(),
203
+ eventTypeTitle: z.string(),
204
+ responses: ENCODABLE_RECORD_SCHEMA,
205
+ uid: z.string(),
206
+ }),
207
+ INSTANT_MEETING_ACCEPTED: z.looseObject({
208
+ attendees: CALCOM_PERSON_SCHEMA.array(),
209
+ bookingId: z.number().int(),
210
+ bookingUid: z.string(),
211
+ endTime: z.string(),
212
+ eventTypeId: z.number().int(),
213
+ organizer: CALCOM_PERSON_SCHEMA,
214
+ startTime: z.string(),
215
+ status: z.string(),
216
+ title: z.string(),
217
+ }),
218
+ OOO_CREATED: z.looseObject({
219
+ oooEntry: z.looseObject({
220
+ createdAt: z.iso.datetime({ offset: true }),
221
+ end: z.string(),
222
+ id: z.number().int(),
223
+ notes: z.string().nullable(),
224
+ reason: z.looseObject({
225
+ emoji: z.string().optional(),
226
+ reason: z.string().optional(),
227
+ }),
228
+ reasonId: z.number().int(),
229
+ start: z.string(),
230
+ toUser: CALCOM_OUT_OF_OFFICE_COVER_SCHEMA.nullable(),
231
+ updatedAt: z.iso.datetime({ offset: true }),
232
+ user: CALCOM_OUT_OF_OFFICE_USER_SCHEMA,
233
+ uuid: z.string(),
234
+ }),
235
+ }),
236
+ RECORDING_READY: BOOKING_PAYLOAD_SCHEMA.pick({
237
+ attendees: true,
238
+ endTime: true,
239
+ organizer: true,
240
+ startTime: true,
241
+ title: true,
242
+ uid: true,
243
+ }).extend({ downloadLink: z.url() }),
244
+ RECORDING_TRANSCRIPTION_GENERATED: BOOKING_PAYLOAD_SCHEMA.pick({
245
+ attendees: true,
246
+ endTime: true,
247
+ organizer: true,
248
+ startTime: true,
249
+ title: true,
250
+ uid: true,
251
+ }).extend({
252
+ downloadLinks: z
253
+ .looseObject({
254
+ recording: z.url().optional(),
255
+ transcription: z
256
+ .looseObject({ format: z.string(), link: z.url() })
257
+ .array()
258
+ .optional(),
259
+ })
260
+ .optional(),
261
+ }),
262
+ ROUTING_FORM_FALLBACK_HIT: FORM_SUBMISSION_PAYLOAD_SCHEMA,
263
+ WRONG_ASSIGNMENT_REPORT: z.looseObject({
264
+ booking: z.looseObject({
265
+ endTime: z.string(),
266
+ id: z.number().int(),
267
+ startTime: z.string(),
268
+ status: z.string(),
269
+ title: z.string(),
270
+ uid: z.string(),
271
+ }),
272
+ report: z.looseObject({
273
+ additionalNotes: z.string().nullable(),
274
+ correctAssignee: z.string().nullable(),
275
+ firstAssignmentReason: z.string().nullable(),
276
+ guest: z.string().nullable(),
277
+ host: z.looseObject({
278
+ email: z.email().nullable(),
279
+ name: z.string().nullable(),
280
+ }),
281
+ reportedBy: z.looseObject({
282
+ email: z.email(),
283
+ id: z.number().int(),
284
+ name: z.string().nullable(),
285
+ }),
286
+ routingReason: z.string().nullable().optional(),
287
+ }),
288
+ }),
289
+ };
290
+ export const CALCOM_TRIGGER_CONFIG_SCHEMA = z.object({});
291
+ export const CALCOM_EVENT_SCHEMA = z.custom((value) => {
292
+ if (typeof value !== "object" ||
293
+ value === null ||
294
+ !("triggerEvent" in value) ||
295
+ typeof value.triggerEvent !== "string" ||
296
+ !isCalcomWebhookTriggerType(value.triggerEvent)) {
297
+ return false;
298
+ }
299
+ return calcomSemanticEventSchema(value.triggerEvent).safeParse(value)
300
+ .success;
301
+ });
302
+ /**
303
+ * Builds a schema narrowed to one exact Cal.com webhook trigger.
304
+ *
305
+ * @param type Exact Cal.com provider event type.
306
+ */
307
+ export function calcomSemanticEventSchema(type) {
308
+ if (type === "MEETING_ENDED" || type === "MEETING_STARTED") {
309
+ const schema = CALCOM_MEETING_EVENT_SCHEMA.extend({
310
+ triggerEvent: z.literal(type),
311
+ });
312
+ return z.custom((value) => schema.safeParse(value).success);
313
+ }
314
+ if (isCalcomWrappedTriggerType(type)) {
315
+ const schema = z.looseObject({
316
+ createdAt: z.iso.datetime({ offset: true }),
317
+ payload: CALCOM_PAYLOAD_SCHEMAS[type],
318
+ triggerEvent: z.literal(type),
319
+ });
320
+ return z.custom((value) => schema.safeParse(value).success);
321
+ }
322
+ return z.never();
323
+ }
324
+ /**
325
+ * Returns whether a string is a supported Cal.com webhook type.
326
+ *
327
+ * @param value Candidate provider event type.
328
+ */
329
+ function isCalcomWebhookTriggerType(value) {
330
+ return CALCOM_WEBHOOK_TRIGGER_TYPE_SET.has(value);
331
+ }
332
+ /**
333
+ * Returns whether a Cal.com webhook carries its data under `payload`.
334
+ *
335
+ * @param type Supported Cal.com webhook type.
336
+ */
337
+ function isCalcomWrappedTriggerType(type) {
338
+ return Object.hasOwn(CALCOM_PAYLOAD_SCHEMAS, type);
339
+ }
340
+ export const CALCOM_EVENT_TYPE_MAP = {
341
+ AFTER_GUESTS_CAL_VIDEO_NO_SHOW: "calcom.afterGuestsCalVideoNoShow",
342
+ AFTER_HOSTS_CAL_VIDEO_NO_SHOW: "calcom.afterHostsCalVideoNoShow",
343
+ BOOKING_CANCELLED: "calcom.booking.cancelled",
344
+ BOOKING_CREATED: "calcom.booking.created",
345
+ BOOKING_LOCATION_UPDATED: "calcom.booking.locationUpdated",
346
+ BOOKING_NO_SHOW_UPDATED: "calcom.booking.noShowUpdated",
347
+ BOOKING_PAID: "calcom.booking.paid",
348
+ BOOKING_PAYMENT_INITIATED: "calcom.booking.paymentInitiated",
349
+ BOOKING_REASSIGNED: "calcom.booking.reassigned",
350
+ BOOKING_REJECTED: "calcom.booking.rejected",
351
+ BOOKING_REQUESTED: "calcom.booking.requested",
352
+ BOOKING_RESCHEDULED: "calcom.booking.rescheduled",
353
+ CALENDAR_ENTRY_REJECTED: "calcom.calendarEntryRejected",
354
+ DELEGATION_CREDENTIAL_ERROR: "calcom.delegationCredential.error",
355
+ DELEGATION_CREDENTIAL_ROTATION_REQUIRED: "calcom.delegationCredential.rotationRequired",
356
+ DELEGATION_CREDENTIAL_SECRET_ROTATED: "calcom.delegationCredential.secretRotated",
357
+ DELEGATION_CREDENTIAL_SECRET_ROTATION_FAILED: "calcom.delegationCredential.secretRotationFailed",
358
+ FORM_SUBMITTED: "calcom.form.submitted",
359
+ FORM_SUBMITTED_NO_EVENT: "calcom.form.submittedWithoutEvent",
360
+ INSTANT_MEETING: "calcom.instantMeeting.created",
361
+ INSTANT_MEETING_ACCEPTED: "calcom.instantMeeting.accepted",
362
+ MEETING_ENDED: "calcom.meeting.ended",
363
+ MEETING_STARTED: "calcom.meeting.started",
364
+ OOO_CREATED: "calcom.outOfOffice.created",
365
+ RECORDING_READY: "calcom.recording.ready",
366
+ RECORDING_TRANSCRIPTION_GENERATED: "calcom.recording.transcriptionGenerated",
367
+ ROUTING_FORM_FALLBACK_HIT: "calcom.routingForm.fallbackHit",
368
+ WRONG_ASSIGNMENT_REPORT: "calcom.wrongAssignmentReported",
369
+ };
370
+ export const calcomTriggerContracts = {
371
+ "calcom.afterGuestsCalVideoNoShow": contract("AFTER_GUESTS_CAL_VIDEO_NO_SHOW"),
372
+ "calcom.afterHostsCalVideoNoShow": contract("AFTER_HOSTS_CAL_VIDEO_NO_SHOW"),
373
+ "calcom.booking.cancelled": contract("BOOKING_CANCELLED"),
374
+ "calcom.booking.created": contract("BOOKING_CREATED"),
375
+ "calcom.booking.locationUpdated": contract("BOOKING_LOCATION_UPDATED"),
376
+ "calcom.booking.noShowUpdated": contract("BOOKING_NO_SHOW_UPDATED"),
377
+ "calcom.booking.paid": contract("BOOKING_PAID"),
378
+ "calcom.booking.paymentInitiated": contract("BOOKING_PAYMENT_INITIATED"),
379
+ "calcom.booking.reassigned": contract("BOOKING_REASSIGNED"),
380
+ "calcom.booking.rejected": contract("BOOKING_REJECTED"),
381
+ "calcom.booking.requested": contract("BOOKING_REQUESTED"),
382
+ "calcom.booking.rescheduled": contract("BOOKING_RESCHEDULED"),
383
+ "calcom.calendarEntryRejected": contract("CALENDAR_ENTRY_REJECTED"),
384
+ "calcom.delegationCredential.error": contract("DELEGATION_CREDENTIAL_ERROR"),
385
+ "calcom.delegationCredential.rotationRequired": contract("DELEGATION_CREDENTIAL_ROTATION_REQUIRED"),
386
+ "calcom.delegationCredential.secretRotated": contract("DELEGATION_CREDENTIAL_SECRET_ROTATED"),
387
+ "calcom.delegationCredential.secretRotationFailed": contract("DELEGATION_CREDENTIAL_SECRET_ROTATION_FAILED"),
388
+ "calcom.event": {
389
+ configSchema: CALCOM_TRIGGER_CONFIG_SCHEMA,
390
+ eventSchema: CALCOM_EVENT_SCHEMA,
391
+ },
392
+ "calcom.form.submitted": contract("FORM_SUBMITTED"),
393
+ "calcom.form.submittedWithoutEvent": contract("FORM_SUBMITTED_NO_EVENT"),
394
+ "calcom.instantMeeting.accepted": contract("INSTANT_MEETING_ACCEPTED"),
395
+ "calcom.instantMeeting.created": contract("INSTANT_MEETING"),
396
+ "calcom.meeting.ended": contract("MEETING_ENDED"),
397
+ "calcom.meeting.started": contract("MEETING_STARTED"),
398
+ "calcom.outOfOffice.created": contract("OOO_CREATED"),
399
+ "calcom.recording.ready": contract("RECORDING_READY"),
400
+ "calcom.recording.transcriptionGenerated": contract("RECORDING_TRANSCRIPTION_GENERATED"),
401
+ "calcom.routingForm.fallbackHit": contract("ROUTING_FORM_FALLBACK_HIT"),
402
+ "calcom.wrongAssignmentReported": contract("WRONG_ASSIGNMENT_REPORT"),
403
+ };
404
+ /**
405
+ * Builds one trigger contract for an exact Cal.com provider event.
406
+ *
407
+ * @param type Exact Cal.com provider event type.
408
+ */
409
+ function contract(type) {
410
+ return {
411
+ configSchema: CALCOM_TRIGGER_CONFIG_SCHEMA,
412
+ eventSchema: calcomSemanticEventSchema(type),
413
+ };
414
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./api.js";
2
+ export * from "./events.js";
3
+ export * from "./schemas.js";
4
+ export type { components } from "./openapi-types.generated";
@@ -0,0 +1,3 @@
1
+ export * from "./api.js";
2
+ export * from "./events.js";
3
+ export * from "./schemas.js";