@taserjs/router 0.1.6 → 0.1.7

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.
@@ -16,6 +16,7 @@ import type {
16
16
  ExtractState,
17
17
  Method,
18
18
  MiddlewareDefinition,
19
+ MiddlewareRequirements,
19
20
  MiddlewareReturnFromParts,
20
21
  MiddlewareUnit,
21
22
  NextFn,
@@ -57,6 +58,7 @@ export type {
57
58
  IsUnknown,
58
59
  Method,
59
60
  MiddlewareDefinition,
61
+ MiddlewareRequirements,
60
62
  MiddlewareReturnFromParts,
61
63
  MiddlewareUnit,
62
64
  MiddlewareUnitBuilder,
@@ -352,19 +354,66 @@ export type IsLayoutAllowed<TRequiredLayouts, TChain extends readonly LayoutId[]
352
354
  : true
353
355
  : true;
354
356
 
355
- export type IsStateSatisfied<TActualState, TRequiredState> = [TRequiredState] extends [never]
357
+ export type IsRequirementsSatisfied<
358
+ TActual extends {
359
+ query?: unknown;
360
+ params?: unknown;
361
+ body?: unknown;
362
+ state?: unknown;
363
+ },
364
+ TRequires extends MiddlewareRequirements,
365
+ > = [TRequires] extends [never]
356
366
  ? true
357
- : [unknown] extends [TRequiredState]
367
+ : [unknown] extends [TRequires]
358
368
  ? true
359
- : [null] extends [TRequiredState]
369
+ : [null] extends [TRequires]
360
370
  ? true
361
- : [undefined] extends [TRequiredState]
371
+ : [undefined] extends [TRequires]
362
372
  ? true
363
- : [IsEmptyObject<TRequiredState>] extends [true]
373
+ : [IsEmptyObject<TRequires>] extends [true]
364
374
  ? true
365
- : [TActualState] extends [TRequiredState]
366
- ? true
367
- : false;
375
+ : (
376
+ TRequires extends { state: infer S extends Record<string, unknown> }
377
+ ? [TActual["state"]] extends [S]
378
+ ? true
379
+ : false
380
+ : true
381
+ ) extends false
382
+ ? false
383
+ : (
384
+ TRequires extends { query: infer Q extends Record<string, unknown> }
385
+ ? [TActual["query"]] extends [Q]
386
+ ? true
387
+ : false
388
+ : true
389
+ ) extends false
390
+ ? false
391
+ : (
392
+ TRequires extends { params: infer P extends Record<string, unknown> }
393
+ ? [TActual["params"]] extends [P]
394
+ ? true
395
+ : false
396
+ : true
397
+ ) extends false
398
+ ? false
399
+ : (
400
+ TRequires extends { body: infer B }
401
+ ? unknown extends B
402
+ ? true
403
+ : [TRequires["body"]] extends [undefined]
404
+ ? true
405
+ : [TActual["body"]] extends [B]
406
+ ? true
407
+ : false
408
+ : true
409
+ ) extends false
410
+ ? false
411
+ : true;
412
+
413
+ export type IsStateSatisfied<TActualState, TRequiredState> = IsRequirementsSatisfied<
414
+ { state: TActualState },
415
+ { state: TRequiredState extends Record<string, unknown> ? TRequiredState : {} }
416
+ >;
368
417
 
369
418
  type InputFacet<T, K extends string> =
370
419
  IsNever<T> extends true ? {} : IsEmptyObject<T> extends true ? {} : { [Key in K]: T };
@@ -485,22 +534,37 @@ export type MiddlewareBuilder<
485
534
  readonly $Infer: {
486
535
  Context: MiddlewareChainContext<Layout, Acc, unknown, unknown, unknown, TAppContext>;
487
536
  };
488
- use<TAcc, TReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown>(
489
- unit: MiddlewareUnit<TAcc, TReturns, TRequiredLayouts, TRequiredState>,
490
- ..._assert: [
537
+ use<
538
+ TAcc,
539
+ TReturns extends ReturnsMap = {},
540
+ TRequiredLayouts = unknown,
541
+ TRequires extends MiddlewareRequirements = {},
542
+ >(
543
+ unit: [
491
544
  IsLayoutAllowed<TRequiredLayouts, ResolveLayoutIdChain<Layout>>,
492
- IsStateSatisfied<MiddlewareChainField<Layout, Acc, "state">, TRequiredState>,
545
+ IsRequirementsSatisfied<
546
+ {
547
+ query: MiddlewareChainField<Layout, Acc, "query">;
548
+ params: MiddlewareChainField<Layout, Acc, "params">;
549
+ body: MiddlewareChainField<Layout, Acc, "body">;
550
+ state: MiddlewareChainField<Layout, Acc, "state">;
551
+ },
552
+ TRequires
553
+ >,
493
554
  ] extends [true, true]
494
- ? []
495
- : [
496
- {
497
- error: "Middleware cannot be attached to this layout";
498
- requiredLayouts: TRequiredLayouts;
499
- layoutChain: ResolveLayoutIdChain<Layout>;
500
- requiredState: TRequiredState;
501
- actualState: MiddlewareChainField<Layout, Acc, "state">;
502
- },
503
- ]
555
+ ? MiddlewareUnit<TAcc, TReturns, TRequiredLayouts, TRequires>
556
+ : {
557
+ error: "Middleware cannot be attached to this layout";
558
+ requiredLayouts: TRequiredLayouts;
559
+ layoutChain: ResolveLayoutIdChain<Layout>;
560
+ requirements: TRequires;
561
+ actual: {
562
+ query: MiddlewareChainField<Layout, Acc, "query">;
563
+ params: MiddlewareChainField<Layout, Acc, "params">;
564
+ body: MiddlewareChainField<Layout, Acc, "body">;
565
+ state: MiddlewareChainField<Layout, Acc, "state">;
566
+ };
567
+ },
504
568
  ): MiddlewareBuilder<Layout, readonly [...Acc, TAcc], TAppContext>;
505
569
  use<R = unknown>(
506
570
  fn: (
@@ -563,7 +627,7 @@ type RouteHandleResult<
563
627
  };
564
628
  };
565
629
 
566
- export type RouteBuilderBase<
630
+ export type RouteContractBuilderBase<
567
631
  Path extends RoutePath,
568
632
  TMethod extends Method,
569
633
  Acc extends readonly unknown[] = readonly [],
@@ -584,7 +648,7 @@ export type RouteBuilderBase<
584
648
  };
585
649
  query<TQuery, TQueryIn = unknown>(
586
650
  schema: Schema<TQuery, TQueryIn>,
587
- ): RouteBuilder<
651
+ ): RouteContractBuilder<
588
652
  Path,
589
653
  TMethod,
590
654
  Acc,
@@ -594,7 +658,7 @@ export type RouteBuilderBase<
594
658
  >;
595
659
  params<TParams, TParamsIn = unknown>(
596
660
  schema: Schema<TParams, TParamsIn>,
597
- ): RouteBuilder<
661
+ ): RouteContractBuilder<
598
662
  Path,
599
663
  TMethod,
600
664
  Acc,
@@ -604,44 +668,7 @@ export type RouteBuilderBase<
604
668
  >;
605
669
  returns<const M extends ReturnsMap>(
606
670
  map: M,
607
- ): RouteBuilder<Path, TMethod, Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>;
608
- use<TAcc, UReturns extends ReturnsMap = {}, TRequiredLayouts = unknown, TRequiredState = unknown>(
609
- unit: MiddlewareUnit<TAcc, UReturns, TRequiredLayouts, TRequiredState>,
610
- ..._assert: [
611
- IsLayoutAllowed<TRequiredLayouts, RouteLayoutChain<Path, TMethod>>,
612
- IsStateSatisfied<RouteResolvedField<Path, TMethod, Acc, "state">, TRequiredState>,
613
- ] extends [true, true]
614
- ? []
615
- : [
616
- {
617
- error: "Middleware cannot be attached to this route";
618
- requiredLayouts: TRequiredLayouts;
619
- routeLayoutChain: RouteLayoutChain<Path, TMethod>;
620
- requiredState: TRequiredState;
621
- actualState: RouteResolvedField<Path, TMethod, Acc, "state">;
622
- },
623
- ]
624
- ): RouteBuilder<
625
- Path,
626
- TMethod,
627
- readonly [...Acc, TAcc],
628
- Validators,
629
- Omit<TReturns, keyof UReturns> & UReturns,
630
- TAppContext
631
- >;
632
- use<R = unknown>(
633
- fn: (
634
- ctx: RouteChainContext<Path, TMethod, Acc, unknown, unknown, unknown, TAppContext>,
635
- next: NextFn,
636
- ) => Awaitable<R>,
637
- ): RouteBuilder<
638
- Path,
639
- TMethod,
640
- readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>],
641
- Validators,
642
- TReturns,
643
- TAppContext
644
- >;
671
+ ): RouteContractBuilder<Path, TMethod, Acc, Validators, Omit<TReturns, keyof M> & M, TAppContext>;
645
672
  handler<R extends Response = Response>(
646
673
  fn: (
647
674
  ctx: TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS"
@@ -659,20 +686,20 @@ export type RouteBuilderBase<
659
686
  ): RouteHandleResult<Path, TMethod, Acc, Validators, TReturns, R, TAppContext>;
660
687
  };
661
688
 
662
- export type RouteBuilder<
689
+ export type RouteContractBuilder<
663
690
  Path extends RoutePath,
664
691
  TMethod extends Method,
665
692
  Acc extends readonly unknown[] = readonly [],
666
693
  Validators extends ValidatorParts = {},
667
694
  TReturns extends ReturnsMap = {},
668
695
  TAppContext extends Record<string, unknown> = AppContext,
669
- > = RouteBuilderBase<Path, TMethod, Acc, Validators, TReturns, TAppContext> &
696
+ > = RouteContractBuilderBase<Path, TMethod, Acc, Validators, TReturns, TAppContext> &
670
697
  (TMethod extends "GET" | "DELETE" | "HEAD" | "OPTIONS"
671
698
  ? {}
672
699
  : {
673
700
  body<TBody, TBodyIn = unknown>(
674
701
  schema: Schema<TBody, TBodyIn>,
675
- ): RouteBuilder<
702
+ ): RouteContractBuilder<
676
703
  Path,
677
704
  TMethod,
678
705
  Acc,
@@ -683,7 +710,7 @@ export type RouteBuilder<
683
710
  body<Mode extends "json" | "form" | "urlencoded", TBody, TBodyIn = unknown>(
684
711
  mode: Mode,
685
712
  schema: Schema<TBody, TBodyIn>,
686
- ): RouteBuilder<
713
+ ): RouteContractBuilder<
687
714
  Path,
688
715
  TMethod,
689
716
  Acc,
@@ -693,6 +720,80 @@ export type RouteBuilder<
693
720
  >;
694
721
  });
695
722
 
723
+ export type RouteMiddlewareBuilder<
724
+ Path extends RoutePath,
725
+ TMethod extends Method,
726
+ Acc extends readonly unknown[] = readonly [],
727
+ Validators extends ValidatorParts = {},
728
+ TReturns extends ReturnsMap = {},
729
+ TAppContext extends Record<string, unknown> = AppContext,
730
+ > = RouteContractBuilder<Path, TMethod, Acc, Validators, TReturns, TAppContext> & {
731
+ use<
732
+ TAcc,
733
+ UReturns extends ReturnsMap = {},
734
+ TRequiredLayouts = unknown,
735
+ TRequires extends MiddlewareRequirements = {},
736
+ >(
737
+ unit: [
738
+ IsLayoutAllowed<TRequiredLayouts, RouteLayoutChain<Path, TMethod>>,
739
+ IsRequirementsSatisfied<
740
+ {
741
+ query: RouteResolvedField<Path, TMethod, Acc, "query">;
742
+ params: ResolveParams<PathParams<Path>, RouteResolvedField<Path, TMethod, Acc, "params">>;
743
+ body: RouteResolvedField<Path, TMethod, Acc, "body">;
744
+ state: RouteResolvedField<Path, TMethod, Acc, "state">;
745
+ },
746
+ TRequires
747
+ >,
748
+ ] extends [true, true]
749
+ ? MiddlewareUnit<TAcc, UReturns, TRequiredLayouts, TRequires>
750
+ : {
751
+ error: "Middleware cannot be attached to this route";
752
+ requiredLayouts: TRequiredLayouts;
753
+ routeLayoutChain: RouteLayoutChain<Path, TMethod>;
754
+ requirements: TRequires;
755
+ actual: {
756
+ query: RouteResolvedField<Path, TMethod, Acc, "query">;
757
+ params: ResolveParams<
758
+ PathParams<Path>,
759
+ RouteResolvedField<Path, TMethod, Acc, "params">
760
+ >;
761
+ body: RouteResolvedField<Path, TMethod, Acc, "body">;
762
+ state: RouteResolvedField<Path, TMethod, Acc, "state">;
763
+ };
764
+ },
765
+ ): RouteMiddlewareBuilder<
766
+ Path,
767
+ TMethod,
768
+ readonly [...Acc, TAcc],
769
+ Validators,
770
+ Omit<TReturns, keyof UReturns> & UReturns,
771
+ TAppContext
772
+ >;
773
+ use<R = unknown>(
774
+ fn: (
775
+ ctx: RouteChainContext<Path, TMethod, Acc, unknown, unknown, unknown, TAppContext>,
776
+ next: NextFn,
777
+ ) => Awaitable<R>,
778
+ ): RouteMiddlewareBuilder<
779
+ Path,
780
+ TMethod,
781
+ readonly [...Acc, MiddlewareReturnFromParts<unknown, unknown, unknown, ExtractState<R>>],
782
+ Validators,
783
+ TReturns,
784
+ TAppContext
785
+ >;
786
+ };
787
+
788
+ export type RouteBuilder<
789
+ Path extends RoutePath,
790
+ TMethod extends Method,
791
+ Acc extends readonly unknown[] = readonly [],
792
+ Validators extends ValidatorParts = {},
793
+ TReturns extends ReturnsMap = {},
794
+ TAppContext extends Record<string, unknown> = AppContext,
795
+ > = RouteMiddlewareBuilder<Path, TMethod, Acc, Validators, TReturns, TAppContext>;
796
+
696
797
  export type RouteDefinition<
697
798
  Path extends RoutePath = RoutePath,
698
799
  TMethod extends Method = Method,
@@ -80,6 +80,13 @@ export type MiddlewareReturnFromParts<
80
80
  };
81
81
  };
82
82
 
83
+ export type MiddlewareRequirements = {
84
+ query?: Record<string, unknown>;
85
+ params?: Record<string, unknown>;
86
+ body?: unknown;
87
+ state?: Record<string, unknown>;
88
+ };
89
+
83
90
  export type DefineMiddlewareResult<
84
91
  TQuery,
85
92
  TParams,
@@ -91,7 +98,7 @@ export type DefineMiddlewareResult<
91
98
  TBodyIn = TBody,
92
99
  TReturns extends ReturnsMap = {},
93
100
  TLayout = null,
94
- TRequires = {},
101
+ TRequires extends MiddlewareRequirements = {},
95
102
  > = MiddlewareUnit<
96
103
  MiddlewareReturnFromParts<
97
104
  TQuery,
@@ -113,13 +120,30 @@ export type StandaloneMiddlewareContext<
113
120
  TBody = unknown,
114
121
  TAppContext extends Record<string, unknown> = EmptyAppContext,
115
122
  TState = {},
123
+ TRequires extends MiddlewareRequirements = {},
116
124
  > = Simplify<
117
125
  TAppContext &
118
126
  UnitRuntimeContext & {
119
- query: Simplify<UnwrapPart<TQuery>>;
120
- params: Simplify<UnwrapPart<TParams>>;
121
- body: Simplify<UnwrapPart<TBody>>;
122
- state: Simplify<UnwrapPart<TState>>;
127
+ query: Simplify<
128
+ UnwrapPart<TQuery> &
129
+ (TRequires["query"] extends Record<string, unknown> ? TRequires["query"] : {})
130
+ >;
131
+ params: Simplify<
132
+ UnwrapPart<TParams> &
133
+ (TRequires["params"] extends Record<string, unknown> ? TRequires["params"] : {})
134
+ >;
135
+ body: Simplify<
136
+ UnwrapPart<TBody> &
137
+ (unknown extends TRequires["body"]
138
+ ? {}
139
+ : [TRequires["body"]] extends [undefined]
140
+ ? {}
141
+ : TRequires["body"])
142
+ >;
143
+ state: Simplify<
144
+ UnwrapPart<TState> &
145
+ (TRequires["state"] extends Record<string, unknown> ? TRequires["state"] : {})
146
+ >;
123
147
  headers: TaserHeaders;
124
148
  cookies: TaserCookieJar;
125
149
  }
@@ -131,13 +155,13 @@ export type MiddlewareUnit<
131
155
  TAcc = unknown,
132
156
  TReturns extends ReturnsMap = {},
133
157
  TRequiredLayouts = unknown,
134
- TRequiredState = unknown,
158
+ TRequires extends MiddlewareRequirements = {},
135
159
  > = MiddlewareDefinition & {
136
160
  readonly [MiddlewareUnitBrand]: true;
137
161
  readonly __middlewareAcc: TAcc;
138
162
  readonly __returns?: TReturns;
139
163
  readonly __requiredLayouts?: TRequiredLayouts;
140
- readonly __requiredState?: TRequiredState;
164
+ readonly __requirements?: TRequires;
141
165
  };
142
166
 
143
167
  export type MiddlewareUnitBuilder<
@@ -146,7 +170,7 @@ export type MiddlewareUnitBuilder<
146
170
  TBody = unknown,
147
171
  TReturns extends ReturnsMap = {},
148
172
  TRequiredLayouts = unknown,
149
- TRequiredState = {},
173
+ TRequires extends MiddlewareRequirements = {},
150
174
  TAppContext extends Record<string, unknown> = EmptyAppContext,
151
175
  TInheritedState = {},
152
176
  TQueryIn = unknown,
@@ -165,7 +189,7 @@ export type MiddlewareUnitBuilder<
165
189
  >,
166
190
  TReturns,
167
191
  TRequiredLayouts,
168
- TRequiredState
192
+ TRequires
169
193
  > & {
170
194
  query<Q, QIn = unknown>(
171
195
  schema: Schema<Q, QIn>,
@@ -175,7 +199,7 @@ export type MiddlewareUnitBuilder<
175
199
  TBody,
176
200
  TReturns,
177
201
  TRequiredLayouts,
178
- TRequiredState,
202
+ TRequires,
179
203
  TAppContext,
180
204
  TInheritedState,
181
205
  QIn,
@@ -191,7 +215,7 @@ export type MiddlewareUnitBuilder<
191
215
  TBody,
192
216
  TReturns,
193
217
  TRequiredLayouts,
194
- TRequiredState,
218
+ TRequires,
195
219
  TAppContext,
196
220
  TInheritedState,
197
221
  TQueryIn,
@@ -207,7 +231,7 @@ export type MiddlewareUnitBuilder<
207
231
  B,
208
232
  TReturns,
209
233
  TRequiredLayouts,
210
- TRequiredState,
234
+ TRequires,
211
235
  TAppContext,
212
236
  TInheritedState,
213
237
  TQueryIn,
@@ -224,7 +248,7 @@ export type MiddlewareUnitBuilder<
224
248
  B,
225
249
  TReturns,
226
250
  TRequiredLayouts,
227
- TRequiredState,
251
+ TRequires,
228
252
  TAppContext,
229
253
  TInheritedState,
230
254
  TQueryIn,
@@ -240,7 +264,7 @@ export type MiddlewareUnitBuilder<
240
264
  TBody,
241
265
  Omit<TReturns, keyof M> & M,
242
266
  TRequiredLayouts,
243
- TRequiredState,
267
+ TRequires,
244
268
  TAppContext,
245
269
  TInheritedState,
246
270
  TQueryIn,
@@ -248,13 +272,13 @@ export type MiddlewareUnitBuilder<
248
272
  TBodyIn,
249
273
  TExpectedState
250
274
  >;
251
- requires<Requires extends Record<string, unknown>>(): MiddlewareUnitBuilder<
275
+ requires<Requires extends MiddlewareRequirements>(): MiddlewareUnitBuilder<
252
276
  TQuery,
253
277
  TParams,
254
278
  TBody,
255
279
  TReturns,
256
280
  TRequiredLayouts,
257
- TRequiredState & Requires,
281
+ TRequires & Requires,
258
282
  TAppContext,
259
283
  TInheritedState,
260
284
  TQueryIn,
@@ -269,7 +293,8 @@ export type MiddlewareUnitBuilder<
269
293
  TParams,
270
294
  TBody,
271
295
  TAppContext,
272
- TInheritedState & TRequiredState
296
+ TInheritedState,
297
+ TRequires
273
298
  >,
274
299
  next: NextFn<TExpectedState>,
275
300
  ) => R,
@@ -284,6 +309,6 @@ export type MiddlewareUnitBuilder<
284
309
  TBodyIn,
285
310
  TReturns,
286
311
  TRequiredLayouts,
287
- TRequiredState
312
+ TRequires
288
313
  >;
289
314
  };