From 10229a4231829bfac7bc382f48a87a3938b74bcd Mon Sep 17 00:00:00 2001 From: "chuyuan.du" Date: Fri, 3 Nov 2023 13:58:44 +0800 Subject: [PATCH 1/4] keep optional params coming from a parent record when resolving a location --- packages/router/src/matcher/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/router/src/matcher/index.ts b/packages/router/src/matcher/index.ts index 6c9a35d35..d0264e7e3 100644 --- a/packages/router/src/matcher/index.ts +++ b/packages/router/src/matcher/index.ts @@ -277,8 +277,8 @@ export function createRouterMatcher( paramsFromLocation( currentLocation.params, // only keep params that exist in the resolved location - // TODO: only keep optional params coming from a parent record - matcher.keys.filter(k => !k.optional).map(k => k.name) + // only keep optional params coming from a parent record + matcher.keys.filter(k => !k.optional).map(k => k.name).concat(matcher.parent ? matcher.parent.keys.filter(k => k.optional).map(k => k.name) : []) ), // discard any existing params in the current location that do not exist here // #1497 this ensures better active/exact matching From 0d414e131ace02a40af2d3a75a3b5156f4fc6be4 Mon Sep 17 00:00:00 2001 From: "chuyuan.du" Date: Fri, 3 Nov 2023 14:56:12 +0800 Subject: [PATCH 2/4] format code --- packages/router/src/matcher/index.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/router/src/matcher/index.ts b/packages/router/src/matcher/index.ts index d0264e7e3..97c6fa5c4 100644 --- a/packages/router/src/matcher/index.ts +++ b/packages/router/src/matcher/index.ts @@ -278,7 +278,14 @@ export function createRouterMatcher( currentLocation.params, // only keep params that exist in the resolved location // only keep optional params coming from a parent record - matcher.keys.filter(k => !k.optional).map(k => k.name).concat(matcher.parent ? matcher.parent.keys.filter(k => k.optional).map(k => k.name) : []) + matcher.keys + .filter(k => !k.optional) + .map(k => k.name) + .concat( + matcher.parent + ? matcher.parent.keys.filter(k => k.optional).map(k => k.name) + : [] + ) ), // discard any existing params in the current location that do not exist here // #1497 this ensures better active/exact matching From 90e1bbfefb461faf18132d9114099993b90a74d3 Mon Sep 17 00:00:00 2001 From: "chuyuan.du" Date: Mon, 6 Nov 2023 18:54:40 +0800 Subject: [PATCH 3/4] improve code logic and add unit test for parent optional params --- .../router/__tests__/matcher/resolve.spec.ts | 34 +++++++++++++++++++ packages/router/src/matcher/index.ts | 6 ++-- pnpm-lock.yaml | 14 +++++--- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/packages/router/__tests__/matcher/resolve.spec.ts b/packages/router/__tests__/matcher/resolve.spec.ts index 359a3daa9..de00849e1 100644 --- a/packages/router/__tests__/matcher/resolve.spec.ts +++ b/packages/router/__tests__/matcher/resolve.spec.ts @@ -777,6 +777,40 @@ describe('RouterMatcher.resolve', () => { ) }) + it('keep optional params from parent record', () => { + const Child_A = { path: 'a', name: 'child_a', components } + const Child_B = { path: 'b', name: 'child_b', components } + const Parent = { + path: '/:optional?/parent', + name: 'parent', + components, + children: [Child_A, Child_B], + } + assertRecordMatch( + Parent, + { name: 'child_b' }, + { + name: 'child_b', + path: '/foo/parent/b', + params: { optional: 'foo' }, + matched: [ + Parent as any, + { + ...Child_B, + path: `${Parent.path}/${Child_B.path}`, + }, + ], + }, + { + params: { optional: 'foo' }, + path: '/foo/parent/a', + matched: [], + meta: {}, + name: undefined, + } + ) + }) + it('discards non existent params', () => { assertRecordMatch( { path: '/', name: 'home', components }, diff --git a/packages/router/src/matcher/index.ts b/packages/router/src/matcher/index.ts index 97c6fa5c4..34250867b 100644 --- a/packages/router/src/matcher/index.ts +++ b/packages/router/src/matcher/index.ts @@ -280,12 +280,10 @@ export function createRouterMatcher( // only keep optional params coming from a parent record matcher.keys .filter(k => !k.optional) - .map(k => k.name) .concat( - matcher.parent - ? matcher.parent.keys.filter(k => k.optional).map(k => k.name) - : [] + matcher.parent ? matcher.parent.keys.filter(k => k.optional) : [] ) + .map(k => k.name) ), // discard any existing params in the current location that do not exist here // #1497 this ensures better active/exact matching diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e1cd8c4f..c25361c1e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,8 @@ -lockfileVersion: '6.0' +lockfileVersion: '6.1' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false importers: @@ -1875,6 +1879,7 @@ packages: /@types/node@18.16.19: resolution: {integrity: sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==} + dev: true /@types/node@20.4.2: resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} @@ -1951,7 +1956,7 @@ packages: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.4.8(@types/node@18.16.19) + vite: 4.4.8 vue: 3.3.4 dev: false @@ -7223,7 +7228,7 @@ packages: engines: {node: '>= 0.10'} dev: true - /vite@4.4.8(@types/node@18.16.19): + /vite@4.4.8: resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -7251,7 +7256,6 @@ packages: terser: optional: true dependencies: - '@types/node': 18.16.19 esbuild: 0.18.17 postcss: 8.4.27 rollup: 3.27.0 @@ -7310,7 +7314,7 @@ packages: mark.js: 8.11.1 minisearch: 6.1.0 shiki: 0.14.3 - vite: 4.4.8(@types/node@18.16.19) + vite: 4.4.8 vue: 3.3.4 transitivePeerDependencies: - '@algolia/client-search' From 7d7f12d0b0426d72baeb89e566cbed73dd67e7bf Mon Sep 17 00:00:00 2001 From: "chuyuan.du" Date: Mon, 6 Nov 2023 18:59:07 +0800 Subject: [PATCH 4/4] revert wrong commit of pnpm-lock.yaml --- pnpm-lock.yaml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c25361c1e..6e1cd8c4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,8 +1,4 @@ -lockfileVersion: '6.1' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false +lockfileVersion: '6.0' importers: @@ -1879,7 +1875,6 @@ packages: /@types/node@18.16.19: resolution: {integrity: sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==} - dev: true /@types/node@20.4.2: resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} @@ -1956,7 +1951,7 @@ packages: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.4.8 + vite: 4.4.8(@types/node@18.16.19) vue: 3.3.4 dev: false @@ -7228,7 +7223,7 @@ packages: engines: {node: '>= 0.10'} dev: true - /vite@4.4.8: + /vite@4.4.8(@types/node@18.16.19): resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -7256,6 +7251,7 @@ packages: terser: optional: true dependencies: + '@types/node': 18.16.19 esbuild: 0.18.17 postcss: 8.4.27 rollup: 3.27.0 @@ -7314,7 +7310,7 @@ packages: mark.js: 8.11.1 minisearch: 6.1.0 shiki: 0.14.3 - vite: 4.4.8 + vite: 4.4.8(@types/node@18.16.19) vue: 3.3.4 transitivePeerDependencies: - '@algolia/client-search'