From 190cc3bd7df11dbe0c54b9d38bcc1274aa260c75 Mon Sep 17 00:00:00 2001 From: Alex Shaw Date: Sat, 3 Jun 2023 12:46:22 -0700 Subject: [PATCH 1/2] feat: add router middleware objects --- README.md | 27 ++++ examples/routingServer.ts | 28 +++- mod.ts | 2 + router.ts | 322 ++++++++++++++++++++------------------ 4 files changed, 225 insertions(+), 154 deletions(-) diff --git a/README.md b/README.md index e8ad339d..a33be7ae 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,11 @@ The middleware is processed as a stack, where each middleware function can control the flow of the response. When the middleware is called, it is passed a context and reference to the "next" method in the stack. +Middleware can also be an object as long as it has a `handleRequest` method. +Middleware objects can optionally have an `init` function which will be called +when the application starts listening. This makes middleware objects ideal for +encapsulation or delayed initialization. + A more complex example: ```ts @@ -91,6 +96,25 @@ app.use(async (ctx, next) => { ctx.response.headers.set("X-Response-Time", `${ms}ms`); }); +// Counter +class CountingMiddleware implements MiddlewareObject { + #id = 0; + #counter = 0; + + init() { + const array = new Uint32Array(1); + crypto.getRandomValues(array); + this.#id = array[0]; + } + + handleRequest(ctx: Context, next: Next) { + ctx.response.headers.set("X-Response-Count", String(this.#counter++)); + ctx.response.headers.set("X-Response-Counter-ID", String(this.#id)); + return next(); + } +} +app.use(new CountingMiddleware()); + // Hello World! app.use((ctx) => { ctx.response.body = "Hello World!"; @@ -664,6 +688,9 @@ await app.listen({ port: 80 }); The `Router` class produces middleware which can be used with an `Application` to enable routing based on the pathname of the request. +Like regular `Middleware`, router middleware can be an object as long as the +`handleRequest` method is implemented. + ### Basic usage The following example serves up a _RESTful_ service of a map of books, where diff --git a/examples/routingServer.ts b/examples/routingServer.ts index 055e8a88..f9e9c717 100644 --- a/examples/routingServer.ts +++ b/examples/routingServer.ts @@ -39,6 +39,30 @@ function notFound(context: Context) { `

404 - Not Found

Path ${context.request.url} not found.`; } +class OrdersObject { + #orders = new Set(); + + handleRequest(context: RouterContext<"/orders">) { + if (context.params["order"]) { + if (this.#orders.has(context.params["order"])) { + context.response.body = `${context.params["order"]} is already ordered.`; + } else { + this.#orders.add(context.params["order"]); + context.response.body = `Ordered ${context.params["order"]}.`; + } + } else { + const orders = Array.from(this.#orders.values()); + if (orders.length > 0) { + context.response.body = `Orders: ${orders.join(", ")}`; + } else { + context.response.body = "No orders so far."; + } + } + } +} + +const orders = new OrdersObject(); + const router = new Router(); router .get("/", (context) => { @@ -81,7 +105,9 @@ router } else { return notFound(context); } - }); + }) + .get("/orders", orders) + .get("/orders/:order", orders); const app = new Application(); diff --git a/mod.ts b/mod.ts index aa9de0a6..88f555a9 100644 --- a/mod.ts +++ b/mod.ts @@ -91,6 +91,8 @@ export type { RouterAllowedMethodsOptions, RouterContext, RouterMiddleware, + RouterMiddlewareObject, + RouterMiddlewareOrMiddlewareObject, RouterOptions, RouterParamMiddleware, } from "./router.ts"; diff --git a/router.ts b/router.ts index ed5ebe88..f3d54e13 100644 --- a/router.ts +++ b/router.ts @@ -37,7 +37,7 @@ import { Status, TokensToRegexpOptions, } from "./deps.ts"; -import { compose, Middleware } from "./middleware.ts"; +import { compose, Middleware, type Next } from "./middleware.ts"; import type { HTTPMethods, RedirectStatus } from "./types.d.ts"; import { assert, decodeComponent } from "./util.ts"; @@ -74,7 +74,7 @@ export interface Route< methods: HTTPMethods[]; /** The middleware that will be applied to this route. */ - middleware: RouterMiddleware[]; + middleware: RouterMiddlewareOrMiddlewareObject[]; /** An optional name for the route. */ name?: string; @@ -129,7 +129,7 @@ export interface RouterMiddleware< // deno-lint-ignore no-explicit-any S extends State = Record, > { - (context: RouterContext, next: () => Promise): + (context: RouterContext, next: Next): | Promise | unknown; /** For route parameter middleware, the `param` key for this parameter will @@ -139,6 +139,26 @@ export interface RouterMiddleware< router?: Router; } +export interface RouterMiddlewareObject< + R extends string, + P extends RouteParams = RouteParams, + // deno-lint-ignore no-explicit-any + S extends State = Record, +> { + init?: () => Promise | unknown; + handleRequest(context: RouterContext, next: Next): Promise | unknown; + param?: keyof P; + // deno-lint-ignore no-explicit-any + router?: Router; +} + +export type RouterMiddlewareOrMiddlewareObject< + R extends string, + P extends RouteParams = RouteParams, + // deno-lint-ignore no-explicit-any + S extends State = Record, +> = RouterMiddleware | RouterMiddlewareObject; + export interface RouterOptions { /** Override the default set of methods supported by the router. */ methods?: HTTPMethods[]; @@ -191,15 +211,15 @@ type GetRouteParams = RemoveTail< export type RouteParams = string extends Route ? ParamsDictionary : Route extends `${string}(${string}` ? ParamsDictionary - : Route extends `${string}:${infer Rest}` ? - & ( - GetRouteParams extends never ? ParamsDictionary - : GetRouteParams extends `${infer ParamName}?` - ? { [P in ParamName]?: string } - : { [P in GetRouteParams]: string } - ) - & (Rest extends `${GetRouteParams}${infer Next}` ? RouteParams - : unknown) + : Route extends `${string}:${infer Rest}` ? + & ( + GetRouteParams extends never ? ParamsDictionary + : GetRouteParams extends `${infer ParamName}?` + ? { [P in ParamName]?: string } + : { [P in GetRouteParams]: string } + ) + & (Rest extends `${GetRouteParams}${infer Next}` ? RouteParams + : unknown) : Record; type LayerOptions = TokensToRegexpOptions & ParseOptions & { @@ -265,12 +285,12 @@ class Layer< methods: HTTPMethods[]; name?: string; path: string; - stack: RouterMiddleware[]; + stack: RouterMiddlewareOrMiddlewareObject[]; constructor( path: string, methods: HTTPMethods[], - middleware: RouterMiddleware | RouterMiddleware[], + middleware: RouterMiddlewareOrMiddlewareObject | RouterMiddlewareOrMiddlewareObject[], { name, ...opts }: LayerOptions = {}, ) { this.#opts = opts; @@ -383,16 +403,15 @@ class Layer< } [Symbol.for("Deno.customInspect")](inspect: (value: unknown) => string) { - return `${this.constructor.name} ${ - inspect({ - methods: this.methods, - middleware: this.stack, - options: this.#opts, - paramNames: this.#paramNames.map((key) => key.name), - path: this.path, - regexp: this.#regexp, - }) - }`; + return `${this.constructor.name} ${inspect({ + methods: this.methods, + middleware: this.stack, + options: this.#opts, + paramNames: this.#paramNames.map((key) => key.name), + path: this.path, + regexp: this.#regexp, + }) + }`; } [Symbol.for("nodejs.util.inspect.custom")]( @@ -408,19 +427,18 @@ class Layer< const newOptions = Object.assign({}, options, { depth: options.depth === null ? null : options.depth - 1, }); - return `${options.stylize(this.constructor.name, "special")} ${ - inspect( - { - methods: this.methods, - middleware: this.stack, - options: this.#opts, - paramNames: this.#paramNames.map((key) => key.name), - path: this.path, - regexp: this.#regexp, - }, - newOptions, - ) - }`; + return `${options.stylize(this.constructor.name, "special")} ${inspect( + { + methods: this.methods, + middleware: this.stack, + options: this.#opts, + paramNames: this.#paramNames.map((key) => key.name), + path: this.path, + regexp: this.#regexp, + }, + newOptions, + ) + }`; } } @@ -484,7 +502,7 @@ export class Router< #register( path: string | string[], - middlewares: RouterMiddleware[], + middlewares: RouterMiddlewareOrMiddlewareObject[], methods: HTTPMethods[], options: RegisterOptions = {}, ): void { @@ -495,7 +513,7 @@ export class Router< return; } - let layerMiddlewares: RouterMiddleware[] = []; + let layerMiddlewares: RouterMiddlewareOrMiddlewareObject[] = []; for (const middleware of middlewares) { if (!middleware.router) { layerMiddlewares.push(middleware); @@ -531,7 +549,7 @@ export class Router< #addLayer( path: string, - middlewares: RouterMiddleware[], + middlewares: RouterMiddlewareOrMiddlewareObject[], methods: HTTPMethods[], options: LayerOptions = {}, ) { @@ -571,8 +589,8 @@ export class Router< #useVerb( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - middleware: RouterMiddleware[], + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + middleware: RouterMiddlewareOrMiddlewareObject[], methods: HTTPMethods[], ): void { let name: string | undefined = undefined; @@ -619,8 +637,8 @@ export class Router< methods: HTTPMethods[] | HTTPMethods, name: string, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the specified methods is * requested. */ @@ -631,8 +649,8 @@ export class Router< >( methods: HTTPMethods[] | HTTPMethods, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the specified methods * are requested with explicit path parameters. */ @@ -642,8 +660,8 @@ export class Router< >( methods: HTTPMethods[] | HTTPMethods, nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router; add< P extends RouteParams = RouteParams, @@ -651,13 +669,13 @@ export class Router< >( methods: HTTPMethods[] | HTTPMethods, nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { this.#useVerb( nameOrPath, - pathOrMiddleware as (string | RouterMiddleware), - middleware as RouterMiddleware[], + pathOrMiddleware as (string | RouterMiddlewareOrMiddlewareObject), + middleware as RouterMiddlewareOrMiddlewareObject[], typeof methods === "string" ? [methods] : methods, ); return this; @@ -672,8 +690,8 @@ export class Router< >( name: string, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `DELETE`, * `GET`, `POST`, or `PUT` method is requested. */ @@ -683,8 +701,8 @@ export class Router< S extends State = RS, >( path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `DELETE`, * `GET`, `POST`, or `PUT` method is requested with explicit path parameters. @@ -694,21 +712,21 @@ export class Router< S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router; all< P extends RouteParams = RouteParams, S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { this.#useVerb( nameOrPath, - pathOrMiddleware as (string | RouterMiddleware), - middleware as RouterMiddleware[], + pathOrMiddleware as (string | RouterMiddlewareOrMiddlewareObject), + middleware as RouterMiddlewareOrMiddlewareObject[], this.#methods.filter((method) => method !== "OPTIONS"), ); return this; @@ -787,8 +805,8 @@ export class Router< >( name: string, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `DELETE`, * method is requested. */ @@ -798,8 +816,8 @@ export class Router< S extends State = RS, >( path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `DELETE`, * method is requested with explicit path parameters. */ @@ -808,21 +826,21 @@ export class Router< S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router; delete< P extends RouteParams = RouteParams, S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { this.#useVerb( nameOrPath, - pathOrMiddleware as (string | RouterMiddleware), - middleware as RouterMiddleware[], + pathOrMiddleware as (string | RouterMiddlewareOrMiddlewareObject), + middleware as RouterMiddlewareOrMiddlewareObject[], ["DELETE"], ); return this; @@ -864,8 +882,8 @@ export class Router< >( name: string, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `GET`, * method is requested. */ @@ -875,8 +893,8 @@ export class Router< S extends State = RS, >( path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `GET`, * method is requested with explicit path parameters. */ @@ -885,21 +903,21 @@ export class Router< S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router; get< P extends RouteParams = RouteParams, S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { this.#useVerb( nameOrPath, - pathOrMiddleware as (string | RouterMiddleware), - middleware as RouterMiddleware[], + pathOrMiddleware as (string | RouterMiddlewareOrMiddlewareObject), + middleware as RouterMiddlewareOrMiddlewareObject[], ["GET"], ); return this; @@ -914,8 +932,8 @@ export class Router< >( name: string, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `HEAD`, * method is requested. */ @@ -925,8 +943,8 @@ export class Router< S extends State = RS, >( path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `HEAD`, * method is requested with explicit path parameters. */ @@ -935,21 +953,21 @@ export class Router< S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router; head< P extends RouteParams = RouteParams, S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { this.#useVerb( nameOrPath, - pathOrMiddleware as (string | RouterMiddleware), - middleware as RouterMiddleware[], + pathOrMiddleware as (string | RouterMiddlewareOrMiddlewareObject), + middleware as RouterMiddlewareOrMiddlewareObject[], ["HEAD"], ); return this; @@ -972,8 +990,8 @@ export class Router< >( name: string, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `OPTIONS`, * method is requested. */ @@ -983,8 +1001,8 @@ export class Router< S extends State = RS, >( path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `OPTIONS`, * method is requested with explicit path parameters. */ @@ -993,21 +1011,21 @@ export class Router< S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router; options< P extends RouteParams = RouteParams, S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { this.#useVerb( nameOrPath, - pathOrMiddleware as (string | RouterMiddleware), - middleware as RouterMiddleware[], + pathOrMiddleware as (string | RouterMiddlewareOrMiddlewareObject), + middleware as RouterMiddlewareOrMiddlewareObject[], ["OPTIONS"], ); return this; @@ -1035,8 +1053,8 @@ export class Router< >( name: string, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `PATCH`, * method is requested. */ @@ -1046,8 +1064,8 @@ export class Router< S extends State = RS, >( path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `PATCH`, * method is requested with explicit path parameters. */ @@ -1056,21 +1074,21 @@ export class Router< S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router; patch< P extends RouteParams = RouteParams, S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { this.#useVerb( nameOrPath, - pathOrMiddleware as (string | RouterMiddleware), - middleware as RouterMiddleware[], + pathOrMiddleware as (string | RouterMiddlewareOrMiddlewareObject), + middleware as RouterMiddlewareOrMiddlewareObject[], ["PATCH"], ); return this; @@ -1085,8 +1103,8 @@ export class Router< >( name: string, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `POST`, * method is requested. */ @@ -1096,8 +1114,8 @@ export class Router< S extends State = RS, >( path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `POST`, * method is requested with explicit path parameters. */ @@ -1106,21 +1124,21 @@ export class Router< S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router; post< P extends RouteParams = RouteParams, S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { this.#useVerb( nameOrPath, - pathOrMiddleware as (string | RouterMiddleware), - middleware as RouterMiddleware[], + pathOrMiddleware as (string | RouterMiddlewareOrMiddlewareObject), + middleware as RouterMiddlewareOrMiddlewareObject[], ["POST"], ); return this; @@ -1145,8 +1163,8 @@ export class Router< >( name: string, path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `PUT` * method is requested. */ @@ -1156,8 +1174,8 @@ export class Router< S extends State = RS, >( path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware for the specified routes when the `PUT` * method is requested with explicit path parameters. */ @@ -1166,21 +1184,21 @@ export class Router< S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router; put< P extends RouteParams = RouteParams, S extends State = RS, >( nameOrPath: string, - pathOrMiddleware: string | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { this.#useVerb( nameOrPath, - pathOrMiddleware as (string | RouterMiddleware), - middleware as RouterMiddleware[], + pathOrMiddleware as (string | RouterMiddlewareOrMiddlewareObject), + middleware as RouterMiddlewareOrMiddlewareObject[], ["PUT"], ); return this; @@ -1287,7 +1305,7 @@ export class Router< }, ...route.stack, ], - [] as RouterMiddleware[], + [] as RouterMiddlewareOrMiddlewareObject[], ); return compose(chain)(ctx, next); }; @@ -1314,8 +1332,8 @@ export class Router< P extends RouteParams = RouteParams, S extends State = RS, >( - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware to be used on every route that matches the supplied * `path`. */ @@ -1325,8 +1343,8 @@ export class Router< S extends State = RS, >( path: R, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; /** Register middleware to be used on every route that matches the supplied * `path` with explicit path parameters. */ @@ -1335,23 +1353,23 @@ export class Router< S extends State = RS, >( path: string, - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; use< P extends RouteParams = RouteParams, S extends State = RS, >( path: string[], - middleware: RouterMiddleware, - ...middlewares: RouterMiddleware[] + middleware: RouterMiddlewareOrMiddlewareObject, + ...middlewares: RouterMiddlewareOrMiddlewareObject[] ): Router; use< P extends RouteParams = RouteParams, S extends State = RS, >( - pathOrMiddleware: string | string[] | RouterMiddleware, - ...middleware: RouterMiddleware[] + pathOrMiddleware: string | string[] | RouterMiddlewareOrMiddlewareObject, + ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { let path: string | string[] | undefined; if ( @@ -1364,7 +1382,7 @@ export class Router< this.#register( path ?? "(.*)", - middleware as RouterMiddleware[], + middleware as RouterMiddlewareOrMiddlewareObject[], [], { end: false, ignoreCaptures: !path, ignorePrefix: !path }, ); @@ -1400,9 +1418,8 @@ export class Router< } [Symbol.for("Deno.customInspect")](inspect: (value: unknown) => string) { - return `${this.constructor.name} ${ - inspect({ "#params": this.#params, "#stack": this.#stack }) - }`; + return `${this.constructor.name} ${inspect({ "#params": this.#params, "#stack": this.#stack }) + }`; } [Symbol.for("nodejs.util.inspect.custom")]( @@ -1418,11 +1435,10 @@ export class Router< const newOptions = Object.assign({}, options, { depth: options.depth === null ? null : options.depth - 1, }); - return `${options.stylize(this.constructor.name, "special")} ${ - inspect( - { "#params": this.#params, "#stack": this.#stack }, - newOptions, - ) - }`; + return `${options.stylize(this.constructor.name, "special")} ${inspect( + { "#params": this.#params, "#stack": this.#stack }, + newOptions, + ) + }`; } } From 16a99467ba5ecf256002eee17ebc6ead4b0a975e Mon Sep 17 00:00:00 2001 From: Alex Shaw Date: Sat, 3 Jun 2023 12:49:24 -0700 Subject: [PATCH 2/2] style: run deno fmt on router --- examples/routingServer.ts | 4 ++- router.ts | 74 +++++++++++++++++++++++---------------- 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/examples/routingServer.ts b/examples/routingServer.ts index c609eecc..f12e2971 100644 --- a/examples/routingServer.ts +++ b/examples/routingServer.ts @@ -45,7 +45,9 @@ class OrdersObject { handleRequest(context: RouterContext<"/orders">) { if (context.params["order"]) { if (this.#orders.has(context.params["order"])) { - context.response.body = `${context.params["order"]} is already ordered.`; + context.response.body = `${ + context.params["order"] + } is already ordered.`; } else { this.#orders.add(context.params["order"]); context.response.body = `Ordered ${context.params["order"]}.`; diff --git a/router.ts b/router.ts index 7cb28c87..f7afca80 100644 --- a/router.ts +++ b/router.ts @@ -147,7 +147,10 @@ export interface RouterMiddlewareObject< S extends State = Record, > { init?: () => Promise | unknown; - handleRequest(context: RouterContext, next: Next): Promise | unknown; + handleRequest( + context: RouterContext, + next: Next, + ): Promise | unknown; param?: keyof P; // deno-lint-ignore no-explicit-any router?: Router; @@ -291,7 +294,9 @@ class Layer< constructor( path: string, methods: HTTPMethods[], - middleware: RouterMiddlewareOrMiddlewareObject | RouterMiddlewareOrMiddlewareObject[], + middleware: + | RouterMiddlewareOrMiddlewareObject + | RouterMiddlewareOrMiddlewareObject[], { name, ...opts }: LayerOptions = {}, ) { this.#opts = opts; @@ -404,15 +409,16 @@ class Layer< } [Symbol.for("Deno.customInspect")](inspect: (value: unknown) => string) { - return `${this.constructor.name} ${inspect({ - methods: this.methods, - middleware: this.stack, - options: this.#opts, - paramNames: this.#paramNames.map((key) => key.name), - path: this.path, - regexp: this.#regexp, - }) - }`; + return `${this.constructor.name} ${ + inspect({ + methods: this.methods, + middleware: this.stack, + options: this.#opts, + paramNames: this.#paramNames.map((key) => key.name), + path: this.path, + regexp: this.#regexp, + }) + }`; } [Symbol.for("nodejs.util.inspect.custom")]( @@ -428,18 +434,19 @@ class Layer< const newOptions = Object.assign({}, options, { depth: options.depth === null ? null : options.depth - 1, }); - return `${options.stylize(this.constructor.name, "special")} ${inspect( - { - methods: this.methods, - middleware: this.stack, - options: this.#opts, - paramNames: this.#paramNames.map((key) => key.name), - path: this.path, - regexp: this.#regexp, - }, - newOptions, - ) - }`; + return `${options.stylize(this.constructor.name, "special")} ${ + inspect( + { + methods: this.methods, + middleware: this.stack, + options: this.#opts, + paramNames: this.#paramNames.map((key) => key.name), + path: this.path, + regexp: this.#regexp, + }, + newOptions, + ) + }`; } } @@ -1369,7 +1376,10 @@ export class Router< P extends RouteParams = RouteParams, S extends State = RS, >( - pathOrMiddleware: string | string[] | RouterMiddlewareOrMiddlewareObject, + pathOrMiddleware: + | string + | string[] + | RouterMiddlewareOrMiddlewareObject, ...middleware: RouterMiddlewareOrMiddlewareObject[] ): Router { let path: string | string[] | undefined; @@ -1419,8 +1429,9 @@ export class Router< } [Symbol.for("Deno.customInspect")](inspect: (value: unknown) => string) { - return `${this.constructor.name} ${inspect({ "#params": this.#params, "#stack": this.#stack }) - }`; + return `${this.constructor.name} ${ + inspect({ "#params": this.#params, "#stack": this.#stack }) + }`; } [Symbol.for("nodejs.util.inspect.custom")]( @@ -1436,10 +1447,11 @@ export class Router< const newOptions = Object.assign({}, options, { depth: options.depth === null ? null : options.depth - 1, }); - return `${options.stylize(this.constructor.name, "special")} ${inspect( - { "#params": this.#params, "#stack": this.#stack }, - newOptions, - ) - }`; + return `${options.stylize(this.constructor.name, "special")} ${ + inspect( + { "#params": this.#params, "#stack": this.#stack }, + newOptions, + ) + }`; } }