hono 4.6.20 → 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.
Files changed (101) hide show
  1. package/dist/adapter/aws-lambda/handler.js +0 -2
  2. package/dist/cjs/adapter/aws-lambda/handler.js +0 -8
  3. package/dist/cjs/helper/accepts/accepts.js +4 -26
  4. package/dist/cjs/helper/factory/index.js +6 -2
  5. package/dist/cjs/helper/proxy/index.js +75 -0
  6. package/dist/cjs/middleware/combine/index.js +10 -3
  7. package/dist/cjs/middleware/etag/digest.js +3 -8
  8. package/dist/cjs/middleware/etag/index.js +18 -2
  9. package/dist/cjs/middleware/jwk/index.js +28 -0
  10. package/dist/cjs/middleware/jwk/jwk.js +124 -0
  11. package/dist/cjs/middleware/language/index.js +36 -0
  12. package/dist/cjs/middleware/language/language.js +210 -0
  13. package/dist/cjs/middleware/logger/index.js +2 -3
  14. package/dist/cjs/request.js +1 -1
  15. package/dist/cjs/router/linear-router/router.js +3 -1
  16. package/dist/cjs/router/trie-router/node.js +24 -11
  17. package/dist/cjs/utils/accept.js +86 -0
  18. package/dist/cjs/utils/jwt/index.js +1 -1
  19. package/dist/cjs/utils/jwt/jwt.js +56 -3
  20. package/dist/cjs/utils/jwt/types.js +8 -0
  21. package/dist/cjs/utils/url.js +10 -25
  22. package/dist/helper/accepts/accepts.js +2 -23
  23. package/dist/helper/factory/index.js +6 -2
  24. package/dist/helper/proxy/index.js +52 -0
  25. package/dist/middleware/combine/index.js +10 -3
  26. package/dist/middleware/etag/digest.js +3 -8
  27. package/dist/middleware/etag/index.js +18 -2
  28. package/dist/middleware/jwk/index.js +5 -0
  29. package/dist/middleware/jwk/jwk.js +101 -0
  30. package/dist/middleware/language/index.js +15 -0
  31. package/dist/middleware/language/language.js +178 -0
  32. package/dist/middleware/logger/index.js +2 -3
  33. package/dist/request.js +1 -1
  34. package/dist/router/linear-router/router.js +3 -1
  35. package/dist/router/trie-router/node.js +24 -11
  36. package/dist/types/adapter/cloudflare-pages/handler.d.ts +1 -1
  37. package/dist/types/adapter/cloudflare-workers/websocket.d.ts +1 -1
  38. package/dist/types/adapter/lambda-edge/handler.d.ts +2 -2
  39. package/dist/types/client/types.d.ts +7 -8
  40. package/dist/types/compose.d.ts +11 -1
  41. package/dist/types/context.d.ts +31 -21
  42. package/dist/types/helper/accepts/accepts.d.ts +0 -1
  43. package/dist/types/helper/adapter/index.d.ts +2 -2
  44. package/dist/types/helper/conninfo/types.d.ts +2 -2
  45. package/dist/types/helper/css/common.d.ts +6 -1
  46. package/dist/types/helper/factory/index.d.ts +289 -12
  47. package/dist/types/helper/proxy/index.d.ts +54 -0
  48. package/dist/types/helper/ssg/ssg.d.ts +1 -1
  49. package/dist/types/helper/websocket/index.d.ts +1 -2
  50. package/dist/types/hono-base.d.ts +18 -15
  51. package/dist/types/hono.d.ts +1 -1
  52. package/dist/types/jsx/base.d.ts +4 -1
  53. package/dist/types/jsx/dom/hooks/index.d.ts +9 -3
  54. package/dist/types/jsx/dom/index.d.ts +28 -7
  55. package/dist/types/jsx/dom/intrinsic-element/components.d.ts +6 -6
  56. package/dist/types/jsx/dom/render.d.ts +28 -4
  57. package/dist/types/jsx/dom/server.d.ts +28 -7
  58. package/dist/types/jsx/hooks/index.d.ts +20 -5
  59. package/dist/types/jsx/index.d.ts +28 -7
  60. package/dist/types/jsx/intrinsic-element/components.d.ts +4 -4
  61. package/dist/types/jsx/intrinsic-elements.d.ts +46 -46
  62. package/dist/types/middleware/compress/index.d.ts +4 -1
  63. package/dist/types/middleware/etag/digest.d.ts +1 -1
  64. package/dist/types/middleware/etag/index.d.ts +4 -0
  65. package/dist/types/middleware/jwk/index.d.ts +1 -0
  66. package/dist/types/middleware/jwk/jwk.d.ts +40 -0
  67. package/dist/types/middleware/language/index.d.ts +7 -0
  68. package/dist/types/middleware/language/language.d.ts +102 -0
  69. package/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
  70. package/dist/types/middleware/secure-headers/secure-headers.d.ts +1 -1
  71. package/dist/types/preset/quick.d.ts +1 -1
  72. package/dist/types/preset/tiny.d.ts +1 -1
  73. package/dist/types/request.d.ts +5 -3
  74. package/dist/types/router/linear-router/router.d.ts +0 -1
  75. package/dist/types/router/pattern-router/router.d.ts +0 -1
  76. package/dist/types/router/reg-exp-router/node.d.ts +4 -2
  77. package/dist/types/router/reg-exp-router/router.d.ts +0 -1
  78. package/dist/types/router/reg-exp-router/trie.d.ts +5 -2
  79. package/dist/types/router/smart-router/router.d.ts +0 -1
  80. package/dist/types/router/trie-router/node.d.ts +6 -2
  81. package/dist/types/router/trie-router/router.d.ts +0 -1
  82. package/dist/types/router.d.ts +20 -2
  83. package/dist/types/types.d.ts +2002 -111
  84. package/dist/types/utils/accept.d.ts +11 -0
  85. package/dist/types/utils/cookie.d.ts +4 -4
  86. package/dist/types/utils/headers.d.ts +3 -3
  87. package/dist/types/utils/html.d.ts +6 -2
  88. package/dist/types/utils/jwt/index.d.ts +4 -0
  89. package/dist/types/utils/jwt/jws.d.ts +4 -1
  90. package/dist/types/utils/jwt/jwt.d.ts +8 -2
  91. package/dist/types/utils/jwt/types.d.ts +4 -0
  92. package/dist/types/utils/mime.d.ts +2 -2
  93. package/dist/types/utils/stream.d.ts +0 -4
  94. package/dist/types/utils/url.d.ts +16 -2
  95. package/dist/types/validator/validator.d.ts +18 -6
  96. package/dist/utils/accept.js +63 -0
  97. package/dist/utils/jwt/index.js +2 -2
  98. package/dist/utils/jwt/jwt.js +54 -2
  99. package/dist/utils/jwt/types.js +7 -0
  100. package/dist/utils/url.js +10 -25
  101. package/package.json +24 -3
@@ -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
  };
@@ -19,31 +19,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var accepts_exports = {};
20
20
  __export(accepts_exports, {
21
21
  accepts: () => accepts,
22
- defaultMatch: () => defaultMatch,
23
- parseAccept: () => parseAccept
22
+ defaultMatch: () => defaultMatch
24
23
  });
25
24
  module.exports = __toCommonJS(accepts_exports);
26
- const parseAccept = (acceptHeader) => {
27
- const accepts2 = acceptHeader.split(",");
28
- return accepts2.map((accept) => {
29
- const parts = accept.trim().split(";");
30
- const type = parts[0];
31
- const params = parts.slice(1);
32
- const q = params.find((param) => param.startsWith("q="));
33
- const paramsObject = params.reduce((acc, param) => {
34
- const keyValue = param.split("=");
35
- const key = keyValue[0].trim();
36
- const value = keyValue[1].trim();
37
- acc[key] = value;
38
- return acc;
39
- }, {});
40
- return {
41
- type,
42
- params: paramsObject,
43
- q: q ? parseFloat(q.split("=")[1]) : 1
44
- };
45
- });
46
- };
25
+ var import_accept = require("../../utils/accept");
47
26
  const defaultMatch = (accepts2, config) => {
48
27
  const { supports, default: defaultSupport } = config;
49
28
  const accept = accepts2.sort((a, b) => b.q - a.q).find((accept2) => supports.includes(accept2.type));
@@ -54,13 +33,12 @@ const accepts = (c, options) => {
54
33
  if (!acceptHeader) {
55
34
  return options.default;
56
35
  }
57
- const accepts2 = parseAccept(acceptHeader);
36
+ const accepts2 = (0, import_accept.parseAccept)(acceptHeader);
58
37
  const match = options.match || defaultMatch;
59
38
  return match(accepts2, options);
60
39
  };
61
40
  // Annotate the CommonJS export names for ESM import in node:
62
41
  0 && (module.exports = {
63
42
  accepts,
64
- defaultMatch,
65
- parseAccept
43
+ defaultMatch
66
44
  });
@@ -26,11 +26,15 @@ module.exports = __toCommonJS(factory_exports);
26
26
  var import_hono = require("../../hono");
27
27
  class Factory {
28
28
  initApp;
29
+ #defaultAppOptions;
29
30
  constructor(init) {
30
31
  this.initApp = init?.initApp;
32
+ this.#defaultAppOptions = init?.defaultAppOptions;
31
33
  }
32
- createApp = () => {
33
- const app = new import_hono.Hono();
34
+ createApp = (options) => {
35
+ const app = new import_hono.Hono(
36
+ options && this.#defaultAppOptions ? { ...this.#defaultAppOptions, ...options } : options ?? this.#defaultAppOptions
37
+ );
34
38
  if (this.initApp) {
35
39
  this.initApp(app);
36
40
  }
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var proxy_exports = {};
20
+ __export(proxy_exports, {
21
+ proxy: () => proxy
22
+ });
23
+ module.exports = __toCommonJS(proxy_exports);
24
+ const hopByHopHeaders = [
25
+ "connection",
26
+ "keep-alive",
27
+ "proxy-authenticate",
28
+ "proxy-authorization",
29
+ "te",
30
+ "trailers",
31
+ "transfer-encoding"
32
+ ];
33
+ const buildRequestInitFromRequest = (request) => {
34
+ if (!request) {
35
+ return {};
36
+ }
37
+ const headers = new Headers(request.headers);
38
+ hopByHopHeaders.forEach((header) => {
39
+ headers.delete(header);
40
+ });
41
+ return {
42
+ method: request.method,
43
+ body: request.body,
44
+ duplex: request.body ? "half" : void 0,
45
+ headers
46
+ };
47
+ };
48
+ const proxy = async (input, proxyInit) => {
49
+ const { raw, ...requestInit } = proxyInit ?? {};
50
+ const req = new Request(
51
+ input,
52
+ {
53
+ ...buildRequestInitFromRequest(raw),
54
+ ...requestInit
55
+ }
56
+ );
57
+ req.headers.delete("accept-encoding");
58
+ const res = await fetch(req);
59
+ const resHeaders = new Headers(res.headers);
60
+ hopByHopHeaders.forEach((header) => {
61
+ resHeaders.delete(header);
62
+ });
63
+ if (resHeaders.has("content-encoding")) {
64
+ resHeaders.delete("content-encoding");
65
+ resHeaders.delete("content-length");
66
+ }
67
+ return new Response(res.body, {
68
+ ...res,
69
+ headers: resHeaders
70
+ });
71
+ };
72
+ // Annotate the CommonJS export names for ESM import in node:
73
+ 0 && (module.exports = {
74
+ proxy
75
+ });
@@ -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) {
@@ -30,8 +30,8 @@ const mergeBuffers = (buffer1, buffer2) => {
30
30
  merged.set(buffer2, buffer1.byteLength);
31
31
  return merged;
32
32
  };
33
- const generateDigest = async (stream) => {
34
- if (!stream || !crypto || !crypto.subtle) {
33
+ const generateDigest = async (stream, generator) => {
34
+ if (!stream) {
35
35
  return null;
36
36
  }
37
37
  let result = void 0;
@@ -41,12 +41,7 @@ const generateDigest = async (stream) => {
41
41
  if (done) {
42
42
  break;
43
43
  }
44
- result = await crypto.subtle.digest(
45
- {
46
- name: "SHA-1"
47
- },
48
- mergeBuffers(result, value)
49
- );
44
+ result = await generator(mergeBuffers(result, value));
50
45
  }
51
46
  if (!result) {
52
47
  return null;
@@ -34,23 +34,39 @@ 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;
53
+ const generator = initializeGenerator(options?.generateDigest);
40
54
  return async function etag2(c, next) {
41
55
  const ifNoneMatch = c.req.header("If-None-Match") ?? null;
42
56
  await next();
43
57
  const res = c.res;
44
58
  let etag3 = res.headers.get("ETag");
45
59
  if (!etag3) {
46
- const hash = await (0, import_digest.generateDigest)(res.clone().body);
60
+ if (!generator) {
61
+ return;
62
+ }
63
+ const hash = await (0, import_digest.generateDigest)(res.clone().body, generator);
47
64
  if (hash === null) {
48
65
  return;
49
66
  }
50
67
  etag3 = weak ? `W/"${hash}"` : `"${hash}"`;
51
68
  }
52
69
  if (etagMatches(etag3, ifNoneMatch)) {
53
- await c.res.blob();
54
70
  c.res = new Response(null, {
55
71
  status: 304,
56
72
  statusText: "Not Modified",
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var jwk_exports = {};
20
+ __export(jwk_exports, {
21
+ jwk: () => import_jwk.jwk
22
+ });
23
+ module.exports = __toCommonJS(jwk_exports);
24
+ var import_jwk = require("./jwk");
25
+ // Annotate the CommonJS export names for ESM import in node:
26
+ 0 && (module.exports = {
27
+ jwk
28
+ });
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var jwk_exports = {};
20
+ __export(jwk_exports, {
21
+ jwk: () => jwk
22
+ });
23
+ module.exports = __toCommonJS(jwk_exports);
24
+ var import_cookie = require("../../helper/cookie");
25
+ var import_http_exception = require("../../http-exception");
26
+ var import_jwt = require("../../utils/jwt");
27
+ var import_context = require("../../context");
28
+ const jwk = (options, init) => {
29
+ if (!options || !(options.keys || options.jwks_uri)) {
30
+ throw new Error('JWK auth middleware requires options for either "keys" or "jwks_uri" or both');
31
+ }
32
+ if (!crypto.subtle || !crypto.subtle.importKey) {
33
+ throw new Error("`crypto.subtle.importKey` is undefined. JWK auth middleware requires it.");
34
+ }
35
+ return async function jwk2(ctx, next) {
36
+ const credentials = ctx.req.raw.headers.get("Authorization");
37
+ let token;
38
+ if (credentials) {
39
+ const parts = credentials.split(/\s+/);
40
+ if (parts.length !== 2) {
41
+ const errDescription = "invalid credentials structure";
42
+ throw new import_http_exception.HTTPException(401, {
43
+ message: errDescription,
44
+ res: unauthorizedResponse({
45
+ ctx,
46
+ error: "invalid_request",
47
+ errDescription
48
+ })
49
+ });
50
+ } else {
51
+ token = parts[1];
52
+ }
53
+ } else if (options.cookie) {
54
+ if (typeof options.cookie == "string") {
55
+ token = (0, import_cookie.getCookie)(ctx, options.cookie);
56
+ } else if (options.cookie.secret) {
57
+ if (options.cookie.prefixOptions) {
58
+ token = await (0, import_cookie.getSignedCookie)(
59
+ ctx,
60
+ options.cookie.secret,
61
+ options.cookie.key,
62
+ options.cookie.prefixOptions
63
+ );
64
+ } else {
65
+ token = await (0, import_cookie.getSignedCookie)(ctx, options.cookie.secret, options.cookie.key);
66
+ }
67
+ } else {
68
+ if (options.cookie.prefixOptions) {
69
+ token = (0, import_cookie.getCookie)(ctx, options.cookie.key, options.cookie.prefixOptions);
70
+ } else {
71
+ token = (0, import_cookie.getCookie)(ctx, options.cookie.key);
72
+ }
73
+ }
74
+ }
75
+ if (!token) {
76
+ const errDescription = "no authorization included in request";
77
+ throw new import_http_exception.HTTPException(401, {
78
+ message: errDescription,
79
+ res: unauthorizedResponse({
80
+ ctx,
81
+ error: "invalid_request",
82
+ errDescription
83
+ })
84
+ });
85
+ }
86
+ let payload;
87
+ let cause;
88
+ try {
89
+ payload = await import_jwt.Jwt.verifyFromJwks(token, options, init);
90
+ } catch (e) {
91
+ cause = e;
92
+ }
93
+ if (!payload) {
94
+ if (cause instanceof Error && cause.constructor === Error) {
95
+ throw cause;
96
+ }
97
+ throw new import_http_exception.HTTPException(401, {
98
+ message: "Unauthorized",
99
+ res: unauthorizedResponse({
100
+ ctx,
101
+ error: "invalid_token",
102
+ statusText: "Unauthorized",
103
+ errDescription: "token verification failure"
104
+ }),
105
+ cause
106
+ });
107
+ }
108
+ ctx.set("jwtPayload", payload);
109
+ await next();
110
+ };
111
+ };
112
+ function unauthorizedResponse(opts) {
113
+ return new Response("Unauthorized", {
114
+ status: 401,
115
+ statusText: opts.statusText,
116
+ headers: {
117
+ "WWW-Authenticate": `Bearer realm="${opts.ctx.req.url}",error="${opts.error}",error_description="${opts.errDescription}"`
118
+ }
119
+ });
120
+ }
121
+ // Annotate the CommonJS export names for ESM import in node:
122
+ 0 && (module.exports = {
123
+ jwk
124
+ });
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var language_exports = {};
20
+ __export(language_exports, {
21
+ detectFromCookie: () => import_language.detectFromCookie,
22
+ detectFromHeader: () => import_language.detectFromHeader,
23
+ detectFromPath: () => import_language.detectFromPath,
24
+ detectFromQuery: () => import_language.detectFromQuery,
25
+ languageDetector: () => import_language.languageDetector
26
+ });
27
+ module.exports = __toCommonJS(language_exports);
28
+ var import_language = require("./language");
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ detectFromCookie,
32
+ detectFromHeader,
33
+ detectFromPath,
34
+ detectFromQuery,
35
+ languageDetector
36
+ });
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var language_exports = {};
20
+ __export(language_exports, {
21
+ DEFAULT_OPTIONS: () => DEFAULT_OPTIONS,
22
+ detectFromCookie: () => detectFromCookie,
23
+ detectFromHeader: () => detectFromHeader,
24
+ detectFromPath: () => detectFromPath,
25
+ detectFromQuery: () => detectFromQuery,
26
+ detectors: () => detectors,
27
+ languageDetector: () => languageDetector,
28
+ normalizeLanguage: () => normalizeLanguage,
29
+ parseAcceptLanguage: () => parseAcceptLanguage,
30
+ validateOptions: () => validateOptions
31
+ });
32
+ module.exports = __toCommonJS(language_exports);
33
+ var import_cookie = require("../../helper/cookie");
34
+ var import_accept = require("../../utils/accept");
35
+ const DEFAULT_OPTIONS = {
36
+ order: ["querystring", "cookie", "header"],
37
+ lookupQueryString: "lang",
38
+ lookupCookie: "language",
39
+ lookupFromHeaderKey: "accept-language",
40
+ lookupFromPathIndex: 0,
41
+ caches: ["cookie"],
42
+ ignoreCase: true,
43
+ fallbackLanguage: "en",
44
+ supportedLanguages: ["en"],
45
+ cookieOptions: {
46
+ sameSite: "Strict",
47
+ secure: true,
48
+ maxAge: 365 * 24 * 60 * 60,
49
+ httpOnly: true
50
+ },
51
+ debug: false
52
+ };
53
+ function parseAcceptLanguage(header) {
54
+ return (0, import_accept.parseAccept)(header).map(({ type, q }) => ({ lang: type, q }));
55
+ }
56
+ const normalizeLanguage = (lang, options) => {
57
+ if (!lang) {
58
+ return void 0;
59
+ }
60
+ try {
61
+ let normalizedLang = lang.trim();
62
+ if (options.convertDetectedLanguage) {
63
+ normalizedLang = options.convertDetectedLanguage(normalizedLang);
64
+ }
65
+ const compLang = options.ignoreCase ? normalizedLang.toLowerCase() : normalizedLang;
66
+ const compSupported = options.supportedLanguages.map(
67
+ (l) => options.ignoreCase ? l.toLowerCase() : l
68
+ );
69
+ const matchedLang = compSupported.find((l) => l === compLang);
70
+ return matchedLang ? options.supportedLanguages[compSupported.indexOf(matchedLang)] : void 0;
71
+ } catch {
72
+ return void 0;
73
+ }
74
+ };
75
+ const detectFromQuery = (c, options) => {
76
+ try {
77
+ const query = c.req.query(options.lookupQueryString);
78
+ return normalizeLanguage(query, options);
79
+ } catch {
80
+ return void 0;
81
+ }
82
+ };
83
+ const detectFromCookie = (c, options) => {
84
+ try {
85
+ const cookie = (0, import_cookie.getCookie)(c, options.lookupCookie);
86
+ return normalizeLanguage(cookie, options);
87
+ } catch {
88
+ return void 0;
89
+ }
90
+ };
91
+ function detectFromHeader(c, options) {
92
+ try {
93
+ const acceptLanguage = c.req.header(options.lookupFromHeaderKey);
94
+ if (!acceptLanguage) {
95
+ return void 0;
96
+ }
97
+ const languages = parseAcceptLanguage(acceptLanguage);
98
+ for (const { lang } of languages) {
99
+ const normalizedLang = normalizeLanguage(lang, options);
100
+ if (normalizedLang) {
101
+ return normalizedLang;
102
+ }
103
+ }
104
+ return void 0;
105
+ } catch {
106
+ return void 0;
107
+ }
108
+ }
109
+ function detectFromPath(c, options) {
110
+ try {
111
+ const pathSegments = c.req.path.split("/").filter(Boolean);
112
+ const langSegment = pathSegments[options.lookupFromPathIndex];
113
+ return normalizeLanguage(langSegment, options);
114
+ } catch {
115
+ return void 0;
116
+ }
117
+ }
118
+ const detectors = {
119
+ querystring: detectFromQuery,
120
+ cookie: detectFromCookie,
121
+ header: detectFromHeader,
122
+ path: detectFromPath
123
+ };
124
+ function validateOptions(options) {
125
+ if (!options.supportedLanguages.includes(options.fallbackLanguage)) {
126
+ throw new Error("Fallback language must be included in supported languages");
127
+ }
128
+ if (options.lookupFromPathIndex < 0) {
129
+ throw new Error("Path index must be non-negative");
130
+ }
131
+ if (!options.order.every((detector) => Object.keys(detectors).includes(detector))) {
132
+ throw new Error("Invalid detector type in order array");
133
+ }
134
+ }
135
+ function cacheLanguage(c, language, options) {
136
+ if (!Array.isArray(options.caches) || !options.caches.includes("cookie")) {
137
+ return;
138
+ }
139
+ try {
140
+ (0, import_cookie.setCookie)(c, options.lookupCookie, language, options.cookieOptions);
141
+ } catch (error) {
142
+ if (options.debug) {
143
+ console.error("Failed to cache language:", error);
144
+ }
145
+ }
146
+ }
147
+ const detectLanguage = (c, options) => {
148
+ let detectedLang;
149
+ for (const detectorName of options.order) {
150
+ const detector = detectors[detectorName];
151
+ if (!detector) {
152
+ continue;
153
+ }
154
+ try {
155
+ detectedLang = detector(c, options);
156
+ if (detectedLang) {
157
+ if (options.debug) {
158
+ console.log(`Language detected from ${detectorName}: ${detectedLang}`);
159
+ }
160
+ break;
161
+ }
162
+ } catch (error) {
163
+ if (options.debug) {
164
+ console.error(`Error in ${detectorName} detector:`, error);
165
+ }
166
+ continue;
167
+ }
168
+ }
169
+ const finalLang = detectedLang || options.fallbackLanguage;
170
+ if (detectedLang && options.caches) {
171
+ cacheLanguage(c, finalLang, options);
172
+ }
173
+ return finalLang;
174
+ };
175
+ const languageDetector = (userOptions) => {
176
+ const options = {
177
+ ...DEFAULT_OPTIONS,
178
+ ...userOptions,
179
+ cookieOptions: {
180
+ ...DEFAULT_OPTIONS.cookieOptions,
181
+ ...userOptions.cookieOptions
182
+ }
183
+ };
184
+ validateOptions(options);
185
+ return async function languageDetector2(ctx, next) {
186
+ try {
187
+ const lang = detectLanguage(ctx, options);
188
+ ctx.set("language", lang);
189
+ } catch (error) {
190
+ if (options.debug) {
191
+ console.error("Language detection failed:", error);
192
+ }
193
+ ctx.set("language", options.fallbackLanguage);
194
+ }
195
+ await next();
196
+ };
197
+ };
198
+ // Annotate the CommonJS export names for ESM import in node:
199
+ 0 && (module.exports = {
200
+ DEFAULT_OPTIONS,
201
+ detectFromCookie,
202
+ detectFromHeader,
203
+ detectFromPath,
204
+ detectFromQuery,
205
+ detectors,
206
+ languageDetector,
207
+ normalizeLanguage,
208
+ parseAcceptLanguage,
209
+ validateOptions
210
+ });