Compare commits

...

1088 Commits

Author SHA1 Message Date
Eric Allam 6fcfe6b62b Changeset: prerelease next packages 2023-03-13 12:26:47 +00:00
James Ritchie c593132663 Reimplemented the impersonation banner 2023-03-13 12:23:45 +00:00
Eric Allam ff7bdd7619 Add cloud related env vars to staging env 2023-03-13 11:41:40 +00:00
Eric Allam c229fa31fc Setup posthog site feedback widget 2023-03-13 11:28:22 +00:00
James Ritchie 632f76cbb9 Added the Org nav to the Repo Coming Soon page 2023-03-13 11:27:12 +00:00
Eric Allam 5dae509aa9 Fixed up a bunch of nav issues 2023-03-13 11:22:54 +00:00
James Ritchie 1b902dabfa Updated the repository coming soon page 2023-03-13 11:01:38 +00:00
Eric Allam a1043a3b28 Added coming soon page for the cloud hosting 2023-03-13 10:35:19 +00:00
James Ritchie 22c682bf4c Added a new Org side menu 2023-03-13 10:29:04 +00:00
Eric Allam 0b67b51ae4 Fix ESM error by dynamically importing ESM packages (chalk, terminal-link, etc.) 2023-03-12 20:35:57 +00:00
Eric Allam 1673d4527a Added KV store feature 2023-03-12 20:12:18 +00:00
James Ritchie 5e762a9cbf Moved request integration button to top right of page 2023-03-12 10:26:27 +00:00
Eric Allam 406be0107e A couple side menu fixes 2023-03-11 21:16:30 +00:00
James Ritchie 4ab4174cb2 Improved the layout of the settings page 2023-03-11 18:35:54 +00:00
James Ritchie 78e6ed9bfc Added some messaging for blank states 2023-03-11 18:27:31 +00:00
James Ritchie f813e59b0c Improved the state if you haven’t granted access to github yet 2023-03-11 18:16:26 +00:00
James Ritchie 2992a855f9 Added active states to the collapsed side menu 2023-03-11 17:53:28 +00:00
James Ritchie f172a0ee1a Added titles on hover for the compact menu 2023-03-11 17:38:15 +00:00
James Ritchie 3c74e4f5f6 organized imports 2023-03-11 17:38:04 +00:00
James Ritchie bf4eefe4fd Long titles now ellipsis in the menu header 2023-03-11 17:13:21 +00:00
James Ritchie 2e81d6fe20 Fixed page layouts when they have the secondary nav in them 2023-03-11 17:07:43 +00:00
James Ritchie 77f243a14a Fixed the app layout width 2023-03-11 16:37:46 +00:00
James Ritchie 4245c21248 Added a section title to the side menu 2023-03-11 16:37:35 +00:00
James Ritchie e6d276de03 Added a title to the top of the nav 2023-03-11 16:13:26 +00:00
Eric Allam 0e3c3a78d7 Add single run API endpoint 2023-03-11 15:39:34 +00:00
Eric Allam fa28005f40 Move around stuff for the new nav structure 2023-03-11 15:33:03 +00:00
Eric Allam c109a9f31c Add runs JSON endpoint 2023-03-10 18:38:46 +00:00
James Ritchie c1dd5e92fe Moved the github connect button to top right 2023-03-10 18:25:26 +00:00
James Ritchie 441183975c Updated the select repo page 2023-03-10 18:23:30 +00:00
Eric Allam 0f9c0a8d06 Improve the select repo experience a little bit 2023-03-10 17:58:32 +00:00
Eric Allam 5beba8f12e Fixes an issue where the trigger workflow ttl guard was preventing workflow runs from resuming after being disconnected 2023-03-10 17:58:32 +00:00
James Ritchie 9b7102605f Fixed the create new workflow page layout 2023-03-10 17:10:12 +00:00
James Ritchie 0618cd0d7a Improved the visibility of the copy CLI text button 2023-03-10 17:09:59 +00:00
James Ritchie bc7f11fb57 Improved the API Key messaging 2023-03-10 17:06:15 +00:00
James Ritchie 19d731eebb removed unused imports 2023-03-10 16:53:32 +00:00
James Ritchie e2b183bd96 Added better buttons to the header 2023-03-10 16:53:11 +00:00
James Ritchie 80709c5415 Improved button focus states 2023-03-10 16:52:54 +00:00
James Ritchie 22e3c7f5f2 Fixed height of AppBody 2023-03-10 16:38:37 +00:00
James Ritchie 843231c410 WIP Improving the side navigation for the app 2023-03-10 16:13:40 +00:00
James Ritchie 1a33bdd3ae Updated the side menu - removed redundant items 2023-03-10 16:13:40 +00:00
Eric Allam c0300c6bec Deal with project settings and environment vars, and disabling projects 2023-03-10 15:43:40 +00:00
James Ritchie bffa5ef0e2 Improvements to the Logs page 2023-03-09 18:52:31 +00:00
James Ritchie 4e95232d59 improved the markup for the deploy page info panel 2023-03-09 18:40:32 +00:00
James Ritchie ca64356f12 Select repo now has a state for ‘relevant’ 2023-03-09 18:38:25 +00:00
James Ritchie c2c1b0feb4 Improvement to the repo page 2023-03-09 16:30:06 +00:00
James Ritchie 57afaf1995 Improvements to the repo details panel 2023-03-09 16:05:27 +00:00
Eric Allam 4c965ed5a2 Fixed issue with pending project endlessly revalidating 2023-03-09 16:01:03 +00:00
James Ritchie 0462141e1b Improvements to the Overview and deploy pages 2023-03-09 15:52:29 +00:00
Eric Allam ce39397c57 Better format log dates 2023-03-09 15:39:07 +00:00
Eric Allam 55cb81f7af Implement the log page along with the log links 2023-03-09 15:31:38 +00:00
James Ritchie f7a4e69025 status icon improvements 2023-03-09 14:23:38 +00:00
Eric Allam 55ac0019b7 Couple tweaks to the logs 2023-03-09 14:22:35 +00:00
Eric Allam b87a3dd2ba More logging work and buttons for stoppping or cancelling a deployment 2023-03-09 14:02:03 +00:00
Eric Allam 41c751c081 Changing on logs are polled, and now polling for build logs as well 2023-03-09 14:01:28 +00:00
Eric Allam 1f34a22bd8 Update how we poll for logs and add build logs back in 2023-03-09 14:01:28 +00:00
James Ritchie 10ef03eee0 Coloured the log red if it’s an error 2023-03-09 13:17:33 +00:00
James Ritchie bef6de13db Added a new logs table 2023-03-09 13:10:29 +00:00
D-K-P bd356663cc Removed .dev from Acme 2023-03-09 11:53:01 +00:00
James Ritchie 1670c3e19b Compressed the info in the overview panel 2023-03-09 11:03:35 +00:00
James Ritchie aa35555356 Added a Stop button 2023-03-09 10:48:18 +00:00
James Ritchie 1520be20c4 Added a view build logs with disabled property 2023-03-09 10:33:03 +00:00
James Ritchie 9cd49a40d5 Show spinner if status is deploying, pending, building. Also added live reload indicator 2023-03-09 10:17:21 +00:00
James Ritchie d27f11e26c More status colour updates 2023-03-09 09:51:17 +00:00
James Ritchie 9aff64183b Updated status colours 2023-03-09 09:48:49 +00:00
James Ritchie 5e32c8498b New layout for the deployment page 2023-03-09 09:42:11 +00:00
Eric Allam bd2f2d442d Implement the select repo grouping by gtihub account 2023-03-09 09:11:27 +00:00
James Ritchie 328ff206d7 Updated deployListStatus 2023-03-09 09:07:25 +00:00
James Ritchie 774a0fe9e3 Added a Header 2023-03-08 20:52:23 +00:00
James Ritchie 3eb76739cc Added type=submit 2023-03-08 20:52:05 +00:00
James Ritchie f00f6ae1bd Improvements to the deployment overview page 2023-03-08 20:32:52 +00:00
James Ritchie 7798c0166d Added a set of icons, loading indicators and titles to use for the deployment status 2023-03-08 20:28:02 +00:00
James Ritchie 9c63687d56 Initial clean up of the deploy page 2023-03-08 20:28:01 +00:00
Eric Allam 28cad34c5f Deployment logs 2023-03-08 18:19:07 +00:00
James Ritchie 86d345bffc Improved the layout for the list of github repos 2023-03-08 15:07:15 +00:00
James Ritchie 9cdab61eaf Showing a conditional state if you have no repos connected yet 2023-03-08 14:00:37 +00:00
James Ritchie 48b35c47b4 Improvements to the Repository list 2023-03-08 13:00:57 +00:00
Eric Allam 349d7f38cc Added deploy and project list (live WIP) 2023-03-07 22:13:37 +00:00
Eric Allam 7cbc279407 Manual deploy and added a deployment version number 2023-03-07 16:24:32 +00:00
Eric Allam 301d500c3d Fixing the re-exporting of routes 2023-03-07 15:37:55 +00:00
Eric Allam 4150ba8786 If a repo is already in a project, then just link to it from the select repo page 2023-03-07 15:19:43 +00:00
Eric Allam f39bc44eec Projects
- Deploy a new VM when a push event comes through
- Live updating project overview page
2023-03-07 15:12:42 +00:00
Eric Allam 4fabd481e6 The repos that are included in a workflow are the most relevant repos 2023-03-07 15:12:42 +00:00
D-K-P a374338ac5 Added repo rename instructions to gh issues to slack / gh stars to slack 2023-03-07 10:05:33 +00:00
D-K-P a7337478d0 Added Resend queue jump instructions to the readme 2023-03-07 10:03:58 +00:00
James Ritchie a7b37e9f7b impersonate banner style fix 2023-03-03 15:14:35 +00:00
James Ritchie 48e0cff123 Lots of improvements to the app layout behaviour
Main improvements:

- You can have different footer if logged in or out
- Footers aren’t fixed to the bottom of the page if logged out
2023-03-03 15:14:35 +00:00
James Ritchie 8a4cc312a1 Templates and overview pages now viewable on logged in mobile 2023-03-03 15:14:35 +00:00
Eric Allam f008f803b8 Updating github app configuration works, and paginating all repos for an installation as well, and displaying a list of repos to deploy 2023-03-03 14:35:43 +00:00
Eric Allam b43224c353 Upgrade to remix v1.11.0 for streaming and defer support 2023-03-03 14:35:43 +00:00
Eric Allam 8bb9798ff4 Fire off an app installation callback 2023-03-03 14:35:43 +00:00
James Ritchie 86ae6f927a Fixed safari bug where h-full was shunting content off the screen 2023-03-03 11:53:35 +00:00
Eric Allam c0693ac508 Cleanup old github app stuff and octokit and prepare for installing new github app for cloud 2023-03-03 11:13:07 +00:00
Eric Allam ab512157a5 Added ability to patch all template repos and push the changes 2023-03-03 08:34:15 +00:00
Eric Allam 86475d4e3c Changeset: version (@trigger.dev/sdk v0.2.21) 2023-03-02 22:31:44 +00:00
Eric Allam c5084209eb Fix for metadata capture when using npm/yarn 2023-03-02 22:30:43 +00:00
Eric Allam eada69040c Bump notion 2023-03-02 22:30:43 +00:00
Eric Allam 6deabb21ba Bump notion 2023-03-02 22:30:43 +00:00
James Ritchie 2bb324752e Removed the Product Hunt Banner but kept it commented out for later 2023-03-02 18:05:59 +00:00
Eric Allam 174954511e Changeset: version (fixing integration package versioning) 2023-03-02 15:36:56 +00:00
Eric Allam 408bd6ddc8 Added a script to automatically update template repo @trigger.dev packages instead of having to do it manually 2023-03-02 15:34:53 +00:00
Eric Allam 1789d9d215 Use the caret semver for the SDK in all the other packages 2023-03-02 14:44:33 +00:00
Eric Allam f3ac17ad91 Use caret constraint for the sdk in airtable as well 2023-03-02 13:27:19 +00:00
Eric Allam 71d78805e7 Use a caret constraint for the SDK to prevent updating integration dependencies when the SDK bumps a minor version (github only) 2023-03-02 12:43:13 +00:00
Eric Allam 3012771a21 Remove unused argument 2023-03-02 12:29:56 +00:00
Eric Allam 5ec7198046 Send additional metadata about a workflow when initializing the host 2023-03-02 12:29:47 +00:00
D-K-P 60cb8d54c4 Added tooltips to sidebar and org page 2023-03-01 18:47:31 +00:00
D-K-P 9d7186eba5 Added sendgrid template 2023-03-01 17:42:32 +00:00
D-K-P 5401fa1acb Added basic cron template 2023-03-01 14:18:32 +00:00
Matt Aitken 79f21fd94e Fix for bad documentation url in Notion spec 2023-03-01 13:47:14 +00:00
James Ritchie fa7ec12434 Added a Product Hunt banner 2023-03-01 12:54:52 +00:00
Matt Aitken c6a668a5f6 Set is constant 2023-02-28 20:52:34 +00:00
Matt Aitken dd786845b7 Removed curly bracket from the end of the combined schema 2023-02-28 20:32:30 +00:00
Matt Aitken fee24168aa Revert "Added a save/cancel button for changing webhook secrets"
This reverts commit ce019c7b96.
2023-02-28 19:52:09 +00:00
Matt Aitken b344dfaaf8 Added the GitHub issue -> Notion template 2023-02-28 19:50:02 +00:00
James Ritchie ce019c7b96 Added a save/cancel button for changing webhook secrets 2023-02-28 18:19:22 +00:00
D-K-P 9a52afe1e2 Added new images for all the templates and increased their size on the template grid 2023-02-28 15:07:39 +00:00
Eric Allam 628726459a Added the supabase to loops template image 2023-02-28 15:04:44 +00:00
Matt Aitken 603c3953c6 Any action input that isn’t part of the params is put in the body 2023-02-28 14:27:55 +00:00
Matt Aitken 8a7795bd4d Don’t validate the action body 2023-02-28 14:27:55 +00:00
Matt Aitken 9202d3458a Added Notion production client id 2023-02-28 14:27:55 +00:00
Eric Allam fb98a4708f Added supabase to loops template 2023-02-28 14:07:04 +00:00
Matt Aitken b29039735b Fix for connection dropdowns only working for services (not the source) 2023-02-28 12:33:45 +00:00
Matt Aitken 4d5303b0ad Changeset version: @trigger.dev/notion@0.1.24 2023-02-28 12:33:45 +00:00
Matt Aitken c3f292a320 Changeset added: @trigger.dev/notion Far smaller SDK, by creating shared types 2023-02-28 12:33:45 +00:00
Matt Aitken cb414b448e Don’t generate intermediate schema 2023-02-28 12:33:45 +00:00
D-K-P 5ad6330868 Added discord > supabase image 2023-02-28 11:48:34 +00:00
Matt Aitken e8ee088f85 Generated Notion SDK 2023-02-28 11:13:45 +00:00
Matt Aitken 167b1d1db9 Generated Airtable 2023-02-28 11:06:44 +00:00
Matt Aitken a365b81915 Generated Sendgrid 2023-02-28 11:06:44 +00:00
Matt Aitken 697e8f930a Added Prettify to the inputs and outputs inline 2023-02-28 11:06:44 +00:00
Matt Aitken 0e0baa8af8 You can generate specific integrations now 2023-02-28 11:06:44 +00:00
Matt Aitken a82088c243 Autoreffer works deep to shallow so we get refs inside refs. Better auto-naming 2023-02-28 11:06:44 +00:00
Matt Aitken e4fc05924e Autoreffer now only refs after x occurences, works for string enums too 2023-02-28 11:06:44 +00:00
Matt Aitken b3a46212ee Generate the service and use the auto reffer, and output intermediate files for viewing 2023-02-28 11:06:44 +00:00
Matt Aitken dec790e4a3 AutoReffer improved 2023-02-28 11:06:44 +00:00
Eric Allam a146469d63 Fixed bug where a duplicate event ID would throw an error instead of returning a success 2023-02-28 09:35:19 +00:00
Matt Aitken e5a3bb8903 Automatically create references to de-duplicate objects 2023-02-27 23:12:45 +00:00
Matt Aitken b61b5054dc Type generator works with $refs 2023-02-27 23:12:35 +00:00
Matt Aitken b613f3bbfc Deal with undefined params where an endpoint has no input 2023-02-27 23:12:08 +00:00
Matt Aitken 800ae1d834 Added Notion to the list of packages 2023-02-27 23:11:53 +00:00
Matt Aitken d5d3786a97 Automatically set "Notion-Version" to "2022-06-28" so users don’t have to 2023-02-27 21:39:06 +00:00
Matt Aitken b90eeea1e8 Allow generating actions with some manipulation 2023-02-27 21:39:06 +00:00
Matt Aitken aa30013e05 Params go before body in the generated SDK 2023-02-27 21:39:06 +00:00
Matt Aitken eaf06638c3 Generating the docs and SDK now deals better with anyOf 2023-02-27 21:39:06 +00:00
Eric Allam 4834eabb9d Scroll restoration not working for some reason so need to do full reloads when going to a template page 2023-02-27 18:23:17 +00:00
Eric Allam 8aceb6418a Added supabase-to-discord template 2023-02-27 18:05:07 +00:00
Eric Allam da6062a20c Changeset: new version 2023-02-27 16:54:09 +00:00
Eric Allam b57241951b Fixed issue where default webhook schema wasn't being used which caused an error 2023-02-27 16:53:55 +00:00
Matt Aitken 6a1823b242 Installed packages 2023-02-27 15:12:45 +00:00
Matt Aitken 2ad039f867 Merge remote-tracking branch 'origin/integrations/notion' into dev
# Conflicts:
#	pnpm-lock.yaml
2023-02-27 15:12:17 +00:00
Matt Aitken 634ec6c1e3 Added Notion staging OAuth details 2023-02-27 15:11:38 +00:00
Matt Aitken a73ddb2dad Generated Notion SDK 2023-02-27 14:46:59 +00:00
Matt Aitken 0504667334 Combine allOf schemas before generating the types, much better results and docs 2023-02-27 14:46:41 +00:00
Matt Aitken 6d85eee0cd Generate the SDKs in sequence not parallel 2023-02-27 14:28:55 +00:00
Matt Aitken 1f43988ad9 Increased generate-integrations memory to 16GB… we need to optimise this at some point 2023-02-27 14:24:21 +00:00
Matt Aitken 0129cbb162 Generating docs works with allOf 2023-02-27 14:24:05 +00:00
Matt Aitken 0121e1b50d SDK input schema is now the merged object of params and body 2023-02-27 14:23:54 +00:00
Eric Allam 63b1c2237a Changeset: release new version 2023-02-27 14:03:29 +00:00
Eric Allam c72120eab0 Removed accidental log statement 2023-02-27 14:03:15 +00:00
Eric Allam 313b7163e8 Change from npm create trigger to npx create-trigger 2023-02-27 13:49:04 +00:00
Eric Allam b0e64937a0 Changeset: new version 2023-02-27 13:04:15 +00:00
Eric Allam 3a2cf0ddb7 Fixed the missing error message when logging invalid API key and improved the error message 2023-02-27 13:03:14 +00:00
Matt Aitken 0f90ea9455 getComments and createComment 2023-02-27 13:01:27 +00:00
Matt Aitken 6d2217bd18 updateDatabase 2023-02-27 12:48:39 +00:00
Eric Allam 1579cdbfb2 Changeset: release new version 2023-02-27 12:11:58 +00:00
James Ritchie f1e81137b7 Improved the copy for how to trigger your workflow 2023-02-27 12:10:50 +00:00
Matt Aitken 0f51328979 createDatabase 2023-02-27 12:03:43 +00:00
Matt Aitken aea812f621 queryDatabase 2023-02-27 11:59:45 +00:00
Eric Allam 45b2bea39f Changeset: version next.3 2023-02-27 11:35:08 +00:00
Eric Allam 4f47d03114 Added changeset 2023-02-27 11:35:08 +00:00
Eric Allam 618cca3304 Validate the API key (to better work with the templates and the CLI) 2023-02-27 11:35:08 +00:00
Matt Aitken 4fe573b397 getDatabase 2023-02-27 11:32:21 +00:00
Matt Aitken d338b95e7e deleteBlock 2023-02-27 11:26:28 +00:00
Matt Aitken 2d9bdb26d4 appendBlockChildren 2023-02-27 11:23:24 +00:00
Matt Aitken b660a4c07f Update block and get block children 2023-02-27 11:16:41 +00:00
James Ritchie 5706c3ab52 Improved the API information link 2023-02-27 11:14:46 +00:00
James Ritchie e8c81cafb8 Improved some of the Template’s title copy 2023-02-27 11:14:46 +00:00
Eric Allam a0d062c977 Changeset: version next.2 2023-02-27 11:10:06 +00:00
Eric Allam 87a3bbee8e Added a more helpful message when adding an API key 2023-02-27 11:09:38 +00:00
Matt Aitken 65aa6e4e4c Get block endpoint 2023-02-27 09:26:28 +00:00
Matt Aitken 0432a64357 Update page endpoint 2023-02-27 09:19:28 +00:00
Eric Allam a5ff50f737 Implement new API key sidebar and a couple other various fixes 2023-02-26 22:15:49 +00:00
James Ritchie 763dd8b55a Improved the environment panel in the side menu to be clearer 2023-02-26 19:10:06 +00:00
Matt Aitken c2eea6c2b6 Added todos with remaining endpoints 2023-02-26 18:56:07 +00:00
Matt Aitken 81bbae977f Fix for endpoints that return void 2023-02-26 18:53:25 +00:00
Matt Aitken 37bd8f4952 Separated the bot endpoint response so it doesn’t mess the SDK generation up 2023-02-26 18:47:10 +00:00
Matt Aitken 20d6c6fdfb Added typecheck to integrations 2023-02-26 18:37:11 +00:00
Matt Aitken ebc45b7f8d Fix for typecheck error in services 2023-02-26 18:37:05 +00:00
Matt Aitken 77f146210a Fixed generating successful responses schemas 2023-02-26 18:36:58 +00:00
Matt Aitken 18cb9c6bec Fix for badly named file 2023-02-26 18:36:40 +00:00
Matt Aitken dfd4966cb0 Removed validation when doing requests, changed the way we select the success/fail on a response 2023-02-26 18:24:13 +00:00
Matt Aitken d7384bf481 Nock file for creating a page 2023-02-26 18:23:25 +00:00
James Ritchie 9e5c687174 Improvements to the Org page api keys 2023-02-26 18:04:10 +00:00
James Ritchie dcbb0f5287 small padding fix 2023-02-26 17:54:52 +00:00
James Ritchie d64cfe5add Widened the pages displaying the Template grid 2023-02-26 17:40:21 +00:00
James Ritchie 1fa52f1c8c Added padding back to the template cards 2023-02-26 17:40:00 +00:00
Matt Aitken f7dfc712b5 Added content-type to the createPage spec 2023-02-26 17:37:47 +00:00
Matt Aitken 1cfb93ada9 Remove validation of the request body and params 2023-02-26 17:29:43 +00:00
James Ritchie ea28f3dd47 Added installation instructions to the npm copy button for a template 2023-02-26 17:29:00 +00:00
James Ritchie 2c563ce998 Improvements to the Container component for mobile 2023-02-26 17:28:31 +00:00
Matt Aitken 7437d9fbd6 Create page test – this crashes Node because the schema is so massive… 2023-02-26 17:27:11 +00:00
James Ritchie 7dd0102579 Fixed the public template page on mobile 2023-02-26 17:08:29 +00:00
Matt Aitken 16c152ec26 Updated Notion Nock files 2023-02-26 17:05:02 +00:00
James Ritchie 01bc7df3e2 Template Overview page sticky left column now works 2023-02-26 16:51:37 +00:00
Matt Aitken 92d4008cc2 Notion specs updated by pointing at new generated schemas. Tests passing. 2023-02-26 16:50:57 +00:00
James Ritchie 6d4f71d22c Improvements to the template grid 2023-02-26 16:46:01 +00:00
Matt Aitken 2770df644b Imported dependencies and formatted Notion schemas 2023-02-26 16:33:21 +00:00
James Ritchie cc002ef707 Increased the width of the template overview side column so you can see more package info 2023-02-26 16:06:38 +00:00
James Ritchie f552af517b Removed redundant class 2023-02-26 15:58:57 +00:00
James Ritchie 8aff958bd3 Copy fix 2023-02-26 15:57:06 +00:00
James Ritchie ad189b1f4b Improved the scroll bars on modals 2023-02-26 15:54:48 +00:00
Matt Aitken 7bebf919e2 Fixed imports and formatted some of the files 2023-02-26 15:39:43 +00:00
James Ritchie e54ba7cbed Improved the Create workflow page and moved some info into a modal 2023-02-26 15:39:10 +00:00
Matt Aitken 4b6e21d6d4 Split Notion schemas into more sensible sized files 2023-02-26 15:32:22 +00:00
Matt Aitken 21d70821de Massive Notion schema from SDK 2023-02-26 14:38:17 +00:00
Matt Aitken a4d3f1b61c Massive generated schema 2023-02-26 14:37:08 +00:00
Matt Aitken 42e297474c Delete old schemas 2023-02-26 14:37:00 +00:00
Matt Aitken a40afd55d2 Output the schema refs when generating a schema 2023-02-26 14:34:04 +00:00
Matt Aitken 621254d0ab Fleshed out the specs some more 2023-02-26 13:26:15 +00:00
Matt Aitken 0ff568843d make functions turn properties into optional 2023-02-26 13:26:03 +00:00
James Ritchie 1d056b5328 Updated the org page styles 2023-02-26 12:26:31 +00:00
Eric Allam cf7c413c87 Combine the workflow onboarding into one component and obfuscate the api key 2023-02-24 22:16:53 +00:00
Eric Allam ac87a634a3 Add in the apiKeys in the orgs list page, obfuscated, and obfuscate them in the SideMenu as well 2023-02-24 22:09:30 +00:00
Matt Aitken 1bc9bc9244 getPage is working 2023-02-24 19:18:35 +00:00
Matt Aitken 2fea9e5a6c Use a test Notion workspace so I can test all the integration features 2023-02-24 19:12:43 +00:00
Matt Aitken 2756bfe073 Notion search is working and performance is good (when a schema is cached) 2023-02-24 19:05:19 +00:00
Matt Aitken 165ca9cb0f Option to measure performance of validation and compiling 2023-02-24 19:04:46 +00:00
James Ritchie c9e411be9b Simplified the info on the template cards 2023-02-24 18:51:38 +00:00
James Ritchie ee4e181fc3 Added ability to copy env vars from the Org page 2023-02-24 18:51:38 +00:00
James Ritchie f51f8f3ece Added more styles to the copy text panel 2023-02-24 18:51:38 +00:00
Matt Aitken 840435284b Using ajv to compile on-demand and validate using JSON Schemas 2023-02-24 18:48:03 +00:00
D-K-P 12f4f3bc68 Changed blank starter and hello world images 2023-02-24 18:02:21 +00:00
Eric Allam 894a5dcb5d Pass through command flags 2023-02-24 17:58:05 +00:00
Matt Aitken d65ef5eb87 If schema validation fails on prod and it’s a 2xx status, let it through as a success and log validation error 2023-02-24 17:49:41 +00:00
Matt Aitken 71007b5f60 Added Sentry to the integrations service 2023-02-24 17:49:02 +00:00
Eric Allam 3af9b63a9c Changeset: release next.1 version 2023-02-24 17:34:09 +00:00
Eric Allam 0932ae7d89 Log out when a run first starts, as well as completes 2023-02-24 17:32:13 +00:00
Matt Aitken 43250c444e Added Notion database schema (748 lines 😳) 2023-02-24 17:14:28 +00:00
Eric Allam 12056d888b Update the docs for the new create-trigger cli 2023-02-24 16:36:50 +00:00
Eric Allam 63e004594c No workflows in the blank starter 2023-02-24 16:20:25 +00:00
James Ritchie ec3e98ca9f Updated the Orgs with more distinct icons 2023-02-24 16:12:48 +00:00
Matt Aitken 0ccc6d3729 Search is working with pages, but not databases yet 2023-02-24 16:12:05 +00:00
Eric Allam f3ffffd50b implement the New Workflow page and add the api key to the command to copy for templates and the main one 2023-02-24 15:59:34 +00:00
Eric Allam e6550d156e Convert basic starter to hello world and added isLive to templates to filter out the existing basic starter 2023-02-24 15:29:27 +00:00
James Ritchie ae550df37d Updated the Workflows Overview page if you have no workflows 2023-02-24 15:25:45 +00:00
James Ritchie 26ac1fa57c CopyText ignores default and propagation clicks 2023-02-24 15:25:45 +00:00
James Ritchie 14031a8c6e Title component now accepts className 2023-02-24 15:25:45 +00:00
James Ritchie 719ef2a3a9 Improved the grid template styles 2023-02-24 15:25:45 +00:00
Matt Aitken e779cff42a New nock responses 2023-02-24 15:05:07 +00:00
Matt Aitken 0b3c3758a7 Switched to using oauth for Notion 2023-02-24 15:05:00 +00:00
Matt Aitken ab351cbc8e Merge remote-tracking branch 'origin/nango-upgrade' into integrations/notion
# Conflicts:
#	apps/integrations/package.json
2023-02-24 14:56:06 +00:00
Matt Aitken dd4fc8c262 Added search endpoint but the current auth token is giving no results back 2023-02-24 14:54:56 +00:00
Matt Aitken a55acb6296 More page types and fixed Notion tests 2023-02-24 13:33:46 +00:00
Eric Allam aa295134ff Changeset: prerelease the next version 2023-02-24 13:29:36 +00:00
Eric Allam b2f14cbea3 Make the SDK a patch 2023-02-24 13:29:08 +00:00
Eric Allam 26e69cb659 Added cli changeset 2023-02-24 13:15:49 +00:00
Eric Allam 51f9bc9d72 Added handy links to the SDK when logging information about the workflows 2023-02-24 13:15:49 +00:00
Eric Allam 74a6a21c35 Adding the create-trigger CLI package 2023-02-24 13:15:49 +00:00
Matt Aitken 4cae6fed63 Added a lot more schemas for the page 2023-02-24 12:51:31 +00:00
James Ritchie b69058bfcb Style tweaks 2023-02-24 12:17:00 +00:00
James Ritchie 1c5d8a4c0b Updated the template page to include the npm copy panel, link to repo and docs 2023-02-24 11:53:48 +00:00
Matt Aitken 28c70ab9d1 Upgrade to the latest Nango – this will require a manual server migrate and testing 2023-02-24 11:34:29 +00:00
James Ritchie 15ab35c816 Added a new copy npm install values to the template cards 2023-02-24 11:31:51 +00:00
James Ritchie 1218320492 Added a new copy panel 2023-02-24 11:30:41 +00:00
Matt Aitken 9d65a1a2c3 Schema for page 2023-02-24 09:55:18 +00:00
Matt Aitken fc3e85f93e Made userId user_id instead. WIP on getPage 2023-02-24 09:55:12 +00:00
James Ritchie 80373c6874 Removed file for old steps 1, 2, 3 2023-02-24 09:54:22 +00:00
James Ritchie 590dd688a9 Fixed max width 2023-02-24 09:50:19 +00:00
James Ritchie f739f49209 First workflow onboarding step is now Choose a Template 2023-02-24 09:49:43 +00:00
James Ritchie dabf26c2c9 Added a message to Test page to make it clearer how to run tests 2023-02-24 09:37:30 +00:00
Matt Aitken 8252f3ef86 Revert "Using generated schemas…"
This reverts commit 7d78089275.
2023-02-24 08:32:15 +00:00
Matt Aitken 7d78089275 Using generated schemas… 2023-02-23 20:27:19 +00:00
Matt Aitken 5ae21f28c3 Removed log from typescript-to-json-schema generator 2023-02-23 20:26:57 +00:00
Eric Allam 173f88dcad Fixed the revalidator in the useEffect deps array causing tons of requests 2023-02-23 18:23:37 +00:00
Matt Aitken c2d8934820 Generate Schema TypeScript from TypeScript Types file 2023-02-23 16:32:22 +00:00
Matt Aitken 2edff18a59 Tool to generate TypeScript JSONSchemas from TypeScript types working 2023-02-23 13:56:59 +00:00
Matt Aitken fc94c78109 Work on generating schemas from TypeScript files 2023-02-23 13:46:40 +00:00
Eric Allam ee20f9212f Make the schema an optional param for customEvent and webhookEvent 2023-02-23 12:33:51 +00:00
Matt Aitken 77a99c226d WIP on Notion schemas… pages are complex 2023-02-23 12:07:26 +00:00
Matt Aitken 50921f1307 makeStringSchema: you can set a string as a const 2023-02-23 12:07:08 +00:00
James Ritchie 566fb54615 Fixed generic webhook panel not showing when it was connected 2023-02-22 17:57:47 +00:00
Eric Allam 100edb8abd Don’t require dotenv, instead use it in the dev command 2023-02-22 16:21:04 +00:00
Matt Aitken 160ab22f70 Added getBotInfo endpoint 2023-02-22 16:06:24 +00:00
Matt Aitken 0cf3ebfae3 First two Notion endpoints working with API key 2023-02-22 14:58:47 +00:00
Eric Allam 8cb08b63d2 Recreate the original changelog for generated packages 2023-02-22 12:47:15 +00:00
Matt Aitken 8767403a44 Notion authentication setup and first endpoint, but not tested yet 2023-02-22 12:43:13 +00:00
Matt Aitken 5f1ac75044 The CLI now deals with oauth with no scopes 2023-02-22 12:42:44 +00:00
James Ritchie 4f21aaef97 Removed Intercom 2023-02-22 11:30:52 +00:00
James Ritchie 8272363069 Added absolute path for the integrations link 2023-02-22 11:03:08 +00:00
James Ritchie 3e32802fdf Warp example infisical cmd fixed 2023-02-22 10:50:47 +00:00
James Ritchie 3e1c1138e5 Fix for integrations server env variables not being loaded on local 2023-02-22 10:50:31 +00:00
Matt Aitken 7d1e64cb01 WIP on API.fetch support 2023-02-22 09:47:21 +00:00
Matt Aitken 08abf25fd9 Added base url to services, for use by fetch 2023-02-22 09:46:49 +00:00
Matt Aitken 9c9a4caa20 Merge pull request #66 from triggerdotdev/features/new-overview-page
Improved overview page
2023-02-21 22:26:13 +00:00
Matt Aitken 352b7f75ce Installed packages 2023-02-21 22:22:04 +00:00
Matt Aitken f0378fa874 Fix for incorrect types (after merge) 2023-02-21 22:21:51 +00:00
Matt Aitken 8de37d47bf Renamed new example package to @examples/generic-webhook 2023-02-21 22:16:37 +00:00
Matt Aitken 23376457e6 Merge remote-tracking branch 'origin/dev' into features/new-overview-page
# Conflicts:
#	pnpm-lock.yaml
2023-02-21 22:13:42 +00:00
James Ritchie 75589d3bae Reduced prominence of connect api message 2023-02-21 21:35:07 +00:00
James Ritchie 96c4f319e4 Label positioned better 2023-02-21 21:30:14 +00:00
James Ritchie 8587841ee4 Made the test button less prominent 2023-02-21 21:27:30 +00:00
James Ritchie 058afb40ce Copy improvement 2023-02-21 21:18:41 +00:00
Eric Allam dc058c8835 Remove webapp dep on integrations server 2023-02-21 21:15:20 +00:00
James Ritchie f80253ed1d typography improvements 2023-02-21 21:13:19 +00:00
James Ritchie 3e384ff18a Show better copy in the How to trigger your workflow panel 2023-02-21 21:05:12 +00:00
James Ritchie db9b03ca05 Link to the org integrations page 2023-02-21 21:04:17 +00:00
James Ritchie cc6adecfb4 Only show the Create workflow run panel if a workflow or non-test runs have happened 2023-02-21 20:43:46 +00:00
James Ritchie 841421bf76 Made the concertina panels open when relevant 2023-02-21 20:36:02 +00:00
Matt Aitken f5ebde8ddb Changeset: release version 2023-02-21 16:27:10 +00:00
Matt Aitken da9e357b6d Added env vars to prod webapp 2023-02-21 16:23:18 +00:00
Matt Aitken cde0b7fcfe Increased the p-integrations resources 2023-02-21 16:21:50 +00:00
Matt Aitken 43f913e796 Prod flightcontrol for integrations 2023-02-21 16:14:54 +00:00
Matt Aitken 26ae66ad2a Add Airtable client_id for prod 2023-02-21 16:14:11 +00:00
Matt Aitken 88fe24ad67 Fix so integration requests can use api_key auth type 2023-02-21 15:53:25 +00:00
Matt Aitken da0ee481b8 Make staging webapp depend on integrations 2023-02-21 15:53:25 +00:00
Matt Aitken ff57a70a53 Added airtable to staging client ids 2023-02-21 15:53:25 +00:00
Matt Aitken 22ae2131a5 The internal CLI can now push API keys to Pizzly from our new integrations 2023-02-21 15:53:25 +00:00
Matt Aitken 5880d966ac serviceFetch basics working. Share some code with requestEndpoint 2023-02-21 15:53:25 +00:00
Eric Allam 9eeacee7c2 Fix: pass in the id from sendEvent through to the API call 2023-02-21 14:12:14 +00:00
D-K-P 6ced99fb02 Updated the healthcheck image 2023-02-21 13:12:14 +00:00
James Ritchie 28fb5d066f Updated the integrations link 2023-02-21 12:49:15 +00:00
James Ritchie 0d72b8e0c4 Added a custom webhook connection concertina 2023-02-21 12:47:51 +00:00
James Ritchie 547aab667d Added a custom plug icon 2023-02-21 12:47:20 +00:00
James Ritchie d744efdb26 Added a generic webhook example workflow 2023-02-21 12:47:07 +00:00
Matt Aitken 727a492e45 Don’t restrict access to /healthcheck 2023-02-21 12:12:28 +00:00
Matt Aitken 384752d36c Added generate script to integrations 2023-02-21 11:58:41 +00:00
Matt Aitken d699d38981 Changeset version – next: New integrations service compatibility 2023-02-21 11:51:13 +00:00
Matt Aitken 6b53aeb8c2 Changeset added: New integrations service compatibility 2023-02-21 11:49:55 +00:00
Matt Aitken b7ee8fd432 Revert "Changeset for new integrations service"
This reverts commit 5df5e30a7d.
2023-02-21 11:48:34 +00:00
Matt Aitken 8836aeae81 Latest pnpm lockfile 2023-02-21 11:46:24 +00:00
Matt Aitken 2748d9e9a6 Revert "Changeset version: created a pre-release 0.3.x"
This reverts commit 9e739a50b2.

# Conflicts:
#	apps/integrations/package.json
2023-02-21 11:45:17 +00:00
Matt Aitken f2a0f304af Removed @trigger.dev/sdk dependency from the integrations package.json 2023-02-21 11:43:01 +00:00
Matt Aitken 7659835541 Integrations docker frozen-lockfile again 2023-02-21 11:25:21 +00:00
James Ritchie 8862b563dd Added a “How to run your workflow” concertina 2023-02-21 11:22:35 +00:00
James Ritchie ed1c2da660 Added a permenant message about api connectiions 2023-02-21 11:22:13 +00:00
Matt Aitken 9e739a50b2 Changeset version: created a pre-release 0.3.x 2023-02-21 11:21:04 +00:00
Matt Aitken e4efed07e5 Improved changeset pre-release instructions and fixed a config issue 2023-02-21 11:20:47 +00:00
Matt Aitken 55644577ea no-frozen-lockfile 2023-02-21 11:17:01 +00:00
Matt Aitken 5df5e30a7d Changeset for new integrations service 2023-02-21 11:16:18 +00:00
Matt Aitken 43ceb44db9 Fixed Sendgrid version number 2023-02-21 11:16:03 +00:00
Matt Aitken 154294f86e Added more ignores to changeset config 2023-02-21 11:12:40 +00:00
Matt Aitken e20f7ba16a Installed packages 2023-02-21 11:12:35 +00:00
Matt Aitken be6954abf2 changeset config for generated-integrations 2023-02-21 11:00:17 +00:00
Matt Aitken 810996f26f Fix for type error with optional outpyt JSONSchema 2023-02-21 11:00:04 +00:00
Matt Aitken a7044511bb Doesn’t change the generated package.json file if it exists 2023-02-21 10:59:48 +00:00
Matt Aitken 0efbbece9e Changed version number for Airtable 2023-02-21 10:59:29 +00:00
Matt Aitken a38945ebcd Delete not-exported slack integration 2023-02-21 10:58:34 +00:00
James Ritchie a63ebd73fb Added a connection icon and fixed some concertina behaviour issues 2023-02-21 10:44:05 +00:00
Matt Aitken b34018eb17 Created integrations Dockerfile 2023-02-21 10:25:36 +00:00
Matt Aitken a6f9e1e35d Setup flightcontrol for integrations 2023-02-21 10:25:28 +00:00
Matt Aitken c7c5d407ef Added healthcheck 2023-02-21 10:25:00 +00:00
James Ritchie 0c6d98d353 Added margin between the sections 2023-02-21 10:19:16 +00:00
Matt Aitken f6ed5517c2 Merge branch 'features/new-integrations' into dev 2023-02-21 10:10:15 +00:00
Matt Aitken 4aae45ede2 WIP on integration.fetch 2023-02-21 10:09:56 +00:00
James Ritchie f969f03197 Now exporting the connection data for useConnectionSlots 2023-02-21 10:01:19 +00:00
James Ritchie cd8e85f85f Show hide the concertina panel for connecting the source 2023-02-21 09:29:50 +00:00
James Ritchie 3c27b3c40b Passed classnames props 2023-02-21 09:19:54 +00:00
Eric Allam 0a3b12d135 Make the private repo checkbox flipped to be public, and now it’s default private 2023-02-20 21:17:48 +00:00
Eric Allam aca332fffc Remove the testing instructions from the run local markdown 2023-02-20 21:09:27 +00:00
James Ritchie 350a60590d WIP adding a concertina menu to the main workflow panel 2023-02-20 18:24:06 +00:00
James Ritchie ad8a2f170a Improved the border style of the disconnected apis 2023-02-20 18:23:06 +00:00
D-K-P 67f6971601 Added github issues seed / md files 2023-02-20 17:49:59 +00:00
Eric Allam 695e4ca3f0 Split pulsar and the rest of the local docker services 2023-02-20 17:23:42 +00:00
D-K-P 4243b10683 Updated the template grid so it would preview on the signed in version better, and replaced the resend image 2023-02-20 17:10:52 +00:00
James Ritchie c9bd1812f4 Swapped over the workflow panel with the API panel 2023-02-20 17:10:18 +00:00
James Ritchie a117a3b534 APIs not connected get a red border treatment to make them stand out 2023-02-20 17:07:33 +00:00
James Ritchie 9e64f9d570 Copy changes to titles 2023-02-20 16:53:01 +00:00
D-K-P 823da44fb7 Added schedule healthcheck info 2023-02-20 16:21:32 +00:00
Matt Aitken a5a5dcbccb Generated SendGrid SDK 2023-02-20 15:35:09 +00:00
Matt Aitken e2693eb539 Removed $ref from SendGrid marketingContacts endpoint schema 2023-02-20 15:33:07 +00:00
Matt Aitken 036ffa7e5f Created marketingContacts endpoint 2023-02-20 15:23:52 +00:00
Matt Aitken 679ac99fad Added scopes to api_key authentication in the web app 2023-02-20 15:23:34 +00:00
Matt Aitken 9f6886c55b Added infisical config to the root 2023-02-20 13:45:28 +00:00
Eric Allam ad9089da57 Make sure only started runs are considered created 2023-02-20 13:43:58 +00:00
Eric Allam 9313adee12 Add the github access docs link and tweak copy 2023-02-20 13:29:07 +00:00
Matt Aitken 9bb8363643 Fix for typecheck issue 2023-02-20 13:27:11 +00:00
Matt Aitken 4e2fe3dcac Moved all presenters into the presenters folder 2023-02-20 13:25:46 +00:00
D-K-P 092b139d71 Added a second line to the github button on the template deploy page 2023-02-20 12:34:02 +00:00
Matt Aitken ab92e9515b Installed packages 2023-02-20 12:28:34 +00:00
Matt Aitken d4939c4e11 More fixes from mege conflict 2023-02-20 12:28:30 +00:00
James Ritchie ef3f075042 Added a missing noreferrer property 2023-02-20 12:26:01 +00:00
Matt Aitken c76d930f08 Fixing issues with service metadata 2023-02-20 12:22:32 +00:00
Matt Aitken 06f2fc3aeb Fix for bad import of WorkflowsPresenter 2023-02-20 12:12:13 +00:00
Matt Aitken 3cd4f2fb9f Merge remote-tracking branch 'origin/dev' into features/new-integrations
# Conflicts:
#	apps/webapp/app/env.server.ts
#	apps/webapp/app/models/integrations.server.ts
#	apps/webapp/app/models/organizationTemplatePresenter.server.ts
#	apps/webapp/app/models/templateListPresenter.server.ts
#	apps/webapp/app/models/templatePresenter.server.ts
#	apps/webapp/app/models/workflowListPresenter.server.ts
#	apps/webapp/app/models/workflowStartPresenter.server.ts
#	apps/webapp/app/models/workflowsPresenter.server.ts
#	apps/webapp/app/routes/__app/orgs/$organizationSlug/__org/index.tsx
#	apps/webapp/app/routes/__app/orgs/$organizationSlug/__org/workflows.new.tsx
#	pnpm-lock.yaml
2023-02-20 12:10:50 +00:00
D-K-P 8f011a5da3 Updated step 2 text so it’s clearer which route includes the repo templates 2023-02-20 11:59:50 +00:00
Eric Allam 067dbfc0cf Improved the template docs 2023-02-20 11:57:36 +00:00
Matt Aitken 8dfdfdb2fa Regenerated docs with default open on params 2023-02-20 11:52:08 +00:00
Matt Aitken 3b76574ef8 Make the params default open 2023-02-20 11:52:00 +00:00
Matt Aitken 3a0a6e491c Update SendGrid’s documentation 2023-02-20 11:48:48 +00:00
Matt Aitken 24203d1b8d Sanitize text for mdx (so we can display HTML tags on the page) 2023-02-20 11:48:37 +00:00
Matt Aitken 8da0f9ac01 Generated SendGrid SDK 2023-02-19 19:30:01 +00:00
Matt Aitken 011264865b Fixes for an optional body in the response 2023-02-19 19:29:52 +00:00
Matt Aitken 889d9910e2 SendGrid mailSend endpoint implemented 2023-02-19 19:18:23 +00:00
Matt Aitken 679239d9fc Added scopes to api_key authentication method 2023-02-19 19:18:08 +00:00
Matt Aitken 20d8493c3e Response body is optional 2023-02-19 19:17:56 +00:00
Matt Aitken fe598ff713 Add support for api_key authentication 2023-02-19 19:17:41 +00:00
Matt Aitken ac1354b71a Deal with validating when a schema is undefined or data is undefined 2023-02-19 19:17:27 +00:00
Matt Aitken 55f04d5d12 Fix for generateTypes test now we don’t format 2023-02-19 19:17:01 +00:00
Matt Aitken 3796ba5b07 Generated docs for Slack example and Airtable 2023-02-19 17:49:34 +00:00
Matt Aitken 86e1e7143f Generate docs with good support for oneOf and anyOf 2023-02-19 17:49:25 +00:00
Matt Aitken d32aa49020 output the response types 2023-02-19 17:27:38 +00:00
Matt Aitken 08338d15a5 Generate much nicer params 2023-02-19 17:09:46 +00:00
Matt Aitken 4b3c9b7230 Much better generated docs 2023-02-19 16:36:56 +00:00
Matt Aitken e84e43e4e1 Decent param field generation 2023-02-19 16:02:10 +00:00
Matt Aitken 584b12451d Started generating docs, with metadata first 2023-02-19 15:15:28 +00:00
Matt Aitken 0913a34174 Prepared code generation for docs 2023-02-19 14:58:41 +00:00
Matt Aitken e6d6bfced4 Newly generated SDKs using the new generator 2023-02-19 14:37:37 +00:00
Matt Aitken c7e926a8a9 Ignore missing patterns when linting 2023-02-19 14:36:09 +00:00
Matt Aitken 3ad8a0a5de Separate schema titles and descriptions so we get nice TypeNames and jsdocs 2023-02-19 14:35:58 +00:00
Matt Aitken 0d918e7bf6 Generate types by creating a combined schema 2023-02-19 14:35:27 +00:00
Matt Aitken 444996533f Deduplicated type definitions, but still has multiple interfaces 2023-02-19 13:48:51 +00:00
Matt Aitken 1b53ccbbac WIP on de-duplicating type definitions from generated SDK 2023-02-19 13:42:48 +00:00
Matt Aitken dbd4e9a68c Don’t format the types when creating them from schemas 2023-02-19 13:42:32 +00:00
Matt Aitken 0c36c3e16f When making schemas don’t add properties with undefined values, it messes up the Typescript generator 2023-02-19 12:53:27 +00:00
Matt Aitken 05af0ba2b5 Make multiple actions at once 2023-02-19 12:48:25 +00:00
Matt Aitken f2e341e753 Delete records and record 2023-02-18 17:26:27 +00:00
Matt Aitken 6e337eb144 Create mutiple and single records 2023-02-18 17:06:05 +00:00
Matt Aitken fd90e3c3d8 Update single record 2023-02-18 16:56:47 +00:00
Matt Aitken b969653f7c Added update/upsert records 2023-02-18 16:49:54 +00:00
Matt Aitken b5128abee0 listRecords is working 2023-02-18 16:26:34 +00:00
Matt Aitken 1f5053bcdb Reworked how nock works to allow updating 2023-02-18 16:07:57 +00:00
Matt Aitken 232b58daf1 Added listRecords endpoints with improvements to generating schemas 2023-02-18 15:17:50 +00:00
Matt Aitken d07a54f09b Airtable Field schema 2023-02-18 14:06:16 +00:00
Matt Aitken 2adea4cd9b Created an AirTable field schema 2023-02-18 12:30:18 +00:00
Matt Aitken 27e1d134f7 WIP Airtable schemas 2023-02-17 19:07:20 +00:00
Matt Aitken 92ca01f3c7 An easier way to write JSON Schemas 2023-02-17 19:05:48 +00:00
Matt Aitken c75181f10d Renamed the code that used open api specs 2023-02-17 19:05:25 +00:00
James Ritchie a26002c525 Improved the layout of the TemplateOverview 2023-02-17 18:45:22 +00:00
James Ritchie 5a3fdc470f The logo had a broken URL link in the marketing header 2023-02-17 17:06:00 +00:00
Matt Aitken 781a208c07 Merge pull request #60 from mv-turtle/main
Added infisical as one of the command in package.json
2023-02-17 16:12:26 +00:00
Matt Aitken 67eb592ecc Merge branch 'dev' into main 2023-02-17 16:11:20 +00:00
James Ritchie efc35c6c79 Added a Todo comment to make it clear the id needs to be unique 2023-02-17 16:03:36 +00:00
Eric Allam 65649c1fc7 Merge branch 'main' into dev 2023-02-17 14:35:49 +00:00
Matt Aitken 0fa59d9387 More code comments in the examples 2023-02-17 14:25:27 +00:00
Matt Aitken aa8cd86041 Improved GitHub star example with comments 2023-02-17 14:15:06 +00:00
Matt Aitken 165bd68d2d Added nice code comments to GitHub issues example 2023-02-17 14:15:06 +00:00
Eric Allam 9b664a1af2 Added the org template repo to the workflow overview page 2023-02-17 14:10:58 +00:00
Matt Aitken 3d174f5aeb Added code comments to the custom event 2023-02-17 13:52:05 +00:00
Matt Aitken b341e7bb71 Added code comments to the webhook example 2023-02-17 13:51:42 +00:00
Matt Aitken 1dc11a39ea Improved the WhatsApp example text 2023-02-17 13:36:48 +00:00
James Ritchie 970cfcb094 Improved the copy on step 6 of the existing repo journey 2023-02-17 13:35:55 +00:00
James Ritchie c33e228b26 Small improvement to the connected workflow message 2023-02-17 13:35:55 +00:00
Matt Aitken 6ba6e20026 Improved the Shopify example 2023-02-17 13:16:52 +00:00
Matt Aitken 81b2742577 Removed new user (Resend) example as it involves too much config for now 2023-02-17 12:25:40 +00:00
Matt Aitken ccadf08bd2 Set the from email to say Trigger.dev 2023-02-17 12:11:59 +00:00
D-K-P cea1291496 Removed title dupe 2023-02-17 12:05:15 +00:00
Matt Aitken 3e6b0c747b Workflow not connected to environment: Show a message on the overview page with basic help 2023-02-17 12:01:02 +00:00
Matt Aitken affcabc36f Workflow not connected to environment: hide test and runs pages 2023-02-17 12:01:02 +00:00
D-K-P 6732015b5c Updated the welcome email 2023-02-17 11:44:19 +00:00
Eric Allam cbb50a05ad Fixed issue with expiring user-to-server access tokens 2023-02-17 11:34:49 +00:00
Eric Allam 142fa85b14 Removed unnecessary log 2023-02-17 11:34:49 +00:00
James Ritchie 857ecf1de7 Gave the connected workflow more space 2023-02-17 11:24:24 +00:00
James Ritchie df6fe919c2 Added a Waiting to connect state to the Deploy step 2023-02-17 11:19:23 +00:00
James Ritchie 579e98c7af Copy updates to the new repo journey 2023-02-17 10:48:46 +00:00
James Ritchie 4724ef00fc Fixed Safari bug where template grid cards were really long and scrolling 2023-02-17 10:40:53 +00:00
James Ritchie 77e3769dbd Removed full stop 2023-02-17 10:40:53 +00:00
James Ritchie 70a547a5c5 Button arrow now uses a heroicon 2023-02-17 10:40:53 +00:00
Matt Aitken 3c8a3c421b Make it clear a request error comes from the API being called 2023-02-17 10:31:08 +00:00
Eric Allam 842ab0cdcc Ping the connection every second to try and keep it open through CloudFront 2023-02-17 09:11:13 +00:00
James Ritchie 64e0445acb Added a github icon to the external repo link 2023-02-16 20:50:25 +00:00
Eric Allam 213d86cb1f Improve run local instructions 2023-02-16 20:49:57 +00:00
Eric Allam 66805f67fa Call examples examples, not templates 2023-02-16 20:39:21 +00:00
Eric Allam 3defbcc0ed Fill in the correct API key in the run local docs 2023-02-16 20:23:12 +00:00
Eric Allam 942e695782 Fill in the ready to deploy api keys 2023-02-16 20:21:49 +00:00
James Ritchie 4a8b977a99 Remade the Deploy step layout 2023-02-16 20:03:31 +00:00
Eric Allam 2e9875c4c6 Add loading UI state when submitting add template form 2023-02-16 19:59:13 +00:00
Eric Allam ed775706a0 Use the installation_repositories.added webhook because repository.created wasn’t reliably being delivered 2023-02-16 19:42:36 +00:00
Eric Allam 89abb57e44 Changeset: new version 2023-02-16 19:14:49 +00:00
Eric Allam f264aaa16f Added = to the .env 2023-02-16 19:10:03 +00:00
Eric Allam 2f7caab661 Link workflows with their org templates if they exist (and improve the run local docs output) 2023-02-16 19:00:08 +00:00
James Ritchie c92fec9787 Made the github connect button bigger 2023-02-16 17:48:26 +00:00
D-K-P 9211cce807 fixed images so they’re bigger on the templates page and there isn’t a gap 2023-02-16 17:45:52 +00:00
Eric Allam 26c4f5d23c Move customize sections down to the bottom of the template markdown docs 2023-02-16 17:10:33 +00:00
Matt Aitken 4c9891de90 Have a max-height on the example code block 2023-02-16 17:02:19 +00:00
D-K-P 3c706723a2 Increased the image height to 36 2023-02-16 16:54:53 +00:00
Matt Aitken 6e3778d74e Created PanelLoading 2023-02-16 16:41:03 +00:00
Eric Allam 8a10431766 Use internal pulsar to define the webapp-events topic 2023-02-16 16:37:58 +00:00
Matt Aitken 825983db77 Add PostHog Sentry integration 2023-02-16 16:28:37 +00:00
James Ritchie a79ded125e minor improvement to image heights 2023-02-16 16:11:55 +00:00
James Ritchie e05b3d633d Removed scrolling from codeblock on the examples modal 2023-02-16 15:39:20 +00:00
Matt Aitken f659d9aec6 Don’t delete the nock snapshot when a test suite fails 2023-02-16 15:34:04 +00:00
Matt Aitken 1772b0664c Added requiredPackages to Resend example 2023-02-16 15:27:11 +00:00
Matt Aitken eca961a30f Text for previous option correct after templates 2023-02-16 15:26:28 +00:00
Matt Aitken c500155d60 Fixed resend example code 2023-02-16 15:22:41 +00:00
Matt Aitken f8957423e5 Changed text on example to “Use this example" 2023-02-16 15:22:41 +00:00
Matt Aitken 9da448a21b The code block now works with jsx/tsx 2023-02-16 15:22:41 +00:00
James Ritchie 8468db0a83 Fixed the required packages so they correctly display 2023-02-16 15:06:19 +00:00
James Ritchie f0d3b12d84 Fixed padding so it displays longer names on the examples buttons 2023-02-16 15:06:19 +00:00
James Ritchie ce5a42ccd7 Removed Zod from some of the required packages and corrected Whatsapp title 2023-02-16 15:06:19 +00:00
Eric Allam fc962f50c9 Create template repositories in a way that allows users to not give full access to their gitihub accounts to our github app 2023-02-16 15:01:46 +00:00
Matt Aitken 171d16ef41 If GitHub connect fails, show an error page and log out the params 2023-02-16 14:29:44 +00:00
Matt Aitken bec76a3704 Fix for channel instead of channelName being used in new user Slack example 2023-02-16 14:14:05 +00:00
Matt Aitken 3c403c4212 Removed strange capitilization from resend template 2023-02-16 14:03:38 +00:00
Matt Aitken 97e432462d Made the ensure it runs instructions a bit clearer 2023-02-16 13:49:31 +00:00
James Ritchie 4a2e0b28f4 Fixed links in the marketing header not working 2023-02-16 13:35:55 +00:00
James Ritchie fb496b1efa Changed the dangerouslySetInnerHtml from <code> back to <divs> to fix formatting 2023-02-16 13:22:48 +00:00
Matt Aitken 6c299072cd Fix for new user analytics event 2023-02-16 13:20:42 +00:00
Matt Aitken 25f70c4574 Added a “user created” event 2023-02-16 13:13:02 +00:00
James Ritchie 7f0ad4c18a Updated dangerouslySetInnerHtml to use <code> element and added the correct background colour 2023-02-16 12:51:44 +00:00
Matt Aitken 6c50ce078a Improved nock scripts, and setup for Airtable 2023-02-16 12:46:23 +00:00
D-K-P e8d018ef9d Made the templates overview responsive 2023-02-16 12:10:19 +00:00
Matt Aitken 9dc2ec4dca WIP on AirTable failing test 2023-02-16 12:10:05 +00:00
Matt Aitken 694df6ee38 Nock records and saves a successful run’s recording from tests 2023-02-16 12:08:35 +00:00
Matt Aitken c27987c191 Created a system to record successful test suite responses and load them on the next run 2023-02-16 11:50:35 +00:00
James Ritchie 19aedf8f73 Improved the final connected workfow step 2023-02-16 11:40:50 +00:00
D-K-P 4c219a8bf8 Template overview now has a responsive width 2023-02-16 11:35:08 +00:00
James Ritchie f30037da15 Improved message while waiting to connect github 2023-02-16 11:33:33 +00:00
James Ritchie df405aa740 Children not needed on the PanelInfo component 2023-02-16 11:33:33 +00:00
Eric Allam 7465d31e28 Improved the github stars markdown docs 2023-02-16 11:27:31 +00:00
D-K-P 2876946792 Added place-content-between to move services to bottom left 2023-02-16 11:24:57 +00:00
James Ritchie ae7c1c2cec TemplateCard now sits next to the steps on the new repo journey 2023-02-16 11:13:45 +00:00
James Ritchie 10b5558dbc Improved some of the information displayed in the new repo journey 2023-02-16 11:11:24 +00:00
Eric Allam 570683446c Updated template images 2023-02-16 10:52:21 +00:00
Eric Allam 29f3504a23 Improved the basic starter and resend markdown docs 2023-02-16 10:52:21 +00:00
James Ritchie 4bc156ce04 Improvements to the Cloud modal 2023-02-16 10:48:27 +00:00
James Ritchie c055c97209 Improvements to the modal so it’s more visible against the background 2023-02-16 10:48:01 +00:00
James Ritchie bc767516b6 Moved classes out of the card component to make it more reusable 2023-02-16 10:36:26 +00:00
James Ritchie 7a19bb8381 Template card locks to left side of the form 2023-02-16 10:32:38 +00:00
James Ritchie e742486677 Back button width fix 2023-02-16 10:16:33 +00:00
James Ritchie 821af448f3 Removed unused exports 2023-02-16 10:13:37 +00:00
James Ritchie 9db2e483ef Removed the title from the Overview page and added a back button 2023-02-16 10:13:05 +00:00
Eric Allam 277108d90c Implement cloud waitlist functionality 2023-02-16 10:08:06 +00:00
James Ritchie 49068d8db1 Fixed missbehaving layout on the examples modal 2023-02-16 09:53:07 +00:00
Eric Allam 3558a76e27 Implement correct flow on the templates.add route 2023-02-16 09:33:24 +00:00
Eric Allam fde3fec37f Setup the prod github app env vars 2023-02-16 09:13:00 +00:00
Eric Allam dabb17cf51 Move template doc files into the webapp 2023-02-16 08:49:59 +00:00
James Ritchie 7a8ad5f254 Right aligned the primary buttons 2023-02-15 21:02:13 +00:00
James Ritchie ab1d283217 centered text in button 2023-02-15 21:02:13 +00:00
D-K-P 7e80c5e7f6 removed maxHeight 2023-02-15 21:00:23 +00:00
D-K-P c5a5cef9f3 Redid the template overview fixes 2023-02-15 21:00:23 +00:00
James Ritchie f51aa7b792 Removed margin from the template grid component 2023-02-15 20:43:44 +00:00
D-K-P 9175d1e541 Import fix 2023-02-15 20:39:19 +00:00
James Ritchie 38fbf41e79 Improvements to the existing repo flow 2023-02-15 20:38:48 +00:00
James Ritchie 4bd3cabad4 Fixed the layout of the Connect another Github link 2023-02-15 20:18:07 +00:00
James Ritchie 6c9d31fe1c Removed the NoMobileOverlay on the public pages 2023-02-15 20:00:05 +00:00
James Ritchie c13c52aa05 Added a back button to the template section of the login page 2023-02-15 19:35:24 +00:00
Eric Allam 260bd5f007 Add github app env vars to staging webapp 2023-02-15 17:55:26 +00:00
Matt Aitken 25cf0245a4 Tidied up the mad nock reply 2023-02-15 17:48:45 +00:00
Matt Aitken 98cac166b3 Use nock to return from the API 2023-02-15 17:42:14 +00:00
Matt Aitken c2e9accade Moved the logger below express json 2023-02-15 17:41:55 +00:00
Eric Allam dc86fc2998 Merge pull request #61 from triggerdotdev/features/workflow-hosting
Feature: Easy to use templates with better onboarding
2023-02-15 17:40:36 +00:00
Eric Allam 7a6968d0ac Merge branch 'dev' into features/workflow-hosting
# Conflicts:
#	apps/webapp/app/components/LoginPromoPanel.tsx
#	apps/webapp/app/routes/__app/orgs/$organizationSlug.tsx
#	apps/webapp/app/routes/login.magic.tsx
#	apps/webapp/app/routes/login.tsx
#	apps/webapp/app/services/messageBroker.server.ts
2023-02-15 17:39:48 +00:00
Eric Allam 2c780c976e Added resend welcome drip campaign template 2023-02-15 17:19:09 +00:00
James Ritchie fbc1b86ea0 Added ability to pass in a size to the buttons - currently only supports “large” 2023-02-15 17:05:39 +00:00
D-K-P f20b29519a Padding / breathing space tweaks 2023-02-15 15:18:26 +00:00
D-K-P 3c7f6cf9ec Added primary buttons to the examples 2023-02-15 15:05:52 +00:00
Matt Aitken 1410688499 Added morgan logging to the integrations server 2023-02-15 14:57:38 +00:00
D-K-P d583e2a8f2 Added primary button to templateoverview 2023-02-15 14:52:35 +00:00
Matt Aitken a94c8e4576 Airtable example working 2023-02-15 14:51:14 +00:00
Matt Aitken 5fc1236d2e Added nock 2023-02-15 14:50:58 +00:00
Matt Aitken 3b67a5ce10 Remove unused integrations index file 2023-02-15 14:50:52 +00:00
D-K-P 016cf05aba Added templates copy 2023-02-15 14:45:40 +00:00
D-K-P 22c8a16758 Moved the image to the top left and sorted scrolling 2023-02-15 14:45:40 +00:00
D-K-P 0955a51333 Added bottom padding 2023-02-15 14:45:40 +00:00
D-K-P 8dc5bba8ca Reduced top margins on the templates page 2023-02-15 14:45:40 +00:00
James Ritchie 3538754a76 Updated the links in the marketing header 2023-02-15 14:41:28 +00:00
James Ritchie 8ef434eb13 Added a toxic style A button 2023-02-15 14:41:16 +00:00
James Ritchie 78ecfb60dc Hopful fix for google fonts not working 2023-02-15 14:40:46 +00:00
Matt Aitken 2acd79fb36 Fix so the integration actually responds 2023-02-15 14:08:59 +00:00
Matt Aitken 8d15e9a2b9 Created Airtable example 2023-02-15 14:01:29 +00:00
Matt Aitken d99446a1b2 Added descriptions to the response fields 2023-02-15 14:01:19 +00:00
Matt Aitken 7b24248b80 Deleted slackv2 example 2023-02-15 14:01:07 +00:00
D-K-P feafa69068 Updated the viewing runs image link in the readme 2023-02-15 14:00:36 +00:00
James Ritchie 91ed853747 Updated the login page with new template card style 2023-02-15 13:58:35 +00:00
Eric Allam 76737caa47 Remove basic starter title in desc 2023-02-15 13:56:15 +00:00
Eric Allam b480fa242a All dangerouslySetInnerHTML elements should not be p tags 2023-02-15 13:53:50 +00:00
Matt Aitken 192a1d2119 Made the Airtable fields a loose schema for now 2023-02-15 13:53:46 +00:00
Matt Aitken 2261a769e4 Deleted pointless generateService test 2023-02-15 13:49:59 +00:00
Matt Aitken 7e92e8cc75 Added Airtable to the catalog 2023-02-15 13:41:25 +00:00
Matt Aitken 5a312dec55 Fix generate test to point at slackv2 2023-02-15 13:41:06 +00:00
D-K-P a1535dff70 Added title and sub to the templates page 2023-02-15 13:38:35 +00:00
Eric Allam 4a00abed46 Add import code step to existing repo 2023-02-15 13:35:40 +00:00
Matt Aitken 15316a7504 Started work on Airtable 2023-02-15 13:29:15 +00:00
Eric Allam 039f652a41 Add another github connection button 2023-02-15 13:22:21 +00:00
Matt Aitken fa80ca07b7 Make the slack example not live 2023-02-15 13:22:20 +00:00
D-K-P f2cfa17b62 Added Poppins for the titles 2023-02-15 13:19:55 +00:00
Eric Allam 77124bba78 Sorted out connected to github 2023-02-15 12:58:17 +00:00
James Ritchie 7530400a38 Removed old template card 2023-02-15 12:42:31 +00:00
James Ritchie bfd8a4f6b8 Template card sits on the right and new states for login and configure 2023-02-15 12:42:30 +00:00
Eric Allam 4a72aff4ef Render the app header when logged in __public pages 2023-02-15 12:37:06 +00:00
Eric Allam 544b9b94c1 Implement “use this template” from the public page (either logged in or out) 2023-02-15 12:18:39 +00:00
James Ritchie 6b05b84342 Added a step number to the configure github step 2023-02-15 11:56:12 +00:00
James Ritchie 2ede12c2f3 Step numbers now have a complete state so they can show numbers in future steps rather than just a tick 2023-02-15 11:55:28 +00:00
Matt Aitken b142c55fc5 The DisplayProperties are now returned properly from the API 2023-02-15 11:55:06 +00:00
Matt Aitken 454bfcc58e Add the version info to a created IntegrationRequest 2023-02-15 11:54:37 +00:00
Matt Aitken eb98f50fca Get the display properties when creating an integration request 2023-02-15 11:54:06 +00:00
Matt Aitken 81ddf597ed Debugging the webapp should use infisical 2023-02-15 11:53:45 +00:00
Matt Aitken 75d6471c9e Created an example that uses the slackv2 integration 2023-02-15 11:53:30 +00:00
Matt Aitken 68544359f1 Generate the SDK with the correct endpoint name 2023-02-15 11:53:15 +00:00
James Ritchie 187c0279b2 Margin tweak 2023-02-15 11:24:40 +00:00
James Ritchie 98cf9afd8e Made the deployed workflow item more clickable 2023-02-15 11:23:30 +00:00
Matt Aitken 3ce5d5bf1a Include generated-integrations in the workspace 2023-02-15 11:18:38 +00:00
Matt Aitken f8ac05500a Renamed the new slack integration slackv2 2023-02-15 11:17:59 +00:00
Matt Aitken 23dbeff1c6 Added .template to the end of the template files so turbo doesn’t pick up on them 2023-02-15 11:10:07 +00:00
D-K-P ba0a4727d3 Moved the button to the top and fixed the padding 2023-02-15 11:00:15 +00:00
Eric Allam 54c5c82f22 Adding template list and template slug page to public pages 2023-02-15 10:46:39 +00:00
James Ritchie 6a3f26427b Small style tweaks 2023-02-15 10:41:30 +00:00
Matt Aitken 9db77b6478 Reverted workflowRunStep.server.ts 2023-02-15 10:37:05 +00:00
Matt Aitken 08ecd288e1 DisplayProperties stored on a run step and first read from there 2023-02-15 10:33:03 +00:00
James Ritchie 10ae5601f8 Added the floating template card 2023-02-15 10:29:43 +00:00
Eric Allam 9386e19620 Fill in the ConnectedToGithub stuff 2023-02-15 10:27:15 +00:00
Eric Allam 1df18b386a Better handle errors when trying to add a template to github account 2023-02-15 10:24:42 +00:00
Matt Aitken 83201312b2 The API won’t respond with services that aren’t live 2023-02-15 10:08:52 +00:00
Matt Aitken bfa096dc4a Services metadata being pulled from old and new systems 2023-02-15 09:54:34 +00:00
James Ritchie 81debee7aa Added a Github connected first step 2023-02-15 09:52:49 +00:00
Eric Allam 02499a0e63 Add the template card to template.add and template.id 2023-02-15 09:49:11 +00:00
Matt Aitken 558b705ace Added version to the Display properties are working for v1 integrations 2023-02-15 09:49:02 +00:00
Eric Allam 803b279133 Fill in actual data to the configured github state 2023-02-15 09:38:00 +00:00
Matt Aitken 4874288db0 Added icon to the services API json 2023-02-15 09:26:50 +00:00
Matt Aitken 30c0984623 Make the api use v2 (as v1 was the old integrations system) 2023-02-15 09:23:14 +00:00
Vladyslav Matsiiako 1b675968f6 Added infisical as one of the command in package.json 2023-02-14 19:46:36 -08:00
Eric Allam e58b7ada83 Filled in the run local docs 2023-02-14 22:03:32 +00:00
Matt Aitken a96bfd3528 The display properties endpoint is working 2023-02-14 20:20:55 +00:00
D-K-P a47a9b4fd6 Styled the start from scratch modal 2023-02-14 18:45:54 +00:00
D-K-P 727ec22fee Styled the examples overview modal 2023-02-14 18:45:54 +00:00
Matt Aitken c359962b3a Removed logging in the auth middleware 2023-02-14 18:45:35 +00:00
Matt Aitken 7bc11fe41f Added test for action displayProperties and made a fix 2023-02-14 18:44:24 +00:00
James Ritchie 7af88c33da Made the fields all consistently styled 2023-02-14 18:42:02 +00:00
Matt Aitken 108bb6281e Added displayProperties functionality to the endpoints/actions 2023-02-14 18:39:29 +00:00
James Ritchie 88ff526b87 Added blank deploy state to configure github state 2023-02-14 18:37:17 +00:00
James Ritchie b88eaa2c40 Import cleanup 2023-02-14 18:30:39 +00:00
James Ritchie a46b93e29d Updated to the deploy state 2023-02-14 18:23:38 +00:00
James Ritchie 1f672d9612 Made classNames available on the WorkflowList 2023-02-14 18:23:38 +00:00
Eric Allam d489311371 Run locally, not self host (WIP run local docs) 2023-02-14 18:14:46 +00:00
Eric Allam af29669003 Fill out some github-stars-to-slack template data 2023-02-14 17:59:59 +00:00
James Ritchie 8f32446170 Added a modal to the deploy section 2023-02-14 17:35:10 +00:00
James Ritchie 7f6e03b776 Improvements to the deploy state 2023-02-14 17:11:28 +00:00
Matt Aitken 140d02f462 WIP getting the new integrations working with the old ones 2023-02-14 16:54:13 +00:00
Matt Aitken 6a3ffa6395 Added authentication middleware to the integrations service 2023-02-14 16:53:49 +00:00
James Ritchie f6363ab5b6 Added a deploy skeleton state 2023-02-14 16:42:36 +00:00
James Ritchie 60ac029220 Added a disabled button state 2023-02-14 16:42:36 +00:00
Eric Allam 1f3eb459c4 Added runLocalDocs for templates 2023-02-14 16:37:19 +00:00
Eric Allam 9388b5bbed Added markdown syntax highlighting for the template documentation 2023-02-14 16:33:30 +00:00
Eric Allam 047b011fdd Run db:seed when deploying (so needs to be safe in prod) 2023-02-14 15:59:54 +00:00
Eric Allam fa470462c4 Implement the “existing repo” flow 2023-02-14 15:46:02 +00:00
Matt Aitken d807421b40 Migrated the metadata format 2023-02-14 15:39:59 +00:00
Matt Aitken b2bd170a2c Downgraded vitest in the webapp because it caused typecheck issues 2023-02-14 15:39:43 +00:00
Matt Aitken e013c6faa9 Renamed slug to service 2023-02-14 15:09:46 +00:00
Matt Aitken d60e9ae939 Renamed IntegrationMetadata to ServiceMetadata 2023-02-14 15:09:00 +00:00
Matt Aitken 8039f326a9 Created an IntegrationsClient that’s used to communicate with the integrations service 2023-02-14 15:04:45 +00:00
Matt Aitken 259e28e13a Removed old todo 2023-02-14 15:04:27 +00:00
James Ritchie 103f77215c margins adjustment 2023-02-14 14:58:55 +00:00
James Ritchie 967b8b0053 Updated the deployed state 2023-02-14 14:56:16 +00:00
Matt Aitken 974033d5d2 Don’t export the service metadata type 2023-02-14 14:52:51 +00:00
Matt Aitken 84bd5a63a2 Added API key auth type 2023-02-14 14:52:35 +00:00
D-K-P f0a05ab4e3 Moved the integration icons to the bottom 2023-02-14 14:43:21 +00:00
D-K-P 805f675264 Padding now fixed if there are / aren’t API logos 2023-02-14 14:36:41 +00:00
Matt Aitken dfab30c901 Endpoint that returns information about the services 2023-02-14 14:33:58 +00:00
Matt Aitken 8f5474072f Added live flag to service 2023-02-14 14:33:29 +00:00
D-K-P 056bab7233 Fixed padding issue on the grid 2023-02-14 14:32:16 +00:00
James Ritchie 08c7a04b61 Updated layout for ready to deploy state 2023-02-14 14:14:36 +00:00
James Ritchie f2a96a1535 tweaked styles 2023-02-14 14:14:36 +00:00
D-K-P abc113701c Fixed styling on the grid and overview pages 2023-02-14 14:13:02 +00:00
Matt Aitken fb6953bc1d Actually we’re going to cache using connection + service 2023-02-14 13:58:54 +00:00
Matt Aitken 8a6467f4c8 The namespace for the cache includs connection id and workflow id
Connections are used across workflows, so there was a chance the same key could have been fighting
2023-02-14 13:57:14 +00:00
Matt Aitken 581068362f The integration service now returns the response in the format the webapp is expecting 2023-02-14 13:44:03 +00:00
Matt Aitken 011d7d5611 Added retryableStatusCodes to a service 2023-02-14 13:43:24 +00:00
Matt Aitken caac573a64 Added version and made response schema optional for SDK requests 2023-02-14 12:35:24 +00:00
Matt Aitken 39d02e6d00 Added the integrations service to the example Warp config 2023-02-14 12:33:17 +00:00
Matt Aitken 1e1da62b32 The API for integrations is now versioned, accepts params and build credentials 2023-02-14 12:32:21 +00:00
Eric Allam d67ab54d55 WIP on the “New Repo” side of the workflows/new flow 2023-02-14 12:24:26 +00:00
James Ritchie 8e5938cd0c Styling for the github configuration forms 2023-02-14 11:35:10 +00:00
James Ritchie 16d89c4b79 added optional classname to input component 2023-02-14 11:34:21 +00:00
James Ritchie bf9e269ff3 Changed the error to a panel warning 2023-02-14 10:12:25 +00:00
Matt Aitken a5190693c8 Use __trigger so we don’t have to change the webhooks and introduce incompatibility 2023-02-13 23:08:13 +00:00
Matt Aitken de5b2ca3d8 Add metadata to slack post message 2023-02-13 23:02:29 +00:00
Matt Aitken 5c8fc8188a Passing the cache through to requests, it’s working. Made the expected request metadata specific 2023-02-13 22:52:01 +00:00
Matt Aitken 5949c98748 Created Postgres schema with cache table and PostgresCacheService 2023-02-13 22:40:44 +00:00
Matt Aitken 4f7a8f6ae0 Created a VS Code workspace 2023-02-13 22:05:57 +00:00
Matt Aitken c01bc15622 Allow metadata to be passed to the integrations API 2023-02-13 22:05:39 +00:00
Matt Aitken 027f0210dc The input is validated and results are coming back! 2023-02-13 21:44:18 +00:00
James Ritchie da155d1378 Added a modal for the cloud hosting option 2023-02-13 19:11:12 +00:00
Matt Aitken 38f32f405f Progress on action api endpoint 2023-02-13 18:24:36 +00:00
James Ritchie 0fee3ceae5 Blank example now has a modal 2023-02-13 18:20:10 +00:00
James Ritchie 710003ebdf Added modals for the webhook, custom event etc cards 2023-02-13 18:09:00 +00:00
Matt Aitken 76a2c82d9f Fixes for CommonJS in express and tests failing because of access token 2023-02-13 17:59:17 +00:00
James Ritchie 1be2af9309 Example modal update 2023-02-13 17:50:15 +00:00
James Ritchie cdbae933b2 Exported types from sample data 2023-02-13 17:44:39 +00:00
James Ritchie 7f2c9687b7 Created an examples overview with modal 2023-02-13 17:44:39 +00:00
James Ritchie 721a32a379 Moved modal into the examples component 2023-02-13 17:44:39 +00:00
James Ritchie 2424de07ac Added typography and forms tailwind packages 2023-02-13 17:44:39 +00:00
Eric Allam 179afbbcb3 More work on the org template page (added workflows list) 2023-02-13 17:02:52 +00:00
Matt Aitken 4d6963f0e7 Added target node16 to tsup 2023-02-13 16:37:41 +00:00
Matt Aitken 73fb0f3c0d Added explicit returns types because tsup was complaining 2023-02-13 16:37:26 +00:00
D-K-P 4ed486ef93 Styled the template overview button 2023-02-13 16:18:31 +00:00
Matt Aitken 9751531cc1 Watch mode working properly with the action endpoint 2023-02-13 16:14:43 +00:00
Matt Aitken 313a8c59cf First commit of WIP generated Slack SDK 2023-02-13 16:14:31 +00:00
Matt Aitken 76c660f167 eslint ignore build folder 2023-02-13 16:10:04 +00:00
Matt Aitken 3d5bbf899e Got integrations express server up and running 2023-02-13 15:54:36 +00:00
James Ritchie 460e8aa4a7 Fixed layout issues and added a max height 2023-02-13 15:16:46 +00:00
Matt Aitken 62ab7e098d Generate integrations in the correct folder 2023-02-13 15:03:02 +00:00
D-K-P c4a441129b modal and grid updates 2023-02-13 14:57:10 +00:00
Matt Aitken 63486d21c4 Renamed command to generate-integrations 2023-02-13 14:57:09 +00:00
Matt Aitken fbdc3c799d Created the generated-integrations folder with a Readme 2023-02-13 14:56:55 +00:00
Matt Aitken fc1dd44f39 Added the new integrations system into the mono-repo 2023-02-13 14:48:12 +00:00
James Ritchie 8a1517bc7f Removed old step 2023-02-13 14:38:46 +00:00
D-K-P fb0ecb8c34 Added overflow-scrolling and fixed side bar 2023-02-13 14:37:30 +00:00
James Ritchie c091bc3326 Added a modal to the template cards 2023-02-13 14:36:51 +00:00
Eric Allam c27bdf6308 Added markdownDocs to Template 2023-02-13 14:21:21 +00:00
James Ritchie 007dc2d713 Removed styling around templateoverview 2023-02-13 14:16:07 +00:00
D-K-P ba868cbd40 Pushed markdown in the templatesdata file 2023-02-13 14:13:56 +00:00
Eric Allam 030844d905 Live update created org templates using SSE and useRevalidator. Updated remix to v1.10.1 2023-02-13 14:12:17 +00:00
James Ritchie 36e25a85f8 Blank ExampleOverview file 2023-02-13 13:52:53 +00:00
James Ritchie 4b0d03f9cc Passing in template data 2023-02-13 13:52:53 +00:00
D-K-P d6c6c71268 Added markdown to templatesoverview 2023-02-13 13:52:08 +00:00
James Ritchie 6117bcf7eb Used the existing diaglog component and added a close icon 2023-02-13 13:10:36 +00:00
D-K-P e1fb69fe44 Removed close button 2023-02-13 12:09:58 +00:00
James Ritchie bf5621b716 Added a basic modal to existing repo step 3 2023-02-13 12:00:55 +00:00
James Ritchie 1c9be1ee1d Moved misplaced imports up to the top 2023-02-13 12:00:55 +00:00
James Ritchie a020dfa036 Added @trigger.dev/sdk to the required packages 2023-02-13 12:00:55 +00:00
D-K-P 2e28bd09ca Layout for template overview 2023-02-13 11:29:52 +00:00
D-K-P 6595535b40 Added template grid and updated data 2023-02-13 11:29:52 +00:00
James Ritchie a7eac27b98 Added a blank example as the first option in the list 2023-02-13 10:33:46 +00:00
James Ritchie b98bae8588 ‘Choose an example’ now shows all the options styled into cards 2023-02-13 10:27:51 +00:00
James Ritchie 90a582f6ad Improved the tertiary link colour 2023-02-13 10:26:44 +00:00
James Ritchie c41c2e8725 Turned the old templates page into a placeholder for now 2023-02-13 09:34:18 +00:00
James Ritchie ed4d6846f7 Merged installing the packages into 1 step and added a new step 6 2023-02-12 17:51:48 +00:00
James Ritchie 952e584d68 Full workflow for existing repo 2023-02-12 16:26:00 +00:00
James Ritchie f178629b9d WIP adding new steps for the existing repo journey 2023-02-11 11:42:16 +00:00
James Ritchie eb2741708a Button tweak 2023-02-11 11:13:41 +00:00
James Ritchie fce24cc7fa Previous steps now links 2023-02-11 10:38:45 +00:00
James Ritchie 1ca8760868 Improved wording and styling 2023-02-11 10:19:03 +00:00
James Ritchie ffcdc763eb Added a cloud coming soon message 2023-02-11 10:06:31 +00:00
Matt Aitken bacd76c8e5 Improved .env.example 2023-02-10 20:05:41 +00:00
Matt Aitken cf04c3902f Added pnpm run idev command for running the webapp with Infisical secrets injected 2023-02-10 19:56:17 +00:00
James Ritchie c4ba591df0 Copy update to fix step 2 2023-02-10 19:30:53 +00:00
James Ritchie ef8431b292 Step numbers now have an active green state 2023-02-10 19:24:11 +00:00
Eric Allam b2290e3bc0 Get deploy to render working with the templates with the button pointing to the correct url 2023-02-10 18:15:18 +00:00
James Ritchie 1bb2ebc7bc Created a Template step by step guide page 2023-02-10 17:27:01 +00:00
James Ritchie 0193327f5d Added a new Overview page 2023-02-10 17:27:01 +00:00
James Ritchie 431079c894 Exported the step numbers 2023-02-10 17:27:01 +00:00
Eric Allam cc6a37bdf6 Add a specific template, and remove installations when getting the installations.delete github webhook 2023-02-10 16:51:38 +00:00
Eric Allam 9539138992 WIP creating template repos in github accounts 2023-02-10 15:24:47 +00:00
Matt Aitken dee2db231a Merge pull request #57 from triggerdotdev/dev
Workflow run created event now has the `environmentType` property
2023-02-10 14:20:04 +00:00
Matt Aitken 5e99b28ea5 Report the environment type on a workflow run event (live or development) 2023-02-10 14:18:42 +00:00
James Ritchie 038d53c7c5 Added templates data file 2023-02-10 14:11:21 +00:00
James Ritchie ad1f9346b8 Removed un-used tailwind config values 2023-02-10 13:50:06 +00:00
Eric Allam ddfce4e3c7 GitHub app installation 2023-02-10 13:07:41 +00:00
Matt Aitken 8a73e559e8 Merge pull request #56 from triggerdotdev/dev
Fixed all linting issues, almost all unused imports or type imports
2023-02-10 10:25:11 +00:00
Matt Aitken ad26302925 Fixed all liniting issues, almost all unused imports or type imports 2023-02-10 10:23:05 +00:00
Matt Aitken 2a20546e7b Merge pull request #55 from triggerdotdev/dev
Added WebHook examples for first workflow tests
2023-02-10 10:22:45 +00:00
Matt Aitken 137db98176 Removed unused GitHub example object 2023-02-10 10:21:18 +00:00
James Ritchie 94154bd96c Pricing link goes to the correct URL 2023-02-10 10:16:56 +00:00
James Ritchie c34a28b2d5 Added toxic and acid colours and button to the app 2023-02-10 10:12:03 +00:00
Matt Aitken 79622b6123 GitHub webhook schema fixes 2023-02-10 09:56:47 +00:00
Matt Aitken d329aca7e5 Added WhatsApp examples 2023-02-10 09:56:34 +00:00
D-K-P a347e5526f Added placeholder image 2023-02-09 20:50:09 +00:00
Matt Aitken 5328ba1556 Added GitHub examples that are shown on test page 2023-02-09 20:33:28 +00:00
James Ritchie 7d12d3242e Added toxic and acid colours to the app 2023-02-09 18:36:18 +00:00
James Ritchie 706024841a Added the marketing site header to the app template page 2023-02-09 18:36:18 +00:00
Matt Aitken 6e5695f873 Removed unused import 2023-02-09 17:52:02 +00:00
Matt Aitken 565aba4021 Merge pull request #54 from triggerdotdev/dev
Analytics updates (orgs, workflows and runs)
2023-02-09 17:50:50 +00:00
Matt Aitken 5a10e53de6 Merge pull request #53 from triggerdotdev/analytics
Analytics events implemented on client and server for common events
2023-02-09 16:50:59 +00:00
D-K-P c927342da3 Added basic grid layout 2023-02-09 16:45:33 +00:00
Matt Aitken 862eeb89d5 POSTHOG_PROJECT_KEY env variable for flightcontrol.json in staging
"fromParameterStore": "/Prod/webapp/POSTHOG_PROJECT_KEY"
2023-02-09 16:42:15 +00:00
Matt Aitken b88ad37b92 Turn client-side analytics logging off 2023-02-09 16:36:00 +00:00
Matt Aitken 5ff4b68bae Pass properties for new events 2023-02-09 16:35:53 +00:00
Matt Aitken a7107cf1b1 Add runCount to user properties 2023-02-09 16:04:06 +00:00
Matt Aitken 6132cdf8c0 Removed workflow run completed event 2023-02-09 15:47:50 +00:00
Matt Aitken d39fb33c70 Workflow created and Workflow run created 2023-02-09 15:47:03 +00:00
James Ritchie 5e7ff78f23 Setting up basic structure and components for the new Templates 2023-02-09 15:21:10 +00:00
James Ritchie 05289d0cb1 Merge pull request #52 from triggerdotdev/dev
The side menu now only shows the workflows tab if you have 0 workflows
2023-02-09 15:06:22 +00:00
Matt Aitken 7dbc634388 Tidied up imports 2023-02-09 14:19:59 +00:00
Matt Aitken d58add78bf Org, Workflow, Environment events sending from frontend 2023-02-09 14:10:00 +00:00
James Ritchie 0c8448c65d The side menu now only shows the workflows tab if you have 0 workflows 2023-02-09 12:55:47 +00:00
Matt Aitken eed039319e Identify workflow and remove unused environment slug 2023-02-09 11:06:42 +00:00
Matt Aitken 3542c0ed87 Identify user, organization and environments 2023-02-09 10:58:18 +00:00
Matt Aitken 162c0f5db5 Identify user’s on the backend when they login/sign up 2023-02-09 09:01:56 +00:00
Matt Aitken 5f649d1b2e Moved postAuthentication actions into a separate file 2023-02-09 08:48:39 +00:00
Matt Aitken e261149065 Reworked PostHog client implementation 2023-02-08 20:51:05 +00:00
Eric Allam 5f3d985b64 Merge pull request #51 from triggerdotdev/dev
Very simple admin area to assist with user support
2023-02-08 10:18:28 +00:00
Eric Allam 283f6d6be6 Added a very simple admin section to assist in user support 2023-02-08 09:50:36 +00:00
James Ritchie 7d1b4e71a5 Made the horizontal scrollbar visible 2023-02-07 18:17:32 +00:00
Eric Allam 29b4ba4c78 Merge pull request #50 from triggerdotdev/dev
Feb 7 2023 - Safer SDK and added log feedback
2023-02-07 15:17:42 +00:00
Eric Allam cab222ac4b Changeset:verion Feb 7 2023 2023-02-07 14:45:03 +00:00
Eric Allam 667a60a551 Remove uploading source maps to sentry for now 2023-02-07 14:42:18 +00:00
Eric Allam 710bcc2c47 Handle errors when calling listen and provide some log feedback 2023-02-07 14:40:59 +00:00
D-K-P d1d34da9b2 Added a link to the self-hosting guide GH issue from the readme 2023-02-07 12:56:29 +00:00
James Ritchie 0c476093d7 Fix for the time not displaying correctly 2023-02-07 12:46:55 +00:00
James Ritchie ba2c895e53 Smaller icon 2023-02-07 11:36:57 +00:00
James Ritchie 764dd21613 Added a refresh button when a run is in progress 2023-02-07 11:08:03 +00:00
Eric Allam 78c3e1060d Try and get sourcemaps uploading 2023-02-07 10:20:16 +00:00
Eric Allam 96a180f26e Add sentry env vars to the staging webapp 2023-02-07 09:44:57 +00:00
Eric Allam 35718033bd Upload source maps to sentry during Docker build 2023-02-07 09:29:15 +00:00
Eric Allam 5501a927bf Update to latest @sentry/remix package 2023-02-07 09:29:15 +00:00
D-K-P 17568a0aec Made the code font smaller and reduced the left padding 2023-02-06 21:59:44 +00:00
D-K-P 563a535b56 Added notion / openai integration logos 2023-02-06 21:59:12 +00:00
Matt Aitken 2a2652d3aa Removed docs. They now live in the triggerdotdev/docs repo 2023-02-06 19:07:09 +00:00
Matt Aitken aca9081e64 Added internal packages to the CLI tsconfig 2023-02-06 17:12:33 +00:00
Eric Allam ccd89d08d9 Merge pull request #49 from triggerdotdev/dev
Feb 6 2023 Release
2023-02-06 15:45:07 +00:00
Eric Allam d9ad006550 Changset: created release version 2023-02-06 15:29:08 +00:00
Eric Allam eacee88f45 Prefill the API key on start from scratch examples 2023-02-06 15:25:37 +00:00
Eric Allam 51432feb74 Fixed issue with lastRunAt being null 2023-02-06 15:11:23 +00:00
Eric Allam 2398f85081 Added initial roadmap 2023-02-06 15:04:25 +00:00
Eric Allam b1fb567c28 Added changelog docs 2023-02-06 14:50:11 +00:00
Eric Allam 8c89ed3334 Document including tsx files when using jsx-slack 2023-02-06 14:50:11 +00:00
James Ritchie 32b9dbcf94 Removed console.log 2023-02-06 14:43:58 +00:00
James Ritchie 7d84f59c1e Fixed the info panel on overview page 2023-02-06 14:35:58 +00:00
James Ritchie d22ef06525 Updated the information panel to include an optional message 2023-02-06 14:35:05 +00:00
James Ritchie 595df9ae62 Settings page now shows the workflow 2023-02-06 14:21:40 +00:00
James Ritchie ceb862f484 Step numbers on onboarding slightly smaller 2023-02-06 13:52:21 +00:00
James Ritchie 49846df811 Display warning message on Settings page if API needs connecting 2023-02-06 13:49:57 +00:00
James Ritchie 5fec008f09 Fixed broken primary connect api button 2023-02-06 13:49:57 +00:00
James Ritchie 90f8b088ff Copy update 2023-02-06 13:49:57 +00:00
James Ritchie a1d464325d Updated the panel when you don’t have any runs yet 2023-02-06 13:49:57 +00:00
James Ritchie a17442b016 Improved how the Warning panel works so it can include an optional button 2023-02-06 13:49:57 +00:00
Eric Allam cb3b068fab Added slack view submission interaction event docs 2023-02-06 13:49:29 +00:00
Eric Allam 26a5913734 Added docs for slack.openView 2023-02-06 13:09:05 +00:00
James Ritchie 078beb1689 Made the NEW badge less clumsy looking 2023-02-06 12:56:01 +00:00
James Ritchie 05a2f6f8e1 New copy added 2023-02-06 12:42:39 +00:00
James Ritchie 7fc6358e40 Layout shuffle to include a line between each step 2023-02-06 12:42:39 +00:00
James Ritchie 70ce15b271 Visual tweak to onboarding 2023-02-06 12:42:39 +00:00
James Ritchie 97b0019d99 Layout improvements to onboarding 2023-02-06 12:42:39 +00:00
Matt Aitken c419101750 WhatsApp is available to everyone 2023-02-06 11:57:58 +00:00
Matt Aitken fdb2944380 Changeset: created a version with WhatsApp import problem fixed 2023-02-06 11:52:41 +00:00
Matt Aitken 13b6d96f8c Changeset: Switch to main mode and created fix for WhatsApp import of internal file 2023-02-06 11:51:53 +00:00
Matt Aitken feae0b3c08 WhatsApp package was linking to the sdk/index file 2023-02-06 11:51:53 +00:00
Matt Aitken 64854b128f Added scripts and documentation for doing pre-release changeset versions 2023-02-06 11:51:53 +00:00
Eric Allam 46fc33ca15 Downgrade mintlify to 2.0.16, add more to blockActionInteraction, and fix pnpm install commands 2023-02-06 10:45:08 +00:00
Matt Aitken f02eeb0af9 Changeset:pre enter next 2023-02-06 09:22:59 +00:00
Matt Aitken f95938d2ac Changeset:add Initial WhatsApp 2023-02-06 09:21:31 +00:00
Eric Allam c3f2f61982 Added some additional slack docs (WIP, still need to cover views and view interactions) 2023-02-05 21:54:29 +00:00
Eric Allam 124751e62a Fixed the sendEvent API ref page and update mintlify to 2.0.17 2023-02-05 20:36:07 +00:00
Eric Allam 81569eb66e Added some additional info about why users should use our fetch over the platform fetch 2023-02-05 20:30:07 +00:00
Matt Aitken 66d959282d Improved the message when you have no runs 2023-02-03 18:30:29 +00:00
Matt Aitken b0a06f8a9d “NEW” banner only displays for workflows without runs 2023-02-03 17:28:53 +00:00
Matt Aitken 07f0144354 Downgraded remix back to previous version 2023-02-03 17:28:32 +00:00
James Ritchie 11beadfb7d Fixed success panel layout 2023-02-03 16:54:11 +00:00
Matt Aitken 54faa44e84 Added Intercom back 2023-02-03 16:52:48 +00:00
Matt Aitken f121a48466 Run install 2023-02-03 16:44:13 +00:00
Matt Aitken 92436308c0 Merge remote-tracking branch 'origin/dev' into onboarding
# Conflicts:
#	apps/webapp/package.json
#	pnpm-lock.yaml
2023-02-03 16:43:20 +00:00
James Ritchie 8ba20d8fa3 Updated the Connect Workflow layout 2023-02-03 16:40:35 +00:00
Matt Aitken 92a37ae3a5 Fix for Remix hydration issues 2023-02-03 16:36:16 +00:00
Matt Aitken db9d9d93df Fis for missing key in map 2023-02-03 16:36:16 +00:00
Matt Aitken 506dfe6860 Attempt at using remix-island to fix React 18 issues 2023-02-03 16:36:16 +00:00
Matt Aitken 813c3622e9 Updated remix and added remix-island 2023-02-03 16:36:16 +00:00
James Ritchie d0208e698b Scrollbars hidden on carousel 2023-02-03 16:24:08 +00:00
Eric Allam 2a51c5a1a3 Generate fake test data from custom and webhook event schemas 2023-02-03 16:19:49 +00:00
Matt Aitken ee9125ff02 Add a button to check for new workflows and if there are any link to the workflow 2023-02-03 15:41:59 +00:00
James Ritchie 6caadf5da5 Added a NEW badge for a workflow 2023-02-03 14:44:47 +00:00
James Ritchie c98b7c4e24 Title fixes 2023-02-03 14:21:57 +00:00
James Ritchie 489c40c847 Examples tabs now a carousel 2023-02-03 14:19:43 +00:00
Eric Allam 0d2d9a043c Implement runOnce and runOnceLocalOnly functions 2023-02-03 13:50:59 +00:00
James Ritchie 9bb9c1cdbe Updated tabs style 2023-02-03 13:32:09 +00:00
James Ritchie 81d6fbfdaa Changed the Create New Workflow component to be inline 2023-02-03 13:23:40 +00:00
James Ritchie b72d63bdd2 Moved inline tab style to new component 2023-02-03 13:23:40 +00:00
James Ritchie 1319651079 Consolidated duped Tabs component 2023-02-03 13:23:40 +00:00
Matt Aitken f6fbd5e5b7 Remove logging of the Slack interactivity payload 2023-02-03 12:51:44 +00:00
Matt Aitken 9d5e24dac5 Added code comments to the WhatsApp to Slack example 2023-02-03 12:51:36 +00:00
D-K-P 4ad2702e4d remove line number from prism 2023-02-03 12:41:12 +00:00
D-K-P 2a2da8fa7a Changed icon colour to rose 2023-02-03 12:41:12 +00:00
James Ritchie 64ccb0cf11 Updated the create new workflow buttons at the bottom of the workflow list 2023-02-03 12:28:04 +00:00
D-K-P 8b3abd6a06 Updated samples and removed packagesCopy and testCode sections 2023-02-03 12:26:42 +00:00
Matt Aitken 63b3d82c2f Repeat the original message in the modal so you have context 2023-02-03 12:24:34 +00:00
Matt Aitken 358e9af01d Exposed more types from the WHatsApp Integration 2023-02-03 12:24:17 +00:00
James Ritchie f9cab846b9 Removed final step 2023-02-03 12:23:07 +00:00
James Ritchie 8a66983f63 Removed authentication step 2023-02-03 12:22:46 +00:00
James Ritchie b45a176c4f Button copy change 2023-02-03 12:22:35 +00:00
D-K-P 86d1a2413a More copy updates 2023-02-03 11:44:21 +00:00
Matt Aitken 763ee294ba Slack messages can now be threaded, and you can pass data through 2023-02-03 11:40:20 +00:00
James Ritchie 9a7db7bcff Copy updates for the scratch section 2023-02-03 11:38:56 +00:00
D-K-P 2c2de7b236 Added api key comments to all the workflows 2023-02-03 11:37:11 +00:00
D-K-P b9b49a8733 Copy updates 2023-02-03 11:32:46 +00:00
James Ritchie 32f09d59e6 Added content to the From Scratch section 2023-02-03 11:31:59 +00:00
James Ritchie ddb8b131c0 Deselected tab now more visible 2023-02-03 11:17:29 +00:00
James Ritchie ab8e1f0d06 Copy tweak 2023-02-03 11:07:32 +00:00
D-K-P 3f25622abf Removed extra line 2023-02-03 10:58:14 +00:00
D-K-P 9692ef5ceb fixed slack 2023-02-03 10:57:35 +00:00
D-K-P 2c29687712 Moved the package installation instructions to the individual examples 2023-02-03 10:51:58 +00:00
James Ritchie a392e6a00c Now using the external samplesList file 2023-02-03 10:49:47 +00:00
James Ritchie 59a5c2df51 Lots of copy improvements 2023-02-03 10:44:56 +00:00
James Ritchie 9872afcf98 Improved the page titles 2023-02-03 10:44:56 +00:00
D-K-P 55fd404449 Added new user slack message / custom event / webhook / scheduled - rec / schedule cron 2023-02-03 10:38:28 +00:00
James Ritchie faa844efa1 New steps added for authenticating with APIs 2023-02-03 10:23:32 +00:00
James Ritchie 1d02ffaf18 Organised imports 2023-02-03 10:23:32 +00:00
D-K-P 859a31e08b Added gh / resend / shopify / whatsapp to the samples list 2023-02-03 10:22:28 +00:00
Eric Allam a5f18cf45a Fixed issue with old slack workflow source parsing 2023-02-03 10:12:01 +00:00
James Ritchie c669c61ba7 Blank Workflows state now points to the new onboarding 2023-02-03 09:53:25 +00:00
James Ritchie ec1df6d476 Made samples list file a tsx 2023-02-03 09:24:59 +00:00
James Ritchie 50ecc88b99 Added samples list file 2023-02-03 09:24:23 +00:00
James Ritchie 605e34b6ad More copy 2023-02-03 09:16:39 +00:00
James Ritchie 780cd7fcef Added a new side menu link for New Workflow 2023-02-03 09:09:38 +00:00
James Ritchie f447cb1ca0 Content improvement 2023-02-02 22:07:00 +00:00
Dan bf57430b66 Merge pull request #41 from triggerdotdev/onboarding
Fixed button
2023-02-02 22:00:12 +00:00
James Ritchie ee28eca61c Added icons to the example boxes 2023-02-02 21:57:54 +00:00
D-K-P d629e3cca1 Converted the samples into functions 2023-02-02 21:28:58 +00:00
James Ritchie 43a320253d Added more steps to the onboarding 2023-02-02 20:30:34 +00:00
Matt Aitken 5ffababfe5 Added thread support to posting messages 2023-02-02 19:46:49 +00:00
James Ritchie e77bfc77e0 more style improvements 2023-02-02 19:38:17 +00:00
James Ritchie 93903bf072 Moved the env variables up to the workspace 2023-02-02 19:38:09 +00:00
James Ritchie 2b4a74f672 WIP adding api keys to the code samples 2023-02-02 19:10:22 +00:00
Matt Aitken 8ffb612496 Removed extraneous UI in Slack message 2023-02-02 18:54:51 +00:00
Matt Aitken 34f86dda3b WhatsApp slack example working 2023-02-02 18:51:11 +00:00
James Ritchie 81d3d324e2 More progress on the onboarding 2023-02-02 18:41:20 +00:00
D-K-P 6d8100d200 Added whatsapp sample 2023-02-02 18:18:53 +00:00
D-K-P 3e53699b05 Added shopify sample 2023-02-02 18:11:50 +00:00
D-K-P 8cca0f520b added sample code and renamed files 2023-02-02 18:08:46 +00:00
D-K-P 908fff6fe3 Added package installation instructions to all of the examples 2023-02-02 17:55:28 +00:00
James Ritchie da7742985f Mapping over projects 2023-02-02 17:40:08 +00:00
James Ritchie 4077d014e4 Added placeholder pages for more code examples 2023-02-02 17:39:53 +00:00
James Ritchie ab0938e91b Added an external code example 2023-02-02 17:22:21 +00:00
Matt Aitken 547f619112 Just show a link for videos for now 2023-02-02 16:37:06 +00:00
Eric Allam 4008e1d7ed Comments for the whatsapp flow 2023-02-02 16:32:04 +00:00
James Ritchie 910a8d3651 WIP updated onboarding page 2023-02-02 16:18:39 +00:00
Eric Allam 0e4ec8d8e6 Added views and view submission support to Slack integration 2023-02-02 16:18:32 +00:00
James Ritchie 2d08718389 Updated headless ui package 2023-02-02 16:18:28 +00:00
D-K-P 96306eb5e0 Added intercom 2023-02-02 15:35:17 +00:00
Eric Allam ad70dbc5dd Read from the latest trigger messages when creating workflow trigger subscription 2023-02-02 15:13:03 +00:00
James Ritchie 517d50242f Updated whatsapp icon 2023-02-02 14:25:23 +00:00
James Ritchie cf8163ef5c Fixed the Integrations button layout so they’re all the same height 2023-02-02 14:15:40 +00:00
Matt Aitken d6c7648bf1 WhatsApp media urls and geting files is working 2023-02-02 13:44:31 +00:00
Matt Aitken 05b0bd9fb4 Add jsx-slack to the WhatsApp example package 2023-02-02 10:51:49 +00:00
Matt Aitken 6495b67d1f Make image, document, video etc use the EventMediaObjectSchema 2023-02-02 10:50:41 +00:00
Matt Aitken c37edf970d Added workflowId and appOrigin to the @trigger.dev/sdk run metadata 2023-02-02 10:49:54 +00:00
Matt Aitken b38961205a Merge pull request #39 from triggerdotdev/integrations/whatsapp
WhatsApp integration
2023-02-02 08:49:48 +00:00
Matt Aitken 7e1c04ae71 Removed console.log 2023-02-02 08:33:13 +00:00
Matt Aitken 49a4b0ce11 Removed changeset files that pulled from dev 2023-02-02 08:31:06 +00:00
Matt Aitken 42c2a87238 Improved the text 2023-02-02 08:28:11 +00:00
Matt Aitken aefbba1f37 Added an index page to the reference 2023-02-02 08:27:25 +00:00
Matt Aitken b8b032a5fb Added docs for contact messages and template messages 2023-02-02 08:23:00 +00:00
Matt Aitken 2eea62c3ce Added lots of the docs for messages 2023-02-01 23:24:39 +00:00
Matt Aitken 22327886ac Added message event docs 2023-02-01 22:55:13 +00:00
Matt Aitken 3126d890dc Added a WhatsApp example 2023-02-01 21:54:41 +00:00
D-K-P 60abac1bc0 Updated mint.json 2023-02-01 15:32:02 +00:00
D-K-P 37d331588d Added package instructions for the integrations to the docs 2023-02-01 15:24:20 +00:00
D-K-P 6ddaf067a9 Added posthog to mint.json 2023-02-01 15:21:23 +00:00
Matt Aitken e281297da5 Merge remote-tracking branch 'origin/dev' into integrations/whatsapp 2023-02-01 14:47:10 +00:00
Matt Aitken f46436b903 Added “prettier-plugin-tailwindcss”: correct order for classes 2023-02-01 14:46:04 +00:00
Eric Allam a5d8290663 New emoji and fixed the runs image 2023-02-01 14:11:33 +00:00
Eric Allam 4fa967b2b1 Merge pull request #37 from triggerdotdev/dev
Fix builds by locking turbo dep to 1.7.0
2023-02-01 13:48:29 +00:00
Matt Aitken 6442576a38 Added audio, video, document and sticker messages 2023-02-01 13:43:18 +00:00
Matt Aitken 93f1814fd2 Improved errors handling, added sendContacts 2023-02-01 13:15:15 +00:00
James Ritchie d97b82e572 Added an impersonation banner 2023-02-01 13:11:03 +00:00
Eric Allam 5e15aaadc3 Try going back to frozen lockfile 2023-02-01 13:06:44 +00:00
Eric Allam 5fce178cc0 Try some more stuff 2023-02-01 12:56:58 +00:00
D-K-P 2938a11685 Removed quick start and changed it to ‘anatomy of a workflow’ and ‘viewing runs’ 2023-02-01 12:55:53 +00:00
Eric Allam 3dc8751189 Try using —no-frozen-lockfile 2023-02-01 12:41:26 +00:00
D-K-P fe8b8a7131 Fixed links 2023-02-01 12:34:18 +00:00
D-K-P d7f59db79e Centered badges and sites and added tagline 2023-02-01 12:34:18 +00:00
Eric Allam a98dfecd17 Try using the latest version of pnpm in dockerfiles 2023-02-01 12:34:00 +00:00
Eric Allam 84053d5a20 Try setting a specific pnpm version in dockerfiles 2023-02-01 12:31:11 +00:00
Eric Allam 3365bf26dc Log out pnpm version in wss dockerfile as well 2023-02-01 12:28:55 +00:00
Eric Allam 3d5c646a1c Changed where the pnpm version is output 2023-02-01 12:26:03 +00:00
Eric Allam 2d97d20b37 Log out the version of pnpm during the buld process 2023-02-01 12:23:53 +00:00
Matt Aitken 731b6308e0 Sending locations is working 2023-02-01 12:14:32 +00:00
Matt Aitken c1742f0d1b Sending images working 2023-02-01 11:59:59 +00:00
Matt Aitken d57339a7c1 Reactions and replying is working 2023-02-01 11:48:48 +00:00
Eric Allam cd11246d9a Merge pull request #36 from triggerdotdev/dev
README and mobile updates
2023-02-01 11:37:09 +00:00
Eric Allam 0833d402f2 Emojify the README 2023-02-01 11:36:16 +00:00
Matt Aitken 4054571929 Metadata required for the run page 2023-02-01 11:34:13 +00:00
Matt Aitken afc47d328f Send “text” WhatsApp messages 2023-02-01 11:31:06 +00:00
Eric Allam d6925ff4b6 Fixed welcome email drip campaign subtitle 2023-02-01 11:28:43 +00:00
D-K-P a372a179d1 Added quick start and examples to the docs 2023-02-01 11:21:33 +00:00
D-K-P f8c39e3446 New welcome copy in the docs 2023-02-01 11:21:22 +00:00
Matt Aitken 868e5f4ed1 Changed the WhatsApp package exports to match the other integrations 2023-02-01 11:00:54 +00:00
Matt Aitken e6ce7ea859 WhatsApp basic template message is sending 2023-02-01 11:00:43 +00:00
Eric Allam e6d1ddc5d8 Remove exports and add main and types to package.json 2023-02-01 10:45:05 +00:00
Eric Allam 8124930841 Fixed call to getIntegrations in new workflow route 2023-02-01 10:45:00 +00:00
Eric Allam 421bd9f757 Fixed broken integration creation route 2023-02-01 10:45:00 +00:00
Matt Aitken b3bc70baa3 Instead of switch statement, grab the integrations object 2023-02-01 10:44:25 +00:00
Matt Aitken dbfff6b5f4 WhatsApp send template message 2023-02-01 10:44:09 +00:00
Matt Aitken 69004cdcf4 Revert "Match the connection using the slug"
This reverts commit c1511f233c.
2023-02-01 10:42:33 +00:00
Matt Aitken c1511f233c Match the connection using the slug 2023-02-01 10:36:34 +00:00
James Ritchie 56d23efcfa Made the onboarding page slightly easier to read 2023-01-31 18:57:30 +00:00
James Ritchie 31c6da3be4 Added a NoMobileOverlay component that displays on small screens 2023-01-31 18:37:03 +00:00
Matt Aitken 6acda311db Added lots of message types to the schemas 2023-01-31 16:48:21 +00:00
Matt Aitken 9a529492d0 WhatsApp text messages are coming through 2023-01-31 16:24:05 +00:00
D-K-P f05cfc9895 Added new readme 2023-01-31 16:14:34 +00:00
D-K-P 659637c6a5 Added workflow gif 2023-01-31 16:06:23 +00:00
D-K-P 37bf4dcadd Docs updates - added viewing runs / updated welcome / added vid to resend example 2023-01-31 16:02:48 +00:00
Matt Aitken 950138bd72 More work on WhatsApp messages 2023-01-31 16:02:02 +00:00
Matt Aitken c578891947 Removed webhook payload validation 2023-01-31 14:42:23 +00:00
Eric Allam f377aba208 Merge pull request #35 from triggerdotdev/dev
Move to dual license
2023-01-31 14:33:33 +00:00
Eric Allam b852731fbb Move to dual license 2023-01-31 14:32:47 +00:00
Eric Allam 55a9031526 Merge pull request #34 from triggerdotdev/dev
Create separate packages for each integration
2023-01-31 14:11:23 +00:00
Eric Allam 5c350e216a Releasing fix for missing types 2023-01-31 13:56:06 +00:00
Eric Allam 8ac7414bba Remove exports and add main and types to package.json 2023-01-31 13:55:49 +00:00
Matt Aitken 6e8d9b4c9a WIP on webhook verification 2023-01-31 13:14:47 +00:00
Eric Allam 1dc9e1253a Set sentry to use staging env in staging 2023-01-31 12:47:03 +00:00
Eric Allam 24afe630ec Fixed call to getIntegrations in new workflow route 2023-01-31 12:42:49 +00:00
Eric Allam 5bd1f12c0d Fixed broken integration creation route 2023-01-31 12:39:14 +00:00
Eric Allam 7e3dfcdfb1 Add staging provider auth 2023-01-31 12:36:16 +00:00
Matt Aitken 24b57e026b Added support for verifying webhooks, with WhatsApp working 2023-01-31 11:57:15 +00:00
Matt Aitken 3dd0af6157 Installed @trigger.dev/whatsapp 2023-01-31 11:56:15 +00:00
Eric Allam cdaa5dfe3b Update staging to use staging auth 2023-01-31 10:25:32 +00:00
Matt Aitken a4a64affd4 Make the generic webhook input fields readonly so to get rid of React error 2023-01-31 10:18:21 +00:00
Matt Aitken a20a26e748 Updated settings for WhatsApp to match other integration packages 2023-01-31 09:53:24 +00:00
Matt Aitken 4fb9091870 Merge branch 'dev' into integrations/whatsapp
# Conflicts:
#	apps/webapp/package.json
#	apps/webapp/tsconfig.json
#	integrations/github/package.json
#	integrations/github/tsup.config.ts
#	integrations/resend/package.json
#	integrations/resend/tsup.config.ts
#	integrations/shopify/package.json
#	integrations/shopify/tsup.config.ts
#	integrations/slack/package.json
#	integrations/slack/tsup.config.ts
#	integrations/whatsapp/package.json
#	packages/integration-catalog/package.json
#	packages/integration-catalog/src/index.ts
#	packages/integration-catalog/tsconfig.json
#	packages/integration-sdk/package.json
#	pnpm-lock.yaml
2023-01-31 09:48:20 +00:00
Matt Aitken 7b29422a57 Initial setup on new WhatsApp integration 2023-01-31 09:46:34 +00:00
Eric Allam 1ef4243aaf Fixed workflow list blank state 2023-01-31 09:03:00 +00:00
D-K-P 1b696cabc1 Changed ‘login’ to ‘continue’ and updated text 2023-01-31 08:46:15 +00:00
Matt Aitken 3496053e11 Updated the CLI to point at the internal integrations metadata 2023-01-31 08:42:35 +00:00
Eric Allam fd54c86240 Updated s-webapp watch paths 2023-01-31 08:42:35 +00:00
Eric Allam 064e27f05d Update all the docs for the new packages 2023-01-31 08:42:35 +00:00
Eric Allam 89d38c04aa Added changesets for the new packages 2023-01-31 08:42:35 +00:00
Eric Allam 6c027c3c8f Remove trigger-providers, trigger-integrations, and internal-integrations and replace with integrations-catalog 2023-01-31 08:42:35 +00:00
Eric Allam fad8f44ad1 Breakout shopify into it’s own package 2023-01-31 08:42:35 +00:00
Eric Allam 5f517a5c70 Breakout resend into it’s own package 2023-01-31 08:42:35 +00:00
Eric Allam 09142cedd1 Moved internal only dependencies to devDependencies 2023-01-31 08:42:35 +00:00
Eric Allam 2bb7bad947 Breakout slack into it’s own package 2023-01-31 08:42:35 +00:00
Eric Allam d71c61fc56 Break out github into it’s own package 2023-01-31 08:42:35 +00:00
Eric Allam 3f9e7f4bda Cleanup the github stars example 2023-01-31 08:42:35 +00:00
Eric Allam e2261942a0 Added openapi spec doc and a reference page for the POST /events endpoint 2023-01-31 08:42:35 +00:00
D-K-P a015e535f0 Added github star example to the docs 2023-01-31 08:42:35 +00:00
Eric Allam 6c3c99123b Make it easier to start ngrok in different regions 2023-01-31 08:42:35 +00:00
Eric Allam c96f9f10b4 Rename Reference to SDK Reference 2023-01-31 08:42:35 +00:00
James Ritchie 23fc242dde Typo 2023-01-31 08:42:35 +00:00
James Ritchie c1ca53f513 Typo 2023-01-31 08:42:35 +00:00
James Ritchie b8dc408f0f Title improvement 2023-01-31 08:42:35 +00:00
James Ritchie b129381cf2 Improved docs title for github star example 2023-01-31 08:42:35 +00:00
James Ritchie 0141643b66 Updated the github docs example 2023-01-31 08:42:35 +00:00
James Ritchie 36cdf50c7c Removed dead link 2023-01-31 08:42:35 +00:00
D-K-P f660810fb8 Added 2 more integration logos 2023-01-31 08:42:35 +00:00
James Ritchie 8372cf71d4 Fixed a dead link in the docs 2023-01-31 08:42:35 +00:00
James Ritchie 4adad0041a Fixed typo 2023-01-31 08:42:35 +00:00
Eric Allam 887f9d1091 Try moving some shopify dependencies to prod deps 2023-01-30 21:23:04 +00:00
Eric Allam 91130472a9 Try moving @octokit/webhooks into normal deps 2023-01-30 20:55:31 +00:00
Eric Allam 7554b48948 Pushes to dev will now trigger staging deploys 2023-01-30 20:54:29 +00:00
Eric Allam 91b1edba7b Try bundling @octokit/webhooks 2023-01-30 20:46:09 +00:00
Eric Allam be86c3d45d Create a separate build entry for internal packages 2023-01-30 18:10:59 +00:00
Eric Allam 7f2fd9b1b3 Update the github client id for staging 2023-01-30 17:54:36 +00:00
Eric Allam a069ba14e4 Stage initial release of the new isolated integration packages 2023-01-30 17:49:45 +00:00
Eric Allam 87f755c93e Get flightcontrol ready for staging 2023-01-30 17:37:32 +00:00
Matt Aitken 66b6c2f844 Updated the CLI to point at the internal integrations metadata 2023-01-30 17:23:12 +00:00
Eric Allam c97a64bb02 Updated s-webapp watch paths 2023-01-30 16:55:44 +00:00
Eric Allam f3258ea411 Update all the docs for the new packages 2023-01-30 16:31:02 +00:00
Eric Allam 42648e93ee Added changesets for the new packages 2023-01-30 16:10:43 +00:00
Eric Allam acf8bf038f Remove trigger-providers, trigger-integrations, and internal-integrations and replace with integrations-catalog 2023-01-30 15:58:25 +00:00
Eric Allam 3769d12bd8 Breakout shopify into it’s own package 2023-01-30 14:05:23 +00:00
Eric Allam 3759dfc434 Breakout resend into it’s own package 2023-01-30 13:52:56 +00:00
Eric Allam c8e871393d Moved internal only dependencies to devDependencies 2023-01-30 13:29:52 +00:00
Eric Allam f9208f45a7 Breakout slack into it’s own package 2023-01-30 13:25:55 +00:00
Eric Allam 2d0e766b1a Break out github into it’s own package 2023-01-30 12:57:37 +00:00
Eric Allam 71549606ad Cleanup the github stars example 2023-01-30 09:31:21 +00:00
Eric Allam b63769b4e3 Added openapi spec doc and a reference page for the POST /events endpoint 2023-01-30 09:29:49 +00:00
D-K-P f325061444 Added github star example to the docs 2023-01-29 16:02:48 -08:00
Eric Allam 5ad386e306 Make it easier to start ngrok in different regions 2023-01-29 22:23:38 +00:00
Eric Allam a04e0f5e2d Rename Reference to SDK Reference 2023-01-29 21:10:38 +00:00
James Ritchie 5b65dd0070 Typo 2023-01-29 13:09:09 -08:00
James Ritchie 2f0104e960 Typo 2023-01-29 13:05:52 -08:00
James Ritchie c3e7a3e649 Title improvement 2023-01-29 13:03:29 -08:00
James Ritchie 1433004292 Improved docs title for github star example 2023-01-29 12:59:55 -08:00
James Ritchie cc1887b065 Updated the github docs example 2023-01-29 12:59:55 -08:00
James Ritchie 614489c67d Removed dead link 2023-01-29 12:59:55 -08:00
D-K-P 2a4b91da82 Added 2 more integration logos 2023-01-29 12:52:08 -08:00
James Ritchie 0f8014f613 Fixed a dead link in the docs 2023-01-29 12:51:07 -08:00
James Ritchie ab7c27be53 Fixed typo 2023-01-29 12:28:58 -08:00
Matt Aitken 4c23370735 Merge pull request #33 from triggerdotdev/dev
Fix for refresh causing server/client mismatch. Using Remix's latest entry.*.ts files
2023-01-29 09:21:36 -08:00
Matt Aitken 0d6e843880 Updated the entry.server.ts and entry.client.ts to Remix’s latest to fix server/client mismatch 2023-01-29 09:18:29 -08:00
Matt Aitken da948c4f4b Merge pull request #32 from triggerdotdev/dev
Pass the providers into the no workflows component – it isn’t a page
2023-01-29 08:51:22 -08:00
Matt Aitken 898069b5c8 Pass the providers into the no workflows component – it isn’t a page 2023-01-29 08:50:15 -08:00
Eric Allam c1b9aee818 Merge pull request #31 from triggerdotdev/dev
Fix issue with zod schemas getting serialized through loaders and causing errors
2023-01-29 07:07:27 +00:00
Matt Aitken 0f187803ae Merge pull request #30 from triggerdotdev/dev
Made the Slack interactivity zod schema any (to see if this is causin…
2023-01-28 17:54:07 -08:00
Matt Aitken 5423d5464f Merge pull request #29 from triggerdotdev/dev
Removed the @trigger.dev/sdk and /integrations packages from webapp
2023-01-27 23:26:17 -08:00
Matt Aitken 251b64ccf2 Revert "Revert "Merge pull request #28 from triggerdotdev/dev""
This reverts commit d6512b2ba5.
2023-01-27 23:24:26 -08:00
Matt Aitken 3e9e743751 Revert "Revert "Merge pull request #27 from triggerdotdev/dev""
This reverts commit 888c8a7460.
2023-01-27 23:24:20 -08:00
Matt Aitken 1fc7020b84 Revert "Revert "Merge pull request #26 from triggerdotdev/dev""
This reverts commit 35aedadfe9.
2023-01-27 23:24:15 -08:00
Matt Aitken 0137dac540 Revert "Revert "Merge pull request #25 from triggerdotdev/dev""
This reverts commit ba617fa7d7.
2023-01-27 23:24:11 -08:00
Matt Aitken 95d594457c Revert "Revert "Merge pull request #24 from triggerdotdev/dev""
This reverts commit 416c46d4cf.
2023-01-27 23:24:07 -08:00
Matt Aitken 416c46d4cf Revert "Merge pull request #24 from triggerdotdev/dev"
This reverts commit 56e5a5c8a4, reversing
changes made to a1b16400d5.
2023-01-27 22:13:54 -08:00
Matt Aitken ba617fa7d7 Revert "Merge pull request #25 from triggerdotdev/dev"
This reverts commit ef149bd260, reversing
changes made to 56e5a5c8a4.
2023-01-27 22:13:50 -08:00
Matt Aitken 35aedadfe9 Revert "Merge pull request #26 from triggerdotdev/dev"
This reverts commit 26c1c9f4b2, reversing
changes made to ef149bd260.
2023-01-27 22:13:47 -08:00
Matt Aitken 888c8a7460 Revert "Merge pull request #27 from triggerdotdev/dev"
This reverts commit c954b3743f, reversing
changes made to 26c1c9f4b2.
2023-01-27 22:13:35 -08:00
Matt Aitken d6512b2ba5 Revert "Merge pull request #28 from triggerdotdev/dev"
This reverts commit 92391c48cb, reversing
changes made to c954b3743f.
2023-01-27 22:13:19 -08:00
Matt Aitken 92391c48cb Merge pull request #28 from triggerdotdev/dev
Added an error boundary and set the remix-typedjson version to 0.1.3
2023-01-27 20:13:48 -08:00
Matt Aitken c954b3743f Merge pull request #27 from triggerdotdev/dev
Removed TypeForm, pull types of UseOrganizations from the loader
2023-01-27 19:29:14 -08:00
Matt Aitken 26c1c9f4b2 Merge pull request #26 from triggerdotdev/dev
Try catch the date formatting and return “unknown”
2023-01-27 18:27:45 -08:00
Matt Aitken ef149bd260 Merge pull request #25 from triggerdotdev/dev
Dev
2023-01-27 18:05:48 -08:00
Matt Aitken 56e5a5c8a4 Merge pull request #24 from triggerdotdev/dev
Added support for Slack blocks and interactivity. Docs improvements
2023-01-27 17:05:27 -08:00
Eric Allam a1b16400d5 Merge pull request #23 from triggerdotdev/dev
Fixed issue where workflow runs weren’t starting
2023-01-26 16:30:11 +00:00
Eric Allam 6bc46a8b90 Merge pull request #22 from triggerdotdev/dev
Remove internal triggers, fixed issue with react being required by @trigger.dev/integrations
2023-01-26 14:56:26 +00:00
Eric Allam 519293ca03 Merge pull request #21 from triggerdotdev/dev
Using explicit workspace: reference so we can use live packages in the monorepo
2023-01-26 14:22:10 +00:00
Eric Allam e8dfa4bea7 Merge pull request #20 from triggerdotdev/dev
Move internal triggers into their own service
2023-01-26 13:57:05 +00:00
Eric Allam fb6d254898 Merge pull request #19 from triggerdotdev/dev
More internal triggers
2023-01-26 11:52:35 +00:00
Eric Allam 7faf4312b1 Merge pull request #18 from triggerdotdev/dev
Support schedule window queries, context.isTest, and a fix for GitHub webhooks
2023-01-26 10:50:53 +00:00
Matt Aitken 3710f99270 Merge pull request #17 from triggerdotdev/dev
Added Resend docs example, removed more private beta references #17
2023-01-25 22:59:51 -08:00
Matt Aitken ea9a839886 Merge pull request #16 from triggerdotdev/dev
Fix for webhook url being built with undefined if APP_ORIGIN env var isn't set
2023-01-25 19:25:35 -08:00
Matt Aitken 94f2de81ea Merge pull request #15 from triggerdotdev/dev
Better handling of custom webhook parsing, improved webhook receive error handling
2023-01-25 18:33:24 -08:00
Matt Aitken 5ea825f5eb Merge pull request #14 from triggerdotdev/dev
Fix for integration webhook url, improved types for Resend integration
2023-01-25 17:13:16 -08:00
Matt Aitken 88306d6a63 Removed private beta message at the start of the README 2023-01-25 15:33:20 -08:00
Matt Aitken 80ebc1b1fa Merge pull request #13 from triggerdotdev/dev
Added generic webhook, fetch with retry options and updated docs
2023-01-25 15:28:40 -08:00
James Ritchie f10dadbd9f Fixed Toast widths 2023-01-24 16:53:55 -08:00
Matt Aitken 4085ad983c Merge pull request #12 from triggerdotdev/dev
Resend.com integration, fix for github webhooks, and more
2023-01-24 12:00:43 -08:00
Eric Allam 63776c7702 Merge pull request #8 from triggerdotdev/dev
Generic fetch support, and more docs
2023-01-23 14:13:52 +00:00
Matt Aitken ce8d146ed4 Merge pull request #7 from triggerdotdev/dev
Better local TypeScript support, added GitHub stars webhook and small web app improvements
2023-01-22 18:33:50 -08:00
Matt Aitken b45a5c60f7 Merge remote-tracking branch 'origin/dev' 2023-01-20 17:45:56 -08:00
Matt Aitken 1c62f16117 Merge remote-tracking branch 'origin/dev' 2023-01-20 14:24:55 -08:00
Matt Aitken 67a0d54f74 Merge pull request #6 from triggerdotdev/dev
Slack postMessage now takes channelId or channelName
2023-01-20 14:17:43 -08:00
859 changed files with 647306 additions and 11270 deletions
+9 -2
View File
@@ -4,8 +4,15 @@
"commit": false,
"fixed": [],
"linked": [],
"access": "restricted",
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": ["wss", "webapp", "docs"]
"ignore": [
"wss",
"webapp",
"integrations",
"emails",
"internal-cli",
"integration-catalog"
]
}
+5
View File
@@ -0,0 +1,5 @@
---
"@trigger.dev/sdk": patch
---
Fixed an error message
+5
View File
@@ -0,0 +1,5 @@
---
"@trigger.dev/sdk": patch
---
Added kv storage to persist data in between runs and between workflows
+5
View File
@@ -0,0 +1,5 @@
---
"@trigger.dev/sdk": patch
---
Fix ESM error by dynamically importing ESM packages (chalk, terminal-link, etc.)
+33
View File
@@ -0,0 +1,33 @@
{
"mode": "pre",
"tag": "next",
"initialVersions": {
"integrations": "1.0.0",
"webapp": "1.0.0",
"wss": "1.0.0",
"@trigger.dev/airtable": "0.1.27",
"@trigger.dev/notion": "0.1.26",
"@trigger.dev/sendgrid": "0.1.27",
"@trigger.dev/github": "0.1.27",
"@trigger.dev/resend": "0.1.27",
"@trigger.dev/shopify": "0.1.27",
"@trigger.dev/slack": "0.1.27",
"@trigger.dev/whatsapp": "0.1.25",
"@trigger.dev/common-schemas": "0.1.1",
"create-trigger": "0.2.0",
"emails": "1.0.0",
"integration-catalog": "0.1.16",
"@trigger.dev/integration-sdk": "0.1.17",
"internal-bridge": "0.0.1",
"internal-cli": "0.0.1",
"internal-platform": "0.0.3",
"internal-pulsar": "0.0.1",
"@trigger.dev/sdk": "0.2.21"
},
"changesets": [
"eleven-gorillas-obey",
"little-lizards-joke",
"moody-ligers-arrive",
"shaggy-hounds-appear"
]
}
+5
View File
@@ -0,0 +1,5 @@
---
"@trigger.dev/sdk": patch
---
SDK now passes through the project ID from the env var
+3 -1
View File
@@ -44,4 +44,6 @@ yarn-error.log*
.env
.output
apps/**/public/build
.tests-container-id.txt
.tests-container-id.txt
.sentryclirc
.buildt
+1
View File
@@ -0,0 +1 @@
{"workspaceId":"63e5e42daf9a537ba8d9503c"}
+19 -1
View File
@@ -5,18 +5,36 @@
"version": "0.2.0",
"configurations": [
{
"command": "pnpm run dev --filter webapp",
"command": "pnpm run idev --filter webapp",
"name": "Run webapp",
"request": "launch",
"type": "node-terminal",
"cwd": "${workspaceFolder}"
},
{
"command": "pnpm run dev --filter integrations",
"name": "Run integrations",
"request": "launch",
"type": "node-terminal",
"cwd": "${workspaceFolder}"
},
{
"type": "chrome",
"request": "launch",
"name": "Chrome webapp",
"url": "http://localhost:3000",
"webRoot": "${workspaceFolder}/apps/webapp/app"
},
{
"type": "node",
"request": "launch",
"name": "Debug Current Test File",
"autoAttachChildProcesses": true,
"skipFiles": ["<node_internals>/**", "**/node_modules/**"],
"program": "${workspaceRoot}/node_modules/vitest/vitest.mjs",
"args": ["run", "${relativeFile}"],
"smartStep": true,
"console": "integratedTerminal"
}
]
}
+19
View File
@@ -0,0 +1,19 @@
{
"folders": [
{
"name": "trigger.dev",
"path": "../"
},
{
"name": "Webapp",
"path": "../apps/webapp"
},
{
"name": "Integrations",
"path": "../apps/integrations"
}
],
"settings": {
"vitest.commandLine": "pnpm exec vitest"
}
}
+13 -1
View File
@@ -31,8 +31,17 @@ windows:
panes:
- cwd: /Users/eric/code/triggerdotdev/trigger.dev
commands:
- exec: pnpm run dev --filter webapp
- exec: pnpm run build --filter webapp
- exec: pnpm run i-dev --filter webapp
- cwd: /Users/eric/code/triggerdotdev/trigger.dev/apps/webapp
- title: integrations
layout:
split_direction: vertical
panes:
- cwd: /Users/eric/code/triggerdotdev/trigger.dev
commands:
- exec: pnpm run dev --filter integrations
- cwd: /Users/eric/code/triggerdotdev/trigger.dev/apps/integrations
- title: ngrok
layout:
split_direction: horizontal
@@ -43,6 +52,9 @@ windows:
- cwd: /Users/eric/code/triggerdotdev/trigger.dev
commands:
- exec: ./scripts/proxy-pizzly.sh <your-pizzly-dev>
- cwd: /Users/eric/code/triggerdotdev/trigger.dev
commands:
- exec: ./scripts/proxy-wss.sh <your-wss-dev>
- title: wss and examples
layout:
split_direction: horizontal
+14 -2
View File
@@ -7,8 +7,12 @@ Trigger.dev uses [changesets](https://github.com/changesets/changesets) to manag
To add a changeset, use `pnpm run changeset:add` and follow the instructions [here](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). Please only ever select one of our public packages when adding a changeset, which currently are:
- `@trigger.dev/sdk`
- `@trigger.dev/integrations`
- `@trigger.dev/providers`
- `@trigger.dev/integration-sdk`
- `@trigger.dev/github`
- `@trigger.dev/notion`
- `@trigger.dev/slack`
- `@trigger.dev/shopify`
- `@trigger.dev/resend`
## Release instructions
@@ -16,3 +20,11 @@ Based on the instructions [here](https://github.com/changesets/changesets/blob/m
1. Run `pnpm run changeset:version`
2. Run `pnpm run changeset:release`
## Pre-release instructions
1. Add changesets as usual `pnpm run changeset:add`
2. Switch to pre-release mode by running `pnpm run changeset:next`
3. Create version `pnpm run changeset:version`
4. Release `pnpm run changeset:release`
5. Switch back to normal mode by running `pnpm run changeset:normal`
+7 -11
View File
@@ -68,10 +68,11 @@ export PULSAR_CPP_DIR=/opt/homebrew/Cellar/libpulsar/3.1.0
If you are proxying the webapp according to step 2 then in `webapp/.env`, set the `APP_ORIGIN` to the `NGROK_SUBDOMAIN` provided to the `./scripts/proxy-webapp.sh` command, e.g. `APP_ORIGIN=https://dan-trigger-dev.eu.ngrok.io`
4. Start postgresql, pulsar, and pizzly server
4. Start postgresql, redis, pizzly server, followed by pulsar standalone
```bash
pnpm run docker:db
pnpm run docker:services
pnpm run docker:pulsar
```
> **Note:** The npm script will complete while Docker sets up the container in the background. Ensure that Docker has finished and your container is running before proceeding.
@@ -173,7 +174,8 @@ pnpm install
1. Ensure the docker containers are running
```bash
pnpm run docker:db
pnpm run docker:services
pnpm run docker:pulsar
```
2. Run the webapp
@@ -188,16 +190,10 @@ pnpm run dev --filter=webapp
pnpm run dev --filter=wss
```
4. Run the @trigger.dev/sdk:dev
4. Build all the @trigger.dev/\* packages
```bash
pnpm run dev --filter=@trigger.dev/sdk
```
5. Run the @trigger.dev integrations
```bash
pnpm run dev --filter=@trigger.dev/integrations
pnpm run dev --filter="@trigger.dev/*"
```
## Running the smoke test
+20 -196
View File
@@ -1,201 +1,25 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
Copyright (c) 2022 API Hero Inc.
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Portions of this software are licensed as follows:
1. Definitions.
- All content that resides under any "ee/" directory of this repository, if such directories exists, are licensed under the license defined in "ee/LICENSE".
- All third party components incorporated into the Trigger.dev Software are licensed under the original license provided by the owner of the applicable component.
- Content outside of the above mentioned directories or restrictions above is available under the "MIT Expat" license as defined below.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+142 -315
View File
@@ -1,377 +1,204 @@
<div align="center">
![Hero](https://raw.githubusercontent.com/triggerdotdev/trigger.dev/eebe37109e33beae6390ee19029fce8a5934c84b/apps/webapp/public/images/logo-banner.png)
[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/triggerdotdev.svg?style=social&label=Follow%20%40trigger.dev)](https://twitter.com/triggerdotdev) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCu-PdxpWtIrrd7vW0N5T6ZA?style=social)](https://www.youtube.com/@triggerdotdev)
[![GitHub Repo stars](https://img.shields.io/github/stars/triggerdotdev/trigger.dev?style=social)](https://github.com/triggerdotdev/trigger.dev)
[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/triggerdotdev.svg?style=social&label=Follow%20%40trigger.dev)](https://twitter.com/triggerdotdev)
[![Docs](https://img.shields.io/badge/-Documentation-blueviolet)](https://docs.trigger.dev)
[Website](https://trigger.dev) | [Community](https://discord.gg/JtBAxBr2m3) | [Docs](https://docs.trigger.dev)
</div>
# **✨ Trigger.dev**
### **The developer-first open source Zapier alternative.**
# ⚙️ Effortless automation built for developers
Trigger workflows from APIs, on a schedule, or on demand. API calls are easy with authentication handled for you. Add durable delays that survive server restarts.
![Hero](https://trigger.dev/_next/static/media/hero-image.4c367bbf.png?imwidth=1920)
# 💻 Developer-first features
## In your codebase
Trigger.dev is code-first so you can create workflows where they belong: in your codebase. Version control, localhost, test, review, and deploy like you're used to.
## Secure by design
Your workflows run on your servers, not ours. We only receive the data you choose to send to us.
Trigger.dev is an open source platform that makes it easy for developers to create event-driven background tasks directly in their code. Build, test and run workflows locally using our SDK. Subscribe to webhooks, schedule jobs, run background jobs and add long delays easily and reliably. In our web app you get full visibility of every run your workflow has ever made making it easier to monitor and debug.
&nbsp;
# Hundreds of Integrations
# **⭐️ Features:**
Subscribe to API changes and make requests, well handle authentication for you.
- 👂 Easily subscribe to [webhooks](https://docs.trigger.dev/triggers/webhooks)
— they work locally without tunnelling.
- 🔥 Fire your own [custom events](https://docs.trigger.dev/triggers/custom-events)—a single event can trigger multiple workflows.
- 📆 [Schedule workflows](https://docs.trigger.dev/triggers/scheduled)—easily repeat tasks or use CRON syntax for advanced cases.
- 🚦 Add [long delays](https://docs.trigger.dev/functions/delays) inside workflows (up to a year) and they will pick up where they left off.
- 🤝 When your server goes down [its not a problem](https://docs.trigger.dev/guides/resumability), workflows will reconnect and continue.
- 🪧 [View every step of every run](https://docs.trigger.dev/viewing-runs), with data, previews and errors.
- 👋 Connect to and authenticate with APIs using our custom integrations.
- 🚗 If you have a custom use case, we support [Fetch for calling any HTTP endpoint](https://docs.trigger.dev/functions/fetch) or [webhooks](https://docs.trigger.dev/triggers/webhooks) for subscribing to events from APIs.
- 📡 All API calls are automatically retried with exponential back off.
- 😀 TypeScript SDK, so whether youre using JavaScript or TypeScript you will have a great experience.
&nbsp;
# 🚀 Workflow examples
# **🌱 Documentation:**
## 🔄 Sync GitHub issues to Linear
- [Getting Started with Trigger.dev](https://docs.trigger.dev/getting-started)
- Example workflows
- [Welcome email drip campaign using Resend and Slack](https://docs.trigger.dev/examples/resend)
- [Post to Slack when a GitHub issue is created or modified](https://docs.trigger.dev/examples/slack)
- [Create a new product on Shopify](https://docs.trigger.dev/examples/shopify)
- [When a GitHub repo is starred, post information about the user to Slack](https://docs.trigger.dev/examples/github)
- Triggers:
- [Webhooks](https://docs.trigger.dev/triggers/webhooks)
- [Custom events](https://docs.trigger.dev/triggers/custom-events)
- [Scheduled](https://docs.trigger.dev/triggers/scheduled)
- Functions:
- [Fetch](https://docs.trigger.dev/functions/fetch)
- [Logging](https://docs.trigger.dev/functions/logging)
- [Delays](https://docs.trigger.dev/functions/delays)
- [Send event](https://docs.trigger.dev/functions/send-event)
- [Loops, conditionals, etc](https://docs.trigger.dev/functions/loops-conditionals-etc)
![GitHub](https://img.shields.io/badge/-GitHub-gray) ![Linear](https://img.shields.io/badge/-Linear-blue)
&nbsp;
Triggered when a GitHub issue is created or updated. Query your database to map GitHub user ids to Linear user ids. Then create or update Linear issues.",
# 🔬 **Anatomy of a workflow**
```Typescript
* You create workflows in code on your server using our SDK
* Each API integration is a separate package, e.g. `@trigger.dev/slack`
* Each workflow has an event that triggers it, e.g. `github.events.newStarEvent`, `scheduleEvent`, `customEvent`
* Each workflow has a `run` function that is called when the event is triggered
* If we don't have an integration for the API you want to use, you can use `fetch` to call any HTTP endpoint and `webhookEvent` to subscribe to webhooks
import { Trigger, github, linear } from "@trigger.dev/sdk";
## **Example workflows**
<details open><summary> Post to Slack when a GitHub issue is created or modified
</summary>
_Integrations required: Slack, GitHub_
```ts
import { Trigger } from "@trigger.dev/sdk";
import * as github from "@trigger.dev/github";
import * as slack from "@trigger.dev/slack";
new Trigger({
name: "Sync Github issues to Linear",
on: github.issueEvent({
repo: "acme/website",
}),
run: async (event, ctx) => {
const { issue, action } = event;
// Find the user in our local database
const assignee = await findUserByGithubId(issue.assignee?.id);
if (action === "opened") {
await linear.issueCreate({
id: issue.id,
title: issue.title,
description: issue.body,
assigneeId: assignee?.linearId,
teamId: ctx.env.LINEAR_TEAM_ID,
id: "new-github-star-to-slack",
name: "New GitHub Star: triggerdotdev/trigger.dev",
apiKey: "<my_api_key>",
on: github.events.newStarEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event) => {
await slack.postMessage("github-stars", {
channelName: "github-stars",
text: `New GitHub star from \n<${event.sender.html_url}|${event.sender.login}>`,
});
} else {
await linear.issueUpdate(issue.id, {
assigneeId: assignee?.linearId,
stateId:
action === "closed"
? ctx.env.LINEAR_CLOSED_STATE_ID
: ctx.env.LINEAR_OPEN_STATE_ID,
});
}
},
},
}).listen();
```
&nbsp;
</details>
## ✉️ Send emails to new users
<details><summary>Welcome email drip campaign
</summary>
![User](https://img.shields.io/badge/-User-gray) ![Email](https://img.shields.io/badge/-Email-gray) ![Slack](https://img.shields.io/badge/-Slack-purple)
_Integrations required: Slack, Resend_
Triggered on demand by your other code when a user is created. We wait for 3 hours then send a follow-up email if the user hasnt completed onboarding yet.
```Typescript
import { Trigger, customEvent, slack, mailgun } from "@trigger.dev/sdk";
```ts
import { customEvent, Trigger, sendEvent } from "@trigger.dev/sdk";
import * as resend from "@trigger.dev/resend";
import * as slack from "@trigger.dev/slack";
import React from "react";
import { z } from "zod";
import { getUser } from "../db";
import { InactiveEmail, TipsEmail, WelcomeEmail } from "./email-templates";
new Trigger({
name: "Send Email to New Users",
on: customEvent<UserEvent>({ name: "user.created" }),
run: async (event, ctx) => {
// Wait for 3 hours before continuing
await ctx.waitFor({ hours: 3 });
id: "welcome-email-campaign",
name: "Welcome email drip campaign",
apiKey: "<my_api_key>",
on: customEvent({
name: "user.created",
schema: z.object({
userId: z.string(),
}),
}),
async run(event, context) {
//get the user data from the database
const user = await getUser(event.userId);
// Lookup user in the database
const user = await findUserById(event.id);
await slack.postMessage("send-to-slack", {
channelName: "new-users",
text: `New user signed up: ${user.name} (${user.email})`,
});
// only send email if user has not onboarded
if (!user.hasOnboarded) {
await mailgun.send({
to: user.email,
subject: "Welcome to our app!",
body: `Welcome to our app ${user.name}!}`,
});
//Send the first email
const welcomeResponse = await resend.sendEmail("welcome-email", {
from: "Trigger.dev <james@email.trigger.dev>",
replyTo: "James <james@trigger.dev>",
to: user.email,
subject: "Welcome to Trigger.dev",
react: <WelcomeEmail name={user.name} />,
});
await context.logger.debug(
`Sent welcome email to ${welcomeResponse.to} with id ${welcomeResponse.id}`
);
await slack.sendMessage({
text: `Welcome email sent to ${user.email}`,
//wait 1 day, check if the user has created a workflow and send the appropriate email
await context.waitFor("wait-a-while", { days: 1 });
const updatedUser = await getUser(event.userId);
if (updatedUser.hasOnboarded) {
await resend.sendEmail("onboarding-complete", {
from: "Trigger.dev <james@email.trigger.dev>",
replyTo: "James <james@trigger.dev>",
to: updatedUser.email,
subject: "Pro tips for workflows",
react: <TipsEmail name={updatedUser.name} />,
});
} else {
await slack.sendMessage({
text: `User ${user.email} has already onboarded`,
await resend.sendEmail("onboarding-incomplete", {
from: "Trigger.dev <james@email.trigger.dev>",
replyTo: "James <james@trigger.dev>",
to: updatedUser.email,
subject: "Help with your first workflow",
react: <InactiveEmail name={updatedUser.name} />,
});
}
},
}).listen();
```
&nbsp;
</details>
## 🚨 Escalate critical incidents
![Intercom](https://img.shields.io/badge/-Intercom-blue) ![Linear](https://img.shields.io/badge/-Linear-blue) ![Slack](https://img.shields.io/badge/-Slack-purple) ![PagerDuty](https://img.shields.io/badge/-PagerDuty-green)
Triggered when an Intercom incident happens. We create a Linear issue, send a Slack message and, if its an urgent incident, we alert whoever is on call.
```Typescript
import { Trigger, intercom, linear, slack, pagerduty } from "@trigger.dev/sdk";
new Trigger({
name: "Intercom Incident",
on: intercom.newIncident(),
run: async (event, ctx) => {
// Find the customer in the database
const customer = await db.query("SELECT * FROM users WHERE email = $1", [
event.email,
]);
// Create linear ticket
const ticket = await linear.issueCreate({
title: event.title,
description: event.description,
assigneeId: ctx.env.LINEAR_ASSIGNEE_ID,
teamId: ctx.env.LINEAR_TEAM_ID,
});
// notify account manager
await slack.sendMessage({
text: `New incident for ${customer.name} in Linear: ${ticket.url}`,
});
if (event.severity === "urgent") {
// Create a pagerduty incident
await pagerduty.createIncident({
title: event.title,
description: event.description,
severity: "critical",
serviceId: ctx.env.PAGERDUTY_SERVICE_ID,
});
}
},
}).listen();
```
[More examples here](https://docs.trigger.dev/examples/examples)
&nbsp;
# ⚡️ Trigger happy
# 👀 **Viewing runs:**
Install our SDK and get instant access to an arsenal of triggers you can use in your code:
One of the most powerful features of Trigger.dev is the [runs page](https://docs.trigger.dev/viewing-runs). All of the steps in a workflow, including the initial event, can be viewed in detail. See the status / output of each step, the logs, rich previews, errors and much more.
### **Webhooks**
Subscribe to webhooks without creating API endpoints. Plus they work locally without tunneling.
```Typescript
github.issueEvent({ repo: "acme/website" })
```
### **Scheduled (CRON)**
Easily subscribe to a recurring schedule using human readable code or CRON syntax.
```Typescript
scheduleEvent({ every: { minutes: 30 } })
```
### **Custom Events**
Trigger workflows from any event in your app. Send us your events, and we'll do the rest.
```Typescript
customEvent<YourType>({ name: "your.event" })
```
### **HTTP Endpoint**
Expose a HTTP endpoint to trigger your workflows with the method and path of your choice.
```Typescript
httpEvent<User>({ method: "POST", path: "/users/:id" })
```
### **Receive Emails**
Receive emails from your custom domain and trigger a workflow with the email metadata and content.
```Typescript
emailEvent({ address: "support@help.customdomain.io" })
```
### **AWS Event Bridge**
Integrate with AWS Event Bridge to trigger workflows on your own Event Bridge events.
```Typescript
eventBridge<SupportRequest>({ bus: "customer-support" })
```
![Viewing runs](https://imagedelivery.net/3TbraffuDZ4aEf8KWOmI_w/7343f3b2-2342-493b-5007-78f60ba5b700/public)
&nbsp;
# 🔋 Batteries included
# **🏠 Running Trigger.dev locally:**
### **Debugging and visibility**
We provide a full history of all runs, so you can see exactly what happened.
To run Trigger.dev locally, [follow these steps](https://github.com/triggerdotdev/trigger.dev/blob/main/DEVELOPMENT.md).
&nbsp;
<img src="https://trigger.dev/_next/static/media/runs-diagram.c9ce4213.png" alt="Runs" width="400"/>
# **👏 Contributing:**
We are open source and love contributions!
- Request a feature in our [Discord community](https://discord.gg/JtBAxBr2m3)
- Open a PR
&nbsp;
---
# **🧘‍♂️ Self-hosting guide:**
Please subscribe to the [GitHub issue](https://github.com/triggerdotdev/trigger.dev/issues/48) to be notified when it's live.
&nbsp;
### **Survives downtime**
Workflows pick up where they left off when your server or external APIs go down.
# **📧 Support & contact:**
&nbsp;
<img src="https://trigger.dev/_next/static/media/retries-diagram.d90a00d9.png
" alt="Retries" width="400"/>
&nbsp;
# Go from idea to production in minutes
## **1. Code**
Write workflows by creating triggers directly in your code. These can be 3rd-party integrations, custom events or on a schedule.
## **2. Connect**
When your server runs, your workflow will be registered and you can authenticate with any APIs youre using.
## **3. Test**
When your server runs, your workflow will be registered and you can authenticate with any APIs youre using.
## **3. Deploy**
Deploy your new workflow as you would any other code commit and inspect each workflow run in real time.
&nbsp;
# ✅ We ❤️ Open Source!
Youll always be able to host and run Trigger.dev yourself.
We've also created [JSON Hero](https://github.com/triggerdotdev/jsonhero-web), an open source JSON viewer used by around 55,000 developers per month.
&nbsp;
# 🙋 FAQs
<details><summary> Does my data get sent to your servers?</summary><br>
Only what you choose to send. The main body of your workflow code runs on your infrastructure.
For example when you do a database query, that never touches us.
Data we will receive (and store to display on the Runs page in your dashboard):
- Any data that triggers the start of a workflow
- Any data you pass to one of our API integrations • Any data you choose to log using our logging function
</details>
<details><summary> How is this different to Zapier, Pipedream etc?</summary><br>
Trigger.dev is a code-first workflow tool that lets you create workflows directly in your code, rather than using a UI builder like Zapier. This means you can stay in your own IDE and keep your internal data secure.
</details>
<details><summary>How long does this take to set up?</summary><br>
Setting up Trigger.dev is simple and takes 2 minutes. Install our SDK to get started and check out the Getting Started documentation to start creating your first workflow.
</details>
<details><summary>Can I use version control or roll-backs?</summary><br>
Yes. You create workflows directly in your own code so its version controlled with everything else.
</details>
<details><summary>How long does it take to code up a workflow?</summary><br>
A simple workflow triggering two events from different services will take about 5 minutes to create.
</details>
<details><summary>Do you have all the integrations I need?</summary><br>
Probably. Trigger.dev includes over 100 integrations including the most popular services. If you need a specific service thats not available, you can request it, or create it yourself. Were open source, so create an issue or Pull Request.
</details>
<details><summary>Can I build complex workflows?</summary><br>
Yes. Theres no limit to the complexity on workflows you can create. Workflows are created in code so you can write conditional, looping, branching or time delayed logic.
</details>
<details><summary> Can I run Trigger.dev locally?</summary><br>
Yes. Workflows are created in your code locally and, unlike webhooks, you dont need to use tunneling to receive triggers.
</details>
<details><summary>How does the pricing model work?</summary><br>
Our hosted product gives you free runs each month, after that you will need to select a paid tier. You can also self-host, view the open source repository for instructions.
</details>
<details><summary>Is Trigger.dev open source?</summary><br>
Yes, Trigger.dev is open source. We are strong supporters of open source software, and our first product, [jsonhero.io](https://jsonhero.io), has a thriving open source community. Trigger.dev follows in that tradition.
</details>
<details><summary>Is Trigger.dev a no/low-code tool?</summary><br>
No. Trigger.dev is designed for developers who want to create workflows directly in code, without using a UI builder like Zapier. This allows developers to stay in their familiar development environment and customise their workflows with code.
</details>
<details><summary>What languages / frameworks do you support?</summary><br>
Currently there is support for Node.js. More frameworks will be added soon.
</details>
<details><summary>Can I use an API which doesnt have webhooks?</summary><br>
Yes. You can use a polling trigger to subscribe is no webhook exists.
</details>
<details><summary>Can non-coders use this product?</summary><br>
Developers will need to create workflows. Anyone on the team can monitor running workflows in the Trigger dashboard.
</details>
&nbsp;
---
&nbsp;
If you have any other questions about Trigger.dev, [drop us an email](mailto:hello@trigger.dev), and one of the founders will get back to you.
- Join our [Discord community](https://discord.gg/JtBAxBr2m3)
- If you have any other questions, get in touch at [hello@trigger.dev](mailto:hello@trigger.dev)
-34
View File
@@ -1,34 +0,0 @@
# Mintlify Starter Kit
Click on `Use this template` to quickstarter your documentation setup with Mintlify. The starter kit contains examples including
- Guide pages
- Navigation
- Customizations
- API Reference pages
- Use of popular components
### 👩‍💻 Development
Run these from the root of the repository
```
pnpm install --filter docs
```
```
pnpm run dev --filter docs
```
Go to http://localhost:3050
### 😎 Publishing Changes
Changes will be deployed to production automatically after pushing to the default branch.
You can also preview changes using PRs, which generates a preview link of the docs.
#### Troubleshooting
- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies.
- Mintlify dev is updating really slowly - Run `mintlify clear` to clear the cache.
-23
View File
@@ -1,23 +0,0 @@
---
title: "Example workflows"
sidebarTitle: "Overview"
description: "Example workflows to use in your projects."
---
Not sure what to build? Take a look through our examples for inspiration.
You can use these workflows in your product by following the instructions on each page.
<CardGroup>
<Card title="GitHub" icon="github" href="/examples/github">
When a GitHub issue is created or modified, post a message to Slack.
</Card>
<Card title="Shopify" icon="shopify" href="/examples/shopify">
Create a new product in my Shopify store.
</Card>
<Card title="Slack" icon="slack" href="/examples/slack">
Post to Slack when a GitHub issue is created or modified.
</Card>
<Card title="Resend" icon="envelope" href="/examples/resend">
Create a welcome email drip campaign.
</Card>
</CardGroup>
-35
View File
@@ -1,35 +0,0 @@
---
title: "GitHub"
sidebarTitle: "GitHub"
description: "Here are some example workflows you could create using the GitHub integration."
---
You can explore all the supported GitHub functions [here](/integrations/apis/github/events/push).
## When a GitHub issue is created or modified, post to Slack
Integrations required: GitHub, Slack
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { github, slack } from "@trigger.dev/integrations";
import { z } from "zod";
new Trigger({
id: "my-workflow-1",
name: "Posts to Slack when GitHub Issue created or modified",
apiKey: "<my_api_key>",
on: github.events.issueEvent({
repo: "my-github-org/my-github-repo",
}),
run: async (event, ctx) => {
const response = await slack.postMessage("send-to-slack", {
channelName: "my-slack-channel-name",
text: `A new issue has been created or modified. ${event.action}`,
});
return response.message;
},
}).listen();
```
-81
View File
@@ -1,81 +0,0 @@
---
title: "Resend"
sidebarTitle: "Resend"
description: "Here are some example workflows you could create using the Resend integration."
---
<Tip>
Resend is in private beta, if you would like access please contact us at{" "}
<a href="mailto:help@trigger.dev">help@trigger.dev</a>
</Tip>
## Welcome email drip campaign
This workflow will get triggered and a Slack notification and welcom email will be sent straight away.
1 day later we check if the user has completed onboarding, if they have, they get a 'tips' email, otherwise they get a re-engagement email.
Integrations required: Resend, Slack
```ts
import { resend, slack } from "@trigger.dev/integrations";
import { customEvent, Trigger, sendEvent } from "@trigger.dev/sdk";
import React from "react";
import { z } from "zod";
import { getUser } from "../db";
import { InactiveEmail, TipsEmail, WelcomeEmail } from "./email-templates";
new Trigger({
id: "welcome-email-campaign",
name: "Welcome email drip campaign",
apiKey: "<my_api_key>",
on: customEvent({
name: "user.created",
schema: z.object({
userId: z.string(),
}),
}),
async run(event, context) {
//get the user data from the database
const user = await getUser(event.userId);
await slack.postMessage("send-to-slack", {
channelName: "new-users",
text: `New user signed up: ${user.name} (${user.email})`,
});
//Send the first email
const welcomeResponse = await resend.sendEmail("welcome-email", {
from: "Trigger.dev <james@email.trigger.dev>",
replyTo: "James <james@trigger.dev>",
to: user.email,
subject: "Welcome to Trigger.dev",
react: <WelcomeEmail name={user.name} />,
});
await context.logger.debug(
`Sent welcome email to ${welcomeResponse.to} with id ${welcomeResponse.id}`
);
//wait 1 day, check if the user has created a workflow and send the appropriate email
await context.waitFor("wait-a-while", { days: 1 });
const updatedUser = await getUser(event.userId);
if (updatedUser.hasOnboarded) {
await resend.sendEmail("onboarding-complete", {
from: "Trigger.dev <james@email.trigger.dev>",
replyTo: "James <james@trigger.dev>",
to: updatedUser.email,
subject: "Pro tips for workflows",
react: <TipsEmail name={updatedUser.name} />,
});
} else {
await resend.sendEmail("onboarding-incomplete", {
from: "Trigger.dev <james@email.trigger.dev>",
replyTo: "James <james@trigger.dev>",
to: updatedUser.email,
subject: "Help with your first workflow",
react: <InactiveEmail name={updatedUser.name} />,
});
}
},
}).listen();
```
-211
View File
@@ -1,211 +0,0 @@
---
title: "Shopify"
sidebarTitle: "Shopify"
description: "Here are some example workflows you could create using the Shopify integration."
---
You can explore all the supported Shopify functions [here](/).
## Create a new product
Integrations required: Shopify
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { z } from "zod";
import { shopify } from "@trigger.dev/integrations";
new Trigger({
id: "shopify-products",
name: "Shopify products",
apiKey: "<my_api_key>",
logLevel: "debug",
on: customEvent({
name: "shopify.products",
schema: z.object({}),
}),
run: async (event, ctx) => {
const newProduct = await shopify.createProduct("create-product", {
descriptionHtml: "This is my brilliant <i>product description</i>.",
title: `Fantastic product ${Math.floor(Math.random() * 1000)}`,
productType: "t-shirt",
vendor: "Nike",
options: ["Color", "Size"],
standardizedProductType: {
productTaxonomyNodeId: "gid://shopify/ProductTaxonomyNode/352",
},
variants: [
{
price: "99.99",
sku: "variant-1",
inventoryItem: {
tracked: true,
},
inventoryQuantities: [
{
availableQuantity: 1,
locationId: "gid://shopify/Location/76187369773",
},
],
options: ["Maroon", "Tiny"],
},
],
});
const newImages = await shopify.appendProductImages("append-images", {
id: newProduct.id,
images: [
{
src: "https://via.placeholder.com/600/92c952.png",
altText: "Image 1",
},
{
src: "https://via.placeholder.com/600/d32776.png",
altText: "Image 2",
},
],
});
return newProduct;
},
}).listen();
```
## Update a product
Integrations required: Shopify
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { z } from "zod";
import { shopify } from "@trigger.dev/integrations";
new Trigger({
id: "shopify-update-product",
name: "Shopify update product",
apiKey: "<my_api_key>",
logLevel: "debug",
on: customEvent({
name: "product.update",
schema: z.object({
id: z.string(),
}),
}),
run: async (event, ctx) => {
const product = await shopify.updateProduct("update-product", {
id: event.id,
descriptionHtml: `<h1>Awesome product title</h1><p>With incredible description</p>`,
});
return product;
},
}).listen();
```
## Add a product to a collection
Integrations required: Shopify
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { z } from "zod";
import { shopify } from "@trigger.dev/integrations";
new Trigger({
id: "shopify-add-product-to-collection",
name: "Shopify add product to collection",
apiKey: "<my_api_key>",
logLevel: "debug",
on: customEvent({
name: "product.new",
schema: z.object({
id: z.string(),
}),
}),
run: async (event, ctx) => {
const collection = await shopify.addProductsToCollection(
"add-products-to-collection",
{
collectionId: "gid://shopify/Collection/431864578349",
productIds: [event.id],
}
);
return collection;
},
}).listen();
```
## Create new product variants with images
Integrations required: Shopify
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { z } from "zod";
import { shopify } from "@trigger.dev/integrations";
const sizes = ["Small", "Medium", "Large"];
const colors = [
"Red",
"Orange",
"Yellow",
"Green",
"Blue",
"Purple",
"Pink",
"Brown",
"Black",
"White",
"Gray",
"Silver",
"Gold",
"Beige",
];
const materials = ["Cotton", "Polyester", "Lycra", "Wool", "Silk", "Leather"];
function pickRandom(array: string[]): string {
return array[Math.floor(Math.random() * array.length)];
}
new Trigger({
id: "shopify-product-variants",
name: "Shopify product variants",
apiKey: "<my_api_key>",
logLevel: "debug",
on: customEvent({
name: "shopify.product-variants",
schema: z.object({}),
}),
run: async (event, ctx) => {
await ctx.logger.info("Get Shopify products variants");
const results = await shopify.searchProductVariants(
"get-shopify-variants",
{
filter: {
productId: ["gid://shopify/Product/8098295546157"],
sku: ["variant-1"],
},
}
);
const newVariant = await shopify.createProductVariant("create-variant", {
productId: results.productVariants[0].product.id,
inventoryQuantities: [
{
availableQuantity: 10,
locationId: "gid://shopify/Location/76187369773",
},
],
price: "12.34",
sku: `variant-${Math.floor(Math.random() * 1000)}`,
options: [pickRandom(sizes), pickRandom(materials)],
});
await ctx.logger.debug("Debug message");
return newVariant;
},
}).listen();
```
-32
View File
@@ -1,32 +0,0 @@
---
title: "Slack"
sidebarTitle: "Slack"
description: "Here are some example workflows you could create using the Slack integration."
---
## Post to Slack when a GitHub issue is created or modified
Integrations required: Slack, GitHub
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { github, slack } from "@trigger.dev/integrations";
import { z } from "zod";
new Trigger({
id: "my-workflow-1",
name: "Posts to Slack when GitHub Issue created or modified",
apiKey: "<my_api_key>",
on: github.events.issueEvent({
repo: "my-github-org/my-github-repo",
}),
run: async (event, ctx) => {
const response = await slack.postMessage("send-to-slack", {
channelName: "my-slack-channel-name",
text: `A new issue has been created or modified. ${event.action}`,
});
return response.message;
},
}).listen();
```
-89
View File
@@ -1,89 +0,0 @@
---
title: "Delays"
sidebarTitle: "Delays"
description: "You can trigger workflow steps to fire before and after a delay. There are 2 types of delay, waitFor and waitUntil."
---
## `waitFor` delay
`waitFor` takes a unique key and an object that sets the desired time as a key value pair.
```ts
await ctx.waitFor("wait-for-1", { seconds: 30 });
```
<Note>Reminder: Ensure all keys are unique across all triggers.</Note>
### Example
This example posts a message to Slack after a 30 second delay:
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { github, slack } from "@trigger.dev/integrations";
import { z } from "zod";
new Trigger({
id: "wait-for-example",
name: "Post to Slack after delay",
apiKey: "<my_api_key>",
on: customEvent({
name: "waitForExample",
schema: z.object({
id: z.string(),
}),
}),
run: async (event, ctx) => {
await ctx.waitFor("initial-wait", { seconds: 30 });
const response = await slack.postMessage("send-to-slack", {
channel: "my-slack-channel",
text: `This message posted after a 30 second delay.`,
});
return response.message;
},
}).listen();
```
## `waitUntil` delay
`waitUntil` takes a unique key and a date function to set desired time.
```ts
await ctx.waitUntil("wait-until-1", new Date(Date.now() + 1000 * 60 * 1));
```
<Note>Reminder: Ensure all keys are unique across all triggers.</Note>
### Example
This example posts a message to Slack 1 hour after the workflow triggers:
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { github, slack } from "@trigger.dev/integrations";
import { z } from "zod";
new Trigger({
id: "wait-until-example",
name: "Post to Slack after 1hr delay",
apiKey: "<my_api_key>",
on: customEvent({
name: "waitUntilExample",
schema: z.object({
id: z.string(),
}),
}),
run: async (event, ctx) => {
await ctx.waitUntil("wait-until", new Date(Date.now() + 1000 * 60 * 1));
const response = await slack.postMessage("send-to-slack", {
channel: "my-slack-channel",
text: `This message posted after a 30 second delay.`,
});
return response.message;
},
}).listen();
```
-248
View File
@@ -1,248 +0,0 @@
---
title: "Generic Fetch"
sidebarTitle: "Fetch"
description: "A generic fetch function that can be used to call any HTTP endpoint"
---
## Usage
A `fetch` function is available to use inside a `Trigger.run` function through the `context` argument, and should be familiar for anyone who has used the standard [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) API, with a few modifications.
```ts
import { Trigger } from "@trigger.dev/sdk";
new Trigger({
id: "fetch-example",
name: "Fetch Example",
on: customEvent({
name: "example.fetch",
}),
run: async (event, ctx) => {
await ctx.fetch("Example Key", "http://httpbin.org/get");
},
}).listen();
```
Notice the first parameter to `fetch` is a `key` that is used to identify this call to fetch to support resumability. Please see the [Resumability](/guides/resumability) guide for more information.
You can also import `fetch` and use it outside of a `Trigger.run` function:
```ts httpBin.ts
import { fetch } from "@trigger.dev/sdk";
export function httpBinGet() {
return fetch("Example Key", "http://httpbin.org/get");
}
```
Now you can use the exported `httpBinGet` function inside your `Trigger.run` function:
```ts
import { Trigger } from "@trigger.dev/sdk";
import { httpBinGet } from "./httpBin";
new Trigger({
id: "fetch-example",
name: "Fetch Example",
on: customEvent({
name: "example.fetch",
}),
run: async (event, ctx) => {
await httpBinGet();
},
}).listen();
```
This is useful if you want to wrap `fetch` to provide an SDK like experience inside your workflows.
<Warning>
Calling `fetch` when not inside of a workflow run will result in a thrown
Error.
</Warning>
## Response
<Tip>
Make sure to check `response.ok`, as non-2xx status codes will not throw an
error and will instead return a response with `ok` set to `false`.
</Tip>
The return value of `fetch` is a similar to a normal fetch response, but we will automatically parse the response body as JSON and provide it as `body`, like so:
```ts
const response = await ctx.fetch("Example Key", "http://httpbin.org/get");
if (response.body) {
console.log(response.body.url); // http://httpbin.org/get
}
```
By default, the `body` is typed as `any`, but you can provide a [Zod](/guides/zod) schema to validate the response body and get a more specific type:
```ts
import { z } from "zod";
const response = await ctx.fetch("Get HTTPBin", "http://httpbin.org/get", {
responseSchema: z.object({
url: z.string(),
origin: z.string(),
headers: z.record(z.string()),
}),
});
```
Now the `body` will be typed as:
```ts
{
url: string;
origin: string;
headers: Record<string, string>;
}
```
It's okay to not be comprehensive with the schema, as long as the response body matches the schema, it will be valid. Do note that any properties not included in the schema will be excluded, unless you use `.passthrough()`:
```ts
const response = await ctx.fetch("Get HTTPBin", "http://httpbin.org/get", {
responseSchema: z.object({
url: z.string(),
origin: z.string(),
headers: z.record(z.string()),
}),
});
console.log(response.body); // Only includes url, origin, and headers
// Using passthrough():
const response = await ctx.fetch("Get HTTPBin", "http://httpbin.org/get", {
responseSchema: z
.object({
url: z.string(),
origin: z.string(),
headers: z.record(z.string()),
})
.passthrough(),
});
console.log(response.body); // Includes url, origin, headers, and everything else
```
<Note>
The fetch function currently only supports JSON request and response bodies.
</Note>
## Secret values
If you are using a header with a secret value, you can use our `secureString` [tagged template](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates) to ensure that the value is not logged in the trigger.dev logs:
```ts
import { Trigger, secureString } from "@trigger.dev/sdk";
new Trigger({
id: "fetch-example",
name: "Fetch Example",
on: customEvent({
name: "example.fetch",
}),
run: async (event, ctx) => {
await ctx.fetch("🔑 Secret API", "http://httpbin.org/post", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: secureString`Bearer ${process.env.SECRET_API_KEY}`,
},
});
},
}).listen();
```
Which will show in the trigger.dev app as:
![title](/images/secure-string.png)
## Retrying
By default, we will retry a failed request up to 10 times if it has one of the following status codes: `408`, `429`, `500`, `502`, `503`, `504`. You can override this behavior by providing a `retry` option:
```ts
await ctx.fetch("Example Key", "http://httpbin.org/get", {
retry: {
maxAttempts: 5,
statusCodes: [408, 429, 500, 502, 503, 504, 521, 522, 524],
minTimeout: 1000,
maxTimeout: 10000,
factor: 1.2,
},
});
```
| Property | Description | Default |
| ----------- | ---------------------------------------- | ---------------------------------------- |
| enabled | Enables retrying of failed requests | true |
| factor | The exponential factor of backoff | 1.8 |
| minTimeout | The minimum amount of ms between retries | 1000 |
| maxTimeout | The maximum amount of ms between retries | 60000 |
| statusCodes | The HTTP Status Codes that are retryable | `408`, `429`, `500`, `502`, `503`, `504` |
If you'd like to disable retrying, simple pass in the `retry` option with `enabled` set to `false`:
```ts
await ctx.fetch("Example Key", "http://httpbin.org/get", {
retry: {
enabled: false,
},
});
```
## Params
<ParamField path="key" type="string" required={true}>
A unique string. Please see the [Keys and Resumability](/guides/resumability)
doc for more info.
</ParamField>
<ParamField path="url" type="string | URL" required={true}>
The URL to fetch.
</ParamField>
<ParamField path="options" type="object" required={false}>
<Expandable title="properties">
<ParamField path="method" type="string" required={false}>
The HTTP method to use. Defaults to `GET`.
</ParamField>
<ParamField path="headers" type="record" required={false}>
An object of headers to send with the request.
</ParamField>
<ParamField path="responseSchema" type="zod Schema" required={false}>
A [Zod](/guides/zod) schema to validate the response body.
</ParamField>
<ParamField path="body" type="json" required={false}>
The body to send with the request. Only valid for `POST`, `PUT`, and `PATCH`. You don't need to `JSON.stringify` before passing it in.
</ParamField>
</Expandable>
</ParamField>
## Response
<ParamField path="ok" type="boolean">
Whether the response was successful. Non-2xx status codes will have `ok =
false`.
</ParamField>
<ParamField path="body" type="object" required={false}>
The response body, parsed with the `responseSchema` if provided. Can be
undefined if the response body is empty.
</ParamField>
<ParamField path="status" type="number">
The HTTP status code.
</ParamField>
<ParamField path="headers" type="Record<string, string>">
The response headers.
</ParamField>
-41
View File
@@ -1,41 +0,0 @@
---
title: "Logging"
sidebarTitle: "Logging"
description: "There are 4 different types of logs you can add as workflow steps."
---
If you'd like to add additional logging to your workflow run, you can use our built-in logging utility
## Usage
```ts
import { Trigger } from "@trigger.dev/sdk";
new Trigger({
id: "my-trigger",
on: scheduleEvent({ rateOf: { minutes: 5 } }),
run: async (event, ctx) => {
await ctx.logger.info("It's been 5 minutes since the last run!");
},
}).listen();
```
This will log the message to your workflow run page in the Trigger dashboard
There are 4 different types of logs you can add as workflow steps:
```ts
await ctx.logger.info("It's been 5 minutes since the last run!");
await ctx.logger.debug("This is a debug log");
await ctx.logger.warn("This is a warning");
await ctx.logger.error("This is an error");
```
You can also include a second argument to the logger to add additional metadata to the log:
```ts
await ctx.logger.info("It's been 5 minutes since the last run!", {
foo: "bar",
baz: 123,
});
```
@@ -1,50 +0,0 @@
---
title: "Loops, Conditionals…"
sidebarTitle: "Loops, Conditionals…"
description: "Write any type of code."
---
Currently, we don't have anything special for loops or conditionals. You can just write plain-old TypeScript code and it will Just Work™.
## Loops
When you perform an action (sendEvent, delays, etc.) inside of a loop, make sure to create unique keys for each action to make sure that your workflows are [Resumable](/guides/resumability):
```ts
for (let i = 0; i < 10; i++) {
await ctx.waitFor(`Wait ${i}`, { seconds: 30 });
await slack.postMessage(`⭐️ New Star ${i}`, {
channelName: "github-stars",
text: `@${starredBy} just starred ${repoName}!`,
});
}
```
## Parallel Execution
You can run actions in parallel using `Promise.all`, like so:
```ts
await Promise.all(
messages.map((message) =>
slack.postMessage(message.id, {
channelName: "github-stars",
text: message.text,
})
)
);
```
## Conditionals
You can use `if` statements to conditionally execute code, just like normal code:
```ts
if (ctx.event.payload.action === "opened") {
await slack.postMessage("New Issue", {
channelName: "github-issues",
text: `@${ctx.event.payload.sender.login} just opened an issue!`,
});
}
```
-201
View File
@@ -1,201 +0,0 @@
---
title: "Send event"
sidebarTitle: "Send event"
description: "Send events to trigger your custom events workflows."
---
## Send an event
You can easily send an event from anywhere, including from inside another workflow. Events don't have to come from the same server as your workflow and can be sent as HTTP requests from any language (see our cURL example below for the format).
<Tabs>
<Tab title="Our Node.js SDK">
```ts
import { sendEvent } from "@trigger.dev/sdk";
//send an event with the name "user.created"
//and the payload
await sendEvent("start-fire-2", {
name: "user.created",
payload: { userId: "123456" },
});
```
</Tab>
<Tab title="cURL">
```bash
curl --request POST \
--url https://app.trigger.dev/api/v1/events \
--header 'Authorization: Bearer <insert_api_key_here>' \
--header 'Content-Type: application/json' \
--data '{
"id": "<optional unique event id>",
"event": {
"name": "user.created",
"payload": {
"userId": "123456"
}
}
}'
```
</Tab>
</Tabs>
If you are calling this from inside a workflow, ensure that the first parameter is unique inside your workflow.
## Sending events from other workflows
It is useful to send events from workflows because you can split your logic into smaller chunks and reuse them. The below example shows how a scheduled workflow delegates the work via sending a custom event:
<CodeGroup>
```ts check-scheduler.ts
new Trigger({
id: "check-scheduler",
name: "Check Scheduler",
on: scheduleEvent({ rateOf: { minutes: 10 } }),
run: async (event, context) => {
await context.sendEvent("health.check trigger.dev", {
name: "health.check",
payload: {
url: "https://trigger.dev",
host: "trigger.dev",
},
});
await context.sendEvent("health.check docs.trigger.dev", {
name: "health.check",
payload: {
url: "https://docs.trigger.dev",
host: "docs.trigger.dev",
},
});
await context.sendEvent("health.check app.trigger.dev", {
name: "health.check",
payload: {
url: "https://app.trigger.dev/healthcheck",
host: "app.trigger.dev",
},
});
},
}).listen();
```
```ts health-check.ts
export const healthCheck = new Trigger({
id: "health-check",
name: "Health Check",
on: customEvent({
name: "health.check",
schema: z.object({
url: z.string().url(),
host: z.string(),
}),
}),
run: async (event, context) => {
const response = await context.fetch("fetch site", event.url, {
method: "GET",
retry: {
enabled: false,
},
});
if (response.ok) {
await context.logger.info(`${event.host} is up!`);
return;
}
await slack.postMessage("Site is down", {
channelName: "health-checks",
text: `${event.host} is down: ${response.status}`,
});
},
}).listen();
```
</CodeGroup>
## Delaying event delivery
Through both our Node.js SDK and our HTTP API, you can delay the delivery of an event. This is useful if you want to send an event to trigger a workflow, but you want to wait for a certain amount of time before the event is delivered.
Using the health check example above, we can delay the delivery of the `health.check` event in various ways:
```ts
new Trigger({
id: "check-scheduler",
name: "Check Scheduler",
on: scheduleEvent({ rateOf: { minutes: 10 } }),
run: async (event, context) => {
await context.sendEvent("health.check trigger.dev", {
name: "health.check",
payload: {
url: "https://trigger.dev",
host: "trigger.dev",
},
delay: { until: new Date(Date.now() + 1000 * 60 * 5) }, // Delay until a specific date
});
await context.sendEvent("health.check docs.trigger.dev", {
name: "health.check",
payload: {
url: "https://docs.trigger.dev",
host: "docs.trigger.dev",
},
delay: { minutes: 5 }, // Delay for a specific amount of time
});
await context.sendEvent("health.check app.trigger.dev", {
name: "health.check",
payload: {
url: "https://app.trigger.dev/healthcheck",
host: "app.trigger.dev",
},
delay: { seconds: 30 }, // Delay for a specific amount of time
});
},
}).listen();
```
<Note>
When sending events in the context of a workflow run, adding a delay DOES NOT
add a delay to the workflow run, as sending a custom event is a
fire-and-forget action.
</Note>
You can add delays via the HTTP API by adding a `delay` object to the event:
```bash
curl --request POST \
--url https://app.trigger.dev/api/v1/events \
--header 'Authorization: Bearer <insert_api_key_here>' \
--header 'Content-Type: application/json' \
--data '{
"id": "<optional unique event id>",
"event": {
"name": "user.created",
"payload": {
"userId": "123456"
},
"delay": {
"seconds": 30
}
}
}'
```
## Event deduplication
When sending events, you can specify an `id` for the event. If you send an event with the same `id` multiple times, only the first event will be delivered. This is useful if you want to ensure that an event is only delivered once, even if you send it multiple times.
```ts
sendEvent({
id: "my-event-id",
name: "my-event",
payload: { foo: "bar" },
});
```
-26
View File
@@ -1,26 +0,0 @@
---
title: "Get in touch with us!"
sidebarTitle: "Get help"
description: "Contact us if you have any questions, or would like help with any issues."
---
<Note>We are active in the community and will respond to all messages.</Note>
Please email us at <a href="mailto:help@trigger.dev">help@trigger.dev</a> or choose one of the options below:
<CardGroup>
<Card
title="Join the communty"
icon="discord"
href="https://discord.gg/nkqV9xBYWy"
>
The place to meet other users, the team and to get product updates.
</Card>
<Card
title="Schedule a call"
icon="video"
href="https://cal.com/team/triggerdotdev/support"
>
A call with someone from our support team. We are happy to help.
</Card>
</CardGroup>
-235
View File
@@ -1,235 +0,0 @@
---
title: "Getting started with Trigger.dev"
sidebarTitle: "Quick start"
description: "Get your first workflow running in just a few minutes"
---
Trigger.dev workflows are written in your codebase and run in your existing infrastructure. This means:
- They are version controlled with the rest of your code.
- They run locally and don't require you to use tunnels.
<Note>
Currently we require you to have a long-running Node.js server, e.g. Express.
Support for serverless is coming soon.
</Note>
## 1. Installing @trigger.dev packages
In your existing project install the packages:
<Tabs>
<Tab title="npm">
```bash
npm install @trigger.dev/sdk @trigger.dev/integrations zod
```
</Tab>
<Tab title="pnpm">
```bash
pnpm install @trigger.dev/sdk @trigger.dev/integrations zod
```
</Tab>
<Tab title="yarn">
```bash
yarn add @trigger.dev/sdk @trigger.dev/integrations zod
```
</Tab>
</Tabs>
What do the packages do?
- `@trigger.dev/sdk` is required to use Trigger.dev, it allows you to run workflows.
- `@trigger.dev/integrations` allows you to easily subscribe to webhooks and use API calls from popular services.
- `zod` is used to define schemas (the expected shape of an object).
## 2. Sign in to your Trigger.dev dashboard
Go to [trigger.dev](https://app.trigger.dev) and sign up or login to your account.
## 3. Get your API keys
In the bottom-left corner of an Organization page you can find your API keys.
![API Keys](/images/api-keys.png)
## 4. Creating your first workflow
Workflows are triggered by events. In this example, we have defined a custom event called `user.created`. We support many different types of events including webhooks, scheduled, and more coming soon.
```ts first-workflow.ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { slack } from "@trigger.dev/integrations";
import { z } from "zod";
const postMessage = new Trigger({
id: "new-user",
name: "New user slack message",
apiKey: "<your_api_key>",
logLevel: "info",
on: customEvent({
name: "user.created",
schema: z.object({
name: z.string(),
email: z.string(),
paidPlan: z.boolean(),
}),
}),
run: async (event, ctx) => {
await ctx.logger.info("This log will appear on the Trigger.dev run page");
//send a message to the #new-users Slack channel with user details
const response = await slack.postMessage("send-to-slack", {
channel: "new-users",
text: `New user: ${event.name} (${event.email}) signed up. ${
event.paidPlan ? "They are paying" : "They are on the free plan"
}.`,
});
return response.message;
},
});
//this workflow will now connect and start listening for events
postMessage.listen();
```
You'll notice that when we subscribe to the custom event we have to say the name of the event and provide a schema. Schemas are created using Zod. In this case events must send an object that has `name`, `email`, and `paidPlan`.
<Note>
If the event is triggered with an object that doesn't match this schema, the
workflow won't run.
</Note>
<Note>
Above we set the API key inside the Trigger object. We recommend instead that
you add an environment variable called `TRIGGER_API_KEY`. That way you can use
your development API key locally and the production one when you deploy.
</Note>
## 6. Run your web server
Run your server how you normally would, e.g. `npm run dev`. This will connect your workflow to Trigger.dev, so we can start sending you events. You should see some log messages in your server console (tip: you can turn these off by removing the `logLevel: "info"` from the code above).
## 5. Testing your workflow from the dashboard
Now that the workflow is connected to Trigger.dev we need to trigger it. You can easily test your workflow from [your Trigger.dev dashboard](https://app.trigger.dev).
On the organization page you should see that the Workflow has now appeared (you may need to refresh the page from last time).
!["New user slack message" workflow](/images/workflow.png)
Move to the "New user slack message" and you will see the workflow page. There have been no runs yet.
Move to the "Test" page and input a valid test event, remember the workflow expects a name, email and paidPlan. You can copy this:
```json
{
"name": "Rick Astley",
"email": "nevergonn@giveyou.up",
"paidPlan": true
}
```
Hit the "Run test" button and it will take us to our first run 🚀!
![Test a run](/images/run-test.png)
## 6. The run page
All of the steps in a workflow, including the initial event, can be viewed in detail. You will need to refresh the page if it's running to see it move between steps.
But there's a problem, we've used Slack in our code and we haven't authenticated.
![Test run failed](/images/run-failed.png)
## 7. Authenticating with Slack
When a workflow step uses an API integration that you haven't already authenticated with, it will pause until you've authenticated.
Simply click the "Connect to Slack" button and sign-in with your desired Slack workspace. As soon as you do, the workflow will pick up where it left off.
Test complete!
![Test a run](/images/run-succeeded.png)
## 8. Triggering this workflow from code
As this workflow uses a custom event, we need to manually trigger it from our code. Anywhere in your code you can do this:
```ts
import { sendEvent } from "@trigger.dev/sdk";
/*
...your other code
*/
await sendEvent({
apiKey: "<my_api_key>",
event: {
name: "Eleven",
email: "jane@hawksmoorhigh.edu",
paidPlan: true,
},
});
```
When you run your server and this code executes, it will trigger the workflow. You will see this in the run list on your workflow page.
## Next steps
<Card
title="Join the communty"
icon="discord"
href="https://discord.gg/nkqV9xBYWy"
>
Meet other users, get help and product updates. We will respond to all
messages and will help with any issues.
</Card>
There are many things we didn't cover here, including Webhook and Scheduled triggers. Below are a some more features to explore:
### Triggers
Triggers are what cause your workflows to run.
<CardGroup>
<Card title="Webhooks" icon="rectangle-terminal" href="/triggers/webhooks">
Easily subscribe to the APIs you're using
</Card>
<Card title="Scheduled" icon="clock" href="/triggers/scheduled">
Trigger your workflows on a repeating schedule
</Card>
<Card title="Custom events" icon="code" href="/triggers/custom-events">
More details on custom events
</Card>
<Card title="More coming soon" icon="bookmark">
On received email, HTTP endpoint and AWS Event Bridge
</Card>
</CardGroup>
### Functions
<CardGroup>
<Card
title="API integrations"
icon="rectangle-terminal"
href="/integrations/apis"
>
We are making it easy to use lots of APIs by adding integrations.
</Card>
<Card title="Fetch" icon="server" href="/functions/fetch">
Call any API from your workflow
</Card>
<Card title="Delays" icon="alarm-clock" href="/functions/delays">
Add delays to your workflows. They're resilient so it doesn't matter if your
server goes down.
</Card>
<Card title="Send event" icon="code" href="/functions/send-event">
Send an event, to trigger a custom event workflow
</Card>
</CardGroup>
-64
View File
@@ -1,64 +0,0 @@
---
title: "Event Driven Architecture"
sidebarTitle: "Event Driven"
description: "How to build an event driven architecture using Trigger.dev"
---
## Event-driven Patterns in Trigger.dev
### Claim check pattern
Inspired by [this post](https://serverlessland.com/event-driven-architecture/visuals/claim-check-pattern) by [@boyney123](https://twitter.com/boyney123), here is how you could implement the claim check pattern using Trigger.dev:
```ts
import { Trigger } from "@trigger.dev/sdk";
import { github } from "@trigger.dev/integrations";
import { db } from "./db.server";
new Trigger({
id: "issue-producer",
on: github.events.issueEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
// 1. Store the event in a database (e.g. MongoDB, DynamoDB, etc.)
const id = await db.insert(ctx.id, event);
// 2. Send a new event with the id of the stored event
await ctx.sendEvent("📧 Send Event", {
name: "github.issue",
payload: {
id,
action: event.payload.action,
},
});
},
}).listen();
```
The above workflow will store any issue events from the trigger.dev repo in a database. Then, it will send a new event with the name `github.issue` and the id and action of the stored event. This event can then trigger another workflow and be used to retrieve the original event from the database:
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { db } from "./db.server";
import { z } from "zod";
new Trigger({
id: "opened-issue-consumer",
on: customEvent({
name: "github.issue",
filter: {
action: ["opened"],
}
schema: z.object({ id: z.string() }),
}),
run: async (event, ctx) => {
// 3. Retrieve the event from the database
const event = await db.get(ctx.id);
// 4. Do something with the event
},
}).listen();
```
As you can see above we filtered the event to only trigger when the action is `opened`. This is because we only want to do something when an issue is opened. We also used a schema to validate the event payload (which in this pattern is pretty simple).
-53
View File
@@ -1,53 +0,0 @@
---
title: "Event Filters"
sidebarTitle: "Event Filters"
description: "Event filters are used to filter events based on their attributes."
---
Event filters are used to filter events based on their attributes in the [customEvent](/reference/custom-event) and [webhookEvent](/reference/webhook-event) triggers.
They are declarative pattern-matching rules, modeled after [AWS EventBridge patterns](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html).
Given the following custom event payload:
```json
{
{
"uid": "jexAgaeJFJsrGfans1pxqm",
"type": "15 Min Meeting",
"price": 0,
"title": "15 Min Meeting between Eric Allam and John Doe",
"length": 15,
"status": "ACCEPTED",
"endTime": "2023-01-25T16:00:00Z",
"bookingId": 198052,
"organizer": {
"id": 32794,
"name": "Eric Allam",
"email": "eric@trigger.dev",
"language": { "locale": "en" },
"timeZone": "Europe/London"
},
}
}
```
The following event filter would match the event:
```json
{
"type": ["15 Min Meeting"],
"status": ["ACCEPTED", "REJECTED"],
"organizer": {
"name": ["Eric Allam"]
}
}
```
For an event pattern to match an event, the event must contain all the field names listed in the event pattern. The field names must also appear in the event with the same nesting structure.
The value of each field name in the event pattern must be an array of strings, numbers, or booleans. The event pattern matches the event if the value of the field name in the event is equal to any of the values in the array.
Effectively, each array is an OR condition, and the entire event pattern is an AND condition.
So the above event filter will match because `status == "ACCEPTED"`, and it would also match if `status == "REJECTED"`.
-72
View File
@@ -1,72 +0,0 @@
---
title: "Resumability"
sidebarTitle: "Keys and Resumability"
description: "Understand how keys work to ensure resumability of long-running workflows in Trigger.dev"
---
## Intro
In this article, we'll cover how Trigger.dev handles resumability of long-running workflows. We'll also cover how to use keys to ensure that your workflows are resumable.
## What is resumability?
Resumability is the ability of a workflow run to continue from where it left off after a failure or interruption. For example, if a workflow run is interrupted due to a network failure, it should be able to resume from where it left off when the network is back up.
We accomplish this by storing the state of the workflow run in a database, and when a workflow run is resumed we will call the `Trigger.run` function again.
We use step "keys" to determine which steps have already been executed. If a step has already been executed, we will skip it and move on to the next step.
## How to use keys
Like we mentioned above, we use step keys to determine which steps have already been executed. They are defined by you inside your `Trigger.run` function, for example when you call `slack.postMessage`:
```ts
await slack.postMessage("⭐️ New Star", {
channelName: "github-stars",
text: `@${starredBy} just starred ${repoName}!`,
});
```
In this example, the key is the string `"⭐️ New Star"`. This means that if the workflow is interrupted and then resumed, the `slack.postMessage` step will be skipped because it has already been executed.
If you make multiple calls to `slack.postMessage`, you should use different keys for each call. For example:
```ts
await slack.postMessage("⭐️ New Star", {
channelName: "github-stars",
text: `@${starredBy} just starred ${repoName}!`,
});
await slack.postMessage("🚨 Critical Issue", {
channelName: "critical-issues",
text: `@${assignee} just opened a critical issue in ${repoName}!`,
});
```
If you are calling a step multiple times with the same key, it will only be executed once. For example, if you call `slack.postMessage` with the key `"⭐️ New Star"` twice, it will only be executed once.
## How to use keys with loops
If you are using a loop, you should use the loop index as the key. For example:
```ts
for (let i = 0; i < 10; i++) {
await ctx.waitFor(`Wait ${i}`, { seconds: 30 });
await slack.postMessage(`⭐️ New Star ${i}`, {
channelName: "github-stars",
text: `@${starredBy} just starred ${repoName}!`,
});
}
```
## When to use keys
The following functions in Trigger.dev require a `key` parameter:
- Integration actions (e.g. `slack.postMessage`)
- [delays](/functions/delays)
- [sendEvent](/functions/send-event)
- [fetch](/functions/fetch)
[Logging](/functions/logging) does not require a key, as we are currently using the log message as the key.
-312
View File
@@ -1,312 +0,0 @@
---
title: "Zod Guide"
sidebarTitle: "Zod"
description: "TypeScript-first schema validation with static type inference"
---
## Intro
Zod is a fantastic utility package by [@colinhacks](https://twitter.com/colinhacks) that allows for defining runtime schema validation and type-safety.
We use it [extensively](https://github.com/search?q=repo%3Atriggerdotdev%2Ftrigger.dev+%22zod%22%3B&type=code) internally at Trigger.dev to ensure we never trigger your workflows with invalid data (and more).
But there are a few places where we ask you to provide us with a Zod schema, for example when defining a [Custom Event Trigger](/triggers/custom-events):
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { slack } from "@trigger.dev/integrations";
import { z } from "zod";
//this workflow will run when a "user.created" event is sent
new Trigger({
id: "zod",
name: "Zod custom event",
//this is the custom event subscription
on: customEvent({
name: "user.created",
schema: z.object({
name: z.string(),
email: z.string(),
paidPlan: z.boolean(),
}),
}),
//this function is run when the custom event is received
run: async (event, ctx) => {
console.log(event); // Has name, email, paidPlan
},
}).listen();
```
So it will help to know a little about Zod and how to use it. We definitely recommend the well written [Zod README](https://github.com/colinhacks/zod#readme) but we've included a short primer below.
<Tip>
Wherever we require you to pass in a Zod schema, you can always start with
`z.any()` which accepts `any` type and then add more strict validations later.
</Tip>
## Basic Usage
There are three main steps to using Zod:
1. Define a schema
```ts
import { z } from "zod";
const mySchema = z.object({
name: z.string(),
email: z.string(),
paidPlan: z.boolean(),
});
```
2. Infer TypeScript types from the schema
```ts
type MySchema = z.infer<typeof mySchema>;
```
3. Validate data against the schema
```ts
const data: unknown = {
name: "Eric",
email: "eric@trigger.dev",
paidPlan: true,
};
const result = mySchema.parse(data);
```
When using Zod with Trigger.dev, you'll only really need to do the first step, and by passing it to us (through the `schema` property of the `customEvent` function), we'll do the second and third steps for you.
## Defining Schemas
### Primitives
Zod schemas are a way to define the shape of an object. They can be as simple as a single type, or as complex as a nested object.
```ts
// Primitives
z.string();
z.number();
z.boolean();
z.date();
z.undefined();
z.null();
```
Any schema can be marked as optional, which means the schema can be `undefined` or `null`:
```ts
z.string().optional();
```
Schemas can also be marked optional by providing a default value:
```ts
const optionalString = z.string().default("default value");
const value = optionalString.parse(undefined); // value === "default value"
```
If you need to allow a value to be `null`, you can use `nullable()`:
```ts
const nullableString = z.string().nullable();
const value = nullableString.parse(null);
```
You can also use Zod to coerce primites into other types. For example, you can coerce a string into a number:
```ts
const numberString = z.coerce.number();
const value = numberString.parse("123"); // value === 123
```
The following primitives are supported:
```ts
z.coerce.string();
z.coerce.number();
z.coerce.boolean();
z.coerce.bigint();
z.coerce.date();
```
Coercing dates are especially useful when you are receiving a `string` from an API and want to convert it to a JavaScript `Date` object:
```ts
const date = z.coerce.date();
const value = date.parse("2021-01-01T00:00:00.000Z"); // value === Date object
```
### Objects
Object schemas are the most common type of schema. They allow you to define the shape of an object, and the types of each property.
```ts
const mySchema = z.object({
name: z.string(),
email: z.string(),
paidPlan: z.boolean(),
});
```
All properties are required by default, although you can make them all optional using `partial()`:
```ts
const mySchema = z
.object({
name: z.string(),
email: z.string(),
paidPlan: z.boolean(),
})
.partial();
```
You can also make individual properties optional:
```ts
const mySchema = z.object({
name: z.string(),
email: z.string(),
paidPlan: z.boolean().optional(),
});
```
By default an object schema will strip out any extra properties that are not defined in the schema. You can disable this behavior using `passthrough()`:
```ts
const mySchema = z.object({
name: z.string(),
});
mySchema.parse({ name: "Eric", email: "eric@trigger.dev" }); // { name: "Eric" }
mySchema.passthrough().parse({ name: "Eric", email: "eric@trigger.dev" }); // { name: "Eric", email: "eric@trigger.dev" }
```
Or you can use `strict()` to make the schema throw an error if there are any extra properties:
```ts
const mySchema = z
.object({
name: z.string(),
})
.strict();
mySchema.parse({ name: "Eric", email: "eric@trigger.dev" }); // throws error
```
Zod includes a few useful object schema utilities to help with reusing schemas, `extends()` and `merge()`:
```ts
const baseSchema = z.object({
name: z.string(),
});
const extendedSchema = baseSchema.extend({
email: z.string(),
});
const mergedSchema = baseSchema.merge(
z.object({
email: z.string(),
})
);
```
You can also use `pick()` and `omit()` to create a new schema that only includes or excludes certain properties:
```ts
const mySchema = z.object({
name: z.string(),
email: z.string(),
paidPlan: z.boolean(),
});
const pickedSchema = mySchema.pick({ name: true, email: true });
const omittedSchema = mySchema.omit({ paidPlan: true });
```
### Arrays
You can specify the schema of an array using `z.array()`:
```ts
z.array(z.string()); // string[]
z.array(z.number()); // number[]
z.array(z.object({ name: z.string() })); // Array<{ name: string }>
```
You can also specify the type of array that has a fixed number of elements using `z.tuple()`:
```ts
z.tuple([z.string(), z.number(), z.boolean()]); // [string, number, boolean]
```
### Unions
You can specify a union of schemas using `z.union()`:
```ts
z.union([z.string(), z.number(), z.boolean()]); // string | number | boolean
```
Discriminating unions are also supported, and especially useful when paired with type narrowing:
```ts
const mySchema = z.discriminatingUnion("type", [
z.object({
type: z.literal("a"),
data: z.string(),
}),
z.object({
type: z.literal("b"),
data: z.number(),
}),
]);
const value = mySchema.parse({ type: "a", data: "hello" });
if (type.a) {
// value is { type: "a", data: string }
} else if (type.b) {
// value is { type: "b", data: number }
}
```
### Records
You can specify a record of schemas using `z.record()`, useful for when you have a map of values but don't care about the keys:
```ts
z.record(z.string()); // Record<string, string>
z.record(z.number()); // Record<string, number>
```
### JSON type
If you want to accept any valid JSON value, you can use the following schema:
```ts
const literalSchema = z.union([z.string(), z.number(), z.boolean(), z.null()]);
type Literal = z.infer<typeof literalSchema>;
type Json = Literal | { [key: string]: Json } | Json[];
const jsonSchema: z.ZodType<Json> = z.lazy(() =>
z.union([literalSchema, z.array(jsonSchema), z.record(jsonSchema)])
);
jsonSchema.parse(data);
```
Hat tip to [ggoodman](https://github.com/ggoodman) for this one.
## Resources
Matt Pocock [@mattpocock](https://twitter.com/mattpocockuk) has a great free Zod Tutorial up on [Total Typescript](https://www.totaltypescript.com/tutorials/zod) that covers the basics of Zod.
Easily generate Zod schemas from [JSON](https://transform.tools/json-to-zod), [JSON Schemas](https://transform.tools/json-schema-to-zod), or [TypeScript](https://transform.tools/typescript-to-zod) types.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 405 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 KiB

-32
View File
@@ -1,32 +0,0 @@
---
title: "APIs"
sidebarTitle: "APIs"
description: "Integrations"
---
## Coming soon
We will show each API as a subpage. Each API page will break down all the functions available for each API. It will also link to the relevant sample projects.
<CardGroup>
<Card
title="GitHub"
icon="rectangle-terminal"
href="/integrations/apis/github"
></Card>
<Card
title="Shopify"
icon="rectangle-terminal"
href="/integrations/apis/shopify"
></Card>
<Card
title="Slack"
icon="rectangle-terminal"
href="/integrations/apis/slack"
></Card>
</CardGroup>
### Do you need a specific integration?
If so, [let us know](mailto:hello@trigger.dev) and we'll build it for
you.
-11
View File
@@ -1,11 +0,0 @@
---
title: "GitHub"
sidebarTitle: "GitHub"
description: "Support for the GitHub API"
---
## GitHub API integration
Full reference of all functions is coming soon.
Check out some example workflows using the GitHub API [here](/examples/github).
@@ -1,19 +0,0 @@
---
title: "GitHub Events"
sidebarTitle: "Events"
description: "GitHub Triggers"
---
## GitHub API integration
Full reference of all functions is coming soon.
Check out some example workflows using the GitHub API [here](/examples/github).
### Events
These are the events you can use to trigger a workflow
### Requests
These are the requests you can make to the GitHub API.
@@ -1,376 +0,0 @@
---
title: "Issue Comment Event"
sidebarTitle: "Issue Comments"
description: "Trigger a workflow whenever an issue_comment action is performed in a GitHub repository."
---
## Usage
```ts
import { github } from "@trigger.dev/integrations";
new Trigger({
id: "demo",
on: github.events.issueCommentEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {},
}).listen();
```
## Params
<ParamField path="repo" type="string" required={true}>
The full path to the repository, including the organization
</ParamField>
## Event
<ResponseField name="action" type="string">
The issue_comment action, which can be either created, deleted, or edited.
</ResponseField>
<ResponseField name="comment" type="object" required={true}>
The comment object.
</ResponseField>
<ResponseField name="issue" type="object" required={true}>
The issue object.
</ResponseField>
<ResponseField name="repository" type="object" required={true}>
A repository on GitHub.
</ResponseField>
<ResponseField name="sender" type="object" required={true}>
The GitHub user object who performed the action.
</ResponseField>
<ResponseField name="organization" type="object">
The organization object the repository belongs to.
</ResponseField>
## Example Workflows
<CodeGroup>
```typescript Notify Slack on new Issue comment
new Trigger({
id: "github-to-slack",
name: "Notify Slack on new Issue comment",
on: github.events.issueCommentEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
if (event.action === "created") {
await slack.postMessage("New Comment", {
channelName: "github-issues",
text: `New comment on issue ${event.issue.title} by ${event.sender.login}: ${event.comment.html_url}`,
});
}
},
}).listen();
```
</CodeGroup>
## Example Event payload
```json
{
"issue": {
"id": 1548436712,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/1",
"body": "Changed the body text once",
"user": {
"id": 10635986,
"url": "https://api.github.com/users/matt-aitken",
"type": "User",
"login": "matt-aitken",
"node_id": "MDQ6VXNlcjEwNjM1OTg2",
"html_url": "https://github.com/matt-aitken",
"gists_url": "https://api.github.com/users/matt-aitken/gists{/gist_id}",
"repos_url": "https://api.github.com/users/matt-aitken/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/10635986?v=4",
"events_url": "https://api.github.com/users/matt-aitken/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/matt-aitken/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/matt-aitken/followers",
"following_url": "https://api.github.com/users/matt-aitken/following{/other_user}",
"organizations_url": "https://api.github.com/users/matt-aitken/orgs",
"subscriptions_url": "https://api.github.com/users/matt-aitken/subscriptions",
"received_events_url": "https://api.github.com/users/matt-aitken/received_events"
},
"state": "open",
"title": "Changed test issue title",
"labels": [
{
"id": 5003355458,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels/documentation",
"name": "documentation",
"color": "0075ca",
"default": true,
"node_id": "LA_kwDOIxVdCc8AAAABKjklQg",
"description": "Improvements or additions to documentation"
},
{
"id": 5003355474,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels/enhancement",
"name": "enhancement",
"color": "a2eeef",
"default": true,
"node_id": "LA_kwDOIxVdCc8AAAABKjklUg",
"description": "New feature or request"
}
],
"locked": false,
"number": 1,
"node_id": "I_kwDOIxVdCc5cS0To",
"assignee": null,
"comments": 6,
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples/issues/1",
"assignees": [],
"closed_at": null,
"milestone": {
"id": 8941544,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones/1",
"state": "open",
"title": "Test milestone",
"due_on": "2023-01-20T08:00:00Z",
"number": 1,
"creator": {
"id": 10635986,
"url": "https://api.github.com/users/matt-aitken",
"type": "User",
"login": "matt-aitken",
"node_id": "MDQ6VXNlcjEwNjM1OTg2",
"html_url": "https://github.com/matt-aitken",
"gists_url": "https://api.github.com/users/matt-aitken/gists{/gist_id}",
"repos_url": "https://api.github.com/users/matt-aitken/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/10635986?v=4",
"events_url": "https://api.github.com/users/matt-aitken/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/matt-aitken/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/matt-aitken/followers",
"following_url": "https://api.github.com/users/matt-aitken/following{/other_user}",
"organizations_url": "https://api.github.com/users/matt-aitken/orgs",
"subscriptions_url": "https://api.github.com/users/matt-aitken/subscriptions",
"received_events_url": "https://api.github.com/users/matt-aitken/received_events"
},
"node_id": "MI_kwDOIxVdCc4AiG_o",
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples/milestone/1",
"closed_at": null,
"created_at": "2023-01-19T03:02:37Z",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones/1/labels",
"updated_at": "2023-01-19T17:21:25Z",
"description": "",
"open_issues": 1,
"closed_issues": 0
},
"reactions": {
"+1": 0,
"-1": 0,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/1/reactions",
"eyes": 0,
"heart": 0,
"laugh": 0,
"hooray": 0,
"rocket": 0,
"confused": 0,
"total_count": 0
},
"created_at": "2023-01-19T02:50:49Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/1/events",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/1/labels{/name}",
"updated_at": "2023-01-24T04:18:52Z",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/1/comments",
"state_reason": "reopened",
"timeline_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/1/timeline",
"repository_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples",
"active_lock_reason": null,
"author_association": "MEMBER",
"performed_via_github_app": null
},
"action": "created",
"sender": {
"id": 534,
"url": "https://api.github.com/users/ericallam",
"type": "User",
"login": "ericallam",
"node_id": "MDQ6VXNlcjUzNA==",
"html_url": "https://github.com/ericallam",
"gists_url": "https://api.github.com/users/ericallam/gists{/gist_id}",
"repos_url": "https://api.github.com/users/ericallam/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/534?v=4",
"events_url": "https://api.github.com/users/ericallam/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/ericallam/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/ericallam/followers",
"following_url": "https://api.github.com/users/ericallam/following{/other_user}",
"organizations_url": "https://api.github.com/users/ericallam/orgs",
"subscriptions_url": "https://api.github.com/users/ericallam/subscriptions",
"received_events_url": "https://api.github.com/users/ericallam/received_events"
},
"comment": {
"id": 1401375866,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments/1401375866",
"body": "New comment",
"user": {
"id": 534,
"url": "https://api.github.com/users/ericallam",
"type": "User",
"login": "ericallam",
"node_id": "MDQ6VXNlcjUzNA==",
"html_url": "https://github.com/ericallam",
"gists_url": "https://api.github.com/users/ericallam/gists{/gist_id}",
"repos_url": "https://api.github.com/users/ericallam/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/534?v=4",
"events_url": "https://api.github.com/users/ericallam/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/ericallam/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/ericallam/followers",
"following_url": "https://api.github.com/users/ericallam/following{/other_user}",
"organizations_url": "https://api.github.com/users/ericallam/orgs",
"subscriptions_url": "https://api.github.com/users/ericallam/subscriptions",
"received_events_url": "https://api.github.com/users/ericallam/received_events"
},
"node_id": "IC_kwDOIxVdCc5Th0x6",
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples/issues/1#issuecomment-1401375866",
"issue_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/1",
"reactions": {
"+1": 0,
"-1": 0,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments/1401375866/reactions",
"eyes": 0,
"heart": 0,
"laugh": 0,
"hooray": 0,
"rocket": 0,
"confused": 0,
"total_count": 0
},
"created_at": "2023-01-24T04:18:52Z",
"updated_at": "2023-01-24T04:18:52Z",
"author_association": "MEMBER",
"performed_via_github_app": null
},
"repository": {
"id": 588602633,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples",
"fork": false,
"name": "trigger.dev-examples",
"size": 161,
"forks": 0,
"owner": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"topics": [],
"git_url": "git://github.com/triggerdotdev/trigger.dev-examples.git",
"license": null,
"node_id": "R_kgDOIxVdCQ",
"private": false,
"ssh_url": "git@github.com:triggerdotdev/trigger.dev-examples.git",
"svn_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"archived": false,
"disabled": false,
"has_wiki": false,
"homepage": null,
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"keys_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/keys{/key_id}",
"language": "TypeScript",
"tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/tags",
"watchers": 1,
"blobs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/blobs{/sha}",
"clone_url": "https://github.com/triggerdotdev/trigger.dev-examples.git",
"forks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/forks",
"full_name": "triggerdotdev/trigger.dev-examples",
"has_pages": false,
"hooks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/hooks",
"pulls_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls{/number}",
"pushed_at": "2023-01-23T19:06:36Z",
"teams_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/teams",
"trees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/trees{/sha}",
"created_at": "2023-01-13T14:26:45Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/events",
"has_issues": true,
"issues_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues{/number}",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels{/name}",
"merges_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/merges",
"mirror_url": null,
"updated_at": "2023-01-23T14:22:40Z",
"visibility": "public",
"archive_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/{archive_format}{/ref}",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/commits{/sha}",
"compare_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/compare/{base}...{head}",
"description": "Node.js project with multiple example Trigger.dev workflows",
"forks_count": 0,
"is_template": false,
"open_issues": 2,
"branches_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/branches{/branch}",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contents/{+path}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/tags{/sha}",
"has_projects": true,
"releases_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/releases{/id}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/{sha}",
"allow_forking": true,
"assignees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/assignees{/user}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/downloads",
"has_downloads": false,
"languages_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/languages",
"default_branch": "main",
"milestones_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones{/number}",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/stargazers",
"watchers_count": 1,
"deployments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/deployments",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/commits{/sha}",
"has_discussions": false,
"subscribers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscribers",
"contributors_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contributors",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/events{/number}",
"stargazers_count": 1,
"subscription_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscription",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/collaborators{/collaborator}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/notifications{?since,all,participating}",
"open_issues_count": 2,
"web_commit_signoff_required": false
},
"organization": {
"id": 95297378,
"url": "https://api.github.com/orgs/triggerdotdev",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"hooks_url": "https://api.github.com/orgs/triggerdotdev/hooks",
"repos_url": "https://api.github.com/orgs/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/orgs/triggerdotdev/events",
"issues_url": "https://api.github.com/orgs/triggerdotdev/issues",
"description": "",
"members_url": "https://api.github.com/orgs/triggerdotdev/members{/member}",
"public_members_url": "https://api.github.com/orgs/triggerdotdev/public_members{/member}"
}
}
```
@@ -1,428 +0,0 @@
---
title: "Issue Event"
sidebarTitle: "Issues"
description: "Trigger a workflow whenever an issue action is performed in a GitHub repository."
---
## Usage
```ts
import { github } from "@trigger.dev/integrations";
new Trigger({
id: "demo",
on: github.events.issueEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {},
}).listen();
```
## Params
<ParamField path="repo" type="string" required={true}>
The full path to the repository, including the organization
</ParamField>
## Event
<ResponseField name="action" type="string">
The issue action, can be one of assigned, closed, deleted, edited, labeled,
unlabeled, locked, opened, pinned, reopened, transferred, unlocked, or
unassigned.
</ResponseField>
<ResponseField name="issue" type="object" required={true}>
The issue object.
</ResponseField>
<ResponseField name="repository" type="object" required={true}>
A repository on GitHub.
</ResponseField>
<ResponseField name="sender" type="object" required={true}>
The GitHub user object who performed the action.
</ResponseField>
<ResponseField name="organization" type="object">
The organization object the repository belongs to.
</ResponseField>
## Additional event fields
### transferred issues
<ResponseField name="changes" type="object">
<Expandable title="properties">
<ResponseField name="new_issue" type="object">
The new issue object.
</ResponseField>
<ResponseField name="new_repository" type="object">
The new issue repository.
</ResponseField>
</Expandable>
</ResponseField>
### edited issues
<ResponseField name="changes" type="object">
<Expandable title="properties">
<ResponseField name="body" type="object">
<Expandable title="properties" defaultOpen={true}>
<ResponseField name="from" type="string">
The previous body text.
</ResponseField>
</Expandable>
</ResponseField>
<ResponseField name="title" type="object">
<Expandable title="properties" defaultOpen={true}>
<ResponseField name="from" type="string">
The previous title text.
</ResponseField>
</Expandable>
</ResponseField>
</Expandable>
</ResponseField>
### labeled/unlabeled issues
<ResponseField name="label" type="object">
The label object.
</ResponseField>
### assigned/unassigned issues
<ResponseField name="assignee" type="object">
The assignee object.
</ResponseField>
### opened issues
<ResponseField name="changes" type="object">
<Expandable title="properties">
<ResponseField name="old_issue" type="object">
The old issue object.
</ResponseField>
<ResponseField name="old_repository" type="object">
The old issue repository.
</ResponseField>
</Expandable>
</ResponseField>
## Example Workflows
<CodeGroup>
```typescript Notify Slack on Critical Issue
new Trigger({
id: "github-to-slack",
name: "Notify of critical issues",
on: github.events.issueEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
if (event.action === "labeled") {
if (event.label?.name === "critical") {
await slack.postMessage("send-to-slack", {
channelName: "serious-issues",
text: `Critical issue: ${event.issue.title} was labeled ${event.label.name}`,
});
}
}
return event;
},
}).listen();
```
</CodeGroup>
## Example Event payload
```json
{
"issue": {
"id": 1514714160,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev/issues/2",
"body": "This is the body text\r\n`const name = \"Matt\"`",
"user": {
"id": 10635986,
"url": "https://api.github.com/users/matt-aitken",
"type": "User",
"login": "matt-aitken",
"node_id": "MDQ6VXNlcjEwNjM1OTg2",
"html_url": "https://github.com/matt-aitken",
"gists_url": "https://api.github.com/users/matt-aitken/gists{/gist_id}",
"repos_url": "https://api.github.com/users/matt-aitken/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/10635986?v=4",
"events_url": "https://api.github.com/users/matt-aitken/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/matt-aitken/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/matt-aitken/followers",
"following_url": "https://api.github.com/users/matt-aitken/following{/other_user}",
"organizations_url": "https://api.github.com/users/matt-aitken/orgs",
"subscriptions_url": "https://api.github.com/users/matt-aitken/subscriptions",
"received_events_url": "https://api.github.com/users/matt-aitken/received_events"
},
"state": "open",
"title": "Test issue for webhook",
"labels": [
{
"id": 4858587614,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev/labels/documentation",
"name": "documentation",
"color": "0075ca",
"default": true,
"node_id": "LA_kwDOIiC6Ac8AAAABIZgp3g",
"description": "Improvements or additions to documentation"
},
{
"id": 5009913913,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev/labels/critical",
"name": "critical",
"color": "e99695",
"default": false,
"node_id": "LA_kwDOIiC6Ac8AAAABKp04OQ",
"description": ""
}
],
"locked": false,
"number": 2,
"node_id": "I_kwDOIiC6Ac5aSLQw",
"assignee": {
"id": 10635986,
"url": "https://api.github.com/users/matt-aitken",
"type": "User",
"login": "matt-aitken",
"node_id": "MDQ6VXNlcjEwNjM1OTg2",
"html_url": "https://github.com/matt-aitken",
"gists_url": "https://api.github.com/users/matt-aitken/gists{/gist_id}",
"repos_url": "https://api.github.com/users/matt-aitken/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/10635986?v=4",
"events_url": "https://api.github.com/users/matt-aitken/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/matt-aitken/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/matt-aitken/followers",
"following_url": "https://api.github.com/users/matt-aitken/following{/other_user}",
"organizations_url": "https://api.github.com/users/matt-aitken/orgs",
"subscriptions_url": "https://api.github.com/users/matt-aitken/subscriptions",
"received_events_url": "https://api.github.com/users/matt-aitken/received_events"
},
"comments": 2,
"html_url": "https://github.com/triggerdotdev/trigger.dev/issues/2",
"assignees": [
{
"id": 10635986,
"url": "https://api.github.com/users/matt-aitken",
"type": "User",
"login": "matt-aitken",
"node_id": "MDQ6VXNlcjEwNjM1OTg2",
"html_url": "https://github.com/matt-aitken",
"gists_url": "https://api.github.com/users/matt-aitken/gists{/gist_id}",
"repos_url": "https://api.github.com/users/matt-aitken/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/10635986?v=4",
"events_url": "https://api.github.com/users/matt-aitken/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/matt-aitken/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/matt-aitken/followers",
"following_url": "https://api.github.com/users/matt-aitken/following{/other_user}",
"organizations_url": "https://api.github.com/users/matt-aitken/orgs",
"subscriptions_url": "https://api.github.com/users/matt-aitken/subscriptions",
"received_events_url": "https://api.github.com/users/matt-aitken/received_events"
}
],
"closed_at": null,
"milestone": null,
"reactions": {
"+1": 0,
"-1": 0,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev/issues/2/reactions",
"eyes": 0,
"heart": 0,
"laugh": 0,
"hooray": 0,
"rocket": 0,
"confused": 0,
"total_count": 0
},
"created_at": "2022-12-30T18:34:01Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/issues/2/events",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/issues/2/labels{/name}",
"updated_at": "2023-01-15T20:18:14Z",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/issues/2/comments",
"state_reason": null,
"timeline_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/issues/2/timeline",
"repository_url": "https://api.github.com/repos/triggerdotdev/trigger.dev",
"active_lock_reason": null,
"author_association": "MEMBER",
"performed_via_github_app": null
},
"label": {
"id": 5009913913,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev/labels/critical",
"name": "critical",
"color": "e99695",
"default": false,
"node_id": "LA_kwDOIiC6Ac8AAAABKp04OQ",
"description": ""
},
"action": "labeled",
"sender": {
"id": 7555566,
"url": "https://api.github.com/users/samejr",
"type": "User",
"login": "samejr",
"node_id": "MDQ6VXNlcjc1NTU1NjY=",
"html_url": "https://github.com/samejr",
"gists_url": "https://api.github.com/users/samejr/gists{/gist_id}",
"repos_url": "https://api.github.com/users/samejr/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/7555566?v=4",
"events_url": "https://api.github.com/users/samejr/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/samejr/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/samejr/followers",
"following_url": "https://api.github.com/users/samejr/following{/other_user}",
"organizations_url": "https://api.github.com/users/samejr/orgs",
"subscriptions_url": "https://api.github.com/users/samejr/subscriptions",
"received_events_url": "https://api.github.com/users/samejr/received_events"
},
"repository": {
"id": 572570113,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev",
"fork": false,
"name": "trigger.dev",
"size": 14727,
"forks": 2,
"owner": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"topics": [
"apis",
"automation",
"event-driven",
"events",
"orchestration",
"scheduler",
"workflows"
],
"git_url": "git://github.com/triggerdotdev/trigger.dev.git",
"license": {
"key": "apache-2.0",
"url": "https://api.github.com/licenses/apache-2.0",
"name": "Apache License 2.0",
"node_id": "MDc6TGljZW5zZTI=",
"spdx_id": "Apache-2.0"
},
"node_id": "R_kgDOIiC6AQ",
"private": false,
"ssh_url": "git@github.com:triggerdotdev/trigger.dev.git",
"svn_url": "https://github.com/triggerdotdev/trigger.dev",
"archived": false,
"disabled": false,
"has_wiki": true,
"homepage": "https://trigger.dev",
"html_url": "https://github.com/triggerdotdev/trigger.dev",
"keys_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/keys{/key_id}",
"language": "TypeScript",
"tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/tags",
"watchers": 58,
"blobs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/git/blobs{/sha}",
"clone_url": "https://github.com/triggerdotdev/trigger.dev.git",
"forks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/forks",
"full_name": "triggerdotdev/trigger.dev",
"has_pages": false,
"hooks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/hooks",
"pulls_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/pulls{/number}",
"pushed_at": "2023-01-15T19:41:24Z",
"teams_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/teams",
"trees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/git/trees{/sha}",
"created_at": "2022-11-30T14:59:07Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/events",
"has_issues": true,
"issues_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/issues{/number}",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/labels{/name}",
"merges_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/merges",
"mirror_url": null,
"updated_at": "2023-01-15T18:49:01Z",
"visibility": "public",
"archive_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/{archive_format}{/ref}",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/commits{/sha}",
"compare_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/compare/{base}...{head}",
"description": "The developer-first, open source Zapier Alternative. Coming soon. Give us a ⭐️ and we'll let you know",
"forks_count": 2,
"is_template": false,
"open_issues": 2,
"branches_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/branches{/branch}",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/contents/{+path}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/git/tags{/sha}",
"has_projects": true,
"releases_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/releases{/id}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/statuses/{sha}",
"allow_forking": true,
"assignees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/assignees{/user}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/downloads",
"has_downloads": true,
"languages_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/languages",
"default_branch": "main",
"milestones_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/milestones{/number}",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/stargazers",
"watchers_count": 58,
"deployments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/deployments",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/git/commits{/sha}",
"has_discussions": false,
"subscribers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/subscribers",
"contributors_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/contributors",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/issues/events{/number}",
"stargazers_count": 58,
"subscription_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/subscription",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/collaborators{/collaborator}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/issues/comments{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/trigger.dev/notifications{?since,all,participating}",
"open_issues_count": 2,
"web_commit_signoff_required": false
},
"organization": {
"id": 95297378,
"url": "https://api.github.com/orgs/triggerdotdev",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"hooks_url": "https://api.github.com/orgs/triggerdotdev/hooks",
"repos_url": "https://api.github.com/orgs/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/orgs/triggerdotdev/events",
"issues_url": "https://api.github.com/orgs/triggerdotdev/issues",
"description": "",
"members_url": "https://api.github.com/orgs/triggerdotdev/members{/member}",
"public_members_url": "https://api.github.com/orgs/triggerdotdev/public_members{/member}"
}
}
```
@@ -1,220 +0,0 @@
---
title: "New Star Event"
sidebarTitle: "New Star"
description: "Trigger a workflow whenever a user star's the specified GitHub repository."
---
## Usage
```ts
import { github } from "@trigger.dev/integrations";
new Trigger({
id: "demo",
on: github.events.newStarEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {},
}).listen();
```
## Params
<ParamField path="repo" type="string" required={true}>
The full path to the repository, including the organization
</ParamField>
## Event
<ResponseField name="action" type="string" default="created">
The star action, which in this case is always `"created"`.
</ResponseField>
<ResponseField name="starred_at" type="Date" required={true}>
The date and time the starring occurred.
</ResponseField>
<ResponseField name="repository" type="object" required={true}>
A repository on GitHub.
</ResponseField>
<ResponseField name="sender" type="object" required={true}>
The GitHub user object who starred the repository.
</ResponseField>
<ResponseField name="organization" type="object">
The organization object the repository belongs to.
</ResponseField>
## Example Workflows
<CodeGroup>
```typescript Notify Slack on New Star
import { slack } from "@trigger.dev/integrations";
new Trigger({
id: "new-star",
name: "On New Star",
on: github.events.newStarEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
await slack.postMessage("⭐️ New Star", {
channelName: "github-stars",
text: `Repo ${event.repository.full_name} got a star from ${event.sender.login}, for a total of ${event.repository.stargazers_count} stars!`,
});
},
}).listen();
```
</CodeGroup>
## Example Event payload
```json Example
{
"action": "created",
"starred_at": "2023-01-21T23:47:38Z",
"repository": {
"id": 516315865,
"node_id": "R_kgDOHsZa2Q",
"name": "apihero-openapi-generator",
"full_name": "triggerdotdev/apihero-openapi-generator",
"private": false,
"owner": {
"login": "triggerdotdev",
"id": 95297378,
"node_id": "O_kgDOBa4fYg",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/triggerdotdev",
"html_url": "https://github.com/triggerdotdev",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events",
"type": "Organization",
"site_admin": false
},
"html_url": "https://github.com/triggerdotdev/apihero-openapi-generator",
"description": null,
"fork": false,
"url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator",
"forks_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/forks",
"keys_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/teams",
"hooks_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/hooks",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/issues/events{/number}",
"events_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/events",
"assignees_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/assignees{/user}",
"branches_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/branches{/branch}",
"tags_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/tags",
"blobs_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/statuses/{sha}",
"languages_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/languages",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/stargazers",
"contributors_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/contributors",
"subscribers_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/subscribers",
"subscription_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/subscription",
"commits_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/contents/{+path}",
"compare_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/merges",
"archive_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/downloads",
"issues_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/issues{/number}",
"pulls_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/pulls{/number}",
"milestones_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/milestones{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/labels{/name}",
"releases_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/releases{/id}",
"deployments_url": "https://api.github.com/repos/triggerdotdev/apihero-openapi-generator/deployments",
"created_at": "2022-07-21T09:57:53Z",
"updated_at": "2023-01-21T23:47:38Z",
"pushed_at": "2022-10-20T13:21:09Z",
"git_url": "git://github.com/triggerdotdev/apihero-openapi-generator.git",
"ssh_url": "git@github.com:triggerdotdev/apihero-openapi-generator.git",
"clone_url": "https://github.com/triggerdotdev/apihero-openapi-generator.git",
"svn_url": "https://github.com/triggerdotdev/apihero-openapi-generator",
"homepage": null,
"size": 4962,
"stargazers_count": 1,
"watchers_count": 1,
"language": "TypeScript",
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"has_discussions": false,
"forks_count": 0,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 0,
"license": {
"key": "mit",
"name": "MIT License",
"spdx_id": "MIT",
"url": "https://api.github.com/licenses/mit",
"node_id": "MDc6TGljZW5zZTEz"
},
"allow_forking": true,
"is_template": false,
"web_commit_signoff_required": false,
"topics": [],
"visibility": "public",
"forks": 0,
"open_issues": 0,
"watchers": 1,
"default_branch": "main"
},
"organization": {
"login": "triggerdotdev",
"id": 95297378,
"node_id": "O_kgDOBa4fYg",
"url": "https://api.github.com/orgs/triggerdotdev",
"repos_url": "https://api.github.com/orgs/triggerdotdev/repos",
"events_url": "https://api.github.com/orgs/triggerdotdev/events",
"hooks_url": "https://api.github.com/orgs/triggerdotdev/hooks",
"issues_url": "https://api.github.com/orgs/triggerdotdev/issues",
"members_url": "https://api.github.com/orgs/triggerdotdev/members{/member}",
"public_members_url": "https://api.github.com/orgs/triggerdotdev/public_members{/member}",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"description": ""
},
"sender": {
"login": "ericallam",
"id": 534,
"node_id": "MDQ6VXNlcjUzNA==",
"avatar_url": "https://avatars.githubusercontent.com/u/534?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/ericallam",
"html_url": "https://github.com/ericallam",
"followers_url": "https://api.github.com/users/ericallam/followers",
"following_url": "https://api.github.com/users/ericallam/following{/other_user}",
"gists_url": "https://api.github.com/users/ericallam/gists{/gist_id}",
"starred_url": "https://api.github.com/users/ericallam/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/ericallam/subscriptions",
"organizations_url": "https://api.github.com/users/ericallam/orgs",
"repos_url": "https://api.github.com/users/ericallam/repos",
"events_url": "https://api.github.com/users/ericallam/events{/privacy}",
"received_events_url": "https://api.github.com/users/ericallam/received_events",
"type": "User",
"site_admin": false
}
}
```
@@ -1,97 +0,0 @@
---
title: "PR Review Comment Event"
sidebarTitle: "PR Review Comments"
description: "Trigger a workflow whenever an pull_request_review_comment action is performed in a GitHub repository."
---
<Note>
If you would like to trigger a workflow when a comment is made on a PR, use
the [issueCommentEvent](/integrations/apis/github/events/issue-comments)
instead
</Note>
## Usage
```ts
import { github } from "@trigger.dev/integrations";
new Trigger({
id: "demo",
on: github.events.pullRequestCommentEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {},
}).listen();
```
## Params
<ParamField path="repo" type="string" required={true}>
The full path to the repository, including the organization
</ParamField>
## Event
<ResponseField name="action" type="string">
The pull_request action, can be one of: `created`, `edited`, `deleted`.
</ResponseField>
<ResponseField name="comment" type="object" required={true}>
The pull request review comment object.
</ResponseField>
<ResponseField name="pull_request" type="object" required={true}>
The pull request object.
</ResponseField>
<ResponseField name="repository" type="object" required={true}>
A repository on GitHub.
</ResponseField>
<ResponseField name="sender" type="object" required={true}>
The GitHub user object who performed the action.
</ResponseField>
<ResponseField name="organization" type="object">
The organization object the repository belongs to.
</ResponseField>
## Additional event fields
### edited PR Review Comment
<ResponseField name="changes" type="object">
<Expandable title="properties">
<ResponseField name="body" type="object">
<Expandable title="properties" defaultOpen={true}>
<ResponseField name="from" type="string">
The previous body text.
</ResponseField>
</Expandable>
</ResponseField>
</Expandable>
</ResponseField>
## Example Workflows
<CodeGroup>
```typescript Notify Slack on new PR
new Trigger({
id: "new-pr",
name: "Notify Slack on new PR Review Comment",
on: github.events.pullRequestCommentEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
if (event.action === "created") {
await slack.postMessage("New PR comment", {
channelName: "github-prs",
text: `New PR comment by ${event.sender.login} on PR ${event.pull_request.title} (${event.pull_request.html_url})`,
});
}
},
}).listen();
```
</CodeGroup>
@@ -1,625 +0,0 @@
---
title: "PR Review Event"
sidebarTitle: "PR Reviews"
description: "Trigger a workflow whenever an pull_request_review action is performed in a GitHub repository."
---
## Usage
```ts
import { github } from "@trigger.dev/integrations";
new Trigger({
id: "demo",
on: github.events.pullRequestReviewEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {},
}).listen();
```
## Params
<ParamField path="repo" type="string" required={true}>
The full path to the repository, including the organization
</ParamField>
## Event
<ResponseField name="action" type="string">
The pull_request_review action, can be one of: `submitted`, `edited`,
`dismissed`.
</ResponseField>
<ResponseField name="review" type="object" required={true}>
The pull request review object.
</ResponseField>
<ResponseField name="pull_request" type="object" required={true}>
The pull request object.
</ResponseField>
<ResponseField name="repository" type="object" required={true}>
A repository on GitHub.
</ResponseField>
<ResponseField name="sender" type="object" required={true}>
The GitHub user object who performed the action.
</ResponseField>
<ResponseField name="organization" type="object">
The organization object the repository belongs to.
</ResponseField>
## Additional event fields
### edited PR Review
<ResponseField name="changes" type="object">
<Expandable title="properties">
<ResponseField name="body" type="object">
<Expandable title="properties" defaultOpen={true}>
<ResponseField name="from" type="string">
The previous body text.
</ResponseField>
</Expandable>
</ResponseField>
</Expandable>
</ResponseField>
## Example Workflows
<CodeGroup>
```typescript Notify Slack on new PR Review
new Trigger({
id: "new-pr",
name: "Notify Slack on new PR Review",
on: github.events.pullRequestReviewEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
if (event.action === "submitted") {
await slack.postMessage("New PR Review", {
channelName: "github-prs",
text: `New PR Review by ${event.sender.login} on PR ${event.pull_request.title} (${event.pull_request.html_url})`,
});
}
},
}).listen();
```
</CodeGroup>
## Example Event payload
```json
{
"action": "submitted",
"review": {
"id": 1266763458,
"body": "This is a PR review comment?",
"user": {
"id": 534,
"url": "https://api.github.com/users/ericallam",
"type": "User",
"login": "ericallam",
"node_id": "MDQ6VXNlcjUzNA==",
"html_url": "https://github.com/ericallam",
"gists_url": "https://api.github.com/users/ericallam/gists{/gist_id}",
"repos_url": "https://api.github.com/users/ericallam/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/534?v=4",
"events_url": "https://api.github.com/users/ericallam/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/ericallam/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/ericallam/followers",
"following_url": "https://api.github.com/users/ericallam/following{/other_user}",
"organizations_url": "https://api.github.com/users/ericallam/orgs",
"subscriptions_url": "https://api.github.com/users/ericallam/subscriptions",
"received_events_url": "https://api.github.com/users/ericallam/received_events"
},
"state": "commented",
"_links": {
"html": {
"href": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4#pullrequestreview-1266763458"
},
"pull_request": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4"
}
},
"node_id": "PRR_kwDOIxVdCc5LgUbC",
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4#pullrequestreview-1266763458",
"commit_id": "efc58e149c06f4a45ebf7a0bf34ac25cdcd34b07",
"submitted_at": "2023-01-24T04:24:58Z",
"pull_request_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4",
"author_association": "MEMBER"
},
"sender": {
"id": 534,
"url": "https://api.github.com/users/ericallam",
"type": "User",
"login": "ericallam",
"node_id": "MDQ6VXNlcjUzNA==",
"html_url": "https://github.com/ericallam",
"gists_url": "https://api.github.com/users/ericallam/gists{/gist_id}",
"repos_url": "https://api.github.com/users/ericallam/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/534?v=4",
"events_url": "https://api.github.com/users/ericallam/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/ericallam/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/ericallam/followers",
"following_url": "https://api.github.com/users/ericallam/following{/other_user}",
"organizations_url": "https://api.github.com/users/ericallam/orgs",
"subscriptions_url": "https://api.github.com/users/ericallam/subscriptions",
"received_events_url": "https://api.github.com/users/ericallam/received_events"
},
"repository": {
"id": 588602633,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples",
"fork": false,
"name": "trigger.dev-examples",
"size": 161,
"forks": 0,
"owner": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"topics": [],
"git_url": "git://github.com/triggerdotdev/trigger.dev-examples.git",
"license": null,
"node_id": "R_kgDOIxVdCQ",
"private": false,
"ssh_url": "git@github.com:triggerdotdev/trigger.dev-examples.git",
"svn_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"archived": false,
"disabled": false,
"has_wiki": false,
"homepage": null,
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"keys_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/keys{/key_id}",
"language": "TypeScript",
"tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/tags",
"watchers": 1,
"blobs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/blobs{/sha}",
"clone_url": "https://github.com/triggerdotdev/trigger.dev-examples.git",
"forks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/forks",
"full_name": "triggerdotdev/trigger.dev-examples",
"has_pages": false,
"hooks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/hooks",
"pulls_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls{/number}",
"pushed_at": "2023-01-24T04:20:52Z",
"teams_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/teams",
"trees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/trees{/sha}",
"created_at": "2023-01-13T14:26:45Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/events",
"has_issues": true,
"issues_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues{/number}",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels{/name}",
"merges_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/merges",
"mirror_url": null,
"updated_at": "2023-01-23T14:22:40Z",
"visibility": "public",
"archive_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/{archive_format}{/ref}",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/commits{/sha}",
"compare_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/compare/{base}...{head}",
"description": "Node.js project with multiple example Trigger.dev workflows",
"forks_count": 0,
"is_template": false,
"open_issues": 3,
"branches_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/branches{/branch}",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contents/{+path}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/tags{/sha}",
"has_projects": true,
"releases_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/releases{/id}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/{sha}",
"allow_forking": true,
"assignees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/assignees{/user}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/downloads",
"has_downloads": false,
"languages_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/languages",
"default_branch": "main",
"milestones_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones{/number}",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/stargazers",
"watchers_count": 1,
"deployments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/deployments",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/commits{/sha}",
"has_discussions": false,
"subscribers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscribers",
"contributors_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contributors",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/events{/number}",
"stargazers_count": 1,
"subscription_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscription",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/collaborators{/collaborator}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/notifications{?since,all,participating}",
"open_issues_count": 3,
"web_commit_signoff_required": false
},
"organization": {
"id": 95297378,
"url": "https://api.github.com/orgs/triggerdotdev",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"hooks_url": "https://api.github.com/orgs/triggerdotdev/hooks",
"repos_url": "https://api.github.com/orgs/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/orgs/triggerdotdev/events",
"issues_url": "https://api.github.com/orgs/triggerdotdev/issues",
"description": "",
"members_url": "https://api.github.com/orgs/triggerdotdev/members{/member}",
"public_members_url": "https://api.github.com/orgs/triggerdotdev/public_members{/member}"
},
"pull_request": {
"id": 1214500311,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4",
"base": {
"ref": "main",
"sha": "e7c0680e23fcd3e52d35ddfbb4076112c640d9fa",
"repo": {
"id": 588602633,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples",
"fork": false,
"name": "trigger.dev-examples",
"size": 161,
"forks": 0,
"owner": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"topics": [],
"git_url": "git://github.com/triggerdotdev/trigger.dev-examples.git",
"license": null,
"node_id": "R_kgDOIxVdCQ",
"private": false,
"ssh_url": "git@github.com:triggerdotdev/trigger.dev-examples.git",
"svn_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"archived": false,
"disabled": false,
"has_wiki": false,
"homepage": null,
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"keys_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/keys{/key_id}",
"language": "TypeScript",
"tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/tags",
"watchers": 1,
"blobs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/blobs{/sha}",
"clone_url": "https://github.com/triggerdotdev/trigger.dev-examples.git",
"forks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/forks",
"full_name": "triggerdotdev/trigger.dev-examples",
"has_pages": false,
"hooks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/hooks",
"pulls_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls{/number}",
"pushed_at": "2023-01-24T04:20:52Z",
"teams_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/teams",
"trees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/trees{/sha}",
"created_at": "2023-01-13T14:26:45Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/events",
"has_issues": true,
"issues_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues{/number}",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels{/name}",
"merges_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/merges",
"mirror_url": null,
"updated_at": "2023-01-23T14:22:40Z",
"visibility": "public",
"archive_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/{archive_format}{/ref}",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/commits{/sha}",
"compare_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/compare/{base}...{head}",
"description": "Node.js project with multiple example Trigger.dev workflows",
"forks_count": 0,
"is_template": false,
"open_issues": 3,
"branches_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/branches{/branch}",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contents/{+path}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/tags{/sha}",
"has_projects": true,
"releases_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/releases{/id}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/{sha}",
"allow_forking": true,
"assignees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/assignees{/user}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/downloads",
"has_downloads": false,
"languages_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/languages",
"default_branch": "main",
"milestones_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones{/number}",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/stargazers",
"watchers_count": 1,
"deployments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/deployments",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/commits{/sha}",
"has_discussions": false,
"subscribers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscribers",
"allow_auto_merge": false,
"contributors_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contributors",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/events{/number}",
"stargazers_count": 1,
"subscription_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscription",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/collaborators{/collaborator}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/notifications{?since,all,participating}",
"open_issues_count": 3,
"allow_merge_commit": true,
"allow_rebase_merge": true,
"allow_squash_merge": true,
"merge_commit_title": "MERGE_MESSAGE",
"allow_update_branch": false,
"merge_commit_message": "PR_TITLE",
"delete_branch_on_merge": false,
"squash_merge_commit_title": "COMMIT_OR_PR_TITLE",
"squash_merge_commit_message": "COMMIT_MESSAGES",
"web_commit_signoff_required": false,
"use_squash_pr_title_as_default": false
},
"user": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"label": "triggerdotdev:main"
},
"body": null,
"head": {
"ref": "resend",
"sha": "efc58e149c06f4a45ebf7a0bf34ac25cdcd34b07",
"repo": {
"id": 588602633,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples",
"fork": false,
"name": "trigger.dev-examples",
"size": 161,
"forks": 0,
"owner": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"topics": [],
"git_url": "git://github.com/triggerdotdev/trigger.dev-examples.git",
"license": null,
"node_id": "R_kgDOIxVdCQ",
"private": false,
"ssh_url": "git@github.com:triggerdotdev/trigger.dev-examples.git",
"svn_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"archived": false,
"disabled": false,
"has_wiki": false,
"homepage": null,
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"keys_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/keys{/key_id}",
"language": "TypeScript",
"tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/tags",
"watchers": 1,
"blobs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/blobs{/sha}",
"clone_url": "https://github.com/triggerdotdev/trigger.dev-examples.git",
"forks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/forks",
"full_name": "triggerdotdev/trigger.dev-examples",
"has_pages": false,
"hooks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/hooks",
"pulls_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls{/number}",
"pushed_at": "2023-01-24T04:20:52Z",
"teams_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/teams",
"trees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/trees{/sha}",
"created_at": "2023-01-13T14:26:45Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/events",
"has_issues": true,
"issues_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues{/number}",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels{/name}",
"merges_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/merges",
"mirror_url": null,
"updated_at": "2023-01-23T14:22:40Z",
"visibility": "public",
"archive_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/{archive_format}{/ref}",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/commits{/sha}",
"compare_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/compare/{base}...{head}",
"description": "Node.js project with multiple example Trigger.dev workflows",
"forks_count": 0,
"is_template": false,
"open_issues": 3,
"branches_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/branches{/branch}",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contents/{+path}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/tags{/sha}",
"has_projects": true,
"releases_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/releases{/id}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/{sha}",
"allow_forking": true,
"assignees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/assignees{/user}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/downloads",
"has_downloads": false,
"languages_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/languages",
"default_branch": "main",
"milestones_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones{/number}",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/stargazers",
"watchers_count": 1,
"deployments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/deployments",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/commits{/sha}",
"has_discussions": false,
"subscribers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscribers",
"allow_auto_merge": false,
"contributors_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contributors",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/events{/number}",
"stargazers_count": 1,
"subscription_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscription",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/collaborators{/collaborator}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/notifications{?since,all,participating}",
"open_issues_count": 3,
"allow_merge_commit": true,
"allow_rebase_merge": true,
"allow_squash_merge": true,
"merge_commit_title": "MERGE_MESSAGE",
"allow_update_branch": false,
"merge_commit_message": "PR_TITLE",
"delete_branch_on_merge": false,
"squash_merge_commit_title": "COMMIT_OR_PR_TITLE",
"squash_merge_commit_message": "COMMIT_MESSAGES",
"web_commit_signoff_required": false,
"use_squash_pr_title_as_default": false
},
"user": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"label": "triggerdotdev:resend"
},
"user": {
"id": 534,
"url": "https://api.github.com/users/ericallam",
"type": "User",
"login": "ericallam",
"node_id": "MDQ6VXNlcjUzNA==",
"html_url": "https://github.com/ericallam",
"gists_url": "https://api.github.com/users/ericallam/gists{/gist_id}",
"repos_url": "https://api.github.com/users/ericallam/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/534?v=4",
"events_url": "https://api.github.com/users/ericallam/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/ericallam/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/ericallam/followers",
"following_url": "https://api.github.com/users/ericallam/following{/other_user}",
"organizations_url": "https://api.github.com/users/ericallam/orgs",
"subscriptions_url": "https://api.github.com/users/ericallam/subscriptions",
"received_events_url": "https://api.github.com/users/ericallam/received_events"
},
"draft": false,
"state": "open",
"title": "Example PR",
"_links": {
"html": {
"href": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4"
},
"self": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4"
},
"issue": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/4"
},
"commits": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4/commits"
},
"comments": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/4/comments"
},
"statuses": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/efc58e149c06f4a45ebf7a0bf34ac25cdcd34b07"
},
"review_comment": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/comments{/number}"
},
"review_comments": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4/comments"
}
},
"labels": [],
"locked": false,
"number": 4,
"node_id": "PR_kwDOIxVdCc5IY83X",
"assignee": null,
"diff_url": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4.diff",
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4",
"assignees": [],
"closed_at": null,
"issue_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/4",
"merged_at": null,
"milestone": null,
"patch_url": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4.patch",
"auto_merge": null,
"created_at": "2023-01-24T04:20:51Z",
"updated_at": "2023-01-24T04:24:58Z",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4/commits",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/4/comments",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/efc58e149c06f4a45ebf7a0bf34ac25cdcd34b07",
"requested_teams": [],
"merge_commit_sha": null,
"active_lock_reason": null,
"author_association": "MEMBER",
"review_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/comments{/number}",
"requested_reviewers": [],
"review_comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4/comments"
}
}
```
@@ -1,644 +0,0 @@
---
title: "Pull Request Event"
sidebarTitle: "Pull Requests"
description: "Trigger a workflow whenever an pull_request action is performed in a GitHub repository."
---
## Usage
```ts
import { github } from "@trigger.dev/integrations";
new Trigger({
id: "demo",
on: github.events.pullRequestEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {},
}).listen();
```
## Params
<ParamField path="repo" type="string" required={true}>
The full path to the repository, including the organization
</ParamField>
## Event
<ResponseField name="action" type="string">
The pull_request action, which can one of assigned, unassigned,
auto_merge_enabled, auto_merge_disabled, review_requested,
review_request_removed, ready_for_review, labeled, unlabeled, opened, edited,
closed, reopened, synchronize, ready_for_review, locked, unlocked, or
converted_to_draft.
</ResponseField>
<ResponseField name="number" type="number" required={true}>
The pull request number.
</ResponseField>
<ResponseField name="pull_request" type="object" required={true}>
The pull request object.
</ResponseField>
<ResponseField name="repository" type="object" required={true}>
A repository on GitHub.
</ResponseField>
<ResponseField name="sender" type="object" required={true}>
The GitHub user object who performed the action.
</ResponseField>
<ResponseField name="organization" type="object">
The organization object the repository belongs to.
</ResponseField>
## Additional event fields
### review_requested/review_request_removed PRs
<ResponseField name="requested_reviewer" type="object">
The GitHub user object who was requested to review the PR.
</ResponseField>
<ResponseField name="requested_team" type="object">
The GitHub team object who was requested to review the PR.
</ResponseField>
### labeled/unlabeled PRs
<ResponseField name="label" type="object">
The label object.
</ResponseField>
### assigned/unassigned PRs
<ResponseField name="assignee" type="object">
The assignee object.
</ResponseField>
### edited PRs
<ResponseField name="changes" type="object">
<Expandable title="properties">
<ResponseField name="body" type="object">
<Expandable title="properties" defaultOpen={true}>
<ResponseField name="from" type="string">
The previous body text.
</ResponseField>
</Expandable>
</ResponseField>
<ResponseField name="title" type="object">
<Expandable title="properties" defaultOpen={true}>
<ResponseField name="from" type="string">
The previous title text.
</ResponseField>
</Expandable>
</ResponseField>
<ResponseField name="base" type="object">
<Expandable title="properties" defaultOpen={true}>
<ResponseField name="ref" type="object">
Use `ref.from` to get the previous base branch name.
</ResponseField>
<ResponseField name="sha" type="object">
Use `sha.from` to get the previous base branch SHA.
</ResponseField>
</Expandable>
</ResponseField>
</Expandable>
</ResponseField>
## Example Workflows
<CodeGroup>
```typescript Notify Slack on new PR
new Trigger({
id: "new-pr",
name: "Notify Slack on new PR",
on: github.events.pullRequestEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
if (event.action === "opened") {
await slack.postMessage("New PR", {
channelName: "github-prs",
text: `New PR: ${event.pull_request.html_url}`,
});
}
},
}).listen();
```
</CodeGroup>
## Example Event payload
```json
{
"action": "opened",
"number": 4,
"sender": {
"id": 534,
"url": "https://api.github.com/users/ericallam",
"type": "User",
"login": "ericallam",
"node_id": "MDQ6VXNlcjUzNA==",
"html_url": "https://github.com/ericallam",
"gists_url": "https://api.github.com/users/ericallam/gists{/gist_id}",
"repos_url": "https://api.github.com/users/ericallam/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/534?v=4",
"events_url": "https://api.github.com/users/ericallam/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/ericallam/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/ericallam/followers",
"following_url": "https://api.github.com/users/ericallam/following{/other_user}",
"organizations_url": "https://api.github.com/users/ericallam/orgs",
"subscriptions_url": "https://api.github.com/users/ericallam/subscriptions",
"received_events_url": "https://api.github.com/users/ericallam/received_events"
},
"repository": {
"id": 588602633,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples",
"fork": false,
"name": "trigger.dev-examples",
"size": 161,
"forks": 0,
"owner": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"topics": [],
"git_url": "git://github.com/triggerdotdev/trigger.dev-examples.git",
"license": null,
"node_id": "R_kgDOIxVdCQ",
"private": false,
"ssh_url": "git@github.com:triggerdotdev/trigger.dev-examples.git",
"svn_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"archived": false,
"disabled": false,
"has_wiki": false,
"homepage": null,
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"keys_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/keys{/key_id}",
"language": "TypeScript",
"tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/tags",
"watchers": 1,
"blobs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/blobs{/sha}",
"clone_url": "https://github.com/triggerdotdev/trigger.dev-examples.git",
"forks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/forks",
"full_name": "triggerdotdev/trigger.dev-examples",
"has_pages": false,
"hooks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/hooks",
"pulls_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls{/number}",
"pushed_at": "2023-01-24T04:20:52Z",
"teams_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/teams",
"trees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/trees{/sha}",
"created_at": "2023-01-13T14:26:45Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/events",
"has_issues": true,
"issues_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues{/number}",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels{/name}",
"merges_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/merges",
"mirror_url": null,
"updated_at": "2023-01-23T14:22:40Z",
"visibility": "public",
"archive_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/{archive_format}{/ref}",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/commits{/sha}",
"compare_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/compare/{base}...{head}",
"description": "Node.js project with multiple example Trigger.dev workflows",
"forks_count": 0,
"is_template": false,
"open_issues": 3,
"branches_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/branches{/branch}",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contents/{+path}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/tags{/sha}",
"has_projects": true,
"releases_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/releases{/id}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/{sha}",
"allow_forking": true,
"assignees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/assignees{/user}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/downloads",
"has_downloads": false,
"languages_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/languages",
"default_branch": "main",
"milestones_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones{/number}",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/stargazers",
"watchers_count": 1,
"deployments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/deployments",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/commits{/sha}",
"has_discussions": false,
"subscribers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscribers",
"contributors_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contributors",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/events{/number}",
"stargazers_count": 1,
"subscription_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscription",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/collaborators{/collaborator}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/notifications{?since,all,participating}",
"open_issues_count": 3,
"web_commit_signoff_required": false
},
"organization": {
"id": 95297378,
"url": "https://api.github.com/orgs/triggerdotdev",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"hooks_url": "https://api.github.com/orgs/triggerdotdev/hooks",
"repos_url": "https://api.github.com/orgs/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/orgs/triggerdotdev/events",
"issues_url": "https://api.github.com/orgs/triggerdotdev/issues",
"description": "",
"members_url": "https://api.github.com/orgs/triggerdotdev/members{/member}",
"public_members_url": "https://api.github.com/orgs/triggerdotdev/public_members{/member}"
},
"pull_request": {
"id": 1214500311,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4",
"base": {
"ref": "main",
"sha": "e7c0680e23fcd3e52d35ddfbb4076112c640d9fa",
"repo": {
"id": 588602633,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples",
"fork": false,
"name": "trigger.dev-examples",
"size": 161,
"forks": 0,
"owner": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"topics": [],
"git_url": "git://github.com/triggerdotdev/trigger.dev-examples.git",
"license": null,
"node_id": "R_kgDOIxVdCQ",
"private": false,
"ssh_url": "git@github.com:triggerdotdev/trigger.dev-examples.git",
"svn_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"archived": false,
"disabled": false,
"has_wiki": false,
"homepage": null,
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"keys_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/keys{/key_id}",
"language": "TypeScript",
"tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/tags",
"watchers": 1,
"blobs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/blobs{/sha}",
"clone_url": "https://github.com/triggerdotdev/trigger.dev-examples.git",
"forks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/forks",
"full_name": "triggerdotdev/trigger.dev-examples",
"has_pages": false,
"hooks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/hooks",
"pulls_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls{/number}",
"pushed_at": "2023-01-24T04:20:52Z",
"teams_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/teams",
"trees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/trees{/sha}",
"created_at": "2023-01-13T14:26:45Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/events",
"has_issues": true,
"issues_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues{/number}",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels{/name}",
"merges_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/merges",
"mirror_url": null,
"updated_at": "2023-01-23T14:22:40Z",
"visibility": "public",
"archive_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/{archive_format}{/ref}",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/commits{/sha}",
"compare_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/compare/{base}...{head}",
"description": "Node.js project with multiple example Trigger.dev workflows",
"forks_count": 0,
"is_template": false,
"open_issues": 3,
"branches_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/branches{/branch}",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contents/{+path}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/tags{/sha}",
"has_projects": true,
"releases_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/releases{/id}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/{sha}",
"allow_forking": true,
"assignees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/assignees{/user}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/downloads",
"has_downloads": false,
"languages_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/languages",
"default_branch": "main",
"milestones_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones{/number}",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/stargazers",
"watchers_count": 1,
"deployments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/deployments",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/commits{/sha}",
"has_discussions": false,
"subscribers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscribers",
"allow_auto_merge": false,
"contributors_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contributors",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/events{/number}",
"stargazers_count": 1,
"subscription_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscription",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/collaborators{/collaborator}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/notifications{?since,all,participating}",
"open_issues_count": 3,
"allow_merge_commit": true,
"allow_rebase_merge": true,
"allow_squash_merge": true,
"merge_commit_title": "MERGE_MESSAGE",
"allow_update_branch": false,
"merge_commit_message": "PR_TITLE",
"delete_branch_on_merge": false,
"squash_merge_commit_title": "COMMIT_OR_PR_TITLE",
"squash_merge_commit_message": "COMMIT_MESSAGES",
"web_commit_signoff_required": false,
"use_squash_pr_title_as_default": false
},
"user": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"label": "triggerdotdev:main"
},
"body": null,
"head": {
"ref": "resend",
"sha": "efc58e149c06f4a45ebf7a0bf34ac25cdcd34b07",
"repo": {
"id": 588602633,
"url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples",
"fork": false,
"name": "trigger.dev-examples",
"size": 161,
"forks": 0,
"owner": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"topics": [],
"git_url": "git://github.com/triggerdotdev/trigger.dev-examples.git",
"license": null,
"node_id": "R_kgDOIxVdCQ",
"private": false,
"ssh_url": "git@github.com:triggerdotdev/trigger.dev-examples.git",
"svn_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"archived": false,
"disabled": false,
"has_wiki": false,
"homepage": null,
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"keys_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/keys{/key_id}",
"language": "TypeScript",
"tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/tags",
"watchers": 1,
"blobs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/blobs{/sha}",
"clone_url": "https://github.com/triggerdotdev/trigger.dev-examples.git",
"forks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/forks",
"full_name": "triggerdotdev/trigger.dev-examples",
"has_pages": false,
"hooks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/hooks",
"pulls_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls{/number}",
"pushed_at": "2023-01-24T04:20:52Z",
"teams_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/teams",
"trees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/trees{/sha}",
"created_at": "2023-01-13T14:26:45Z",
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/events",
"has_issues": true,
"issues_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues{/number}",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels{/name}",
"merges_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/merges",
"mirror_url": null,
"updated_at": "2023-01-23T14:22:40Z",
"visibility": "public",
"archive_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/{archive_format}{/ref}",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/commits{/sha}",
"compare_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/compare/{base}...{head}",
"description": "Node.js project with multiple example Trigger.dev workflows",
"forks_count": 0,
"is_template": false,
"open_issues": 3,
"branches_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/branches{/branch}",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contents/{+path}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/tags{/sha}",
"has_projects": true,
"releases_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/releases{/id}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/{sha}",
"allow_forking": true,
"assignees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/assignees{/user}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/downloads",
"has_downloads": false,
"languages_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/languages",
"default_branch": "main",
"milestones_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones{/number}",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/stargazers",
"watchers_count": 1,
"deployments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/deployments",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/commits{/sha}",
"has_discussions": false,
"subscribers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscribers",
"allow_auto_merge": false,
"contributors_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contributors",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/events{/number}",
"stargazers_count": 1,
"subscription_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscription",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/collaborators{/collaborator}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/notifications{?since,all,participating}",
"open_issues_count": 3,
"allow_merge_commit": true,
"allow_rebase_merge": true,
"allow_squash_merge": true,
"merge_commit_title": "MERGE_MESSAGE",
"allow_update_branch": false,
"merge_commit_message": "PR_TITLE",
"delete_branch_on_merge": false,
"squash_merge_commit_title": "COMMIT_OR_PR_TITLE",
"squash_merge_commit_message": "COMMIT_MESSAGES",
"web_commit_signoff_required": false,
"use_squash_pr_title_as_default": false
},
"user": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"type": "Organization",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"label": "triggerdotdev:resend"
},
"user": {
"id": 534,
"url": "https://api.github.com/users/ericallam",
"type": "User",
"login": "ericallam",
"node_id": "MDQ6VXNlcjUzNA==",
"html_url": "https://github.com/ericallam",
"gists_url": "https://api.github.com/users/ericallam/gists{/gist_id}",
"repos_url": "https://api.github.com/users/ericallam/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/534?v=4",
"events_url": "https://api.github.com/users/ericallam/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/ericallam/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/ericallam/followers",
"following_url": "https://api.github.com/users/ericallam/following{/other_user}",
"organizations_url": "https://api.github.com/users/ericallam/orgs",
"subscriptions_url": "https://api.github.com/users/ericallam/subscriptions",
"received_events_url": "https://api.github.com/users/ericallam/received_events"
},
"draft": false,
"state": "open",
"title": "Example PR",
"_links": {
"html": {
"href": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4"
},
"self": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4"
},
"issue": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/4"
},
"commits": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4/commits"
},
"comments": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/4/comments"
},
"statuses": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/efc58e149c06f4a45ebf7a0bf34ac25cdcd34b07"
},
"review_comment": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/comments{/number}"
},
"review_comments": {
"href": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4/comments"
}
},
"labels": [],
"locked": false,
"merged": false,
"number": 4,
"commits": 1,
"node_id": "PR_kwDOIxVdCc5IY83X",
"assignee": null,
"comments": 0,
"diff_url": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4.diff",
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4",
"additions": 220,
"assignees": [],
"closed_at": null,
"deletions": 0,
"issue_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/4",
"mergeable": null,
"merged_at": null,
"merged_by": null,
"milestone": null,
"patch_url": "https://github.com/triggerdotdev/trigger.dev-examples/pull/4.patch",
"auto_merge": null,
"created_at": "2023-01-24T04:20:51Z",
"rebaseable": null,
"updated_at": "2023-01-24T04:20:51Z",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4/commits",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/4/comments",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/efc58e149c06f4a45ebf7a0bf34ac25cdcd34b07",
"changed_files": 3,
"mergeable_state": "unknown",
"requested_teams": [],
"review_comments": 0,
"merge_commit_sha": null,
"active_lock_reason": null,
"author_association": "MEMBER",
"review_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/comments{/number}",
"requested_reviewers": [],
"review_comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls/4/comments",
"maintainer_can_modify": false
}
}
```
@@ -1,311 +0,0 @@
---
title: "Push Event"
sidebarTitle: "Pushes"
description: "Trigger a workflow whenever a push action is performed in a GitHub repository."
---
## Usage
```ts
import { github } from "@trigger.dev/integrations";
new Trigger({
id: "demo",
on: github.events.pushEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {},
}).listen();
```
## Params
<ParamField path="repo" type="string" required={true}>
The full path to the repository, including the organization
</ParamField>
## Event
<ResponseField name="ref" type="string">
The full git ref that was pushed. Example: refs/heads/master.
</ResponseField>
<ResponseField name="before" type="string">
The SHA of the commit before the push.
</ResponseField>
<ResponseField name="after" type="string">
The SHA of the commit after the push.
</ResponseField>
<ResponseField name="created" type="boolean">
Whether this was a created branch or tag.
</ResponseField>
<ResponseField name="deleted" type="boolean">
Whether this was a deleted branch or tag.
</ResponseField>
<ResponseField name="forced" type="boolean">
Whether this was a forced update or not.
</ResponseField>
<ResponseField name="base_ref" type="string">
If the ref is a branch, this is the branch name that the push was made to.
</ResponseField>
<ResponseField name="compare" type="string">
The HTTP URL to compare the two commits.
</ResponseField>
<ResponseField name="commits" type="array">
An array of commit objects describing the pushed commits.
</ResponseField>
<ResponseField name="head_commit" type="object">
The head commit object.
</ResponseField>
<ResponseField name="repository" type="object" required={true}>
A repository on GitHub.
</ResponseField>
<ResponseField name="sender" type="object" required={true}>
The GitHub user object who performed the action.
</ResponseField>
<ResponseField name="organization" type="object">
The organization object the repository belongs to.
</ResponseField>
## Example Workflows
<CodeGroup>
```typescript Notify Slack on new push
new Trigger({
id: "github-to-slack",
name: "Notify of new push",
on: github.events.pushEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
await slack.postMessage("New push to trigger.dev", {
channel: "github-changes",
text: `New push to trigger.dev by ${event.sender.login}: ${event.compare}`,
});
},
}).listen();
```
</CodeGroup>
## Example Event payload
```json
{
"ref": "refs/heads/main",
"after": "4a0834a1daa09cdd1a03038dbc131f807d887de8",
"before": "e7c0680e23fcd3e52d35ddfbb4076112c640d9fa",
"forced": false,
"pusher": {
"name": "ericallam",
"email": "eallam@icloud.com"
},
"sender": {
"id": 534,
"url": "https://api.github.com/users/ericallam",
"type": "User",
"login": "ericallam",
"node_id": "MDQ6VXNlcjUzNA==",
"html_url": "https://github.com/ericallam",
"gists_url": "https://api.github.com/users/ericallam/gists{/gist_id}",
"repos_url": "https://api.github.com/users/ericallam/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/534?v=4",
"events_url": "https://api.github.com/users/ericallam/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/ericallam/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/ericallam/followers",
"following_url": "https://api.github.com/users/ericallam/following{/other_user}",
"organizations_url": "https://api.github.com/users/ericallam/orgs",
"subscriptions_url": "https://api.github.com/users/ericallam/subscriptions",
"received_events_url": "https://api.github.com/users/ericallam/received_events"
},
"commits": [
{
"id": "4a0834a1daa09cdd1a03038dbc131f807d887de8",
"url": "https://github.com/triggerdotdev/trigger.dev-examples/commit/4a0834a1daa09cdd1a03038dbc131f807d887de8",
"added": [],
"author": {
"name": "Eric Allam",
"email": "eallam@icloud.com",
"username": "ericallam"
},
"message": "Add some documentation for how to run (needs work)",
"removed": [],
"tree_id": "5c06942324e80422eea4f4c11ff80d4bd8f9d7a7",
"distinct": true,
"modified": [
"README.md",
"pnpm-lock.yaml",
"src/examples/github-webhook.ts"
],
"committer": {
"name": "Eric Allam",
"email": "eallam@icloud.com",
"username": "ericallam"
},
"timestamp": "2023-01-24T04:43:40Z"
}
],
"compare": "https://github.com/triggerdotdev/trigger.dev-examples/compare/e7c0680e23fc...4a0834a1daa0",
"created": false,
"deleted": false,
"base_ref": null,
"repository": {
"id": 588602633,
"url": "https://github.com/triggerdotdev/trigger.dev-examples",
"fork": false,
"name": "trigger.dev-examples",
"size": 161,
"forks": 0,
"owner": {
"id": 95297378,
"url": "https://api.github.com/users/triggerdotdev",
"name": "triggerdotdev",
"type": "Organization",
"email": "hello@trigger.dev",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"html_url": "https://github.com/triggerdotdev",
"gists_url": "https://api.github.com/users/triggerdotdev/gists{/gist_id}",
"repos_url": "https://api.github.com/users/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/users/triggerdotdev/events{/privacy}",
"site_admin": false,
"gravatar_id": "",
"starred_url": "https://api.github.com/users/triggerdotdev/starred{/owner}{/repo}",
"followers_url": "https://api.github.com/users/triggerdotdev/followers",
"following_url": "https://api.github.com/users/triggerdotdev/following{/other_user}",
"organizations_url": "https://api.github.com/users/triggerdotdev/orgs",
"subscriptions_url": "https://api.github.com/users/triggerdotdev/subscriptions",
"received_events_url": "https://api.github.com/users/triggerdotdev/received_events"
},
"topics": [],
"git_url": "git://github.com/triggerdotdev/trigger.dev-examples.git",
"license": null,
"node_id": "R_kgDOIxVdCQ",
"private": false,
"ssh_url": "git@github.com:triggerdotdev/trigger.dev-examples.git",
"svn_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"archived": false,
"disabled": false,
"has_wiki": false,
"homepage": null,
"html_url": "https://github.com/triggerdotdev/trigger.dev-examples",
"keys_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/keys{/key_id}",
"language": "TypeScript",
"tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/tags",
"watchers": 1,
"blobs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/blobs{/sha}",
"clone_url": "https://github.com/triggerdotdev/trigger.dev-examples.git",
"forks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/forks",
"full_name": "triggerdotdev/trigger.dev-examples",
"has_pages": false,
"hooks_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/hooks",
"pulls_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/pulls{/number}",
"pushed_at": 1674535423,
"teams_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/teams",
"trees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/trees{/sha}",
"created_at": 1673620005,
"events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/events",
"has_issues": true,
"issues_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues{/number}",
"labels_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/labels{/name}",
"merges_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/merges",
"mirror_url": null,
"stargazers": 1,
"updated_at": "2023-01-23T14:22:40Z",
"visibility": "public",
"archive_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/{archive_format}{/ref}",
"commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/commits{/sha}",
"compare_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/compare/{base}...{head}",
"description": "Node.js project with multiple example Trigger.dev workflows",
"forks_count": 0,
"is_template": false,
"open_issues": 2,
"branches_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/branches{/branch}",
"comments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/comments{/number}",
"contents_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contents/{+path}",
"git_refs_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/tags{/sha}",
"has_projects": true,
"organization": "triggerdotdev",
"releases_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/releases{/id}",
"statuses_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/statuses/{sha}",
"allow_forking": true,
"assignees_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/assignees{/user}",
"downloads_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/downloads",
"has_downloads": false,
"languages_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/languages",
"master_branch": "main",
"default_branch": "main",
"milestones_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/milestones{/number}",
"stargazers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/stargazers",
"watchers_count": 1,
"deployments_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/deployments",
"git_commits_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/git/commits{/sha}",
"has_discussions": false,
"subscribers_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscribers",
"contributors_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/contributors",
"issue_events_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/events{/number}",
"stargazers_count": 1,
"subscription_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/subscription",
"collaborators_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/collaborators{/collaborator}",
"issue_comment_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/issues/comments{/number}",
"notifications_url": "https://api.github.com/repos/triggerdotdev/trigger.dev-examples/notifications{?since,all,participating}",
"open_issues_count": 2,
"web_commit_signoff_required": false
},
"head_commit": {
"id": "4a0834a1daa09cdd1a03038dbc131f807d887de8",
"url": "https://github.com/triggerdotdev/trigger.dev-examples/commit/4a0834a1daa09cdd1a03038dbc131f807d887de8",
"added": [],
"author": {
"name": "Eric Allam",
"email": "eallam@icloud.com",
"username": "ericallam"
},
"message": "Add some documentation for how to run (needs work)",
"removed": [],
"tree_id": "5c06942324e80422eea4f4c11ff80d4bd8f9d7a7",
"distinct": true,
"modified": [
"README.md",
"pnpm-lock.yaml",
"src/examples/github-webhook.ts"
],
"committer": {
"name": "Eric Allam",
"email": "eallam@icloud.com",
"username": "ericallam"
},
"timestamp": "2023-01-24T04:43:40Z"
},
"organization": {
"id": 95297378,
"url": "https://api.github.com/orgs/triggerdotdev",
"login": "triggerdotdev",
"node_id": "O_kgDOBa4fYg",
"hooks_url": "https://api.github.com/orgs/triggerdotdev/hooks",
"repos_url": "https://api.github.com/orgs/triggerdotdev/repos",
"avatar_url": "https://avatars.githubusercontent.com/u/95297378?v=4",
"events_url": "https://api.github.com/orgs/triggerdotdev/events",
"issues_url": "https://api.github.com/orgs/triggerdotdev/issues",
"description": "",
"members_url": "https://api.github.com/orgs/triggerdotdev/members{/member}",
"public_members_url": "https://api.github.com/orgs/triggerdotdev/public_members{/member}"
}
}
```
@@ -1,127 +0,0 @@
---
title: "Send Email"
sidebarTitle: "Send Email"
description: "Send email using Resend.com"
---
Send email using Resend.com, which supports sending emails using React, HTML, and plain text. Resend.com is currently in private beta but you can request early access [here](https://resend.com/).
<Note>
If you'd like to render emails using React, please see the [React.email
docs](https://react.email/)
</Note>
## Params
<ParamField path="key" type="string" required={true}>
A unique string. Please see the [Keys and Resumability](/guides/resumability)
doc for more info.
</ParamField>
<ParamField path="message" type="object" required={true}>
<Expandable title="properties" defaultOpen={true}>
<ParamField path="text" type="string" required={false}>
The text of the email. If `html` is provided, this will be used as the
plain text version of the email.
</ParamField>
<ParamField path="html" type="string" required={false}>
The HTML of the email. If `text` is provided, this will be used as the
HTML version of the email.
</ParamField>
<ParamField path="react" type="react component" required={false}>
A React component that will be rendered to HTML and used as the email
content. Please see the [React.email docs](https://react.email/) for more info
</ParamField>
<ParamField path="subject" type="string" required={true}>
The subject of the email.
</ParamField>
<ParamField path="from" type="string" required={true}>
The email address of the sender.
</ParamField>
<ParamField path="to" type="string | string[]" required={true}>
One or more email addresses of the recipients.
</ParamField>
<ParamField path="cc" type="string | string[]" required={false}>
One or more email addresses of the CC recipients.
</ParamField>
<ParamField path="bcc" type="string | string[]" required={false}>
One or more email addresses of the BCC recipients.
</ParamField>
<ParamField path="replyTo" type="string | string[]" required={false}>
An optional email address to use as the reply-to address.
</ParamField>
</Expandable>
</ParamField>
## Response
<ResponseField name="id" type="string">
The ID of the email.
</ResponseField>
<ResponseField name="from" type="string">
The email address of the sender.
</ResponseField>
<ResponseField name="to" type="string">
The email address of the recipient.
</ResponseField>
<ResponseField name="created_at" type="string">
The date and time the email was created.
</ResponseField>
## Example Workflows
<CodeGroup>
```typescript criticalIssue.tsx
import { github, resend } from "@trigger.dev/integrations";
import { CriticalIssueEmail } from "./emails";
new Trigger({
id: "email-ops",
name: "On Critical Issue",
on: github.events.issueEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
if (event.action === "labeled" && event.label.name === "critical") {
await resend.sendEmail("🚨 Alert Ops", {
to: "ops@trigger.dev",
from: "internal@trigger.dev",
subject: `Critical issue: ${event.issue.title}`,
react: (
<CriticalIssueEmail
issue={event.issue}
sender={event.sender}
repo={event.repository}
/>
),
});
}
},
}).listen();
```
</CodeGroup>
## Example Response
```json
{
"id": "1673618429",
"from": "internal@trigger.dev",
"to": "ops@trigger.dev",
"created_at": "2023-01-24T14:38:26Z"
}
```
-11
View File
@@ -1,11 +0,0 @@
---
title: "Shopify"
sidebarTitle: "Shopify"
description: "Support for the Shopify API"
---
## Shopify API integration
Full reference of all functions is coming soon.
Check out some example workflows using the Shopify API [here](/examples/shopify).
-11
View File
@@ -1,11 +0,0 @@
---
title: "Slack"
sidebarTitle: "Slack"
description: "Support for the Slack API"
---
## Slack API integration
Full reference of all functions is coming soon.
Check out some example workflows using the Slack API [here](/examples/slack).
@@ -1,262 +0,0 @@
---
title: "Post Message"
sidebarTitle: "Post Message"
description: "Post a message to a Slack channel"
---
Publish slack messages to a public or private channel in your Slack Workspace as the Trigger.dev Slack bot. If you need to publish messages to your customer's Slack channels, consider using [Incoming Webhooks](https://api.slack.com/messaging/webhooks) and our [fetch](/functions/fetch) function.
## Params
<ParamField path="key" type="string" required={true}>
A unique string. Please see the [Keys and Resumability](/guides/resumability)
doc for more info.
</ParamField>
<ParamField path="message" type="object" required={true}>
<Expandable title="properties" defaultOpen={true}>
<ParamField path="channelName" type="string" required={false}>
The name of the channel, can optionally include the `#`. E.g. `#team`.
Alternatively you can use the `channelId` param.
</ParamField>
<ParamField path="channelId" type="string" required={false}>
The slack ID of the channel, e.g. `C04GWUTDC4W`. Can be used instead of `channelName`. Use `channelId` if the slack channel name could change.
</ParamField>
<ParamField path="text" type="string" required={true}>
The formatted text of the message to be published, formatted as [mrkdwn](https://api.slack.com/reference/surfaces/formatting#basics).
</ParamField>
<ParamField path="blocks" type="object" required={false}>
You can use blocks to create a rich message with images, buttons, and more.
You can either pass in a JavaScript object or use [JSX Slack](https://github.com/yhatt/jsx-slack/) to create blocks. We highly recommend using JSX Slack, it's much easier to read and write. See the [block example](#) to see it in action.
Full full detail on block see the [Slack API docs](https://api.slack.com/reference/block-kit/blocks).
</ParamField>
</Expandable>
</ParamField>
## Response
<ResponseField name="ok" type="boolean" default="true">
Always true; non-ok responses will halt the workflow run and throw an error.
</ResponseField>
<ResponseField name="channel" type="string">
The channel ID of the channel the message was published to.
</ResponseField>
<ResponseField name="ts" type="string">
The "timestamp ID" of the message, which can be used to update or delete the
message.
</ResponseField>
<ResponseField name="message" type="object">
<Expandable title="properties">
<ResponseField name="ts" type="string">
The "timestamp ID" of the message, which can be used to update or delete the message.
</ResponseField>
<ResponseField name="text" type="string">
The text published to the channel.
</ResponseField>
<ResponseField name="user" type="string">
The user ID of the user who published the message.
</ResponseField>
<ResponseField name="bot_id" type="string">
The bot ID of the bot that published the message.
</ResponseField>
</Expandable>
</ResponseField>
## Example Workflows
### Notify Slack on New Star
<CodeGroup>
```typescript Notify Slack on New Star
import { slack, github } from "@trigger.dev/integrations";
new Trigger({
id: "new-star",
name: "On New Star",
on: github.events.newStarEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {
await slack.postMessage("⭐️ New Star", {
channelName: "github-stars",
text: `Repo ${event.repository.full_name} got a star from ${event.sender.login}, for a total of ${event.repository.stargazers_count} stars!`,
});
},
}).listen();
```
```json Example response
{
"ok": true,
"ts": "1673618429.084699",
"channel": "C04GWUTDC3W",
"message": {
"ts": "1673618429.084699",
"text": "New domain created: trigger.dev by customer 1st-ever-slack-workflow-yippie",
"type": "message",
"user": "U04JTTQ08SF",
"bot_id": "B04JR3DCB4M"
}
}
```
</CodeGroup>
### Blocks with interactivity
You can add interaction and richer visual elements using Blocks. The easiest way to add them is using `jsx-slack` (which is a separate npm package that you can install).
This example messages your team every minute (!) and asks them how they're doing. There are two buttons and a dropdown menu.
In this examples there are two workflows:
1. Messages your team every minute (!) and asks them how they're doing.
2. Receives the interaction from users. It adds reactions when the buttons are pressed and posts a message when a user selects from the dropdown menu.
Please note, that to use `jsx-slack` you will need to add the `jsxImportSource` pragma to the top of your file. This is because `jsx-slack` is not a React library, but it uses the same syntax as React. Also, you might need to add `"jsx": "react-jsx"` to your `compilerOption` in `tsconfig.json`. The workflow file needs to be a `.jsx` or `.tsx` file (like when you use React).
<CodeGroup>
```typescript workflow.tsx
/** @jsxImportSource jsx-slack */
import { slack } from "@trigger.dev/integrations";
import JSXSlack, {
Actions,
Blocks,
Button,
Section,
Select,
Option,
} from "jsx-slack";
import { z } from "zod";
const BLOCK_ID = "issue.action.block";
//1. every minute see how your employees are doing, we don't recommend this frequency 😉
new Trigger({
id: "slack-interactivity",
name: "Testing Slack Interactivity",
on: scheduleEvent({
rateOf: {
minutes: 1,
},
}),
run: async (event, ctx) => {
await slack.postMessage("jsx-test", {
channelName: "test-integrations",
//text appears in Slack notifications on mobile/desktop
text: "How is your progress today?",
//import and use JSXSlack to make creating rich messages much easier
blocks: JSXSlack(
<Blocks>
<Section>How is your progress today?</Section>
<Actions blockId={BLOCK_ID}>
<Button value="blocked" actionId="status-blocked">
I'm blocked
</Button>
<Button
value="help"
actionId="status-help"
url="https://xkcd.com/1349/"
>
Get help
</Button>
<Select actionId="rating" placeholder="Rate it!">
<Option value="5">5 {":star:".repeat(5)}</Option>
<Option value="4">4 {":star:".repeat(4)}</Option>
<Option value="3">3 {":star:".repeat(3)}</Option>
<Option value="2">2 {":star:".repeat(2)}</Option>
<Option value="1">1 {":star:".repeat(1)}</Option>
</Select>
</Actions>
</Blocks>
),
});
},
}).listen();
//2. this workflow listens for Slack interactions filtered by the block id and actions we used above
new Trigger({
id: "slack-block-interaction",
name: "Slack Block Interaction",
on: slack.events.blockActionInteraction({
blockId: BLOCK_ID,
actionId: ["status-blocked", "status-help", "rating"],
}),
run: async (event, ctx) => {
//create promises from all the actions
const promises = event.actions.map((action) => {
switch (action.action_id) {
case "status-blocked": {
//the user is blocked so add a 😢 emoji as a reaction
if (event.message) {
return slack.addReaction("React to message", {
name: "cry",
timestamp: event.message.ts,
channelId: event.channel.id,
});
}
break;
}
case "status-help": {
//the user needs help so add an 🆘 emoji as a reaction
if (event.message) {
return slack.addReaction("React to message", {
name: "sos",
timestamp: event.message.ts,
channelId: event.channel.id,
});
}
break;
}
case "rating": {
if (action.type != "static_select") {
throw new Error("This action should be a select");
}
//post the rating as a message that appears below the original,
//only the user pressing the button will see this message
return slack.postMessageResponse(
"Added a comment to the issue",
event.response_url,
{
text: `You rated your day ${action.selected_option?.value} stars`,
replace_original: false,
}
);
}
default:
return Promise.resolve();
}
});
await Promise.all(promises);
},
}).listen();
```
```json tsconfig.json
{
//other options
"compilerOptions": {
"jsx": "react-jsx"
//other options
}
}
```
</CodeGroup>
@@ -1,7 +0,0 @@
---
title: "Authentication"
sidebarTitle: "Authentication"
description: "Authentication"
---
Coming soon...
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

-143
View File
@@ -1,143 +0,0 @@
{
"name": "Trigger.dev",
"logo": {
"dark": "/logo/light.png",
"light": "/logo/light.png",
"href": "https://app.trigger.dev"
},
"favicon": "/images/favicon.png",
"colors": {
"primary": "#0fd122",
"light": "#41FF54",
"dark": "#632CCC",
"anchors": {
"from": "#069613",
"to": "#0fd122"
}
},
"backgroundImage": "/images/docs-background.png",
"modeToggle": {
"default": "dark",
"isHidden": true
},
"topbarLinks": [
{
"name": "Login",
"url": "https://app.trigger.dev"
},
{
"name": "Sign up",
"url": "https://app.trigger.dev"
}
],
"topbarCtaButton": {
"type": "github",
"url": "https://github.com/triggerdotdev/trigger.dev"
},
"anchors": [
{
"name": "Community",
"icon": "discord",
"url": "https://discord.gg/nkqV9xBYWy"
},
{
"name": "GitHub",
"icon": "github",
"url": "https://github.com/triggerdotdev/trigger.dev"
}
],
"navigation": [
{
"group": "Getting Started",
"pages": ["welcome", "getting-started", "get-help"]
},
{
"group": "Examples",
"pages": [
"examples/examples",
"examples/slack",
"examples/github",
"examples/shopify",
"examples/resend"
]
},
{
"group": "Triggers",
"pages": [
"triggers/webhooks",
"triggers/custom-events",
"triggers/scheduled"
]
},
{
"group": "Integrations",
"pages": [
{
"group": "APIs",
"pages": [
{
"group": "Slack",
"pages": ["integrations/apis/slack/actions/post-message"]
},
{
"group": "Resend.com",
"pages": ["integrations/apis/resend/actions/send-email"]
}
]
},
"integrations/authentication"
]
},
{
"group": "Functions",
"pages": [
"functions/fetch",
"functions/logging",
"functions/delays",
"functions/send-event",
"functions/loops-conditionals-etc"
]
},
{
"group": "Guides",
"pages": [
"guides/resumability",
"guides/event-filters",
"guides/zod",
"guides/event-driven"
]
},
{
"group": "Reference",
"pages": [
"reference/trigger",
"reference/custom-event",
"reference/webhook-event",
"reference/schedule-event",
"reference/send-event"
]
},
{
"group": "Webhook Catalog",
"pages": [
{
"group": "GitHub",
"pages": [
"integrations/apis/github/events/push",
"integrations/apis/github/events/issues",
"integrations/apis/github/events/issue-comments",
"integrations/apis/github/events/pull-requests",
"integrations/apis/github/events/pull-request-reviews",
"integrations/apis/github/events/pull-request-comments",
"integrations/apis/github/events/new-star"
]
}
]
}
],
"footerSocials": {
"twitter": "https://twitter.com/triggerdotdev",
"github": "https://github.com/triggerdotdev/trigger.dev",
"discord": "https://discord.gg/nkqV9xBYWy"
}
}
-36
View File
@@ -1,36 +0,0 @@
openapi: 3.0.3
info:
title: Trigger.dev API
version: v1.0.0
description: Please see https://docs.trigger.dev for more details.
contact:
name: Eric
email: eric@trigger.dev
url: https://trigger.dev
termsOfService: https://trigger.dev/terms
servers:
- url: https://app.trigger.dev/api/v1
description: Trigger.dev
paths:
/events:
post:
summary: Send Custom Event
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/customEvent"
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: "#/components/schemas/customEventResponse"
"422":
description: Unprocessable Entity
content:
application/json:
schema:
$ref: "#/components/schemas/error"
-12
View File
@@ -1,12 +0,0 @@
{
"name": "docs",
"version": "1.0.0",
"description": "Trigger.dev documentation",
"private": true,
"scripts": {
"dev": "mintlify dev --port 3050"
},
"devDependencies": {
"mintlify": "^2.0.16"
}
}
-40
View File
@@ -1,40 +0,0 @@
---
title: "customEvent Trigger"
sidebarTitle: "customEvent"
description: "Trigger a workflow when a custom event is received."
---
## Usage
```ts
import { customEvent, Trigger } from "@trigger.dev/sdk";
new Trigger({
id: "user-created-notify-slack",
name: "User Created - Notify Slack",
on: customEvent({
name: "user.created",
schema: z.object({ id: z.string(), admin: z.boolean() }),
filter: {
admin: [false],
},
}),
run: async (event, ctx) => {},
}).listen();
```
## Options
<ParamField path="name" type="string" required={true}>
The name of the custom event to listen for.
</ParamField>
<ParamField path="filter" type="object" required={false}>
An event filter to apply to the custom event payload. See the [event filter
documentation](/guides/event-filters) for more information.
</ParamField>
<ParamField path="schema" type="Zod Schema" required={true}>
A Zod schema to validate the webhook event payload against. See our [Zod
guide](/guides/zod) for more information.
</ParamField>
-68
View File
@@ -1,68 +0,0 @@
---
title: "scheduleEvent Trigger"
sidebarTitle: "scheduleEvent"
description: "Run a workflow on a recurring schedule."
---
## Usage
```ts
import { scheduleEvent } from "@trigger.dev/sdk";
new Trigger({
id: "usage",
name: "usage",
on: scheduleEvent({ rateof: { minutes: 10 } }),
run: async (event, ctx) => {},
}).listen();
```
## Options
You must use one of the following options, but not both:
<ParamField path="rateOf" type="object" required={false}>
The rate of the schedule. This can be a number of minutes, hours,
or days. For example, `{ rateOf: { minutes: 10 } }` will run
every 10 minutes.
</ParamField>
<ParamField path="cron" type="string" required={false}>
A cron expression to run the workflow on. For example, `0 0 * * *` will run
the workflow every hour at the top of the hour. See
[crontab.guru](https://crontab.guru/) for more information.
</ParamField>
## Event Payload
<ResponseField name="scheduledTime" type="Date" required={true}>
The time the event was scheduled to run.
</ResponseField>
<ResponseField name="lastRunAt" type="Date" required={false}>
The time the event last run. This will be `undefined` if the event has never run. Use this parameter to run window queries:
```ts
import { scheduleEvent, Trigger } from "@trigger.dev/sdk";
new Trigger({
id: "usage",
name: "usage",
on: scheduleEvent({ rateof: { minutes: 10 } }),
run: async (event, ctx) => {
const { lastRunAt, scheduledTime } = event;
const query = `SELECT * FROM users WHERE created_at < ${scheduledTime}`;
if (lastRunAt) {
query += ` AND created_at > ${lastRunAt}`;
}
const latestUsers = await db.query(query);
// ...
},
}).listen();
```
</ResponseField>
-97
View File
@@ -1,97 +0,0 @@
---
title: "sendEvent"
sidebarTitle: "sendEvent"
description: "Send a custom event to Trigger, from inside or outside of a workflow."
---
## Usage
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
new Trigger({
id: "usage",
name: "usage",
on: customEvent({
name: "user.created",
schema: z.any(),
}),
run: async (event, ctx) => {
await ctx.sendEvent("Sending context user.created event", {
name: "user.created",
payload: {
id: "1234_abc",
},
});
},
}).listen();
```
You can also use `sendEvent` by importing it from `@trigger.dev/sdk`:
```ts
import { sendEvent } from "@trigger.dev/sdk";
await sendEvent("Sending context user.created event", {
name: "user.created",
payload: {
id: "1234_abc",
},
});
```
<Note>
If calling `sendEvent` from outside of a workflow run, it will make an HTTP
API request to app.trigger.dev to send the event. Make sure you set the
`TRIGGER_API_KEY` environment variable if you will be using it this way.
</Note>
## Parameters
<ParamField path="key" type="string" required={true}>
A unique key for the event in the context of a workflow run. Please see the
[Keys and Resumability](/guides/resumability) guide for more info.
</ParamField>
<ParamField path="event" type="object" required={true}>
<Expandable title="properties" defaultOpen={true}>
<ParamField path="id" type="string" required={false}>
An optional unique ID for the event. If not provided, one will be
generated automatically (using `clid`). Set this field to perform event
deduplication.
</ParamField>
<ParamField path="name" type="string" required={true}>
The name of the event. This is the name you set when creating the
`customEvent` trigger.
</ParamField>
<ParamField path="payload" type="json object" required={true}>
The payload of the event.
</ParamField>
<ParamField path="timestamp" type="ISO8601 string" required={false}>
An optional timestamp for the event. If not provided, one will be generated. Must be in ISO 8601 format (e.g. `new Date().toISOString()`)
</ParamField>
<ParamField path="context" type="json object" required={false}>
An optional context object for the event. This can be used to pass
additional information about the event, such as the user who triggered
it. Note that this is not currently exposed to the workflow (coming soon).
</ParamField>
<ParamField path="delay" type="object" required={false}>
An optional delay object for the event. This can be used to delay the
event by a certain amount of time. Use one of the following options:
- `{ seconds: number }` - delay the event by a certain number of seconds
- `{ minutes: number }` - delay the event by a certain number of minutes
- `{ hours: number }` - delay the event by a certain number of hours
- `{ days: number }` - delay the event by a certain number of days
- `{ until: Date }` - delay the event until a certain date
See the [Delaying Event Delivery](/functions/send-event#delaying-event-delivery) docs for more info.
</ParamField>
</Expandable>
</ParamField>
-159
View File
@@ -1,159 +0,0 @@
---
title: "Trigger"
sidebarTitle: "Trigger"
description: "The Trigger class let's you define a workflow that is triggered by a specific event."
---
## Constructor
### Usage
```ts
import { customEvent, Trigger } from "@trigger.dev/sdk";
const trigger = new Trigger({
id: "user-created-notify-slack",
name: "User Created - Notify Slack",
on: customEvent({
name: "user.created",
schema: z.object({ id: z.string(), admin: z.boolean() }),
filter: {
admin: [false],
},
}),
run: async (event, ctx) => {},
});
```
### Options
<ParamField path="id" type="string" required={true}>
An identifier for this trigger. Must unique across your Trigger.dev
organization.
</ParamField>
<ParamField path="name" type="string" required={true}>
A display name for this trigger.
</ParamField>
<ParamField path="apiKey" type="string" required={false}>
Your Trigger.dev API key. If not provided, the API key will be read from the
`TRIGGER_API_KEY` environment variable.
</ParamField>
<ParamField path="endpoint" type="string" required={false}>
The URL of the Trigger.dev WebSocket server. If not provided, the endpoint
will point to the production server.
</ParamField>
<ParamField path="logLevel" type="string" required={false}>
The log level for the Trigger. Defaults to `info`
</ParamField>
<ParamField path="triggerTTL" type="number" required={false}>
The TTL for the trigger in seconds. If the delay between the event timestamp
and the current time is greater than the TTL, the trigger will not be
executed. Defaults to `3600` seconds, or 1 hour.
</ParamField>
<ParamField path="run" type="function" required={true}>
The function that will be executed when the trigger is fired. The function
will be passed the event data and a context object.
</ParamField>
### Context Object
<ParamField path="id" type="string">
The identifier of the individual run of this trigger.
</ParamField>
<ParamField path="environment" type="string">
Either `development` or `live`, depending on the API Key used.
</ParamField>
<ParamField path="apiKey" type="string">
The API Key used to authenticate this trigger.
</ParamField>
<ParamField path="organizationId" type="string">
The identifier of the organization that owns this trigger.
</ParamField>
<ParamField path="logger" type="object">
The logger object for this trigger. See the [Logging](/functions/logging) page
for more info.
</ParamField>
<ParamField path="isTest" type="boolean">
Whether or not this trigger is being run as a test.
</ParamField>
<ParamField path="sendEvent" type="function">
A function that can be used to send an event to trigger.dev. See the [Sending
Events](/functions/send-event) page for more info.
</ParamField>
<ParamField path="waitFor" type="function">
A function that can be used to wait for a specific amount of time before
continuing. See the [Delays](/functions/delays) page for more info.
</ParamField>
<ParamField path="waitUntil" type="function">
A function that can be used to wait for a specific date/time before
continuing. See the [Delays](/functions/delays) page for more info.
</ParamField>
<ParamField path="fetch" type="function">
A function that can be used to make HTTP requests. See the
[fetch](/functions/fetch) page for more info.
</ParamField>
## listen
The `listen` function will register the Trigger with Trigger.dev and start listening for events.
### Usage
```ts
const trigger = new Trigger({
id: "user-created-notify-slack",
name: "User Created - Notify Slack",
on: customEvent({
name: "user.created",
schema: z.object({ id: z.string(), admin: z.boolean() }),
filter: {
admin: [false],
},
}),
run: async (event, ctx) => {},
});
trigger.listen();
```
You can split the creation of the trigger and the listening for events by calling `trigger.listen()` at a later time.
<CodeGroup>
```ts triggers.ts
export const userCreatedNotifySlack = new Trigger({
id: "user-created-notify-slack",
name: "User Created - Notify Slack",
on: customEvent({
name: "user.created",
schema: z.object({ id: z.string(), admin: z.boolean() }),
filter: {
admin: [false],
},
}),
run: async (event, ctx) => {},
});
```
```ts index.ts
import { userCreatedNotifySlack } from "./triggers";
userCreatedNotifySlack.listen();
```
</CodeGroup>
-65
View File
@@ -1,65 +0,0 @@
---
title: "webhookEvent Trigger"
sidebarTitle: "webhookEvent"
description: "Trigger a workflow when a webhook event is received"
---
## Usage
```ts
import { webhookEvent, Trigger } from "@trigger.dev/sdk";
new Trigger({
id: "caldotcom-to-slack",
name: "Cal.com To Slack",
on: webhookEvent({
service: "cal.com",
eventName: "BOOKING_CREATED",
filter: {
triggerEvent: ["BOOKING_CREATED"],
},
schema: z.any(),
verifyPayload: {
enabled: true,
header: "X-Cal-Signature-256",
},
}),
run: async (event, ctx) => {},
}).listen();
```
## Options
<ParamField path="service" type="string" required={true}>
The name of the service that will be sending the webhook event.
</ParamField>
<ParamField path="name" type="string" required={true}>
The name of the event that will be sent by the service.
</ParamField>
<ParamField path="filter" type="object" required={false}>
An event filter to apply to the webhook event. See the [event filter
documentation](/guides/event-filters) for more information.
</ParamField>
<ParamField path="schema" type="Zod Schema" required={true}>
A Zod schema to validate the webhook event payload against. See our [Zod
guide](/guides/zod) for more information.
</ParamField>
<ParamField path="verifyPayload" type="object" required={false}>
Verify the payload of the webhook event. Currently only supports sha256 HMAC
signatures.
<Expandable title="properties">
<ParamField path="enabled" type="boolean" required={false}>
Whether to verify the payload of the webhook event. Defaults to `false`.
</ParamField>
<ParamField path="header" type="string" required={false}>
The name of the header that contains the signature to verify the payload
against. e.g. `X-Webhook-Signature`.
</ParamField>
</Expandable>
</ParamField>
-38
View File
@@ -1,38 +0,0 @@
---
title: "Resources"
description: "Learn more about how to build amazing documentation"
---
<CardGroup>
<Card title="Development" icon="rectangle-terminal" href="https://mintlify.com/docs/development">
Run on your computer to see changes locally
</Card>
<Card title="Global Settings" icon="sliders" href="https://mintlify.com/docs/settings/global">
Customizing the theme, branding, and other global configurations
</Card>
<Card title="Page Titles and Metadata" icon="heading" href="https://mintlify.com/docs/settings/page">
Setting the title and metadata for navigation and SEO
</Card>
<Card title="Writing Content" icon="pen-nib" href="https://mintlify.com/docs/components/overview">
Introduction on how to add and edit content
</Card>
</CardGroup>
## Advanced Topics
Learn more about how to take your documentation to the next level
<CardGroup>
<Card title="Custom Domains" icon="browser" href="https://mintlify.com/docs/settings/custom-domain/subdomain">
Get the documentation hosted at your custom domain
</Card>
<Card title="Advanced Components" icon="paintbrush-pencil" href="https://mintlify.com/docs/components/advanced/accordion">
Advanced components built for specific communication mediums
</Card>
<Card title="API Components" icon="square-code" href="https://mintlify.com/docs/api-components/overview">
Add an API playground into your documentation
</Card>
<Card title="Analytics" icon="chart-mixed" href="https://mintlify.com/docs/analytics/supported-integrations">
Learn how users are interacting with your documentation
</Card>
</CardGroup>
-117
View File
@@ -1,117 +0,0 @@
---
title: "Custom event triggers"
sidebarTitle: "Custom events"
description: "Custom event triggers allow you to run workflows from your own code (or your other workflows)"
---
[Send an event](/functions/send-event) and any workflows that subscribe to that custom event will get triggered.
## Name and Schemas
### Name
Custom event triggers have a `name`. They will only get triggered when a custom event with that name are sent.
### Schema
Custom event triggers take a [Zod](https://github.com/colinhacks/zod) schema. This is used to validate the data that is sent with the event. If the data does not match the schema, the workflow will not run.
It also means that inside your run function the event param will be typed correctly. We use [Zod](https://github.com/colinhacks/zod#installation) for our schemas it's a fantastic library that allows you to define schemas in a very simple way.
You can always start out by using `z.any()` as your schema, and then later on you can add more strict validation. See our [Zod guide](/guides/zod) for more information.
## Filters
You can also add filters to your custom event triggers. This allows you to filter out events that you don't want to run your workflow for.
```ts
new Trigger({
id: "new-user-slack",
name: "New user slack message",
on: customEvent({
name: "user.created",
schema: z.object({
name: z.string(),
email: z.string(),
paidPlan: z.boolean(),
}),
filter: {
//only run the workflow if the user is paying
paidPlan: [true],
},
}),
//this function is run when the custom event is received
run: async (event, ctx) => {
//send a message to the #new-users Slack channel with user details
const response = await slack.postMessage("send-to-slack", {
channel: "new-users",
text: `New user: ${event.name} (${event.email}) signed up. ${
event.paidPlan ? "They are paying" : "They are on the free plan"
}.`,
});
return response.message;
},
}).listen();
```
Please see the [Event filters guide](/guides/event-filters) for more information.
## Example
```ts
import { Trigger, customEvent } from "@trigger.dev/sdk";
import { slack } from "@trigger.dev/integrations";
import { z } from "zod";
//this workflow will run when a "user.created" event is sent
new Trigger({
id: "new-user-slack",
name: "New user slack message",
apiKey: "<your_api_key>",
//this is the custom event subscription
on: customEvent({
name: "user.created",
schema: z.object({
name: z.string(),
email: z.string(),
paidPlan: z.boolean(),
}),
}),
//this function is run when the custom event is received
run: async (event, ctx) => {
//send a message to the #new-users Slack channel with user details
const response = await slack.postMessage("send-to-slack", {
channel: "new-users",
text: `New user: ${event.name} (${event.email}) signed up. ${
event.paidPlan ? "They are paying" : "They are on the free plan"
}.`,
});
return response.message;
},
}).listen();
```
That workflow will never run, unless an event is sent from your code somewhere it can be sent from a completely different server.
## Sending an event
There is a [full guide on sending events](/functions/send-event) but here is a quick example:
```ts
import { sendEvent } from "@trigger.dev/sdk";
//send an event with the name "user.created"
await sendEvent("fire-user-created-event", {
name: "user.created",
payload: { name: "John Doe", email: "john@doe.com", paidPlan: true },
});
```
If you are calling this from inside a workflow, ensure that the first parameter is unique inside your workflow.
<Note>
The same event can trigger many different workflows, just subscribe to the
same event name to achieve this.
</Note>
-109
View File
@@ -1,109 +0,0 @@
---
title: "Scheduled triggers"
sidebarTitle: "Scheduled"
description: "Run a workflow on a recurring schedule"
---
See the [reference](/reference/schedule-event) for more details.
## Examples
### Every 5 minutes
This job will run every 5 minutes, starting 5 minutes after this code is first run on your server (that includes running locally).
```ts
import { Trigger, scheduleEvent } from "@trigger.dev/sdk";
new Trigger({
id: "scheduled-workflow",
name: "Scheduled Workflow",
apiKey: "<your_api_key>",
on: scheduleEvent({ rateOf: { minutes: 5 } }),
run: async (event, ctx) => {
await ctx.logger.info("Received the scheduled event", {
event,
wallTime: new Date(),
});
return { foo: "bar" };
},
}).listen();
```
### Using CRON syntax
This job will run at 2:30pm every Monday. You can get help with [CRON syntax](https://crontab.guru/).
```ts
import { Trigger, scheduleEvent } from "@trigger.dev/sdk";
new Trigger({
id: "cron-scheduled-workflow",
name: "Cron Scheduled Workflow",
apiKey: "<your_api_key>",
on: scheduleEvent({ cron: "30 14 * * 1" }),
run: async (event, ctx) => {
await ctx.logger.info("Received the cron scheduled event", {
event,
wallTime: new Date(),
});
return { foo: "bar" };
},
}).listen();
```
## Preventing late runs
To prevent a scheduled trigger from running late, you can set a `triggerTTL` option when creating the `Trigger`, like so:
```ts
new Trigger({
id: "scheduled-workflow",
name: "Scheduled Workflow",
apiKey: "<your_api_key>",
on: scheduleEvent({ rateOf: { minutes: 5 } }),
triggerTTL: 300,
run: async (event, ctx) => {
await ctx.logger.info("Received the scheduled event", {
event,
wallTime: new Date(),
});
return { foo: "bar" };
},
}).listen();
```
This will prevent the trigger from running if it is running more than `300` seconds behind, which can happen if the server running your `Trigger` code goes down or is otherwise unavailable.
This is especially useful for scheduled triggers that run on a very short interval, like every minute, so you don't get a backlog of runs that all run at once when the server comes back online.
<Tip>
Set your `triggerTTL` to the same time (or double) as the rateOf the trigger.
</Tip>
## Live-only scheduled events
In many cases, you only want scheduled events to run when your code is running on a server, and not locally during development. To do this, you can check the `context.environment` property together with the `context.isTest` property, like so:
```ts
new Trigger({
id: "check-scheduler",
name: "Check Scheduler",
on: scheduleEvent({ rateOf: { minutes: 10 } }),
logLevel: "info",
triggerTTL: 600,
run: async (event, context) => {
// Return if in development and not running a test
if (context.environment === "development" && !context.isTest) {
return;
}
// do stuff here
},
}).listen();
```
By checking `context.isTest`, you can manually test scheduled events locally before pushing to live.
-116
View File
@@ -1,116 +0,0 @@
---
title: "Webhooks"
sidebarTitle: "Webhooks"
description: "Webhooks allow you to subscribe to events from APIs you use."
---
Webhooks are a crucial part of API development, allowing for real-time reactions to various events across different systems, such as when a Stripe Payment is made, or when a GitHub issue is created.
## Advantages of using Trigger.dev for webhooks
Webhooks can be difficult to work with, especially when developing locally. We make them far easier to use with our [integrations](/integrations/apis).
- You don't need to register/unregister for webhooks, we do it for you
- They work locally during development without needing to use tunnels (e.g. Ngrok)
- We receive the webhook, then keep trying to send it to you until you receive it. If your server goes down, no problem.
## Usage
There are two ways to use webhooks with Trigger.dev:
1. Use one of our built-in integrations, such as [GitHub](/integrations/github). We'll take care of registering the webhook for you.
2. Use our [webhookEvent](/reference/webhook-event) function to create a webhook subscription and you'll register the webhook yourself.
## Webhook integrations
We currently have built in integrations for the following webhooks:
- [GitHub](/integrations/apis/github)
Please [join our discord community](https://discord.gg/kA47vcd8P6) and let us know which integration you'd like us to add.
We've documented all the support webhooks for each integration in the sidebar, for example the GitHub [newStarEvent](/integrations/apis/github/events/new-star) webhook:
```ts
import { github } from "@trigger.dev/integrations";
new Trigger({
id: "demo",
on: github.events.newStarEvent({
repo: "triggerdotdev/trigger.dev",
}),
run: async (event, ctx) => {},
}).listen();
```
Once you've connected to Trigger.dev, and authorized your GitHub account, we'll go ahead and register the webhook in the repository you've specified and start triggering your `Trigger.run` function when new stars roll in.
## Manual Webhooks
If we haven't built out the integration you need, you can use our `webhookEvent` function to create a webhook subscription. You'll need to register the webhook yourself, but we'll take care of the rest. Here's an example for triggering events when a new booking happens in [Cal.com](https://cal.com):
```ts
new Trigger({
id: "caldotcom-to-slack",
name: "Cal.com To Slack",
on: webhookEvent({
service: "cal.com",
eventName: "BOOKING_CREATED",
filter: {
triggerEvent: ["BOOKING_CREATED"],
},
schema: z.any(),
verifyPayload: {
enabled: true,
header: "X-Cal-Signature-256",
},
}),
run: async (event, ctx) => {},
}).listen();
```
For more information on the various options for `webhookEvent`, see the [webhookEvent reference](/reference/webhook-event).
Once you connect to Trigger.dev, we will display the URL and (optionally) the secret you need to register with the webhook provider on the workflow overview page:
![Webhook URL](/images/webhook-url.png)
Copy the URL and secret, and register the webhook with the provider (in this case, Cal.com). Once you've done that, we'll start triggering your `Trigger.run` function when the webhook fires.
## Examples
<CodeGroup>
```ts Github
import { Trigger } from "@trigger.dev/sdk";
import { github, slack } from "@trigger.dev/integrations";
new Trigger({
id: "escalate-critical-issues",
name: "Posts to Slack when GitHub Issue created or modified",
apiKey: "<my_api_key>",
//this is the webhook subscription
on: github.events.issueEvent({
repo: "my-github-org/my-github-repo",
}),
//this function is run when the webhook fires
run: async (event, ctx) => {
if (event.action === "labeled") {
await ctx.logger.info(
`The issue ${event.issue.title} was labeled ${event.label.name}`
);
if (event.label.name === "critical") {
await slack.postMessage("send-to-slack", {
channel: "serious-issues",
text: `Critical issue: ${event.issue.title} was labeled ${event.label.name}`,
});
}
}
return event;
},
}).listen();
```
</CodeGroup>
-55
View File
@@ -1,55 +0,0 @@
---
title: "Trigger.dev Documentation"
sidebarTitle: "Welcome"
description: ""
---
Trigger.dev is an open source platform that enables developers to create event-driven background tasks directly in their code. Build, test and run workflows locally and subscribe to webhooks, schedule jobs, run background jobs and add long delays easily and reliably.
Workflows live in your codebase so you can use your existing types, functions, version control and IDE. They are triggered by us but run on your server so your private data is never exposed.
Go to [trigger.dev](https://app.trigger.dev) and sign up or login to your account.
_A workflow in action:_
![Test a run](/images/workflow-demo.gif)
<iframe
width="100%"
height="440"
src="https://www.youtube.com/embed/aFlwD0frvnQ?rel=0"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
&nbsp;
<CardGroup>
<Card title="Getting Started" icon="circle-play" href="/getting-started">
Quickly get up and running with Trigger.dev by following our quick start
guide.
</Card>
<Card
title="Examples"
icon="arrow-right-arrow-left"
href="/examples/examples"
>
One of the quickest ways to learn how Trigger.dev works is to view some
example workflows.
</Card>
<Card
title="Join Our Discord"
icon="discord"
href="https://discord.gg/kA47vcd8P6"
>
The #help-and-questions channel is a great place to get help with any
questions about Trigger.dev.
</Card>
<Card
title="Schedule a call"
icon="phone"
href="https://cal.com/team/triggerdotdev/support"
>
Arrange a call with one of the founders. We can help answer questions, build
API integrations for you and help you with workflows.
</Card>
</CardGroup>
+21
View File
@@ -0,0 +1,21 @@
{
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"prettier"
],
"env": {
"node": true,
"commonjs": true
},
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"root": true,
"rules": {
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unused-vars": "off",
"no-console": "off"
},
"ignorePatterns": ["**/dist/*.js"]
}
+105
View File
@@ -0,0 +1,105 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and *not* Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
.DS_Store
+1
View File
@@ -0,0 +1 @@
{ "workspaceId": "63ea6cff29733e58db1e6b80" }
+4
View File
@@ -0,0 +1,4 @@
node_modules
/build
.env
+55
View File
@@ -0,0 +1,55 @@
FROM node:16-bullseye AS pruner
RUN apt-get update && apt-get install openssl -y
WORKDIR /app
RUN npm install turbo@1.7.0 -g
COPY . .
RUN turbo prune --scope=integrations --docker
RUN find . -name "node_modules" -type d -prune -exec rm -rf '{}' +
# Base strategy to have layer caching
FROM node:16-bullseye AS base
RUN apt-get update && apt-get install openssl -y
WORKDIR /app
COPY .gitignore .gitignore
COPY --from=pruner /app/out/json/ .
COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY --from=pruner /app/out/pnpm-workspace.yaml ./pnpm-workspace.yaml
FROM base AS production-deps
WORKDIR /app
RUN npm install turbo@1.7.0 -g
RUN corepack enable
ENV NODE_ENV production
COPY --from=pruner /app/out/full/apps/integrations/prisma/schema.prisma /app/apps/integrations/prisma/schema.prisma
RUN pnpm install --prod --frozen-lockfile
RUN pnpx prisma generate --schema /app/apps/integrations/prisma/schema.prisma
FROM base AS builder
WORKDIR /app
RUN npm install turbo@1.7.0 -g
COPY turbo.json turbo.json
RUN corepack enable
COPY --from=pruner /app/out/full/ .
ENV NODE_ENV development
RUN pnpm install --ignore-scripts --frozen-lockfile
ENV NODE_ENV production
RUN pnpm run generate
RUN pnpm run build --filter=integrations...
RUN pnpx prisma migrate deploy --schema apps/integrations/prisma/schema.prisma
# Runner
FROM node:16-bullseye AS runner
RUN apt-get update && apt-get install openssl -y
WORKDIR /app
RUN corepack enable
ENV NODE_ENV production
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 expressjs
RUN chown -R expressjs:nodejs /app
USER expressjs
COPY --from=pruner --chown=expressjs:nodejs /app/out/full/ .
COPY --from=production-deps --chown=expressjs:nodejs /app .
COPY --from=builder --chown=expressjs:nodejs /app/apps/integrations/dist/index.js ./apps/integrations/dist/index.js
ENTRYPOINT ["pnpm", "--filter", "integrations", "run", "start"]
+2
View File
@@ -0,0 +1,2 @@
# trigger-integrations
You can create API integrations using this data and system
+71
View File
@@ -0,0 +1,71 @@
{
"private": true,
"name": "integrations",
"version": "1.0.0",
"description": "API integrations in a format that can be used to generate clients",
"main": "./dist/index.js",
"scripts": {
"build": "tsup",
"start": "node dist/index.js",
"dev": "node -r dotenv/config dist/index.js",
"test": "vitest",
"typecheck": "tsc -b",
"lint": "eslint --no-error-on-unmatched-pattern src/**",
"lint-fix": "eslint --no-error-on-unmatched-pattern --fix src/**",
"generate-integrations": "NODE_OPTIONS=--max-old-space-size=16384 tsx src/trigger/sdk/generate.ts generate",
"generate": "prisma generate",
"convert": "tsx src/tools/schemas/typescript-to-json-schema.ts convert",
"db:migrate:deploy": "prisma migrate deploy",
"db:migrate:dev": "prisma migrate dev"
},
"dependencies": {
"@cfworker/json-schema": "^1.12.5",
"@prisma/client": "^4.3.0",
"@sentry/node": "^7.38.0",
"ajv": "^8.12.0",
"express": "^4.18.1",
"express-async-errors": "^3.1.1",
"json-pointer": "^0.6.2",
"json-schema-deref-sync": "^0.14.0",
"json-schema-to-typescript": "^11.0.3",
"loglevel": "^1.8.1",
"morgan": "^1.10.0",
"node-fetch": "^3.3.0",
"node-object-hash": "^2.3.10",
"zod": "^3.20.2"
},
"devDependencies": {
"@apidevtools/json-schema-ref-parser": "^10.1.0",
"@types/eslint": "^8.4.6",
"@types/express": "^4.17.13",
"@types/json-pointer": "^1.0.31",
"@types/morgan": "^1.9.3",
"@types/node": "^18.13.0",
"@typescript-eslint/eslint-plugin": "^5.51.0",
"commander": "^9.4.1",
"concurrently": "^7.6.0",
"dotenv": "^16.0.3",
"eslint": "^8.34.0",
"eslint-config-prettier": "^8.5.0",
"eslint-config-standard-with-typescript": "^34.0.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-n": "^15.6.1",
"eslint-plugin-promise": "^6.1.1",
"nock": "^13.3.0",
"nodemon": "^2.0.19",
"prisma": "^4.3.0",
"rimraf": "^4.1.2",
"tiny-invariant": "^1.2.0",
"ts-json-schema-generator": "^1.2.0",
"ts-morph": "^17.0.1",
"tsup": "^6.6.2",
"tsx": "^3.12.3",
"typescript": "^4.9.5",
"vite": "^4.1.1",
"vite-tsconfig-paths": "^4.0.5",
"vitest": "^0.28.4"
},
"engines": {
"node": ">=16.0.0"
}
}
@@ -0,0 +1,20 @@
-- CreateTable
CREATE TABLE "Cache" (
"id" TEXT NOT NULL,
"namespace" TEXT NOT NULL,
"key" TEXT NOT NULL,
"value" TEXT NOT NULL,
"expiresAt" TIMESTAMP(3) NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "Cache_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "Cache_key_key" ON "Cache"("key");
-- CreateIndex
CREATE INDEX "Cache_namespace_key_idx" ON "Cache"("namespace", "key");
-- CreateIndex
CREATE UNIQUE INDEX "Cache_namespace_key_key" ON "Cache"("namespace", "key");
@@ -0,0 +1,5 @@
-- DropIndex
DROP INDEX "Cache_key_key";
-- DropIndex
DROP INDEX "Cache_namespace_key_idx";
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Cache" ALTER COLUMN "expiresAt" DROP NOT NULL;
@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "postgresql"
+22
View File
@@ -0,0 +1,22 @@
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
output = "../node_modules/.prisma/client"
binaryTargets = ["native", "debian-openssl-1.1.x"]
previewFeatures = ["orderByNulls"]
}
model Cache {
id String @id @default(cuid())
namespace String
key String
value String
expiresAt DateTime?
createdAt DateTime @default(now())
@@unique([namespace, key])
}
@@ -0,0 +1,34 @@
import { InputSpec } from "core/action/types";
export function createParametersBody(
inputSpec: InputSpec,
params?: Record<string | number, any> | undefined
) {
//separate the parameters and body by looking at the spec and pulling properties out
let parameters: Record<string, any> | undefined = undefined;
let body: any = undefined;
if (params) {
inputSpec.parameters?.forEach((p) => {
if (!parameters) {
parameters = {};
}
parameters[p.name] = params[p.name];
});
//everything left should go in the body
if (inputSpec.body) {
body = {};
Object.keys(params).forEach((name) => {
if (!inputSpec.parameters?.find((p) => p.name === name)) {
body[name] = params[name];
}
});
}
}
return {
parameters,
body,
};
}
@@ -0,0 +1,50 @@
import { DisplayProperties } from "core/action/types";
import { Request, Response } from "express";
import { catalog } from "integrations/catalog";
import { z } from "zod";
import { createParametersBody } from "./createParametersBody";
import { getServiceAction } from "./validation";
const requestBodySchema = z.object({
params: z.record(z.string().or(z.number()), z.any()).optional(),
});
export async function handleActionDisplay(req: Request, res: Response) {
const serviceActionResult = getServiceAction(req.params);
if (!serviceActionResult.success) {
res
.status(404)
.send(
JSON.stringify({ success: false, error: serviceActionResult.error })
);
return;
}
const { service, action } = serviceActionResult;
const parsedRequestBody = requestBodySchema.safeParse(req.body);
if (!parsedRequestBody.success) {
res.status(400).send(
JSON.stringify({
success: false,
error: {
type: "invalid_body",
message: "Action not found",
service,
action,
issues: parsedRequestBody.error.issues,
},
})
);
return;
}
const requestData = createParametersBody(
action.spec.input,
parsedRequestBody.data.params
);
const displayProperties = await action.displayProperties(requestData);
res.send(JSON.stringify({ success: true, properties: displayProperties }));
}
@@ -0,0 +1,148 @@
import { PostgresCacheService } from "cache/postgresCache";
import { AuthCredentials } from "core/authentication/types";
import { Service } from "core/service/types";
import { validateInputs } from "core/validation/inputs";
import { Request, Response } from "express";
import { z } from "zod";
import { error, ReturnResponse } from "../requestUtilities";
import { createParametersBody } from "./createParametersBody";
import { getServiceAction } from "./validation";
const requestBodySchema = z.object({
credentials: z.object({ accessToken: z.string() }).optional(),
params: z.record(z.string().or(z.number()), z.any()).optional(),
metadata: z.object({
requestId: z.string(),
workflowId: z.string(),
connectionId: z.string(),
}),
});
export async function handleAction(req: Request, res: Response) {
const serviceActionResult = getServiceAction(req.params);
if (!serviceActionResult.success) {
res
.status(404)
.send(JSON.stringify(error(404, false, serviceActionResult.error)));
return;
}
const { service, action } = serviceActionResult;
const parsedRequestBody = requestBodySchema.safeParse(req.body);
if (!parsedRequestBody.success) {
res.status(400).send(
JSON.stringify(
error(400, false, {
type: "invalid_body",
message: "Action not found",
service,
action,
issues: parsedRequestBody.error.issues,
})
)
);
return;
}
//for v1 of this API we're building the credentials from the action
//this is fine for now but we'll want to use the connection in future to cover complex cases
let credentials: AuthCredentials | undefined = undefined;
if (parsedRequestBody.data.credentials && action.spec.input.security) {
const firstSecurityMethod = Object.entries(action.spec.input.security)[0];
if (firstSecurityMethod) {
const [name, scopes] = firstSecurityMethod;
//get the full info from the service
const securityMethod = service.authentication[name];
switch (securityMethod.type) {
case "oauth2":
credentials = {
type: "oauth2",
name,
accessToken: parsedRequestBody.data.credentials.accessToken,
scopes,
};
break;
case "api_key":
credentials = {
type: "api_key",
name,
api_key: parsedRequestBody.data.credentials.accessToken,
scopes,
};
break;
default:
throw new Error(
`Not implemented credentials for: ${JSON.stringify(securityMethod)}`
);
}
}
}
const { parameters, body } = createParametersBody(
action.spec.input,
parsedRequestBody.data.params
);
const inputValidationResult = await validateInputs(action.spec.input, {
parameters,
body,
credentials,
});
if (!inputValidationResult.success) {
res
.status(400)
.send(JSON.stringify(error(400, false, inputValidationResult.error)));
return;
}
const { metadata } = parsedRequestBody.data;
const cache = new PostgresCacheService(`${metadata.connectionId}-${service}`);
try {
const data = await action.action(
{ credentials, parameters, body },
cache,
metadata
);
//convert into the format for the webapp
const response: ReturnResponse = {
ok: true,
isRetryable: isRetryable(service, data.status),
response: {
output: data.body ?? {},
context: {
statusCode: data.status,
headers: data.headers,
},
},
};
res.send(JSON.stringify(response));
} catch (e: any) {
console.error(e);
if (e instanceof Error) {
res
.status(500)
.send(JSON.stringify(error(500, false, { error: JSON.stringify(e) })));
return;
}
if ("error" in e) {
res.status(500).send(JSON.stringify(error(500, false, e.error)));
return;
}
res
.status(500)
.send(JSON.stringify(error(500, false, { error: JSON.stringify(e) })));
}
}
function isRetryable(service: Service, status: number): boolean {
return service.retryableStatusCodes.includes(status);
}
@@ -0,0 +1,50 @@
import { Action } from "core/action/types";
import { Service } from "core/service/types";
import { Request } from "express";
import { catalog } from "integrations/catalog";
type ServiceActionResult =
| {
success: true;
service: Service;
action: Action;
}
| {
success: false;
error: Record<string, any>;
};
export function getServiceAction(
params: Request["params"]
): ServiceActionResult {
const { service, action } = params;
const matchingService = Object.values(catalog.services).find(
(s) => s.service === service
);
if (!matchingService) {
return {
success: false,
error: { type: "missing_service", message: "Service not found", service },
};
}
const matchingAction = Object.values(matchingService.actions).find(
(a) => a.name === action
);
if (!matchingAction) {
return {
success: false,
error: {
type: "missing_action",
message: "Action not found",
service,
action,
},
};
}
return { success: true, service: matchingService, action: matchingAction };
}
+116
View File
@@ -0,0 +1,116 @@
import { AuthCredentials } from "core/authentication/types";
import { HTTPMethodSchema } from "core/endpoint/types";
import { serviceFetch } from "core/fetch/serviceFetch";
import { Request, Response } from "express";
import { catalog } from "integrations/catalog";
import { z } from "zod";
import { error } from "./requestUtilities";
const requestBodySchema = z.object({
credentials: z.object({ accessToken: z.string() }).optional(),
path: z.string(),
method: HTTPMethodSchema,
headers: z.record(z.string(), z.string()).optional(),
body: z.any(),
});
type ReturnResponse = {
response: NormalizedResponse;
isRetryable: boolean;
ok: boolean;
};
type NormalizedResponse = {
output: NonNullable<any>;
context: any;
};
export async function handleAction(req: Request, res: Response) {
const { service } = req.params;
const matchingService = Object.values(catalog.services).find(
(s) => s.service === service
);
if (!matchingService) {
return {
success: false,
error: { type: "missing_service", message: "Service not found", service },
};
}
const parsedRequestBody = requestBodySchema.safeParse(req.body);
if (!parsedRequestBody.success) {
res.status(400).send(
JSON.stringify(
error(400, false, {
type: "invalid_body",
message: "Invalid input",
issues: parsedRequestBody.error.issues,
})
)
);
return;
}
//v1 build credentials from the service authentication info
let credentials: AuthCredentials | undefined = undefined;
if (parsedRequestBody.data.credentials) {
//just get the first security method
const [name, securityMethod] = Object.entries(
matchingService.authentication
)[0];
switch (securityMethod.type) {
case "oauth2":
credentials = {
type: "oauth2",
name,
accessToken: parsedRequestBody.data.credentials.accessToken,
scopes: Object.keys(securityMethod.scopes),
};
break;
case "api_key":
credentials = {
type: "api_key",
name,
api_key: parsedRequestBody.data.credentials.accessToken,
scopes: Object.keys(securityMethod.scopes),
};
break;
default:
throw new Error(
`Not implemented credentials for: ${JSON.stringify(securityMethod)}`
);
}
}
const url = matchingService.baseUrl + parsedRequestBody.data.path;
const data = await serviceFetch({
url,
method: parsedRequestBody.data.method,
headers: parsedRequestBody.data.headers,
body: parsedRequestBody.data.body,
authentication: matchingService.authentication,
credentials,
});
const response: ReturnResponse = {
ok: true,
isRetryable: isRetryable(data.status),
response: {
output: data.body ?? {},
context: {
statusCode: data.status,
headers: data.headers,
},
},
};
res.send(JSON.stringify(response));
}
function isRetryable(statusCode: number) {
return [408, 429, 500, 502, 503, 504].includes(statusCode);
}
@@ -0,0 +1,29 @@
export type ReturnResponse = {
response: NormalizedResponse;
isRetryable: boolean;
ok: boolean;
};
export type NormalizedResponse = {
output: NonNullable<any>;
context: any;
};
export function error(
status: number,
isRetryable: boolean,
error: Record<string, any>
): ReturnResponse {
const response: ReturnResponse = {
ok: false,
isRetryable,
response: {
output: error,
context: {
statusCode: status,
headers: {},
},
},
};
return response;
}
+38
View File
@@ -0,0 +1,38 @@
import { IntegrationAuthentication } from "core/authentication/types";
import { Service } from "core/service/types";
import { Request, Response } from "express";
import { catalog } from "integrations/catalog";
type ServiceMetadata = {
name: string;
service: string;
version: string;
icon: string;
live: boolean;
authentication: IntegrationAuthentication;
};
export async function handleServices(_req: Request, res: Response) {
const servicesMetadata: Record<string, ServiceMetadata> = {};
Object.entries(catalog.services).forEach(([key, service]) => {
if (service.live === false) return;
const metadata = omitExtraInfo(service);
servicesMetadata[key] = {
...metadata,
icon: `/integrations/${metadata.service}.png`,
};
});
res.send(
JSON.stringify({
services: servicesMetadata,
})
);
}
function omitExtraInfo(
service: Service
): Omit<Service, "actions" | "retryableStatusCodes"> {
const { actions, retryableStatusCodes, ...rest } = service;
return rest;
}
+58
View File
@@ -0,0 +1,58 @@
import { PrismaClient, Prisma } from ".prisma/client";
import invariant from "tiny-invariant";
export { Prisma };
let prisma: PrismaClient;
declare global {
// eslint-disable-next-line no-var
var __db__: PrismaClient;
}
// this is needed because in development we don't want to restart
// the server with every change, but we want to make sure we don't
// create a new connection to the DB with every change either.
// in production we'll have a single connection to the DB.
if (process.env.NODE_ENV === "production") {
prisma = getClient();
} else {
if (!global.__db__) {
global.__db__ = getClient();
}
prisma = global.__db__;
}
function getClient() {
const { DATABASE_URL } = process.env;
invariant(typeof DATABASE_URL === "string", "DATABASE_URL env var not set");
// Remove the username:password in the url and print that to the console
const urlWithoutCredentials = new URL(DATABASE_URL);
urlWithoutCredentials.password = "";
console.log(
`1. 🔌 setting up prisma client to ${urlWithoutCredentials.toString()}`
);
const client = new PrismaClient({
datasources: {
db: {
url: DATABASE_URL,
},
},
log: ["warn", "error"],
});
console.log(`2.0 🔌 prisma client connecting`);
// connect eagerly
client.$connect();
console.log(`3.0 🔌 prisma client connected`);
return client;
}
export { prisma };
export type { PrismaClient } from ".prisma/client";
+53
View File
@@ -0,0 +1,53 @@
import type { Prisma, Cache } from ".prisma/client";
import { prisma } from "./db.server";
import { CacheService } from "core/cache/types";
export class PostgresCacheService implements CacheService {
constructor(private readonly namespace: string) {}
async get(key: string) {
const cachedRow = await prisma.cache.findFirst({
where: {
namespace: this.namespace,
key,
OR: [
{ expiresAt: null },
{
expiresAt: {
gt: new Date(),
},
},
],
},
});
if (cachedRow) {
return cachedRow.value;
}
return null;
}
async set(key: string, value: string, ttl?: number): Promise<void> {
const expiresAt = ttl ? new Date(Date.now() + ttl * 1000) : null;
await prisma.cache.upsert({
where: {
namespace_key: {
namespace: this.namespace,
key,
},
},
update: {
value,
expiresAt,
},
create: {
namespace: this.namespace,
key,
value,
expiresAt,
},
});
}
}
@@ -0,0 +1,27 @@
import { EndpointSpecMetadata } from "core/endpoint/types";
import { RequestData } from "core/request/types";
export async function getDisplayProperties(
data: RequestData,
displayProperties: EndpointSpecMetadata["displayProperties"]
) {
return {
title: interpolateString(displayProperties.title, {
parameters: data.parameters,
body: data.body,
}),
};
}
function interpolateString(
template: string,
data: Record<string | number, any>
) {
return template.replace(/\${([^}]+)}/g, (_, key) => {
return key
.split(".")
.reduce((obj: Record<string | number, any>, prop: string | number) => {
return obj[prop];
}, data);
});
}
@@ -0,0 +1,89 @@
import { CacheService } from "core/cache/types";
import { Endpoint } from "core/endpoint/types";
import { RequestData, RequestResponse } from "core/request/types";
import { getDisplayProperties } from "./getDisplayProperties";
import { Action, InputSpec, Metadata, OutputSpec } from "./types";
import { makeInputSpec, makeOutputSpec } from "./utilities";
/** Create an action where you specify the spec and action */
export const makeAdvancedAction = ({
endpoint,
spec,
action,
}: {
endpoint: Endpoint;
spec: Action["spec"];
action: (
data: RequestData,
cache?: CacheService,
metadata?: Metadata
) => Promise<RequestResponse>;
}) => {
const displayProperties = async (data: RequestData) => {
return getDisplayProperties(
data,
endpoint.spec.endpointSpec.metadata.displayProperties
);
};
return {
name: endpoint.spec.endpointSpec.metadata.name,
description: endpoint.spec.endpointSpec.metadata.description,
path: endpoint.spec.endpointSpec.path,
method: endpoint.spec.endpointSpec.method,
spec,
action,
displayProperties,
};
};
/** Creates an action where the spec and data is manipulated */
export const makeSimpleAction = (
endpoint: Endpoint,
processSpec?: (specs: Action["spec"]) => Action["spec"],
preRequest?: (data: RequestData) => RequestData
) => {
let specs = {
input: makeInputSpec(endpoint),
output: makeOutputSpec(endpoint),
};
if (processSpec) {
specs = processSpec(specs);
}
const action = async (
data: RequestData,
cache?: CacheService,
metadata?: Metadata
) => {
if (preRequest) {
data = preRequest(data);
}
//a simple request doesn't use the cache or metadata
return await endpoint.request(data);
};
return makeAdvancedAction({
endpoint,
spec: specs,
action,
});
};
export const makeSimpleActions = <
TEndpoints extends Record<string, Endpoint>,
K extends keyof TEndpoints
>(
endpoints: TEndpoints,
processSpec?: (specs: Action["spec"]) => Action["spec"],
preRequest?: (data: RequestData) => RequestData
): Record<K, Action> => {
const actions: any = {};
Object.entries(endpoints).forEach(([name, endpoint]) => {
actions[name as K] = makeSimpleAction(endpoint, processSpec, preRequest);
});
return actions;
};
@@ -0,0 +1,42 @@
import { CacheService } from "core/cache/types";
import { EndpointSpec, HTTPMethod } from "core/endpoint/types";
import { RequestData, RequestResponse } from "core/request/types";
export type InputSpec = {
security?: EndpointSpec["security"];
parameters?: EndpointSpec["parameters"];
body?: NonNullable<EndpointSpec["request"]["body"]>["schema"];
};
export type OutputSpec = {
responses: EndpointSpec["responses"];
};
export type Metadata = Record<string, any>;
export type DisplayProperties = {
title: string;
};
export type Action = {
name: string;
description: string;
path: string;
method: HTTPMethod;
spec: {
input: InputSpec;
output: OutputSpec;
};
action: (
/** The data to be sent to the endpoint */
data: RequestData,
/** The cache service to use for caching */
cache?: CacheService,
/** Additional metadata that can be used to modify the request */
metadata?: Metadata
) => Promise<RequestResponse>;
displayProperties: (
/** The data to be sent to the endpoint */
data: RequestData
) => Promise<DisplayProperties>;
};
@@ -0,0 +1,49 @@
import { Endpoint } from "core/endpoint/types";
import { InputSpec, OutputSpec } from "./types";
export function makeInputSpec(endpoint: Endpoint): InputSpec {
return {
security: endpoint.spec.endpointSpec.security,
parameters: endpoint.spec.endpointSpec.parameters,
body: endpoint.spec.endpointSpec.request.body?.schema,
};
}
export function makeOutputSpec(endpoint: Endpoint): OutputSpec {
return {
responses: endpoint.spec.endpointSpec.responses,
};
}
export function combineSecurityScopes(
securities: (Record<string, string[]> | undefined)[]
): Record<string, string[]> | undefined {
const securityA = securities[0];
const securityB = securities[1];
//where a key already exists, concatenate the scope arrays together
//where a key does not exist, add it to the object
let combined: Record<string, string[]> = {};
if (securityA) {
combined = {
...securityA,
};
}
if (securityB) {
for (const key in securityB) {
if (combined[key]) {
combined[key] = [...combined[key], ...securityB[key]];
} else {
combined[key] = securityB[key];
}
}
}
if (securities.length > 2) {
return combineSecurityScopes([combined, ...securities.slice(2)]);
}
return combined;
}
@@ -0,0 +1,82 @@
import { EndpointSpec } from "core/endpoint/types";
import { FetchConfig } from "core/request/types";
import { expect, test } from "vitest";
import { checkRequiredScopes, applyCredentials } from "./credentials";
import { AuthCredentials, IntegrationAuthentication } from "./types";
test("Required scopes present", async () => {
const credentials: AuthCredentials = {
type: "oauth2",
name: "authName",
accessToken: "token",
scopes: ["scope1", "scope2"],
};
const requiredScopes = ["scope1", "scope2"];
const result = checkRequiredScopes(requiredScopes, credentials);
expect(result.success).toEqual(true);
});
test("Required scopes missing", async () => {
const credentials: AuthCredentials = {
type: "oauth2",
name: "authName",
accessToken: "token",
scopes: ["scope1", "scope2"],
};
const requiredScopes = ["scope1", "scope2", "scope3"];
const result = checkRequiredScopes(requiredScopes, credentials);
expect(result.success).toEqual(false);
if (result.success) throw new Error("Should not be success");
expect(result.missingScopes).toEqual(["scope3"]);
});
test("Applied credentials", async () => {
const credentials: AuthCredentials = {
type: "oauth2",
name: "authName",
accessToken: "123456",
scopes: ["scope1", "scope2"],
};
const endpointSecurity: EndpointSpec["security"] = {
authName: ["scope1", "scope2"],
};
const integrationAuthentication: IntegrationAuthentication = {
authName: {
type: "oauth2",
placement: {
in: "header",
type: "bearer",
key: "Authorization",
},
authorizationUrl: "https://example.com",
tokenUrl: "https://example.com",
flow: "accessCode",
scopes: {
scope1: "scope1",
scope2: "scope2",
},
},
};
const existingFetch: FetchConfig = {
url: "https://example.com",
method: "GET",
headers: {
"Content-Type": "application/json",
},
};
const fetchConfig = applyCredentials(existingFetch, {
endpointSecurity,
authentication: integrationAuthentication,
credentials,
});
expect(fetchConfig.headers.Authorization).toEqual("Bearer 123456");
expect(fetchConfig.headers["Content-Type"]).toEqual("application/json");
});
@@ -0,0 +1,107 @@
import { EndpointSpec } from "core/endpoint/types";
import { InsufficientScopesError } from "core/request/errors";
import { FetchConfig } from "core/request/types";
import { IntegrationAuthentication, AuthCredentials } from "./types";
/** Apply the given credentials to the given fetch config */
export function applyCredentials(
fetch: FetchConfig,
{
endpointSecurity,
authentication,
credentials,
}: {
endpointSecurity: EndpointSpec["security"];
authentication: IntegrationAuthentication;
credentials: AuthCredentials;
}
): FetchConfig {
if (endpointSecurity === undefined) return fetch;
// check if the credentials have the required scopes
const requiredScopes = endpointSecurity[credentials.name] ?? [];
const scopesCheckResult = checkRequiredScopes(requiredScopes, credentials);
if (!scopesCheckResult.success) {
const error: InsufficientScopesError = {
type: "insufficient_scopes",
missingScopes: scopesCheckResult.missingScopes,
};
throw error;
}
return addCredentialsToConfig(fetch, { authentication, credentials });
}
export function addCredentialsToConfig(
fetch: FetchConfig,
{
authentication,
credentials,
}: {
authentication: IntegrationAuthentication;
credentials: AuthCredentials;
}
) {
// apply the credentials
switch (credentials.type) {
case "oauth2": {
const authConfig = authentication[credentials.name];
switch (authConfig.placement.in) {
case "header": {
fetch.headers[
authConfig.placement.key
] = `Bearer ${credentials.accessToken}`;
return fetch;
}
}
break;
}
case "api_key": {
const authConfig = authentication[credentials.name];
if (authConfig.placement.in === "header") {
let value = "";
switch (authConfig.placement.type) {
case "basic":
value = `Basic ${credentials.api_key}`;
break;
case "bearer":
value = `Bearer ${credentials.api_key}`;
break;
}
fetch.headers[authConfig.placement.key] = value;
}
return fetch;
}
}
throw new Error("Invalid credentials");
}
type ScopesCheckResult =
| {
success: true;
}
| {
success: false;
missingScopes: string[];
};
/** Check if the given credentials have the required scopes */
export function checkRequiredScopes(
requiredScopes: string[],
credentials: AuthCredentials
): ScopesCheckResult {
const missingScopes = requiredScopes.filter(
(scope) => !credentials.scopes.includes(scope)
);
if (missingScopes.length > 0) {
return {
success: false,
missingScopes,
};
}
return {
success: true,
};
}
@@ -0,0 +1,61 @@
import { z } from "zod";
export type IntegrationAuthentication = Record<
string,
AuthenticationDefinition
>;
type AuthenticationDefinition = OAuth2Authentication | APIKeyAuthentication;
type OAuth2Authentication = {
type: "oauth2";
placement: AuthenticationPlacement;
authorizationUrl: string;
tokenUrl: string;
flow: "accessCode" | "implicit" | "password" | "application";
scopes: Record<string, string>;
};
type APIKeyAuthentication = {
type: "api_key";
placement: AuthenticationPlacement;
documentation: string;
scopes: Record<string, string>;
additionalFields?: {
key: string;
fieldType: "text";
name: string;
placeholder?: string;
description: string;
}[];
};
type AuthenticationPlacement = HeaderAuthentication;
interface HeaderAuthentication {
in: "header";
type: "basic" | "bearer";
key: string;
}
const OAuth2CredentialsSchema = z.object({
type: z.literal("oauth2"),
name: z.string(),
accessToken: z.string(),
scopes: z.array(z.string()),
});
const APIKeyCredentialsSchema = z.object({
type: z.literal("api_key"),
name: z.string(),
api_key: z.string(),
additionalFields: z.record(z.string(), z.string()).optional(),
scopes: z.array(z.string()),
});
export const AuthCredentialsSchema = z.discriminatedUnion("type", [
OAuth2CredentialsSchema,
APIKeyCredentialsSchema,
]);
export type AuthCredentials = z.infer<typeof AuthCredentialsSchema>;

Some files were not shown because too many files have changed in this diff Show More