@@ -10,6 +10,7 @@ import type {
1010 EventHandlerResponse ,
1111 DynamicEventHandler ,
1212 EventHandlerWithFetch ,
13+ FetchableObject ,
1314} from "./types/handler.ts" ;
1415import type {
1516 InferOutput ,
@@ -130,14 +131,14 @@ function handlerWithFetch<
130131// --- dynamic event handler ---
131132
132133export function dynamicEventHandler (
133- initial ?: EventHandler ,
134+ initial ?: EventHandler | FetchableObject ,
134135) : DynamicEventHandler {
135- let current : EventHandler | undefined = initial ;
136+ let current : EventHandler | undefined = _toEventHandler ( initial ) ;
136137 return Object . assign (
137138 defineHandler ( ( event : H3Event ) => current ?.( event ) ) ,
138139 {
139- set : ( handler : EventHandler ) => {
140- current = handler ;
140+ set : ( handler : EventHandler | FetchableObject ) => {
141+ current = _toEventHandler ( handler ) ;
141142 } ,
142143 } ,
143144 ) ;
@@ -146,7 +147,10 @@ export function dynamicEventHandler(
146147// --- lazy event handler ---
147148
148149export function defineLazyEventHandler (
149- load : ( ) => Promise < EventHandler > | EventHandler ,
150+ load : ( ) =>
151+ | Promise < EventHandler | FetchableObject >
152+ | EventHandler
153+ | FetchableObject ,
150154) : EventHandlerWithFetch {
151155 let _promise : Promise < typeof _resolved > ;
152156 let _resolved : { handler : EventHandler } ;
@@ -157,14 +161,16 @@ export function defineLazyEventHandler(
157161 }
158162 if ( ! _promise ) {
159163 _promise = Promise . resolve ( load ( ) ) . then ( ( r : any ) => {
160- const handler = r . default || r ;
164+ let handler = r . default || r ;
161165 if ( typeof handler !== "function" ) {
162- throw new ( TypeError as any ) (
163- "Invalid lazy handler result. It should be a function:" ,
164- handler ,
165- ) ;
166+ const _fetchHandler = ( handler as FetchableObject ) . fetch ;
167+ if ( typeof _fetchHandler === "function" ) {
168+ handler = ( event : H3Event ) => _fetchHandler ( event . req ) ;
169+ } else {
170+ throw new TypeError ( "Invalid lazy handler: " + r ) ;
171+ }
166172 }
167- _resolved = { handler : r . default || r } ;
173+ _resolved = { handler } ;
168174 return _resolved ;
169175 } ) ;
170176 }
@@ -178,3 +184,16 @@ export function defineLazyEventHandler(
178184 return resolveHandler ( ) . then ( ( r ) => r . handler ( event ) ) ;
179185 } ) ;
180186}
187+
188+ // --- normalize ---
189+
190+ function _toEventHandler (
191+ handler : undefined | EventHandler | FetchableObject ,
192+ ) : EventHandler | undefined {
193+ if ( typeof handler === "function" ) {
194+ return handler ;
195+ }
196+ if ( typeof handler ?. fetch === "function" ) {
197+ return ( event : H3Event ) => handler . fetch ! ( event . req ) ;
198+ }
199+ }
0 commit comments