@@ -3,7 +3,7 @@ import { H3Event } from "./event.ts";
33import { toResponse , kNotFound } from "./response.ts" ;
44import { callMiddleware , normalizeMiddleware } from "./middleware.ts" ;
55
6- import type { RouterContext } from "rou3" ;
6+ import type { RouterContext , MatchedRoute } from "rou3" ;
77import type {
88 FetchHandler ,
99 H3Config ,
@@ -22,15 +22,15 @@ import type {
2222} from "./types/h3.ts" ;
2323import type { ServerRequest } from "srvx" ;
2424
25- export type H3 = H3Type ;
26-
27- export const H3 = /* @__PURE__ */ ( ( ) => {
25+ export const H3Core = /* @__PURE__ */ ( ( ) => {
2826 // prettier-ignore
2927 const HTTPMethods = [ "GET" , "POST" , "PUT" , "DELETE" , "PATCH" , "HEAD" , "OPTIONS" , "CONNECT" , "TRACE" ] as const ;
3028
31- class H3 implements Omit < H3Type , Lowercase < ( typeof HTTPMethods ) [ number ] > > {
29+ class H3Core
30+ implements Omit < H3Type , Lowercase < ( typeof HTTPMethods ) [ number ] > >
31+ {
3232 _middleware : Middleware [ ] ;
33- _routes ?: RouterContext < H3Route > ;
33+ _routes : H3Route [ ] = [ ] ;
3434
3535 readonly config : H3Config ;
3636
@@ -90,10 +90,14 @@ export const H3 = /* @__PURE__ */ (() => {
9090 return this as unknown as H3Type ;
9191 }
9292
93+ _findRoute ( _event : H3Event ) : MatchedRoute < H3Route > | void { }
94+
95+ _addRoute ( _route : H3Route ) : void {
96+ this . _routes . push ( _route ) ;
97+ }
98+
9399 handler ( event : H3Event ) : unknown | Promise < unknown > {
94- const route = this . _routes
95- ? findRoute ( this . _routes , event . req . method , event . url . pathname )
96- : undefined ;
100+ const route = this . _findRoute ( event ) ;
97101 if ( route ) {
98102 event . context . params = route . params ;
99103 event . context . matchedRoute = route . data ;
@@ -126,9 +130,6 @@ export const H3 = /* @__PURE__ */ (() => {
126130 handler : RouteHandler ,
127131 opts ?: RouteOptions ,
128132 ) : H3Type {
129- if ( ! this . _routes ) {
130- this . _routes = createRouter ( ) ;
131- }
132133 const _method = ( method || "" ) . toUpperCase ( ) ;
133134 let _handler : EventHandler ;
134135 let meta : H3RouteMeta | undefined = opts ?. meta ;
@@ -139,13 +140,13 @@ export const H3 = /* @__PURE__ */ (() => {
139140 meta = { ...( handler as EventHandler ) . meta , ...meta } ;
140141 }
141142 route = new URL ( route , "h://_" ) . pathname ;
142- addRoute ( this . _routes , _method , route , {
143+ this . _addRoute ( {
143144 method : _method as HTTPMethod ,
144145 route,
145146 handler : _handler ,
146147 middleware : opts ?. middleware ,
147148 meta,
148- } satisfies H3Route ) ;
149+ } ) ;
149150 return this as unknown as H3Type ;
150151 }
151152
@@ -162,14 +163,17 @@ export const H3 = /* @__PURE__ */ (() => {
162163 opts = arg2 as MiddlewareOptions ;
163164 }
164165 this . _middleware . push (
165- normalizeMiddleware ( fn , route ? { ...opts , route } : opts ) ,
166+ normalizeMiddleware (
167+ fn as Middleware ,
168+ route ? { ...opts , route } : opts ,
169+ ) ,
166170 ) ;
167171 return this as unknown as H3Type ;
168172 }
169173 }
170174
171175 for ( const method of HTTPMethods ) {
172- ( H3 as any ) . prototype [ method . toLowerCase ( ) ] = function (
176+ ( H3Core as any ) . prototype [ method . toLowerCase ( ) ] = function (
173177 this : H3Type ,
174178 route : string ,
175179 handler : EventHandler | H3Type ,
@@ -179,8 +183,29 @@ export const H3 = /* @__PURE__ */ (() => {
179183 } ;
180184 }
181185
182- return H3 ;
183- } ) ( ) as unknown as typeof H3Type ;
186+ return H3Core ;
187+ } ) ( ) as unknown as { new ( config ?: H3Config ) : H3Type } ;
188+
189+ export class H3 extends H3Core {
190+ /**
191+ * @internal
192+ */
193+ _rou3 : RouterContext < H3Route > ;
194+
195+ constructor ( config : H3Config = { } ) {
196+ super ( config ) ;
197+ this . _rou3 = createRouter ( ) ;
198+ }
199+
200+ override _findRoute ( _event : H3Event ) : MatchedRoute < H3Route > | void {
201+ return findRoute ( this . _rou3 , _event . req . method , _event . url . pathname ) ;
202+ }
203+
204+ override _addRoute ( _route : H3Route ) : void {
205+ addRoute ( this . _rou3 , _route . method , _route . route ! , _route ) ;
206+ super . _addRoute ( _route ) ;
207+ }
208+ }
184209
185210export function toRequest (
186211 _request : ServerRequest | URL | string ,
0 commit comments