0
0
mirror of https://github.com/honojs/hono.git synced 2024-12-01 10:51:01 +00:00

refactor: shorten hono.ts (#162)

This commit is contained in:
Yusuke Wada 2022-04-21 03:32:20 +09:00 committed by GitHub
parent d4eb8071db
commit e288ac2983
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 45 additions and 65 deletions

View File

@ -1,9 +1,9 @@
import { Hono } from '../../dist' import { Hono } from '../../dist'
import { poweredBy } from '../../src/middleware/powered-by/powered-by' import { basicAuth } from '../../src/middleware/basic-auth'
import { logger } from '../../src/middleware/logger/logger' import { bodyParse } from '../../src/middleware/body-parse'
import { bodyParse } from '../../src/middleware/body-parse/body-parse'
import { basicAuth } from '../../src/middleware/basic-auth/basic-auth'
import { etag } from '../../src/middleware/etag/etag' import { etag } from '../../src/middleware/etag/etag'
import { logger } from '../../src/middleware/logger'
import { poweredBy } from '../../src/middleware/powered-by'
const app = new Hono() const app = new Hono()

View File

@ -1,5 +1,5 @@
import { app } from './index'
import type { Post } from './model' import type { Post } from './model'
import { app } from './index'
describe('Root', () => { describe('Root', () => {
it('GET /', async () => { it('GET /', async () => {

View File

@ -1,6 +1,6 @@
import { SHA256 } from 'crypto-js'
import { Hono } from 'hono' import { Hono } from 'hono'
import { basicAuth } from 'hono/basic-auth' import { basicAuth } from 'hono/basic-auth'
import { SHA256 } from 'crypto-js'
const app = new Hono() const app = new Hono()

View File

@ -1,8 +1,8 @@
import { Hono } from 'hono' import { Hono } from 'hono'
import Nano from 'nano-jsx' import Nano from 'nano-jsx'
import { render } from './renderer'
import { Page } from './pages/page' import { Page } from './pages/page'
import { Top } from './pages/top' import { Top } from './pages/top'
import { render } from './renderer'
const app = new Hono() const app = new Hono()

View File

@ -1,3 +1,4 @@
import type { Context } from '@/context'
import { Hono } from '@/hono' import { Hono } from '@/hono'
describe('GET Request', () => { describe('GET Request', () => {

View File

@ -17,7 +17,7 @@ declare global {
} }
export type Handler<RequestParamKeyType = string> = ( export type Handler<RequestParamKeyType = string> = (
c: Context<RequestParamKeyType>, c: Context<RequestParamKeyType | string>,
next?: Next next?: Next
) => Response | Promise<Response> ) => Response | Promise<Response>
export type MiddlewareHandler = (c: Context, next: Next) => Promise<void> export type MiddlewareHandler = (c: Context, next: Next) => Promise<void>
@ -38,7 +38,32 @@ type ParamKeys<Path> = Path extends `${infer Component}/${infer Rest}`
? ParamKey<Component> | ParamKeys<Rest> ? ParamKey<Component> | ParamKeys<Rest>
: ParamKey<Path> : ParamKey<Path>
export class Hono { function defineDynamicClass<T extends string[]>(
...methods: T
): {
new (): {
[K in T[number]]: <Path extends string>(path: Path, handler: Handler<ParamKeys<Path>>) => Hono
} & {
methods: T
}
} {
return class {
get methods() {
return methods
}
} as any
}
export class Hono extends defineDynamicClass(
'get',
'post',
'put',
'delete',
'head',
'options',
'patch',
'all'
) {
routerClass: { new (): Router<any> } = TrieRouter routerClass: { new (): Router<any> } = TrieRouter
strict: boolean = true // strict routing - default is true strict: boolean = true // strict routing - default is true
router: Router<Handler> router: Router<Handler>
@ -46,6 +71,14 @@ export class Hono {
tempPath: string tempPath: string
constructor(init: Partial<Pick<Hono, 'routerClass' | 'strict'>> = {}) { constructor(init: Partial<Pick<Hono, 'routerClass' | 'strict'>> = {}) {
super()
this.methods.map((method) => {
this[method] = <Path extends string>(path: Path, handler: Handler) => {
return this.addRoute(method, path, handler)
}
})
Object.assign(this, init) Object.assign(this, init)
this.router = new this.routerClass() this.router = new this.routerClass()
@ -64,56 +97,6 @@ export class Hono {
return c.text(message, 500) return c.text(message, 500)
} }
/* HTTP METHODS */
get<Path extends string>(path: Path, handler: Handler<ParamKeys<Path>>): Hono
get(path: string, handler: Handler<string>): Hono
get(path: string, handler: Handler): Hono {
return this.addRoute('get', path, handler)
}
post<Path extends string>(path: Path, handler: Handler<ParamKeys<Path>>): Hono
post(path: string, handler: Handler<string>): Hono
post(path: string, handler: Handler): Hono {
return this.addRoute('post', path, handler)
}
put<Path extends string>(path: Path, handler: Handler<ParamKeys<Path>>): Hono
put(path: string, handler: Handler<string>): Hono
put(path: string, handler: Handler): Hono {
return this.addRoute('put', path, handler)
}
head<Path extends string>(path: Path, handler: Handler<ParamKeys<Path>>): Hono
head(path: string, handler: Handler<string>): Hono
head(path: string, handler: Handler): Hono {
return this.addRoute('head', path, handler)
}
delete<Path extends string>(path: Path, handler: Handler<ParamKeys<Path>>): Hono
delete(path: string, handler: Handler<string>): Hono
delete(path: string, handler: Handler): Hono {
return this.addRoute('delete', path, handler)
}
options<Path extends string>(path: Path, handler: Handler<ParamKeys<Path>>): Hono
options(path: string, handler: Handler<string>): Hono
options(path: string, handler: Handler): Hono {
return this.addRoute('options', path, handler)
}
patch<Path extends string>(path: Path, handler: Handler<ParamKeys<Path>>): Hono
patch(path: string, handler: Handler<string>): Hono
patch(path: string, handler: Handler): Hono {
return this.addRoute('patch', path, handler)
}
/* Any methods */
all<Path extends string>(path: Path, handler: Handler<ParamKeys<Path>>): Hono
all(path: string, handler: Handler<string>): Hono
all(path: string, handler: Handler): Hono {
return this.addRoute('all', path, handler)
}
route(path: string): Hono { route(path: string): Hono {
const newHono: Hono = new Hono() const newHono: Hono = new Hono()
newHono.tempPath = path newHono.tempPath = path
@ -162,9 +145,7 @@ export class Hono {
// Methods for Request object // Methods for Request object
request.param = (key: string): string => { request.param = (key: string): string => {
if (result) { if (result) return result.params[key]
return result.params[key]
}
} }
request.header = (name: string): string => { request.header = (name: string): string => {
return request.headers.get(name) return request.headers.get(name)
@ -180,9 +161,7 @@ export class Hono {
for (const mr of this.middlewareRouters) { for (const mr of this.middlewareRouters) {
const mwResult = mr.match(METHOD_NAME_OF_ALL, path) const mwResult = mr.match(METHOD_NAME_OF_ALL, path)
if (mwResult) { if (mwResult) middleware.push(mwResult.handler)
middleware.push(mwResult.handler)
}
} }
const wrappedHandler = async (context: Context, next: Next) => { const wrappedHandler = async (context: Context, next: Next) => {