From 80fac424ea95ca541a97b64fc21ea5ab66bec5bb Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 18 Aug 2025 14:12:09 -0400 Subject: [PATCH 1/3] feat: use web standard `fetch` export --- .changeset/blue-dodos-mate.md | 5 +++ packages/adapter-vercel/files/serverless.js | 36 +++++++++++---------- 2 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 .changeset/blue-dodos-mate.md diff --git a/.changeset/blue-dodos-mate.md b/.changeset/blue-dodos-mate.md new file mode 100644 index 000000000000..40b1216bc885 --- /dev/null +++ b/.changeset/blue-dodos-mate.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': minor +--- + +feat: use web standard `fetch` export diff --git a/packages/adapter-vercel/files/serverless.js b/packages/adapter-vercel/files/serverless.js index 6384ff6eb5fc..e9dab8595ee5 100644 --- a/packages/adapter-vercel/files/serverless.js +++ b/packages/adapter-vercel/files/serverless.js @@ -1,5 +1,5 @@ import { installPolyfills } from '@sveltejs/kit/node/polyfills'; -import { getRequest, setResponse, createReadableStream } from '@sveltejs/kit/node'; +import { createReadableStream } from '@sveltejs/kit/node'; import { Server } from 'SERVER'; import { manifest } from 'MANIFEST'; import process from 'node:process'; @@ -19,29 +19,31 @@ const DATA_SUFFIX = '/__data.json'; * @param {import('http').IncomingMessage} req * @param {import('http').ServerResponse} res */ -export default async (req, res) => { - if (req.url) { - const [path, search] = req.url.split('?'); - - const params = new URLSearchParams(search); - let pathname = params.get('__pathname'); +export default { + /** + * @param {Request} request + * @returns {Promise} + */ + fetch(request) { + // If this is an ISR request, the requested pathname is encoded + // as a search parameter, so we need to extract it + const url = new URL(request.url); + let pathname = url.searchParams.get('__pathname'); if (pathname) { - params.delete('__pathname'); // Optional routes' pathname replacements look like `/foo/$1/bar` which means we could end up with an url like /foo//bar pathname = pathname.replace(/\/+/g, '/'); - req.url = `${pathname}${path.endsWith(DATA_SUFFIX) ? DATA_SUFFIX : ''}?${params}`; - } - } - const request = await getRequest({ base: `https://${req.headers.host}`, request: req }); + url.pathname = pathname + url.pathname.endsWith(DATA_SUFFIX) ? DATA_SUFFIX : ''; + url.searchParams.delete('__pathname'); - void setResponse( - res, - await server.respond(request, { + request = new Request(url, request); + } + + return server.respond(request, { getClientAddress() { return /** @type {string} */ (request.headers.get('x-forwarded-for')); } - }) - ); + }); + } }; From d24e012b3d2d0cb9e449ddd61686f3e934a42369 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 18 Aug 2025 14:28:04 -0400 Subject: [PATCH 2/3] fix --- packages/adapter-vercel/files/serverless.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/adapter-vercel/files/serverless.js b/packages/adapter-vercel/files/serverless.js index e9dab8595ee5..abb97516fd2e 100644 --- a/packages/adapter-vercel/files/serverless.js +++ b/packages/adapter-vercel/files/serverless.js @@ -15,10 +15,6 @@ await server.init({ const DATA_SUFFIX = '/__data.json'; -/** - * @param {import('http').IncomingMessage} req - * @param {import('http').ServerResponse} res - */ export default { /** * @param {Request} request From c7e8ff8ec284bdf56a6587010890e8db80f3fe46 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 18 Aug 2025 14:29:13 -0400 Subject: [PATCH 3/3] missing parens --- packages/adapter-vercel/files/serverless.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-vercel/files/serverless.js b/packages/adapter-vercel/files/serverless.js index abb97516fd2e..ea16823574f0 100644 --- a/packages/adapter-vercel/files/serverless.js +++ b/packages/adapter-vercel/files/serverless.js @@ -30,7 +30,7 @@ export default { // Optional routes' pathname replacements look like `/foo/$1/bar` which means we could end up with an url like /foo//bar pathname = pathname.replace(/\/+/g, '/'); - url.pathname = pathname + url.pathname.endsWith(DATA_SUFFIX) ? DATA_SUFFIX : ''; + url.pathname = pathname + (url.pathname.endsWith(DATA_SUFFIX) ? DATA_SUFFIX : ''); url.searchParams.delete('__pathname'); request = new Request(url, request);