From f0d58667ed0941dbbfa903292c00cde132360bca Mon Sep 17 00:00:00 2001 From: z Date: Mon, 5 Dec 2022 03:10:26 +0800 Subject: [PATCH 1/7] Continuous optionals should not throw conflict error --- packages/kit/src/core/sync/create_manifest_data/index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/core/sync/create_manifest_data/index.js b/packages/kit/src/core/sync/create_manifest_data/index.js index 4fc738f92ea3..8beb9b53c239 100644 --- a/packages/kit/src/core/sync/create_manifest_data/index.js +++ b/packages/kit/src/core/sync/create_manifest_data/index.js @@ -486,10 +486,11 @@ function prevent_conflicts(routes) { const matcher = split[i]; const next = split[i + 1]; - permutations = [ - ...permutations.map((x) => x + next), - ...permutations.map((x) => x + `<${matcher}>${next}`) - ]; + permutations = permutations.reduce((a, b) => { + a.push(b + next); + if (!(matcher === '*' && b.endsWith('//'))) a.push(b + `<${matcher}>${next}`); + return a; + }, /** @type {string[]} */ ([])); } for (const permutation of permutations) { From dbfb9fcb5c23a570b3e0b78a3c1bd63c7452e52e Mon Sep 17 00:00:00 2001 From: z Date: Mon, 5 Dec 2022 19:54:40 +0800 Subject: [PATCH 2/7] add test --- .../src/routes/optional/[[a]]/[[b]]/+page.svelte | 1 + packages/kit/test/apps/basics/test/server.test.js | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 packages/kit/test/apps/basics/src/routes/optional/[[a]]/[[b]]/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/optional/[[a]]/[[b]]/+page.svelte b/packages/kit/test/apps/basics/src/routes/optional/[[a]]/[[b]]/+page.svelte new file mode 100644 index 000000000000..64e89acd94e9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/optional/[[a]]/[[b]]/+page.svelte @@ -0,0 +1 @@ +

ok

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 97f6bceff439..3cb192eda835 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -439,3 +439,14 @@ test.describe('Miscellaneous', () => { expect(headers['cache-control'] || '').not.toContain('immutable'); }); }); + +test.describe('multiple consecutive optionals', () => { + test('multiple consecutive optionals should not throw exception', async ({ page }) => { + await page.goto('/optional'); + expect(await page.textContent('h1')).toBe('ok') + await page.goto('/optional/a'); + expect(await page.textContent('h1')).toBe('ok') + await page.goto('/optional/a/b'); + expect(await page.textContent('h1')).toBe('ok') + }); +}); \ No newline at end of file From 945bf4ce603c45d9b6bbfdf2962c88f5b5a4d689 Mon Sep 17 00:00:00 2001 From: z Date: Mon, 5 Dec 2022 19:56:51 +0800 Subject: [PATCH 3/7] add changeset --- .changeset/six-ravens-attack.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/six-ravens-attack.md diff --git a/.changeset/six-ravens-attack.md b/.changeset/six-ravens-attack.md new file mode 100644 index 000000000000..03090da5f54c --- /dev/null +++ b/.changeset/six-ravens-attack.md @@ -0,0 +1,6 @@ +--- +'@sveltejs/kit': minor +'test-basics': patch +--- + +[fix] continuous optionals should not throw conflict error (#7925) From c483621d79d9f5ea3a60d9b09dcf354f0fac2bdb Mon Sep 17 00:00:00 2001 From: z Date: Mon, 5 Dec 2022 20:03:01 +0800 Subject: [PATCH 4/7] lint --- packages/kit/test/apps/basics/test/server.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 3cb192eda835..48fade2ae728 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -443,10 +443,10 @@ test.describe('Miscellaneous', () => { test.describe('multiple consecutive optionals', () => { test('multiple consecutive optionals should not throw exception', async ({ page }) => { await page.goto('/optional'); - expect(await page.textContent('h1')).toBe('ok') + expect(await page.textContent('h1')).toBe('ok'); await page.goto('/optional/a'); - expect(await page.textContent('h1')).toBe('ok') + expect(await page.textContent('h1')).toBe('ok'); await page.goto('/optional/a/b'); - expect(await page.textContent('h1')).toBe('ok') + expect(await page.textContent('h1')).toBe('ok'); }); -}); \ No newline at end of file +}); From f72a0dabb7a33c1eecdbcc1050081162d0b8bdbd Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Mon, 5 Dec 2022 18:18:51 +0100 Subject: [PATCH 5/7] fix changeset --- .changeset/six-ravens-attack.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.changeset/six-ravens-attack.md b/.changeset/six-ravens-attack.md index 03090da5f54c..8a563fbeca24 100644 --- a/.changeset/six-ravens-attack.md +++ b/.changeset/six-ravens-attack.md @@ -1,6 +1,5 @@ --- -'@sveltejs/kit': minor -'test-basics': patch +'@sveltejs/kit': patch --- [fix] continuous optionals should not throw conflict error (#7925) From df5a2c29d751fb2b7dae588047648b7ab47a1930 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Mon, 5 Dec 2022 18:19:20 +0100 Subject: [PATCH 6/7] remove ref --- .changeset/six-ravens-attack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/six-ravens-attack.md b/.changeset/six-ravens-attack.md index 8a563fbeca24..c2217a344876 100644 --- a/.changeset/six-ravens-attack.md +++ b/.changeset/six-ravens-attack.md @@ -2,4 +2,4 @@ '@sveltejs/kit': patch --- -[fix] continuous optionals should not throw conflict error (#7925) +[fix] continuous optionals should not throw conflict error From 2d8e9e37a3f255143194cf001dfb667ce861b45b Mon Sep 17 00:00:00 2001 From: z Date: Tue, 6 Dec 2022 11:35:09 +0800 Subject: [PATCH 7/7] add unit test --- .../sync/create_manifest_data/index.spec.js | 29 +++++++++++++++++++ .../nested-optionals/[[a]]/[[b]]/+page.svelte | 0 .../routes/optional/[[a]]/[[b]]/+page.svelte | 1 - .../kit/test/apps/basics/test/server.test.js | 11 ------- 4 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/nested-optionals/[[a]]/[[b]]/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/optional/[[a]]/[[b]]/+page.svelte diff --git a/packages/kit/src/core/sync/create_manifest_data/index.spec.js b/packages/kit/src/core/sync/create_manifest_data/index.spec.js index c386d8ac0614..ff52bda7cf43 100644 --- a/packages/kit/src/core/sync/create_manifest_data/index.spec.js +++ b/packages/kit/src/core/sync/create_manifest_data/index.spec.js @@ -386,6 +386,35 @@ test('optional parameters', () => { ]); }); +test('nested optionals', () => { + const { nodes, routes } = create('samples/nested-optionals'); + assert.equal(nodes.map(simplify_node), [ + default_layout, + default_error, + { component: 'samples/nested-optionals/[[a]]/[[b]]/+page.svelte' } + ]); + + assert.equal(routes.map(simplify_route), [ + { + id: '/', + pattern: '/^/$/' + }, + { + id: '/[[a]]/[[b]]', + pattern: '/^(?:/([^/]+))?(?:/([^/]+))?/?$/', + page: { + layouts: [0], + errors: [1], + leaf: nodes.findIndex((node) => node.component?.includes('/[[a]]/[[b]]')) + } + }, + { + id: '/[[a]]', + pattern: '/^(?:/([^/]+))?/?$/' + } + ]); +}); + test('ignores files and directories with leading underscores', () => { const { routes } = create('samples/hidden-underscore'); diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-optionals/[[a]]/[[b]]/+page.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/nested-optionals/[[a]]/[[b]]/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/src/routes/optional/[[a]]/[[b]]/+page.svelte b/packages/kit/test/apps/basics/src/routes/optional/[[a]]/[[b]]/+page.svelte deleted file mode 100644 index 64e89acd94e9..000000000000 --- a/packages/kit/test/apps/basics/src/routes/optional/[[a]]/[[b]]/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -

ok

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 48fade2ae728..97f6bceff439 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -439,14 +439,3 @@ test.describe('Miscellaneous', () => { expect(headers['cache-control'] || '').not.toContain('immutable'); }); }); - -test.describe('multiple consecutive optionals', () => { - test('multiple consecutive optionals should not throw exception', async ({ page }) => { - await page.goto('/optional'); - expect(await page.textContent('h1')).toBe('ok'); - await page.goto('/optional/a'); - expect(await page.textContent('h1')).toBe('ok'); - await page.goto('/optional/a/b'); - expect(await page.textContent('h1')).toBe('ok'); - }); -});