Skip to content

Commit 29326ef

Browse files
committed
fix(#319): ensure that at least one middleware is present in types
Fixes #319
1 parent 802435c commit 29326ef

File tree

4 files changed

+83
-18
lines changed

4 files changed

+83
-18
lines changed

application.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,10 @@ export class Application<AS extends State = Record<string, any>>
515515
* await app.listen({ port: 80 });
516516
* ```
517517
*/
518+
use<S extends State = AS>(
519+
middleware: Middleware<S, Context<S, AS>>,
520+
...middlewares: Middleware<S, Context<S, AS>>[]
521+
): Application<S extends AS ? S : (S & AS)>;
518522
use<S extends State = AS>(
519523
...middleware: Middleware<S, Context<S, AS>>[]
520524
): Application<S extends AS ? S : (S & AS)> {

application_test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,3 +622,16 @@ test({
622622
assert(await response.text(), "hello oak");
623623
},
624624
});
625+
626+
test({
627+
name: "application.use() - type checking - at least one middleware is passed",
628+
fn() {
629+
const app = new Application();
630+
try {
631+
// @ts-expect-error
632+
app.use();
633+
} catch {
634+
//
635+
}
636+
},
637+
});

router.ts

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -518,13 +518,15 @@ export class Router<
518518
all<P extends RouteParams = RP, S extends State = RS>(
519519
name: string,
520520
path: string,
521-
...middleware: RouterMiddleware<P, S>[]
521+
middleware: RouterMiddleware<P, S>,
522+
...middlewares: RouterMiddleware<P, S>[]
522523
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
523524
/** Register middleware for the specified routes when the `DELETE`,
524525
* `GET`, `POST`, or `PUT` method is requested. */
525526
all<P extends RouteParams = RP, S extends State = RS>(
526527
path: string,
527-
...middleware: RouterMiddleware<P, S>[]
528+
middleware: RouterMiddleware<P, S>,
529+
...middlewares: RouterMiddleware<P, S>[]
528530
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
529531
all<P extends RouteParams = RP, S extends State = RS>(
530532
nameOrPath: string,
@@ -610,13 +612,15 @@ export class Router<
610612
delete<P extends RouteParams = RP, S extends State = RS>(
611613
name: string,
612614
path: string,
613-
...middleware: RouterMiddleware<P, S>[]
615+
middleware: RouterMiddleware<P, S>,
616+
...middlewares: RouterMiddleware<P, S>[]
614617
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
615618
/** Register middleware for the specified routes when the `DELETE`,
616619
* method is requested. */
617620
delete<P extends RouteParams = RP, S extends State = RS>(
618621
path: string,
619-
...middleware: RouterMiddleware<P, S>[]
622+
middleware: RouterMiddleware<P, S>,
623+
...middlewares: RouterMiddleware<P, S>[]
620624
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
621625
delete<P extends RouteParams = RP, S extends State = RS>(
622626
nameOrPath: string,
@@ -661,13 +665,15 @@ export class Router<
661665
get<P extends RouteParams = RP, S extends State = RS>(
662666
name: string,
663667
path: string,
664-
...middleware: RouterMiddleware<P, S>[]
668+
middleware: RouterMiddleware<P, S>,
669+
...middlewares: RouterMiddleware<P, S>[]
665670
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
666671
/** Register middleware for the specified routes when the `GET`,
667672
* method is requested. */
668673
get<P extends RouteParams = RP, S extends State = RS>(
669674
path: string,
670-
...middleware: RouterMiddleware<P, S>[]
675+
middleware: RouterMiddleware<P, S>,
676+
...middlewares: RouterMiddleware<P, S>[]
671677
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
672678
get<P extends RouteParams = RP, S extends State = RS>(
673679
nameOrPath: string,
@@ -689,13 +695,15 @@ export class Router<
689695
head<P extends RouteParams = RP, S extends State = RS>(
690696
name: string,
691697
path: string,
692-
...middleware: RouterMiddleware<P, S>[]
698+
middleware: RouterMiddleware<P, S>,
699+
...middlewares: RouterMiddleware<P, S>[]
693700
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
694701
/** Register middleware for the specified routes when the `HEAD`,
695702
* method is requested. */
696703
head<P extends RouteParams = RP, S extends State = RS>(
697704
path: string,
698-
...middleware: RouterMiddleware<P, S>[]
705+
middleware: RouterMiddleware<P, S>,
706+
...middlewares: RouterMiddleware<P, S>[]
699707
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
700708
head<P extends RouteParams = RP, S extends State = RS>(
701709
nameOrPath: string,
@@ -725,13 +733,15 @@ export class Router<
725733
options<P extends RouteParams = RP, S extends State = RS>(
726734
name: string,
727735
path: string,
728-
...middleware: RouterMiddleware<P, S>[]
736+
middleware: RouterMiddleware<P, S>,
737+
...middlewares: RouterMiddleware<P, S>[]
729738
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
730739
/** Register middleware for the specified routes when the `OPTIONS`,
731740
* method is requested. */
732741
options<P extends RouteParams = RP, S extends State = RS>(
733742
path: string,
734-
...middleware: RouterMiddleware<P, S>[]
743+
middleware: RouterMiddleware<P, S>,
744+
...middlewares: RouterMiddleware<P, S>[]
735745
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
736746
options<P extends RouteParams = RP, S extends State = RS>(
737747
nameOrPath: string,
@@ -766,13 +776,15 @@ export class Router<
766776
patch<P extends RouteParams = RP, S extends State = RS>(
767777
name: string,
768778
path: string,
769-
...middleware: RouterMiddleware<P, S>[]
779+
middleware: RouterMiddleware<P, S>,
780+
...middlewares: RouterMiddleware<P, S>[]
770781
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
771782
/** Register middleware for the specified routes when the `PATCH`,
772783
* method is requested. */
773784
patch<P extends RouteParams = RP, S extends State = RS>(
774785
path: string,
775-
...middleware: RouterMiddleware<P, S>[]
786+
middleware: RouterMiddleware<P, S>,
787+
...middlewares: RouterMiddleware<P, S>[]
776788
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
777789
patch<P extends RouteParams = RP, S extends State = RS>(
778790
nameOrPath: string,
@@ -794,13 +806,15 @@ export class Router<
794806
post<P extends RouteParams = RP, S extends State = RS>(
795807
name: string,
796808
path: string,
797-
...middleware: RouterMiddleware<P, S>[]
809+
middleware: RouterMiddleware<P, S>,
810+
...middlewares: RouterMiddleware<P, S>[]
798811
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
799812
/** Register middleware for the specified routes when the `POST`,
800813
* method is requested. */
801814
post<P extends RouteParams = RP, S extends State = RS>(
802815
path: string,
803-
...middleware: RouterMiddleware<P, S>[]
816+
middleware: RouterMiddleware<P, S>,
817+
...middlewares: RouterMiddleware<P, S>[]
804818
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
805819
post<P extends RouteParams = RP, S extends State = RS>(
806820
nameOrPath: string,
@@ -832,13 +846,15 @@ export class Router<
832846
put<P extends RouteParams = RP, S extends State = RS>(
833847
name: string,
834848
path: string,
835-
...middleware: RouterMiddleware<P, S>[]
849+
middleware: RouterMiddleware<P, S>,
850+
...middlewares: RouterMiddleware<P, S>[]
836851
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
837852
/** Register middleware for the specified routes when the `PUT`
838853
* method is requested. */
839854
put<P extends RouteParams = RP, S extends State = RS>(
840855
path: string,
841-
...middleware: RouterMiddleware<P, S>[]
856+
middleware: RouterMiddleware<P, S>,
857+
...middlewares: RouterMiddleware<P, S>[]
842858
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
843859
put<P extends RouteParams = RP, S extends State = RS>(
844860
nameOrPath: string,
@@ -982,13 +998,15 @@ export class Router<
982998

983999
/** Register middleware to be used on every matched route. */
9841000
use<P extends RouteParams = RP, S extends State = RS>(
985-
...middleware: RouterMiddleware<P, S>[]
1001+
middleware: RouterMiddleware<P, S>,
1002+
...middlewares: RouterMiddleware<P, S>[]
9861003
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
9871004
/** Register middleware to be used on every route that matches the supplied
9881005
* `path`. */
9891006
use<P extends RouteParams = RP, S extends State = RS>(
9901007
path: string | string[],
991-
...middleware: RouterMiddleware<P, S>[]
1008+
middleware: RouterMiddleware<P, S>,
1009+
...middlewares: RouterMiddleware<P, S>[]
9921010
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>;
9931011
use<P extends RouteParams = RP, S extends State = RS>(
9941012
pathOrMiddleware: string | string[] | RouterMiddleware<P, S>,

router_test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,3 +949,33 @@ test({
949949
assertStrictEquals((context2 as RouterContext).router, router);
950950
},
951951
});
952+
953+
test({
954+
name: "router - type checking - ensure at least one middleware is passed",
955+
fn() {
956+
const router = new Router();
957+
958+
try {
959+
// @ts-expect-error
960+
router.all("/");
961+
// @ts-expect-error
962+
router.delete("/");
963+
// @ts-expect-error
964+
router.get("/");
965+
// @ts-expect-error
966+
router.head("/");
967+
// @ts-expect-error
968+
router.options("/");
969+
// @ts-expect-error
970+
router.patch("/");
971+
// @ts-expect-error
972+
router.post("/");
973+
// @ts-expect-error
974+
router.put("/");
975+
// @ts-expect-error
976+
router.use();
977+
} catch {
978+
//
979+
}
980+
},
981+
});

0 commit comments

Comments
 (0)