From fd8a924f8a1f1018908c7b1e7bc649ac176c0ede Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 9 Jan 2023 14:40:20 -0500 Subject: [PATCH 1/8] include as many static assets as possible in exclude list - closes #7640 --- .changeset/giant-penguins-act.md | 5 ++++ packages/adapter-cloudflare/index.js | 39 ++++++++++++++++------------ 2 files changed, 27 insertions(+), 17 deletions(-) create mode 100644 .changeset/giant-penguins-act.md diff --git a/.changeset/giant-penguins-act.md b/.changeset/giant-penguins-act.md new file mode 100644 index 000000000000..a21ee0898232 --- /dev/null +++ b/.changeset/giant-penguins-act.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +Include as many static assets as possible in exclude list diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index e0d880e9db00..7157de7137d8 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -34,7 +34,7 @@ export default function () { writeFileSync( `${dest}/_routes.json`, - JSON.stringify(get_routes_json(builder.config.kit.appDir, written_files)) + JSON.stringify(get_routes_json(builder, written_files)) ); writeFileSync(`${dest}/_headers`, generate_headers(builder.config.kit.appDir)); @@ -62,29 +62,34 @@ export default function () { } /** - * @param {string} app_dir + * @param {import('@sveltejs/kit').Builder} builder * @param {string[]} assets * @returns {import('.').RoutesJSONSpec} */ -function get_routes_json(app_dir, assets) { +function get_routes_json(builder, assets) { + /** + * The list of routes that will _not_ invoke functions (which cost money). + * This is done on a best-effort basis, as there is a limit of 100 rules + */ + const exclude = [`/${builder.config.kit.appDir}/*`]; + + for (const file of assets) { + if (!file.startsWith(`${builder.config.kit.appDir}/`)) { + exclude.push(`/${file}`); + } + } + + for (const path of builder.prerendered.paths) { + if (!builder.prerendered.redirects.has(path)) { + exclude.push(path); + } + } + return { version: 1, description: 'Generated by @sveltejs/adapter-cloudflare', include: ['/*'], - exclude: [ - `/${app_dir}/immutable/*`, - ...assets - // We're being conservative by not excluding all assets in - // /static just yet. If there are any upstream auth rules to - // protect certain things (e.g. a PDF that requires auth), - // then we wouldn't want to prevent those requests from going - // to the user functions worker. - // We do want to show an example of a _routes.json that - // excludes more than just /_app/immutable/*, and favicons - // are a reasonable choice - .filter((file) => file.startsWith('favicon')) - .map((file) => `/${file}`) - ] + exclude: exclude.slice(0, 99) }; } From f3ff35f52349342864ffa621f3329a511b7acecf Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 9 Jan 2023 14:56:51 -0500 Subject: [PATCH 2/8] temporarily add trailing slash --- .../create-svelte/templates/default/src/routes/about/+page.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/create-svelte/templates/default/src/routes/about/+page.ts b/packages/create-svelte/templates/default/src/routes/about/+page.ts index e739ef4b6c11..5ea3c9b8c73d 100644 --- a/packages/create-svelte/templates/default/src/routes/about/+page.ts +++ b/packages/create-svelte/templates/default/src/routes/about/+page.ts @@ -1,5 +1,7 @@ import { dev } from '$app/environment'; +export const trailingSlash = 'always'; + // we don't need any JS on this page, though we'll load // it in dev so that we get hot module replacement export const csr = dev; From e9d1f4cf74cbec6707d62d34785c970ca937ed0d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 9 Jan 2023 15:11:07 -0500 Subject: [PATCH 3/8] Revert "temporarily add trailing slash" This reverts commit f3ff35f52349342864ffa621f3329a511b7acecf. --- .../create-svelte/templates/default/src/routes/about/+page.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/create-svelte/templates/default/src/routes/about/+page.ts b/packages/create-svelte/templates/default/src/routes/about/+page.ts index 5ea3c9b8c73d..e739ef4b6c11 100644 --- a/packages/create-svelte/templates/default/src/routes/about/+page.ts +++ b/packages/create-svelte/templates/default/src/routes/about/+page.ts @@ -1,7 +1,5 @@ import { dev } from '$app/environment'; -export const trailingSlash = 'always'; - // we don't need any JS on this page, though we'll load // it in dev so that we get hot module replacement export const csr = dev; From 46fa102abced23b472dd037b1f59f04ff7e2bcc0 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 9 Jan 2023 17:39:34 -0500 Subject: [PATCH 4/8] add a warning --- packages/adapter-cloudflare/index.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index 7157de7137d8..46f5a1e6c866 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -73,6 +73,19 @@ function get_routes_json(builder, assets) { */ const exclude = [`/${builder.config.kit.appDir}/*`]; + const MAX_EXCLUSIONS = 98; // 100 minus existing include/exclude rules + let excess; + + if (assets.length > MAX_EXCLUSIONS) { + excess = 'static assets'; + + if (builder.prerendered.paths.length > 0) { + excess = 'or prerendered routes'; + } + } else if (assets.length + builder.prerendered.paths.length > MAX_EXCLUSIONS) { + excess = 'prerendered routes'; + } + for (const file of assets) { if (!file.startsWith(`${builder.config.kit.appDir}/`)) { exclude.push(`/${file}`); @@ -85,11 +98,17 @@ function get_routes_json(builder, assets) { } } + if (excess) { + const message = `Static file count exceeds _routes.json limits (see https://developers.cloudflare.com/pages/platform/functions/routing/#limits). Accessing some files ${excess} will cause function invocations.`; + builder.log.warn(message); + exclude.length = 99; + } + return { version: 1, description: 'Generated by @sveltejs/adapter-cloudflare', include: ['/*'], - exclude: exclude.slice(0, 99) + exclude }; } From 8c3d08f45ad31ad78aadaad19414a01af02945f0 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 9 Jan 2023 18:59:41 -0500 Subject: [PATCH 5/8] fix typo --- 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 46f5a1e6c866..e0560be8f531 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -99,7 +99,7 @@ function get_routes_json(builder, assets) { } if (excess) { - const message = `Static file count exceeds _routes.json limits (see https://developers.cloudflare.com/pages/platform/functions/routing/#limits). Accessing some files ${excess} will cause function invocations.`; + const message = `Static file count exceeds _routes.json limits (see https://developers.cloudflare.com/pages/platform/functions/routing/#limits). Accessing some ${excess} will cause function invocations.`; builder.log.warn(message); exclude.length = 99; } From 5a657a24d4226ae1d0023efa66a6ec0d72e28868 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 10 Jan 2023 10:03:08 +0100 Subject: [PATCH 6/8] fix string --- 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 e0560be8f531..f6d68ac345e9 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -80,7 +80,7 @@ function get_routes_json(builder, assets) { excess = 'static assets'; if (builder.prerendered.paths.length > 0) { - excess = 'or prerendered routes'; + excess += ' or prerendered routes'; } } else if (assets.length + builder.prerendered.paths.length > MAX_EXCLUSIONS) { excess = 'prerendered routes'; From a8992e4b8a69fd542dac3e9d8f4f605cd849cc88 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 12 Jan 2023 23:57:47 -0500 Subject: [PATCH 7/8] Update .changeset/giant-penguins-act.md Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/giant-penguins-act.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/giant-penguins-act.md b/.changeset/giant-penguins-act.md index a21ee0898232..f0664928d445 100644 --- a/.changeset/giant-penguins-act.md +++ b/.changeset/giant-penguins-act.md @@ -1,5 +1,5 @@ --- -'@sveltejs/adapter-cloudflare': patch +'@sveltejs/adapter-cloudflare': minor --- -Include as many static assets as possible in exclude list +feat: include as many static assets as possible in exclude list From 579cee052c56ad045d67e4649e7e5eb7e4c942e4 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 19 Jan 2023 18:13:45 -0500 Subject: [PATCH 8/8] fix --- packages/adapter-cloudflare/index.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index f6d68ac345e9..22b39cc5a16a 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -71,27 +71,24 @@ function get_routes_json(builder, assets) { * The list of routes that will _not_ invoke functions (which cost money). * This is done on a best-effort basis, as there is a limit of 100 rules */ - const exclude = [`/${builder.config.kit.appDir}/*`]; + const exclude = [ + `/${builder.config.kit.appDir}/*`, + ...assets.filter((file) => !file.startsWith(`${builder.config.kit.appDir}/`)) + ]; - const MAX_EXCLUSIONS = 98; // 100 minus existing include/exclude rules + const MAX_EXCLUSIONS = 99; // 100 minus existing `include` rules let excess; - if (assets.length > MAX_EXCLUSIONS) { + if (exclude.length > MAX_EXCLUSIONS) { excess = 'static assets'; if (builder.prerendered.paths.length > 0) { excess += ' or prerendered routes'; } - } else if (assets.length + builder.prerendered.paths.length > MAX_EXCLUSIONS) { + } else if (exclude.length + builder.prerendered.paths.length > MAX_EXCLUSIONS) { excess = 'prerendered routes'; } - for (const file of assets) { - if (!file.startsWith(`${builder.config.kit.appDir}/`)) { - exclude.push(`/${file}`); - } - } - for (const path of builder.prerendered.paths) { if (!builder.prerendered.redirects.has(path)) { exclude.push(path);