diff --git a/apps/example-todo-app/src/lib/middlewares/with-auth-token-edge.ts b/apps/example-todo-app/src/lib/middlewares/with-auth-token-edge.ts index 069f8b3df..83bbd109f 100644 --- a/apps/example-todo-app/src/lib/middlewares/with-auth-token-edge.ts +++ b/apps/example-todo-app/src/lib/middlewares/with-auth-token-edge.ts @@ -1,7 +1,8 @@ -import { UnauthorizedException, MiddlewareEdge } from "nextlove" +import { UnauthorizedException, Middleware } from "nextlove" import { NextloveRequest, NextloveResponse } from "nextlove/dist/edge-helpers" -export const withAuthTokenEdge: MiddlewareEdge = (next) => async (req, res) => { +> = (next) => async (req, res) => { if (req.headers.authorization?.split("Bearer ")?.[1] !== "auth_token") { throw new UnauthorizedException({ type: "unauthorized", diff --git a/packages/nextlove/src/index.ts b/packages/nextlove/src/index.ts index 17fffb11c..d541fa7ae 100644 --- a/packages/nextlove/src/index.ts +++ b/packages/nextlove/src/index.ts @@ -5,6 +5,5 @@ export * from "./with-route-spec" export * from "./with-route-spec-edge" export * from "./http-exceptions" export * from "./types-edge" -export * from "./wrappers-edge" -export * from "./wrappers-nodejs" +export * from "./wrappers" diff --git a/packages/nextlove/src/types-edge/index.ts b/packages/nextlove/src/types-edge/index.ts index 7b57a46dc..19469e507 100644 --- a/packages/nextlove/src/types-edge/index.ts +++ b/packages/nextlove/src/types-edge/index.ts @@ -2,7 +2,8 @@ import { z } from "zod" import { SecuritySchemeObject } from "openapi3-ts" import { NextloveRequest, NextloveResponse } from "../edge-helpers" import { NextResponse } from "next/server" -import { MiddlewareEdge } from "../wrappers-edge" +import { Middleware } from "../wrappers" +import { MiddlewareChainOutput } from "../types" type ParamDef = z.ZodTypeAny | z.ZodEffects @@ -13,7 +14,7 @@ export interface RouteSpecEdge< JsonBody extends ParamDef = z.ZodObject, QueryParams extends ParamDef = z.ZodObject, CommonParams extends ParamDef = z.ZodObject, - Middlewares extends readonly MiddlewareEdge[] = any[], + Middlewares extends readonly Middleware[] = any[], JsonResponse extends ParamDef = z.ZodObject, FormData extends ParamDef = z.ZodTypeAny > { @@ -28,26 +29,13 @@ export interface RouteSpecEdge< formData?: FormData } -export type MiddlewareEdgeChainOutput< - MWChain extends readonly MiddlewareEdge[] -> = MWChain extends readonly [] - ? {} - : MWChain extends readonly [infer First, ...infer Rest] - ? First extends MiddlewareEdge - ? T & - (Rest extends readonly MiddlewareEdge[] - ? MiddlewareEdgeChainOutput - : never) - : never - : never - export type AuthMiddlewaresEdge = { - [auth_type: string]: MiddlewareEdge + [auth_type: string]: Middleware } export interface SetupParamsEdge< AuthMW extends AuthMiddlewaresEdge = AuthMiddlewaresEdge, - GlobalMW extends MiddlewareEdge[] = any[] + GlobalMW extends Middleware[] = any[] > { authMiddlewareMap: AuthMW globalMiddlewares: GlobalMW @@ -98,7 +86,7 @@ export type RouteEdgeFunction< RS extends RouteSpecEdge > = ( req: (SP["authMiddlewareMap"] & - typeof defaultMiddlewareMap)[RS["auth"]] extends MiddlewareEdge< + typeof defaultMiddlewareMap)[RS["auth"]] extends Middleware< any, any, infer AuthMWOut, @@ -106,8 +94,8 @@ export type RouteEdgeFunction< > ? Omit & AuthMWOut & - MiddlewareEdgeChainOutput< - RS["middlewares"] extends readonly MiddlewareEdge[] + MiddlewareChainOutput< + RS["middlewares"] extends readonly Middleware[] ? [...SP["globalMiddlewares"], ...RS["middlewares"]] : SP["globalMiddlewares"] > & { diff --git a/packages/nextlove/src/types/index.ts b/packages/nextlove/src/types/index.ts index 320c3a6bf..3ab7b25f6 100644 --- a/packages/nextlove/src/types/index.ts +++ b/packages/nextlove/src/types/index.ts @@ -2,7 +2,7 @@ import { NextApiResponse, NextApiRequest } from "next" import { z } from "zod" import { HTTPMethods } from "../with-route-spec/middlewares/with-methods" import { SecuritySchemeObject } from "openapi3-ts" -import { Middleware } from "../wrappers-nodejs" +import { Middleware } from "../wrappers" type ParamDef = z.ZodTypeAny | z.ZodEffects @@ -12,7 +12,7 @@ export interface RouteSpec< JsonBody extends ParamDef = z.ZodObject, QueryParams extends ParamDef = z.ZodObject, CommonParams extends ParamDef = z.ZodObject, - Middlewares extends readonly Middleware[] = any[], + Middlewares extends readonly Middleware[] = any[], JsonResponse extends ParamDef = z.ZodObject, FormData extends ParamDef = z.ZodTypeAny > { @@ -27,25 +27,25 @@ export interface RouteSpec< } export type MiddlewareChainOutput< - MWChain extends readonly Middleware[] + MWChain extends readonly Middleware[] > = MWChain extends readonly [] ? {} : MWChain extends readonly [infer First, ...infer Rest] - ? First extends Middleware + ? First extends Middleware ? T & - (Rest extends readonly Middleware[] + (Rest extends readonly Middleware[] ? MiddlewareChainOutput : never) : never : never export type AuthMiddlewares = { - [auth_type: string]: Middleware + [auth_type: string]: Middleware } export interface SetupParams< AuthMW extends AuthMiddlewares = AuthMiddlewares, - GlobalMW extends Middleware[] = any[] + GlobalMW extends Middleware[] = any[] > { authMiddlewareMap: AuthMW globalMiddlewares: GlobalMW @@ -94,13 +94,15 @@ export type RouteFunction< > = ( req: (SP["authMiddlewareMap"] & typeof defaultMiddlewareMap)[RS["auth"]] extends Middleware< + any, + any, infer AuthMWOut, any > ? Omit & AuthMWOut & MiddlewareChainOutput< - RS["middlewares"] extends readonly Middleware[] + RS["middlewares"] extends readonly Middleware[] ? [...SP["globalMiddlewares"], ...RS["middlewares"]] : SP["globalMiddlewares"] > & { diff --git a/packages/nextlove/src/with-route-spec-edge/index.ts b/packages/nextlove/src/with-route-spec-edge/index.ts index 559fa91df..2b818149c 100644 --- a/packages/nextlove/src/with-route-spec-edge/index.ts +++ b/packages/nextlove/src/with-route-spec-edge/index.ts @@ -1,4 +1,4 @@ -import { wrappersEdge } from "../wrappers-edge" +import { wrappers } from "../wrappers" import { withValidationEdge } from "./with-validation-edge" import { NextloveRequest, NextloveResponse, getResponse } from "../edge-helpers" import { CreateWithRouteSpecEdgeFunction, RouteSpecEdge } from "../types-edge" @@ -42,7 +42,7 @@ export const createWithRouteSpecEdge: CreateWithRouteSpecEdgeFunction = (( const auth_middleware = authMiddlewareMap[spec.auth] if (!auth_middleware) throw new Error(`Unknown auth type: ${spec.auth}`) - return wrappersEdge< + return wrappers< NextloveRequest, NextloveResponse, NextloveRequest, diff --git a/packages/nextlove/src/with-route-spec/index.ts b/packages/nextlove/src/with-route-spec/index.ts index b5cd3bc4c..58ae8cb84 100644 --- a/packages/nextlove/src/with-route-spec/index.ts +++ b/packages/nextlove/src/with-route-spec/index.ts @@ -1,6 +1,6 @@ import { NextApiResponse, NextApiRequest } from "next" import { withExceptionHandling } from "../exceptions-middleware-nodejs" -import wrappers, { Middleware } from "../wrappers-nodejs" +import { Middleware, wrappers } from "../wrappers" import { CreateWithRouteSpecFunction, RouteSpec } from "../types" import withMethods, { HTTPMethods } from "./middlewares/with-methods" import withValidation from "./middlewares/with-validation" @@ -14,7 +14,9 @@ export const checkRouteSpec = < JsonBody extends ParamDef = z.ZodTypeAny, QueryParams extends ParamDef = z.ZodTypeAny, CommonParams extends ParamDef = z.ZodTypeAny, - Middlewares extends readonly Middleware[] = readonly Middleware< + Middlewares extends readonly Middleware[] = readonly Middleware< + any, + any, any, any >[], diff --git a/packages/nextlove/src/wrappers-nodejs.ts b/packages/nextlove/src/wrappers-nodejs.ts deleted file mode 100644 index 0f80496fd..000000000 --- a/packages/nextlove/src/wrappers-nodejs.ts +++ /dev/null @@ -1,327 +0,0 @@ -import type { NextApiRequest as Req, NextApiResponse as Res } from "next" -/* - -Wraps a function in layers of other functions, while preserving the input/output -type. The output of wrappers will always have the type of it's last parameter -(the wrapped function) - -This function turns this type of composition... - -logger.withContext("somecontext")( - async (a, b) => { - return a - } -) - -Into... - -wrappers( - logger.withContext("somecontext"), - async (a, b) => { - return a - } -) - -Having this as a utility method helps preserve types, which otherwise can get -messed up by the middlewares. It also can make the code cleaner where there are -multiple wrappers. - -## EXAMPLES - -In the context of request middleware you might write something like this... - -const withRequestLoggingMiddleware = (next) => async (req, res) => { - console.log(`GOT REQUEST ${req.method} ${req.path}`) - return next(req, res) -} - -Here's an example of a wrapper that takes some parameters... - -const withLoggedArguments = - (logPrefix: string) => - (next) => - async (...funcArgs) => { - console.log(logPrefix, ...funcArgs) - return next(...funcArgs) - } - -*/ - -export type Middleware = ( - next: (req: Req & Dep & T, res: Res) => any -) => (req: Req & Dep & T, res: Res) => any - -// Safer Middleware requires the use of extendRequest to ensure that the -// new context (T) was actually added to the request. It's kind of annoying -// to use in practice, so we don't use it for our Wrappers (yet) -export type SaferMiddleware = ( - next: (req: Req & Dep & T, res: Res) => any -) => (req: Req & Dep, res: Res) => any - -export const extendRequest = >(req: T, merge: K): T & K => { - for (const [key, v] of Object.entries(merge)) { - ;(req as any)[key] = v - } - return req as any -} - -type Wrappers1 = ( - mw1: Middleware, - endpoint: (req: Req & Mw1RequestContext, res: Res) => any -) => (req: Req, res: Res) => any - -type Wrappers2 = < - Mw1RequestContext extends Mw2Dep, - Mw1Dep, - Mw2RequestContext, - Mw2Dep ->( - mw1: Middleware, - mw2: Middleware, - endpoint: (req: Req & Mw1RequestContext & Mw2RequestContext, res: Res) => any -) => (req: Req, res: Res) => any - -// TODO figure out how to do a recursive definition, or one that simplifies -// these redundant wrappers - -type Wrappers3 = < - Mw1RequestContext extends Mw2Dep, - Mw1Dep, - Mw2RequestContext, - Mw2Dep, - Mw3RequestContext, - Mw3Dep ->( - mw1: Middleware, - mw2: Middleware, - mw3: Middleware< - Mw3RequestContext, - Mw1RequestContext & Mw2RequestContext extends Mw3Dep ? Mw3Dep : never - >, - endpoint: ( - req: Req & Mw1RequestContext & Mw2RequestContext & Mw3RequestContext, - res: Res - ) => any -) => (req: Req, res: Res) => any - -type Wrappers4 = < - Mw1RequestContext extends Mw2Dep, - Mw1Dep, - Mw2RequestContext, - Mw2Dep, - Mw3RequestContext, - Mw3Dep, - Mw4RequestContext, - Mw4Dep ->( - mw1: Middleware, - mw2: Middleware, - mw3: Middleware< - Mw3RequestContext, - Mw1RequestContext & Mw2RequestContext extends Mw3Dep ? Mw3Dep : never - >, - mw4: Middleware< - Mw4RequestContext, - Mw1RequestContext & Mw2RequestContext & Mw3RequestContext extends Mw4Dep - ? Mw4Dep - : never - >, - endpoint: ( - req: Req & Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext, - res: Res - ) => any -) => (req: Req, res: Res) => any - -type Wrappers5 = < - Mw1RequestContext extends Mw2Dep, - Mw1Dep, - Mw2RequestContext, - Mw2Dep, - Mw3RequestContext, - Mw3Dep, - Mw4RequestContext, - Mw4Dep, - Mw5RequestContext, - Mw5Dep ->( - mw1: Middleware, - mw2: Middleware, - mw3: Middleware< - Mw3RequestContext, - Mw1RequestContext & Mw2RequestContext extends Mw3Dep ? Mw3Dep : never - >, - mw4: Middleware< - Mw4RequestContext, - Mw1RequestContext & Mw2RequestContext & Mw3RequestContext extends Mw4Dep - ? Mw4Dep - : never - >, - mw5: Middleware< - Mw5RequestContext, - Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext extends Mw5Dep - ? Mw5Dep - : never - >, - endpoint: ( - req: Req & Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext & - Mw5RequestContext, - res: Res - ) => any -) => (req: Req, res: Res) => any - -type Wrappers6 = < - Mw1RequestContext extends Mw2Dep, - Mw1Dep, - Mw2RequestContext, - Mw2Dep, - Mw3RequestContext, - Mw3Dep, - Mw4RequestContext, - Mw4Dep, - Mw5RequestContext, - Mw5Dep, - Mw6RequestContext, - Mw6Dep ->( - mw1: Middleware, - mw2: Middleware, - mw3: Middleware< - Mw3RequestContext, - Mw1RequestContext & Mw2RequestContext extends Mw3Dep ? Mw3Dep : never - >, - mw4: Middleware< - Mw4RequestContext, - Mw1RequestContext & Mw2RequestContext & Mw3RequestContext extends Mw4Dep - ? Mw4Dep - : never - >, - mw5: Middleware< - Mw5RequestContext, - Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext extends Mw5Dep - ? Mw5Dep - : never - >, - mw6: Middleware< - Mw6RequestContext, - Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext & - Mw5RequestContext extends Mw6Dep - ? Mw6Dep - : never - >, - endpoint: ( - req: Req & Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext & - Mw5RequestContext & - Mw6RequestContext, - res: Res - ) => any -) => (req: Req, res: Res) => any - -type Wrappers7 = < - Mw1RequestContext extends Mw2Dep, - Mw1Dep, - Mw2RequestContext, - Mw2Dep, - Mw3RequestContext, - Mw3Dep, - Mw4RequestContext, - Mw4Dep, - Mw5RequestContext, - Mw5Dep, - Mw6RequestContext, - Mw6Dep, - Mw7RequestContext, - Mw7Dep ->( - mw1: Middleware, - mw2: Middleware, - mw3: Middleware< - Mw3RequestContext, - Mw1RequestContext & Mw2RequestContext extends Mw3Dep ? Mw3Dep : never - >, - mw4: Middleware< - Mw4RequestContext, - Mw1RequestContext & Mw2RequestContext & Mw3RequestContext extends Mw4Dep - ? Mw4Dep - : never - >, - mw5: Middleware< - Mw5RequestContext, - Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext extends Mw5Dep - ? Mw5Dep - : never - >, - mw6: Middleware< - Mw6RequestContext, - Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext & - Mw5RequestContext extends Mw6Dep - ? Mw6Dep - : never - >, - mw7: Middleware< - Mw7RequestContext, - Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext & - Mw5RequestContext & - Mw6RequestContext extends Mw7Dep - ? Mw7Dep - : never - >, - endpoint: ( - req: Req & Mw1RequestContext & - Mw2RequestContext & - Mw3RequestContext & - Mw4RequestContext & - Mw5RequestContext & - Mw6RequestContext & - Mw7RequestContext, - res: Res - ) => any -) => (req: Req, res: Res) => any - -type Wrappers = Wrappers1 & - Wrappers2 & - Wrappers3 & - Wrappers4 & - Wrappers5 & - Wrappers6 & - Wrappers7 - -export const wrappers: Wrappers = (...wrappersArgs: any[]) => { - const wrappedFunction = wrappersArgs[wrappersArgs.length - 1] - const mws = wrappersArgs.slice(0, -1) - - let lastWrappedFunction = wrappedFunction - for (let i = mws.length - 1; i >= 0; i--) { - lastWrappedFunction = (mws[i] as any)(lastWrappedFunction) - } - - return lastWrappedFunction -} - -export default wrappers \ No newline at end of file diff --git a/packages/nextlove/src/wrappers-edge.ts b/packages/nextlove/src/wrappers.ts similarity index 80% rename from packages/nextlove/src/wrappers-edge.ts rename to packages/nextlove/src/wrappers.ts index bda93e8c1..91db1bf10 100644 --- a/packages/nextlove/src/wrappers-edge.ts +++ b/packages/nextlove/src/wrappers.ts @@ -47,7 +47,7 @@ const withLoggedArguments = */ -export type MiddlewareEdge = ( +export type Middleware = ( next: (req: Req & Dep & T, res: Res) => any ) => (req: Req & Dep & T, res: Res) => any @@ -58,7 +58,7 @@ export type SaferMiddlewareEgde = ( next: (req: Req & Dep & T, res: Res) => any ) => (req: Req & Dep, res: Res) => any -export const extendRequestEdge = < +export const extendRequest = < Req, Res, T extends Req, @@ -73,12 +73,12 @@ export const extendRequestEdge = < return req as any } -type WrappersEdge1 = ( - mw1: MiddlewareEdge, +type Wrappers1 = ( + mw1: Middleware, endpoint: (req: Req & Mw1RequestContext, res: Res) => any ) => (req: Req, res: Res) => any -type WrappersEdge2 = < +type Wrappers2 = < Req, Res, Mw1RequestContext extends Mw2Dep, @@ -86,15 +86,15 @@ type WrappersEdge2 = < Mw2RequestContext, Mw2Dep >( - mw1: MiddlewareEdge, - mw2: MiddlewareEdge, + mw1: Middleware, + mw2: Middleware, endpoint: (req: Req & Mw1RequestContext & Mw2RequestContext, res: Res) => any ) => (req: Req, res: Res) => any // TODO figure out how to do a recursive definition, or one that simplifies -// these redundant WrappersEdge +// these redundant Wrappers -type WrappersEdge3 = < +type Wrappers3 = < Req, Res, Mw1RequestContext extends Mw2Dep, @@ -104,9 +104,9 @@ type WrappersEdge3 = < Mw3RequestContext, Mw3Dep >( - mw1: MiddlewareEdge, - mw2: MiddlewareEdge, - mw3: MiddlewareEdge< + mw1: Middleware, + mw2: Middleware, + mw3: Middleware< Req, Res, Mw3RequestContext, @@ -118,7 +118,7 @@ type WrappersEdge3 = < ) => any ) => (req: Req, res: Res) => any -type WrappersEdge4 = < +type Wrappers4 = < Req, Res, Mw1RequestContext extends Mw2Dep, @@ -130,15 +130,15 @@ type WrappersEdge4 = < Mw4RequestContext, Mw4Dep >( - mw1: MiddlewareEdge, - mw2: MiddlewareEdge, - mw3: MiddlewareEdge< + mw1: Middleware, + mw2: Middleware, + mw3: Middleware< Req, Res, Mw3RequestContext, Mw1RequestContext & Mw2RequestContext extends Mw3Dep ? Mw3Dep : never >, - mw4: MiddlewareEdge< + mw4: Middleware< Req, Res, Mw4RequestContext, @@ -156,7 +156,7 @@ type WrappersEdge4 = < ) => any ) => (req: Req, res: Res) => any -type WrappersEdge5 = < +type Wrappers5 = < Req, Res, Mw1RequestContext extends Mw2Dep, @@ -170,15 +170,15 @@ type WrappersEdge5 = < Mw5RequestContext, Mw5Dep >( - mw1: MiddlewareEdge, - mw2: MiddlewareEdge, - mw3: MiddlewareEdge< + mw1: Middleware, + mw2: Middleware, + mw3: Middleware< Req, Res, Mw3RequestContext, Mw1RequestContext & Mw2RequestContext extends Mw3Dep ? Mw3Dep : never >, - mw4: MiddlewareEdge< + mw4: Middleware< Req, Res, Mw4RequestContext, @@ -186,7 +186,7 @@ type WrappersEdge5 = < ? Mw4Dep : never >, - mw5: MiddlewareEdge< + mw5: Middleware< Req, Res, Mw5RequestContext, @@ -208,7 +208,7 @@ type WrappersEdge5 = < ) => any ) => (req: Req, res: Res) => any -type WrappersEdge6 = < +type Wrappers6 = < Req, Res, Mw1RequestContext extends Mw2Dep, @@ -224,15 +224,15 @@ type WrappersEdge6 = < Mw6RequestContext, Mw6Dep >( - mw1: MiddlewareEdge, - mw2: MiddlewareEdge, - mw3: MiddlewareEdge< + mw1: Middleware, + mw2: Middleware, + mw3: Middleware< Req, Res, Mw3RequestContext, Mw1RequestContext & Mw2RequestContext extends Mw3Dep ? Mw3Dep : never >, - mw4: MiddlewareEdge< + mw4: Middleware< Req, Res, Mw4RequestContext, @@ -240,7 +240,7 @@ type WrappersEdge6 = < ? Mw4Dep : never >, - mw5: MiddlewareEdge< + mw5: Middleware< Req, Res, Mw5RequestContext, @@ -251,7 +251,7 @@ type WrappersEdge6 = < ? Mw5Dep : never >, - mw6: MiddlewareEdge< + mw6: Middleware< Req, Res, Mw6RequestContext, @@ -275,7 +275,7 @@ type WrappersEdge6 = < ) => any ) => (req: Req, res: Res) => any -type WrappersEdge7 = < +type Wrappers7 = < Req, Res, Mw1RequestContext extends Mw2Dep, @@ -293,15 +293,15 @@ type WrappersEdge7 = < Mw7RequestContext, Mw7Dep >( - mw1: MiddlewareEdge, - mw2: MiddlewareEdge, - mw3: MiddlewareEdge< + mw1: Middleware, + mw2: Middleware, + mw3: Middleware< Req, Res, Mw3RequestContext, Mw1RequestContext & Mw2RequestContext extends Mw3Dep ? Mw3Dep : never >, - mw4: MiddlewareEdge< + mw4: Middleware< Req, Res, Mw4RequestContext, @@ -309,7 +309,7 @@ type WrappersEdge7 = < ? Mw4Dep : never >, - mw5: MiddlewareEdge< + mw5: Middleware< Req, Res, Mw5RequestContext, @@ -320,7 +320,7 @@ type WrappersEdge7 = < ? Mw5Dep : never >, - mw6: MiddlewareEdge< + mw6: Middleware< Req, Res, Mw6RequestContext, @@ -332,7 +332,7 @@ type WrappersEdge7 = < ? Mw6Dep : never >, - mw7: MiddlewareEdge< + mw7: Middleware< Req, Res, Mw7RequestContext, @@ -358,15 +358,15 @@ type WrappersEdge7 = < ) => any ) => (req: Req, res: Res) => any -type WrappersEdge = WrappersEdge1 & - WrappersEdge2 & - WrappersEdge3 & - WrappersEdge4 & - WrappersEdge5 & - WrappersEdge6 & - WrappersEdge7 +type Wrappers = Wrappers1 & + Wrappers2 & + Wrappers3 & + Wrappers4 & + Wrappers5 & + Wrappers6 & + Wrappers7 -export const wrappersEdge: WrappersEdge = (...wrappersArgs: any[]) => { +export const wrappers: Wrappers = (...wrappersArgs: any[]) => { const wrappedFunction = wrappersArgs[wrappersArgs.length - 1] const mws = wrappersArgs.slice(0, -1) diff --git a/packages/nextlove/tests/route-spec-types.ts b/packages/nextlove/tests/route-spec-types.ts index 66a55d454..df6c5bf6a 100644 --- a/packages/nextlove/tests/route-spec-types.ts +++ b/packages/nextlove/tests/route-spec-types.ts @@ -7,38 +7,53 @@ import { } from "../src" import { expectTypeOf } from "expect-type" import { z } from "zod" +import { NextApiRequest, NextApiResponse } from "next" -const authTokenMiddleware: Middleware<{ - auth: { - authorized_by: "auth_token" +const authTokenMiddleware: Middleware< + NextApiRequest, + NextApiResponse, + { + auth: { + authorized_by: "auth_token" + } } -}> = (next) => (req, res) => { +> = (next) => (req, res) => { req.auth = { authorized_by: "auth_token", } return next(req, res) } -const bearerMiddleware: Middleware<{ - auth: { - authorized_by: "bearer" +const bearerMiddleware: Middleware< + NextApiRequest, + NextApiResponse, + { + auth: { + authorized_by: "bearer" + } } -}> = (next) => (req, res) => { +> = (next) => (req, res) => { req.auth = { authorized_by: "bearer", } return next(req, res) } -const dbMiddleware: Middleware<{ - db: { - client: any +const dbMiddleware: Middleware< + NextApiRequest, + NextApiResponse, + { + db: { + client: any + } } -}> = (next) => (req, res) => { +> = (next) => (req, res) => { req.db = { client: "..." } return next(req, res) } const userMiddleware: Middleware< + NextApiRequest, + NextApiResponse, { user: { user_id: string @@ -176,13 +191,13 @@ export const myRoute7Spec = { export const myRoute7 = withRouteSpec(myRoute7Spec)(async (req, res) => { const sucessfulApiResponse200 = res.status(200) - expectTypeOf(sucessfulApiResponse200.json).toMatchTypeOf<(body: { - ok: boolean - }) => void>() + expectTypeOf(sucessfulApiResponse200.json).toMatchTypeOf< + (body: { ok: boolean }) => void + >() const sucessfulApiResponse201 = res.status(201) - expectTypeOf(sucessfulApiResponse201.json).toMatchTypeOf<(body: { - ok: boolean - }) => void>() + expectTypeOf(sucessfulApiResponse201.json).toMatchTypeOf< + (body: { ok: boolean }) => void + >() const errorApiResponse400 = res.status(400) expectTypeOf(errorApiResponse400.json).toMatchTypeOf<(body: any) => void>() }) \ No newline at end of file