@automate.ax/catalog 0.120.0 → 0.122.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.
@@ -8,6 +8,7 @@ import { cloudflareTriggerDefinitions } from "./cloudflare.js";
8
8
  import { coreTriggerDefinitions } from "./core.js";
9
9
  import { githubTriggerDefinitions } from "./github.js";
10
10
  import { googleTriggerDefinitions } from "./google.js";
11
+ import { hubspotTriggerDefinitions } from "./hubspot.js";
11
12
  import { linearTriggerDefinitions } from "./linear.js";
12
13
  import { millionVerifierTriggerDefinitions } from "./millionverifier.js";
13
14
  import { microsoftTriggerDefinitions } from "./microsoft.js";
@@ -34,6 +35,7 @@ export const triggerDefinitions = {
34
35
  ...coreTriggerDefinitions,
35
36
  ...githubTriggerDefinitions,
36
37
  ...googleTriggerDefinitions,
38
+ ...hubspotTriggerDefinitions,
37
39
  ...linearTriggerDefinitions,
38
40
  ...millionVerifierTriggerDefinitions,
39
41
  ...microsoftTriggerDefinitions,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automate.ax/catalog",
3
- "version": "0.120.0",
3
+ "version": "0.122.0",
4
4
  "description": "Shared integration service and trigger definitions for Automate.ax.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -34,6 +34,7 @@
34
34
  "./triggers/core-schedule": "./src/triggers/core-schedule.ts",
35
35
  "./triggers/github": "./src/triggers/github.ts",
36
36
  "./triggers/google": "./src/triggers/google.ts",
37
+ "./triggers/hubspot": "./src/triggers/hubspot.ts",
37
38
  "./triggers/linear": "./src/triggers/linear.ts",
38
39
  "./triggers/millionverifier": "./src/triggers/millionverifier.ts",
39
40
  "./triggers/microsoft": "./src/triggers/microsoft.ts",
@@ -63,7 +64,7 @@
63
64
  "zshy": "^0.7.2"
64
65
  },
65
66
  "scripts": {
66
- "typecheck": "tsc --noEmit",
67
+ "typecheck": "resource-broker run --pool automate-ax-validation --limit 2 --weight 1 -- tsc --noEmit",
67
68
  "lint": "oxlint --type-aware --threads=2 && bun --bun eslint . --cache --cache-strategy content",
68
69
  "lint:fix": "oxlint --type-aware --threads=2 --fix --fix-suggestions && bun --bun eslint . --fix --cache --cache-strategy content",
69
70
  "check": "bun run typecheck && bun run lint",
@@ -164,6 +165,11 @@
164
165
  "types": "./dist/triggers/google.d.ts",
165
166
  "default": "./dist/triggers/google.js"
166
167
  },
168
+ "./triggers/hubspot": {
169
+ "bun": "./src/triggers/hubspot.ts",
170
+ "types": "./dist/triggers/hubspot.d.ts",
171
+ "default": "./dist/triggers/hubspot.js"
172
+ },
167
173
  "./triggers/linear": {
168
174
  "bun": "./src/triggers/linear.ts",
169
175
  "types": "./dist/triggers/linear.d.ts",
package/src/catalog.ts CHANGED
@@ -320,6 +320,32 @@ export const huggingfaceService = defineIntegrationService({
320
320
  name: "Hugging Face",
321
321
  })
322
322
 
323
+ export const hubspotService = defineIntegrationService({
324
+ connectionMethods: [
325
+ { id: "oauth", name: "OAuth", type: "redirect" },
326
+ {
327
+ credentialUrl: "https://app.hubspot.com/private-apps/",
328
+ fields: [
329
+ {
330
+ input: "password",
331
+ label: "Private app access token",
332
+ name: "accessToken",
333
+ placeholder: "pat-...",
334
+ required: true,
335
+ },
336
+ ],
337
+ id: "private-app",
338
+ name: "Private app access token",
339
+ type: "form",
340
+ },
341
+ ],
342
+ description:
343
+ "Connect a HubSpot CRM account with OAuth or a private app token.",
344
+ id: "hubspot",
345
+ name: "HubSpot",
346
+ preferredConnectionMethodId: "oauth",
347
+ })
348
+
323
349
  export const linearService = defineIntegrationService({
324
350
  connectionMethods: [
325
351
  { id: "oauth", name: "OAuth", type: "redirect" },
@@ -671,6 +697,7 @@ export const integrationCatalog = defineIntegrationCatalog([
671
697
  googleGenaiService,
672
698
  groqService,
673
699
  huggingfaceService,
700
+ hubspotService,
674
701
  jobNimbusService,
675
702
  linearService,
676
703
  microsoftService,
package/src/index.ts CHANGED
@@ -22,6 +22,7 @@ export {
22
22
  googleService,
23
23
  groqService,
24
24
  huggingfaceService,
25
+ hubspotService,
25
26
  integrationCatalog,
26
27
  jobNimbusService,
27
28
  linearService,
@@ -125,6 +125,43 @@ const GOOGLE_MEET_ACCOUNT = {
125
125
  serviceId: "google",
126
126
  } as const satisfies IntegrationAccountRequirement
127
127
 
128
+ const GOOGLE_DRIVE_FILE_EVENT_ACCOUNT = {
129
+ connectionOptions: [
130
+ {
131
+ requiredScopes: [
132
+ {
133
+ requirements: [
134
+ "https://www.googleapis.com/auth/drive",
135
+ "https://www.googleapis.com/auth/drive.readonly",
136
+ "https://www.googleapis.com/auth/drive.metadata",
137
+ ],
138
+ type: "or",
139
+ },
140
+ ],
141
+ },
142
+ ],
143
+ serviceId: "google",
144
+ } as const satisfies IntegrationAccountRequirement
145
+
146
+ const GOOGLE_DRIVE_METADATA_EVENT_ACCOUNT = {
147
+ connectionOptions: [
148
+ {
149
+ requiredScopes: [
150
+ {
151
+ requirements: [
152
+ "https://www.googleapis.com/auth/drive",
153
+ "https://www.googleapis.com/auth/drive.readonly",
154
+ "https://www.googleapis.com/auth/drive.metadata",
155
+ "https://www.googleapis.com/auth/drive.metadata.readonly",
156
+ ],
157
+ type: "or",
158
+ },
159
+ ],
160
+ },
161
+ ],
162
+ serviceId: "google",
163
+ } as const satisfies IntegrationAccountRequirement
164
+
128
165
  const GOOGLE_SHEETS_ACCOUNT = {
129
166
  connectionOptions: [
130
167
  {
@@ -220,6 +257,113 @@ export const googleTriggerDefinitions = {
220
257
  name: "Google Form response submitted",
221
258
  type: "googleForms.response.submitted",
222
259
  },
260
+ googleDriveEvent: {
261
+ account: GOOGLE_DRIVE_FILE_EVENT_ACCOUNT,
262
+ icon: "google-drive",
263
+ name: "Google Drive event",
264
+ type: "googleDrive.event",
265
+ },
266
+ googleDriveAccessProposalCreated: driveTrigger(
267
+ "Access proposal created",
268
+ "googleDrive.accessProposal.created",
269
+ ),
270
+ googleDriveAccessProposalResolved: driveTrigger(
271
+ "Access proposal resolved",
272
+ "googleDrive.accessProposal.resolved",
273
+ ),
274
+ googleDriveApprovalCancelled: driveTrigger(
275
+ "Approval cancelled",
276
+ "googleDrive.approval.cancelled",
277
+ ),
278
+ googleDriveApprovalCompleted: driveTrigger(
279
+ "Approval completed",
280
+ "googleDrive.approval.completed",
281
+ ),
282
+ googleDriveApprovalCreated: driveTrigger(
283
+ "Approval created",
284
+ "googleDrive.approval.created",
285
+ ),
286
+ googleDriveApprovalReset: driveTrigger(
287
+ "Approval reset",
288
+ "googleDrive.approval.reset",
289
+ ),
290
+ googleDriveApprovalResponded: driveTrigger(
291
+ "Approval reviewer responded",
292
+ "googleDrive.approval.responded",
293
+ ),
294
+ googleDriveApprovalReviewersChanged: driveTrigger(
295
+ "Approval reviewers changed",
296
+ "googleDrive.approval.reviewersChanged",
297
+ ),
298
+ googleDriveCommentCreated: driveTrigger(
299
+ "Comment created",
300
+ "googleDrive.comment.created",
301
+ ),
302
+ googleDriveCommentDeleted: driveTrigger(
303
+ "Comment deleted",
304
+ "googleDrive.comment.deleted",
305
+ ),
306
+ googleDriveCommentEdited: driveTrigger(
307
+ "Comment edited",
308
+ "googleDrive.comment.edited",
309
+ ),
310
+ googleDriveCommentReopened: driveTrigger(
311
+ "Comment reopened",
312
+ "googleDrive.comment.reopened",
313
+ ),
314
+ googleDriveCommentResolved: driveTrigger(
315
+ "Comment resolved",
316
+ "googleDrive.comment.resolved",
317
+ ),
318
+ googleDriveFileContentChanged: driveTrigger(
319
+ "File content changed",
320
+ "googleDrive.file.contentChanged",
321
+ ),
322
+ googleDriveFileCreated: driveTrigger(
323
+ "File created",
324
+ "googleDrive.file.created",
325
+ ),
326
+ googleDriveFileDeleted: driveTrigger(
327
+ "File deleted",
328
+ "googleDrive.file.deleted",
329
+ ),
330
+ googleDriveFileMoved: driveTrigger("File moved", "googleDrive.file.moved"),
331
+ googleDriveFileRenamed: driveTrigger(
332
+ "File renamed",
333
+ "googleDrive.file.renamed",
334
+ ),
335
+ googleDriveFileTrashed: driveTrigger(
336
+ "File trashed",
337
+ "googleDrive.file.trashed",
338
+ ),
339
+ googleDriveFileUntrashed: driveTrigger(
340
+ "File untrashed",
341
+ "googleDrive.file.untrashed",
342
+ ),
343
+ googleDrivePermissionCreated: driveTrigger(
344
+ "Permission created",
345
+ "googleDrive.permission.created",
346
+ ),
347
+ googleDrivePermissionDeleted: driveTrigger(
348
+ "Permission deleted",
349
+ "googleDrive.permission.deleted",
350
+ ),
351
+ googleDrivePermissionEdited: driveTrigger(
352
+ "Permission edited",
353
+ "googleDrive.permission.edited",
354
+ ),
355
+ googleDriveReplyCreated: driveTrigger(
356
+ "Reply created",
357
+ "googleDrive.reply.created",
358
+ ),
359
+ googleDriveReplyDeleted: driveTrigger(
360
+ "Reply deleted",
361
+ "googleDrive.reply.deleted",
362
+ ),
363
+ googleDriveReplyEdited: driveTrigger(
364
+ "Reply edited",
365
+ "googleDrive.reply.edited",
366
+ ),
223
367
  googleMeetConferenceEnded: {
224
368
  account: GOOGLE_MEET_ACCOUNT,
225
369
  icon: "google-meet",
@@ -305,3 +449,20 @@ export const googleTriggerDefinitions = {
305
449
  type: "googleSheets.cells.changed",
306
450
  },
307
451
  } as const satisfies Record<string, TriggerDefinition>
452
+
453
+ /**
454
+ * Defines one Google Drive trigger with its exact stable event type.
455
+ *
456
+ * @param name - Customer-facing event name without the provider prefix.
457
+ * @param type - Stable internal event type.
458
+ */
459
+ function driveTrigger<const TType extends string>(name: string, type: TType) {
460
+ return {
461
+ account: type.startsWith("googleDrive.file.")
462
+ ? GOOGLE_DRIVE_FILE_EVENT_ACCOUNT
463
+ : GOOGLE_DRIVE_METADATA_EVENT_ACCOUNT,
464
+ icon: "google-drive",
465
+ name: `Google Drive ${name.toLowerCase()}`,
466
+ type,
467
+ }
468
+ }
@@ -0,0 +1,114 @@
1
+ import type { IntegrationAccountRequirement, TriggerDefinition } from "../types"
2
+
3
+ const CONTACT = hubspotAccount("crm.objects.contacts.read")
4
+ const COMPANY = hubspotAccount("crm.objects.companies.read")
5
+ const DEAL = hubspotAccount("crm.objects.deals.read")
6
+ const TICKET = hubspotAccount("tickets")
7
+
8
+ export const hubspotTriggerDefinitions = {
9
+ hubspotCrmEvent: definition(
10
+ "hubspot.crm.event",
11
+ hubspotAccount([
12
+ "crm.objects.companies.read",
13
+ "crm.objects.contacts.read",
14
+ "crm.objects.deals.read",
15
+ "tickets",
16
+ ]),
17
+ ),
18
+ hubspotCompanyAssociationAdded: definition(
19
+ "hubspot.company.associationAdded",
20
+ COMPANY,
21
+ ),
22
+ hubspotCompanyAssociationRemoved: definition(
23
+ "hubspot.company.associationRemoved",
24
+ COMPANY,
25
+ ),
26
+ hubspotCompanyCreated: definition("hubspot.company.created", COMPANY),
27
+ hubspotCompanyDeleted: definition("hubspot.company.deleted", COMPANY),
28
+ hubspotCompanyMerged: definition("hubspot.company.merged", COMPANY),
29
+ hubspotCompanyPropertyChanged: definition(
30
+ "hubspot.company.propertyChanged",
31
+ COMPANY,
32
+ ),
33
+ hubspotCompanyRestored: definition("hubspot.company.restored", COMPANY),
34
+ hubspotContactAssociationAdded: definition(
35
+ "hubspot.contact.associationAdded",
36
+ CONTACT,
37
+ ),
38
+ hubspotContactAssociationRemoved: definition(
39
+ "hubspot.contact.associationRemoved",
40
+ CONTACT,
41
+ ),
42
+ hubspotContactCreated: definition("hubspot.contact.created", CONTACT),
43
+ hubspotContactDeleted: definition("hubspot.contact.deleted", CONTACT),
44
+ hubspotContactMerged: definition("hubspot.contact.merged", CONTACT),
45
+ hubspotContactPropertyChanged: definition(
46
+ "hubspot.contact.propertyChanged",
47
+ CONTACT,
48
+ ),
49
+ hubspotContactRestored: definition("hubspot.contact.restored", CONTACT),
50
+ hubspotDealAssociationAdded: definition(
51
+ "hubspot.deal.associationAdded",
52
+ DEAL,
53
+ ),
54
+ hubspotDealAssociationRemoved: definition(
55
+ "hubspot.deal.associationRemoved",
56
+ DEAL,
57
+ ),
58
+ hubspotDealCreated: definition("hubspot.deal.created", DEAL),
59
+ hubspotDealDeleted: definition("hubspot.deal.deleted", DEAL),
60
+ hubspotDealMerged: definition("hubspot.deal.merged", DEAL),
61
+ hubspotDealPropertyChanged: definition("hubspot.deal.propertyChanged", DEAL),
62
+ hubspotDealRestored: definition("hubspot.deal.restored", DEAL),
63
+ hubspotTicketAssociationAdded: definition(
64
+ "hubspot.ticket.associationAdded",
65
+ TICKET,
66
+ ),
67
+ hubspotTicketAssociationRemoved: definition(
68
+ "hubspot.ticket.associationRemoved",
69
+ TICKET,
70
+ ),
71
+ hubspotTicketCreated: definition("hubspot.ticket.created", TICKET),
72
+ hubspotTicketDeleted: definition("hubspot.ticket.deleted", TICKET),
73
+ hubspotTicketMerged: definition("hubspot.ticket.merged", TICKET),
74
+ hubspotTicketPropertyChanged: definition(
75
+ "hubspot.ticket.propertyChanged",
76
+ TICKET,
77
+ ),
78
+ hubspotTicketRestored: definition("hubspot.ticket.restored", TICKET),
79
+ } as const satisfies Record<string, TriggerDefinition>
80
+
81
+ /**
82
+ * Builds one typed HubSpot trigger definition.
83
+ *
84
+ * @param type - Public event type.
85
+ * @param account - Required HubSpot account contract.
86
+ */
87
+ function definition<const TType extends string>(
88
+ type: TType,
89
+ account: IntegrationAccountRequirement<"hubspot">,
90
+ ) {
91
+ return { account, type }
92
+ }
93
+
94
+ /**
95
+ * Builds an OAuth-only HubSpot trigger account requirement.
96
+ *
97
+ * @param requiredScopes - Required OAuth scopes.
98
+ */
99
+ function hubspotAccount(
100
+ requiredScopes: string | readonly string[],
101
+ ): IntegrationAccountRequirement<"hubspot"> {
102
+ return {
103
+ connectionOptions: [
104
+ {
105
+ connectionMethodId: "oauth",
106
+ requiredScopes:
107
+ typeof requiredScopes === "string"
108
+ ? [requiredScopes]
109
+ : requiredScopes,
110
+ },
111
+ ],
112
+ serviceId: "hubspot",
113
+ }
114
+ }
@@ -8,6 +8,7 @@ import { cloudflareTriggerDefinitions } from "./cloudflare"
8
8
  import { coreTriggerDefinitions } from "./core"
9
9
  import { githubTriggerDefinitions } from "./github"
10
10
  import { googleTriggerDefinitions } from "./google"
11
+ import { hubspotTriggerDefinitions } from "./hubspot"
11
12
  import { linearTriggerDefinitions } from "./linear"
12
13
  import { millionVerifierTriggerDefinitions } from "./millionverifier"
13
14
  import { microsoftTriggerDefinitions } from "./microsoft"
@@ -58,6 +59,7 @@ export const triggerDefinitions = {
58
59
  ...coreTriggerDefinitions,
59
60
  ...githubTriggerDefinitions,
60
61
  ...googleTriggerDefinitions,
62
+ ...hubspotTriggerDefinitions,
61
63
  ...linearTriggerDefinitions,
62
64
  ...millionVerifierTriggerDefinitions,
63
65
  ...microsoftTriggerDefinitions,