UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

1 lines 3.32 kB
import{cp,mkdir,readFile,readdir,realpath,rename,rm,symlink,writeFile}from"node:fs/promises";import{dirname,join,relative}from"node:path";import{EVE_SHARED_SERVER_FUNCTION_PATH,EVE_WORKFLOW_FLOW_ROUTE_PATH,isEveVercelFunctionPath,normalizeEveVercelRoutes}from"#internal/workflow-bundle/eve-service-route-output.js";const WORKFLOW_STEP_EXTERNAL_PACKAGES=[`@mongodb-js/zstd`,`just-bash`,`microsandbox`,`node-liblzma`],WORKFLOW_BUILDER_DEFERRED_PACKAGES=[`@chat-adapter/slack`,`chat`];function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function materializeVercelWorkflowFunctionOutput(e){let t=join(e,`functions`),n=await realpath(join(t,`__server.func`)),r=join(t,`${EVE_WORKFLOW_FLOW_ROUTE_PATH.slice(1)}.func`),i=await readFile(join(r,`.vc-config.json`)),a=`${r}.eve-staging`;await rm(a,{force:!0,recursive:!0}),await cp(n,a,{recursive:!0,verbatimSymlinks:!0}),await writeFile(join(a,`.vc-config.json`),i),await rm(r,{force:!0,recursive:!0}),await rename(a,r)}async function normalizeEveVercelFunctionOutput(e,t={}){let n=join(e,`functions`),r=await prepareSharedEveServerFunction(n);r!==null&&await repointEveFunctionSymlinksInDirectory(n,r),await pruneNonEveFunctionEntries(n,n),await pruneNonEveVercelRoutes(e,t.servicePrefix)}async function prepareSharedEveServerFunction(e){let t=join(e,`__server.func`),n=join(e,EVE_SHARED_SERVER_FUNCTION_PATH),r;try{r=await realpath(t)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return null;throw e}let i=`${n}.eve-staging`;return await mkdir(dirname(n),{recursive:!0}),await rm(i,{force:!0,recursive:!0}),await cp(r,i,{dereference:!0,recursive:!0}),await rm(n,{force:!0,recursive:!0}),await rename(i,n),n}async function repointEveFunctionSymlinksInDirectory(e,t,n=e){let r;try{r=await readdir(e,{withFileTypes:!0})}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}await Promise.all(r.map(async r=>{let i=join(e,r.name),a=normalizeVercelOutputPath(relative(n,i));if(r.isSymbolicLink()){r.name.endsWith(`.func`)&&isEveVercelFunctionPath(a)&&await repointFunctionSymlink(i,t);return}r.isDirectory()&&!r.name.endsWith(`.func`)&&await repointEveFunctionSymlinksInDirectory(i,t,n)}))}async function repointFunctionSymlink(e,t){await rm(e,{force:!0,recursive:!0}),await symlink(normalizeVercelOutputPath(relative(dirname(e),t)),e,`dir`)}async function pruneNonEveFunctionEntries(e,t){let n;try{n=await readdir(t,{withFileTypes:!0})}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}await Promise.all(n.map(async n=>{let r=join(t,n.name),i=normalizeVercelOutputPath(relative(e,r));if(n.name.endsWith(`.func`)){isEveVercelFunctionPath(i)||await rm(r,{force:!0,recursive:!0});return}n.isDirectory()&&await pruneNonEveFunctionEntries(e,r)}))}async function pruneNonEveVercelRoutes(e,t){let n=join(e,`config.json`),r;try{r=JSON.parse(await readFile(n,`utf8`))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}isRecord(r)&&Array.isArray(r.routes)&&(r.routes=normalizeEveVercelRoutes(r.routes,t),await writeFile(n,`${JSON.stringify(r,null,2)}\n`))}function normalizeVercelOutputPath(e){return e.replaceAll(`\\`,`/`)}export{WORKFLOW_BUILDER_DEFERRED_PACKAGES,WORKFLOW_STEP_EXTERNAL_PACKAGES,materializeVercelWorkflowFunctionOutput,normalizeEveVercelFunctionOutput};