@@ -16,6 +16,25 @@ type HrefBuilderArgs<T extends string> =
16
16
[ Record < P , string > ] | [ Record < P , string > , SearchParams ] :
17
17
never
18
18
19
+ // prettier-ignore
20
+ type Params < T extends string > =
21
+ Parse < T > extends infer A extends Ast ?
22
+ | ( A [ 'protocol' ] extends Part ? PartParams < A [ 'protocol' ] > : never )
23
+ | ( A [ 'hostname' ] extends Part ? PartParams < A [ 'hostname' ] > : never )
24
+ | ( A [ 'pathname' ] extends Part ? PartParams < A [ 'pathname' ] > : never ) :
25
+ never
26
+
27
+ // prettier-ignore
28
+ type PartParams < T extends Part > =
29
+ T extends [ infer L extends PartNode , ...infer R extends Array < PartNode > ] ?
30
+ L extends PartNode < 'variable' > ? L [ 'name' ] | PartParams < R > :
31
+ L extends PartNode < 'wildcard' > ? ( L extends { name : infer N extends string } ? N : '*' ) | PartParams < R > :
32
+ L extends PartNode < 'optional' > ? PartParams < L [ 'nodes' ] > | PartParams < R > :
33
+ PartParams < R > :
34
+ never
35
+
36
+ type SearchParams = NonNullable < ConstructorParameters < typeof URLSearchParams > [ 0 ] >
37
+
19
38
interface HrefBuilderOptions {
20
39
/**
21
40
* The default protocol to use when the pattern doesn't specify one.
@@ -29,10 +48,10 @@ interface HrefBuilderOptions {
29
48
host ?: string
30
49
}
31
50
32
- export function createHrefBuilder < Source extends string | undefined = undefined > (
51
+ export function createHrefBuilder < T extends string | undefined = undefined > (
33
52
options : HrefBuilderOptions = { } ,
34
- ) : HrefBuilder < Source > {
35
- return < V extends Source extends string ? Variant < Source > : string > (
53
+ ) : HrefBuilder < T > {
54
+ return < V extends T extends string ? Variant < T > : string > (
36
55
variant : V ,
37
56
...args : HrefBuilderArgs < V >
38
57
) => {
@@ -99,24 +118,3 @@ function resolveNode(node: PartNode, params: Record<string, string>): string {
99
118
// text
100
119
return node . value
101
120
}
102
-
103
- // Params and SearchParams -----------------------------------------------------------------------
104
-
105
- // prettier-ignore
106
- type Params < T extends string > =
107
- Parse < T > extends infer A extends Ast ?
108
- | ( A [ 'protocol' ] extends Part ? PartParams < A [ 'protocol' ] > : never )
109
- | ( A [ 'hostname' ] extends Part ? PartParams < A [ 'hostname' ] > : never )
110
- | ( A [ 'pathname' ] extends Part ? PartParams < A [ 'pathname' ] > : never ) :
111
- never
112
-
113
- // prettier-ignore
114
- type PartParams < T extends Part > =
115
- T extends [ infer L extends PartNode , ...infer R extends Array < PartNode > ] ?
116
- L extends PartNode < 'variable' > ? L [ 'name' ] | PartParams < R > :
117
- L extends PartNode < 'wildcard' > ? ( L extends { name : infer N extends string } ? N : '*' ) | PartParams < R > :
118
- L extends PartNode < 'optional' > ? PartParams < L [ 'nodes' ] > | PartParams < R > :
119
- PartParams < R > :
120
- never
121
-
122
- type SearchParams = NonNullable < ConstructorParameters < typeof URLSearchParams > [ 0 ] >
0 commit comments