diff --git a/packages/sdk/package-lock.json b/packages/sdk/package-lock.json index 889b28c06..5b83a7bb5 100644 --- a/packages/sdk/package-lock.json +++ b/packages/sdk/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.30.0", - "@relayfile/adapter-core": "0.5.25", + "@relayfile/adapter-core": "0.5.26", "@relayfile/relay-helpers": "0.4.11", "@relayflows/surface": "2.0.16", "@types/js-yaml": "^4.0.9", @@ -511,9 +511,9 @@ } }, "node_modules/@relayfile/adapter-core": { - "version": "0.5.25", - "resolved": "https://registry.npmjs.org/@relayfile/adapter-core/-/adapter-core-0.5.25.tgz", - "integrity": "sha512-vmXlZAuHujhrNmd9sTeFn4PA1YqqUEjiHd1ZaTLW9JK5MiVov/dHWPunjvKX3Aih3/9MFS61kL6EGVnxd2pNZg==", + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/@relayfile/adapter-core/-/adapter-core-0.5.26.tgz", + "integrity": "sha512-PhRVYb2FxZ0rTqqmq0WMBDVlTb/gr63V2TFKCyNCiMZY7pTEPVYGmx0gzTVSALiPqCtKG6xlekpn64fmOjjagQ==", "license": "Apache-2.0", "dependencies": { "@scalar/postman-to-openapi": "^0.6.0", diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 3174e2f62..8fec4676e 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -43,7 +43,7 @@ "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.30.0", - "@relayfile/adapter-core": "0.5.25", + "@relayfile/adapter-core": "0.5.26", "@relayfile/relay-helpers": "0.4.11", "@relayflows/surface": "2.0.16", "@types/js-yaml": "^4.0.9", diff --git a/packages/sdk/tests/generate-triggers.test.ts b/packages/sdk/tests/generate-triggers.test.ts index 4fb98e4a9..d24248482 100644 --- a/packages/sdk/tests/generate-triggers.test.ts +++ b/packages/sdk/tests/generate-triggers.test.ts @@ -23,7 +23,7 @@ function mapping(root: string, path: string, value: unknown): void { } it('reproduces all checked-in modules from the pinned adapter mappings', () => { - expect(generate('--check')).toContain('Checked 2 provider trigger modules'); + expect(generate('--check')).toMatch(/Checked \d{2,} provider trigger modules/); }); it('discovers new adapters, preserves exact event names, and prefers adapter-local mappings', () => { @@ -34,7 +34,7 @@ it('discovers new adapters, preserves exact event names, and prefers adapter-loc mapping(root, 'new-provider', { provider: 'new-provider', webhooks: { 'file.created': {}, 'file.deleted': {} } }); mapping(root, 'no-events', { provider: 'no-events', webhooks: {} }); generate('--adapters-dir', root, '--out-dir', out); - expect(readdirSync(out).sort()).toEqual(['github.ts', 'index.ts', 'new-provider.ts']); + expect(readdirSync(out).sort()).toEqual(['PROVIDERS.md', 'github.ts', 'index.ts', 'new-provider.ts']); expect(readFileSync(join(out, 'github.ts'), 'utf8')).toContain('pull_request(action?: string)'); expect(readFileSync(join(out, 'github.ts'), 'utf8')).not.toContain('stale'); const provider = readFileSync(join(out, 'new-provider.ts'), 'utf8'); @@ -60,3 +60,76 @@ it('fails closed on malformed mappings and colliding method names before writing expect(readdirSync(root)).toEqual(['packages']); } }); + +function catalog(root: string, value: unknown): void { + const target = join(root, 'packages', 'core', 'src', 'triggers'); + mkdirSync(target, { recursive: true }); + writeFileSync(join(target, 'catalog.generated.json'), JSON.stringify(value)); +} + +it('unions catalog events into every provider with the plain signature and never overrides a mapping-declared one', () => { + const root = temporary(); + const out = join(root, 'generated'); + mapping(root, 'github', { adapter: { name: 'github' }, webhooks: { pull_request: { extract: ['action'] } } }); + catalog(root, { + github: ['pull_request', 'pull_request.opened'], // union: mapping keeps its signature, the rest is added plain + linear: ['issue.created', 'issue.updated'], + 'google-drive': ['file.created'], + empty: [], + }); + generate('--adapters-dir', root, '--out-dir', out); + expect(readdirSync(out).sort()).toEqual(['PROVIDERS.md', 'github.ts', 'google-drive.ts', 'index.ts', 'linear.ts']); + const github = readFileSync(join(out, 'github.ts'), 'utf8'); + expect(github).toContain('pull_request(action?: string)'); + expect(github).toContain('pull_request_opened(filter?: WebhookFilter)'); + const linear = readFileSync(join(out, 'linear.ts'), 'utf8'); + expect(linear).toContain('export const linear'); + expect(linear).toContain('issue_created(filter?: WebhookFilter)'); + expect(linear).toContain('providerTrigger("linear", "issue.created", filter)'); + expect(readFileSync(join(out, 'google-drive.ts'), 'utf8')).toContain('export const google_drive'); + const index = readFileSync(join(out, 'index.ts'), 'utf8'); + expect(index).toContain('"linear": Object.freeze(["issue.created","issue.updated"] as const)'); + expect(index).toContain('"github": Object.freeze(["pull_request","pull_request.opened"] as const)'); + const providers = readFileSync(join(out, 'PROVIDERS.md'), 'utf8'); + expect(providers).toContain('| `github` | `github` | 2 | mapping |'); + expect(providers).toContain('| `linear` | `linear` | 2 | catalog |'); + generate('--adapters-dir', root, '--out-dir', out, '--check'); + writeFileSync(join(out, 'PROVIDERS.md'), 'stale'); + expect(() => generate('--adapters-dir', root, '--out-dir', out, '--check')).toThrow(/drifted/); +}); + +it('refuses a provider whose namespace would shadow a surface export', () => { + const root = temporary(); + catalog(root, { webhook: ['fired'] }); + expect(() => generate('--adapters-dir', root, '--out-dir', join(root, 'out'))).toThrow(/collision/); + const other = temporary(); + catalog(other, { schedule: ['due'] }); + expect(() => generate('--adapters-dir', other, '--out-dir', join(other, 'out'))).toThrow(/collision/); +}); + +it('lets a mapping-declared event own a colliding identifier and keeps the other in the registry', () => { + const root = temporary(); + const out = join(root, 'generated'); + mapping(root, 'chat', { provider: 'chat', webhooks: { reaction_added: {} } }); + catalog(root, { chat: ['reaction.added', 'reaction_added', 'reaction.removed'] }); + generate('--adapters-dir', root, '--out-dir', out); + const chat = readFileSync(join(out, 'chat.ts'), 'utf8'); + expect(chat).toContain('providerTrigger("chat", "reaction_added", filter)'); + expect(chat).not.toContain('"reaction.added"'); + expect(chat).toContain('providerTrigger("chat", "reaction.removed", filter)'); + expect(readFileSync(join(out, 'index.ts'), 'utf8')).toContain('"chat": Object.freeze(["reaction.added","reaction.removed","reaction_added"] as const)'); + expect(readFileSync(join(out, 'PROVIDERS.md'), 'utf8')).toContain('| `chat` | `chat` | 3 | mapping | `reaction.added` |'); +}); + +it('gives action-qualified events a plain filter even when the mapping extracts action', () => { + const root = temporary(); + const out = join(root, 'generated'); + mapping(root, 'github', { adapter: { name: 'github' }, webhooks: { + pull_request: { extract: ['action'] }, 'pull_request.edited': { extract: ['action', 'number'] }, + } }); + generate('--adapters-dir', root, '--out-dir', out); + const github = readFileSync(join(out, 'github.ts'), 'utf8'); + expect(github).toContain('pull_request(action?: string)'); + expect(github).toContain('pull_request_edited(filter?: WebhookFilter)'); + expect(github).not.toContain('pull_request_edited(action'); +}); diff --git a/packages/sdk/tests/provider-trigger-contract.test.ts b/packages/sdk/tests/provider-trigger-contract.test.ts index d92a2833a..e6c9f0151 100644 --- a/packages/sdk/tests/provider-trigger-contract.test.ts +++ b/packages/sdk/tests/provider-trigger-contract.test.ts @@ -2,7 +2,7 @@ import { afterEach, describe, expect, it } from 'vitest'; import { mkdtemp, rm, symlink, writeFile } from 'node:fs/promises'; import { join, resolve } from 'node:path'; import { tmpdir } from 'node:os'; -import { github, slack, webhook } from '@relayflows/surface'; +import { github, gitlab, linear, notion, slack, webhook } from '@relayflows/surface'; import { preflightProviderTriggers, providerDeclaration } from '../src/provider-trigger-contract.js'; import { providerInboxEvent } from '../src/trigger-executor.js'; import { preflightWebhookTriggers } from '../src/preflight.js'; @@ -85,6 +85,36 @@ describe('provider trigger contract', () => { expect(preflightProviderTriggers([slack.mention('C123')])).toEqual([]); }); + it('accepts one subscription from each of five providers and refuses a bogus event on any of them', async () => { + expect(preflightProviderTriggers([ + github.pull_request('opened'), slack.mention('C123'), + linear[Object.keys(linear)[0] as keyof typeof linear]!(), + notion[Object.keys(notion)[0] as keyof typeof notion]!(), + gitlab[Object.keys(gitlab)[0] as keyof typeof gitlab]!(), + ])).toEqual([]); + for (const provider of ['linear', 'notion', 'gitlab', 'cloudflare', 'ramp']) { + const [refusal] = preflightProviderTriggers([webhook(provider, { provider, type: 'no.such.event' })]); + expect(refusal, provider).toMatchObject({ severity: 'refusal' }); + expect(refusal!.message).toContain('does not publish'); + } + const dir = await temporary(); + await symlink(resolve('node_modules'), join(dir, 'node_modules'), 'dir'); + await writeFile(join(dir, 'package.json'), '{"type":"module"}'); + await writeFile(join(dir, 'flows.json'), '{"executors":["github","slack","linear","notion","gitlab"]}'); + const path = join(dir, 'five.flow.ts'); + await writeFile(path, "import { flow, github, slack, linear, notion, gitlab } from '@relayflows/surface';\n" + + "const first = (ns: Record unknown>) => Object.values(ns)[0]!() as never;\n" + + "export default flow('five')\n" + + " .on(github.pull_request('opened'), async f => f.done('success'))\n" + + " .on(slack.mention('C123'), async f => f.done('success'))\n" + + " .on(first(linear), async f => f.done('success'))\n" + + " .on(first(notion), async f => f.done('success'))\n" + + " .on(first(gitlab), async f => f.done('success'));\n"); + const reports: string[] = []; + const io = { stdout: (line: string) => reports.push(line), stderr: (line: string) => reports.push(line) }; + expect(await runCli(['check', '--json', path], io), reports.join('\n')).toBe(0); + }); + it('fails `flows check` before deployment and passes once the event is real', async () => { const dir = await temporary(); await symlink(resolve('node_modules'), join(dir, 'node_modules'), 'dir'); diff --git a/packages/surface/src/triggers/PROVIDERS.md b/packages/surface/src/triggers/PROVIDERS.md new file mode 100644 index 000000000..25651daf9 --- /dev/null +++ b/packages/surface/src/triggers/PROVIDERS.md @@ -0,0 +1,56 @@ + +# Provider trigger namespaces + +47 providers, 570 events. `mapping` rows come from the adapter's `webhooks:` block (payload-aware signatures); `catalog` rows come from `KNOWN_TRIGGER_CATALOG` (`supportedEvents()`) only. Every provider also includes its catalog events, so the count is what ingress delivers. + +| Provider | Namespace | Events | Source | Registry-only events | +|---|---|---:|---|---| +| `airtable` | `airtable` | 9 | catalog | | +| `asana` | `asana` | 17 | catalog | | +| `azure-blob` | `azure_blob` | 3 | mapping | | +| `box` | `box` | 3 | mapping | | +| `calendly` | `calendly` | 12 | catalog | | +| `clickup` | `clickup` | 12 | catalog | | +| `cloudflare` | `cloudflare` | 8 | mapping | | +| `confluence` | `confluence` | 6 | catalog | | +| `daytona` | `daytona` | 7 | mapping | | +| `docker-hub` | `docker_hub` | 1 | catalog | | +| `dropbox` | `dropbox` | 1 | mapping | | +| `fathom` | `fathom` | 1 | mapping | | +| `gcp` | `gcp` | 9 | mapping | | +| `gcs` | `gcs` | 3 | mapping | | +| `github` | `github` | 26 | mapping | | +| `gitlab` | `gitlab` | 53 | mapping | | +| `gmail` | `gmail` | 3 | mapping | | +| `google-calendar` | `google_calendar` | 3 | catalog | | +| `google-drive` | `google_drive` | 3 | mapping | | +| `granola` | `granola` | 4 | mapping | | +| `hubspot` | `hubspot` | 20 | catalog | | +| `intercom` | `intercom` | 18 | catalog | | +| `jira` | `jira` | 12 | catalog | | +| `linear` | `linear` | 33 | catalog | | +| `mailgun` | `mailgun` | 15 | catalog | | +| `mixpanel` | `mixpanel` | 12 | catalog | | +| `neon` | `neon` | 5 | mapping | | +| `notion` | `notion` | 13 | mapping | | +| `onedrive` | `onedrive` | 3 | mapping | | +| `pipedrive` | `pipedrive` | 14 | catalog | | +| `postgres` | `postgres` | 3 | mapping | | +| `posthog` | `posthog` | 2 | mapping | | +| `ramp` | `ramp` | 47 | mapping | | +| `recall` | `recall` | 3 | mapping | | +| `redis` | `redis` | 3 | mapping | | +| `s3` | `s3` | 3 | mapping | | +| `salesforce` | `salesforce` | 22 | catalog | | +| `segment` | `segment` | 12 | catalog | | +| `sendgrid` | `sendgrid` | 17 | catalog | | +| `sharepoint` | `sharepoint` | 3 | mapping | | +| `shopify` | `shopify` | 24 | catalog | | +| `shortcut` | `shortcut` | 6 | mapping | | +| `slack` | `slack` | 21 | mapping | `reaction.added` | +| `stripe` | `stripe` | 21 | catalog | | +| `teams` | `teams` | 20 | catalog | | +| `telegram` | `telegram` | 25 | catalog | | +| `zendesk` | `zendesk` | 9 | catalog | | + +Registry-only events share an identifier with another event of the same provider; subscribe with `webhook(provider, { provider, type })`. diff --git a/packages/surface/src/triggers/README.md b/packages/surface/src/triggers/README.md index 5871a0dbf..3cc21af05 100644 --- a/packages/surface/src/triggers/README.md +++ b/packages/surface/src/triggers/README.md @@ -9,8 +9,25 @@ export default flow('triage') .on(github.pull_request('opened'), async (f, event) => { f.done('success'); }); ``` +Every provider a relayfile adapter can deliver has a namespace — 47 today, +570 events; see [PROVIDERS.md](PROVIDERS.md) (generated) for the full table. +Hyphenated providers become identifiers: `azure-blob` → `azure_blob`, +`google-drive` → `google_drive`; the inbox name and event type keep the +upstream spelling, so `azure_blob.file_created()` lowers to +`{ provider: 'azure-blob', type: 'file.created' }`. Namespaces come from two +sources: an adapter's `webhooks:` mapping block, which carries payload shape +(`github.pull_request(action?)` takes an action because the mapping extracts +one), and the trigger catalog (`@relayfile/adapter-core/triggers`, every adapter's +`supportedEvents()`), which is the full set an adapter delivers and yields the +plain `(filter?)` signature. The two are unioned per provider: a mapping +covers payload shape for some events, never the whole set (gitlab maps 8 of +53). Where two upstream names share an identifier (`reaction.added` and +`reaction_added`), the mapping-declared one owns the method and the other +stays subscribable via `webhook(provider, { provider, type })`; PROVIDERS.md +lists them. + Provider namespaces also export from `@relayflows/surface/triggers` and -`@relayflows/surface/triggers/slack` (or `/github`). Declarations are immutable +`@relayflows/surface/triggers/slack` (or `/github`, `/notion`, …). Declarations are immutable webhook sources: their executor/inbox name is the provider, and their filter matches the provider, event type, and requested payload fields. Register those provider names in `flows.json`'s `executors` array for preflight. @@ -32,7 +49,14 @@ filter names that same provider, and the filter pins an event type. `slack.reaction(emoji)` subscribes to `reaction_added`. Arguments match provider values exactly: use the channel ID and reaction name from the incoming event. `github.pull_request(action)` filters `payload.action`; omitting the action -accepts every pull request event. Upstream mappings do not declare action enums, +accepts every pull request event. GitHub (and some other providers) appear in +two spellings because two ingresses deliver them: the aggregate event with the +action in the payload (`pull_request` + `payload.action`) is what a raw GitHub +delivery and this package's `POST /providers/github` receiver carry, while the +action-qualified name (`pull_request.opened`) is what relayfile's Cloud +ingress normalizes to and what the adapter catalog lists. Subscribe in the +spelling of the ingress that will deliver to you; action-qualified methods +take only a payload filter, never a second action. Upstream mappings do not declare action enums, so the action parameter is a string. `github.check_run(action)` (a CI check finished: `completed`, with `check_run.conclusion` in the payload) and `github.issue_comment(action)` (a comment on an issue or pull-request @@ -122,8 +146,10 @@ Schedules need no `flows.json` executor entry: the tick source ships with the CLI. Generation requires the SDK's development dependencies. The default input is -the mapping YAML shipped in the pinned `@relayfile/adapter-core` dependency -(currently Slack and GitHub). A checkout supplies additional providers: +the pinned `@relayfile/adapter-core` dependency: its `mappings/` fallbacks, +its `mappings/adapters/` bundle (every adapter's own mapping, adapter-core +≥ 0.5.26), and its trigger catalog. A checkout supplies the same three from +source: ```sh node scripts/generate-triggers.mjs @@ -132,6 +158,7 @@ node scripts/generate-triggers.mjs --adapters-dir /path/to/relayfile-adapters ``` The generator reads `packages/core/mappings/*.mapping.yaml`, then each adapter's -`packages//*.mapping.yaml`; adapter-local mappings take precedence. -Only adapters with a nonempty `webhooks:` section produce modules. It never +`packages//*.mapping.yaml` (adapter-local mappings take precedence), +then `packages/core/src/triggers/catalog.generated.json` for providers with no +`webhooks:` block. Only providers with at least one event produce modules. It never imports or executes adapter code. Rebuild the surface and SDK after regeneration. diff --git a/packages/surface/src/triggers/airtable.ts b/packages/surface/src/triggers/airtable.ts new file mode 100644 index 000000000..866e7022e --- /dev/null +++ b/packages/surface/src/triggers/airtable.ts @@ -0,0 +1,34 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const airtable = Object.freeze({ + base_create(filter?: WebhookFilter) { + return providerTrigger("airtable", "base.create", filter); + }, + base_delete(filter?: WebhookFilter) { + return providerTrigger("airtable", "base.delete", filter); + }, + base_update(filter?: WebhookFilter) { + return providerTrigger("airtable", "base.update", filter); + }, + record_create(filter?: WebhookFilter) { + return providerTrigger("airtable", "record.create", filter); + }, + record_delete(filter?: WebhookFilter) { + return providerTrigger("airtable", "record.delete", filter); + }, + record_update(filter?: WebhookFilter) { + return providerTrigger("airtable", "record.update", filter); + }, + table_create(filter?: WebhookFilter) { + return providerTrigger("airtable", "table.create", filter); + }, + table_delete(filter?: WebhookFilter) { + return providerTrigger("airtable", "table.delete", filter); + }, + table_update(filter?: WebhookFilter) { + return providerTrigger("airtable", "table.update", filter); + }, +}); diff --git a/packages/surface/src/triggers/asana.ts b/packages/surface/src/triggers/asana.ts new file mode 100644 index 000000000..5decdbed2 --- /dev/null +++ b/packages/surface/src/triggers/asana.ts @@ -0,0 +1,58 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const asana = Object.freeze({ + project_added(filter?: WebhookFilter) { + return providerTrigger("asana", "project.added", filter); + }, + project_changed(filter?: WebhookFilter) { + return providerTrigger("asana", "project.changed", filter); + }, + project_deleted(filter?: WebhookFilter) { + return providerTrigger("asana", "project.deleted", filter); + }, + project_removed(filter?: WebhookFilter) { + return providerTrigger("asana", "project.removed", filter); + }, + section_added(filter?: WebhookFilter) { + return providerTrigger("asana", "section.added", filter); + }, + section_changed(filter?: WebhookFilter) { + return providerTrigger("asana", "section.changed", filter); + }, + section_deleted(filter?: WebhookFilter) { + return providerTrigger("asana", "section.deleted", filter); + }, + section_removed(filter?: WebhookFilter) { + return providerTrigger("asana", "section.removed", filter); + }, + task_added(filter?: WebhookFilter) { + return providerTrigger("asana", "task.added", filter); + }, + task_changed(filter?: WebhookFilter) { + return providerTrigger("asana", "task.changed", filter); + }, + task_completed(filter?: WebhookFilter) { + return providerTrigger("asana", "task.completed", filter); + }, + task_deleted(filter?: WebhookFilter) { + return providerTrigger("asana", "task.deleted", filter); + }, + task_removed(filter?: WebhookFilter) { + return providerTrigger("asana", "task.removed", filter); + }, + workspace_added(filter?: WebhookFilter) { + return providerTrigger("asana", "workspace.added", filter); + }, + workspace_changed(filter?: WebhookFilter) { + return providerTrigger("asana", "workspace.changed", filter); + }, + workspace_deleted(filter?: WebhookFilter) { + return providerTrigger("asana", "workspace.deleted", filter); + }, + workspace_removed(filter?: WebhookFilter) { + return providerTrigger("asana", "workspace.removed", filter); + }, +}); diff --git a/packages/surface/src/triggers/azure-blob.ts b/packages/surface/src/triggers/azure-blob.ts new file mode 100644 index 000000000..855ea319e --- /dev/null +++ b/packages/surface/src/triggers/azure-blob.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const azure_blob = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("azure-blob", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("azure-blob", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("azure-blob", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/box.ts b/packages/surface/src/triggers/box.ts new file mode 100644 index 000000000..5dda77efa --- /dev/null +++ b/packages/surface/src/triggers/box.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const box = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("box", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("box", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("box", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/calendly.ts b/packages/surface/src/triggers/calendly.ts new file mode 100644 index 000000000..1ad7de078 --- /dev/null +++ b/packages/surface/src/triggers/calendly.ts @@ -0,0 +1,43 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const calendly = Object.freeze({ + event_type_canceled(filter?: WebhookFilter) { + return providerTrigger("calendly", "event_type.canceled", filter); + }, + event_type_created(filter?: WebhookFilter) { + return providerTrigger("calendly", "event_type.created", filter); + }, + event_type_deleted(filter?: WebhookFilter) { + return providerTrigger("calendly", "event_type.deleted", filter); + }, + event_type_updated(filter?: WebhookFilter) { + return providerTrigger("calendly", "event_type.updated", filter); + }, + invitee_canceled(filter?: WebhookFilter) { + return providerTrigger("calendly", "invitee.canceled", filter); + }, + invitee_created(filter?: WebhookFilter) { + return providerTrigger("calendly", "invitee.created", filter); + }, + invitee_deleted(filter?: WebhookFilter) { + return providerTrigger("calendly", "invitee.deleted", filter); + }, + invitee_updated(filter?: WebhookFilter) { + return providerTrigger("calendly", "invitee.updated", filter); + }, + scheduled_event_canceled(filter?: WebhookFilter) { + return providerTrigger("calendly", "scheduled_event.canceled", filter); + }, + scheduled_event_created(filter?: WebhookFilter) { + return providerTrigger("calendly", "scheduled_event.created", filter); + }, + scheduled_event_deleted(filter?: WebhookFilter) { + return providerTrigger("calendly", "scheduled_event.deleted", filter); + }, + scheduled_event_updated(filter?: WebhookFilter) { + return providerTrigger("calendly", "scheduled_event.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/clickup.ts b/packages/surface/src/triggers/clickup.ts new file mode 100644 index 000000000..af1402cd6 --- /dev/null +++ b/packages/surface/src/triggers/clickup.ts @@ -0,0 +1,43 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const clickup = Object.freeze({ + folder_created(filter?: WebhookFilter) { + return providerTrigger("clickup", "folder.created", filter); + }, + folder_deleted(filter?: WebhookFilter) { + return providerTrigger("clickup", "folder.deleted", filter); + }, + folder_updated(filter?: WebhookFilter) { + return providerTrigger("clickup", "folder.updated", filter); + }, + list_created(filter?: WebhookFilter) { + return providerTrigger("clickup", "list.created", filter); + }, + list_deleted(filter?: WebhookFilter) { + return providerTrigger("clickup", "list.deleted", filter); + }, + list_updated(filter?: WebhookFilter) { + return providerTrigger("clickup", "list.updated", filter); + }, + space_created(filter?: WebhookFilter) { + return providerTrigger("clickup", "space.created", filter); + }, + space_deleted(filter?: WebhookFilter) { + return providerTrigger("clickup", "space.deleted", filter); + }, + space_updated(filter?: WebhookFilter) { + return providerTrigger("clickup", "space.updated", filter); + }, + task_created(filter?: WebhookFilter) { + return providerTrigger("clickup", "task.created", filter); + }, + task_deleted(filter?: WebhookFilter) { + return providerTrigger("clickup", "task.deleted", filter); + }, + task_updated(filter?: WebhookFilter) { + return providerTrigger("clickup", "task.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/cloudflare.ts b/packages/surface/src/triggers/cloudflare.ts new file mode 100644 index 000000000..3fca74013 --- /dev/null +++ b/packages/surface/src/triggers/cloudflare.ts @@ -0,0 +1,31 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const cloudflare = Object.freeze({ + access_custom_certificate_expiration_type(filter?: WebhookFilter) { + return providerTrigger("cloudflare", "access_custom_certificate_expiration_type", filter); + }, + advanced_http_alert_error(filter?: WebhookFilter) { + return providerTrigger("cloudflare", "advanced_http_alert_error", filter); + }, + billing_usage_alert(filter?: WebhookFilter) { + return providerTrigger("cloudflare", "billing_usage_alert", filter); + }, + dedicated_ssl_certificate_event_type(filter?: WebhookFilter) { + return providerTrigger("cloudflare", "dedicated_ssl_certificate_event_type", filter); + }, + health_check_status_notification(filter?: WebhookFilter) { + return providerTrigger("cloudflare", "health_check_status_notification", filter); + }, + http_alert_origin_error(filter?: WebhookFilter) { + return providerTrigger("cloudflare", "http_alert_origin_error", filter); + }, + workers_alert(filter?: WebhookFilter) { + return providerTrigger("cloudflare", "workers_alert", filter); + }, + workers_observability_alert(filter?: WebhookFilter) { + return providerTrigger("cloudflare", "workers_observability_alert", filter); + }, +}); diff --git a/packages/surface/src/triggers/confluence.ts b/packages/surface/src/triggers/confluence.ts new file mode 100644 index 000000000..3cd9152f7 --- /dev/null +++ b/packages/surface/src/triggers/confluence.ts @@ -0,0 +1,25 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const confluence = Object.freeze({ + page_created(filter?: WebhookFilter) { + return providerTrigger("confluence", "page.created", filter); + }, + page_deleted(filter?: WebhookFilter) { + return providerTrigger("confluence", "page.deleted", filter); + }, + page_updated(filter?: WebhookFilter) { + return providerTrigger("confluence", "page.updated", filter); + }, + space_created(filter?: WebhookFilter) { + return providerTrigger("confluence", "space.created", filter); + }, + space_deleted(filter?: WebhookFilter) { + return providerTrigger("confluence", "space.deleted", filter); + }, + space_updated(filter?: WebhookFilter) { + return providerTrigger("confluence", "space.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/daytona.ts b/packages/surface/src/triggers/daytona.ts new file mode 100644 index 000000000..092c7818a --- /dev/null +++ b/packages/surface/src/triggers/daytona.ts @@ -0,0 +1,28 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const daytona = Object.freeze({ + sandbox_created(filter?: WebhookFilter) { + return providerTrigger("daytona", "sandbox.created", filter); + }, + sandbox_state_updated(filter?: WebhookFilter) { + return providerTrigger("daytona", "sandbox.state.updated", filter); + }, + snapshot_created(filter?: WebhookFilter) { + return providerTrigger("daytona", "snapshot.created", filter); + }, + snapshot_removed(filter?: WebhookFilter) { + return providerTrigger("daytona", "snapshot.removed", filter); + }, + snapshot_state_updated(filter?: WebhookFilter) { + return providerTrigger("daytona", "snapshot.state.updated", filter); + }, + volume_created(filter?: WebhookFilter) { + return providerTrigger("daytona", "volume.created", filter); + }, + volume_state_updated(filter?: WebhookFilter) { + return providerTrigger("daytona", "volume.state.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/docker-hub.ts b/packages/surface/src/triggers/docker-hub.ts new file mode 100644 index 000000000..e3611418e --- /dev/null +++ b/packages/surface/src/triggers/docker-hub.ts @@ -0,0 +1,10 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const docker_hub = Object.freeze({ + push(filter?: WebhookFilter) { + return providerTrigger("docker-hub", "push", filter); + }, +}); diff --git a/packages/surface/src/triggers/dropbox.ts b/packages/surface/src/triggers/dropbox.ts new file mode 100644 index 000000000..c5d8a3181 --- /dev/null +++ b/packages/surface/src/triggers/dropbox.ts @@ -0,0 +1,10 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const dropbox = Object.freeze({ + file_changed(filter?: WebhookFilter) { + return providerTrigger("dropbox", "file.changed", filter); + }, +}); diff --git a/packages/surface/src/triggers/fathom.ts b/packages/surface/src/triggers/fathom.ts new file mode 100644 index 000000000..711454e22 --- /dev/null +++ b/packages/surface/src/triggers/fathom.ts @@ -0,0 +1,10 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const fathom = Object.freeze({ + new_meeting_content_ready(filter?: WebhookFilter) { + return providerTrigger("fathom", "new-meeting-content-ready", filter); + }, +}); diff --git a/packages/surface/src/triggers/gcp.ts b/packages/surface/src/triggers/gcp.ts new file mode 100644 index 000000000..57ea22c87 --- /dev/null +++ b/packages/surface/src/triggers/gcp.ts @@ -0,0 +1,34 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const gcp = Object.freeze({ + billing_budget_alert(filter?: WebhookFilter) { + return providerTrigger("gcp", "billing.budget.alert", filter); + }, + cloud_run_service_created(filter?: WebhookFilter) { + return providerTrigger("gcp", "cloud-run.service.created", filter); + }, + cloud_run_service_deleted(filter?: WebhookFilter) { + return providerTrigger("gcp", "cloud-run.service.deleted", filter); + }, + cloud_run_service_updated(filter?: WebhookFilter) { + return providerTrigger("gcp", "cloud-run.service.updated", filter); + }, + error_reporting_event_logged(filter?: WebhookFilter) { + return providerTrigger("gcp", "error-reporting.event.logged", filter); + }, + error_reporting_group_opened(filter?: WebhookFilter) { + return providerTrigger("gcp", "error-reporting.group.opened", filter); + }, + error_reporting_group_reopened(filter?: WebhookFilter) { + return providerTrigger("gcp", "error-reporting.group.reopened", filter); + }, + monitoring_incident_closed(filter?: WebhookFilter) { + return providerTrigger("gcp", "monitoring.incident.closed", filter); + }, + monitoring_incident_open(filter?: WebhookFilter) { + return providerTrigger("gcp", "monitoring.incident.open", filter); + }, +}); diff --git a/packages/surface/src/triggers/gcs.ts b/packages/surface/src/triggers/gcs.ts new file mode 100644 index 000000000..615ff0a1a --- /dev/null +++ b/packages/surface/src/triggers/gcs.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const gcs = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("gcs", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("gcs", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("gcs", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/github.ts b/packages/surface/src/triggers/github.ts index 8b6a61f4d..32d35ef27 100644 --- a/packages/surface/src/triggers/github.ts +++ b/packages/surface/src/triggers/github.ts @@ -7,19 +7,79 @@ export const github = Object.freeze({ check_run(action?: string) { return providerTrigger("github", "check_run", action === undefined ? undefined : { action: triggerArgument(action, "action") }); }, + check_run_completed(filter?: WebhookFilter) { + return providerTrigger("github", "check_run.completed", filter); + }, + deployment_status_created(filter?: WebhookFilter) { + return providerTrigger("github", "deployment_status.created", filter); + }, issue_comment(action?: string) { return providerTrigger("github", "issue_comment", action === undefined ? undefined : { action: triggerArgument(action, "action") }); }, + issue_comment_created(filter?: WebhookFilter) { + return providerTrigger("github", "issue_comment.created", filter); + }, issues(filter?: WebhookFilter) { return providerTrigger("github", "issues", filter); }, + issues_edited(filter?: WebhookFilter) { + return providerTrigger("github", "issues.edited", filter); + }, + issues_labeled(filter?: WebhookFilter) { + return providerTrigger("github", "issues.labeled", filter); + }, + issues_reopened(filter?: WebhookFilter) { + return providerTrigger("github", "issues.reopened", filter); + }, + issues_unlabeled(filter?: WebhookFilter) { + return providerTrigger("github", "issues.unlabeled", filter); + }, pull_request(action?: string) { return providerTrigger("github", "pull_request", action === undefined ? undefined : { action: triggerArgument(action, "action") }); }, pull_request_review(filter?: WebhookFilter) { return providerTrigger("github", "pull_request_review", filter); }, + pull_request_review_comment_created(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request_review_comment.created", filter); + }, + pull_request_review_thread_resolved(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request_review_thread.resolved", filter); + }, + pull_request_review_dismissed(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request_review.dismissed", filter); + }, + pull_request_review_edited(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request_review.edited", filter); + }, + pull_request_review_submitted(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request_review.submitted", filter); + }, + pull_request_edited(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request.edited", filter); + }, + pull_request_reopened(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request.reopened", filter); + }, push(filter?: WebhookFilter) { return providerTrigger("github", "push", filter); }, + status(filter?: WebhookFilter) { + return providerTrigger("github", "status", filter); + }, + issues_closed(filter?: WebhookFilter) { + return providerTrigger("github", "issues.closed", filter); + }, + issues_opened(filter?: WebhookFilter) { + return providerTrigger("github", "issues.opened", filter); + }, + pull_request_closed(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request.closed", filter); + }, + pull_request_opened(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request.opened", filter); + }, + pull_request_synchronize(filter?: WebhookFilter) { + return providerTrigger("github", "pull_request.synchronize", filter); + }, }); diff --git a/packages/surface/src/triggers/gitlab.ts b/packages/surface/src/triggers/gitlab.ts new file mode 100644 index 000000000..1d84e9dc9 --- /dev/null +++ b/packages/surface/src/triggers/gitlab.ts @@ -0,0 +1,166 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const gitlab = Object.freeze({ + build(filter?: WebhookFilter) { + return providerTrigger("gitlab", "build", filter); + }, + deployment(filter?: WebhookFilter) { + return providerTrigger("gitlab", "deployment", filter); + }, + issue(filter?: WebhookFilter) { + return providerTrigger("gitlab", "issue", filter); + }, + merge_request(filter?: WebhookFilter) { + return providerTrigger("gitlab", "merge_request", filter); + }, + note(filter?: WebhookFilter) { + return providerTrigger("gitlab", "note", filter); + }, + pipeline(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline", filter); + }, + push(filter?: WebhookFilter) { + return providerTrigger("gitlab", "push", filter); + }, + tag_push(filter?: WebhookFilter) { + return providerTrigger("gitlab", "tag_push", filter); + }, + build_canceled(filter?: WebhookFilter) { + return providerTrigger("gitlab", "build.canceled", filter); + }, + build_created(filter?: WebhookFilter) { + return providerTrigger("gitlab", "build.created", filter); + }, + build_failed(filter?: WebhookFilter) { + return providerTrigger("gitlab", "build.failed", filter); + }, + build_manual(filter?: WebhookFilter) { + return providerTrigger("gitlab", "build.manual", filter); + }, + build_pending(filter?: WebhookFilter) { + return providerTrigger("gitlab", "build.pending", filter); + }, + build_running(filter?: WebhookFilter) { + return providerTrigger("gitlab", "build.running", filter); + }, + build_skipped(filter?: WebhookFilter) { + return providerTrigger("gitlab", "build.skipped", filter); + }, + build_success(filter?: WebhookFilter) { + return providerTrigger("gitlab", "build.success", filter); + }, + deployment_canceled(filter?: WebhookFilter) { + return providerTrigger("gitlab", "deployment.canceled", filter); + }, + deployment_created(filter?: WebhookFilter) { + return providerTrigger("gitlab", "deployment.created", filter); + }, + deployment_failed(filter?: WebhookFilter) { + return providerTrigger("gitlab", "deployment.failed", filter); + }, + deployment_running(filter?: WebhookFilter) { + return providerTrigger("gitlab", "deployment.running", filter); + }, + deployment_success(filter?: WebhookFilter) { + return providerTrigger("gitlab", "deployment.success", filter); + }, + issue_close(filter?: WebhookFilter) { + return providerTrigger("gitlab", "issue.close", filter); + }, + issue_open(filter?: WebhookFilter) { + return providerTrigger("gitlab", "issue.open", filter); + }, + issue_reopen(filter?: WebhookFilter) { + return providerTrigger("gitlab", "issue.reopen", filter); + }, + issue_update(filter?: WebhookFilter) { + return providerTrigger("gitlab", "issue.update", filter); + }, + job_canceled(filter?: WebhookFilter) { + return providerTrigger("gitlab", "job.canceled", filter); + }, + job_created(filter?: WebhookFilter) { + return providerTrigger("gitlab", "job.created", filter); + }, + job_failed(filter?: WebhookFilter) { + return providerTrigger("gitlab", "job.failed", filter); + }, + job_manual(filter?: WebhookFilter) { + return providerTrigger("gitlab", "job.manual", filter); + }, + job_pending(filter?: WebhookFilter) { + return providerTrigger("gitlab", "job.pending", filter); + }, + job_running(filter?: WebhookFilter) { + return providerTrigger("gitlab", "job.running", filter); + }, + job_skipped(filter?: WebhookFilter) { + return providerTrigger("gitlab", "job.skipped", filter); + }, + job_success(filter?: WebhookFilter) { + return providerTrigger("gitlab", "job.success", filter); + }, + merge_request_approved(filter?: WebhookFilter) { + return providerTrigger("gitlab", "merge_request.approved", filter); + }, + merge_request_close(filter?: WebhookFilter) { + return providerTrigger("gitlab", "merge_request.close", filter); + }, + merge_request_merge(filter?: WebhookFilter) { + return providerTrigger("gitlab", "merge_request.merge", filter); + }, + merge_request_open(filter?: WebhookFilter) { + return providerTrigger("gitlab", "merge_request.open", filter); + }, + merge_request_reopen(filter?: WebhookFilter) { + return providerTrigger("gitlab", "merge_request.reopen", filter); + }, + merge_request_unapproved(filter?: WebhookFilter) { + return providerTrigger("gitlab", "merge_request.unapproved", filter); + }, + merge_request_update(filter?: WebhookFilter) { + return providerTrigger("gitlab", "merge_request.update", filter); + }, + note_Commit(filter?: WebhookFilter) { + return providerTrigger("gitlab", "note.Commit", filter); + }, + note_Issue(filter?: WebhookFilter) { + return providerTrigger("gitlab", "note.Issue", filter); + }, + note_MergeRequest(filter?: WebhookFilter) { + return providerTrigger("gitlab", "note.MergeRequest", filter); + }, + note_Snippet(filter?: WebhookFilter) { + return providerTrigger("gitlab", "note.Snippet", filter); + }, + pipeline_canceled(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline.canceled", filter); + }, + pipeline_created(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline.created", filter); + }, + pipeline_failed(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline.failed", filter); + }, + pipeline_manual(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline.manual", filter); + }, + pipeline_pending(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline.pending", filter); + }, + pipeline_running(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline.running", filter); + }, + pipeline_skipped(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline.skipped", filter); + }, + pipeline_success(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline.success", filter); + }, + pipeline_waiting_for_resource(filter?: WebhookFilter) { + return providerTrigger("gitlab", "pipeline.waiting_for_resource", filter); + }, +}); diff --git a/packages/surface/src/triggers/gmail.ts b/packages/surface/src/triggers/gmail.ts new file mode 100644 index 000000000..e6c383b0e --- /dev/null +++ b/packages/surface/src/triggers/gmail.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const gmail = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("gmail", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("gmail", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("gmail", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/google-calendar.ts b/packages/surface/src/triggers/google-calendar.ts new file mode 100644 index 000000000..07ca325df --- /dev/null +++ b/packages/surface/src/triggers/google-calendar.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const google_calendar = Object.freeze({ + calendar_exists(filter?: WebhookFilter) { + return providerTrigger("google-calendar", "calendar.exists", filter); + }, + calendar_not_exists(filter?: WebhookFilter) { + return providerTrigger("google-calendar", "calendar.not_exists", filter); + }, + calendar_sync(filter?: WebhookFilter) { + return providerTrigger("google-calendar", "calendar.sync", filter); + }, +}); diff --git a/packages/surface/src/triggers/google-drive.ts b/packages/surface/src/triggers/google-drive.ts new file mode 100644 index 000000000..42c8ff2a2 --- /dev/null +++ b/packages/surface/src/triggers/google-drive.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const google_drive = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("google-drive", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("google-drive", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("google-drive", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/granola.ts b/packages/surface/src/triggers/granola.ts new file mode 100644 index 000000000..d4c9045b0 --- /dev/null +++ b/packages/surface/src/triggers/granola.ts @@ -0,0 +1,19 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const granola = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("granola", "file.created", filter); + }, + note_access_granted(filter?: WebhookFilter) { + return providerTrigger("granola", "note.access_granted", filter); + }, + note_edited(filter?: WebhookFilter) { + return providerTrigger("granola", "note.edited", filter); + }, + note_generated(filter?: WebhookFilter) { + return providerTrigger("granola", "note.generated", filter); + }, +}); diff --git a/packages/surface/src/triggers/hubspot.ts b/packages/surface/src/triggers/hubspot.ts new file mode 100644 index 000000000..744286672 --- /dev/null +++ b/packages/surface/src/triggers/hubspot.ts @@ -0,0 +1,67 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const hubspot = Object.freeze({ + company_associationChange(filter?: WebhookFilter) { + return providerTrigger("hubspot", "company.associationChange", filter); + }, + company_created(filter?: WebhookFilter) { + return providerTrigger("hubspot", "company.created", filter); + }, + company_deleted(filter?: WebhookFilter) { + return providerTrigger("hubspot", "company.deleted", filter); + }, + company_merged(filter?: WebhookFilter) { + return providerTrigger("hubspot", "company.merged", filter); + }, + company_propertyChange(filter?: WebhookFilter) { + return providerTrigger("hubspot", "company.propertyChange", filter); + }, + contact_associationChange(filter?: WebhookFilter) { + return providerTrigger("hubspot", "contact.associationChange", filter); + }, + contact_created(filter?: WebhookFilter) { + return providerTrigger("hubspot", "contact.created", filter); + }, + contact_deleted(filter?: WebhookFilter) { + return providerTrigger("hubspot", "contact.deleted", filter); + }, + contact_merged(filter?: WebhookFilter) { + return providerTrigger("hubspot", "contact.merged", filter); + }, + contact_propertyChange(filter?: WebhookFilter) { + return providerTrigger("hubspot", "contact.propertyChange", filter); + }, + deal_associationChange(filter?: WebhookFilter) { + return providerTrigger("hubspot", "deal.associationChange", filter); + }, + deal_created(filter?: WebhookFilter) { + return providerTrigger("hubspot", "deal.created", filter); + }, + deal_deleted(filter?: WebhookFilter) { + return providerTrigger("hubspot", "deal.deleted", filter); + }, + deal_merged(filter?: WebhookFilter) { + return providerTrigger("hubspot", "deal.merged", filter); + }, + deal_propertyChange(filter?: WebhookFilter) { + return providerTrigger("hubspot", "deal.propertyChange", filter); + }, + ticket_associationChange(filter?: WebhookFilter) { + return providerTrigger("hubspot", "ticket.associationChange", filter); + }, + ticket_created(filter?: WebhookFilter) { + return providerTrigger("hubspot", "ticket.created", filter); + }, + ticket_deleted(filter?: WebhookFilter) { + return providerTrigger("hubspot", "ticket.deleted", filter); + }, + ticket_merged(filter?: WebhookFilter) { + return providerTrigger("hubspot", "ticket.merged", filter); + }, + ticket_propertyChange(filter?: WebhookFilter) { + return providerTrigger("hubspot", "ticket.propertyChange", filter); + }, +}); diff --git a/packages/surface/src/triggers/index.ts b/packages/surface/src/triggers/index.ts index 7b6b95169..496d6344b 100644 --- a/packages/surface/src/triggers/index.ts +++ b/packages/surface/src/triggers/index.ts @@ -1,10 +1,100 @@ // GENERATED by scripts/generate-triggers.mjs — do not edit. +export { airtable } from "./airtable.js"; +export { asana } from "./asana.js"; +export { azure_blob } from "./azure-blob.js"; +export { box } from "./box.js"; +export { calendly } from "./calendly.js"; +export { clickup } from "./clickup.js"; +export { cloudflare } from "./cloudflare.js"; +export { confluence } from "./confluence.js"; +export { daytona } from "./daytona.js"; +export { docker_hub } from "./docker-hub.js"; +export { dropbox } from "./dropbox.js"; +export { fathom } from "./fathom.js"; +export { gcp } from "./gcp.js"; +export { gcs } from "./gcs.js"; export { github } from "./github.js"; +export { gitlab } from "./gitlab.js"; +export { gmail } from "./gmail.js"; +export { google_calendar } from "./google-calendar.js"; +export { google_drive } from "./google-drive.js"; +export { granola } from "./granola.js"; +export { hubspot } from "./hubspot.js"; +export { intercom } from "./intercom.js"; +export { jira } from "./jira.js"; +export { linear } from "./linear.js"; +export { mailgun } from "./mailgun.js"; +export { mixpanel } from "./mixpanel.js"; +export { neon } from "./neon.js"; +export { notion } from "./notion.js"; +export { onedrive } from "./onedrive.js"; +export { pipedrive } from "./pipedrive.js"; +export { postgres } from "./postgres.js"; +export { posthog } from "./posthog.js"; +export { ramp } from "./ramp.js"; +export { recall } from "./recall.js"; +export { redis } from "./redis.js"; +export { s3 } from "./s3.js"; +export { salesforce } from "./salesforce.js"; +export { segment } from "./segment.js"; +export { sendgrid } from "./sendgrid.js"; +export { sharepoint } from "./sharepoint.js"; +export { shopify } from "./shopify.js"; +export { shortcut } from "./shortcut.js"; export { slack } from "./slack.js"; +export { stripe } from "./stripe.js"; +export { teams } from "./teams.js"; +export { telegram } from "./telegram.js"; +export { zendesk } from "./zendesk.js"; /** Exact upstream event names, plus the generated Slack mention shorthand. */ export const providerEventTypes = Object.freeze({ - "github": Object.freeze(["check_run","issue_comment","issues","pull_request","pull_request_review","push"] as const), - "slack": Object.freeze(["app_mention","message","reaction_added"] as const), + "airtable": Object.freeze(["base.create","base.delete","base.update","record.create","record.delete","record.update","table.create","table.delete","table.update"] as const), + "asana": Object.freeze(["project.added","project.changed","project.deleted","project.removed","section.added","section.changed","section.deleted","section.removed","task.added","task.changed","task.completed","task.deleted","task.removed","workspace.added","workspace.changed","workspace.deleted","workspace.removed"] as const), + "azure-blob": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "box": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "calendly": Object.freeze(["event_type.canceled","event_type.created","event_type.deleted","event_type.updated","invitee.canceled","invitee.created","invitee.deleted","invitee.updated","scheduled_event.canceled","scheduled_event.created","scheduled_event.deleted","scheduled_event.updated"] as const), + "clickup": Object.freeze(["folder.created","folder.deleted","folder.updated","list.created","list.deleted","list.updated","space.created","space.deleted","space.updated","task.created","task.deleted","task.updated"] as const), + "cloudflare": Object.freeze(["access_custom_certificate_expiration_type","advanced_http_alert_error","billing_usage_alert","dedicated_ssl_certificate_event_type","health_check_status_notification","http_alert_origin_error","workers_alert","workers_observability_alert"] as const), + "confluence": Object.freeze(["page.created","page.deleted","page.updated","space.created","space.deleted","space.updated"] as const), + "daytona": Object.freeze(["sandbox.created","sandbox.state.updated","snapshot.created","snapshot.removed","snapshot.state.updated","volume.created","volume.state.updated"] as const), + "docker-hub": Object.freeze(["push"] as const), + "dropbox": Object.freeze(["file.changed"] as const), + "fathom": Object.freeze(["new-meeting-content-ready"] as const), + "gcp": Object.freeze(["billing.budget.alert","cloud-run.service.created","cloud-run.service.deleted","cloud-run.service.updated","error-reporting.event.logged","error-reporting.group.opened","error-reporting.group.reopened","monitoring.incident.closed","monitoring.incident.open"] as const), + "gcs": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "github": Object.freeze(["check_run","check_run.completed","deployment_status.created","issue_comment","issue_comment.created","issues","issues.closed","issues.edited","issues.labeled","issues.opened","issues.reopened","issues.unlabeled","pull_request","pull_request.closed","pull_request.edited","pull_request.opened","pull_request.reopened","pull_request.synchronize","pull_request_review","pull_request_review.dismissed","pull_request_review.edited","pull_request_review.submitted","pull_request_review_comment.created","pull_request_review_thread.resolved","push","status"] as const), + "gitlab": Object.freeze(["build","build.canceled","build.created","build.failed","build.manual","build.pending","build.running","build.skipped","build.success","deployment","deployment.canceled","deployment.created","deployment.failed","deployment.running","deployment.success","issue","issue.close","issue.open","issue.reopen","issue.update","job.canceled","job.created","job.failed","job.manual","job.pending","job.running","job.skipped","job.success","merge_request","merge_request.approved","merge_request.close","merge_request.merge","merge_request.open","merge_request.reopen","merge_request.unapproved","merge_request.update","note","note.Commit","note.Issue","note.MergeRequest","note.Snippet","pipeline","pipeline.canceled","pipeline.created","pipeline.failed","pipeline.manual","pipeline.pending","pipeline.running","pipeline.skipped","pipeline.success","pipeline.waiting_for_resource","push","tag_push"] as const), + "gmail": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "google-calendar": Object.freeze(["calendar.exists","calendar.not_exists","calendar.sync"] as const), + "google-drive": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "granola": Object.freeze(["file.created","note.access_granted","note.edited","note.generated"] as const), + "hubspot": Object.freeze(["company.associationChange","company.created","company.deleted","company.merged","company.propertyChange","contact.associationChange","contact.created","contact.deleted","contact.merged","contact.propertyChange","deal.associationChange","deal.created","deal.deleted","deal.merged","deal.propertyChange","ticket.associationChange","ticket.created","ticket.deleted","ticket.merged","ticket.propertyChange"] as const), + "intercom": Object.freeze(["company.archived","company.closed","company.created","company.deleted","company.reopened","company.updated","contact.archived","contact.closed","contact.created","contact.deleted","contact.reopened","contact.updated","conversation.archived","conversation.closed","conversation.created","conversation.deleted","conversation.reopened","conversation.updated"] as const), + "jira": Object.freeze(["comment.created","comment.deleted","comment.updated","issue.created","issue.deleted","issue.updated","project.created","project.deleted","project.updated","sprint.created","sprint.deleted","sprint.updated"] as const), + "linear": Object.freeze(["AgentSessionEvent.created","AgentSessionEvent.prompted","AppUserNotification.issueAssignedToYou","AppUserNotification.issueCommentMention","AppUserNotification.issueCommentReaction","AppUserNotification.issueEmojiReaction","AppUserNotification.issueMention","AppUserNotification.issueNewComment","AppUserNotification.issueStatusChanged","AppUserNotification.issueUnassignedFromYou","OAuthApp.revoked","PermissionChange.teamAccessChanged","comment.create","comment.remove","comment.update","cycle.create","cycle.remove","cycle.update","issue.create","issue.remove","issue.update","label.create","label.remove","label.update","milestone.create","milestone.remove","milestone.update","project.create","project.remove","project.update","roadmap.create","roadmap.remove","roadmap.update"] as const), + "mailgun": Object.freeze(["event.accepted","event.clicked","event.complained","event.delivered","event.failed","event.opened","event.permanent_fail","event.stored","event.unsubscribed","list.created","list.updated","message.accepted","message.delivered","message.failed","message.stored"] as const), + "mixpanel": Object.freeze(["cohort.create","cohort.delete","cohort.merge","cohort.update","event.create","event.delete","event.merge","event.update","profile.create","profile.delete","profile.merge","profile.update"] as const), + "neon": Object.freeze(["advisor.issue_raised","endpoint.state_changed","operation.cancelled","operation.failed","operation.succeeded"] as const), + "notion": Object.freeze(["database.created","database.deleted","database.moved","database.schema_updated","database.undeleted","page.content_updated","page.created","page.deleted","page.locked","page.moved","page.properties_updated","page.undeleted","page.unlocked"] as const), + "onedrive": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "pipedrive": Object.freeze(["activity.created","activity.deleted","activity.updated","deal.created","deal.deleted","deal.lost","deal.updated","deal.won","organization.created","organization.deleted","organization.updated","person.created","person.deleted","person.updated"] as const), + "postgres": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "posthog": Object.freeze(["posthog.alert.resolved","posthog.alert.triggered"] as const), + "ramp": Object.freeze(["applications.status_updated","bills.approved","bills.archived","bills.created","bills.paid","bills.ready_to_sync","bills.rejected","bills.updated","entities.created","item_receipts.created","payments.updated","purchase_orders.archived","purchase_orders.created","purchase_orders.updated","reimbursements.batch_payment_reimbursed","reimbursements.ready_for_review","reimbursements.ready_to_sync","reimbursements.sync_requested","spend_requests.comment_created","spend_requests.created","transactions.all_requirements_met_and_approved_changed","transactions.authorized","transactions.body_coding_updated","transactions.cleared","transactions.declined","transactions.ready_for_review","transactions.ready_to_sync","transactions.receipt_added","transactions.sync_requested","transactions.synced","unified_requests.created","unified_requests.external_approval_request","unified_requests.external_approval_request_reset","unified_requests.modified","unified_requests.node_advanced","unified_requests.override_approved","unified_requests.updated","users.invite_accepted","vendor_agreements.archived","vendor_agreements.created","vendor_agreements.deleted","vendor_agreements.document_added","vendor_agreements.renewal_milestone","vendor_agreements.updated","vendors.activated","vendors.approved","vendors.updated"] as const), + "recall": Object.freeze(["file.created","recording.created","transcript.done"] as const), + "redis": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "s3": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "salesforce": Object.freeze(["Account.created","Account.deleted","Account.updated","Account.upserted","Case.closed","Case.created","Case.deleted","Case.updated","Case.upserted","Contact.created","Contact.deleted","Contact.updated","Contact.upserted","Lead.converted","Lead.created","Lead.deleted","Lead.updated","Lead.upserted","Opportunity.created","Opportunity.deleted","Opportunity.updated","Opportunity.upserted"] as const), + "segment": Object.freeze(["group.create","group.update","group.upsert","identify.create","identify.update","identify.upsert","page.create","page.update","page.upsert","track.create","track.update","track.upsert"] as const), + "sendgrid": Object.freeze(["contact.create","contact.delete","contact.update","event.bounce","event.click","event.deferred","event.delivered","event.dropped","event.group_resubscribe","event.group_unsubscribe","event.open","event.processed","event.spamreport","event.unsubscribe","mail.create","mail.delete","mail.update"] as const), + "sharepoint": Object.freeze(["file.created","file.deleted","file.updated"] as const), + "shopify": Object.freeze(["customer.cancel","customer.create","customer.delete","customer.fulfill","customer.paid","customer.update","fulfillment.cancel","fulfillment.create","fulfillment.delete","fulfillment.fulfill","fulfillment.paid","fulfillment.update","order.cancel","order.create","order.delete","order.fulfill","order.paid","order.update","product.cancel","product.create","product.delete","product.fulfill","product.paid","product.update"] as const), + "shortcut": Object.freeze(["epic.create","epic.delete","epic.update","story.create","story.delete","story.update"] as const), + "slack": Object.freeze(["app_mention","channel.archived","channel.created","channel.deleted","channel.member_joined","channel.member_left","channel.renamed","channel.unarchived","group.archived","group.deleted","group.renamed","group.unarchived","message","message.created","message.deleted","message.updated","reaction.added","reaction.removed","reaction_added","user.changed","user.joined"] as const), + "stripe": Object.freeze(["charge.failed","charge.refunded","charge.succeeded","charge.updated","customer.created","customer.deleted","customer.subscription.created","customer.subscription.deleted","customer.subscription.updated","customer.updated","invoice.created","invoice.finalized","invoice.paid","invoice.payment_failed","invoice.updated","invoice.voided","payment_intent.canceled","payment_intent.created","payment_intent.payment_failed","payment_intent.requires_action","payment_intent.succeeded"] as const), + "teams": Object.freeze(["channel.created","channel.deleted","channel.updated","chat.created","chat.deleted","chat.updated","chat_message.created","chat_message.deleted","chat_message.updated","member.created","member.deleted","member.updated","message.created","message.deleted","message.updated","reply.created","reply.deleted","reply.updated","team.deleted","team.updated"] as const), + "telegram": Object.freeze(["business_connection","business_message","callback_query","channel_post","chat_boost","chat_join_request","chat_member","chosen_inline_result","deleted_business_messages","edited_business_message","edited_channel_post","edited_message","guest_message","inline_query","managed_bot","message","message_reaction","message_reaction_count","my_chat_member","poll","poll_answer","pre_checkout_query","purchased_paid_media","removed_chat_boost","shipping_query"] as const), + "zendesk": Object.freeze(["organization.created","organization.deleted","organization.updated","ticket.created","ticket.deleted","ticket.updated","user.created","user.deleted","user.updated"] as const), }); diff --git a/packages/surface/src/triggers/intercom.ts b/packages/surface/src/triggers/intercom.ts new file mode 100644 index 000000000..1beddff7a --- /dev/null +++ b/packages/surface/src/triggers/intercom.ts @@ -0,0 +1,61 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const intercom = Object.freeze({ + company_archived(filter?: WebhookFilter) { + return providerTrigger("intercom", "company.archived", filter); + }, + company_closed(filter?: WebhookFilter) { + return providerTrigger("intercom", "company.closed", filter); + }, + company_created(filter?: WebhookFilter) { + return providerTrigger("intercom", "company.created", filter); + }, + company_deleted(filter?: WebhookFilter) { + return providerTrigger("intercom", "company.deleted", filter); + }, + company_reopened(filter?: WebhookFilter) { + return providerTrigger("intercom", "company.reopened", filter); + }, + company_updated(filter?: WebhookFilter) { + return providerTrigger("intercom", "company.updated", filter); + }, + contact_archived(filter?: WebhookFilter) { + return providerTrigger("intercom", "contact.archived", filter); + }, + contact_closed(filter?: WebhookFilter) { + return providerTrigger("intercom", "contact.closed", filter); + }, + contact_created(filter?: WebhookFilter) { + return providerTrigger("intercom", "contact.created", filter); + }, + contact_deleted(filter?: WebhookFilter) { + return providerTrigger("intercom", "contact.deleted", filter); + }, + contact_reopened(filter?: WebhookFilter) { + return providerTrigger("intercom", "contact.reopened", filter); + }, + contact_updated(filter?: WebhookFilter) { + return providerTrigger("intercom", "contact.updated", filter); + }, + conversation_archived(filter?: WebhookFilter) { + return providerTrigger("intercom", "conversation.archived", filter); + }, + conversation_closed(filter?: WebhookFilter) { + return providerTrigger("intercom", "conversation.closed", filter); + }, + conversation_created(filter?: WebhookFilter) { + return providerTrigger("intercom", "conversation.created", filter); + }, + conversation_deleted(filter?: WebhookFilter) { + return providerTrigger("intercom", "conversation.deleted", filter); + }, + conversation_reopened(filter?: WebhookFilter) { + return providerTrigger("intercom", "conversation.reopened", filter); + }, + conversation_updated(filter?: WebhookFilter) { + return providerTrigger("intercom", "conversation.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/jira.ts b/packages/surface/src/triggers/jira.ts new file mode 100644 index 000000000..07777ed59 --- /dev/null +++ b/packages/surface/src/triggers/jira.ts @@ -0,0 +1,43 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const jira = Object.freeze({ + comment_created(filter?: WebhookFilter) { + return providerTrigger("jira", "comment.created", filter); + }, + comment_deleted(filter?: WebhookFilter) { + return providerTrigger("jira", "comment.deleted", filter); + }, + comment_updated(filter?: WebhookFilter) { + return providerTrigger("jira", "comment.updated", filter); + }, + issue_created(filter?: WebhookFilter) { + return providerTrigger("jira", "issue.created", filter); + }, + issue_deleted(filter?: WebhookFilter) { + return providerTrigger("jira", "issue.deleted", filter); + }, + issue_updated(filter?: WebhookFilter) { + return providerTrigger("jira", "issue.updated", filter); + }, + project_created(filter?: WebhookFilter) { + return providerTrigger("jira", "project.created", filter); + }, + project_deleted(filter?: WebhookFilter) { + return providerTrigger("jira", "project.deleted", filter); + }, + project_updated(filter?: WebhookFilter) { + return providerTrigger("jira", "project.updated", filter); + }, + sprint_created(filter?: WebhookFilter) { + return providerTrigger("jira", "sprint.created", filter); + }, + sprint_deleted(filter?: WebhookFilter) { + return providerTrigger("jira", "sprint.deleted", filter); + }, + sprint_updated(filter?: WebhookFilter) { + return providerTrigger("jira", "sprint.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/linear.ts b/packages/surface/src/triggers/linear.ts new file mode 100644 index 000000000..2a0969de6 --- /dev/null +++ b/packages/surface/src/triggers/linear.ts @@ -0,0 +1,106 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const linear = Object.freeze({ + AgentSessionEvent_created(filter?: WebhookFilter) { + return providerTrigger("linear", "AgentSessionEvent.created", filter); + }, + AgentSessionEvent_prompted(filter?: WebhookFilter) { + return providerTrigger("linear", "AgentSessionEvent.prompted", filter); + }, + AppUserNotification_issueAssignedToYou(filter?: WebhookFilter) { + return providerTrigger("linear", "AppUserNotification.issueAssignedToYou", filter); + }, + AppUserNotification_issueCommentMention(filter?: WebhookFilter) { + return providerTrigger("linear", "AppUserNotification.issueCommentMention", filter); + }, + AppUserNotification_issueCommentReaction(filter?: WebhookFilter) { + return providerTrigger("linear", "AppUserNotification.issueCommentReaction", filter); + }, + AppUserNotification_issueEmojiReaction(filter?: WebhookFilter) { + return providerTrigger("linear", "AppUserNotification.issueEmojiReaction", filter); + }, + AppUserNotification_issueMention(filter?: WebhookFilter) { + return providerTrigger("linear", "AppUserNotification.issueMention", filter); + }, + AppUserNotification_issueNewComment(filter?: WebhookFilter) { + return providerTrigger("linear", "AppUserNotification.issueNewComment", filter); + }, + AppUserNotification_issueStatusChanged(filter?: WebhookFilter) { + return providerTrigger("linear", "AppUserNotification.issueStatusChanged", filter); + }, + AppUserNotification_issueUnassignedFromYou(filter?: WebhookFilter) { + return providerTrigger("linear", "AppUserNotification.issueUnassignedFromYou", filter); + }, + comment_create(filter?: WebhookFilter) { + return providerTrigger("linear", "comment.create", filter); + }, + comment_remove(filter?: WebhookFilter) { + return providerTrigger("linear", "comment.remove", filter); + }, + comment_update(filter?: WebhookFilter) { + return providerTrigger("linear", "comment.update", filter); + }, + cycle_create(filter?: WebhookFilter) { + return providerTrigger("linear", "cycle.create", filter); + }, + cycle_remove(filter?: WebhookFilter) { + return providerTrigger("linear", "cycle.remove", filter); + }, + cycle_update(filter?: WebhookFilter) { + return providerTrigger("linear", "cycle.update", filter); + }, + issue_create(filter?: WebhookFilter) { + return providerTrigger("linear", "issue.create", filter); + }, + issue_remove(filter?: WebhookFilter) { + return providerTrigger("linear", "issue.remove", filter); + }, + issue_update(filter?: WebhookFilter) { + return providerTrigger("linear", "issue.update", filter); + }, + label_create(filter?: WebhookFilter) { + return providerTrigger("linear", "label.create", filter); + }, + label_remove(filter?: WebhookFilter) { + return providerTrigger("linear", "label.remove", filter); + }, + label_update(filter?: WebhookFilter) { + return providerTrigger("linear", "label.update", filter); + }, + milestone_create(filter?: WebhookFilter) { + return providerTrigger("linear", "milestone.create", filter); + }, + milestone_remove(filter?: WebhookFilter) { + return providerTrigger("linear", "milestone.remove", filter); + }, + milestone_update(filter?: WebhookFilter) { + return providerTrigger("linear", "milestone.update", filter); + }, + OAuthApp_revoked(filter?: WebhookFilter) { + return providerTrigger("linear", "OAuthApp.revoked", filter); + }, + PermissionChange_teamAccessChanged(filter?: WebhookFilter) { + return providerTrigger("linear", "PermissionChange.teamAccessChanged", filter); + }, + project_create(filter?: WebhookFilter) { + return providerTrigger("linear", "project.create", filter); + }, + project_remove(filter?: WebhookFilter) { + return providerTrigger("linear", "project.remove", filter); + }, + project_update(filter?: WebhookFilter) { + return providerTrigger("linear", "project.update", filter); + }, + roadmap_create(filter?: WebhookFilter) { + return providerTrigger("linear", "roadmap.create", filter); + }, + roadmap_remove(filter?: WebhookFilter) { + return providerTrigger("linear", "roadmap.remove", filter); + }, + roadmap_update(filter?: WebhookFilter) { + return providerTrigger("linear", "roadmap.update", filter); + }, +}); diff --git a/packages/surface/src/triggers/mailgun.ts b/packages/surface/src/triggers/mailgun.ts new file mode 100644 index 000000000..64a45ead1 --- /dev/null +++ b/packages/surface/src/triggers/mailgun.ts @@ -0,0 +1,52 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const mailgun = Object.freeze({ + event_accepted(filter?: WebhookFilter) { + return providerTrigger("mailgun", "event.accepted", filter); + }, + event_clicked(filter?: WebhookFilter) { + return providerTrigger("mailgun", "event.clicked", filter); + }, + event_complained(filter?: WebhookFilter) { + return providerTrigger("mailgun", "event.complained", filter); + }, + event_delivered(filter?: WebhookFilter) { + return providerTrigger("mailgun", "event.delivered", filter); + }, + event_failed(filter?: WebhookFilter) { + return providerTrigger("mailgun", "event.failed", filter); + }, + event_opened(filter?: WebhookFilter) { + return providerTrigger("mailgun", "event.opened", filter); + }, + event_permanent_fail(filter?: WebhookFilter) { + return providerTrigger("mailgun", "event.permanent_fail", filter); + }, + event_stored(filter?: WebhookFilter) { + return providerTrigger("mailgun", "event.stored", filter); + }, + event_unsubscribed(filter?: WebhookFilter) { + return providerTrigger("mailgun", "event.unsubscribed", filter); + }, + list_created(filter?: WebhookFilter) { + return providerTrigger("mailgun", "list.created", filter); + }, + list_updated(filter?: WebhookFilter) { + return providerTrigger("mailgun", "list.updated", filter); + }, + message_accepted(filter?: WebhookFilter) { + return providerTrigger("mailgun", "message.accepted", filter); + }, + message_delivered(filter?: WebhookFilter) { + return providerTrigger("mailgun", "message.delivered", filter); + }, + message_failed(filter?: WebhookFilter) { + return providerTrigger("mailgun", "message.failed", filter); + }, + message_stored(filter?: WebhookFilter) { + return providerTrigger("mailgun", "message.stored", filter); + }, +}); diff --git a/packages/surface/src/triggers/mixpanel.ts b/packages/surface/src/triggers/mixpanel.ts new file mode 100644 index 000000000..3cd854293 --- /dev/null +++ b/packages/surface/src/triggers/mixpanel.ts @@ -0,0 +1,43 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const mixpanel = Object.freeze({ + cohort_create(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "cohort.create", filter); + }, + cohort_delete(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "cohort.delete", filter); + }, + cohort_merge(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "cohort.merge", filter); + }, + cohort_update(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "cohort.update", filter); + }, + event_create(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "event.create", filter); + }, + event_delete(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "event.delete", filter); + }, + event_merge(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "event.merge", filter); + }, + event_update(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "event.update", filter); + }, + profile_create(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "profile.create", filter); + }, + profile_delete(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "profile.delete", filter); + }, + profile_merge(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "profile.merge", filter); + }, + profile_update(filter?: WebhookFilter) { + return providerTrigger("mixpanel", "profile.update", filter); + }, +}); diff --git a/packages/surface/src/triggers/neon.ts b/packages/surface/src/triggers/neon.ts new file mode 100644 index 000000000..8d4929721 --- /dev/null +++ b/packages/surface/src/triggers/neon.ts @@ -0,0 +1,22 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const neon = Object.freeze({ + advisor_issue_raised(filter?: WebhookFilter) { + return providerTrigger("neon", "advisor.issue_raised", filter); + }, + endpoint_state_changed(filter?: WebhookFilter) { + return providerTrigger("neon", "endpoint.state_changed", filter); + }, + operation_cancelled(filter?: WebhookFilter) { + return providerTrigger("neon", "operation.cancelled", filter); + }, + operation_failed(filter?: WebhookFilter) { + return providerTrigger("neon", "operation.failed", filter); + }, + operation_succeeded(filter?: WebhookFilter) { + return providerTrigger("neon", "operation.succeeded", filter); + }, +}); diff --git a/packages/surface/src/triggers/notion.ts b/packages/surface/src/triggers/notion.ts new file mode 100644 index 000000000..a0235ded8 --- /dev/null +++ b/packages/surface/src/triggers/notion.ts @@ -0,0 +1,46 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const notion = Object.freeze({ + database_created(filter?: WebhookFilter) { + return providerTrigger("notion", "database.created", filter); + }, + database_deleted(filter?: WebhookFilter) { + return providerTrigger("notion", "database.deleted", filter); + }, + database_moved(filter?: WebhookFilter) { + return providerTrigger("notion", "database.moved", filter); + }, + database_schema_updated(filter?: WebhookFilter) { + return providerTrigger("notion", "database.schema_updated", filter); + }, + database_undeleted(filter?: WebhookFilter) { + return providerTrigger("notion", "database.undeleted", filter); + }, + page_content_updated(filter?: WebhookFilter) { + return providerTrigger("notion", "page.content_updated", filter); + }, + page_created(filter?: WebhookFilter) { + return providerTrigger("notion", "page.created", filter); + }, + page_deleted(filter?: WebhookFilter) { + return providerTrigger("notion", "page.deleted", filter); + }, + page_locked(filter?: WebhookFilter) { + return providerTrigger("notion", "page.locked", filter); + }, + page_moved(filter?: WebhookFilter) { + return providerTrigger("notion", "page.moved", filter); + }, + page_properties_updated(filter?: WebhookFilter) { + return providerTrigger("notion", "page.properties_updated", filter); + }, + page_undeleted(filter?: WebhookFilter) { + return providerTrigger("notion", "page.undeleted", filter); + }, + page_unlocked(filter?: WebhookFilter) { + return providerTrigger("notion", "page.unlocked", filter); + }, +}); diff --git a/packages/surface/src/triggers/onedrive.ts b/packages/surface/src/triggers/onedrive.ts new file mode 100644 index 000000000..cbd3682db --- /dev/null +++ b/packages/surface/src/triggers/onedrive.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const onedrive = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("onedrive", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("onedrive", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("onedrive", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/pipedrive.ts b/packages/surface/src/triggers/pipedrive.ts new file mode 100644 index 000000000..3c44a5ef5 --- /dev/null +++ b/packages/surface/src/triggers/pipedrive.ts @@ -0,0 +1,49 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const pipedrive = Object.freeze({ + activity_created(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "activity.created", filter); + }, + activity_deleted(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "activity.deleted", filter); + }, + activity_updated(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "activity.updated", filter); + }, + deal_created(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "deal.created", filter); + }, + deal_deleted(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "deal.deleted", filter); + }, + deal_lost(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "deal.lost", filter); + }, + deal_updated(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "deal.updated", filter); + }, + deal_won(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "deal.won", filter); + }, + organization_created(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "organization.created", filter); + }, + organization_deleted(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "organization.deleted", filter); + }, + organization_updated(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "organization.updated", filter); + }, + person_created(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "person.created", filter); + }, + person_deleted(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "person.deleted", filter); + }, + person_updated(filter?: WebhookFilter) { + return providerTrigger("pipedrive", "person.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/postgres.ts b/packages/surface/src/triggers/postgres.ts new file mode 100644 index 000000000..834e7eb54 --- /dev/null +++ b/packages/surface/src/triggers/postgres.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const postgres = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("postgres", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("postgres", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("postgres", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/posthog.ts b/packages/surface/src/triggers/posthog.ts new file mode 100644 index 000000000..2b070d353 --- /dev/null +++ b/packages/surface/src/triggers/posthog.ts @@ -0,0 +1,13 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const posthog = Object.freeze({ + posthog_alert_resolved(filter?: WebhookFilter) { + return providerTrigger("posthog", "posthog.alert.resolved", filter); + }, + posthog_alert_triggered(filter?: WebhookFilter) { + return providerTrigger("posthog", "posthog.alert.triggered", filter); + }, +}); diff --git a/packages/surface/src/triggers/ramp.ts b/packages/surface/src/triggers/ramp.ts new file mode 100644 index 000000000..1219baf17 --- /dev/null +++ b/packages/surface/src/triggers/ramp.ts @@ -0,0 +1,148 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const ramp = Object.freeze({ + applications_status_updated(filter?: WebhookFilter) { + return providerTrigger("ramp", "applications.status_updated", filter); + }, + bills_approved(filter?: WebhookFilter) { + return providerTrigger("ramp", "bills.approved", filter); + }, + bills_archived(filter?: WebhookFilter) { + return providerTrigger("ramp", "bills.archived", filter); + }, + bills_created(filter?: WebhookFilter) { + return providerTrigger("ramp", "bills.created", filter); + }, + bills_paid(filter?: WebhookFilter) { + return providerTrigger("ramp", "bills.paid", filter); + }, + bills_ready_to_sync(filter?: WebhookFilter) { + return providerTrigger("ramp", "bills.ready_to_sync", filter); + }, + bills_rejected(filter?: WebhookFilter) { + return providerTrigger("ramp", "bills.rejected", filter); + }, + bills_updated(filter?: WebhookFilter) { + return providerTrigger("ramp", "bills.updated", filter); + }, + entities_created(filter?: WebhookFilter) { + return providerTrigger("ramp", "entities.created", filter); + }, + item_receipts_created(filter?: WebhookFilter) { + return providerTrigger("ramp", "item_receipts.created", filter); + }, + payments_updated(filter?: WebhookFilter) { + return providerTrigger("ramp", "payments.updated", filter); + }, + purchase_orders_archived(filter?: WebhookFilter) { + return providerTrigger("ramp", "purchase_orders.archived", filter); + }, + purchase_orders_created(filter?: WebhookFilter) { + return providerTrigger("ramp", "purchase_orders.created", filter); + }, + purchase_orders_updated(filter?: WebhookFilter) { + return providerTrigger("ramp", "purchase_orders.updated", filter); + }, + reimbursements_batch_payment_reimbursed(filter?: WebhookFilter) { + return providerTrigger("ramp", "reimbursements.batch_payment_reimbursed", filter); + }, + reimbursements_ready_for_review(filter?: WebhookFilter) { + return providerTrigger("ramp", "reimbursements.ready_for_review", filter); + }, + reimbursements_ready_to_sync(filter?: WebhookFilter) { + return providerTrigger("ramp", "reimbursements.ready_to_sync", filter); + }, + reimbursements_sync_requested(filter?: WebhookFilter) { + return providerTrigger("ramp", "reimbursements.sync_requested", filter); + }, + spend_requests_comment_created(filter?: WebhookFilter) { + return providerTrigger("ramp", "spend_requests.comment_created", filter); + }, + spend_requests_created(filter?: WebhookFilter) { + return providerTrigger("ramp", "spend_requests.created", filter); + }, + transactions_all_requirements_met_and_approved_changed(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.all_requirements_met_and_approved_changed", filter); + }, + transactions_authorized(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.authorized", filter); + }, + transactions_body_coding_updated(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.body_coding_updated", filter); + }, + transactions_cleared(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.cleared", filter); + }, + transactions_declined(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.declined", filter); + }, + transactions_ready_for_review(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.ready_for_review", filter); + }, + transactions_ready_to_sync(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.ready_to_sync", filter); + }, + transactions_receipt_added(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.receipt_added", filter); + }, + transactions_sync_requested(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.sync_requested", filter); + }, + transactions_synced(filter?: WebhookFilter) { + return providerTrigger("ramp", "transactions.synced", filter); + }, + unified_requests_created(filter?: WebhookFilter) { + return providerTrigger("ramp", "unified_requests.created", filter); + }, + unified_requests_external_approval_request(filter?: WebhookFilter) { + return providerTrigger("ramp", "unified_requests.external_approval_request", filter); + }, + unified_requests_external_approval_request_reset(filter?: WebhookFilter) { + return providerTrigger("ramp", "unified_requests.external_approval_request_reset", filter); + }, + unified_requests_modified(filter?: WebhookFilter) { + return providerTrigger("ramp", "unified_requests.modified", filter); + }, + unified_requests_node_advanced(filter?: WebhookFilter) { + return providerTrigger("ramp", "unified_requests.node_advanced", filter); + }, + unified_requests_override_approved(filter?: WebhookFilter) { + return providerTrigger("ramp", "unified_requests.override_approved", filter); + }, + unified_requests_updated(filter?: WebhookFilter) { + return providerTrigger("ramp", "unified_requests.updated", filter); + }, + users_invite_accepted(filter?: WebhookFilter) { + return providerTrigger("ramp", "users.invite_accepted", filter); + }, + vendor_agreements_archived(filter?: WebhookFilter) { + return providerTrigger("ramp", "vendor_agreements.archived", filter); + }, + vendor_agreements_created(filter?: WebhookFilter) { + return providerTrigger("ramp", "vendor_agreements.created", filter); + }, + vendor_agreements_deleted(filter?: WebhookFilter) { + return providerTrigger("ramp", "vendor_agreements.deleted", filter); + }, + vendor_agreements_document_added(filter?: WebhookFilter) { + return providerTrigger("ramp", "vendor_agreements.document_added", filter); + }, + vendor_agreements_renewal_milestone(filter?: WebhookFilter) { + return providerTrigger("ramp", "vendor_agreements.renewal_milestone", filter); + }, + vendor_agreements_updated(filter?: WebhookFilter) { + return providerTrigger("ramp", "vendor_agreements.updated", filter); + }, + vendors_activated(filter?: WebhookFilter) { + return providerTrigger("ramp", "vendors.activated", filter); + }, + vendors_approved(filter?: WebhookFilter) { + return providerTrigger("ramp", "vendors.approved", filter); + }, + vendors_updated(filter?: WebhookFilter) { + return providerTrigger("ramp", "vendors.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/recall.ts b/packages/surface/src/triggers/recall.ts new file mode 100644 index 000000000..eed165e5c --- /dev/null +++ b/packages/surface/src/triggers/recall.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const recall = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("recall", "file.created", filter); + }, + recording_created(filter?: WebhookFilter) { + return providerTrigger("recall", "recording.created", filter); + }, + transcript_done(filter?: WebhookFilter) { + return providerTrigger("recall", "transcript.done", filter); + }, +}); diff --git a/packages/surface/src/triggers/redis.ts b/packages/surface/src/triggers/redis.ts new file mode 100644 index 000000000..3f68c3dbb --- /dev/null +++ b/packages/surface/src/triggers/redis.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const redis = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("redis", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("redis", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("redis", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/s3.ts b/packages/surface/src/triggers/s3.ts new file mode 100644 index 000000000..4de7b56be --- /dev/null +++ b/packages/surface/src/triggers/s3.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const s3 = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("s3", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("s3", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("s3", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/salesforce.ts b/packages/surface/src/triggers/salesforce.ts new file mode 100644 index 000000000..69c9361fc --- /dev/null +++ b/packages/surface/src/triggers/salesforce.ts @@ -0,0 +1,73 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const salesforce = Object.freeze({ + Account_created(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Account.created", filter); + }, + Account_deleted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Account.deleted", filter); + }, + Account_updated(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Account.updated", filter); + }, + Account_upserted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Account.upserted", filter); + }, + Case_closed(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Case.closed", filter); + }, + Case_created(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Case.created", filter); + }, + Case_deleted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Case.deleted", filter); + }, + Case_updated(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Case.updated", filter); + }, + Case_upserted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Case.upserted", filter); + }, + Contact_created(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Contact.created", filter); + }, + Contact_deleted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Contact.deleted", filter); + }, + Contact_updated(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Contact.updated", filter); + }, + Contact_upserted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Contact.upserted", filter); + }, + Lead_converted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Lead.converted", filter); + }, + Lead_created(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Lead.created", filter); + }, + Lead_deleted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Lead.deleted", filter); + }, + Lead_updated(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Lead.updated", filter); + }, + Lead_upserted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Lead.upserted", filter); + }, + Opportunity_created(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Opportunity.created", filter); + }, + Opportunity_deleted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Opportunity.deleted", filter); + }, + Opportunity_updated(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Opportunity.updated", filter); + }, + Opportunity_upserted(filter?: WebhookFilter) { + return providerTrigger("salesforce", "Opportunity.upserted", filter); + }, +}); diff --git a/packages/surface/src/triggers/segment.ts b/packages/surface/src/triggers/segment.ts new file mode 100644 index 000000000..2919923ac --- /dev/null +++ b/packages/surface/src/triggers/segment.ts @@ -0,0 +1,43 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const segment = Object.freeze({ + group_create(filter?: WebhookFilter) { + return providerTrigger("segment", "group.create", filter); + }, + group_update(filter?: WebhookFilter) { + return providerTrigger("segment", "group.update", filter); + }, + group_upsert(filter?: WebhookFilter) { + return providerTrigger("segment", "group.upsert", filter); + }, + identify_create(filter?: WebhookFilter) { + return providerTrigger("segment", "identify.create", filter); + }, + identify_update(filter?: WebhookFilter) { + return providerTrigger("segment", "identify.update", filter); + }, + identify_upsert(filter?: WebhookFilter) { + return providerTrigger("segment", "identify.upsert", filter); + }, + page_create(filter?: WebhookFilter) { + return providerTrigger("segment", "page.create", filter); + }, + page_update(filter?: WebhookFilter) { + return providerTrigger("segment", "page.update", filter); + }, + page_upsert(filter?: WebhookFilter) { + return providerTrigger("segment", "page.upsert", filter); + }, + track_create(filter?: WebhookFilter) { + return providerTrigger("segment", "track.create", filter); + }, + track_update(filter?: WebhookFilter) { + return providerTrigger("segment", "track.update", filter); + }, + track_upsert(filter?: WebhookFilter) { + return providerTrigger("segment", "track.upsert", filter); + }, +}); diff --git a/packages/surface/src/triggers/sendgrid.ts b/packages/surface/src/triggers/sendgrid.ts new file mode 100644 index 000000000..02097c3f2 --- /dev/null +++ b/packages/surface/src/triggers/sendgrid.ts @@ -0,0 +1,58 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const sendgrid = Object.freeze({ + contact_create(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "contact.create", filter); + }, + contact_delete(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "contact.delete", filter); + }, + contact_update(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "contact.update", filter); + }, + event_bounce(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.bounce", filter); + }, + event_click(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.click", filter); + }, + event_deferred(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.deferred", filter); + }, + event_delivered(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.delivered", filter); + }, + event_dropped(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.dropped", filter); + }, + event_group_resubscribe(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.group_resubscribe", filter); + }, + event_group_unsubscribe(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.group_unsubscribe", filter); + }, + event_open(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.open", filter); + }, + event_processed(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.processed", filter); + }, + event_spamreport(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.spamreport", filter); + }, + event_unsubscribe(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "event.unsubscribe", filter); + }, + mail_create(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "mail.create", filter); + }, + mail_delete(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "mail.delete", filter); + }, + mail_update(filter?: WebhookFilter) { + return providerTrigger("sendgrid", "mail.update", filter); + }, +}); diff --git a/packages/surface/src/triggers/sharepoint.ts b/packages/surface/src/triggers/sharepoint.ts new file mode 100644 index 000000000..843693de3 --- /dev/null +++ b/packages/surface/src/triggers/sharepoint.ts @@ -0,0 +1,16 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const sharepoint = Object.freeze({ + file_created(filter?: WebhookFilter) { + return providerTrigger("sharepoint", "file.created", filter); + }, + file_deleted(filter?: WebhookFilter) { + return providerTrigger("sharepoint", "file.deleted", filter); + }, + file_updated(filter?: WebhookFilter) { + return providerTrigger("sharepoint", "file.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/shopify.ts b/packages/surface/src/triggers/shopify.ts new file mode 100644 index 000000000..0db6b6af3 --- /dev/null +++ b/packages/surface/src/triggers/shopify.ts @@ -0,0 +1,79 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const shopify = Object.freeze({ + customer_cancel(filter?: WebhookFilter) { + return providerTrigger("shopify", "customer.cancel", filter); + }, + customer_create(filter?: WebhookFilter) { + return providerTrigger("shopify", "customer.create", filter); + }, + customer_delete(filter?: WebhookFilter) { + return providerTrigger("shopify", "customer.delete", filter); + }, + customer_fulfill(filter?: WebhookFilter) { + return providerTrigger("shopify", "customer.fulfill", filter); + }, + customer_paid(filter?: WebhookFilter) { + return providerTrigger("shopify", "customer.paid", filter); + }, + customer_update(filter?: WebhookFilter) { + return providerTrigger("shopify", "customer.update", filter); + }, + fulfillment_cancel(filter?: WebhookFilter) { + return providerTrigger("shopify", "fulfillment.cancel", filter); + }, + fulfillment_create(filter?: WebhookFilter) { + return providerTrigger("shopify", "fulfillment.create", filter); + }, + fulfillment_delete(filter?: WebhookFilter) { + return providerTrigger("shopify", "fulfillment.delete", filter); + }, + fulfillment_fulfill(filter?: WebhookFilter) { + return providerTrigger("shopify", "fulfillment.fulfill", filter); + }, + fulfillment_paid(filter?: WebhookFilter) { + return providerTrigger("shopify", "fulfillment.paid", filter); + }, + fulfillment_update(filter?: WebhookFilter) { + return providerTrigger("shopify", "fulfillment.update", filter); + }, + order_cancel(filter?: WebhookFilter) { + return providerTrigger("shopify", "order.cancel", filter); + }, + order_create(filter?: WebhookFilter) { + return providerTrigger("shopify", "order.create", filter); + }, + order_delete(filter?: WebhookFilter) { + return providerTrigger("shopify", "order.delete", filter); + }, + order_fulfill(filter?: WebhookFilter) { + return providerTrigger("shopify", "order.fulfill", filter); + }, + order_paid(filter?: WebhookFilter) { + return providerTrigger("shopify", "order.paid", filter); + }, + order_update(filter?: WebhookFilter) { + return providerTrigger("shopify", "order.update", filter); + }, + product_cancel(filter?: WebhookFilter) { + return providerTrigger("shopify", "product.cancel", filter); + }, + product_create(filter?: WebhookFilter) { + return providerTrigger("shopify", "product.create", filter); + }, + product_delete(filter?: WebhookFilter) { + return providerTrigger("shopify", "product.delete", filter); + }, + product_fulfill(filter?: WebhookFilter) { + return providerTrigger("shopify", "product.fulfill", filter); + }, + product_paid(filter?: WebhookFilter) { + return providerTrigger("shopify", "product.paid", filter); + }, + product_update(filter?: WebhookFilter) { + return providerTrigger("shopify", "product.update", filter); + }, +}); diff --git a/packages/surface/src/triggers/shortcut.ts b/packages/surface/src/triggers/shortcut.ts new file mode 100644 index 000000000..b9553b0e0 --- /dev/null +++ b/packages/surface/src/triggers/shortcut.ts @@ -0,0 +1,25 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const shortcut = Object.freeze({ + epic_create(filter?: WebhookFilter) { + return providerTrigger("shortcut", "epic.create", filter); + }, + epic_delete(filter?: WebhookFilter) { + return providerTrigger("shortcut", "epic.delete", filter); + }, + epic_update(filter?: WebhookFilter) { + return providerTrigger("shortcut", "epic.update", filter); + }, + story_create(filter?: WebhookFilter) { + return providerTrigger("shortcut", "story.create", filter); + }, + story_delete(filter?: WebhookFilter) { + return providerTrigger("shortcut", "story.delete", filter); + }, + story_update(filter?: WebhookFilter) { + return providerTrigger("shortcut", "story.update", filter); + }, +}); diff --git a/packages/surface/src/triggers/slack.ts b/packages/surface/src/triggers/slack.ts index 17bc258ad..1b420f9c7 100644 --- a/packages/surface/src/triggers/slack.ts +++ b/packages/surface/src/triggers/slack.ts @@ -10,6 +10,57 @@ export const slack = Object.freeze({ reaction_added(filter?: WebhookFilter) { return providerTrigger("slack", "reaction_added", filter); }, + channel_archived(filter?: WebhookFilter) { + return providerTrigger("slack", "channel.archived", filter); + }, + channel_created(filter?: WebhookFilter) { + return providerTrigger("slack", "channel.created", filter); + }, + channel_deleted(filter?: WebhookFilter) { + return providerTrigger("slack", "channel.deleted", filter); + }, + channel_member_joined(filter?: WebhookFilter) { + return providerTrigger("slack", "channel.member_joined", filter); + }, + channel_member_left(filter?: WebhookFilter) { + return providerTrigger("slack", "channel.member_left", filter); + }, + channel_renamed(filter?: WebhookFilter) { + return providerTrigger("slack", "channel.renamed", filter); + }, + channel_unarchived(filter?: WebhookFilter) { + return providerTrigger("slack", "channel.unarchived", filter); + }, + group_archived(filter?: WebhookFilter) { + return providerTrigger("slack", "group.archived", filter); + }, + group_deleted(filter?: WebhookFilter) { + return providerTrigger("slack", "group.deleted", filter); + }, + group_renamed(filter?: WebhookFilter) { + return providerTrigger("slack", "group.renamed", filter); + }, + group_unarchived(filter?: WebhookFilter) { + return providerTrigger("slack", "group.unarchived", filter); + }, + message_created(filter?: WebhookFilter) { + return providerTrigger("slack", "message.created", filter); + }, + message_deleted(filter?: WebhookFilter) { + return providerTrigger("slack", "message.deleted", filter); + }, + message_updated(filter?: WebhookFilter) { + return providerTrigger("slack", "message.updated", filter); + }, + reaction_removed(filter?: WebhookFilter) { + return providerTrigger("slack", "reaction.removed", filter); + }, + user_changed(filter?: WebhookFilter) { + return providerTrigger("slack", "user.changed", filter); + }, + user_joined(filter?: WebhookFilter) { + return providerTrigger("slack", "user.joined", filter); + }, mention(channel: string) { return providerTrigger("slack", "app_mention", { channel: triggerArgument(channel, "channel") }); }, diff --git a/packages/surface/src/triggers/stripe.ts b/packages/surface/src/triggers/stripe.ts new file mode 100644 index 000000000..f2aa26a00 --- /dev/null +++ b/packages/surface/src/triggers/stripe.ts @@ -0,0 +1,70 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const stripe = Object.freeze({ + charge_failed(filter?: WebhookFilter) { + return providerTrigger("stripe", "charge.failed", filter); + }, + charge_refunded(filter?: WebhookFilter) { + return providerTrigger("stripe", "charge.refunded", filter); + }, + charge_succeeded(filter?: WebhookFilter) { + return providerTrigger("stripe", "charge.succeeded", filter); + }, + charge_updated(filter?: WebhookFilter) { + return providerTrigger("stripe", "charge.updated", filter); + }, + customer_created(filter?: WebhookFilter) { + return providerTrigger("stripe", "customer.created", filter); + }, + customer_deleted(filter?: WebhookFilter) { + return providerTrigger("stripe", "customer.deleted", filter); + }, + customer_subscription_created(filter?: WebhookFilter) { + return providerTrigger("stripe", "customer.subscription.created", filter); + }, + customer_subscription_deleted(filter?: WebhookFilter) { + return providerTrigger("stripe", "customer.subscription.deleted", filter); + }, + customer_subscription_updated(filter?: WebhookFilter) { + return providerTrigger("stripe", "customer.subscription.updated", filter); + }, + customer_updated(filter?: WebhookFilter) { + return providerTrigger("stripe", "customer.updated", filter); + }, + invoice_created(filter?: WebhookFilter) { + return providerTrigger("stripe", "invoice.created", filter); + }, + invoice_finalized(filter?: WebhookFilter) { + return providerTrigger("stripe", "invoice.finalized", filter); + }, + invoice_paid(filter?: WebhookFilter) { + return providerTrigger("stripe", "invoice.paid", filter); + }, + invoice_payment_failed(filter?: WebhookFilter) { + return providerTrigger("stripe", "invoice.payment_failed", filter); + }, + invoice_updated(filter?: WebhookFilter) { + return providerTrigger("stripe", "invoice.updated", filter); + }, + invoice_voided(filter?: WebhookFilter) { + return providerTrigger("stripe", "invoice.voided", filter); + }, + payment_intent_canceled(filter?: WebhookFilter) { + return providerTrigger("stripe", "payment_intent.canceled", filter); + }, + payment_intent_created(filter?: WebhookFilter) { + return providerTrigger("stripe", "payment_intent.created", filter); + }, + payment_intent_payment_failed(filter?: WebhookFilter) { + return providerTrigger("stripe", "payment_intent.payment_failed", filter); + }, + payment_intent_requires_action(filter?: WebhookFilter) { + return providerTrigger("stripe", "payment_intent.requires_action", filter); + }, + payment_intent_succeeded(filter?: WebhookFilter) { + return providerTrigger("stripe", "payment_intent.succeeded", filter); + }, +}); diff --git a/packages/surface/src/triggers/teams.ts b/packages/surface/src/triggers/teams.ts new file mode 100644 index 000000000..e6d5a8aaf --- /dev/null +++ b/packages/surface/src/triggers/teams.ts @@ -0,0 +1,67 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const teams = Object.freeze({ + channel_created(filter?: WebhookFilter) { + return providerTrigger("teams", "channel.created", filter); + }, + channel_deleted(filter?: WebhookFilter) { + return providerTrigger("teams", "channel.deleted", filter); + }, + channel_updated(filter?: WebhookFilter) { + return providerTrigger("teams", "channel.updated", filter); + }, + chat_message_created(filter?: WebhookFilter) { + return providerTrigger("teams", "chat_message.created", filter); + }, + chat_message_deleted(filter?: WebhookFilter) { + return providerTrigger("teams", "chat_message.deleted", filter); + }, + chat_message_updated(filter?: WebhookFilter) { + return providerTrigger("teams", "chat_message.updated", filter); + }, + chat_created(filter?: WebhookFilter) { + return providerTrigger("teams", "chat.created", filter); + }, + chat_deleted(filter?: WebhookFilter) { + return providerTrigger("teams", "chat.deleted", filter); + }, + chat_updated(filter?: WebhookFilter) { + return providerTrigger("teams", "chat.updated", filter); + }, + member_created(filter?: WebhookFilter) { + return providerTrigger("teams", "member.created", filter); + }, + member_deleted(filter?: WebhookFilter) { + return providerTrigger("teams", "member.deleted", filter); + }, + member_updated(filter?: WebhookFilter) { + return providerTrigger("teams", "member.updated", filter); + }, + message_created(filter?: WebhookFilter) { + return providerTrigger("teams", "message.created", filter); + }, + message_deleted(filter?: WebhookFilter) { + return providerTrigger("teams", "message.deleted", filter); + }, + message_updated(filter?: WebhookFilter) { + return providerTrigger("teams", "message.updated", filter); + }, + reply_created(filter?: WebhookFilter) { + return providerTrigger("teams", "reply.created", filter); + }, + reply_deleted(filter?: WebhookFilter) { + return providerTrigger("teams", "reply.deleted", filter); + }, + reply_updated(filter?: WebhookFilter) { + return providerTrigger("teams", "reply.updated", filter); + }, + team_deleted(filter?: WebhookFilter) { + return providerTrigger("teams", "team.deleted", filter); + }, + team_updated(filter?: WebhookFilter) { + return providerTrigger("teams", "team.updated", filter); + }, +}); diff --git a/packages/surface/src/triggers/telegram.ts b/packages/surface/src/triggers/telegram.ts new file mode 100644 index 000000000..552b75bfb --- /dev/null +++ b/packages/surface/src/triggers/telegram.ts @@ -0,0 +1,82 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const telegram = Object.freeze({ + business_connection(filter?: WebhookFilter) { + return providerTrigger("telegram", "business_connection", filter); + }, + business_message(filter?: WebhookFilter) { + return providerTrigger("telegram", "business_message", filter); + }, + callback_query(filter?: WebhookFilter) { + return providerTrigger("telegram", "callback_query", filter); + }, + channel_post(filter?: WebhookFilter) { + return providerTrigger("telegram", "channel_post", filter); + }, + chat_boost(filter?: WebhookFilter) { + return providerTrigger("telegram", "chat_boost", filter); + }, + chat_join_request(filter?: WebhookFilter) { + return providerTrigger("telegram", "chat_join_request", filter); + }, + chat_member(filter?: WebhookFilter) { + return providerTrigger("telegram", "chat_member", filter); + }, + chosen_inline_result(filter?: WebhookFilter) { + return providerTrigger("telegram", "chosen_inline_result", filter); + }, + deleted_business_messages(filter?: WebhookFilter) { + return providerTrigger("telegram", "deleted_business_messages", filter); + }, + edited_business_message(filter?: WebhookFilter) { + return providerTrigger("telegram", "edited_business_message", filter); + }, + edited_channel_post(filter?: WebhookFilter) { + return providerTrigger("telegram", "edited_channel_post", filter); + }, + edited_message(filter?: WebhookFilter) { + return providerTrigger("telegram", "edited_message", filter); + }, + guest_message(filter?: WebhookFilter) { + return providerTrigger("telegram", "guest_message", filter); + }, + inline_query(filter?: WebhookFilter) { + return providerTrigger("telegram", "inline_query", filter); + }, + managed_bot(filter?: WebhookFilter) { + return providerTrigger("telegram", "managed_bot", filter); + }, + message(filter?: WebhookFilter) { + return providerTrigger("telegram", "message", filter); + }, + message_reaction(filter?: WebhookFilter) { + return providerTrigger("telegram", "message_reaction", filter); + }, + message_reaction_count(filter?: WebhookFilter) { + return providerTrigger("telegram", "message_reaction_count", filter); + }, + my_chat_member(filter?: WebhookFilter) { + return providerTrigger("telegram", "my_chat_member", filter); + }, + poll(filter?: WebhookFilter) { + return providerTrigger("telegram", "poll", filter); + }, + poll_answer(filter?: WebhookFilter) { + return providerTrigger("telegram", "poll_answer", filter); + }, + pre_checkout_query(filter?: WebhookFilter) { + return providerTrigger("telegram", "pre_checkout_query", filter); + }, + purchased_paid_media(filter?: WebhookFilter) { + return providerTrigger("telegram", "purchased_paid_media", filter); + }, + removed_chat_boost(filter?: WebhookFilter) { + return providerTrigger("telegram", "removed_chat_boost", filter); + }, + shipping_query(filter?: WebhookFilter) { + return providerTrigger("telegram", "shipping_query", filter); + }, +}); diff --git a/packages/surface/src/triggers/zendesk.ts b/packages/surface/src/triggers/zendesk.ts new file mode 100644 index 000000000..647740d07 --- /dev/null +++ b/packages/surface/src/triggers/zendesk.ts @@ -0,0 +1,34 @@ +// GENERATED by scripts/generate-triggers.mjs — do not edit. + +import { providerTrigger } from "../provider-trigger.js"; +import type { WebhookFilter } from "../triggers.js"; + +export const zendesk = Object.freeze({ + organization_created(filter?: WebhookFilter) { + return providerTrigger("zendesk", "organization.created", filter); + }, + organization_deleted(filter?: WebhookFilter) { + return providerTrigger("zendesk", "organization.deleted", filter); + }, + organization_updated(filter?: WebhookFilter) { + return providerTrigger("zendesk", "organization.updated", filter); + }, + ticket_created(filter?: WebhookFilter) { + return providerTrigger("zendesk", "ticket.created", filter); + }, + ticket_deleted(filter?: WebhookFilter) { + return providerTrigger("zendesk", "ticket.deleted", filter); + }, + ticket_updated(filter?: WebhookFilter) { + return providerTrigger("zendesk", "ticket.updated", filter); + }, + user_created(filter?: WebhookFilter) { + return providerTrigger("zendesk", "user.created", filter); + }, + user_deleted(filter?: WebhookFilter) { + return providerTrigger("zendesk", "user.deleted", filter); + }, + user_updated(filter?: WebhookFilter) { + return providerTrigger("zendesk", "user.updated", filter); + }, +}); diff --git a/packages/surface/tests/triggers-all-providers.test.ts b/packages/surface/tests/triggers-all-providers.test.ts new file mode 100644 index 000000000..c07c75521 --- /dev/null +++ b/packages/surface/tests/triggers-all-providers.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, it } from "vitest"; +import * as triggers from "../src/triggers/index.js"; +import { providerEventTypes } from "../src/triggers/index.js"; + +const identifier = (value: string): string => value.replaceAll(/[^A-Za-z0-9_$]/g, "_"); + +describe("trigger namespaces for every relayfile adapter", () => { + it("covers every provider the adapter catalog can deliver, not only slack and github", () => { + const providers = Object.keys(providerEventTypes); + expect(providers.length).toBeGreaterThanOrEqual(40); + for (const expected of ["github", "slack", "linear", "jira", "notion", "gitlab", "cloudflare", "ramp", "neon", "shortcut", "gmail", "hubspot", "azure-blob", "google-drive"]) { + expect(providers, expected).toContain(expected); + } + }); + + it("exports one frozen namespace per provider whose methods lower to that provider's registry events", () => { + for (const [provider, events] of Object.entries(providerEventTypes)) { + const namespace = (triggers as Record)[identifier(provider)] as Record { name: string; filter?: Record }>; + expect(namespace, provider).toBeDefined(); + expect(Object.isFrozen(namespace), provider).toBe(true); + const seen = new Map(); + for (const event of events) { + // Slack's `app_mention` is reachable through the `mention(channel)` shorthand only. + if (provider === "slack" && event === "app_mention") continue; + const name = identifier(event); + const method = namespace[name]; + expect(typeof method, `${provider}.${name}`).toBe("function"); + if (method === undefined) continue; + const source = method(); + expect(source.name).toBe(provider); + // Two upstream names can share an identifier (`reaction.added` vs + // `reaction_added`); the method belongs to exactly one of them, and the + // other stays subscribable through the registry. + const owner = seen.get(name) ?? (source.filter as { type: string }).type; + seen.set(name, owner); + expect([event, owner]).toContain((source.filter as { type: string }).type); + expect(source.filter).toMatchObject({ provider, type: owner }); + } + } + }); + + it("keeps hyphenated provider ids as valid identifiers and exact inbox names", () => { + expect(triggers.azure_blob).toBeDefined(); + expect(triggers.google_drive).toBeDefined(); + const source = triggers.azure_blob["file_created"]!(); + expect(source).toMatchObject({ kind: "webhook", name: "azure-blob", filter: { provider: "azure-blob", type: "file.created" } }); + }); + + it("gives catalog-only providers the plain filter signature", () => { + // linear ships no mapping YAML; its events come from KNOWN_TRIGGER_CATALOG. + const events = providerEventTypes.linear; + expect(events.length).toBeGreaterThan(10); + const first = events[0]!; + const source = triggers.linear[identifier(first) as keyof typeof triggers.linear]({ team: "ENG" } as never); + expect(source.filter).toEqual({ provider: "linear", type: first, payload: { team: "ENG" } }); + }); +}); diff --git a/packages/surface/tests/triggers-github-events.test.ts b/packages/surface/tests/triggers-github-events.test.ts index 67323b60f..948934223 100644 --- a/packages/surface/tests/triggers-github-events.test.ts +++ b/packages/surface/tests/triggers-github-events.test.ts @@ -3,9 +3,11 @@ import { github, providerEventTypes } from "../src/triggers/index.js"; describe("generated GitHub trigger vocabulary", () => { it("offers check_run and issue_comment with an action filter, like pull_request", () => { - expect([...providerEventTypes.github]).toEqual([ + // The adapter's own mapping supersedes the core fallback, so the vocabulary + // is a superset of the six fallback events; those six must always remain. + expect([...providerEventTypes.github]).toEqual(expect.arrayContaining([ "check_run", "issue_comment", "issues", "pull_request", "pull_request_review", "push", - ]); + ])); expect(github.check_run("completed").filter).toEqual({ provider: "github", type: "check_run", payload: { action: "completed" } }); expect(github.issue_comment("created").filter).toEqual({ provider: "github", type: "issue_comment", payload: { action: "created" } }); expect(github.issue_comment().filter).toEqual({ provider: "github", type: "issue_comment" }); diff --git a/scripts/generate-triggers.mjs b/scripts/generate-triggers.mjs index 2d60d9444..0b6bcc492 100644 --- a/scripts/generate-triggers.mjs +++ b/scripts/generate-triggers.mjs @@ -13,11 +13,40 @@ const { values } = parseArgs({ options: { 'out-dir': { type: 'string', default: join(root, 'packages/surface/src/triggers') }, check: { type: 'boolean', default: false }, } }); + +/** + * Three sources, applied in this order, each keyed by provider: + * + * 1. The core fallback mappings (`mappings/*.mapping.yaml` in the published + * `@relayfile/adapter-core`, or `packages/core/mappings` in a checkout). + * 2. Each adapter's own mapping (`mappings/adapters/*.mapping.yaml` in the + * package since adapter-core 0.5.26, or `packages//*.mapping.yaml` + * in a checkout). An adapter-local `webhooks:` block supersedes the core + * fallback for that provider as a whole, so `github.pull_request(action)` + * keeps its `extract`-derived signature. + * 3. The trigger catalog (`@relayfile/adapter-core/triggers`, + * `KNOWN_TRIGGER_CATALOG`), which every adapter feeds through + * `supportedEvents()` — the events the adapter actually delivers, whether + * or not it ships mapping YAML. A mapping's `webhooks:` block describes + * payload shape for some of those events, not the full set (gitlab maps + * 8 of the 47 it delivers), so catalog events are added to every provider + * with the plain `(filter?)` signature, and an event the mapping also + * declares keeps the mapping's `extract`-aware signature. + * + * Every provider a relayfile adapter can deliver therefore gets a namespace + * covering everything ingress will accept for it. + */ const mappings = new Map(); +/** provider → events declared by a mapping (they own their method names). */ +const declared = new Map(); +const catalogProviders = new Set(); const object = value => value !== null && typeof value === 'object' && !Array.isArray(value); const identifier = value => value.replaceAll(/[^A-Za-z0-9_$]/g, '_'); +// Names the surface already exports or the generator itself owns. +const RESERVED_NAMESPACES = new Set(['index', 'providerEventTypes', 'webhook', 'flow', 'schedule', 'default']); function readMappings(directory) { + if (!existsSync(directory)) return; for (const name of readdirSync(directory).sort()) { if (!name.endsWith('.mapping.yaml')) continue; const mapping = parse(readFileSync(join(directory, name), 'utf8'), { uniqueKeys: true }); @@ -32,32 +61,58 @@ function readMappings(directory) { && definition.extract.every(field => typeof field === 'string')), `Invalid extract: ${name}/${event}`); } // Adapter-local mappings supersede the core's fallback mappings as a whole. - mappings.set(provider, mapping.webhooks); + mappings.set(provider, { ...mapping.webhooks }); + declared.set(provider, new Set(Object.keys(mapping.webhooks))); + } +} + +function readCatalog(catalog) { + assert(object(catalog), 'Invalid trigger catalog'); + for (const [provider, events] of Object.entries(catalog)) { + assert(/^[a-z][a-z0-9-]*$/.test(provider), `Invalid catalog provider: ${provider}`); + assert(Array.isArray(events) && events.every(event => typeof event === 'string' && event.length > 0), + `Invalid catalog events: ${provider}`); + if (!events.length) continue; + const merged = mappings.get(provider) ?? {}; + const hadMapping = Object.keys(merged).length > 0; + // Union: a mapping-declared event keeps its signature; the rest of what + // the adapter delivers is added with the plain filter signature. + for (const event of events) if (!Object.hasOwn(merged, event)) merged[event] = {}; + mappings.set(provider, merged); + if (!hadMapping) catalogProviders.add(provider); } } if (values['adapters-dir']) { - const packages = join(resolve(values['adapters-dir']), 'packages'); - const core = join(packages, 'core/mappings'); - if (existsSync(core)) readMappings(core); + const adapters = resolve(values['adapters-dir']); + const packages = join(adapters, 'packages'); + readMappings(join(packages, 'core/mappings')); for (const entry of readdirSync(packages, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) { if (entry.isDirectory() && entry.name !== 'core') readMappings(join(packages, entry.name)); } + const catalog = join(packages, 'core/src/triggers/catalog.generated.json'); + if (existsSync(catalog)) readCatalog(JSON.parse(readFileSync(catalog, 'utf8'))); } else { - // Pinned SDK dependency includes the upstream mapping YAML in its npm tarball. - readMappings(join(dirname(require.resolve('@relayfile/adapter-core/package.json')), 'mappings')); + // Pinned SDK dependency includes the upstream mapping YAML and the trigger + // catalog in its npm tarball. + const core = dirname(require.resolve('@relayfile/adapter-core/package.json')); + readMappings(join(core, 'mappings')); + readMappings(join(core, 'mappings', 'adapters')); + readCatalog(require('@relayfile/adapter-core/triggers').KNOWN_TRIGGER_CATALOG); } assert([...mappings.values()].some(events => Object.keys(events).length), 'No webhook mappings found'); const header = '// GENERATED by scripts/generate-triggers.mjs — do not edit.\n'; +const mdHeader = '\n'; const files = new Map(); const exports = []; const registry = {}; const namespaces = new Set(); +const summary = []; for (const [provider, events] of [...mappings].sort(([a], [b]) => a.localeCompare(b))) { if (!Object.keys(events).length) continue; const namespace = identifier(provider); - assert(!namespaces.has(namespace) && !['index', 'providerEventTypes'].includes(namespace), `Provider name collision: ${provider}`); + assert(!namespaces.has(namespace) && !RESERVED_NAMESPACES.has(namespace), `Provider name collision: ${provider}`); namespaces.add(namespace); const methods = []; const names = new Set(); @@ -67,11 +122,26 @@ for (const [provider, events] of [...mappings].sort(([a], [b]) => a.localeCompar names.add(name); methods.push(code); }; - for (const event of eventNames) { + // Two upstream names can mangle to one identifier (slack publishes both + // `reaction.added` and `reaction_added`). A mapping-declared event owns the + // method; a catalog event that would collide with it gets no method but + // stays in the registry, so `flows check` and ingress still accept + // `webhook(provider, { provider, type })` for it. Two mapping-declared + // events colliding is still an error, as before. + const methodless = []; + const owned = declared.get(provider) ?? new Set(); + // Mapping-declared events first so they win any identifier collision. + const ordered = [...eventNames].sort((a, b) => (owned.has(b) ? 1 : 0) - (owned.has(a) ? 1 : 0) || a.localeCompare(b)); + for (const event of ordered) { const name = identifier(event); assert(/^[A-Za-z_$]/.test(name), `Invalid event identifier: ${event}`); + if (names.has(name) && !owned.has(event)) { methodless.push(event); continue; } const prefix = `providerTrigger(${JSON.stringify(provider)}, ${JSON.stringify(event)}`; - if (events[event].extract?.includes('action')) { + // An aggregate event (`pull_request`) whose mapping extracts `action` + // takes the action as its argument. An action-qualified name + // (`pull_request.edited`) already pins it, so it takes a plain filter even + // when the mapping extracts `action` for that variant too. + if (events[event].extract?.includes('action') && !event.includes('.')) { add(name, ` ${name}(action?: string) {\n return ${prefix}, action === undefined ? undefined : { action: triggerArgument(action, "action") });\n },`); } else { add(name, ` ${name}(filter?: WebhookFilter) {\n return ${prefix}, filter);\n },`); @@ -93,24 +163,35 @@ for (const [provider, events] of [...mappings].sort(([a], [b]) => a.localeCompar + `\nexport const ${namespace} = Object.freeze({\n${methods.join('\n')}\n});\n`); exports.push(`export { ${namespace} } from "./${provider}.js";`); registry[provider] = eventNames.sort(); + summary.push({ provider, namespace, events: eventNames.length, source: catalogProviders.has(provider) ? 'catalog' : 'mapping', methodless }); } files.set('index.ts', `${header}\n${exports.join('\n')}\n\n` + '/** Exact upstream event names, plus the generated Slack mention shorthand. */\n' + `export const providerEventTypes = Object.freeze({\n${Object.entries(registry).map(([provider, events]) => ` ${JSON.stringify(provider)}: Object.freeze(${JSON.stringify(events)} as const),`).join('\n')}\n});\n`); +files.set('PROVIDERS.md', `${mdHeader}# Provider trigger namespaces\n\n` + + `${summary.length} providers, ${summary.reduce((n, s) => n + s.events, 0)} events. ` + + '`mapping` rows come from the adapter\'s `webhooks:` block (payload-aware signatures); ' + + '`catalog` rows come from `KNOWN_TRIGGER_CATALOG` (`supportedEvents()`) only. Every provider also includes its catalog events, so the count is what ingress delivers.\n\n' + + '| Provider | Namespace | Events | Source | Registry-only events |\n|---|---|---:|---|---|\n' + + summary.map(s => `| \`${s.provider}\` | \`${s.namespace}\` | ${s.events} | ${s.source} | ${s.methodless.map(e => `\`${e}\``).join(', ')} |`).join('\n') + + '\n\nRegistry-only events share an identifier with another event of the same provider; subscribe with `webhook(provider, { provider, type })`.\n'); const destination = resolve(values['out-dir']); +const generated = name => /\.(?:ts|md)$/.test(name) && name !== 'README.md'; if (values.check) { - const actual = existsSync(destination) ? readdirSync(destination).filter(name => name.endsWith('.ts')) : []; + const actual = existsSync(destination) ? readdirSync(destination).filter(generated) : []; const stale = [...new Set([...files.keys(), ...actual])].filter(name => !files.has(name) || !existsSync(join(destination, name)) || readFileSync(join(destination, name), 'utf8') !== files.get(name)); assert.equal(stale.length, 0, `Generated triggers drifted: ${stale.join(', ')}`); } else { mkdirSync(destination, { recursive: true }); for (const name of readdirSync(destination)) { - if (name.endsWith('.ts') && !files.has(name) - && readFileSync(join(destination, name), 'utf8').startsWith(header)) rmSync(join(destination, name)); + if (generated(name) && !files.has(name)) { + const content = readFileSync(join(destination, name), 'utf8'); + if (content.startsWith(header) || content.startsWith(mdHeader)) rmSync(join(destination, name)); + } } for (const [name, content] of files) writeFileSync(join(destination, name), content); } -console.log(`${values.check ? 'Checked' : 'Generated'} ${files.size - 1} provider trigger modules`); +console.log(`${values.check ? 'Checked' : 'Generated'} ${summary.length} provider trigger modules`);