@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.
Files changed (142) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/constants.cjs.map +1 -1
  3. package/dist/cjs/create-context.cjs.map +1 -1
  4. package/dist/cjs/define/handler.cjs.map +1 -1
  5. package/dist/cjs/define/middleware.cjs +5 -24
  6. package/dist/cjs/define/middleware.cjs.map +1 -1
  7. package/dist/cjs/define/middleware.d.cts +10 -79
  8. package/dist/cjs/define/validators.cjs.map +1 -1
  9. package/dist/cjs/factories.cjs.map +1 -1
  10. package/dist/cjs/factories.d.cts +2 -2
  11. package/dist/cjs/index.cjs +7 -2
  12. package/dist/cjs/index.d.cts +2 -2
  13. package/dist/cjs/middleware/body-limit.cjs +2 -2
  14. package/dist/cjs/middleware/body-limit.cjs.map +1 -1
  15. package/dist/cjs/middleware/compress.cjs +2 -2
  16. package/dist/cjs/middleware/compress.cjs.map +1 -1
  17. package/dist/cjs/middleware/cors.cjs +2 -2
  18. package/dist/cjs/middleware/cors.cjs.map +1 -1
  19. package/dist/cjs/middleware/csrf.cjs +2 -2
  20. package/dist/cjs/middleware/csrf.cjs.map +1 -1
  21. package/dist/cjs/middleware/etag.cjs +2 -2
  22. package/dist/cjs/middleware/etag.cjs.map +1 -1
  23. package/dist/cjs/middleware/jwk.cjs +11 -4
  24. package/dist/cjs/middleware/jwk.cjs.map +1 -1
  25. package/dist/cjs/middleware/jwk.d.cts +4 -5
  26. package/dist/cjs/middleware/jwt.cjs +11 -5
  27. package/dist/cjs/middleware/jwt.cjs.map +1 -1
  28. package/dist/cjs/middleware/jwt.d.cts +7 -5
  29. package/dist/cjs/middleware/secure-headers.cjs +2 -2
  30. package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
  31. package/dist/cjs/middleware/timing.cjs +2 -2
  32. package/dist/cjs/middleware/timing.cjs.map +1 -1
  33. package/dist/cjs/middleware/wrap-hono.cjs +9 -0
  34. package/dist/cjs/middleware/wrap-hono.cjs.map +1 -0
  35. package/dist/cjs/middleware/wrap-hono.d.cts +3 -0
  36. package/dist/cjs/middleware.cjs.map +1 -1
  37. package/dist/cjs/reply.cjs +20 -0
  38. package/dist/cjs/reply.d.cts +2 -0
  39. package/dist/cjs/route.cjs.map +1 -1
  40. package/dist/cjs/route.d.cts +1 -1
  41. package/dist/cjs/stream.cjs +32 -0
  42. package/dist/cjs/stream.d.cts +1 -0
  43. package/dist/cjs/taser-app.cjs +0 -6
  44. package/dist/cjs/taser-app.cjs.map +1 -1
  45. package/dist/cjs/taser-app.d.cts +0 -3
  46. package/dist/cjs/taser-router.cjs +9 -10
  47. package/dist/cjs/taser-router.cjs.map +1 -1
  48. package/dist/cjs/taser-router.d.cts +9 -11
  49. package/dist/cjs/types/app.d.cts +3 -2
  50. package/dist/cjs/types/index.d.cts +53 -139
  51. package/dist/cjs/types/type-utils.d.cts +8 -11
  52. package/dist/cjs/types/units.cjs.map +1 -1
  53. package/dist/cjs/types/units.d.cts +27 -24
  54. package/dist/esm/constants.js.map +1 -1
  55. package/dist/esm/create-context.js.map +1 -1
  56. package/dist/esm/define/handler.js.map +1 -1
  57. package/dist/esm/define/middleware.d.ts +10 -79
  58. package/dist/esm/define/middleware.js +5 -24
  59. package/dist/esm/define/middleware.js.map +1 -1
  60. package/dist/esm/define/validators.js.map +1 -1
  61. package/dist/esm/factories.d.ts +2 -2
  62. package/dist/esm/factories.js.map +1 -1
  63. package/dist/esm/index.d.ts +2 -2
  64. package/dist/esm/index.js +4 -4
  65. package/dist/esm/middleware/body-limit.js +1 -1
  66. package/dist/esm/middleware/body-limit.js.map +1 -1
  67. package/dist/esm/middleware/compress.js +1 -1
  68. package/dist/esm/middleware/compress.js.map +1 -1
  69. package/dist/esm/middleware/cors.js +1 -1
  70. package/dist/esm/middleware/cors.js.map +1 -1
  71. package/dist/esm/middleware/csrf.js +1 -1
  72. package/dist/esm/middleware/csrf.js.map +1 -1
  73. package/dist/esm/middleware/etag.js +1 -1
  74. package/dist/esm/middleware/etag.js.map +1 -1
  75. package/dist/esm/middleware/jwk.d.ts +4 -5
  76. package/dist/esm/middleware/jwk.js +11 -4
  77. package/dist/esm/middleware/jwk.js.map +1 -1
  78. package/dist/esm/middleware/jwt.d.ts +7 -5
  79. package/dist/esm/middleware/jwt.js +11 -5
  80. package/dist/esm/middleware/jwt.js.map +1 -1
  81. package/dist/esm/middleware/secure-headers.js +1 -1
  82. package/dist/esm/middleware/secure-headers.js.map +1 -1
  83. package/dist/esm/middleware/timing.js +1 -1
  84. package/dist/esm/middleware/timing.js.map +1 -1
  85. package/dist/esm/middleware/wrap-hono.d.ts +3 -0
  86. package/dist/esm/middleware/wrap-hono.js +9 -0
  87. package/dist/esm/middleware/wrap-hono.js.map +1 -0
  88. package/dist/esm/middleware.js.map +1 -1
  89. package/dist/esm/reply.d.ts +2 -0
  90. package/dist/esm/reply.js +2 -0
  91. package/dist/esm/route.d.ts +1 -1
  92. package/dist/esm/route.js.map +1 -1
  93. package/dist/esm/stream.d.ts +1 -0
  94. package/dist/esm/stream.js +2 -0
  95. package/dist/esm/taser-app.d.ts +0 -3
  96. package/dist/esm/taser-app.js +1 -6
  97. package/dist/esm/taser-app.js.map +1 -1
  98. package/dist/esm/taser-router.d.ts +9 -11
  99. package/dist/esm/taser-router.js +7 -8
  100. package/dist/esm/taser-router.js.map +1 -1
  101. package/dist/esm/types/app.d.ts +3 -2
  102. package/dist/esm/types/index.d.ts +53 -139
  103. package/dist/esm/types/type-utils.d.ts +8 -11
  104. package/dist/esm/types/units.d.ts +27 -24
  105. package/dist/esm/types/units.js.map +1 -1
  106. package/package.json +37 -17
  107. package/src/constants.ts +6 -6
  108. package/src/create-context.ts +8 -8
  109. package/src/define/handler.ts +24 -34
  110. package/src/define/middleware.ts +66 -256
  111. package/src/define/validators.ts +10 -10
  112. package/src/factories.ts +63 -61
  113. package/src/index.ts +13 -12
  114. package/src/middleware/body-limit.ts +5 -5
  115. package/src/middleware/compress.ts +5 -5
  116. package/src/middleware/cors.ts +5 -5
  117. package/src/middleware/csrf.ts +5 -5
  118. package/src/middleware/etag.ts +5 -5
  119. package/src/middleware/jwk.ts +33 -26
  120. package/src/middleware/jwt.ts +26 -10
  121. package/src/middleware/secure-headers.ts +5 -5
  122. package/src/middleware/timing.ts +5 -5
  123. package/src/middleware/wrap-hono.ts +12 -0
  124. package/src/middleware.ts +7 -7
  125. package/src/reply.ts +11 -0
  126. package/src/route.ts +45 -48
  127. package/src/stream.ts +1 -0
  128. package/src/taser-app.ts +13 -18
  129. package/src/taser-router.ts +103 -98
  130. package/src/types/app.ts +33 -35
  131. package/src/types/index.ts +299 -722
  132. package/src/types/returns.ts +92 -97
  133. package/src/types/schema.ts +8 -9
  134. package/src/types/type-utils.ts +42 -46
  135. package/src/types/units.ts +135 -104
  136. package/dist/cjs/middleware/auth.cjs +0 -34
  137. package/dist/cjs/middleware/auth.cjs.map +0 -1
  138. package/dist/cjs/middleware/auth.d.cts +0 -9
  139. package/dist/esm/middleware/auth.d.ts +0 -9
  140. package/dist/esm/middleware/auth.js +0 -33
  141. package/dist/esm/middleware/auth.js.map +0 -1
  142. package/src/middleware/auth.ts +0 -51
@@ -1,11 +1,11 @@
1
- import { compress as honoCompress } from 'hono/compress'
1
+ import { compress as honoCompress } from "hono/compress";
2
2
 
3
- import { wrapHonoMiddleware } from './auth.js'
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]>;
@@ -1,11 +1,11 @@
1
- import { cors as honoCors } from 'hono/cors'
1
+ import { cors as honoCors } from "hono/cors";
2
2
 
3
- import { wrapHonoMiddleware } from './auth.js'
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]>;
@@ -1,11 +1,11 @@
1
- import { csrf as honoCsrf } from 'hono/csrf'
1
+ import { csrf as honoCsrf } from "hono/csrf";
2
2
 
3
- import { wrapHonoMiddleware } from './auth.js'
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]>;
@@ -1,11 +1,11 @@
1
- import { etag as honoEtag } from 'hono/etag'
1
+ import { etag as honoEtag } from "hono/etag";
2
2
 
3
- import { wrapHonoMiddleware } from './auth.js'
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]>;
@@ -1,47 +1,54 @@
1
- import { jwk as honoJwk } from 'hono/jwk'
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 { createAuthMiddleware, type AuthMiddlewareUnit } from './auth.js'
4
- import type { InferOutput, Schema } from '../types/schema.js'
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, 'headers'>
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 === 'https') {
18
- return
18
+ const scheme = new URL(jwksUri).protocol.replace(":", "");
19
+ if (scheme === "https") {
20
+ return;
19
21
  }
20
- if (scheme === 'http' && allowInsecure) {
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
- * Valid tokens whose payload fails `payloadSchema` return **403**.
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
- ): AuthMiddlewareUnit<InferOutput<Schema<TPayload>>> {
38
- const jwksUri = options.jwks_uri
39
- if (typeof jwksUri === 'string') {
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
- return createAuthMiddleware(payloadSchema, honoJwk(honoOptions, safeInit))
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
  }
@@ -1,18 +1,34 @@
1
- import { jwt as honoJwt } from 'hono/jwt'
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 { createAuthMiddleware, type AuthMiddlewareUnit } from './auth.js'
4
- import type { InferOutput, Schema } from '../types/schema.js'
5
+ import { defineMiddleware } from "../define/middleware.js";
6
+ import type { MiddlewareReturnFromParts, MiddlewareUnit } from "../types/units.js";
5
7
 
6
- export type JwtOptions = Parameters<typeof honoJwt>[0]
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
- * Valid tokens whose payload fails `payloadSchema` return **403**.
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
- ): AuthMiddlewareUnit<InferOutput<Schema<TPayload>>> {
17
- return createAuthMiddleware(payloadSchema, honoJwt(options))
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 'hono/secure-headers'
1
+ import { secureHeaders as honoSecureHeaders } from "hono/secure-headers";
2
2
 
3
- import { wrapHonoMiddleware } from './auth.js'
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]>;
@@ -1,11 +1,11 @@
1
- import { timing as honoTiming } from 'hono/timing'
1
+ import { timing as honoTiming } from "hono/timing";
2
2
 
3
- import { wrapHonoMiddleware } from './auth.js'
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 './types/index.js'
2
- import type { MiddlewareDefinition } from './types/units.js'
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
@@ -0,0 +1,11 @@
1
+ export { errorReply, reply, successReply } from "@taserjs/router-utils/reply";
2
+ export type {
3
+ BinaryBody,
4
+ BodyKind,
5
+ FileReplyInit,
6
+ RedirectInit,
7
+ ReplyBodyKind,
8
+ ReplyInit,
9
+ ReplyOf,
10
+ SuccessReplyData,
11
+ } from "@taserjs/router-utils/reply";
package/src/route.ts CHANGED
@@ -1,62 +1,59 @@
1
- import type { StandardSchemaV1 } from '@standard-schema/spec'
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 '@taserjs/router-utils'
7
+ } from "@taserjs/router-utils";
8
8
 
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 {
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 | 'ANY' | 'ALL',
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 | 'ANY' | 'ALL',
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 '@taserjs/router-core'
2
- import type { RouteManifestShape } from '@taserjs/router-core'
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 TaserMountedApp extends TaserServeView { }
28
-
29
- export class TaserApp<TManifest extends RouteManifestShape = RouteManifestShape> extends TaserServeView {
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
  }