@@ -6,7 +6,7 @@ import type { RouteRecord } from "../framework/core/route.ts";
6
6
import log , { LevelName } from "../lib/log.ts" ;
7
7
import { getContentType } from "../lib/mime.ts" ;
8
8
import util from "../lib/util.ts" ;
9
- import { errorHtml } from "./error.ts" ;
9
+ import { ErrorCallback , generateErrorHtml } from "./error.ts" ;
10
10
import { DependencyGraph } from "./graph.ts" ;
11
11
import { getDeploymentId , initModuleLoaders , loadImportMap , loadJSXConfig , regFullVersion } from "./helpers.ts" ;
12
12
import { type HTMLRewriterHandlers , loadAndFixIndexHtml } from "./html.ts" ;
@@ -24,13 +24,7 @@ export type ServerOptions = Omit<ServeInit, "onError"> & {
24
24
middlewares ?: Middleware [ ] ;
25
25
fetch ?: FetchHandler ;
26
26
ssr ?: SSR ;
27
- onError ?: (
28
- error : unknown ,
29
- cause : {
30
- by : "route-api" | "ssr" | "transplie" | "fs" | "middleware" ;
31
- url : string ;
32
- } ,
33
- ) => Response | void ;
27
+ onError ?: ErrorCallback ;
34
28
} & AlephConfig ;
35
29
36
30
export const serve = ( options : ServerOptions = { } ) => {
@@ -73,7 +67,7 @@ export const serve = (options: ServerOptions = {}) => {
73
67
if ( ! ( err instanceof Deno . errors . NotFound ) ) {
74
68
log . error ( err ) ;
75
69
return onError ?.( err , { by : "transplie" , url : req . url } ) ??
76
- new Response ( errorHtml ( err . stack ?? err . message ) , {
70
+ new Response ( generateErrorHtml ( err . stack ?? err . message ) , {
77
71
status : 500 ,
78
72
headers : [ [ "Content-Type" , "text/html" ] ] ,
79
73
} ) ;
@@ -102,7 +96,7 @@ export const serve = (options: ServerOptions = {}) => {
102
96
if ( ! ( err instanceof Deno . errors . NotFound ) ) {
103
97
log . error ( err ) ;
104
98
return onError ?.( err , { by : "transplie" , url : req . url } ) ??
105
- new Response ( errorHtml ( err . stack ?? err . message ) , {
99
+ new Response ( generateErrorHtml ( err . stack ?? err . message ) , {
106
100
status : 500 ,
107
101
headers : [ [ "Content-Type" , "text/html" ] ] ,
108
102
} ) ;
@@ -149,7 +143,7 @@ export const serve = (options: ServerOptions = {}) => {
149
143
if ( ! ( err instanceof Deno . errors . NotFound ) ) {
150
144
log . error ( err ) ;
151
145
return onError ?.( err , { by : "fs" , url : req . url } ) ??
152
- new Response ( errorHtml ( err . stack ?? err . message ) , {
146
+ new Response ( generateErrorHtml ( err . stack ?? err . message ) , {
153
147
status : 500 ,
154
148
headers : [ [ "Content-Type" , "text/html" ] ] ,
155
149
} ) ;
@@ -209,25 +203,27 @@ export const serve = (options: ServerOptions = {}) => {
209
203
return new Response ( null , { status : code || 302 , headers } ) ;
210
204
} ,
211
205
json : ( data : unknown , init ?: ResponseInit ) : Response => {
212
- let hasCustomHeaders = false ;
213
- const headers = new Headers ( init ?. headers ) ;
206
+ let headers : Headers | null = null ;
214
207
ctx . headers . forEach ( ( value , name ) => {
208
+ if ( ! headers ) {
209
+ headers = new Headers ( init ?. headers ) ;
210
+ }
215
211
headers . set ( name , value ) ;
216
- hasCustomHeaders = true ;
217
212
} ) ;
218
- if ( ! hasCustomHeaders ) {
213
+ if ( ! headers ) {
219
214
return json ( data , init ) ;
220
215
}
221
216
return json ( data , { ...init , headers } ) ;
222
217
} ,
223
218
content : ( body : BodyInit , init ?: ResponseInit ) : Response => {
224
- let hasCustomHeaders = false ;
225
- const headers = new Headers ( init ?. headers ) ;
219
+ let headers : Headers | null = null ;
226
220
ctx . headers . forEach ( ( value , name ) => {
221
+ if ( ! headers ) {
222
+ headers = new Headers ( init ?. headers ) ;
223
+ }
227
224
headers . set ( name , value ) ;
228
- hasCustomHeaders = true ;
229
225
} ) ;
230
- if ( ! hasCustomHeaders ) {
226
+ if ( ! headers ) {
231
227
return content ( body , init ) ;
232
228
}
233
229
return content ( body , { ...init , headers } ) ;
@@ -252,8 +248,8 @@ export const serve = (options: ServerOptions = {}) => {
252
248
}
253
249
}
254
250
} catch ( err ) {
255
- return onError ?.( err , { by : "middleware" , url : req . url } ) ??
256
- new Response ( errorHtml ( err . stack ?? err . message ) , {
251
+ return onError ?.( err , { by : "middleware" , url : req . url , context : ctx } ) ??
252
+ new Response ( generateErrorHtml ( err . stack ?? err . message ) , {
257
253
status : 500 ,
258
254
headers : [ [ "Content-Type" , "text/html" ] ] ,
259
255
} ) ;
@@ -295,20 +291,20 @@ export const serve = (options: ServerOptions = {}) => {
295
291
if (
296
292
typeof res === "string" || res instanceof ArrayBuffer || res instanceof ReadableStream
297
293
) {
298
- return new Response ( res ) ;
294
+ return ctx . content ( res ) ;
299
295
}
300
296
if ( res instanceof Blob || res instanceof File ) {
301
- return new Response ( res , { headers : { "Content-Type" : res . type } } ) ;
297
+ return ctx . content ( res , { headers : { "Content-Type" : res . type } } ) ;
302
298
}
303
299
if ( util . isPlainObject ( res ) || Array . isArray ( res ) || res === null ) {
304
- return json ( res ) ;
300
+ return ctx . json ( res ) ;
305
301
}
306
- return new Response ( null ) ;
302
+ return new Response ( null , { headers : ctx . headers } ) ;
307
303
}
308
304
return new Response ( "Method not allowed" , { status : 405 } ) ;
309
305
}
310
306
} catch ( err ) {
311
- const res = onError ?.( err , { by : "route-api" , url : req . url } ) ;
307
+ const res = onError ?.( err , { by : "route-api" , url : req . url , context : ctx } ) ;
312
308
if ( res instanceof Response ) {
313
309
return res ;
314
310
}
@@ -354,7 +350,7 @@ export const serve = (options: ServerOptions = {}) => {
354
350
} else {
355
351
log . error ( "read index.html:" , err ) ;
356
352
return onError ?.( err , { by : "fs" , url : req . url } ) ??
357
- new Response ( errorHtml ( err . stack ?? err . message ) , {
353
+ new Response ( generateErrorHtml ( err . stack ?? err . message ) , {
358
354
status : 500 ,
359
355
headers : [ [ "Content-Type" , "text/html" ] ] ,
360
356
} ) ;
0 commit comments