diff --git a/.changeset/good-jars-relax.md b/.changeset/good-jars-relax.md new file mode 100644 index 000000000000..ea6baeab4b7b --- /dev/null +++ b/.changeset/good-jars-relax.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: prerender optional parameters as empty when `entries` contains `'*'` diff --git a/packages/kit/src/core/postbuild/prerender.js b/packages/kit/src/core/postbuild/prerender.js index 84d663c390c1..a064ae2c3c18 100644 --- a/packages/kit/src/core/postbuild/prerender.js +++ b/packages/kit/src/core/postbuild/prerender.js @@ -426,8 +426,12 @@ async function prerender({ out, manifest_path, metadata, verbose, env }) { if (entry === '*') { for (const [id, prerender] of prerender_map) { if (prerender) { - if (id.includes('[')) continue; - const path = `/${get_route_segments(id).join('/')}`; + // remove optional parameters from the route + const segments = get_route_segments(id).filter((segment) => !segment.startsWith('[[')); + const processed_id = '/' + segments.join('/'); + + if (processed_id.includes('[')) continue; + const path = `/${get_route_segments(processed_id).join('/')}`; enqueue(null, config.paths.base + path); } } diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 45b7742a347d..c96ba096b068 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -498,7 +498,7 @@ export interface KitConfig { */ crawl?: boolean; /** - * An array of pages to prerender, or start crawling from (if `crawl: true`). The `*` string includes all non-dynamic routes (i.e. pages with no `[parameters]`, because SvelteKit doesn't know what value the parameters should have). + * An array of pages to prerender, or start crawling from (if `crawl: true`). The `*` string includes all routes containing no required `[parameters]` with optional parameters included as being empty (since SvelteKit doesn't know what value any parameters should have). * @default ["*"] */ entries?: Array<'*' | `/${string}`>; diff --git a/packages/kit/test/prerendering/basics/src/routes/optional-params/[[optional]]/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/optional-params/[[optional]]/+page.svelte new file mode 100644 index 000000000000..3438d28471db --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/optional-params/[[optional]]/+page.svelte @@ -0,0 +1 @@ +Path with Value diff --git a/packages/kit/test/prerendering/basics/test/tests.spec.js b/packages/kit/test/prerendering/basics/test/tests.spec.js index 3a830c97e96e..5b5763d19e1d 100644 --- a/packages/kit/test/prerendering/basics/test/tests.spec.js +++ b/packages/kit/test/prerendering/basics/test/tests.spec.js @@ -244,3 +244,8 @@ test('prerenders responses with immutable Headers', () => { const content = read('immutable-headers'); expect(content).toMatch('foo'); }); + +test('prerenders paths with optional parameters with empty values', () => { + const content = read('optional-params.html'); + expect(content).includes('Path with Value'); +}); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index f3f47021916e..13f5143b12d5 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -480,7 +480,7 @@ declare module '@sveltejs/kit' { */ crawl?: boolean; /** - * An array of pages to prerender, or start crawling from (if `crawl: true`). The `*` string includes all non-dynamic routes (i.e. pages with no `[parameters]`, because SvelteKit doesn't know what value the parameters should have). + * An array of pages to prerender, or start crawling from (if `crawl: true`). The `*` string includes all routes containing no required `[parameters]` with optional parameters included as being empty (since SvelteKit doesn't know what value any parameters should have). * @default ["*"] */ entries?: Array<'*' | `/${string}`>;