diff --git a/packages/router/__tests__/matcher/pathParser.spec.ts b/packages/router/__tests__/matcher/pathParser.spec.ts index 6cff8d4ec..13c6d0cd5 100644 --- a/packages/router/__tests__/matcher/pathParser.spec.ts +++ b/packages/router/__tests__/matcher/pathParser.spec.ts @@ -619,8 +619,59 @@ describe('Path parser', () => { }) it('can not match the end', () => { - matchParams('/home', '/home/other', null, { end: true }) - matchParams('/home', '/home/other', {}, { end: false }) + const options = { end: false } + + matchParams('/home', '/home', {}, options) + matchParams('/home', '/home/', {}, options) + matchParams('/home', '/home/other', {}, options) + matchParams('/home', '/homepage', {}, options) + + matchParams('/home/:p', '/home', null, options) + matchParams('/home/:p', '/home/', null, options) + matchParams('/home/:p', '/home/a', { p: 'a' }, options) + matchParams('/home/:p', '/home/a/', { p: 'a' }, options) + matchParams('/home/:p', '/home/a/b', { p: 'a' }, options) + matchParams('/home/:p', '/homepage', null, options) + + matchParams('/home/', '/home', {}, options) + matchParams('/home/', '/home/', {}, options) + matchParams('/home/', '/home/other', {}, options) + matchParams('/home/', '/homepage', {}, options) + + matchParams('/home/:p/', '/home', null, options) + matchParams('/home/:p/', '/home/', null, options) + matchParams('/home/:p/', '/home/a', { p: 'a' }, options) + matchParams('/home/:p/', '/home/a/', { p: 'a' }, options) + matchParams('/home/:p/', '/home/a/b', { p: 'a' }, options) + matchParams('/home/:p/', '/homepage', null, options) + }) + + it('can not match the end when strict', () => { + const options = { end: false, strict: true } + + matchParams('/home', '/home', {}, options) + matchParams('/home', '/home/', {}, options) + matchParams('/home', '/home/other', {}, options) + matchParams('/home', '/homepage', null, options) + + matchParams('/home/:p', '/home', null, options) + matchParams('/home/:p', '/home/', null, options) + matchParams('/home/:p', '/home/a', { p: 'a' }, options) + matchParams('/home/:p', '/home/a/', { p: 'a' }, options) + matchParams('/home/:p', '/home/a/b', { p: 'a' }, options) + matchParams('/home/:p', '/homepage', null, options) + + matchParams('/home/', '/home', null, options) + matchParams('/home/', '/home/', {}, options) + matchParams('/home/', '/home/other', {}, options) + matchParams('/home/', '/homepage', null, options) + + matchParams('/home/:p/', '/home', null, options) + matchParams('/home/:p/', '/home/', null, options) + matchParams('/home/:p/', '/home/a', null, options) + matchParams('/home/:p/', '/home/a/', { p: 'a' }, options) + matchParams('/home/:p/', '/home/a/b', { p: 'a' }, options) + matchParams('/home/:p/', '/homepage', null, options) }) it('should not match optional params + static without leading slash', () => { diff --git a/packages/router/src/matcher/pathParserRanker.ts b/packages/router/src/matcher/pathParserRanker.ts index 670013794..81b077642 100644 --- a/packages/router/src/matcher/pathParserRanker.ts +++ b/packages/router/src/matcher/pathParserRanker.ts @@ -217,7 +217,7 @@ export function tokensToParser( if (options.end) pattern += '$' // allow paths like /dynamic to only match dynamic or dynamic/... but not dynamic_something_else - else if (options.strict) pattern += '(?:/|$)' + else if (options.strict && !pattern.endsWith('/')) pattern += '(?:/|$)' const re = new RegExp(pattern, options.sensitive ? '' : 'i')