@automate.ax/integration-contracts 0.143.8 → 0.144.0
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/calendly/api.d.ts +55 -0
- package/dist/calendly/api.js +176 -0
- package/dist/calendly/index.d.ts +6023 -0
- package/dist/calendly/index.js +46 -0
- package/dist/calendly/schemas.d.ts +1170 -0
- package/dist/calendly/schemas.js +420 -0
- package/dist/close/events.d.ts +8 -8
- package/dist/close/schemas.d.ts +12 -12
- package/dist/google-ads/api.d.ts +14 -0
- package/dist/google-ads/api.js +51 -0
- package/dist/millionverifier/schemas.d.ts +7 -7
- package/dist/resend/action-schemas.d.ts +9 -9
- package/dist/slack/event-schemas.d.ts +583 -583
- package/dist/slack/index.d.ts +303 -303
- package/dist/slack/schemas.d.ts +1 -1
- package/dist/teams/index.d.ts +5 -5
- package/dist/teams/schemas.d.ts +4 -4
- package/dist/trello/schemas.d.ts +2 -2
- package/dist/triggers.d.ts +2 -1
- package/package.json +8 -2
- package/src/calendly/api.ts +216 -0
- package/src/calendly/index.ts +69 -0
- package/src/calendly/schemas.ts +450 -0
- package/src/google-ads/api.ts +73 -0
- package/src/triggers.ts +2 -0
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
|
|
3
|
+
export const CALENDLY_DATE_TIME_SCHEMA = z.iso.datetime({ offset: true })
|
|
4
|
+
export const CALENDLY_URI_SCHEMA = z.url()
|
|
5
|
+
export const CALENDLY_UUID_SCHEMA = z
|
|
6
|
+
.string()
|
|
7
|
+
.trim()
|
|
8
|
+
.regex(/^[A-Za-z0-9_-]+$/, "Use a Calendly UUID, not a path or URL.")
|
|
9
|
+
|
|
10
|
+
export const CALENDLY_PAGINATION_SCHEMA = z.object({
|
|
11
|
+
count: z.number().int().min(0).max(100),
|
|
12
|
+
nextPage: z.url().nullable(),
|
|
13
|
+
nextPageToken: z.string().nullable(),
|
|
14
|
+
previousPage: z.url().nullable(),
|
|
15
|
+
previousPageToken: z.string().nullable(),
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
export const CALENDLY_USER_SCHEMA = z.object({
|
|
19
|
+
avatarUrl: z.url().nullable(),
|
|
20
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
21
|
+
currentOrganization: CALENDLY_URI_SCHEMA,
|
|
22
|
+
email: z.email(),
|
|
23
|
+
locale: z.string(),
|
|
24
|
+
name: z.string(),
|
|
25
|
+
resourceType: z.string(),
|
|
26
|
+
schedulingUrl: CALENDLY_URI_SCHEMA,
|
|
27
|
+
slug: z.string(),
|
|
28
|
+
timeNotation: z.enum(["12h", "24h"]).optional(),
|
|
29
|
+
timezone: z.string(),
|
|
30
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
31
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
export const CALENDLY_ORGANIZATION_SCHEMA = z.object({
|
|
35
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
36
|
+
kind: z.enum(["solo", "group"]),
|
|
37
|
+
name: z.string().optional(),
|
|
38
|
+
plan: z.string(),
|
|
39
|
+
stage: z.string(),
|
|
40
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
41
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
export const CALENDLY_ORGANIZATION_MEMBERSHIP_SCHEMA = z.object({
|
|
45
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
46
|
+
organization: CALENDLY_URI_SCHEMA,
|
|
47
|
+
role: z.enum(["admin", "owner", "user"]),
|
|
48
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
49
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
50
|
+
user: CALENDLY_USER_SCHEMA.omit({
|
|
51
|
+
currentOrganization: true,
|
|
52
|
+
resourceType: true,
|
|
53
|
+
}),
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
const QUESTION_AND_ANSWER_SCHEMA = z.object({
|
|
57
|
+
answer: z.string(),
|
|
58
|
+
position: z.number().int(),
|
|
59
|
+
question: z.string(),
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
export const CALENDLY_EVENT_TYPE_SCHEMA = z.object({
|
|
63
|
+
active: z.boolean(),
|
|
64
|
+
adminManaged: z.boolean(),
|
|
65
|
+
bookingMethod: z.enum(["instant", "poll"]),
|
|
66
|
+
color: z.string().regex(/^#[a-f\d]{6}$/i),
|
|
67
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
68
|
+
customQuestions: z
|
|
69
|
+
.object({
|
|
70
|
+
answerChoices: z.string().array(),
|
|
71
|
+
enabled: z.boolean(),
|
|
72
|
+
includeOther: z.boolean(),
|
|
73
|
+
name: z.string(),
|
|
74
|
+
position: z.number().int(),
|
|
75
|
+
required: z.boolean(),
|
|
76
|
+
type: z.string(),
|
|
77
|
+
})
|
|
78
|
+
.array(),
|
|
79
|
+
deletedAt: CALENDLY_DATE_TIME_SCHEMA.nullable(),
|
|
80
|
+
descriptionHtml: z.string().nullable(),
|
|
81
|
+
descriptionPlain: z.string().nullable(),
|
|
82
|
+
duration: z.number().positive(),
|
|
83
|
+
durationOptions: z.number().int().positive().array().nullable(),
|
|
84
|
+
internalNote: z.string().nullable(),
|
|
85
|
+
isPaid: z.boolean(),
|
|
86
|
+
kind: z.enum(["solo", "group"]),
|
|
87
|
+
locale: z.string(),
|
|
88
|
+
locations: z
|
|
89
|
+
.object({
|
|
90
|
+
additionalInfo: z.string().optional(),
|
|
91
|
+
kind: z.string(),
|
|
92
|
+
location: z.string().optional(),
|
|
93
|
+
phoneNumber: z.string().optional(),
|
|
94
|
+
})
|
|
95
|
+
.array()
|
|
96
|
+
.nullable(),
|
|
97
|
+
name: z.string().nullable(),
|
|
98
|
+
poolingType: z.enum(["collective", "multi_pool", "round_robin"]).nullable(),
|
|
99
|
+
position: z.number().int().min(0),
|
|
100
|
+
profile: z.object({ name: z.string(), owner: CALENDLY_URI_SCHEMA }),
|
|
101
|
+
schedulingUrl: CALENDLY_URI_SCHEMA,
|
|
102
|
+
secret: z.boolean(),
|
|
103
|
+
slug: z.string().nullable(),
|
|
104
|
+
type: z.enum(["AdhocEventType", "StandardEventType"]),
|
|
105
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
106
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
export const CALENDLY_EVENT_TYPE_HOST_SCHEMA = z.object({
|
|
110
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA.optional(),
|
|
111
|
+
eventType: CALENDLY_EVENT_TYPE_SCHEMA,
|
|
112
|
+
member: CALENDLY_USER_SCHEMA.optional(),
|
|
113
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA.optional(),
|
|
114
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
export const CALENDLY_CANCELLATION_SCHEMA = z.object({
|
|
118
|
+
canceledBy: z.string(),
|
|
119
|
+
cancelerType: z.string(),
|
|
120
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
121
|
+
reason: z.string().nullable(),
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
export const CALENDLY_AVAILABLE_TIME_SCHEMA = z.object({
|
|
125
|
+
inviteesRemaining: z.number().int().min(0),
|
|
126
|
+
schedulingUrl: CALENDLY_URI_SCHEMA,
|
|
127
|
+
startTime: CALENDLY_DATE_TIME_SCHEMA,
|
|
128
|
+
status: z.literal("available"),
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
export const CALENDLY_AVAILABILITY_RULE_SCHEMA = z.object({
|
|
132
|
+
date: z.iso.date().optional(),
|
|
133
|
+
intervals: z
|
|
134
|
+
.object({
|
|
135
|
+
from: z.string().regex(/^\d\d:\d\d$/),
|
|
136
|
+
to: z.string().regex(/^\d\d:\d\d$/),
|
|
137
|
+
})
|
|
138
|
+
.array(),
|
|
139
|
+
type: z.enum(["date", "wday"]),
|
|
140
|
+
wday: z
|
|
141
|
+
.enum([
|
|
142
|
+
"sunday",
|
|
143
|
+
"monday",
|
|
144
|
+
"tuesday",
|
|
145
|
+
"wednesday",
|
|
146
|
+
"thursday",
|
|
147
|
+
"friday",
|
|
148
|
+
"saturday",
|
|
149
|
+
])
|
|
150
|
+
.optional(),
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
export const CALENDLY_AVAILABILITY_SCHEDULE_SCHEMA = z.object({
|
|
154
|
+
default: z.boolean(),
|
|
155
|
+
name: z.string(),
|
|
156
|
+
rules: CALENDLY_AVAILABILITY_RULE_SCHEMA.array(),
|
|
157
|
+
timezone: z.string(),
|
|
158
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
159
|
+
user: CALENDLY_URI_SCHEMA,
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
export const CALENDLY_EVENT_TYPE_AVAILABILITY_SCHEDULE_SCHEMA = z.object({
|
|
163
|
+
availabilityRule: z.object({
|
|
164
|
+
name: z.string().nullable().optional(),
|
|
165
|
+
rules: CALENDLY_AVAILABILITY_RULE_SCHEMA.array().optional(),
|
|
166
|
+
timezone: z.string().optional(),
|
|
167
|
+
uri: CALENDLY_URI_SCHEMA.optional(),
|
|
168
|
+
user: CALENDLY_URI_SCHEMA.optional(),
|
|
169
|
+
}),
|
|
170
|
+
availabilitySetting: z.literal("host"),
|
|
171
|
+
eventType: CALENDLY_URI_SCHEMA,
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
export const CALENDLY_MEETING_LOCATION_SCHEMA = z.object({
|
|
175
|
+
connected: z.boolean().optional(),
|
|
176
|
+
kind: z.enum([
|
|
177
|
+
"ask_invitee",
|
|
178
|
+
"custom",
|
|
179
|
+
"google_conference",
|
|
180
|
+
"gotomeeting_conference",
|
|
181
|
+
"inbound_call",
|
|
182
|
+
"microsoft_teams_conference",
|
|
183
|
+
"outbound_call",
|
|
184
|
+
"physical",
|
|
185
|
+
"webex_conference",
|
|
186
|
+
"zoom_conference",
|
|
187
|
+
]),
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
export const CALENDLY_BUSY_TIME_SCHEMA = z.object({
|
|
191
|
+
bufferedEndTime: CALENDLY_DATE_TIME_SCHEMA.optional(),
|
|
192
|
+
bufferedStartTime: CALENDLY_DATE_TIME_SCHEMA.optional(),
|
|
193
|
+
endTime: CALENDLY_DATE_TIME_SCHEMA,
|
|
194
|
+
event: z.object({ uri: CALENDLY_URI_SCHEMA }).optional(),
|
|
195
|
+
startTime: CALENDLY_DATE_TIME_SCHEMA,
|
|
196
|
+
type: z.enum(["calendly", "external", "reserved"]),
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
export const CALENDLY_SCHEDULED_EVENT_SCHEMA = z.object({
|
|
200
|
+
cancellation: z
|
|
201
|
+
.object({
|
|
202
|
+
canceledBy: z.string(),
|
|
203
|
+
reason: z.string().nullable(),
|
|
204
|
+
})
|
|
205
|
+
.nullable()
|
|
206
|
+
.optional(),
|
|
207
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
208
|
+
endTime: CALENDLY_DATE_TIME_SCHEMA,
|
|
209
|
+
eventGuests: z
|
|
210
|
+
.object({
|
|
211
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
212
|
+
email: z.email(),
|
|
213
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
214
|
+
})
|
|
215
|
+
.array(),
|
|
216
|
+
eventMemberships: z
|
|
217
|
+
.object({
|
|
218
|
+
bufferedEndTime: CALENDLY_DATE_TIME_SCHEMA.optional(),
|
|
219
|
+
bufferedStartTime: CALENDLY_DATE_TIME_SCHEMA.optional(),
|
|
220
|
+
user: CALENDLY_URI_SCHEMA,
|
|
221
|
+
userEmail: z.email().optional(),
|
|
222
|
+
userName: z.string().optional(),
|
|
223
|
+
})
|
|
224
|
+
.array(),
|
|
225
|
+
eventType: CALENDLY_URI_SCHEMA,
|
|
226
|
+
inviteesCounter: z.object({
|
|
227
|
+
active: z.number().int().min(0),
|
|
228
|
+
limit: z.number().int().min(0),
|
|
229
|
+
total: z.number().int().min(0),
|
|
230
|
+
}),
|
|
231
|
+
location: z.object({
|
|
232
|
+
additionalInfo: z.string().optional(),
|
|
233
|
+
joinUrl: CALENDLY_URI_SCHEMA.nullable().optional(),
|
|
234
|
+
location: z.string().nullable().optional(),
|
|
235
|
+
status: z.string().nullable().optional(),
|
|
236
|
+
type: z.string(),
|
|
237
|
+
}),
|
|
238
|
+
meetingNotesHtml: z.string().optional(),
|
|
239
|
+
meetingNotesPlain: z.string().nullable().optional(),
|
|
240
|
+
name: z.string().nullable(),
|
|
241
|
+
startTime: CALENDLY_DATE_TIME_SCHEMA,
|
|
242
|
+
status: z.enum(["active", "canceled"]),
|
|
243
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
244
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
export const CALENDLY_INVITEE_SCHEMA = z.object({
|
|
248
|
+
cancelUrl: CALENDLY_URI_SCHEMA,
|
|
249
|
+
cancellation: CALENDLY_CANCELLATION_SCHEMA.nullable().optional(),
|
|
250
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
251
|
+
email: z.email(),
|
|
252
|
+
event: CALENDLY_URI_SCHEMA,
|
|
253
|
+
firstName: z.string().nullable(),
|
|
254
|
+
inviteeScheduledBy: CALENDLY_URI_SCHEMA.nullable(),
|
|
255
|
+
lastName: z.string().nullable(),
|
|
256
|
+
name: z.string(),
|
|
257
|
+
newInvitee: CALENDLY_URI_SCHEMA.nullable(),
|
|
258
|
+
noShow: z
|
|
259
|
+
.object({
|
|
260
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
261
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
262
|
+
})
|
|
263
|
+
.nullable(),
|
|
264
|
+
oldInvitee: CALENDLY_URI_SCHEMA.nullable(),
|
|
265
|
+
payment: z
|
|
266
|
+
.object({
|
|
267
|
+
amount: z.string(),
|
|
268
|
+
currency: z.string(),
|
|
269
|
+
externalId: z.string(),
|
|
270
|
+
provider: z.string(),
|
|
271
|
+
successful: z.boolean(),
|
|
272
|
+
terms: z.string().nullable(),
|
|
273
|
+
})
|
|
274
|
+
.nullable(),
|
|
275
|
+
questionsAndAnswers: QUESTION_AND_ANSWER_SCHEMA.array(),
|
|
276
|
+
reconfirmation: z
|
|
277
|
+
.object({
|
|
278
|
+
confirmedAt: CALENDLY_DATE_TIME_SCHEMA.nullable(),
|
|
279
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
280
|
+
})
|
|
281
|
+
.nullable(),
|
|
282
|
+
rescheduleUrl: CALENDLY_URI_SCHEMA,
|
|
283
|
+
rescheduled: z.boolean(),
|
|
284
|
+
routingFormSubmission: CALENDLY_URI_SCHEMA.nullable(),
|
|
285
|
+
schedulingMethod: z.enum(["api", "instant_book"]).nullable(),
|
|
286
|
+
status: z.enum(["active", "canceled"]),
|
|
287
|
+
textReminderNumber: z.string().nullable(),
|
|
288
|
+
timezone: z.string().nullable(),
|
|
289
|
+
tracking: z.object({
|
|
290
|
+
salesforceUuid: z.string().nullable().optional(),
|
|
291
|
+
utmCampaign: z.string().nullable().optional(),
|
|
292
|
+
utmContent: z.string().nullable().optional(),
|
|
293
|
+
utmMedium: z.string().nullable().optional(),
|
|
294
|
+
utmSource: z.string().nullable().optional(),
|
|
295
|
+
utmTerm: z.string().nullable().optional(),
|
|
296
|
+
}),
|
|
297
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
298
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
export const CALENDLY_INVITEE_NO_SHOW_SCHEMA = z.object({
|
|
302
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
303
|
+
invitee: CALENDLY_URI_SCHEMA,
|
|
304
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
export const CALENDLY_ROUTING_FORM_SCHEMA = z.object({
|
|
308
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
309
|
+
name: z.string(),
|
|
310
|
+
organization: CALENDLY_URI_SCHEMA,
|
|
311
|
+
questions: z
|
|
312
|
+
.object({
|
|
313
|
+
answerChoices: z.string().array().nullable(),
|
|
314
|
+
name: z.string(),
|
|
315
|
+
required: z.boolean(),
|
|
316
|
+
type: z.string(),
|
|
317
|
+
uuid: z.string(),
|
|
318
|
+
})
|
|
319
|
+
.array(),
|
|
320
|
+
status: z.enum(["draft", "published"]),
|
|
321
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
322
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
323
|
+
})
|
|
324
|
+
|
|
325
|
+
export const CALENDLY_ROUTING_FORM_SUBMISSION_SCHEMA = z.object({
|
|
326
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
327
|
+
questionsAndAnswers: z
|
|
328
|
+
.object({
|
|
329
|
+
answer: z.string().nullable().optional(),
|
|
330
|
+
question: z.string(),
|
|
331
|
+
questionUuid: z.string().nullable(),
|
|
332
|
+
})
|
|
333
|
+
.array(),
|
|
334
|
+
result: z.discriminatedUnion("type", [
|
|
335
|
+
z.object({ type: z.literal("event_type"), value: CALENDLY_URI_SCHEMA }),
|
|
336
|
+
z.object({ type: z.literal("external_url"), value: CALENDLY_URI_SCHEMA }),
|
|
337
|
+
z.object({
|
|
338
|
+
type: z.literal("custom_message"),
|
|
339
|
+
value: z.object({ body: z.string(), headline: z.string() }),
|
|
340
|
+
}),
|
|
341
|
+
]),
|
|
342
|
+
routingForm: CALENDLY_URI_SCHEMA,
|
|
343
|
+
submitter: CALENDLY_URI_SCHEMA.nullable(),
|
|
344
|
+
submitterType: z.literal("Invitee").nullable(),
|
|
345
|
+
tracking: z.object({
|
|
346
|
+
salesforceUuid: z.string().nullable(),
|
|
347
|
+
utmCampaign: z.string().nullable(),
|
|
348
|
+
utmContent: z.string().nullable(),
|
|
349
|
+
utmMedium: z.string().nullable(),
|
|
350
|
+
utmSource: z.string().nullable(),
|
|
351
|
+
utmTerm: z.string().nullable(),
|
|
352
|
+
}),
|
|
353
|
+
updatedAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
354
|
+
uri: CALENDLY_URI_SCHEMA,
|
|
355
|
+
})
|
|
356
|
+
|
|
357
|
+
export const CALENDLY_SCHEDULING_LINK_SCHEMA = z.object({
|
|
358
|
+
bookingUrl: CALENDLY_URI_SCHEMA,
|
|
359
|
+
owner: CALENDLY_URI_SCHEMA.optional(),
|
|
360
|
+
ownerType: z.literal("EventType").optional(),
|
|
361
|
+
})
|
|
362
|
+
|
|
363
|
+
export const CALENDLY_TRIGGER_CONFIG_SCHEMA = z
|
|
364
|
+
.object({
|
|
365
|
+
groupUri: CALENDLY_URI_SCHEMA.optional(),
|
|
366
|
+
organizationUri: CALENDLY_URI_SCHEMA,
|
|
367
|
+
scope: z.enum(["group", "organization", "user"]),
|
|
368
|
+
userUri: CALENDLY_URI_SCHEMA.optional(),
|
|
369
|
+
})
|
|
370
|
+
.superRefine((value, context) => {
|
|
371
|
+
if (value.scope === "user" && !value.userUri) {
|
|
372
|
+
context.addIssue({
|
|
373
|
+
code: "custom",
|
|
374
|
+
message: "userUri is required for user scope.",
|
|
375
|
+
path: ["userUri"],
|
|
376
|
+
})
|
|
377
|
+
}
|
|
378
|
+
if (value.scope === "group" && !value.groupUri) {
|
|
379
|
+
context.addIssue({
|
|
380
|
+
code: "custom",
|
|
381
|
+
message: "groupUri is required for group scope.",
|
|
382
|
+
path: ["groupUri"],
|
|
383
|
+
})
|
|
384
|
+
}
|
|
385
|
+
})
|
|
386
|
+
|
|
387
|
+
export const CALENDLY_ORGANIZATION_TRIGGER_CONFIG_SCHEMA = z.object({
|
|
388
|
+
organizationUri: CALENDLY_URI_SCHEMA,
|
|
389
|
+
scope: z.literal("organization"),
|
|
390
|
+
})
|
|
391
|
+
|
|
392
|
+
export const CALENDLY_PROVIDER_EVENT_NAMES = [
|
|
393
|
+
"event_type.created",
|
|
394
|
+
"event_type.deleted",
|
|
395
|
+
"event_type.updated",
|
|
396
|
+
"invitee.canceled",
|
|
397
|
+
"invitee.created",
|
|
398
|
+
"invitee_no_show.created",
|
|
399
|
+
"invitee_no_show.deleted",
|
|
400
|
+
"routing_form_submission.created",
|
|
401
|
+
] as const
|
|
402
|
+
|
|
403
|
+
export const CALENDLY_PROVIDER_EVENT_NAME_SCHEMA = z.enum(
|
|
404
|
+
CALENDLY_PROVIDER_EVENT_NAMES,
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
const CALENDLY_WEBHOOK_BASE_SCHEMA = z.object({
|
|
408
|
+
createdAt: CALENDLY_DATE_TIME_SCHEMA,
|
|
409
|
+
createdBy: CALENDLY_URI_SCHEMA,
|
|
410
|
+
})
|
|
411
|
+
const CALENDLY_EVENT_TYPE_WEBHOOK_PAYLOAD_SCHEMA =
|
|
412
|
+
CALENDLY_EVENT_TYPE_SCHEMA.omit({ descriptionHtml: true })
|
|
413
|
+
const CALENDLY_INVITEE_WEBHOOK_PAYLOAD_SCHEMA = CALENDLY_INVITEE_SCHEMA.extend({
|
|
414
|
+
scheduledEvent: CALENDLY_SCHEDULED_EVENT_SCHEMA,
|
|
415
|
+
})
|
|
416
|
+
|
|
417
|
+
export const CALENDLY_WEBHOOK_EVENT_SCHEMA = z.discriminatedUnion("event", [
|
|
418
|
+
CALENDLY_WEBHOOK_BASE_SCHEMA.extend({
|
|
419
|
+
event: z.literal("invitee.created"),
|
|
420
|
+
payload: CALENDLY_INVITEE_WEBHOOK_PAYLOAD_SCHEMA,
|
|
421
|
+
}),
|
|
422
|
+
CALENDLY_WEBHOOK_BASE_SCHEMA.extend({
|
|
423
|
+
event: z.literal("invitee.canceled"),
|
|
424
|
+
payload: CALENDLY_INVITEE_WEBHOOK_PAYLOAD_SCHEMA,
|
|
425
|
+
}),
|
|
426
|
+
CALENDLY_WEBHOOK_BASE_SCHEMA.extend({
|
|
427
|
+
event: z.literal("invitee_no_show.created"),
|
|
428
|
+
payload: CALENDLY_INVITEE_WEBHOOK_PAYLOAD_SCHEMA,
|
|
429
|
+
}),
|
|
430
|
+
CALENDLY_WEBHOOK_BASE_SCHEMA.extend({
|
|
431
|
+
event: z.literal("invitee_no_show.deleted"),
|
|
432
|
+
payload: CALENDLY_INVITEE_WEBHOOK_PAYLOAD_SCHEMA,
|
|
433
|
+
}),
|
|
434
|
+
CALENDLY_WEBHOOK_BASE_SCHEMA.extend({
|
|
435
|
+
event: z.literal("event_type.created"),
|
|
436
|
+
payload: CALENDLY_EVENT_TYPE_WEBHOOK_PAYLOAD_SCHEMA,
|
|
437
|
+
}),
|
|
438
|
+
CALENDLY_WEBHOOK_BASE_SCHEMA.extend({
|
|
439
|
+
event: z.literal("event_type.deleted"),
|
|
440
|
+
payload: CALENDLY_EVENT_TYPE_WEBHOOK_PAYLOAD_SCHEMA,
|
|
441
|
+
}),
|
|
442
|
+
CALENDLY_WEBHOOK_BASE_SCHEMA.extend({
|
|
443
|
+
event: z.literal("event_type.updated"),
|
|
444
|
+
payload: CALENDLY_EVENT_TYPE_WEBHOOK_PAYLOAD_SCHEMA,
|
|
445
|
+
}),
|
|
446
|
+
CALENDLY_WEBHOOK_BASE_SCHEMA.extend({
|
|
447
|
+
event: z.literal("routing_form_submission.created"),
|
|
448
|
+
payload: CALENDLY_ROUTING_FORM_SUBMISSION_SCHEMA,
|
|
449
|
+
}),
|
|
450
|
+
])
|
package/src/google-ads/api.ts
CHANGED
|
@@ -2,6 +2,8 @@ import * as z from "zod"
|
|
|
2
2
|
|
|
3
3
|
const GOOGLE_ADS_API_ORIGIN = "https://googleads.googleapis.com"
|
|
4
4
|
const GOOGLE_ADS_API_VERSION = "v25"
|
|
5
|
+
const GOOGLE_DATA_MANAGER_API_ORIGIN = "https://datamanager.googleapis.com"
|
|
6
|
+
const GOOGLE_DATA_MANAGER_API_VERSION = "v1"
|
|
5
7
|
|
|
6
8
|
export const GOOGLE_ADS_CUSTOMER_ID_SCHEMA = z
|
|
7
9
|
.string()
|
|
@@ -19,6 +21,11 @@ export const GOOGLE_ADS_SECRET_SCHEMA = z.object({
|
|
|
19
21
|
tokenType: z.string().min(1),
|
|
20
22
|
})
|
|
21
23
|
|
|
24
|
+
export const GOOGLE_DATA_MANAGER_SECRET_SCHEMA = z.object({
|
|
25
|
+
accessToken: z.string().min(1),
|
|
26
|
+
tokenType: z.string().min(1),
|
|
27
|
+
})
|
|
28
|
+
|
|
22
29
|
const GOOGLE_ADS_FAILURE_SCHEMA = z.looseObject({
|
|
23
30
|
error: z
|
|
24
31
|
.looseObject({
|
|
@@ -36,6 +43,12 @@ export interface GoogleAdsRequestOptions<TSchema extends z.ZodType> {
|
|
|
36
43
|
responseSchema: TSchema
|
|
37
44
|
}
|
|
38
45
|
|
|
46
|
+
export interface GoogleDataManagerRequestOptions<TSchema extends z.ZodType> {
|
|
47
|
+
body?: z.input<ReturnType<typeof z.json>>
|
|
48
|
+
method?: "GET" | "POST"
|
|
49
|
+
responseSchema: TSchema
|
|
50
|
+
}
|
|
51
|
+
|
|
39
52
|
interface GoogleAdsApiErrorOptions {
|
|
40
53
|
message?: string
|
|
41
54
|
providerStatus?: string
|
|
@@ -133,6 +146,66 @@ export function getGoogleAdsApi(secret: unknown) {
|
|
|
133
146
|
}
|
|
134
147
|
}
|
|
135
148
|
|
|
149
|
+
/** Creates an authenticated Google Data Manager v1 REST client. */
|
|
150
|
+
/** @param secret - Resolved Google OAuth credentials. */
|
|
151
|
+
export function getGoogleDataManagerApi(secret: unknown) {
|
|
152
|
+
const credentials = GOOGLE_DATA_MANAGER_SECRET_SCHEMA.parse(secret)
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
async request<TSchema extends z.ZodType>(
|
|
156
|
+
path: string,
|
|
157
|
+
options: GoogleDataManagerRequestOptions<TSchema>,
|
|
158
|
+
): Promise<z.output<TSchema>> {
|
|
159
|
+
const normalizedPath = path.replace(/^\/+/, "")
|
|
160
|
+
if (
|
|
161
|
+
!normalizedPath ||
|
|
162
|
+
normalizedPath.includes("://") ||
|
|
163
|
+
normalizedPath.includes("\\")
|
|
164
|
+
) {
|
|
165
|
+
throw new TypeError("Google Data Manager API paths must be relative.")
|
|
166
|
+
}
|
|
167
|
+
const url = new URL(
|
|
168
|
+
`${GOOGLE_DATA_MANAGER_API_VERSION}/${normalizedPath}`,
|
|
169
|
+
`${GOOGLE_DATA_MANAGER_API_ORIGIN}/`,
|
|
170
|
+
)
|
|
171
|
+
if (url.origin !== GOOGLE_DATA_MANAGER_API_ORIGIN) {
|
|
172
|
+
throw new TypeError(
|
|
173
|
+
"Google Data Manager API paths must remain on datamanager.googleapis.com.",
|
|
174
|
+
)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const headers = new Headers({
|
|
178
|
+
Accept: "application/json",
|
|
179
|
+
Authorization: `Bearer ${credentials.accessToken}`,
|
|
180
|
+
})
|
|
181
|
+
if (options.body !== undefined) {
|
|
182
|
+
headers.set("Content-Type", "application/json")
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const response = await fetch(url, {
|
|
186
|
+
body:
|
|
187
|
+
options.body === undefined ? undefined : JSON.stringify(options.body),
|
|
188
|
+
headers,
|
|
189
|
+
method: options.method ?? (options.body === undefined ? "GET" : "POST"),
|
|
190
|
+
})
|
|
191
|
+
const payload = parseGoogleAdsJson(await response.text())
|
|
192
|
+
if (!response.ok) {
|
|
193
|
+
const failure = GOOGLE_ADS_FAILURE_SCHEMA.safeParse(payload)
|
|
194
|
+
throw new GoogleAdsApiError({
|
|
195
|
+
message: failure.success ? failure.data.error?.message : undefined,
|
|
196
|
+
providerStatus: failure.success
|
|
197
|
+
? failure.data.error?.status
|
|
198
|
+
: undefined,
|
|
199
|
+
requestId: response.headers.get("request-id") ?? undefined,
|
|
200
|
+
retryAfter: response.headers.get("retry-after") ?? undefined,
|
|
201
|
+
status: response.status,
|
|
202
|
+
})
|
|
203
|
+
}
|
|
204
|
+
return options.responseSchema.parse(payload)
|
|
205
|
+
},
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
136
209
|
/** Normalizes a Google Ads customer ID for paths and headers. */
|
|
137
210
|
/** @param value - Dashed or compact 10-digit customer ID. */
|
|
138
211
|
export function normalizeGoogleAdsCustomerId(value: string) {
|
package/src/triggers.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type { discordTriggerContracts } from "./discord"
|
|
|
10
10
|
import type { closeTriggerContracts } from "./close"
|
|
11
11
|
import type { cloudflareTriggerContracts } from "./cloudflare"
|
|
12
12
|
import type { clickUpTriggerContracts } from "./clickup"
|
|
13
|
+
import type { calendlyTriggerContracts } from "./calendly"
|
|
13
14
|
import type { githubTriggerContracts } from "./github"
|
|
14
15
|
import type { gmailTriggerContracts } from "./gmail"
|
|
15
16
|
import type { googleCalendarTriggerContracts } from "./google-calendar"
|
|
@@ -46,6 +47,7 @@ export type TriggerContractMap = typeof airtableTriggerContracts &
|
|
|
46
47
|
typeof discordTriggerContracts &
|
|
47
48
|
typeof closeTriggerContracts &
|
|
48
49
|
typeof clickUpTriggerContracts &
|
|
50
|
+
typeof calendlyTriggerContracts &
|
|
49
51
|
typeof cloudflareTriggerContracts &
|
|
50
52
|
typeof githubTriggerContracts &
|
|
51
53
|
typeof gmailTriggerContracts &
|