hono 4.3.5 → 4.3.7

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.
@@ -64,23 +64,7 @@ var EventProcessor = class {
64
64
  const path = this.getPath(event);
65
65
  const urlPath = `https://${domainName}${path}`;
66
66
  const url = queryString ? `${urlPath}?${queryString}` : urlPath;
67
- const headers = new Headers();
68
- this.getCookies(event, headers);
69
- if (event.headers) {
70
- for (const [k, v] of Object.entries(event.headers)) {
71
- if (v) {
72
- headers.set(k, v);
73
- }
74
- }
75
- }
76
- if (event.multiValueHeaders) {
77
- for (const [k, values] of Object.entries(event.multiValueHeaders)) {
78
- if (values) {
79
- const foundK = headers.get(k);
80
- values.forEach((v) => (!foundK || !foundK.includes(v)) && headers.append(k, v));
81
- }
82
- }
83
- }
67
+ const headers = this.getHeaders(event);
84
68
  const method = this.getMethod(event);
85
69
  const requestInit = {
86
70
  headers,
@@ -102,24 +86,28 @@ var EventProcessor = class {
102
86
  const result = {
103
87
  body,
104
88
  headers: {},
89
+ multiValueHeaders: event.multiValueHeaders ? {} : void 0,
105
90
  statusCode: res.status,
106
91
  isBase64Encoded
107
92
  };
108
93
  this.setCookies(event, res, result);
109
94
  res.headers.forEach((value, key) => {
110
95
  result.headers[key] = value;
96
+ if (event.multiValueHeaders && result.multiValueHeaders) {
97
+ result.multiValueHeaders[key] = [value];
98
+ }
111
99
  });
112
100
  return result;
113
101
  }
114
- setCookies = (event, res, result) => {
102
+ setCookies(event, res, result) {
115
103
  if (res.headers.has("set-cookie")) {
116
104
  const cookies = res.headers.get("set-cookie")?.split(", ");
117
105
  if (Array.isArray(cookies)) {
118
- this.setCookiesToResult(result, cookies);
106
+ this.setCookiesToResult(event, result, cookies);
119
107
  res.headers.delete("set-cookie");
120
108
  }
121
109
  }
122
- };
110
+ }
123
111
  };
124
112
  var v2Processor = new class EventV2Processor extends EventProcessor {
125
113
  getPath(event) {
@@ -136,9 +124,21 @@ var v2Processor = new class EventV2Processor extends EventProcessor {
136
124
  headers.set("Cookie", event.cookies.join("; "));
137
125
  }
138
126
  }
139
- setCookiesToResult(result, cookies) {
127
+ setCookiesToResult(_, result, cookies) {
140
128
  result.cookies = cookies;
141
129
  }
130
+ getHeaders(event) {
131
+ const headers = new Headers();
132
+ this.getCookies(event, headers);
133
+ if (event.headers) {
134
+ for (const [k, v] of Object.entries(event.headers)) {
135
+ if (v) {
136
+ headers.set(k, v);
137
+ }
138
+ }
139
+ }
140
+ return headers;
141
+ }
142
142
  }();
143
143
  var v1Processor = new class EventV1Processor extends EventProcessor {
144
144
  getPath(event) {
@@ -152,18 +152,104 @@ var v1Processor = new class EventV1Processor extends EventProcessor {
152
152
  }
153
153
  getCookies(event, headers) {
154
154
  }
155
- setCookiesToResult(result, cookies) {
155
+ getHeaders(event) {
156
+ const headers = new Headers();
157
+ this.getCookies(event, headers);
158
+ if (event.headers) {
159
+ for (const [k, v] of Object.entries(event.headers)) {
160
+ if (v) {
161
+ headers.set(k, v);
162
+ }
163
+ }
164
+ }
165
+ if (event.multiValueHeaders) {
166
+ for (const [k, values] of Object.entries(event.multiValueHeaders)) {
167
+ if (values) {
168
+ const foundK = headers.get(k);
169
+ values.forEach((v) => (!foundK || !foundK.includes(v)) && headers.append(k, v));
170
+ }
171
+ }
172
+ }
173
+ return headers;
174
+ }
175
+ setCookiesToResult(_, result, cookies) {
156
176
  result.multiValueHeaders = {
157
177
  "set-cookie": cookies
158
178
  };
159
179
  }
160
180
  }();
181
+ var albProcessor = new class ALBProcessor extends EventProcessor {
182
+ getHeaders(event) {
183
+ const headers = new Headers();
184
+ if (event.multiValueHeaders) {
185
+ for (const [key, values] of Object.entries(event.multiValueHeaders)) {
186
+ if (values && Array.isArray(values)) {
187
+ headers.set(key, values.join("; "));
188
+ }
189
+ }
190
+ } else {
191
+ for (const [key, value] of Object.entries(event.headers ?? {})) {
192
+ if (value) {
193
+ headers.set(key, value);
194
+ }
195
+ }
196
+ }
197
+ return headers;
198
+ }
199
+ setHeadersToResult(event, result, headers) {
200
+ if (event.multiValueHeaders) {
201
+ const multiValueHeaders = {};
202
+ for (const [key, value] of headers.entries()) {
203
+ multiValueHeaders[key] = [value];
204
+ }
205
+ result.multiValueHeaders = multiValueHeaders;
206
+ } else {
207
+ const singleValueHeaders = {};
208
+ for (const [key, value] of headers.entries()) {
209
+ singleValueHeaders[key] = value;
210
+ }
211
+ result.headers = singleValueHeaders;
212
+ }
213
+ }
214
+ getPath(event) {
215
+ return event.path;
216
+ }
217
+ getMethod(event) {
218
+ return event.httpMethod;
219
+ }
220
+ getQueryString(event) {
221
+ return Object.entries(event.queryStringParameters || {}).filter(([, value]) => value).map(([key, value]) => `${key}=${value}`).join("&");
222
+ }
223
+ getCookies(event, headers) {
224
+ let cookie;
225
+ if (event.multiValueHeaders) {
226
+ cookie = event.multiValueHeaders["cookie"]?.join("; ");
227
+ } else {
228
+ cookie = event.headers ? event.headers["cookie"] : void 0;
229
+ }
230
+ if (cookie) {
231
+ headers.append("Cookie", cookie);
232
+ }
233
+ }
234
+ setCookiesToResult(event, result, cookies) {
235
+ if (event.multiValueHeaders && result.multiValueHeaders) {
236
+ result.multiValueHeaders["set-cookie"] = cookies;
237
+ } else {
238
+ result.headers["set-cookie"] = cookies.join(", ");
239
+ }
240
+ }
241
+ }();
161
242
  var getProcessor = (event) => {
243
+ if (isProxyEventALB(event)) {
244
+ return albProcessor;
245
+ }
162
246
  if (isProxyEventV2(event)) {
163
247
  return v2Processor;
164
- } else {
165
- return v1Processor;
166
248
  }
249
+ return v1Processor;
250
+ };
251
+ var isProxyEventALB = (event) => {
252
+ return Object.prototype.hasOwnProperty.call(event.requestContext, "elb");
167
253
  };
168
254
  var isProxyEventV2 = (event) => {
169
255
  return Object.prototype.hasOwnProperty.call(event, "rawPath");
@@ -96,23 +96,7 @@ class EventProcessor {
96
96
  const path = this.getPath(event);
97
97
  const urlPath = `https://${domainName}${path}`;
98
98
  const url = queryString ? `${urlPath}?${queryString}` : urlPath;
99
- const headers = new Headers();
100
- this.getCookies(event, headers);
101
- if (event.headers) {
102
- for (const [k, v] of Object.entries(event.headers)) {
103
- if (v) {
104
- headers.set(k, v);
105
- }
106
- }
107
- }
108
- if (event.multiValueHeaders) {
109
- for (const [k, values] of Object.entries(event.multiValueHeaders)) {
110
- if (values) {
111
- const foundK = headers.get(k);
112
- values.forEach((v) => (!foundK || !foundK.includes(v)) && headers.append(k, v));
113
- }
114
- }
115
- }
99
+ const headers = this.getHeaders(event);
116
100
  const method = this.getMethod(event);
117
101
  const requestInit = {
118
102
  headers,
@@ -134,24 +118,28 @@ class EventProcessor {
134
118
  const result = {
135
119
  body,
136
120
  headers: {},
121
+ multiValueHeaders: event.multiValueHeaders ? {} : void 0,
137
122
  statusCode: res.status,
138
123
  isBase64Encoded
139
124
  };
140
125
  this.setCookies(event, res, result);
141
126
  res.headers.forEach((value, key) => {
142
127
  result.headers[key] = value;
128
+ if (event.multiValueHeaders && result.multiValueHeaders) {
129
+ result.multiValueHeaders[key] = [value];
130
+ }
143
131
  });
144
132
  return result;
145
133
  }
146
- setCookies = (event, res, result) => {
134
+ setCookies(event, res, result) {
147
135
  if (res.headers.has("set-cookie")) {
148
136
  const cookies = res.headers.get("set-cookie")?.split(", ");
149
137
  if (Array.isArray(cookies)) {
150
- this.setCookiesToResult(result, cookies);
138
+ this.setCookiesToResult(event, result, cookies);
151
139
  res.headers.delete("set-cookie");
152
140
  }
153
141
  }
154
- };
142
+ }
155
143
  }
156
144
  const v2Processor = new class EventV2Processor extends EventProcessor {
157
145
  getPath(event) {
@@ -168,9 +156,21 @@ const v2Processor = new class EventV2Processor extends EventProcessor {
168
156
  headers.set("Cookie", event.cookies.join("; "));
169
157
  }
170
158
  }
171
- setCookiesToResult(result, cookies) {
159
+ setCookiesToResult(_, result, cookies) {
172
160
  result.cookies = cookies;
173
161
  }
162
+ getHeaders(event) {
163
+ const headers = new Headers();
164
+ this.getCookies(event, headers);
165
+ if (event.headers) {
166
+ for (const [k, v] of Object.entries(event.headers)) {
167
+ if (v) {
168
+ headers.set(k, v);
169
+ }
170
+ }
171
+ }
172
+ return headers;
173
+ }
174
174
  }();
175
175
  const v1Processor = new class EventV1Processor extends EventProcessor {
176
176
  getPath(event) {
@@ -184,18 +184,104 @@ const v1Processor = new class EventV1Processor extends EventProcessor {
184
184
  }
185
185
  getCookies(event, headers) {
186
186
  }
187
- setCookiesToResult(result, cookies) {
187
+ getHeaders(event) {
188
+ const headers = new Headers();
189
+ this.getCookies(event, headers);
190
+ if (event.headers) {
191
+ for (const [k, v] of Object.entries(event.headers)) {
192
+ if (v) {
193
+ headers.set(k, v);
194
+ }
195
+ }
196
+ }
197
+ if (event.multiValueHeaders) {
198
+ for (const [k, values] of Object.entries(event.multiValueHeaders)) {
199
+ if (values) {
200
+ const foundK = headers.get(k);
201
+ values.forEach((v) => (!foundK || !foundK.includes(v)) && headers.append(k, v));
202
+ }
203
+ }
204
+ }
205
+ return headers;
206
+ }
207
+ setCookiesToResult(_, result, cookies) {
188
208
  result.multiValueHeaders = {
189
209
  "set-cookie": cookies
190
210
  };
191
211
  }
192
212
  }();
213
+ const albProcessor = new class ALBProcessor extends EventProcessor {
214
+ getHeaders(event) {
215
+ const headers = new Headers();
216
+ if (event.multiValueHeaders) {
217
+ for (const [key, values] of Object.entries(event.multiValueHeaders)) {
218
+ if (values && Array.isArray(values)) {
219
+ headers.set(key, values.join("; "));
220
+ }
221
+ }
222
+ } else {
223
+ for (const [key, value] of Object.entries(event.headers ?? {})) {
224
+ if (value) {
225
+ headers.set(key, value);
226
+ }
227
+ }
228
+ }
229
+ return headers;
230
+ }
231
+ setHeadersToResult(event, result, headers) {
232
+ if (event.multiValueHeaders) {
233
+ const multiValueHeaders = {};
234
+ for (const [key, value] of headers.entries()) {
235
+ multiValueHeaders[key] = [value];
236
+ }
237
+ result.multiValueHeaders = multiValueHeaders;
238
+ } else {
239
+ const singleValueHeaders = {};
240
+ for (const [key, value] of headers.entries()) {
241
+ singleValueHeaders[key] = value;
242
+ }
243
+ result.headers = singleValueHeaders;
244
+ }
245
+ }
246
+ getPath(event) {
247
+ return event.path;
248
+ }
249
+ getMethod(event) {
250
+ return event.httpMethod;
251
+ }
252
+ getQueryString(event) {
253
+ return Object.entries(event.queryStringParameters || {}).filter(([, value]) => value).map(([key, value]) => `${key}=${value}`).join("&");
254
+ }
255
+ getCookies(event, headers) {
256
+ let cookie;
257
+ if (event.multiValueHeaders) {
258
+ cookie = event.multiValueHeaders["cookie"]?.join("; ");
259
+ } else {
260
+ cookie = event.headers ? event.headers["cookie"] : void 0;
261
+ }
262
+ if (cookie) {
263
+ headers.append("Cookie", cookie);
264
+ }
265
+ }
266
+ setCookiesToResult(event, result, cookies) {
267
+ if (event.multiValueHeaders && result.multiValueHeaders) {
268
+ result.multiValueHeaders["set-cookie"] = cookies;
269
+ } else {
270
+ result.headers["set-cookie"] = cookies.join(", ");
271
+ }
272
+ }
273
+ }();
193
274
  const getProcessor = (event) => {
275
+ if (isProxyEventALB(event)) {
276
+ return albProcessor;
277
+ }
194
278
  if (isProxyEventV2(event)) {
195
279
  return v2Processor;
196
- } else {
197
- return v1Processor;
198
280
  }
281
+ return v1Processor;
282
+ };
283
+ const isProxyEventALB = (event) => {
284
+ return Object.prototype.hasOwnProperty.call(event.requestContext, "elb");
199
285
  };
200
286
  const isProxyEventV2 = (event) => {
201
287
  return Object.prototype.hasOwnProperty.call(event, "rawPath");
@@ -30,6 +30,7 @@ var import_mime = require("../../utils/mime");
30
30
  var import_middleware = require("./middleware");
31
31
  var import_utils2 = require("./utils");
32
32
  const DEFAULT_CONCURRENCY = 2;
33
+ const DEFAULT_CONTENT_TYPE = "text/plain";
33
34
  const generateFilePath = (routePath, outDir, mimeType, extensionMap) => {
34
35
  const extension = determineExtension(mimeType, extensionMap);
35
36
  if (routePath.endsWith(`.${extension}`)) {
@@ -121,7 +122,7 @@ const fetchRoutesContent = function* (app, beforeRequestHook, afterResponseHook,
121
122
  }
122
123
  response = maybeResponse;
123
124
  }
124
- const mimeType = response.headers.get("Content-Type")?.split(";")[0] || "text/plain";
125
+ const mimeType = response.headers.get("Content-Type")?.split(";")[0] || DEFAULT_CONTENT_TYPE;
125
126
  const content = await parseResponseContent(response);
126
127
  resolveReq({
127
128
  routePath: replacedUrlParam,
@@ -62,8 +62,12 @@ const cache = (options) => {
62
62
  }
63
63
  };
64
64
  return async function cache2(c, next) {
65
- const key = c.req.url;
66
- const cache3 = await caches.open(options.cacheName);
65
+ let key = c.req.url;
66
+ if (options.keyGenerator) {
67
+ key = await options.keyGenerator(c);
68
+ }
69
+ const cacheName = typeof options.cacheName === "function" ? await options.cacheName(c) : options.cacheName;
70
+ const cache3 = await caches.open(cacheName);
67
71
  const response = await cache3.match(key);
68
72
  if (response) {
69
73
  return new Response(response.body, response);
@@ -21,7 +21,6 @@ __export(method_override_exports, {
21
21
  methodOverride: () => methodOverride
22
22
  });
23
23
  module.exports = __toCommonJS(method_override_exports);
24
- var import_url = require("url");
25
24
  var import_body = require("../../utils/body");
26
25
  const DEFAULT_METHOD_FORM_NAME = "_method";
27
26
  const methodOverride = (options) => async function methodOverride2(c, next) {
@@ -56,7 +55,7 @@ const methodOverride = (options) => async function methodOverride2(c, next) {
56
55
  const method = params[methodFormName];
57
56
  if (method) {
58
57
  delete params[methodFormName];
59
- const newParams = new import_url.URLSearchParams(params);
58
+ const newParams = new URLSearchParams(params);
60
59
  const request = new Request(newRequest, {
61
60
  body: newParams,
62
61
  method
@@ -33,6 +33,9 @@ class MockCache {
33
33
  async match(key) {
34
34
  return this.store.get(key) || null;
35
35
  }
36
+ async keys() {
37
+ return this.store.keys();
38
+ }
36
39
  async put(key, response) {
37
40
  this.store.set(key, response);
38
41
  }
@@ -51,11 +51,11 @@ function convertFormDataToBodyData(formData, options) {
51
51
  }
52
52
  const handleParsingAllValues = (form, key, value) => {
53
53
  const formKey = form[key];
54
- if (form[key] && Array.isArray(form[key])) {
55
- formKey.push(value);
56
- } else if (form[key]) {
57
- const parsedKey = [...formKey].join("").replace(",", "");
58
- form[key] = [parsedKey, value];
54
+ if (formKey && Array.isArray(formKey)) {
55
+ ;
56
+ form[key].push(value);
57
+ } else if (formKey) {
58
+ form[key] = [formKey, value];
59
59
  } else {
60
60
  form[key] = value;
61
61
  }
@@ -134,7 +134,7 @@ const _serialize = (name, value, opt = {}) => {
134
134
  cookie += "; Secure";
135
135
  }
136
136
  if (opt.sameSite) {
137
- cookie += `; SameSite=${opt.sameSite}`;
137
+ cookie += `; SameSite=${opt.sameSite.charAt(0).toUpperCase() + opt.sameSite.slice(1)}`;
138
138
  }
139
139
  if (opt.partitioned) {
140
140
  if (!opt.secure) {
@@ -5,6 +5,7 @@ import { getExtension } from "../../utils/mime.js";
5
5
  import { X_HONO_DISABLE_SSG_HEADER_KEY, SSG_CONTEXT } from "./middleware.js";
6
6
  import { joinPaths, dirname, filterStaticGenerateRoutes } from "./utils.js";
7
7
  var DEFAULT_CONCURRENCY = 2;
8
+ var DEFAULT_CONTENT_TYPE = "text/plain";
8
9
  var generateFilePath = (routePath, outDir, mimeType, extensionMap) => {
9
10
  const extension = determineExtension(mimeType, extensionMap);
10
11
  if (routePath.endsWith(`.${extension}`)) {
@@ -96,7 +97,7 @@ var fetchRoutesContent = function* (app, beforeRequestHook, afterResponseHook, c
96
97
  }
97
98
  response = maybeResponse;
98
99
  }
99
- const mimeType = response.headers.get("Content-Type")?.split(";")[0] || "text/plain";
100
+ const mimeType = response.headers.get("Content-Type")?.split(";")[0] || DEFAULT_CONTENT_TYPE;
100
101
  const content = await parseResponseContent(response);
101
102
  resolveReq({
102
103
  routePath: replacedUrlParam,
@@ -40,8 +40,12 @@ var cache = (options) => {
40
40
  }
41
41
  };
42
42
  return async function cache2(c, next) {
43
- const key = c.req.url;
44
- const cache3 = await caches.open(options.cacheName);
43
+ let key = c.req.url;
44
+ if (options.keyGenerator) {
45
+ key = await options.keyGenerator(c);
46
+ }
47
+ const cacheName = typeof options.cacheName === "function" ? await options.cacheName(c) : options.cacheName;
48
+ const cache3 = await caches.open(cacheName);
45
49
  const response = await cache3.match(key);
46
50
  if (response) {
47
51
  return new Response(response.body, response);
@@ -1,5 +1,4 @@
1
1
  // src/middleware/method-override/index.ts
2
- import { URLSearchParams } from "url";
3
2
  import { parseBody } from "../../utils/body.js";
4
3
  var DEFAULT_METHOD_FORM_NAME = "_method";
5
4
  var methodOverride = (options) => async function methodOverride2(c, next) {
@@ -15,6 +15,9 @@ var MockCache = class {
15
15
  async match(key) {
16
16
  return this.store.get(key) || null;
17
17
  }
18
+ async keys() {
19
+ return this.store.keys();
20
+ }
18
21
  async put(key, response) {
19
22
  this.store.set(key, response);
20
23
  }
@@ -73,11 +73,12 @@ declare abstract class EventProcessor<E extends LambdaEvent> {
73
73
  protected abstract getPath(event: E): string;
74
74
  protected abstract getMethod(event: E): string;
75
75
  protected abstract getQueryString(event: E): string;
76
+ protected abstract getHeaders(event: E): Headers;
76
77
  protected abstract getCookies(event: E, headers: Headers): void;
77
- protected abstract setCookiesToResult(result: APIGatewayProxyResult, cookies: string[]): void;
78
+ protected abstract setCookiesToResult(event: E, result: APIGatewayProxyResult, cookies: string[]): void;
78
79
  createRequest(event: E): Request;
79
80
  createResult(event: E, res: Response): Promise<APIGatewayProxyResult>;
80
- setCookies: (event: LambdaEvent, res: Response, result: APIGatewayProxyResult) => void;
81
+ setCookies(event: E, res: Response, result: APIGatewayProxyResult): void;
81
82
  }
82
83
  export declare const getProcessor: (event: LambdaEvent) => EventProcessor<LambdaEvent>;
83
84
  export declare const isContentTypeBinary: (contentType: string) => boolean;
@@ -1,7 +1,9 @@
1
+ import type { Context } from '../../context';
1
2
  import type { MiddlewareHandler } from '../../types';
2
3
  export declare const cache: (options: {
3
- cacheName: string;
4
- wait?: boolean;
5
- cacheControl?: string;
6
- vary?: string | string[];
4
+ cacheName: string | ((c: Context) => Promise<string> | string);
5
+ wait?: boolean | undefined;
6
+ cacheControl?: string | undefined;
7
+ vary?: string | string[] | undefined;
8
+ keyGenerator?: ((c: Context) => Promise<string> | string) | undefined;
7
9
  }) => MiddlewareHandler;
@@ -23,7 +23,7 @@ export type CookieOptions = {
23
23
  path?: string;
24
24
  secure?: boolean;
25
25
  signingSecret?: string;
26
- sameSite?: 'Strict' | 'Lax' | 'None';
26
+ sameSite?: 'Strict' | 'Lax' | 'None' | 'strict' | 'lax' | 'none';
27
27
  partitioned?: boolean;
28
28
  prefix?: CookiePrefixOptions;
29
29
  } & PartitionCookieConstraint;
@@ -29,11 +29,11 @@ function convertFormDataToBodyData(formData, options) {
29
29
  }
30
30
  var handleParsingAllValues = (form, key, value) => {
31
31
  const formKey = form[key];
32
- if (form[key] && Array.isArray(form[key])) {
33
- formKey.push(value);
34
- } else if (form[key]) {
35
- const parsedKey = [...formKey].join("").replace(",", "");
36
- form[key] = [parsedKey, value];
32
+ if (formKey && Array.isArray(formKey)) {
33
+ ;
34
+ form[key].push(value);
35
+ } else if (formKey) {
36
+ form[key] = [formKey, value];
37
37
  } else {
38
38
  form[key] = value;
39
39
  }
@@ -109,7 +109,7 @@ var _serialize = (name, value, opt = {}) => {
109
109
  cookie += "; Secure";
110
110
  }
111
111
  if (opt.sameSite) {
112
- cookie += `; SameSite=${opt.sameSite}`;
112
+ cookie += `; SameSite=${opt.sameSite.charAt(0).toUpperCase() + opt.sameSite.slice(1)}`;
113
113
  }
114
114
  if (opt.partitioned) {
115
115
  if (!opt.secure) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hono",
3
- "version": "4.3.5",
3
+ "version": "4.3.7",
4
4
  "description": "Ultrafast web framework for the Edges",
5
5
  "main": "dist/cjs/index.js",
6
6
  "type": "module",