ba5e6943fa
* 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
31 lines
851 B
TypeScript
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,
|
|
}
|
|
}
|