@taserjs/router 0.0.1 → 0.0.3
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 +2 -0
- package/dist/cjs/constants.cjs.map +1 -1
- package/dist/cjs/create-context.cjs.map +1 -1
- package/dist/cjs/define/handler.cjs.map +1 -1
- package/dist/cjs/define/middleware.cjs +5 -24
- package/dist/cjs/define/middleware.cjs.map +1 -1
- package/dist/cjs/define/middleware.d.cts +10 -79
- package/dist/cjs/define/validators.cjs.map +1 -1
- package/dist/cjs/factories.cjs.map +1 -1
- package/dist/cjs/factories.d.cts +2 -2
- package/dist/cjs/index.cjs +7 -2
- package/dist/cjs/index.d.cts +2 -2
- package/dist/cjs/middleware/body-limit.cjs +2 -2
- package/dist/cjs/middleware/body-limit.cjs.map +1 -1
- package/dist/cjs/middleware/compress.cjs +2 -2
- package/dist/cjs/middleware/compress.cjs.map +1 -1
- package/dist/cjs/middleware/cors.cjs +2 -2
- package/dist/cjs/middleware/cors.cjs.map +1 -1
- package/dist/cjs/middleware/csrf.cjs +2 -2
- package/dist/cjs/middleware/csrf.cjs.map +1 -1
- package/dist/cjs/middleware/etag.cjs +2 -2
- package/dist/cjs/middleware/etag.cjs.map +1 -1
- package/dist/cjs/middleware/jwk.cjs +11 -4
- package/dist/cjs/middleware/jwk.cjs.map +1 -1
- package/dist/cjs/middleware/jwk.d.cts +4 -5
- package/dist/cjs/middleware/jwt.cjs +11 -5
- package/dist/cjs/middleware/jwt.cjs.map +1 -1
- package/dist/cjs/middleware/jwt.d.cts +7 -5
- package/dist/cjs/middleware/secure-headers.cjs +2 -2
- package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
- package/dist/cjs/middleware/timing.cjs +2 -2
- package/dist/cjs/middleware/timing.cjs.map +1 -1
- package/dist/cjs/middleware/wrap-hono.cjs +9 -0
- package/dist/cjs/middleware/wrap-hono.cjs.map +1 -0
- package/dist/cjs/middleware/wrap-hono.d.cts +3 -0
- package/dist/cjs/middleware.cjs.map +1 -1
- package/dist/cjs/reply.cjs +20 -0
- package/dist/cjs/reply.d.cts +2 -0
- package/dist/cjs/route.cjs.map +1 -1
- package/dist/cjs/route.d.cts +1 -1
- package/dist/cjs/stream.cjs +32 -0
- package/dist/cjs/stream.d.cts +1 -0
- package/dist/cjs/taser-app.cjs +0 -6
- package/dist/cjs/taser-app.cjs.map +1 -1
- package/dist/cjs/taser-app.d.cts +0 -3
- package/dist/cjs/taser-router.cjs +9 -10
- package/dist/cjs/taser-router.cjs.map +1 -1
- package/dist/cjs/taser-router.d.cts +9 -11
- package/dist/cjs/types/app.d.cts +3 -2
- package/dist/cjs/types/index.d.cts +53 -139
- package/dist/cjs/types/type-utils.d.cts +8 -11
- package/dist/cjs/types/units.cjs.map +1 -1
- package/dist/cjs/types/units.d.cts +27 -24
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/create-context.js.map +1 -1
- package/dist/esm/define/handler.js.map +1 -1
- package/dist/esm/define/middleware.d.ts +10 -79
- package/dist/esm/define/middleware.js +5 -24
- package/dist/esm/define/middleware.js.map +1 -1
- package/dist/esm/define/validators.js.map +1 -1
- package/dist/esm/factories.d.ts +2 -2
- package/dist/esm/factories.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +4 -4
- package/dist/esm/middleware/body-limit.js +1 -1
- package/dist/esm/middleware/body-limit.js.map +1 -1
- package/dist/esm/middleware/compress.js +1 -1
- package/dist/esm/middleware/compress.js.map +1 -1
- package/dist/esm/middleware/cors.js +1 -1
- package/dist/esm/middleware/cors.js.map +1 -1
- package/dist/esm/middleware/csrf.js +1 -1
- package/dist/esm/middleware/csrf.js.map +1 -1
- package/dist/esm/middleware/etag.js +1 -1
- package/dist/esm/middleware/etag.js.map +1 -1
- package/dist/esm/middleware/jwk.d.ts +4 -5
- package/dist/esm/middleware/jwk.js +11 -4
- package/dist/esm/middleware/jwk.js.map +1 -1
- package/dist/esm/middleware/jwt.d.ts +7 -5
- package/dist/esm/middleware/jwt.js +11 -5
- package/dist/esm/middleware/jwt.js.map +1 -1
- package/dist/esm/middleware/secure-headers.js +1 -1
- package/dist/esm/middleware/secure-headers.js.map +1 -1
- package/dist/esm/middleware/timing.js +1 -1
- package/dist/esm/middleware/timing.js.map +1 -1
- package/dist/esm/middleware/wrap-hono.d.ts +3 -0
- package/dist/esm/middleware/wrap-hono.js +9 -0
- package/dist/esm/middleware/wrap-hono.js.map +1 -0
- package/dist/esm/middleware.js.map +1 -1
- package/dist/esm/reply.d.ts +2 -0
- package/dist/esm/reply.js +2 -0
- package/dist/esm/route.d.ts +1 -1
- package/dist/esm/route.js.map +1 -1
- package/dist/esm/stream.d.ts +1 -0
- package/dist/esm/stream.js +2 -0
- package/dist/esm/taser-app.d.ts +0 -3
- package/dist/esm/taser-app.js +1 -6
- package/dist/esm/taser-app.js.map +1 -1
- package/dist/esm/taser-router.d.ts +9 -11
- package/dist/esm/taser-router.js +7 -8
- package/dist/esm/taser-router.js.map +1 -1
- package/dist/esm/types/app.d.ts +3 -2
- package/dist/esm/types/index.d.ts +53 -139
- package/dist/esm/types/type-utils.d.ts +8 -11
- package/dist/esm/types/units.d.ts +27 -24
- package/dist/esm/types/units.js.map +1 -1
- package/package.json +37 -17
- package/src/constants.ts +6 -6
- package/src/create-context.ts +8 -8
- package/src/define/handler.ts +24 -34
- package/src/define/middleware.ts +66 -256
- package/src/define/validators.ts +10 -10
- package/src/factories.ts +63 -61
- package/src/index.ts +13 -12
- package/src/middleware/body-limit.ts +5 -5
- package/src/middleware/compress.ts +5 -5
- package/src/middleware/cors.ts +5 -5
- package/src/middleware/csrf.ts +5 -5
- package/src/middleware/etag.ts +5 -5
- package/src/middleware/jwk.ts +33 -26
- package/src/middleware/jwt.ts +26 -10
- package/src/middleware/secure-headers.ts +5 -5
- package/src/middleware/timing.ts +5 -5
- package/src/middleware/wrap-hono.ts +12 -0
- package/src/middleware.ts +7 -7
- package/src/reply.ts +11 -0
- package/src/route.ts +45 -48
- package/src/stream.ts +1 -0
- package/src/taser-app.ts +13 -18
- package/src/taser-router.ts +103 -98
- package/src/types/app.ts +33 -35
- package/src/types/index.ts +299 -722
- package/src/types/returns.ts +92 -97
- package/src/types/schema.ts +8 -9
- package/src/types/type-utils.ts +42 -46
- package/src/types/units.ts +135 -104
- package/dist/cjs/middleware/auth.cjs +0 -34
- package/dist/cjs/middleware/auth.cjs.map +0 -1
- package/dist/cjs/middleware/auth.d.cts +0 -9
- package/dist/esm/middleware/auth.d.ts +0 -9
- package/dist/esm/middleware/auth.js +0 -33
- package/dist/esm/middleware/auth.js.map +0 -1
- package/src/middleware/auth.ts +0 -51
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { compress as honoCompress } from
|
|
1
|
+
import { compress as honoCompress } from "hono/compress";
|
|
2
2
|
|
|
3
|
-
import { wrapHonoMiddleware } from
|
|
3
|
+
import { wrapHonoMiddleware } from "./wrap-hono.js";
|
|
4
4
|
|
|
5
|
-
const honoCompressMiddleware = wrapHonoMiddleware(honoCompress)
|
|
5
|
+
const honoCompressMiddleware = wrapHonoMiddleware(honoCompress);
|
|
6
6
|
|
|
7
7
|
export function compress(...args: Parameters<typeof honoCompress>) {
|
|
8
|
-
return honoCompressMiddleware(...args)
|
|
8
|
+
return honoCompressMiddleware(...args);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export type CompressOptions = NonNullable<Parameters<typeof honoCompress>[0]
|
|
11
|
+
export type CompressOptions = NonNullable<Parameters<typeof honoCompress>[0]>;
|
package/src/middleware/cors.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { cors as honoCors } from
|
|
1
|
+
import { cors as honoCors } from "hono/cors";
|
|
2
2
|
|
|
3
|
-
import { wrapHonoMiddleware } from
|
|
3
|
+
import { wrapHonoMiddleware } from "./wrap-hono.js";
|
|
4
4
|
|
|
5
|
-
const honoCorsMiddleware = wrapHonoMiddleware(honoCors)
|
|
5
|
+
const honoCorsMiddleware = wrapHonoMiddleware(honoCors);
|
|
6
6
|
|
|
7
7
|
export function cors(...args: Parameters<typeof honoCors>) {
|
|
8
|
-
return honoCorsMiddleware(...args)
|
|
8
|
+
return honoCorsMiddleware(...args);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export type CorsOptions = NonNullable<Parameters<typeof honoCors>[0]
|
|
11
|
+
export type CorsOptions = NonNullable<Parameters<typeof honoCors>[0]>;
|
package/src/middleware/csrf.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { csrf as honoCsrf } from
|
|
1
|
+
import { csrf as honoCsrf } from "hono/csrf";
|
|
2
2
|
|
|
3
|
-
import { wrapHonoMiddleware } from
|
|
3
|
+
import { wrapHonoMiddleware } from "./wrap-hono.js";
|
|
4
4
|
|
|
5
|
-
const honoCsrfMiddleware = wrapHonoMiddleware(honoCsrf)
|
|
5
|
+
const honoCsrfMiddleware = wrapHonoMiddleware(honoCsrf);
|
|
6
6
|
|
|
7
7
|
export function csrf(...args: Parameters<typeof honoCsrf>) {
|
|
8
|
-
return honoCsrfMiddleware(...args)
|
|
8
|
+
return honoCsrfMiddleware(...args);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export type CsrfOptions = NonNullable<Parameters<typeof honoCsrf>[0]
|
|
11
|
+
export type CsrfOptions = NonNullable<Parameters<typeof honoCsrf>[0]>;
|
package/src/middleware/etag.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { etag as honoEtag } from
|
|
1
|
+
import { etag as honoEtag } from "hono/etag";
|
|
2
2
|
|
|
3
|
-
import { wrapHonoMiddleware } from
|
|
3
|
+
import { wrapHonoMiddleware } from "./wrap-hono.js";
|
|
4
4
|
|
|
5
|
-
const honoEtagMiddleware = wrapHonoMiddleware(honoEtag)
|
|
5
|
+
const honoEtagMiddleware = wrapHonoMiddleware(honoEtag);
|
|
6
6
|
|
|
7
7
|
export function etag(...args: Parameters<typeof honoEtag>) {
|
|
8
|
-
return honoEtagMiddleware(...args)
|
|
8
|
+
return honoEtagMiddleware(...args);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export type EtagOptions = NonNullable<Parameters<typeof honoEtag>[0]
|
|
11
|
+
export type EtagOptions = NonNullable<Parameters<typeof honoEtag>[0]>;
|
package/src/middleware/jwk.ts
CHANGED
|
@@ -1,47 +1,54 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createTaserCompatHandler } from "@taserjs/router-core";
|
|
2
|
+
import type { MiddlewareHandler } from "hono";
|
|
3
|
+
import { jwk as honoJwk } from "hono/jwk";
|
|
2
4
|
|
|
3
|
-
import {
|
|
4
|
-
import type {
|
|
5
|
+
import { defineMiddleware } from "../define/middleware.js";
|
|
6
|
+
import type { JwtMiddlewareUnit, JwtPayloadState } from "./jwt.js";
|
|
5
7
|
|
|
6
|
-
export type JwkOptions = Parameters<typeof honoJwk>[0]
|
|
8
|
+
export type JwkOptions = Parameters<typeof honoJwk>[0];
|
|
7
9
|
|
|
8
|
-
export type JwkRequestInit = Pick<RequestInit,
|
|
10
|
+
export type JwkRequestInit = Pick<RequestInit, "headers">;
|
|
9
11
|
|
|
10
12
|
export type JwkMiddlewareOptions = JwkOptions & {
|
|
11
13
|
/** Allow `http://` JWKS URLs (local dev). Default false — requires `https://`. */
|
|
12
|
-
allowInsecure?: boolean
|
|
13
|
-
}
|
|
14
|
+
allowInsecure?: boolean;
|
|
15
|
+
};
|
|
14
16
|
|
|
15
17
|
function assertJwksScheme(jwksUri: string, allowInsecure: boolean): void {
|
|
16
|
-
const scheme = new URL(jwksUri).protocol.replace(
|
|
17
|
-
if (scheme ===
|
|
18
|
-
return
|
|
18
|
+
const scheme = new URL(jwksUri).protocol.replace(":", "");
|
|
19
|
+
if (scheme === "https") {
|
|
20
|
+
return;
|
|
19
21
|
}
|
|
20
|
-
if (scheme ===
|
|
21
|
-
return
|
|
22
|
+
if (scheme === "http" && allowInsecure) {
|
|
23
|
+
return;
|
|
22
24
|
}
|
|
23
|
-
throw new Error(
|
|
24
|
-
`JWKS URL must use https:// (or http:// with allowInsecure: true): "${jwksUri}"`,
|
|
25
|
-
)
|
|
25
|
+
throw new Error(`JWKS URL must use https:// (or http:// with allowInsecure: true): "${jwksUri}"`);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* JWK auth middleware. Invalid or missing tokens return **401** (Hono).
|
|
30
|
-
*
|
|
30
|
+
* Successfully decoded payload is placed in `ctx.state.jwtPayload`.
|
|
31
31
|
* Static `jwks_uri` must use HTTPS unless `allowInsecure: true`.
|
|
32
32
|
*/
|
|
33
|
-
export function jwk<TPayload
|
|
34
|
-
payloadSchema: Schema<TPayload>,
|
|
33
|
+
export function jwk<TPayload = Record<string, unknown>>(
|
|
35
34
|
options: JwkMiddlewareOptions,
|
|
36
35
|
init?: JwkRequestInit,
|
|
37
|
-
):
|
|
38
|
-
const jwksUri = options.jwks_uri
|
|
39
|
-
if (typeof jwksUri ===
|
|
40
|
-
assertJwksScheme(jwksUri, options.allowInsecure ?? false)
|
|
36
|
+
): JwtMiddlewareUnit<TPayload> {
|
|
37
|
+
const jwksUri = options.jwks_uri;
|
|
38
|
+
if (typeof jwksUri === "string") {
|
|
39
|
+
assertJwksScheme(jwksUri, options.allowInsecure ?? false);
|
|
41
40
|
}
|
|
42
41
|
|
|
43
|
-
const { allowInsecure: _allowInsecure, ...honoOptions } = options
|
|
44
|
-
const safeInit = init?.headers !== undefined ? { headers: init.headers } : undefined
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
const { allowInsecure: _allowInsecure, ...honoOptions } = options;
|
|
43
|
+
const safeInit = init?.headers !== undefined ? { headers: init.headers } : undefined;
|
|
44
|
+
const honoMw: MiddlewareHandler = honoJwk(honoOptions, safeInit);
|
|
45
|
+
|
|
46
|
+
return defineMiddleware<JwtPayloadState<TPayload>>({
|
|
47
|
+
handler: (ctx, next) => {
|
|
48
|
+
return createTaserCompatHandler(honoMw)(ctx, async () => {
|
|
49
|
+
const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
|
|
50
|
+
return next({ jwtPayload: payload as TPayload });
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
});
|
|
47
54
|
}
|
package/src/middleware/jwt.ts
CHANGED
|
@@ -1,18 +1,34 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createTaserCompatHandler } from "@taserjs/router-core";
|
|
2
|
+
import type { MiddlewareHandler } from "hono";
|
|
3
|
+
import { jwt as honoJwt } from "hono/jwt";
|
|
2
4
|
|
|
3
|
-
import {
|
|
4
|
-
import type {
|
|
5
|
+
import { defineMiddleware } from "../define/middleware.js";
|
|
6
|
+
import type { MiddlewareReturnFromParts, MiddlewareUnit } from "../types/units.js";
|
|
5
7
|
|
|
6
|
-
export type
|
|
8
|
+
export type JwtPayloadState<TPayload> = {
|
|
9
|
+
jwtPayload: TPayload;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export type JwtMiddlewareUnit<TPayload> = MiddlewareUnit<
|
|
13
|
+
MiddlewareReturnFromParts<unknown, unknown, unknown, JwtPayloadState<TPayload>>
|
|
14
|
+
>;
|
|
15
|
+
|
|
16
|
+
export type JwtOptions = Parameters<typeof honoJwt>[0];
|
|
7
17
|
|
|
8
18
|
/**
|
|
9
19
|
* JWT auth middleware. Invalid or missing tokens return **401** (Hono).
|
|
10
|
-
*
|
|
11
|
-
* Use optional schema fields for intentionally optional claims.
|
|
20
|
+
* Successfully decoded payload is placed in `ctx.state.jwtPayload`.
|
|
12
21
|
*/
|
|
13
|
-
export function jwt<TPayload
|
|
14
|
-
payloadSchema: Schema<TPayload>,
|
|
22
|
+
export function jwt<TPayload = Record<string, unknown>>(
|
|
15
23
|
options: JwtOptions,
|
|
16
|
-
):
|
|
17
|
-
|
|
24
|
+
): JwtMiddlewareUnit<TPayload> {
|
|
25
|
+
const honoMw: MiddlewareHandler = honoJwt(options);
|
|
26
|
+
return defineMiddleware<JwtPayloadState<TPayload>>({
|
|
27
|
+
handler: (ctx, next) => {
|
|
28
|
+
return createTaserCompatHandler(honoMw)(ctx, async () => {
|
|
29
|
+
const payload = (ctx as unknown as { var: { jwtPayload?: unknown } }).var.jwtPayload;
|
|
30
|
+
return next({ jwtPayload: payload as TPayload });
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
});
|
|
18
34
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { secureHeaders as honoSecureHeaders } from
|
|
1
|
+
import { secureHeaders as honoSecureHeaders } from "hono/secure-headers";
|
|
2
2
|
|
|
3
|
-
import { wrapHonoMiddleware } from
|
|
3
|
+
import { wrapHonoMiddleware } from "./wrap-hono.js";
|
|
4
4
|
|
|
5
|
-
const honoSecureHeadersMiddleware = wrapHonoMiddleware(honoSecureHeaders)
|
|
5
|
+
const honoSecureHeadersMiddleware = wrapHonoMiddleware(honoSecureHeaders);
|
|
6
6
|
|
|
7
7
|
export function secureHeaders(...args: Parameters<typeof honoSecureHeaders>) {
|
|
8
|
-
return honoSecureHeadersMiddleware(...args)
|
|
8
|
+
return honoSecureHeadersMiddleware(...args);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]
|
|
11
|
+
export type SecureHeadersOptions = NonNullable<Parameters<typeof honoSecureHeaders>[0]>;
|
package/src/middleware/timing.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { timing as honoTiming } from
|
|
1
|
+
import { timing as honoTiming } from "hono/timing";
|
|
2
2
|
|
|
3
|
-
import { wrapHonoMiddleware } from
|
|
3
|
+
import { wrapHonoMiddleware } from "./wrap-hono.js";
|
|
4
4
|
|
|
5
|
-
const honoTimingMiddleware = wrapHonoMiddleware(honoTiming)
|
|
5
|
+
const honoTimingMiddleware = wrapHonoMiddleware(honoTiming);
|
|
6
6
|
|
|
7
7
|
export function timing(...args: Parameters<typeof honoTiming>) {
|
|
8
|
-
return honoTimingMiddleware(...args)
|
|
8
|
+
return honoTimingMiddleware(...args);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]
|
|
11
|
+
export type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from "hono";
|
|
2
|
+
|
|
3
|
+
import { defineMiddleware } from "../define/middleware.js";
|
|
4
|
+
import type { MiddlewareReturnFromParts, MiddlewareUnit } from "../types/units.js";
|
|
5
|
+
|
|
6
|
+
export function wrapHonoMiddleware<F extends (...args: never[]) => MiddlewareHandler>(
|
|
7
|
+
honoFactory: F,
|
|
8
|
+
): (
|
|
9
|
+
...args: Parameters<F>
|
|
10
|
+
) => MiddlewareUnit<MiddlewareReturnFromParts<unknown, unknown, unknown, {}>> {
|
|
11
|
+
return (...args) => defineMiddleware(honoFactory(...args));
|
|
12
|
+
}
|
package/src/middleware.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import type { LayoutId, MiddlewareBuilder } from
|
|
2
|
-
import type { MiddlewareDefinition } from
|
|
1
|
+
import type { LayoutId, MiddlewareBuilder } from "./types/index.js";
|
|
2
|
+
import type { MiddlewareDefinition } from "./types/units.js";
|
|
3
3
|
|
|
4
4
|
export function createMiddleware<const Layout extends LayoutId>(
|
|
5
5
|
layout: Layout,
|
|
6
6
|
): MiddlewareBuilder<Layout, readonly []> {
|
|
7
|
-
const entries: MiddlewareDefinition[] = []
|
|
7
|
+
const entries: MiddlewareDefinition[] = [];
|
|
8
8
|
|
|
9
9
|
const chain = {
|
|
10
10
|
layout,
|
|
11
11
|
middlewares: entries,
|
|
12
12
|
use(definition: MiddlewareDefinition) {
|
|
13
|
-
entries.push(definition)
|
|
14
|
-
return chain
|
|
13
|
+
entries.push(definition);
|
|
14
|
+
return chain;
|
|
15
15
|
},
|
|
16
|
-
}
|
|
16
|
+
};
|
|
17
17
|
|
|
18
|
-
return chain as unknown as MiddlewareBuilder<Layout, readonly []
|
|
18
|
+
return chain as unknown as MiddlewareBuilder<Layout, readonly []>;
|
|
19
19
|
}
|
package/src/reply.ts
ADDED
package/src/route.ts
CHANGED
|
@@ -1,62 +1,59 @@
|
|
|
1
|
-
import type { StandardSchemaV1 } from
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
2
|
import {
|
|
3
3
|
collectReturnsFromDefinitions,
|
|
4
4
|
hasInputSchemas,
|
|
5
5
|
mergeReturnsMaps,
|
|
6
6
|
withAuto422,
|
|
7
|
-
} from
|
|
7
|
+
} from "@taserjs/router-utils";
|
|
8
8
|
|
|
9
|
-
import type { Method, RouteBuilder, RoutePath, ReturnsMap, ValidatorParts } from
|
|
10
|
-
import type { HttpMethod, MiddlewareDefinition } from
|
|
11
|
-
import { isHandlerUnit } from
|
|
12
|
-
import { HANDLER_SCHEMA_KEY_MAP } from
|
|
13
|
-
import {
|
|
14
|
-
pickDefinedSchemas,
|
|
15
|
-
type SchemaValidators,
|
|
16
|
-
} from './define/validators.js'
|
|
9
|
+
import type { Method, RouteBuilder, RoutePath, ReturnsMap, ValidatorParts } from "./types/index.js";
|
|
10
|
+
import type { HttpMethod, MiddlewareDefinition } from "./types/units.js";
|
|
11
|
+
import { isHandlerUnit } from "./types/units.js";
|
|
12
|
+
import { HANDLER_SCHEMA_KEY_MAP } from "./constants.js";
|
|
13
|
+
import { pickDefinedSchemas, type SchemaValidators } from "./define/validators.js";
|
|
17
14
|
|
|
18
15
|
function toUtilsMap(map: ReturnsMap | undefined): Record<number, StandardSchemaV1> {
|
|
19
16
|
if (!map) {
|
|
20
|
-
return {}
|
|
17
|
+
return {};
|
|
21
18
|
}
|
|
22
|
-
const out: Record<number, StandardSchemaV1> = {}
|
|
19
|
+
const out: Record<number, StandardSchemaV1> = {};
|
|
23
20
|
for (const [key, schema] of Object.entries(map)) {
|
|
24
21
|
if (schema !== undefined) {
|
|
25
|
-
out[Number(key)] = schema
|
|
22
|
+
out[Number(key)] = schema;
|
|
26
23
|
}
|
|
27
24
|
}
|
|
28
|
-
return out
|
|
25
|
+
return out;
|
|
29
26
|
}
|
|
30
27
|
|
|
31
28
|
function buildEffectiveReturns(args: {
|
|
32
|
-
middlewareReturns: ReturnsMap
|
|
33
|
-
routeReturns: ReturnsMap
|
|
34
|
-
handlerMiddlewareReturns: ReturnsMap
|
|
35
|
-
handlerReturns: ReturnsMap | undefined
|
|
29
|
+
middlewareReturns: ReturnsMap;
|
|
30
|
+
routeReturns: ReturnsMap;
|
|
31
|
+
handlerMiddlewareReturns: ReturnsMap;
|
|
32
|
+
handlerReturns: ReturnsMap | undefined;
|
|
36
33
|
schemas: {
|
|
37
|
-
query?: unknown
|
|
38
|
-
params?: unknown
|
|
39
|
-
body?: unknown
|
|
40
|
-
handlerQuery?: unknown
|
|
41
|
-
handlerParams?: unknown
|
|
42
|
-
handlerBody?: unknown
|
|
43
|
-
middlewares?: readonly MiddlewareDefinition[]
|
|
44
|
-
handlerMiddlewares?: readonly MiddlewareDefinition[]
|
|
45
|
-
}
|
|
34
|
+
query?: unknown;
|
|
35
|
+
params?: unknown;
|
|
36
|
+
body?: unknown;
|
|
37
|
+
handlerQuery?: unknown;
|
|
38
|
+
handlerParams?: unknown;
|
|
39
|
+
handlerBody?: unknown;
|
|
40
|
+
middlewares?: readonly MiddlewareDefinition[];
|
|
41
|
+
handlerMiddlewares?: readonly MiddlewareDefinition[];
|
|
42
|
+
};
|
|
46
43
|
}): Record<number, StandardSchemaV1> | undefined {
|
|
47
44
|
const merged = mergeReturnsMaps(
|
|
48
45
|
toUtilsMap(args.middlewareReturns),
|
|
49
46
|
toUtilsMap(args.routeReturns),
|
|
50
47
|
toUtilsMap(args.handlerMiddlewareReturns),
|
|
51
48
|
toUtilsMap(args.handlerReturns),
|
|
52
|
-
)
|
|
53
|
-
const with422 = withAuto422(merged, hasInputSchemas(args.schemas))
|
|
54
|
-
return Object.keys(with422).length > 0 ? with422 : undefined
|
|
49
|
+
);
|
|
50
|
+
const with422 = withAuto422(merged, hasInputSchemas(args.schemas));
|
|
51
|
+
return Object.keys(with422).length > 0 ? with422 : undefined;
|
|
55
52
|
}
|
|
56
53
|
|
|
57
54
|
function buildRouteBase(
|
|
58
55
|
path: string,
|
|
59
|
-
method: HttpMethod |
|
|
56
|
+
method: HttpMethod | "ANY" | "ALL",
|
|
60
57
|
methods: readonly HttpMethod[] | undefined,
|
|
61
58
|
middlewares: MiddlewareDefinition[],
|
|
62
59
|
) {
|
|
@@ -65,36 +62,36 @@ function buildRouteBase(
|
|
|
65
62
|
method,
|
|
66
63
|
...(methods ? { methods: [...methods] } : {}),
|
|
67
64
|
middlewares: [...middlewares],
|
|
68
|
-
}
|
|
65
|
+
};
|
|
69
66
|
}
|
|
70
67
|
|
|
71
68
|
/** Shared internal builder — not part of the public `@taserjs/router` API. */
|
|
72
69
|
export function createRouteBuilder(
|
|
73
70
|
path: string,
|
|
74
|
-
method: HttpMethod |
|
|
71
|
+
method: HttpMethod | "ANY" | "ALL",
|
|
75
72
|
validators: SchemaValidators = {},
|
|
76
73
|
methods?: readonly HttpMethod[],
|
|
77
74
|
): RouteBuilder<RoutePath, Method, readonly [], ValidatorParts> {
|
|
78
|
-
const middlewares: MiddlewareDefinition[] = []
|
|
79
|
-
let routeReturns: Record<number, StandardSchemaV1> = {}
|
|
75
|
+
const middlewares: MiddlewareDefinition[] = [];
|
|
76
|
+
let routeReturns: Record<number, StandardSchemaV1> = {};
|
|
80
77
|
|
|
81
78
|
const builder = {
|
|
82
79
|
path,
|
|
83
80
|
method,
|
|
84
81
|
returns(map: ReturnsMap) {
|
|
85
|
-
routeReturns = { ...routeReturns, ...toUtilsMap(map) }
|
|
86
|
-
return builder
|
|
82
|
+
routeReturns = { ...routeReturns, ...toUtilsMap(map) };
|
|
83
|
+
return builder;
|
|
87
84
|
},
|
|
88
85
|
use(definition: MiddlewareDefinition) {
|
|
89
|
-
middlewares.push(definition)
|
|
90
|
-
return builder
|
|
86
|
+
middlewares.push(definition);
|
|
87
|
+
return builder;
|
|
91
88
|
},
|
|
92
89
|
handler(fnOrUnit: ((ctx: unknown) => unknown) | unknown) {
|
|
93
|
-
const routeSchemas = pickDefinedSchemas(validators)
|
|
94
|
-
const base = buildRouteBase(path, method, methods, middlewares)
|
|
90
|
+
const routeSchemas = pickDefinedSchemas(validators);
|
|
91
|
+
const base = buildRouteBase(path, method, methods, middlewares);
|
|
95
92
|
|
|
96
93
|
if (isHandlerUnit(fnOrUnit)) {
|
|
97
|
-
const handlerSchemas = pickDefinedSchemas(fnOrUnit, HANDLER_SCHEMA_KEY_MAP)
|
|
94
|
+
const handlerSchemas = pickDefinedSchemas(fnOrUnit, HANDLER_SCHEMA_KEY_MAP);
|
|
98
95
|
const returns = buildEffectiveReturns({
|
|
99
96
|
middlewareReturns: collectReturnsFromDefinitions(middlewares),
|
|
100
97
|
routeReturns: routeReturns,
|
|
@@ -108,7 +105,7 @@ export function createRouteBuilder(
|
|
|
108
105
|
middlewares,
|
|
109
106
|
handlerMiddlewares: fnOrUnit.middlewares,
|
|
110
107
|
},
|
|
111
|
-
})
|
|
108
|
+
});
|
|
112
109
|
|
|
113
110
|
return {
|
|
114
111
|
...base,
|
|
@@ -117,7 +114,7 @@ export function createRouteBuilder(
|
|
|
117
114
|
...routeSchemas,
|
|
118
115
|
...handlerSchemas,
|
|
119
116
|
...(returns ? { returns } : {}),
|
|
120
|
-
}
|
|
117
|
+
};
|
|
121
118
|
}
|
|
122
119
|
|
|
123
120
|
const returns = buildEffectiveReturns({
|
|
@@ -129,7 +126,7 @@ export function createRouteBuilder(
|
|
|
129
126
|
...validators,
|
|
130
127
|
middlewares,
|
|
131
128
|
},
|
|
132
|
-
})
|
|
129
|
+
});
|
|
133
130
|
|
|
134
131
|
return {
|
|
135
132
|
...base,
|
|
@@ -137,9 +134,9 @@ export function createRouteBuilder(
|
|
|
137
134
|
handler: fnOrUnit as (ctx: unknown) => Response | Promise<Response>,
|
|
138
135
|
...routeSchemas,
|
|
139
136
|
...(returns ? { returns } : {}),
|
|
140
|
-
}
|
|
137
|
+
};
|
|
141
138
|
},
|
|
142
|
-
}
|
|
139
|
+
};
|
|
143
140
|
|
|
144
|
-
return builder as unknown as RouteBuilder<RoutePath, Method, readonly [], ValidatorParts
|
|
141
|
+
return builder as unknown as RouteBuilder<RoutePath, Method, readonly [], ValidatorParts>;
|
|
145
142
|
}
|
package/src/stream.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { blob, buffer, file, pipe, stream } from "@taserjs/router-utils";
|
package/src/taser-app.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import type { TaserRuntime } from
|
|
2
|
-
import type { RouteManifestShape } from
|
|
1
|
+
import type { TaserRuntime } from "@taserjs/router-core";
|
|
2
|
+
import type { RouteManifestShape } from "@taserjs/router-core";
|
|
3
3
|
|
|
4
4
|
class TaserServeView {
|
|
5
|
-
constructor(protected readonly runtime: TaserRuntime) {
|
|
5
|
+
constructor(protected readonly runtime: TaserRuntime) {}
|
|
6
6
|
|
|
7
7
|
fetch(request: Request, env?: unknown, executionCtx?: unknown): Promise<Response> {
|
|
8
|
-
return this.runtime.fetch(request, env, executionCtx as never)
|
|
8
|
+
return this.runtime.fetch(request, env, executionCtx as never);
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
native(native: unknown): TaserNativeBound {
|
|
12
|
-
return new TaserNativeBound(this.runtime, native)
|
|
12
|
+
return new TaserNativeBound(this.runtime, native);
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
|
|
@@ -17,27 +17,22 @@ export class TaserNativeBound {
|
|
|
17
17
|
constructor(
|
|
18
18
|
private readonly runtime: TaserRuntime,
|
|
19
19
|
private readonly boundNative: unknown,
|
|
20
|
-
) {
|
|
20
|
+
) {}
|
|
21
21
|
|
|
22
22
|
fetch(request: Request, env?: unknown, executionCtx?: unknown): Promise<Response> {
|
|
23
|
-
return this.runtime.native(this.boundNative).fetch(request, env, executionCtx as never)
|
|
23
|
+
return this.runtime.native(this.boundNative).fetch(request, env, executionCtx as never);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export class
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
readonly __manifest?: TManifest
|
|
27
|
+
export class TaserApp<
|
|
28
|
+
TManifest extends RouteManifestShape = RouteManifestShape,
|
|
29
|
+
> extends TaserServeView {
|
|
30
|
+
readonly __manifest?: TManifest;
|
|
31
31
|
|
|
32
32
|
constructor(runtime: TaserRuntime, manifest?: TManifest) {
|
|
33
|
-
super(runtime)
|
|
33
|
+
super(runtime);
|
|
34
34
|
if (manifest !== undefined) {
|
|
35
|
-
this.__manifest = manifest
|
|
35
|
+
this.__manifest = manifest;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
base(prefix: string): TaserMountedApp {
|
|
40
|
-
this.runtime.registerRoutePrefix(prefix)
|
|
41
|
-
return new TaserMountedApp(this.runtime)
|
|
42
|
-
}
|
|
43
38
|
}
|