@taserjs/router 0.1.13 → 0.2.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/README.md +5 -5
- package/dist/builder-BNkN_JKi.cjs +284 -0
- package/dist/builder-DObEWeC0.js +227 -0
- package/dist/builder-DObEWeC0.js.map +1 -0
- package/dist/hono-Ddk3waH-.cjs +42 -0
- package/dist/hono-kDZSomjd.js +39 -0
- package/dist/hono-kDZSomjd.js.map +1 -0
- package/dist/index.cjs +60 -0
- package/dist/index.d.cts +105 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +105 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/body-limit.cjs +15 -0
- package/dist/middleware/body-limit.d.cts +11 -0
- package/dist/middleware/body-limit.d.cts.map +1 -0
- package/dist/middleware/body-limit.d.ts +11 -0
- package/dist/middleware/body-limit.d.ts.map +1 -0
- package/dist/middleware/body-limit.js +16 -0
- package/dist/middleware/body-limit.js.map +1 -0
- package/dist/middleware/compress.cjs +10 -0
- package/dist/middleware/compress.d.cts +8 -0
- package/dist/middleware/compress.d.cts.map +1 -0
- package/dist/middleware/compress.d.ts +8 -0
- package/dist/middleware/compress.d.ts.map +1 -0
- package/dist/middleware/compress.js +10 -0
- package/dist/middleware/compress.js.map +1 -0
- package/dist/middleware/cookie.cjs +87 -0
- package/dist/middleware/cookie.d.cts +26 -0
- package/dist/middleware/cookie.d.cts.map +1 -0
- package/dist/middleware/cookie.d.ts +26 -0
- package/dist/middleware/cookie.d.ts.map +1 -0
- package/dist/middleware/cookie.js +87 -0
- package/dist/middleware/cookie.js.map +1 -0
- package/dist/middleware/cors.cjs +9 -0
- package/dist/middleware/cors.d.cts +7 -0
- package/dist/middleware/cors.d.cts.map +1 -0
- package/dist/middleware/cors.d.ts +7 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +10 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/csrf.cjs +9 -0
- package/dist/middleware/csrf.d.cts +7 -0
- package/dist/middleware/csrf.d.cts.map +1 -0
- package/dist/middleware/csrf.d.ts +7 -0
- package/dist/middleware/csrf.d.ts.map +1 -0
- package/dist/middleware/csrf.js +10 -0
- package/dist/middleware/csrf.js.map +1 -0
- package/dist/middleware/etag.cjs +10 -0
- package/dist/middleware/etag.d.cts +8 -0
- package/dist/middleware/etag.d.cts.map +1 -0
- package/dist/middleware/etag.d.ts +8 -0
- package/dist/middleware/etag.d.ts.map +1 -0
- package/dist/middleware/etag.js +10 -0
- package/dist/middleware/etag.js.map +1 -0
- package/dist/middleware/index.cjs +39 -0
- package/dist/middleware/index.d.cts +11 -0
- package/dist/middleware/index.d.ts +11 -0
- package/dist/middleware/index.js +11 -0
- package/dist/middleware/jwk.cjs +12 -0
- package/dist/middleware/jwk.d.cts +9 -0
- package/dist/middleware/jwk.d.cts.map +1 -0
- package/dist/middleware/jwk.d.ts +9 -0
- package/dist/middleware/jwk.d.ts.map +1 -0
- package/dist/middleware/jwk.js +13 -0
- package/dist/middleware/jwk.js.map +1 -0
- package/dist/middleware/jwt.cjs +21 -0
- package/dist/middleware/jwt.d.cts +13 -0
- package/dist/middleware/jwt.d.cts.map +1 -0
- package/dist/middleware/jwt.d.ts +13 -0
- package/dist/middleware/jwt.d.ts.map +1 -0
- package/dist/middleware/jwt.js +17 -0
- package/dist/middleware/jwt.js.map +1 -0
- package/dist/middleware/secure-headers.cjs +10 -0
- package/dist/middleware/secure-headers.d.cts +8 -0
- package/dist/middleware/secure-headers.d.cts.map +1 -0
- package/dist/middleware/secure-headers.d.ts +8 -0
- package/dist/middleware/secure-headers.d.ts.map +1 -0
- package/dist/middleware/secure-headers.js +10 -0
- package/dist/middleware/secure-headers.js.map +1 -0
- package/dist/middleware/timing.cjs +13 -0
- package/dist/middleware/timing.d.cts +8 -0
- package/dist/middleware/timing.d.cts.map +1 -0
- package/dist/middleware/timing.d.ts +8 -0
- package/dist/middleware/timing.d.ts.map +1 -0
- package/dist/middleware/timing.js +10 -0
- package/dist/middleware/timing.js.map +1 -0
- package/dist/reply.cjs +128 -0
- package/dist/reply.d.cts +2 -0
- package/dist/reply.d.ts +2 -0
- package/dist/reply.js +2 -0
- package/dist/stream.cjs +32 -0
- package/dist/stream.d.cts +2 -0
- package/dist/stream.d.ts +2 -0
- package/dist/stream.js +2 -0
- package/dist/types-BjPmu9B-.d.cts +294 -0
- package/dist/types-BjPmu9B-.d.cts.map +1 -0
- package/dist/types-COZ0UN-A.d.ts +294 -0
- package/dist/types-COZ0UN-A.d.ts.map +1 -0
- package/package.json +49 -107
- package/src/builder.ts +755 -0
- package/src/context.ts +11 -0
- package/src/hono.ts +75 -0
- package/src/index.ts +67 -49
- package/src/middleware/body-limit.ts +17 -5
- package/src/middleware/compress.ts +7 -6
- package/src/middleware/cookie.ts +128 -0
- package/src/middleware/cors.ts +5 -6
- package/src/middleware/csrf.ts +5 -6
- package/src/middleware/etag.ts +7 -6
- package/src/middleware/index.ts +35 -0
- package/src/middleware/jwk.ts +12 -46
- package/src/middleware/jwt.ts +21 -26
- package/src/middleware/secure-headers.ts +7 -6
- package/src/middleware/timing.ts +9 -6
- package/src/reply.ts +26 -1
- package/src/stream.ts +10 -1
- package/src/taser.ts +55 -0
- package/src/types.ts +810 -0
- package/dist/cjs/builder/app.cjs +0 -27
- package/dist/cjs/builder/app.cjs.map +0 -1
- package/dist/cjs/builder/app.d.cts +0 -11
- package/dist/cjs/builder/constants.cjs +0 -11
- package/dist/cjs/builder/constants.cjs.map +0 -1
- package/dist/cjs/builder/constants.d.cts +0 -3
- package/dist/cjs/builder/middleware-unit.cjs +0 -64
- package/dist/cjs/builder/middleware-unit.cjs.map +0 -1
- package/dist/cjs/builder/middleware-unit.d.cts +0 -34
- package/dist/cjs/builder/middleware.cjs +0 -20
- package/dist/cjs/builder/middleware.cjs.map +0 -1
- package/dist/cjs/builder/middleware.d.cts +0 -2
- package/dist/cjs/builder/normalize.cjs +0 -10
- package/dist/cjs/builder/normalize.cjs.map +0 -1
- package/dist/cjs/builder/normalize.d.cts +0 -2
- package/dist/cjs/builder/route.cjs +0 -83
- package/dist/cjs/builder/route.cjs.map +0 -1
- package/dist/cjs/builder/route.d.cts +0 -4
- package/dist/cjs/builder/router.cjs +0 -88
- package/dist/cjs/builder/router.cjs.map +0 -1
- package/dist/cjs/builder/router.d.cts +0 -26
- package/dist/cjs/builder/standalone.cjs +0 -30
- package/dist/cjs/builder/standalone.cjs.map +0 -1
- package/dist/cjs/builder/standalone.d.cts +0 -23
- package/dist/cjs/context/create-context.cjs +0 -8
- package/dist/cjs/context/create-context.cjs.map +0 -1
- package/dist/cjs/context/create-context.d.cts +0 -5
- package/dist/cjs/define/middleware.cjs +0 -22
- package/dist/cjs/define/middleware.cjs.map +0 -1
- package/dist/cjs/define/middleware.d.cts +0 -45
- package/dist/cjs/define/validators.cjs +0 -14
- package/dist/cjs/define/validators.cjs.map +0 -1
- package/dist/cjs/define/validators.d.cts +0 -8
- package/dist/cjs/index.cjs +0 -26
- package/dist/cjs/index.d.cts +0 -17
- package/dist/cjs/middleware/body-limit.cjs +0 -12
- package/dist/cjs/middleware/body-limit.cjs.map +0 -1
- package/dist/cjs/middleware/body-limit.d.cts +0 -3
- package/dist/cjs/middleware/compress.cjs +0 -12
- package/dist/cjs/middleware/compress.cjs.map +0 -1
- package/dist/cjs/middleware/compress.d.cts +0 -3
- package/dist/cjs/middleware/cors.cjs +0 -12
- package/dist/cjs/middleware/cors.cjs.map +0 -1
- package/dist/cjs/middleware/cors.d.cts +0 -3
- package/dist/cjs/middleware/csrf.cjs +0 -12
- package/dist/cjs/middleware/csrf.cjs.map +0 -1
- package/dist/cjs/middleware/csrf.d.cts +0 -3
- package/dist/cjs/middleware/etag.cjs +0 -12
- package/dist/cjs/middleware/etag.cjs.map +0 -1
- package/dist/cjs/middleware/etag.d.cts +0 -3
- package/dist/cjs/middleware/hono-mw.cjs +0 -23
- package/dist/cjs/middleware/hono-mw.cjs.map +0 -1
- package/dist/cjs/middleware/hono-mw.d.cts +0 -17
- package/dist/cjs/middleware/jwk.cjs +0 -30
- package/dist/cjs/middleware/jwk.cjs.map +0 -1
- package/dist/cjs/middleware/jwk.d.cts +0 -14
- package/dist/cjs/middleware/jwt.cjs +0 -20
- package/dist/cjs/middleware/jwt.cjs.map +0 -1
- package/dist/cjs/middleware/jwt.d.cts +0 -12
- package/dist/cjs/middleware/secure-headers.cjs +0 -12
- package/dist/cjs/middleware/secure-headers.cjs.map +0 -1
- package/dist/cjs/middleware/secure-headers.d.cts +0 -3
- package/dist/cjs/middleware/timing.cjs +0 -12
- package/dist/cjs/middleware/timing.cjs.map +0 -1
- package/dist/cjs/middleware/timing.d.cts +0 -3
- package/dist/cjs/reply.cjs +0 -9
- package/dist/cjs/reply.d.cts +0 -1
- package/dist/cjs/stream.cjs +0 -9
- package/dist/cjs/stream.d.cts +0 -1
- package/dist/cjs/types/app.d.cts +0 -29
- package/dist/cjs/types/index.d.cts +0 -297
- package/dist/cjs/types/returns.d.cts +0 -34
- package/dist/cjs/types/schema.d.cts +0 -14
- package/dist/cjs/types/type-utils.d.cts +0 -50
- package/dist/cjs/types/units.d.cts +0 -71
- package/dist/esm/builder/app.d.ts +0 -11
- package/dist/esm/builder/app.js +0 -26
- package/dist/esm/builder/app.js.map +0 -1
- package/dist/esm/builder/constants.d.ts +0 -3
- package/dist/esm/builder/constants.js +0 -11
- package/dist/esm/builder/constants.js.map +0 -1
- package/dist/esm/builder/middleware-unit.d.ts +0 -34
- package/dist/esm/builder/middleware-unit.js +0 -64
- package/dist/esm/builder/middleware-unit.js.map +0 -1
- package/dist/esm/builder/middleware.d.ts +0 -2
- package/dist/esm/builder/middleware.js +0 -20
- package/dist/esm/builder/middleware.js.map +0 -1
- package/dist/esm/builder/normalize.d.ts +0 -2
- package/dist/esm/builder/normalize.js +0 -10
- package/dist/esm/builder/normalize.js.map +0 -1
- package/dist/esm/builder/route.d.ts +0 -4
- package/dist/esm/builder/route.js +0 -83
- package/dist/esm/builder/route.js.map +0 -1
- package/dist/esm/builder/router.d.ts +0 -26
- package/dist/esm/builder/router.js +0 -87
- package/dist/esm/builder/router.js.map +0 -1
- package/dist/esm/builder/standalone.d.ts +0 -23
- package/dist/esm/builder/standalone.js +0 -29
- package/dist/esm/builder/standalone.js.map +0 -1
- package/dist/esm/context/create-context.d.ts +0 -5
- package/dist/esm/context/create-context.js +0 -8
- package/dist/esm/context/create-context.js.map +0 -1
- package/dist/esm/define/middleware.d.ts +0 -45
- package/dist/esm/define/middleware.js +0 -22
- package/dist/esm/define/middleware.js.map +0 -1
- package/dist/esm/define/validators.d.ts +0 -8
- package/dist/esm/define/validators.js +0 -14
- package/dist/esm/define/validators.js.map +0 -1
- package/dist/esm/index.d.ts +0 -17
- package/dist/esm/index.js +0 -7
- package/dist/esm/middleware/body-limit.d.ts +0 -3
- package/dist/esm/middleware/body-limit.js +0 -11
- package/dist/esm/middleware/body-limit.js.map +0 -1
- package/dist/esm/middleware/compress.d.ts +0 -3
- package/dist/esm/middleware/compress.js +0 -11
- package/dist/esm/middleware/compress.js.map +0 -1
- package/dist/esm/middleware/cors.d.ts +0 -3
- package/dist/esm/middleware/cors.js +0 -11
- package/dist/esm/middleware/cors.js.map +0 -1
- package/dist/esm/middleware/csrf.d.ts +0 -3
- package/dist/esm/middleware/csrf.js +0 -11
- package/dist/esm/middleware/csrf.js.map +0 -1
- package/dist/esm/middleware/etag.d.ts +0 -3
- package/dist/esm/middleware/etag.js +0 -11
- package/dist/esm/middleware/etag.js.map +0 -1
- package/dist/esm/middleware/hono-mw.d.ts +0 -17
- package/dist/esm/middleware/hono-mw.js +0 -23
- package/dist/esm/middleware/hono-mw.js.map +0 -1
- package/dist/esm/middleware/jwk.d.ts +0 -14
- package/dist/esm/middleware/jwk.js +0 -29
- package/dist/esm/middleware/jwk.js.map +0 -1
- package/dist/esm/middleware/jwt.d.ts +0 -12
- package/dist/esm/middleware/jwt.js +0 -19
- package/dist/esm/middleware/jwt.js.map +0 -1
- package/dist/esm/middleware/secure-headers.d.ts +0 -3
- package/dist/esm/middleware/secure-headers.js +0 -11
- package/dist/esm/middleware/secure-headers.js.map +0 -1
- package/dist/esm/middleware/timing.d.ts +0 -3
- package/dist/esm/middleware/timing.js +0 -11
- package/dist/esm/middleware/timing.js.map +0 -1
- package/dist/esm/reply.d.ts +0 -1
- package/dist/esm/reply.js +0 -1
- package/dist/esm/stream.d.ts +0 -1
- package/dist/esm/stream.js +0 -1
- package/dist/esm/types/app.d.ts +0 -29
- package/dist/esm/types/index.d.ts +0 -297
- package/dist/esm/types/returns.d.ts +0 -34
- package/dist/esm/types/schema.d.ts +0 -14
- package/dist/esm/types/type-utils.d.ts +0 -50
- package/dist/esm/types/units.d.ts +0 -71
- package/src/builder/app.ts +0 -39
- package/src/builder/constants.ts +0 -4
- package/src/builder/middleware-unit.ts +0 -71
- package/src/builder/middleware.ts +0 -23
- package/src/builder/normalize.ts +0 -13
- package/src/builder/route.ts +0 -137
- package/src/builder/router.ts +0 -144
- package/src/builder/standalone.ts +0 -79
- package/src/context/create-context.ts +0 -19
- package/src/define/middleware.ts +0 -214
- package/src/define/validators.ts +0 -22
- package/src/middleware/hono-mw.ts +0 -27
- package/src/types/app.ts +0 -48
- package/src/types/index.ts +0 -801
- package/src/types/returns.ts +0 -61
- package/src/types/schema.ts +0 -21
- package/src/types/type-utils.ts +0 -90
- package/src/types/units.ts +0 -314
package/src/context.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ContextDefinition, ContextOptions } from "./types.js";
|
|
2
|
+
|
|
3
|
+
export function createContext<
|
|
4
|
+
TBoot extends Record<string, unknown> = {},
|
|
5
|
+
TRequest extends Record<string, unknown> = {},
|
|
6
|
+
>(options: ContextOptions<TBoot, TRequest>): ContextDefinition<TBoot, TRequest> {
|
|
7
|
+
return {
|
|
8
|
+
kind: "context",
|
|
9
|
+
...options,
|
|
10
|
+
};
|
|
11
|
+
}
|
package/src/hono.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Context } from "hono";
|
|
2
|
+
import type { MiddlewareHandler as HonoMiddlewareHandler, Next as HonoNext } from "hono";
|
|
3
|
+
import { mergeResponseCookies } from "@taserjs/utils";
|
|
4
|
+
import type {
|
|
5
|
+
DistributeServices,
|
|
6
|
+
DistributeState,
|
|
7
|
+
MiddlewareDefinition,
|
|
8
|
+
MiddlewareResponse,
|
|
9
|
+
NextFunction,
|
|
10
|
+
} from "./types.js";
|
|
11
|
+
|
|
12
|
+
export function hono<
|
|
13
|
+
R extends
|
|
14
|
+
| Response
|
|
15
|
+
| Promise<Response>
|
|
16
|
+
| MiddlewareResponse<any, any>
|
|
17
|
+
| Promise<MiddlewareResponse<any, any>> = Promise<Response>,
|
|
18
|
+
>(
|
|
19
|
+
honoMw: HonoMiddlewareHandler,
|
|
20
|
+
refine?: (c: Context, next: NextFunction) => R,
|
|
21
|
+
): MiddlewareDefinition<
|
|
22
|
+
DistributeServices<Awaited<R>>,
|
|
23
|
+
DistributeState<Awaited<R>>,
|
|
24
|
+
unknown,
|
|
25
|
+
unknown,
|
|
26
|
+
unknown
|
|
27
|
+
> {
|
|
28
|
+
return {
|
|
29
|
+
kind: "middleware",
|
|
30
|
+
handler: async (args, next) => {
|
|
31
|
+
let c = (args.ctx as Record<string, unknown>).context as Context | undefined;
|
|
32
|
+
if (!c) {
|
|
33
|
+
c = new Context(args.req.raw);
|
|
34
|
+
(args.ctx as Record<string, unknown>).context = c;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let nextCalled = false;
|
|
38
|
+
let downstreamResponse: Response | undefined;
|
|
39
|
+
|
|
40
|
+
const honoNext: HonoNext = async () => {
|
|
41
|
+
nextCalled = true;
|
|
42
|
+
void c.res;
|
|
43
|
+
downstreamResponse = refine ? await refine(c, next) : await next();
|
|
44
|
+
mergeResponseCookies(c, downstreamResponse);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
let result: Response | void;
|
|
48
|
+
try {
|
|
49
|
+
result = await honoMw(c, honoNext);
|
|
50
|
+
} catch (err: any) {
|
|
51
|
+
if (typeof err?.getResponse === "function") {
|
|
52
|
+
return err.getResponse();
|
|
53
|
+
}
|
|
54
|
+
if (err?.res instanceof Response) {
|
|
55
|
+
return err.res;
|
|
56
|
+
}
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (result instanceof Response) {
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (nextCalled) {
|
|
65
|
+
return c.res ?? downstreamResponse!;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (c.res instanceof Response) {
|
|
69
|
+
return c.res;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
throw new Error("Hono middleware did not call next() or return a Response");
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,54 +1,72 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
EmptyAppContext,
|
|
7
|
-
HttpMethod,
|
|
8
|
-
InferInput,
|
|
9
|
-
InferOutput,
|
|
10
|
-
InferRouteContext,
|
|
11
|
-
InferRouteInput,
|
|
12
|
-
InferRouteInputFromPath,
|
|
13
|
-
InferRouteOutput,
|
|
1
|
+
export {
|
|
2
|
+
t,
|
|
3
|
+
layout,
|
|
4
|
+
RouteBuilder,
|
|
5
|
+
RouteValidationBuilder,
|
|
14
6
|
LayoutBuilder,
|
|
15
|
-
LayoutId,
|
|
16
|
-
LayoutMiddlewaresMap,
|
|
17
|
-
LayoutParams,
|
|
18
|
-
LayoutTree,
|
|
19
|
-
Method,
|
|
20
7
|
MiddlewareBuilder,
|
|
8
|
+
middleware,
|
|
9
|
+
toMiddlewareDefinition,
|
|
10
|
+
} from "./builder.js";
|
|
11
|
+
export { hono } from "./hono.js";
|
|
12
|
+
export { createContext } from "./context.js";
|
|
13
|
+
export { defineTaser, TaserBuilder } from "./taser.js";
|
|
14
|
+
export {
|
|
15
|
+
ValidationError,
|
|
16
|
+
ResponseValidationError,
|
|
17
|
+
unsupportedMediaType,
|
|
18
|
+
UnsupportedMediaTypeError,
|
|
19
|
+
isStandardSchema,
|
|
20
|
+
validateStandardSchema,
|
|
21
|
+
} from "@taserjs/utils";
|
|
22
|
+
export type {
|
|
23
|
+
BodyMode,
|
|
24
|
+
ValidationFacet,
|
|
25
|
+
StatusCode,
|
|
26
|
+
RouteSchemas,
|
|
27
|
+
RouteBodySchema,
|
|
28
|
+
StandardSchemaV1,
|
|
29
|
+
ContextDefinition,
|
|
30
|
+
ContextOptions,
|
|
31
|
+
HttpMethod,
|
|
32
|
+
StandardHttpMethod,
|
|
33
|
+
HttpNoBodyMethod,
|
|
34
|
+
MiddlewarePreconditions,
|
|
35
|
+
LayoutDefinition,
|
|
36
|
+
MiddlewareArgs,
|
|
21
37
|
MiddlewareDefinition,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
RouteByPathMethod,
|
|
38
|
+
MiddlewareHandler,
|
|
39
|
+
MiddlewareInput,
|
|
40
|
+
NextFunction,
|
|
41
|
+
RouteDefaultParams,
|
|
27
42
|
RouteDefinition,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
43
|
+
RouteHandler,
|
|
44
|
+
RouteHandlerArgs,
|
|
45
|
+
TaserRequest,
|
|
46
|
+
RequestHeader,
|
|
47
|
+
HeaderKey,
|
|
48
|
+
TaserHeaders,
|
|
49
|
+
RouterRegister,
|
|
50
|
+
RegisteredRoutePath,
|
|
51
|
+
RegisteredLayoutId,
|
|
52
|
+
InferredAppContext,
|
|
31
53
|
Simplify,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
export { honoMw } from "./middleware/hono-mw.js";
|
|
52
|
-
export type { MiddlewareFn } from "./define/middleware.js";
|
|
53
|
-
|
|
54
|
-
export type { TaserCookieJar, TaserCookieOptions, TaserHeaders } from "@taserjs/router-core";
|
|
54
|
+
UnionToIntersection,
|
|
55
|
+
SafeIntersect,
|
|
56
|
+
ExtractServicesFromLayout,
|
|
57
|
+
ExtractStateFromLayout,
|
|
58
|
+
ExtractServicesFromMiddleware,
|
|
59
|
+
ExtractStateFromMiddleware,
|
|
60
|
+
InferEffectiveParams,
|
|
61
|
+
InferEffectiveQuery,
|
|
62
|
+
InferEffectiveBody,
|
|
63
|
+
InferRouteServices,
|
|
64
|
+
InferRouteState,
|
|
65
|
+
InferMiddlewareArgs,
|
|
66
|
+
InferReturnsResponse,
|
|
67
|
+
NotFoundHandler,
|
|
68
|
+
OnErrorHandler,
|
|
69
|
+
ResponseOptions,
|
|
70
|
+
TaserAppOptions,
|
|
71
|
+
TaserDefinition,
|
|
72
|
+
} from "./types.js";
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import { bodyLimit as honoBodyLimit } from "hono/body-limit";
|
|
2
|
+
import type { Context } from "hono";
|
|
3
|
+
import { payloadTooLarge } from "@taserjs/utils";
|
|
4
|
+
import { hono } from "../hono.js";
|
|
5
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
2
6
|
|
|
3
|
-
|
|
4
|
-
import { honoMw } from "./hono-mw.js";
|
|
7
|
+
export type OnError = (c: Context) => Response | Promise<Response>;
|
|
5
8
|
|
|
6
|
-
export
|
|
7
|
-
|
|
9
|
+
export interface BodyLimitOptions {
|
|
10
|
+
maxSize: number;
|
|
11
|
+
onError?: OnError;
|
|
8
12
|
}
|
|
9
13
|
|
|
10
|
-
export
|
|
14
|
+
export function bodyLimit(options: BodyLimitOptions): MiddlewareDefinition {
|
|
15
|
+
const onError = options.onError ?? (() => payloadTooLarge({ message: "Payload Too Large" }));
|
|
16
|
+
const honoMw = honoBodyLimit({
|
|
17
|
+
maxSize: options.maxSize,
|
|
18
|
+
onError,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return hono(honoMw);
|
|
22
|
+
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { compress as honoCompress } from "hono/compress";
|
|
1
|
+
import { compress as honoCompress, COMPRESSIBLE_CONTENT_TYPE_REGEX } from "hono/compress";
|
|
2
|
+
import { hono } from "../hono.js";
|
|
3
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
import { honoMw } from "./hono-mw.js";
|
|
5
|
+
export type CompressionOptions = Parameters<typeof honoCompress>[0];
|
|
5
6
|
|
|
6
|
-
export function compress(
|
|
7
|
-
return
|
|
7
|
+
export function compress(options?: CompressionOptions): MiddlewareDefinition {
|
|
8
|
+
return hono(honoCompress(options));
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
export
|
|
11
|
+
export { COMPRESSIBLE_CONTENT_TYPE_REGEX };
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Context } from "hono";
|
|
2
|
+
import { deleteCookie, getCookie, getSignedCookie, setCookie, setSignedCookie } from "hono/cookie";
|
|
3
|
+
import type { Cookie, CookieOptions, CookiePrefixOptions, SignedCookie } from "hono/utils/cookie";
|
|
4
|
+
import { mergeResponseCookies } from "@taserjs/utils";
|
|
5
|
+
import { middleware } from "../builder.js";
|
|
6
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
7
|
+
|
|
8
|
+
export type { Cookie, CookieOptions, CookiePrefixOptions, SignedCookie };
|
|
9
|
+
|
|
10
|
+
export type CookieJarOptions = CookieOptions & {
|
|
11
|
+
secret?: string | BufferSource | undefined;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export class TaserCookieJar {
|
|
15
|
+
readonly #c: Context;
|
|
16
|
+
readonly #defaultOptions: CookieJarOptions;
|
|
17
|
+
#dirty = false;
|
|
18
|
+
|
|
19
|
+
constructor(c: Context, defaultOptions?: CookieJarOptions) {
|
|
20
|
+
this.#c = c;
|
|
21
|
+
this.#defaultOptions = defaultOptions ?? {};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
get(name: string, prefixOptions?: CookiePrefixOptions): string | undefined;
|
|
25
|
+
get(): Cookie;
|
|
26
|
+
get(name?: string, prefixOptions?: CookiePrefixOptions): string | Cookie | undefined {
|
|
27
|
+
if (typeof name === "string") {
|
|
28
|
+
return getCookie(this.#c, name, prefixOptions);
|
|
29
|
+
}
|
|
30
|
+
return getCookie(this.#c);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async getSigned(
|
|
34
|
+
name: string,
|
|
35
|
+
secret?: string | BufferSource,
|
|
36
|
+
prefixOptions?: CookiePrefixOptions,
|
|
37
|
+
): Promise<string | undefined | false>;
|
|
38
|
+
async getSigned(secret?: string | BufferSource): Promise<SignedCookie>;
|
|
39
|
+
async getSigned(
|
|
40
|
+
nameOrSecret?: string | BufferSource,
|
|
41
|
+
maybeSecret?: string | BufferSource,
|
|
42
|
+
prefixOptions?: CookiePrefixOptions,
|
|
43
|
+
): Promise<string | SignedCookie | undefined | false> {
|
|
44
|
+
if (
|
|
45
|
+
typeof nameOrSecret === "string" &&
|
|
46
|
+
(maybeSecret !== undefined || this.#defaultOptions.secret !== undefined)
|
|
47
|
+
) {
|
|
48
|
+
const secret = maybeSecret ?? this.#defaultOptions.secret!;
|
|
49
|
+
return await getSignedCookie(this.#c, secret, nameOrSecret, prefixOptions);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const secret =
|
|
53
|
+
(nameOrSecret as string | BufferSource | undefined) ?? this.#defaultOptions.secret;
|
|
54
|
+
if (!secret) {
|
|
55
|
+
throw new Error("Secret is required to read signed cookies");
|
|
56
|
+
}
|
|
57
|
+
return await getSignedCookie(this.#c, secret);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
set(name: string, value: string, opt?: CookieOptions): this {
|
|
61
|
+
this.#dirty = true;
|
|
62
|
+
const mergedOpt = opt ? { ...this.#defaultOptions, ...opt } : this.#defaultOptions;
|
|
63
|
+
setCookie(this.#c, name, value, mergedOpt);
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async setSigned(
|
|
68
|
+
name: string,
|
|
69
|
+
value: string,
|
|
70
|
+
secretOrOpt?: string | BufferSource | CookieOptions,
|
|
71
|
+
opt?: CookieOptions,
|
|
72
|
+
): Promise<this> {
|
|
73
|
+
this.#dirty = true;
|
|
74
|
+
let secret: string | BufferSource;
|
|
75
|
+
let options: CookieOptions | undefined;
|
|
76
|
+
|
|
77
|
+
if (typeof secretOrOpt === "string" || (secretOrOpt && "byteLength" in secretOrOpt)) {
|
|
78
|
+
secret = secretOrOpt;
|
|
79
|
+
options = opt;
|
|
80
|
+
} else {
|
|
81
|
+
secret = this.#defaultOptions.secret!;
|
|
82
|
+
options = secretOrOpt;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (!secret) {
|
|
86
|
+
throw new Error("Secret is required to set signed cookies");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const mergedOpt = { ...this.#defaultOptions, ...options };
|
|
90
|
+
await setSignedCookie(this.#c, name, value, secret, mergedOpt);
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
delete(name: string, opt?: CookieOptions): string | undefined {
|
|
95
|
+
this.#dirty = true;
|
|
96
|
+
const mergedOpt = opt ? { ...this.#defaultOptions, ...opt } : this.#defaultOptions;
|
|
97
|
+
return deleteCookie(this.#c, name, mergedOpt);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
getSetCookieHeaders(): string[] {
|
|
101
|
+
void this.#c.res;
|
|
102
|
+
return typeof this.#c.res?.headers?.getSetCookie === "function"
|
|
103
|
+
? this.#c.res.headers.getSetCookie()
|
|
104
|
+
: [];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
flush<TRes extends Response>(res: TRes): TRes {
|
|
108
|
+
if (!this.#dirty) {
|
|
109
|
+
return res;
|
|
110
|
+
}
|
|
111
|
+
return mergeResponseCookies(this.#c, res) as TRes;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function cookie(
|
|
116
|
+
options?: CookieJarOptions,
|
|
117
|
+
): MiddlewareDefinition<{ cookies: TaserCookieJar }> {
|
|
118
|
+
return middleware(async ({ req, ctx }, next) => {
|
|
119
|
+
let c = (ctx as Record<string, unknown>).context as Context | undefined;
|
|
120
|
+
if (!c) {
|
|
121
|
+
c = new Context(req.raw);
|
|
122
|
+
(ctx as Record<string, unknown>).context = c;
|
|
123
|
+
}
|
|
124
|
+
const jar = new TaserCookieJar(c, options);
|
|
125
|
+
const res = await next.provide({ cookies: jar });
|
|
126
|
+
return jar.flush(res);
|
|
127
|
+
});
|
|
128
|
+
}
|
package/src/middleware/cors.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { cors as honoCors } from "hono/cors";
|
|
2
|
+
import { hono } from "../hono.js";
|
|
3
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
import { honoMw } from "./hono-mw.js";
|
|
5
|
+
export type CORSOptions = Parameters<typeof honoCors>[0];
|
|
5
6
|
|
|
6
|
-
export function cors(
|
|
7
|
-
return
|
|
7
|
+
export function cors(options?: CORSOptions): MiddlewareDefinition {
|
|
8
|
+
return hono(honoCors(options));
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
export type CorsOptions = NonNullable<Parameters<typeof honoCors>[0]>;
|
package/src/middleware/csrf.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { csrf as honoCsrf } from "hono/csrf";
|
|
2
|
+
import { hono } from "../hono.js";
|
|
3
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
import { honoMw } from "./hono-mw.js";
|
|
5
|
+
export type CSRFOptions = Parameters<typeof honoCsrf>[0];
|
|
5
6
|
|
|
6
|
-
export function csrf(
|
|
7
|
-
return
|
|
7
|
+
export function csrf(options?: CSRFOptions): MiddlewareDefinition {
|
|
8
|
+
return hono(honoCsrf(options));
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
export type CsrfOptions = NonNullable<Parameters<typeof honoCsrf>[0]>;
|
package/src/middleware/etag.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { etag as honoEtag } from "hono/etag";
|
|
1
|
+
import { etag as honoEtag, RETAINED_304_HEADERS } from "hono/etag";
|
|
2
|
+
import { hono } from "../hono.js";
|
|
3
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
import { honoMw } from "./hono-mw.js";
|
|
5
|
+
export type ETagOptions = Parameters<typeof honoEtag>[0];
|
|
5
6
|
|
|
6
|
-
export function etag(
|
|
7
|
-
return
|
|
7
|
+
export function etag(options?: ETagOptions): MiddlewareDefinition {
|
|
8
|
+
return hono(honoEtag(options));
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
export
|
|
11
|
+
export { RETAINED_304_HEADERS };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export {
|
|
2
|
+
cookie,
|
|
3
|
+
TaserCookieJar,
|
|
4
|
+
type CookieJarOptions,
|
|
5
|
+
type Cookie,
|
|
6
|
+
type CookieOptions,
|
|
7
|
+
type CookiePrefixOptions,
|
|
8
|
+
type SignedCookie,
|
|
9
|
+
} from "./cookie.js";
|
|
10
|
+
export { cors, type CORSOptions } from "./cors.js";
|
|
11
|
+
export {
|
|
12
|
+
jwt,
|
|
13
|
+
sign,
|
|
14
|
+
verify,
|
|
15
|
+
decode,
|
|
16
|
+
verifyWithJwks,
|
|
17
|
+
AlgorithmTypes,
|
|
18
|
+
type JWTOptions,
|
|
19
|
+
type HonoJWTOptions,
|
|
20
|
+
} from "./jwt.js";
|
|
21
|
+
export { jwk, type JWKOptions } from "./jwk.js";
|
|
22
|
+
export { secureHeaders, NONCE, type SecureHeadersOptions } from "./secure-headers.js";
|
|
23
|
+
export { bodyLimit, type BodyLimitOptions, type OnError } from "./body-limit.js";
|
|
24
|
+
export { csrf, type CSRFOptions } from "./csrf.js";
|
|
25
|
+
export { etag, RETAINED_304_HEADERS, type ETagOptions } from "./etag.js";
|
|
26
|
+
export {
|
|
27
|
+
timing,
|
|
28
|
+
startTime,
|
|
29
|
+
endTime,
|
|
30
|
+
setMetric,
|
|
31
|
+
wrapTime,
|
|
32
|
+
type TimingOptions,
|
|
33
|
+
type TimingVariables,
|
|
34
|
+
} from "./timing.js";
|
|
35
|
+
export { compress, COMPRESSIBLE_CONTENT_TYPE_REGEX, type CompressionOptions } from "./compress.js";
|
package/src/middleware/jwk.ts
CHANGED
|
@@ -1,51 +1,17 @@
|
|
|
1
1
|
import { jwk as honoJwk } from "hono/jwk";
|
|
2
|
+
import { hono } from "../hono.js";
|
|
3
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
import { honoMw } from "./hono-mw.js";
|
|
5
|
-
import type { JwtMiddlewareUnit, JwtPayloadState } from "./jwt.js";
|
|
5
|
+
export type JWKOptions = Parameters<typeof honoJwk>[0];
|
|
6
6
|
|
|
7
|
-
export
|
|
7
|
+
export function jwk<TClaims = Record<string, unknown>>(
|
|
8
|
+
options: JWKOptions,
|
|
9
|
+
init?: RequestInit,
|
|
10
|
+
): MiddlewareDefinition<unknown, { jwtPayload: TClaims }, unknown, unknown, unknown> {
|
|
11
|
+
const honoMw = honoJwk(options, init);
|
|
8
12
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
allowInsecure?: boolean;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
function assertJwksScheme(jwksUri: string, allowInsecure: boolean): void {
|
|
17
|
-
const scheme = new URL(jwksUri).protocol.replace(":", "");
|
|
18
|
-
if (scheme === "https") {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
if (scheme === "http" && allowInsecure) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
throw new Error(`JWKS URL must use https:// (or http:// with allowInsecure: true): "${jwksUri}"`);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* JWK auth middleware. Invalid or missing tokens return **401** (Hono).
|
|
29
|
-
* Successfully decoded payload is placed in `ctx.state.jwtPayload`.
|
|
30
|
-
* Static `jwks_uri` must use HTTPS unless `allowInsecure: true`.
|
|
31
|
-
*/
|
|
32
|
-
export function jwk<TPayload = Record<string, unknown>>(
|
|
33
|
-
options: JwkMiddlewareOptions,
|
|
34
|
-
init?: JwkRequestInit,
|
|
35
|
-
): JwtMiddlewareUnit<TPayload> {
|
|
36
|
-
const jwksUri = options.jwks_uri;
|
|
37
|
-
if (typeof jwksUri === "string") {
|
|
38
|
-
assertJwksScheme(jwksUri, options.allowInsecure ?? false);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const { allowInsecure: _allowInsecure, ...honoOptions } = options;
|
|
42
|
-
const safeInit = init?.headers !== undefined ? { headers: init.headers } : undefined;
|
|
43
|
-
const mw = honoMw(honoJwk(honoOptions, safeInit));
|
|
44
|
-
|
|
45
|
-
return middleware<JwtPayloadState<TPayload>>((ctx, next) =>
|
|
46
|
-
mw(ctx, async () => {
|
|
47
|
-
const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
|
|
48
|
-
return next({ jwtPayload: payload as TPayload });
|
|
49
|
-
}),
|
|
50
|
-
);
|
|
13
|
+
return hono(honoMw, (c, next) => {
|
|
14
|
+
const jwtPayload = c.get("jwtPayload") as TClaims;
|
|
15
|
+
return next({ jwtPayload });
|
|
16
|
+
});
|
|
51
17
|
}
|
package/src/middleware/jwt.ts
CHANGED
|
@@ -1,31 +1,26 @@
|
|
|
1
|
-
import { jwt as honoJwt } from "hono/jwt";
|
|
1
|
+
import { jwt as honoJwt, sign, verify, decode, verifyWithJwks, AlgorithmTypes } from "hono/jwt";
|
|
2
|
+
import { hono } from "../hono.js";
|
|
3
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
import type { MiddlewareReturnFromParts, MiddlewareUnit } from "../types/units.js";
|
|
5
|
-
import { honoMw } from "./hono-mw.js";
|
|
5
|
+
export type HonoJWTOptions = Parameters<typeof honoJwt>[0];
|
|
6
6
|
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export type JwtMiddlewareUnit<TPayload> = MiddlewareUnit<
|
|
12
|
-
MiddlewareReturnFromParts<unknown, unknown, unknown, JwtPayloadState<TPayload>>
|
|
13
|
-
>;
|
|
7
|
+
export interface JWTOptions extends Omit<HonoJWTOptions, "alg"> {
|
|
8
|
+
alg?: HonoJWTOptions["alg"];
|
|
9
|
+
}
|
|
14
10
|
|
|
15
|
-
export
|
|
11
|
+
export function jwt<TClaims = Record<string, unknown>>(
|
|
12
|
+
options: JWTOptions,
|
|
13
|
+
): MiddlewareDefinition<unknown, { jwtPayload: TClaims }, unknown, unknown, unknown> {
|
|
14
|
+
const { alg = "HS256", ...rest } = options;
|
|
15
|
+
const honoMw = honoJwt({
|
|
16
|
+
alg,
|
|
17
|
+
...rest,
|
|
18
|
+
});
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export function jwt<TPayload = Record<string, unknown>>(
|
|
22
|
-
options: JwtOptions,
|
|
23
|
-
): JwtMiddlewareUnit<TPayload> {
|
|
24
|
-
const mw = honoMw(honoJwt(options));
|
|
25
|
-
return middleware<JwtPayloadState<TPayload>>((ctx, next) =>
|
|
26
|
-
mw(ctx, async () => {
|
|
27
|
-
const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
|
|
28
|
-
return next({ jwtPayload: payload as TPayload });
|
|
29
|
-
}),
|
|
30
|
-
);
|
|
20
|
+
return hono(honoMw, (c, next) => {
|
|
21
|
+
const jwtPayload = c.get("jwtPayload") as TClaims;
|
|
22
|
+
return next({ jwtPayload });
|
|
23
|
+
});
|
|
31
24
|
}
|
|
25
|
+
|
|
26
|
+
export { sign, verify, decode, verifyWithJwks, AlgorithmTypes };
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { secureHeaders as honoSecureHeaders } from "hono/secure-headers";
|
|
1
|
+
import { secureHeaders as honoSecureHeaders, NONCE } from "hono/secure-headers";
|
|
2
|
+
import { hono } from "../hono.js";
|
|
3
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
import { honoMw } from "./hono-mw.js";
|
|
5
|
+
export type SecureHeadersOptions = Parameters<typeof honoSecureHeaders>[0];
|
|
5
6
|
|
|
6
|
-
export function secureHeaders(
|
|
7
|
-
return
|
|
7
|
+
export function secureHeaders(options?: SecureHeadersOptions): MiddlewareDefinition {
|
|
8
|
+
return hono(honoSecureHeaders(options));
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
export
|
|
11
|
+
export { NONCE };
|
package/src/middleware/timing.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { timing as honoTiming } from "hono/timing";
|
|
1
|
+
import { timing as honoTiming, startTime, endTime, setMetric, wrapTime } from "hono/timing";
|
|
2
|
+
import type { TimingVariables } from "hono/timing";
|
|
3
|
+
import { hono } from "../hono.js";
|
|
4
|
+
import type { MiddlewareDefinition } from "../types.js";
|
|
2
5
|
|
|
3
|
-
|
|
4
|
-
import { honoMw } from "./hono-mw.js";
|
|
6
|
+
export type TimingOptions = Parameters<typeof honoTiming>[0];
|
|
5
7
|
|
|
6
|
-
export function timing(
|
|
7
|
-
return
|
|
8
|
+
export function timing(config?: TimingOptions): MiddlewareDefinition {
|
|
9
|
+
return hono(honoTiming(config));
|
|
8
10
|
}
|
|
9
11
|
|
|
10
|
-
export
|
|
12
|
+
export { startTime, endTime, setMetric, wrapTime };
|
|
13
|
+
export type { TimingVariables };
|
package/src/reply.ts
CHANGED
|
@@ -1 +1,26 @@
|
|
|
1
|
-
export
|
|
1
|
+
export {
|
|
2
|
+
accepted,
|
|
3
|
+
badRequest,
|
|
4
|
+
conflict,
|
|
5
|
+
created,
|
|
6
|
+
createReply,
|
|
7
|
+
createTypedResponse,
|
|
8
|
+
forbidden,
|
|
9
|
+
html,
|
|
10
|
+
internalServerError,
|
|
11
|
+
isPlainObjectOrArray,
|
|
12
|
+
json,
|
|
13
|
+
methodNotAllowed,
|
|
14
|
+
noContent,
|
|
15
|
+
notFound,
|
|
16
|
+
ok,
|
|
17
|
+
payloadTooLarge,
|
|
18
|
+
redirect,
|
|
19
|
+
text,
|
|
20
|
+
tooManyRequests,
|
|
21
|
+
unauthorized,
|
|
22
|
+
unprocessable,
|
|
23
|
+
type ExtractStatus,
|
|
24
|
+
type JsonResponse,
|
|
25
|
+
type TypedResponse,
|
|
26
|
+
} from "@taserjs/utils";
|