@effect-app/infra 2.16.7 → 2.16.8

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.
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
1
2
  /* eslint-disable @typescript-eslint/no-unsafe-argument */
2
3
  /* eslint-disable @typescript-eslint/no-empty-object-type */
3
4
  /* eslint-disable @typescript-eslint/no-explicit-any */
@@ -303,82 +304,7 @@ export const makeRouter = <
303
304
  ? { [k in keyof Layers]: Layer.Layer.Error<Layers[k]> }[number]
304
305
  : never
305
306
 
306
- const effect: {
307
- <
308
- E,
309
- R,
310
- Make extends (
311
- requests: RouteMatcher<CTXMap, Rsc, Context>
312
- ) => Effect<
313
- { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
314
- any,
315
- Strict extends true ? GetSuccess<TLayers> : any
316
- >,
317
- THandlers extends { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
318
- TLayers extends NonEmptyReadonlyArray<Layer.Layer.Any> | never[],
319
- Strict extends boolean = true
320
- >(
321
- layers: TLayers,
322
- make: Make & ((requests: RouteMatcher<CTXMap, Rsc, Context>) => Effect<THandlers, E, R>),
323
- strict?: Strict
324
- ): {
325
- moduleName: ModuleName
326
- Router: HttpRouter.HttpRouter.TagClass<
327
- RouterShape<Rsc>,
328
- `${ModuleName}Router`,
329
- never,
330
- | Exclude<Context, HttpRouter.HttpRouter.Provided>
331
- | Exclude<
332
- RPCRouteR<
333
- { [K in keyof Filter<Rsc>]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>> }[keyof Filter<Rsc>]
334
- >,
335
- HttpRouter.HttpRouter.Provided
336
- >
337
- >
338
- routes: Layer.Layer<
339
- RouterShape<Rsc>,
340
- E | GetError<TLayers>,
341
- | GetContext<TLayers>
342
- // | GetContext<Layers> // elsewhere provided
343
- | Exclude<R | RMW, GetSuccess<TLayers> | GetSuccess<Layers>>
344
- >
345
- }
346
- <
347
- E,
348
- R,
349
- THandlers extends { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
350
- TLayers extends NonEmptyReadonlyArray<Layer.Layer.Any> | never[],
351
- Strict extends boolean = true
352
- >(
353
- layers: [
354
- ...TLayers,
355
- Layer.Layer<Exclude<R, GetSuccess<TLayers>>, never, never>
356
- ],
357
- make: (requests: RouteMatcher<CTXMap, Rsc, Context>) => Effect<THandlers, E, R>,
358
- strict?: Strict
359
- ): {
360
- moduleName: ModuleName
361
- Router: HttpRouter.HttpRouter.TagClass<
362
- RouterShape<Rsc>,
363
- `${ModuleName}Router`,
364
- never,
365
- | Exclude<Context, HttpRouter.HttpRouter.Provided>
366
- | Exclude<
367
- RPCRouteR<
368
- { [K in keyof Filter<Rsc>]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>> }[keyof Filter<Rsc>]
369
- >,
370
- HttpRouter.HttpRouter.Provided
371
- >
372
- >
373
- routes: Layer.Layer<
374
- RouterShape<Rsc>,
375
- E | GetError<TLayers>,
376
- // | GetContext<Layers> // elsewhere provided
377
- | GetContext<TLayers>
378
- | Exclude<R | RMW, GetSuccess<TLayers> | GetSuccess<Layers>>
379
- >
380
- }
381
- } = (<
307
+ const f = <
382
308
  E,
383
309
  R,
384
310
  THandlers extends {
@@ -540,7 +466,163 @@ export const makeRouter = <
540
466
  Router: r,
541
467
  routes
542
468
  }
543
- }) as any
469
+ }
470
+
471
+ const effect: {
472
+ // Multiple times duplicated the "good" overload, so that errors will only mention the last overload when failing
473
+ <
474
+ E,
475
+ R,
476
+ Make extends (
477
+ requests: RouteMatcher<CTXMap, Rsc, Context>
478
+ ) => Effect<
479
+ { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
480
+ any,
481
+ Strict extends true ? GetSuccess<TLayers> : any
482
+ >,
483
+ THandlers extends { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
484
+ TLayers extends NonEmptyReadonlyArray<Layer.Layer.Any> | never[],
485
+ Strict extends boolean = true
486
+ >(
487
+ layers: TLayers,
488
+ make: Make & ((requests: RouteMatcher<CTXMap, Rsc, Context>) => Effect<THandlers, E, R>),
489
+ strict?: Strict
490
+ ): {
491
+ moduleName: ModuleName
492
+ Router: HttpRouter.HttpRouter.TagClass<
493
+ RouterShape<Rsc>,
494
+ `${ModuleName}Router`,
495
+ never,
496
+ | Exclude<Context, HttpRouter.HttpRouter.Provided>
497
+ | Exclude<
498
+ RPCRouteR<
499
+ { [K in keyof Filter<Rsc>]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>> }[keyof Filter<Rsc>]
500
+ >,
501
+ HttpRouter.HttpRouter.Provided
502
+ >
503
+ >
504
+ routes: Layer.Layer<
505
+ RouterShape<Rsc>,
506
+ E | GetError<TLayers>,
507
+ | GetContext<TLayers>
508
+ // | GetContext<Layers> // elsewhere provided
509
+ | Exclude<R | RMW, GetSuccess<TLayers> | GetSuccess<Layers>>
510
+ >
511
+ }
512
+ <
513
+ E,
514
+ R,
515
+ Make extends (
516
+ requests: RouteMatcher<CTXMap, Rsc, Context>
517
+ ) => Effect<
518
+ { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
519
+ any,
520
+ Strict extends true ? GetSuccess<TLayers> : any
521
+ >,
522
+ THandlers extends { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
523
+ TLayers extends NonEmptyReadonlyArray<Layer.Layer.Any> | never[],
524
+ Strict extends boolean = true
525
+ >(
526
+ layers: TLayers,
527
+ make: Make & ((requests: RouteMatcher<CTXMap, Rsc, Context>) => Effect<THandlers, E, R>),
528
+ strict?: Strict
529
+ ): {
530
+ moduleName: ModuleName
531
+ Router: HttpRouter.HttpRouter.TagClass<
532
+ RouterShape<Rsc>,
533
+ `${ModuleName}Router`,
534
+ never,
535
+ | Exclude<Context, HttpRouter.HttpRouter.Provided>
536
+ | Exclude<
537
+ RPCRouteR<
538
+ { [K in keyof Filter<Rsc>]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>> }[keyof Filter<Rsc>]
539
+ >,
540
+ HttpRouter.HttpRouter.Provided
541
+ >
542
+ >
543
+ routes: Layer.Layer<
544
+ RouterShape<Rsc>,
545
+ E | GetError<TLayers>,
546
+ | GetContext<TLayers>
547
+ // | GetContext<Layers> // elsewhere provided
548
+ | Exclude<R | RMW, GetSuccess<TLayers> | GetSuccess<Layers>>
549
+ >
550
+ }
551
+ <
552
+ E,
553
+ R,
554
+ Make extends (
555
+ requests: RouteMatcher<CTXMap, Rsc, Context>
556
+ ) => Effect<
557
+ { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
558
+ any,
559
+ Strict extends true ? GetSuccess<TLayers> : any
560
+ >,
561
+ THandlers extends { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
562
+ TLayers extends NonEmptyReadonlyArray<Layer.Layer.Any> | never[],
563
+ Strict extends boolean = true
564
+ >(
565
+ layers: TLayers,
566
+ make: Make & ((requests: RouteMatcher<CTXMap, Rsc, Context>) => Effect<THandlers, E, R>),
567
+ strict?: Strict
568
+ ): {
569
+ moduleName: ModuleName
570
+ Router: HttpRouter.HttpRouter.TagClass<
571
+ RouterShape<Rsc>,
572
+ `${ModuleName}Router`,
573
+ never,
574
+ | Exclude<Context, HttpRouter.HttpRouter.Provided>
575
+ | Exclude<
576
+ RPCRouteR<
577
+ { [K in keyof Filter<Rsc>]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>> }[keyof Filter<Rsc>]
578
+ >,
579
+ HttpRouter.HttpRouter.Provided
580
+ >
581
+ >
582
+ routes: Layer.Layer<
583
+ RouterShape<Rsc>,
584
+ E | GetError<TLayers>,
585
+ | GetContext<TLayers>
586
+ // | GetContext<Layers> // elsewhere provided
587
+ | Exclude<R | RMW, GetSuccess<TLayers> | GetSuccess<Layers>>
588
+ >
589
+ }
590
+ <
591
+ E,
592
+ R,
593
+ THandlers extends { [K in keyof Filter<Rsc>]: AHandler<Rsc[K]> },
594
+ TLayers extends NonEmptyReadonlyArray<Layer.Layer.Any> | never[],
595
+ Strict extends boolean = true
596
+ >(
597
+ layers: [
598
+ ...TLayers,
599
+ Layer.Layer<Exclude<R, GetSuccess<TLayers>>, never, never>
600
+ ],
601
+ make: (requests: RouteMatcher<CTXMap, Rsc, Context>) => Effect<THandlers, E, R>,
602
+ strict?: Strict
603
+ ): {
604
+ moduleName: ModuleName
605
+ Router: HttpRouter.HttpRouter.TagClass<
606
+ RouterShape<Rsc>,
607
+ `${ModuleName}Router`,
608
+ never,
609
+ | Exclude<Context, HttpRouter.HttpRouter.Provided>
610
+ | Exclude<
611
+ RPCRouteR<
612
+ { [K in keyof Filter<Rsc>]: Rpc.Rpc<Rsc[K], _R<ReturnType<THandlers[K]["handler"]>>> }[keyof Filter<Rsc>]
613
+ >,
614
+ HttpRouter.HttpRouter.Provided
615
+ >
616
+ >
617
+ routes: Layer.Layer<
618
+ RouterShape<Rsc>,
619
+ E | GetError<TLayers>,
620
+ // | GetContext<Layers> // elsewhere provided
621
+ | GetContext<TLayers>
622
+ | Exclude<R | RMW, GetSuccess<TLayers> | GetSuccess<Layers>>
623
+ >
624
+ }
625
+ } = f as any
544
626
 
545
627
  return effect
546
628
  }
@@ -0,0 +1,151 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2
+ import { Rpc } from "@effect/rpc"
3
+ import type { Request } from "effect-app"
4
+ import { Context, Effect, FiberRef, Layer, S, Schedule } from "effect-app"
5
+ import { type GetEffectContext, makeRpcClient, type RPCContextMap, UnauthorizedError } from "effect-app/client"
6
+ import { HttpHeaders, HttpServerRequest } from "effect-app/http"
7
+ import type * as EffectRequest from "effect/Request"
8
+ import { makeMiddleware, makeRouter } from "../src/api/routing.js"
9
+ import type { RequestContext } from "../src/RequestContext.js"
10
+
11
+ const optimisticConcurrencySchedule = Schedule.once
12
+ && Schedule.recurWhile<any>((a) => a?._tag === "OptimisticConcurrencyException")
13
+
14
+ export interface CTX {
15
+ context: RequestContext
16
+ }
17
+
18
+ export type CTXMap = {
19
+ // allowAnonymous: RPCContextMap.Inverted<"userProfile", UserProfile, typeof NotLoggedInError>
20
+ // TODO: not boolean but `string[]`
21
+ requireRoles: RPCContextMap.Custom<"", never, typeof UnauthorizedError, Array<string>>
22
+ }
23
+ const middleware = makeMiddleware({
24
+ contextMap: null as unknown as CTXMap,
25
+ // helper to deal with nested generic lmitations
26
+ context: null as any as HttpServerRequest.HttpServerRequest,
27
+ execute: Effect.gen(function*() {
28
+ return <T extends { config?: { [K in keyof CTXMap]?: any } }, Req extends S.TaggedRequest.All, R>(
29
+ _schema: T & S.Schema<Req, any, never>,
30
+ handler: (request: Req) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, R>,
31
+ moduleName?: string
32
+ ) =>
33
+ (
34
+ req: Req
35
+ ): Effect.Effect<
36
+ Request.Request.Success<Req>,
37
+ Request.Request.Error<Req>,
38
+ | HttpServerRequest.HttpServerRequest
39
+ | Exclude<R, GetEffectContext<CTXMap, T["config"]>>
40
+ > =>
41
+ Effect
42
+ .gen(function*() {
43
+ // const headers = yield* Rpc.currentHeaders
44
+ const ctx = Context.empty()
45
+
46
+ // const config = "config" in schema ? schema.config : undefined
47
+
48
+ // Check JWT
49
+ // TODO
50
+ // if (!fakeLogin && !request.allowAnonymous) {
51
+ // yield* Effect.catchAll(
52
+ // checkJWTI({
53
+ // ...authConfig,
54
+ // issuer: authConfig.issuer + "/",
55
+ // jwksUri: `${authConfig.issuer}/.well-known/jwks.json`
56
+ // }),
57
+ // (err) => Effect.fail(new JWTError({ error: err }))
58
+ // )
59
+ // }
60
+
61
+ // const fakeLogin = true
62
+ // const r = (fakeLogin
63
+ // ? makeUserProfileFromUserHeader(headers["x-user"])
64
+ // : makeUserProfileFromAuthorizationHeader(
65
+ // headers["authorization"]
66
+ // ))
67
+ // .pipe(Effect.exit, basicRuntime.runSync)
68
+ // if (!Exit.isSuccess(r)) {
69
+ // yield* Effect.logWarning("Parsing userInfo failed").pipe(Effect.annotateLogs("r", r))
70
+ // }
71
+ // const userProfile = Option.fromNullable(Exit.isSuccess(r) ? r.value : undefined)
72
+ // if (Option.isSome(userProfile)) {
73
+ // // yield* rcc.update((_) => ({ ..._, userPorfile: userProfile.value }))
74
+ // ctx = ctx.pipe(Context.add(UserProfile, userProfile.value))
75
+ // } else if (!config?.allowAnonymous) {
76
+ // return yield* new NotLoggedInError({ message: "no auth" })
77
+ // }
78
+
79
+ // if (config?.requireRoles) {
80
+ // // TODO
81
+ // if (
82
+ // !userProfile.value
83
+ // || !config.requireRoles.every((role: any) => userProfile.value!.roles.includes(role))
84
+ // ) {
85
+ // return yield* new UnauthorizedError()
86
+ // }
87
+ // }
88
+
89
+ return yield* handler(req).pipe(
90
+ Effect.retry(optimisticConcurrencySchedule),
91
+ Effect.provide(ctx as Context.Context<GetEffectContext<CTXMap, T["config"]>>)
92
+ )
93
+ })
94
+ .pipe(
95
+ Effect.provide(
96
+ Effect
97
+ .gen(function*() {
98
+ yield* Effect.annotateCurrentSpan("request.name", moduleName ? `${moduleName}.${req._tag}` : req._tag)
99
+ // yield* RequestContextContainer.update((_) => ({
100
+ // ..._,
101
+ // name: NonEmptyString255(moduleName ? `${moduleName}.${req._tag}` : req._tag)
102
+ // }))
103
+ const httpReq = yield* HttpServerRequest.HttpServerRequest
104
+ // TODO: only pass Authentication etc, or move headers to actual Rpc Headers
105
+ yield* FiberRef.update(
106
+ Rpc.currentHeaders,
107
+ (headers) =>
108
+ HttpHeaders.merge(
109
+ httpReq.headers,
110
+ headers
111
+ )
112
+ )
113
+ })
114
+ .pipe(Layer.effectDiscard)
115
+ )
116
+ )
117
+ // .pipe(Effect.provide(RequestCacheLayers)) as any
118
+ })
119
+ })
120
+
121
+ export const { matchAll, matchFor } = makeRouter(middleware, true)
122
+
123
+ export type RequestConfig = {
124
+ /** Disable authentication requirement */
125
+ allowAnonymous?: true
126
+ /** Control the roles that are required to access the resource */
127
+ allowRoles?: readonly string[]
128
+ }
129
+ export const { TaggedRequest: Req } = makeRpcClient<RequestConfig, CTXMap>({
130
+ // allowAnonymous: NotLoggedInError,
131
+ requireRoles: UnauthorizedError
132
+ })
133
+
134
+ export class GetSomething extends Req<GetSomething>()("GetSomething", {
135
+ id: S.String
136
+ }, { success: S.Void }) {}
137
+
138
+ const Something = { GetSomething, meta: { moduleName: "Something" as const } }
139
+
140
+ export class SomethingRepo extends Effect.Service<SomethingRepo>()("SomethingRepo", {
141
+ dependencies: [],
142
+ effect: Effect.gen(function*() {
143
+ return {}
144
+ })
145
+ }) {}
146
+
147
+ matchFor(Something)([], ({ GetSomething }) =>
148
+ Effect.gen(function*() {
149
+ // const repo = yield* SomethingRepo
150
+ return { GetSomething: GetSomething(Effect.void) }
151
+ }))
@@ -0,0 +1,129 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2
+ import { Rpc } from "@effect/rpc";
3
+ import { Context, Effect, FiberRef, Layer, S, Schedule } from "effect-app";
4
+ import { makeRpcClient, UnauthorizedError } from "effect-app/client";
5
+ import { HttpHeaders, HttpServerRequest } from "effect-app/http";
6
+ import { makeMiddleware, makeRouter } from "../src/api/routing5.js";
7
+ const optimisticConcurrencySchedule = Schedule.once
8
+ && Schedule.recurWhile((a) => a?._tag === "OptimisticConcurrencyException");
9
+ const middleware = makeMiddleware({
10
+ contextMap: null,
11
+ // helper to deal with nested generic lmitations
12
+ context: null,
13
+ execute: Effect.gen(function* () {
14
+ return (schema, handler, moduleName) => (req) => Effect
15
+ .gen(function* () {
16
+ const headers = yield* Rpc.currentHeaders;
17
+ const ctx = Context.empty();
18
+ const config = "config" in schema ? schema.config : undefined;
19
+ // Check JWT
20
+ // TODO
21
+ // if (!fakeLogin && !request.allowAnonymous) {
22
+ // yield* Effect.catchAll(
23
+ // checkJWTI({
24
+ // ...authConfig,
25
+ // issuer: authConfig.issuer + "/",
26
+ // jwksUri: `${authConfig.issuer}/.well-known/jwks.json`
27
+ // }),
28
+ // (err) => Effect.fail(new JWTError({ error: err }))
29
+ // )
30
+ // }
31
+ // const fakeLogin = true
32
+ // const r = (fakeLogin
33
+ // ? makeUserProfileFromUserHeader(headers["x-user"])
34
+ // : makeUserProfileFromAuthorizationHeader(
35
+ // headers["authorization"]
36
+ // ))
37
+ // .pipe(Effect.exit, basicRuntime.runSync)
38
+ // if (!Exit.isSuccess(r)) {
39
+ // yield* Effect.logWarning("Parsing userInfo failed").pipe(Effect.annotateLogs("r", r))
40
+ // }
41
+ // const userProfile = Option.fromNullable(Exit.isSuccess(r) ? r.value : undefined)
42
+ // if (Option.isSome(userProfile)) {
43
+ // // yield* rcc.update((_) => ({ ..._, userPorfile: userProfile.value }))
44
+ // ctx = ctx.pipe(Context.add(UserProfile, userProfile.value))
45
+ // } else if (!config?.allowAnonymous) {
46
+ // return yield* new NotLoggedInError({ message: "no auth" })
47
+ // }
48
+ // if (config?.requireRoles) {
49
+ // // TODO
50
+ // if (
51
+ // !userProfile.value
52
+ // || !config.requireRoles.every((role: any) => userProfile.value!.roles.includes(role))
53
+ // ) {
54
+ // return yield* new UnauthorizedError()
55
+ // }
56
+ // }
57
+ return yield* handler(req).pipe(Effect.retry(optimisticConcurrencySchedule), Effect.provide(ctx));
58
+ })
59
+ .pipe(Effect.provide(Effect
60
+ .gen(function* () {
61
+ yield* Effect.annotateCurrentSpan("request.name", moduleName ? `${moduleName}.${req._tag}` : req._tag);
62
+ // yield* RequestContextContainer.update((_) => ({
63
+ // ..._,
64
+ // name: NonEmptyString255(moduleName ? `${moduleName}.${req._tag}` : req._tag)
65
+ // }))
66
+ const httpReq = yield* HttpServerRequest.HttpServerRequest;
67
+ // TODO: only pass Authentication etc, or move headers to actual Rpc Headers
68
+ yield* FiberRef.update(Rpc.currentHeaders, (headers) => HttpHeaders.merge(httpReq.headers, headers));
69
+ })
70
+ .pipe(Layer.effectDiscard)));
71
+ // .pipe(Effect.provide(RequestCacheLayers)) as any
72
+ })
73
+ });
74
+ export const { matchAll, matchFor } = makeRouter(middleware, true);
75
+ export const { TaggedRequest: Req } = makeRpcClient({
76
+ // allowAnonymous: NotLoggedInError,
77
+ requireRoles: UnauthorizedError
78
+ });
79
+ export class GetSomething extends Req()("GetSomething", {
80
+ id: S.String
81
+ }, { success: S.Void }) {
82
+ }
83
+ export class GetSomethingElse extends Req()("GetSomethingElse", {
84
+ id: S.String
85
+ }, { success: S.String }) {
86
+ }
87
+ const Something = { GetSomething, GetSomethingElse, meta: { moduleName: "Something" } };
88
+ export class SomethingService extends Effect.Service()("SomethingService", {
89
+ dependencies: [],
90
+ effect: Effect.gen(function* () {
91
+ return {};
92
+ })
93
+ }) {
94
+ }
95
+ const c = a({ a: 5 });
96
+ export class SomethingRepo extends Effect.Service()("SomethingRepo", {
97
+ dependencies: [SomethingService.Default],
98
+ effect: Effect.gen(function* () {
99
+ const smth = yield* SomethingService;
100
+ return {};
101
+ })
102
+ }) {
103
+ }
104
+ export class SomethingService2 extends Effect.Service()("SomethingService2", {
105
+ dependencies: [],
106
+ effect: Effect.gen(function* () {
107
+ return {};
108
+ })
109
+ }) {
110
+ }
111
+ const { handle, routes } = matchFor(Something);
112
+ const d = handle({
113
+ dependencies: [
114
+ SomethingRepo.Default,
115
+ SomethingService.Default
116
+ // SomethingService2.Default
117
+ ],
118
+ effect: Effect.gen(function* () {
119
+ const repo = yield* SomethingRepo;
120
+ const smth = yield* SomethingService;
121
+ const smth2 = yield* SomethingService2;
122
+ const { GetSomething, GetSomethingElse } = routes;
123
+ return {
124
+ GetSomething: GetSomething(Effect.void),
125
+ GetSomethingElse: GetSomethingElse(Effect.succeed("12"))
126
+ };
127
+ })
128
+ });
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci50ZXN0IGNvcHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9jb250cm9sbGVyLnRlc3QgY29weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrREFBK0Q7QUFDL0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUVqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDMUUsT0FBTyxFQUF5QixhQUFhLEVBQXNCLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDL0csT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRWhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFHbkUsTUFBTSw2QkFBNkIsR0FBRyxRQUFRLENBQUMsSUFBSTtPQUM5QyxRQUFRLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLGdDQUFnQyxDQUFDLENBQUE7QUFXbEYsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDO0lBQ2hDLFVBQVUsRUFBRSxJQUF5QjtJQUNyQyxnREFBZ0Q7SUFDaEQsT0FBTyxFQUFFLElBQWtEO0lBQzNELE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMzQixPQUFPLENBQ0wsTUFBcUMsRUFDckMsT0FBaUgsRUFDakgsVUFBbUIsRUFDbkIsRUFBRSxDQUNKLENBQ0UsR0FBUSxFQU1SLEVBQUUsQ0FDRixNQUFNO2FBQ0gsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUNaLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUE7WUFDekMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../controller.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAW,MAAM,EAAY,KAAK,EAAE,CAAC,EAAY,MAAM,YAAY,CAAA;AAC1E,OAAO,EAAwC,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC/G,OAAO,EAAe,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAK9D,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,MAAM,MAAM,GAAG;IAGnB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CACvF,CAAA;AAmGD,eAAO,MAAQ,QAAQ;;;;;sBAVH,KAAC;;;;;;GAUI,QAAQ;;;;;;mBA3DpB,MAAM,CAAE,GAAE;mBA2Bb,MA1BM,CAAC,GAAG;;mBADP,MAAM,CAAE,GAAE;mBA2Bb,MA1BM,CAAC,GAAG;iKAyFuT,KAAK,CAAC,GAAG;;;uBA1FvU,MAAM,CAAE,GAAE;uBA2Bb,MA1BM,CAAC,GAAG;;uBADP,MAAM,CAAE,GAAE;uBA2Bb,MA1BM,CAAC,GAAG;;;;;mBADP,MAAM,CAAE,GAAE;mBA2Bb,MA1BM,CAAC,GAAG;;mBADP,MAAM,CAAE,GAAE;mBA2Bb,MA1BM,CAAC,GAAG;mKAyFm6D,KAAK,CAAC,GAAG;;;uBA1Fn7D,MAAM,CAAE,GAAE;uBA2Bb,MA1BM,CAAC,GAAG;;uBADP,MAAM,CAAE,GAAE;uBA2Bb,MA1BM,CAAC,GAAG;;;;;mBADP,MAAM,CAAE,GAAE;mBA2Bb,MA1BM,CAAC,GAAG;;mBADP,MAAM,CAAE,GAAE;mBA2Bb,MA1BM,CAAC,GAAG;mKAyF6iH,KAAK,CAAC,GAAG;;;uBA1F7jH,MAAM,CAAE,GAAE;uBA2Bb,MA1BM,CAAC,GAAG;;uBADP,MAAM,CAAE,GAAE;uBA2Bb,MA1BM,CAAC,GAAG;;;;;mBADP,MAAM,CAAE,GAAE;mBA2Bb,MA1BM,CAAC,GAAG;mKAyFq4J,KAAK,CAAC,GAAG;;;uBA1Fr5J,MAAM,CAAE,GAAE;uBA2Bb,MA1BM,CAAC,GAAG;;uBADP,MAAM,CAAE,GAAE;uBA2Bb,MA1BM,CAAC,GAAG;;;;CA0D8C,CAAA;AAElE,MAAM,MAAM,aAAa,GAAG;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,IAAI,CAAA;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B,CAAA;AACD,eAAO,MAAuB,GAAG;2CAvElB,MACX,CA8BM,MA9BC;mBAEqB,MAC9B,CA2BQ,GA3BJ,KAAK,MAAM,CAAE,MAAK;mBACT,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,MAAM;;;;;;6CA0BjC,MAjBA,CAAC,MAAM;mBAiBP,MAhBK,CAAC,GAAG,KAAM,MAAK,CAAC,MAAM;;;;;;6CAUT,MAAM,CAAC,MAAM;mBAAuC,MAAM,CAAC,GAAG,KAAK,MAAM,CAM3F,MALL;;;;;;6CAckB,MAAK,CAAC,MAAM;;;;;6CAMF,MAAM,CAAC,MAAM;;;CA4B5C,CAAA;;;;;;;;;;AAEF,qBAAa,YAAa,SAAQ,iBAEX;CAAG;;;;;AAI1B,qBAAa,aAAc,SAAQ,kBAKjC;CAAG"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller5.test.d.ts","sourceRoot":"","sources":["../controller5.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAW,MAAM,EAAY,KAAK,EAAE,CAAC,EAAY,MAAM,YAAY,CAAA;AAC1E,OAAO,EAAwC,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC/G,OAAO,EAAe,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAK9D,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,MAAM,MAAM,GAAG;IAGnB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CACvF,CAAA;AAmGD,eAAO,MAAQ,QAAQ;;;;;sBAPP,KAAK;;;;;;GAOI,QAAQ;;;;;;uDAgC3B,KAAK,CAAE,GAAE;;uBA1FqB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;;;;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;;;;uDAkI0rB,KAAK,CAAC,GAAG;;uBAnI1qB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;;;;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;;;;uDAkIg4E,KAAK,CAAC,GAAG;;uBAnIh3E,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;;;;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;;;;;;uBADyB,MAAM,CAAC,GAAG;uBA0BpC,MAzBH,CAyBG,GAzBC;;;;;;;;mGAyDuD,CAAA;AAElE,MAAM,MAAM,aAAa,GAAG;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,IAAI,CAAA;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B,CAAA;AACD,eAAO,MAAuB,GAAG;2CAvElB,MACZ,CA8BO,MA9BA;mBAEqB,MAC9B,CA2BS,GA3BL,KA2BK,MA3BM,CAAC,MAAM;mBACR,MAAK,CAAC,GAAG,KAAK,MAAM,CAAC,MAAM;;;;;;6CA0BhC,MAjBD,CAiBC,MAjBM;mBAiBN,MAhBI,CAgBJ,GAhBQ,KAAK,MAAM,CAAC,MAAM;;;;;;6CAUT,MAAM,CAAC,MAAM;mBAAuC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,MACjG;;;;;;6CAciB,MAAM,CAAC,MAAM;;;;;6CAMF,MAAM,CAAC,MAAM;;;CA4B3C,CAAA;;;;;;;;;;AAEF,qBAAa,YAAa,SAAQ,iBAEX;CAAG;;;;;;;;;;AAE1B,qBAAa,gBAAiB,SAAQ,qBAEb;CAAG;;;;;AAI5B,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG;;;;;AASL,qBAAa,aAAc,SAAQ,kBAOjC;CAAG;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG;AAEL,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;CAmBjB,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterApi.test.d.ts","sourceRoot":"","sources":["../filterApi.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ // packages/infra/vitest.config.ts
2
+ import { defineConfig } from "file:///Users/patrickroza/pj/effect-app/libs/node_modules/.pnpm/vite@5.2.6_@types+node@20.11.30/node_modules/vite/dist/node/index.js";
3
+
4
+ // vite.config.base.ts
5
+ import path from "path";
6
+ import fs from "fs";
7
+ var __vite_injected_original_dirname = "/Users/patrickroza/pj/effect-app/libs";
8
+ function makeConfig(dirName) {
9
+ const prefix = path.resolve(__vite_injected_original_dirname, "packages");
10
+ const packages = fs.readdirSync(prefix).map((f) => prefix + "/" + f).filter((f) => fs.lstatSync(f).isDirectory());
11
+ const cfg = {
12
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
13
+ //plugins: [autoImport],
14
+ test: {
15
+ include: ["./test/**/*.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
16
+ reporters: "verbose",
17
+ globals: true
18
+ },
19
+ resolve: {
20
+ alias: packages.reduce((acc, cur) => {
21
+ acc[JSON.parse(fs.readFileSync(cur + "/package.json", "utf-8")).name] = path.resolve(cur, cur.endsWith("core") ? "dist" : "src");
22
+ return acc;
23
+ }, {})
24
+ // "@effect-app/core/Prelude": path.join(__dirname, "packages/core/src/Prelude.code.ts")
25
+ }
26
+ };
27
+ console.log(cfg);
28
+ return cfg;
29
+ }
30
+
31
+ // packages/infra/vitest.config.ts
32
+ var __vite_injected_original_dirname2 = "/Users/patrickroza/pj/effect-app/libs/packages/infra";
33
+ var vitest_config_default = defineConfig(makeConfig(__vite_injected_original_dirname2));
34
+ export {
35
+ vitest_config_default as default
36
+ };
37
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFja2FnZXMvaW5mcmEvdml0ZXN0LmNvbmZpZy50cyIsICJ2aXRlLmNvbmZpZy5iYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy9wYWNrYWdlcy9pbmZyYVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy9wYWNrYWdlcy9pbmZyYS92aXRlc3QuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvcGFja2FnZXMvaW5mcmEvdml0ZXN0LmNvbmZpZy50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCBtYWtlQ29uZmlnIGZyb20gXCIuLi8uLi92aXRlLmNvbmZpZy5iYXNlXCJcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKG1ha2VDb25maWcoX19kaXJuYW1lKSlcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlic1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy92aXRlLmNvbmZpZy5iYXNlLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvdml0ZS5jb25maWcuYmFzZS50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0IEF1dG9JbXBvcnQgZnJvbSBcInVucGx1Z2luLWF1dG8taW1wb3J0L3ZpdGVcIlxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVzdC9jb25maWdcIlxuXG4vLyBjb25zdCBhdXRvSW1wb3J0ID0gQXV0b0ltcG9ydCh7XG4vLyAgIGR0czogXCIuL3Rlc3QvYXV0by1pbXBvcnRzLmQudHNcIixcbi8vICAgLy8gaW5jbHVkZTogW1xuLy8gICAvLyAgIC9cXC50ZXN0XFwuW3RqXXN4PyQvIC8vIC50cywgLnRzeCwgLmpzLCAuanN4XG4vLyAgIC8vIF0sXG4vLyAgIGltcG9ydHM6IFtcbi8vICAgICBcInZpdGVzdFwiXG4vLyAgIF1cbi8vIH0pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VDb25maWcoZGlyTmFtZT86IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcInBhY2thZ2VzXCIpXG4gIGNvbnN0IHBhY2thZ2VzID0gZnMucmVhZGRpclN5bmMocHJlZml4KS5tYXAoZiA9PiBwcmVmaXggKyBcIi9cIiArIGYpLmZpbHRlcihmID0+IGZzLmxzdGF0U3luYyhmKS5pc0RpcmVjdG9yeSgpIClcbiAgY29uc3QgY2ZnID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgLy9wbHVnaW5zOiBbYXV0b0ltcG9ydF0sXG4gICAgdGVzdDoge1xuICAgICAgaW5jbHVkZTogIFtcIi4vdGVzdC8qKi8qLnRlc3Que2pzLG1qcyxjanMsdHMsbXRzLGN0cyxqc3gsdHN4fVwiXSxcbiAgICAgIHJlcG9ydGVyczogXCJ2ZXJib3NlXCIsXG4gICAgICBnbG9iYWxzOiB0cnVlXG4gICAgfSxcbiAgICByZXNvbHZlOiB7XG4gICAgICBhbGlhczogcGFja2FnZXMucmVkdWNlKChhY2MsIGN1cikgPT4geyAvLyB3b3JrYXJvdW5kIGZvciAvUHJlbHVkZSBpc3N1ZVxuICAgICAgYWNjW0pTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGN1ciArIFwiL3BhY2thZ2UuanNvblwiLCBcInV0Zi04XCIpKS5uYW1lXSA9IHBhdGgucmVzb2x2ZShjdXIsIGN1ci5lbmRzV2l0aChcImNvcmVcIikgPyBcImRpc3RcIiA6IFwic3JjXCIpXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwgeyB9KSAvLyBcIkBlZmZlY3QtYXBwL2NvcmUvUHJlbHVkZVwiOiBwYXRoLmpvaW4oX19kaXJuYW1lLCBcInBhY2thZ2VzL2NvcmUvc3JjL1ByZWx1ZGUuY29kZS50c1wiKVxuICB9XG4gIH1cbiAgY29uc29sZS5sb2coY2ZnKVxuICByZXR1cm4gY2ZnXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxvQkFBb0I7OztBQ0E3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxRQUFRO0FBRmYsSUFBTSxtQ0FBbUM7QUFnQjFCLFNBQVIsV0FBNEIsU0FBa0I7QUFDbkQsUUFBTSxTQUFTLEtBQUssUUFBUSxrQ0FBVyxVQUFVO0FBQ2pELFFBQU0sV0FBVyxHQUFHLFlBQVksTUFBTSxFQUFFLElBQUksT0FBSyxTQUFTLE1BQU0sQ0FBQyxFQUFFLE9BQU8sT0FBSyxHQUFHLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBRTtBQUM3RyxRQUFNLE1BQU07QUFBQTtBQUFBO0FBQUEsSUFHVixNQUFNO0FBQUEsTUFDSixTQUFVLENBQUMsa0RBQWtEO0FBQUEsTUFDN0QsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLElBQ1g7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLE9BQU8sU0FBUyxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQ3JDLFlBQUksS0FBSyxNQUFNLEdBQUcsYUFBYSxNQUFNLGlCQUFpQixPQUFPLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSyxRQUFRLEtBQUssSUFBSSxTQUFTLE1BQU0sSUFBSSxTQUFTLEtBQUs7QUFDL0gsZUFBTztBQUFBLE1BQ1QsR0FBRyxDQUFFLENBQUM7QUFBQTtBQUFBLElBQ1I7QUFBQSxFQUNBO0FBQ0EsVUFBUSxJQUFJLEdBQUc7QUFDZixTQUFPO0FBQ1Q7OztBRHBDQSxJQUFNQSxvQ0FBbUM7QUFJekMsSUFBTyx3QkFBUSxhQUFhLFdBQVdDLGlDQUFTLENBQUM7IiwKICAibmFtZXMiOiBbIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIiwgIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIl0KfQo=