From bc905f2af96516877e3aa9c97cb8eaf795a50af7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 15 Apr 2022 15:41:50 -0400 Subject: [PATCH] Fix adapter-cloudflare-workers prerendering bug (#4626) * feat: allow adapter-cloudflare-workers to take esbuild options * chore: add changeset * fix: prerendered page resolution * chore: update changeset * chore: run prettier * update * Update .changeset/chilly-cars-battle.md Co-authored-by: Joe Harlow --- .changeset/chilly-cars-battle.md | 5 +++++ .../adapter-cloudflare-workers/ambient.d.ts | 2 +- .../adapter-cloudflare-workers/files/entry.js | 21 ++++++++++++------- packages/adapter-cloudflare-workers/index.js | 4 +++- 4 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 .changeset/chilly-cars-battle.md diff --git a/.changeset/chilly-cars-battle.md b/.changeset/chilly-cars-battle.md new file mode 100644 index 000000000000..c37ac72d99ad --- /dev/null +++ b/.changeset/chilly-cars-battle.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare-workers': patch +--- + +- Fix an issue related to prerendered pages incorrectly resolving in @sveltejs/adapter-cloudflare-workers diff --git a/packages/adapter-cloudflare-workers/ambient.d.ts b/packages/adapter-cloudflare-workers/ambient.d.ts index a1381f25f04d..78ceb0e62887 100644 --- a/packages/adapter-cloudflare-workers/ambient.d.ts +++ b/packages/adapter-cloudflare-workers/ambient.d.ts @@ -6,7 +6,7 @@ declare module 'MANIFEST' { import { SSRManifest } from '@sveltejs/kit'; export const manifest: SSRManifest; - export const prerendered: Set; + export const prerendered: Map; } declare module '__STATIC_CONTENT_MANIFEST' { diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js index ab6d9b602d41..96af27c22634 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -1,6 +1,6 @@ import { Server } from 'SERVER'; import { manifest, prerendered } from 'MANIFEST'; -import { getAssetFromKV } from '@cloudflare/kv-asset-handler'; +import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler'; import static_asset_manifest_json from '__STATIC_CONTENT_MANIFEST'; const static_asset_manifest = JSON.parse(static_asset_manifest_json); @@ -21,9 +21,8 @@ export default { if (url.pathname.startsWith(prefix)) { /** @type {Response} */ const res = await get_asset_from_kv(req, env, context); - if (is_error(res.status)) { - return res; - } + if (is_error(res.status)) return res; + return new Response(res.body, { headers: { // include original cache headers, minus cache-control which @@ -50,7 +49,14 @@ export default { manifest.assets.has(file + '/index.html') || prerendered.has(pathname || '/') ) { - return get_asset_from_kv(req, env, context); + return get_asset_from_kv(req, env, context, (request, options) => { + if (prerendered.has(pathname || '/')) { + url.pathname = '/' + prerendered.get(pathname || '/').file; + return new Request(url.toString(), request); + } + + return mapRequestToAsset(request, options); + }); } // dynamically-generated pages @@ -72,7 +78,7 @@ export default { * @param {any} env * @param {any} context */ -async function get_asset_from_kv(req, env, context) { +async function get_asset_from_kv(req, env, context, map = mapRequestToAsset) { try { return await getAssetFromKV( { @@ -83,7 +89,8 @@ async function get_asset_from_kv(req, env, context) { }, { ASSET_NAMESPACE: env.__STATIC_CONTENT, - ASSET_MANIFEST: static_asset_manifest + ASSET_MANIFEST: static_asset_manifest, + mapRequestToAsset: map } ); } catch (e) { diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index 94732b553f06..045eef0b8b20 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -49,7 +49,9 @@ export default function (options = {}) { `${tmp}/manifest.js`, `export const manifest = ${builder.generateManifest({ relativePath - })};\n\nexport const prerendered = new Set(${JSON.stringify(builder.prerendered.paths)});\n` + })};\n\nexport const prerendered = new Map(${JSON.stringify( + Array.from(builder.prerendered.pages.entries()) + )});\n` ); await esbuild.build({