2019-05-27 20:20:33 +02:00
|
|
|
export function getRouteRegex(
|
2019-05-30 22:42:45 +02:00
|
|
|
normalizedRoute: string
|
2019-05-27 20:20:33 +02:00
|
|
|
): { re: RegExp; groups: { [groupName: string]: number } } {
|
2019-06-21 00:27:04 +02:00
|
|
|
// Escape all characters that could be considered RegEx
|
2019-05-30 22:42:45 +02:00
|
|
|
const escapedRoute = (normalizedRoute.replace(/\/$/, '') || '/').replace(
|
2019-05-27 20:20:33 +02:00
|
|
|
/[|\\{}()[\]^$+*?.-]/g,
|
2019-05-29 13:57:26 +02:00
|
|
|
'\\$&'
|
2019-05-27 20:20:33 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
const groups: { [groupName: string]: number } = {}
|
|
|
|
let groupIndex = 1
|
|
|
|
|
|
|
|
const parameterizedRoute = escapedRoute.replace(
|
2019-06-21 00:27:04 +02:00
|
|
|
/\/\\\[([^\/]+?)\\\](?=\/|$)/g,
|
2019-05-27 20:20:33 +02:00
|
|
|
(_, $1) => (
|
|
|
|
(groups[
|
2019-05-29 23:29:02 +02:00
|
|
|
$1
|
|
|
|
// Un-escape key
|
|
|
|
.replace(/\\([|\\{}()[\]^$+*?.-])/g, '$1')
|
2019-05-27 20:20:33 +02:00
|
|
|
] = groupIndex++),
|
2019-05-29 23:29:02 +02:00
|
|
|
'/([^/]+?)'
|
2019-05-29 13:57:26 +02:00
|
|
|
)
|
2019-05-27 20:20:33 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
return {
|
|
|
|
re: new RegExp('^' + parameterizedRoute + '(?:/)?$', 'i'),
|
|
|
|
groups,
|
|
|
|
}
|
|
|
|
}
|