@taserjs/router 0.0.2 → 0.0.4

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 (138) 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 +18 -27
  6. package/dist/cjs/define/middleware.cjs.map +1 -1
  7. package/dist/cjs/define/middleware.d.cts +27 -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 +1 -2
  12. package/dist/cjs/index.d.cts +1 -1
  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.d.cts +1 -1
  38. package/dist/cjs/route.cjs.map +1 -1
  39. package/dist/cjs/route.d.cts +1 -1
  40. package/dist/cjs/stream.d.cts +1 -1
  41. package/dist/cjs/taser-app.cjs +0 -6
  42. package/dist/cjs/taser-app.cjs.map +1 -1
  43. package/dist/cjs/taser-app.d.cts +0 -3
  44. package/dist/cjs/taser-router.cjs +9 -10
  45. package/dist/cjs/taser-router.cjs.map +1 -1
  46. package/dist/cjs/taser-router.d.cts +9 -11
  47. package/dist/cjs/types/app.d.cts +3 -2
  48. package/dist/cjs/types/index.d.cts +94 -143
  49. package/dist/cjs/types/type-utils.d.cts +8 -10
  50. package/dist/cjs/types/units.cjs.map +1 -1
  51. package/dist/cjs/types/units.d.cts +32 -27
  52. package/dist/esm/constants.js.map +1 -1
  53. package/dist/esm/create-context.js.map +1 -1
  54. package/dist/esm/define/handler.js.map +1 -1
  55. package/dist/esm/define/middleware.d.ts +27 -79
  56. package/dist/esm/define/middleware.js +18 -27
  57. package/dist/esm/define/middleware.js.map +1 -1
  58. package/dist/esm/define/validators.js.map +1 -1
  59. package/dist/esm/factories.d.ts +2 -2
  60. package/dist/esm/factories.js.map +1 -1
  61. package/dist/esm/index.d.ts +1 -1
  62. package/dist/esm/index.js +3 -3
  63. package/dist/esm/middleware/body-limit.js +1 -1
  64. package/dist/esm/middleware/body-limit.js.map +1 -1
  65. package/dist/esm/middleware/compress.js +1 -1
  66. package/dist/esm/middleware/compress.js.map +1 -1
  67. package/dist/esm/middleware/cors.js +1 -1
  68. package/dist/esm/middleware/cors.js.map +1 -1
  69. package/dist/esm/middleware/csrf.js +1 -1
  70. package/dist/esm/middleware/csrf.js.map +1 -1
  71. package/dist/esm/middleware/etag.js +1 -1
  72. package/dist/esm/middleware/etag.js.map +1 -1
  73. package/dist/esm/middleware/jwk.d.ts +4 -5
  74. package/dist/esm/middleware/jwk.js +11 -4
  75. package/dist/esm/middleware/jwk.js.map +1 -1
  76. package/dist/esm/middleware/jwt.d.ts +7 -5
  77. package/dist/esm/middleware/jwt.js +11 -5
  78. package/dist/esm/middleware/jwt.js.map +1 -1
  79. package/dist/esm/middleware/secure-headers.js +1 -1
  80. package/dist/esm/middleware/secure-headers.js.map +1 -1
  81. package/dist/esm/middleware/timing.js +1 -1
  82. package/dist/esm/middleware/timing.js.map +1 -1
  83. package/dist/esm/middleware/wrap-hono.d.ts +3 -0
  84. package/dist/esm/middleware/wrap-hono.js +9 -0
  85. package/dist/esm/middleware/wrap-hono.js.map +1 -0
  86. package/dist/esm/middleware.js.map +1 -1
  87. package/dist/esm/reply.d.ts +1 -1
  88. package/dist/esm/route.d.ts +1 -1
  89. package/dist/esm/route.js.map +1 -1
  90. package/dist/esm/stream.d.ts +1 -1
  91. package/dist/esm/taser-app.d.ts +0 -3
  92. package/dist/esm/taser-app.js +1 -6
  93. package/dist/esm/taser-app.js.map +1 -1
  94. package/dist/esm/taser-router.d.ts +9 -11
  95. package/dist/esm/taser-router.js +7 -8
  96. package/dist/esm/taser-router.js.map +1 -1
  97. package/dist/esm/types/app.d.ts +3 -2
  98. package/dist/esm/types/index.d.ts +94 -143
  99. package/dist/esm/types/type-utils.d.ts +8 -10
  100. package/dist/esm/types/units.d.ts +32 -27
  101. package/dist/esm/types/units.js.map +1 -1
  102. package/package.json +17 -17
  103. package/src/constants.ts +6 -6
  104. package/src/create-context.ts +8 -8
  105. package/src/define/handler.ts +24 -34
  106. package/src/define/middleware.ts +222 -222
  107. package/src/define/validators.ts +10 -10
  108. package/src/factories.ts +63 -61
  109. package/src/index.ts +12 -12
  110. package/src/middleware/body-limit.ts +5 -5
  111. package/src/middleware/compress.ts +5 -5
  112. package/src/middleware/cors.ts +5 -5
  113. package/src/middleware/csrf.ts +5 -5
  114. package/src/middleware/etag.ts +5 -5
  115. package/src/middleware/jwk.ts +33 -26
  116. package/src/middleware/jwt.ts +26 -10
  117. package/src/middleware/secure-headers.ts +5 -5
  118. package/src/middleware/timing.ts +5 -5
  119. package/src/middleware/wrap-hono.ts +12 -0
  120. package/src/middleware.ts +7 -7
  121. package/src/reply.ts +2 -6
  122. package/src/route.ts +45 -48
  123. package/src/stream.ts +1 -7
  124. package/src/taser-app.ts +13 -18
  125. package/src/taser-router.ts +103 -98
  126. package/src/types/app.ts +33 -35
  127. package/src/types/index.ts +403 -731
  128. package/src/types/returns.ts +92 -97
  129. package/src/types/schema.ts +8 -9
  130. package/src/types/type-utils.ts +42 -45
  131. package/src/types/units.ts +140 -104
  132. package/dist/cjs/middleware/auth.cjs +0 -34
  133. package/dist/cjs/middleware/auth.cjs.map +0 -1
  134. package/dist/cjs/middleware/auth.d.cts +0 -9
  135. package/dist/esm/middleware/auth.d.ts +0 -9
  136. package/dist/esm/middleware/auth.js +0 -33
  137. package/dist/esm/middleware/auth.js.map +0 -1
  138. package/src/middleware/auth.ts +0 -51
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 CHANGED
@@ -1,7 +1 @@
1
- export {
2
- blob,
3
- buffer,
4
- file,
5
- pipe,
6
- stream,
7
- } from '@taserjs/router-utils'
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
  }
@@ -3,8 +3,8 @@ import {
3
3
  type NotFoundHandler,
4
4
  type OnErrorHandler,
5
5
  type RouteManifestShape,
6
- } from '@taserjs/router-core'
7
- import { normalizeOnError } from '@taserjs/router-utils'
6
+ } from "@taserjs/router-core";
7
+ import { normalizeOnError } from "@taserjs/router-utils";
8
8
 
9
9
  import {
10
10
  createAllRoute,
@@ -16,145 +16,150 @@ import {
16
16
  createPatchRoute,
17
17
  createPostRoute,
18
18
  createPutRoute,
19
- } from './factories.js'
20
- import { defineHandler } from './define/handler.js'
21
- import { defineMiddleware } from './define/middleware.js'
22
- import { createMiddleware } from './middleware.js'
23
- import { TaserApp } from './taser-app.js'
24
- import type {
25
- ContextDefinition,
26
- CreateTaserAppOptions,
27
- OnErrorOptions,
28
- } from './types/app.js'
29
- import type { AppContext } from './types/units.js'
30
- import type { HandlerBuilder, LayoutId, MiddlewareBuilder } from './types/index.js'
31
- import type { Schema } from './types/schema.js'
19
+ } from "./factories.js";
20
+ import { defineHandler } from "./define/handler.js";
21
+ import { createMiddleware } from "./middleware.js";
22
+ import { TaserApp } from "./taser-app.js";
23
+ import type { ContextDefinition, CreateTaserAppOptions, OnErrorOptions } from "./types/app.js";
24
+ import type { AppContext } from "./types/units.js";
25
+ import type { HandlerBuilder, LayoutId, MiddlewareBuilder } from "./types/index.js";
26
+ import type { Schema } from "./types/schema.js";
32
27
  import type {
33
28
  CreateAllRoute,
34
29
  CreateAnyRoute,
35
30
  CreateWithBodyRoute,
36
31
  CreateWithoutBodyRoute,
37
- } from './factories.js'
32
+ } from "./factories.js";
38
33
 
39
34
  function toOnErrorHandler(
40
- onErrorOptions: OnErrorOptions | OnErrorOptions['handle'],
35
+ onErrorOptions: OnErrorOptions | OnErrorOptions["handle"],
41
36
  ): OnErrorHandler {
42
- return normalizeOnError(onErrorOptions)
37
+ return normalizeOnError(onErrorOptions);
43
38
  }
44
39
 
45
40
  type RouterState = {
46
- options: CreateTaserAppOptions
47
- contextDef: ContextDefinition<Record<string, unknown>, Record<string, unknown>>
48
- onError?: OnErrorHandler
49
- notFound?: NotFoundHandler
50
- }
41
+ options: CreateTaserAppOptions;
42
+ contextDef: ContextDefinition<Record<string, unknown>, Record<string, unknown>>;
43
+ onError?: OnErrorHandler;
44
+ notFound?: NotFoundHandler;
45
+ };
51
46
 
52
- const emptyContext: ContextDefinition<Record<string, unknown>, Record<string, unknown>> = {}
47
+ const emptyContext: ContextDefinition<Record<string, unknown>, Record<string, unknown>> = {};
53
48
 
54
49
  export class TaserRouter<TAppContext extends Record<string, unknown> = AppContext> {
55
- private readonly state: RouterState
50
+ private readonly state: RouterState;
56
51
 
57
- constructor(options: CreateTaserAppOptions = {}, state?: Partial<Omit<RouterState, 'options'>>) {
52
+ constructor(options: CreateTaserAppOptions = {}, state?: Partial<Omit<RouterState, "options">>) {
58
53
  this.state = {
59
54
  options,
60
55
  contextDef: state?.contextDef ?? emptyContext,
61
56
  ...(state?.onError !== undefined ? { onError: state.onError } : {}),
62
57
  ...(state?.notFound !== undefined ? { notFound: state.notFound } : {}),
63
- }
58
+ };
64
59
  }
65
60
 
66
- context<
67
- TBoot extends Record<string, unknown>,
68
- TReq extends Record<string, unknown>,
69
- >(definition: ContextDefinition<TBoot, TReq>): TaserRouter<TBoot & TReq> {
70
- this.state.contextDef = definition
71
- return this as unknown as TaserRouter<TBoot & TReq>
61
+ context<TBoot extends Record<string, unknown>, TReq extends Record<string, unknown>>(
62
+ definition: ContextDefinition<TBoot, TReq>,
63
+ ): TaserRouter<TBoot & TReq> {
64
+ this.state.contextDef = definition;
65
+ return this as unknown as TaserRouter<TBoot & TReq>;
72
66
  }
73
67
 
74
- onError<TResponses extends import('./types/returns.js').ReturnsMap = import('./types/returns.js').ReturnsMap>(
75
- options: OnErrorOptions<TResponses> | OnErrorOptions<TResponses>['handle'],
76
- ): this {
77
- this.state.onError = toOnErrorHandler(options)
78
- return this
68
+ onError<
69
+ TResponses extends import("./types/returns.js").ReturnsMap =
70
+ import("./types/returns.js").ReturnsMap,
71
+ >(options: OnErrorOptions<TResponses> | OnErrorOptions<TResponses>["handle"]): this {
72
+ this.state.onError = toOnErrorHandler(options);
73
+ return this;
79
74
  }
80
75
 
81
- notFound(
82
- handler: (ctx: unknown) => Response | Promise<Response> | unknown,
83
- ): this {
84
- this.state.notFound = ctx => handler(ctx)
85
- return this
76
+ notFound(handler: (ctx: unknown) => Response | Promise<Response> | unknown): this {
77
+ this.state.notFound = (ctx) => handler(ctx);
78
+ return this;
86
79
  }
87
80
 
88
- get: CreateWithoutBodyRoute<'GET', TAppContext> = createGetRoute as CreateWithoutBodyRoute<'GET', TAppContext>
89
- post: CreateWithBodyRoute<'POST', TAppContext> = createPostRoute as CreateWithBodyRoute<'POST', TAppContext>
90
- put: CreateWithBodyRoute<'PUT', TAppContext> = createPutRoute as CreateWithBodyRoute<'PUT', TAppContext>
91
- patch: CreateWithBodyRoute<'PATCH', TAppContext> = createPatchRoute as CreateWithBodyRoute<'PATCH', TAppContext>
92
- delete: CreateWithoutBodyRoute<'DELETE', TAppContext> = createDeleteRoute as CreateWithoutBodyRoute<'DELETE', TAppContext>
93
- options: CreateWithoutBodyRoute<'OPTIONS', TAppContext> = createOptionsRoute as CreateWithoutBodyRoute<'OPTIONS', TAppContext>
94
- head: CreateWithoutBodyRoute<'HEAD', TAppContext> = createHeadRoute as CreateWithoutBodyRoute<'HEAD', TAppContext>
95
- any: CreateAnyRoute<TAppContext> = createAnyRoute as CreateAnyRoute<TAppContext>
96
- all: CreateAllRoute<TAppContext> = createAllRoute as CreateAllRoute<TAppContext>
97
-
98
- middleware<const Layout extends LayoutId>(layout: Layout): MiddlewareBuilder<Layout, readonly [], TAppContext> {
99
- return createMiddleware(layout) as MiddlewareBuilder<Layout, readonly [], TAppContext>
81
+ get: CreateWithoutBodyRoute<"GET", TAppContext> = createGetRoute as CreateWithoutBodyRoute<
82
+ "GET",
83
+ TAppContext
84
+ >;
85
+ post: CreateWithBodyRoute<"POST", TAppContext> = createPostRoute as CreateWithBodyRoute<
86
+ "POST",
87
+ TAppContext
88
+ >;
89
+ put: CreateWithBodyRoute<"PUT", TAppContext> = createPutRoute as CreateWithBodyRoute<
90
+ "PUT",
91
+ TAppContext
92
+ >;
93
+ patch: CreateWithBodyRoute<"PATCH", TAppContext> = createPatchRoute as CreateWithBodyRoute<
94
+ "PATCH",
95
+ TAppContext
96
+ >;
97
+ delete: CreateWithoutBodyRoute<"DELETE", TAppContext> =
98
+ createDeleteRoute as CreateWithoutBodyRoute<"DELETE", TAppContext>;
99
+ options: CreateWithoutBodyRoute<"OPTIONS", TAppContext> =
100
+ createOptionsRoute as CreateWithoutBodyRoute<"OPTIONS", TAppContext>;
101
+ head: CreateWithoutBodyRoute<"HEAD", TAppContext> = createHeadRoute as CreateWithoutBodyRoute<
102
+ "HEAD",
103
+ TAppContext
104
+ >;
105
+ any: CreateAnyRoute<TAppContext> = createAnyRoute as CreateAnyRoute<TAppContext>;
106
+ all: CreateAllRoute<TAppContext> = createAllRoute as CreateAllRoute<TAppContext>;
107
+
108
+ middleware<const Layout extends LayoutId>(
109
+ layout: Layout,
110
+ ): MiddlewareBuilder<Layout, readonly [], TAppContext> {
111
+ return createMiddleware(layout) as MiddlewareBuilder<Layout, readonly [], TAppContext>;
100
112
  }
101
113
 
102
- defineHandler<
103
- TQuery = unknown,
104
- TParams = unknown,
105
- TBody = unknown,
106
- >(
107
- options?: {
108
- query?: Schema<TQuery>
109
- params?: Schema<TParams>
110
- body?: Schema<TBody>
111
- },
112
- ): HandlerBuilder<
114
+ defineHandler<TQuery = unknown, TParams = unknown, TBody = unknown>(options?: {
115
+ query?: Schema<TQuery>;
116
+ params?: Schema<TParams>;
117
+ body?: Schema<TBody>;
118
+ }): HandlerBuilder<
113
119
  readonly [],
114
- { query: TQuery, params: TParams, body: TBody },
120
+ { query: TQuery; params: TParams; body: TBody },
115
121
  {},
116
122
  TAppContext
117
123
  > {
118
124
  return options === undefined
119
125
  ? defineHandler<TAppContext>()
120
- : defineHandler<TAppContext>(options)
121
- }
122
-
123
- defineMiddleware(): ReturnType<typeof defineMiddleware<TAppContext>> {
124
- return defineMiddleware<TAppContext>()
126
+ : defineHandler<TAppContext>(options);
125
127
  }
126
128
 
127
129
  create<const TManifest extends RouteManifestShape>(manifest: TManifest): TaserApp<TManifest> {
128
- const definition = this.state.contextDef
129
- const validateResponse = this.state.options.response?.validate ?? true
130
- const onValidationFailure = this.state.options.response?.onValidationFailure
131
- const bootPromise = Promise.resolve(
132
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
133
- definition.boot?.() ?? ({} as Record<string, unknown>),
134
- )
135
-
136
- const runtime = createTaserRuntime(
137
- manifest,
138
- async ({ native }) => {
139
- const bootContext = await bootPromise
140
- const requestContext = await definition.request?.({ native }) ?? {}
141
- return { ...bootContext, ...requestContext }
142
- },
143
- {
144
- response: {
145
- validate: validateResponse,
146
- ...(onValidationFailure !== undefined ? { onValidationFailure } : {}),
147
- },
148
- ...(this.state.onError !== undefined ? { onError: this.state.onError } : {}),
149
- ...(this.state.notFound !== undefined ? { notFound: this.state.notFound } : {}),
150
- ...(this.state.options.cookies !== undefined ? { cookies: this.state.options.cookies } : {}),
130
+ const definition = this.state.contextDef;
131
+ const validateResponse = this.state.options.response?.validate ?? true;
132
+ const onValidationFailure = this.state.options.response?.onValidationFailure;
133
+ const basePath = this.state.options.basePath;
134
+
135
+ const hasCustomContext = definition.boot !== undefined || definition.request !== undefined;
136
+ const bootPromise = hasCustomContext
137
+ ? Promise.resolve(definition.boot?.() ?? ({} as Record<string, unknown>))
138
+ : undefined;
139
+
140
+ const contextFactory = hasCustomContext
141
+ ? async ({ native }: { native?: unknown } = {}) => {
142
+ const bootContext = (await bootPromise) ?? {};
143
+ const requestContext = (await definition.request?.({ native: native as never })) ?? {};
144
+ return { ...bootContext, ...requestContext };
145
+ }
146
+ : () => ({});
147
+
148
+ const runtime = createTaserRuntime(manifest, contextFactory, {
149
+ ...(basePath !== undefined ? { basePath } : {}),
150
+ response: {
151
+ validate: validateResponse,
152
+ ...(onValidationFailure !== undefined ? { onValidationFailure } : {}),
151
153
  },
152
- )
154
+ ...(this.state.onError !== undefined ? { onError: this.state.onError } : {}),
155
+ ...(this.state.notFound !== undefined ? { notFound: this.state.notFound } : {}),
156
+ ...(this.state.options.cookies !== undefined ? { cookies: this.state.options.cookies } : {}),
157
+ });
153
158
 
154
- return new TaserApp(runtime, manifest)
159
+ return new TaserApp(runtime, manifest);
155
160
  }
156
161
  }
157
162
 
158
163
  export function createTaserApp(options: CreateTaserAppOptions = {}): TaserRouter {
159
- return new TaserRouter(options)
164
+ return new TaserRouter(options);
160
165
  }
package/src/types/app.ts CHANGED
@@ -1,53 +1,51 @@
1
- import type { ResponseValidationFailureHandler } from '@taserjs/router-utils'
1
+ import type { ResponseValidationFailureHandler } from "@taserjs/router-utils";
2
2
 
3
- import type { TaserApp } from '../taser-app.js'
4
- import type { ReturnsMap } from './returns.js'
5
- import type { Schema } from './schema.js'
3
+ import type { TaserApp } from "../taser-app.js";
4
+ import type { ReturnsMap } from "./returns.js";
5
+ import type { Schema } from "./schema.js";
6
6
 
7
7
  export type CreateTaserAppOptions = {
8
+ basePath?: string;
8
9
  response?: {
9
10
  /** Validate handler replies against returns maps. Default true. */
10
- validate?: boolean
11
- onValidationFailure?: ResponseValidationFailureHandler
12
- }
11
+ validate?: boolean;
12
+ onValidationFailure?: ResponseValidationFailureHandler;
13
+ };
13
14
  /** Global cookie defaults and signing secret. Per-call `ctx.cookies.set` options override defaults. */
14
15
  cookies?: {
15
- secret?: string | BufferSource
16
- path?: string
17
- httpOnly?: boolean
18
- sameSite?: 'Strict' | 'Lax' | 'None' | 'strict' | 'lax' | 'none'
19
- secure?: boolean
20
- domain?: string
21
- maxAge?: number
22
- expires?: Date
23
- }
24
- }
16
+ secret?: string | BufferSource;
17
+ path?: string;
18
+ httpOnly?: boolean;
19
+ sameSite?: "Strict" | "Lax" | "None" | "strict" | "lax" | "none";
20
+ secure?: boolean;
21
+ domain?: string;
22
+ maxAge?: number;
23
+ expires?: Date;
24
+ };
25
+ };
25
26
 
26
27
  export type CreateContextArgs = {
27
- native?: import('./units.js').NativeContext
28
- }
28
+ native?: import("./units.js").NativeContext;
29
+ };
29
30
 
30
31
  export type ContextDefinition<
31
32
  TBoot extends Record<string, unknown> = Record<string, never>,
32
33
  TReq extends Record<string, unknown> = Record<string, never>,
33
34
  > = {
34
- boot?: () => TBoot | Promise<TBoot>
35
- request?: (args: CreateContextArgs) => TReq | Promise<TReq>
36
- }
35
+ boot?: () => TBoot | Promise<TBoot>;
36
+ request?: (args: CreateContextArgs) => TReq | Promise<TReq>;
37
+ };
37
38
 
38
39
  export type InferAppContext<
39
40
  T extends ContextDefinition<Record<string, unknown>, Record<string, unknown>>,
40
- > = T extends ContextDefinition<infer TBoot, infer TReq> ? TBoot & TReq : Record<string, never>
41
+ > = T extends ContextDefinition<infer TBoot, infer TReq> ? TBoot & TReq : Record<string, never>;
41
42
 
42
43
  export type OnErrorOptions<TResponses extends ReturnsMap = ReturnsMap> = {
43
- responses?: TResponses
44
- handle: (
45
- error: unknown,
46
- ctx?: unknown,
47
- ) => Response | Promise<Response>
48
- }
44
+ responses?: TResponses;
45
+ handle: (error: unknown, ctx?: unknown) => Response | Promise<Response>;
46
+ };
49
47
 
50
- export type InferAppManifest<TApp> = TApp extends TaserApp<infer TManifest> ? TManifest : never
48
+ export type InferAppManifest<TApp> = TApp extends TaserApp<infer TManifest> ? TManifest : never;
51
49
 
52
50
  export type TaserHandler<TFrameworkApp> = {
53
51
  /**
@@ -55,11 +53,11 @@ export type TaserHandler<TFrameworkApp> = {
55
53
  * Use universal wildcard patterns (`/*`, `/prefix/*`) for Hono/Fastify.
56
54
  * Use framework-native splat patterns for Express (e.g. `/{*splat}`, `/*splat`).
57
55
  */
58
- mount(pattern: string, frameworkApp: TFrameworkApp): void
59
- }
56
+ mount(pattern: string, frameworkApp: TFrameworkApp): void;
57
+ };
60
58
 
61
- export type { RouteManifestShape } from '@taserjs/router-core'
59
+ export type { RouteManifestShape } from "@taserjs/router-core";
62
60
 
63
- export type { Schema }
61
+ export type { Schema };
64
62
 
65
- export type { TaserApp, TaserMountedApp, TaserNativeBound } from '../taser-app.js'
63
+ export type { TaserApp, TaserNativeBound } from "../taser-app.js";