Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
8398434
feat(db): Database changes for Vercel integration
0ski Jan 8, 2026
555d637
feat(vercel): add Vercel integration settings UI and actions
0ski Jan 9, 2026
c5b4d07
feat(integrations): add Vercel integration settings UI and paths
0ski Jan 9, 2026
1c960eb
feat(telemetry include referralSource in identify and clear cookie fo…
0ski Jan 9, 2026
69ed9d1
feat(vercel): Vercel side initialized installation
0ski Jan 9, 2026
e9f4557
refactor(vercel): tidy imports, adjust dialog structure, and unify types
0ski Jan 12, 2026
6e99b2c
refactor(vercel): normalize env responses and helpers
0ski Jan 12, 2026
6c72cf4
refactor(vercel): AI Deslop
0ski Jan 12, 2026
e87171d
feat(vercel): add install param parser and org requirement helper
0ski Jan 12, 2026
1bc8053
feat(vercel): update tokens, refine env lookup & cleanup
0ski Jan 12, 2026
f26e55d
fix(vercel): surface auth failures and handle uninstall flows
0ski Jan 12, 2026
c0bdb00
feat(vercel): implement robust OAuth callback handling
0ski Jan 12, 2026
cf82641
feat(onboarding): add Vercel onboarding route and OAuth handling
0ski Jan 13, 2026
e8efd8d
feat(vercel): integrate app slug, update callbacks, and clean UI imports
0ski Jan 14, 2026
c7da7f3
feat(vercel): pass environment id and centralize OAuth exchange
0ski Jan 16, 2026
8ec6d7a
feat(api): Add environmentSlug for initialize deployment response body
0ski Jan 23, 2026
eaf5864
feat(vercel): preserve secret status when syncing env vars&improve se…
0ski Jan 26, 2026
ef8bcc3
feat(env): skip unchanged env var updates and preserve secrets
0ski Jan 26, 2026
85cfaa8
feat(db): add versioning and lastUpdatedBy to env vars
0ski Jan 26, 2026
1757910
feat(env-vars): add updater metadata and include user info
0ski Jan 26, 2026
e50dd3d
feat(vercel): add pullNewEnvVars option and modal dismiss control
0ski Jan 28, 2026
deacfad
feat(vercel): enhance staging environment handling and add preview su…
0ski Jan 29, 2026
27074a8
feat(vercel): refine integration defaults and surface settings
0ski Feb 2, 2026
3933bcd
feat(webapp): tidy environment variables table layout
0ski Feb 2, 2026
2c267cd
feat(api): add source metadata for env var imports
0ski Feb 2, 2026
ebaac00
feat(vercel): implement build settings fields for Vercel integration
0ski Feb 3, 2026
476caee
feat(vercel): add Vercel onboarding modal component
0ski Feb 3, 2026
9f0f030
fix(webapp): Fix typings
0ski Feb 3, 2026
29e7f09
feat(vercel): PR feedback changes
0ski Feb 3, 2026
54e1384
chore(webapp): Logging cleanup
0ski Feb 3, 2026
bcdb4eb
chore(core): Remove unused enum
0ski Feb 3, 2026
fa2295d
feat(core): Add Vercel integration changelog
0ski Feb 3, 2026
077a366
chore(vercel): Rewrite logic to use neverthrow instead of try-catch
0ski Feb 3, 2026
2953d4c
refactor(vercel): Enhance Vercel integration handling with ResultAsyn…
0ski Feb 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/vercel-integration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/core": patch
---

Add Vercel integration support to API schemas: `commitSHA` and `integrationDeployments` on deployment responses, and `source` field for environment variable imports.
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
"packages/cli-v3/e2e": true
},
"vitest.disableWorkspaceWarning": true,
"typescript.experimental.useTsgo": false
"typescript.experimental.useTsgo": true,
"chat.agent.maxRequests": 10000
}
2 changes: 0 additions & 2 deletions apps/webapp/app/components/GitHubLoginButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ export function OctoKitty({ className }: { className?: string }) {
baseProfile="tiny"
id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
x="0px"
y="0px"
viewBox="0 0 2350 2314.8"
xmlSpace="preserve"
fill="currentColor"
Expand Down
180 changes: 180 additions & 0 deletions apps/webapp/app/components/integrations/VercelBuildSettings.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
import { Switch } from "~/components/primitives/Switch";
import { Label } from "~/components/primitives/Label";
import { Hint } from "~/components/primitives/Hint";
import { TextLink } from "~/components/primitives/TextLink";
import {
EnvironmentIcon,
environmentFullTitle,
environmentTextClassName,
} from "~/components/environments/EnvironmentLabel";
import type { EnvSlug } from "~/v3/vercel/vercelProjectIntegrationSchema";

type BuildSettingsFieldsProps = {
availableEnvSlugs: EnvSlug[];
pullEnvVarsBeforeBuild: EnvSlug[];
onPullEnvVarsChange: (slugs: EnvSlug[]) => void;
discoverEnvVars: EnvSlug[];
onDiscoverEnvVarsChange: (slugs: EnvSlug[]) => void;
atomicBuilds: EnvSlug[];
onAtomicBuildsChange: (slugs: EnvSlug[]) => void;
envVarsConfigLink?: string;
};

function slugToEnvType(slug: EnvSlug) {
return slug === "prod" ? "PRODUCTION" : slug === "stg" ? "STAGING" : "PREVIEW";
}

export function BuildSettingsFields({
availableEnvSlugs,
pullEnvVarsBeforeBuild,
onPullEnvVarsChange,
discoverEnvVars,
onDiscoverEnvVarsChange,
atomicBuilds,
onAtomicBuildsChange,
envVarsConfigLink,
}: BuildSettingsFieldsProps) {
return (
<>
{/* Pull env vars before build */}
<div>
<div className="mb-2 flex items-center justify-between">
<div>
<Label>Pull env vars before build</Label>
<Hint>
Select which environments should pull environment variables from Vercel before each
build.{" "}
{envVarsConfigLink && (
<>
<TextLink to={envVarsConfigLink}>Configure which variables to pull</TextLink>.
</>
)}
</Hint>
</div>
{availableEnvSlugs.length > 1 && (
<Switch
variant="small"
checked={
availableEnvSlugs.length > 0 &&
availableEnvSlugs.every((s) => pullEnvVarsBeforeBuild.includes(s))
}
onCheckedChange={(checked) => {
onPullEnvVarsChange(checked ? [...availableEnvSlugs] : []);
}}
/>
)}
</div>
<div className="flex flex-col gap-2 rounded border bg-charcoal-800 p-3">
{availableEnvSlugs.map((slug) => {
const envType = slugToEnvType(slug);
return (
<div key={slug} className="flex items-center justify-between">
<div className="flex items-center gap-1.5">
<EnvironmentIcon environment={{ type: envType }} className="size-4" />
<span className={`text-sm ${environmentTextClassName({ type: envType })}`}>
{environmentFullTitle({ type: envType })}
</span>
</div>
<Switch
variant="small"
checked={pullEnvVarsBeforeBuild.includes(slug)}
onCheckedChange={(checked) => {
onPullEnvVarsChange(
checked
? [...pullEnvVarsBeforeBuild, slug]
: pullEnvVarsBeforeBuild.filter((s) => s !== slug)
);
}}
/>
</div>
);
})}
</div>
</div>

{/* Discover new env vars */}
<div>
<div className="mb-2 flex items-center justify-between">
<div>
<Label>Discover new env vars</Label>
<Hint>
Select which environments should automatically discover and create new environment
variables from Vercel during builds.
</Hint>
</div>
{availableEnvSlugs.length > 1 && (
<Switch
variant="small"
checked={
availableEnvSlugs.length > 0 &&
availableEnvSlugs.every(
(s) => discoverEnvVars.includes(s) || !pullEnvVarsBeforeBuild.includes(s)
) &&
availableEnvSlugs.some((s) => discoverEnvVars.includes(s))
}
disabled={!availableEnvSlugs.some((s) => pullEnvVarsBeforeBuild.includes(s))}
onCheckedChange={(checked) => {
onDiscoverEnvVarsChange(
checked
? availableEnvSlugs.filter((s) => pullEnvVarsBeforeBuild.includes(s))
: []
);
}}
/>
)}
</div>
<div className="flex flex-col gap-2 rounded border bg-charcoal-800 p-3">
{availableEnvSlugs.map((slug) => {
const envType = slugToEnvType(slug);
const isPullDisabled = !pullEnvVarsBeforeBuild.includes(slug);
return (
<div
key={slug}
className={`flex items-center justify-between ${isPullDisabled ? "opacity-50" : ""}`}
>
<div className="flex items-center gap-1.5">
<EnvironmentIcon environment={{ type: envType }} className="size-4" />
<span className={`text-sm ${environmentTextClassName({ type: envType })}`}>
{environmentFullTitle({ type: envType })}
</span>
</div>
<Switch
variant="small"
checked={discoverEnvVars.includes(slug)}
disabled={isPullDisabled}
onCheckedChange={(checked) => {
onDiscoverEnvVarsChange(
checked
? [...discoverEnvVars, slug]
: discoverEnvVars.filter((s) => s !== slug)
);
}}
/>
</div>
);
})}
</div>
</div>

{/* Atomic deployments */}
<div>
<div className="flex items-center justify-between">
<div>
<Label>Atomic deployments</Label>
<Hint>
When enabled, production deployments wait for Vercel deployment to complete before
promoting the Trigger.dev deployment.
</Hint>
</div>
<Switch
variant="small"
checked={atomicBuilds.includes("prod")}
onCheckedChange={(checked) => {
onAtomicBuildsChange(checked ? ["prod"] : []);
}}
/>
</div>
</div>
</>
);
}
12 changes: 12 additions & 0 deletions apps/webapp/app/components/integrations/VercelLogo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export function VercelLogo({ className }: { className?: string }) {
return (
<svg
viewBox="0 0 76 65"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={className}
>
<path d="M37.5274 0L75.0548 65H0L37.5274 0Z" fill="currentColor" />
</svg>
);
}
Loading