elysia 1.4.21 → 1.4.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,161 +7,160 @@ import {
7
7
  import { isNotEmpty } from "../../utils.mjs";
8
8
  import { Cookie } from "../../cookies.mjs";
9
9
  import { ElysiaCustomStatusResponse } from "../../error.mjs";
10
- const mapResponse = (response, set2, request) => {
11
- if (isNotEmpty(set2.headers) || set2.status !== 200 || set2.cookie)
12
- switch (handleSet(set2), response?.constructor?.name) {
10
+ const mapResponse = (response, set, request) => {
11
+ if (isNotEmpty(set.headers) || set.status !== 200 || set.cookie)
12
+ switch (handleSet(set), response?.constructor?.name) {
13
13
  case "String":
14
- return new Response(response, set2);
14
+ return new Response(response, set);
15
15
  case "Array":
16
16
  case "Object":
17
- return set2.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set2);
17
+ return set.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set);
18
18
  case "ElysiaFile":
19
- return handleFile(
20
- response.value,
21
- set2
22
- );
19
+ return handleFile(response.value, set);
23
20
  case "File":
24
- return handleFile(response, set2);
21
+ return handleFile(response, set);
25
22
  case "Blob":
26
- return handleFile(response, set2);
23
+ return handleFile(response, set);
27
24
  case "ElysiaCustomStatusResponse":
28
- return set2.status = response.code, mapResponse(
25
+ return set.status = response.code, mapResponse(
29
26
  response.response,
30
- set2,
27
+ set,
31
28
  request
32
29
  );
33
30
  case void 0:
34
- return response ? new Response(JSON.stringify(response), set2) : new Response("", set2);
31
+ return response ? new Response(JSON.stringify(response), set) : new Response("", set);
35
32
  case "Response":
36
- return handleResponse(response, set2, request);
33
+ return handleResponse(response, set, request);
37
34
  case "Error":
38
- return errorToResponse(response, set2);
35
+ return errorToResponse(response, set);
39
36
  case "Promise":
40
37
  return response.then(
41
- (x) => mapResponse(x, set2, request)
38
+ (x) => mapResponse(x, set, request)
42
39
  );
43
40
  case "Function":
44
- return mapResponse(response(), set2, request);
41
+ return mapResponse(response(), set, request);
45
42
  case "Number":
46
43
  case "Boolean":
47
44
  return new Response(
48
45
  response.toString(),
49
- set2
46
+ set
50
47
  );
51
48
  case "Cookie":
52
- return response instanceof Cookie ? new Response(response.value, set2) : new Response(response?.toString(), set2);
49
+ return response instanceof Cookie ? new Response(response.value, set) : new Response(response?.toString(), set);
53
50
  case "FormData":
54
- return new Response(response, set2);
51
+ return new Response(response, set);
55
52
  default:
56
53
  if (response instanceof Response)
57
- return handleResponse(response, set2, request);
54
+ return handleResponse(response, set, request);
58
55
  if (response instanceof Promise)
59
- return response.then((x) => mapResponse(x, set2));
56
+ return response.then((x) => mapResponse(x, set));
60
57
  if (response instanceof Error)
61
- return errorToResponse(response, set2);
58
+ return errorToResponse(response, set);
62
59
  if (response instanceof ElysiaCustomStatusResponse)
63
- return set2.status = response.code, mapResponse(
60
+ return set.status = response.code, mapResponse(
64
61
  response.response,
65
- set2,
62
+ set,
66
63
  request
67
64
  );
68
65
  if (
69
66
  // @ts-expect-error
70
67
  typeof response?.next == "function" || response instanceof ReadableStream
71
68
  )
72
- return handleStream(response, set2, request);
69
+ return handleStream(response, set, request);
73
70
  if (typeof response?.then == "function")
74
- return response.then((x) => mapResponse(x, set2));
71
+ return response.then((x) => mapResponse(x, set));
75
72
  if (typeof response?.toResponse == "function")
76
- return mapResponse(response.toResponse(), set2);
73
+ return mapResponse(response.toResponse(), set);
77
74
  if ("charCodeAt" in response) {
78
75
  const code = response.charCodeAt(0);
79
76
  if (code === 123 || code === 91)
80
- return set2.headers["Content-Type"] || (set2.headers["Content-Type"] = "application/json"), new Response(
77
+ return set.headers["Content-Type"] || (set.headers["Content-Type"] = "application/json"), new Response(
81
78
  JSON.stringify(response),
82
- set2
79
+ set
83
80
  );
84
81
  }
85
- return new Response(response, set2);
82
+ return new Response(response, set);
86
83
  }
87
84
  return (
88
85
  // @ts-expect-error
89
- typeof response?.next == "function" || response instanceof ReadableStream ? handleStream(response, set2, request) : mapCompactResponse(response, request)
86
+ typeof response?.next == "function" || response instanceof ReadableStream ? handleStream(response, set, request) : mapCompactResponse(response, request)
90
87
  );
91
- }, mapEarlyResponse = (response, set2, request) => {
88
+ }, mapEarlyResponse = (response, set, request) => {
92
89
  if (response != null)
93
- if (isNotEmpty(set2.headers) || set2.status !== 200 || set2.cookie)
94
- switch (handleSet(set2), response?.constructor?.name) {
90
+ if (isNotEmpty(set.headers) || set.status !== 200 || set.cookie)
91
+ switch (handleSet(set), response?.constructor?.name) {
95
92
  case "String":
96
- return new Response(response, set2);
93
+ return new Response(response, set);
97
94
  case "Array":
98
95
  case "Object":
99
- return set2.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set2);
96
+ return set.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set);
100
97
  case "ElysiaFile":
101
- return handleFile(response.value, set2);
98
+ return handleFile(response.value, set);
102
99
  case "File":
103
- return handleFile(response, set2);
100
+ return handleFile(response, set);
104
101
  case "Blob":
105
- return handleFile(response, set2);
102
+ return handleFile(response, set);
106
103
  case "ElysiaCustomStatusResponse":
107
- return set2.status = response.code, mapEarlyResponse(
104
+ return set.status = response.code, mapEarlyResponse(
108
105
  response.response,
109
- set2,
106
+ set,
110
107
  request
111
108
  );
112
109
  case void 0:
113
- return response ? new Response(JSON.stringify(response), set2) : void 0;
110
+ return response ? new Response(JSON.stringify(response), set) : void 0;
114
111
  case "Response":
115
- return handleResponse(response, set2, request);
112
+ return handleResponse(response, set, request);
116
113
  case "Promise":
117
114
  return response.then(
118
- (x) => mapEarlyResponse(x, set2)
115
+ (x) => mapEarlyResponse(x, set)
119
116
  );
120
117
  case "Error":
121
- return errorToResponse(response, set2);
118
+ return errorToResponse(response, set);
122
119
  case "Function":
123
- return mapEarlyResponse(response(), set2);
120
+ return mapEarlyResponse(response(), set);
124
121
  case "Number":
125
122
  case "Boolean":
126
123
  return new Response(
127
124
  response.toString(),
128
- set2
125
+ set
129
126
  );
130
127
  case "FormData":
131
128
  return new Response(response);
132
129
  case "Cookie":
133
- return response instanceof Cookie ? new Response(response.value, set2) : new Response(response?.toString(), set2);
130
+ return response instanceof Cookie ? new Response(response.value, set) : new Response(response?.toString(), set);
134
131
  default:
135
132
  if (response instanceof Response)
136
- return handleResponse(response, set2, request);
133
+ return handleResponse(response, set, request);
137
134
  if (response instanceof Promise)
138
- return response.then((x) => mapEarlyResponse(x, set2));
135
+ return response.then((x) => mapEarlyResponse(x, set));
139
136
  if (response instanceof Error)
140
- return errorToResponse(response, set2);
137
+ return errorToResponse(response, set);
141
138
  if (response instanceof ElysiaCustomStatusResponse)
142
- return set2.status = response.code, mapEarlyResponse(
139
+ return set.status = response.code, mapEarlyResponse(
143
140
  response.response,
144
- set2,
141
+ set,
145
142
  request
146
143
  );
147
144
  if (
148
145
  // @ts-expect-error
149
146
  typeof response?.next == "function" || response instanceof ReadableStream
150
147
  )
151
- return handleStream(response, set2, request);
148
+ return handleStream(response, set, request);
152
149
  if (typeof response?.then == "function")
153
- return response.then((x) => mapEarlyResponse(x, set2));
150
+ return response.then(
151
+ (x) => mapEarlyResponse(x, set)
152
+ );
154
153
  if (typeof response?.toResponse == "function")
155
- return mapEarlyResponse(response.toResponse(), set2);
154
+ return mapEarlyResponse(response.toResponse(), set);
156
155
  if ("charCodeAt" in response) {
157
156
  const code = response.charCodeAt(0);
158
157
  if (code === 123 || code === 91)
159
- return set2.headers["Content-Type"] || (set2.headers["Content-Type"] = "application/json"), new Response(
158
+ return set.headers["Content-Type"] || (set.headers["Content-Type"] = "application/json"), new Response(
160
159
  JSON.stringify(response),
161
- set2
160
+ set
162
161
  );
163
162
  }
164
- return new Response(response, set2);
163
+ return new Response(response, set);
165
164
  }
166
165
  else
167
166
  switch (response?.constructor?.name) {
@@ -169,17 +168,17 @@ const mapResponse = (response, set2, request) => {
169
168
  return new Response(response);
170
169
  case "Array":
171
170
  case "Object":
172
- return set2.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set2);
171
+ return set.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set);
173
172
  case "ElysiaFile":
174
- return handleFile(response.value, set2);
173
+ return handleFile(response.value, set);
175
174
  case "File":
176
- return handleFile(response, set2);
175
+ return handleFile(response, set);
177
176
  case "Blob":
178
- return handleFile(response, set2);
177
+ return handleFile(response, set);
179
178
  case "ElysiaCustomStatusResponse":
180
- return set2.status = response.code, mapEarlyResponse(
179
+ return set.status = response.code, mapEarlyResponse(
181
180
  response.response,
182
- set2,
181
+ set,
183
182
  request
184
183
  );
185
184
  case void 0:
@@ -192,47 +191,49 @@ const mapResponse = (response, set2, request) => {
192
191
  return response;
193
192
  case "Promise":
194
193
  return response.then((x) => {
195
- const r = mapEarlyResponse(x, set2);
194
+ const r = mapEarlyResponse(x, set);
196
195
  if (r !== void 0) return r;
197
196
  });
198
197
  case "Error":
199
- return errorToResponse(response, set2);
198
+ return errorToResponse(response, set);
200
199
  case "Function":
201
200
  return mapCompactResponse(response(), request);
202
201
  case "Number":
203
202
  case "Boolean":
204
203
  return new Response(response.toString());
205
204
  case "Cookie":
206
- return response instanceof Cookie ? new Response(response.value, set2) : new Response(response?.toString(), set2);
205
+ return response instanceof Cookie ? new Response(response.value, set) : new Response(response?.toString(), set);
207
206
  case "FormData":
208
207
  return new Response(response);
209
208
  default:
210
209
  if (response instanceof Response) return response;
211
210
  if (response instanceof Promise)
212
- return response.then((x) => mapEarlyResponse(x, set2));
211
+ return response.then((x) => mapEarlyResponse(x, set));
213
212
  if (response instanceof Error)
214
- return errorToResponse(response, set2);
213
+ return errorToResponse(response, set);
215
214
  if (response instanceof ElysiaCustomStatusResponse)
216
- return set2.status = response.code, mapEarlyResponse(
215
+ return set.status = response.code, mapEarlyResponse(
217
216
  response.response,
218
- set2,
217
+ set,
219
218
  request
220
219
  );
221
220
  if (
222
221
  // @ts-expect-error
223
222
  typeof response?.next == "function" || response instanceof ReadableStream
224
223
  )
225
- return handleStream(response, set2, request);
224
+ return handleStream(response, set, request);
226
225
  if (typeof response?.then == "function")
227
- return response.then((x) => mapEarlyResponse(x, set2));
226
+ return response.then(
227
+ (x) => mapEarlyResponse(x, set)
228
+ );
228
229
  if (typeof response?.toResponse == "function")
229
- return mapEarlyResponse(response.toResponse(), set2);
230
+ return mapEarlyResponse(response.toResponse(), set);
230
231
  if ("charCodeAt" in response) {
231
232
  const code = response.charCodeAt(0);
232
233
  if (code === 123 || code === 91)
233
- return set2.headers["Content-Type"] || (set2.headers["Content-Type"] = "application/json"), new Response(
234
+ return set.headers["Content-Type"] || (set.headers["Content-Type"] = "application/json"), new Response(
234
235
  JSON.stringify(response),
235
- set2
236
+ set
236
237
  );
237
238
  }
238
239
  return new Response(response);
@@ -306,7 +307,9 @@ const mapResponse = (response, set2, request) => {
306
307
  )
307
308
  return handleStream(response, void 0, request);
308
309
  if (typeof response?.then == "function")
309
- return response.then((x) => mapResponse(x, set));
310
+ return response.then(
311
+ (x) => mapCompactResponse(x, request)
312
+ );
310
313
  if (typeof response?.toResponse == "function")
311
314
  return mapCompactResponse(response.toResponse());
312
315
  if ("charCodeAt" in response) {
@@ -320,9 +323,9 @@ const mapResponse = (response, set2, request) => {
320
323
  }
321
324
  return new Response(response);
322
325
  }
323
- }, errorToResponse = (error, set2) => {
326
+ }, errorToResponse = (error, set) => {
324
327
  if (typeof error?.toResponse == "function") {
325
- const raw = error.toResponse(), targetSet = set2 ?? { headers: {}, status: 200, redirect: "" }, apply = (resolved) => (resolved instanceof Response && (targetSet.status = resolved.status), mapResponse(resolved, targetSet));
328
+ const raw = error.toResponse(), targetSet = set ?? { headers: {}, status: 200, redirect: "" }, apply = (resolved) => (resolved instanceof Response && (targetSet.status = resolved.status), mapResponse(resolved, targetSet));
326
329
  return typeof raw?.then == "function" ? raw.then(apply) : apply(raw);
327
330
  }
328
331
  return new Response(
@@ -332,8 +335,8 @@ const mapResponse = (response, set2, request) => {
332
335
  cause: error?.cause
333
336
  }),
334
337
  {
335
- status: set2?.status !== 200 ? set2?.status ?? 500 : 500,
336
- headers: set2?.headers
338
+ status: set?.status !== 200 ? set?.status ?? 500 : 500,
339
+ headers: set?.headers
337
340
  }
338
341
  );
339
342
  }, createStaticHandler = (handle, hooks, setHeaders = {}) => {
@@ -37,7 +37,7 @@ const optionalParam = /:.+?\?(?=\/|$)/, getPossibleParams = (path) => {
37
37
  POST: !0,
38
38
  PUT: !0
39
39
  }, mapRoutes = (app) => {
40
- if (!app.config.aot || !app.config.systemRouter) return;
40
+ if (!app.config.aot || app.config.systemRouter === !1) return;
41
41
  const routes = {}, add = (route, handler) => {
42
42
  const path = encodeURI(route.path);
43
43
  routes[path] ? routes[path][route.method] || (routes[path][route.method] = handler) : routes[path] = {
@@ -41,7 +41,7 @@ const optionalParam = /:.+?\?(?=\/|$)/, getPossibleParams = (path) => {
41
41
  POST: !0,
42
42
  PUT: !0
43
43
  }, mapRoutes = (app) => {
44
- if (!app.config.aot || !app.config.systemRouter) return;
44
+ if (!app.config.aot || app.config.systemRouter === !1) return;
45
45
  const routes = {}, add = (route, handler) => {
46
46
  const path = encodeURI(route.path);
47
47
  routes[path] ? routes[path][route.method] || (routes[path][route.method] = handler) : routes[path] = {
@@ -8,11 +8,11 @@ export declare const responseToSetHeaders: (response: Response, set?: Context["s
8
8
  redirect?: string;
9
9
  cookie?: Record<string, import("../cookies").ElysiaCookie>;
10
10
  };
11
- type CreateHandlerParameter = {
11
+ interface CreateHandlerParameter {
12
12
  mapResponse(response: unknown, set: Context['set'], request?: Request): Response;
13
13
  mapCompactResponse(response: unknown, request?: Request): Response;
14
- };
15
- export declare const createStreamHandler: ({ mapResponse, mapCompactResponse }: CreateHandlerParameter) => (generator: Generator | AsyncGenerator | ReadableStream, set?: Context["set"], request?: Request) => Promise<Response>;
14
+ }
15
+ export declare const createStreamHandler: ({ mapResponse, mapCompactResponse }: CreateHandlerParameter) => (generator: Generator | AsyncGenerator | ReadableStream, set?: Context["set"], request?: Request, skipFormat?: boolean) => Promise<Response>;
16
16
  export declare function streamResponse(response: Response): AsyncGenerator<string, void, unknown>;
17
17
  export declare const handleSet: (set: Context["set"]) => void;
18
18
  export declare const createResponseHandler: (handler: CreateHandlerParameter) => (response: Response, set: Context["set"], request?: Request) => any;
@@ -88,18 +88,16 @@ const handleFile = (response, set) => {
88
88
  for (const [key, value] of response.headers.entries())
89
89
  key !== "content-encoding" && key in set.headers && (set.headers[key] = value);
90
90
  return set;
91
- }, allowRapidStream = import_universal.env.ELYSIA_RAPID_STREAM === "true", createStreamHandler = ({ mapResponse, mapCompactResponse }) => async (generator, set, request) => {
91
+ }, allowRapidStream = import_universal.env.ELYSIA_RAPID_STREAM === "true", createStreamHandler = ({ mapResponse, mapCompactResponse }) => async (generator, set, request, skipFormat) => {
92
92
  let init = generator.next?.();
93
93
  if (set && handleSet(set), init instanceof Promise && (init = await init), init?.value instanceof ReadableStream)
94
94
  generator = init.value;
95
95
  else if (init && (typeof init?.done > "u" || init?.done))
96
96
  return set ? mapResponse(init.value, set, request) : mapCompactResponse(init.value, request);
97
- const isSSE = (
98
- // @ts-ignore First SSE result is wrapped with sse()
99
- init?.value?.sse ?? // @ts-ignore ReadableStream is wrapped with sse()
100
- generator?.sse ?? // User explicitly set content-type to SSE
101
- set?.headers["content-type"]?.startsWith("text/event-stream")
102
- ), format = isSSE ? (data) => `data: ${data}
97
+ const isSSE = !skipFormat && // @ts-ignore First SSE result is wrapped with sse()
98
+ (init?.value?.sse ?? // @ts-ignore ReadableStream is wrapped with sse()
99
+ generator?.sse ?? // User explicitly set content-type to SSE
100
+ set?.headers["content-type"]?.startsWith("text/event-stream")), format = isSSE ? (data) => `data: ${data}
103
101
 
104
102
  ` : (data) => data, contentType = isSSE ? "text/event-stream" : init?.value && typeof init?.value == "object" ? "application/json" : "text/plain";
105
103
  set?.headers ? (set.headers["transfer-encoding"] || (set.headers["transfer-encoding"] = "chunked"), set.headers["content-type"] || (set.headers["content-type"] = contentType), set.headers["cache-control"] || (set.headers["cache-control"] = "no-cache")) : set = {
@@ -227,13 +225,17 @@ const handleSet = (set) => {
227
225
  return !newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked" ? handleStream(
228
226
  streamResponse(newResponse),
229
227
  responseToSetHeaders(newResponse, set),
230
- request
228
+ request,
229
+ !0
230
+ // skipFormat: don't auto-format SSE for pre-formatted Response
231
231
  ) : newResponse;
232
232
  }
233
233
  return !response.headers.has("content-length") && response.headers.get("transfer-encoding") === "chunked" ? handleStream(
234
234
  streamResponse(response),
235
235
  responseToSetHeaders(response, set),
236
- request
236
+ request,
237
+ !0
238
+ // skipFormat: don't auto-format SSE for pre-formatted Response
237
239
  ) : response;
238
240
  };
239
241
  };
@@ -64,18 +64,16 @@ const handleFile = (response, set) => {
64
64
  for (const [key, value] of response.headers.entries())
65
65
  key !== "content-encoding" && key in set.headers && (set.headers[key] = value);
66
66
  return set;
67
- }, allowRapidStream = env.ELYSIA_RAPID_STREAM === "true", createStreamHandler = ({ mapResponse, mapCompactResponse }) => async (generator, set, request) => {
67
+ }, allowRapidStream = env.ELYSIA_RAPID_STREAM === "true", createStreamHandler = ({ mapResponse, mapCompactResponse }) => async (generator, set, request, skipFormat) => {
68
68
  let init = generator.next?.();
69
69
  if (set && handleSet(set), init instanceof Promise && (init = await init), init?.value instanceof ReadableStream)
70
70
  generator = init.value;
71
71
  else if (init && (typeof init?.done > "u" || init?.done))
72
72
  return set ? mapResponse(init.value, set, request) : mapCompactResponse(init.value, request);
73
- const isSSE = (
74
- // @ts-ignore First SSE result is wrapped with sse()
75
- init?.value?.sse ?? // @ts-ignore ReadableStream is wrapped with sse()
76
- generator?.sse ?? // User explicitly set content-type to SSE
77
- set?.headers["content-type"]?.startsWith("text/event-stream")
78
- ), format = isSSE ? (data) => `data: ${data}
73
+ const isSSE = !skipFormat && // @ts-ignore First SSE result is wrapped with sse()
74
+ (init?.value?.sse ?? // @ts-ignore ReadableStream is wrapped with sse()
75
+ generator?.sse ?? // User explicitly set content-type to SSE
76
+ set?.headers["content-type"]?.startsWith("text/event-stream")), format = isSSE ? (data) => `data: ${data}
79
77
 
80
78
  ` : (data) => data, contentType = isSSE ? "text/event-stream" : init?.value && typeof init?.value == "object" ? "application/json" : "text/plain";
81
79
  set?.headers ? (set.headers["transfer-encoding"] || (set.headers["transfer-encoding"] = "chunked"), set.headers["content-type"] || (set.headers["content-type"] = contentType), set.headers["cache-control"] || (set.headers["cache-control"] = "no-cache")) : set = {
@@ -203,13 +201,17 @@ const handleSet = (set) => {
203
201
  return !newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked" ? handleStream(
204
202
  streamResponse(newResponse),
205
203
  responseToSetHeaders(newResponse, set),
206
- request
204
+ request,
205
+ !0
206
+ // skipFormat: don't auto-format SSE for pre-formatted Response
207
207
  ) : newResponse;
208
208
  }
209
209
  return !response.headers.has("content-length") && response.headers.get("transfer-encoding") === "chunked" ? handleStream(
210
210
  streamResponse(response),
211
211
  responseToSetHeaders(response, set),
212
- request
212
+ request,
213
+ !0
214
+ // skipFormat: don't auto-format SSE for pre-formatted Response
213
215
  ) : response;
214
216
  };
215
217
  };
@@ -1,7 +1,9 @@
1
1
  import type { Context } from '../../context';
2
- import type { AnyLocalHook } from '../../types';
2
+ import type { AnyLocalHook, MaybePromise } from '../../types';
3
3
  export declare const mapResponse: (response: unknown, set: Context["set"], request?: Request) => Response;
4
4
  export declare const mapEarlyResponse: (response: unknown, set: Context["set"], request?: Request) => Response | undefined;
5
5
  export declare const mapCompactResponse: (response: unknown, request?: Request) => Response;
6
- export declare const errorToResponse: (error: Error, set?: Context["set"]) => any;
6
+ export declare const errorToResponse: (error: Error & {
7
+ toResponse?(): MaybePromise<Response>;
8
+ }, set?: Context["set"]) => any;
7
9
  export declare const createStaticHandler: (handle: unknown, hooks: Partial<AnyLocalHook>, setHeaders?: Context["set"]["headers"]) => (() => Response) | undefined;