-
Notifications
You must be signed in to change notification settings - Fork 224
Expand file tree
/
Copy pathnavigation.ts
More file actions
36 lines (29 loc) · 1.21 KB
/
navigation.ts
File metadata and controls
36 lines (29 loc) · 1.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { resolve } from '$app/paths';
import { goto } from '$app/navigation';
import type { Pathname, RouteId, RouteParams } from '$app/types';
// taken directly from svelte's source!
type ResolveArgs<T extends RouteId | Pathname> = T extends RouteId
? RouteParams<T> extends Record<string, never>
? [route: T]
: [route: T, params: RouteParams<T>]
: [route: T];
export function withPath(base: string, ...parts: string[]) {
// remove slashes at the end if any
const normalizedBase = base.replace(/\/+$/, '');
// remove slashes at the start of each part if any
const normalizedParts = parts.map((part) => part.replace(/^\/+/, ''));
// join em with slashes
return [normalizedBase, ...normalizedParts].join('/');
}
export function resolveRoute<T extends RouteId>(route: T, params?: Record<string, string>) {
// type cast is necessary here!
const resolveArgs = params ? ([route, params] as [T, RouteParams<T>]) : [route];
return resolve(...(resolveArgs as ResolveArgs<T>));
}
export function navigate<T extends RouteId>(
route: T,
params?: Record<string, string>
): Promise<void> {
// type cast is necessary here!
return goto(resolveRoute(route, params));
}