h3 1.6.4 → 1.6.6

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 CHANGED
@@ -8,6 +8,11 @@ const crypto = require('uncrypto');
8
8
  const ironWebcrypto = require('iron-webcrypto');
9
9
  const defu = require('defu');
10
10
 
11
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
12
+
13
+ const destr__default = /*#__PURE__*/_interopDefaultCompat(destr);
14
+ const crypto__default = /*#__PURE__*/_interopDefaultCompat(crypto);
15
+
11
16
  function useBase(base, handler) {
12
17
  base = ufo.withoutTrailingSlash(base);
13
18
  if (!base) {
@@ -252,23 +257,31 @@ function getRequestHeader(event, name) {
252
257
  return value;
253
258
  }
254
259
  const getHeader = getRequestHeader;
255
- function getRequestHost(event) {
256
- const xForwardedHost = event.node.req.headers["x-forwarded-host"];
257
- if (xForwardedHost) {
258
- return xForwardedHost;
260
+ function getRequestHost(event, opts = {}) {
261
+ if (opts.xForwardedHost) {
262
+ const xForwardedHost = event.node.req.headers["x-forwarded-host"];
263
+ if (xForwardedHost) {
264
+ return xForwardedHost;
265
+ }
259
266
  }
260
267
  return event.node.req.headers.host || "localhost";
261
268
  }
262
- function getRequestProtocol(event) {
263
- if (event.node.req.headers["x-forwarded-proto"] === "https") {
269
+ function getRequestProtocol(event, opts = {}) {
270
+ if (opts.xForwardedProto !== false && event.node.req.headers["x-forwarded-proto"] === "https") {
264
271
  return "https";
265
272
  }
266
273
  return event.node.req.connection.encrypted ? "https" : "http";
267
274
  }
268
- function getRequestURL(event) {
269
- const host = getRequestHost(event);
275
+ const DOUBLE_SLASH_RE = /[/\\]{2,}/g;
276
+ function getRequestPath(event) {
277
+ const path = (event.node.req.url || "/").replace(DOUBLE_SLASH_RE, "/");
278
+ return path;
279
+ }
280
+ function getRequestURL(event, opts = {}) {
281
+ const host = getRequestHost(event, opts);
270
282
  const protocol = getRequestProtocol(event);
271
- return new URL(event.path || "/", `${protocol}://${host}`);
283
+ const path = getRequestPath(event);
284
+ return new URL(path, `${protocol}://${host}`);
272
285
  }
273
286
 
274
287
  const RawBodySymbol = Symbol.for("h3RawBody");
@@ -278,8 +291,8 @@ function readRawBody(event, encoding = "utf8") {
278
291
  assertMethod(event, PayloadMethods$1);
279
292
  const _rawBody = event.node.req[RawBodySymbol] || event.node.req.body;
280
293
  if (_rawBody) {
281
- const promise2 = Promise.resolve(
282
- Buffer.isBuffer(_rawBody) ? _rawBody : Buffer.from(_rawBody)
294
+ const promise2 = Promise.resolve(_rawBody).then(
295
+ (_resolved) => Buffer.isBuffer(_resolved) ? _resolved : Buffer.from(_resolved)
283
296
  );
284
297
  return encoding ? promise2.then((buff) => buff.toString(encoding)) : promise2;
285
298
  }
@@ -321,7 +334,7 @@ async function readBody(event) {
321
334
  }
322
335
  return parsedForm;
323
336
  }
324
- const json = destr(body);
337
+ const json = destr__default(body);
325
338
  event.node.req[ParsedBodySymbol] = json;
326
339
  return json;
327
340
  }
@@ -805,7 +818,7 @@ async function getSession(event, config) {
805
818
  Object.assign(session, unsealed);
806
819
  }
807
820
  if (!session.id) {
808
- session.id = (config.crypto || crypto).randomUUID();
821
+ session.id = (config.crypto || crypto__default).randomUUID();
809
822
  session.createdAt = Date.now();
810
823
  await updateSession(event, config);
811
824
  }
@@ -833,7 +846,7 @@ async function updateSession(event, config, update) {
833
846
  async function sealSession(event, config) {
834
847
  const sessionName = config.name || DEFAULT_NAME;
835
848
  const session = event.context.sessions?.[sessionName] || await getSession(event, config);
836
- const sealed = await ironWebcrypto.seal(config.crypto || crypto, session, config.password, {
849
+ const sealed = await ironWebcrypto.seal(config.crypto || crypto__default, session, config.password, {
837
850
  ...ironWebcrypto.defaults,
838
851
  ttl: config.maxAge ? config.maxAge * 1e3 : 0,
839
852
  ...config.seal
@@ -842,7 +855,7 @@ async function sealSession(event, config) {
842
855
  }
843
856
  async function unsealSession(_event, config, sealed) {
844
857
  const unsealed = await ironWebcrypto.unseal(
845
- config.crypto || crypto,
858
+ config.crypto || crypto__default,
846
859
  sealed,
847
860
  config.password,
848
861
  {
@@ -1080,7 +1093,7 @@ class H3Event {
1080
1093
  this.node = { req, res };
1081
1094
  }
1082
1095
  get path() {
1083
- return this.req.url;
1096
+ return getRequestPath(this);
1084
1097
  }
1085
1098
  /** @deprecated Please use `event.node.req` instead. **/
1086
1099
  get req() {
@@ -1474,6 +1487,7 @@ exports.getQuery = getQuery;
1474
1487
  exports.getRequestHeader = getRequestHeader;
1475
1488
  exports.getRequestHeaders = getRequestHeaders;
1476
1489
  exports.getRequestHost = getRequestHost;
1490
+ exports.getRequestPath = getRequestPath;
1477
1491
  exports.getRequestProtocol = getRequestProtocol;
1478
1492
  exports.getRequestURL = getRequestURL;
1479
1493
  exports.getResponseHeader = getResponseHeader;
package/dist/index.d.ts CHANGED
@@ -108,7 +108,7 @@ declare class H3Event implements Pick<FetchEvent, "respondWith"> {
108
108
  node: NodeEventContext;
109
109
  context: H3EventContext;
110
110
  constructor(req: IncomingMessage, res: ServerResponse);
111
- get path(): string | undefined;
111
+ get path(): string;
112
112
  /** @deprecated Please use `event.node.req` instead. **/
113
113
  get req(): IncomingMessage;
114
114
  /** @deprecated Please use `event.node.res` instead. **/
@@ -333,9 +333,17 @@ declare function getRequestHeaders(event: H3Event): RequestHeaders;
333
333
  declare const getHeaders: typeof getRequestHeaders;
334
334
  declare function getRequestHeader(event: H3Event, name: string): RequestHeaders[string];
335
335
  declare const getHeader: typeof getRequestHeader;
336
- declare function getRequestHost(event: H3Event): string;
337
- declare function getRequestProtocol(event: H3Event): "https" | "http";
338
- declare function getRequestURL(event: H3Event): URL;
336
+ declare function getRequestHost(event: H3Event, opts?: {
337
+ xForwardedHost?: boolean;
338
+ }): string;
339
+ declare function getRequestProtocol(event: H3Event, opts?: {
340
+ xForwardedProto?: boolean;
341
+ }): "https" | "http";
342
+ declare function getRequestPath(event: H3Event): string;
343
+ declare function getRequestURL(event: H3Event, opts?: {
344
+ xForwardedHost?: boolean;
345
+ xForwardedProto?: boolean;
346
+ }): URL;
339
347
 
340
348
  declare function send(event: H3Event, data?: any, type?: string): Promise<void>;
341
349
  /**
@@ -402,4 +410,4 @@ interface CreateRouterOptions {
402
410
  }
403
411
  declare function createRouter(opts?: CreateRouterOptions): Router;
404
412
 
405
- export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, DynamicEventHandler, Encoding, EventHandler, EventHandlerResponse, H3CorsOptions, H3Error, H3Event, H3EventContext, H3Headers, H3Response, HTTPMethod, InputLayer, InputStack, Layer, LazyEventHandler, MIMES, Matcher, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, ProxyOptions, RequestHeaders, Router, RouterMethod, RouterUse, Session, SessionConfig, SessionData, Stack, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
413
+ export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, DynamicEventHandler, Encoding, EventHandler, EventHandlerResponse, H3CorsOptions, H3Error, H3Event, H3EventContext, H3Headers, H3Response, HTTPMethod, InputLayer, InputStack, Layer, LazyEventHandler, MIMES, Matcher, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, ProxyOptions, RequestHeaders, Router, RouterMethod, RouterUse, Session, SessionConfig, SessionData, Stack, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestPath, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
package/dist/index.mjs CHANGED
@@ -250,23 +250,31 @@ function getRequestHeader(event, name) {
250
250
  return value;
251
251
  }
252
252
  const getHeader = getRequestHeader;
253
- function getRequestHost(event) {
254
- const xForwardedHost = event.node.req.headers["x-forwarded-host"];
255
- if (xForwardedHost) {
256
- return xForwardedHost;
253
+ function getRequestHost(event, opts = {}) {
254
+ if (opts.xForwardedHost) {
255
+ const xForwardedHost = event.node.req.headers["x-forwarded-host"];
256
+ if (xForwardedHost) {
257
+ return xForwardedHost;
258
+ }
257
259
  }
258
260
  return event.node.req.headers.host || "localhost";
259
261
  }
260
- function getRequestProtocol(event) {
261
- if (event.node.req.headers["x-forwarded-proto"] === "https") {
262
+ function getRequestProtocol(event, opts = {}) {
263
+ if (opts.xForwardedProto !== false && event.node.req.headers["x-forwarded-proto"] === "https") {
262
264
  return "https";
263
265
  }
264
266
  return event.node.req.connection.encrypted ? "https" : "http";
265
267
  }
266
- function getRequestURL(event) {
267
- const host = getRequestHost(event);
268
+ const DOUBLE_SLASH_RE = /[/\\]{2,}/g;
269
+ function getRequestPath(event) {
270
+ const path = (event.node.req.url || "/").replace(DOUBLE_SLASH_RE, "/");
271
+ return path;
272
+ }
273
+ function getRequestURL(event, opts = {}) {
274
+ const host = getRequestHost(event, opts);
268
275
  const protocol = getRequestProtocol(event);
269
- return new URL(event.path || "/", `${protocol}://${host}`);
276
+ const path = getRequestPath(event);
277
+ return new URL(path, `${protocol}://${host}`);
270
278
  }
271
279
 
272
280
  const RawBodySymbol = Symbol.for("h3RawBody");
@@ -276,8 +284,8 @@ function readRawBody(event, encoding = "utf8") {
276
284
  assertMethod(event, PayloadMethods$1);
277
285
  const _rawBody = event.node.req[RawBodySymbol] || event.node.req.body;
278
286
  if (_rawBody) {
279
- const promise2 = Promise.resolve(
280
- Buffer.isBuffer(_rawBody) ? _rawBody : Buffer.from(_rawBody)
287
+ const promise2 = Promise.resolve(_rawBody).then(
288
+ (_resolved) => Buffer.isBuffer(_resolved) ? _resolved : Buffer.from(_resolved)
281
289
  );
282
290
  return encoding ? promise2.then((buff) => buff.toString(encoding)) : promise2;
283
291
  }
@@ -1078,7 +1086,7 @@ class H3Event {
1078
1086
  this.node = { req, res };
1079
1087
  }
1080
1088
  get path() {
1081
- return this.req.url;
1089
+ return getRequestPath(this);
1082
1090
  }
1083
1091
  /** @deprecated Please use `event.node.req` instead. **/
1084
1092
  get req() {
@@ -1434,4 +1442,4 @@ function createRouter(opts = {}) {
1434
1442
  return router;
1435
1443
  }
1436
1444
 
1437
- export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
1445
+ export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestPath, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "h3",
3
- "version": "1.6.4",
3
+ "version": "1.6.6",
4
4
  "description": "Tiny JavaScript Server",
5
5
  "repository": "unjs/h3",
6
6
  "license": "MIT",
@@ -19,46 +19,46 @@
19
19
  "files": [
20
20
  "dist"
21
21
  ],
22
+ "scripts": {
23
+ "build": "unbuild",
24
+ "dev": "vitest",
25
+ "lint": "eslint --cache --ext .ts,.js,.mjs,.cjs . && prettier -c src test playground",
26
+ "lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src test playground -w",
27
+ "play": "jiti ./playground/index.ts",
28
+ "profile": "0x -o -D .profile -P 'autocannon -c 100 -p 10 -d 40 http://localhost:$PORT' ./playground/server.cjs",
29
+ "release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags",
30
+ "test": "pnpm lint && vitest run --coverage"
31
+ },
22
32
  "dependencies": {
23
- "cookie-es": "^0.5.0",
33
+ "cookie-es": "^1.0.0",
24
34
  "defu": "^6.1.2",
25
35
  "destr": "^1.2.2",
26
- "iron-webcrypto": "^0.6.0",
36
+ "iron-webcrypto": "^0.7.0",
27
37
  "radix3": "^1.0.1",
28
- "ufo": "^1.1.1",
38
+ "ufo": "^1.1.2",
29
39
  "uncrypto": "^0.1.2"
30
40
  },
31
41
  "devDependencies": {
32
42
  "0x": "^5.5.0",
33
43
  "@types/express": "^4.17.17",
34
- "@types/node": "^18.15.10",
44
+ "@types/node": "^20.1.4",
35
45
  "@types/supertest": "^2.0.12",
36
- "@vitest/coverage-c8": "^0.29.7",
37
- "autocannon": "^7.10.0",
38
- "changelogen": "^0.5.1",
46
+ "@vitest/coverage-c8": "^0.31.0",
47
+ "autocannon": "^7.11.0",
48
+ "changelogen": "^0.5.3",
39
49
  "connect": "^3.7.0",
40
- "eslint": "^8.36.0",
50
+ "eslint": "^8.40.0",
41
51
  "eslint-config-unjs": "^0.1.0",
42
52
  "express": "^4.18.2",
43
53
  "get-port": "^6.1.2",
44
54
  "jiti": "^1.18.2",
45
55
  "listhen": "^1.0.4",
46
- "node-fetch-native": "^1.0.2",
47
- "prettier": "^2.8.7",
56
+ "node-fetch-native": "^1.1.1",
57
+ "prettier": "^2.8.8",
48
58
  "supertest": "^6.3.3",
49
- "typescript": "^5.0.2",
50
- "unbuild": "^1.1.2",
51
- "vitest": "^0.29.7"
59
+ "typescript": "^5.0.4",
60
+ "unbuild": "^1.2.1",
61
+ "vitest": "^0.31.0"
52
62
  },
53
- "packageManager": "pnpm@8.0.0",
54
- "scripts": {
55
- "build": "unbuild",
56
- "dev": "vitest",
57
- "lint": "eslint --cache --ext .ts,.js,.mjs,.cjs . && prettier -c src test playground",
58
- "lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src test playground -w",
59
- "play": "jiti ./playground/index.ts",
60
- "profile": "0x -o -D .profile -P 'autocannon -c 100 -p 10 -d 40 http://localhost:$PORT' ./playground/server.cjs",
61
- "release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags",
62
- "test": "pnpm lint && vitest run --coverage"
63
- }
63
+ "packageManager": "pnpm@8.5.1"
64
64
  }