@effect-app/infra 2.94.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/Emailer/service.d.ts +1 -1
  3. package/dist/MainFiberSet.d.ts +1 -1
  4. package/dist/Operations.d.ts +1 -1
  5. package/dist/QueueMaker/errors.d.ts +1 -1
  6. package/dist/QueueMaker/errors.d.ts.map +1 -1
  7. package/dist/RequestFiberSet.d.ts +1 -1
  8. package/dist/Store/service.d.ts +2 -2
  9. package/dist/adapters/SQL/Model.d.ts +6 -6
  10. package/dist/adapters/ServiceBus.d.ts +2 -2
  11. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  12. package/dist/adapters/ServiceBus.js +13 -10
  13. package/dist/adapters/memQueue.d.ts +1 -1
  14. package/dist/api/routing/middleware/RouterMiddleware.d.ts +7 -7
  15. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  16. package/dist/api/routing/middleware/middleware.d.ts +6 -27
  17. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  18. package/dist/api/routing/middleware/middleware.js +72 -88
  19. package/dist/api/routing/middleware.d.ts +0 -3
  20. package/dist/api/routing/middleware.d.ts.map +1 -1
  21. package/dist/api/routing/middleware.js +1 -4
  22. package/dist/api/routing.d.ts +1 -2
  23. package/dist/api/routing.d.ts.map +1 -1
  24. package/dist/api/routing.js +2 -8
  25. package/package.json +3 -15
  26. package/src/adapters/ServiceBus.ts +7 -5
  27. package/src/api/routing/middleware/RouterMiddleware.ts +10 -9
  28. package/src/api/routing/middleware/middleware.ts +35 -40
  29. package/src/api/routing/middleware.ts +0 -3
  30. package/src/api/routing.ts +3 -9
  31. package/test/controller.test.ts +33 -9
  32. package/test/dist/controller.test.d.ts.map +1 -1
  33. package/test/dist/fixtures.d.ts +48 -32
  34. package/test/dist/fixtures.d.ts.map +1 -1
  35. package/test/dist/fixtures.js +76 -47
  36. package/test/dist/requires.test.d.ts.map +1 -1
  37. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -0
  38. package/test/fixtures.ts +70 -16
  39. package/test/requires.test.ts +16 -51
  40. package/test/rpc-multi-middleware.test.ts +134 -0
  41. package/dist/api/routing/middleware/RpcMiddleware.d.ts +0 -199
  42. package/dist/api/routing/middleware/RpcMiddleware.d.ts.map +0 -1
  43. package/dist/api/routing/middleware/RpcMiddleware.js +0 -14
  44. package/dist/api/routing/middleware/generic-middleware.d.ts +0 -41
  45. package/dist/api/routing/middleware/generic-middleware.d.ts.map +0 -1
  46. package/dist/api/routing/middleware/generic-middleware.js +0 -70
  47. package/dist/api/routing/middleware/middleware-api.d.ts +0 -88
  48. package/dist/api/routing/middleware/middleware-api.d.ts.map +0 -1
  49. package/dist/api/routing/middleware/middleware-api.js +0 -58
  50. package/src/api/routing/middleware/RpcMiddleware.ts +0 -301
  51. package/src/api/routing/middleware/generic-middleware.ts +0 -163
  52. package/src/api/routing/middleware/middleware-api.ts +0 -226
@@ -1,226 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { type AnyWithProps } from "@effect/rpc/Rpc"
3
- import { Context, type Effect, type NonEmptyArray, type NonEmptyReadonlyArray, S } from "effect-app"
4
- import { type GetContextConfig, type RPCContextMap } from "effect-app/client"
5
- import { type TypeTestId } from "../../routing.js"
6
- import { type MiddlewareMaker, middlewareMaker } from "./generic-middleware.js"
7
- import { type AnyDynamic, type RpcDynamic, Tag, type TagClassAny } from "./RpcMiddleware.js"
8
-
9
- /** Adapter used when setting the dynamic prop on a middleware implementation */
10
- export const contextMap = <
11
- RequestContextMap extends Record<string, RPCContextMap.Any>,
12
- Key extends (keyof RequestContextMap) & string
13
- >(rcm: RequestContextMap, key: Key): RpcDynamic<Key, RequestContextMap[Key]> => ({
14
- key,
15
- settings: { service: rcm[key]!["service"] } as RequestContextMap[Key]
16
- })
17
-
18
- /** Retrieves RequestContextConfig out of the RPC annotations */
19
- export const getConfig = <
20
- RequestContextMap extends Record<string, RPCContextMap.Any>
21
- >() =>
22
- (rpc: AnyWithProps): GetContextConfig<RequestContextMap> => {
23
- return Context.unsafeGet(rpc.annotations, Context.GenericTag("RequestContextConfig"))
24
- }
25
-
26
- // the following implements sort of builder pattern
27
- // we support both sideways and upwards elimination of dependencies
28
-
29
- // it's for dynamic middlewares
30
- type GetDependsOnKeys<MW extends MiddlewareMaker> = MW extends { dependsOn: NonEmptyReadonlyArray<TagClassAny> } ? {
31
- [K in keyof MW["dependsOn"]]: MW["dependsOn"][K] extends AnyDynamic ? MW["dependsOn"][K]["dynamic"]["key"]
32
- : never
33
- }[keyof MW["dependsOn"]]
34
- : never
35
-
36
- type FilterInDynamicMiddlewares<
37
- MWs extends ReadonlyArray<MiddlewareMaker>,
38
- RequestContextMap extends Record<string, RPCContextMap.Any>
39
- > = {
40
- [K in keyof MWs]: MWs[K] extends { dynamic: RpcDynamic<any, RequestContextMap[keyof RequestContextMap]> } ? MWs[K]
41
- : never
42
- }
43
-
44
- type RecursiveHandleMWsSideways<
45
- MWs,
46
- R extends {
47
- rcm: Record<string, RPCContextMap.Any>
48
- provided: keyof R["rcm"] // that's fine
49
- middlewares: ReadonlyArray<MiddlewareMaker>
50
- dmp: any
51
- middlewareR: any
52
- }
53
- > = MWs extends [
54
- infer F extends MiddlewareMaker,
55
- ...infer Rest extends ReadonlyArray<MiddlewareMaker>
56
- ] ? RecursiveHandleMWsSideways<Rest, {
57
- rcm: R["rcm"]
58
- // when one dynamic middleware depends on another, subtract the key to enforce the dependency to be provided after
59
- // (if already provided, it would have to be re-provided anyway, so better to provide it after)
60
- provided: Exclude<
61
- R["provided"] | FilterInDynamicMiddlewares<[F], R["rcm"]>[number]["dynamic"]["key"],
62
- // F is fine here because only dynamic middlewares will have 'dependsOn' prop
63
- GetDependsOnKeys<F>
64
- >
65
- middlewares: [...R["middlewares"], F]
66
- dmp: [FilterInDynamicMiddlewares<[F], R["rcm"]>[number]] extends [never] ? R["dmp"]
67
- :
68
- & R["dmp"]
69
- & {
70
- [U in FilterInDynamicMiddlewares<[F], R["rcm"]>[number] as U["dynamic"]["key"]]: U
71
- }
72
- middlewareR: MiddlewareMaker.ApplyManyServices<[F], R["middlewareR"]>
73
- }>
74
- : R
75
-
76
- export interface BuildingMiddleware<
77
- RequestContextMap extends Record<string, RPCContextMap.Any>,
78
- Provided extends keyof RequestContextMap,
79
- Middlewares extends ReadonlyArray<MiddlewareMaker>,
80
- DynamicMiddlewareProviders,
81
- out MiddlewareR extends { _tag: string } = never
82
- > {
83
- middleware<MWs extends NonEmptyArray<MiddlewareMaker>>(
84
- ...mw: MWs
85
- ): RecursiveHandleMWsSideways<MWs, {
86
- rcm: RequestContextMap
87
- provided: Provided
88
- middlewares: Middlewares
89
- dmp: DynamicMiddlewareProviders
90
- middlewareR: MiddlewareR
91
- }> extends infer Res extends {
92
- rcm: RequestContextMap
93
- provided: keyof RequestContextMap
94
- middlewares: ReadonlyArray<MiddlewareMaker>
95
- dmp: any
96
- middlewareR: any
97
- } ? MiddlewaresBuilder<
98
- Res["rcm"],
99
- Res["provided"],
100
- Res["middlewares"],
101
- Res["dmp"],
102
- Res["middlewareR"]
103
- >
104
- : never
105
-
106
- // helps debugging what are the missing requirements (type only)
107
- readonly [TypeTestId]: {
108
- missingDynamicMiddlewares: Exclude<keyof RequestContextMap, Provided>
109
- missingContext: MiddlewareR
110
- }
111
- }
112
-
113
- export type MiddlewaresBuilder<
114
- RequestContextMap extends Record<string, RPCContextMap.Any>,
115
- Provided extends keyof RequestContextMap = never,
116
- Middlewares extends ReadonlyArray<MiddlewareMaker> = [],
117
- DynamicMiddlewareProviders = unknown,
118
- MiddlewareR extends { _tag: string } = never
119
- > =
120
- & BuildingMiddleware<
121
- RequestContextMap,
122
- Provided,
123
- Middlewares,
124
- DynamicMiddlewareProviders,
125
- MiddlewareR
126
- >
127
- & // keyof Omit<RequestContextMap, Provided> extends never is true when all the dynamic middlewares are provided
128
- // MiddlewareR is never when all the required services from generic & dynamic middlewares are provided
129
- (keyof Omit<RequestContextMap, Provided> extends never ? [MiddlewareR] extends [never] ? ReturnType<
130
- typeof makeMiddlewareBasic<
131
- RequestContextMap,
132
- Middlewares
133
- >
134
- >
135
- : {}
136
- : {})
137
-
138
- export const makeMiddleware: <
139
- RequestContextMap extends Record<string, RPCContextMap.Any>
140
- >(rcm: RequestContextMap) => MiddlewaresBuilder<RequestContextMap> = (rcm) => {
141
- let allMiddleware: MiddlewareMaker[] = []
142
- const it = {
143
- middleware: (...middlewares: any[]) => {
144
- for (const mw of middlewares) {
145
- // recall that we run middlewares in reverse order
146
- allMiddleware = [mw, ...allMiddleware]
147
- }
148
- return allMiddleware.filter((m) => !!m.dynamic).length !== Object.keys(rcm).length
149
- // for sure, until all the dynamic middlewares are provided it's non sensical to call makeMiddlewareBasic
150
- ? it
151
- // actually, we don't know yet if MiddlewareR is never, but we can't easily check it at runtime
152
- : Object.assign(makeMiddlewareBasic<any, any>(rcm, ...allMiddleware), it)
153
- }
154
- }
155
- return it as any
156
- }
157
-
158
- //
159
- export interface MiddlewareMakerId {
160
- readonly _id: unique symbol
161
- }
162
-
163
- // TODO: actually end up with [Tag<A, A>, Tag<B, B>, ...]
164
- type MakeTags<A> = Context.Tag<A, A>
165
-
166
- const makeMiddlewareBasic =
167
- // by setting RequestContextMap beforehand, execute contextual typing does not fuck up itself to anys
168
- <
169
- RequestContextMap extends Record<string, RPCContextMap.Any>,
170
- MiddlewareProviders extends ReadonlyArray<MiddlewareMaker>
171
- >(
172
- _rcm: RequestContextMap,
173
- ...make: MiddlewareProviders
174
- ) => {
175
- // reverse middlewares and wrap one after the other
176
- const middleware = middlewareMaker(make)
177
-
178
- const failures = make.map((_) => _.failure).filter(Boolean)
179
- const provides = make.flatMap((_) => !_.provides ? [] : Array.isArray(_.provides) ? _.provides : [_.provides])
180
- const requires = make
181
- .flatMap((_) => !_.requires ? [] : Array.isArray(_.requires) ? _.requires : [_.requires])
182
- .filter((_) => !provides.includes(_))
183
-
184
- const MiddlewareMaker = Tag<MiddlewareMakerId>()("MiddlewareMaker", {
185
- failure: (failures.length > 0
186
- ? S.Union(...failures)
187
- : S.Never) as unknown as MiddlewareMaker.ManyErrors<MiddlewareProviders> extends never ? never
188
- : S.Schema<MiddlewareMaker.ManyErrors<MiddlewareProviders>>,
189
- requires: (requires.length > 0
190
- ? requires
191
- : undefined) as unknown as Exclude<
192
- MiddlewareMaker.ManyRequired<MiddlewareProviders>,
193
- MiddlewareMaker.ManyProvided<MiddlewareProviders>
194
- > extends never ? never : [
195
- MakeTags<
196
- Exclude<
197
- MiddlewareMaker.ManyRequired<MiddlewareProviders>,
198
- MiddlewareMaker.ManyProvided<MiddlewareProviders>
199
- >
200
- >
201
- ],
202
- provides: (provides.length > 0
203
- ? provides
204
- : undefined) as unknown as MiddlewareMaker.ManyProvided<MiddlewareProviders> extends never ? never : [
205
- MakeTags<MiddlewareMaker.ManyProvided<MiddlewareProviders>>
206
- ],
207
- wrap: true
208
- })(
209
- middleware as {
210
- dependencies: typeof middleware["dependencies"]
211
- effect: Effect<
212
- any, // TODO: why ?
213
- Effect.Error<typeof middleware["effect"]>,
214
- Effect.Context<typeof middleware["effect"]>
215
- >
216
- }
217
- )
218
-
219
- // add to the tag a default implementation
220
- return Object.assign(MiddlewareMaker, {
221
- // tag to be used to retrieve the RequestContextConfig from RPC annotations
222
- requestContext: Context.GenericTag<"RequestContextConfig", GetContextConfig<RequestContextMap>>(
223
- "RequestContextConfig"
224
- )
225
- })
226
- }