elysia 2.0.0-exp.2 → 2.0.0-exp.21

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.
Files changed (135) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +2 -0
  2. package/dist/adapter/bun/index.d.ts +2 -25
  3. package/dist/adapter/bun/index.js +18 -12
  4. package/dist/adapter/bun/index.mjs +19 -13
  5. package/dist/adapter/bun/router.js +1 -1
  6. package/dist/adapter/bun/router.mjs +1 -1
  7. package/dist/adapter/constants.d.ts +3 -26
  8. package/dist/adapter/index.d.ts +1 -26
  9. package/dist/adapter/index.js +1 -17
  10. package/dist/adapter/index.mjs +1 -17
  11. package/dist/adapter/types.d.ts +1 -0
  12. package/dist/adapter/utils.d.ts +3 -4
  13. package/dist/adapter/utils.js +83 -81
  14. package/dist/adapter/utils.mjs +82 -80
  15. package/dist/adapter/web-standard/handler.js +6 -3
  16. package/dist/adapter/web-standard/handler.mjs +6 -3
  17. package/dist/adapter/web-standard/index.d.ts +2 -26
  18. package/dist/adapter/web-standard/index.js +12 -1
  19. package/dist/adapter/web-standard/index.mjs +12 -1
  20. package/dist/base.d.ts +38 -68
  21. package/dist/base.js +133 -97
  22. package/dist/base.mjs +133 -97
  23. package/dist/compile/aot.d.ts +22 -1
  24. package/dist/compile/aot.js +22 -0
  25. package/dist/compile/aot.mjs +22 -0
  26. package/dist/compile/handler/index.d.ts +2 -2
  27. package/dist/compile/handler/index.js +85 -456
  28. package/dist/compile/handler/index.mjs +86 -457
  29. package/dist/compile/handler/jit.d.ts +35 -0
  30. package/dist/compile/handler/jit.js +445 -0
  31. package/dist/compile/handler/jit.mjs +443 -0
  32. package/dist/compile/handler/params.js +3 -2
  33. package/dist/compile/handler/params.mjs +4 -3
  34. package/dist/compile/handler/reconstruct.d.ts +13 -0
  35. package/dist/compile/handler/reconstruct.js +29 -0
  36. package/dist/compile/handler/reconstruct.mjs +28 -0
  37. package/dist/compile/handler/utils.d.ts +2 -1
  38. package/dist/compile/handler/utils.js +9 -3
  39. package/dist/compile/handler/utils.mjs +9 -4
  40. package/dist/compile/jit-probe.d.ts +19 -0
  41. package/dist/compile/jit-probe.js +38 -0
  42. package/dist/compile/jit-probe.mjs +36 -0
  43. package/dist/cookie/index.d.ts +4 -3
  44. package/dist/cookie/index.js +2 -1
  45. package/dist/cookie/index.mjs +2 -1
  46. package/dist/cookie/serialize.d.ts +6 -0
  47. package/dist/cookie/serialize.js +28 -0
  48. package/dist/cookie/serialize.mjs +27 -0
  49. package/dist/cookie/utils.d.ts +1 -2
  50. package/dist/cookie/utils.js +2 -23
  51. package/dist/cookie/utils.mjs +5 -25
  52. package/dist/handler/error.js +2 -2
  53. package/dist/handler/error.mjs +3 -3
  54. package/dist/handler/fetch.js +49 -42
  55. package/dist/handler/fetch.mjs +50 -43
  56. package/dist/index.d.ts +13 -8
  57. package/dist/index.js +11 -4
  58. package/dist/index.mjs +7 -6
  59. package/dist/parse-query.js +1 -1
  60. package/dist/parse-query.mjs +1 -1
  61. package/dist/plugin/bun.d.ts +10 -0
  62. package/dist/plugin/bun.js +18 -1
  63. package/dist/plugin/bun.mjs +19 -2
  64. package/dist/plugin/core.d.ts +61 -1
  65. package/dist/plugin/core.js +90 -10
  66. package/dist/plugin/core.mjs +90 -12
  67. package/dist/plugin/esbuild.d.ts +10 -0
  68. package/dist/plugin/esbuild.js +18 -1
  69. package/dist/plugin/esbuild.mjs +19 -2
  70. package/dist/plugin/source.d.ts +38 -1
  71. package/dist/plugin/source.js +104 -13
  72. package/dist/plugin/source.mjs +102 -14
  73. package/dist/plugin/vite.d.ts +7 -0
  74. package/dist/plugin/vite.js +22 -1
  75. package/dist/plugin/vite.mjs +23 -2
  76. package/dist/sucrose.js +23 -10
  77. package/dist/sucrose.mjs +23 -10
  78. package/dist/trace.d.ts +1 -1
  79. package/dist/trace.js +4 -6
  80. package/dist/trace.mjs +4 -6
  81. package/dist/type/bridge.d.ts +9 -8
  82. package/dist/type/coerce.d.ts +20 -2
  83. package/dist/type/coerce.js +110 -0
  84. package/dist/type/coerce.mjs +109 -2
  85. package/dist/type/compat.js +4 -3
  86. package/dist/type/compat.mjs +2 -1
  87. package/dist/type/constants.d.ts +1 -1
  88. package/dist/type/elysia/boolean-string.js +1 -1
  89. package/dist/type/elysia/boolean-string.mjs +1 -1
  90. package/dist/type/elysia/file-type.js +1 -1
  91. package/dist/type/elysia/file-type.mjs +1 -1
  92. package/dist/type/elysia/integer-string.js +1 -1
  93. package/dist/type/elysia/integer-string.mjs +1 -1
  94. package/dist/type/exports.js +29 -2059
  95. package/dist/type/exports.mjs +7 -295
  96. package/dist/type/index.d.ts +6 -2
  97. package/dist/type/index.js +4 -0
  98. package/dist/type/index.mjs +3 -1
  99. package/dist/type/types.d.ts +1 -1
  100. package/dist/type/utils.js +4 -4
  101. package/dist/type/utils.mjs +4 -4
  102. package/dist/type/validator/custom-error.d.ts +10 -0
  103. package/dist/type/validator/custom-error.js +113 -0
  104. package/dist/type/validator/custom-error.mjs +110 -0
  105. package/dist/type/validator/default-precompute.d.ts +22 -0
  106. package/dist/type/validator/default-precompute.js +476 -0
  107. package/dist/type/validator/default-precompute.mjs +465 -0
  108. package/dist/type/validator/frozen-check.d.ts +11 -0
  109. package/dist/type/validator/frozen-check.js +19 -0
  110. package/dist/type/validator/frozen-check.mjs +18 -0
  111. package/dist/type/{validator.d.ts → validator/index.d.ts} +7 -20
  112. package/dist/type/validator/index.js +572 -0
  113. package/dist/type/validator/index.mjs +567 -0
  114. package/dist/type/validator/string-codec-aot.d.ts +9 -0
  115. package/dist/type/validator/string-codec-aot.js +106 -0
  116. package/dist/type/validator/string-codec-aot.mjs +102 -0
  117. package/dist/type/validator/validator-cache.d.ts +21 -0
  118. package/dist/type/validator/validator-cache.js +163 -0
  119. package/dist/type/validator/validator-cache.mjs +161 -0
  120. package/dist/types.d.ts +22 -14
  121. package/dist/universal/file.d.ts +1 -1
  122. package/dist/universal/file.js +35 -29
  123. package/dist/universal/file.mjs +35 -29
  124. package/dist/utils.d.ts +12 -1
  125. package/dist/utils.js +89 -45
  126. package/dist/utils.mjs +88 -46
  127. package/dist/validator/index.d.ts +1 -1
  128. package/dist/validator/index.js +15 -2
  129. package/dist/validator/index.mjs +15 -2
  130. package/dist/validator/route.d.ts +0 -1
  131. package/dist/ws/route.js +47 -24
  132. package/dist/ws/route.mjs +48 -25
  133. package/package.json +10 -4
  134. package/dist/type/validator.js +0 -1033
  135. package/dist/type/validator.mjs +0 -1029
@@ -1,7 +1,7 @@
1
1
  import { hasHeaderShorthand, isBun } from "../universal/constants.mjs";
2
2
  import { StatusMap } from "../constants.mjs";
3
3
  import { isNotEmpty, nullObject } from "../utils.mjs";
4
- import { serializeCookie } from "../cookie/utils.mjs";
4
+ import { serializeCookie } from "../cookie/serialize.mjs";
5
5
 
6
6
  //#region src/adapter/utils.ts
7
7
  const setCookie = "set-cookie";
@@ -100,7 +100,7 @@ function responseToSetHeaders(response, set) {
100
100
  } else if (set.headers["content-encoding"]) delete set.headers["content-encoding"];
101
101
  return set;
102
102
  }
103
- const enqueueBinaryChunk = (controller, chunk) => {
103
+ function enqueueBinaryChunk(controller, chunk) {
104
104
  if (chunk instanceof Blob) return chunk.arrayBuffer().then((buffer) => {
105
105
  controller.enqueue(new Uint8Array(buffer));
106
106
  return true;
@@ -118,91 +118,93 @@ const enqueueBinaryChunk = (controller, chunk) => {
118
118
  return true;
119
119
  }
120
120
  return false;
121
- };
122
- const createStreamHandler = ({ mapResponse, mapCompactResponse }) => async (generator, set, request, skipFormat) => {
123
- let init = generator.next?.();
124
- if (set) handleSet(set);
125
- if (init instanceof Promise) init = await init;
126
- if (init?.value instanceof ReadableStream) generator = init.value;
127
- else if (init && (typeof init?.done === "undefined" || init?.done)) {
128
- if (set) return mapResponse(init.value, set, request);
129
- return mapCompactResponse(init.value, request);
130
- }
131
- const isSSE = !skipFormat && (init?.value?.sse ?? generator?.sse ?? set?.headers["content-type"]?.startsWith("text/event-stream"));
132
- const format = isSSE ? (data) => `data: ${data}\n\n` : (data) => data;
133
- const contentType = isSSE ? "text/event-stream" : init?.value && typeof init?.value === "object" ? ArrayBuffer.isView(init.value) ? "application/octet-stream" : "application/json" : "text/plain";
134
- const headers = set?.headers;
135
- if (headers) {
136
- if (!headers["transfer-encoding"]) headers["transfer-encoding"] = "chunked";
137
- if (!headers["content-type"]) headers["content-type"] = contentType;
138
- if (!headers["cache-control"]) headers["cache-control"] = "no-cache";
139
- } else set = {
140
- status: 200,
141
- headers: {
142
- "content-type": contentType,
143
- "transfer-encoding": "chunked",
144
- "cache-control": "no-cache",
145
- connection: "keep-alive"
121
+ }
122
+ function createStreamHandler({ mapResponse, mapCompactResponse }) {
123
+ return async (generator, set, request, skipFormat) => {
124
+ let init = generator.next?.();
125
+ if (set) handleSet(set);
126
+ if (init instanceof Promise) init = await init;
127
+ if (init?.value instanceof ReadableStream) generator = init.value;
128
+ else if (init && (typeof init?.done === "undefined" || init?.done)) {
129
+ if (set) return mapResponse(init.value, set, request);
130
+ return mapCompactResponse(init.value, request);
146
131
  }
147
- };
148
- const iterator = typeof generator.next === "function" ? generator : generator[Symbol.asyncIterator]();
149
- let end = false;
150
- return new Response(new ReadableStream({
151
- start(controller) {
152
- request?.signal?.addEventListener("abort", () => {
153
- end = true;
154
- iterator.return?.();
155
- try {
156
- controller.close();
157
- } catch {}
158
- });
159
- if (!init || init.value instanceof ReadableStream || init.value === void 0 || init.value === null) return;
160
- if (init.value.toSSE) controller.enqueue(init.value.toSSE());
161
- else if (enqueueBinaryChunk(controller, init.value)) return;
162
- else if (typeof init.value === "object") try {
163
- controller.enqueue(format(JSON.stringify(init.value)));
164
- } catch {
165
- controller.enqueue(format(init.value.toString()));
132
+ const isSSE = !skipFormat && (init?.value?.sse ?? generator?.sse ?? set?.headers["content-type"]?.startsWith("text/event-stream"));
133
+ const format = isSSE ? (data) => `data: ${data}\n\n` : (data) => data;
134
+ const contentType = isSSE ? "text/event-stream" : init?.value && typeof init?.value === "object" ? ArrayBuffer.isView(init.value) ? "application/octet-stream" : "application/json" : "text/plain";
135
+ const headers = set?.headers;
136
+ if (headers) {
137
+ if (!headers["transfer-encoding"]) headers["transfer-encoding"] = "chunked";
138
+ if (!headers["content-type"]) headers["content-type"] = contentType;
139
+ if (!headers["cache-control"]) headers["cache-control"] = "no-cache";
140
+ } else set = {
141
+ status: 200,
142
+ headers: {
143
+ "content-type": contentType,
144
+ "transfer-encoding": "chunked",
145
+ "cache-control": "no-cache",
146
+ connection: "keep-alive"
166
147
  }
167
- else controller.enqueue(format(init.value.toString()));
168
- },
169
- async pull(controller) {
170
- if (end) {
171
- try {
172
- controller.close();
173
- } catch {}
174
- return;
175
- }
176
- try {
177
- const { value: chunk, done } = await iterator.next();
178
- if (done || end) {
148
+ };
149
+ const iterator = typeof generator.next === "function" ? generator : generator[Symbol.asyncIterator]();
150
+ let end = false;
151
+ return new Response(new ReadableStream({
152
+ start(controller) {
153
+ request?.signal?.addEventListener("abort", () => {
154
+ end = true;
155
+ iterator.return?.();
179
156
  try {
180
157
  controller.close();
181
158
  } catch {}
182
- return;
183
- }
184
- if (chunk === void 0 || chunk === null) return;
185
- if (chunk.toSSE) controller.enqueue(chunk.toSSE());
186
- else if (enqueueBinaryChunk(controller, chunk)) return;
187
- else if (typeof chunk === "object") try {
188
- controller.enqueue(format(JSON.stringify(chunk)));
159
+ });
160
+ if (!init || init.value instanceof ReadableStream || init.value === void 0 || init.value === null) return;
161
+ if (init.value.toSSE) controller.enqueue(init.value.toSSE());
162
+ else if (enqueueBinaryChunk(controller, init.value)) return;
163
+ else if (typeof init.value === "object") try {
164
+ controller.enqueue(format(JSON.stringify(init.value)));
189
165
  } catch {
190
- controller.enqueue(format(chunk.toString()));
166
+ controller.enqueue(format(init.value.toString()));
167
+ }
168
+ else controller.enqueue(format(init.value.toString()));
169
+ },
170
+ async pull(controller) {
171
+ if (end) {
172
+ try {
173
+ controller.close();
174
+ } catch {}
175
+ return;
191
176
  }
192
- else controller.enqueue(format(chunk.toString()));
193
- } catch (error) {
194
- console.warn(error);
195
177
  try {
196
- controller.close();
197
- } catch {}
178
+ const { value: chunk, done } = await iterator.next();
179
+ if (done || end) {
180
+ try {
181
+ controller.close();
182
+ } catch {}
183
+ return;
184
+ }
185
+ if (chunk === void 0 || chunk === null) return;
186
+ if (chunk.toSSE) controller.enqueue(chunk.toSSE());
187
+ else if (enqueueBinaryChunk(controller, chunk)) return;
188
+ else if (typeof chunk === "object") try {
189
+ controller.enqueue(format(JSON.stringify(chunk)));
190
+ } catch {
191
+ controller.enqueue(format(chunk.toString()));
192
+ }
193
+ else controller.enqueue(format(chunk.toString()));
194
+ } catch (error) {
195
+ console.warn(error);
196
+ try {
197
+ controller.close();
198
+ } catch {}
199
+ }
200
+ },
201
+ cancel() {
202
+ end = true;
203
+ iterator.return?.();
198
204
  }
199
- },
200
- cancel() {
201
- end = true;
202
- iterator.return?.();
203
- }
204
- }), set);
205
- };
205
+ }), set);
206
+ };
207
+ }
206
208
  async function* streamResponse(response) {
207
209
  const body = response.body;
208
210
  if (body) yield* body;
@@ -240,7 +242,7 @@ function mergeStatus(responseStatus, setStatus) {
240
242
  if (responseStatus === 200) return setStatus;
241
243
  return responseStatus;
242
244
  }
243
- const createResponseHandler = (handler) => {
245
+ function createResponseHandler(handler) {
244
246
  const handleStream = createStreamHandler(handler);
245
247
  return (response, set, request) => {
246
248
  if (set) {
@@ -264,7 +266,7 @@ const createResponseHandler = (handler) => {
264
266
  if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") return handleStream(streamResponse(newResponse), responseToSetHeaders(newResponse, set), request, true);
265
267
  return newResponse;
266
268
  };
267
- };
269
+ }
268
270
  /**
269
271
  * Split async source into `branches` independent iterators
270
272
  *
@@ -2,13 +2,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_universal_constants = require('../../universal/constants.js');
3
3
  const require_universal_file = require('../../universal/file.js');
4
4
  const require_utils = require('../../utils.js');
5
- const require_error = require('../../error.js');
6
5
  const require_adapter_utils = require('../utils.js');
6
+ const require_error = require('../../error.js');
7
7
 
8
8
  //#region src/adapter/web-standard/handler.ts
9
9
  function handleElysiaFile(file, set = { headers: require_utils.nullObject() }, request) {
10
10
  const path = file.path;
11
- const contentType = require_universal_file.mime[path.slice(path.lastIndexOf(".") + 1)];
11
+ const contentType = require_universal_file.mime[path.slice(path.lastIndexOf(".") + 1).toLowerCase()];
12
12
  const headers = set.headers;
13
13
  if (contentType) headers["content-type"] = contentType;
14
14
  if (file.stats && set.status !== 206 && set.status !== 304 && set.status !== 412 && set.status !== 416) return file.stats.then((stat) => {
@@ -97,7 +97,10 @@ function errorToResponse(error, set) {
97
97
  return typeof raw?.then === "function" ? raw.then(apply) : apply(raw);
98
98
  }
99
99
  const headers = set?.headers ?? require_utils.nullObject();
100
- return Response.json({
100
+ return Response.json(require_error.isProduction() ? {
101
+ name: error?.name,
102
+ message: "Internal Server Error"
103
+ } : {
101
104
  name: error?.name,
102
105
  message: error?.message,
103
106
  cause: error?.cause
@@ -1,13 +1,13 @@
1
1
  import { isBun } from "../../universal/constants.mjs";
2
2
  import { mime } from "../../universal/file.mjs";
3
3
  import { formToFormData, isNotEmpty, nullObject } from "../../utils.mjs";
4
- import { ElysiaStatus } from "../../error.mjs";
5
4
  import { createResponseHandler, createStreamHandler, handleFile, handleSet } from "../utils.mjs";
5
+ import { ElysiaStatus, isProduction } from "../../error.mjs";
6
6
 
7
7
  //#region src/adapter/web-standard/handler.ts
8
8
  function handleElysiaFile(file, set = { headers: nullObject() }, request) {
9
9
  const path = file.path;
10
- const contentType = mime[path.slice(path.lastIndexOf(".") + 1)];
10
+ const contentType = mime[path.slice(path.lastIndexOf(".") + 1).toLowerCase()];
11
11
  const headers = set.headers;
12
12
  if (contentType) headers["content-type"] = contentType;
13
13
  if (file.stats && set.status !== 206 && set.status !== 304 && set.status !== 412 && set.status !== 416) return file.stats.then((stat) => {
@@ -96,7 +96,10 @@ function errorToResponse(error, set) {
96
96
  return typeof raw?.then === "function" ? raw.then(apply) : apply(raw);
97
97
  }
98
98
  const headers = set?.headers ?? nullObject();
99
- return Response.json({
99
+ return Response.json(isProduction() ? {
100
+ name: error?.name,
101
+ message: "Internal Server Error"
102
+ } : {
100
103
  name: error?.name,
101
104
  message: error?.message,
102
105
  cause: error?.cause
@@ -1,29 +1,5 @@
1
- import { ListenCallback, Serve } from "../../universal/server.js";
2
- import { AnyLocalHook, MaybePromise } from "../../types.js";
3
- import { Context } from "../../context.js";
4
- import { AnyElysia } from "../../base.js";
1
+ import { ElysiaAdapterOptions } from "../types.js";
5
2
  //#region src/adapter/web-standard/index.d.ts
6
- declare const WebStandardAdapter: {
7
- parse: {
8
- default: (context: Context, contentType: string) => string | unknown[] | ArrayBuffer | Record<string, unknown> | Promise<Record<string, unknown>> | Promise<ArrayBuffer> | Promise<string> | Promise<unknown[] | Record<string | number | symbol, undefined>> | undefined;
9
- json: (context: Context) => MaybePromise<Record<keyof any, undefined> | unknown[]>;
10
- text: (context: Context) => MaybePromise<string>;
11
- urlencoded: (context: Context) => MaybePromise<Record<string, string | string[]>>;
12
- arrayBuffer: (context: Context) => MaybePromise<ArrayBuffer>;
13
- formData: (context: Context) => MaybePromise<Record<string, unknown>>;
14
- };
15
- name: string;
16
- runtime: "node" | "deno" | "bun" | "cloudflare-worker" | "browser" | "vercel" | "netlify" | "lambda" | "fastly" | "edge" | "unknown" | (string & {});
17
- isWebStandard: boolean;
18
- listen?(app: AnyElysia, options: string | number | Partial<Serve>, callback?: ListenCallback): void;
19
- stop?(app: AnyElysia, closeActiveConnections?: boolean): Promise<void>;
20
- response: {
21
- map(response: unknown, set: Context["set"], ...params: unknown[]): unknown;
22
- compact?(response: unknown, ...params: unknown[]): unknown;
23
- static?(handle: unknown, hooks: AnyLocalHook, setHeaders?: Context["set"]["headers"], ...params: unknown[]): (() => unknown) | undefined;
24
- nativeStatic?(handle: unknown, hooks: AnyLocalHook, set?: Context["set"]): (() => MaybePromise<Response>) | undefined;
25
- };
26
- fetch?(app: AnyElysia): (request: Request) => MaybePromise<Response>;
27
- };
3
+ declare const WebStandardAdapter: ElysiaAdapterOptions;
28
4
  //#endregion
29
5
  export { WebStandardAdapter };
@@ -14,7 +14,18 @@ const WebStandardAdapter = require_adapter_index.createAdapter({
14
14
  formData: (context) => context.request.formData().then(require_adapter_web_standard_utils.formDataToObject),
15
15
  json: (context) => context.request.json(),
16
16
  text: (context) => context.request.text(),
17
- urlencoded: (context) => context.request.text().then(require_parse_query.parseQuery)
17
+ urlencoded: (context) => context.request.text().then(require_parse_query.parseQuery),
18
+ default(context, contentType) {
19
+ switch (contentType.charCodeAt(12)) {
20
+ case 106: return context.request.json();
21
+ case 120:
22
+ if (contentType.charCodeAt(13) === 45) return context.request.text().then(require_parse_query.parseQuery);
23
+ break;
24
+ case 111: return context.request.arrayBuffer();
25
+ case 114: return context.request.formData().then(require_adapter_web_standard_utils.formDataToObject);
26
+ default: if (contentType.charCodeAt(0) === 116) return context.request.text();
27
+ }
28
+ }
18
29
  },
19
30
  response: {
20
31
  map: require_adapter_web_standard_handler.mapResponse,
@@ -13,7 +13,18 @@ const WebStandardAdapter = createAdapter({
13
13
  formData: (context) => context.request.formData().then(formDataToObject),
14
14
  json: (context) => context.request.json(),
15
15
  text: (context) => context.request.text(),
16
- urlencoded: (context) => context.request.text().then(parseQuery)
16
+ urlencoded: (context) => context.request.text().then(parseQuery),
17
+ default(context, contentType) {
18
+ switch (contentType.charCodeAt(12)) {
19
+ case 106: return context.request.json();
20
+ case 120:
21
+ if (contentType.charCodeAt(13) === 45) return context.request.text().then(parseQuery);
22
+ break;
23
+ case 111: return context.request.arrayBuffer();
24
+ case 114: return context.request.formData().then(formDataToObject);
25
+ default: if (contentType.charCodeAt(0) === 116) return context.request.text();
26
+ }
27
+ }
17
28
  },
18
29
  response: {
19
30
  map: mapResponse,
package/dist/base.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ElysiaStatus } from "./error.js";
2
2
  import { TraceHandler } from "./trace.js";
3
3
  import { ListenCallback, Serve, Server } from "./universal/server.js";
4
- import { AddRoute, AddWSRoute, AfterHandler, AfterResponseHandler, AnyErrorConstructor, AnyLocalHook, AppEvent, BodyHandler, CompiledHandler, CreateEden, DefaultEphemeral, DefaultMetadata, DefaultSingleton, DefinitionBase, DocumentDecoration, ElysiaConfig, ElysiaHandlerToResponseSchemaAmbiguous, EphemeralType, ErrorDefinitionEntry, ErrorHandler, EventFn, EventScope, ExcludeElysiaResponse, ExtractErrorFromHandle, GuardLocalHook, HTTPMethod, InlineHandler, InlineHandlerNonMacro, InputSchema, InputSchemaKey, InternalRoute, IntersectIfObjectSchema, JoinPath, LocalHook, Macro, MacroToContext, MacroToProperty, MapResponse, MaybeArray, MaybePromise, MergeElysiaInstances, MergeSchema, MergeScopedSchemas, MetadataBase, NonResolvableMacroKey, ObjectMacroDefs, OptionalHandler, PreHandler, Prettify, PublicRoute, ResolveRouteErrors, RouteBase, SingletonBase, TransformHandler, UnionResponseStatus, UnwrapRoute, WrapFn } from "./types.js";
4
+ import { AddRoute, AddWSRoute, AfterHandler, AfterResponseHandler, AnyErrorConstructor, AnyLocalHook, BodyHandler, CompiledHandler, CreateEden, DefaultEphemeral, DefaultMetadata, DefaultSingleton, DefinitionBase, DocumentDecoration, ElysiaConfig, ElysiaHandlerToResponseSchemaAmbiguous, EphemeralType, ErrorDefinitionEntry, ErrorHandler, EventScope, ExcludeElysiaResponse, ExtractErrorFromHandle, GracefulHandler, GuardLocalHook, HTTPMethod, InlineHandler, InlineHandlerNonMacro, InputSchema, InputSchemaKey, InternalRoute, IntersectIfObjectSchema, JoinPath, LocalHook, Macro, MacroSchemaChannel, MacroToContext, MacroToProperty, MapResponse, MaybeArray, MaybePromise, MergeElysiaInstances, MergeSchema, MergeScopedSchemas, MetadataBase, NonResolvableMacroKey, ObjectMacroDefs, OptionalHandler, PreHandler, Prettify, PublicRoute, ResolveRouteErrors, RouteBase, SingletonBase, TransformHandler, UnionResponseStatus, UnwrapRoute, WrapFn } from "./types.js";
5
5
  import { AnySchema } from "./type/types.js";
6
6
  import { ChainNode } from "./utils.js";
7
7
  import { Context, ErrorContext, LifecycleContext } from "./context.js";
@@ -34,6 +34,8 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
34
34
  error?: Map<AnyErrorConstructor, string>;
35
35
  parser?: Record<string, BodyHandler<any, any>>;
36
36
  hoc?: WrapFn<any>[];
37
+ setup?: GracefulHandler<any>[];
38
+ cleanup?: GracefulHandler<any>[];
37
39
  };
38
40
  '~hookChain'?: ChainNode;
39
41
  server?: Server;
@@ -43,11 +45,11 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
43
45
  '~map'?: {
44
46
  [method: string]: {
45
47
  [path: string]: CompiledHandler;
46
- };
48
+ } | undefined;
47
49
  };
48
50
  '~staticResponse'?: {
49
- [path: string]: {
50
- [method: string]: Response | Promise<Response>;
51
+ [method: string]: {
52
+ [path: string]: Response | Promise<Response>;
51
53
  };
52
54
  };
53
55
  '~hasWS'?: boolean;
@@ -148,11 +150,7 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
148
150
  derive: Singleton['derive'];
149
151
  }, Definitions, Metadata, Routes, Ephemeral, Volatile>;
150
152
  headers(headers: Record<string, string>): this;
151
- on<Event extends AppEvent>(event: Event, fn: EventFn<Event>): this;
152
153
  request(fn: MaybeArray<PreHandler<{}, Singleton>>): this;
153
- request(scope: 'local', fn: MaybeArray<PreHandler<{}, Singleton>>): this;
154
- request(scope: 'plugin', fn: MaybeArray<PreHandler<{}, Singleton>>): this;
155
- request(scope: 'global', fn: MaybeArray<PreHandler<{}, Singleton>>): this;
156
154
  parse(fn: MaybeArray<BodyHandler<MergeSchema<{}, {}, BasePath>, Singleton & {
157
155
  derive: Ephemeral['derive'] & Volatile['derive'];
158
156
  }>>): this;
@@ -176,8 +174,21 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
176
174
  parser: Metadata['parser'] & { [name in Name]: BodyHandler<any, any> };
177
175
  response: Metadata['response'];
178
176
  }, Routes, Ephemeral, Volatile>;
179
- onStart(_listener?: unknown): this;
180
- onStop(_listener?: unknown): this;
177
+ /**
178
+ * ### setup | Life cycle event
179
+ * Called after server is ready for serving
180
+ *
181
+ * ---
182
+ * @example
183
+ * ```typescript
184
+ * new Elysia()
185
+ * .setup(({ server }) => {
186
+ * console.log("Running at ${server?.url}:${server?.port}")
187
+ * })
188
+ * .listen(3000)
189
+ * ```
190
+ */
191
+ setup(handler: MaybeArray<GracefulHandler<this>>): this;
181
192
  transform(fn: MaybeArray<TransformHandler<MergeSchema<{}, {}, BasePath>, Singleton & {
182
193
  derive: Ephemeral['derive'] & Volatile['derive'];
183
194
  }>>): this;
@@ -496,62 +507,6 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
496
507
  parser: Metadata['parser'];
497
508
  response: UnionResponseStatus<Metadata['response'], UnionResponseStatus<Ephemeral['response'], Volatile['response']>>;
498
509
  }, Routes, DefaultEphemeral, DefaultEphemeral>;
499
- guard<const Input extends Metadata['macro'] & InputSchema<keyof Definitions['typebox'] & string>, const Schema extends MergeSchema<UnwrapRoute<Input, Definitions['typebox'], BasePath>, MergeSchema<Volatile['schema'], MergeSchema<Ephemeral['schema'], Metadata['schema']>>> & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], const MacroContext extends ({} extends Metadata['macroFn'] ? {} : MacroToContext<Metadata['macroFn'], Omit<Input, NonResolvableMacroKey>, Definitions['typebox']>), const BeforeHandle extends MaybeArray<OptionalHandler<Schema, Singleton>>, const AfterHandle extends MaybeArray<AfterHandler<Schema, Singleton>>, const ErrorHandle extends MaybeArray<ErrorHandler<Definitions['error'], Schema, Singleton>>>(hook: GuardLocalHook<Input, Schema & MacroContext, Singleton & {
500
- derive: Ephemeral['derive'] & Volatile['derive'] & MacroContext['response'];
501
- }, keyof Metadata['parser'], BeforeHandle, AfterHandle, ErrorHandle> & {
502
- as: 'plugin';
503
- schema: 'standalone';
504
- }): Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes, {
505
- derive: Ephemeral['derive'] & MacroContext['resolve'];
506
- schema: Ephemeral['schema'];
507
- schemas: Ephemeral['schemas'] & UnwrapRoute<Input, Definitions['typebox']> & MacroContext;
508
- response: UnionResponseStatus<Ephemeral['response'], ElysiaHandlerToResponseSchemaAmbiguous<BeforeHandle> & ElysiaHandlerToResponseSchemaAmbiguous<AfterHandle> & ElysiaHandlerToResponseSchemaAmbiguous<ErrorHandle> & MacroContext['return']>;
509
- error: Ephemeral['error'];
510
- }, Volatile>;
511
- guard<const Input extends Metadata['macro'] & InputSchema<keyof Definitions['typebox'] & string>, const Schema extends MergeSchema<UnwrapRoute<Input, Definitions['typebox'], BasePath>, MergeSchema<Volatile['schema'], MergeSchema<Ephemeral['schema'], Metadata['schema']>>> & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], const MacroContext extends ({} extends Metadata['macroFn'] ? {} : MacroToContext<Metadata['macroFn'], Omit<Input, NonResolvableMacroKey>, Definitions['typebox']>), const BeforeHandle extends MaybeArray<OptionalHandler<Schema, Singleton>>, const AfterHandle extends MaybeArray<AfterHandler<Schema, Singleton>>, const ErrorHandle extends MaybeArray<ErrorHandler<Definitions['error'], Schema, Singleton>>>(hook: GuardLocalHook<Input, Schema & MacroContext, Singleton & {
512
- derive: Ephemeral['derive'] & Volatile['derive'] & MacroContext['response'];
513
- }, keyof Metadata['parser'], BeforeHandle, AfterHandle, ErrorHandle, 'override'> & {
514
- as: 'plugin';
515
- }): Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes, {
516
- derive: Ephemeral['derive'] & MacroContext['resolve'];
517
- schema: {} extends Pick<Input, Extract<keyof Input, InputSchemaKey>> ? Ephemeral['schema'] : MergeSchema<UnwrapRoute<Input, Definitions['typebox']>, Ephemeral['schema']>;
518
- schemas: Ephemeral['schemas'] & MacroContext;
519
- response: UnionResponseStatus<Ephemeral['response'], ElysiaHandlerToResponseSchemaAmbiguous<BeforeHandle> & ElysiaHandlerToResponseSchemaAmbiguous<AfterHandle> & ElysiaHandlerToResponseSchemaAmbiguous<ErrorHandle> & MacroContext['return']>;
520
- error: Ephemeral['error'];
521
- }, Volatile>;
522
- guard<const Input extends Metadata['macro'] & InputSchema<keyof Definitions['typebox'] & string>, const Schema extends MergeSchema<UnwrapRoute<Input, Definitions['typebox'], BasePath>, MergeSchema<Volatile['schema'], MergeSchema<Ephemeral['schema'], Metadata['schema']>>> & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], const MacroContext extends ({} extends Metadata['macroFn'] ? {} : MacroToContext<Metadata['macroFn'], Omit<Input, NonResolvableMacroKey>, Definitions['typebox']>), const BeforeHandle extends MaybeArray<OptionalHandler<Schema, Singleton>>, const AfterHandle extends MaybeArray<AfterHandler<Schema, Singleton>>, const ErrorHandle extends MaybeArray<ErrorHandler<Definitions['error'], Schema, Singleton>>>(hook: GuardLocalHook<Input, Schema & MacroContext, Singleton & {
523
- derive: Ephemeral['derive'] & Volatile['derive'] & MacroContext['response'];
524
- }, keyof Metadata['parser'], BeforeHandle, AfterHandle, ErrorHandle> & {
525
- as: 'global';
526
- schema: 'standalone';
527
- }): Elysia<BasePath, Scope, {
528
- decorator: Singleton['decorator'];
529
- store: Singleton['store'];
530
- derive: Singleton['derive'] & MacroContext['resolve'];
531
- }, Definitions, {
532
- schema: Metadata['schema'];
533
- schemas: Metadata['schemas'] & UnwrapRoute<Input, Definitions['typebox']> & MacroContext;
534
- macro: Metadata['macro'];
535
- macroFn: Metadata['macroFn'];
536
- parser: Metadata['parser'];
537
- response: UnionResponseStatus<Metadata['response'], ElysiaHandlerToResponseSchemaAmbiguous<BeforeHandle> & ElysiaHandlerToResponseSchemaAmbiguous<AfterHandle> & ElysiaHandlerToResponseSchemaAmbiguous<ErrorHandle> & MacroContext['return']>;
538
- }, Routes, Ephemeral, Volatile>;
539
- guard<const Input extends Metadata['macro'] & InputSchema<keyof Definitions['typebox'] & string>, const Schema extends MergeSchema<UnwrapRoute<Input, Definitions['typebox'], BasePath>, MergeSchema<Volatile['schema'], MergeSchema<Ephemeral['schema'], Metadata['schema']>>> & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], const MacroContext extends ({} extends Metadata['macroFn'] ? {} : MacroToContext<Metadata['macroFn'], Omit<Input, NonResolvableMacroKey>, Definitions['typebox']>), const BeforeHandle extends MaybeArray<OptionalHandler<Schema, Singleton>>, const AfterHandle extends MaybeArray<AfterHandler<Schema, Singleton>>, const ErrorHandle extends MaybeArray<ErrorHandler<Definitions['error'], Schema, Singleton>>>(hook: GuardLocalHook<Input, Schema & MacroContext, Singleton & {
540
- derive: Ephemeral['derive'] & Volatile['derive'] & MacroContext['response'];
541
- }, keyof Metadata['parser'], BeforeHandle, AfterHandle, ErrorHandle, 'override'> & {
542
- as: 'global';
543
- }): Elysia<BasePath, Scope, {
544
- decorator: Singleton['decorator'];
545
- store: Singleton['store'];
546
- derive: Singleton['derive'] & MacroContext['resolve'];
547
- }, Definitions, {
548
- schema: {} extends Pick<Input, Extract<keyof Input, InputSchemaKey>> ? Metadata['schema'] : MergeSchema<UnwrapRoute<Input, Definitions['typebox']>, Metadata['schema']>;
549
- schemas: Metadata['schemas'] & MacroContext;
550
- macro: Metadata['macro'];
551
- macroFn: Metadata['macroFn'];
552
- parser: Metadata['parser'];
553
- response: UnionResponseStatus<Metadata['response'], ElysiaHandlerToResponseSchemaAmbiguous<BeforeHandle> & ElysiaHandlerToResponseSchemaAmbiguous<AfterHandle> & ElysiaHandlerToResponseSchemaAmbiguous<ErrorHandle> & MacroContext['return']>;
554
- }, Routes, Ephemeral, Volatile>;
555
510
  guard<const Input extends Metadata['macro'] & InputSchema<keyof Definitions['typebox'] & string>, const Schema extends MergeSchema<UnwrapRoute<Input, Definitions['typebox'], BasePath>, MergeSchema<Volatile['schema'], MergeSchema<Ephemeral['schema'], Metadata['schema']>>> & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], const MacroContext extends ({} extends Metadata['macroFn'] ? {} : MacroToContext<Metadata['macroFn'], Omit<Input, NonResolvableMacroKey>, Definitions['typebox']>), const BeforeHandle extends MaybeArray<OptionalHandler<Schema, Singleton>>, const AfterHandle extends MaybeArray<AfterHandler<Schema, Singleton>>, const ErrorHandle extends MaybeArray<ErrorHandler<Definitions['error'], Schema, Singleton>>>(hook: GuardLocalHook<Input, Schema & MacroContext, Singleton & {
556
511
  derive: Ephemeral['derive'] & Volatile['derive'] & MacroContext['response'];
557
512
  }, keyof Metadata['parser'], BeforeHandle, AfterHandle, ErrorHandle> & {
@@ -730,7 +685,7 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
730
685
  * .get('/', ({ user }) => user, { auth: true, role: 'admin' })
731
686
  * ```
732
687
  */
733
- macro<const Body, const Headers, const Query, const Params, const Cookie, const NewMacro>(macro: ObjectMacroDefs<Body, Headers, Query, Params, Cookie, NewMacro, MergeSchema<Volatile['schema'], MergeSchema<Ephemeral['schema'], Metadata['schema']>>, MergeScopedSchemas<Metadata['schemas'], Ephemeral['schemas'], Volatile['schemas']>, Singleton & {
688
+ macro<const Body extends MacroSchemaChannel<Definitions>, const Headers extends MacroSchemaChannel<Definitions>, const Query extends MacroSchemaChannel<Definitions>, const Params extends MacroSchemaChannel<Definitions>, const Cookie extends MacroSchemaChannel<Definitions>, const NewMacro>(macro: ObjectMacroDefs<Body, Headers, Query, Params, Cookie, NewMacro, MergeSchema<Volatile['schema'], MergeSchema<Ephemeral['schema'], Metadata['schema']>>, MergeScopedSchemas<Metadata['schemas'], Ephemeral['schemas'], Volatile['schemas']>, Singleton & {
734
689
  derive: Partial<Ephemeral['derive'] & Volatile['derive']>;
735
690
  }, Definitions, Metadata['macro']>): Elysia<BasePath, Scope, Singleton, Definitions, {
736
691
  schema: Metadata['schema'];
@@ -1047,7 +1002,22 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
1047
1002
  listen(options: string | number | Partial<Serve>, callback?: ListenCallback): this;
1048
1003
  wrap<T extends (...params: any) => MaybePromise<Response> = (request: Request, ...rest: any[]) => MaybePromise<Response>>(callback: WrapFn<T>): this;
1049
1004
  /**
1050
- * Stop the underlying server (if any). Mirrors `Server.stop()`.
1005
+ * ### cleanup | Life cycle event
1006
+ * Called after server stop serving request
1007
+ *
1008
+ * ---
1009
+ * @example
1010
+ * ```typescript
1011
+ * new Elysia()
1012
+ * .cleanup((app) => {
1013
+ * closeDatabase()
1014
+ * })
1015
+ * ```
1016
+ */
1017
+ cleanup(handler: MaybeArray<GracefulHandler<this>>): this;
1018
+ /**
1019
+ * Stop the underlying server (if any), running every `cleanup` handler once
1020
+ * it has stopped. Mirrors `Server.stop()`.
1051
1021
  *
1052
1022
  * @param closeActiveConnections Pass `true` to terminate in-flight
1053
1023
  * requests and WebSocket connections immediately. Defaults to