Skip to content

Commit e8eb98e

Browse files
authored
feat: make overriding router parameter types easier (#513)
Closes #433
1 parent 728ba71 commit e8eb98e

File tree

3 files changed

+103
-0
lines changed

3 files changed

+103
-0
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,12 @@ Check out the
675675
[documentation for that library](https://github.com/pillarjs/path-to-regexp#parameters)
676676
if you have advanced use cases.
677677

678+
In most cases, the type of `context.params` is automatically inferred from the
679+
path template string through typescript magic. In more complex scenarios this
680+
might not yield the correct result however. In that case you can override the
681+
type with `router.get<RouteParams>`, where `RouteParams` is the explicit type
682+
for `context.params`.
683+
678684
### Nested routers
679685

680686
Nesting routers is supported. The following example responds to

router.ts

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,17 @@ export class Router<
630630
middleware: RouterMiddleware<R, P, S>,
631631
...middlewares: RouterMiddleware<R, P, S>[]
632632
): Router<S extends RS ? S : (S & RS)>;
633+
/** Register middleware for the specified routes when the `DELETE`,
634+
* `GET`, `POST`, or `PUT` method is requested with explicit path parameters.
635+
*/
636+
all<
637+
P extends RouteParams<string>,
638+
S extends State = RS,
639+
>(
640+
nameOrPath: string,
641+
pathOrMiddleware: string | RouterMiddleware<string, P, S>,
642+
...middleware: RouterMiddleware<string, S>[]
643+
): Router<S extends RS ? S : (S & RS)>;
633644
all<
634645
P extends RouteParams<string> = RouteParams<string>,
635646
S extends State = RS,
@@ -734,6 +745,16 @@ export class Router<
734745
middleware: RouterMiddleware<R, P, S>,
735746
...middlewares: RouterMiddleware<R, P, S>[]
736747
): Router<S extends RS ? S : (S & RS)>;
748+
/** Register middleware for the specified routes when the `DELETE`,
749+
* method is requested with explicit path parameters. */
750+
delete<
751+
P extends RouteParams<string>,
752+
S extends State = RS,
753+
>(
754+
nameOrPath: string,
755+
pathOrMiddleware: string | RouterMiddleware<string, P, S>,
756+
...middleware: RouterMiddleware<string, P, S>[]
757+
): Router<S extends RS ? S : (S & RS)>;
737758
delete<
738759
P extends RouteParams<string> = RouteParams<string>,
739760
S extends State = RS,
@@ -801,6 +822,16 @@ export class Router<
801822
middleware: RouterMiddleware<R, P, S>,
802823
...middlewares: RouterMiddleware<R, P, S>[]
803824
): Router<S extends RS ? S : (S & RS)>;
825+
/** Register middleware for the specified routes when the `GET`,
826+
* method is requested with explicit path parameters. */
827+
get<
828+
P extends RouteParams<string>,
829+
S extends State = RS,
830+
>(
831+
nameOrPath: string,
832+
pathOrMiddleware: string | RouterMiddleware<string, P, S>,
833+
...middleware: RouterMiddleware<string, P, S>[]
834+
): Router<S extends RS ? S : (S & RS)>;
804835
get<
805836
P extends RouteParams<string> = RouteParams<string>,
806837
S extends State = RS,
@@ -841,6 +872,16 @@ export class Router<
841872
middleware: RouterMiddleware<R, P, S>,
842873
...middlewares: RouterMiddleware<R, P, S>[]
843874
): Router<S extends RS ? S : (S & RS)>;
875+
/** Register middleware for the specified routes when the `HEAD`,
876+
* method is requested with explicit path parameters. */
877+
head<
878+
P extends RouteParams<string>,
879+
S extends State = RS,
880+
>(
881+
nameOrPath: string,
882+
pathOrMiddleware: string | RouterMiddleware<string, P, S>,
883+
...middleware: RouterMiddleware<string, P, S>[]
884+
): Router<S extends RS ? S : (S & RS)>;
844885
head<
845886
P extends RouteParams<string> = RouteParams<string>,
846887
S extends State = RS,
@@ -889,6 +930,16 @@ export class Router<
889930
middleware: RouterMiddleware<R, P, S>,
890931
...middlewares: RouterMiddleware<R, P, S>[]
891932
): Router<S extends RS ? S : (S & RS)>;
933+
/** Register middleware for the specified routes when the `OPTIONS`,
934+
* method is requested with explicit path parameters. */
935+
options<
936+
P extends RouteParams<string>,
937+
S extends State = RS,
938+
>(
939+
nameOrPath: string,
940+
pathOrMiddleware: string | RouterMiddleware<string, P, S>,
941+
...middleware: RouterMiddleware<string, P, S>[]
942+
): Router<S extends RS ? S : (S & RS)>;
892943
options<
893944
P extends RouteParams<string> = RouteParams<string>,
894945
S extends State = RS,
@@ -942,6 +993,16 @@ export class Router<
942993
middleware: RouterMiddleware<R, P, S>,
943994
...middlewares: RouterMiddleware<R, P, S>[]
944995
): Router<S extends RS ? S : (S & RS)>;
996+
/** Register middleware for the specified routes when the `PATCH`,
997+
* method is requested with explicit path parameters. */
998+
patch<
999+
P extends RouteParams<string>,
1000+
S extends State = RS,
1001+
>(
1002+
nameOrPath: string,
1003+
pathOrMiddleware: string | RouterMiddleware<string, P, S>,
1004+
...middleware: RouterMiddleware<string, S>[]
1005+
): Router<S extends RS ? S : (S & RS)>;
9451006
patch<
9461007
P extends RouteParams<string> = RouteParams<string>,
9471008
S extends State = RS,
@@ -982,6 +1043,16 @@ export class Router<
9821043
middleware: RouterMiddleware<R, P, S>,
9831044
...middlewares: RouterMiddleware<R, P, S>[]
9841045
): Router<S extends RS ? S : (S & RS)>;
1046+
/** Register middleware for the specified routes when the `POST`,
1047+
* method is requested with explicit path parameters. */
1048+
post<
1049+
P extends RouteParams<string>,
1050+
S extends State = RS,
1051+
>(
1052+
nameOrPath: string,
1053+
pathOrMiddleware: string | RouterMiddleware<string, P, S>,
1054+
...middleware: RouterMiddleware<string, P, S>[]
1055+
): Router<S extends RS ? S : (S & RS)>;
9851056
post<
9861057
P extends RouteParams<string> = RouteParams<string>,
9871058
S extends State = RS,
@@ -1032,6 +1103,16 @@ export class Router<
10321103
middleware: RouterMiddleware<R, P, S>,
10331104
...middlewares: RouterMiddleware<R, P, S>[]
10341105
): Router<S extends RS ? S : (S & RS)>;
1106+
/** Register middleware for the specified routes when the `PUT`
1107+
* method is requested with explicit path parameters. */
1108+
put<
1109+
P extends RouteParams<string>,
1110+
S extends State = RS,
1111+
>(
1112+
nameOrPath: string,
1113+
pathOrMiddleware: string | RouterMiddleware<string, P, S>,
1114+
...middleware: RouterMiddleware<string, P, S>[]
1115+
): Router<S extends RS ? S : (S & RS)>;
10351116
put<
10361117
P extends RouteParams<string> = RouteParams<string>,
10371118
S extends State = RS,
@@ -1190,6 +1271,16 @@ export class Router<
11901271
middleware: RouterMiddleware<R, P, S>,
11911272
...middlewares: RouterMiddleware<R, P, S>[]
11921273
): Router<S extends RS ? S : (S & RS)>;
1274+
/** Register middleware to be used on every route that matches the supplied
1275+
* `path` with explicit path parameters. */
1276+
use<
1277+
P extends RouteParams<string>,
1278+
S extends State = RS,
1279+
>(
1280+
path: string,
1281+
middleware: RouterMiddleware<string, P, S>,
1282+
...middlewares: RouterMiddleware<string, P, S>[]
1283+
): Router<S extends RS ? S : (S & RS)>;
11931284
use<
11941285
P extends RouteParams<string> = RouteParams<string>,
11951286
S extends State = RS,

router_test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,12 @@ test({
711711
ctx.params.id;
712712
ctx.params.page;
713713
ctx.state.session;
714+
}).post<{ id: string }>("/:id\\:archive", (ctx) => {
715+
ctx.params.id;
716+
// @ts-expect-error
717+
ctx.params["id:archive"];
718+
// @ts-expect-error
719+
ctx.params["id\\:archive"];
714720
}).routes(),
715721
).use((ctx) => {
716722
ctx.state.id;

0 commit comments

Comments
 (0)