elysia 1.3.0 → 1.3.2-exp.0

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 (57) hide show
  1. package/dist/adapter/bun/compose.mjs +736 -3
  2. package/dist/adapter/bun/handler-native.mjs +5 -0
  3. package/dist/adapter/bun/handler.mjs +5 -0
  4. package/dist/adapter/bun/index.mjs +127 -85
  5. package/dist/adapter/utils.mjs +5 -0
  6. package/dist/adapter/web-standard/handler.mjs +5 -0
  7. package/dist/adapter/web-standard/index.mjs +5 -0
  8. package/dist/bun/index.d.ts +13 -9
  9. package/dist/bun/index.js +25 -25
  10. package/dist/bun/index.js.map +12 -12
  11. package/dist/cjs/adapter/bun/compose.js +736 -3
  12. package/dist/cjs/adapter/bun/handler-native.js +5 -0
  13. package/dist/cjs/adapter/bun/handler.js +5 -0
  14. package/dist/cjs/adapter/bun/index.js +127 -85
  15. package/dist/cjs/adapter/utils.js +5 -0
  16. package/dist/cjs/adapter/web-standard/handler.js +5 -0
  17. package/dist/cjs/adapter/web-standard/index.js +5 -0
  18. package/dist/cjs/compose.js +21 -17
  19. package/dist/cjs/context.d.ts +1 -1
  20. package/dist/cjs/cookies.d.ts +2 -2
  21. package/dist/cjs/cookies.js +5 -0
  22. package/dist/cjs/dynamic-handle.js +5 -0
  23. package/dist/cjs/error.d.ts +1 -1
  24. package/dist/cjs/error.js +5 -0
  25. package/dist/cjs/index.d.ts +13 -9
  26. package/dist/cjs/index.js +153 -106
  27. package/dist/cjs/schema.d.ts +1 -1
  28. package/dist/cjs/schema.js +6 -1
  29. package/dist/cjs/sucrose.js +6 -1
  30. package/dist/cjs/trace.js +8 -1
  31. package/dist/cjs/type-system/index.js +5 -0
  32. package/dist/cjs/type-system/utils.js +5 -0
  33. package/dist/cjs/types.d.ts +18 -10
  34. package/dist/cjs/utils.d.ts +1 -0
  35. package/dist/cjs/utils.js +7 -1
  36. package/dist/cjs/ws/index.js +5 -0
  37. package/dist/compose.mjs +21 -17
  38. package/dist/context.d.ts +1 -1
  39. package/dist/cookies.d.ts +2 -2
  40. package/dist/cookies.mjs +5 -0
  41. package/dist/dynamic-handle.mjs +5 -0
  42. package/dist/error.d.ts +1 -1
  43. package/dist/error.mjs +5 -0
  44. package/dist/index.d.ts +13 -9
  45. package/dist/index.mjs +153 -106
  46. package/dist/schema.d.ts +1 -1
  47. package/dist/schema.mjs +6 -1
  48. package/dist/sucrose.mjs +6 -1
  49. package/dist/trace.mjs +8 -1
  50. package/dist/type-system/index.mjs +5 -0
  51. package/dist/type-system/utils.mjs +5 -0
  52. package/dist/types.d.ts +18 -10
  53. package/dist/utils.d.ts +1 -0
  54. package/dist/utils.mjs +6 -1
  55. package/dist/ws/index.mjs +5 -0
  56. package/package.json +3 -3
  57. package/bunfig.toml +0 -2
@@ -225,6 +225,11 @@ var isNotEmpty = (obj) => {
225
225
  for (let x in obj) return !0;
226
226
  return !1;
227
227
  };
228
+ var supportPerMethodInlineHandler = (() => {
229
+ if (typeof Bun > "u") return !0;
230
+ let semver = Bun.version.split(".");
231
+ return !(+semver[0] < 1 || +semver[1] < 2 || +semver[2] < 14);
232
+ })();
228
233
 
229
234
  // src/sucrose.ts
230
235
  var separateFunction = (code) => {
@@ -383,7 +388,7 @@ var findAlias = (type, body, depth = 0) => {
383
388
  parameters.query && (inference.query = !0), parameters.headers && (inference.headers = !0), parameters.body && (inference.body = !0), parameters.cookie && (inference.cookie = !0), parameters.set && (inference.set = !0), parameters.server && (inference.server = !0), parameters.url && (inference.url = !0), parameters.route && (inference.route = !0), parameters.path && (inference.path = !0);
384
389
  continue;
385
390
  }
386
- if (!inference.query && access("query", alias) && (inference.query = !0), !inference.query && (code.includes("return " + alias) || code.includes("return " + alias + ".query")) && (inference.query = !0), !inference.headers && access("headers", alias) && (inference.headers = !0), !inference.body && access("body", alias) && (inference.body = !0), !inference.cookie && access("cookie", alias) && (inference.cookie = !0), !inference.set && access("set", alias) && (inference.set = !0), !inference.server && access("server", alias) && (inference.server = !0), inference.query && inference.headers && inference.body && inference.cookie && inference.set && inference.server && inference.route && inference.url)
391
+ if (!inference.query && (access("query", alias) || code.includes("return " + alias) || code.includes("return " + alias + ".query")) && (inference.query = !0), !inference.headers && access("headers", alias) && (inference.headers = !0), !inference.body && access("body", alias) && (inference.body = !0), !inference.cookie && access("cookie", alias) && (inference.cookie = !0), !inference.set && access("set", alias) && (inference.set = !0), !inference.server && access("server", alias) && (inference.server = !0), !inference.route && access("route", alias) && (inference.route = !0), !inference.url && access("url", alias) && (inference.url = !0), !inference.path && access("path", alias) && (inference.path = !0), inference.query && inference.headers && inference.body && inference.cookie && inference.set && inference.server && inference.route && inference.url && inference.path)
387
392
  break;
388
393
  }
389
394
  return aliases;
@@ -1155,6 +1160,134 @@ t.Form = ElysiaType.Form;
1155
1160
  // src/cookies.ts
1156
1161
  import { parse, serialize } from "cookie";
1157
1162
  import decode2 from "fast-decode-uri-component";
1163
+ var Cookie = class {
1164
+ constructor(name, jar, initial = {}) {
1165
+ this.name = name;
1166
+ this.jar = jar;
1167
+ this.initial = initial;
1168
+ }
1169
+ get cookie() {
1170
+ return this.jar[this.name] ?? this.initial;
1171
+ }
1172
+ set cookie(jar) {
1173
+ this.name in this.jar || (this.jar[this.name] = this.initial), this.jar[this.name] = jar;
1174
+ }
1175
+ get setCookie() {
1176
+ return this.name in this.jar || (this.jar[this.name] = this.initial), this.jar[this.name];
1177
+ }
1178
+ set setCookie(jar) {
1179
+ this.cookie = jar;
1180
+ }
1181
+ get value() {
1182
+ return this.cookie.value;
1183
+ }
1184
+ set value(value) {
1185
+ this.setCookie.value = value;
1186
+ }
1187
+ get expires() {
1188
+ return this.cookie.expires;
1189
+ }
1190
+ set expires(expires) {
1191
+ this.setCookie.expires = expires;
1192
+ }
1193
+ get maxAge() {
1194
+ return this.cookie.maxAge;
1195
+ }
1196
+ set maxAge(maxAge) {
1197
+ this.setCookie.maxAge = maxAge;
1198
+ }
1199
+ get domain() {
1200
+ return this.cookie.domain;
1201
+ }
1202
+ set domain(domain) {
1203
+ this.setCookie.domain = domain;
1204
+ }
1205
+ get path() {
1206
+ return this.cookie.path;
1207
+ }
1208
+ set path(path) {
1209
+ this.setCookie.path = path;
1210
+ }
1211
+ get secure() {
1212
+ return this.cookie.secure;
1213
+ }
1214
+ set secure(secure) {
1215
+ this.setCookie.secure = secure;
1216
+ }
1217
+ get httpOnly() {
1218
+ return this.cookie.httpOnly;
1219
+ }
1220
+ set httpOnly(httpOnly) {
1221
+ this.setCookie.httpOnly = httpOnly;
1222
+ }
1223
+ get sameSite() {
1224
+ return this.cookie.sameSite;
1225
+ }
1226
+ set sameSite(sameSite) {
1227
+ this.setCookie.sameSite = sameSite;
1228
+ }
1229
+ get priority() {
1230
+ return this.cookie.priority;
1231
+ }
1232
+ set priority(priority) {
1233
+ this.setCookie.priority = priority;
1234
+ }
1235
+ get partitioned() {
1236
+ return this.cookie.partitioned;
1237
+ }
1238
+ set partitioned(partitioned) {
1239
+ this.setCookie.partitioned = partitioned;
1240
+ }
1241
+ get secrets() {
1242
+ return this.cookie.secrets;
1243
+ }
1244
+ set secrets(secrets) {
1245
+ this.setCookie.secrets = secrets;
1246
+ }
1247
+ update(config) {
1248
+ return this.setCookie = Object.assign(
1249
+ this.cookie,
1250
+ typeof config == "function" ? config(this.cookie) : config
1251
+ ), this;
1252
+ }
1253
+ set(config) {
1254
+ return this.setCookie = Object.assign(
1255
+ {
1256
+ ...this.initial,
1257
+ value: this.value
1258
+ },
1259
+ typeof config == "function" ? config(this.cookie) : config
1260
+ ), this;
1261
+ }
1262
+ remove() {
1263
+ if (this.value !== void 0)
1264
+ return this.set({
1265
+ expires: /* @__PURE__ */ new Date(0),
1266
+ maxAge: 0,
1267
+ value: ""
1268
+ }), this;
1269
+ }
1270
+ toString() {
1271
+ return typeof this.value == "object" ? JSON.stringify(this.value) : this.value?.toString() ?? "";
1272
+ }
1273
+ };
1274
+ var serializeCookie = (cookies) => {
1275
+ if (!cookies || !isNotEmpty(cookies)) return;
1276
+ let set2 = [];
1277
+ for (let [key, property] of Object.entries(cookies)) {
1278
+ if (!key || !property) continue;
1279
+ let value = property.value;
1280
+ value != null && set2.push(
1281
+ serialize(
1282
+ key,
1283
+ typeof value == "object" ? JSON.stringify(value) : value + "",
1284
+ property
1285
+ )
1286
+ );
1287
+ }
1288
+ if (set2.length !== 0)
1289
+ return set2.length === 1 ? set2[0] : set2;
1290
+ };
1158
1291
 
1159
1292
  // src/compose.ts
1160
1293
  var createReport = ({
@@ -1259,6 +1392,605 @@ var createOnRequestHandler = (app, addFn) => {
1259
1392
  return `return function hocMap(${adapter.parameters}){return ${handler}(${adapter.parameters})}`;
1260
1393
  };
1261
1394
 
1395
+ // src/adapter/utils.ts
1396
+ var handleFile = (response, set2) => {
1397
+ let size = response.size;
1398
+ if (!set2 && size || size && set2 && set2.status !== 206 && set2.status !== 304 && set2.status !== 412 && set2.status !== 416) {
1399
+ if (set2) {
1400
+ if (set2.headers instanceof Headers) {
1401
+ let setHeaders = {
1402
+ "accept-ranges": "bytes",
1403
+ "content-range": `bytes 0-${size - 1}/${size}`,
1404
+ "transfer-encoding": "chunked"
1405
+ };
1406
+ if (hasHeaderShorthand)
1407
+ setHeaders = set2.headers.toJSON();
1408
+ else {
1409
+ setHeaders = {};
1410
+ for (let [key, value] of set2.headers.entries())
1411
+ key in set2.headers && (setHeaders[key] = value);
1412
+ }
1413
+ return new Response(response, {
1414
+ status: set2.status,
1415
+ headers: setHeaders
1416
+ });
1417
+ }
1418
+ if (isNotEmpty(set2.headers))
1419
+ return new Response(response, {
1420
+ status: set2.status,
1421
+ headers: Object.assign(
1422
+ {
1423
+ "accept-ranges": "bytes",
1424
+ "content-range": `bytes 0-${size - 1}/${size}`,
1425
+ "transfer-encoding": "chunked"
1426
+ },
1427
+ set2.headers
1428
+ )
1429
+ });
1430
+ }
1431
+ return new Response(response, {
1432
+ headers: {
1433
+ "accept-ranges": "bytes",
1434
+ "content-range": `bytes 0-${size - 1}/${size}`,
1435
+ "transfer-encoding": "chunked"
1436
+ }
1437
+ });
1438
+ }
1439
+ return new Response(response);
1440
+ }, parseSetCookies = (headers, setCookie) => {
1441
+ if (!headers) return headers;
1442
+ headers.delete("set-cookie");
1443
+ for (let i = 0; i < setCookie.length; i++) {
1444
+ let index = setCookie[i].indexOf("=");
1445
+ headers.append(
1446
+ "set-cookie",
1447
+ `${setCookie[i].slice(0, index)}=${setCookie[i].slice(index + 1) || ""}`
1448
+ );
1449
+ }
1450
+ return headers;
1451
+ }, responseToSetHeaders = (response, set2) => {
1452
+ if (set2?.headers) {
1453
+ if (response)
1454
+ if (hasHeaderShorthand)
1455
+ Object.assign(set2.headers, response.headers.toJSON());
1456
+ else
1457
+ for (let [key, value] of response.headers.entries())
1458
+ key in set2.headers && (set2.headers[key] = value);
1459
+ return set2.status === 200 && (set2.status = response.status), set2.headers["content-encoding"] && delete set2.headers["content-encoding"], set2;
1460
+ }
1461
+ if (!response)
1462
+ return {
1463
+ headers: {},
1464
+ status: set2?.status ?? 200
1465
+ };
1466
+ if (hasHeaderShorthand)
1467
+ return set2 = {
1468
+ headers: response.headers.toJSON(),
1469
+ status: set2?.status ?? 200
1470
+ }, set2.headers["content-encoding"] && delete set2.headers["content-encoding"], set2;
1471
+ set2 = {
1472
+ headers: {},
1473
+ status: set2?.status ?? 200
1474
+ };
1475
+ for (let [key, value] of response.headers.entries())
1476
+ key !== "content-encoding" && key in set2.headers && (set2.headers[key] = value);
1477
+ return set2;
1478
+ }, createStreamHandler = ({ mapResponse: mapResponse2, mapCompactResponse: mapCompactResponse2 }) => async (generator, set2, request) => {
1479
+ let init = generator.next();
1480
+ return init instanceof Promise && (init = await init), init.done ? set2 ? mapResponse2(init.value, set2, request) : mapCompactResponse2(init.value, request) : (set2?.headers ? (set2.headers["transfer-encoding"] || (set2.headers["transfer-encoding"] = "chunked"), set2.headers["content-type"] || (set2.headers["content-type"] = "text/event-stream; charset=utf-8")) : set2 = {
1481
+ status: 200,
1482
+ headers: {
1483
+ "content-type": "text/event-stream; charset=utf-8",
1484
+ "transfer-encoding": "chunked"
1485
+ }
1486
+ }, new Response(
1487
+ new ReadableStream({
1488
+ async start(controller) {
1489
+ let end = !1;
1490
+ if (request?.signal?.addEventListener("abort", () => {
1491
+ end = !0;
1492
+ try {
1493
+ controller.close();
1494
+ } catch {
1495
+ }
1496
+ }), init.value !== void 0 && init.value !== null)
1497
+ if (typeof init.value == "object")
1498
+ try {
1499
+ controller.enqueue(
1500
+ Buffer.from(JSON.stringify(init.value))
1501
+ );
1502
+ } catch {
1503
+ controller.enqueue(
1504
+ Buffer.from(init.value.toString())
1505
+ );
1506
+ }
1507
+ else
1508
+ controller.enqueue(
1509
+ Buffer.from(init.value.toString())
1510
+ );
1511
+ for await (let chunk of generator) {
1512
+ if (end) break;
1513
+ if (chunk != null) {
1514
+ if (typeof chunk == "object")
1515
+ try {
1516
+ controller.enqueue(
1517
+ Buffer.from(JSON.stringify(chunk))
1518
+ );
1519
+ } catch {
1520
+ controller.enqueue(
1521
+ Buffer.from(chunk.toString())
1522
+ );
1523
+ }
1524
+ else
1525
+ controller.enqueue(
1526
+ Buffer.from(chunk.toString())
1527
+ );
1528
+ await new Promise(
1529
+ (resolve) => setTimeout(() => resolve(), 0)
1530
+ );
1531
+ }
1532
+ }
1533
+ try {
1534
+ controller.close();
1535
+ } catch {
1536
+ }
1537
+ }
1538
+ }),
1539
+ set2
1540
+ ));
1541
+ };
1542
+ async function* streamResponse(response) {
1543
+ let body = response.body;
1544
+ if (!body) return;
1545
+ let reader = body.getReader(), decoder = new TextDecoder();
1546
+ try {
1547
+ for (; ; ) {
1548
+ let { done, value } = await reader.read();
1549
+ if (done) break;
1550
+ yield decoder.decode(value);
1551
+ }
1552
+ } finally {
1553
+ reader.releaseLock();
1554
+ }
1555
+ }
1556
+ var handleSet = (set2) => {
1557
+ if (typeof set2.status == "string" && (set2.status = StatusMap[set2.status]), set2.cookie && isNotEmpty(set2.cookie)) {
1558
+ let cookie = serializeCookie(set2.cookie);
1559
+ cookie && (set2.headers["set-cookie"] = cookie);
1560
+ }
1561
+ set2.headers["set-cookie"] && Array.isArray(set2.headers["set-cookie"]) && (set2.headers = parseSetCookies(
1562
+ new Headers(set2.headers),
1563
+ set2.headers["set-cookie"]
1564
+ ));
1565
+ }, createResponseHandler = (handler) => {
1566
+ let handleStream2 = createStreamHandler(handler);
1567
+ return (response, set2, request) => {
1568
+ let isCookieSet = !1;
1569
+ if (set2.headers instanceof Headers)
1570
+ for (let key of set2.headers.keys())
1571
+ if (key === "set-cookie") {
1572
+ if (isCookieSet) continue;
1573
+ isCookieSet = !0;
1574
+ for (let cookie of set2.headers.getSetCookie())
1575
+ response.headers.append("set-cookie", cookie);
1576
+ } else response.headers.append(key, set2.headers?.get(key) ?? "");
1577
+ else
1578
+ for (let key in set2.headers)
1579
+ response.headers.append(
1580
+ key,
1581
+ set2.headers[key]
1582
+ );
1583
+ let status2 = set2.status ?? 200;
1584
+ return response.status !== status2 && status2 !== 200 && (response.status <= 300 || response.status > 400) ? response.text().then((value) => {
1585
+ let newResponse = new Response(value, {
1586
+ headers: response.headers,
1587
+ status: set2.status
1588
+ });
1589
+ return !newResponse.headers.has("content-length") && newResponse.headers.get(
1590
+ "transfer-encoding"
1591
+ ) === "chunked" ? handleStream2(
1592
+ streamResponse(newResponse),
1593
+ responseToSetHeaders(newResponse, set2),
1594
+ request
1595
+ ) : newResponse;
1596
+ }) : !response.headers.has("content-length") && response.headers.get("transfer-encoding") === "chunked" ? handleStream2(
1597
+ streamResponse(response),
1598
+ responseToSetHeaders(response, set2),
1599
+ request
1600
+ ) : response;
1601
+ };
1602
+ };
1603
+
1604
+ // src/adapter/bun/handler.ts
1605
+ var mapResponse = (response, set2, request) => {
1606
+ if (isNotEmpty(set2.headers) || set2.status !== 200 || set2.cookie)
1607
+ switch (handleSet(set2), response?.constructor?.name) {
1608
+ case "String":
1609
+ return new Response(response, set2);
1610
+ case "Array":
1611
+ case "Object":
1612
+ return set2.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set2);
1613
+ case "ElysiaFile":
1614
+ return handleFile(response.value);
1615
+ case "File":
1616
+ return handleFile(response, set2);
1617
+ case "Blob":
1618
+ return handleFile(response, set2);
1619
+ case "ElysiaCustomStatusResponse":
1620
+ return set2.status = response.code, mapResponse(
1621
+ response.response,
1622
+ set2,
1623
+ request
1624
+ );
1625
+ case "ReadableStream":
1626
+ return set2.headers["content-type"]?.startsWith(
1627
+ "text/event-stream"
1628
+ ) || (set2.headers["content-type"] = "text/event-stream; charset=utf-8"), request?.signal?.addEventListener(
1629
+ "abort",
1630
+ {
1631
+ handleEvent() {
1632
+ request?.signal && !request?.signal?.aborted && response.cancel();
1633
+ }
1634
+ },
1635
+ {
1636
+ once: !0
1637
+ }
1638
+ ), new Response(response, set2);
1639
+ case void 0:
1640
+ return response ? new Response(JSON.stringify(response), set2) : new Response("", set2);
1641
+ case "Response":
1642
+ return handleResponse(response, set2, request);
1643
+ case "Error":
1644
+ return errorToResponse(response, set2);
1645
+ case "Promise":
1646
+ return response.then(
1647
+ (x) => mapResponse(x, set2, request)
1648
+ );
1649
+ case "Function":
1650
+ return mapResponse(response(), set2, request);
1651
+ case "Number":
1652
+ case "Boolean":
1653
+ return new Response(
1654
+ response.toString(),
1655
+ set2
1656
+ );
1657
+ case "Cookie":
1658
+ return response instanceof Cookie ? new Response(response.value, set2) : new Response(response?.toString(), set2);
1659
+ case "FormData":
1660
+ return new Response(response, set2);
1661
+ default:
1662
+ if (response instanceof Response)
1663
+ return handleResponse(response, set2, request);
1664
+ if (response instanceof Promise)
1665
+ return response.then((x) => mapResponse(x, set2));
1666
+ if (response instanceof Error)
1667
+ return errorToResponse(response, set2);
1668
+ if (response instanceof ElysiaCustomStatusResponse)
1669
+ return set2.status = response.code, mapResponse(
1670
+ response.response,
1671
+ set2,
1672
+ request
1673
+ );
1674
+ if (typeof response?.next == "function")
1675
+ return handleStream(response, set2, request);
1676
+ if (typeof response?.then == "function")
1677
+ return response.then((x) => mapResponse(x, set2));
1678
+ if (typeof response?.toResponse == "function")
1679
+ return mapResponse(response.toResponse(), set2);
1680
+ if ("charCodeAt" in response) {
1681
+ let code = response.charCodeAt(0);
1682
+ if (code === 123 || code === 91)
1683
+ return set2.headers["Content-Type"] || (set2.headers["Content-Type"] = "application/json"), new Response(
1684
+ JSON.stringify(response),
1685
+ set2
1686
+ );
1687
+ }
1688
+ return new Response(response, set2);
1689
+ }
1690
+ return response instanceof Response && !response.headers.has("content-length") && response.headers.get("transfer-encoding") === "chunked" ? handleStream(
1691
+ streamResponse(response),
1692
+ responseToSetHeaders(response, set2),
1693
+ request
1694
+ ) : (
1695
+ // @ts-expect-error
1696
+ typeof response?.next == "function" || response instanceof ReadableStream ? handleStream(response, set2, request) : mapCompactResponse(response, request)
1697
+ );
1698
+ }, mapEarlyResponse = (response, set2, request) => {
1699
+ if (response != null)
1700
+ if (isNotEmpty(set2.headers) || set2.status !== 200 || set2.cookie)
1701
+ switch (handleSet(set2), response?.constructor?.name) {
1702
+ case "String":
1703
+ return new Response(response, set2);
1704
+ case "Array":
1705
+ case "Object":
1706
+ return set2.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set2);
1707
+ case "ElysiaFile":
1708
+ return handleFile(response.value);
1709
+ case "File":
1710
+ return handleFile(response, set2);
1711
+ case "Blob":
1712
+ return handleFile(response, set2);
1713
+ case "ElysiaCustomStatusResponse":
1714
+ return set2.status = response.code, mapEarlyResponse(
1715
+ response.response,
1716
+ set2,
1717
+ request
1718
+ );
1719
+ case "ReadableStream":
1720
+ return set2.headers["content-type"]?.startsWith(
1721
+ "text/event-stream"
1722
+ ) || (set2.headers["content-type"] = "text/event-stream; charset=utf-8"), request?.signal?.addEventListener(
1723
+ "abort",
1724
+ {
1725
+ handleEvent() {
1726
+ request?.signal && !request?.signal?.aborted && response.cancel();
1727
+ }
1728
+ },
1729
+ {
1730
+ once: !0
1731
+ }
1732
+ ), new Response(response, set2);
1733
+ case void 0:
1734
+ return response ? new Response(JSON.stringify(response), set2) : void 0;
1735
+ case "Response":
1736
+ return handleResponse(response, set2, request);
1737
+ case "Promise":
1738
+ return response.then(
1739
+ (x) => mapEarlyResponse(x, set2)
1740
+ );
1741
+ case "Error":
1742
+ return errorToResponse(response, set2);
1743
+ case "Function":
1744
+ return mapEarlyResponse(response(), set2);
1745
+ case "Number":
1746
+ case "Boolean":
1747
+ return new Response(
1748
+ response.toString(),
1749
+ set2
1750
+ );
1751
+ case "FormData":
1752
+ return new Response(response);
1753
+ case "Cookie":
1754
+ return response instanceof Cookie ? new Response(response.value, set2) : new Response(response?.toString(), set2);
1755
+ default:
1756
+ if (response instanceof Response)
1757
+ return handleResponse(response, set2, request);
1758
+ if (response instanceof Promise)
1759
+ return response.then((x) => mapEarlyResponse(x, set2));
1760
+ if (response instanceof Error)
1761
+ return errorToResponse(response, set2);
1762
+ if (response instanceof ElysiaCustomStatusResponse)
1763
+ return set2.status = response.code, mapEarlyResponse(
1764
+ response.response,
1765
+ set2,
1766
+ request
1767
+ );
1768
+ if (typeof response?.next == "function")
1769
+ return handleStream(response, set2, request);
1770
+ if (typeof response?.then == "function")
1771
+ return response.then((x) => mapEarlyResponse(x, set2));
1772
+ if (typeof response?.toResponse == "function")
1773
+ return mapEarlyResponse(response.toResponse(), set2);
1774
+ if ("charCodeAt" in response) {
1775
+ let code = response.charCodeAt(0);
1776
+ if (code === 123 || code === 91)
1777
+ return set2.headers["Content-Type"] || (set2.headers["Content-Type"] = "application/json"), new Response(
1778
+ JSON.stringify(response),
1779
+ set2
1780
+ );
1781
+ }
1782
+ return new Response(response, set2);
1783
+ }
1784
+ else
1785
+ switch (response?.constructor?.name) {
1786
+ case "String":
1787
+ return new Response(response);
1788
+ case "Array":
1789
+ case "Object":
1790
+ return set2.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set2);
1791
+ case "ElysiaFile":
1792
+ return handleFile(response.value);
1793
+ case "File":
1794
+ return handleFile(response, set2);
1795
+ case "Blob":
1796
+ return handleFile(response, set2);
1797
+ case "ElysiaCustomStatusResponse":
1798
+ return set2.status = response.code, mapEarlyResponse(
1799
+ response.response,
1800
+ set2,
1801
+ request
1802
+ );
1803
+ case "ReadableStream":
1804
+ return request?.signal?.addEventListener(
1805
+ "abort",
1806
+ {
1807
+ handleEvent() {
1808
+ request?.signal && !request?.signal?.aborted && response.cancel();
1809
+ }
1810
+ },
1811
+ {
1812
+ once: !0
1813
+ }
1814
+ ), new Response(response, {
1815
+ headers: {
1816
+ "Content-Type": "text/event-stream; charset=utf-8"
1817
+ }
1818
+ });
1819
+ case void 0:
1820
+ return response ? new Response(JSON.stringify(response), {
1821
+ headers: {
1822
+ "content-type": "application/json"
1823
+ }
1824
+ }) : new Response("");
1825
+ case "Response":
1826
+ return !response.headers.has("content-length") && response.headers.get("transfer-encoding") === "chunked" ? handleStream(
1827
+ streamResponse(response),
1828
+ responseToSetHeaders(response),
1829
+ request
1830
+ ) : response;
1831
+ case "Promise":
1832
+ return response.then((x) => {
1833
+ let r = mapEarlyResponse(x, set2);
1834
+ if (r !== void 0) return r;
1835
+ });
1836
+ case "Error":
1837
+ return errorToResponse(response, set2);
1838
+ case "Function":
1839
+ return mapCompactResponse(response(), request);
1840
+ case "Number":
1841
+ case "Boolean":
1842
+ return new Response(response.toString());
1843
+ case "Cookie":
1844
+ return response instanceof Cookie ? new Response(response.value, set2) : new Response(response?.toString(), set2);
1845
+ case "FormData":
1846
+ return new Response(response);
1847
+ default:
1848
+ if (response instanceof Response) return response;
1849
+ if (response instanceof Promise)
1850
+ return response.then((x) => mapEarlyResponse(x, set2));
1851
+ if (response instanceof Error)
1852
+ return errorToResponse(response, set2);
1853
+ if (response instanceof ElysiaCustomStatusResponse)
1854
+ return set2.status = response.code, mapEarlyResponse(
1855
+ response.response,
1856
+ set2,
1857
+ request
1858
+ );
1859
+ if (typeof response?.next == "function")
1860
+ return handleStream(response, set2, request);
1861
+ if (typeof response?.then == "function")
1862
+ return response.then((x) => mapEarlyResponse(x, set2));
1863
+ if (typeof response?.toResponse == "function")
1864
+ return mapEarlyResponse(response.toResponse(), set2);
1865
+ if ("charCodeAt" in response) {
1866
+ let code = response.charCodeAt(0);
1867
+ if (code === 123 || code === 91)
1868
+ return set2.headers["Content-Type"] || (set2.headers["Content-Type"] = "application/json"), new Response(
1869
+ JSON.stringify(response),
1870
+ set2
1871
+ );
1872
+ }
1873
+ return new Response(response);
1874
+ }
1875
+ }, mapCompactResponse = (response, request) => {
1876
+ switch (response?.constructor?.name) {
1877
+ case "String":
1878
+ return new Response(response);
1879
+ case "Object":
1880
+ case "Array":
1881
+ return new Response(JSON.stringify(response), {
1882
+ headers: {
1883
+ "Content-Type": "application/json"
1884
+ }
1885
+ });
1886
+ case "ElysiaFile":
1887
+ return handleFile(response.value);
1888
+ case "File":
1889
+ return handleFile(response);
1890
+ case "Blob":
1891
+ return handleFile(response);
1892
+ case "ElysiaCustomStatusResponse":
1893
+ return mapResponse(
1894
+ response.response,
1895
+ {
1896
+ status: response.code,
1897
+ headers: {}
1898
+ }
1899
+ );
1900
+ case "ReadableStream":
1901
+ return request?.signal?.addEventListener(
1902
+ "abort",
1903
+ {
1904
+ handleEvent() {
1905
+ request?.signal && !request?.signal?.aborted && response.cancel();
1906
+ }
1907
+ },
1908
+ {
1909
+ once: !0
1910
+ }
1911
+ ), new Response(response, {
1912
+ headers: {
1913
+ "Content-Type": "text/event-stream; charset=utf-8"
1914
+ }
1915
+ });
1916
+ case void 0:
1917
+ return response ? new Response(JSON.stringify(response), {
1918
+ headers: {
1919
+ "content-type": "application/json"
1920
+ }
1921
+ }) : new Response("");
1922
+ case "Response":
1923
+ return response.headers.get("transfer-encoding") === "chunked" ? handleStream(
1924
+ streamResponse(response),
1925
+ responseToSetHeaders(response),
1926
+ request
1927
+ ) : response;
1928
+ case "Error":
1929
+ return errorToResponse(response);
1930
+ case "Promise":
1931
+ return response.then(
1932
+ (x) => mapCompactResponse(x, request)
1933
+ );
1934
+ // ? Maybe response or Blob
1935
+ case "Function":
1936
+ return mapCompactResponse(response(), request);
1937
+ case "Number":
1938
+ case "Boolean":
1939
+ return new Response(response.toString());
1940
+ case "FormData":
1941
+ return new Response(response);
1942
+ default:
1943
+ if (response instanceof Response) return response;
1944
+ if (response instanceof Promise)
1945
+ return response.then(
1946
+ (x) => mapCompactResponse(x, request)
1947
+ );
1948
+ if (response instanceof Error)
1949
+ return errorToResponse(response);
1950
+ if (response instanceof ElysiaCustomStatusResponse)
1951
+ return mapResponse(
1952
+ response.response,
1953
+ {
1954
+ status: response.code,
1955
+ headers: {}
1956
+ }
1957
+ );
1958
+ if (typeof response?.next == "function")
1959
+ return handleStream(response, void 0, request);
1960
+ if (typeof response?.then == "function")
1961
+ return response.then((x) => mapResponse(x, set));
1962
+ if (typeof response?.toResponse == "function")
1963
+ return mapCompactResponse(response.toResponse());
1964
+ if ("charCodeAt" in response) {
1965
+ let code = response.charCodeAt(0);
1966
+ if (code === 123 || code === 91)
1967
+ return new Response(JSON.stringify(response), {
1968
+ headers: {
1969
+ "Content-Type": "application/json"
1970
+ }
1971
+ });
1972
+ }
1973
+ return new Response(response);
1974
+ }
1975
+ }, errorToResponse = (error, set2) => new Response(
1976
+ JSON.stringify({
1977
+ name: error?.name,
1978
+ message: error?.message,
1979
+ cause: error?.cause
1980
+ }),
1981
+ {
1982
+ status: set2?.status !== 200 ? set2?.status ?? 500 : 500,
1983
+ headers: set2?.headers
1984
+ }
1985
+ );
1986
+ var handleResponse = createResponseHandler({
1987
+ mapResponse,
1988
+ mapCompactResponse
1989
+ }), handleStream = createStreamHandler({
1990
+ mapResponse,
1991
+ mapCompactResponse
1992
+ });
1993
+
1262
1994
  // src/adapter/bun/compose.ts
1263
1995
  var allocateIf = (value, condition) => condition ? value : "", createContext = (app, route, inference, isInline = !1) => {
1264
1996
  let fnLiteral = "", defaultHeaders = app.setHeaders, hasTrace = !!app.event.trace?.length;
@@ -1294,7 +2026,7 @@ return u.substring(s,qi)
1294
2026
  },
1295
2027
  inference
1296
2028
  );
1297
- let fnLiteral = "const handler=data.handler,app=data.app,store=data.store,decorator=data.decorator,redirect=data.redirect,route=data.route," + allocateIf("randomId=data.randomId,", hasTrace) + allocateIf("ELYSIA_REQUEST_ID=data.ELYSIA_REQUEST_ID,", hasTrace) + allocateIf("ELYSIA_TRACE=data.ELYSIA_TRACE,", hasTrace) + allocateIf("trace=data.trace,", hasTrace) + allocateIf("hoc=data.hoc,", hasHoc) + `status=data.status
2029
+ let fnLiteral = "const handler=data.handler,app=data.app,store=data.store,decorator=data.decorator,redirect=data.redirect,route=data.route,mapEarlyResponse=data.mapEarlyResponse," + allocateIf("randomId=data.randomId,", hasTrace) + allocateIf("ELYSIA_REQUEST_ID=data.ELYSIA_REQUEST_ID,", hasTrace) + allocateIf("ELYSIA_TRACE=data.ELYSIA_TRACE,", hasTrace) + allocateIf("trace=data.trace,", hasTrace) + allocateIf("hoc=data.hoc,", hasHoc) + `status=data.status
1298
2030
  `;
1299
2031
  return app.event.request?.length && (fnLiteral += `const onRequest=app.event.request.map(x=>x.fn)
1300
2032
  `), fnLiteral += `${app.event.request?.find(isAsync) ? "async" : ""} function map(request){`, hasTrace || inference.query || app.event.request?.length ? (fnLiteral += createContext(app, route, inference), fnLiteral += createOnRequestHandler(app), fnLiteral += "return handler(c)}") : fnLiteral += `return handler(${createContext(app, route, inference, !0)})}`, fnLiteral += createHoc(app), Function(
@@ -1313,7 +2045,8 @@ return u.substring(s,qi)
1313
2045
  randomId: hasTrace ? randomId : void 0,
1314
2046
  ELYSIA_TRACE: hasTrace ? ELYSIA_TRACE : void 0,
1315
2047
  ELYSIA_REQUEST_ID: hasTrace ? ELYSIA_REQUEST_ID : void 0,
1316
- trace: hasTrace ? app.event.trace?.map((x) => x?.fn ?? x) : void 0
2048
+ trace: hasTrace ? app.event.trace?.map((x) => x?.fn ?? x) : void 0,
2049
+ mapEarlyResponse
1317
2050
  });
1318
2051
  };
1319
2052
  export {