h3 0.5.5 → 0.6.0
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 +40 -5
- package/dist/index.d.ts +28 -17
- package/dist/index.mjs +40 -6
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -78,6 +78,37 @@ async function useBody(event) {
|
|
|
78
78
|
return json;
|
|
79
79
|
}
|
|
80
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
|
+
|
|
81
112
|
const MIMES = {
|
|
82
113
|
html: "text/html",
|
|
83
114
|
json: "application/json"
|
|
@@ -134,7 +165,10 @@ function useCookie(event, name) {
|
|
|
134
165
|
return useCookies(event)[name];
|
|
135
166
|
}
|
|
136
167
|
function setCookie(event, name, value, serializeOptions) {
|
|
137
|
-
const cookieStr = cookieEs.serialize(name, value,
|
|
168
|
+
const cookieStr = cookieEs.serialize(name, value, {
|
|
169
|
+
path: "/",
|
|
170
|
+
...serializeOptions
|
|
171
|
+
});
|
|
138
172
|
appendHeader(event, "Set-Cookie", cookieStr);
|
|
139
173
|
}
|
|
140
174
|
function deleteCookie(event, name, serializeOptions) {
|
|
@@ -250,12 +284,12 @@ function useBase(base, handler) {
|
|
|
250
284
|
};
|
|
251
285
|
}
|
|
252
286
|
|
|
253
|
-
function
|
|
287
|
+
function defineEventHandler(handler) {
|
|
254
288
|
handler.__is_handler__ = true;
|
|
255
289
|
return handler;
|
|
256
290
|
}
|
|
257
|
-
const
|
|
258
|
-
function
|
|
291
|
+
const eventHandler = defineEventHandler;
|
|
292
|
+
function defineLazyEventHandler(factory) {
|
|
259
293
|
let _promise;
|
|
260
294
|
let _resolved;
|
|
261
295
|
const resolveHandler = () => {
|
|
@@ -281,7 +315,7 @@ function lazyEventHandler(factory) {
|
|
|
281
315
|
return resolveHandler().then((handler) => handler(event));
|
|
282
316
|
});
|
|
283
317
|
}
|
|
284
|
-
const
|
|
318
|
+
const lazyEventHandler = defineLazyEventHandler;
|
|
285
319
|
function dynamicEventHandler(initial) {
|
|
286
320
|
let current = initial;
|
|
287
321
|
const wrapper = eventHandler((event) => {
|
|
@@ -494,6 +528,7 @@ exports.defineMiddleware = defineMiddleware;
|
|
|
494
528
|
exports.deleteCookie = deleteCookie;
|
|
495
529
|
exports.dynamicEventHandler = dynamicEventHandler;
|
|
496
530
|
exports.eventHandler = eventHandler;
|
|
531
|
+
exports.handleCacheHeaders = handleCacheHeaders;
|
|
497
532
|
exports.isError = isError;
|
|
498
533
|
exports.isEvent = isEvent;
|
|
499
534
|
exports.isEventHandler = isEventHandler;
|
package/dist/index.d.ts
CHANGED
|
@@ -7,12 +7,10 @@ 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
|
-
declare type CompatibilityEvent = H3Event | IncomingMessage
|
|
13
|
+
declare type CompatibilityEvent = H3Event | IncomingMessage;
|
|
16
14
|
declare type _JSONValue<T = string | number | boolean> = T | T[] | Record<string, T>;
|
|
17
15
|
declare type JSONValue = _JSONValue<_JSONValue>;
|
|
18
16
|
declare type H3Response = void | JSONValue | Buffer;
|
|
@@ -20,13 +18,11 @@ interface EventHandler {
|
|
|
20
18
|
'__is_handler__'?: true;
|
|
21
19
|
(event: CompatibilityEvent): H3Response | Promise<H3Response>;
|
|
22
20
|
}
|
|
23
|
-
declare function
|
|
24
|
-
|
|
25
|
-
declare const defineEventHandler: typeof eventHandler;
|
|
21
|
+
declare function defineEventHandler(handler: EventHandler): EventHandler;
|
|
22
|
+
declare const eventHandler: typeof defineEventHandler;
|
|
26
23
|
declare type LazyEventHandler = () => EventHandler | Promise<EventHandler>;
|
|
27
|
-
declare function
|
|
28
|
-
|
|
29
|
-
declare const defineLazyEventHandler: typeof lazyEventHandler;
|
|
24
|
+
declare function defineLazyEventHandler(factory: LazyEventHandler): EventHandler;
|
|
25
|
+
declare const lazyEventHandler: typeof defineLazyEventHandler;
|
|
30
26
|
interface DynamicEventHandler extends EventHandler {
|
|
31
27
|
set: (handler: EventHandler) => void;
|
|
32
28
|
}
|
|
@@ -37,19 +33,21 @@ declare function toEventHandler(handler: CompatibilityEventHandler): EventHandle
|
|
|
37
33
|
declare function createEvent(req: http.IncomingMessage, res: http.ServerResponse): CompatibilityEvent;
|
|
38
34
|
declare function isEvent(input: any): input is H3Event;
|
|
39
35
|
|
|
40
|
-
interface
|
|
41
|
-
originalUrl?: string;
|
|
36
|
+
interface CompatibilityRequestProps {
|
|
42
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 {
|
|
43
44
|
req: H3Event['req'];
|
|
44
45
|
res: H3Event['res'];
|
|
45
46
|
}
|
|
46
47
|
interface ServerResponse extends http.ServerResponse {
|
|
47
48
|
event: H3Event;
|
|
48
49
|
res: H3Event['res'];
|
|
49
|
-
req: http.ServerResponse['req'] &
|
|
50
|
-
event: H3Event;
|
|
51
|
-
originalUrl?: string;
|
|
52
|
-
};
|
|
50
|
+
req: http.ServerResponse['req'] & CompatibilityRequestProps;
|
|
53
51
|
}
|
|
54
52
|
declare type Handler<T = any, ReqT = {}> = (req: IncomingMessage & ReqT, res: ServerResponse) => T;
|
|
55
53
|
declare type PromisifiedHandler = Handler<Promise<any>>;
|
|
@@ -165,6 +163,19 @@ declare function useRawBody(event: CompatibilityEvent, encoding?: Encoding): Enc
|
|
|
165
163
|
*/
|
|
166
164
|
declare function useBody<T = any>(event: CompatibilityEvent): Promise<T>;
|
|
167
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
|
+
|
|
168
179
|
declare const MIMES: {
|
|
169
180
|
html: string;
|
|
170
181
|
json: string;
|
|
@@ -233,4 +244,4 @@ interface Router extends AddRouteShortcuts {
|
|
|
233
244
|
}
|
|
234
245
|
declare function createRouter(): Router;
|
|
235
246
|
|
|
236
|
-
export { AddRouteShortcuts, App, AppOptions, AppUse, 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, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, 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
|
@@ -70,6 +70,37 @@ async function useBody(event) {
|
|
|
70
70
|
return json;
|
|
71
71
|
}
|
|
72
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
|
+
|
|
73
104
|
const MIMES = {
|
|
74
105
|
html: "text/html",
|
|
75
106
|
json: "application/json"
|
|
@@ -126,7 +157,10 @@ function useCookie(event, name) {
|
|
|
126
157
|
return useCookies(event)[name];
|
|
127
158
|
}
|
|
128
159
|
function setCookie(event, name, value, serializeOptions) {
|
|
129
|
-
const cookieStr = serialize(name, value,
|
|
160
|
+
const cookieStr = serialize(name, value, {
|
|
161
|
+
path: "/",
|
|
162
|
+
...serializeOptions
|
|
163
|
+
});
|
|
130
164
|
appendHeader(event, "Set-Cookie", cookieStr);
|
|
131
165
|
}
|
|
132
166
|
function deleteCookie(event, name, serializeOptions) {
|
|
@@ -242,12 +276,12 @@ function useBase(base, handler) {
|
|
|
242
276
|
};
|
|
243
277
|
}
|
|
244
278
|
|
|
245
|
-
function
|
|
279
|
+
function defineEventHandler(handler) {
|
|
246
280
|
handler.__is_handler__ = true;
|
|
247
281
|
return handler;
|
|
248
282
|
}
|
|
249
|
-
const
|
|
250
|
-
function
|
|
283
|
+
const eventHandler = defineEventHandler;
|
|
284
|
+
function defineLazyEventHandler(factory) {
|
|
251
285
|
let _promise;
|
|
252
286
|
let _resolved;
|
|
253
287
|
const resolveHandler = () => {
|
|
@@ -273,7 +307,7 @@ function lazyEventHandler(factory) {
|
|
|
273
307
|
return resolveHandler().then((handler) => handler(event));
|
|
274
308
|
});
|
|
275
309
|
}
|
|
276
|
-
const
|
|
310
|
+
const lazyEventHandler = defineLazyEventHandler;
|
|
277
311
|
function dynamicEventHandler(initial) {
|
|
278
312
|
let current = initial;
|
|
279
313
|
const wrapper = eventHandler((event) => {
|
|
@@ -466,4 +500,4 @@ function createRouter() {
|
|
|
466
500
|
return router;
|
|
467
501
|
}
|
|
468
502
|
|
|
469
|
-
export { H3Error, MIMES, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, dynamicEventHandler, eventHandler, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
|
|
503
|
+
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 };
|