hono 4.7.0 → 4.7.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.
@@ -1,7 +1,5 @@
1
1
  // src/adapter/aws-lambda/handler.ts
2
- import crypto from "node:crypto";
3
2
  import { decodeBase64, encodeBase64 } from "../../utils/encode.js";
4
- globalThis.crypto ??= crypto;
5
3
  var getRequestContext = (event) => {
6
4
  return event.requestContext;
7
5
  };
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,10 +15,6 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
- mod
23
- ));
24
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
19
  var handler_exports = {};
26
20
  __export(handler_exports, {
@@ -35,9 +29,7 @@ __export(handler_exports, {
35
29
  streamHandle: () => streamHandle
36
30
  });
37
31
  module.exports = __toCommonJS(handler_exports);
38
- var import_node_crypto = __toESM(require("node:crypto"), 1);
39
32
  var import_encode = require("../../utils/encode");
40
- globalThis.crypto ??= import_node_crypto.default;
41
33
  const getRequestContext = (event) => {
42
34
  return event.requestContext;
43
35
  };
@@ -28,12 +28,17 @@ var import_router = require("../../router");
28
28
  var import_trie_router = require("../../router/trie-router");
29
29
  const some = (...middleware) => {
30
30
  return async function some2(c, next) {
31
+ let isNextCalled = false;
32
+ const wrappedNext = () => {
33
+ isNextCalled = true;
34
+ return next();
35
+ };
31
36
  let lastError;
32
37
  for (const handler of middleware) {
33
38
  try {
34
- const result = await handler(c, next);
39
+ const result = await handler(c, wrappedNext);
35
40
  if (result === true && !c.finalized) {
36
- await next();
41
+ await wrappedNext();
37
42
  } else if (result === false) {
38
43
  lastError = new Error("No successful middleware found");
39
44
  continue;
@@ -42,7 +47,9 @@ const some = (...middleware) => {
42
47
  break;
43
48
  } catch (error) {
44
49
  lastError = error;
45
- continue;
50
+ if (isNextCalled) {
51
+ break;
52
+ }
46
53
  }
47
54
  }
48
55
  if (lastError) {
@@ -31,7 +31,7 @@ const mergeBuffers = (buffer1, buffer2) => {
31
31
  return merged;
32
32
  };
33
33
  const generateDigest = async (stream, generator) => {
34
- if (!stream || !crypto || !crypto.subtle) {
34
+ if (!stream) {
35
35
  return null;
36
36
  }
37
37
  let result = void 0;
@@ -34,21 +34,32 @@ const RETAINED_304_HEADERS = [
34
34
  function etagMatches(etag2, ifNoneMatch) {
35
35
  return ifNoneMatch != null && ifNoneMatch.split(/,\s*/).indexOf(etag2) > -1;
36
36
  }
37
+ function initializeGenerator(generator) {
38
+ if (!generator) {
39
+ if (crypto && crypto.subtle) {
40
+ generator = (body) => crypto.subtle.digest(
41
+ {
42
+ name: "SHA-1"
43
+ },
44
+ body
45
+ );
46
+ }
47
+ }
48
+ return generator;
49
+ }
37
50
  const etag = (options) => {
38
51
  const retainedHeaders = options?.retainedHeaders ?? RETAINED_304_HEADERS;
39
52
  const weak = options?.weak ?? false;
40
- const generator = options?.generateDigest ?? ((body) => crypto.subtle.digest(
41
- {
42
- name: "SHA-1"
43
- },
44
- body
45
- ));
53
+ const generator = initializeGenerator(options?.generateDigest);
46
54
  return async function etag2(c, next) {
47
55
  const ifNoneMatch = c.req.header("If-None-Match") ?? null;
48
56
  await next();
49
57
  const res = c.res;
50
58
  let etag3 = res.headers.get("ETag");
51
59
  if (!etag3) {
60
+ if (!generator) {
61
+ return;
62
+ }
52
63
  const hash = await (0, import_digest.generateDigest)(res.clone().body, generator);
53
64
  if (hash === null) {
54
65
  return;
@@ -122,27 +122,11 @@ const getPathNoStrict = (request) => {
122
122
  const result = getPath(request);
123
123
  return result.length > 1 && result.at(-1) === "/" ? result.slice(0, -1) : result;
124
124
  };
125
- const mergePath = (...paths) => {
126
- let p = "";
127
- let endsWithSlash = false;
128
- for (let path of paths) {
129
- if (p.at(-1) === "/") {
130
- p = p.slice(0, -1);
131
- endsWithSlash = true;
132
- }
133
- if (path[0] !== "/") {
134
- path = `/${path}`;
135
- }
136
- if (path === "/" && endsWithSlash) {
137
- p = `${p}/`;
138
- } else if (path !== "/") {
139
- p = `${p}${path}`;
140
- }
141
- if (path === "/" && p === "") {
142
- p = "/";
143
- }
125
+ const mergePath = (base, sub, ...rest) => {
126
+ if (rest.length) {
127
+ sub = mergePath(sub, ...rest);
144
128
  }
145
- return p;
129
+ return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`;
146
130
  };
147
131
  const checkOptionalParameter = (path) => {
148
132
  if (!path.match(/\:.+\?$/)) {
@@ -4,12 +4,17 @@ import { METHOD_NAME_ALL } from "../../router.js";
4
4
  import { TrieRouter } from "../../router/trie-router/index.js";
5
5
  var some = (...middleware) => {
6
6
  return async function some2(c, next) {
7
+ let isNextCalled = false;
8
+ const wrappedNext = () => {
9
+ isNextCalled = true;
10
+ return next();
11
+ };
7
12
  let lastError;
8
13
  for (const handler of middleware) {
9
14
  try {
10
- const result = await handler(c, next);
15
+ const result = await handler(c, wrappedNext);
11
16
  if (result === true && !c.finalized) {
12
- await next();
17
+ await wrappedNext();
13
18
  } else if (result === false) {
14
19
  lastError = new Error("No successful middleware found");
15
20
  continue;
@@ -18,7 +23,9 @@ var some = (...middleware) => {
18
23
  break;
19
24
  } catch (error) {
20
25
  lastError = error;
21
- continue;
26
+ if (isNextCalled) {
27
+ break;
28
+ }
22
29
  }
23
30
  }
24
31
  if (lastError) {
@@ -9,7 +9,7 @@ var mergeBuffers = (buffer1, buffer2) => {
9
9
  return merged;
10
10
  };
11
11
  var generateDigest = async (stream, generator) => {
12
- if (!stream || !crypto || !crypto.subtle) {
12
+ if (!stream) {
13
13
  return null;
14
14
  }
15
15
  let result = void 0;
@@ -11,21 +11,32 @@ var RETAINED_304_HEADERS = [
11
11
  function etagMatches(etag2, ifNoneMatch) {
12
12
  return ifNoneMatch != null && ifNoneMatch.split(/,\s*/).indexOf(etag2) > -1;
13
13
  }
14
+ function initializeGenerator(generator) {
15
+ if (!generator) {
16
+ if (crypto && crypto.subtle) {
17
+ generator = (body) => crypto.subtle.digest(
18
+ {
19
+ name: "SHA-1"
20
+ },
21
+ body
22
+ );
23
+ }
24
+ }
25
+ return generator;
26
+ }
14
27
  var etag = (options) => {
15
28
  const retainedHeaders = options?.retainedHeaders ?? RETAINED_304_HEADERS;
16
29
  const weak = options?.weak ?? false;
17
- const generator = options?.generateDigest ?? ((body) => crypto.subtle.digest(
18
- {
19
- name: "SHA-1"
20
- },
21
- body
22
- ));
30
+ const generator = initializeGenerator(options?.generateDigest);
23
31
  return async function etag2(c, next) {
24
32
  const ifNoneMatch = c.req.header("If-None-Match") ?? null;
25
33
  await next();
26
34
  const res = c.res;
27
35
  let etag3 = res.headers.get("ETag");
28
36
  if (!etag3) {
37
+ if (!generator) {
38
+ return;
39
+ }
29
40
  const hash = await generateDigest(res.clone().body, generator);
30
41
  if (hash === null) {
31
42
  return;
@@ -15,6 +15,16 @@ export declare const tryDecode: (str: string, decoder: Decoder) => string;
15
15
  export declare const getPath: (request: Request) => string;
16
16
  export declare const getQueryStrings: (url: string) => string;
17
17
  export declare const getPathNoStrict: (request: Request) => string;
18
+ /**
19
+ * Merge paths.
20
+ * @param {string[]} ...paths - The paths to merge.
21
+ * @returns {string} The merged path.
22
+ * @example
23
+ * mergePath('/api', '/users') // '/api/users'
24
+ * mergePath('/api/', '/users') // '/api/users'
25
+ * mergePath('/api', '/') // '/api'
26
+ * mergePath('/api/', '/') // '/api/'
27
+ */
18
28
  export declare const mergePath: (...paths: string[]) => string;
19
29
  export declare const checkOptionalParameter: (path: string) => string[] | null;
20
30
  export declare const getQueryParam: (url: string, key?: string) => string | undefined | Record<string, string>;
package/dist/utils/url.js CHANGED
@@ -89,27 +89,11 @@ var getPathNoStrict = (request) => {
89
89
  const result = getPath(request);
90
90
  return result.length > 1 && result.at(-1) === "/" ? result.slice(0, -1) : result;
91
91
  };
92
- var mergePath = (...paths) => {
93
- let p = "";
94
- let endsWithSlash = false;
95
- for (let path of paths) {
96
- if (p.at(-1) === "/") {
97
- p = p.slice(0, -1);
98
- endsWithSlash = true;
99
- }
100
- if (path[0] !== "/") {
101
- path = `/${path}`;
102
- }
103
- if (path === "/" && endsWithSlash) {
104
- p = `${p}/`;
105
- } else if (path !== "/") {
106
- p = `${p}${path}`;
107
- }
108
- if (path === "/" && p === "") {
109
- p = "/";
110
- }
92
+ var mergePath = (base, sub, ...rest) => {
93
+ if (rest.length) {
94
+ sub = mergePath(sub, ...rest);
111
95
  }
112
- return p;
96
+ return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`;
113
97
  };
114
98
  var checkOptionalParameter = (path) => {
115
99
  if (!path.match(/\:.+\?$/)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hono",
3
- "version": "4.7.0",
3
+ "version": "4.7.1",
4
4
  "description": "Web framework built on Web Standards",
5
5
  "main": "dist/cjs/index.js",
6
6
  "type": "module",