elysia 1.0.21 → 1.0.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.
@@ -472,7 +472,7 @@ var validateFile = (options, value) => {
472
472
  }
473
473
  return true;
474
474
  };
475
- var File = import_typebox.TypeRegistry.Get("Files") ?? import_system.TypeSystem.Type("File", validateFile);
475
+ var File2 = import_typebox.TypeRegistry.Get("Files") ?? import_system.TypeSystem.Type("File", validateFile);
476
476
  var Files = import_typebox.TypeRegistry.Get("Files") ?? import_system.TypeSystem.Type(
477
477
  "Files",
478
478
  (options, value) => {
@@ -618,7 +618,7 @@ var ElysiaType = {
618
618
  return JSON.stringify(value);
619
619
  });
620
620
  },
621
- File,
621
+ File: File2,
622
622
  Files: (options = {}) => t.Transform(Files(options)).Decode((value) => {
623
623
  if (Array.isArray(value))
624
624
  return value;
@@ -780,6 +780,24 @@ var InvertedStatusMap = Object.fromEntries(
780
780
  Object.entries(StatusMap).map(([k, v]) => [v, k])
781
781
  );
782
782
  var encoder = new TextEncoder();
783
+ var ELYSIA_FORM_DATA = Symbol("ElysiaFormData");
784
+ var form = (items) => {
785
+ const formData = new FormData();
786
+ for (const [key, value] of Object.entries(items)) {
787
+ if (Array.isArray(value)) {
788
+ for (const v of value) {
789
+ if (value instanceof File)
790
+ formData.append(key, value, value.name);
791
+ formData.append(key, v);
792
+ }
793
+ continue;
794
+ }
795
+ if (value instanceof File)
796
+ formData.append(key, value, value.name);
797
+ formData.append(key, value);
798
+ }
799
+ return formData;
800
+ };
783
801
 
784
802
  // src/handler.ts
785
803
  var hasHeaderShorthand = "toJSON" in new Headers();
@@ -887,9 +905,21 @@ var mapResponse = (response, set, request) => {
887
905
  return new Response(response, set);
888
906
  case "Blob":
889
907
  return handleFile(response, set);
890
- case "Object":
891
908
  case "Array":
892
909
  return Response.json(response, set);
910
+ case "Object":
911
+ for (const value in Object.values(response)) {
912
+ switch (value?.constructor?.name) {
913
+ case "Blob":
914
+ case "File":
915
+ case "ArrayBuffer":
916
+ case "FileRef":
917
+ return new Response(form(response));
918
+ default:
919
+ break;
920
+ }
921
+ }
922
+ return Response.json(response, set);
893
923
  case "ReadableStream":
894
924
  if (!set.headers["content-type"]?.startsWith(
895
925
  "text/event-stream"
@@ -963,6 +993,8 @@ var mapResponse = (response, set, request) => {
963
993
  if (response instanceof Cookie)
964
994
  return new Response(response.value, set);
965
995
  return new Response(response?.toString(), set);
996
+ case "FormData":
997
+ return new Response(response, set);
966
998
  default:
967
999
  if (response instanceof Response) {
968
1000
  let isCookieSet2 = false;
@@ -1022,13 +1054,24 @@ var mapResponse = (response, set, request) => {
1022
1054
  return new Response(response);
1023
1055
  case "Blob":
1024
1056
  return handleFile(response, set);
1025
- case "Object":
1026
1057
  case "Array":
1027
- return new Response(JSON.stringify(response), {
1028
- headers: {
1029
- "content-type": "application/json"
1058
+ return Response.json(response);
1059
+ case "Object":
1060
+ for (const value in Object.values(response)) {
1061
+ switch (value?.constructor?.name) {
1062
+ case "Blob":
1063
+ case "File":
1064
+ case "ArrayBuffer":
1065
+ case "FileRef":
1066
+ return new Response(
1067
+ form(response),
1068
+ set
1069
+ );
1070
+ default:
1071
+ break;
1030
1072
  }
1031
- });
1073
+ }
1074
+ return Response.json(response, set);
1032
1075
  case "ReadableStream":
1033
1076
  request?.signal.addEventListener(
1034
1077
  "abort",
@@ -1075,6 +1118,8 @@ var mapResponse = (response, set, request) => {
1075
1118
  if (response instanceof Cookie)
1076
1119
  return new Response(response.value, set);
1077
1120
  return new Response(response?.toString(), set);
1121
+ case "FormData":
1122
+ return new Response(response, set);
1078
1123
  default:
1079
1124
  if (response instanceof Response)
1080
1125
  return new Response(response.body, {
@@ -1129,9 +1174,24 @@ var mapEarlyResponse = (response, set, request) => {
1129
1174
  return new Response(response, set);
1130
1175
  case "Blob":
1131
1176
  return handleFile(response, set);
1132
- case "Object":
1133
1177
  case "Array":
1134
1178
  return Response.json(response, set);
1179
+ case "Object":
1180
+ for (const value in Object.values(response)) {
1181
+ switch (value?.constructor?.name) {
1182
+ case "Blob":
1183
+ case "File":
1184
+ case "ArrayBuffer":
1185
+ case "FileRef":
1186
+ return new Response(
1187
+ form(response),
1188
+ set
1189
+ );
1190
+ default:
1191
+ break;
1192
+ }
1193
+ }
1194
+ return Response.json(response, set);
1135
1195
  case "ReadableStream":
1136
1196
  if (!set.headers["content-type"]?.startsWith(
1137
1197
  "text/event-stream"
@@ -1203,6 +1263,8 @@ var mapEarlyResponse = (response, set, request) => {
1203
1263
  response.toString(),
1204
1264
  set
1205
1265
  );
1266
+ case "FormData":
1267
+ return new Response(response);
1206
1268
  case "Cookie":
1207
1269
  if (response instanceof Cookie)
1208
1270
  return new Response(response.value, set);
@@ -1262,13 +1324,24 @@ var mapEarlyResponse = (response, set, request) => {
1262
1324
  return new Response(response);
1263
1325
  case "Blob":
1264
1326
  return handleFile(response, set);
1265
- case "Object":
1266
1327
  case "Array":
1267
- return new Response(JSON.stringify(response), {
1268
- headers: {
1269
- "content-type": "application/json"
1328
+ return Response.json(response);
1329
+ case "Object":
1330
+ for (const value in Object.values(response)) {
1331
+ switch (value?.constructor?.name) {
1332
+ case "Blob":
1333
+ case "File":
1334
+ case "ArrayBuffer":
1335
+ case "FileRef":
1336
+ return new Response(
1337
+ form(response),
1338
+ set
1339
+ );
1340
+ default:
1341
+ break;
1270
1342
  }
1271
- });
1343
+ }
1344
+ return Response.json(response, set);
1272
1345
  case "ReadableStream":
1273
1346
  request?.signal.addEventListener(
1274
1347
  "abort",
@@ -1314,6 +1387,8 @@ var mapEarlyResponse = (response, set, request) => {
1314
1387
  if (response instanceof Cookie)
1315
1388
  return new Response(response.value, set);
1316
1389
  return new Response(response?.toString(), set);
1390
+ case "FormData":
1391
+ return new Response(response);
1317
1392
  default:
1318
1393
  if (response instanceof Response)
1319
1394
  return new Response(response.body, {
@@ -1353,13 +1428,23 @@ var mapCompactResponse = (response, request) => {
1353
1428
  return new Response(response);
1354
1429
  case "Blob":
1355
1430
  return handleFile(response);
1356
- case "Object":
1357
1431
  case "Array":
1358
- return new Response(JSON.stringify(response), {
1359
- headers: {
1360
- "content-type": "application/json"
1361
- }
1362
- });
1432
+ return Response.json(response);
1433
+ case "Object":
1434
+ form:
1435
+ for (const value of Object.values(response))
1436
+ switch (value?.constructor?.name) {
1437
+ case "Blob":
1438
+ case "File":
1439
+ case "ArrayBuffer":
1440
+ case "FileRef":
1441
+ return new Response(form(response));
1442
+ case "Object":
1443
+ break form;
1444
+ default:
1445
+ break;
1446
+ }
1447
+ return Response.json(response);
1363
1448
  case "ReadableStream":
1364
1449
  request?.signal.addEventListener(
1365
1450
  "abort",
@@ -1399,6 +1484,8 @@ var mapCompactResponse = (response, request) => {
1399
1484
  case "Number":
1400
1485
  case "Boolean":
1401
1486
  return new Response(response.toString());
1487
+ case "FormData":
1488
+ return new Response(response);
1402
1489
  default:
1403
1490
  if (response instanceof Response)
1404
1491
  return new Response(response.body, {
@@ -1418,7 +1418,7 @@ export { Elysia };
1418
1418
  export { mapResponse, mapCompactResponse, mapEarlyResponse } from './handler';
1419
1419
  export { t } from './type-system';
1420
1420
  export { Cookie, type CookieOptions } from './cookies';
1421
- export { getSchemaValidator, mergeHook, mergeObjectArray, getResponseSchemaValidator, redirect, StatusMap, InvertedStatusMap } from './utils';
1421
+ export { getSchemaValidator, mergeHook, mergeObjectArray, getResponseSchemaValidator, redirect, StatusMap, InvertedStatusMap, form, type ELYSIA_FORM_DATA } from './utils';
1422
1422
  export { error, ParseError, NotFoundError, ValidationError, InternalServerError, InvalidCookieSignature, ERROR_CODE, ELYSIA_RESPONSE } from './error';
1423
1423
  export type { Context, PreContext } from './context';
1424
1424
  export type { EphemeralType, CreateEden, ComposeElysiaResponse, ElysiaConfig, SingletonBase, DefinitionBase, RouteBase, Handler, ComposedHandler, InputSchema, LocalHook, MergeSchema, RouteSchema, UnwrapRoute, InternalRoute, HTTPMethod, SchemaValidator, VoidHandler, PreHandler, BodyHandler, OptionalHandler, ErrorHandler, AfterHandler, LifeCycleEvent, TraceEvent, LifeCycleStore, LifeCycleType, MaybePromise, ListenCallback, UnwrapSchema, TraceHandler, TraceProcess, TraceReporter, TraceStream, Checksum, DocumentDecoration, InferContext, InferHandler } from './types';
package/dist/cjs/index.js CHANGED
@@ -43,6 +43,7 @@ __export(src_exports, {
43
43
  ValidationError: () => ValidationError,
44
44
  default: () => Elysia,
45
45
  error: () => error,
46
+ form: () => form,
46
47
  getResponseSchemaValidator: () => getResponseSchemaValidator,
47
48
  getSchemaValidator: () => getSchemaValidator,
48
49
  mapCompactResponse: () => mapCompactResponse,
@@ -1192,9 +1193,21 @@ var mapResponse = (response, set, request) => {
1192
1193
  return new Response(response, set);
1193
1194
  case "Blob":
1194
1195
  return handleFile(response, set);
1195
- case "Object":
1196
1196
  case "Array":
1197
1197
  return Response.json(response, set);
1198
+ case "Object":
1199
+ for (const value in Object.values(response)) {
1200
+ switch (value?.constructor?.name) {
1201
+ case "Blob":
1202
+ case "File":
1203
+ case "ArrayBuffer":
1204
+ case "FileRef":
1205
+ return new Response(form(response));
1206
+ default:
1207
+ break;
1208
+ }
1209
+ }
1210
+ return Response.json(response, set);
1198
1211
  case "ReadableStream":
1199
1212
  if (!set.headers["content-type"]?.startsWith(
1200
1213
  "text/event-stream"
@@ -1268,6 +1281,8 @@ var mapResponse = (response, set, request) => {
1268
1281
  if (response instanceof Cookie)
1269
1282
  return new Response(response.value, set);
1270
1283
  return new Response(response?.toString(), set);
1284
+ case "FormData":
1285
+ return new Response(response, set);
1271
1286
  default:
1272
1287
  if (response instanceof Response) {
1273
1288
  let isCookieSet2 = false;
@@ -1327,13 +1342,24 @@ var mapResponse = (response, set, request) => {
1327
1342
  return new Response(response);
1328
1343
  case "Blob":
1329
1344
  return handleFile(response, set);
1330
- case "Object":
1331
1345
  case "Array":
1332
- return new Response(JSON.stringify(response), {
1333
- headers: {
1334
- "content-type": "application/json"
1346
+ return Response.json(response);
1347
+ case "Object":
1348
+ for (const value in Object.values(response)) {
1349
+ switch (value?.constructor?.name) {
1350
+ case "Blob":
1351
+ case "File":
1352
+ case "ArrayBuffer":
1353
+ case "FileRef":
1354
+ return new Response(
1355
+ form(response),
1356
+ set
1357
+ );
1358
+ default:
1359
+ break;
1335
1360
  }
1336
- });
1361
+ }
1362
+ return Response.json(response, set);
1337
1363
  case "ReadableStream":
1338
1364
  request?.signal.addEventListener(
1339
1365
  "abort",
@@ -1380,6 +1406,8 @@ var mapResponse = (response, set, request) => {
1380
1406
  if (response instanceof Cookie)
1381
1407
  return new Response(response.value, set);
1382
1408
  return new Response(response?.toString(), set);
1409
+ case "FormData":
1410
+ return new Response(response, set);
1383
1411
  default:
1384
1412
  if (response instanceof Response)
1385
1413
  return new Response(response.body, {
@@ -1434,9 +1462,24 @@ var mapEarlyResponse = (response, set, request) => {
1434
1462
  return new Response(response, set);
1435
1463
  case "Blob":
1436
1464
  return handleFile(response, set);
1437
- case "Object":
1438
1465
  case "Array":
1439
1466
  return Response.json(response, set);
1467
+ case "Object":
1468
+ for (const value in Object.values(response)) {
1469
+ switch (value?.constructor?.name) {
1470
+ case "Blob":
1471
+ case "File":
1472
+ case "ArrayBuffer":
1473
+ case "FileRef":
1474
+ return new Response(
1475
+ form(response),
1476
+ set
1477
+ );
1478
+ default:
1479
+ break;
1480
+ }
1481
+ }
1482
+ return Response.json(response, set);
1440
1483
  case "ReadableStream":
1441
1484
  if (!set.headers["content-type"]?.startsWith(
1442
1485
  "text/event-stream"
@@ -1508,6 +1551,8 @@ var mapEarlyResponse = (response, set, request) => {
1508
1551
  response.toString(),
1509
1552
  set
1510
1553
  );
1554
+ case "FormData":
1555
+ return new Response(response);
1511
1556
  case "Cookie":
1512
1557
  if (response instanceof Cookie)
1513
1558
  return new Response(response.value, set);
@@ -1567,13 +1612,24 @@ var mapEarlyResponse = (response, set, request) => {
1567
1612
  return new Response(response);
1568
1613
  case "Blob":
1569
1614
  return handleFile(response, set);
1570
- case "Object":
1571
1615
  case "Array":
1572
- return new Response(JSON.stringify(response), {
1573
- headers: {
1574
- "content-type": "application/json"
1616
+ return Response.json(response);
1617
+ case "Object":
1618
+ for (const value in Object.values(response)) {
1619
+ switch (value?.constructor?.name) {
1620
+ case "Blob":
1621
+ case "File":
1622
+ case "ArrayBuffer":
1623
+ case "FileRef":
1624
+ return new Response(
1625
+ form(response),
1626
+ set
1627
+ );
1628
+ default:
1629
+ break;
1575
1630
  }
1576
- });
1631
+ }
1632
+ return Response.json(response, set);
1577
1633
  case "ReadableStream":
1578
1634
  request?.signal.addEventListener(
1579
1635
  "abort",
@@ -1619,6 +1675,8 @@ var mapEarlyResponse = (response, set, request) => {
1619
1675
  if (response instanceof Cookie)
1620
1676
  return new Response(response.value, set);
1621
1677
  return new Response(response?.toString(), set);
1678
+ case "FormData":
1679
+ return new Response(response);
1622
1680
  default:
1623
1681
  if (response instanceof Response)
1624
1682
  return new Response(response.body, {
@@ -1658,13 +1716,23 @@ var mapCompactResponse = (response, request) => {
1658
1716
  return new Response(response);
1659
1717
  case "Blob":
1660
1718
  return handleFile(response);
1661
- case "Object":
1662
1719
  case "Array":
1663
- return new Response(JSON.stringify(response), {
1664
- headers: {
1665
- "content-type": "application/json"
1666
- }
1667
- });
1720
+ return Response.json(response);
1721
+ case "Object":
1722
+ form:
1723
+ for (const value of Object.values(response))
1724
+ switch (value?.constructor?.name) {
1725
+ case "Blob":
1726
+ case "File":
1727
+ case "ArrayBuffer":
1728
+ case "FileRef":
1729
+ return new Response(form(response));
1730
+ case "Object":
1731
+ break form;
1732
+ default:
1733
+ break;
1734
+ }
1735
+ return Response.json(response);
1668
1736
  case "ReadableStream":
1669
1737
  request?.signal.addEventListener(
1670
1738
  "abort",
@@ -1704,6 +1772,8 @@ var mapCompactResponse = (response, request) => {
1704
1772
  case "Number":
1705
1773
  case "Boolean":
1706
1774
  return new Response(response.toString());
1775
+ case "FormData":
1776
+ return new Response(response);
1707
1777
  default:
1708
1778
  if (response instanceof Response)
1709
1779
  return new Response(response.body, {
@@ -2422,12 +2492,25 @@ var cloneInference = (inference) => ({
2422
2492
  set: inference.trace.set
2423
2493
  }
2424
2494
  });
2425
- var redirect = (url, status = 301) => new Response(null, {
2426
- status,
2427
- headers: {
2428
- Location: url
2495
+ var redirect = (url, status = 301) => Response.redirect(url, status);
2496
+ var ELYSIA_FORM_DATA = Symbol("ElysiaFormData");
2497
+ var form = (items) => {
2498
+ const formData = new FormData();
2499
+ for (const [key, value] of Object.entries(items)) {
2500
+ if (Array.isArray(value)) {
2501
+ for (const v of value) {
2502
+ if (value instanceof File)
2503
+ formData.append(key, value, value.name);
2504
+ formData.append(key, v);
2505
+ }
2506
+ continue;
2507
+ }
2508
+ if (value instanceof File)
2509
+ formData.append(key, value, value.name);
2510
+ formData.append(key, value);
2429
2511
  }
2430
- });
2512
+ return formData;
2513
+ };
2431
2514
 
2432
2515
  // src/error.ts
2433
2516
  var env = typeof Bun !== "undefined" ? Bun.env : typeof process !== "undefined" ? process?.env : void 0;
@@ -4091,11 +4174,11 @@ var createDynamicHandler = (app) => async (request) => {
4091
4174
  break;
4092
4175
  case "multipart/form-data":
4093
4176
  body = {};
4094
- const form = await request.formData();
4095
- for (const key of form.keys()) {
4177
+ const form2 = await request.formData();
4178
+ for (const key of form2.keys()) {
4096
4179
  if (body[key])
4097
4180
  continue;
4098
- const value = form.getAll(key);
4181
+ const value = form2.getAll(key);
4099
4182
  if (value.length === 1)
4100
4183
  body[key] = value[0];
4101
4184
  else
@@ -4137,11 +4220,11 @@ var createDynamicHandler = (app) => async (request) => {
4137
4220
  break;
4138
4221
  case "multipart/form-data":
4139
4222
  body = {};
4140
- const form = await request.formData();
4141
- for (const key of form.keys()) {
4223
+ const form2 = await request.formData();
4224
+ for (const key of form2.keys()) {
4142
4225
  if (body[key])
4143
4226
  continue;
4144
- const value = form.getAll(key);
4227
+ const value = form2.getAll(key);
4145
4228
  if (value.length === 1)
4146
4229
  body[key] = value[0];
4147
4230
  else
@@ -4531,7 +4614,7 @@ var validateFile = (options, value) => {
4531
4614
  }
4532
4615
  return true;
4533
4616
  };
4534
- var File = import_typebox2.TypeRegistry.Get("Files") ?? import_system.TypeSystem.Type("File", validateFile);
4617
+ var File2 = import_typebox2.TypeRegistry.Get("Files") ?? import_system.TypeSystem.Type("File", validateFile);
4535
4618
  var Files = import_typebox2.TypeRegistry.Get("Files") ?? import_system.TypeSystem.Type(
4536
4619
  "Files",
4537
4620
  (options, value) => {
@@ -4677,7 +4760,7 @@ var ElysiaType = {
4677
4760
  return JSON.stringify(value);
4678
4761
  });
4679
4762
  },
4680
- File,
4763
+ File: File2,
4681
4764
  Files: (options = {}) => t2.Transform(Files(options)).Decode((value) => {
4682
4765
  if (Array.isArray(value))
4683
4766
  return value;
@@ -4958,7 +5041,9 @@ var Elysia = class _Elysia {
4958
5041
  aot: true,
4959
5042
  strictPath: false,
4960
5043
  global: false,
4961
- cookie: {},
5044
+ cookie: {
5045
+ path: "/"
5046
+ },
4962
5047
  analytic: false,
4963
5048
  ...config,
4964
5049
  experimental: config?.experimental ?? {},
@@ -6639,6 +6724,7 @@ ${staticRouter.map[loosePath].code}`;
6639
6724
  StatusMap,
6640
6725
  ValidationError,
6641
6726
  error,
6727
+ form,
6642
6728
  getResponseSchemaValidator,
6643
6729
  getSchemaValidator,
6644
6730
  mapCompactResponse,
@@ -298,6 +298,7 @@ var InvertedStatusMap = Object.fromEntries(
298
298
  Object.entries(StatusMap).map(([k, v]) => [v, k])
299
299
  );
300
300
  var encoder = new TextEncoder();
301
+ var ELYSIA_FORM_DATA = Symbol("ElysiaFormData");
301
302
 
302
303
  // src/error.ts
303
304
  var env = typeof Bun !== "undefined" ? Bun.env : typeof process !== "undefined" ? process?.env : void 0;
@@ -458,7 +459,7 @@ var validateFile = (options, value) => {
458
459
  }
459
460
  return true;
460
461
  };
461
- var File = import_typebox2.TypeRegistry.Get("Files") ?? import_system.TypeSystem.Type("File", validateFile);
462
+ var File2 = import_typebox2.TypeRegistry.Get("Files") ?? import_system.TypeSystem.Type("File", validateFile);
462
463
  var Files = import_typebox2.TypeRegistry.Get("Files") ?? import_system.TypeSystem.Type(
463
464
  "Files",
464
465
  (options, value) => {
@@ -604,7 +605,7 @@ var ElysiaType = {
604
605
  return JSON.stringify(value);
605
606
  });
606
607
  },
607
- File,
608
+ File: File2,
608
609
  Files: (options = {}) => t.Transform(Files(options)).Decode((value) => {
609
610
  if (Array.isArray(value))
610
611
  return value;
@@ -1,8 +1,9 @@
1
1
  /// <reference types="bun-types" />
2
2
  /// <reference types="node" />
3
3
  /// <reference types="bun-types" />
4
+ /// <reference types="bun-types" />
4
5
  import type { Elysia } from '.';
5
- import type { Serve, Server, WebSocketHandler } from 'bun';
6
+ import type { BunFile, Serve, Server, WebSocketHandler } from 'bun';
6
7
  import type { TSchema, TObject, StaticDecode, TAnySchema } from '@sinclair/typebox';
7
8
  import type { TypeCheck } from '@sinclair/typebox/compiler';
8
9
  import type { OpenAPIV3 } from 'openapi-types';
@@ -176,8 +177,8 @@ export interface UnwrapRoute<in out Schema extends InputSchema<any>, in out Defi
176
177
  query: UnwrapSchema<Schema['query'], Definitions>;
177
178
  params: UnwrapSchema<Schema['params'], Definitions>;
178
179
  cookie: UnwrapSchema<Schema['cookie'], Definitions>;
179
- response: Schema['response'] extends TSchema | string ? UnwrapSchema<Schema['response'], Definitions> : Schema['response'] extends SuccessfulResponse<TAnySchema | string> ? {
180
- [k in keyof Schema['response']]: UnwrapSchema<Schema['response'][k], Definitions>;
180
+ response: Schema['response'] extends TSchema | string ? CoExist<UnwrapSchema<Schema['response'], Definitions>, File, BunFile> : Schema['response'] extends SuccessfulResponse<TAnySchema | string> ? {
181
+ [k in keyof Schema['response']]: CoExist<UnwrapSchema<Schema['response'][k], Definitions>, File, BunFile>;
181
182
  } : unknown | void;
182
183
  }
183
184
  export interface UnwrapGroupGuardRoute<in out Schema extends InputSchema<any>, in out Definitions extends Record<string, unknown> = {}, Path extends string = ''> {
@@ -235,6 +236,12 @@ export type Handler<in out Route extends RouteSchema = {}, in out Singleton exte
235
236
  derive: {};
236
237
  resolve: {};
237
238
  }, Path extends string = ''> = (context: Context<Route, Singleton, Path>) => Route['response'] extends SuccessfulResponse ? Response | MaybePromise<Route['response'][keyof Route['response']]> : Response | MaybePromise<Route['response']>;
239
+ export type Replace<Original, Target, With> = Original extends Record<string, unknown> ? {
240
+ [K in keyof Original]: Original[K] extends Target ? With : Original[K];
241
+ } : Original extends Target ? With : Original;
242
+ export type CoExist<Original, Target, With> = Original extends Record<string, unknown> ? {
243
+ [K in keyof Original]: Original[K] extends Target ? Original[K] | With : Original[K];
244
+ } : Original extends Target ? Original | With : Original;
238
245
  export type InlineHandler<Route extends RouteSchema = {}, Singleton extends SingletonBase = {
239
246
  decorator: {};
240
247
  store: {};
@@ -572,7 +579,7 @@ type _CreateEden<Path extends string, Property extends Record<string, unknown> =
572
579
  [x in Path]: Property;
573
580
  };
574
581
  export type CreateEden<Path extends string, Property extends Record<string, unknown> = {}> = Path extends `/${infer Rest}` ? _CreateEden<Rest, Property> : Path extends '' ? _CreateEden<'index', Property> : _CreateEden<Path, Property>;
575
- export type ComposeElysiaResponse<Response, Handle> = Handle extends (...a: any[]) => infer A ? _ComposeElysiaResponse<Response, Awaited<A>> : _ComposeElysiaResponse<Response, Awaited<Handle>>;
582
+ export type ComposeElysiaResponse<Response, Handle> = Handle extends (...a: any[]) => infer A ? _ComposeElysiaResponse<Response, Replace<Awaited<A>, BunFile, File>> : _ComposeElysiaResponse<Response, Replace<Awaited<Handle>, BunFile, File>>;
576
583
  type _ComposeElysiaResponse<Response, Handle> = Prettify<unknown extends Response ? {
577
584
  200: Exclude<Handle, {
578
585
  [ELYSIA_RESPONSE]: any;
@@ -1,8 +1,13 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="bun-types" />
3
+ /// <reference types="bun-types" />
4
+ /// <reference types="bun-types" />
1
5
  import { TSchema } from '@sinclair/typebox';
2
6
  import { TypeCheck } from '@sinclair/typebox/compiler';
3
- import type { LifeCycleStore, LocalHook, MaybeArray, InputSchema, LifeCycleType, HookContainer } from './types';
7
+ import type { LifeCycleStore, LocalHook, MaybeArray, InputSchema, LifeCycleType, HookContainer, Replace } from './types';
4
8
  import type { CookieOptions } from './cookies';
5
9
  import { Sucrose } from './sucrose';
10
+ import { BunFile } from 'bun';
6
11
  export declare const replaceUrlPath: (url: string, pathname: string) => string;
7
12
  export declare const mergeDeep: <A extends Record<string, any>, B extends Record<string, any>>(target: A, source: B, { skipKeys }?: {
8
13
  skipKeys?: string[];
@@ -210,5 +215,12 @@ export declare const cloneInference: (inference: {
210
215
  * @param url URL to redirect to
211
216
  * @param HTTP status code to send,
212
217
  */
213
- export declare const redirect: (url: string, status?: number) => import("undici-types").Response;
218
+ export declare const redirect: (url: string, status?: 301 | 302 | 303 | 307 | 308) => import("undici-types").Response;
214
219
  export type redirect = typeof redirect;
220
+ export declare const ELYSIA_FORM_DATA: unique symbol;
221
+ export type ELYSIA_FORM_DATA = typeof ELYSIA_FORM_DATA;
222
+ type ElysiaFormData<T extends Record<string | number, unknown>> = FormData & {
223
+ [ELYSIA_FORM_DATA]: Replace<T, BunFile, File>;
224
+ };
225
+ export declare const form: <const T extends Record<string | number, unknown>>(items: T) => ElysiaFormData<T>;
226
+ export {};