@effect-app/infra 3.10.0 → 4.0.0-beta.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 (231) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/_check.sh +3 -0
  3. package/dist/CUPS.d.ts +22 -12
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +28 -29
  6. package/dist/Emailer/Sendgrid.js +13 -12
  7. package/dist/Emailer/service.d.ts +3 -13
  8. package/dist/Emailer/service.d.ts.map +1 -1
  9. package/dist/Emailer/service.js +3 -3
  10. package/dist/MainFiberSet.d.ts +18 -41
  11. package/dist/MainFiberSet.d.ts.map +1 -1
  12. package/dist/MainFiberSet.js +10 -10
  13. package/dist/Model/Repository/ext.d.ts.map +1 -1
  14. package/dist/Model/Repository/ext.js +13 -10
  15. package/dist/Model/Repository/internal/internal.d.ts +5 -5
  16. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  17. package/dist/Model/Repository/internal/internal.js +52 -42
  18. package/dist/Model/Repository/legacy.d.ts +9 -9
  19. package/dist/Model/Repository/legacy.d.ts.map +1 -1
  20. package/dist/Model/Repository/makeRepo.d.ts +4 -4
  21. package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
  22. package/dist/Model/Repository/makeRepo.js +1 -1
  23. package/dist/Model/Repository/service.d.ts +11 -11
  24. package/dist/Model/Repository/service.d.ts.map +1 -1
  25. package/dist/Model/Repository/validation.d.ts +17 -47
  26. package/dist/Model/Repository/validation.d.ts.map +1 -1
  27. package/dist/Model/Repository/validation.js +2 -2
  28. package/dist/Model/query/dsl.d.ts +22 -22
  29. package/dist/Model/query/dsl.d.ts.map +1 -1
  30. package/dist/Model/query/dsl.js +1 -1
  31. package/dist/Model/query/new-kid-interpreter.d.ts +1 -1
  32. package/dist/Model/query/new-kid-interpreter.js +7 -7
  33. package/dist/Operations.d.ts +22 -63
  34. package/dist/Operations.d.ts.map +1 -1
  35. package/dist/Operations.js +14 -14
  36. package/dist/OperationsRepo.d.ts +23 -7
  37. package/dist/OperationsRepo.d.ts.map +1 -1
  38. package/dist/OperationsRepo.js +4 -5
  39. package/dist/QueueMaker/SQLQueue.d.ts +6 -8
  40. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  41. package/dist/QueueMaker/SQLQueue.js +20 -24
  42. package/dist/QueueMaker/errors.js +1 -1
  43. package/dist/QueueMaker/memQueue.d.ts +2 -5
  44. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  45. package/dist/QueueMaker/memQueue.js +22 -26
  46. package/dist/QueueMaker/sbqueue.d.ts +2 -5
  47. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  48. package/dist/QueueMaker/sbqueue.js +24 -28
  49. package/dist/RequestContext.d.ts +28 -41
  50. package/dist/RequestContext.d.ts.map +1 -1
  51. package/dist/RequestContext.js +4 -4
  52. package/dist/RequestFiberSet.d.ts +23 -50
  53. package/dist/RequestFiberSet.d.ts.map +1 -1
  54. package/dist/RequestFiberSet.js +14 -14
  55. package/dist/Store/ContextMapContainer.d.ts +4 -4
  56. package/dist/Store/ContextMapContainer.d.ts.map +1 -1
  57. package/dist/Store/ContextMapContainer.js +5 -5
  58. package/dist/Store/Cosmos.d.ts.map +1 -1
  59. package/dist/Store/Cosmos.js +21 -28
  60. package/dist/Store/Disk.d.ts.map +1 -1
  61. package/dist/Store/Disk.js +12 -16
  62. package/dist/Store/Memory.d.ts +2 -2
  63. package/dist/Store/Memory.d.ts.map +1 -1
  64. package/dist/Store/Memory.js +25 -33
  65. package/dist/Store/index.js +2 -2
  66. package/dist/Store/service.d.ts +9 -34
  67. package/dist/Store/service.d.ts.map +1 -1
  68. package/dist/Store/service.js +4 -4
  69. package/dist/Store/utils.d.ts.map +1 -1
  70. package/dist/Store/utils.js +10 -2
  71. package/dist/adapters/SQL/Model.d.ts +106 -162
  72. package/dist/adapters/SQL/Model.d.ts.map +1 -1
  73. package/dist/adapters/SQL/Model.js +92 -130
  74. package/dist/adapters/ServiceBus.d.ts +13 -44
  75. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  76. package/dist/adapters/ServiceBus.js +13 -15
  77. package/dist/adapters/cosmos-client.d.ts +7 -3
  78. package/dist/adapters/cosmos-client.d.ts.map +1 -1
  79. package/dist/adapters/cosmos-client.js +5 -4
  80. package/dist/adapters/logger.d.ts +1 -1
  81. package/dist/adapters/logger.d.ts.map +1 -1
  82. package/dist/adapters/memQueue.d.ts +8 -21
  83. package/dist/adapters/memQueue.d.ts.map +1 -1
  84. package/dist/adapters/memQueue.js +4 -4
  85. package/dist/adapters/mongo-client.d.ts +6 -6
  86. package/dist/adapters/mongo-client.d.ts.map +1 -1
  87. package/dist/adapters/mongo-client.js +5 -4
  88. package/dist/adapters/redis-client.d.ts +14 -4
  89. package/dist/adapters/redis-client.d.ts.map +1 -1
  90. package/dist/adapters/redis-client.js +19 -18
  91. package/dist/api/ContextProvider.d.ts +10 -15
  92. package/dist/api/ContextProvider.d.ts.map +1 -1
  93. package/dist/api/ContextProvider.js +8 -8
  94. package/dist/api/codec.d.ts +1 -1
  95. package/dist/api/codec.d.ts.map +1 -1
  96. package/dist/api/codec.js +1 -1
  97. package/dist/api/internal/RequestContextMiddleware.d.ts +1 -1
  98. package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
  99. package/dist/api/internal/auth.d.ts +3 -3
  100. package/dist/api/internal/auth.d.ts.map +1 -1
  101. package/dist/api/internal/auth.js +8 -8
  102. package/dist/api/internal/events.d.ts +2 -2
  103. package/dist/api/internal/events.d.ts.map +1 -1
  104. package/dist/api/internal/events.js +9 -9
  105. package/dist/api/internal/health.d.ts +1 -1
  106. package/dist/api/internal/health.d.ts.map +1 -1
  107. package/dist/api/internal/health.js +2 -2
  108. package/dist/api/layerUtils.d.ts +14 -14
  109. package/dist/api/layerUtils.d.ts.map +1 -1
  110. package/dist/api/layerUtils.js +5 -5
  111. package/dist/api/middlewares.d.ts +0 -75
  112. package/dist/api/middlewares.d.ts.map +1 -1
  113. package/dist/api/middlewares.js +6 -51
  114. package/dist/api/reportError.js +4 -4
  115. package/dist/api/routing/middleware/RouterMiddleware.d.ts +4 -4
  116. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  117. package/dist/api/routing/middleware/middleware.d.ts +6 -7
  118. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  119. package/dist/api/routing/middleware/middleware.js +9 -13
  120. package/dist/api/routing/schema/jwt.d.ts +1 -1
  121. package/dist/api/routing/schema/jwt.d.ts.map +1 -1
  122. package/dist/api/routing/schema/jwt.js +5 -4
  123. package/dist/api/routing/utils.d.ts +2 -2
  124. package/dist/api/routing/utils.d.ts.map +1 -1
  125. package/dist/api/routing/utils.js +10 -8
  126. package/dist/api/routing.d.ts +39 -37
  127. package/dist/api/routing.d.ts.map +1 -1
  128. package/dist/api/routing.js +17 -21
  129. package/dist/api/setupRequest.d.ts +4 -6
  130. package/dist/api/setupRequest.d.ts.map +1 -1
  131. package/dist/api/setupRequest.js +10 -9
  132. package/dist/arbs.d.ts +3 -3
  133. package/dist/arbs.d.ts.map +1 -1
  134. package/dist/arbs.js +2 -2
  135. package/dist/errorReporter.d.ts +1 -1
  136. package/dist/errorReporter.d.ts.map +1 -1
  137. package/dist/errorReporter.js +12 -12
  138. package/dist/fileUtil.d.ts +6 -6
  139. package/dist/fileUtil.d.ts.map +1 -1
  140. package/dist/logger/jsonLogger.d.ts.map +1 -1
  141. package/dist/logger/jsonLogger.js +19 -18
  142. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  143. package/dist/logger/logFmtLogger.js +11 -13
  144. package/dist/logger/shared.d.ts +2 -2
  145. package/dist/logger/shared.d.ts.map +1 -1
  146. package/dist/logger/shared.js +7 -9
  147. package/dist/logger.d.ts +1 -1
  148. package/dist/logger.d.ts.map +1 -1
  149. package/dist/rateLimit.d.ts +2 -2
  150. package/dist/rateLimit.d.ts.map +1 -1
  151. package/dist/rateLimit.js +5 -5
  152. package/dist/test.d.ts +2 -2
  153. package/dist/test.d.ts.map +1 -1
  154. package/dist/test.js +6 -24
  155. package/package.json +19 -22
  156. package/src/CUPS.ts +15 -14
  157. package/src/Emailer/Sendgrid.ts +15 -13
  158. package/src/Emailer/service.ts +3 -3
  159. package/src/MainFiberSet.ts +16 -12
  160. package/src/Model/Repository/ext.ts +18 -16
  161. package/src/Model/Repository/internal/internal.ts +80 -69
  162. package/src/Model/Repository/legacy.ts +9 -9
  163. package/src/Model/Repository/makeRepo.ts +5 -5
  164. package/src/Model/Repository/service.ts +12 -12
  165. package/src/Model/Repository/validation.ts +1 -1
  166. package/src/Model/query/dsl.ts +13 -13
  167. package/src/Model/query/new-kid-interpreter.ts +8 -8
  168. package/src/Operations.ts +17 -14
  169. package/src/OperationsRepo.ts +3 -4
  170. package/src/QueueMaker/SQLQueue.ts +86 -89
  171. package/src/QueueMaker/errors.ts +1 -1
  172. package/src/QueueMaker/memQueue.ts +90 -91
  173. package/src/QueueMaker/sbqueue.ts +90 -92
  174. package/src/RequestContext.ts +3 -3
  175. package/src/RequestFiberSet.ts +17 -15
  176. package/src/Store/ContextMapContainer.ts +4 -4
  177. package/src/Store/Cosmos.ts +20 -27
  178. package/src/Store/Disk.ts +13 -17
  179. package/src/Store/Memory.ts +28 -34
  180. package/src/Store/index.ts +1 -1
  181. package/src/Store/service.ts +4 -4
  182. package/src/Store/utils.ts +9 -5
  183. package/src/adapters/SQL/Model.ts +255 -268
  184. package/src/adapters/ServiceBus.ts +17 -20
  185. package/src/adapters/cosmos-client.ts +5 -5
  186. package/src/adapters/memQueue.ts +3 -3
  187. package/src/adapters/mongo-client.ts +5 -5
  188. package/src/adapters/redis-client.ts +25 -19
  189. package/src/api/ContextProvider.ts +24 -34
  190. package/src/api/codec.ts +1 -1
  191. package/src/api/internal/auth.ts +11 -13
  192. package/src/api/internal/events.ts +11 -11
  193. package/src/api/internal/health.ts +1 -1
  194. package/src/api/layerUtils.ts +20 -20
  195. package/src/api/middlewares.ts +0 -97
  196. package/src/api/reportError.ts +3 -3
  197. package/src/api/routing/middleware/RouterMiddleware.ts +5 -6
  198. package/src/api/routing/middleware/middleware.ts +13 -25
  199. package/src/api/routing/schema/jwt.ts +9 -7
  200. package/src/api/routing/utils.ts +12 -10
  201. package/src/api/routing.ts +77 -79
  202. package/src/api/setupRequest.ts +9 -8
  203. package/src/arbs.ts +3 -3
  204. package/src/errorReporter.ts +12 -12
  205. package/src/logger/jsonLogger.ts +18 -17
  206. package/src/logger/logFmtLogger.ts +10 -12
  207. package/src/logger/shared.ts +6 -8
  208. package/src/rateLimit.ts +7 -7
  209. package/src/test.ts +7 -29
  210. package/test/contextProvider.test.ts +77 -70
  211. package/test/controller.test.ts +51 -39
  212. package/test/dist/contextProvider.test.d.ts.map +1 -1
  213. package/test/dist/controller.test.d.ts.map +1 -1
  214. package/test/dist/fixtures.d.ts +33 -81
  215. package/test/dist/fixtures.d.ts.map +1 -1
  216. package/test/dist/fixtures.js +9 -8
  217. package/test/dist/query.test.d.ts.map +1 -1
  218. package/test/dist/rawQuery.test.d.ts.map +1 -1
  219. package/test/dist/requires.test.d.ts.map +1 -1
  220. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  221. package/test/fixtures.ts +9 -7
  222. package/test/query.test.ts +49 -41
  223. package/test/rawQuery.test.ts +44 -40
  224. package/test/requires.test.ts +40 -31
  225. package/test/rpc-multi-middleware.test.ts +13 -14
  226. package/test/validateSample.test.ts +2 -2
  227. package/tsconfig.json +1 -27
  228. package/dist/api/internal/middlewares.d.ts +0 -15
  229. package/dist/api/internal/middlewares.d.ts.map +0 -1
  230. package/dist/api/internal/middlewares.js +0 -168
  231. package/src/api/internal/middlewares.ts +0 -279
package/src/rateLimit.ts CHANGED
@@ -21,7 +21,7 @@
21
21
  // }
22
22
 
23
23
  import { Array, type Duration, Effect, type NonEmptyArray } from "effect-app"
24
- import type { Semaphore } from "effect-app/Effect"
24
+ import type { Semaphore } from "effect/Semaphore"
25
25
 
26
26
  /**
27
27
  * Executes the specified effect, acquiring the specified number of permits
@@ -30,8 +30,8 @@ import type { Semaphore } from "effect-app/Effect"
30
30
  * failure, or interruption.
31
31
  */
32
32
  export function SEM_withPermitsDuration(permits: number, duration: Duration.Duration) {
33
- return (self: Semaphore): <R, E, A>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R> => {
34
- return (effect) =>
33
+ return (self: Semaphore): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R> => {
34
+ return <A, E, R>(effect: Effect.Effect<A, E, R>) =>
35
35
  Effect.uninterruptibleMask(
36
36
  (restore) =>
37
37
  restore(self.take(permits))
@@ -52,7 +52,7 @@ export function batchPar<R, E, A, R2, E2, A2, T>(
52
52
  ) {
53
53
  return (items: Iterable<T>) =>
54
54
  Effect.forEach(
55
- Array.chunk_(items, n),
55
+ Array.chunksOf(items, n),
56
56
  (_, i) =>
57
57
  Effect
58
58
  .forEach(_, (_, j) => forEachItem(_, j, i), { concurrency: "inherit" })
@@ -68,7 +68,7 @@ export function batch<R, E, A, R2, E2, A2, T>(
68
68
  ) {
69
69
  return (items: Iterable<T>) =>
70
70
  Effect.forEach(
71
- Array.chunk_(items, n),
71
+ Array.chunksOf(items, n),
72
72
  (_, i) =>
73
73
  Effect
74
74
  .forEach(_, (_, j) => forEachItem(_, j, i), { concurrency: "inherit" })
@@ -101,12 +101,12 @@ export function naiveRateLimit(
101
101
  forEachBatch: (a: A[]) => Effect.Effect<A2, E2, R2>
102
102
  ) =>
103
103
  Effect.forEach(
104
- Array.chunk_(items, n),
104
+ Array.chunksOf(items, n),
105
105
  (batch, i) =>
106
106
  ((i === 0)
107
107
  ? Effect.void
108
108
  : Effect.sleep(d))
109
- .pipe(Effect.zipRight(
109
+ .pipe(Effect.andThen(
110
110
  Effect
111
111
  .forEach(batch, forEachItem, { concurrency: n })
112
112
  .pipe(Effect.flatMap(forEachBatch))
package/src/test.ts CHANGED
@@ -1,36 +1,14 @@
1
- import { Arbitrary } from "effect"
2
- import { Predicate, S } from "effect-app"
1
+ import { S } from "effect-app"
3
2
  import { copy } from "effect-app/utils"
4
- import type { PropertySignature } from "effect/Schema"
5
3
  import { generate } from "./arbs.js"
6
4
 
7
- const isPropertySignature = (u: unknown): u is PropertySignature.All =>
8
- Predicate.hasProperty(u, S.PropertySignatureTypeId)
9
-
10
- const defaults = (fields: S.Struct.Fields) => {
11
- const keys = Object.keys(fields)
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- const out: Record<string, any> = {}
14
- for (const key of keys) {
15
- const field = fields[key]
16
- if (isPropertySignature(field)) {
17
- const ast = field.ast
18
- const defaultValue = ast._tag === "PropertySignatureDeclaration" ? ast.defaultValue : ast.to.defaultValue
19
- if (defaultValue !== undefined) {
20
- out[key] = defaultValue()
21
- }
22
- }
23
- }
24
- return out
25
- }
26
-
27
5
  /**
28
6
  * Given the schema for an object-like structure, creates a function that generates random instances of that object with some values provided.
29
7
  */
30
- export const createRandomInstance = <A extends object, I, R>(s: S.Schema<A, I, R> & { fields: S.Struct.Fields }) => {
31
- const gen = generate(Arbitrary.make(s))
8
+ export const createRandomInstance = <A extends object, I, R>(s: S.Codec<A, I, R> & { fields: S.Struct.Fields }) => {
9
+ const gen = generate(S.toArbitrary(s))
32
10
  return (overrides?: Partial<A>) => {
33
- const v = { ...gen.value, ...defaults(s.fields) }
11
+ const v = gen.value
34
12
  return overrides ? copy(v, overrides) : v
35
13
  }
36
14
  }
@@ -38,12 +16,12 @@ export const createRandomInstance = <A extends object, I, R>(s: S.Schema<A, I, R
38
16
  /**
39
17
  * Like `createRandomInstance`, but takes encoded values rather than decoded ones.
40
18
  */
41
- export const createRandomInstanceI = <A extends object, I>(s: S.Schema<A, I, never> & { fields: S.Struct.Fields }) => {
42
- const gen = generate(Arbitrary.make(s))
19
+ export const createRandomInstanceI = <A extends object, I>(s: S.Codec<A, I, never> & { fields: S.Struct.Fields }) => {
20
+ const gen = generate(S.toArbitrary(s))
43
21
  const encode = S.encodeSync(s)
44
22
  const decode = S.decodeSync(s)
45
23
  return (overrides?: Partial<I>) => {
46
- const v = { ...gen.value, ...defaults(s.fields) }
24
+ const v = gen.value
47
25
  if (!overrides) return v
48
26
  return decode({ ...encode(v), ...overrides })
49
27
  }
@@ -1,82 +1,89 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
3
  import { expectTypeOf, it } from "@effect/vitest"
4
- import { Context, Effect, Scope } from "effect-app"
4
+ import { Effect, Layer, Scope, ServiceMap } from "effect-app"
5
5
  import { ContextProvider, mergeContextProviders, MergedContextProvider } from "../src/api/ContextProvider.js"
6
6
  import { CustomError1, Some, SomeElse, SomeService } from "./fixtures.js"
7
7
 
8
8
  // @effect-diagnostics-next-line missingEffectServiceDependency:off
9
- class MyContextProvider extends Effect.Service<MyContextProvider>()("MyContextProvider", {
10
- effect: Effect.gen(function*() {
11
- yield* SomeService
12
- if (Math.random() > 0.5) return yield* new CustomError1()
13
-
14
- return Effect.gen(function*() {
15
- // the only requirements you can have are the one provided by HttpLayerRouter.Provided
16
- yield* Scope.Scope
17
-
18
- yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
19
- yield* Effect.succeed("this is a generator")
20
-
21
- // this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
22
- // yield* SomeElse
23
-
24
- // currently the effectful context provider cannot trigger an error when building the per request context
25
- // this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
26
- // if (Math.random() > 0.5) return yield* new CustomError2()
27
-
28
- return Context.make(Some, new Some({ a: 1 }))
9
+ class MyContextProvider extends ServiceMap.Service<MyContextProvider>()(
10
+ "MyContextProvider",
11
+ {
12
+ make: Effect.gen(function*() {
13
+ yield* SomeService
14
+ if (Math.random() > 0.5) return yield* new CustomError1()
15
+
16
+ return Effect.gen(function*() {
17
+ // the only requirements you can have are the one provided by HttpLayerRouter.Provided
18
+ yield* Scope.Scope
19
+
20
+ yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
21
+ yield* Effect.succeed("this is a generator")
22
+
23
+ return Some.serviceMap({ a: 1 })
24
+ })
29
25
  })
30
- })
31
- }) {}
32
-
33
- class MyContextProvider2 extends Effect.Service<MyContextProvider2>()("MyContextProvider2", {
34
- effect: Effect.gen(function*() {
35
- if (Math.random() > 0.5) return yield* new CustomError1()
36
-
37
- return Effect.gen(function*() {
38
- // we test without dependencies, so that we end up with an R of never.
39
-
40
- return Context.make(SomeElse, new SomeElse({ b: 2 }))
26
+ }
27
+ ) {
28
+ static readonly Default = Layer.effect(this, this.make)
29
+ }
30
+
31
+ class MyContextProvider2 extends ServiceMap.Service<MyContextProvider2>()(
32
+ "MyContextProvider2",
33
+ {
34
+ make: Effect.gen(function*() {
35
+ if (Math.random() > 0.5) return yield* new CustomError1()
36
+
37
+ return Effect.gen(function*() {
38
+ // we test without dependencies, so that we end up with an R of never.
39
+
40
+ return SomeElse.serviceMap({ b: 2 })
41
+ })
41
42
  })
42
- })
43
- }) {}
44
-
45
- class MyContextProvider2Gen extends Effect.Service<MyContextProvider2Gen>()("MyContextProvider2Gen", {
46
- effect: Effect.gen(function*() {
47
- if (Math.random() > 0.5) return yield* new CustomError1()
48
-
49
- return function*() {
50
- // we test without dependencies, so that we end up with an R of never
51
-
52
- return Context.make(SomeElse, new SomeElse({ b: 2 }))
53
- }
54
- })
55
- }) {}
43
+ }
44
+ ) {
45
+ static readonly Default = Layer.effect(this, this.make)
46
+ }
47
+
48
+ class MyContextProvider2Gen extends ServiceMap.Service<MyContextProvider2Gen>()(
49
+ "MyContextProvider2Gen",
50
+ {
51
+ make: Effect.gen(function*() {
52
+ if (Math.random() > 0.5) return yield* new CustomError1()
53
+
54
+ return function*() {
55
+ // we test without dependencies, so that we end up with an R of never
56
+
57
+ return SomeElse.serviceMap({ b: 2 })
58
+ }
59
+ })
60
+ }
61
+ ) {
62
+ static readonly Default = Layer.effect(this, this.make)
63
+ }
56
64
 
57
65
  // @effect-diagnostics-next-line missingEffectServiceDependency:off
58
- class MyContextProviderGen extends Effect.Service<MyContextProviderGen>()("MyContextProviderGen", {
59
- effect: Effect.gen(function*() {
60
- yield* SomeService
61
- if (Math.random() > 0.5) return yield* new CustomError1()
62
-
63
- return function*() {
64
- // the only requirements you can have are the one provided by HttpLayerRouter.Provided
65
- yield* Scope.Scope
66
-
67
- yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
68
- yield* Effect.succeed("this is a generator")
69
-
70
- // this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
71
- // yield* SomeElse
72
-
73
- // currently the effectful context provider cannot trigger an error when building the per request context
74
- // this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
75
- // if (Math.random() > 0.5) return yield* new CustomError2()
76
- return Context.make(Some, new Some({ a: 1 }))
77
- }
78
- })
79
- }) {}
66
+ class MyContextProviderGen extends ServiceMap.Service<MyContextProviderGen>()(
67
+ "MyContextProviderGen",
68
+ {
69
+ make: Effect.gen(function*() {
70
+ yield* SomeService
71
+ if (Math.random() > 0.5) return yield* new CustomError1()
72
+
73
+ return function*() {
74
+ // the only requirements you can have are the one provided by HttpLayerRouter.Provided
75
+ yield* Scope.Scope
76
+
77
+ yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
78
+ yield* Effect.succeed("this is a generator")
79
+
80
+ return Some.serviceMap({ a: 1 })
81
+ }
82
+ })
83
+ }
84
+ ) {
85
+ static readonly Default = Layer.effect(this, this.make)
86
+ }
80
87
 
81
88
  export const someContextProvider = ContextProvider({
82
89
  effect: Effect.gen(function*() {
@@ -93,7 +100,7 @@ export const someContextProvider = ContextProvider({
93
100
  // currently the effectful context provider cannot trigger an error when building the per request context
94
101
  // if (Math.random() > 0.5) return yield* new CustomError2()
95
102
 
96
- return Context.make(Some, new Some({ a: 1 }))
103
+ return Some.serviceMap({ a: 1 })
97
104
  })
98
105
  })
99
106
  })
@@ -112,7 +119,7 @@ export const someContextProviderGen = ContextProvider({
112
119
  // currently the effectful context provider cannot trigger an error when building the per request context
113
120
  // if (Math.random() > 0.5) return yield* new CustomError2()
114
121
 
115
- return Context.make(Some, new Some({ a: 1 }))
122
+ return Some.serviceMap({ a: 1 })
116
123
  }
117
124
  })
118
125
  })
@@ -1,14 +1,14 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
3
  import { type MakeContext, type MakeErrors, makeRouter } from "@effect-app/infra/api/routing"
4
- import { type RpcSerialization } from "@effect/rpc"
5
4
  import { expect, expectTypeOf, it } from "@effect/vitest"
6
- import { Context, Effect, Layer, S, Scope } from "effect-app"
5
+ import { Effect, Layer, S, Scope, ServiceMap } from "effect-app"
7
6
  import { InvalidStateError, makeRpcClient, UnauthorizedError } from "effect-app/client"
8
7
  import { DefaultGenericMiddlewares } from "effect-app/middleware"
9
8
  import * as RpcX from "effect-app/rpc"
10
9
  import { MiddlewareMaker } from "effect-app/rpc"
11
10
  import { TypeTestId } from "effect-app/TypeTest"
11
+ import { type RpcSerialization } from "effect/unstable/rpc"
12
12
  import { DefaultGenericMiddlewaresLive, DevModeMiddlewareLive } from "../src/api/routing/middleware.js"
13
13
  import { sort } from "../src/api/routing/tsort.js"
14
14
  import { AllowAnonymous, AllowAnonymousLive, CustomError1, RequestContextMap, RequireRoles, RequireRolesLive, Some, SomeElse, SomeService, Test, TestLive } from "./fixtures.js"
@@ -37,7 +37,7 @@ class MyContextProvider extends RpcX.RpcMiddleware.Tag<MyContextProvider, {
37
37
  // this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
38
38
  // if (Math.random() > 0.5) return yield* new CustomError2()
39
39
 
40
- return yield* Effect.provideService(effect, Some, new Some({ a: 1 }))
40
+ return yield* Effect.provideService(effect, Some, Some.of({ a: 1 }))
41
41
  })
42
42
  }
43
43
  })
@@ -49,7 +49,7 @@ class MyContextProvider3 extends RpcX.RpcMiddleware.Tag<MyContextProvider3, {
49
49
  requires: SomeElse
50
50
  }>()("MyContextProvider3") {
51
51
  static Default = Layer.make(this, {
52
- dependencies: [Layer.effect(SomeService, SomeService.make)],
52
+ dependencies: [SomeService.Default],
53
53
  *make() {
54
54
  yield* SomeService
55
55
  if (Math.random() > 0.5) return yield* new CustomError1()
@@ -69,7 +69,7 @@ class MyContextProvider3 extends RpcX.RpcMiddleware.Tag<MyContextProvider3, {
69
69
  // this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
70
70
  // if (Math.random() > 0.5) return yield* new CustomError2()
71
71
 
72
- return yield* Effect.provideService(effect, Some, new Some({ a: 1 }))
72
+ return yield* Effect.provideService(effect, Some, Some.of({ a: 1 }))
73
73
  })
74
74
  }
75
75
  })
@@ -91,7 +91,7 @@ class MyContextProvider2
91
91
  return Effect.fnUntraced(function*(effect) {
92
92
  // we test without dependencies, so that we end up with an R of never.
93
93
 
94
- return yield* Effect.provideService(effect, SomeElse, new SomeElse({ b: 2 }))
94
+ return yield* Effect.provideService(effect, SomeElse, SomeElse.of({ b: 2 }))
95
95
  })
96
96
  }
97
97
  })
@@ -99,7 +99,7 @@ class MyContextProvider2
99
99
 
100
100
  //
101
101
 
102
- const Str = Context.GenericTag<"str", "str">("str")
102
+ class Str extends ServiceMap.Service<Str, "str">()("str") {}
103
103
 
104
104
  export class BogusMiddleware extends RpcX.RpcMiddleware.Tag<BogusMiddleware>()("BogusMiddleware") {
105
105
  static Default = Layer.make(this, {
@@ -147,7 +147,7 @@ class middleware extends MiddlewareMaker
147
147
  .middleware(MyContextProvider)
148
148
  .middleware(...genericMiddlewares)
149
149
  {
150
- static Default = this.layer.pipe(Layer.provide(MiddlewaresLive))
150
+ static Default = this.layer.pipe(Layer.provide([...MiddlewaresLive]))
151
151
  // static override [Unify.unifySymbol]?: TagUnify<typeof middleware> // why we need this?
152
152
  }
153
153
 
@@ -238,12 +238,16 @@ const Something = { Eff, Gen, DoSomething, GetSomething, GetSomething2, meta: {
238
238
  // const client = ApiClientFactory.makeFor(Layer.empty)(Something)
239
239
  // client.pipe(Effect.map(c => c.DoSomething.name))
240
240
 
241
- export class SomethingService extends Effect.Service<SomethingService>()("SomethingService", {
242
- dependencies: [],
243
- effect: Effect.gen(function*() {
244
- return {}
245
- })
246
- }) {}
241
+ export class SomethingService extends ServiceMap.Service<SomethingService>()(
242
+ "SomethingService",
243
+ {
244
+ make: Effect.gen(function*() {
245
+ return {}
246
+ })
247
+ }
248
+ ) {
249
+ static Default = Layer.effect(this, this.make)
250
+ }
247
251
 
248
252
  declare const a: {
249
253
  (opt: { a: 1 }): void
@@ -252,28 +256,36 @@ declare const a: {
252
256
  (opt: { b: 3 }): void
253
257
  }
254
258
 
255
- export class SomethingRepo extends Effect.Service<SomethingRepo>()("SomethingRepo", {
256
- dependencies: [SomethingService.Default],
257
- effect: Effect.gen(function*() {
258
- const smth = yield* SomethingService
259
- console.log({ smth })
260
- return {}
261
- })
262
- }) {}
259
+ export class SomethingRepo extends ServiceMap.Service<SomethingRepo>()(
260
+ "SomethingRepo",
261
+ {
262
+ make: Effect.gen(function*() {
263
+ const smth = yield* SomethingService
264
+ console.log({ smth })
265
+ return {}
266
+ })
267
+ }
268
+ ) {
269
+ static Default = Layer.effect(this, this.make).pipe(Layer.provide(SomethingService.Default))
270
+ }
263
271
 
264
- export class SomethingService2 extends Effect.Service<SomethingService2>()("SomethingService2", {
265
- dependencies: [],
266
- effect: Effect.gen(function*() {
267
- return {}
268
- })
269
- }) {}
272
+ export class SomethingService2 extends ServiceMap.Service<SomethingService2>()(
273
+ "SomethingService2",
274
+ {
275
+ make: Effect.gen(function*() {
276
+ return {}
277
+ })
278
+ }
279
+ ) {
280
+ static Default = Layer.effect(this, this.make)
281
+ }
270
282
 
271
283
  export const { Router, matchAll } = makeRouter(
272
284
  middleware
273
285
  )
274
286
 
275
287
  export const r2 = makeRouter(
276
- Object.assign(middleware2, { Default: middleware2.layer.pipe(Layer.provide(MiddlewaresLive)) })
288
+ Object.assign(middleware2, { Default: middleware2.layer.pipe(Layer.provide([...MiddlewaresLive])) })
277
289
  )
278
290
 
279
291
  const router = Router(Something)({
@@ -306,8 +318,8 @@ const router = Router(Something)({
306
318
  const some = yield* Some
307
319
  return yield* Effect.logInfo("Some", some)
308
320
  },
309
- *GetSomething(req) {
310
- console.log(req.id)
321
+ *GetSomething(req: GetSomething) {
322
+ console.log(req["id"])
311
323
 
312
324
  const _b = yield* Effect.succeed(false)
313
325
  if (_b) {
@@ -319,7 +331,7 @@ const router = Router(Something)({
319
331
  return yield* Effect.succeed("12")
320
332
  }
321
333
  if (!_b) {
322
- return yield* new UnauthorizedError()
334
+ return yield* Effect.fail(new UnauthorizedError())
323
335
  } else {
324
336
  // expected an error here because a boolean is not a string
325
337
  // return _b
@@ -347,8 +359,8 @@ it("sorts based on requirements", () => {
347
359
 
348
360
  // eslint-disable-next-line unused-imports/no-unused-vars
349
361
  const matched = matchAll({ router })
350
- expectTypeOf({} as Layer.Layer.Context<typeof matched>).toEqualTypeOf<
351
- RpcSerialization.RpcSerialization | SomeService | "str"
362
+ expectTypeOf({} as Layer.Services<typeof matched>).toEqualTypeOf<
363
+ RpcSerialization.RpcSerialization | SomeService | Str
352
364
  >()
353
365
 
354
366
  type makeContext = MakeContext<typeof router[TypeTestId]>
@@ -371,8 +383,8 @@ const router2 = r2.Router(Something)({
371
383
  const some = yield* Some
372
384
  return yield* Effect.logInfo("Some", some)
373
385
  },
374
- *GetSomething(req) {
375
- console.log(req.id)
386
+ *GetSomething(req: GetSomething) {
387
+ console.log(req["id"])
376
388
 
377
389
  const _b = yield* Effect.succeed(false)
378
390
  if (_b) {
@@ -384,7 +396,7 @@ const router2 = r2.Router(Something)({
384
396
  return yield* Effect.succeed("12")
385
397
  }
386
398
  if (!_b) {
387
- return yield* new UnauthorizedError()
399
+ return yield* Effect.fail(new UnauthorizedError())
388
400
  } else {
389
401
  // expected an error here because a boolean is not a string
390
402
  // return _b
@@ -405,8 +417,8 @@ const router2 = r2.Router(Something)({
405
417
 
406
418
  // eslint-disable-next-line unused-imports/no-unused-vars
407
419
  const matched2 = matchAll({ router: router2 })
408
- expectTypeOf({} as Layer.Layer.Context<typeof matched2>).toEqualTypeOf<
409
- RpcSerialization.RpcSerialization | SomeService | "str"
420
+ expectTypeOf({} as Layer.Services<typeof matched2>).toEqualTypeOf<
421
+ RpcSerialization.RpcSerialization | SomeService | Str
410
422
  >()
411
423
 
412
424
  type makeContext2 = MakeContext<typeof router2[TypeTestId]>
@@ -1 +1 @@
1
- {"version":3,"file":"contextProvider.test.d.ts","sourceRoot":"","sources":["../contextProvider.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,EAAE,YAAY,EAAE,IAAI,EAAY,WAAW,EAAE,MAAM,eAAe,CAAA;AA2EzE,eAAO,MAAM,mBAAmB;;CAkB9B,CAAA;AACF,eAAO,MAAM,sBAAsB;;CAkBjC,CAAA"}
1
+ {"version":3,"file":"contextProvider.test.d.ts","sourceRoot":"","sources":["../contextProvider.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE7D,OAAO,EAAE,YAAY,EAAE,IAAI,EAAY,WAAW,EAAE,MAAM,eAAe,CAAA;AAkFzE,eAAO,MAAM,mBAAmB;;CAkB9B,CAAA;AACF,eAAO,MAAM,sBAAsB;;CAkBjC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../controller.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAc,MAAM,+BAA+B,CAAA;AAC7F,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,OAAO,EAAW,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAoC,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAEvF,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAA;AAKtC,OAAO,EAAE,cAAc,EAAsB,YAAY,EAAqB,YAAY,EAAoB,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAY,MAAM,eAAe,CAAA;;cAuE/G,QAAQ;;AADzE,cAAM,kBACJ,SAAQ,uBAA0F;IAElG,MAAM,CAAC,OAAO,uDAUZ;CACH;;;;;AAMD,qBAAa,eAAgB,SAAQ,oBAA4D;IAC/F,MAAM,CAAC,OAAO,6CAUZ;CACH;AAkFD,eAAO,MAAM,WAAW;;;;;;;;;;YAKM,CAAA;AAE9B,eAAO,MAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAqC,CAAA;;;;;;;;;;;;;;AAEtE,qBAAa,GAAI,SAAQ,QAA0C;CAAG;;;;;;;;;;;;;;AACtE,qBAAa,GAAI,SAAQ,QAA0C;CAAG;;;;;;;;;;;;;;;;AAEtE,qBAAa,WAAY,SAAQ,gBAEV;CAAG;;;;;;;;;;;;;;;;AAgB1B,qBAAa,YAAa,SAAQ,iBAET;CAAG;;;;;;;;;;;;;;;;AAE5B,qBAAa,aAAc,SAAQ,kBAEA;CAAG;;;;;AAOtC,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG;;;;;AASL,qBAAa,aAAc,SAAQ,kBAOjC;CAAG;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG;AAEL,eAAO,MAAQ,MAAM;;;;;SAvJnB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuJoB,QAAQ;;qGAE9B,CAAA;AAED,eAAO,MAAM,EAAE;;;;;;;;;aA3Jb,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6JF,CAAA"}
1
+ {"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../controller.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAc,MAAM,+BAA+B,CAAA;AAE7F,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,EAAoC,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAEvF,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAA;AAGtC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAG3D,OAAO,EAAE,cAAc,EAAsB,YAAY,EAAqB,YAAY,EAAoB,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAY,MAAM,eAAe,CAAA;;cAuE/G,QAAQ;;AADzE,cAAM,kBACJ,SAAQ,uBAA0F;IAElG,MAAM,CAAC,OAAO,uDAUZ;CACH;;AAID,cAAM,GAAI,SAAQ,QAAuC;CAAG;;;;;AAE5D,qBAAa,eAAgB,SAAQ,oBAA4D;IAC/F,MAAM,CAAC,OAAO,2CAUZ;CACH;AAkFD,eAAO,MAAM,WAAW;;;;;;;;;;YAKM,CAAA;AAE9B,eAAO,MAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAqC,CAAA;;;;;;;;;;;;;;AAEtE,qBAAa,GAAI,SAAQ,QAA0C;CAAG;;;;;;;;;;;;;;AACtE,qBAAa,GAAI,SAAQ,QAA0C;CAAG;;;;;;;;;;;;;;;;;;AAEtE,qBAAa,WAAY,SAAQ,gBAEV;CAAG;;;;;;;;;;;;;;;;;;AAgB1B,qBAAa,YAAa,SAAQ,iBAET;CAAG;;;;;;;;;;;;;;;;;;AAE5B,qBAAa,aAAc,SAAQ,kBAEA;CAAG;;;;AAOtC,qBAAa,gBAAiB,SAAQ,qBAOrC;IACC,MAAM,CAAC,OAAO,8CAAgC;CAC/C;;;;AASD,qBAAa,aAAc,SAAQ,kBASlC;IACC,MAAM,CAAC,OAAO,2CAA8E;CAC7F;;;;AAED,qBAAa,iBAAkB,SAAQ,sBAOtC;IACC,MAAM,CAAC,OAAO,+CAAgC;CAC/C;AAED,eAAO,MAAQ,MAAM;;;;;SA3KX,CADF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4Ke,QAAQ;;0FAE9B,CAAA;AAED,eAAO,MAAM,EAAE;;;;;;;;;aA/KL,CADF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkLP,CAAA"}