eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 3.44 kB
JavaScript
import{detectDeployment,isProjectResolved,mergeProjectResolution,projectResolutionFromDeployResult,projectResolutionFromDeployment}from"../project-resolution.js";import{hasVercelProject,requireProjectPath}from"../state.js";import{syncHostFrameworkPreset}from"../vercel-project-framework.js";import{detectPackageManager}from"#setup/package-manager.js";import{runVercel}from"#setup/primitives/run-vercel.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{createPromptCommandOutput,withPhase}from"#setup/cli/index.js";import{packageManagerInstallSucceeded,runPackageManagerInstall}from"#setup/primitives/pm/run.js";const VERCEL_DEPLOY_ENV={VERCEL_USE_EXPERIMENTAL_FRAMEWORKS:`1`};function deployProject(e){let t=e.deps??{runVercel,detectPackageManager,runPackageManagerInstall,detectDeployment,syncHostFrameworkPreset};return{id:`deploy-project`,shouldRun(t){return e.skip||!t.deploymentPending?!1:hasVercelProject(t)||e.ensureLinkedProject===`interactive-vercel-link`},async gather(){return{headless:e.headless??!1}},async perform({state:n,input:r,signal:i}){let a=requireProjectPath(n),{log:o}=e.prompter,s=createPromptCommandOutput(o),c=n.project;if(!isProjectResolved(c)){if(r.headless)throw new HumanActionRequiredError({kind:`vercel-link`,command:`vercel link`,reason:`Deployment needs this directory linked to a Vercel project.`});if(o.message(`Linking this directory to a Vercel project before deployment...`),!await t.runVercel([`link`],{cwd:a,signal:i}))throw i?.throwIfAborted(),Error(`Vercel project linking failed. Deployment did not start.`);if(c=mergeProjectResolution(c,projectResolutionFromDeployment(await t.detectDeployment(a,{signal:i}))),!isProjectResolved(c))throw Error(`Vercel project linking failed. Deployment did not start.`)}if(await t.syncHostFrameworkPreset(e.prompter,a,s,i?{signal:i}:{}),!n.deploymentDependenciesInstalled){let e=await t.detectPackageManager(a),n=await withPhase(o,`Installing project dependencies before deployment (${e.kind} install)...`,()=>t.runPackageManagerInstall(e.kind,a,{onOutput:s,signal:i}));if(!packageManagerInstallSucceeded(n))throw i?.throwIfAborted(),Error(`Dependency installation failed. Deployment did not start.`)}let l=[`deploy`,`--prod`,`--yes`,...r.headless?[`--non-interactive`]:[]],u=await withPhase(o,`Deploying the agent to Vercel production...`,()=>t.runVercel(l,{cwd:a,extraEnv:VERCEL_DEPLOY_ENV,nonInteractive:r.headless,onOutput:s,signal:i}));if(i?.throwIfAborted(),!u)throw o.error("`vercel deploy --prod` failed. The deploy output above shows the cause; fix it, then retry."),Error(`Deployment failed after channel setup.`);let d=await withPhase(o,`Pulling Vercel environment variables into .env.local...`,()=>t.runVercel([`env`,`pull`,`--yes`],{cwd:a,nonInteractive:r.headless,onOutput:s,signal:i}));i?.throwIfAborted(),d||o.warning(`Deployment succeeded, but pulling Vercel environment variables did not complete.`);let f=await t.detectDeployment(a,{signal:i}),p=f.state===`deployed`?f.productionUrl:void 0;return p===void 0?o.warning(`Deployment succeeded, but eve could not verify its production URL.`):o.info(`Production URL: ${p}`),{project:projectResolutionFromDeployResult(c,{deployed:!0,productionUrl:p}),deploymentPending:!1,deploymentDependenciesInstalled:!0}},apply(e,t){return{...e,project:t.project,deploymentPending:t.deploymentPending,deploymentDependenciesInstalled:t.deploymentDependenciesInstalled}}}}export{deployProject};