eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 1.65 kB
JavaScript
import{readFile}from"node:fs/promises";import{EVE_ROUTE_PREFIX}from"#protocol/routes.js";import{join}from"node:path";import{normalizePublicRoutePrefix}from"#shared/public-route-prefix.js";import{atomicWriteFile}from"#shared/atomic-write-file.js";const EVE_CRON_ROUTE_PREFIX=`${EVE_ROUTE_PREFIX}/cron/`;function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function parseOutputConfig(e,t){let n=JSON.parse(e);if(!isRecord(n))throw Error(`Vercel Build Output config at "${t}" must contain a JSON object.`);return n}function readCronConfigs(e,t){if(e.crons!==void 0){if(!Array.isArray(e.crons))throw Error(`Vercel Build Output config at "${t}" must contain a crons array.`);return e.crons.map((e,n)=>{if(!isRecord(e)||typeof e.path!=`string`||!e.path.startsWith(`/`)||typeof e.schedule!=`string`||e.schedule.trim().length===0)throw Error(`Vercel Build Output config at "${t}" contains an invalid cron at index ${n}.`);return e})}}function normalizeCronPath(e,t){return t===void 0||!e.path.startsWith(EVE_CRON_ROUTE_PREFIX)?e:{...e,path:`${t}${e.path}`}}function deduplicateCronConfigs(e){let t=new Set;return e.filter(e=>{let n=`${e.path}\0${e.schedule}`;return!t.has(n)&&(t.add(n),!0)})}async function normalizeVercelServiceCrons(e){let t=join(e.serviceOutputDirectory,`config.json`),n=parseOutputConfig(await readFile(t,`utf8`),t),r=readCronConfigs(n,t);if(r===void 0)return;let i=normalizePublicRoutePrefix(e.publicRoutePrefix),a=deduplicateCronConfigs(r.map(e=>normalizeCronPath(e,i))),o={...n,crons:a};JSON.stringify(n)!==JSON.stringify(o)&&await atomicWriteFile(t,`${JSON.stringify(o,null,2)}\n`)}export{normalizeVercelServiceCrons};