better-auth 0.0.2-beta.7 → 0.0.2
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/access.d.ts +4 -0
- package/dist/access.js +126 -0
- package/dist/access.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +553 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/plugins.d.ts +2436 -0
- package/dist/client/plugins.js +411 -0
- package/dist/client/plugins.js.map +1 -0
- package/dist/client-A2Mt04KQ.d.ts +3503 -0
- package/dist/client.d.ts +1433 -0
- package/dist/client.js +693 -0
- package/dist/client.js.map +1 -0
- package/dist/helper-B5_2Vzba.d.ts +14 -0
- package/dist/index-Dg4eEXZW.d.ts +24 -0
- package/dist/index-W5nXvJ-p.d.ts +1498 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +2195 -1191
- package/dist/index.js.map +1 -1
- package/dist/next-js.d.ts +14 -0
- package/dist/next-js.js +14 -0
- package/dist/next-js.js.map +1 -0
- package/dist/plugins.d.ts +892 -49
- package/dist/plugins.js +3951 -253
- package/dist/plugins.js.map +1 -1
- package/dist/preact.d.ts +8 -0
- package/dist/preact.js +294 -0
- package/dist/preact.js.map +1 -0
- package/dist/react.d.ts +14 -0
- package/dist/react.js +314 -0
- package/dist/react.js.map +1 -0
- package/dist/schema-BOszzrbQ.d.ts +792 -0
- package/dist/social.d.ts +4 -0
- package/dist/social.js +509 -0
- package/dist/social.js.map +1 -0
- package/dist/solid-start.d.ts +18 -0
- package/dist/solid-start.js +14 -0
- package/dist/solid-start.js.map +1 -0
- package/dist/solid.d.ts +2790 -0
- package/dist/solid.js +306 -0
- package/dist/solid.js.map +1 -0
- package/dist/statement-COylZd3J.d.ts +81 -0
- package/dist/svelte-kit.d.ts +10 -7
- package/dist/svelte-kit.js +12 -17
- package/dist/svelte-kit.js.map +1 -1
- package/dist/svelte.d.ts +2791 -0
- package/dist/svelte.js +304 -0
- package/dist/svelte.js.map +1 -0
- package/dist/type-DbMyI3b5.d.ts +5724 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/vue.d.ts +14 -0
- package/dist/vue.js +311 -0
- package/dist/vue.js.map +1 -0
- package/package.json +80 -54
- package/LICENSE +0 -21
- package/dist/actions.d.ts +0 -33
- package/dist/actions.js +0 -1373
- package/dist/actions.js.map +0 -1
- package/dist/adapters/drizzle-adapter.d.ts +0 -10
- package/dist/adapters/drizzle-adapter.js +0 -1095
- package/dist/adapters/drizzle-adapter.js.map +0 -1
- package/dist/adapters/memory.d.ts +0 -8
- package/dist/adapters/memory.js +0 -136
- package/dist/adapters/memory.js.map +0 -1
- package/dist/adapters/mongodb-adapter.d.ts +0 -9
- package/dist/adapters/mongodb-adapter.js +0 -97
- package/dist/adapters/mongodb-adapter.js.map +0 -1
- package/dist/adapters/prisma-adapter.d.ts +0 -7
- package/dist/adapters/prisma-adapter.js +0 -144
- package/dist/adapters/prisma-adapter.js.map +0 -1
- package/dist/adapters/redis-adapter.d.ts +0 -7
- package/dist/adapters/redis-adapter.js +0 -65
- package/dist/adapters/redis-adapter.js.map +0 -1
- package/dist/adapters.d.ts +0 -3
- package/dist/adapters.js +0 -206
- package/dist/adapters.js.map +0 -1
- package/dist/h3.d.ts +0 -10
- package/dist/h3.js +0 -326
- package/dist/h3.js.map +0 -1
- package/dist/hono.d.ts +0 -10
- package/dist/hono.js +0 -25
- package/dist/hono.js.map +0 -1
- package/dist/index-UcTu1vUg.d.ts +0 -107
- package/dist/next.d.ts +0 -17
- package/dist/next.js +0 -26
- package/dist/next.js.map +0 -1
- package/dist/options-CH15FEBw.d.ts +0 -1562
- package/dist/providers.d.ts +0 -3
- package/dist/providers.js +0 -653
- package/dist/providers.js.map +0 -1
- package/dist/routes/session.d.ts +0 -39
- package/dist/routes/session.js +0 -128
- package/dist/routes/session.js.map +0 -1
- package/dist/types-DAxaMWCy.d.ts +0 -136
package/dist/h3.js
DELETED
|
@@ -1,326 +0,0 @@
|
|
|
1
|
-
// ../../node_modules/.pnpm/cookie-es@1.1.0/node_modules/cookie-es/dist/index.mjs
|
|
2
|
-
var fieldContentRegExp = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;
|
|
3
|
-
function parse(str, options) {
|
|
4
|
-
if (typeof str !== "string") {
|
|
5
|
-
throw new TypeError("argument str must be a string");
|
|
6
|
-
}
|
|
7
|
-
const obj = {};
|
|
8
|
-
const opt = options || {};
|
|
9
|
-
const dec = opt.decode || decode;
|
|
10
|
-
let index = 0;
|
|
11
|
-
while (index < str.length) {
|
|
12
|
-
const eqIdx = str.indexOf("=", index);
|
|
13
|
-
if (eqIdx === -1) {
|
|
14
|
-
break;
|
|
15
|
-
}
|
|
16
|
-
let endIdx = str.indexOf(";", index);
|
|
17
|
-
if (endIdx === -1) {
|
|
18
|
-
endIdx = str.length;
|
|
19
|
-
} else if (endIdx < eqIdx) {
|
|
20
|
-
index = str.lastIndexOf(";", eqIdx - 1) + 1;
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
const key = str.slice(index, eqIdx).trim();
|
|
24
|
-
if (void 0 === obj[key]) {
|
|
25
|
-
let val = str.slice(eqIdx + 1, endIdx).trim();
|
|
26
|
-
if (val.codePointAt(0) === 34) {
|
|
27
|
-
val = val.slice(1, -1);
|
|
28
|
-
}
|
|
29
|
-
obj[key] = tryDecode(val, dec);
|
|
30
|
-
}
|
|
31
|
-
index = endIdx + 1;
|
|
32
|
-
}
|
|
33
|
-
return obj;
|
|
34
|
-
}
|
|
35
|
-
function serialize(name, value, options) {
|
|
36
|
-
const opt = options || {};
|
|
37
|
-
const enc = opt.encode || encode;
|
|
38
|
-
if (typeof enc !== "function") {
|
|
39
|
-
throw new TypeError("option encode is invalid");
|
|
40
|
-
}
|
|
41
|
-
if (!fieldContentRegExp.test(name)) {
|
|
42
|
-
throw new TypeError("argument name is invalid");
|
|
43
|
-
}
|
|
44
|
-
const encodedValue = enc(value);
|
|
45
|
-
if (encodedValue && !fieldContentRegExp.test(encodedValue)) {
|
|
46
|
-
throw new TypeError("argument val is invalid");
|
|
47
|
-
}
|
|
48
|
-
let str = name + "=" + encodedValue;
|
|
49
|
-
if (void 0 !== opt.maxAge && opt.maxAge !== null) {
|
|
50
|
-
const maxAge = opt.maxAge - 0;
|
|
51
|
-
if (Number.isNaN(maxAge) || !Number.isFinite(maxAge)) {
|
|
52
|
-
throw new TypeError("option maxAge is invalid");
|
|
53
|
-
}
|
|
54
|
-
str += "; Max-Age=" + Math.floor(maxAge);
|
|
55
|
-
}
|
|
56
|
-
if (opt.domain) {
|
|
57
|
-
if (!fieldContentRegExp.test(opt.domain)) {
|
|
58
|
-
throw new TypeError("option domain is invalid");
|
|
59
|
-
}
|
|
60
|
-
str += "; Domain=" + opt.domain;
|
|
61
|
-
}
|
|
62
|
-
if (opt.path) {
|
|
63
|
-
if (!fieldContentRegExp.test(opt.path)) {
|
|
64
|
-
throw new TypeError("option path is invalid");
|
|
65
|
-
}
|
|
66
|
-
str += "; Path=" + opt.path;
|
|
67
|
-
}
|
|
68
|
-
if (opt.expires) {
|
|
69
|
-
if (!isDate(opt.expires) || Number.isNaN(opt.expires.valueOf())) {
|
|
70
|
-
throw new TypeError("option expires is invalid");
|
|
71
|
-
}
|
|
72
|
-
str += "; Expires=" + opt.expires.toUTCString();
|
|
73
|
-
}
|
|
74
|
-
if (opt.httpOnly) {
|
|
75
|
-
str += "; HttpOnly";
|
|
76
|
-
}
|
|
77
|
-
if (opt.secure) {
|
|
78
|
-
str += "; Secure";
|
|
79
|
-
}
|
|
80
|
-
if (opt.priority) {
|
|
81
|
-
const priority = typeof opt.priority === "string" ? opt.priority.toLowerCase() : opt.priority;
|
|
82
|
-
switch (priority) {
|
|
83
|
-
case "low": {
|
|
84
|
-
str += "; Priority=Low";
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
case "medium": {
|
|
88
|
-
str += "; Priority=Medium";
|
|
89
|
-
break;
|
|
90
|
-
}
|
|
91
|
-
case "high": {
|
|
92
|
-
str += "; Priority=High";
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
default: {
|
|
96
|
-
throw new TypeError("option priority is invalid");
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
if (opt.sameSite) {
|
|
101
|
-
const sameSite = typeof opt.sameSite === "string" ? opt.sameSite.toLowerCase() : opt.sameSite;
|
|
102
|
-
switch (sameSite) {
|
|
103
|
-
case true: {
|
|
104
|
-
str += "; SameSite=Strict";
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
case "lax": {
|
|
108
|
-
str += "; SameSite=Lax";
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
case "strict": {
|
|
112
|
-
str += "; SameSite=Strict";
|
|
113
|
-
break;
|
|
114
|
-
}
|
|
115
|
-
case "none": {
|
|
116
|
-
str += "; SameSite=None";
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
default: {
|
|
120
|
-
throw new TypeError("option sameSite is invalid");
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
if (opt.partitioned) {
|
|
125
|
-
str += "; Partitioned";
|
|
126
|
-
}
|
|
127
|
-
return str;
|
|
128
|
-
}
|
|
129
|
-
function isDate(val) {
|
|
130
|
-
return Object.prototype.toString.call(val) === "[object Date]" || val instanceof Date;
|
|
131
|
-
}
|
|
132
|
-
function tryDecode(str, decode2) {
|
|
133
|
-
try {
|
|
134
|
-
return decode2(str);
|
|
135
|
-
} catch {
|
|
136
|
-
return str;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
function decode(str) {
|
|
140
|
-
return str.includes("%") ? decodeURIComponent(str) : str;
|
|
141
|
-
}
|
|
142
|
-
function encode(val) {
|
|
143
|
-
return encodeURIComponent(val);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// ../../node_modules/.pnpm/h3@1.11.1/node_modules/h3/dist/index.mjs
|
|
147
|
-
import { objectHash } from "ohash";
|
|
148
|
-
|
|
149
|
-
// ../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.mjs
|
|
150
|
-
function isPlainObject(value) {
|
|
151
|
-
if (value === null || typeof value !== "object") {
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
const prototype = Object.getPrototypeOf(value);
|
|
155
|
-
if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) {
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
if (Symbol.iterator in value) {
|
|
159
|
-
return false;
|
|
160
|
-
}
|
|
161
|
-
if (Symbol.toStringTag in value) {
|
|
162
|
-
return Object.prototype.toString.call(value) === "[object Module]";
|
|
163
|
-
}
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
function _defu(baseObject, defaults, namespace = ".", merger) {
|
|
167
|
-
if (!isPlainObject(defaults)) {
|
|
168
|
-
return _defu(baseObject, {}, namespace, merger);
|
|
169
|
-
}
|
|
170
|
-
const object = Object.assign({}, defaults);
|
|
171
|
-
for (const key in baseObject) {
|
|
172
|
-
if (key === "__proto__" || key === "constructor") {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
const value = baseObject[key];
|
|
176
|
-
if (value === null || value === void 0) {
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
if (merger && merger(object, key, value, namespace)) {
|
|
180
|
-
continue;
|
|
181
|
-
}
|
|
182
|
-
if (Array.isArray(value) && Array.isArray(object[key])) {
|
|
183
|
-
object[key] = [...value, ...object[key]];
|
|
184
|
-
} else if (isPlainObject(value) && isPlainObject(object[key])) {
|
|
185
|
-
object[key] = _defu(
|
|
186
|
-
value,
|
|
187
|
-
object[key],
|
|
188
|
-
(namespace ? `${namespace}.` : "") + key.toString(),
|
|
189
|
-
merger
|
|
190
|
-
);
|
|
191
|
-
} else {
|
|
192
|
-
object[key] = value;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return object;
|
|
196
|
-
}
|
|
197
|
-
function createDefu(merger) {
|
|
198
|
-
return (...arguments_) => (
|
|
199
|
-
// eslint-disable-next-line unicorn/no-array-reduce
|
|
200
|
-
arguments_.reduce((p, c) => _defu(p, c, "", merger), {})
|
|
201
|
-
);
|
|
202
|
-
}
|
|
203
|
-
var defu = createDefu();
|
|
204
|
-
var defuFn = createDefu((object, key, currentValue) => {
|
|
205
|
-
if (object[key] !== void 0 && typeof currentValue === "function") {
|
|
206
|
-
object[key] = currentValue(object[key]);
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
var defuArrayFn = createDefu((object, key, currentValue) => {
|
|
211
|
-
if (Array.isArray(object[key]) && typeof currentValue === "function") {
|
|
212
|
-
object[key] = currentValue(object[key]);
|
|
213
|
-
return true;
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
// ../../node_modules/.pnpm/h3@1.11.1/node_modules/h3/dist/index.mjs
|
|
218
|
-
var __defProp$2 = Object.defineProperty;
|
|
219
|
-
var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
220
|
-
var __publicField$2 = (obj, key, value) => {
|
|
221
|
-
__defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
222
|
-
return value;
|
|
223
|
-
};
|
|
224
|
-
var H3Error = class extends Error {
|
|
225
|
-
constructor(message, opts = {}) {
|
|
226
|
-
super(message, opts);
|
|
227
|
-
__publicField$2(this, "statusCode", 500);
|
|
228
|
-
__publicField$2(this, "fatal", false);
|
|
229
|
-
__publicField$2(this, "unhandled", false);
|
|
230
|
-
__publicField$2(this, "statusMessage");
|
|
231
|
-
__publicField$2(this, "data");
|
|
232
|
-
__publicField$2(this, "cause");
|
|
233
|
-
if (opts.cause && !this.cause) {
|
|
234
|
-
this.cause = opts.cause;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
toJSON() {
|
|
238
|
-
const obj = {
|
|
239
|
-
message: this.message,
|
|
240
|
-
statusCode: sanitizeStatusCode(this.statusCode, 500)
|
|
241
|
-
};
|
|
242
|
-
if (this.statusMessage) {
|
|
243
|
-
obj.statusMessage = sanitizeStatusMessage(this.statusMessage);
|
|
244
|
-
}
|
|
245
|
-
if (this.data !== void 0) {
|
|
246
|
-
obj.data = this.data;
|
|
247
|
-
}
|
|
248
|
-
return obj;
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
__publicField$2(H3Error, "__h3_error__", true);
|
|
252
|
-
var RawBodySymbol = Symbol.for("h3RawBody");
|
|
253
|
-
var ParsedBodySymbol = Symbol.for("h3ParsedBody");
|
|
254
|
-
var DISALLOWED_STATUS_CHARS = /[^\u0009\u0020-\u007E]/g;
|
|
255
|
-
function sanitizeStatusMessage(statusMessage = "") {
|
|
256
|
-
return statusMessage.replace(DISALLOWED_STATUS_CHARS, "");
|
|
257
|
-
}
|
|
258
|
-
function sanitizeStatusCode(statusCode, defaultStatusCode = 200) {
|
|
259
|
-
if (!statusCode) {
|
|
260
|
-
return defaultStatusCode;
|
|
261
|
-
}
|
|
262
|
-
if (typeof statusCode === "string") {
|
|
263
|
-
statusCode = Number.parseInt(statusCode, 10);
|
|
264
|
-
}
|
|
265
|
-
if (statusCode < 100 || statusCode > 999) {
|
|
266
|
-
return defaultStatusCode;
|
|
267
|
-
}
|
|
268
|
-
return statusCode;
|
|
269
|
-
}
|
|
270
|
-
function parseCookies(event) {
|
|
271
|
-
return parse(event.node.req.headers.cookie || "");
|
|
272
|
-
}
|
|
273
|
-
function getCookie(event, name) {
|
|
274
|
-
return parseCookies(event)[name];
|
|
275
|
-
}
|
|
276
|
-
function setCookie(event, name, value, serializeOptions) {
|
|
277
|
-
serializeOptions = { path: "/", ...serializeOptions };
|
|
278
|
-
const cookieStr = serialize(name, value, serializeOptions);
|
|
279
|
-
let setCookies = event.node.res.getHeader("set-cookie");
|
|
280
|
-
if (!Array.isArray(setCookies)) {
|
|
281
|
-
setCookies = [setCookies];
|
|
282
|
-
}
|
|
283
|
-
const _optionsHash = objectHash(serializeOptions);
|
|
284
|
-
setCookies = setCookies.filter((cookieValue) => {
|
|
285
|
-
return cookieValue && _optionsHash !== objectHash(parse(cookieValue));
|
|
286
|
-
});
|
|
287
|
-
event.node.res.setHeader("set-cookie", [...setCookies, cookieStr]);
|
|
288
|
-
}
|
|
289
|
-
function getResponseHeaders(event) {
|
|
290
|
-
return event.node.res.getHeaders();
|
|
291
|
-
}
|
|
292
|
-
var getSessionPromise = Symbol("getSession");
|
|
293
|
-
var H3Headers = globalThis.Headers;
|
|
294
|
-
var H3Response = globalThis.Response;
|
|
295
|
-
|
|
296
|
-
// src/integrations/h3.ts
|
|
297
|
-
var toH3Handler = async (event, handler) => {
|
|
298
|
-
return await handler(event.node.req, {
|
|
299
|
-
cookieManager: {
|
|
300
|
-
set(name, value, options) {
|
|
301
|
-
setCookie(event, name, value, options);
|
|
302
|
-
},
|
|
303
|
-
get(name) {
|
|
304
|
-
return getCookie(event, name);
|
|
305
|
-
}
|
|
306
|
-
},
|
|
307
|
-
toResponse(res) {
|
|
308
|
-
const response = new Response(
|
|
309
|
-
res.body ? JSON.stringify(res.body) : null,
|
|
310
|
-
{
|
|
311
|
-
headers: {
|
|
312
|
-
...getResponseHeaders(event),
|
|
313
|
-
...res.headers
|
|
314
|
-
},
|
|
315
|
-
status: res.status,
|
|
316
|
-
statusText: res.statusText
|
|
317
|
-
}
|
|
318
|
-
);
|
|
319
|
-
return response;
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
};
|
|
323
|
-
export {
|
|
324
|
-
toH3Handler
|
|
325
|
-
};
|
|
326
|
-
//# sourceMappingURL=h3.js.map
|
package/dist/h3.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/cookie-es@1.1.0/node_modules/cookie-es/dist/index.mjs","../../../node_modules/.pnpm/h3@1.11.1/node_modules/h3/dist/index.mjs","../../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.mjs","../src/integrations/h3.ts"],"sourcesContent":["const fieldContentRegExp = /^[\\u0009\\u0020-\\u007E\\u0080-\\u00FF]+$/;\nfunction parse(str, options) {\n if (typeof str !== \"string\") {\n throw new TypeError(\"argument str must be a string\");\n }\n const obj = {};\n const opt = options || {};\n const dec = opt.decode || decode;\n let index = 0;\n while (index < str.length) {\n const eqIdx = str.indexOf(\"=\", index);\n if (eqIdx === -1) {\n break;\n }\n let endIdx = str.indexOf(\";\", index);\n if (endIdx === -1) {\n endIdx = str.length;\n } else if (endIdx < eqIdx) {\n index = str.lastIndexOf(\";\", eqIdx - 1) + 1;\n continue;\n }\n const key = str.slice(index, eqIdx).trim();\n if (void 0 === obj[key]) {\n let val = str.slice(eqIdx + 1, endIdx).trim();\n if (val.codePointAt(0) === 34) {\n val = val.slice(1, -1);\n }\n obj[key] = tryDecode(val, dec);\n }\n index = endIdx + 1;\n }\n return obj;\n}\nfunction serialize(name, value, options) {\n const opt = options || {};\n const enc = opt.encode || encode;\n if (typeof enc !== \"function\") {\n throw new TypeError(\"option encode is invalid\");\n }\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError(\"argument name is invalid\");\n }\n const encodedValue = enc(value);\n if (encodedValue && !fieldContentRegExp.test(encodedValue)) {\n throw new TypeError(\"argument val is invalid\");\n }\n let str = name + \"=\" + encodedValue;\n if (void 0 !== opt.maxAge && opt.maxAge !== null) {\n const maxAge = opt.maxAge - 0;\n if (Number.isNaN(maxAge) || !Number.isFinite(maxAge)) {\n throw new TypeError(\"option maxAge is invalid\");\n }\n str += \"; Max-Age=\" + Math.floor(maxAge);\n }\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError(\"option domain is invalid\");\n }\n str += \"; Domain=\" + opt.domain;\n }\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError(\"option path is invalid\");\n }\n str += \"; Path=\" + opt.path;\n }\n if (opt.expires) {\n if (!isDate(opt.expires) || Number.isNaN(opt.expires.valueOf())) {\n throw new TypeError(\"option expires is invalid\");\n }\n str += \"; Expires=\" + opt.expires.toUTCString();\n }\n if (opt.httpOnly) {\n str += \"; HttpOnly\";\n }\n if (opt.secure) {\n str += \"; Secure\";\n }\n if (opt.priority) {\n const priority = typeof opt.priority === \"string\" ? opt.priority.toLowerCase() : opt.priority;\n switch (priority) {\n case \"low\": {\n str += \"; Priority=Low\";\n break;\n }\n case \"medium\": {\n str += \"; Priority=Medium\";\n break;\n }\n case \"high\": {\n str += \"; Priority=High\";\n break;\n }\n default: {\n throw new TypeError(\"option priority is invalid\");\n }\n }\n }\n if (opt.sameSite) {\n const sameSite = typeof opt.sameSite === \"string\" ? opt.sameSite.toLowerCase() : opt.sameSite;\n switch (sameSite) {\n case true: {\n str += \"; SameSite=Strict\";\n break;\n }\n case \"lax\": {\n str += \"; SameSite=Lax\";\n break;\n }\n case \"strict\": {\n str += \"; SameSite=Strict\";\n break;\n }\n case \"none\": {\n str += \"; SameSite=None\";\n break;\n }\n default: {\n throw new TypeError(\"option sameSite is invalid\");\n }\n }\n }\n if (opt.partitioned) {\n str += \"; Partitioned\";\n }\n return str;\n}\nfunction isDate(val) {\n return Object.prototype.toString.call(val) === \"[object Date]\" || val instanceof Date;\n}\nfunction tryDecode(str, decode2) {\n try {\n return decode2(str);\n } catch {\n return str;\n }\n}\nfunction decode(str) {\n return str.includes(\"%\") ? decodeURIComponent(str) : str;\n}\nfunction encode(val) {\n return encodeURIComponent(val);\n}\n\nexport { parse, serialize };\n","import { withoutTrailingSlash, withoutBase, getQuery as getQuery$1, decode, decodePath, withLeadingSlash, parseURL, joinURL } from 'ufo';\nimport { parse as parse$1, serialize } from 'cookie-es';\nimport { objectHash } from 'ohash';\nimport { createRouter as createRouter$1, toRouteMatcher } from 'radix3';\nimport destr from 'destr';\nimport { defu } from 'defu';\nimport crypto from 'uncrypto';\nimport { seal, defaults, unseal } from 'iron-webcrypto';\nimport { IncomingMessage } from 'unenv/runtime/node/http/_request';\nimport { ServerResponse } from 'unenv/runtime/node/http/_response';\n\nfunction useBase(base, handler) {\n base = withoutTrailingSlash(base);\n if (!base || base === \"/\") {\n return handler;\n }\n return eventHandler(async (event) => {\n event.node.req.originalUrl = event.node.req.originalUrl || event.node.req.url || \"/\";\n const _path = event._path || event.node.req.url || \"/\";\n event._path = withoutBase(event.path || \"/\", base);\n event.node.req.url = event._path;\n try {\n return await handler(event);\n } finally {\n event._path = event.node.req.url = _path;\n }\n });\n}\n\nfunction hasProp(obj, prop) {\n try {\n return prop in obj;\n } catch {\n return false;\n }\n}\n\nvar __defProp$2 = Object.defineProperty;\nvar __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField$2 = (obj, key, value) => {\n __defNormalProp$2(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nclass H3Error extends Error {\n constructor(message, opts = {}) {\n super(message, opts);\n __publicField$2(this, \"statusCode\", 500);\n __publicField$2(this, \"fatal\", false);\n __publicField$2(this, \"unhandled\", false);\n __publicField$2(this, \"statusMessage\");\n __publicField$2(this, \"data\");\n __publicField$2(this, \"cause\");\n if (opts.cause && !this.cause) {\n this.cause = opts.cause;\n }\n }\n toJSON() {\n const obj = {\n message: this.message,\n statusCode: sanitizeStatusCode(this.statusCode, 500)\n };\n if (this.statusMessage) {\n obj.statusMessage = sanitizeStatusMessage(this.statusMessage);\n }\n if (this.data !== void 0) {\n obj.data = this.data;\n }\n return obj;\n }\n}\n__publicField$2(H3Error, \"__h3_error__\", true);\nfunction createError(input) {\n if (typeof input === \"string\") {\n return new H3Error(input);\n }\n if (isError(input)) {\n return input;\n }\n const err = new H3Error(input.message ?? input.statusMessage ?? \"\", {\n cause: input.cause || input\n });\n if (hasProp(input, \"stack\")) {\n try {\n Object.defineProperty(err, \"stack\", {\n get() {\n return input.stack;\n }\n });\n } catch {\n try {\n err.stack = input.stack;\n } catch {\n }\n }\n }\n if (input.data) {\n err.data = input.data;\n }\n if (input.statusCode) {\n err.statusCode = sanitizeStatusCode(input.statusCode, err.statusCode);\n } else if (input.status) {\n err.statusCode = sanitizeStatusCode(input.status, err.statusCode);\n }\n if (input.statusMessage) {\n err.statusMessage = input.statusMessage;\n } else if (input.statusText) {\n err.statusMessage = input.statusText;\n }\n if (err.statusMessage) {\n const originalMessage = err.statusMessage;\n const sanitizedMessage = sanitizeStatusMessage(err.statusMessage);\n if (sanitizedMessage !== originalMessage) {\n console.warn(\n \"[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.\"\n );\n }\n }\n if (input.fatal !== void 0) {\n err.fatal = input.fatal;\n }\n if (input.unhandled !== void 0) {\n err.unhandled = input.unhandled;\n }\n return err;\n}\nfunction sendError(event, error, debug) {\n if (event.handled) {\n return;\n }\n const h3Error = isError(error) ? error : createError(error);\n const responseBody = {\n statusCode: h3Error.statusCode,\n statusMessage: h3Error.statusMessage,\n stack: [],\n data: h3Error.data\n };\n if (debug) {\n responseBody.stack = (h3Error.stack || \"\").split(\"\\n\").map((l) => l.trim());\n }\n if (event.handled) {\n return;\n }\n const _code = Number.parseInt(h3Error.statusCode);\n setResponseStatus(event, _code, h3Error.statusMessage);\n event.node.res.setHeader(\"content-type\", MIMES.json);\n event.node.res.end(JSON.stringify(responseBody, void 0, 2));\n}\nfunction isError(input) {\n return input?.constructor?.__h3_error__ === true;\n}\n\nfunction parse(multipartBodyBuffer, boundary) {\n let lastline = \"\";\n let state = 0 /* INIT */;\n let buffer = [];\n const allParts = [];\n let currentPartHeaders = [];\n for (let i = 0; i < multipartBodyBuffer.length; i++) {\n const prevByte = i > 0 ? multipartBodyBuffer[i - 1] : null;\n const currByte = multipartBodyBuffer[i];\n const newLineChar = currByte === 10 || currByte === 13;\n if (!newLineChar) {\n lastline += String.fromCodePoint(currByte);\n }\n const newLineDetected = currByte === 10 && prevByte === 13;\n if (0 /* INIT */ === state && newLineDetected) {\n if (\"--\" + boundary === lastline) {\n state = 1 /* READING_HEADERS */;\n }\n lastline = \"\";\n } else if (1 /* READING_HEADERS */ === state && newLineDetected) {\n if (lastline.length > 0) {\n const i2 = lastline.indexOf(\":\");\n if (i2 > 0) {\n const name = lastline.slice(0, i2).toLowerCase();\n const value = lastline.slice(i2 + 1).trim();\n currentPartHeaders.push([name, value]);\n }\n } else {\n state = 2 /* READING_DATA */;\n buffer = [];\n }\n lastline = \"\";\n } else if (2 /* READING_DATA */ === state) {\n if (lastline.length > boundary.length + 4) {\n lastline = \"\";\n }\n if (\"--\" + boundary === lastline) {\n const j = buffer.length - lastline.length;\n const part = buffer.slice(0, j - 1);\n allParts.push(process(part, currentPartHeaders));\n buffer = [];\n currentPartHeaders = [];\n lastline = \"\";\n state = 3 /* READING_PART_SEPARATOR */;\n } else {\n buffer.push(currByte);\n }\n if (newLineDetected) {\n lastline = \"\";\n }\n } else if (3 /* READING_PART_SEPARATOR */ === state && newLineDetected) {\n state = 1 /* READING_HEADERS */;\n }\n }\n return allParts;\n}\nfunction process(data, headers) {\n const dataObj = {};\n const contentDispositionHeader = headers.find((h) => h[0] === \"content-disposition\")?.[1] || \"\";\n for (const i of contentDispositionHeader.split(\";\")) {\n const s = i.split(\"=\");\n if (s.length !== 2) {\n continue;\n }\n const key = (s[0] || \"\").trim();\n if (key === \"name\" || key === \"filename\") {\n const _value = (s[1] || \"\").trim().replace(/\"/g, \"\");\n dataObj[key] = Buffer.from(_value, \"latin1\").toString(\"utf8\");\n }\n }\n const contentType = headers.find((h) => h[0] === \"content-type\")?.[1] || \"\";\n if (contentType) {\n dataObj.type = contentType;\n }\n dataObj.data = Buffer.from(data);\n return dataObj;\n}\n\nasync function validateData(data, fn) {\n try {\n const res = await fn(data);\n if (res === false) {\n throw createValidationError();\n }\n if (res === true) {\n return data;\n }\n return res ?? data;\n } catch (error) {\n throw createValidationError(error);\n }\n}\nfunction createValidationError(validateError) {\n throw createError({\n status: 400,\n statusMessage: \"Validation Error\",\n message: validateError?.message || \"Validation Error\",\n data: validateError\n });\n}\n\nfunction getQuery(event) {\n return getQuery$1(event.path || \"\");\n}\nfunction getValidatedQuery(event, validate) {\n const query = getQuery(event);\n return validateData(query, validate);\n}\nfunction getRouterParams(event, opts = {}) {\n let params = event.context.params || {};\n if (opts.decode) {\n params = { ...params };\n for (const key in params) {\n params[key] = decode(params[key]);\n }\n }\n return params;\n}\nfunction getValidatedRouterParams(event, validate, opts = {}) {\n const routerParams = getRouterParams(event, opts);\n return validateData(routerParams, validate);\n}\nfunction getRouterParam(event, name, opts = {}) {\n const params = getRouterParams(event, opts);\n return params[name];\n}\nfunction getMethod(event, defaultMethod = \"GET\") {\n return (event.node.req.method || defaultMethod).toUpperCase();\n}\nfunction isMethod(event, expected, allowHead) {\n if (allowHead && event.method === \"HEAD\") {\n return true;\n }\n if (typeof expected === \"string\") {\n if (event.method === expected) {\n return true;\n }\n } else if (expected.includes(event.method)) {\n return true;\n }\n return false;\n}\nfunction assertMethod(event, expected, allowHead) {\n if (!isMethod(event, expected, allowHead)) {\n throw createError({\n statusCode: 405,\n statusMessage: \"HTTP method is not allowed.\"\n });\n }\n}\nfunction getRequestHeaders(event) {\n const _headers = {};\n for (const key in event.node.req.headers) {\n const val = event.node.req.headers[key];\n _headers[key] = Array.isArray(val) ? val.filter(Boolean).join(\", \") : val;\n }\n return _headers;\n}\nconst getHeaders = getRequestHeaders;\nfunction getRequestHeader(event, name) {\n const headers = getRequestHeaders(event);\n const value = headers[name.toLowerCase()];\n return value;\n}\nconst getHeader = getRequestHeader;\nfunction getRequestHost(event, opts = {}) {\n if (opts.xForwardedHost) {\n const xForwardedHost = event.node.req.headers[\"x-forwarded-host\"];\n if (xForwardedHost) {\n return xForwardedHost;\n }\n }\n return event.node.req.headers.host || \"localhost\";\n}\nfunction getRequestProtocol(event, opts = {}) {\n if (opts.xForwardedProto !== false && event.node.req.headers[\"x-forwarded-proto\"] === \"https\") {\n return \"https\";\n }\n return event.node.req.connection?.encrypted ? \"https\" : \"http\";\n}\nconst DOUBLE_SLASH_RE = /[/\\\\]{2,}/g;\nfunction getRequestPath(event) {\n const path = (event.node.req.url || \"/\").replace(DOUBLE_SLASH_RE, \"/\");\n return path;\n}\nfunction getRequestURL(event, opts = {}) {\n const host = getRequestHost(event, opts);\n const protocol = getRequestProtocol(event);\n const path = (event.node.req.originalUrl || event.path).replace(\n /^[/\\\\]+/g,\n \"/\"\n );\n return new URL(path, `${protocol}://${host}`);\n}\nfunction toWebRequest(event) {\n return event.web?.request || new Request(getRequestURL(event), {\n // @ts-ignore Undici option\n duplex: \"half\",\n method: event.method,\n headers: event.headers,\n body: getRequestWebStream(event)\n });\n}\nfunction getRequestIP(event, opts = {}) {\n if (event.context.clientAddress) {\n return event.context.clientAddress;\n }\n if (opts.xForwardedFor) {\n const xForwardedFor = getRequestHeader(event, \"x-forwarded-for\")?.split(\",\").shift()?.trim();\n if (xForwardedFor) {\n return xForwardedFor;\n }\n }\n if (event.node.req.socket.remoteAddress) {\n return event.node.req.socket.remoteAddress;\n }\n}\n\nconst RawBodySymbol = Symbol.for(\"h3RawBody\");\nconst ParsedBodySymbol = Symbol.for(\"h3ParsedBody\");\nconst PayloadMethods$1 = [\"PATCH\", \"POST\", \"PUT\", \"DELETE\"];\nfunction readRawBody(event, encoding = \"utf8\") {\n assertMethod(event, PayloadMethods$1);\n const _rawBody = event._requestBody || event.web?.request?.body || event.node.req[RawBodySymbol] || event.node.req.rawBody || event.node.req.body;\n if (_rawBody) {\n const promise2 = Promise.resolve(_rawBody).then((_resolved) => {\n if (Buffer.isBuffer(_resolved)) {\n return _resolved;\n }\n if (typeof _resolved.pipeTo === \"function\") {\n return new Promise((resolve, reject) => {\n const chunks = [];\n _resolved.pipeTo(\n new WritableStream({\n write(chunk) {\n chunks.push(chunk);\n },\n close() {\n resolve(Buffer.concat(chunks));\n },\n abort(reason) {\n reject(reason);\n }\n })\n ).catch(reject);\n });\n } else if (typeof _resolved.pipe === \"function\") {\n return new Promise((resolve, reject) => {\n const chunks = [];\n _resolved.on(\"data\", (chunk) => {\n chunks.push(chunk);\n }).on(\"end\", () => {\n resolve(Buffer.concat(chunks));\n }).on(\"error\", reject);\n });\n }\n if (_resolved.constructor === Object) {\n return Buffer.from(JSON.stringify(_resolved));\n }\n return Buffer.from(_resolved);\n });\n return encoding ? promise2.then((buff) => buff.toString(encoding)) : promise2;\n }\n if (!Number.parseInt(event.node.req.headers[\"content-length\"] || \"\")) {\n return Promise.resolve(void 0);\n }\n const promise = event.node.req[RawBodySymbol] = new Promise(\n (resolve, reject) => {\n const bodyData = [];\n event.node.req.on(\"error\", (err) => {\n reject(err);\n }).on(\"data\", (chunk) => {\n bodyData.push(chunk);\n }).on(\"end\", () => {\n resolve(Buffer.concat(bodyData));\n });\n }\n );\n const result = encoding ? promise.then((buff) => buff.toString(encoding)) : promise;\n return result;\n}\nasync function readBody(event, options = {}) {\n const request = event.node.req;\n if (hasProp(request, ParsedBodySymbol)) {\n return request[ParsedBodySymbol];\n }\n const contentType = request.headers[\"content-type\"] || \"\";\n const body = await readRawBody(event);\n let parsed;\n if (contentType === \"application/json\") {\n parsed = _parseJSON(body, options.strict ?? true);\n } else if (contentType.startsWith(\"application/x-www-form-urlencoded\")) {\n parsed = _parseURLEncodedBody(body);\n } else if (contentType.startsWith(\"text/\")) {\n parsed = body;\n } else {\n parsed = _parseJSON(body, options.strict ?? false);\n }\n request[ParsedBodySymbol] = parsed;\n return parsed;\n}\nasync function readValidatedBody(event, validate) {\n const _body = await readBody(event, { strict: true });\n return validateData(_body, validate);\n}\nasync function readMultipartFormData(event) {\n const contentType = getRequestHeader(event, \"content-type\");\n if (!contentType || !contentType.startsWith(\"multipart/form-data\")) {\n return;\n }\n const boundary = contentType.match(/boundary=([^;]*)(;|$)/i)?.[1];\n if (!boundary) {\n return;\n }\n const body = await readRawBody(event, false);\n if (!body) {\n return;\n }\n return parse(body, boundary);\n}\nasync function readFormData(event) {\n return await toWebRequest(event).formData();\n}\nfunction getRequestWebStream(event) {\n if (!PayloadMethods$1.includes(event.method)) {\n return;\n }\n const bodyStream = event.web?.request?.body || event._requestBody;\n if (bodyStream) {\n return bodyStream;\n }\n const _hasRawBody = RawBodySymbol in event.node.req || \"rawBody\" in event.node.req || \"body\" in event.node.req || \"__unenv__\" in event.node.req;\n if (_hasRawBody) {\n return new ReadableStream({\n async start(controller) {\n const _rawBody = await readRawBody(event, false);\n if (_rawBody) {\n controller.enqueue(_rawBody);\n }\n controller.close();\n }\n });\n }\n return new ReadableStream({\n start: (controller) => {\n event.node.req.on(\"data\", (chunk) => {\n controller.enqueue(chunk);\n });\n event.node.req.on(\"end\", () => {\n controller.close();\n });\n event.node.req.on(\"error\", (err) => {\n controller.error(err);\n });\n }\n });\n}\nfunction _parseJSON(body = \"\", strict) {\n if (!body) {\n return void 0;\n }\n try {\n return destr(body, { strict });\n } catch {\n throw createError({\n statusCode: 400,\n statusMessage: \"Bad Request\",\n message: \"Invalid JSON body\"\n });\n }\n}\nfunction _parseURLEncodedBody(body) {\n const form = new URLSearchParams(body);\n const parsedForm = /* @__PURE__ */ Object.create(null);\n for (const [key, value] of form.entries()) {\n if (hasProp(parsedForm, key)) {\n if (!Array.isArray(parsedForm[key])) {\n parsedForm[key] = [parsedForm[key]];\n }\n parsedForm[key].push(value);\n } else {\n parsedForm[key] = value;\n }\n }\n return parsedForm;\n}\n\nfunction handleCacheHeaders(event, opts) {\n const cacheControls = [\"public\", ...opts.cacheControls || []];\n let cacheMatched = false;\n if (opts.maxAge !== void 0) {\n cacheControls.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);\n }\n if (opts.modifiedTime) {\n const modifiedTime = new Date(opts.modifiedTime);\n const ifModifiedSince = event.node.req.headers[\"if-modified-since\"];\n event.node.res.setHeader(\"last-modified\", modifiedTime.toUTCString());\n if (ifModifiedSince && new Date(ifModifiedSince) >= opts.modifiedTime) {\n cacheMatched = true;\n }\n }\n if (opts.etag) {\n event.node.res.setHeader(\"etag\", opts.etag);\n const ifNonMatch = event.node.req.headers[\"if-none-match\"];\n if (ifNonMatch === opts.etag) {\n cacheMatched = true;\n }\n }\n event.node.res.setHeader(\"cache-control\", cacheControls.join(\", \"));\n if (cacheMatched) {\n event.node.res.statusCode = 304;\n if (!event.handled) {\n event.node.res.end();\n }\n return true;\n }\n return false;\n}\n\nconst MIMES = {\n html: \"text/html\",\n json: \"application/json\"\n};\n\nconst DISALLOWED_STATUS_CHARS = /[^\\u0009\\u0020-\\u007E]/g;\nfunction sanitizeStatusMessage(statusMessage = \"\") {\n return statusMessage.replace(DISALLOWED_STATUS_CHARS, \"\");\n}\nfunction sanitizeStatusCode(statusCode, defaultStatusCode = 200) {\n if (!statusCode) {\n return defaultStatusCode;\n }\n if (typeof statusCode === \"string\") {\n statusCode = Number.parseInt(statusCode, 10);\n }\n if (statusCode < 100 || statusCode > 999) {\n return defaultStatusCode;\n }\n return statusCode;\n}\n\nfunction parseCookies(event) {\n return parse$1(event.node.req.headers.cookie || \"\");\n}\nfunction getCookie(event, name) {\n return parseCookies(event)[name];\n}\nfunction setCookie(event, name, value, serializeOptions) {\n serializeOptions = { path: \"/\", ...serializeOptions };\n const cookieStr = serialize(name, value, serializeOptions);\n let setCookies = event.node.res.getHeader(\"set-cookie\");\n if (!Array.isArray(setCookies)) {\n setCookies = [setCookies];\n }\n const _optionsHash = objectHash(serializeOptions);\n setCookies = setCookies.filter((cookieValue) => {\n return cookieValue && _optionsHash !== objectHash(parse$1(cookieValue));\n });\n event.node.res.setHeader(\"set-cookie\", [...setCookies, cookieStr]);\n}\nfunction deleteCookie(event, name, serializeOptions) {\n setCookie(event, name, \"\", {\n ...serializeOptions,\n maxAge: 0\n });\n}\nfunction splitCookiesString(cookiesString) {\n if (Array.isArray(cookiesString)) {\n return cookiesString.flatMap((c) => splitCookiesString(c));\n }\n if (typeof cookiesString !== \"string\") {\n return [];\n }\n const cookiesStrings = [];\n let pos = 0;\n let start;\n let ch;\n let lastComma;\n let nextStart;\n let cookiesSeparatorFound;\n const skipWhitespace = () => {\n while (pos < cookiesString.length && /\\s/.test(cookiesString.charAt(pos))) {\n pos += 1;\n }\n return pos < cookiesString.length;\n };\n const notSpecialChar = () => {\n ch = cookiesString.charAt(pos);\n return ch !== \"=\" && ch !== \";\" && ch !== \",\";\n };\n while (pos < cookiesString.length) {\n start = pos;\n cookiesSeparatorFound = false;\n while (skipWhitespace()) {\n ch = cookiesString.charAt(pos);\n if (ch === \",\") {\n lastComma = pos;\n pos += 1;\n skipWhitespace();\n nextStart = pos;\n while (pos < cookiesString.length && notSpecialChar()) {\n pos += 1;\n }\n if (pos < cookiesString.length && cookiesString.charAt(pos) === \"=\") {\n cookiesSeparatorFound = true;\n pos = nextStart;\n cookiesStrings.push(cookiesString.slice(start, lastComma));\n start = pos;\n } else {\n pos = lastComma + 1;\n }\n } else {\n pos += 1;\n }\n }\n if (!cookiesSeparatorFound || pos >= cookiesString.length) {\n cookiesStrings.push(cookiesString.slice(start, cookiesString.length));\n }\n }\n return cookiesStrings;\n}\n\nfunction serializeIterableValue(value) {\n switch (typeof value) {\n case \"string\": {\n return value;\n }\n case \"boolean\":\n case \"number\":\n case \"bigint\":\n case \"symbol\": {\n return value.toString();\n }\n case \"function\":\n case \"undefined\": {\n return void 0;\n }\n case \"object\": {\n if (value instanceof Uint8Array) {\n return value;\n }\n return JSON.stringify(value);\n }\n }\n}\nfunction coerceIterable(iterable) {\n if (typeof iterable === \"function\") {\n iterable = iterable();\n }\n if (Symbol.iterator in iterable) {\n return iterable[Symbol.iterator]();\n }\n if (Symbol.asyncIterator in iterable) {\n return iterable[Symbol.asyncIterator]();\n }\n return iterable;\n}\n\nconst defer = typeof setImmediate === \"undefined\" ? (fn) => fn() : setImmediate;\nfunction send(event, data, type) {\n if (type) {\n defaultContentType(event, type);\n }\n return new Promise((resolve) => {\n defer(() => {\n if (!event.handled) {\n event.node.res.end(data);\n }\n resolve();\n });\n });\n}\nfunction sendNoContent(event, code) {\n if (event.handled) {\n return;\n }\n if (!code && event.node.res.statusCode !== 200) {\n code = event.node.res.statusCode;\n }\n const _code = sanitizeStatusCode(code, 204);\n if (_code === 204) {\n event.node.res.removeHeader(\"content-length\");\n }\n event.node.res.writeHead(_code);\n event.node.res.end();\n}\nfunction setResponseStatus(event, code, text) {\n if (code) {\n event.node.res.statusCode = sanitizeStatusCode(\n code,\n event.node.res.statusCode\n );\n }\n if (text) {\n event.node.res.statusMessage = sanitizeStatusMessage(text);\n }\n}\nfunction getResponseStatus(event) {\n return event.node.res.statusCode;\n}\nfunction getResponseStatusText(event) {\n return event.node.res.statusMessage;\n}\nfunction defaultContentType(event, type) {\n if (type && event.node.res.statusCode !== 304 && !event.node.res.getHeader(\"content-type\")) {\n event.node.res.setHeader(\"content-type\", type);\n }\n}\nfunction sendRedirect(event, location, code = 302) {\n event.node.res.statusCode = sanitizeStatusCode(\n code,\n event.node.res.statusCode\n );\n event.node.res.setHeader(\"location\", location);\n const encodedLoc = location.replace(/\"/g, \"%22\");\n const html = `<!DOCTYPE html><html><head><meta http-equiv=\"refresh\" content=\"0; url=${encodedLoc}\"></head></html>`;\n return send(event, html, MIMES.html);\n}\nfunction getResponseHeaders(event) {\n return event.node.res.getHeaders();\n}\nfunction getResponseHeader(event, name) {\n return event.node.res.getHeader(name);\n}\nfunction setResponseHeaders(event, headers) {\n for (const [name, value] of Object.entries(headers)) {\n event.node.res.setHeader(name, value);\n }\n}\nconst setHeaders = setResponseHeaders;\nfunction setResponseHeader(event, name, value) {\n event.node.res.setHeader(name, value);\n}\nconst setHeader = setResponseHeader;\nfunction appendResponseHeaders(event, headers) {\n for (const [name, value] of Object.entries(headers)) {\n appendResponseHeader(event, name, value);\n }\n}\nconst appendHeaders = appendResponseHeaders;\nfunction appendResponseHeader(event, name, value) {\n let current = event.node.res.getHeader(name);\n if (!current) {\n event.node.res.setHeader(name, value);\n return;\n }\n if (!Array.isArray(current)) {\n current = [current.toString()];\n }\n event.node.res.setHeader(name, [...current, value]);\n}\nconst appendHeader = appendResponseHeader;\nfunction clearResponseHeaders(event, headerNames) {\n if (headerNames && headerNames.length > 0) {\n for (const name of headerNames) {\n removeResponseHeader(event, name);\n }\n } else {\n for (const [name] of Object.entries(getResponseHeaders(event))) {\n removeResponseHeader(event, name);\n }\n }\n}\nfunction removeResponseHeader(event, name) {\n return event.node.res.removeHeader(name);\n}\nfunction isStream(data) {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n if (typeof data.pipe === \"function\") {\n if (typeof data._read === \"function\") {\n return true;\n }\n if (typeof data.abort === \"function\") {\n return true;\n }\n }\n if (typeof data.pipeTo === \"function\") {\n return true;\n }\n return false;\n}\nfunction isWebResponse(data) {\n return typeof Response !== \"undefined\" && data instanceof Response;\n}\nfunction sendStream(event, stream) {\n if (!stream || typeof stream !== \"object\") {\n throw new Error(\"[h3] Invalid stream provided.\");\n }\n event.node.res._data = stream;\n if (!event.node.res.socket) {\n event._handled = true;\n return Promise.resolve();\n }\n if (hasProp(stream, \"pipeTo\") && typeof stream.pipeTo === \"function\") {\n return stream.pipeTo(\n new WritableStream({\n write(chunk) {\n event.node.res.write(chunk);\n }\n })\n ).then(() => {\n event.node.res.end();\n });\n }\n if (hasProp(stream, \"pipe\") && typeof stream.pipe === \"function\") {\n return new Promise((resolve, reject) => {\n stream.pipe(event.node.res);\n if (stream.on) {\n stream.on(\"end\", () => {\n event.node.res.end();\n resolve();\n });\n stream.on(\"error\", (error) => {\n reject(error);\n });\n }\n event.node.res.on(\"close\", () => {\n if (stream.abort) {\n stream.abort();\n }\n });\n });\n }\n throw new Error(\"[h3] Invalid or incompatible stream provided.\");\n}\nconst noop = () => {\n};\nfunction writeEarlyHints(event, hints, cb = noop) {\n if (!event.node.res.socket) {\n cb();\n return;\n }\n if (typeof hints === \"string\" || Array.isArray(hints)) {\n hints = { link: hints };\n }\n if (hints.link) {\n hints.link = Array.isArray(hints.link) ? hints.link : hints.link.split(\",\");\n }\n const headers = Object.entries(hints).map(\n (e) => [e[0].toLowerCase(), e[1]]\n );\n if (headers.length === 0) {\n cb();\n return;\n }\n let hint = \"HTTP/1.1 103 Early Hints\";\n if (hints.link) {\n hint += `\\r\nLink: ${hints.link.join(\", \")}`;\n }\n for (const [header, value] of headers) {\n if (header === \"link\") {\n continue;\n }\n hint += `\\r\n${header}: ${value}`;\n }\n if (event.node.res.socket) {\n event.node.res.socket.write(\n `${hint}\\r\n\\r\n`,\n \"utf8\",\n cb\n );\n } else {\n cb();\n }\n}\nfunction sendWebResponse(event, response) {\n for (const [key, value] of response.headers) {\n if (key === \"set-cookie\") {\n event.node.res.appendHeader(key, splitCookiesString(value));\n } else {\n event.node.res.setHeader(key, value);\n }\n }\n if (response.status) {\n event.node.res.statusCode = sanitizeStatusCode(\n response.status,\n event.node.res.statusCode\n );\n }\n if (response.statusText) {\n event.node.res.statusMessage = sanitizeStatusMessage(response.statusText);\n }\n if (response.redirected) {\n event.node.res.setHeader(\"location\", response.url);\n }\n if (!response.body) {\n event.node.res.end();\n return;\n }\n return sendStream(event, response.body);\n}\nfunction sendIterable(event, iterable, options) {\n const serializer = options?.serializer ?? serializeIterableValue;\n const iterator = coerceIterable(iterable);\n return sendStream(\n event,\n new ReadableStream({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (value !== void 0) {\n const chunk = serializer(value);\n if (chunk !== void 0) {\n controller.enqueue(chunk);\n }\n }\n if (done) {\n controller.close();\n }\n },\n cancel() {\n iterator.return?.();\n }\n })\n );\n}\n\nfunction resolveCorsOptions(options = {}) {\n const defaultOptions = {\n origin: \"*\",\n methods: \"*\",\n allowHeaders: \"*\",\n exposeHeaders: \"*\",\n credentials: false,\n maxAge: false,\n preflight: {\n statusCode: 204\n }\n };\n return defu(options, defaultOptions);\n}\nfunction isPreflightRequest(event) {\n const origin = getRequestHeader(event, \"origin\");\n const accessControlRequestMethod = getRequestHeader(\n event,\n \"access-control-request-method\"\n );\n return event.method === \"OPTIONS\" && !!origin && !!accessControlRequestMethod;\n}\nfunction isCorsOriginAllowed(origin, options) {\n const { origin: originOption } = options;\n if (!origin || !originOption || originOption === \"*\" || originOption === \"null\") {\n return true;\n }\n if (Array.isArray(originOption)) {\n return originOption.some((_origin) => {\n if (_origin instanceof RegExp) {\n return _origin.test(origin);\n }\n return origin === _origin;\n });\n }\n return originOption(origin);\n}\nfunction createOriginHeaders(event, options) {\n const { origin: originOption } = options;\n const origin = getRequestHeader(event, \"origin\");\n if (!origin || !originOption || originOption === \"*\") {\n return { \"access-control-allow-origin\": \"*\" };\n }\n if (typeof originOption === \"string\") {\n return { \"access-control-allow-origin\": originOption, vary: \"origin\" };\n }\n return isCorsOriginAllowed(origin, options) ? { \"access-control-allow-origin\": origin, vary: \"origin\" } : {};\n}\nfunction createMethodsHeaders(options) {\n const { methods } = options;\n if (!methods) {\n return {};\n }\n if (methods === \"*\") {\n return { \"access-control-allow-methods\": \"*\" };\n }\n return methods.length > 0 ? { \"access-control-allow-methods\": methods.join(\",\") } : {};\n}\nfunction createCredentialsHeaders(options) {\n const { credentials } = options;\n if (credentials) {\n return { \"access-control-allow-credentials\": \"true\" };\n }\n return {};\n}\nfunction createAllowHeaderHeaders(event, options) {\n const { allowHeaders } = options;\n if (!allowHeaders || allowHeaders === \"*\" || allowHeaders.length === 0) {\n const header = getRequestHeader(event, \"access-control-request-headers\");\n return header ? {\n \"access-control-allow-headers\": header,\n vary: \"access-control-request-headers\"\n } : {};\n }\n return {\n \"access-control-allow-headers\": allowHeaders.join(\",\"),\n vary: \"access-control-request-headers\"\n };\n}\nfunction createExposeHeaders(options) {\n const { exposeHeaders } = options;\n if (!exposeHeaders) {\n return {};\n }\n if (exposeHeaders === \"*\") {\n return { \"access-control-expose-headers\": exposeHeaders };\n }\n return { \"access-control-expose-headers\": exposeHeaders.join(\",\") };\n}\nfunction appendCorsPreflightHeaders(event, options) {\n appendHeaders(event, createOriginHeaders(event, options));\n appendHeaders(event, createCredentialsHeaders(options));\n appendHeaders(event, createExposeHeaders(options));\n appendHeaders(event, createMethodsHeaders(options));\n appendHeaders(event, createAllowHeaderHeaders(event, options));\n}\nfunction appendCorsHeaders(event, options) {\n appendHeaders(event, createOriginHeaders(event, options));\n appendHeaders(event, createCredentialsHeaders(options));\n appendHeaders(event, createExposeHeaders(options));\n}\n\nfunction handleCors(event, options) {\n const _options = resolveCorsOptions(options);\n if (isPreflightRequest(event)) {\n appendCorsPreflightHeaders(event, options);\n sendNoContent(event, _options.preflight.statusCode);\n return true;\n }\n appendCorsHeaders(event, options);\n return false;\n}\n\nasync function getRequestFingerprint(event, opts = {}) {\n const fingerprint = [];\n if (opts.ip !== false) {\n fingerprint.push(\n getRequestIP(event, { xForwardedFor: opts.xForwardedFor })\n );\n }\n if (opts.method === true) {\n fingerprint.push(event.method);\n }\n if (opts.path === true) {\n fingerprint.push(event.path);\n }\n if (opts.userAgent === true) {\n fingerprint.push(getRequestHeader(event, \"user-agent\"));\n }\n const fingerprintString = fingerprint.filter(Boolean).join(\"|\");\n if (!fingerprintString) {\n return null;\n }\n if (opts.hash === false) {\n return fingerprintString;\n }\n const buffer = await crypto.subtle.digest(\n opts.hash || \"SHA-1\",\n new TextEncoder().encode(fingerprintString)\n );\n const hash = [...new Uint8Array(buffer)].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return hash;\n}\n\nconst PayloadMethods = /* @__PURE__ */ new Set([\"PATCH\", \"POST\", \"PUT\", \"DELETE\"]);\nconst ignoredHeaders = /* @__PURE__ */ new Set([\n \"transfer-encoding\",\n \"connection\",\n \"keep-alive\",\n \"upgrade\",\n \"expect\",\n \"host\",\n \"accept\"\n]);\nasync function proxyRequest(event, target, opts = {}) {\n let body;\n let duplex;\n if (PayloadMethods.has(event.method)) {\n if (opts.streamRequest) {\n body = getRequestWebStream(event);\n duplex = \"half\";\n } else {\n body = await readRawBody(event, false).catch(() => void 0);\n }\n }\n const method = opts.fetchOptions?.method || event.method;\n const fetchHeaders = mergeHeaders(\n getProxyRequestHeaders(event),\n opts.fetchOptions?.headers,\n opts.headers\n );\n return sendProxy(event, target, {\n ...opts,\n fetchOptions: {\n method,\n body,\n duplex,\n ...opts.fetchOptions,\n headers: fetchHeaders\n }\n });\n}\nasync function sendProxy(event, target, opts = {}) {\n const response = await _getFetch(opts.fetch)(target, {\n headers: opts.headers,\n ignoreResponseError: true,\n // make $ofetch.raw transparent\n ...opts.fetchOptions\n });\n event.node.res.statusCode = sanitizeStatusCode(\n response.status,\n event.node.res.statusCode\n );\n event.node.res.statusMessage = sanitizeStatusMessage(response.statusText);\n const cookies = [];\n for (const [key, value] of response.headers.entries()) {\n if (key === \"content-encoding\") {\n continue;\n }\n if (key === \"content-length\") {\n continue;\n }\n if (key === \"set-cookie\") {\n cookies.push(...splitCookiesString(value));\n continue;\n }\n event.node.res.setHeader(key, value);\n }\n if (cookies.length > 0) {\n event.node.res.setHeader(\n \"set-cookie\",\n cookies.map((cookie) => {\n if (opts.cookieDomainRewrite) {\n cookie = rewriteCookieProperty(\n cookie,\n opts.cookieDomainRewrite,\n \"domain\"\n );\n }\n if (opts.cookiePathRewrite) {\n cookie = rewriteCookieProperty(\n cookie,\n opts.cookiePathRewrite,\n \"path\"\n );\n }\n return cookie;\n })\n );\n }\n if (opts.onResponse) {\n await opts.onResponse(event, response);\n }\n if (response._data !== void 0) {\n return response._data;\n }\n if (event.handled) {\n return;\n }\n if (opts.sendStream === false) {\n const data = new Uint8Array(await response.arrayBuffer());\n return event.node.res.end(data);\n }\n if (response.body) {\n for await (const chunk of response.body) {\n event.node.res.write(chunk);\n }\n }\n return event.node.res.end();\n}\nfunction getProxyRequestHeaders(event) {\n const headers = /* @__PURE__ */ Object.create(null);\n const reqHeaders = getRequestHeaders(event);\n for (const name in reqHeaders) {\n if (!ignoredHeaders.has(name)) {\n headers[name] = reqHeaders[name];\n }\n }\n return headers;\n}\nfunction fetchWithEvent(event, req, init, options) {\n return _getFetch(options?.fetch)(req, {\n ...init,\n context: init?.context || event.context,\n headers: {\n ...getProxyRequestHeaders(event),\n ...init?.headers\n }\n });\n}\nfunction _getFetch(_fetch) {\n if (_fetch) {\n return _fetch;\n }\n if (globalThis.fetch) {\n return globalThis.fetch;\n }\n throw new Error(\n \"fetch is not available. Try importing `node-fetch-native/polyfill` for Node.js.\"\n );\n}\nfunction rewriteCookieProperty(header, map, property) {\n const _map = typeof map === \"string\" ? { \"*\": map } : map;\n return header.replace(\n new RegExp(`(;\\\\s*${property}=)([^;]+)`, \"gi\"),\n (match, prefix, previousValue) => {\n let newValue;\n if (previousValue in _map) {\n newValue = _map[previousValue];\n } else if (\"*\" in _map) {\n newValue = _map[\"*\"];\n } else {\n return match;\n }\n return newValue ? prefix + newValue : \"\";\n }\n );\n}\nfunction mergeHeaders(defaults, ...inputs) {\n const _inputs = inputs.filter(Boolean);\n if (_inputs.length === 0) {\n return defaults;\n }\n const merged = new Headers(defaults);\n for (const input of _inputs) {\n for (const [key, value] of Object.entries(input)) {\n if (value !== void 0) {\n merged.set(key, value);\n }\n }\n }\n return merged;\n}\n\nconst getSessionPromise = Symbol(\"getSession\");\nconst DEFAULT_NAME = \"h3\";\nconst DEFAULT_COOKIE = {\n path: \"/\",\n secure: true,\n httpOnly: true\n};\nasync function useSession(event, config) {\n const sessionName = config.name || DEFAULT_NAME;\n await getSession(event, config);\n const sessionManager = {\n get id() {\n return event.context.sessions?.[sessionName]?.id;\n },\n get data() {\n return event.context.sessions?.[sessionName]?.data || {};\n },\n update: async (update) => {\n await updateSession(event, config, update);\n return sessionManager;\n },\n clear: async () => {\n await clearSession(event, config);\n return sessionManager;\n }\n };\n return sessionManager;\n}\nasync function getSession(event, config) {\n const sessionName = config.name || DEFAULT_NAME;\n if (!event.context.sessions) {\n event.context.sessions = /* @__PURE__ */ Object.create(null);\n }\n const existingSession = event.context.sessions[sessionName];\n if (existingSession) {\n return existingSession[getSessionPromise] || existingSession;\n }\n const session = {\n id: \"\",\n createdAt: 0,\n data: /* @__PURE__ */ Object.create(null)\n };\n event.context.sessions[sessionName] = session;\n let sealedSession;\n if (config.sessionHeader !== false) {\n const headerName = typeof config.sessionHeader === \"string\" ? config.sessionHeader.toLowerCase() : `x-${sessionName.toLowerCase()}-session`;\n const headerValue = event.node.req.headers[headerName];\n if (typeof headerValue === \"string\") {\n sealedSession = headerValue;\n }\n }\n if (!sealedSession) {\n sealedSession = getCookie(event, sessionName);\n }\n if (sealedSession) {\n const promise = unsealSession(event, config, sealedSession).catch(() => {\n }).then((unsealed) => {\n Object.assign(session, unsealed);\n delete event.context.sessions[sessionName][getSessionPromise];\n return session;\n });\n event.context.sessions[sessionName][getSessionPromise] = promise;\n await promise;\n }\n if (!session.id) {\n session.id = config.generateId?.() ?? (config.crypto || crypto).randomUUID();\n session.createdAt = Date.now();\n await updateSession(event, config);\n }\n return session;\n}\nasync function updateSession(event, config, update) {\n const sessionName = config.name || DEFAULT_NAME;\n const session = event.context.sessions?.[sessionName] || await getSession(event, config);\n if (typeof update === \"function\") {\n update = update(session.data);\n }\n if (update) {\n Object.assign(session.data, update);\n }\n if (config.cookie !== false) {\n const sealed = await sealSession(event, config);\n setCookie(event, sessionName, sealed, {\n ...DEFAULT_COOKIE,\n expires: config.maxAge ? new Date(session.createdAt + config.maxAge * 1e3) : void 0,\n ...config.cookie\n });\n }\n return session;\n}\nasync function sealSession(event, config) {\n const sessionName = config.name || DEFAULT_NAME;\n const session = event.context.sessions?.[sessionName] || await getSession(event, config);\n const sealed = await seal(config.crypto || crypto, session, config.password, {\n ...defaults,\n ttl: config.maxAge ? config.maxAge * 1e3 : 0,\n ...config.seal\n });\n return sealed;\n}\nasync function unsealSession(_event, config, sealed) {\n const unsealed = await unseal(\n config.crypto || crypto,\n sealed,\n config.password,\n {\n ...defaults,\n ttl: config.maxAge ? config.maxAge * 1e3 : 0,\n ...config.seal\n }\n );\n if (config.maxAge) {\n const age = Date.now() - (unsealed.createdAt || Number.NEGATIVE_INFINITY);\n if (age > config.maxAge * 1e3) {\n throw new Error(\"Session expired!\");\n }\n }\n return unsealed;\n}\nasync function clearSession(event, config) {\n const sessionName = config.name || DEFAULT_NAME;\n if (event.context.sessions?.[sessionName]) {\n delete event.context.sessions[sessionName];\n }\n await setCookie(event, sessionName, \"\", {\n ...DEFAULT_COOKIE,\n ...config.cookie\n });\n}\n\nfunction formatEventStreamMessage(message) {\n let result = \"\";\n if (message.id) {\n result += `id: ${message.id}\n`;\n }\n if (message.event) {\n result += `event: ${message.event}\n`;\n }\n if (typeof message.retry === \"number\" && Number.isInteger(message.retry)) {\n result += `retry: ${message.retry}\n`;\n }\n result += `data: ${message.data}\n\n`;\n return result;\n}\nfunction formatEventStreamMessages(messages) {\n let result = \"\";\n for (const msg of messages) {\n result += formatEventStreamMessage(msg);\n }\n return result;\n}\nfunction setEventStreamHeaders(event) {\n const headers = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"private, no-cache, no-store, no-transform, must-revalidate, max-age=0\",\n \"X-Accel-Buffering\": \"no\"\n // prevent nginx from buffering the response\n };\n if (!isHttp2Request(event)) {\n headers.Connection = \"keep-alive\";\n }\n setResponseHeaders(event, headers);\n}\nfunction isHttp2Request(event) {\n return getHeader(event, \":path\") !== void 0 && getHeader(event, \":method\") !== void 0;\n}\n\nvar __defProp$1 = Object.defineProperty;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField$1 = (obj, key, value) => {\n __defNormalProp$1(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nclass EventStream {\n constructor(event, opts = {}) {\n __publicField$1(this, \"_h3Event\");\n __publicField$1(this, \"_transformStream\", new TransformStream());\n __publicField$1(this, \"_writer\");\n __publicField$1(this, \"_encoder\", new TextEncoder());\n __publicField$1(this, \"_writerIsClosed\", false);\n __publicField$1(this, \"_paused\", false);\n __publicField$1(this, \"_unsentData\");\n __publicField$1(this, \"_disposed\", false);\n __publicField$1(this, \"_handled\", false);\n this._h3Event = event;\n this._writer = this._transformStream.writable.getWriter();\n this._writer.closed.then(() => {\n this._writerIsClosed = true;\n });\n if (opts.autoclose !== false) {\n this._h3Event.node.req.on(\"close\", () => this.close());\n }\n }\n async push(message) {\n if (typeof message === \"string\") {\n await this._sendEvent({ data: message });\n return;\n }\n if (Array.isArray(message)) {\n if (message.length === 0) {\n return;\n }\n if (typeof message[0] === \"string\") {\n const msgs = [];\n for (const item of message) {\n msgs.push({ data: item });\n }\n await this._sendEvents(msgs);\n return;\n }\n await this._sendEvents(message);\n return;\n }\n await this._sendEvent(message);\n }\n async _sendEvent(message) {\n if (this._writerIsClosed) {\n return;\n }\n if (this._paused && !this._unsentData) {\n this._unsentData = formatEventStreamMessage(message);\n return;\n }\n if (this._paused) {\n this._unsentData += formatEventStreamMessage(message);\n return;\n }\n await this._writer.write(this._encoder.encode(formatEventStreamMessage(message))).catch();\n }\n async _sendEvents(messages) {\n if (this._writerIsClosed) {\n return;\n }\n const payload = formatEventStreamMessages(messages);\n if (this._paused && !this._unsentData) {\n this._unsentData = payload;\n return;\n }\n if (this._paused) {\n this._unsentData += payload;\n return;\n }\n await this._writer.write(this._encoder.encode(payload)).catch();\n }\n pause() {\n this._paused = true;\n }\n get isPaused() {\n return this._paused;\n }\n async resume() {\n this._paused = false;\n await this.flush();\n }\n async flush() {\n if (this._writerIsClosed) {\n return;\n }\n if (this._unsentData?.length) {\n await this._writer.write(this._encoder.encode(this._unsentData));\n this._unsentData = void 0;\n }\n }\n /**\n * Close the stream and the connection if the stream is being sent to the client\n */\n async close() {\n if (this._disposed) {\n return;\n }\n if (!this._writerIsClosed) {\n try {\n await this._writer.close();\n } catch {\n }\n }\n if (this._h3Event._handled && this._handled && !this._h3Event.node.res.closed) {\n this._h3Event.node.res.end();\n }\n this._disposed = true;\n }\n /**\n * Triggers callback when the writable stream is closed.\n * It is also triggered after calling the `close()` method.\n * It also triggers when the request connection has been closed by either the client or the server.\n */\n onClosed(cb) {\n this._writer.closed.then(cb);\n this._h3Event.node?.req.on(\"close\", cb);\n }\n async send() {\n setEventStreamHeaders(this._h3Event);\n setResponseStatus(this._h3Event, 200);\n this._h3Event._handled = true;\n this._handled = true;\n await sendStream(this._h3Event, this._transformStream.readable);\n }\n}\n\nfunction createEventStream(event, opts) {\n return new EventStream(event, opts);\n}\n\nasync function serveStatic(event, options) {\n if (event.method !== \"GET\" && event.method !== \"HEAD\") {\n if (!options.fallthrough) {\n throw createError({\n statusMessage: \"Method Not Allowed\",\n statusCode: 405\n });\n }\n return false;\n }\n const originalId = decodePath(\n withLeadingSlash(withoutTrailingSlash(parseURL(event.path).pathname))\n );\n const acceptEncodings = parseAcceptEncoding(\n getRequestHeader(event, \"accept-encoding\"),\n options.encodings\n );\n if (acceptEncodings.length > 1) {\n setResponseHeader(event, \"vary\", \"accept-encoding\");\n }\n let id = originalId;\n let meta;\n const _ids = idSearchPaths(\n originalId,\n acceptEncodings,\n options.indexNames || [\"/index.html\"]\n );\n for (const _id of _ids) {\n const _meta = await options.getMeta(_id);\n if (_meta) {\n meta = _meta;\n id = _id;\n break;\n }\n }\n if (!meta) {\n if (!options.fallthrough) {\n throw createError({\n statusMessage: \"Cannot find static asset \" + id,\n statusCode: 404\n });\n }\n return false;\n }\n if (meta.etag && !getResponseHeader(event, \"etag\")) {\n setResponseHeader(event, \"etag\", meta.etag);\n }\n const ifNotMatch = meta.etag && getRequestHeader(event, \"if-none-match\") === meta.etag;\n if (ifNotMatch) {\n setResponseStatus(event, 304, \"Not Modified\");\n return send(event, \"\");\n }\n if (meta.mtime) {\n const mtimeDate = new Date(meta.mtime);\n const ifModifiedSinceH = getRequestHeader(event, \"if-modified-since\");\n if (ifModifiedSinceH && new Date(ifModifiedSinceH) >= mtimeDate) {\n setResponseStatus(event, 304, \"Not Modified\");\n return send(event, null);\n }\n if (!getResponseHeader(event, \"last-modified\")) {\n setResponseHeader(event, \"last-modified\", mtimeDate.toUTCString());\n }\n }\n if (meta.type && !getResponseHeader(event, \"content-type\")) {\n setResponseHeader(event, \"content-type\", meta.type);\n }\n if (meta.encoding && !getResponseHeader(event, \"content-encoding\")) {\n setResponseHeader(event, \"content-encoding\", meta.encoding);\n }\n if (meta.size !== void 0 && meta.size > 0 && !getResponseHeader(event, \"content-length\")) {\n setResponseHeader(event, \"content-length\", meta.size);\n }\n if (event.method === \"HEAD\") {\n return send(event, null);\n }\n const contents = await options.getContents(id);\n return isStream(contents) ? sendStream(event, contents) : send(event, contents);\n}\nfunction parseAcceptEncoding(header, encodingMap) {\n if (!encodingMap || !header) {\n return [];\n }\n return String(header || \"\").split(\",\").map((e) => encodingMap[e.trim()]).filter(Boolean);\n}\nfunction idSearchPaths(id, encodings, indexNames) {\n const ids = [];\n for (const suffix of [\"\", ...indexNames]) {\n for (const encoding of [...encodings, \"\"]) {\n ids.push(`${id}${suffix}${encoding}`);\n }\n }\n return ids;\n}\n\nfunction defineWebSocket(hooks) {\n return hooks;\n}\nfunction defineWebSocketHandler(hooks) {\n return defineEventHandler({\n handler() {\n throw createError({\n statusCode: 426,\n statusMessage: \"Upgrade Required\"\n });\n },\n websocket: hooks\n });\n}\n\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nclass H3Event {\n constructor(req, res) {\n __publicField(this, \"__is_event__\", true);\n // Context\n __publicField(this, \"node\");\n // Node\n __publicField(this, \"web\");\n // Web\n __publicField(this, \"context\", {});\n // Shared\n // Request\n __publicField(this, \"_method\");\n __publicField(this, \"_path\");\n __publicField(this, \"_headers\");\n __publicField(this, \"_requestBody\");\n // Response\n __publicField(this, \"_handled\", false);\n this.node = { req, res };\n }\n // --- Request ---\n get method() {\n if (!this._method) {\n this._method = (this.node.req.method || \"GET\").toUpperCase();\n }\n return this._method;\n }\n get path() {\n return this._path || this.node.req.url || \"/\";\n }\n get headers() {\n if (!this._headers) {\n this._headers = _normalizeNodeHeaders(this.node.req.headers);\n }\n return this._headers;\n }\n // --- Respoonse ---\n get handled() {\n return this._handled || this.node.res.writableEnded || this.node.res.headersSent;\n }\n respondWith(response) {\n return Promise.resolve(response).then(\n (_response) => sendWebResponse(this, _response)\n );\n }\n // --- Utils ---\n toString() {\n return `[${this.method}] ${this.path}`;\n }\n toJSON() {\n return this.toString();\n }\n // --- Deprecated ---\n /** @deprecated Please use `event.node.req` instead. **/\n get req() {\n return this.node.req;\n }\n /** @deprecated Please use `event.node.res` instead. **/\n get res() {\n return this.node.res;\n }\n}\nfunction isEvent(input) {\n return hasProp(input, \"__is_event__\");\n}\nfunction createEvent(req, res) {\n return new H3Event(req, res);\n}\nfunction _normalizeNodeHeaders(nodeHeaders) {\n const headers = new Headers();\n for (const [name, value] of Object.entries(nodeHeaders)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(name, item);\n }\n } else if (value) {\n headers.set(name, value);\n }\n }\n return headers;\n}\n\nfunction defineEventHandler(handler) {\n if (typeof handler === \"function\") {\n handler.__is_handler__ = true;\n return handler;\n }\n const _hooks = {\n onRequest: _normalizeArray(handler.onRequest),\n onBeforeResponse: _normalizeArray(handler.onBeforeResponse)\n };\n const _handler = (event) => {\n return _callHandler(event, handler.handler, _hooks);\n };\n _handler.__is_handler__ = true;\n _handler.__resolve__ = handler.handler.__resolve__;\n _handler.__websocket__ = handler.websocket;\n return _handler;\n}\nfunction _normalizeArray(input) {\n return input ? Array.isArray(input) ? input : [input] : void 0;\n}\nasync function _callHandler(event, handler, hooks) {\n if (hooks.onRequest) {\n for (const hook of hooks.onRequest) {\n await hook(event);\n if (event.handled) {\n return;\n }\n }\n }\n const body = await handler(event);\n const response = { body };\n if (hooks.onBeforeResponse) {\n for (const hook of hooks.onBeforeResponse) {\n await hook(event, response);\n }\n }\n return response.body;\n}\nconst eventHandler = defineEventHandler;\nfunction defineRequestMiddleware(fn) {\n return fn;\n}\nfunction defineResponseMiddleware(fn) {\n return fn;\n}\nfunction isEventHandler(input) {\n return hasProp(input, \"__is_handler__\");\n}\nfunction toEventHandler(input, _, _route) {\n if (!isEventHandler(input)) {\n console.warn(\n \"[h3] Implicit event handler conversion is deprecated. Use `eventHandler()` or `fromNodeMiddleware()` to define event handlers.\",\n _route && _route !== \"/\" ? `\n Route: ${_route}` : \"\",\n `\n Handler: ${input}`\n );\n }\n return input;\n}\nfunction dynamicEventHandler(initial) {\n let current = initial;\n const wrapper = eventHandler((event) => {\n if (current) {\n return current(event);\n }\n });\n wrapper.set = (handler) => {\n current = handler;\n };\n return wrapper;\n}\nfunction defineLazyEventHandler(factory) {\n let _promise;\n let _resolved;\n const resolveHandler = () => {\n if (_resolved) {\n return Promise.resolve(_resolved);\n }\n if (!_promise) {\n _promise = Promise.resolve(factory()).then((r) => {\n const handler2 = r.default || r;\n if (typeof handler2 !== \"function\") {\n throw new TypeError(\n \"Invalid lazy handler result. It should be a function:\",\n handler2\n );\n }\n _resolved = { handler: toEventHandler(r.default || r) };\n return _resolved;\n });\n }\n return _promise;\n };\n const handler = eventHandler((event) => {\n if (_resolved) {\n return _resolved.handler(event);\n }\n return resolveHandler().then((r) => r.handler(event));\n });\n handler.__resolve__ = resolveHandler;\n return handler;\n}\nconst lazyEventHandler = defineLazyEventHandler;\n\nconst H3Headers = globalThis.Headers;\nconst H3Response = globalThis.Response;\n\nfunction createApp(options = {}) {\n const stack = [];\n const handler = createAppEventHandler(stack, options);\n const resolve = createResolver(stack);\n handler.__resolve__ = resolve;\n const getWebsocket = cachedFn(() => websocketOptions(resolve, options));\n const app = {\n // @ts-expect-error\n use: (arg1, arg2, arg3) => use(app, arg1, arg2, arg3),\n resolve,\n handler,\n stack,\n options,\n get websocket() {\n return getWebsocket();\n }\n };\n return app;\n}\nfunction use(app, arg1, arg2, arg3) {\n if (Array.isArray(arg1)) {\n for (const i of arg1) {\n use(app, i, arg2, arg3);\n }\n } else if (Array.isArray(arg2)) {\n for (const i of arg2) {\n use(app, arg1, i, arg3);\n }\n } else if (typeof arg1 === \"string\") {\n app.stack.push(\n normalizeLayer({ ...arg3, route: arg1, handler: arg2 })\n );\n } else if (typeof arg1 === \"function\") {\n app.stack.push(normalizeLayer({ ...arg2, handler: arg1 }));\n } else {\n app.stack.push(normalizeLayer({ ...arg1 }));\n }\n return app;\n}\nfunction createAppEventHandler(stack, options) {\n const spacing = options.debug ? 2 : void 0;\n return eventHandler(async (event) => {\n event.node.req.originalUrl = event.node.req.originalUrl || event.node.req.url || \"/\";\n const _reqPath = event._path || event.node.req.url || \"/\";\n let _layerPath;\n if (options.onRequest) {\n await options.onRequest(event);\n }\n for (const layer of stack) {\n if (layer.route.length > 1) {\n if (!_reqPath.startsWith(layer.route)) {\n continue;\n }\n _layerPath = _reqPath.slice(layer.route.length) || \"/\";\n } else {\n _layerPath = _reqPath;\n }\n if (layer.match && !layer.match(_layerPath, event)) {\n continue;\n }\n event._path = _layerPath;\n event.node.req.url = _layerPath;\n const val = await layer.handler(event);\n const _body = val === void 0 ? void 0 : await val;\n if (_body !== void 0) {\n const _response = { body: _body };\n if (options.onBeforeResponse) {\n await options.onBeforeResponse(event, _response);\n }\n await handleHandlerResponse(event, _response.body, spacing);\n if (options.onAfterResponse) {\n await options.onAfterResponse(event, _response);\n }\n return;\n }\n if (event.handled) {\n if (options.onAfterResponse) {\n await options.onAfterResponse(event, void 0);\n }\n return;\n }\n }\n if (!event.handled) {\n throw createError({\n statusCode: 404,\n statusMessage: `Cannot find any path matching ${event.path || \"/\"}.`\n });\n }\n if (options.onAfterResponse) {\n await options.onAfterResponse(event, void 0);\n }\n });\n}\nfunction createResolver(stack) {\n return async (path) => {\n let _layerPath;\n for (const layer of stack) {\n if (layer.route === \"/\" && !layer.handler.__resolve__) {\n continue;\n }\n if (!path.startsWith(layer.route)) {\n continue;\n }\n _layerPath = path.slice(layer.route.length) || \"/\";\n if (layer.match && !layer.match(_layerPath, void 0)) {\n continue;\n }\n let res = { route: layer.route, handler: layer.handler };\n if (res.handler.__resolve__) {\n const _res = await res.handler.__resolve__(_layerPath);\n if (!_res) {\n continue;\n }\n res = {\n ...res,\n ..._res,\n route: joinURL(res.route || \"/\", _res.route || \"/\")\n };\n }\n return res;\n }\n };\n}\nfunction normalizeLayer(input) {\n let handler = input.handler;\n if (handler.handler) {\n handler = handler.handler;\n }\n if (input.lazy) {\n handler = lazyEventHandler(handler);\n } else if (!isEventHandler(handler)) {\n handler = toEventHandler(handler, void 0, input.route);\n }\n return {\n route: withoutTrailingSlash(input.route),\n match: input.match,\n handler\n };\n}\nfunction handleHandlerResponse(event, val, jsonSpace) {\n if (val === null) {\n return sendNoContent(event);\n }\n if (val) {\n if (isWebResponse(val)) {\n return sendWebResponse(event, val);\n }\n if (isStream(val)) {\n return sendStream(event, val);\n }\n if (val.buffer) {\n return send(event, val);\n }\n if (val.arrayBuffer && typeof val.arrayBuffer === \"function\") {\n return val.arrayBuffer().then((arrayBuffer) => {\n return send(event, Buffer.from(arrayBuffer), val.type);\n });\n }\n if (val instanceof Error) {\n throw createError(val);\n }\n if (typeof val.end === \"function\") {\n return true;\n }\n }\n const valType = typeof val;\n if (valType === \"string\") {\n return send(event, val, MIMES.html);\n }\n if (valType === \"object\" || valType === \"boolean\" || valType === \"number\") {\n return send(event, JSON.stringify(val, void 0, jsonSpace), MIMES.json);\n }\n if (valType === \"bigint\") {\n return send(event, val.toString(), MIMES.json);\n }\n throw createError({\n statusCode: 500,\n statusMessage: `[h3] Cannot send ${valType} as response.`\n });\n}\nfunction cachedFn(fn) {\n let cache;\n return () => {\n if (!cache) {\n cache = fn();\n }\n return cache;\n };\n}\nfunction websocketOptions(evResolver, appOptions) {\n return {\n ...appOptions.websocket,\n async resolve(info) {\n const { pathname } = parseURL(info.url || \"/\");\n const resolved = await evResolver(pathname);\n return resolved?.handler?.__websocket__ || {};\n }\n };\n}\n\nconst RouterMethods = [\n \"connect\",\n \"delete\",\n \"get\",\n \"head\",\n \"options\",\n \"post\",\n \"put\",\n \"trace\",\n \"patch\"\n];\nfunction createRouter(opts = {}) {\n const _router = createRouter$1({});\n const routes = {};\n let _matcher;\n const router = {};\n const addRoute = (path, handler, method) => {\n let route = routes[path];\n if (!route) {\n routes[path] = route = { path, handlers: {} };\n _router.insert(path, route);\n }\n if (Array.isArray(method)) {\n for (const m of method) {\n addRoute(path, handler, m);\n }\n } else {\n route.handlers[method] = toEventHandler(handler, void 0, path);\n }\n return router;\n };\n router.use = router.add = (path, handler, method) => addRoute(path, handler, method || \"all\");\n for (const method of RouterMethods) {\n router[method] = (path, handle) => router.add(path, handle, method);\n }\n const matchHandler = (path = \"/\", method = \"get\") => {\n const qIndex = path.indexOf(\"?\");\n if (qIndex !== -1) {\n path = path.slice(0, Math.max(0, qIndex));\n }\n const matched = _router.lookup(path);\n if (!matched || !matched.handlers) {\n return {\n error: createError({\n statusCode: 404,\n name: \"Not Found\",\n statusMessage: `Cannot find any route matching ${path || \"/\"}.`\n })\n };\n }\n let handler = matched.handlers[method] || matched.handlers.all;\n if (!handler) {\n if (!_matcher) {\n _matcher = toRouteMatcher(_router);\n }\n const _matches = _matcher.matchAll(path).reverse();\n for (const _match of _matches) {\n if (_match.handlers[method]) {\n handler = _match.handlers[method];\n matched.handlers[method] = matched.handlers[method] || handler;\n break;\n }\n if (_match.handlers.all) {\n handler = _match.handlers.all;\n matched.handlers.all = matched.handlers.all || handler;\n break;\n }\n }\n }\n if (!handler) {\n return {\n error: createError({\n statusCode: 405,\n name: \"Method Not Allowed\",\n statusMessage: `Method ${method} is not allowed on this route.`\n })\n };\n }\n return { matched, handler };\n };\n const isPreemptive = opts.preemptive || opts.preemtive;\n router.handler = eventHandler((event) => {\n const match = matchHandler(\n event.path,\n event.method.toLowerCase()\n );\n if (\"error\" in match) {\n if (isPreemptive) {\n throw match.error;\n } else {\n return;\n }\n }\n event.context.matchedRoute = match.matched;\n const params = match.matched.params || {};\n event.context.params = params;\n return Promise.resolve(match.handler(event)).then((res) => {\n if (res === void 0 && isPreemptive) {\n return null;\n }\n return res;\n });\n });\n router.handler.__resolve__ = async (path) => {\n path = withLeadingSlash(path);\n const match = matchHandler(path);\n if (\"error\" in match) {\n return;\n }\n let res = {\n route: match.matched.path,\n handler: match.handler\n };\n if (match.handler.__resolve__) {\n const _res = await match.handler.__resolve__(path);\n if (!_res) {\n return;\n }\n res = { ...res, ..._res };\n }\n return res;\n };\n return router;\n}\n\nconst defineNodeListener = (handler) => handler;\nconst defineNodeMiddleware = (middleware) => middleware;\nfunction fromNodeMiddleware(handler) {\n if (isEventHandler(handler)) {\n return handler;\n }\n if (typeof handler !== \"function\") {\n throw new TypeError(\n \"Invalid handler. It should be a function:\",\n handler\n );\n }\n return eventHandler((event) => {\n return callNodeListener(\n handler,\n event.node.req,\n event.node.res\n );\n });\n}\nfunction toNodeListener(app) {\n const toNodeHandle = async function(req, res) {\n const event = createEvent(req, res);\n try {\n await app.handler(event);\n } catch (_error) {\n const error = createError(_error);\n if (!isError(_error)) {\n error.unhandled = true;\n }\n if (app.options.onError) {\n await app.options.onError(error, event);\n }\n if (event.handled) {\n return;\n }\n if (error.unhandled || error.fatal) {\n console.error(\"[h3]\", error.fatal ? \"[fatal]\" : \"[unhandled]\", error);\n }\n await sendError(event, error, !!app.options.debug);\n }\n };\n return toNodeHandle;\n}\nfunction promisifyNodeListener(handler) {\n return function(req, res) {\n return callNodeListener(handler, req, res);\n };\n}\nfunction callNodeListener(handler, req, res) {\n const isMiddleware = handler.length > 2;\n return new Promise((resolve, reject) => {\n const next = (err) => {\n if (isMiddleware) {\n res.off(\"close\", next);\n res.off(\"error\", next);\n }\n return err ? reject(createError(err)) : resolve(void 0);\n };\n try {\n const returned = handler(req, res, next);\n if (isMiddleware && returned === void 0) {\n res.once(\"close\", next);\n res.once(\"error\", next);\n } else {\n resolve(returned);\n }\n } catch (error) {\n next(error);\n }\n });\n}\n\nfunction toPlainHandler(app) {\n const handler = (request) => {\n return _handlePlainRequest(app, request);\n };\n return handler;\n}\nfunction fromPlainHandler(handler) {\n return eventHandler(async (event) => {\n const res = await handler({\n method: event.method,\n path: event.path,\n headers: Object.fromEntries(event.headers.entries()),\n body: getRequestWebStream(event),\n context: event.context\n });\n setResponseStatus(event, res.status, res.statusText);\n for (const [key, value] of res.headers) {\n setResponseHeader(event, key, value);\n }\n return res.body;\n });\n}\nasync function _handlePlainRequest(app, request) {\n const path = request.path;\n const method = (request.method || \"GET\").toUpperCase();\n const headers = new Headers(request.headers);\n const nodeReq = new IncomingMessage();\n const nodeRes = new ServerResponse(nodeReq);\n nodeReq.method = method;\n nodeReq.url = path;\n nodeReq.headers = Object.fromEntries(headers.entries());\n const event = createEvent(nodeReq, nodeRes);\n event._method = method;\n event._path = path;\n event._headers = headers;\n if (request.body) {\n event._requestBody = request.body;\n }\n if (request._eventOverrides) {\n Object.assign(event, request._eventOverrides);\n }\n if (request.context) {\n Object.assign(event.context, request.context);\n }\n try {\n await app.handler(event);\n } catch (_error) {\n const error = createError(_error);\n if (!isError(_error)) {\n error.unhandled = true;\n }\n if (app.options.onError) {\n await app.options.onError(error, event);\n }\n if (!event.handled) {\n if (error.unhandled || error.fatal) {\n console.error(\"[h3]\", error.fatal ? \"[fatal]\" : \"[unhandled]\", error);\n }\n await sendError(event, error, !!app.options.debug);\n }\n }\n return {\n status: nodeRes.statusCode,\n statusText: nodeRes.statusMessage,\n headers: _normalizeUnenvHeaders(nodeRes._headers),\n body: nodeRes._data\n };\n}\nfunction _normalizeUnenvHeaders(input) {\n const headers = [];\n const cookies = [];\n for (const _key in input) {\n const key = _key.toLowerCase();\n if (key === \"set-cookie\") {\n cookies.push(\n ...splitCookiesString(input[\"set-cookie\"])\n );\n continue;\n }\n const value = input[key];\n if (Array.isArray(value)) {\n for (const _value of value) {\n headers.push([key, _value]);\n }\n } else if (value !== void 0) {\n headers.push([key, String(value)]);\n }\n }\n if (cookies.length > 0) {\n for (const cookie of cookies) {\n headers.push([\"set-cookie\", cookie]);\n }\n }\n return headers;\n}\n\nfunction toWebHandler(app) {\n const webHandler = (request, context) => {\n return _handleWebRequest(app, request, context);\n };\n return webHandler;\n}\nfunction fromWebHandler(handler) {\n return eventHandler((event) => handler(toWebRequest(event), event.context));\n}\nconst nullBodyResponses = /* @__PURE__ */ new Set([101, 204, 205, 304]);\nasync function _handleWebRequest(app, request, context) {\n const url = new URL(request.url);\n const res = await _handlePlainRequest(app, {\n _eventOverrides: {\n web: { request, url }\n },\n context,\n method: request.method,\n path: url.pathname + url.search,\n headers: request.headers,\n body: request.body\n });\n const body = nullBodyResponses.has(res.status) || request.method === \"HEAD\" ? null : res.body;\n return new Response(body, {\n status: res.status,\n statusText: res.statusText,\n headers: res.headers\n });\n}\n\nexport { 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 };\n","function isPlainObject(value) {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) {\n return false;\n }\n if (Symbol.iterator in value) {\n return false;\n }\n if (Symbol.toStringTag in value) {\n return Object.prototype.toString.call(value) === \"[object Module]\";\n }\n return true;\n}\n\nfunction _defu(baseObject, defaults, namespace = \".\", merger) {\n if (!isPlainObject(defaults)) {\n return _defu(baseObject, {}, namespace, merger);\n }\n const object = Object.assign({}, defaults);\n for (const key in baseObject) {\n if (key === \"__proto__\" || key === \"constructor\") {\n continue;\n }\n const value = baseObject[key];\n if (value === null || value === void 0) {\n continue;\n }\n if (merger && merger(object, key, value, namespace)) {\n continue;\n }\n if (Array.isArray(value) && Array.isArray(object[key])) {\n object[key] = [...value, ...object[key]];\n } else if (isPlainObject(value) && isPlainObject(object[key])) {\n object[key] = _defu(\n value,\n object[key],\n (namespace ? `${namespace}.` : \"\") + key.toString(),\n merger\n );\n } else {\n object[key] = value;\n }\n }\n return object;\n}\nfunction createDefu(merger) {\n return (...arguments_) => (\n // eslint-disable-next-line unicorn/no-array-reduce\n arguments_.reduce((p, c) => _defu(p, c, \"\", merger), {})\n );\n}\nconst defu = createDefu();\nconst defuFn = createDefu((object, key, currentValue) => {\n if (object[key] !== void 0 && typeof currentValue === \"function\") {\n object[key] = currentValue(object[key]);\n return true;\n }\n});\nconst defuArrayFn = createDefu((object, key, currentValue) => {\n if (Array.isArray(object[key]) && typeof currentValue === \"function\") {\n object[key] = currentValue(object[key]);\n return true;\n }\n});\n\nexport { createDefu, defu as default, defu, defuArrayFn, defuFn };\n","import { type H3Event, getCookie, getResponseHeaders, setCookie } from \"h3\";\nimport type { BetterAuthHandler } from \"../auth\";\n\nexport const toH3Handler = async (\n\tevent: H3Event,\n\thandler: BetterAuthHandler,\n) => {\n\treturn await handler(event.node.req, {\n\t\tcookieManager: {\n\t\t\tset(name, value, options) {\n\t\t\t\tsetCookie(event, name, value, options);\n\t\t\t},\n\t\t\tget(name) {\n\t\t\t\treturn getCookie(event, name);\n\t\t\t},\n\t\t},\n\t\ttoResponse(res) {\n\t\t\tconst response = new Response(\n\t\t\t\tres.body ? JSON.stringify(res.body) : null,\n\t\t\t\t{\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t...(getResponseHeaders(event) as any),\n\t\t\t\t\t\t...res.headers,\n\t\t\t\t\t},\n\t\t\t\t\tstatus: res.status,\n\t\t\t\t\tstatusText: res.statusText,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn response;\n\t\t},\n\t});\n};\n"],"mappings":"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","names":[]}
|
package/dist/hono.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { HonoRequest } from 'hono';
|
|
2
|
-
import { B as BetterAuthHandler } from './index-UcTu1vUg.js';
|
|
3
|
-
import 'node:http';
|
|
4
|
-
import './options-CH15FEBw.js';
|
|
5
|
-
import './types-DAxaMWCy.js';
|
|
6
|
-
import 'zod';
|
|
7
|
-
|
|
8
|
-
declare const toHonoHandler: (handler: BetterAuthHandler, request: HonoRequest) => Promise<Response>;
|
|
9
|
-
|
|
10
|
-
export { toHonoHandler };
|
package/dist/hono.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// src/integrations/hono.ts
|
|
2
|
-
var toHonoHandler = async (handler, request) => {
|
|
3
|
-
if (request.method === "POST") {
|
|
4
|
-
const req = new Request(request.url, {
|
|
5
|
-
method: request.method,
|
|
6
|
-
headers: request.header(),
|
|
7
|
-
body: JSON.stringify(await request.json())
|
|
8
|
-
});
|
|
9
|
-
return handler(req);
|
|
10
|
-
}
|
|
11
|
-
if (request.method === "GET") {
|
|
12
|
-
const req = new Request(request.url, {
|
|
13
|
-
method: request.method,
|
|
14
|
-
headers: request.header()
|
|
15
|
-
});
|
|
16
|
-
return handler(req);
|
|
17
|
-
}
|
|
18
|
-
return new Response(null, {
|
|
19
|
-
status: 405
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
export {
|
|
23
|
-
toHonoHandler
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=hono.js.map
|
package/dist/hono.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/integrations/hono.ts"],"sourcesContent":["import type { HonoRequest } from \"hono\";\nimport type { BetterAuthHandler } from \"..\";\n\nexport const toHonoHandler = async (\n\thandler: BetterAuthHandler,\n\trequest: HonoRequest,\n) => {\n\tif (request.method === \"POST\") {\n\t\tconst req = new Request(request.url, {\n\t\t\tmethod: request.method,\n\t\t\theaders: request.header(),\n\t\t\tbody: JSON.stringify(await request.json()),\n\t\t});\n\t\treturn handler(req);\n\t}\n\tif (request.method === \"GET\") {\n\t\tconst req = new Request(request.url, {\n\t\t\tmethod: request.method,\n\t\t\theaders: request.header(),\n\t\t});\n\t\treturn handler(req);\n\t}\n\treturn new Response(null, {\n\t\tstatus: 405,\n\t});\n};\n"],"mappings":";AAGO,IAAM,gBAAgB,OAC5B,SACA,YACI;AACJ,MAAI,QAAQ,WAAW,QAAQ;AAC9B,UAAM,MAAM,IAAI,QAAQ,QAAQ,KAAK;AAAA,MACpC,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ,OAAO;AAAA,MACxB,MAAM,KAAK,UAAU,MAAM,QAAQ,KAAK,CAAC;AAAA,IAC1C,CAAC;AACD,WAAO,QAAQ,GAAG;AAAA,EACnB;AACA,MAAI,QAAQ,WAAW,OAAO;AAC7B,UAAM,MAAM,IAAI,QAAQ,QAAQ,KAAK;AAAA,MACpC,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ,OAAO;AAAA,IACzB,CAAC;AACD,WAAO,QAAQ,GAAG;AAAA,EACnB;AACA,SAAO,IAAI,SAAS,MAAM;AAAA,IACzB,QAAQ;AAAA,EACT,CAAC;AACF;","names":[]}
|