From e3544597bee62a43a0254490532f1f3663703d2d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 21 Nov 2022 14:52:18 -0500 Subject: [PATCH] [fix] write redirects for prerendered pages with trailing slashes (#7747) fixes #7725 --- .changeset/quick-weeks-explode.md | 5 ++++ packages/adapter-vercel/index.js | 50 ++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 .changeset/quick-weeks-explode.md diff --git a/.changeset/quick-weeks-explode.md b/.changeset/quick-weeks-explode.md new file mode 100644 index 000000000000..c78f3af7df0d --- /dev/null +++ b/.changeset/quick-weeks-explode.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': patch +--- + +[fix] Write redirects for prerendered pages with trailing slashes diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index fbeaef48f731..2cbd295c784c 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -13,9 +13,9 @@ export default function ({ external = [], edge, split } = {}) { const node_version = get_node_version(); const dir = '.vercel/output'; - const tmp = builder.getBuildDirectory('vercel-tmp'); + builder.rimraf(dir); builder.rimraf(tmp); const files = fileURLToPath(new URL('./files', import.meta.url).href); @@ -25,16 +25,34 @@ export default function ({ external = [], edge, split } = {}) { functions: `${dir}/functions` }; - const prerendered_redirects = Array.from( - builder.prerendered.redirects, - ([src, redirect]) => ({ + /** @type {any[]} */ + const prerendered_redirects = []; + + /** @type {Record} */ + const overrides = {}; + + for (const [src, redirect] of builder.prerendered.redirects) { + prerendered_redirects.push({ src, headers: { Location: redirect.location }, status: redirect.status - }) - ); + }); + } + + for (const [path, page] of builder.prerendered.pages) { + if (path.endsWith('/') && path !== '/') { + prerendered_redirects.push( + { src: path, dest: path.slice(0, -1) }, + { src: path.slice(0, -1), status: 308, headers: { Location: path } } + ); + + overrides[page.file] = { path: path.slice(1, -1) }; + } else { + overrides[page.file] = { path: path.slice(1) }; + } + } /** @type {any[]} */ const routes = [ @@ -164,19 +182,17 @@ export default function ({ external = [], edge, split } = {}) { builder.log.minor('Writing routes...'); - /** @type {Record} */ - const overrides = {}; - builder.prerendered.pages.forEach((page, src) => { - overrides[page.file] = { path: src.slice(1) }; - }); - write( `${dir}/config.json`, - JSON.stringify({ - version: 3, - routes, - overrides - }) + JSON.stringify( + { + version: 3, + routes, + overrides + }, + null, + ' ' + ) ); } };