diff --git a/.changeset/new-kangaroos-double.md b/.changeset/new-kangaroos-double.md new file mode 100644 index 000000000000..9f4cce7d31a8 --- /dev/null +++ b/.changeset/new-kangaroos-double.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Handle hash links with non-ASCII characters when prerendering diff --git a/packages/kit/src/core/prerender/fixtures/ids/input.html b/packages/kit/src/core/prerender/fixtures/ids/input.html index 50b212046685..cd6a0b43f169 100644 --- a/packages/kit/src/core/prerender/fixtures/ids/input.html +++ b/packages/kit/src/core/prerender/fixtures/ids/input.html @@ -1,3 +1,6 @@

before

backslash -

after

\ No newline at end of file +

after

+

+ encöded +

diff --git a/packages/kit/src/core/prerender/fixtures/ids/output.json b/packages/kit/src/core/prerender/fixtures/ids/output.json index ce83978a7a16..1ad4d8f3f78a 100644 --- a/packages/kit/src/core/prerender/fixtures/ids/output.json +++ b/packages/kit/src/core/prerender/fixtures/ids/output.json @@ -1,4 +1,4 @@ { - "hrefs": [], - "ids": ["before", "after"] + "hrefs": ["#encöded"], + "ids": ["before", "after", "encöded"] } diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index aa11d36af988..ec6a224182dd 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -137,7 +137,7 @@ export async function prerender() { config.prerender.handleMissingId, ({ path, id, referrers }) => { return ( - `The following pages contain links to ${path}#${id}, but no element with id="${id}" exists on ${path}:` + + `The following pages contain links to ${path}#${id}, but no element with id="${id}" exists on ${path} - see the \`handleMissingId\` option in https://kit.svelte.dev/docs/configuration#prerender for more info:` + referrers.map((l) => `\n - ${l}`).join('') ); } @@ -262,11 +262,13 @@ export async function prerender() { } if (hash) { - if (!expected_hashlinks.has(pathname + hash)) { - expected_hashlinks.set(pathname + hash, new Set()); + const key = decodeURI(pathname + hash); + + if (!expected_hashlinks.has(key)) { + expected_hashlinks.set(key, new Set()); } - /** @type {Set} */ (expected_hashlinks.get(pathname + hash)).add(decoded); + /** @type {Set} */ (expected_hashlinks.get(key)).add(decoded); } enqueue(decoded, decodeURI(pathname), pathname); diff --git "a/packages/kit/test/prerendering/basics/src/routes/enc\303\266ded-hash-link/+page.svelte" "b/packages/kit/test/prerendering/basics/src/routes/enc\303\266ded-hash-link/+page.svelte" new file mode 100644 index 000000000000..a895dfd0b53c --- /dev/null +++ "b/packages/kit/test/prerendering/basics/src/routes/enc\303\266ded-hash-link/+page.svelte" @@ -0,0 +1,3 @@ +

+ encöded +