Skip to content

Commit

Permalink
fix: combining 'end' and 'strict' (#2154)
Browse files Browse the repository at this point in the history
  • Loading branch information
skirtles-code authored Oct 29, 2024
1 parent 0126eae commit ab62098
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 3 deletions.
72 changes: 70 additions & 2 deletions packages/router/__tests__/matcher/pathParser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -619,9 +619,77 @@ describe('Path parser', () => {
matchParams('/home', '/other/home', {}, { start: false })
})

it('defaults to matching the end', () => {
// The default should behave like `end: true`
const optionSets = [{}, { end: true }]

for (const options of optionSets) {
matchParams('/home', '/home', {}, options)
matchParams('/home', '/home/', {}, options)
matchParams('/home', '/home/other', null, options)
matchParams('/home', '/homepage', null, options)

matchParams('/home/', '/home', {}, options)
matchParams('/home/', '/home/', {}, options)
matchParams('/home/', '/home/other', null, options)
matchParams('/home/', '/homepage', null, options)
}
})

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', () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/router/src/matcher/pathParserRanker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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')

Expand Down

0 comments on commit ab62098

Please sign in to comment.