elysia 1.3.0 → 1.3.1

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