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.d.ts b/packages/adapter-cloudflare/index.d.ts index e6fb925ff102..0ef6ee967d85 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 to avoid showing an unstyled 404 page to users. + * + * @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 a9e3f98405c1..d16f71b293ef 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -14,10 +14,17 @@ export default function (options = {}) { builder.rimraf(dest); builder.rimraf(tmp); + + builder.mkdirp(dest); 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 + 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);