kwhitley / itty-router

A little router.
MIT License
1.69k stars 77 forks source link

DRAFT: V5 types update #228

Closed kwhitley closed 3 months ago

kwhitley commented 3 months ago

What this is

I'm testing various scenarios of handler definition/usage, and ensuring that our current type system works as intended. This requires loosening the constraints on certain elements to allow custom-defined handlers to pass generic checks.

Scenario 1

import { AutoRouter } from '../src/AutoRouter'
import { IRequest, IRequestStrict, RequestHandler } from '../src/IttyRouter'
import { ResponseHandler } from '../src/Router'

type BenchmarkedRequest = {
  start: number
} & IRequestStrict

const withBenchmarking: RequestHandler<BenchmarkedRequest> = (request) => {
  request.start = Date.now()
}

const logger: ResponseHandler<Response, BenchmarkedRequest> = (response, request) => {
  console.log(response.status, request.url, 'served in', Date.now() - request.start, 'ms')
}

const router = AutoRouter({
  port: 3001,
  before: [withBenchmarking, () => {}],
  finally: [logger, () => {}],
})

router
  .get('/basic', () => new Response('Success!'))
  .get('/text', () => 'Success!')
  .get('/params/:foo', ({ foo }) => foo)
  .get('/json', () => ({ foo: 'bar' }))
  .get('/throw', (a) => a.b.c)

export default router