From a930ad4b915ab6f9a36ed9ddc2c193bd60d6c8d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Charles?= Date: Tue, 20 Aug 2024 12:00:04 +0200 Subject: [PATCH] fix: forbid isr + edge for same endpoint. fixes #102 --- packages/vercel/src/build.ts | 7 +++++++ packages/vike-integration/vike.ts | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/vercel/src/build.ts b/packages/vercel/src/build.ts index d5cd9e2..edb801a 100644 --- a/packages/vercel/src/build.ts +++ b/packages/vercel/src/build.ts @@ -355,6 +355,13 @@ export async function buildEndpoints(resolvedConfig: ResolvedConfig): Promise<{ ); } + if ( + (entry.isr !== undefined || exports.isr !== undefined) && + (entry.edge !== undefined || exports.edge !== undefined) + ) { + throw new Error(`isr cannot be enabled for edge functions ('${entry.source}')`); + } + if (exports.isr) { entry.isr = exports.isr; } diff --git a/packages/vike-integration/vike.ts b/packages/vike-integration/vike.ts index cf2e09e..ec11c26 100644 --- a/packages/vike-integration/vike.ts +++ b/packages/vike-integration/vike.ts @@ -110,7 +110,7 @@ function assertEdge(exports: unknown): boolean | null { return edge; } -function assertIsr(resolvedConfig: UserConfig | ResolvedConfig, exports: unknown): number | null { +function extractIsr(exports: unknown) { if (exports === null || typeof exports !== "object") return null; if (!("isr" in exports)) return null; const isr = (exports as { isr: unknown }).isr; @@ -127,6 +127,13 @@ function assertIsr(resolvedConfig: UserConfig | ResolvedConfig, exports: unknown " `{ expiration }` must be a positive number", ); + return isr; +} + +function assertIsr(resolvedConfig: UserConfig | ResolvedConfig, exports: unknown): number | null { + const isr = extractIsr(exports); + if (isr === null || isr === undefined) return null; + if (isr === true) { assert( typeof resolvedConfig.vercel?.expiration === "number" && resolvedConfig.vercel?.expiration > 0, @@ -421,17 +428,24 @@ export function vitePluginVercelVikeConfigPlugin(): Plugin { } const route = getRouteDynamicRoute(pageRoutes, pageId) ?? getRouteFsRoute(pageRoutes, pageId); + const rawIsr = extractIsr(page.config); let isr = assertIsr(userConfig, page.config); const edge = assertEdge(page.config); // if ISR + Function routing -> warn because ISR is not unsupported in this case if (typeof route === "function" && isr) { console.warn( - `Page ${pageId}: ISR is not supported when using route function. Remove \`{ isr }\` export or use a route string if possible.`, + `Page ${pageId}: ISR is not supported when using route function. Remove \`{ isr }\` config or use a route string if possible.`, ); isr = null; } + if (edge && rawIsr !== null && typeof rawIsr === "object") { + throw new Error( + `Page ${pageId}: ISR cannot be enabled for edge functions. Remove \`{ isr }\` config or set \`{ edge: false }\`.`, + ); + } + return { _pageId: pageId, // used for debug purpose