h3 1.15.1 → 1.15.2
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.
- package/dist/index.cjs +37 -40
- package/dist/index.d.cts +3 -2
- package/dist/index.d.mts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.mjs +37 -40
- package/package.json +22 -22
package/dist/index.cjs
CHANGED
|
@@ -62,7 +62,7 @@ class H3Error extends Error {
|
|
|
62
62
|
if (this.statusMessage) {
|
|
63
63
|
obj.statusMessage = sanitizeStatusMessage(this.statusMessage);
|
|
64
64
|
}
|
|
65
|
-
if (this.data !==
|
|
65
|
+
if (this.data !== void 0) {
|
|
66
66
|
obj.data = this.data;
|
|
67
67
|
}
|
|
68
68
|
return obj;
|
|
@@ -114,10 +114,10 @@ function createError(input) {
|
|
|
114
114
|
);
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
|
-
if (input.fatal !==
|
|
117
|
+
if (input.fatal !== void 0) {
|
|
118
118
|
err.fatal = input.fatal;
|
|
119
119
|
}
|
|
120
|
-
if (input.unhandled !==
|
|
120
|
+
if (input.unhandled !== void 0) {
|
|
121
121
|
err.unhandled = input.unhandled;
|
|
122
122
|
}
|
|
123
123
|
return err;
|
|
@@ -142,7 +142,7 @@ function sendError(event, error, debug) {
|
|
|
142
142
|
const _code = Number.parseInt(h3Error.statusCode);
|
|
143
143
|
setResponseStatus(event, _code, h3Error.statusMessage);
|
|
144
144
|
event.node.res.setHeader("content-type", MIMES.json);
|
|
145
|
-
event.node.res.end(JSON.stringify(responseBody,
|
|
145
|
+
event.node.res.end(JSON.stringify(responseBody, void 0, 2));
|
|
146
146
|
}
|
|
147
147
|
function isError(input) {
|
|
148
148
|
return input?.constructor?.__h3_error__ === true;
|
|
@@ -410,12 +410,15 @@ function readRawBody(event, encoding = "utf8") {
|
|
|
410
410
|
if (_resolved instanceof URLSearchParams) {
|
|
411
411
|
return Buffer.from(_resolved.toString());
|
|
412
412
|
}
|
|
413
|
+
if (_resolved instanceof FormData) {
|
|
414
|
+
return new Response(_resolved).bytes().then((uint8arr) => Buffer.from(uint8arr));
|
|
415
|
+
}
|
|
413
416
|
return Buffer.from(_resolved);
|
|
414
417
|
});
|
|
415
418
|
return encoding ? promise2.then((buff) => buff.toString(encoding)) : promise2;
|
|
416
419
|
}
|
|
417
420
|
if (!Number.parseInt(event.node.req.headers["content-length"] || "") && !String(event.node.req.headers["transfer-encoding"] ?? "").split(",").map((e) => e.trim()).filter(Boolean).includes("chunked")) {
|
|
418
|
-
return Promise.resolve(
|
|
421
|
+
return Promise.resolve(void 0);
|
|
419
422
|
}
|
|
420
423
|
const promise = event.node.req[RawBodySymbol] = new Promise(
|
|
421
424
|
(resolve, reject) => {
|
|
@@ -510,7 +513,7 @@ function getRequestWebStream(event) {
|
|
|
510
513
|
}
|
|
511
514
|
function _parseJSON(body = "", strict) {
|
|
512
515
|
if (!body) {
|
|
513
|
-
return
|
|
516
|
+
return void 0;
|
|
514
517
|
}
|
|
515
518
|
try {
|
|
516
519
|
return destr__default(body, { strict });
|
|
@@ -541,14 +544,14 @@ function _parseURLEncodedBody(body) {
|
|
|
541
544
|
function handleCacheHeaders(event, opts) {
|
|
542
545
|
const cacheControls = ["public", ...opts.cacheControls || []];
|
|
543
546
|
let cacheMatched = false;
|
|
544
|
-
if (opts.maxAge !==
|
|
547
|
+
if (opts.maxAge !== void 0) {
|
|
545
548
|
cacheControls.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
|
|
546
549
|
}
|
|
547
550
|
if (opts.modifiedTime) {
|
|
548
551
|
const modifiedTime = new Date(opts.modifiedTime);
|
|
549
552
|
const ifModifiedSince = event.node.req.headers["if-modified-since"];
|
|
550
553
|
event.node.res.setHeader("last-modified", modifiedTime.toUTCString());
|
|
551
|
-
if (ifModifiedSince && new Date(ifModifiedSince) >=
|
|
554
|
+
if (ifModifiedSince && new Date(ifModifiedSince) >= modifiedTime) {
|
|
552
555
|
cacheMatched = true;
|
|
553
556
|
}
|
|
554
557
|
}
|
|
@@ -593,14 +596,7 @@ function sanitizeStatusCode(statusCode, defaultStatusCode = 200) {
|
|
|
593
596
|
}
|
|
594
597
|
|
|
595
598
|
function getDistinctCookieKey(name, opts) {
|
|
596
|
-
return [
|
|
597
|
-
name,
|
|
598
|
-
opts.domain || "",
|
|
599
|
-
opts.path || "/",
|
|
600
|
-
Boolean(opts.secure),
|
|
601
|
-
Boolean(opts.httpOnly),
|
|
602
|
-
Boolean(opts.sameSite)
|
|
603
|
-
].join(";");
|
|
599
|
+
return [name, opts.domain || "", opts.path || "/"].join(";");
|
|
604
600
|
}
|
|
605
601
|
|
|
606
602
|
function parseCookies(event) {
|
|
@@ -708,7 +704,7 @@ function serializeIterableValue(value) {
|
|
|
708
704
|
}
|
|
709
705
|
case "function":
|
|
710
706
|
case "undefined": {
|
|
711
|
-
return
|
|
707
|
+
return void 0;
|
|
712
708
|
}
|
|
713
709
|
case "object": {
|
|
714
710
|
if (value instanceof Uint8Array) {
|
|
@@ -981,9 +977,9 @@ function sendIterable(event, iterable, options) {
|
|
|
981
977
|
new ReadableStream({
|
|
982
978
|
async pull(controller) {
|
|
983
979
|
const { value, done } = await iterator.next();
|
|
984
|
-
if (value !==
|
|
980
|
+
if (value !== void 0) {
|
|
985
981
|
const chunk = serializer(value);
|
|
986
|
-
if (chunk !==
|
|
982
|
+
if (chunk !== void 0) {
|
|
987
983
|
controller.enqueue(chunk);
|
|
988
984
|
}
|
|
989
985
|
}
|
|
@@ -1161,7 +1157,7 @@ async function proxyRequest(event, target, opts = {}) {
|
|
|
1161
1157
|
body = getRequestWebStream(event);
|
|
1162
1158
|
duplex = "half";
|
|
1163
1159
|
} else {
|
|
1164
|
-
body = await readRawBody(event, false).catch(() =>
|
|
1160
|
+
body = await readRawBody(event, false).catch(() => void 0);
|
|
1165
1161
|
}
|
|
1166
1162
|
}
|
|
1167
1163
|
const method = opts.fetchOptions?.method || event.method;
|
|
@@ -1241,7 +1237,7 @@ async function sendProxy(event, target, opts = {}) {
|
|
|
1241
1237
|
if (opts.onResponse) {
|
|
1242
1238
|
await opts.onResponse(event, response);
|
|
1243
1239
|
}
|
|
1244
|
-
if (response._data !==
|
|
1240
|
+
if (response._data !== void 0) {
|
|
1245
1241
|
return response._data;
|
|
1246
1242
|
}
|
|
1247
1243
|
if (event.handled) {
|
|
@@ -1315,8 +1311,9 @@ function mergeHeaders(defaults, ...inputs) {
|
|
|
1315
1311
|
}
|
|
1316
1312
|
const merged = new Headers(defaults);
|
|
1317
1313
|
for (const input of _inputs) {
|
|
1318
|
-
|
|
1319
|
-
|
|
1314
|
+
const entries = Array.isArray(input) ? input : typeof input.entries === "function" ? input.entries() : Object.entries(input);
|
|
1315
|
+
for (const [key, value] of entries) {
|
|
1316
|
+
if (value !== void 0) {
|
|
1320
1317
|
merged.set(key, value);
|
|
1321
1318
|
}
|
|
1322
1319
|
}
|
|
@@ -1433,7 +1430,7 @@ async function updateSession(event, config, update) {
|
|
|
1433
1430
|
const sealed = await sealSession(event, config);
|
|
1434
1431
|
setCookie(event, sessionName, sealed, {
|
|
1435
1432
|
...DEFAULT_COOKIE,
|
|
1436
|
-
expires: config.maxAge ? new Date(session.createdAt + config.maxAge * 1e3) :
|
|
1433
|
+
expires: config.maxAge ? new Date(session.createdAt + config.maxAge * 1e3) : void 0,
|
|
1437
1434
|
...config.cookie
|
|
1438
1435
|
});
|
|
1439
1436
|
}
|
|
@@ -1519,7 +1516,7 @@ function setEventStreamHeaders(event) {
|
|
|
1519
1516
|
setResponseHeaders(event, headers);
|
|
1520
1517
|
}
|
|
1521
1518
|
function isHttp2Request(event) {
|
|
1522
|
-
return getHeader(event, ":path") !==
|
|
1519
|
+
return getHeader(event, ":path") !== void 0 && getHeader(event, ":method") !== void 0;
|
|
1523
1520
|
}
|
|
1524
1521
|
|
|
1525
1522
|
class EventStream {
|
|
@@ -1609,7 +1606,7 @@ class EventStream {
|
|
|
1609
1606
|
}
|
|
1610
1607
|
if (this._unsentData?.length) {
|
|
1611
1608
|
await this._writer.write(this._encoder.encode(this._unsentData));
|
|
1612
|
-
this._unsentData =
|
|
1609
|
+
this._unsentData = void 0;
|
|
1613
1610
|
}
|
|
1614
1611
|
}
|
|
1615
1612
|
/**
|
|
@@ -1719,7 +1716,7 @@ async function serveStatic(event, options) {
|
|
|
1719
1716
|
if (meta.encoding && !getResponseHeader(event, "content-encoding")) {
|
|
1720
1717
|
setResponseHeader(event, "content-encoding", meta.encoding);
|
|
1721
1718
|
}
|
|
1722
|
-
if (meta.size !==
|
|
1719
|
+
if (meta.size !== void 0 && meta.size > 0 && !getResponseHeader(event, "content-length")) {
|
|
1723
1720
|
setResponseHeader(event, "content-length", meta.size);
|
|
1724
1721
|
}
|
|
1725
1722
|
if (event.method === "HEAD") {
|
|
@@ -1861,7 +1858,7 @@ function defineEventHandler(handler) {
|
|
|
1861
1858
|
return _handler;
|
|
1862
1859
|
}
|
|
1863
1860
|
function _normalizeArray(input) {
|
|
1864
|
-
return input ? Array.isArray(input) ? input : [input] :
|
|
1861
|
+
return input ? Array.isArray(input) ? input : [input] : void 0;
|
|
1865
1862
|
}
|
|
1866
1863
|
async function _callHandler(event, handler, hooks) {
|
|
1867
1864
|
if (hooks.onRequest) {
|
|
@@ -1991,7 +1988,7 @@ function use(app, arg1, arg2, arg3) {
|
|
|
1991
1988
|
return app;
|
|
1992
1989
|
}
|
|
1993
1990
|
function createAppEventHandler(stack, options) {
|
|
1994
|
-
const spacing = options.debug ? 2 :
|
|
1991
|
+
const spacing = options.debug ? 2 : void 0;
|
|
1995
1992
|
return eventHandler(async (event) => {
|
|
1996
1993
|
event.node.req.originalUrl = event.node.req.originalUrl || event.node.req.url || "/";
|
|
1997
1994
|
const _reqPath = event._path || event.node.req.url || "/";
|
|
@@ -2014,8 +2011,8 @@ function createAppEventHandler(stack, options) {
|
|
|
2014
2011
|
event._path = _layerPath;
|
|
2015
2012
|
event.node.req.url = _layerPath;
|
|
2016
2013
|
const val = await layer.handler(event);
|
|
2017
|
-
const _body = val ===
|
|
2018
|
-
if (_body !==
|
|
2014
|
+
const _body = val === void 0 ? void 0 : await val;
|
|
2015
|
+
if (_body !== void 0) {
|
|
2019
2016
|
const _response = { body: _body };
|
|
2020
2017
|
if (options.onBeforeResponse) {
|
|
2021
2018
|
event._onBeforeResponseCalled = true;
|
|
@@ -2031,7 +2028,7 @@ function createAppEventHandler(stack, options) {
|
|
|
2031
2028
|
if (event.handled) {
|
|
2032
2029
|
if (options.onAfterResponse) {
|
|
2033
2030
|
event._onAfterResponseCalled = true;
|
|
2034
|
-
await options.onAfterResponse(event,
|
|
2031
|
+
await options.onAfterResponse(event, void 0);
|
|
2035
2032
|
}
|
|
2036
2033
|
return;
|
|
2037
2034
|
}
|
|
@@ -2044,7 +2041,7 @@ function createAppEventHandler(stack, options) {
|
|
|
2044
2041
|
}
|
|
2045
2042
|
if (options.onAfterResponse) {
|
|
2046
2043
|
event._onAfterResponseCalled = true;
|
|
2047
|
-
await options.onAfterResponse(event,
|
|
2044
|
+
await options.onAfterResponse(event, void 0);
|
|
2048
2045
|
}
|
|
2049
2046
|
});
|
|
2050
2047
|
}
|
|
@@ -2059,7 +2056,7 @@ function createResolver(stack) {
|
|
|
2059
2056
|
continue;
|
|
2060
2057
|
}
|
|
2061
2058
|
_layerPath = path.slice(layer.route.length) || "/";
|
|
2062
|
-
if (layer.match && !layer.match(_layerPath,
|
|
2059
|
+
if (layer.match && !layer.match(_layerPath, void 0)) {
|
|
2063
2060
|
continue;
|
|
2064
2061
|
}
|
|
2065
2062
|
let res = { route: layer.route, handler: layer.handler };
|
|
@@ -2086,7 +2083,7 @@ function normalizeLayer(input) {
|
|
|
2086
2083
|
if (input.lazy) {
|
|
2087
2084
|
handler = lazyEventHandler(handler);
|
|
2088
2085
|
} else if (!isEventHandler(handler)) {
|
|
2089
|
-
handler = toEventHandler(handler,
|
|
2086
|
+
handler = toEventHandler(handler, void 0, input.route);
|
|
2090
2087
|
}
|
|
2091
2088
|
return {
|
|
2092
2089
|
route: ufo.withoutTrailingSlash(input.route),
|
|
@@ -2125,7 +2122,7 @@ function handleHandlerResponse(event, val, jsonSpace) {
|
|
|
2125
2122
|
return send(event, val, MIMES.html);
|
|
2126
2123
|
}
|
|
2127
2124
|
if (valType === "object" || valType === "boolean" || valType === "number") {
|
|
2128
|
-
return send(event, JSON.stringify(val,
|
|
2125
|
+
return send(event, JSON.stringify(val, void 0, jsonSpace), MIMES.json);
|
|
2129
2126
|
}
|
|
2130
2127
|
if (valType === "bigint") {
|
|
2131
2128
|
return send(event, val.toString(), MIMES.json);
|
|
@@ -2183,7 +2180,7 @@ function createRouter(opts = {}) {
|
|
|
2183
2180
|
addRoute(path, handler, m);
|
|
2184
2181
|
}
|
|
2185
2182
|
} else {
|
|
2186
|
-
route.handlers[method] = toEventHandler(handler,
|
|
2183
|
+
route.handlers[method] = toEventHandler(handler, void 0, path);
|
|
2187
2184
|
}
|
|
2188
2185
|
return router;
|
|
2189
2186
|
};
|
|
@@ -2253,7 +2250,7 @@ function createRouter(opts = {}) {
|
|
|
2253
2250
|
const params = match.matched.params || {};
|
|
2254
2251
|
event.context.params = params;
|
|
2255
2252
|
return Promise.resolve(match.handler(event)).then((res) => {
|
|
2256
|
-
if (res ===
|
|
2253
|
+
if (res === void 0 && isPreemptive) {
|
|
2257
2254
|
return null;
|
|
2258
2255
|
}
|
|
2259
2256
|
return res;
|
|
@@ -2345,7 +2342,7 @@ function callNodeListener(handler, req, res) {
|
|
|
2345
2342
|
res.off("close", next);
|
|
2346
2343
|
res.off("error", next);
|
|
2347
2344
|
}
|
|
2348
|
-
return err ? reject(createError(err)) : resolve(
|
|
2345
|
+
return err ? reject(createError(err)) : resolve(void 0);
|
|
2349
2346
|
};
|
|
2350
2347
|
try {
|
|
2351
2348
|
const returned = handler(req, res, next);
|
|
@@ -2445,7 +2442,7 @@ function _normalizeUnenvHeaders(input) {
|
|
|
2445
2442
|
for (const _value of value) {
|
|
2446
2443
|
headers.push([key, _value]);
|
|
2447
2444
|
}
|
|
2448
|
-
} else if (value !==
|
|
2445
|
+
} else if (value !== void 0) {
|
|
2449
2446
|
headers.push([key, String(value)]);
|
|
2450
2447
|
}
|
|
2451
2448
|
}
|
package/dist/index.d.cts
CHANGED
|
@@ -331,7 +331,7 @@ declare class H3Error<DataT = unknown> extends Error {
|
|
|
331
331
|
constructor(message: string, opts?: {
|
|
332
332
|
cause?: unknown;
|
|
333
333
|
});
|
|
334
|
-
toJSON(): Pick<H3Error<DataT>, "
|
|
334
|
+
toJSON(): Pick<H3Error<DataT>, "message" | "statusCode" | "statusMessage" | "data">;
|
|
335
335
|
}
|
|
336
336
|
/**
|
|
337
337
|
* Creates a new `Error` that can be used to handle both internal and runtime errors.
|
|
@@ -1392,4 +1392,5 @@ declare function toPlainHandler(app: App): PlainHandler;
|
|
|
1392
1392
|
/** @experimental */
|
|
1393
1393
|
declare function fromPlainHandler(handler: PlainHandler): EventHandler<EventHandlerRequest, Promise<unknown>>;
|
|
1394
1394
|
|
|
1395
|
-
export {
|
|
1395
|
+
export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearResponseHeaders, clearSession, createApp, createAppEventHandler, createError, createEvent, createEventStream, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, defineRequestMiddleware, defineResponseMiddleware, defineWebSocket, defineWebSocketHandler, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, fromPlainHandler, fromWebHandler, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestFingerprint, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestPath, getRequestProtocol, getRequestURL, getRequestWebStream, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, getValidatedQuery, getValidatedRouterParams, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, isWebResponse, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readFormData, readMultipartFormData, readRawBody, readValidatedBody, removeResponseHeader, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendIterable, sendNoContent, sendProxy, sendRedirect, sendStream, sendWebResponse, serveStatic, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, toPlainHandler, toWebHandler, toWebRequest, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
|
|
1396
|
+
export type { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, Duplex, DynamicEventHandler, Encoding, EventHandler, EventHandlerObject, EventHandlerRequest, EventHandlerResolver, EventHandlerResponse, EventStream, EventStreamMessage, EventStreamOptions, H3CorsOptions, H3EventContext, HTTPHeaderName, HTTPMethod, InferEventInput, InputLayer, InputStack, Layer, LazyEventHandler, Matcher, MimeType, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, PlainHandler, PlainRequest, PlainResponse, ProxyOptions, RequestFingerprintOptions, RequestHeaders, RouteNode, Router, RouterMethod, RouterUse, ServeStaticOptions, Session, SessionConfig, SessionData, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
|
package/dist/index.d.mts
CHANGED
|
@@ -331,7 +331,7 @@ declare class H3Error<DataT = unknown> extends Error {
|
|
|
331
331
|
constructor(message: string, opts?: {
|
|
332
332
|
cause?: unknown;
|
|
333
333
|
});
|
|
334
|
-
toJSON(): Pick<H3Error<DataT>, "
|
|
334
|
+
toJSON(): Pick<H3Error<DataT>, "message" | "statusCode" | "statusMessage" | "data">;
|
|
335
335
|
}
|
|
336
336
|
/**
|
|
337
337
|
* Creates a new `Error` that can be used to handle both internal and runtime errors.
|
|
@@ -1392,4 +1392,5 @@ declare function toPlainHandler(app: App): PlainHandler;
|
|
|
1392
1392
|
/** @experimental */
|
|
1393
1393
|
declare function fromPlainHandler(handler: PlainHandler): EventHandler<EventHandlerRequest, Promise<unknown>>;
|
|
1394
1394
|
|
|
1395
|
-
export {
|
|
1395
|
+
export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearResponseHeaders, clearSession, createApp, createAppEventHandler, createError, createEvent, createEventStream, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, defineRequestMiddleware, defineResponseMiddleware, defineWebSocket, defineWebSocketHandler, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, fromPlainHandler, fromWebHandler, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestFingerprint, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestPath, getRequestProtocol, getRequestURL, getRequestWebStream, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, getValidatedQuery, getValidatedRouterParams, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, isWebResponse, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readFormData, readMultipartFormData, readRawBody, readValidatedBody, removeResponseHeader, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendIterable, sendNoContent, sendProxy, sendRedirect, sendStream, sendWebResponse, serveStatic, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, toPlainHandler, toWebHandler, toWebRequest, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
|
|
1396
|
+
export type { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, Duplex, DynamicEventHandler, Encoding, EventHandler, EventHandlerObject, EventHandlerRequest, EventHandlerResolver, EventHandlerResponse, EventStream, EventStreamMessage, EventStreamOptions, H3CorsOptions, H3EventContext, HTTPHeaderName, HTTPMethod, InferEventInput, InputLayer, InputStack, Layer, LazyEventHandler, Matcher, MimeType, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, PlainHandler, PlainRequest, PlainResponse, ProxyOptions, RequestFingerprintOptions, RequestHeaders, RouteNode, Router, RouterMethod, RouterUse, ServeStaticOptions, Session, SessionConfig, SessionData, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
|
package/dist/index.d.ts
CHANGED
|
@@ -331,7 +331,7 @@ declare class H3Error<DataT = unknown> extends Error {
|
|
|
331
331
|
constructor(message: string, opts?: {
|
|
332
332
|
cause?: unknown;
|
|
333
333
|
});
|
|
334
|
-
toJSON(): Pick<H3Error<DataT>, "
|
|
334
|
+
toJSON(): Pick<H3Error<DataT>, "message" | "statusCode" | "statusMessage" | "data">;
|
|
335
335
|
}
|
|
336
336
|
/**
|
|
337
337
|
* Creates a new `Error` that can be used to handle both internal and runtime errors.
|
|
@@ -1392,4 +1392,5 @@ declare function toPlainHandler(app: App): PlainHandler;
|
|
|
1392
1392
|
/** @experimental */
|
|
1393
1393
|
declare function fromPlainHandler(handler: PlainHandler): EventHandler<EventHandlerRequest, Promise<unknown>>;
|
|
1394
1394
|
|
|
1395
|
-
export {
|
|
1395
|
+
export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearResponseHeaders, clearSession, createApp, createAppEventHandler, createError, createEvent, createEventStream, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, defineRequestMiddleware, defineResponseMiddleware, defineWebSocket, defineWebSocketHandler, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, fromPlainHandler, fromWebHandler, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestFingerprint, getRequestHeader, getRequestHeaders, getRequestHost, getRequestIP, getRequestPath, getRequestProtocol, getRequestURL, getRequestWebStream, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, getValidatedQuery, getValidatedRouterParams, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, isWebResponse, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readFormData, readMultipartFormData, readRawBody, readValidatedBody, removeResponseHeader, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendIterable, sendNoContent, sendProxy, sendRedirect, sendStream, sendWebResponse, serveStatic, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, toPlainHandler, toWebHandler, toWebRequest, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
|
|
1396
|
+
export type { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, Duplex, DynamicEventHandler, Encoding, EventHandler, EventHandlerObject, EventHandlerRequest, EventHandlerResolver, EventHandlerResponse, EventStream, EventStreamMessage, EventStreamOptions, H3CorsOptions, H3EventContext, HTTPHeaderName, HTTPMethod, InferEventInput, InputLayer, InputStack, Layer, LazyEventHandler, Matcher, MimeType, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, PlainHandler, PlainRequest, PlainResponse, ProxyOptions, RequestFingerprintOptions, RequestHeaders, RouteNode, Router, RouterMethod, RouterUse, ServeStaticOptions, Session, SessionConfig, SessionData, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
|
package/dist/index.mjs
CHANGED
|
@@ -55,7 +55,7 @@ class H3Error extends Error {
|
|
|
55
55
|
if (this.statusMessage) {
|
|
56
56
|
obj.statusMessage = sanitizeStatusMessage(this.statusMessage);
|
|
57
57
|
}
|
|
58
|
-
if (this.data !==
|
|
58
|
+
if (this.data !== void 0) {
|
|
59
59
|
obj.data = this.data;
|
|
60
60
|
}
|
|
61
61
|
return obj;
|
|
@@ -107,10 +107,10 @@ function createError(input) {
|
|
|
107
107
|
);
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
if (input.fatal !==
|
|
110
|
+
if (input.fatal !== void 0) {
|
|
111
111
|
err.fatal = input.fatal;
|
|
112
112
|
}
|
|
113
|
-
if (input.unhandled !==
|
|
113
|
+
if (input.unhandled !== void 0) {
|
|
114
114
|
err.unhandled = input.unhandled;
|
|
115
115
|
}
|
|
116
116
|
return err;
|
|
@@ -135,7 +135,7 @@ function sendError(event, error, debug) {
|
|
|
135
135
|
const _code = Number.parseInt(h3Error.statusCode);
|
|
136
136
|
setResponseStatus(event, _code, h3Error.statusMessage);
|
|
137
137
|
event.node.res.setHeader("content-type", MIMES.json);
|
|
138
|
-
event.node.res.end(JSON.stringify(responseBody,
|
|
138
|
+
event.node.res.end(JSON.stringify(responseBody, void 0, 2));
|
|
139
139
|
}
|
|
140
140
|
function isError(input) {
|
|
141
141
|
return input?.constructor?.__h3_error__ === true;
|
|
@@ -403,12 +403,15 @@ function readRawBody(event, encoding = "utf8") {
|
|
|
403
403
|
if (_resolved instanceof URLSearchParams) {
|
|
404
404
|
return Buffer.from(_resolved.toString());
|
|
405
405
|
}
|
|
406
|
+
if (_resolved instanceof FormData) {
|
|
407
|
+
return new Response(_resolved).bytes().then((uint8arr) => Buffer.from(uint8arr));
|
|
408
|
+
}
|
|
406
409
|
return Buffer.from(_resolved);
|
|
407
410
|
});
|
|
408
411
|
return encoding ? promise2.then((buff) => buff.toString(encoding)) : promise2;
|
|
409
412
|
}
|
|
410
413
|
if (!Number.parseInt(event.node.req.headers["content-length"] || "") && !String(event.node.req.headers["transfer-encoding"] ?? "").split(",").map((e) => e.trim()).filter(Boolean).includes("chunked")) {
|
|
411
|
-
return Promise.resolve(
|
|
414
|
+
return Promise.resolve(void 0);
|
|
412
415
|
}
|
|
413
416
|
const promise = event.node.req[RawBodySymbol] = new Promise(
|
|
414
417
|
(resolve, reject) => {
|
|
@@ -503,7 +506,7 @@ function getRequestWebStream(event) {
|
|
|
503
506
|
}
|
|
504
507
|
function _parseJSON(body = "", strict) {
|
|
505
508
|
if (!body) {
|
|
506
|
-
return
|
|
509
|
+
return void 0;
|
|
507
510
|
}
|
|
508
511
|
try {
|
|
509
512
|
return destr(body, { strict });
|
|
@@ -534,14 +537,14 @@ function _parseURLEncodedBody(body) {
|
|
|
534
537
|
function handleCacheHeaders(event, opts) {
|
|
535
538
|
const cacheControls = ["public", ...opts.cacheControls || []];
|
|
536
539
|
let cacheMatched = false;
|
|
537
|
-
if (opts.maxAge !==
|
|
540
|
+
if (opts.maxAge !== void 0) {
|
|
538
541
|
cacheControls.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
|
|
539
542
|
}
|
|
540
543
|
if (opts.modifiedTime) {
|
|
541
544
|
const modifiedTime = new Date(opts.modifiedTime);
|
|
542
545
|
const ifModifiedSince = event.node.req.headers["if-modified-since"];
|
|
543
546
|
event.node.res.setHeader("last-modified", modifiedTime.toUTCString());
|
|
544
|
-
if (ifModifiedSince && new Date(ifModifiedSince) >=
|
|
547
|
+
if (ifModifiedSince && new Date(ifModifiedSince) >= modifiedTime) {
|
|
545
548
|
cacheMatched = true;
|
|
546
549
|
}
|
|
547
550
|
}
|
|
@@ -586,14 +589,7 @@ function sanitizeStatusCode(statusCode, defaultStatusCode = 200) {
|
|
|
586
589
|
}
|
|
587
590
|
|
|
588
591
|
function getDistinctCookieKey(name, opts) {
|
|
589
|
-
return [
|
|
590
|
-
name,
|
|
591
|
-
opts.domain || "",
|
|
592
|
-
opts.path || "/",
|
|
593
|
-
Boolean(opts.secure),
|
|
594
|
-
Boolean(opts.httpOnly),
|
|
595
|
-
Boolean(opts.sameSite)
|
|
596
|
-
].join(";");
|
|
592
|
+
return [name, opts.domain || "", opts.path || "/"].join(";");
|
|
597
593
|
}
|
|
598
594
|
|
|
599
595
|
function parseCookies(event) {
|
|
@@ -701,7 +697,7 @@ function serializeIterableValue(value) {
|
|
|
701
697
|
}
|
|
702
698
|
case "function":
|
|
703
699
|
case "undefined": {
|
|
704
|
-
return
|
|
700
|
+
return void 0;
|
|
705
701
|
}
|
|
706
702
|
case "object": {
|
|
707
703
|
if (value instanceof Uint8Array) {
|
|
@@ -974,9 +970,9 @@ function sendIterable(event, iterable, options) {
|
|
|
974
970
|
new ReadableStream({
|
|
975
971
|
async pull(controller) {
|
|
976
972
|
const { value, done } = await iterator.next();
|
|
977
|
-
if (value !==
|
|
973
|
+
if (value !== void 0) {
|
|
978
974
|
const chunk = serializer(value);
|
|
979
|
-
if (chunk !==
|
|
975
|
+
if (chunk !== void 0) {
|
|
980
976
|
controller.enqueue(chunk);
|
|
981
977
|
}
|
|
982
978
|
}
|
|
@@ -1154,7 +1150,7 @@ async function proxyRequest(event, target, opts = {}) {
|
|
|
1154
1150
|
body = getRequestWebStream(event);
|
|
1155
1151
|
duplex = "half";
|
|
1156
1152
|
} else {
|
|
1157
|
-
body = await readRawBody(event, false).catch(() =>
|
|
1153
|
+
body = await readRawBody(event, false).catch(() => void 0);
|
|
1158
1154
|
}
|
|
1159
1155
|
}
|
|
1160
1156
|
const method = opts.fetchOptions?.method || event.method;
|
|
@@ -1234,7 +1230,7 @@ async function sendProxy(event, target, opts = {}) {
|
|
|
1234
1230
|
if (opts.onResponse) {
|
|
1235
1231
|
await opts.onResponse(event, response);
|
|
1236
1232
|
}
|
|
1237
|
-
if (response._data !==
|
|
1233
|
+
if (response._data !== void 0) {
|
|
1238
1234
|
return response._data;
|
|
1239
1235
|
}
|
|
1240
1236
|
if (event.handled) {
|
|
@@ -1308,8 +1304,9 @@ function mergeHeaders(defaults, ...inputs) {
|
|
|
1308
1304
|
}
|
|
1309
1305
|
const merged = new Headers(defaults);
|
|
1310
1306
|
for (const input of _inputs) {
|
|
1311
|
-
|
|
1312
|
-
|
|
1307
|
+
const entries = Array.isArray(input) ? input : typeof input.entries === "function" ? input.entries() : Object.entries(input);
|
|
1308
|
+
for (const [key, value] of entries) {
|
|
1309
|
+
if (value !== void 0) {
|
|
1313
1310
|
merged.set(key, value);
|
|
1314
1311
|
}
|
|
1315
1312
|
}
|
|
@@ -1426,7 +1423,7 @@ async function updateSession(event, config, update) {
|
|
|
1426
1423
|
const sealed = await sealSession(event, config);
|
|
1427
1424
|
setCookie(event, sessionName, sealed, {
|
|
1428
1425
|
...DEFAULT_COOKIE,
|
|
1429
|
-
expires: config.maxAge ? new Date(session.createdAt + config.maxAge * 1e3) :
|
|
1426
|
+
expires: config.maxAge ? new Date(session.createdAt + config.maxAge * 1e3) : void 0,
|
|
1430
1427
|
...config.cookie
|
|
1431
1428
|
});
|
|
1432
1429
|
}
|
|
@@ -1512,7 +1509,7 @@ function setEventStreamHeaders(event) {
|
|
|
1512
1509
|
setResponseHeaders(event, headers);
|
|
1513
1510
|
}
|
|
1514
1511
|
function isHttp2Request(event) {
|
|
1515
|
-
return getHeader(event, ":path") !==
|
|
1512
|
+
return getHeader(event, ":path") !== void 0 && getHeader(event, ":method") !== void 0;
|
|
1516
1513
|
}
|
|
1517
1514
|
|
|
1518
1515
|
class EventStream {
|
|
@@ -1602,7 +1599,7 @@ class EventStream {
|
|
|
1602
1599
|
}
|
|
1603
1600
|
if (this._unsentData?.length) {
|
|
1604
1601
|
await this._writer.write(this._encoder.encode(this._unsentData));
|
|
1605
|
-
this._unsentData =
|
|
1602
|
+
this._unsentData = void 0;
|
|
1606
1603
|
}
|
|
1607
1604
|
}
|
|
1608
1605
|
/**
|
|
@@ -1712,7 +1709,7 @@ async function serveStatic(event, options) {
|
|
|
1712
1709
|
if (meta.encoding && !getResponseHeader(event, "content-encoding")) {
|
|
1713
1710
|
setResponseHeader(event, "content-encoding", meta.encoding);
|
|
1714
1711
|
}
|
|
1715
|
-
if (meta.size !==
|
|
1712
|
+
if (meta.size !== void 0 && meta.size > 0 && !getResponseHeader(event, "content-length")) {
|
|
1716
1713
|
setResponseHeader(event, "content-length", meta.size);
|
|
1717
1714
|
}
|
|
1718
1715
|
if (event.method === "HEAD") {
|
|
@@ -1854,7 +1851,7 @@ function defineEventHandler(handler) {
|
|
|
1854
1851
|
return _handler;
|
|
1855
1852
|
}
|
|
1856
1853
|
function _normalizeArray(input) {
|
|
1857
|
-
return input ? Array.isArray(input) ? input : [input] :
|
|
1854
|
+
return input ? Array.isArray(input) ? input : [input] : void 0;
|
|
1858
1855
|
}
|
|
1859
1856
|
async function _callHandler(event, handler, hooks) {
|
|
1860
1857
|
if (hooks.onRequest) {
|
|
@@ -1984,7 +1981,7 @@ function use(app, arg1, arg2, arg3) {
|
|
|
1984
1981
|
return app;
|
|
1985
1982
|
}
|
|
1986
1983
|
function createAppEventHandler(stack, options) {
|
|
1987
|
-
const spacing = options.debug ? 2 :
|
|
1984
|
+
const spacing = options.debug ? 2 : void 0;
|
|
1988
1985
|
return eventHandler(async (event) => {
|
|
1989
1986
|
event.node.req.originalUrl = event.node.req.originalUrl || event.node.req.url || "/";
|
|
1990
1987
|
const _reqPath = event._path || event.node.req.url || "/";
|
|
@@ -2007,8 +2004,8 @@ function createAppEventHandler(stack, options) {
|
|
|
2007
2004
|
event._path = _layerPath;
|
|
2008
2005
|
event.node.req.url = _layerPath;
|
|
2009
2006
|
const val = await layer.handler(event);
|
|
2010
|
-
const _body = val ===
|
|
2011
|
-
if (_body !==
|
|
2007
|
+
const _body = val === void 0 ? void 0 : await val;
|
|
2008
|
+
if (_body !== void 0) {
|
|
2012
2009
|
const _response = { body: _body };
|
|
2013
2010
|
if (options.onBeforeResponse) {
|
|
2014
2011
|
event._onBeforeResponseCalled = true;
|
|
@@ -2024,7 +2021,7 @@ function createAppEventHandler(stack, options) {
|
|
|
2024
2021
|
if (event.handled) {
|
|
2025
2022
|
if (options.onAfterResponse) {
|
|
2026
2023
|
event._onAfterResponseCalled = true;
|
|
2027
|
-
await options.onAfterResponse(event,
|
|
2024
|
+
await options.onAfterResponse(event, void 0);
|
|
2028
2025
|
}
|
|
2029
2026
|
return;
|
|
2030
2027
|
}
|
|
@@ -2037,7 +2034,7 @@ function createAppEventHandler(stack, options) {
|
|
|
2037
2034
|
}
|
|
2038
2035
|
if (options.onAfterResponse) {
|
|
2039
2036
|
event._onAfterResponseCalled = true;
|
|
2040
|
-
await options.onAfterResponse(event,
|
|
2037
|
+
await options.onAfterResponse(event, void 0);
|
|
2041
2038
|
}
|
|
2042
2039
|
});
|
|
2043
2040
|
}
|
|
@@ -2052,7 +2049,7 @@ function createResolver(stack) {
|
|
|
2052
2049
|
continue;
|
|
2053
2050
|
}
|
|
2054
2051
|
_layerPath = path.slice(layer.route.length) || "/";
|
|
2055
|
-
if (layer.match && !layer.match(_layerPath,
|
|
2052
|
+
if (layer.match && !layer.match(_layerPath, void 0)) {
|
|
2056
2053
|
continue;
|
|
2057
2054
|
}
|
|
2058
2055
|
let res = { route: layer.route, handler: layer.handler };
|
|
@@ -2079,7 +2076,7 @@ function normalizeLayer(input) {
|
|
|
2079
2076
|
if (input.lazy) {
|
|
2080
2077
|
handler = lazyEventHandler(handler);
|
|
2081
2078
|
} else if (!isEventHandler(handler)) {
|
|
2082
|
-
handler = toEventHandler(handler,
|
|
2079
|
+
handler = toEventHandler(handler, void 0, input.route);
|
|
2083
2080
|
}
|
|
2084
2081
|
return {
|
|
2085
2082
|
route: withoutTrailingSlash(input.route),
|
|
@@ -2118,7 +2115,7 @@ function handleHandlerResponse(event, val, jsonSpace) {
|
|
|
2118
2115
|
return send(event, val, MIMES.html);
|
|
2119
2116
|
}
|
|
2120
2117
|
if (valType === "object" || valType === "boolean" || valType === "number") {
|
|
2121
|
-
return send(event, JSON.stringify(val,
|
|
2118
|
+
return send(event, JSON.stringify(val, void 0, jsonSpace), MIMES.json);
|
|
2122
2119
|
}
|
|
2123
2120
|
if (valType === "bigint") {
|
|
2124
2121
|
return send(event, val.toString(), MIMES.json);
|
|
@@ -2176,7 +2173,7 @@ function createRouter(opts = {}) {
|
|
|
2176
2173
|
addRoute(path, handler, m);
|
|
2177
2174
|
}
|
|
2178
2175
|
} else {
|
|
2179
|
-
route.handlers[method] = toEventHandler(handler,
|
|
2176
|
+
route.handlers[method] = toEventHandler(handler, void 0, path);
|
|
2180
2177
|
}
|
|
2181
2178
|
return router;
|
|
2182
2179
|
};
|
|
@@ -2246,7 +2243,7 @@ function createRouter(opts = {}) {
|
|
|
2246
2243
|
const params = match.matched.params || {};
|
|
2247
2244
|
event.context.params = params;
|
|
2248
2245
|
return Promise.resolve(match.handler(event)).then((res) => {
|
|
2249
|
-
if (res ===
|
|
2246
|
+
if (res === void 0 && isPreemptive) {
|
|
2250
2247
|
return null;
|
|
2251
2248
|
}
|
|
2252
2249
|
return res;
|
|
@@ -2338,7 +2335,7 @@ function callNodeListener(handler, req, res) {
|
|
|
2338
2335
|
res.off("close", next);
|
|
2339
2336
|
res.off("error", next);
|
|
2340
2337
|
}
|
|
2341
|
-
return err ? reject(createError(err)) : resolve(
|
|
2338
|
+
return err ? reject(createError(err)) : resolve(void 0);
|
|
2342
2339
|
};
|
|
2343
2340
|
try {
|
|
2344
2341
|
const returned = handler(req, res, next);
|
|
@@ -2438,7 +2435,7 @@ function _normalizeUnenvHeaders(input) {
|
|
|
2438
2435
|
for (const _value of value) {
|
|
2439
2436
|
headers.push([key, _value]);
|
|
2440
2437
|
}
|
|
2441
|
-
} else if (value !==
|
|
2438
|
+
} else if (value !== void 0) {
|
|
2442
2439
|
headers.push([key, String(value)]);
|
|
2443
2440
|
}
|
|
2444
2441
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "h3",
|
|
3
|
-
"version": "1.15.
|
|
3
|
+
"version": "1.15.2",
|
|
4
4
|
"description": "Minimal H(TTP) framework built for high performance and portability.",
|
|
5
5
|
"repository": "unjs/h3",
|
|
6
6
|
"license": "MIT",
|
|
@@ -34,42 +34,42 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"cookie-es": "^1.2.2",
|
|
37
|
-
"crossws": "^0.3.
|
|
37
|
+
"crossws": "^0.3.4",
|
|
38
38
|
"defu": "^6.1.4",
|
|
39
|
-
"destr": "^2.0.
|
|
39
|
+
"destr": "^2.0.5",
|
|
40
40
|
"iron-webcrypto": "^1.2.1",
|
|
41
41
|
"node-mock-http": "^1.0.0",
|
|
42
42
|
"radix3": "^1.1.2",
|
|
43
|
-
"ufo": "^1.
|
|
43
|
+
"ufo": "^1.6.1",
|
|
44
44
|
"uncrypto": "^0.1.3"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"0x": "^5.8.0",
|
|
48
|
-
"@types/express": "^5.0.
|
|
49
|
-
"@types/node": "^22.
|
|
50
|
-
"@types/supertest": "^6.0.
|
|
51
|
-
"@vitest/coverage-v8": "^3.
|
|
48
|
+
"@types/express": "^5.0.1",
|
|
49
|
+
"@types/node": "^22.15.2",
|
|
50
|
+
"@types/supertest": "^6.0.3",
|
|
51
|
+
"@vitest/coverage-v8": "^3.1.2",
|
|
52
52
|
"autocannon": "^8.0.0",
|
|
53
|
-
"automd": "^0.
|
|
54
|
-
"changelogen": "^0.
|
|
53
|
+
"automd": "^0.4.0",
|
|
54
|
+
"changelogen": "^0.6.1",
|
|
55
55
|
"connect": "^3.7.0",
|
|
56
|
-
"eslint": "^9.
|
|
56
|
+
"eslint": "^9.25.1",
|
|
57
57
|
"eslint-config-unjs": "^0.4.2",
|
|
58
|
-
"express": "^
|
|
58
|
+
"express": "^5.1.0",
|
|
59
59
|
"get-port": "^7.1.0",
|
|
60
|
-
"h3": "^1.
|
|
60
|
+
"h3": "^1.15.1",
|
|
61
61
|
"jiti": "^2.4.2",
|
|
62
62
|
"listhen": "^1.9.0",
|
|
63
63
|
"node-fetch-native": "^1.6.6",
|
|
64
|
-
"prettier": "^3.
|
|
65
|
-
"react": "^19.
|
|
66
|
-
"react-dom": "^19.
|
|
67
|
-
"supertest": "^7.
|
|
68
|
-
"typescript": "^5.
|
|
69
|
-
"unbuild": "^3.
|
|
70
|
-
"undici": "^7.
|
|
71
|
-
"vitest": "^3.
|
|
72
|
-
"zod": "^3.24.
|
|
64
|
+
"prettier": "^3.5.3",
|
|
65
|
+
"react": "^19.1.0",
|
|
66
|
+
"react-dom": "^19.1.0",
|
|
67
|
+
"supertest": "^7.1.0",
|
|
68
|
+
"typescript": "^5.8.3",
|
|
69
|
+
"unbuild": "^3.5.0",
|
|
70
|
+
"undici": "^7.8.0",
|
|
71
|
+
"vitest": "^3.1.2",
|
|
72
|
+
"zod": "^3.24.3"
|
|
73
73
|
},
|
|
74
74
|
"packageManager": "pnpm@10.2.0"
|
|
75
75
|
}
|