From b340f194b4015cfaecf9255657eea92ab9d68e8c Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Mon, 13 Jul 2026 00:01:45 -0500 Subject: [PATCH 1/2] Add Vercel Services deployment --- .vercelignore | 15 +++++++++++++++ demo/eve-plugin.ts | 9 +++++++++ demo/package.json | 2 +- demo/vercel.json | 23 +++++++++++++++++++++-- demo/vite.config.ts | 14 +------------- 5 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 .vercelignore diff --git a/.vercelignore b/.vercelignore new file mode 100644 index 0000000..e35768b --- /dev/null +++ b/.vercelignore @@ -0,0 +1,15 @@ +.env* +.vercel +**/.vercel + +node_modules +**/node_modules + +dist +**/dist +demo/.eve +demo/.output +demo/.workflow-data + +*.tgz +.claude diff --git a/demo/eve-plugin.ts b/demo/eve-plugin.ts index 5dbe2bc..68ea2a0 100644 --- a/demo/eve-plugin.ts +++ b/demo/eve-plugin.ts @@ -42,6 +42,15 @@ export function eveAgent(options: EveAgentOptions): Plugin { name: "eve-agent", apply: "serve", async configureServer(server) { + // Vercel Services starts eve as its own process and routes /eve to it. + // Keep the embedded server only for the standalone `bun run dev` flow. + if ( + process.env.VERCEL_SERVICE_TYPE !== undefined || + process.env.VERCEL_DEV_PORT !== undefined + ) { + return; + } + const eve = await importEveHost(); const serverUrl = `http://127.0.0.1:${options.port}/`; const running = await eve.isActiveDevelopmentServerForApp({ diff --git a/demo/package.json b/demo/package.json index 9f97c1e..afcb243 100644 --- a/demo/package.json +++ b/demo/package.json @@ -4,7 +4,7 @@ "type": "module", "scripts": { "dev": "vite", - "build": "eve build && vite build" + "build": "vite build" }, "devDependencies": { "@tailwindcss/vite": "^4.3.2", diff --git a/demo/vercel.json b/demo/vercel.json index 8502607..39e81cd 100644 --- a/demo/vercel.json +++ b/demo/vercel.json @@ -1,5 +1,24 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", - "framework": "eve", - "routes": [{ "src": "^/$", "dest": "/index.html" }] + "services": { + "web": { + "root": ".", + "framework": "vite" + }, + "eve": { + "root": ".", + "framework": "eve", + "buildCommand": "eve build" + } + }, + "rewrites": [ + { + "source": "/eve/(.*)", + "destination": { "service": "eve" } + }, + { + "source": "/(.*)", + "destination": { "service": "web" } + } + ] } diff --git a/demo/vite.config.ts b/demo/vite.config.ts index 8b57e34..6b23b8b 100644 --- a/demo/vite.config.ts +++ b/demo/vite.config.ts @@ -5,22 +5,10 @@ import { eveAgent } from "./eve-plugin"; const port = parseInt(process.env.PORT ?? "3000", 10); const agentPort = 2000; -// On Vercel builds, `eve build` writes the deployment bundle to -// .vercel/output (Vercel Build Output API) and `.output/public` is never -// deployed. The static site must land in the bundle's static directory, -// where it is served ahead of the eve catch-all function. Never empty that -// directory: eve may have written assets into it already. -function resolveBuildOptions(root: string) { - if (process.env.VERCEL) { - return { outDir: `${root}/.vercel/output/static`, emptyOutDir: false }; - } - return { outDir: `${root}/.output/public`, emptyOutDir: true }; -} - export default defineConfig({ root: `${import.meta.dirname}/app`, publicDir: `${import.meta.dirname}/public`, - build: resolveBuildOptions(import.meta.dirname), + build: { outDir: `${import.meta.dirname}/dist`, emptyOutDir: true }, server: { port, open: true, From a5ceeb1c799cd0696ac776a68a2848fe4f3ca40f Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Mon, 13 Jul 2026 00:07:47 -0500 Subject: [PATCH 2/2] Clean up Vercel service dev config --- .vercelignore | 14 +++----------- demo/eve-plugin.ts | 12 ++---------- demo/package.json | 2 +- demo/vercel.json | 3 ++- demo/vite.config.ts | 11 +++++++---- 5 files changed, 15 insertions(+), 27 deletions(-) diff --git a/.vercelignore b/.vercelignore index e35768b..cc62c72 100644 --- a/.vercelignore +++ b/.vercelignore @@ -1,15 +1,7 @@ .env* -.vercel -**/.vercel - -node_modules -**/node_modules - dist -**/dist -demo/.eve -demo/.output -demo/.workflow-data - +.eve +.output +.workflow-data *.tgz .claude diff --git a/demo/eve-plugin.ts b/demo/eve-plugin.ts index 68ea2a0..808bc3b 100644 --- a/demo/eve-plugin.ts +++ b/demo/eve-plugin.ts @@ -40,17 +40,9 @@ export type EveAgentOptions = { export function eveAgent(options: EveAgentOptions): Plugin { return { name: "eve-agent", - apply: "serve", + apply: (_config, { command, mode }) => + command === "serve" && mode === "standalone", async configureServer(server) { - // Vercel Services starts eve as its own process and routes /eve to it. - // Keep the embedded server only for the standalone `bun run dev` flow. - if ( - process.env.VERCEL_SERVICE_TYPE !== undefined || - process.env.VERCEL_DEV_PORT !== undefined - ) { - return; - } - const eve = await importEveHost(); const serverUrl = `http://127.0.0.1:${options.port}/`; const running = await eve.isActiveDevelopmentServerForApp({ diff --git a/demo/package.json b/demo/package.json index afcb243..fe07d25 100644 --- a/demo/package.json +++ b/demo/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --mode standalone", "build": "vite build" }, "devDependencies": { diff --git a/demo/vercel.json b/demo/vercel.json index 39e81cd..884072e 100644 --- a/demo/vercel.json +++ b/demo/vercel.json @@ -3,7 +3,8 @@ "services": { "web": { "root": ".", - "framework": "vite" + "framework": "vite", + "devCommand": "vite" }, "eve": { "root": ".", diff --git a/demo/vite.config.ts b/demo/vite.config.ts index 6b23b8b..94665bb 100644 --- a/demo/vite.config.ts +++ b/demo/vite.config.ts @@ -5,18 +5,21 @@ import { eveAgent } from "./eve-plugin"; const port = parseInt(process.env.PORT ?? "3000", 10); const agentPort = 2000; -export default defineConfig({ +export default defineConfig(({ mode }) => ({ root: `${import.meta.dirname}/app`, publicDir: `${import.meta.dirname}/public`, build: { outDir: `${import.meta.dirname}/dist`, emptyOutDir: true }, server: { port, - open: true, - proxy: { "/eve": `http://127.0.0.1:${agentPort}` }, + open: mode === "standalone", + proxy: + mode === "standalone" + ? { "/eve": `http://127.0.0.1:${agentPort}` } + : undefined, }, plugins: [ tailwindcss(), eveAgent({ root: import.meta.dirname, port: agentPort }), ], resolve: { alias: { "@": `${import.meta.dirname}/../src` } }, -}); +}));