elysia 2.0.0-exp.41 → 2.0.0-exp.42

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 (137) hide show
  1. package/dist/adapter/bun/index.js +16 -4
  2. package/dist/adapter/bun/index.mjs +16 -4
  3. package/dist/adapter/utils.d.ts +2 -1
  4. package/dist/adapter/utils.js +37 -15
  5. package/dist/adapter/utils.mjs +37 -15
  6. package/dist/adapter/web-standard/handler.js +4 -3
  7. package/dist/adapter/web-standard/handler.mjs +4 -3
  8. package/dist/adapter/web-standard/index.js +10 -2
  9. package/dist/adapter/web-standard/index.mjs +10 -2
  10. package/dist/adapter/web-standard/utils.js +8 -2
  11. package/dist/adapter/web-standard/utils.mjs +8 -2
  12. package/dist/base.d.ts +5 -4
  13. package/dist/base.js +294 -120
  14. package/dist/base.mjs +297 -123
  15. package/dist/compile/aot-capture.js +1 -1
  16. package/dist/compile/aot-capture.mjs +1 -1
  17. package/dist/compile/aot.d.ts +2 -42
  18. package/dist/compile/aot.js +6 -18
  19. package/dist/compile/aot.mjs +6 -17
  20. package/dist/compile/handler/frozen-validator.js +1 -1
  21. package/dist/compile/handler/frozen-validator.mjs +1 -1
  22. package/dist/compile/handler/index.d.ts +1 -5
  23. package/dist/compile/handler/index.js +20 -12
  24. package/dist/compile/handler/index.mjs +22 -12
  25. package/dist/compile/handler/jit.js +86 -11
  26. package/dist/compile/handler/jit.mjs +87 -12
  27. package/dist/compile/handler/params.js +3 -1
  28. package/dist/compile/handler/params.mjs +4 -2
  29. package/dist/compile/handler/utils.d.ts +8 -3
  30. package/dist/compile/handler/utils.js +37 -3
  31. package/dist/compile/handler/utils.mjs +35 -3
  32. package/dist/compile/lexer.d.ts +1 -1
  33. package/dist/compile/utils.js +1 -1
  34. package/dist/compile/utils.mjs +1 -1
  35. package/dist/cookie/cookie.d.ts +1 -1
  36. package/dist/cookie/utils.js +1 -1
  37. package/dist/cookie/utils.mjs +1 -1
  38. package/dist/handler/error.js +2 -1
  39. package/dist/handler/error.mjs +2 -1
  40. package/dist/handler/fetch.js +2 -1
  41. package/dist/handler/fetch.mjs +2 -1
  42. package/dist/handler/utils.js +1 -1
  43. package/dist/handler/utils.mjs +2 -2
  44. package/dist/index.js +1 -1
  45. package/dist/index.mjs +1 -1
  46. package/dist/parse-query.js +2 -2
  47. package/dist/parse-query.mjs +2 -2
  48. package/dist/plugin/{bun.d.ts → aot/bun.d.ts} +2 -2
  49. package/dist/plugin/{bun.js → aot/bun.js} +6 -6
  50. package/dist/plugin/{bun.mjs → aot/bun.mjs} +2 -2
  51. package/dist/plugin/{core.d.ts → aot/core.d.ts} +46 -14
  52. package/dist/plugin/{core.js → aot/core.js} +105 -28
  53. package/dist/plugin/{core.mjs → aot/core.mjs} +100 -25
  54. package/dist/plugin/{esbuild.d.ts → aot/esbuild.d.ts} +3 -3
  55. package/dist/plugin/aot/esbuild.js +79 -0
  56. package/dist/plugin/aot/esbuild.mjs +77 -0
  57. package/dist/plugin/{source.d.ts → aot/source.d.ts} +5 -16
  58. package/dist/plugin/{source.js → aot/source.js} +13 -184
  59. package/dist/plugin/{source.mjs → aot/source.mjs} +14 -183
  60. package/dist/plugin/{treeshake.d.ts → aot/treeshake.d.ts} +1 -1
  61. package/dist/plugin/{treeshake.mjs → aot/treeshake.js} +8 -4
  62. package/dist/plugin/{treeshake.js → aot/treeshake.mjs} +6 -6
  63. package/dist/plugin/{vite.d.ts → aot/vite.d.ts} +2 -2
  64. package/dist/plugin/{vite.js → aot/vite.js} +19 -18
  65. package/dist/plugin/{vite.mjs → aot/vite.mjs} +7 -6
  66. package/dist/plugin/aot/worker.d.ts +1 -0
  67. package/dist/plugin/aot/worker.js +28 -0
  68. package/dist/plugin/aot/worker.mjs +27 -0
  69. package/dist/plugin/auto-head.d.ts +6 -0
  70. package/dist/plugin/auto-head.js +38 -0
  71. package/dist/plugin/auto-head.mjs +36 -0
  72. package/dist/trace.d.ts +1 -1
  73. package/dist/type/bridge-live.js +1 -1
  74. package/dist/type/bridge-live.mjs +1 -1
  75. package/dist/type/bridge.d.ts +6 -6
  76. package/dist/type/coerce-plan.d.ts +5 -1
  77. package/dist/type/coerce-plan.js +13 -0
  78. package/dist/type/coerce-plan.mjs +12 -1
  79. package/dist/type/coerce.js +15 -0
  80. package/dist/type/coerce.mjs +15 -0
  81. package/dist/type/compat.js +1 -1
  82. package/dist/type/compat.mjs +1 -1
  83. package/dist/type/constants.d.ts +1 -1
  84. package/dist/type/elysia/accelerate.js +2 -1
  85. package/dist/type/elysia/accelerate.mjs +2 -1
  86. package/dist/type/elysia/array-buffer.js +2 -2
  87. package/dist/type/elysia/array-buffer.mjs +2 -2
  88. package/dist/type/elysia/cookie.d.ts +2 -5
  89. package/dist/type/elysia/file-type.js +3 -2
  90. package/dist/type/elysia/file-type.mjs +3 -2
  91. package/dist/type/elysia/file.js +2 -2
  92. package/dist/type/elysia/file.mjs +2 -2
  93. package/dist/type/elysia/files.js +5 -5
  94. package/dist/type/elysia/files.mjs +5 -5
  95. package/dist/type/elysia/integer-string.js +3 -3
  96. package/dist/type/elysia/integer-string.mjs +3 -3
  97. package/dist/type/elysia/uint8-array.js +3 -3
  98. package/dist/type/elysia/uint8-array.mjs +3 -3
  99. package/dist/type/elysia/utils.d.ts +5 -1
  100. package/dist/type/elysia/utils.js +30 -5
  101. package/dist/type/elysia/utils.mjs +29 -6
  102. package/dist/type/types.d.ts +20 -8
  103. package/dist/type/validator/custom-error.js +126 -41
  104. package/dist/type/validator/custom-error.mjs +126 -41
  105. package/dist/type/validator/default-precompute.js +30 -16
  106. package/dist/type/validator/default-precompute.mjs +30 -16
  107. package/dist/type/validator/index.d.ts +1 -1
  108. package/dist/type/validator/index.js +3 -3
  109. package/dist/type/validator/index.mjs +3 -3
  110. package/dist/type/validator/validator-cache.d.ts +1 -2
  111. package/dist/type/validator/validator-cache.js +3 -13
  112. package/dist/type/validator/validator-cache.mjs +3 -13
  113. package/dist/types.d.ts +9 -19
  114. package/dist/universal/env.d.ts +3 -2
  115. package/dist/universal/env.js +6 -2
  116. package/dist/universal/env.mjs +5 -2
  117. package/dist/universal/file.d.ts +7 -4
  118. package/dist/universal/file.js +42 -26
  119. package/dist/universal/file.mjs +42 -26
  120. package/dist/universal/is-production.d.ts +2 -1
  121. package/dist/universal/is-production.js +3 -1
  122. package/dist/universal/is-production.mjs +4 -3
  123. package/dist/utils.d.ts +14 -1
  124. package/dist/utils.js +110 -6
  125. package/dist/utils.mjs +108 -7
  126. package/dist/validator/index.js +83 -13
  127. package/dist/validator/index.mjs +84 -14
  128. package/dist/validator/route.js +2 -1
  129. package/dist/validator/route.mjs +2 -1
  130. package/dist/ws/route.js +32 -10
  131. package/dist/ws/route.mjs +32 -10
  132. package/package.json +21 -13
  133. package/dist/compile/build-router.d.ts +0 -14
  134. package/dist/compile/build-router.js +0 -212
  135. package/dist/compile/build-router.mjs +0 -208
  136. package/dist/plugin/esbuild.js +0 -46
  137. package/dist/plugin/esbuild.mjs +0 -44
@@ -13,7 +13,7 @@ function collectStaticRoutes(app) {
13
13
  app.fetch;
14
14
  const fetchLevelHook = require_utils.flattenChain(app["~hookChain"]);
15
15
  if (fetchLevelHook?.request?.length || fetchLevelHook?.trace?.length || app["~ext"]?.hoc?.length) return;
16
- const history = app.history;
16
+ const history = app["~routes"];
17
17
  if (!history?.length) return;
18
18
  const ready = require_utils.nullObject();
19
19
  const pending = [];
@@ -86,9 +86,20 @@ const BunAdapter = require_adapter_index.createAdapter({
86
86
  } : _options;
87
87
  const server = app.server = Bun.serve(serve);
88
88
  const onSetup = app["~ext"]?.setup;
89
- if (onSetup) for (let i = 0; i < onSetup.length; i++) onSetup[i](app);
89
+ let setupReady;
90
+ if (onSetup) {
91
+ let pendingSetups;
92
+ for (let i = 0; i < onSetup.length; i++) {
93
+ const result = onSetup[i](app);
94
+ if (result && typeof result.then === "function") (pendingSetups ??= []).push(result);
95
+ }
96
+ if (pendingSetups) setupReady = Promise.all(pendingSetups);
97
+ }
90
98
  const hasWs = app["~hasWS"];
91
- if (!hasWs) callback?.(app.server);
99
+ if (!hasWs) {
100
+ if (callback) if (setupReady) setupReady.then(() => callback(app.server));
101
+ else callback(app.server);
102
+ }
92
103
  queueMicrotask(() => {
93
104
  if (app.server !== server) return;
94
105
  if (!app.pending) serve.fetch = app.fetch;
@@ -122,7 +133,8 @@ const BunAdapter = require_adapter_index.createAdapter({
122
133
  app.server.reload(serve);
123
134
  }
124
135
  require_memory.flushMemory();
125
- if (hasWs) callback?.(app.server);
136
+ if (hasWs && callback) if (setupReady) setupReady.then(() => callback(app.server));
137
+ else callback(app.server);
126
138
  });
127
139
  }
128
140
  });
@@ -12,7 +12,7 @@ function collectStaticRoutes(app) {
12
12
  app.fetch;
13
13
  const fetchLevelHook = flattenChain(app["~hookChain"]);
14
14
  if (fetchLevelHook?.request?.length || fetchLevelHook?.trace?.length || app["~ext"]?.hoc?.length) return;
15
- const history = app.history;
15
+ const history = app["~routes"];
16
16
  if (!history?.length) return;
17
17
  const ready = nullObject();
18
18
  const pending = [];
@@ -85,9 +85,20 @@ const BunAdapter = createAdapter({
85
85
  } : _options;
86
86
  const server = app.server = Bun.serve(serve);
87
87
  const onSetup = app["~ext"]?.setup;
88
- if (onSetup) for (let i = 0; i < onSetup.length; i++) onSetup[i](app);
88
+ let setupReady;
89
+ if (onSetup) {
90
+ let pendingSetups;
91
+ for (let i = 0; i < onSetup.length; i++) {
92
+ const result = onSetup[i](app);
93
+ if (result && typeof result.then === "function") (pendingSetups ??= []).push(result);
94
+ }
95
+ if (pendingSetups) setupReady = Promise.all(pendingSetups);
96
+ }
89
97
  const hasWs = app["~hasWS"];
90
- if (!hasWs) callback?.(app.server);
98
+ if (!hasWs) {
99
+ if (callback) if (setupReady) setupReady.then(() => callback(app.server));
100
+ else callback(app.server);
101
+ }
91
102
  queueMicrotask(() => {
92
103
  if (app.server !== server) return;
93
104
  if (!app.pending) serve.fetch = app.fetch;
@@ -121,7 +132,8 @@ const BunAdapter = createAdapter({
121
132
  app.server.reload(serve);
122
133
  }
123
134
  flushMemory();
124
- if (hasWs) callback?.(app.server);
135
+ if (hasWs && callback) if (setupReady) setupReady.then(() => callback(app.server));
136
+ else callback(app.server);
125
137
  });
126
138
  }
127
139
  });
@@ -1,9 +1,10 @@
1
1
  import { StatusMap } from "../constants.js";
2
+ import { ElysiaFile } from "../universal/file.js";
2
3
  import { BaseCookie } from "../cookie/types.js";
3
4
  import { HTTPHeaders } from "../types.js";
4
5
  import { Context } from "../context.js";
5
6
  //#region src/adapter/utils.d.ts
6
- declare function handleFile(response: File | Blob, set?: Context['set'], request?: Request): Response;
7
+ declare function handleFile(response: File | Blob | ElysiaFile, set?: Context['set'], request?: Request, size?: number): Response;
7
8
  declare function parseSetCookies(headers: Headers, setCookie: string[]): Headers;
8
9
  declare function responseToSetHeaders(response: Response, set?: Context['set']): {
9
10
  headers: HTTPHeaders;
@@ -11,9 +11,8 @@ const sseFormat = (data) => `data: ${data}\n\n`;
11
11
  const identityFormat = (data) => data;
12
12
  const textEncoder = new TextEncoder();
13
13
  const encodeChunk = (s) => textEncoder.encode(s);
14
- function handleFile(response, set, request) {
15
- if (!require_universal_constants.isBun && response instanceof Promise) return response.then((res) => handleFile(res, set, request));
16
- const size = response.size;
14
+ function handleFile(response, set, request, size = response.size) {
15
+ if (!require_universal_constants.isBun && response instanceof Promise) return response.then((res) => handleFile(res, set, request, size));
17
16
  const rangeHeader = request?.headers.get("range");
18
17
  if (rangeHeader) {
19
18
  const match = /bytes=(\d*)-(\d*)/.exec(rangeHeader);
@@ -48,26 +47,27 @@ function handleFile(response, set, request) {
48
47
  });
49
48
  }
50
49
  }
50
+ const body = "value" in response ? response.value : response;
51
51
  const immutable = set && (set.status === 206 || set.status === 304 || set.status === 412 || set.status === 416);
52
52
  const defaultHeader = immutable ? require_utils.nullObject() : {
53
53
  "accept-ranges": "bytes",
54
54
  "content-range": size ? `bytes 0-${size - 1}/${size}` : void 0
55
55
  };
56
- if (!set && !size) return new Response(response);
57
- if (!set) return new Response(response, { headers: defaultHeader });
56
+ if (!set && !size) return new Response(body);
57
+ if (!set) return new Response(body, { headers: defaultHeader });
58
58
  if (set.headers instanceof Headers) {
59
59
  for (const key of Object.keys(defaultHeader)) if (!set.headers.has(key)) set.headers.append(key, defaultHeader[key]);
60
60
  if (immutable) {
61
61
  set.headers.delete("content-length");
62
62
  set.headers.delete("accept-ranges");
63
63
  }
64
- return new Response(response, set);
64
+ return new Response(body, set);
65
65
  }
66
- if (require_utils.isNotEmpty(set.headers)) return new Response(response, {
66
+ if (require_utils.isNotEmpty(set.headers)) return new Response(body, {
67
67
  status: set.status,
68
68
  headers: Object.assign(defaultHeader, set.headers)
69
69
  });
70
- return new Response(response, {
70
+ return new Response(body, {
71
71
  status: set.status,
72
72
  headers: defaultHeader
73
73
  });
@@ -270,12 +270,26 @@ function handleSet(set) {
270
270
  }
271
271
  function applySetHeaders(target, setHeaders, present) {
272
272
  if (setHeaders instanceof Headers) {
273
- for (const key of setHeaders.keys()) if (key === setCookie) {
274
- if (target.has(setCookie)) continue;
275
- for (const cookie of setHeaders.getSetCookie()) target.append(setCookie, cookie);
276
- } else if (!present.has(key)) target.set(key, setHeaders.get(key) ?? "");
277
- } else for (const key in setHeaders) if (key === setCookie) target.append(key, setHeaders[key]);
278
- else if (!present.has(key)) target.set(key, setHeaders[key]);
273
+ const incoming = setHeaders.getSetCookie();
274
+ if (incoming.length) {
275
+ const cookies = target.getSetCookie();
276
+ for (const cookie of incoming) if (!cookies.includes(cookie)) {
277
+ target.append(setCookie, cookie);
278
+ cookies.push(cookie);
279
+ }
280
+ }
281
+ for (const key of setHeaders.keys()) if (key !== setCookie && !present.has(key)) target.set(key, setHeaders.get(key) ?? "");
282
+ } else {
283
+ let cookies;
284
+ for (const key in setHeaders) if (key === setCookie) {
285
+ const cookie = setHeaders[key];
286
+ cookies ??= target.getSetCookie();
287
+ if (!cookies.includes(cookie)) {
288
+ target.append(key, cookie);
289
+ cookies.push(cookie);
290
+ }
291
+ } else if (!present.has(key)) target.set(key, setHeaders[key]);
292
+ }
279
293
  }
280
294
  function mergeHeaders(responseHeaders, setHeaders) {
281
295
  const headers = new Headers(responseHeaders);
@@ -327,7 +341,15 @@ function createResponseHandler(handler) {
327
341
  return newResponse;
328
342
  };
329
343
  }
330
- const teeChunkCost = (chunk) => typeof chunk === "string" ? chunk.length : chunk?.byteLength ?? 64;
344
+ function teeChunkCost(chunk) {
345
+ if (typeof chunk === "string") return chunk.length;
346
+ if (typeof chunk !== "object" || chunk === null) return 64;
347
+ const byteLength = chunk.byteLength;
348
+ if (typeof byteLength === "number") return byteLength;
349
+ const size = chunk.size;
350
+ if (typeof size === "number") return size;
351
+ return 64;
352
+ }
331
353
  const doneResult = {
332
354
  done: true,
333
355
  value: void 0
@@ -10,9 +10,8 @@ const sseFormat = (data) => `data: ${data}\n\n`;
10
10
  const identityFormat = (data) => data;
11
11
  const textEncoder = new TextEncoder();
12
12
  const encodeChunk = (s) => textEncoder.encode(s);
13
- function handleFile(response, set, request) {
14
- if (!isBun && response instanceof Promise) return response.then((res) => handleFile(res, set, request));
15
- const size = response.size;
13
+ function handleFile(response, set, request, size = response.size) {
14
+ if (!isBun && response instanceof Promise) return response.then((res) => handleFile(res, set, request, size));
16
15
  const rangeHeader = request?.headers.get("range");
17
16
  if (rangeHeader) {
18
17
  const match = /bytes=(\d*)-(\d*)/.exec(rangeHeader);
@@ -47,26 +46,27 @@ function handleFile(response, set, request) {
47
46
  });
48
47
  }
49
48
  }
49
+ const body = "value" in response ? response.value : response;
50
50
  const immutable = set && (set.status === 206 || set.status === 304 || set.status === 412 || set.status === 416);
51
51
  const defaultHeader = immutable ? nullObject() : {
52
52
  "accept-ranges": "bytes",
53
53
  "content-range": size ? `bytes 0-${size - 1}/${size}` : void 0
54
54
  };
55
- if (!set && !size) return new Response(response);
56
- if (!set) return new Response(response, { headers: defaultHeader });
55
+ if (!set && !size) return new Response(body);
56
+ if (!set) return new Response(body, { headers: defaultHeader });
57
57
  if (set.headers instanceof Headers) {
58
58
  for (const key of Object.keys(defaultHeader)) if (!set.headers.has(key)) set.headers.append(key, defaultHeader[key]);
59
59
  if (immutable) {
60
60
  set.headers.delete("content-length");
61
61
  set.headers.delete("accept-ranges");
62
62
  }
63
- return new Response(response, set);
63
+ return new Response(body, set);
64
64
  }
65
- if (isNotEmpty(set.headers)) return new Response(response, {
65
+ if (isNotEmpty(set.headers)) return new Response(body, {
66
66
  status: set.status,
67
67
  headers: Object.assign(defaultHeader, set.headers)
68
68
  });
69
- return new Response(response, {
69
+ return new Response(body, {
70
70
  status: set.status,
71
71
  headers: defaultHeader
72
72
  });
@@ -269,12 +269,26 @@ function handleSet(set) {
269
269
  }
270
270
  function applySetHeaders(target, setHeaders, present) {
271
271
  if (setHeaders instanceof Headers) {
272
- for (const key of setHeaders.keys()) if (key === setCookie) {
273
- if (target.has(setCookie)) continue;
274
- for (const cookie of setHeaders.getSetCookie()) target.append(setCookie, cookie);
275
- } else if (!present.has(key)) target.set(key, setHeaders.get(key) ?? "");
276
- } else for (const key in setHeaders) if (key === setCookie) target.append(key, setHeaders[key]);
277
- else if (!present.has(key)) target.set(key, setHeaders[key]);
272
+ const incoming = setHeaders.getSetCookie();
273
+ if (incoming.length) {
274
+ const cookies = target.getSetCookie();
275
+ for (const cookie of incoming) if (!cookies.includes(cookie)) {
276
+ target.append(setCookie, cookie);
277
+ cookies.push(cookie);
278
+ }
279
+ }
280
+ for (const key of setHeaders.keys()) if (key !== setCookie && !present.has(key)) target.set(key, setHeaders.get(key) ?? "");
281
+ } else {
282
+ let cookies;
283
+ for (const key in setHeaders) if (key === setCookie) {
284
+ const cookie = setHeaders[key];
285
+ cookies ??= target.getSetCookie();
286
+ if (!cookies.includes(cookie)) {
287
+ target.append(key, cookie);
288
+ cookies.push(cookie);
289
+ }
290
+ } else if (!present.has(key)) target.set(key, setHeaders[key]);
291
+ }
278
292
  }
279
293
  function mergeHeaders(responseHeaders, setHeaders) {
280
294
  const headers = new Headers(responseHeaders);
@@ -326,7 +340,15 @@ function createResponseHandler(handler) {
326
340
  return newResponse;
327
341
  };
328
342
  }
329
- const teeChunkCost = (chunk) => typeof chunk === "string" ? chunk.length : chunk?.byteLength ?? 64;
343
+ function teeChunkCost(chunk) {
344
+ if (typeof chunk === "string") return chunk.length;
345
+ if (typeof chunk !== "object" || chunk === null) return 64;
346
+ const byteLength = chunk.byteLength;
347
+ if (typeof byteLength === "number") return byteLength;
348
+ const size = chunk.size;
349
+ if (typeof size === "number") return size;
350
+ return 64;
351
+ }
330
352
  const doneResult = {
331
353
  done: true,
332
354
  value: void 0
@@ -11,13 +11,14 @@ function handleElysiaFile(file, set = { headers: require_utils.nullObject() }, r
11
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
- if (file.stats && set.status !== 206 && set.status !== 304 && set.status !== 412 && set.status !== 416) return file.stats.then((stat) => {
14
+ const stats = file.stats;
15
+ if (stats) return stats.then((stat) => {
15
16
  const size = stat.size;
16
- if (size !== void 0) {
17
+ if (size !== void 0 && set.status !== 206 && set.status !== 304 && set.status !== 412 && set.status !== 416) {
17
18
  headers["content-range"] = `bytes 0-${size - 1}/${size}`;
18
19
  headers["content-length"] = size;
19
20
  }
20
- return require_adapter_utils.handleFile(file.value, set, request);
21
+ return require_adapter_utils.handleFile(file, set, request, size);
21
22
  });
22
23
  return require_adapter_utils.handleFile(file.value, set, request);
23
24
  }
@@ -10,13 +10,14 @@ function handleElysiaFile(file, set = { headers: nullObject() }, request) {
10
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
- if (file.stats && set.status !== 206 && set.status !== 304 && set.status !== 412 && set.status !== 416) return file.stats.then((stat) => {
13
+ const stats = file.stats;
14
+ if (stats) return stats.then((stat) => {
14
15
  const size = stat.size;
15
- if (size !== void 0) {
16
+ if (size !== void 0 && set.status !== 206 && set.status !== 304 && set.status !== 412 && set.status !== 416) {
16
17
  headers["content-range"] = `bytes 0-${size - 1}/${size}`;
17
18
  headers["content-length"] = size;
18
19
  }
19
- return handleFile(file.value, set, request);
20
+ return handleFile(file, set, request, size);
20
21
  });
21
22
  return handleFile(file.value, set, request);
22
23
  }
@@ -22,7 +22,12 @@ function parseFormData(context, contentType) {
22
22
  const fixedCt = semi === -1 ? lowercaseContentType(fullCt) : lowercaseContentType(fullCt.slice(0, semi)) + fullCt.slice(semi);
23
23
  const headers = new Headers(context.request.headers);
24
24
  headers.set("content-type", fixedCt);
25
- return new Request(context.request, { headers }).formData().then(require_adapter_web_standard_utils.formDataToObject);
25
+ return new Request(context.request.url, {
26
+ method: context.request.method,
27
+ headers,
28
+ body: context.request.body,
29
+ duplex: "half"
30
+ }).formData().then(require_adapter_web_standard_utils.formDataToObject);
26
31
  }
27
32
  return context.request.formData().then(require_adapter_web_standard_utils.formDataToObject);
28
33
  }
@@ -45,7 +50,10 @@ const WebStandardAdapter = require_adapter_index.createAdapter({
45
50
  break;
46
51
  case 111: return context.request.arrayBuffer();
47
52
  case 114: return parseFormData(context, contentType);
48
- default: if (ct.charCodeAt(0) === 116) return context.request.text();
53
+ default:
54
+ if (ct.charCodeAt(0) === 116) return context.request.text();
55
+ const semi = ct.indexOf(";");
56
+ if ((semi === -1 ? ct : ct.slice(0, semi)).endsWith("+json")) return context.request.json();
49
57
  }
50
58
  }
51
59
  },
@@ -21,7 +21,12 @@ function parseFormData(context, contentType) {
21
21
  const fixedCt = semi === -1 ? lowercaseContentType(fullCt) : lowercaseContentType(fullCt.slice(0, semi)) + fullCt.slice(semi);
22
22
  const headers = new Headers(context.request.headers);
23
23
  headers.set("content-type", fixedCt);
24
- return new Request(context.request, { headers }).formData().then(formDataToObject);
24
+ return new Request(context.request.url, {
25
+ method: context.request.method,
26
+ headers,
27
+ body: context.request.body,
28
+ duplex: "half"
29
+ }).formData().then(formDataToObject);
25
30
  }
26
31
  return context.request.formData().then(formDataToObject);
27
32
  }
@@ -44,7 +49,10 @@ const WebStandardAdapter = createAdapter({
44
49
  break;
45
50
  case 111: return context.request.arrayBuffer();
46
51
  case 114: return parseFormData(context, contentType);
47
- default: if (ct.charCodeAt(0) === 116) return context.request.text();
52
+ default:
53
+ if (ct.charCodeAt(0) === 116) return context.request.text();
54
+ const semi = ct.indexOf(";");
55
+ if ((semi === -1 ? ct : ct.slice(0, semi)).endsWith("+json")) return context.request.json();
48
56
  }
49
57
  }
50
58
  },
@@ -83,8 +83,14 @@ function setNested(body, path, value, budget) {
83
83
  i += 2;
84
84
  } else {
85
85
  const start = i;
86
- while (i < len && path.charCodeAt(i) !== BRACKET_C) i++;
87
- key = +path.slice(start, i);
86
+ let allDigits = i < len;
87
+ while (i < len && path.charCodeAt(i) !== BRACKET_C) {
88
+ const c = path.charCodeAt(i);
89
+ if (c < ZERO || c > NINE) allDigits = false;
90
+ i++;
91
+ }
92
+ const segment = path.slice(start, i);
93
+ key = allDigits ? +segment : segment;
88
94
  i++;
89
95
  }
90
96
  } else {
@@ -82,8 +82,14 @@ function setNested(body, path, value, budget) {
82
82
  i += 2;
83
83
  } else {
84
84
  const start = i;
85
- while (i < len && path.charCodeAt(i) !== BRACKET_C) i++;
86
- key = +path.slice(start, i);
85
+ let allDigits = i < len;
86
+ while (i < len && path.charCodeAt(i) !== BRACKET_C) {
87
+ const c = path.charCodeAt(i);
88
+ if (c < ZERO || c > NINE) allDigits = false;
89
+ i++;
90
+ }
91
+ const segment = path.slice(start, i);
92
+ key = allDigits ? +segment : segment;
87
93
  i++;
88
94
  }
89
95
  } else {
package/dist/base.d.ts CHANGED
@@ -2,7 +2,7 @@ import { ElysiaStatus } from "./error.js";
2
2
  import { TraceHandler } from "./trace.js";
3
3
  import { AnySchema } from "./type/types.js";
4
4
  import { ListenCallback, Serve, Server } from "./universal/server.js";
5
- import { AddRoute, AddWSRoute, AfterHandler, AfterResponseHandler, AnyErrorConstructor, AnyLocalHook, BodyHandler, CompiledHandler, CreateEden, DefaultEphemeral, DefaultMetadata, DefaultSingleton, DefinitionBase, DocumentDecoration, ElysiaConfig, ElysiaHandlerToResponseSchemaAmbiguous, EphemeralType, ErrorDefinitionEntry, ErrorHandler, EventScope, ExcludeElysiaResponse, ExtractErrorFromHandle, GlobalHookReturn, GracefulHandler, GuardHookSingleton, GuardLocalHook, HTTPMethod, HookContextSchema, HookContextSingleton, InlineHandler, InlineHandlerNonMacro, InputSchema, InputSchemaKey, InternalRoute, IntersectIfObjectSchema, JoinPath, LocalHook, LocalHookReturn, Macro, MacroSchemaChannel, MacroToContext, MacroToProperty, MapResponse, MaybeArray, MaybePromise, MergeElysiaInstances, MergeSchema, MergeScopedSchemas, MetadataBase, NonResolvableMacroKey, ObjectMacroDefs, OptionalHandler, PluginHookReturn, PreHandler, Prettify, PublicRoute, ResolveRouteErrors, RouteBase, SingletonBase, TransformHandler, UnionResponseStatus, UnwrapRoute, WrapFn } from "./types.js";
5
+ import { AddRoute, AddWSRoute, AfterHandler, AfterResponseHandler, AnyErrorConstructor, AnyLocalHook, BodyHandler, CompiledHandler, CreateEden, DefaultEphemeral, DefaultMetadata, DefaultSingleton, DefinitionBase, DocumentDecoration, ElysiaConfig, ElysiaHandlerToResponseSchemaAmbiguous, EphemeralType, ErrorDefinitionEntry, ErrorHandler, EventScope, ExcludeElysiaResponse, ExtractErrorFromHandle, GlobalHookReturn, GracefulHandler, GuardHookSingleton, GuardLocalHook, HTTPMethod, HistoryEntry, HookContextSchema, HookContextSingleton, InlineHandler, InlineHandlerNonMacro, InputSchema, InputSchemaKey, InternalRoute, IntersectIfObjectSchema, JoinPath, LocalHook, LocalHookReturn, Macro, MacroSchemaChannel, MacroToContext, MacroToProperty, MapResponse, MaybeArray, MaybePromise, MergeElysiaInstances, MergeSchema, MergeScopedSchemas, MetadataBase, NonResolvableMacroKey, ObjectMacroDefs, OptionalHandler, PluginHookReturn, PreHandler, Prettify, PublicRoute, ResolveRouteErrors, RouteBase, SingletonBase, TransformHandler, UnionResponseStatus, UnwrapRoute, WrapFn } from "./types.js";
6
6
  import { ChainNode } from "./utils.js";
7
7
  import { Context, ErrorContext, LifecycleContext } from "./context.js";
8
8
  import { WSHandlerResponse, WSLocalHook, WSMessageHandler } from "./ws/types.js";
@@ -14,7 +14,6 @@ type AnyElysia = Elysia<any, any, any, any, any, any, any, any>;
14
14
  interface StaticMapAliases {
15
15
  method: string;
16
16
  paths: string[];
17
- head: boolean;
18
17
  }
19
18
  declare class Elysia<const in out BasePath extends string = '', const in out Scope extends EventScope = 'local', const in out Singleton extends SingletonBase = DefaultSingleton, const in out Definitions extends DefinitionBase = {
20
19
  typebox: {};
@@ -44,7 +43,9 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
44
43
  };
45
44
  '~hookChain'?: ChainNode;
46
45
  server?: Server;
47
- get history(): InternalRoute[] | undefined;
46
+ get history(): readonly HistoryEntry[];
47
+ get ['~routes'](): readonly InternalRoute[];
48
+ ['~addRoute'](route: InternalRoute): this;
48
49
  '~router'?: Memoirist<CompiledHandler>;
49
50
  '~map'?: {
50
51
  [method: string]: {
@@ -860,4 +861,4 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
860
861
  stop(closeActiveConnections?: boolean): Promise<void> | void;
861
862
  }
862
863
  //#endregion
863
- export { AnyElysia, Elysia, StaticMapAliases };
864
+ export { AnyElysia, Elysia };