From 780a7ec45e30de8005de01b7f033153e264e0d5a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 10 Jan 2024 17:36:30 -0500 Subject: [PATCH 1/5] breaking: generate plaintext 404.html for Cloudflare Pages, instead of SPA-style fallback --- .changeset/gold-rocks-compare.md | 5 +++++ packages/adapter-cloudflare/index.js | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/gold-rocks-compare.md diff --git a/.changeset/gold-rocks-compare.md b/.changeset/gold-rocks-compare.md new file mode 100644 index 000000000000..2fe1ce8fd46b --- /dev/null +++ b/.changeset/gold-rocks-compare.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': major +--- + +breaking: generate plaintext 404.html instead of SPA-style fallback page diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index a9e3f98405c1..a0bf77268db9 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -16,8 +16,8 @@ export default function (options = {}) { builder.rimraf(tmp); builder.mkdirp(tmp); - // generate 404.html first which can then be overridden by prerendering, if the user defined such a page - await builder.generateFallback(path.join(dest, '404.html')); + // generate plaintext 404.html first which can then be overridden by prerendering, if the user defined such a page + writeFileSync(`${dest}/404.html`, `Not Found`); const dest_dir = `${dest}${builder.config.kit.paths.base}`; const written_files = builder.writeClient(dest_dir); From d8fb28a500d492360699ed5554c9d335051047bf Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 10 Jan 2024 17:39:54 -0500 Subject: [PATCH 2/5] oops --- packages/adapter-cloudflare/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index a0bf77268db9..cb7fb7fe6824 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -14,6 +14,8 @@ export default function (options = {}) { builder.rimraf(dest); builder.rimraf(tmp); + + builder.mkdirp(dest); builder.mkdirp(tmp); // generate plaintext 404.html first which can then be overridden by prerendering, if the user defined such a page From 064d41dc5d7d4722435c7b05d0063d39d7ca0363 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 10 Jan 2024 17:50:29 -0500 Subject: [PATCH 3/5] fffffuuuuu --- packages/adapter-cloudflare/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index cb7fb7fe6824..7d45ecad9073 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -19,7 +19,7 @@ export default function (options = {}) { builder.mkdirp(tmp); // generate plaintext 404.html first which can then be overridden by prerendering, if the user defined such a page - writeFileSync(`${dest}/404.html`, `Not Found`); + writeFileSync(`${dest}/404.html`, 'Not Found'); const dest_dir = `${dest}${builder.config.kit.paths.base}`; const written_files = builder.writeClient(dest_dir); From 8802c0777cf35aab2b5343232e9231ff2f11fcc3 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 10 Jan 2024 21:34:47 -0500 Subject: [PATCH 4/5] provide plaintext/spa option --- packages/adapter-cloudflare/index.d.ts | 12 ++++++++++++ packages/adapter-cloudflare/index.js | 7 ++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/index.d.ts b/packages/adapter-cloudflare/index.d.ts index e6fb925ff102..cc7a5899cfac 100644 --- a/packages/adapter-cloudflare/index.d.ts +++ b/packages/adapter-cloudflare/index.d.ts @@ -4,6 +4,18 @@ import './ambient.js'; export default function plugin(options?: AdapterOptions): Adapter; export interface AdapterOptions { + /** + * Whether to render a plaintext 404.html page, or a rendered SPA fallback page. This page will + * only be served when a request that matches an entry in `routes.exclude` fails to match an asset. + * + * Most of the time `plaintext` is sufficient, but if you are using `routes.exclude` to manually + * exclude a set of prerendered pages without exceeding the 100 route limit, you may wish to + * use `spa` instead. + * + * @default 'plaintext' + */ + fallback?: 'plaintext' | 'spa'; + /** * Customize the automatically-generated `_routes.json` file * https://developers.cloudflare.com/pages/platform/functions/routing/#create-a-_routesjson-file diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index 7d45ecad9073..d16f71b293ef 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -19,7 +19,12 @@ export default function (options = {}) { builder.mkdirp(tmp); // generate plaintext 404.html first which can then be overridden by prerendering, if the user defined such a page - writeFileSync(`${dest}/404.html`, 'Not Found'); + const fallback = path.join(dest, '404.html'); + if (options.fallback === 'spa') { + await builder.generateFallback(fallback); + } else { + writeFileSync(fallback, 'Not Found'); + } const dest_dir = `${dest}${builder.config.kit.paths.base}`; const written_files = builder.writeClient(dest_dir); From 97aaa633a7ef9d75210793ca984a92051a8cee69 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 11 Jan 2024 19:28:13 -0500 Subject: [PATCH 5/5] Update packages/adapter-cloudflare/index.d.ts --- packages/adapter-cloudflare/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/index.d.ts b/packages/adapter-cloudflare/index.d.ts index cc7a5899cfac..0ef6ee967d85 100644 --- a/packages/adapter-cloudflare/index.d.ts +++ b/packages/adapter-cloudflare/index.d.ts @@ -10,7 +10,7 @@ export interface AdapterOptions { * * Most of the time `plaintext` is sufficient, but if you are using `routes.exclude` to manually * exclude a set of prerendered pages without exceeding the 100 route limit, you may wish to - * use `spa` instead. + * use `spa` instead to avoid showing an unstyled 404 page to users. * * @default 'plaintext' */