route.ts 981 B

1234567891011121314151617181920212223242526272829303132333435
  1. type ExtractRouteParamsKey<T extends string> =
  2. T extends `${infer P1}:${infer P2}/${infer P3}`
  3. ? P2 | ExtractRouteParamsKey<P3>
  4. : T extends `${infer P1}:${infer P2}`
  5. ? P2
  6. : T extends `:${infer P2}/${infer P3}`
  7. ? P2 | ExtractRouteParamsKey<P3>
  8. : T extends `:${infer P2}`
  9. ? P2
  10. : never
  11. type ExtractRouteParams<T extends string> = {
  12. [key in ExtractRouteParamsKey<T>]: string
  13. }
  14. export const fillRoutePath = <T extends string>(path: T, params: ExtractRouteParams<T>) => {
  15. let processPath: string = path
  16. for (const [key, value] of Object.entries(params)) {
  17. const rg = new RegExp(`:${key}/?`)
  18. processPath = processPath.replace(rg, value as string)
  19. }
  20. return processPath
  21. }
  22. const place = /(?:\/:([^/]*))/g
  23. export const verifiRoutePath = (pathname: string, path: string) => {
  24. const rg = path
  25. .replace(/\/([^:])/g, (_, d) => `\\/${d}`)
  26. .replace(place, () => `(?:/[^/]*)`)
  27. return new RegExp(`^${rg}$`).test(pathname)
  28. }