diff --git a/.changeset/stale-laws-speak.md b/.changeset/stale-laws-speak.md new file mode 100644 index 000000000000..3942be544bf4 --- /dev/null +++ b/.changeset/stale-laws-speak.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: properly handle percent-encoded anchors (e.g. ``) during prerendering. diff --git a/packages/kit/src/core/postbuild/crawl.js b/packages/kit/src/core/postbuild/crawl.js index caffef583c55..25134d1b4fe9 100644 --- a/packages/kit/src/core/postbuild/crawl.js +++ b/packages/kit/src/core/postbuild/crawl.js @@ -1,4 +1,4 @@ -import { resolve } from '../../utils/url.js'; +import { resolve, decode_uri } from '../../utils/url.js'; import { decode } from './entities.js'; const DOCTYPE = 'DOCTYPE'; @@ -193,11 +193,11 @@ export function crawl(html, base) { } if (id) { - ids.push(id); + ids.push(decode_uri(id)); } if (name && tag === 'A') { - ids.push(name); + ids.push(decode_uri(name)); } if (src) { diff --git a/packages/kit/src/core/postbuild/crawl.spec.js b/packages/kit/src/core/postbuild/crawl.spec.js index 46a5d4d950bd..616d27dbdf56 100644 --- a/packages/kit/src/core/postbuild/crawl.spec.js +++ b/packages/kit/src/core/postbuild/crawl.spec.js @@ -5,18 +5,9 @@ import { crawl } from './crawl.js'; const fixtures = fileURLToPath(new URL('./fixtures', import.meta.url)); -for (const fixture of fs.readdirSync(fixtures)) { - test(fixture, () => { - const input = fs.readFileSync(`${fixtures}/${fixture}/input.html`, 'utf8'); - const expected = JSON.parse(fs.readFileSync(`${fixtures}/${fixture}/output.json`, 'utf8')); - - // const start = Date.now(); - - const output = crawl(input, '/'); - - // uncomment to see how long it took - // console.error(fixture, Date.now() - start); - - expect(output).toEqual(expected); - }); -} +test.each(fs.readdirSync(fixtures))('%s', (fixture) => { + const input = fs.readFileSync(`${fixtures}/${fixture}/input.html`, 'utf8'); + const expected = JSON.parse(fs.readFileSync(`${fixtures}/${fixture}/output.json`, 'utf8')); + const output = crawl(input, '/'); + expect(output).toEqual(expected); +}); diff --git a/packages/kit/src/core/postbuild/fixtures/encoded-ids/input.html b/packages/kit/src/core/postbuild/fixtures/encoded-ids/input.html new file mode 100644 index 000000000000..40c5b98acf41 --- /dev/null +++ b/packages/kit/src/core/postbuild/fixtures/encoded-ids/input.html @@ -0,0 +1,7 @@ + + + + +

Title

+ + diff --git a/packages/kit/src/core/postbuild/fixtures/encoded-ids/output.json b/packages/kit/src/core/postbuild/fixtures/encoded-ids/output.json new file mode 100644 index 000000000000..f269cb900a51 --- /dev/null +++ b/packages/kit/src/core/postbuild/fixtures/encoded-ids/output.json @@ -0,0 +1,4 @@ +{ + "hrefs": ["/#sparkles-%E2%9C%A8"], + "ids": ["sparkles-✨"] +}