h3 1.15.2 → 1.15.4

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/README.md CHANGED
@@ -33,11 +33,11 @@ H3 (pronounced as /eɪtʃθriː/, like h-3) is a minimal h(ttp) framework built
33
33
 
34
34
  <!-- automd:contributors license=MIT author="pi0" -->
35
35
 
36
- Published under the [MIT](https://github.com/unjs/h3/blob/main/LICENSE) license.
37
- Made by [@pi0](https://github.com/pi0) and [community](https://github.com/unjs/h3/graphs/contributors) 💛
36
+ Published under the [MIT](https://github.com/h3js/h3/blob/main/LICENSE) license.
37
+ Made by [@pi0](https://github.com/pi0) and [community](https://github.com/h3js/h3/graphs/contributors) 💛
38
38
  <br><br>
39
- <a href="https://github.com/unjs/h3/graphs/contributors">
40
- <img src="https://contrib.rocks/image?repo=unjs/h3" />
39
+ <a href="https://github.com/h3js/h3/graphs/contributors">
40
+ <img src="https://contrib.rocks/image?repo=h3js/h3" />
41
41
  </a>
42
42
 
43
43
  <!-- /automd -->
package/dist/index.cjs CHANGED
@@ -315,7 +315,8 @@ function getRequestHeader(event, name) {
315
315
  const getHeader = getRequestHeader;
316
316
  function getRequestHost(event, opts = {}) {
317
317
  if (opts.xForwardedHost) {
318
- const xForwardedHost = event.node.req.headers["x-forwarded-host"];
318
+ const _header = event.node.req.headers["x-forwarded-host"];
319
+ const xForwardedHost = (_header || "").split(",").shift()?.trim();
319
320
  if (xForwardedHost) {
320
321
  return xForwardedHost;
321
322
  }
@@ -1684,10 +1685,7 @@ async function serveStatic(event, options) {
1684
1685
  }
1685
1686
  if (!meta) {
1686
1687
  if (!options.fallthrough) {
1687
- throw createError({
1688
- statusMessage: "Cannot find static asset " + id,
1689
- statusCode: 404
1690
- });
1688
+ throw createError({ statusCode: 404 });
1691
1689
  }
1692
1690
  return false;
1693
1691
  }
package/dist/index.d.cts CHANGED
@@ -117,6 +117,12 @@ interface Session<T extends SessionDataT = SessionDataT> {
117
117
  data: SessionData<T>;
118
118
  [getSessionPromise]?: Promise<Session<T>>;
119
119
  }
120
+ interface SessionManager<T extends SessionDataT = SessionDataT> {
121
+ readonly id: string | undefined;
122
+ readonly data: SessionData<T>;
123
+ update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
124
+ clear: () => Promise<SessionManager<T>>;
125
+ }
120
126
  interface SessionConfig {
121
127
  /** Private key used to encrypt session tokens */
122
128
  password: string;
@@ -145,12 +151,7 @@ type CompatEvent = {
145
151
  /**
146
152
  * Create a session manager for the current request.
147
153
  */
148
- declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<{
149
- readonly id: any;
150
- readonly data: T;
151
- update: (update: SessionUpdate<T>) => Promise</*elided*/ any>;
152
- clear: () => Promise</*elided*/ any>;
153
- }>;
154
+ declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<SessionManager<T>>;
154
155
  /**
155
156
  * Get the session for the current request.
156
157
  */
@@ -1393,4 +1394,4 @@ declare function toPlainHandler(app: App): PlainHandler;
1393
1394
  declare function fromPlainHandler(handler: PlainHandler): EventHandler<EventHandlerRequest, Promise<unknown>>;
1394
1395
 
1395
1396
  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 };
1397
+ 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, SessionManager, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
package/dist/index.d.mts CHANGED
@@ -117,6 +117,12 @@ interface Session<T extends SessionDataT = SessionDataT> {
117
117
  data: SessionData<T>;
118
118
  [getSessionPromise]?: Promise<Session<T>>;
119
119
  }
120
+ interface SessionManager<T extends SessionDataT = SessionDataT> {
121
+ readonly id: string | undefined;
122
+ readonly data: SessionData<T>;
123
+ update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
124
+ clear: () => Promise<SessionManager<T>>;
125
+ }
120
126
  interface SessionConfig {
121
127
  /** Private key used to encrypt session tokens */
122
128
  password: string;
@@ -145,12 +151,7 @@ type CompatEvent = {
145
151
  /**
146
152
  * Create a session manager for the current request.
147
153
  */
148
- declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<{
149
- readonly id: any;
150
- readonly data: T;
151
- update: (update: SessionUpdate<T>) => Promise</*elided*/ any>;
152
- clear: () => Promise</*elided*/ any>;
153
- }>;
154
+ declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<SessionManager<T>>;
154
155
  /**
155
156
  * Get the session for the current request.
156
157
  */
@@ -1393,4 +1394,4 @@ declare function toPlainHandler(app: App): PlainHandler;
1393
1394
  declare function fromPlainHandler(handler: PlainHandler): EventHandler<EventHandlerRequest, Promise<unknown>>;
1394
1395
 
1395
1396
  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 };
1397
+ 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, SessionManager, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
package/dist/index.d.ts CHANGED
@@ -117,6 +117,12 @@ interface Session<T extends SessionDataT = SessionDataT> {
117
117
  data: SessionData<T>;
118
118
  [getSessionPromise]?: Promise<Session<T>>;
119
119
  }
120
+ interface SessionManager<T extends SessionDataT = SessionDataT> {
121
+ readonly id: string | undefined;
122
+ readonly data: SessionData<T>;
123
+ update: (update: SessionUpdate<T>) => Promise<SessionManager<T>>;
124
+ clear: () => Promise<SessionManager<T>>;
125
+ }
120
126
  interface SessionConfig {
121
127
  /** Private key used to encrypt session tokens */
122
128
  password: string;
@@ -145,12 +151,7 @@ type CompatEvent = {
145
151
  /**
146
152
  * Create a session manager for the current request.
147
153
  */
148
- declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<{
149
- readonly id: any;
150
- readonly data: T;
151
- update: (update: SessionUpdate<T>) => Promise</*elided*/ any>;
152
- clear: () => Promise</*elided*/ any>;
153
- }>;
154
+ declare function useSession<T extends SessionDataT = SessionDataT>(event: H3Event | CompatEvent, config: SessionConfig): Promise<SessionManager<T>>;
154
155
  /**
155
156
  * Get the session for the current request.
156
157
  */
@@ -1393,4 +1394,4 @@ declare function toPlainHandler(app: App): PlainHandler;
1393
1394
  declare function fromPlainHandler(handler: PlainHandler): EventHandler<EventHandlerRequest, Promise<unknown>>;
1394
1395
 
1395
1396
  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 };
1397
+ 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, SessionManager, Stack, StaticAssetMeta, StatusCode, TypedHeaders, ValidateFunction, ValidateResult, WebEventContext, WebHandler, WebSocketOptions, _RequestMiddleware, _ResponseMiddleware };
package/dist/index.mjs CHANGED
@@ -308,7 +308,8 @@ function getRequestHeader(event, name) {
308
308
  const getHeader = getRequestHeader;
309
309
  function getRequestHost(event, opts = {}) {
310
310
  if (opts.xForwardedHost) {
311
- const xForwardedHost = event.node.req.headers["x-forwarded-host"];
311
+ const _header = event.node.req.headers["x-forwarded-host"];
312
+ const xForwardedHost = (_header || "").split(",").shift()?.trim();
312
313
  if (xForwardedHost) {
313
314
  return xForwardedHost;
314
315
  }
@@ -1677,10 +1678,7 @@ async function serveStatic(event, options) {
1677
1678
  }
1678
1679
  if (!meta) {
1679
1680
  if (!options.fallthrough) {
1680
- throw createError({
1681
- statusMessage: "Cannot find static asset " + id,
1682
- statusCode: 404
1683
- });
1681
+ throw createError({ statusCode: 404 });
1684
1682
  }
1685
1683
  return false;
1686
1684
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "h3",
3
- "version": "1.15.2",
3
+ "version": "1.15.4",
4
4
  "description": "Minimal H(TTP) framework built for high performance and portability.",
5
- "repository": "unjs/h3",
5
+ "repository": "h3js/h3",
6
6
  "license": "MIT",
7
7
  "sideEffects": false,
8
8
  "exports": {
@@ -34,42 +34,42 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "cookie-es": "^1.2.2",
37
- "crossws": "^0.3.4",
37
+ "crossws": "^0.3.5",
38
38
  "defu": "^6.1.4",
39
39
  "destr": "^2.0.5",
40
40
  "iron-webcrypto": "^1.2.1",
41
- "node-mock-http": "^1.0.0",
41
+ "node-mock-http": "^1.0.2",
42
42
  "radix3": "^1.1.2",
43
43
  "ufo": "^1.6.1",
44
44
  "uncrypto": "^0.1.3"
45
45
  },
46
46
  "devDependencies": {
47
- "0x": "^5.8.0",
48
- "@types/express": "^5.0.1",
49
- "@types/node": "^22.15.2",
47
+ "0x": "^6.0.0",
48
+ "@types/express": "^5.0.3",
49
+ "@types/node": "^24.1.0",
50
50
  "@types/supertest": "^6.0.3",
51
- "@vitest/coverage-v8": "^3.1.2",
51
+ "@vitest/coverage-v8": "^3.2.4",
52
52
  "autocannon": "^8.0.0",
53
53
  "automd": "^0.4.0",
54
- "changelogen": "^0.6.1",
54
+ "changelogen": "^0.6.2",
55
55
  "connect": "^3.7.0",
56
- "eslint": "^9.25.1",
57
- "eslint-config-unjs": "^0.4.2",
56
+ "eslint": "^9.32.0",
57
+ "eslint-config-unjs": "^0.5.0",
58
58
  "express": "^5.1.0",
59
59
  "get-port": "^7.1.0",
60
- "h3": "^1.15.1",
61
- "jiti": "^2.4.2",
60
+ "h3": "^1.15.3",
61
+ "jiti": "^2.5.1",
62
62
  "listhen": "^1.9.0",
63
63
  "node-fetch-native": "^1.6.6",
64
- "prettier": "^3.5.3",
65
- "react": "^19.1.0",
66
- "react-dom": "^19.1.0",
67
- "supertest": "^7.1.0",
64
+ "prettier": "^3.6.2",
65
+ "react": "^19.1.1",
66
+ "react-dom": "^19.1.1",
67
+ "supertest": "^7.1.4",
68
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"
69
+ "unbuild": "^3.6.0",
70
+ "undici": "^7.12.0",
71
+ "vitest": "^3.2.4",
72
+ "zod": "^4.0.14"
73
73
  },
74
74
  "packageManager": "pnpm@10.2.0"
75
75
  }