From f56e2f9093f09c0b0815fce0ed6b788b8f5742ac Mon Sep 17 00:00:00 2001 From: Kevin Whitley Date: Sun, 14 Apr 2024 14:46:08 -0500 Subject: [PATCH] cleaned up global request type --- examples/types/additional-arguments.ts | 3 +- examples/types/generics-router-stages.ts | 33 +++++++++++++++ examples/types/ittyrouter-generics.ts | 51 ++++++++++++++++++++++++ src/IttyRouter.ts | 5 +-- src/types/IttyRouterType.ts | 19 +++++---- 5 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 examples/types/generics-router-stages.ts create mode 100644 examples/types/ittyrouter-generics.ts diff --git a/examples/types/additional-arguments.ts b/examples/types/additional-arguments.ts index f598d1c..16c72cf 100644 --- a/examples/types/additional-arguments.ts +++ b/examples/types/additional-arguments.ts @@ -23,13 +23,12 @@ router // before middleware .get('/', (request, env) => { request.user = 'kevin' // invalid (strict) - env.whatever = 123 // valid (any) env.age = 123 // valid }) // route-level overrides .get('/', (request, env) => { - request.foo = 'bar' // invalid + request.foo = 'bar' // valid env.whatever = 123 // invalid env.age = 123 // valid }) diff --git a/examples/types/generics-router-stages.ts b/examples/types/generics-router-stages.ts new file mode 100644 index 0000000..ac663cd --- /dev/null +++ b/examples/types/generics-router-stages.ts @@ -0,0 +1,33 @@ +import { error } from 'console' +import { Router } from '../../src/Router' +import { withParams } from '../../src/withParams' +import { IRequest, IRequestStrict, RequestHandler } from '../../src/types' + +// we define our environment +type Environment = { age: number } +type Pet = { name: string } + +// and now both args combined (that Workers send to the .fetch()) +type Args = [Environment] +type AlternativeArgs = [Pet] + +const router = Router({ + before: [ + (request, env) => { + env.age = 123 // valid + env.foo // invalid + request.foo // invalid + request.body // valid + }, + withParams, + ], + catch: error, + finally: [ + (response, request, env) => { + response.whatever // valid (any) + env.age = 123 // valid + env.foo // invalid + request.foo // invalid + }, + ] +}) diff --git a/examples/types/ittyrouter-generics.ts b/examples/types/ittyrouter-generics.ts new file mode 100644 index 0000000..c26c86b --- /dev/null +++ b/examples/types/ittyrouter-generics.ts @@ -0,0 +1,51 @@ +import { IttyRouter } from '../../src/IttyRouter' +import { IRequest, IRequestStrict, RequestHandler } from '../../src/types' + +// we define our environment +type Environment = { age: number } +type Pet = { name: string } + +// and now both args combined (that Workers send to the .fetch()) +type Args = [Environment] +type AlternativeArgs = [Pet] + +// creating some middleware that needs access to CF variables +export const withUser: RequestHandler = + (request, env) => { + request.user = 'Kevin' + env.age = 123 + env.name = 'Kevin' // invalid + } + +const router = IttyRouter() + +router + // before middleware + .get('/', (request, env) => { + request.user = 'kevin' // invalid (strict) + env.age = 123 // valid + }) + + // route-level overrides + .get('/', (request, env) => { + request.foo = 'bar' // valid + env.whatever = 123 // invalid + env.age = 123 // valid + }) + // route-level overrides + .get('/', (request, env) => { + request.foo = 'bar' // valid + env.age = 123 // invalid + env.name = 'Mittens' // valid + }) + + // after middleware + .get('/', withUser, (request, env) => { + request.user = 'Kevin' + env.age = 123 // valid + env.whatever = 123 // invalid + }) + + .get('/', (request, env) => { + env.age = 'foo' // invalid + }) diff --git a/src/IttyRouter.ts b/src/IttyRouter.ts index bbed2a3..31673fb 100644 --- a/src/IttyRouter.ts +++ b/src/IttyRouter.ts @@ -10,14 +10,13 @@ export const IttyRouter = < RequestType extends IRequest = IRequest, Args extends any[] = any[], ResponseType = any, - GlobalRequestType = RequestType, ->({ base = '', routes = [], ...other }: IttyRouterOptions = {}): IttyRouterType => +>({ base = '', routes = [], ...other }: IttyRouterOptions = {}): IttyRouterType => // @ts-ignore ({ __proto__: new Proxy({}, { // @ts-expect-error (we're adding an expected prop "path" to the get) get: (target: any, prop: string, receiver: object, path: string) => - (route: string, ...handlers: RequestHandler[]) => + (route: string, ...handlers: RequestHandler[]) => routes.push( [ prop.toUpperCase(), diff --git a/src/types/IttyRouterType.ts b/src/types/IttyRouterType.ts index ce5e4dc..621adcf 100644 --- a/src/types/IttyRouterType.ts +++ b/src/types/IttyRouterType.ts @@ -9,17 +9,16 @@ export type IttyRouterType< RequestType = IRequest, Args extends any[] = any[], ResponseType = any, - GlobalRequestType = RequestType, > = { __proto__: IttyRouterType routes: RouteEntry[] fetch: (request: RequestLike, ...extra: A) => Promise - all: Route - delete: Route - get: Route - head: Route - options: Route - patch: Route - post: Route - put: Route -} & CustomRoutes> & GenericTraps + all: Route + delete: Route + get: Route + head: Route + options: Route + patch: Route + post: Route + put: Route +} & CustomRoutes> & GenericTraps