@taserjs/router 0.1.4 → 0.1.5
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/dist/cjs/builder/factories.cjs.map +1 -1
- package/dist/cjs/builder/factories.d.cts +9 -9
- package/dist/cjs/builder/middleware-unit.cjs +21 -12
- package/dist/cjs/builder/middleware-unit.cjs.map +1 -1
- package/dist/cjs/builder/middleware-unit.d.cts +1 -18
- package/dist/cjs/builder/middleware.cjs +1 -0
- package/dist/cjs/builder/middleware.cjs.map +1 -1
- package/dist/cjs/builder/route.cjs +1 -0
- package/dist/cjs/builder/route.cjs.map +1 -1
- package/dist/cjs/builder/router.cjs +1 -16
- package/dist/cjs/builder/router.cjs.map +1 -1
- package/dist/cjs/builder/router.d.cts +6 -17
- package/dist/cjs/builder/standalone.cjs +43 -0
- package/dist/cjs/builder/standalone.cjs.map +1 -0
- package/dist/cjs/builder/standalone.d.cts +28 -0
- package/dist/cjs/define/middleware.cjs +2 -3
- package/dist/cjs/define/middleware.cjs.map +1 -1
- package/dist/cjs/define/middleware.d.cts +15 -16
- package/dist/cjs/index.cjs +13 -2
- package/dist/cjs/index.d.cts +5 -3
- package/dist/cjs/middleware/body-limit.cjs +1 -1
- package/dist/cjs/middleware/body-limit.cjs.map +1 -1
- package/dist/cjs/middleware/body-limit.d.cts +1 -1
- package/dist/cjs/middleware/compress.cjs +1 -1
- package/dist/cjs/middleware/compress.cjs.map +1 -1
- package/dist/cjs/middleware/compress.d.cts +1 -1
- package/dist/cjs/middleware/cors.cjs +1 -1
- package/dist/cjs/middleware/cors.cjs.map +1 -1
- package/dist/cjs/middleware/cors.d.cts +1 -1
- package/dist/cjs/middleware/csrf.cjs +1 -1
- package/dist/cjs/middleware/csrf.cjs.map +1 -1
- package/dist/cjs/middleware/csrf.d.cts +1 -1
- package/dist/cjs/middleware/etag.cjs +1 -1
- package/dist/cjs/middleware/etag.cjs.map +1 -1
- package/dist/cjs/middleware/etag.d.cts +1 -1
- package/dist/cjs/middleware/hono-mw.cjs +1 -1
- package/dist/cjs/middleware/hono-mw.cjs.map +1 -1
- package/dist/cjs/middleware/hono-mw.d.cts +1 -1
- package/dist/cjs/middleware/jwk.cjs +1 -1
- package/dist/cjs/middleware/jwk.cjs.map +1 -1
- package/dist/cjs/middleware/jwt.cjs +1 -1
- package/dist/cjs/middleware/jwt.cjs.map +1 -1
- package/dist/cjs/middleware/secure-headers.cjs +1 -1
- package/dist/cjs/middleware/secure-headers.cjs.map +1 -1
- package/dist/cjs/middleware/secure-headers.d.cts +1 -1
- package/dist/cjs/middleware/timing.cjs +1 -1
- package/dist/cjs/middleware/timing.cjs.map +1 -1
- package/dist/cjs/middleware/timing.d.cts +1 -1
- package/dist/cjs/types/index.d.cts +18 -13
- package/dist/cjs/types/type-utils.d.cts +2 -2
- package/dist/cjs/types/units.d.cts +17 -19
- package/dist/esm/builder/factories.d.ts +9 -9
- package/dist/esm/builder/factories.js.map +1 -1
- package/dist/esm/builder/middleware-unit.d.ts +1 -18
- package/dist/esm/builder/middleware-unit.js +21 -12
- package/dist/esm/builder/middleware-unit.js.map +1 -1
- package/dist/esm/builder/middleware.js +1 -0
- package/dist/esm/builder/middleware.js.map +1 -1
- package/dist/esm/builder/route.js +1 -0
- package/dist/esm/builder/route.js.map +1 -1
- package/dist/esm/builder/router.d.ts +6 -17
- package/dist/esm/builder/router.js +1 -16
- package/dist/esm/builder/router.js.map +1 -1
- package/dist/esm/builder/standalone.d.ts +28 -0
- package/dist/esm/builder/standalone.js +32 -0
- package/dist/esm/builder/standalone.js.map +1 -0
- package/dist/esm/define/middleware.d.ts +15 -16
- package/dist/esm/define/middleware.js +2 -3
- package/dist/esm/define/middleware.js.map +1 -1
- package/dist/esm/index.d.ts +5 -3
- package/dist/esm/index.js +2 -2
- package/dist/esm/middleware/body-limit.d.ts +1 -1
- package/dist/esm/middleware/body-limit.js +2 -2
- package/dist/esm/middleware/body-limit.js.map +1 -1
- package/dist/esm/middleware/compress.d.ts +1 -1
- package/dist/esm/middleware/compress.js +2 -2
- package/dist/esm/middleware/compress.js.map +1 -1
- package/dist/esm/middleware/cors.d.ts +1 -1
- package/dist/esm/middleware/cors.js +2 -2
- package/dist/esm/middleware/cors.js.map +1 -1
- package/dist/esm/middleware/csrf.d.ts +1 -1
- package/dist/esm/middleware/csrf.js +2 -2
- package/dist/esm/middleware/csrf.js.map +1 -1
- package/dist/esm/middleware/etag.d.ts +1 -1
- package/dist/esm/middleware/etag.js +2 -2
- package/dist/esm/middleware/etag.js.map +1 -1
- package/dist/esm/middleware/hono-mw.d.ts +1 -1
- package/dist/esm/middleware/hono-mw.js +1 -1
- package/dist/esm/middleware/hono-mw.js.map +1 -1
- package/dist/esm/middleware/jwk.js +2 -2
- package/dist/esm/middleware/jwk.js.map +1 -1
- package/dist/esm/middleware/jwt.js +2 -2
- package/dist/esm/middleware/jwt.js.map +1 -1
- package/dist/esm/middleware/secure-headers.d.ts +1 -1
- package/dist/esm/middleware/secure-headers.js +2 -2
- package/dist/esm/middleware/secure-headers.js.map +1 -1
- package/dist/esm/middleware/timing.d.ts +1 -1
- package/dist/esm/middleware/timing.js +2 -2
- package/dist/esm/middleware/timing.js.map +1 -1
- package/dist/esm/types/index.d.ts +18 -13
- package/dist/esm/types/type-utils.d.ts +2 -2
- package/dist/esm/types/units.d.ts +17 -19
- package/package.json +3 -3
- package/src/builder/factories.ts +2 -2
- package/src/builder/middleware-unit.ts +22 -11
- package/src/builder/middleware.ts +2 -0
- package/src/builder/route.ts +2 -0
- package/src/builder/router.ts +7 -60
- package/src/builder/standalone.ts +70 -0
- package/src/define/middleware.ts +37 -18
- package/src/index.ts +26 -2
- package/src/middleware/body-limit.ts +2 -2
- package/src/middleware/compress.ts +2 -2
- package/src/middleware/cors.ts +2 -2
- package/src/middleware/csrf.ts +2 -2
- package/src/middleware/etag.ts +2 -2
- package/src/middleware/hono-mw.ts +1 -1
- package/src/middleware/jwk.ts +2 -2
- package/src/middleware/jwt.ts +2 -2
- package/src/middleware/secure-headers.ts +2 -2
- package/src/middleware/timing.ts +2 -2
- package/src/types/index.ts +39 -24
- package/src/types/type-utils.ts +8 -4
- package/src/types/units.ts +46 -22
- package/dist/cjs/register.d.cts +0 -2
- package/dist/esm/register.d.ts +0 -2
- package/src/register.ts +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { middleware } from "../define/middleware.js";
|
|
2
2
|
import { honoMw } from "./hono-mw.js";
|
|
3
3
|
import { timing as timing$1 } from "hono/timing";
|
|
4
4
|
//#region src/middleware/timing.ts
|
|
5
5
|
function timing(...args) {
|
|
6
|
-
return
|
|
6
|
+
return middleware(honoMw(timing$1(...args)));
|
|
7
7
|
}
|
|
8
8
|
//#endregion
|
|
9
9
|
export { timing };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.js","names":[],"sources":["../../../src/middleware/timing.ts"],"sourcesContent":["import { timing as honoTiming } from \"hono/timing\";\n\nimport {
|
|
1
|
+
{"version":3,"file":"timing.js","names":[],"sources":["../../../src/middleware/timing.ts"],"sourcesContent":["import { timing as honoTiming } from \"hono/timing\";\n\nimport { middleware } from \"../define/middleware.js\";\nimport { honoMw } from \"./hono-mw.js\";\n\nexport function timing(...args: Parameters<typeof honoTiming>) {\n return middleware(honoMw(honoTiming(...args)));\n}\n\nexport type TimingOptions = NonNullable<Parameters<typeof honoTiming>[0]>;\n"],"mappings":";;;;AAKA,SAAgB,OAAO,GAAG,MAAqC;CAC7D,OAAO,WAAW,OAAO,SAAW,GAAG,IAAI,CAAC,CAAC;AAC/C"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { Awaitable, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
|
|
2
|
-
import { RouterRegister } from '../
|
|
2
|
+
import { RouterRegister } from '../index.js';
|
|
3
3
|
import { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, Simplify, UnionToIntersection, UnitRuntimeContext } from './type-utils.js';
|
|
4
4
|
import { ReturnsMap, ValidHandlerReply } from './returns.js';
|
|
5
5
|
import { Schema } from './schema.js';
|
|
6
|
-
import {
|
|
6
|
+
import { EmptyAppContext, ExtractState, Method, MiddlewareDefinition, MiddlewareReturnFromParts, MiddlewareUnit, NextFn, ValidatorParts } from './units.js';
|
|
7
7
|
export type { Awaitable } from '@taserjs/router-core';
|
|
8
8
|
export type { SchemaRequestShape, InferInput, InferOutput, Schema, StandardSchemaV1, } from './schema.js';
|
|
9
|
-
export type { RouterRegister } from '../register.js';
|
|
10
9
|
export type { MergeMiddlewareField, MergeMiddlewareInputField, MergePart, RequestShape, Simplify, UnitRuntimeContext, UnwrapPart, } from './type-utils.js';
|
|
11
10
|
export type { EmptyReturns, EnforceHandlerReply, HandlerReply, HasReturns, MergeReturns, ReplyFor, ReturnsMap, StatusCode, ValidHandlerReply, } from './returns.js';
|
|
12
|
-
export type {
|
|
11
|
+
export type { EmptyAppContext, ExtractState, HttpMethod, IsUnknown, Method, MiddlewareDefinition, MiddlewareReturnFromParts, MiddlewareUnit, MiddlewareUnitBuilder, NextFn, NextResult, StandaloneMiddlewareContext, StateBrand, ValidatorParts, } from './units.js';
|
|
12
|
+
export type AppContext = RouterRegister extends {
|
|
13
|
+
AppContext: infer C;
|
|
14
|
+
} ? C : EmptyAppContext;
|
|
13
15
|
export type RoutePath = RouterRegister extends {
|
|
14
16
|
RoutePath: infer P;
|
|
15
17
|
} ? P : never;
|
|
@@ -22,6 +24,7 @@ export type LayoutTree = RouterRegister extends {
|
|
|
22
24
|
export type RouteByPathMethod = RouterRegister extends {
|
|
23
25
|
RouteByPathMethod: infer R;
|
|
24
26
|
} ? R : Record<never, never>;
|
|
27
|
+
export type LayoutBuilder<TAppContext extends Record<string, unknown> = AppContext> = <const Layout extends LayoutId>(layout: Layout) => MiddlewareBuilder<Layout, readonly [], TAppContext>;
|
|
25
28
|
type ParseParam<Segment extends string> = Segment extends "*" ? {
|
|
26
29
|
_splat: string;
|
|
27
30
|
} : Segment extends `:${infer Name extends string}` ? Name extends "" ? {} : {
|
|
@@ -30,14 +33,17 @@ type ParseParam<Segment extends string> = Segment extends "*" ? {
|
|
|
30
33
|
type ParseParamsFromSegments<S extends string> = S extends `${infer Segment}/${infer Rest}` ? ParseParam<Segment> & ParseParamsFromSegments<Rest> : ParseParam<S>;
|
|
31
34
|
export type PathParams<Path extends string> = Path extends `/${infer Rest}` ? ParseParamsFromSegments<Rest> : {};
|
|
32
35
|
export type ResolveParams<TPathParams, TSchemaParams> = TSchemaParams extends Record<string, unknown> ? [keyof TSchemaParams] extends [never] ? TPathParams : Simplify<Omit<TPathParams, keyof TSchemaParams> & TSchemaParams> : TPathParams;
|
|
33
|
-
type
|
|
36
|
+
type LayoutParentsMap = RouterRegister extends {
|
|
37
|
+
LayoutParents: infer LP extends Record<string, unknown>;
|
|
38
|
+
} ? LP : {};
|
|
39
|
+
type LayoutParent<Layout extends LayoutId> = Layout extends keyof LayoutParentsMap ? LayoutParentsMap[Layout] extends LayoutId ? LayoutParentsMap[Layout] : null : LayoutTree[Layout] extends {
|
|
34
40
|
parent: infer Parent extends LayoutId | null;
|
|
35
41
|
} ? Parent : null;
|
|
36
|
-
type ResolveLayoutMiddlewares<Layout extends LayoutId | null> =
|
|
37
|
-
...ResolveLayoutMiddlewares<LayoutParent<Layout
|
|
42
|
+
type ResolveLayoutMiddlewares<Layout extends LayoutId | null, Depth extends readonly unknown[] = []> = Depth["length"] extends 10 ? readonly [] : Layout extends LayoutId ? readonly [
|
|
43
|
+
...ResolveLayoutMiddlewares<LayoutParent<Layout>, [...Depth, unknown]>,
|
|
38
44
|
...LayoutTree[Layout]["middlewares"]
|
|
39
45
|
] : readonly [];
|
|
40
|
-
export type ResolveLayoutIdChain<L extends LayoutId | null> =
|
|
46
|
+
export type ResolveLayoutIdChain<L extends LayoutId | null, Depth extends readonly unknown[] = []> = Depth["length"] extends 10 ? readonly [] : L extends LayoutId ? readonly [...ResolveLayoutIdChain<LayoutParent<L>, [...Depth, unknown]>, L] : readonly [];
|
|
41
47
|
export type ResolveLayoutMiddlewaresState<Layout extends LayoutId | null> = Layout extends LayoutId ? MergeMiddlewareField<ResolveLayoutMiddlewares<Layout>, "state"> : {};
|
|
42
48
|
export type ResolveLayoutsState<Layouts extends LayoutId | readonly LayoutId[]> = Layouts extends LayoutId ? ResolveLayoutMiddlewaresState<Layouts> : Layouts extends readonly LayoutId[] ? UnionToIntersection<Layouts[number] extends infer L extends LayoutId ? ResolveLayoutMiddlewaresState<L> : never> : {};
|
|
43
49
|
/** Fold layout middleware Acc from a route's layoutChain (shallow → deep). */
|
|
@@ -61,12 +67,11 @@ export type RouteLayoutMiddlewares<Path extends RoutePath, TMethod extends Metho
|
|
|
61
67
|
export type RouteLayoutField<Path extends RoutePath, TMethod extends Method, Field extends "query" | "params" | "body" | "state"> = MergeMiddlewareField<RouteLayoutMiddlewares<Path, TMethod>, Field>;
|
|
62
68
|
export type RouteLayoutInputField<Path extends RoutePath, TMethod extends Method, Field extends "query" | "params" | "body"> = MergeMiddlewareInputField<RouteLayoutMiddlewares<Path, TMethod>, Field>;
|
|
63
69
|
type RouteResolvedField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = RouteLayoutField<Path, TMethod, Field> & MergeMiddlewareField<Acc, Field>;
|
|
64
|
-
type RouteChainField<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], Field extends "query" | "params" | "body" | "state"> = RouteResolvedField<Path, TMethod, Acc, Field>;
|
|
65
70
|
export type RouteChainContext<Path extends RoutePath, TMethod extends Method, Acc extends readonly unknown[], TQuery, TParams, TBody, TAppContext extends Record<string, unknown> = AppContext> = Simplify<TAppContext & UnitRuntimeContext & {
|
|
66
|
-
query: Simplify<MergePart<TQuery,
|
|
67
|
-
params: Simplify<ResolveParams<PathParams<Path>, MergePart<TParams,
|
|
68
|
-
body: Simplify<MergePart<TBody,
|
|
69
|
-
state: Simplify<
|
|
71
|
+
query: Simplify<MergePart<TQuery, RouteResolvedField<Path, TMethod, Acc, "query">>>;
|
|
72
|
+
params: Simplify<ResolveParams<PathParams<Path>, MergePart<TParams, RouteResolvedField<Path, TMethod, Acc, "params">>>>;
|
|
73
|
+
body: Simplify<MergePart<TBody, RouteResolvedField<Path, TMethod, Acc, "body">>>;
|
|
74
|
+
state: Simplify<RouteResolvedField<Path, TMethod, Acc, "state">>;
|
|
70
75
|
headers: TaserHeaders;
|
|
71
76
|
cookies: TaserCookieJar;
|
|
72
77
|
}>;
|
|
@@ -37,8 +37,8 @@ export type MiddlewareInputField<Middleware, Field extends MiddlewareInputFieldN
|
|
|
37
37
|
[K in Field]: infer V;
|
|
38
38
|
};
|
|
39
39
|
} ? V : {};
|
|
40
|
-
export type MergeMiddlewareField<Middlewares extends readonly unknown[], Field extends MiddlewareFieldName> =
|
|
41
|
-
export type MergeMiddlewareInputField<Middlewares extends readonly unknown[], Field extends MiddlewareInputFieldName> =
|
|
40
|
+
export type MergeMiddlewareField<Middlewares extends readonly unknown[], Field extends MiddlewareFieldName> = Middlewares extends readonly [] ? {} : Middlewares extends readonly [infer Head, ...infer Tail] ? MiddlewareField<Head, Field> & MergeMiddlewareField<Tail, Field> : MiddlewareField<Middlewares[number], Field>;
|
|
41
|
+
export type MergeMiddlewareInputField<Middlewares extends readonly unknown[], Field extends MiddlewareInputFieldName> = Middlewares extends readonly [] ? {} : Middlewares extends readonly [infer Head, ...infer Tail] ? MiddlewareInputField<Head, Field> & MergeMiddlewareInputField<Tail, Field> : MiddlewareInputField<Middlewares[number], Field>;
|
|
42
42
|
export type RuntimeContextFields = {
|
|
43
43
|
request: Request;
|
|
44
44
|
method: Method;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MiddlewareDefinition as CoreMiddlewareDefinition, TaserCookieJar, TaserHeaders } from '@taserjs/router-core';
|
|
2
2
|
import { RequestShape, Simplify, UnitRuntimeContext, UnwrapPart } from './type-utils.js';
|
|
3
3
|
import { ReturnsMap } from './returns.js';
|
|
4
4
|
import { Schema } from './schema.js';
|
|
5
5
|
export type { HttpMethod, Method } from './type-utils.js';
|
|
6
6
|
export type { EmptyReturns, MergeReturns, ReturnsMap, HandlerReply, HasReturns, StatusCode, ValidHandlerReply, EnforceHandlerReply, } from './returns.js';
|
|
7
7
|
/** Default empty app context for standalone units without a bound router instance. */
|
|
8
|
-
export type
|
|
8
|
+
export type EmptyAppContext = Record<never, never>;
|
|
9
9
|
export type ValidatorParts = {
|
|
10
10
|
query?: unknown;
|
|
11
11
|
params?: unknown;
|
|
@@ -18,16 +18,12 @@ export declare const StateBrand: unique symbol;
|
|
|
18
18
|
export type NextResult<TState = unknown> = Response & {
|
|
19
19
|
readonly [StateBrand]?: TState;
|
|
20
20
|
};
|
|
21
|
-
export type
|
|
22
|
-
[StateBrand]?:
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
}> extends {
|
|
26
|
-
[StateBrand]?: infer S;
|
|
27
|
-
} ? [S] extends [never] ? {} : S : {};
|
|
21
|
+
export type ExtractStateFromUnion<T> = T extends {
|
|
22
|
+
readonly [StateBrand]?: infer S;
|
|
23
|
+
} ? [S] extends [never] ? never : [unknown] extends [S] ? {} : S : never;
|
|
24
|
+
export type ExtractState<T> = [ExtractStateFromUnion<Awaited<T>>] extends [never] ? {} : ExtractStateFromUnion<Awaited<T>>;
|
|
28
25
|
export type IsUnknown<T> = [unknown] extends [T] ? true : false;
|
|
29
26
|
export type NextFn<TExpectedState = unknown> = IsUnknown<TExpectedState> extends true ? <S extends Record<string, unknown> = {}>(state?: S) => Promise<NextResult<S>> : (state: TExpectedState) => Promise<NextResult<TExpectedState>>;
|
|
30
|
-
export type MiddlewareNext = NextFn;
|
|
31
27
|
export type MiddlewareDefinition = CoreMiddlewareDefinition<ReturnsMap>;
|
|
32
28
|
export type MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody> = {
|
|
33
29
|
query: Simplify<UnwrapPart<TQuery>>;
|
|
@@ -42,7 +38,7 @@ export type MiddlewareReturnFromParts<TQuery, TParams, TBody, TState, TQueryIn =
|
|
|
42
38
|
};
|
|
43
39
|
};
|
|
44
40
|
export type DefineMiddlewareResult<TQuery, TParams, TBody, TState, R, TQueryIn = TQuery, TParamsIn = TParams, TBodyIn = TBody, TReturns extends ReturnsMap = {}, TLayout = null, TRequires = {}> = MiddlewareUnit<MiddlewareReturnFromParts<TQuery, TParams, TBody, IsUnknown<TState> extends true ? ExtractState<R> : TState, TQueryIn, TParamsIn, TBodyIn>, TReturns, TLayout, TRequires>;
|
|
45
|
-
export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> =
|
|
41
|
+
export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBody = unknown, TAppContext extends Record<string, unknown> = EmptyAppContext, TState = {}> = Simplify<TAppContext & UnitRuntimeContext & {
|
|
46
42
|
query: Simplify<UnwrapPart<TQuery>>;
|
|
47
43
|
params: Simplify<UnwrapPart<TParams>>;
|
|
48
44
|
body: Simplify<UnwrapPart<TBody>>;
|
|
@@ -50,18 +46,20 @@ export type StandaloneMiddlewareContext<TQuery = unknown, TParams = unknown, TBo
|
|
|
50
46
|
headers: TaserHeaders;
|
|
51
47
|
cookies: TaserCookieJar;
|
|
52
48
|
}>;
|
|
49
|
+
export declare const MiddlewareUnitBrand: unique symbol;
|
|
53
50
|
export type MiddlewareUnit<TAcc = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown> = MiddlewareDefinition & {
|
|
51
|
+
readonly [MiddlewareUnitBrand]: true;
|
|
54
52
|
readonly __middlewareAcc: TAcc;
|
|
55
53
|
readonly __returns?: TReturns;
|
|
56
54
|
readonly __requiredLayouts?: TRequiredLayouts;
|
|
57
55
|
readonly __requiredState?: TRequiredState;
|
|
58
56
|
};
|
|
59
|
-
export type MiddlewareUnitBuilder<TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = {}, TAppContext extends Record<string, unknown> =
|
|
60
|
-
query<Q, QIn = unknown>(schema: Schema<Q, QIn>): MiddlewareUnitBuilder<Q, TParams, TBody, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, QIn, TParamsIn, TBodyIn>;
|
|
61
|
-
params<P, PIn = unknown>(schema: Schema<P, PIn>): MiddlewareUnitBuilder<TQuery, P, TBody, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, PIn, TBodyIn>;
|
|
62
|
-
body<B, BIn = unknown>(schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn>;
|
|
63
|
-
body<Mode extends "json" | "form" | "urlencoded", B, BIn = unknown>(mode: Mode, schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn>;
|
|
64
|
-
returns<const M extends ReturnsMap>(map: M): MiddlewareUnitBuilder<TQuery, TParams, TBody, Omit<TReturns, keyof M> & M, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn>;
|
|
65
|
-
requires<Requires extends Record<string, unknown>>(): MiddlewareUnitBuilder<TQuery, TParams, TBody, TReturns, TRequiredLayouts, TRequiredState & Requires, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn>;
|
|
66
|
-
handler<
|
|
57
|
+
export type MiddlewareUnitBuilder<TQuery = unknown, TParams = unknown, TBody = unknown, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = {}, TAppContext extends Record<string, unknown> = EmptyAppContext, TInheritedState = {}, TQueryIn = unknown, TParamsIn = unknown, TBodyIn = unknown, TExpectedState = unknown> = MiddlewareUnit<MiddlewareReturnFromParts<TQuery, TParams, TBody, IsUnknown<TExpectedState> extends true ? {} : TExpectedState, TQueryIn, TParamsIn, TBodyIn>, TReturns, TRequiredLayouts, TRequiredState> & {
|
|
58
|
+
query<Q, QIn = unknown>(schema: Schema<Q, QIn>): MiddlewareUnitBuilder<Q, TParams, TBody, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, QIn, TParamsIn, TBodyIn, TExpectedState>;
|
|
59
|
+
params<P, PIn = unknown>(schema: Schema<P, PIn>): MiddlewareUnitBuilder<TQuery, P, TBody, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, PIn, TBodyIn, TExpectedState>;
|
|
60
|
+
body<B, BIn = unknown>(schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn, TExpectedState>;
|
|
61
|
+
body<Mode extends "json" | "form" | "urlencoded", B, BIn = unknown>(mode: Mode, schema: Schema<B, BIn>): MiddlewareUnitBuilder<TQuery, TParams, B, TReturns, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, BIn, TExpectedState>;
|
|
62
|
+
returns<const M extends ReturnsMap>(map: M): MiddlewareUnitBuilder<TQuery, TParams, TBody, Omit<TReturns, keyof M> & M, TRequiredLayouts, TRequiredState, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn, TExpectedState>;
|
|
63
|
+
requires<Requires extends Record<string, unknown>>(): MiddlewareUnitBuilder<TQuery, TParams, TBody, TReturns, TRequiredLayouts, TRequiredState & Requires, TAppContext, TInheritedState, TQueryIn, TParamsIn, TBodyIn, TExpectedState>;
|
|
64
|
+
handler<R>(fn: (ctx: StandaloneMiddlewareContext<TQuery, TParams, TBody, TAppContext, TInheritedState & TRequiredState>, next: NextFn<TExpectedState>) => R): DefineMiddlewareResult<TQuery, TParams, TBody, IsUnknown<TExpectedState> extends true ? ExtractState<R> : TExpectedState, R, TQueryIn, TParamsIn, TBodyIn, TReturns, TRequiredLayouts, TRequiredState>;
|
|
67
65
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taserjs/router",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Type-safe Node.js router with runtime validation and middleware",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": {
|
|
@@ -147,8 +147,8 @@
|
|
|
147
147
|
"dependencies": {
|
|
148
148
|
"@standard-schema/spec": "^1.1.0",
|
|
149
149
|
"hono": "^4.10.3",
|
|
150
|
-
"@taserjs/router-utils": "0.1.
|
|
151
|
-
"@taserjs/router-core": "0.1.
|
|
150
|
+
"@taserjs/router-utils": "0.1.5",
|
|
151
|
+
"@taserjs/router-core": "0.1.5"
|
|
152
152
|
},
|
|
153
153
|
"devDependencies": {
|
|
154
154
|
"@tanstack/vite-config": "^0.6.0",
|
package/src/builder/factories.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRouteBuilder } from "./route.js";
|
|
2
|
-
import type { RouteBuilder, RoutePath } from "../types/index.js";
|
|
3
|
-
import type {
|
|
2
|
+
import type { AppContext, RouteBuilder, RoutePath } from "../types/index.js";
|
|
3
|
+
import type { HttpMethod } from "../types/units.js";
|
|
4
4
|
|
|
5
5
|
export type CreateWithoutBodyRoute<
|
|
6
6
|
M extends "GET" | "DELETE" | "OPTIONS" | "HEAD",
|
|
@@ -9,7 +9,19 @@ export function createMiddlewareUnitBuilder(requiredLayouts?: string | readonly
|
|
|
9
9
|
let bodyMode: BodyMode | undefined;
|
|
10
10
|
let returnsMap: ReturnsMap | undefined;
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
function toUnit(fn?: (ctx: any, next: any) => any) {
|
|
13
|
+
const schemas = pickDefinedSchemas(validators);
|
|
14
|
+
return {
|
|
15
|
+
...(fn ? { handler: fn } : {}),
|
|
16
|
+
...schemas,
|
|
17
|
+
...(bodyMode ? { bodyMode } : {}),
|
|
18
|
+
...(returnsMap ? { returns: returnsMap, __returns: returnsMap } : {}),
|
|
19
|
+
...(requiredLayouts !== undefined ? { __requiredLayouts: requiredLayouts } : {}),
|
|
20
|
+
__middlewareAcc: undefined as unknown,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const builder: any = {
|
|
13
25
|
query(schema: Schema<unknown>) {
|
|
14
26
|
validators.query = schema;
|
|
15
27
|
return builder;
|
|
@@ -38,18 +50,17 @@ export function createMiddlewareUnitBuilder(requiredLayouts?: string | readonly
|
|
|
38
50
|
return builder;
|
|
39
51
|
},
|
|
40
52
|
handler(fn: (ctx: any, next: any) => any) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
...(bodyMode ? { bodyMode } : {}),
|
|
46
|
-
...(returnsMap ? { returns: returnsMap, __returns: returnsMap } : {}),
|
|
47
|
-
...(requiredLayouts !== undefined ? { __requiredLayouts: requiredLayouts } : {}),
|
|
48
|
-
__middlewareAcc: undefined as unknown,
|
|
49
|
-
};
|
|
50
|
-
return unit;
|
|
53
|
+
return toUnit(fn);
|
|
54
|
+
},
|
|
55
|
+
toUnit() {
|
|
56
|
+
return toUnit();
|
|
51
57
|
},
|
|
58
|
+
__middlewareAcc: undefined as unknown,
|
|
52
59
|
};
|
|
53
60
|
|
|
61
|
+
if (requiredLayouts !== undefined) {
|
|
62
|
+
builder.__requiredLayouts = requiredLayouts;
|
|
63
|
+
}
|
|
64
|
+
|
|
54
65
|
return builder;
|
|
55
66
|
}
|
|
@@ -12,6 +12,8 @@ export function createMiddleware<const Layout extends LayoutId>(
|
|
|
12
12
|
use(definition: MiddlewareDefinition | ((ctx: any, next: any) => any)) {
|
|
13
13
|
if (typeof definition === "function") {
|
|
14
14
|
entries.push({ handler: definition as any });
|
|
15
|
+
} else if (typeof (definition as any)?.toUnit === "function") {
|
|
16
|
+
entries.push((definition as any).toUnit());
|
|
15
17
|
} else {
|
|
16
18
|
entries.push(definition);
|
|
17
19
|
}
|
package/src/builder/route.ts
CHANGED
|
@@ -104,6 +104,8 @@ export function createRouteBuilder(
|
|
|
104
104
|
use(definition: MiddlewareDefinition | ((ctx: any, next: any) => any)) {
|
|
105
105
|
if (typeof definition === "function") {
|
|
106
106
|
middlewares.push({ handler: definition as any });
|
|
107
|
+
} else if (typeof (definition as any)?.toUnit === "function") {
|
|
108
|
+
middlewares.push((definition as any).toUnit());
|
|
107
109
|
} else {
|
|
108
110
|
middlewares.push(definition);
|
|
109
111
|
}
|
package/src/builder/router.ts
CHANGED
|
@@ -6,30 +6,10 @@ import {
|
|
|
6
6
|
} from "@taserjs/router-core";
|
|
7
7
|
import { isPromise, normalizeOnError } from "@taserjs/router-utils";
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
createAllRoute,
|
|
11
|
-
createAnyRoute,
|
|
12
|
-
createDeleteRoute,
|
|
13
|
-
createGetRoute,
|
|
14
|
-
createHeadRoute,
|
|
15
|
-
createOptionsRoute,
|
|
16
|
-
createPatchRoute,
|
|
17
|
-
createPostRoute,
|
|
18
|
-
createPutRoute,
|
|
19
|
-
} from "./factories.js";
|
|
20
|
-
import { defineMiddleware, type DefineMiddlewareFn } from "../define/middleware.js";
|
|
21
|
-
import { createMiddleware } from "./middleware.js";
|
|
22
9
|
import { TaserApp } from "./app.js";
|
|
23
10
|
import type { ContextDefinition, CreateTaserAppOptions, OnErrorOptions } from "../types/app.js";
|
|
24
|
-
import type {
|
|
25
|
-
import type { LayoutId, MiddlewareBuilder } from "../types/index.js";
|
|
11
|
+
import type { EmptyAppContext } from "../types/units.js";
|
|
26
12
|
import type { ReturnsMap } from "../types/returns.js";
|
|
27
|
-
import type {
|
|
28
|
-
CreateAllRoute,
|
|
29
|
-
CreateAnyRoute,
|
|
30
|
-
CreateWithBodyRoute,
|
|
31
|
-
CreateWithoutBodyRoute,
|
|
32
|
-
} from "./factories.js";
|
|
33
13
|
|
|
34
14
|
function toOnErrorHandler(
|
|
35
15
|
onErrorOptions: OnErrorOptions | OnErrorOptions["handle"],
|
|
@@ -47,10 +27,13 @@ type RouterState = {
|
|
|
47
27
|
const emptyContext: ContextDefinition<Record<string, unknown>, Record<string, unknown>> = {};
|
|
48
28
|
|
|
49
29
|
export class TaserRouter<
|
|
50
|
-
TAppContext extends Record<string, unknown> =
|
|
30
|
+
TAppContext extends Record<string, unknown> = EmptyAppContext,
|
|
51
31
|
THasNotFound extends boolean = false,
|
|
52
32
|
> {
|
|
53
33
|
private readonly state: RouterState;
|
|
34
|
+
readonly $Infer!: {
|
|
35
|
+
Context: TAppContext;
|
|
36
|
+
};
|
|
54
37
|
|
|
55
38
|
constructor(options: CreateTaserAppOptions = {}, state?: Partial<Omit<RouterState, "options">>) {
|
|
56
39
|
this.state = {
|
|
@@ -82,42 +65,6 @@ export class TaserRouter<
|
|
|
82
65
|
return this as unknown as TaserRouter<TAppContext, true>;
|
|
83
66
|
}
|
|
84
67
|
|
|
85
|
-
get: CreateWithoutBodyRoute<"GET", TAppContext> = createGetRoute as CreateWithoutBodyRoute<
|
|
86
|
-
"GET",
|
|
87
|
-
TAppContext
|
|
88
|
-
>;
|
|
89
|
-
post: CreateWithBodyRoute<"POST", TAppContext> = createPostRoute as CreateWithBodyRoute<
|
|
90
|
-
"POST",
|
|
91
|
-
TAppContext
|
|
92
|
-
>;
|
|
93
|
-
put: CreateWithBodyRoute<"PUT", TAppContext> = createPutRoute as CreateWithBodyRoute<
|
|
94
|
-
"PUT",
|
|
95
|
-
TAppContext
|
|
96
|
-
>;
|
|
97
|
-
patch: CreateWithBodyRoute<"PATCH", TAppContext> = createPatchRoute as CreateWithBodyRoute<
|
|
98
|
-
"PATCH",
|
|
99
|
-
TAppContext
|
|
100
|
-
>;
|
|
101
|
-
delete: CreateWithoutBodyRoute<"DELETE", TAppContext> =
|
|
102
|
-
createDeleteRoute as CreateWithoutBodyRoute<"DELETE", TAppContext>;
|
|
103
|
-
options: CreateWithoutBodyRoute<"OPTIONS", TAppContext> =
|
|
104
|
-
createOptionsRoute as CreateWithoutBodyRoute<"OPTIONS", TAppContext>;
|
|
105
|
-
head: CreateWithoutBodyRoute<"HEAD", TAppContext> = createHeadRoute as CreateWithoutBodyRoute<
|
|
106
|
-
"HEAD",
|
|
107
|
-
TAppContext
|
|
108
|
-
>;
|
|
109
|
-
any: CreateAnyRoute<TAppContext> = createAnyRoute as CreateAnyRoute<TAppContext>;
|
|
110
|
-
all: CreateAllRoute<TAppContext> = createAllRoute as CreateAllRoute<TAppContext>;
|
|
111
|
-
|
|
112
|
-
middleware<const Layout extends LayoutId>(
|
|
113
|
-
layout: Layout,
|
|
114
|
-
): MiddlewareBuilder<Layout, readonly [], TAppContext> {
|
|
115
|
-
return createMiddleware(layout) as MiddlewareBuilder<Layout, readonly [], TAppContext>;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
defineMiddleware: DefineMiddlewareFn<TAppContext> =
|
|
119
|
-
defineMiddleware as DefineMiddlewareFn<TAppContext>;
|
|
120
|
-
|
|
121
68
|
create<const TManifest extends RouteManifestShape>(
|
|
122
69
|
manifest: TManifest,
|
|
123
70
|
runtimeOptions?: { basePath?: string },
|
|
@@ -192,6 +139,6 @@ export class TaserRouter<
|
|
|
192
139
|
|
|
193
140
|
export function createTaserApp(
|
|
194
141
|
options: CreateTaserAppOptions = {},
|
|
195
|
-
): TaserRouter<
|
|
196
|
-
return new TaserRouter<
|
|
142
|
+
): TaserRouter<EmptyAppContext, false> {
|
|
143
|
+
return new TaserRouter<EmptyAppContext, false>(options);
|
|
197
144
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { AppContext, LayoutBuilder } from "../types/index.js";
|
|
2
|
+
import {
|
|
3
|
+
createAllRoute,
|
|
4
|
+
createAnyRoute,
|
|
5
|
+
createDeleteRoute,
|
|
6
|
+
createGetRoute,
|
|
7
|
+
createHeadRoute,
|
|
8
|
+
createOptionsRoute,
|
|
9
|
+
createPatchRoute,
|
|
10
|
+
createPostRoute,
|
|
11
|
+
createPutRoute,
|
|
12
|
+
type CreateAllRoute,
|
|
13
|
+
type CreateAnyRoute,
|
|
14
|
+
type CreateWithBodyRoute,
|
|
15
|
+
type CreateWithoutBodyRoute,
|
|
16
|
+
} from "./factories.js";
|
|
17
|
+
import { createMiddleware } from "./middleware.js";
|
|
18
|
+
import { middleware as createMiddlewareFn, type MiddlewareFn } from "../define/middleware.js";
|
|
19
|
+
|
|
20
|
+
export const get: CreateWithoutBodyRoute<"GET", AppContext> =
|
|
21
|
+
createGetRoute as CreateWithoutBodyRoute<"GET", AppContext>;
|
|
22
|
+
export const post: CreateWithBodyRoute<"POST", AppContext> = createPostRoute as CreateWithBodyRoute<
|
|
23
|
+
"POST",
|
|
24
|
+
AppContext
|
|
25
|
+
>;
|
|
26
|
+
export const put: CreateWithBodyRoute<"PUT", AppContext> = createPutRoute as CreateWithBodyRoute<
|
|
27
|
+
"PUT",
|
|
28
|
+
AppContext
|
|
29
|
+
>;
|
|
30
|
+
export const patch: CreateWithBodyRoute<"PATCH", AppContext> =
|
|
31
|
+
createPatchRoute as CreateWithBodyRoute<"PATCH", AppContext>;
|
|
32
|
+
export const del: CreateWithoutBodyRoute<"DELETE", AppContext> =
|
|
33
|
+
createDeleteRoute as CreateWithoutBodyRoute<"DELETE", AppContext>;
|
|
34
|
+
export const options: CreateWithoutBodyRoute<"OPTIONS", AppContext> =
|
|
35
|
+
createOptionsRoute as CreateWithoutBodyRoute<"OPTIONS", AppContext>;
|
|
36
|
+
export const head: CreateWithoutBodyRoute<"HEAD", AppContext> =
|
|
37
|
+
createHeadRoute as CreateWithoutBodyRoute<"HEAD", AppContext>;
|
|
38
|
+
export const any: CreateAnyRoute<AppContext> = createAnyRoute as CreateAnyRoute<AppContext>;
|
|
39
|
+
export const all: CreateAllRoute<AppContext> = createAllRoute as CreateAllRoute<AppContext>;
|
|
40
|
+
|
|
41
|
+
export const layout: LayoutBuilder<AppContext> = createMiddleware as LayoutBuilder<AppContext>;
|
|
42
|
+
export const middleware: MiddlewareFn<AppContext> = createMiddlewareFn as MiddlewareFn<AppContext>;
|
|
43
|
+
|
|
44
|
+
export type TaserNamespace<TAppContext extends Record<string, unknown> = AppContext> = {
|
|
45
|
+
readonly get: CreateWithoutBodyRoute<"GET", TAppContext>;
|
|
46
|
+
readonly post: CreateWithBodyRoute<"POST", TAppContext>;
|
|
47
|
+
readonly put: CreateWithBodyRoute<"PUT", TAppContext>;
|
|
48
|
+
readonly patch: CreateWithBodyRoute<"PATCH", TAppContext>;
|
|
49
|
+
readonly delete: CreateWithoutBodyRoute<"DELETE", TAppContext>;
|
|
50
|
+
readonly options: CreateWithoutBodyRoute<"OPTIONS", TAppContext>;
|
|
51
|
+
readonly head: CreateWithoutBodyRoute<"HEAD", TAppContext>;
|
|
52
|
+
readonly any: CreateAnyRoute<TAppContext>;
|
|
53
|
+
readonly all: CreateAllRoute<TAppContext>;
|
|
54
|
+
readonly layout: LayoutBuilder<TAppContext>;
|
|
55
|
+
readonly middleware: MiddlewareFn<TAppContext>;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const t: TaserNamespace<AppContext> = {
|
|
59
|
+
get,
|
|
60
|
+
post,
|
|
61
|
+
put,
|
|
62
|
+
patch,
|
|
63
|
+
delete: del,
|
|
64
|
+
options,
|
|
65
|
+
head,
|
|
66
|
+
any,
|
|
67
|
+
all,
|
|
68
|
+
layout,
|
|
69
|
+
middleware,
|
|
70
|
+
};
|
package/src/define/middleware.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import { type Awaitable } from "@taserjs/router-core";
|
|
2
|
-
|
|
3
1
|
import { createMiddlewareUnitBuilder } from "../builder/middleware-unit.js";
|
|
4
2
|
import type {
|
|
5
|
-
AppContext,
|
|
6
3
|
DefineMiddlewareResult,
|
|
7
4
|
ExtractState,
|
|
8
5
|
IsUnknown,
|
|
@@ -11,30 +8,44 @@ import type {
|
|
|
11
8
|
StandaloneMiddlewareContext,
|
|
12
9
|
} from "../types/units.js";
|
|
13
10
|
import type {
|
|
11
|
+
AppContext,
|
|
14
12
|
LayoutId,
|
|
15
13
|
ResolveLayoutMiddlewaresState,
|
|
16
14
|
ResolveLayoutsState,
|
|
17
15
|
} from "../types/index.js";
|
|
18
16
|
|
|
19
|
-
export interface
|
|
17
|
+
export interface MiddlewareFn<TAppContext extends Record<string, unknown> = AppContext> {
|
|
20
18
|
/**
|
|
21
|
-
* Constructs a fluent unscoped middleware builder.
|
|
19
|
+
* Constructs a fluent unscoped middleware builder, with optional explicit State generic.
|
|
22
20
|
*
|
|
23
21
|
* @example
|
|
24
22
|
* ```ts
|
|
25
|
-
* const auth =
|
|
23
|
+
* const auth = middleware<{ user: string }>()
|
|
26
24
|
* .query(z.object({ token: z.string() }))
|
|
27
25
|
* .body("form", z.object({ file: z.instanceof(File) }))
|
|
28
26
|
* .returns({ 401: z.string() })
|
|
29
27
|
* .handler(async (ctx, next) => next({ user: "alice" }));
|
|
30
28
|
* ```
|
|
31
29
|
*/
|
|
32
|
-
(): MiddlewareUnitBuilder<
|
|
30
|
+
<TState = unknown>(): MiddlewareUnitBuilder<
|
|
31
|
+
unknown,
|
|
32
|
+
unknown,
|
|
33
|
+
unknown,
|
|
34
|
+
{},
|
|
35
|
+
null,
|
|
36
|
+
{},
|
|
37
|
+
TAppContext,
|
|
38
|
+
{},
|
|
39
|
+
unknown,
|
|
40
|
+
unknown,
|
|
41
|
+
unknown,
|
|
42
|
+
TState
|
|
43
|
+
>;
|
|
33
44
|
|
|
34
45
|
/**
|
|
35
|
-
* Constructs a fluent middleware builder scoped to a single layout branch.
|
|
46
|
+
* Constructs a fluent middleware builder scoped to a single layout branch, with optional explicit State generic.
|
|
36
47
|
*/
|
|
37
|
-
<const Layout extends LayoutId>(
|
|
48
|
+
<const Layout extends LayoutId, TState = unknown>(
|
|
38
49
|
layout: Layout,
|
|
39
50
|
): MiddlewareUnitBuilder<
|
|
40
51
|
unknown,
|
|
@@ -44,13 +55,17 @@ export interface DefineMiddlewareFn<TAppContext extends Record<string, unknown>
|
|
|
44
55
|
Layout,
|
|
45
56
|
{},
|
|
46
57
|
TAppContext,
|
|
47
|
-
ResolveLayoutMiddlewaresState<Layout
|
|
58
|
+
ResolveLayoutMiddlewaresState<Layout>,
|
|
59
|
+
unknown,
|
|
60
|
+
unknown,
|
|
61
|
+
unknown,
|
|
62
|
+
TState
|
|
48
63
|
>;
|
|
49
64
|
|
|
50
65
|
/**
|
|
51
|
-
* Constructs a fluent middleware builder scoped to multiple layout branches (branch union).
|
|
66
|
+
* Constructs a fluent middleware builder scoped to multiple layout branches (branch union), with optional explicit State generic.
|
|
52
67
|
*/
|
|
53
|
-
<const Layouts extends readonly [LayoutId, ...LayoutId[]]>(
|
|
68
|
+
<const Layouts extends readonly [LayoutId, ...LayoutId[]], TState = unknown>(
|
|
54
69
|
layouts: Layouts,
|
|
55
70
|
): MiddlewareUnitBuilder<
|
|
56
71
|
unknown,
|
|
@@ -60,7 +75,11 @@ export interface DefineMiddlewareFn<TAppContext extends Record<string, unknown>
|
|
|
60
75
|
Layouts,
|
|
61
76
|
{},
|
|
62
77
|
TAppContext,
|
|
63
|
-
ResolveLayoutsState<Layouts
|
|
78
|
+
ResolveLayoutsState<Layouts>,
|
|
79
|
+
unknown,
|
|
80
|
+
unknown,
|
|
81
|
+
unknown,
|
|
82
|
+
TState
|
|
64
83
|
>;
|
|
65
84
|
|
|
66
85
|
/**
|
|
@@ -77,7 +96,7 @@ export interface DefineMiddlewareFn<TAppContext extends Record<string, unknown>
|
|
|
77
96
|
ResolveLayoutMiddlewaresState<Layout> & TRequires
|
|
78
97
|
>,
|
|
79
98
|
next: NextFn<NoInfer<TState>>,
|
|
80
|
-
) =>
|
|
99
|
+
) => R,
|
|
81
100
|
): DefineMiddlewareResult<
|
|
82
101
|
unknown,
|
|
83
102
|
unknown,
|
|
@@ -111,7 +130,7 @@ export interface DefineMiddlewareFn<TAppContext extends Record<string, unknown>
|
|
|
111
130
|
ResolveLayoutsState<Layouts> & TRequires
|
|
112
131
|
>,
|
|
113
132
|
next: NextFn<NoInfer<TState>>,
|
|
114
|
-
) =>
|
|
133
|
+
) => R,
|
|
115
134
|
): DefineMiddlewareResult<
|
|
116
135
|
unknown,
|
|
117
136
|
unknown,
|
|
@@ -131,7 +150,7 @@ export interface DefineMiddlewareFn<TAppContext extends Record<string, unknown>
|
|
|
131
150
|
*
|
|
132
151
|
* @example
|
|
133
152
|
* ```ts
|
|
134
|
-
* const auth =
|
|
153
|
+
* const auth = middleware((ctx, next) => {
|
|
135
154
|
* return next({ user: "alice" });
|
|
136
155
|
* });
|
|
137
156
|
* ```
|
|
@@ -140,7 +159,7 @@ export interface DefineMiddlewareFn<TAppContext extends Record<string, unknown>
|
|
|
140
159
|
fn: (
|
|
141
160
|
ctx: StandaloneMiddlewareContext<unknown, unknown, unknown, TAppContext, TRequires>,
|
|
142
161
|
next: NextFn<NoInfer<TState>>,
|
|
143
|
-
) =>
|
|
162
|
+
) => R,
|
|
144
163
|
): DefineMiddlewareResult<
|
|
145
164
|
unknown,
|
|
146
165
|
unknown,
|
|
@@ -156,7 +175,7 @@ export interface DefineMiddlewareFn<TAppContext extends Record<string, unknown>
|
|
|
156
175
|
>;
|
|
157
176
|
}
|
|
158
177
|
|
|
159
|
-
export const
|
|
178
|
+
export const middleware: MiddlewareFn<AppContext> = function middleware(
|
|
160
179
|
first?: any,
|
|
161
180
|
second?: any,
|
|
162
181
|
): any {
|
package/src/index.ts
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface RouterRegister {}
|
|
2
2
|
export type {
|
|
3
|
+
AppContext,
|
|
4
|
+
EmptyAppContext,
|
|
3
5
|
HttpMethod,
|
|
4
6
|
InferInput,
|
|
5
7
|
InferOutput,
|
|
6
8
|
InferRouteContext,
|
|
7
9
|
InferRouteInput,
|
|
10
|
+
InferRouteInputFromPath,
|
|
8
11
|
InferRouteOutput,
|
|
12
|
+
LayoutBuilder,
|
|
13
|
+
LayoutId,
|
|
14
|
+
LayoutTree,
|
|
9
15
|
Method,
|
|
16
|
+
MiddlewareBuilder,
|
|
10
17
|
MiddlewareDefinition,
|
|
11
18
|
MiddlewareUnit,
|
|
12
19
|
MiddlewareUnitBuilder,
|
|
13
20
|
PathParams,
|
|
14
21
|
ReturnsMap,
|
|
22
|
+
RouteByPathMethod,
|
|
15
23
|
RouteDefinition,
|
|
16
24
|
RouteExport,
|
|
17
25
|
RoutePath,
|
|
@@ -31,10 +39,26 @@ export type {
|
|
|
31
39
|
export { ValidationError, validationErrorSchema } from "@taserjs/router-utils";
|
|
32
40
|
export type { ResponseValidationFailureHandler, SuccessStatusCode } from "@taserjs/router-utils";
|
|
33
41
|
|
|
42
|
+
export {
|
|
43
|
+
all,
|
|
44
|
+
any,
|
|
45
|
+
del,
|
|
46
|
+
get,
|
|
47
|
+
head,
|
|
48
|
+
layout,
|
|
49
|
+
middleware,
|
|
50
|
+
options,
|
|
51
|
+
patch,
|
|
52
|
+
post,
|
|
53
|
+
put,
|
|
54
|
+
t,
|
|
55
|
+
type TaserNamespace,
|
|
56
|
+
} from "./builder/standalone.js";
|
|
57
|
+
|
|
34
58
|
export { createTaserApp, TaserRouter } from "./builder/router.js";
|
|
35
59
|
export { TaserApp } from "./builder/app.js";
|
|
36
60
|
export { createContext } from "./context/create-context.js";
|
|
37
|
-
export { defineMiddleware } from "./define/middleware.js";
|
|
38
61
|
export { honoMw } from "./middleware/hono-mw.js";
|
|
62
|
+
export type { MiddlewareFn } from "./define/middleware.js";
|
|
39
63
|
|
|
40
64
|
export type { TaserCookieJar, TaserHeaders } from "@taserjs/router-core";
|