h3 0.5.3 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +174 -125
- package/dist/index.d.ts +29 -10
- package/dist/index.mjs +172 -127
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -11,128 +11,6 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
|
|
|
11
11
|
|
|
12
12
|
const destr__default = /*#__PURE__*/_interopDefaultLegacy(destr);
|
|
13
13
|
|
|
14
|
-
const defineHandler = (handler) => handler;
|
|
15
|
-
const defineHandle = defineHandler;
|
|
16
|
-
const defineMiddleware = (middleware) => middleware;
|
|
17
|
-
function promisifyHandler(handler) {
|
|
18
|
-
return function(req, res) {
|
|
19
|
-
return callHandler(handler, req, res);
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
const promisifyHandle = promisifyHandler;
|
|
23
|
-
function callHandler(handler, req, res) {
|
|
24
|
-
const isMiddleware = handler.length > 2;
|
|
25
|
-
return new Promise((resolve, reject) => {
|
|
26
|
-
const next = (err) => {
|
|
27
|
-
if (isMiddleware) {
|
|
28
|
-
res.off("close", next);
|
|
29
|
-
res.off("error", next);
|
|
30
|
-
}
|
|
31
|
-
return err ? reject(err) : resolve(void 0);
|
|
32
|
-
};
|
|
33
|
-
try {
|
|
34
|
-
const returned = handler(req, res, next);
|
|
35
|
-
if (isMiddleware && returned === void 0) {
|
|
36
|
-
res.once("close", next);
|
|
37
|
-
res.once("error", next);
|
|
38
|
-
} else {
|
|
39
|
-
resolve(returned);
|
|
40
|
-
}
|
|
41
|
-
} catch (err) {
|
|
42
|
-
next(err);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
function defineLazyHandler(handler, promisify) {
|
|
47
|
-
let _promise;
|
|
48
|
-
const resolve = () => {
|
|
49
|
-
if (!_promise) {
|
|
50
|
-
_promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
|
|
51
|
-
}
|
|
52
|
-
return _promise;
|
|
53
|
-
};
|
|
54
|
-
return function(req, res) {
|
|
55
|
-
return resolve().then((h) => h(req, res));
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
const lazyHandle = defineLazyHandler;
|
|
59
|
-
function useBase(base, handler) {
|
|
60
|
-
base = ufo.withoutTrailingSlash(base);
|
|
61
|
-
if (!base) {
|
|
62
|
-
return handler;
|
|
63
|
-
}
|
|
64
|
-
return function(req, res) {
|
|
65
|
-
req.originalUrl = req.originalUrl || req.url || "/";
|
|
66
|
-
req.url = ufo.withoutBase(req.url || "/", base);
|
|
67
|
-
return handler(req, res);
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function defineEventHandler(handler) {
|
|
72
|
-
handler.__is_handler__ = true;
|
|
73
|
-
return handler;
|
|
74
|
-
}
|
|
75
|
-
function defineLazyEventHandler(factory) {
|
|
76
|
-
let _promise;
|
|
77
|
-
let _resolved;
|
|
78
|
-
const resolveHandler = () => {
|
|
79
|
-
if (_resolved) {
|
|
80
|
-
return Promise.resolve(_resolved);
|
|
81
|
-
}
|
|
82
|
-
if (!_promise) {
|
|
83
|
-
_promise = Promise.resolve(factory()).then((r) => {
|
|
84
|
-
const handler = r.default || r;
|
|
85
|
-
if (typeof handler !== "function") {
|
|
86
|
-
throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
|
|
87
|
-
}
|
|
88
|
-
_resolved = toEventHandler(r.default || r);
|
|
89
|
-
return _resolved;
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
return _promise;
|
|
93
|
-
};
|
|
94
|
-
return defineEventHandler((event) => {
|
|
95
|
-
if (_resolved) {
|
|
96
|
-
return _resolved(event);
|
|
97
|
-
}
|
|
98
|
-
return resolveHandler().then((handler) => handler(event));
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
function isEventHandler(input) {
|
|
102
|
-
return "__is_handler__" in input;
|
|
103
|
-
}
|
|
104
|
-
function toEventHandler(handler) {
|
|
105
|
-
if (isEventHandler(handler)) {
|
|
106
|
-
return handler;
|
|
107
|
-
}
|
|
108
|
-
if (typeof handler !== "function") {
|
|
109
|
-
throw new TypeError("Invalid handler. It should be a function:", handler);
|
|
110
|
-
}
|
|
111
|
-
return defineEventHandler((event) => {
|
|
112
|
-
return callHandler(handler, event.req, event.res);
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
function createEvent(req, res) {
|
|
116
|
-
const event = {
|
|
117
|
-
__is_event__: true,
|
|
118
|
-
req,
|
|
119
|
-
res
|
|
120
|
-
};
|
|
121
|
-
event.event = event;
|
|
122
|
-
req.event = event;
|
|
123
|
-
req.req = req;
|
|
124
|
-
req.res = res;
|
|
125
|
-
res.event = event;
|
|
126
|
-
res.res = res;
|
|
127
|
-
res.req = res.req || {};
|
|
128
|
-
res.req.res = res;
|
|
129
|
-
res.req.req = req;
|
|
130
|
-
return event;
|
|
131
|
-
}
|
|
132
|
-
function isEvent(input) {
|
|
133
|
-
return "__is_event__" in input;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
14
|
function useQuery(event) {
|
|
137
15
|
return ufo.getQuery(event.req.url || "");
|
|
138
16
|
}
|
|
@@ -200,6 +78,37 @@ async function useBody(event) {
|
|
|
200
78
|
return json;
|
|
201
79
|
}
|
|
202
80
|
|
|
81
|
+
function handleCacheHeaders(event, opts) {
|
|
82
|
+
const cacheControls = ["public"].concat(opts.cacheControls || []);
|
|
83
|
+
let cacheMatched = false;
|
|
84
|
+
if (opts.maxAge !== void 0) {
|
|
85
|
+
opts.cacheControls?.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
|
|
86
|
+
}
|
|
87
|
+
if (opts.modifiedTime) {
|
|
88
|
+
const ifModifiedSince = event.req.headers["if-modified-since"];
|
|
89
|
+
event.res.setHeader("Last-Modified", +opts.modifiedTime + "");
|
|
90
|
+
if (ifModifiedSince) {
|
|
91
|
+
if (new Date(ifModifiedSince) >= opts.modifiedTime) {
|
|
92
|
+
cacheMatched = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (opts.etag) {
|
|
97
|
+
event.res.setHeader("Etag", opts.etag);
|
|
98
|
+
const ifNonMatch = event.req.headers["if-none-match"];
|
|
99
|
+
if (ifNonMatch === opts.etag) {
|
|
100
|
+
cacheMatched = true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
event.res.setHeader("Cache-Control", cacheControls.join(", "));
|
|
104
|
+
if (cacheMatched) {
|
|
105
|
+
event.res.statusCode = 304;
|
|
106
|
+
event.res.end("");
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
|
|
203
112
|
const MIMES = {
|
|
204
113
|
html: "text/html",
|
|
205
114
|
json: "application/json"
|
|
@@ -315,6 +224,142 @@ function isError(input) {
|
|
|
315
224
|
return input instanceof H3Error;
|
|
316
225
|
}
|
|
317
226
|
|
|
227
|
+
const defineHandler = (handler) => handler;
|
|
228
|
+
const defineHandle = defineHandler;
|
|
229
|
+
const defineMiddleware = (middleware) => middleware;
|
|
230
|
+
function promisifyHandler(handler) {
|
|
231
|
+
return function(req, res) {
|
|
232
|
+
return callHandler(handler, req, res);
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const promisifyHandle = promisifyHandler;
|
|
236
|
+
function callHandler(handler, req, res) {
|
|
237
|
+
const isMiddleware = handler.length > 2;
|
|
238
|
+
return new Promise((resolve, reject) => {
|
|
239
|
+
const next = (err) => {
|
|
240
|
+
if (isMiddleware) {
|
|
241
|
+
res.off("close", next);
|
|
242
|
+
res.off("error", next);
|
|
243
|
+
}
|
|
244
|
+
return err ? reject(createError(err)) : resolve(void 0);
|
|
245
|
+
};
|
|
246
|
+
try {
|
|
247
|
+
const returned = handler(req, res, next);
|
|
248
|
+
if (isMiddleware && returned === void 0) {
|
|
249
|
+
res.once("close", next);
|
|
250
|
+
res.once("error", next);
|
|
251
|
+
} else {
|
|
252
|
+
resolve(returned);
|
|
253
|
+
}
|
|
254
|
+
} catch (err) {
|
|
255
|
+
next(err);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
function defineLazyHandler(handler, promisify) {
|
|
260
|
+
let _promise;
|
|
261
|
+
const resolve = () => {
|
|
262
|
+
if (!_promise) {
|
|
263
|
+
_promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
|
|
264
|
+
}
|
|
265
|
+
return _promise;
|
|
266
|
+
};
|
|
267
|
+
return function(req, res) {
|
|
268
|
+
return resolve().then((h) => h(req, res));
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
const lazyHandle = defineLazyHandler;
|
|
272
|
+
function useBase(base, handler) {
|
|
273
|
+
base = ufo.withoutTrailingSlash(base);
|
|
274
|
+
if (!base) {
|
|
275
|
+
return handler;
|
|
276
|
+
}
|
|
277
|
+
return function(req, res) {
|
|
278
|
+
req.originalUrl = req.originalUrl || req.url || "/";
|
|
279
|
+
req.url = ufo.withoutBase(req.url || "/", base);
|
|
280
|
+
return handler(req, res);
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function defineEventHandler(handler) {
|
|
285
|
+
handler.__is_handler__ = true;
|
|
286
|
+
return handler;
|
|
287
|
+
}
|
|
288
|
+
const eventHandler = defineEventHandler;
|
|
289
|
+
function defineLazyEventHandler(factory) {
|
|
290
|
+
let _promise;
|
|
291
|
+
let _resolved;
|
|
292
|
+
const resolveHandler = () => {
|
|
293
|
+
if (_resolved) {
|
|
294
|
+
return Promise.resolve(_resolved);
|
|
295
|
+
}
|
|
296
|
+
if (!_promise) {
|
|
297
|
+
_promise = Promise.resolve(factory()).then((r) => {
|
|
298
|
+
const handler = r.default || r;
|
|
299
|
+
if (typeof handler !== "function") {
|
|
300
|
+
throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
|
|
301
|
+
}
|
|
302
|
+
_resolved = toEventHandler(r.default || r);
|
|
303
|
+
return _resolved;
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
return _promise;
|
|
307
|
+
};
|
|
308
|
+
return eventHandler((event) => {
|
|
309
|
+
if (_resolved) {
|
|
310
|
+
return _resolved(event);
|
|
311
|
+
}
|
|
312
|
+
return resolveHandler().then((handler) => handler(event));
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
const lazyEventHandler = defineLazyEventHandler;
|
|
316
|
+
function dynamicEventHandler(initial) {
|
|
317
|
+
let current = initial;
|
|
318
|
+
const wrapper = eventHandler((event) => {
|
|
319
|
+
if (current) {
|
|
320
|
+
return current(event);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
wrapper.set = (handler) => {
|
|
324
|
+
current = handler;
|
|
325
|
+
};
|
|
326
|
+
return wrapper;
|
|
327
|
+
}
|
|
328
|
+
function isEventHandler(input) {
|
|
329
|
+
return "__is_handler__" in input;
|
|
330
|
+
}
|
|
331
|
+
function toEventHandler(handler) {
|
|
332
|
+
if (isEventHandler(handler)) {
|
|
333
|
+
return handler;
|
|
334
|
+
}
|
|
335
|
+
if (typeof handler !== "function") {
|
|
336
|
+
throw new TypeError("Invalid handler. It should be a function:", handler);
|
|
337
|
+
}
|
|
338
|
+
return eventHandler((event) => {
|
|
339
|
+
return callHandler(handler, event.req, event.res);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
function createEvent(req, res) {
|
|
343
|
+
const event = {
|
|
344
|
+
__is_event__: true,
|
|
345
|
+
req,
|
|
346
|
+
res
|
|
347
|
+
};
|
|
348
|
+
event.event = event;
|
|
349
|
+
req.event = event;
|
|
350
|
+
req.req = req;
|
|
351
|
+
req.res = res;
|
|
352
|
+
res.event = event;
|
|
353
|
+
res.res = res;
|
|
354
|
+
res.req = res.req || {};
|
|
355
|
+
res.req.res = res;
|
|
356
|
+
res.req.req = req;
|
|
357
|
+
return event;
|
|
358
|
+
}
|
|
359
|
+
function isEvent(input) {
|
|
360
|
+
return "__is_event__" in input;
|
|
361
|
+
}
|
|
362
|
+
|
|
318
363
|
function createApp(options = {}) {
|
|
319
364
|
const stack = [];
|
|
320
365
|
const handler = createAppEventHandler(stack, options);
|
|
@@ -356,7 +401,7 @@ function use(app, arg1, arg2, arg3) {
|
|
|
356
401
|
}
|
|
357
402
|
function createAppEventHandler(stack, options) {
|
|
358
403
|
const spacing = options.debug ? 2 : void 0;
|
|
359
|
-
return
|
|
404
|
+
return eventHandler(async (event) => {
|
|
360
405
|
event.req.originalUrl = event.req.originalUrl || event.req.url || "/";
|
|
361
406
|
const reqUrl = event.req.url || "/";
|
|
362
407
|
for (const layer of stack) {
|
|
@@ -401,7 +446,7 @@ function normalizeLayer(input) {
|
|
|
401
446
|
handler = handler.handler;
|
|
402
447
|
}
|
|
403
448
|
if (input.lazy) {
|
|
404
|
-
handler =
|
|
449
|
+
handler = lazyEventHandler(handler);
|
|
405
450
|
} else if (!isEventHandler(handler)) {
|
|
406
451
|
handler = toEventHandler(handler);
|
|
407
452
|
}
|
|
@@ -430,7 +475,7 @@ function createRouter() {
|
|
|
430
475
|
for (const method of RouterMethods) {
|
|
431
476
|
router[method] = (path, handle) => router.add(path, handle, method);
|
|
432
477
|
}
|
|
433
|
-
router.handler =
|
|
478
|
+
router.handler = eventHandler((event) => {
|
|
434
479
|
let path = event.req.url || "/";
|
|
435
480
|
const queryUrlIndex = path.lastIndexOf("?");
|
|
436
481
|
if (queryUrlIndex > -1) {
|
|
@@ -478,11 +523,15 @@ exports.defineLazyEventHandler = defineLazyEventHandler;
|
|
|
478
523
|
exports.defineLazyHandler = defineLazyHandler;
|
|
479
524
|
exports.defineMiddleware = defineMiddleware;
|
|
480
525
|
exports.deleteCookie = deleteCookie;
|
|
526
|
+
exports.dynamicEventHandler = dynamicEventHandler;
|
|
527
|
+
exports.eventHandler = eventHandler;
|
|
528
|
+
exports.handleCacheHeaders = handleCacheHeaders;
|
|
481
529
|
exports.isError = isError;
|
|
482
530
|
exports.isEvent = isEvent;
|
|
483
531
|
exports.isEventHandler = isEventHandler;
|
|
484
532
|
exports.isMethod = isMethod;
|
|
485
533
|
exports.isStream = isStream;
|
|
534
|
+
exports.lazyEventHandler = lazyEventHandler;
|
|
486
535
|
exports.lazyHandle = lazyHandle;
|
|
487
536
|
exports.promisifyHandle = promisifyHandle;
|
|
488
537
|
exports.promisifyHandler = promisifyHandler;
|
package/dist/index.d.ts
CHANGED
|
@@ -7,9 +7,7 @@ interface H3Event {
|
|
|
7
7
|
event: H3Event;
|
|
8
8
|
req: IncomingMessage;
|
|
9
9
|
res: ServerResponse;
|
|
10
|
-
/**
|
|
11
|
-
* Request params only filled with h3 Router handlers
|
|
12
|
-
*/
|
|
10
|
+
/** Request params only filled with h3 Router handlers */
|
|
13
11
|
params?: Record<string, any>;
|
|
14
12
|
}
|
|
15
13
|
declare type CompatibilityEvent = H3Event | IncomingMessage | ServerResponse;
|
|
@@ -21,27 +19,35 @@ interface EventHandler {
|
|
|
21
19
|
(event: CompatibilityEvent): H3Response | Promise<H3Response>;
|
|
22
20
|
}
|
|
23
21
|
declare function defineEventHandler(handler: EventHandler): EventHandler;
|
|
22
|
+
declare const eventHandler: typeof defineEventHandler;
|
|
24
23
|
declare type LazyEventHandler = () => EventHandler | Promise<EventHandler>;
|
|
25
24
|
declare function defineLazyEventHandler(factory: LazyEventHandler): EventHandler;
|
|
25
|
+
declare const lazyEventHandler: typeof defineLazyEventHandler;
|
|
26
|
+
interface DynamicEventHandler extends EventHandler {
|
|
27
|
+
set: (handler: EventHandler) => void;
|
|
28
|
+
}
|
|
29
|
+
declare function dynamicEventHandler(initial?: EventHandler): DynamicEventHandler;
|
|
26
30
|
declare function isEventHandler(input: any): input is EventHandler;
|
|
27
31
|
declare type CompatibilityEventHandler = EventHandler | Handler | Middleware;
|
|
28
32
|
declare function toEventHandler(handler: CompatibilityEventHandler): EventHandler;
|
|
29
33
|
declare function createEvent(req: http.IncomingMessage, res: http.ServerResponse): CompatibilityEvent;
|
|
30
34
|
declare function isEvent(input: any): input is H3Event;
|
|
31
35
|
|
|
32
|
-
interface
|
|
33
|
-
originalUrl?: string;
|
|
36
|
+
interface CompatibilityRequestProps {
|
|
34
37
|
event: H3Event;
|
|
38
|
+
/** Only available with connect and press */
|
|
39
|
+
originalUrl?: string;
|
|
40
|
+
/** Request params only filled with h3 Router handlers */
|
|
41
|
+
params?: Record<string, any>;
|
|
42
|
+
}
|
|
43
|
+
interface IncomingMessage extends http.IncomingMessage, CompatibilityRequestProps {
|
|
35
44
|
req: H3Event['req'];
|
|
36
45
|
res: H3Event['res'];
|
|
37
46
|
}
|
|
38
47
|
interface ServerResponse extends http.ServerResponse {
|
|
39
48
|
event: H3Event;
|
|
40
49
|
res: H3Event['res'];
|
|
41
|
-
req: http.ServerResponse['req'] &
|
|
42
|
-
event: H3Event;
|
|
43
|
-
originalUrl?: string;
|
|
44
|
-
};
|
|
50
|
+
req: http.ServerResponse['req'] & CompatibilityRequestProps;
|
|
45
51
|
}
|
|
46
52
|
declare type Handler<T = any, ReqT = {}> = (req: IncomingMessage & ReqT, res: ServerResponse) => T;
|
|
47
53
|
declare type PromisifiedHandler = Handler<Promise<any>>;
|
|
@@ -157,6 +163,19 @@ declare function useRawBody(event: CompatibilityEvent, encoding?: Encoding): Enc
|
|
|
157
163
|
*/
|
|
158
164
|
declare function useBody<T = any>(event: CompatibilityEvent): Promise<T>;
|
|
159
165
|
|
|
166
|
+
interface CacheConditions {
|
|
167
|
+
modifiedTime?: Date;
|
|
168
|
+
maxAge?: number;
|
|
169
|
+
etag?: string;
|
|
170
|
+
cacheControls?: string[];
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check request caching headers (`If-Modified-Since`) and add caching headers (Last-Modified, Cache-Control)
|
|
174
|
+
* Note: `public` cache control will be added by default
|
|
175
|
+
* @returns `true` when cache headers are matching. When `true` is returned, no reponse should be sent anymore
|
|
176
|
+
*/
|
|
177
|
+
declare function handleCacheHeaders(event: CompatibilityEvent, opts: CacheConditions): boolean;
|
|
178
|
+
|
|
160
179
|
declare const MIMES: {
|
|
161
180
|
html: string;
|
|
162
181
|
json: string;
|
|
@@ -225,4 +244,4 @@ interface Router extends AddRouteShortcuts {
|
|
|
225
244
|
}
|
|
226
245
|
declare function createRouter(): Router;
|
|
227
246
|
|
|
228
|
-
export { AddRouteShortcuts, App, AppOptions, AppUse, CompatibilityEvent, CompatibilityEventHandler, Encoding, EventHandler, H3Error, H3Event, H3Response, HTTPMethod, Handler, IncomingMessage, InputLayer, InputStack, JSONValue, Layer, LazyEventHandler, LazyHandler, MIMES, Matcher, Middleware, NodeHandler, PromisifiedHandler, Router, RouterMethod, RouterUse, ServerResponse, Stack, _JSONValue, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, isError, isEvent, isEventHandler, isMethod, isStream, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
|
|
247
|
+
export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CompatibilityEvent, CompatibilityEventHandler, DynamicEventHandler, Encoding, EventHandler, H3Error, H3Event, H3Response, HTTPMethod, Handler, IncomingMessage, InputLayer, InputStack, JSONValue, Layer, LazyEventHandler, LazyHandler, MIMES, Matcher, Middleware, NodeHandler, PromisifiedHandler, Router, RouterMethod, RouterUse, ServerResponse, Stack, _JSONValue, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, dynamicEventHandler, eventHandler, handleCacheHeaders, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
|
package/dist/index.mjs
CHANGED
|
@@ -1,130 +1,8 @@
|
|
|
1
|
-
import { withoutTrailingSlash, withoutBase
|
|
1
|
+
import { getQuery, withoutTrailingSlash, withoutBase } from 'ufo';
|
|
2
2
|
import { createRouter as createRouter$1 } from 'radix3';
|
|
3
3
|
import destr from 'destr';
|
|
4
4
|
import { parse, serialize } from 'cookie-es';
|
|
5
5
|
|
|
6
|
-
const defineHandler = (handler) => handler;
|
|
7
|
-
const defineHandle = defineHandler;
|
|
8
|
-
const defineMiddleware = (middleware) => middleware;
|
|
9
|
-
function promisifyHandler(handler) {
|
|
10
|
-
return function(req, res) {
|
|
11
|
-
return callHandler(handler, req, res);
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
const promisifyHandle = promisifyHandler;
|
|
15
|
-
function callHandler(handler, req, res) {
|
|
16
|
-
const isMiddleware = handler.length > 2;
|
|
17
|
-
return new Promise((resolve, reject) => {
|
|
18
|
-
const next = (err) => {
|
|
19
|
-
if (isMiddleware) {
|
|
20
|
-
res.off("close", next);
|
|
21
|
-
res.off("error", next);
|
|
22
|
-
}
|
|
23
|
-
return err ? reject(err) : resolve(void 0);
|
|
24
|
-
};
|
|
25
|
-
try {
|
|
26
|
-
const returned = handler(req, res, next);
|
|
27
|
-
if (isMiddleware && returned === void 0) {
|
|
28
|
-
res.once("close", next);
|
|
29
|
-
res.once("error", next);
|
|
30
|
-
} else {
|
|
31
|
-
resolve(returned);
|
|
32
|
-
}
|
|
33
|
-
} catch (err) {
|
|
34
|
-
next(err);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
function defineLazyHandler(handler, promisify) {
|
|
39
|
-
let _promise;
|
|
40
|
-
const resolve = () => {
|
|
41
|
-
if (!_promise) {
|
|
42
|
-
_promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
|
|
43
|
-
}
|
|
44
|
-
return _promise;
|
|
45
|
-
};
|
|
46
|
-
return function(req, res) {
|
|
47
|
-
return resolve().then((h) => h(req, res));
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
const lazyHandle = defineLazyHandler;
|
|
51
|
-
function useBase(base, handler) {
|
|
52
|
-
base = withoutTrailingSlash(base);
|
|
53
|
-
if (!base) {
|
|
54
|
-
return handler;
|
|
55
|
-
}
|
|
56
|
-
return function(req, res) {
|
|
57
|
-
req.originalUrl = req.originalUrl || req.url || "/";
|
|
58
|
-
req.url = withoutBase(req.url || "/", base);
|
|
59
|
-
return handler(req, res);
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function defineEventHandler(handler) {
|
|
64
|
-
handler.__is_handler__ = true;
|
|
65
|
-
return handler;
|
|
66
|
-
}
|
|
67
|
-
function defineLazyEventHandler(factory) {
|
|
68
|
-
let _promise;
|
|
69
|
-
let _resolved;
|
|
70
|
-
const resolveHandler = () => {
|
|
71
|
-
if (_resolved) {
|
|
72
|
-
return Promise.resolve(_resolved);
|
|
73
|
-
}
|
|
74
|
-
if (!_promise) {
|
|
75
|
-
_promise = Promise.resolve(factory()).then((r) => {
|
|
76
|
-
const handler = r.default || r;
|
|
77
|
-
if (typeof handler !== "function") {
|
|
78
|
-
throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
|
|
79
|
-
}
|
|
80
|
-
_resolved = toEventHandler(r.default || r);
|
|
81
|
-
return _resolved;
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
return _promise;
|
|
85
|
-
};
|
|
86
|
-
return defineEventHandler((event) => {
|
|
87
|
-
if (_resolved) {
|
|
88
|
-
return _resolved(event);
|
|
89
|
-
}
|
|
90
|
-
return resolveHandler().then((handler) => handler(event));
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
function isEventHandler(input) {
|
|
94
|
-
return "__is_handler__" in input;
|
|
95
|
-
}
|
|
96
|
-
function toEventHandler(handler) {
|
|
97
|
-
if (isEventHandler(handler)) {
|
|
98
|
-
return handler;
|
|
99
|
-
}
|
|
100
|
-
if (typeof handler !== "function") {
|
|
101
|
-
throw new TypeError("Invalid handler. It should be a function:", handler);
|
|
102
|
-
}
|
|
103
|
-
return defineEventHandler((event) => {
|
|
104
|
-
return callHandler(handler, event.req, event.res);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
function createEvent(req, res) {
|
|
108
|
-
const event = {
|
|
109
|
-
__is_event__: true,
|
|
110
|
-
req,
|
|
111
|
-
res
|
|
112
|
-
};
|
|
113
|
-
event.event = event;
|
|
114
|
-
req.event = event;
|
|
115
|
-
req.req = req;
|
|
116
|
-
req.res = res;
|
|
117
|
-
res.event = event;
|
|
118
|
-
res.res = res;
|
|
119
|
-
res.req = res.req || {};
|
|
120
|
-
res.req.res = res;
|
|
121
|
-
res.req.req = req;
|
|
122
|
-
return event;
|
|
123
|
-
}
|
|
124
|
-
function isEvent(input) {
|
|
125
|
-
return "__is_event__" in input;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
6
|
function useQuery(event) {
|
|
129
7
|
return getQuery(event.req.url || "");
|
|
130
8
|
}
|
|
@@ -192,6 +70,37 @@ async function useBody(event) {
|
|
|
192
70
|
return json;
|
|
193
71
|
}
|
|
194
72
|
|
|
73
|
+
function handleCacheHeaders(event, opts) {
|
|
74
|
+
const cacheControls = ["public"].concat(opts.cacheControls || []);
|
|
75
|
+
let cacheMatched = false;
|
|
76
|
+
if (opts.maxAge !== void 0) {
|
|
77
|
+
opts.cacheControls?.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
|
|
78
|
+
}
|
|
79
|
+
if (opts.modifiedTime) {
|
|
80
|
+
const ifModifiedSince = event.req.headers["if-modified-since"];
|
|
81
|
+
event.res.setHeader("Last-Modified", +opts.modifiedTime + "");
|
|
82
|
+
if (ifModifiedSince) {
|
|
83
|
+
if (new Date(ifModifiedSince) >= opts.modifiedTime) {
|
|
84
|
+
cacheMatched = true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (opts.etag) {
|
|
89
|
+
event.res.setHeader("Etag", opts.etag);
|
|
90
|
+
const ifNonMatch = event.req.headers["if-none-match"];
|
|
91
|
+
if (ifNonMatch === opts.etag) {
|
|
92
|
+
cacheMatched = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
event.res.setHeader("Cache-Control", cacheControls.join(", "));
|
|
96
|
+
if (cacheMatched) {
|
|
97
|
+
event.res.statusCode = 304;
|
|
98
|
+
event.res.end("");
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
|
|
195
104
|
const MIMES = {
|
|
196
105
|
html: "text/html",
|
|
197
106
|
json: "application/json"
|
|
@@ -307,6 +216,142 @@ function isError(input) {
|
|
|
307
216
|
return input instanceof H3Error;
|
|
308
217
|
}
|
|
309
218
|
|
|
219
|
+
const defineHandler = (handler) => handler;
|
|
220
|
+
const defineHandle = defineHandler;
|
|
221
|
+
const defineMiddleware = (middleware) => middleware;
|
|
222
|
+
function promisifyHandler(handler) {
|
|
223
|
+
return function(req, res) {
|
|
224
|
+
return callHandler(handler, req, res);
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
const promisifyHandle = promisifyHandler;
|
|
228
|
+
function callHandler(handler, req, res) {
|
|
229
|
+
const isMiddleware = handler.length > 2;
|
|
230
|
+
return new Promise((resolve, reject) => {
|
|
231
|
+
const next = (err) => {
|
|
232
|
+
if (isMiddleware) {
|
|
233
|
+
res.off("close", next);
|
|
234
|
+
res.off("error", next);
|
|
235
|
+
}
|
|
236
|
+
return err ? reject(createError(err)) : resolve(void 0);
|
|
237
|
+
};
|
|
238
|
+
try {
|
|
239
|
+
const returned = handler(req, res, next);
|
|
240
|
+
if (isMiddleware && returned === void 0) {
|
|
241
|
+
res.once("close", next);
|
|
242
|
+
res.once("error", next);
|
|
243
|
+
} else {
|
|
244
|
+
resolve(returned);
|
|
245
|
+
}
|
|
246
|
+
} catch (err) {
|
|
247
|
+
next(err);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
function defineLazyHandler(handler, promisify) {
|
|
252
|
+
let _promise;
|
|
253
|
+
const resolve = () => {
|
|
254
|
+
if (!_promise) {
|
|
255
|
+
_promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
|
|
256
|
+
}
|
|
257
|
+
return _promise;
|
|
258
|
+
};
|
|
259
|
+
return function(req, res) {
|
|
260
|
+
return resolve().then((h) => h(req, res));
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const lazyHandle = defineLazyHandler;
|
|
264
|
+
function useBase(base, handler) {
|
|
265
|
+
base = withoutTrailingSlash(base);
|
|
266
|
+
if (!base) {
|
|
267
|
+
return handler;
|
|
268
|
+
}
|
|
269
|
+
return function(req, res) {
|
|
270
|
+
req.originalUrl = req.originalUrl || req.url || "/";
|
|
271
|
+
req.url = withoutBase(req.url || "/", base);
|
|
272
|
+
return handler(req, res);
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function defineEventHandler(handler) {
|
|
277
|
+
handler.__is_handler__ = true;
|
|
278
|
+
return handler;
|
|
279
|
+
}
|
|
280
|
+
const eventHandler = defineEventHandler;
|
|
281
|
+
function defineLazyEventHandler(factory) {
|
|
282
|
+
let _promise;
|
|
283
|
+
let _resolved;
|
|
284
|
+
const resolveHandler = () => {
|
|
285
|
+
if (_resolved) {
|
|
286
|
+
return Promise.resolve(_resolved);
|
|
287
|
+
}
|
|
288
|
+
if (!_promise) {
|
|
289
|
+
_promise = Promise.resolve(factory()).then((r) => {
|
|
290
|
+
const handler = r.default || r;
|
|
291
|
+
if (typeof handler !== "function") {
|
|
292
|
+
throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
|
|
293
|
+
}
|
|
294
|
+
_resolved = toEventHandler(r.default || r);
|
|
295
|
+
return _resolved;
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
return _promise;
|
|
299
|
+
};
|
|
300
|
+
return eventHandler((event) => {
|
|
301
|
+
if (_resolved) {
|
|
302
|
+
return _resolved(event);
|
|
303
|
+
}
|
|
304
|
+
return resolveHandler().then((handler) => handler(event));
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
const lazyEventHandler = defineLazyEventHandler;
|
|
308
|
+
function dynamicEventHandler(initial) {
|
|
309
|
+
let current = initial;
|
|
310
|
+
const wrapper = eventHandler((event) => {
|
|
311
|
+
if (current) {
|
|
312
|
+
return current(event);
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
wrapper.set = (handler) => {
|
|
316
|
+
current = handler;
|
|
317
|
+
};
|
|
318
|
+
return wrapper;
|
|
319
|
+
}
|
|
320
|
+
function isEventHandler(input) {
|
|
321
|
+
return "__is_handler__" in input;
|
|
322
|
+
}
|
|
323
|
+
function toEventHandler(handler) {
|
|
324
|
+
if (isEventHandler(handler)) {
|
|
325
|
+
return handler;
|
|
326
|
+
}
|
|
327
|
+
if (typeof handler !== "function") {
|
|
328
|
+
throw new TypeError("Invalid handler. It should be a function:", handler);
|
|
329
|
+
}
|
|
330
|
+
return eventHandler((event) => {
|
|
331
|
+
return callHandler(handler, event.req, event.res);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
function createEvent(req, res) {
|
|
335
|
+
const event = {
|
|
336
|
+
__is_event__: true,
|
|
337
|
+
req,
|
|
338
|
+
res
|
|
339
|
+
};
|
|
340
|
+
event.event = event;
|
|
341
|
+
req.event = event;
|
|
342
|
+
req.req = req;
|
|
343
|
+
req.res = res;
|
|
344
|
+
res.event = event;
|
|
345
|
+
res.res = res;
|
|
346
|
+
res.req = res.req || {};
|
|
347
|
+
res.req.res = res;
|
|
348
|
+
res.req.req = req;
|
|
349
|
+
return event;
|
|
350
|
+
}
|
|
351
|
+
function isEvent(input) {
|
|
352
|
+
return "__is_event__" in input;
|
|
353
|
+
}
|
|
354
|
+
|
|
310
355
|
function createApp(options = {}) {
|
|
311
356
|
const stack = [];
|
|
312
357
|
const handler = createAppEventHandler(stack, options);
|
|
@@ -348,7 +393,7 @@ function use(app, arg1, arg2, arg3) {
|
|
|
348
393
|
}
|
|
349
394
|
function createAppEventHandler(stack, options) {
|
|
350
395
|
const spacing = options.debug ? 2 : void 0;
|
|
351
|
-
return
|
|
396
|
+
return eventHandler(async (event) => {
|
|
352
397
|
event.req.originalUrl = event.req.originalUrl || event.req.url || "/";
|
|
353
398
|
const reqUrl = event.req.url || "/";
|
|
354
399
|
for (const layer of stack) {
|
|
@@ -393,7 +438,7 @@ function normalizeLayer(input) {
|
|
|
393
438
|
handler = handler.handler;
|
|
394
439
|
}
|
|
395
440
|
if (input.lazy) {
|
|
396
|
-
handler =
|
|
441
|
+
handler = lazyEventHandler(handler);
|
|
397
442
|
} else if (!isEventHandler(handler)) {
|
|
398
443
|
handler = toEventHandler(handler);
|
|
399
444
|
}
|
|
@@ -422,7 +467,7 @@ function createRouter() {
|
|
|
422
467
|
for (const method of RouterMethods) {
|
|
423
468
|
router[method] = (path, handle) => router.add(path, handle, method);
|
|
424
469
|
}
|
|
425
|
-
router.handler =
|
|
470
|
+
router.handler = eventHandler((event) => {
|
|
426
471
|
let path = event.req.url || "/";
|
|
427
472
|
const queryUrlIndex = path.lastIndexOf("?");
|
|
428
473
|
if (queryUrlIndex > -1) {
|
|
@@ -452,4 +497,4 @@ function createRouter() {
|
|
|
452
497
|
return router;
|
|
453
498
|
}
|
|
454
499
|
|
|
455
|
-
export { H3Error, MIMES, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, isError, isEvent, isEventHandler, isMethod, isStream, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
|
|
500
|
+
export { H3Error, MIMES, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, dynamicEventHandler, eventHandler, handleCacheHeaders, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
|