From ece8d3d25ea52b251bec4289f21832f1cb31034e Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Wed, 27 Aug 2025 22:02:42 +0200 Subject: [PATCH] fix: splat at root --- .../matchers/matcher-pattern.spec.ts | 21 +++++++++++++++++++ .../matchers/matcher-pattern.ts | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.spec.ts b/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.spec.ts index fc52ad67..ed1dc7d3 100644 --- a/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.spec.ts +++ b/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.spec.ts @@ -272,6 +272,27 @@ describe('MatcherPatternPathDynamic', () => { expect(pattern.build({ pathMatch: '124/b' })).toBe('/teams/124/b') }) + it('splat param without prefix', () => { + const pattern = new MatcherPatternPathDynamic( + /^\/(.*)$/, + { + pathMatch: [], + }, + [0], + null + ) + expect(pattern.match('/')).toEqual({ pathMatch: '' }) + expect(pattern.match('/123/b')).toEqual({ pathMatch: '123/b' }) + expect(pattern.match('/anything/goes/here')).toEqual({ + pathMatch: 'anything/goes/here', + }) + + expect(pattern.build({ pathMatch: null })).toBe('/') + expect(pattern.build({ pathMatch: '' })).toBe('/') + expect(pattern.build({ pathMatch: '124' })).toBe('/124') + expect(pattern.build({ pathMatch: '124/b' })).toBe('/124/b') + }) + it('repeatable optional param', () => { const pattern = new MatcherPatternPathDynamic( /^\/teams(?:\/(.+?))?\/b$/i, diff --git a/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.ts b/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.ts index b45e6ee6..cf7c0cf3 100644 --- a/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.ts +++ b/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.ts @@ -283,7 +283,7 @@ export class MatcherPatternPathDynamic< * no sense to build a path it cannot match. */ return this.trailingSlash == null - ? path + (!value ? '/' : '') + ? path + (!value && path.at(-1) !== '/' ? '/' : '') : path.replace(RE_TRAILING_SLASHES, this.trailingSlash ? '/' : '') } } -- 2.47.3