rsnext/packages/next/next-server/lib/router/utils/route-regex.ts
Joe Haddad ba5e6943fa
[Experimental] Catch-all Route Support (#9416)
* Catch-all Route Support

* Add SSR tests

* Add additional test

* Add unit tests

* Put the feature behind a flag

* Apply suggestions from code review

Co-Authored-By: JJ Kasper <jj@jjsweb.site>

* Fix test
2019-11-14 23:19:41 -08:00

31 lines
851 B
TypeScript

export function getRouteRegex(
normalizedRoute: string
): { re: RegExp; groups: { [groupName: string]: number } } {
// Escape all characters that could be considered RegEx
const escapedRoute = (normalizedRoute.replace(/\/$/, '') || '/').replace(
/[|\\{}()[\]^$+*?.-]/g,
'\\$&'
)
const groups: { [groupName: string]: number } = {}
let groupIndex = 1
const parameterizedRoute = escapedRoute.replace(
/\/\\\[([^/]+?)\\\](?=\/|$)/g,
(_, $1) => (
(groups[
$1
// Un-escape key
.replace(/\\([|\\{}()[\]^$+*?.-])/g, '$1')
.replace(/^\.{3}/, '')
// eslint-disable-next-line no-sequences
] = groupIndex++),
$1.indexOf('\\.\\.\\.') === 0 ? '/(.+?)' : '/([^/]+?)'
)
)
return {
re: new RegExp('^' + parameterizedRoute + '(?:/)?$', 'i'),
groups,
}
}