@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/types.ts
ADDED
|
@@ -0,0 +1,810 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
import type { BodyMode, TypedResponse, ValidationFacet } from "@taserjs/utils";
|
|
3
|
+
import type { RequestHeader } from "hono/utils/headers";
|
|
4
|
+
|
|
5
|
+
export type { BodyMode, ValidationFacet, RequestHeader };
|
|
6
|
+
export type { StandardSchemaV1 };
|
|
7
|
+
|
|
8
|
+
export type HeaderKey = RequestHeader | (string & {});
|
|
9
|
+
|
|
10
|
+
export interface TaserHeaders extends Headers {
|
|
11
|
+
get(name: HeaderKey): string | null;
|
|
12
|
+
has(name: HeaderKey): boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type StatusCode = number;
|
|
16
|
+
|
|
17
|
+
export interface RouteBodySchema {
|
|
18
|
+
readonly schema: StandardSchemaV1;
|
|
19
|
+
readonly mode?: BodyMode | undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface RouteSchemas {
|
|
23
|
+
params?: StandardSchemaV1 | undefined;
|
|
24
|
+
query?: StandardSchemaV1 | undefined;
|
|
25
|
+
body?: RouteBodySchema | undefined;
|
|
26
|
+
returns?: Record<StatusCode, StandardSchemaV1> | undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type StandardHttpMethod =
|
|
30
|
+
| "GET"
|
|
31
|
+
| "POST"
|
|
32
|
+
| "PUT"
|
|
33
|
+
| "DELETE"
|
|
34
|
+
| "PATCH"
|
|
35
|
+
| "OPTIONS"
|
|
36
|
+
| "HEAD"
|
|
37
|
+
| "QUERY";
|
|
38
|
+
|
|
39
|
+
export type HttpMethod = StandardHttpMethod | "ALL" | "ANY";
|
|
40
|
+
export type HttpNoBodyMethod = "GET" | "HEAD";
|
|
41
|
+
|
|
42
|
+
export type Simplify<T> = unknown extends T
|
|
43
|
+
? T
|
|
44
|
+
: T extends (...args: any[]) => any
|
|
45
|
+
? T
|
|
46
|
+
: T extends readonly any[]
|
|
47
|
+
? T
|
|
48
|
+
: { [K in keyof T]: T[K] } & {};
|
|
49
|
+
|
|
50
|
+
type ExtractParamName<T extends string> = T extends `:${infer P}` ? P : never;
|
|
51
|
+
|
|
52
|
+
type ExtractPathSegments<T extends string> = T extends `/${infer Rest}`
|
|
53
|
+
? ExtractPathSegments<Rest>
|
|
54
|
+
: T extends `${infer Segment}/${infer Rest}`
|
|
55
|
+
? Segment | ExtractPathSegments<Rest>
|
|
56
|
+
: T extends ""
|
|
57
|
+
? never
|
|
58
|
+
: T;
|
|
59
|
+
|
|
60
|
+
type HasWildcard<T extends string> = string extends T
|
|
61
|
+
? false
|
|
62
|
+
: T extends `${string}*${string}`
|
|
63
|
+
? true
|
|
64
|
+
: false;
|
|
65
|
+
|
|
66
|
+
type ParamsFromSegments<T extends string> = Simplify<{
|
|
67
|
+
[K in ExtractPathSegments<T> as ExtractParamName<K>]: string;
|
|
68
|
+
}>;
|
|
69
|
+
|
|
70
|
+
export type RouteDefaultParams<TPath extends string = string> = string extends TPath
|
|
71
|
+
? Record<string, string>
|
|
72
|
+
: Simplify<
|
|
73
|
+
(HasWildcard<TPath> extends true ? { _splat: string } : {}) & ParamsFromSegments<TPath>
|
|
74
|
+
>;
|
|
75
|
+
|
|
76
|
+
export interface TaserRequest<TParams = {}, TQuery = {}, TBody = unknown> {
|
|
77
|
+
params: Simplify<TParams>;
|
|
78
|
+
query: Simplify<TQuery>;
|
|
79
|
+
headers: TaserHeaders;
|
|
80
|
+
method: string;
|
|
81
|
+
url: string;
|
|
82
|
+
path: string;
|
|
83
|
+
raw: Request;
|
|
84
|
+
body: TBody;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface RouterRegister {}
|
|
88
|
+
|
|
89
|
+
export type RegisteredRoutePath = RouterRegister extends { RoutePath: infer P extends string }
|
|
90
|
+
? [P] extends [never]
|
|
91
|
+
? string
|
|
92
|
+
: P
|
|
93
|
+
: string;
|
|
94
|
+
|
|
95
|
+
export type RegisteredLayoutId = RouterRegister extends { LayoutTree: infer LT }
|
|
96
|
+
? [keyof LT] extends [never]
|
|
97
|
+
? never
|
|
98
|
+
: keyof LT & string
|
|
99
|
+
: never;
|
|
100
|
+
|
|
101
|
+
export type InferredAppContext = RouterRegister extends { AppContext: infer C } ? C : {};
|
|
102
|
+
|
|
103
|
+
export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
104
|
+
k: infer I,
|
|
105
|
+
) => void
|
|
106
|
+
? I
|
|
107
|
+
: never;
|
|
108
|
+
|
|
109
|
+
export type SafeIntersect<U> = [U] extends [never] ? {} : Simplify<UnionToIntersection<U>>;
|
|
110
|
+
|
|
111
|
+
export type Overwrite<T, U> = unknown extends U
|
|
112
|
+
? T
|
|
113
|
+
: [U] extends [never]
|
|
114
|
+
? T
|
|
115
|
+
: Simplify<Omit<T, keyof U> & U>;
|
|
116
|
+
|
|
117
|
+
export type DistributeServices<T> = T extends { readonly _services?: infer S }
|
|
118
|
+
? [S] extends [never]
|
|
119
|
+
? {}
|
|
120
|
+
: NonNullable<S>
|
|
121
|
+
: {};
|
|
122
|
+
|
|
123
|
+
export type DistributeState<T> = T extends { readonly _state?: infer St }
|
|
124
|
+
? [St] extends [never]
|
|
125
|
+
? {}
|
|
126
|
+
: NonNullable<St>
|
|
127
|
+
: {};
|
|
128
|
+
|
|
129
|
+
export type InferServicesFromMw<T> = T extends (args: any, next: any) => infer R
|
|
130
|
+
? DistributeServices<Awaited<R>>
|
|
131
|
+
: T extends { readonly _services?: infer S }
|
|
132
|
+
? [S] extends [never]
|
|
133
|
+
? {}
|
|
134
|
+
: NonNullable<S>
|
|
135
|
+
: {};
|
|
136
|
+
|
|
137
|
+
export type InferStateFromMw<T> = T extends (args: any, next: any) => infer R
|
|
138
|
+
? DistributeState<Awaited<R>>
|
|
139
|
+
: T extends { readonly _state?: infer St }
|
|
140
|
+
? [St] extends [never]
|
|
141
|
+
? {}
|
|
142
|
+
: NonNullable<St>
|
|
143
|
+
: {};
|
|
144
|
+
|
|
145
|
+
export type ExtractServicesFromMiddleware<TMw> = TMw extends { readonly _services?: infer S }
|
|
146
|
+
? NonNullable<S>
|
|
147
|
+
: TMw extends MiddlewareDefinition<infer S, any, any, any, any>
|
|
148
|
+
? NonNullable<S>
|
|
149
|
+
: {};
|
|
150
|
+
|
|
151
|
+
export type ExtractStateFromMiddleware<TMw> = TMw extends { readonly _state?: infer St }
|
|
152
|
+
? NonNullable<St>
|
|
153
|
+
: TMw extends MiddlewareDefinition<any, infer St, any, any, any>
|
|
154
|
+
? NonNullable<St>
|
|
155
|
+
: {};
|
|
156
|
+
|
|
157
|
+
export type ExtractParamsFromMiddleware<TMw> = TMw extends { readonly _params?: infer P }
|
|
158
|
+
? [P] extends [never]
|
|
159
|
+
? {}
|
|
160
|
+
: unknown extends P
|
|
161
|
+
? {}
|
|
162
|
+
: NonNullable<P>
|
|
163
|
+
: TMw extends MiddlewareDefinition<any, any, infer P, any, any>
|
|
164
|
+
? [P] extends [never]
|
|
165
|
+
? {}
|
|
166
|
+
: unknown extends P
|
|
167
|
+
? {}
|
|
168
|
+
: NonNullable<P>
|
|
169
|
+
: {};
|
|
170
|
+
|
|
171
|
+
export type ExtractQueryFromMiddleware<TMw> = TMw extends { readonly _query?: infer Q }
|
|
172
|
+
? [Q] extends [never]
|
|
173
|
+
? {}
|
|
174
|
+
: unknown extends Q
|
|
175
|
+
? {}
|
|
176
|
+
: NonNullable<Q>
|
|
177
|
+
: TMw extends MiddlewareDefinition<any, any, any, infer Q, any>
|
|
178
|
+
? [Q] extends [never]
|
|
179
|
+
? {}
|
|
180
|
+
: unknown extends Q
|
|
181
|
+
? {}
|
|
182
|
+
: NonNullable<Q>
|
|
183
|
+
: {};
|
|
184
|
+
|
|
185
|
+
export type ExtractBodyFromMiddleware<TMw> = TMw extends { readonly _body?: infer B }
|
|
186
|
+
? [B] extends [never]
|
|
187
|
+
? unknown
|
|
188
|
+
: unknown extends B
|
|
189
|
+
? unknown
|
|
190
|
+
: NonNullable<B>
|
|
191
|
+
: TMw extends MiddlewareDefinition<any, any, any, any, infer B>
|
|
192
|
+
? [B] extends [never]
|
|
193
|
+
? unknown
|
|
194
|
+
: unknown extends B
|
|
195
|
+
? unknown
|
|
196
|
+
: NonNullable<B>
|
|
197
|
+
: unknown;
|
|
198
|
+
|
|
199
|
+
export type ExtractServicesFromLayout<TLayout> = TLayout extends { readonly _services?: infer S }
|
|
200
|
+
? NonNullable<S>
|
|
201
|
+
: TLayout extends LayoutDefinition<any, infer S, any, any, any, any>
|
|
202
|
+
? NonNullable<S>
|
|
203
|
+
: TLayout extends { readonly middlewares: readonly (infer M)[] }
|
|
204
|
+
? ExtractServicesFromMiddleware<M>
|
|
205
|
+
: {};
|
|
206
|
+
|
|
207
|
+
export type ExtractStateFromLayout<TLayout> = TLayout extends { readonly _state?: infer St }
|
|
208
|
+
? NonNullable<St>
|
|
209
|
+
: TLayout extends LayoutDefinition<any, any, infer St, any, any, any>
|
|
210
|
+
? NonNullable<St>
|
|
211
|
+
: TLayout extends { readonly middlewares: readonly (infer M)[] }
|
|
212
|
+
? ExtractStateFromMiddleware<M>
|
|
213
|
+
: {};
|
|
214
|
+
|
|
215
|
+
type NormalizeFacet<T> = unknown extends T ? {} : [T] extends [never] ? {} : NonNullable<T>;
|
|
216
|
+
|
|
217
|
+
export type ExtractParamsFromLayout<TLayout> = TLayout extends { readonly _params?: infer P }
|
|
218
|
+
? NormalizeFacet<P>
|
|
219
|
+
: TLayout extends LayoutDefinition<any, any, any, infer P, any, any>
|
|
220
|
+
? NormalizeFacet<P>
|
|
221
|
+
: TLayout extends { readonly middlewares: readonly (infer M)[] }
|
|
222
|
+
? ExtractParamsFromMiddleware<M>
|
|
223
|
+
: {};
|
|
224
|
+
|
|
225
|
+
export type ExtractQueryFromLayout<TLayout> = TLayout extends { readonly _query?: infer Q }
|
|
226
|
+
? NormalizeFacet<Q>
|
|
227
|
+
: TLayout extends LayoutDefinition<any, any, any, any, infer Q, any>
|
|
228
|
+
? NormalizeFacet<Q>
|
|
229
|
+
: TLayout extends { readonly middlewares: readonly (infer M)[] }
|
|
230
|
+
? ExtractQueryFromMiddleware<M>
|
|
231
|
+
: {};
|
|
232
|
+
|
|
233
|
+
export type ExtractBodyFromLayout<TLayout> = TLayout extends { readonly _body?: infer B }
|
|
234
|
+
? NormalizeFacet<B>
|
|
235
|
+
: TLayout extends LayoutDefinition<any, any, any, any, any, infer B>
|
|
236
|
+
? NormalizeFacet<B>
|
|
237
|
+
: TLayout extends { readonly middlewares: readonly (infer M)[] }
|
|
238
|
+
? ExtractBodyFromMiddleware<M>
|
|
239
|
+
: {};
|
|
240
|
+
|
|
241
|
+
type GetRouteLayoutIds<TPath extends string, TMethod extends HttpMethod> = RouterRegister extends {
|
|
242
|
+
RouteByPathMethod: infer R;
|
|
243
|
+
}
|
|
244
|
+
? TPath extends keyof R
|
|
245
|
+
? TMethod extends keyof R[TPath]
|
|
246
|
+
? R[TPath][TMethod] extends { layouts: infer L }
|
|
247
|
+
? L extends readonly (infer Id)[]
|
|
248
|
+
? [Id] extends [string]
|
|
249
|
+
? Id
|
|
250
|
+
: never
|
|
251
|
+
: L extends (infer Id)[]
|
|
252
|
+
? [Id] extends [string]
|
|
253
|
+
? Id
|
|
254
|
+
: never
|
|
255
|
+
: never
|
|
256
|
+
: never
|
|
257
|
+
: never
|
|
258
|
+
: never
|
|
259
|
+
: never;
|
|
260
|
+
|
|
261
|
+
type GetLayoutServices<LId extends string> = [LId] extends [never]
|
|
262
|
+
? never
|
|
263
|
+
: RouterRegister extends { LayoutTree: infer LT }
|
|
264
|
+
? LId extends keyof LT
|
|
265
|
+
? ExtractServicesFromLayout<LT[LId]>
|
|
266
|
+
: {}
|
|
267
|
+
: {};
|
|
268
|
+
|
|
269
|
+
type GetLayoutState<LId extends string> = [LId] extends [never]
|
|
270
|
+
? never
|
|
271
|
+
: RouterRegister extends { LayoutTree: infer LT }
|
|
272
|
+
? LId extends keyof LT
|
|
273
|
+
? ExtractStateFromLayout<LT[LId]>
|
|
274
|
+
: {}
|
|
275
|
+
: {};
|
|
276
|
+
|
|
277
|
+
export type InferRouteServices<TPath extends string, TMethod extends HttpMethod> = SafeIntersect<
|
|
278
|
+
GetLayoutServices<GetRouteLayoutIds<TPath, TMethod>>
|
|
279
|
+
>;
|
|
280
|
+
|
|
281
|
+
export type InferRouteState<TPath extends string, TMethod extends HttpMethod> = SafeIntersect<
|
|
282
|
+
GetLayoutState<GetRouteLayoutIds<TPath, TMethod>>
|
|
283
|
+
>;
|
|
284
|
+
|
|
285
|
+
type GetLayoutParams<LId extends string> = [LId] extends [never]
|
|
286
|
+
? never
|
|
287
|
+
: RouterRegister extends { LayoutTree: infer LT }
|
|
288
|
+
? LId extends keyof LT
|
|
289
|
+
? ExtractParamsFromLayout<LT[LId]>
|
|
290
|
+
: {}
|
|
291
|
+
: {};
|
|
292
|
+
|
|
293
|
+
type GetLayoutQuery<LId extends string> = [LId] extends [never]
|
|
294
|
+
? never
|
|
295
|
+
: RouterRegister extends { LayoutTree: infer LT }
|
|
296
|
+
? LId extends keyof LT
|
|
297
|
+
? ExtractQueryFromLayout<LT[LId]>
|
|
298
|
+
: {}
|
|
299
|
+
: {};
|
|
300
|
+
|
|
301
|
+
type GetLayoutBody<LId extends string> = [LId] extends [never]
|
|
302
|
+
? never
|
|
303
|
+
: RouterRegister extends { LayoutTree: infer LT }
|
|
304
|
+
? LId extends keyof LT
|
|
305
|
+
? ExtractBodyFromLayout<LT[LId]>
|
|
306
|
+
: {}
|
|
307
|
+
: {};
|
|
308
|
+
|
|
309
|
+
export type InferRouteParams<TPath extends string, TMethod extends HttpMethod> = Simplify<
|
|
310
|
+
Omit<SafeIntersect<GetLayoutParams<GetRouteLayoutIds<TPath, TMethod>>>, "_splat">
|
|
311
|
+
>;
|
|
312
|
+
|
|
313
|
+
export type InferRouteQuery<TPath extends string, TMethod extends HttpMethod> = SafeIntersect<
|
|
314
|
+
GetLayoutQuery<GetRouteLayoutIds<TPath, TMethod>>
|
|
315
|
+
>;
|
|
316
|
+
|
|
317
|
+
export type InferRouteBody<TPath extends string, TMethod extends HttpMethod> = SafeIntersect<
|
|
318
|
+
GetLayoutBody<GetRouteLayoutIds<TPath, TMethod>>
|
|
319
|
+
>;
|
|
320
|
+
|
|
321
|
+
type GetParentLayoutIds<LId extends string> = RouterRegister extends {
|
|
322
|
+
LayoutHierarchy: infer LH;
|
|
323
|
+
}
|
|
324
|
+
? LId extends keyof LH
|
|
325
|
+
? LH[LId] extends readonly (infer Id)[]
|
|
326
|
+
? [Id] extends [string]
|
|
327
|
+
? Id
|
|
328
|
+
: never
|
|
329
|
+
: never
|
|
330
|
+
: never
|
|
331
|
+
: never;
|
|
332
|
+
|
|
333
|
+
export type InferLayoutState<TPath extends string> = SafeIntersect<
|
|
334
|
+
GetLayoutState<GetParentLayoutIds<TPath>>
|
|
335
|
+
>;
|
|
336
|
+
|
|
337
|
+
export type InferLayoutServices<TPath extends string> = SafeIntersect<
|
|
338
|
+
GetLayoutServices<GetParentLayoutIds<TPath>>
|
|
339
|
+
>;
|
|
340
|
+
|
|
341
|
+
export type InferLayoutParams<TPath extends string> = Simplify<
|
|
342
|
+
Omit<SafeIntersect<GetLayoutParams<GetParentLayoutIds<TPath>>>, "_splat">
|
|
343
|
+
>;
|
|
344
|
+
|
|
345
|
+
export type InferLayoutQuery<TPath extends string> = SafeIntersect<
|
|
346
|
+
GetLayoutQuery<GetParentLayoutIds<TPath>>
|
|
347
|
+
>;
|
|
348
|
+
|
|
349
|
+
export type InferLayoutBody<TPath extends string> = SafeIntersect<
|
|
350
|
+
GetLayoutBody<GetParentLayoutIds<TPath>>
|
|
351
|
+
>;
|
|
352
|
+
|
|
353
|
+
export type InferLayoutBranchState<LId extends string | undefined> = [LId] extends [undefined]
|
|
354
|
+
? {}
|
|
355
|
+
: [LId] extends [never]
|
|
356
|
+
? {}
|
|
357
|
+
: SafeIntersect<GetLayoutState<NonNullable<LId> | GetParentLayoutIds<NonNullable<LId>>>>;
|
|
358
|
+
|
|
359
|
+
export type InferLayoutBranchServices<LId extends string | undefined> = [LId] extends [undefined]
|
|
360
|
+
? {}
|
|
361
|
+
: [LId] extends [never]
|
|
362
|
+
? {}
|
|
363
|
+
: SafeIntersect<GetLayoutServices<NonNullable<LId> | GetParentLayoutIds<NonNullable<LId>>>>;
|
|
364
|
+
|
|
365
|
+
export type InferLayoutBranchParams<LId extends string | undefined> = Simplify<
|
|
366
|
+
[LId] extends [undefined]
|
|
367
|
+
? { _splat: string }
|
|
368
|
+
: [LId] extends [never]
|
|
369
|
+
? { _splat: string }
|
|
370
|
+
: RouteDefaultParams<NonNullable<LId>> &
|
|
371
|
+
SafeIntersect<GetLayoutParams<NonNullable<LId> | GetParentLayoutIds<NonNullable<LId>>>>
|
|
372
|
+
>;
|
|
373
|
+
|
|
374
|
+
export interface MiddlewarePreconditions {
|
|
375
|
+
state?: Record<string, any> | undefined;
|
|
376
|
+
services?: Record<string, any> | undefined;
|
|
377
|
+
params?: Record<string, any> | undefined;
|
|
378
|
+
query?: Record<string, any> | undefined;
|
|
379
|
+
body?: any;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export type InferEffectiveParams<
|
|
383
|
+
TPath extends string,
|
|
384
|
+
TMethod extends HttpMethod,
|
|
385
|
+
TRouteParams = unknown,
|
|
386
|
+
> = Simplify<
|
|
387
|
+
(HasWildcard<TPath> extends true ? { _splat: string } : {}) &
|
|
388
|
+
([keyof InferRouteParams<TPath, TMethod>] extends [never]
|
|
389
|
+
? TRouteParams
|
|
390
|
+
: [TRouteParams] extends [RouteDefaultParams<TPath>]
|
|
391
|
+
? Overwrite<RouteDefaultParams<TPath>, InferRouteParams<TPath, TMethod>>
|
|
392
|
+
: Overwrite<InferRouteParams<TPath, TMethod>, TRouteParams>)
|
|
393
|
+
>;
|
|
394
|
+
|
|
395
|
+
export type InferEffectiveQuery<
|
|
396
|
+
TPath extends string,
|
|
397
|
+
TMethod extends HttpMethod,
|
|
398
|
+
TRouteQuery = unknown,
|
|
399
|
+
> = Simplify<Overwrite<InferRouteQuery<TPath, TMethod>, TRouteQuery>>;
|
|
400
|
+
|
|
401
|
+
export type InferEffectiveBody<
|
|
402
|
+
TPath extends string,
|
|
403
|
+
TMethod extends HttpMethod,
|
|
404
|
+
TRouteBody = unknown,
|
|
405
|
+
> = [TMethod] extends [HttpNoBodyMethod]
|
|
406
|
+
? never
|
|
407
|
+
: Simplify<Overwrite<InferRouteBody<TPath, TMethod>, TRouteBody>>;
|
|
408
|
+
|
|
409
|
+
export type RouteHandlerArgs<
|
|
410
|
+
TParams = {},
|
|
411
|
+
TQuery = {},
|
|
412
|
+
TBody = unknown,
|
|
413
|
+
TServices = {},
|
|
414
|
+
TState = {},
|
|
415
|
+
> = Simplify<
|
|
416
|
+
{
|
|
417
|
+
req: Simplify<TaserRequest<Simplify<TParams>, Simplify<TQuery>, TBody>>;
|
|
418
|
+
ctx: InferredAppContext;
|
|
419
|
+
state: [keyof TState] extends [never] ? {} : Simplify<TState>;
|
|
420
|
+
} & TServices
|
|
421
|
+
>;
|
|
422
|
+
|
|
423
|
+
export type RouteHandler<
|
|
424
|
+
TParams = {},
|
|
425
|
+
TQuery = {},
|
|
426
|
+
TBody = unknown,
|
|
427
|
+
TServices = {},
|
|
428
|
+
TState = {},
|
|
429
|
+
TReturn extends Response | Promise<Response> = Response | Promise<Response>,
|
|
430
|
+
> = (args: RouteHandlerArgs<TParams, TQuery, TBody, TServices, TState>) => TReturn;
|
|
431
|
+
|
|
432
|
+
export interface MiddlewareResponse<TServices = {}, TState = {}> extends Response {
|
|
433
|
+
readonly _services?: TServices;
|
|
434
|
+
readonly _state?: TState;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export interface NextFunction {
|
|
438
|
+
<TState extends Record<string, unknown> = {}>(
|
|
439
|
+
state?: TState,
|
|
440
|
+
): Promise<MiddlewareResponse<{}, TState>>;
|
|
441
|
+
provide<TServices extends Record<string, unknown>, TState extends Record<string, unknown> = {}>(
|
|
442
|
+
services: TServices,
|
|
443
|
+
state?: TState,
|
|
444
|
+
): Promise<MiddlewareResponse<TServices, TState>>;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export type MiddlewareArgs<
|
|
448
|
+
TServices = {},
|
|
449
|
+
TState = {},
|
|
450
|
+
TParams = {},
|
|
451
|
+
TQuery = {},
|
|
452
|
+
TBody = unknown,
|
|
453
|
+
> = Simplify<
|
|
454
|
+
{
|
|
455
|
+
req: Simplify<TaserRequest<Simplify<TParams & { _splat: string }>, Simplify<TQuery>, TBody>>;
|
|
456
|
+
ctx: InferredAppContext;
|
|
457
|
+
state: [keyof TState] extends [never] ? Record<string, unknown> : Simplify<TState>;
|
|
458
|
+
} & TServices
|
|
459
|
+
>;
|
|
460
|
+
|
|
461
|
+
export type MiddlewareHandler<
|
|
462
|
+
TServices = Record<string, any>,
|
|
463
|
+
TState = Record<string, unknown>,
|
|
464
|
+
TParams = Record<string, string>,
|
|
465
|
+
TQuery = Record<string, string | string[]>,
|
|
466
|
+
TBody = unknown,
|
|
467
|
+
> = (
|
|
468
|
+
args: MiddlewareArgs<TServices, TState, TParams, TQuery, TBody>,
|
|
469
|
+
next: NextFunction,
|
|
470
|
+
) =>
|
|
471
|
+
| Response
|
|
472
|
+
| Promise<Response>
|
|
473
|
+
| MiddlewareResponse<any, any>
|
|
474
|
+
| Promise<MiddlewareResponse<any, any>>;
|
|
475
|
+
|
|
476
|
+
export interface MiddlewareDefinition<
|
|
477
|
+
TServices = {},
|
|
478
|
+
TState = {},
|
|
479
|
+
TParams = unknown,
|
|
480
|
+
TQuery = unknown,
|
|
481
|
+
TBody = unknown,
|
|
482
|
+
TLayoutId extends string | undefined = undefined,
|
|
483
|
+
TRequires extends MiddlewarePreconditions = {},
|
|
484
|
+
> {
|
|
485
|
+
readonly kind: "middleware";
|
|
486
|
+
readonly handler: MiddlewareHandler<any, any, any, any, any>;
|
|
487
|
+
readonly schemas?: RouteSchemas | undefined;
|
|
488
|
+
readonly layoutId?: string | undefined;
|
|
489
|
+
readonly _services?: TServices;
|
|
490
|
+
readonly _state?: TState;
|
|
491
|
+
readonly _params?: TParams;
|
|
492
|
+
readonly _query?: TQuery;
|
|
493
|
+
readonly _body?: TBody;
|
|
494
|
+
readonly _layoutId?: TLayoutId;
|
|
495
|
+
readonly _requires?: TRequires;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
export type MiddlewareInput =
|
|
499
|
+
| MiddlewareHandler
|
|
500
|
+
| MiddlewareDefinition<any, any, any, any, any, any, any>;
|
|
501
|
+
|
|
502
|
+
export interface LayoutDefinition<
|
|
503
|
+
TPath extends string = string,
|
|
504
|
+
TServices = {},
|
|
505
|
+
TState = {},
|
|
506
|
+
TParams = unknown,
|
|
507
|
+
TQuery = unknown,
|
|
508
|
+
TBody = unknown,
|
|
509
|
+
> {
|
|
510
|
+
readonly kind: "layout";
|
|
511
|
+
readonly path: TPath;
|
|
512
|
+
readonly middlewares: readonly MiddlewareDefinition<any, any, any, any, any, any, any>[];
|
|
513
|
+
readonly schemas?: RouteSchemas | undefined;
|
|
514
|
+
readonly _services?: TServices;
|
|
515
|
+
readonly _state?: TState;
|
|
516
|
+
readonly _params?: TParams;
|
|
517
|
+
readonly _query?: TQuery;
|
|
518
|
+
readonly _body?: TBody;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
export interface RouteDefinition<
|
|
522
|
+
TPath extends string = string,
|
|
523
|
+
TParams = any,
|
|
524
|
+
TQuery = any,
|
|
525
|
+
TBody = any,
|
|
526
|
+
TReturns = any,
|
|
527
|
+
THandlerReturn = any,
|
|
528
|
+
TParamsIn = TParams,
|
|
529
|
+
TQueryIn = TQuery,
|
|
530
|
+
TBodyIn = TBody,
|
|
531
|
+
> {
|
|
532
|
+
readonly kind: "route";
|
|
533
|
+
readonly method: HttpMethod;
|
|
534
|
+
readonly methods?: readonly string[] | undefined;
|
|
535
|
+
readonly path: TPath;
|
|
536
|
+
readonly middlewares?:
|
|
537
|
+
| readonly MiddlewareDefinition<any, any, any, any, any, any, any>[]
|
|
538
|
+
| undefined;
|
|
539
|
+
readonly handler: RouteHandler<any, any, any, any, any>;
|
|
540
|
+
readonly schemas?: RouteSchemas | undefined;
|
|
541
|
+
readonly returns?: Record<StatusCode, StandardSchemaV1> | undefined;
|
|
542
|
+
readonly $Infer?: {
|
|
543
|
+
Params: TParams;
|
|
544
|
+
Query: TQuery;
|
|
545
|
+
Body: TBody;
|
|
546
|
+
ParamsIn: TParamsIn;
|
|
547
|
+
QueryIn: TQueryIn;
|
|
548
|
+
BodyIn: TBodyIn;
|
|
549
|
+
Returns: TReturns;
|
|
550
|
+
HandlerReturn: THandlerReturn;
|
|
551
|
+
Input: {
|
|
552
|
+
params: TParamsIn;
|
|
553
|
+
query: TQueryIn;
|
|
554
|
+
body: TBodyIn;
|
|
555
|
+
};
|
|
556
|
+
Output: TReturns;
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
export type ExtractPreconditionsFromMiddleware<TMw> = TMw extends {
|
|
561
|
+
readonly _requires?: infer R;
|
|
562
|
+
}
|
|
563
|
+
? [R] extends [MiddlewarePreconditions]
|
|
564
|
+
? R
|
|
565
|
+
: {}
|
|
566
|
+
: {};
|
|
567
|
+
|
|
568
|
+
export type ExtractLayoutIdFromMiddleware<TMw> = TMw extends {
|
|
569
|
+
readonly _layoutId?: infer L;
|
|
570
|
+
}
|
|
571
|
+
? [L] extends [string]
|
|
572
|
+
? L
|
|
573
|
+
: undefined
|
|
574
|
+
: undefined;
|
|
575
|
+
|
|
576
|
+
export type IsBranchAllowedForLayout<
|
|
577
|
+
TCurrentLayoutPath extends string,
|
|
578
|
+
TTargetLayoutId extends string | undefined,
|
|
579
|
+
> = [TTargetLayoutId] extends [undefined]
|
|
580
|
+
? true
|
|
581
|
+
: [TTargetLayoutId] extends [never]
|
|
582
|
+
? true
|
|
583
|
+
: string extends TTargetLayoutId
|
|
584
|
+
? true
|
|
585
|
+
: string extends TCurrentLayoutPath
|
|
586
|
+
? true
|
|
587
|
+
: TTargetLayoutId extends TCurrentLayoutPath
|
|
588
|
+
? true
|
|
589
|
+
: RouterRegister extends { LayoutHierarchy: infer LH }
|
|
590
|
+
? TCurrentLayoutPath extends keyof LH
|
|
591
|
+
? TTargetLayoutId extends GetParentLayoutIds<TCurrentLayoutPath>
|
|
592
|
+
? true
|
|
593
|
+
: false
|
|
594
|
+
: false
|
|
595
|
+
: true;
|
|
596
|
+
|
|
597
|
+
export type IsBranchAllowedForRoute<
|
|
598
|
+
TRoutePath extends string,
|
|
599
|
+
TMethod extends HttpMethod,
|
|
600
|
+
TTargetLayoutId extends string | undefined,
|
|
601
|
+
> = [TTargetLayoutId] extends [undefined]
|
|
602
|
+
? true
|
|
603
|
+
: [TTargetLayoutId] extends [never]
|
|
604
|
+
? true
|
|
605
|
+
: string extends TTargetLayoutId
|
|
606
|
+
? true
|
|
607
|
+
: string extends TRoutePath
|
|
608
|
+
? true
|
|
609
|
+
: RouterRegister extends { RouteByPathMethod: infer R }
|
|
610
|
+
? TRoutePath extends keyof R
|
|
611
|
+
? TMethod extends keyof R[TRoutePath]
|
|
612
|
+
? TTargetLayoutId extends GetRouteLayoutIds<TRoutePath, TMethod>
|
|
613
|
+
? true
|
|
614
|
+
: false
|
|
615
|
+
: false
|
|
616
|
+
: false
|
|
617
|
+
: true;
|
|
618
|
+
|
|
619
|
+
export type CheckFacetPrecondition<TAvailable, TRequired> = [TRequired] extends [never]
|
|
620
|
+
? true
|
|
621
|
+
: [TRequired] extends [undefined]
|
|
622
|
+
? true
|
|
623
|
+
: unknown extends TRequired
|
|
624
|
+
? true
|
|
625
|
+
: [Exclude<TRequired, undefined>] extends [never]
|
|
626
|
+
? true
|
|
627
|
+
: [TAvailable] extends [never]
|
|
628
|
+
? false
|
|
629
|
+
: TAvailable extends Exclude<TRequired, undefined>
|
|
630
|
+
? true
|
|
631
|
+
: false;
|
|
632
|
+
|
|
633
|
+
export type CheckMiddlewarePreconditions<
|
|
634
|
+
TState,
|
|
635
|
+
TServices,
|
|
636
|
+
TParams,
|
|
637
|
+
TQuery,
|
|
638
|
+
TBody,
|
|
639
|
+
TRequires extends MiddlewarePreconditions,
|
|
640
|
+
> =
|
|
641
|
+
CheckFacetPrecondition<TState, TRequires["state"]> extends false
|
|
642
|
+
? false
|
|
643
|
+
: CheckFacetPrecondition<TServices, TRequires["services"]> extends false
|
|
644
|
+
? false
|
|
645
|
+
: CheckFacetPrecondition<TParams, TRequires["params"]> extends false
|
|
646
|
+
? false
|
|
647
|
+
: CheckFacetPrecondition<TQuery, TRequires["query"]> extends false
|
|
648
|
+
? false
|
|
649
|
+
: CheckFacetPrecondition<TBody, TRequires["body"]> extends false
|
|
650
|
+
? false
|
|
651
|
+
: true;
|
|
652
|
+
|
|
653
|
+
export type CompileError<TMessage extends string> = {
|
|
654
|
+
readonly __compile_error: TMessage;
|
|
655
|
+
} & never;
|
|
656
|
+
|
|
657
|
+
type NormalizeParams<T> = unknown extends T
|
|
658
|
+
? Record<string, string>
|
|
659
|
+
: [T] extends [never]
|
|
660
|
+
? Record<string, string>
|
|
661
|
+
: T;
|
|
662
|
+
|
|
663
|
+
type NormalizeQuery<T> = unknown extends T
|
|
664
|
+
? Record<string, string | string[]>
|
|
665
|
+
: [T] extends [never]
|
|
666
|
+
? Record<string, string | string[]>
|
|
667
|
+
: T;
|
|
668
|
+
|
|
669
|
+
export type ValidateRouteMiddlewareUse<
|
|
670
|
+
TPath extends string,
|
|
671
|
+
TMethod extends HttpMethod,
|
|
672
|
+
TParams,
|
|
673
|
+
TQuery,
|
|
674
|
+
TBody,
|
|
675
|
+
TRouteServices,
|
|
676
|
+
TRouteState,
|
|
677
|
+
TMw,
|
|
678
|
+
> =
|
|
679
|
+
IsBranchAllowedForRoute<TPath, TMethod, ExtractLayoutIdFromMiddleware<TMw>> extends false
|
|
680
|
+
? CompileError<`Cannot mount layout-scoped middleware: route "${TPath}" is outside layout branch "${NonNullable<ExtractLayoutIdFromMiddleware<TMw>>}"`>
|
|
681
|
+
: CheckMiddlewarePreconditions<
|
|
682
|
+
InferRouteState<TPath, TMethod> & TRouteState,
|
|
683
|
+
InferRouteServices<TPath, TMethod> & TRouteServices,
|
|
684
|
+
NormalizeParams<TParams>,
|
|
685
|
+
NormalizeQuery<TQuery>,
|
|
686
|
+
TBody,
|
|
687
|
+
ExtractPreconditionsFromMiddleware<TMw>
|
|
688
|
+
> extends false
|
|
689
|
+
? CompileError<`Cannot mount middleware: route does not satisfy declared preconditions`>
|
|
690
|
+
: TMw;
|
|
691
|
+
|
|
692
|
+
export type ValidateLayoutMiddlewareUse<
|
|
693
|
+
TPath extends string,
|
|
694
|
+
TParams,
|
|
695
|
+
TQuery,
|
|
696
|
+
TBody,
|
|
697
|
+
TServices,
|
|
698
|
+
TState,
|
|
699
|
+
TMw,
|
|
700
|
+
> =
|
|
701
|
+
IsBranchAllowedForLayout<TPath, ExtractLayoutIdFromMiddleware<TMw>> extends false
|
|
702
|
+
? CompileError<`Cannot mount layout-scoped middleware: layout "${TPath}" is outside layout branch "${NonNullable<ExtractLayoutIdFromMiddleware<TMw>>}"`>
|
|
703
|
+
: CheckMiddlewarePreconditions<
|
|
704
|
+
InferLayoutState<TPath> & TState,
|
|
705
|
+
InferLayoutServices<TPath> & TServices,
|
|
706
|
+
NormalizeParams<TParams>,
|
|
707
|
+
NormalizeQuery<TQuery>,
|
|
708
|
+
TBody,
|
|
709
|
+
ExtractPreconditionsFromMiddleware<TMw>
|
|
710
|
+
> extends false
|
|
711
|
+
? CompileError<`Cannot mount middleware: layout does not satisfy declared preconditions`>
|
|
712
|
+
: TMw;
|
|
713
|
+
|
|
714
|
+
type ResolveMwParam<T, TReq> = unknown extends T
|
|
715
|
+
? [TReq] extends [undefined]
|
|
716
|
+
? Record<string, string>
|
|
717
|
+
: NonNullable<TReq>
|
|
718
|
+
: [T] extends [never]
|
|
719
|
+
? [TReq] extends [undefined]
|
|
720
|
+
? Record<string, string>
|
|
721
|
+
: NonNullable<TReq>
|
|
722
|
+
: T;
|
|
723
|
+
|
|
724
|
+
type ResolveMwQuery<T, TReq> = unknown extends T
|
|
725
|
+
? [TReq] extends [undefined]
|
|
726
|
+
? Record<string, string | string[]>
|
|
727
|
+
: NonNullable<TReq>
|
|
728
|
+
: [T] extends [never]
|
|
729
|
+
? [TReq] extends [undefined]
|
|
730
|
+
? Record<string, string | string[]>
|
|
731
|
+
: NonNullable<TReq>
|
|
732
|
+
: T;
|
|
733
|
+
|
|
734
|
+
type ResolveMwBody<T, TReq> = unknown extends T ? ([TReq] extends [undefined] ? unknown : TReq) : T;
|
|
735
|
+
|
|
736
|
+
export type InferMiddlewareArgs<
|
|
737
|
+
TLayoutId extends string | undefined,
|
|
738
|
+
TParams,
|
|
739
|
+
TQuery,
|
|
740
|
+
TBody,
|
|
741
|
+
TRequires extends MiddlewarePreconditions,
|
|
742
|
+
> = MiddlewareArgs<
|
|
743
|
+
InferLayoutBranchServices<TLayoutId> &
|
|
744
|
+
(TRequires extends { services?: infer S } ? NonNullable<S> : {}),
|
|
745
|
+
InferLayoutBranchState<TLayoutId> &
|
|
746
|
+
(TRequires extends { state?: infer St } ? NonNullable<St> : {}),
|
|
747
|
+
ResolveMwParam<TParams, TRequires["params"]>,
|
|
748
|
+
ResolveMwQuery<TQuery, TRequires["query"]>,
|
|
749
|
+
ResolveMwBody<TBody, TRequires["body"]>
|
|
750
|
+
>;
|
|
751
|
+
|
|
752
|
+
export interface ContextOptions<
|
|
753
|
+
TBoot extends Record<string, unknown> = {},
|
|
754
|
+
TRequest extends Record<string, unknown> = {},
|
|
755
|
+
> {
|
|
756
|
+
boot?: (() => TBoot | Promise<TBoot>) | undefined;
|
|
757
|
+
request?: ((req: TaserRequest<any, any, any>) => TRequest | Promise<TRequest>) | undefined;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
export interface ContextDefinition<
|
|
761
|
+
TBoot extends Record<string, unknown> = {},
|
|
762
|
+
TRequest extends Record<string, unknown> = {},
|
|
763
|
+
> extends ContextOptions<TBoot, TRequest> {
|
|
764
|
+
readonly kind: "context";
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
export type NotFoundHandler<TContext = {}> = (args: {
|
|
768
|
+
req: TaserRequest<any, any, any>;
|
|
769
|
+
ctx: TContext;
|
|
770
|
+
}) => Response | Promise<Response>;
|
|
771
|
+
|
|
772
|
+
export type OnErrorHandler = (
|
|
773
|
+
err: unknown,
|
|
774
|
+
req: TaserRequest<any, any, any>,
|
|
775
|
+
) => Response | Promise<Response>;
|
|
776
|
+
|
|
777
|
+
export interface ResponseOptions {
|
|
778
|
+
validate?: boolean | undefined;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
export type InferReturnsResponse<TReturns> = [TReturns] extends [undefined]
|
|
782
|
+
? Response
|
|
783
|
+
: [TReturns] extends [never]
|
|
784
|
+
? Response
|
|
785
|
+
: unknown extends TReturns
|
|
786
|
+
? Response
|
|
787
|
+
: {
|
|
788
|
+
[K in keyof TReturns & number]: TypedResponse<
|
|
789
|
+
TReturns[K] extends StandardSchemaV1
|
|
790
|
+
? StandardSchemaV1.InferOutput<TReturns[K]>
|
|
791
|
+
: unknown,
|
|
792
|
+
K
|
|
793
|
+
>;
|
|
794
|
+
}[keyof TReturns & number];
|
|
795
|
+
|
|
796
|
+
export interface TaserAppOptions<TContext = {}> {
|
|
797
|
+
basePath?: string | undefined;
|
|
798
|
+
context?: ContextDefinition<any, any> | undefined;
|
|
799
|
+
notFound?: NotFoundHandler<TContext> | undefined;
|
|
800
|
+
onError?: OnErrorHandler | undefined;
|
|
801
|
+
response?: ResponseOptions | undefined;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
export interface TaserDefinition<TContext = {}> {
|
|
805
|
+
readonly _context?: TContext;
|
|
806
|
+
readonly $Infer: {
|
|
807
|
+
Context: TContext;
|
|
808
|
+
};
|
|
809
|
+
readonly options: TaserAppOptions<TContext>;
|
|
810
|
+
}
|