effect-app 4.0.0-beta.25 → 4.0.0-beta.250

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 (361) hide show
  1. package/CHANGELOG.md +1131 -0
  2. package/dist/Array.d.ts +3 -2
  3. package/dist/Array.d.ts.map +1 -1
  4. package/dist/Array.js +4 -4
  5. package/dist/Chunk.d.ts +1 -1
  6. package/dist/Chunk.d.ts.map +1 -1
  7. package/dist/Config/SecretURL.d.ts +4 -2
  8. package/dist/Config/SecretURL.d.ts.map +1 -1
  9. package/dist/Config/SecretURL.js +3 -6
  10. package/dist/Config/internal/configSecretURL.d.ts +1 -1
  11. package/dist/Config/internal/configSecretURL.d.ts.map +1 -1
  12. package/dist/Config/internal/configSecretURL.js +2 -2
  13. package/dist/Config.d.ts +7 -0
  14. package/dist/Config.d.ts.map +1 -0
  15. package/dist/Config.js +6 -0
  16. package/dist/ConfigProvider.d.ts +39 -0
  17. package/dist/ConfigProvider.d.ts.map +1 -0
  18. package/dist/ConfigProvider.js +42 -0
  19. package/dist/Context.d.ts +42 -0
  20. package/dist/Context.d.ts.map +1 -0
  21. package/dist/Context.js +67 -0
  22. package/dist/Effect.d.ts +13 -12
  23. package/dist/Effect.d.ts.map +1 -1
  24. package/dist/Effect.js +5 -8
  25. package/dist/Emailer.d.ts +51 -0
  26. package/dist/Emailer.d.ts.map +1 -0
  27. package/dist/Emailer.js +7 -0
  28. package/dist/Function.d.ts +1 -1
  29. package/dist/Function.d.ts.map +1 -1
  30. package/dist/Inputify.type.d.ts +1 -1
  31. package/dist/Layer.d.ts +11 -7
  32. package/dist/Layer.d.ts.map +1 -1
  33. package/dist/Layer.js +3 -2
  34. package/dist/Model/Repository/Registry.d.ts +21 -0
  35. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  36. package/dist/Model/Repository/Registry.js +18 -0
  37. package/dist/Model/Repository/ext.d.ts +60 -0
  38. package/dist/Model/Repository/ext.d.ts.map +1 -0
  39. package/dist/Model/Repository/ext.js +122 -0
  40. package/dist/Model/Repository/internal/internal.d.ts +62 -0
  41. package/dist/Model/Repository/internal/internal.d.ts.map +1 -0
  42. package/dist/Model/Repository/internal/internal.js +398 -0
  43. package/dist/Model/Repository/legacy.d.ts +21 -0
  44. package/dist/Model/Repository/legacy.d.ts.map +1 -0
  45. package/dist/Model/Repository/legacy.js +2 -0
  46. package/dist/Model/Repository/makeRepo.d.ts +53 -0
  47. package/dist/Model/Repository/makeRepo.d.ts.map +1 -0
  48. package/dist/Model/Repository/makeRepo.js +27 -0
  49. package/dist/Model/Repository/service.d.ts +97 -0
  50. package/dist/Model/Repository/service.d.ts.map +1 -0
  51. package/dist/Model/Repository/service.js +2 -0
  52. package/dist/Model/Repository/validation.d.ts +71 -0
  53. package/dist/Model/Repository/validation.d.ts.map +1 -0
  54. package/dist/Model/Repository/validation.js +32 -0
  55. package/dist/Model/Repository.d.ts +7 -0
  56. package/dist/Model/Repository.d.ts.map +1 -0
  57. package/dist/Model/Repository.js +7 -0
  58. package/dist/Model/dsl.d.ts +33 -0
  59. package/dist/Model/dsl.d.ts.map +1 -0
  60. package/dist/Model/dsl.js +43 -0
  61. package/dist/Model/filter/filterApi.d.ts +30 -0
  62. package/dist/Model/filter/filterApi.d.ts.map +1 -0
  63. package/dist/Model/filter/filterApi.js +2 -0
  64. package/dist/Model/filter/types/errors.d.ts +29 -0
  65. package/dist/Model/filter/types/errors.d.ts.map +1 -0
  66. package/dist/Model/filter/types/errors.js +2 -0
  67. package/dist/Model/filter/types/fields.d.ts +15 -0
  68. package/dist/Model/filter/types/fields.d.ts.map +1 -0
  69. package/dist/Model/filter/types/fields.js +2 -0
  70. package/dist/Model/filter/types/path/common.d.ts +316 -0
  71. package/dist/Model/filter/types/path/common.d.ts.map +1 -0
  72. package/dist/Model/filter/types/path/common.js +2 -0
  73. package/dist/Model/filter/types/path/eager.d.ts +95 -0
  74. package/dist/Model/filter/types/path/eager.d.ts.map +1 -0
  75. package/dist/Model/filter/types/path/eager.js +31 -0
  76. package/dist/Model/filter/types/path/index.d.ts +4 -0
  77. package/dist/Model/filter/types/path/index.d.ts.map +1 -0
  78. package/dist/Model/filter/types/path/index.js +3 -0
  79. package/dist/Model/filter/types/utils.d.ts +79 -0
  80. package/dist/Model/filter/types/utils.d.ts.map +1 -0
  81. package/dist/Model/filter/types/utils.js +2 -0
  82. package/dist/Model/filter/types/validator.d.ts +30 -0
  83. package/dist/Model/filter/types/validator.d.ts.map +1 -0
  84. package/dist/Model/filter/types/validator.js +2 -0
  85. package/dist/Model/filter/types.d.ts +5 -0
  86. package/dist/Model/filter/types.d.ts.map +1 -0
  87. package/dist/Model/filter/types.js +7 -0
  88. package/dist/Model/query/dsl.d.ts +446 -0
  89. package/dist/Model/query/dsl.d.ts.map +1 -0
  90. package/dist/Model/query/dsl.js +342 -0
  91. package/dist/Model/query/new-kid-interpreter.d.ts +136 -0
  92. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -0
  93. package/dist/Model/query/new-kid-interpreter.js +336 -0
  94. package/dist/Model/query.d.ts +15 -0
  95. package/dist/Model/query.d.ts.map +1 -0
  96. package/dist/Model/query.js +3 -0
  97. package/dist/Model.d.ts +5 -0
  98. package/dist/Model.d.ts.map +1 -0
  99. package/dist/Model.js +5 -0
  100. package/dist/NonEmptySet.d.ts +4 -2
  101. package/dist/NonEmptySet.d.ts.map +1 -1
  102. package/dist/NonEmptySet.js +2 -2
  103. package/dist/Option.d.ts +2 -1
  104. package/dist/Option.d.ts.map +1 -1
  105. package/dist/Option.js +3 -1
  106. package/dist/Pure.d.ts +8 -6
  107. package/dist/Pure.d.ts.map +1 -1
  108. package/dist/Pure.js +17 -14
  109. package/dist/QueueMaker.d.ts +13 -0
  110. package/dist/QueueMaker.d.ts.map +1 -0
  111. package/dist/QueueMaker.js +4 -0
  112. package/dist/RequestContext.d.ts +103 -0
  113. package/dist/RequestContext.d.ts.map +1 -0
  114. package/dist/RequestContext.js +49 -0
  115. package/dist/Schema/Class.d.ts +66 -20
  116. package/dist/Schema/Class.d.ts.map +1 -1
  117. package/dist/Schema/Class.js +192 -23
  118. package/dist/Schema/FastCheck.d.ts +1 -1
  119. package/dist/Schema/FastCheck.d.ts.map +1 -1
  120. package/dist/Schema/Methods.d.ts +1 -1
  121. package/dist/Schema/SchemaParser.d.ts +5 -0
  122. package/dist/Schema/SchemaParser.d.ts.map +1 -0
  123. package/dist/Schema/SchemaParser.js +6 -0
  124. package/dist/Schema/SpecialJsonSchema.d.ts +34 -0
  125. package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -0
  126. package/dist/Schema/SpecialJsonSchema.js +118 -0
  127. package/dist/Schema/SpecialOpenApi.d.ts +32 -0
  128. package/dist/Schema/SpecialOpenApi.d.ts.map +1 -0
  129. package/dist/Schema/SpecialOpenApi.js +123 -0
  130. package/dist/Schema/brand.d.ts +5 -3
  131. package/dist/Schema/brand.d.ts.map +1 -1
  132. package/dist/Schema/brand.js +3 -1
  133. package/dist/Schema/email.d.ts +1 -1
  134. package/dist/Schema/email.d.ts.map +1 -1
  135. package/dist/Schema/email.js +7 -4
  136. package/dist/Schema/ext.d.ts +339 -56
  137. package/dist/Schema/ext.d.ts.map +1 -1
  138. package/dist/Schema/ext.js +358 -53
  139. package/dist/Schema/moreStrings.d.ts +108 -26
  140. package/dist/Schema/moreStrings.d.ts.map +1 -1
  141. package/dist/Schema/moreStrings.js +45 -16
  142. package/dist/Schema/numbers.d.ts +55 -15
  143. package/dist/Schema/numbers.d.ts.map +1 -1
  144. package/dist/Schema/numbers.js +60 -12
  145. package/dist/Schema/phoneNumber.d.ts +1 -1
  146. package/dist/Schema/phoneNumber.d.ts.map +1 -1
  147. package/dist/Schema/phoneNumber.js +6 -3
  148. package/dist/Schema/schema.d.ts +1 -1
  149. package/dist/Schema/strings.d.ts +5 -5
  150. package/dist/Schema/strings.d.ts.map +1 -1
  151. package/dist/Schema/strings.js +1 -5
  152. package/dist/Schema.d.ts +214 -8
  153. package/dist/Schema.d.ts.map +1 -1
  154. package/dist/Schema.js +190 -11
  155. package/dist/Set.d.ts +5 -2
  156. package/dist/Set.d.ts.map +1 -1
  157. package/dist/Set.js +3 -2
  158. package/dist/Store.d.ts +166 -0
  159. package/dist/Store.d.ts.map +1 -0
  160. package/dist/Store.js +117 -0
  161. package/dist/TypeTest.d.ts +1 -1
  162. package/dist/Types.d.ts +1 -1
  163. package/dist/Widen.type.d.ts +1 -1
  164. package/dist/_ext/Array.d.ts +2 -2
  165. package/dist/_ext/Array.d.ts.map +1 -1
  166. package/dist/_ext/Array.js +4 -2
  167. package/dist/_ext/date.d.ts +1 -1
  168. package/dist/_ext/misc.d.ts +5 -2
  169. package/dist/_ext/misc.d.ts.map +1 -1
  170. package/dist/_ext/misc.js +4 -2
  171. package/dist/_ext/ord.ext.d.ts +3 -2
  172. package/dist/_ext/ord.ext.d.ts.map +1 -1
  173. package/dist/_ext/ord.ext.js +2 -2
  174. package/dist/builtin.d.ts +1 -1
  175. package/dist/builtin.d.ts.map +1 -1
  176. package/dist/client/InvalidationKeys.d.ts +29 -0
  177. package/dist/client/InvalidationKeys.d.ts.map +1 -0
  178. package/dist/client/InvalidationKeys.js +33 -0
  179. package/dist/client/apiClientFactory.d.ts +20 -32
  180. package/dist/client/apiClientFactory.d.ts.map +1 -1
  181. package/dist/client/apiClientFactory.js +104 -34
  182. package/dist/client/clientFor.d.ts +53 -19
  183. package/dist/client/clientFor.d.ts.map +1 -1
  184. package/dist/client/clientFor.js +9 -1
  185. package/dist/client/errors.d.ts +49 -25
  186. package/dist/client/errors.d.ts.map +1 -1
  187. package/dist/client/errors.js +43 -17
  188. package/dist/client/makeClient.d.ts +495 -33
  189. package/dist/client/makeClient.d.ts.map +1 -1
  190. package/dist/client/makeClient.js +66 -24
  191. package/dist/client.d.ts +6 -5
  192. package/dist/client.d.ts.map +1 -1
  193. package/dist/client.js +2 -1
  194. package/dist/faker.d.ts +1 -1
  195. package/dist/faker.d.ts.map +1 -1
  196. package/dist/http/Request.d.ts +2 -2
  197. package/dist/http/Request.d.ts.map +1 -1
  198. package/dist/http/Request.js +2 -2
  199. package/dist/http/internal/lib.d.ts +1 -1
  200. package/dist/http.d.ts +1 -1
  201. package/dist/ids.d.ts +40 -12
  202. package/dist/ids.d.ts.map +1 -1
  203. package/dist/ids.js +25 -3
  204. package/dist/index.d.ts +7 -8
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +8 -8
  207. package/dist/logger.d.ts +1 -1
  208. package/dist/middleware.d.ts +14 -8
  209. package/dist/middleware.d.ts.map +1 -1
  210. package/dist/middleware.js +14 -8
  211. package/dist/rpc/Invalidation.d.ts +420 -0
  212. package/dist/rpc/Invalidation.d.ts.map +1 -0
  213. package/dist/rpc/Invalidation.js +168 -0
  214. package/dist/rpc/MiddlewareMaker.d.ts +12 -8
  215. package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
  216. package/dist/rpc/MiddlewareMaker.js +59 -38
  217. package/dist/rpc/RpcContextMap.d.ts +4 -4
  218. package/dist/rpc/RpcContextMap.d.ts.map +1 -1
  219. package/dist/rpc/RpcContextMap.js +4 -4
  220. package/dist/rpc/RpcMiddleware.d.ts +15 -11
  221. package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
  222. package/dist/rpc/RpcMiddleware.js +1 -1
  223. package/dist/rpc.d.ts +2 -2
  224. package/dist/rpc.d.ts.map +1 -1
  225. package/dist/rpc.js +2 -2
  226. package/dist/runtime.d.ts +19 -0
  227. package/dist/runtime.d.ts.map +1 -0
  228. package/dist/runtime.js +40 -0
  229. package/dist/toast.d.ts +51 -0
  230. package/dist/toast.d.ts.map +1 -0
  231. package/dist/toast.js +34 -0
  232. package/dist/transform.d.ts +2 -2
  233. package/dist/transform.d.ts.map +1 -1
  234. package/dist/transform.js +4 -5
  235. package/dist/utils/effectify.d.ts +2 -2
  236. package/dist/utils/effectify.d.ts.map +1 -1
  237. package/dist/utils/effectify.js +2 -2
  238. package/dist/utils/extend.d.ts +1 -1
  239. package/dist/utils/extend.d.ts.map +1 -1
  240. package/dist/utils/gen.d.ts +5 -5
  241. package/dist/utils/gen.d.ts.map +1 -1
  242. package/dist/utils/logLevel.d.ts +3 -3
  243. package/dist/utils/logLevel.d.ts.map +1 -1
  244. package/dist/utils/logger.d.ts +5 -4
  245. package/dist/utils/logger.d.ts.map +1 -1
  246. package/dist/utils/logger.js +4 -4
  247. package/dist/utils.d.ts +40 -45
  248. package/dist/utils.d.ts.map +1 -1
  249. package/dist/utils.js +19 -27
  250. package/dist/validation/validators.d.ts +1 -1
  251. package/dist/validation/validators.d.ts.map +1 -1
  252. package/dist/validation.d.ts +1 -1
  253. package/dist/validation.d.ts.map +1 -1
  254. package/dist/withToast.d.ts +30 -0
  255. package/dist/withToast.d.ts.map +1 -0
  256. package/dist/withToast.js +64 -0
  257. package/package.json +158 -24
  258. package/src/Array.ts +3 -3
  259. package/src/Config/SecretURL.ts +5 -2
  260. package/src/Config/internal/configSecretURL.ts +1 -1
  261. package/src/Config.ts +14 -0
  262. package/src/ConfigProvider.ts +48 -0
  263. package/src/{ServiceMap.ts → Context.ts} +56 -63
  264. package/src/Effect.ts +12 -14
  265. package/src/Emailer.ts +51 -0
  266. package/src/Layer.ts +10 -6
  267. package/src/Model/Repository/Registry.ts +34 -0
  268. package/src/Model/Repository/ext.ts +375 -0
  269. package/src/Model/Repository/internal/internal.ts +692 -0
  270. package/src/Model/Repository/legacy.ts +29 -0
  271. package/src/Model/Repository/makeRepo.ts +144 -0
  272. package/src/Model/Repository/service.ts +639 -0
  273. package/src/Model/Repository/validation.ts +31 -0
  274. package/src/Model/Repository.ts +6 -0
  275. package/src/Model/dsl.ts +129 -0
  276. package/src/Model/filter/filterApi.ts +60 -0
  277. package/src/Model/filter/types/errors.ts +47 -0
  278. package/src/Model/filter/types/fields.ts +50 -0
  279. package/src/Model/filter/types/path/common.ts +404 -0
  280. package/src/Model/filter/types/path/eager.ts +297 -0
  281. package/src/Model/filter/types/path/index.ts +4 -0
  282. package/src/Model/filter/types/utils.ts +128 -0
  283. package/src/Model/filter/types/validator.ts +46 -0
  284. package/src/Model/filter/types.ts +6 -0
  285. package/src/Model/query/dsl.ts +2546 -0
  286. package/src/Model/query/new-kid-interpreter.ts +484 -0
  287. package/src/Model/query.ts +13 -0
  288. package/src/Model.ts +4 -0
  289. package/src/NonEmptySet.ts +3 -1
  290. package/src/Option.ts +2 -0
  291. package/src/Pure.ts +21 -19
  292. package/src/QueueMaker.ts +19 -0
  293. package/src/RequestContext.ts +62 -0
  294. package/src/Schema/Class.ts +274 -64
  295. package/src/Schema/SchemaParser.ts +12 -0
  296. package/src/Schema/SpecialJsonSchema.ts +139 -0
  297. package/src/Schema/SpecialOpenApi.ts +130 -0
  298. package/src/Schema/brand.ts +22 -2
  299. package/src/Schema/email.ts +7 -2
  300. package/src/Schema/ext.ts +443 -88
  301. package/src/Schema/moreStrings.ts +93 -37
  302. package/src/Schema/numbers.ts +64 -16
  303. package/src/Schema/phoneNumber.ts +5 -1
  304. package/src/Schema/strings.ts +4 -8
  305. package/src/Schema.ts +374 -10
  306. package/src/Set.ts +5 -1
  307. package/src/Store.ts +273 -0
  308. package/src/_ext/Array.ts +3 -1
  309. package/src/_ext/misc.ts +4 -1
  310. package/src/_ext/ord.ext.ts +2 -1
  311. package/src/client/InvalidationKeys.ts +50 -0
  312. package/src/client/apiClientFactory.ts +230 -131
  313. package/src/client/clientFor.ts +102 -31
  314. package/src/client/errors.ts +52 -26
  315. package/src/client/makeClient.ts +592 -71
  316. package/src/client.ts +5 -4
  317. package/src/http/Request.ts +1 -1
  318. package/src/ids.ts +25 -3
  319. package/src/index.ts +7 -10
  320. package/src/middleware.ts +13 -9
  321. package/src/rpc/Invalidation.ts +261 -0
  322. package/src/rpc/MiddlewareMaker.ts +83 -75
  323. package/src/rpc/README.md +2 -2
  324. package/src/rpc/RpcContextMap.ts +6 -5
  325. package/src/rpc/RpcMiddleware.ts +18 -12
  326. package/src/rpc.ts +1 -1
  327. package/src/runtime.ts +56 -0
  328. package/src/toast.ts +54 -0
  329. package/src/transform.ts +3 -3
  330. package/src/utils/effectify.ts +1 -1
  331. package/src/utils/gen.ts +8 -8
  332. package/src/utils/logLevel.ts +1 -1
  333. package/src/utils/logger.ts +4 -3
  334. package/src/utils.ts +62 -139
  335. package/src/withToast.ts +133 -0
  336. package/test/dist/rpc-dynamic-middleware.test.d.ts.map +1 -0
  337. package/test/dist/rpc.test.d.ts.map +1 -1
  338. package/test/dist/secretURL.test.d.ts.map +1 -0
  339. package/test/dist/special.test.d.ts.map +1 -0
  340. package/test/dist/stream-error.types.d.ts +2 -0
  341. package/test/dist/stream-error.types.d.ts.map +1 -0
  342. package/test/dist/stream-error.types.js +27 -0
  343. package/test/moreStrings.test.ts +1 -1
  344. package/test/rpc.test.ts +46 -6
  345. package/test/schema.test.ts +459 -30
  346. package/test/secretURL.test.ts +160 -0
  347. package/test/special.test.ts +1026 -0
  348. package/test/utils.test.ts +7 -7
  349. package/tsconfig.base.json +6 -5
  350. package/tsconfig.json +2 -1
  351. package/tsconfig.json.bak +2 -2
  352. package/tsconfig.src.json +29 -29
  353. package/tsconfig.test.json +2 -2
  354. package/dist/Operations.d.ts +0 -123
  355. package/dist/Operations.d.ts.map +0 -1
  356. package/dist/Operations.js +0 -29
  357. package/dist/ServiceMap.d.ts +0 -44
  358. package/dist/ServiceMap.d.ts.map +0 -1
  359. package/dist/ServiceMap.js +0 -91
  360. package/eslint.config.mjs +0 -26
  361. package/src/Operations.ts +0 -55
@@ -1,14 +1,15 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { Effect, Layer, type Schema, Schema as S, type Scope, ServiceMap } from "effect"
3
2
  import { type NonEmptyArray, type NonEmptyReadonlyArray } from "effect/Array"
3
+ import * as Effect from "effect/Effect"
4
+ import * as Layer from "effect/Layer"
5
+ import * as S from "effect/Schema"
6
+ import type * as Scope from "effect/Scope"
4
7
  import { type Simplify } from "effect/Types"
5
8
  import { Rpc, type RpcGroup, type RpcSchema } from "effect/unstable/rpc"
6
9
  import { type HandlersFrom } from "effect/unstable/rpc/RpcGroup"
7
- import { type RequestId } from "effect/unstable/rpc/RpcMessage"
8
- import { type HttpHeaders } from "../http.js"
10
+ import * as Context from "../Context.js"
9
11
  import { PreludeLogger } from "../logger.js"
10
12
  import { type TypeTestId } from "../TypeTest.js"
11
- import { typedValuesOf } from "../utils.js"
12
13
  import { type GetContextConfig, type RequestContextMapTagAny, type RpcContextMap } from "./RpcContextMap.js"
13
14
  import { type AddMiddleware, type AnyDynamic, type RpcDynamic, type RpcMiddlewareV4, type TagClassAny } from "./RpcMiddleware.js"
14
15
  import * as RpcMiddlewareX from "./RpcMiddleware.js"
@@ -61,13 +62,13 @@ export interface MiddlewareMaker<
61
62
  }
62
63
  >
63
64
  {
64
- readonly layer: Layer.Layer<Self, never, ServiceMap.Service.Identifier<MiddlewareProviders[number]>>
65
+ readonly layer: Layer.Layer<Self, never, Context.Service.Identifier<MiddlewareProviders[number]>>
65
66
  readonly requestContext: RequestContextTag<RequestContextMap>
66
67
  readonly requestContextMap: RequestContextMap
67
68
  }
68
69
 
69
70
  export interface RequestContextTag<RequestContextMap extends Record<string, RpcContextMap.Any>>
70
- extends ServiceMap.Service<"RequestContextConfig", GetContextConfig<RequestContextMap>>
71
+ extends Context.Service<"RequestContextConfig", GetContextConfig<RequestContextMap>>
71
72
  {}
72
73
 
73
74
  export namespace MiddlewareMaker {
@@ -93,7 +94,7 @@ export namespace MiddlewareMaker {
93
94
  : never
94
95
  : never
95
96
 
96
- export type Errors<T> = T extends TagClassAny ? T extends { error: S.Top } ? S.Schema.Type<T["error"]>
97
+ export type Errors<T> = T extends TagClassAny ? T extends { error: S.Top } ? T["error"]["Type"]
97
98
  : never
98
99
  : never
99
100
 
@@ -169,9 +170,9 @@ export interface BuildingMiddleware<
169
170
  > {
170
171
  rpc: <
171
172
  const Tag extends string,
172
- Payload extends Schema.Top | Schema.Struct.Fields = typeof Schema.Void,
173
- Success extends Schema.Top = typeof Schema.Void,
174
- Error extends Schema.Top = typeof Schema.Never,
173
+ Payload extends S.Top | S.Struct.Fields = typeof S.Void,
174
+ Success extends S.Top = typeof S.Void,
175
+ Error extends S.Top = typeof S.Never,
175
176
  const Stream extends boolean = false,
176
177
  Config extends GetContextConfig<RequestContextMap> = {}
177
178
  >(tag: Tag, options?: {
@@ -180,16 +181,16 @@ export interface BuildingMiddleware<
180
181
  readonly error?: Error
181
182
  readonly stream?: Stream
182
183
  readonly config?: Config
183
- readonly primaryKey?: [Payload] extends [Schema.Struct.Fields] ? ((
184
- payload: Payload extends Schema.Struct.Fields ? Simplify<Schema.Struct<Payload>["Type"]> : Payload["Type"]
184
+ readonly primaryKey?: [Payload] extends [S.Struct.Fields] ? ((
185
+ payload: Payload extends S.Struct.Fields ? Simplify<S.Struct<Payload>["Type"]> : Payload["Type"]
185
186
  ) => string)
186
187
  : never
187
188
  }) =>
188
189
  & Rpc.Rpc<
189
190
  Tag,
190
- Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload,
191
+ Payload extends S.Struct.Fields ? S.Struct<Payload> : Payload,
191
192
  Stream extends true ? RpcSchema.Stream<Success, Error> : Success,
192
- Stream extends true ? typeof Schema.Never : Error
193
+ Stream extends true ? typeof S.Never : Error
193
194
  >
194
195
  & { readonly config: Config }
195
196
 
@@ -258,10 +259,10 @@ export type MiddlewaresBuilder<
258
259
  : { new(_: never): {} }
259
260
  : { new(_: never): {} })
260
261
 
261
- const middlewareMaker = <
262
+ const middlewareMaker = Effect.fnUntraced(function*<
262
263
  MiddlewareProviders extends ReadonlyArray<MiddlewareMaker.Any>
263
- >(middlewares: MiddlewareProviders): Effect.Effect<
264
- RpcMiddlewareV4<
264
+ >(middlewares: MiddlewareProviders) {
265
+ type Middleware = RpcMiddlewareV4<
265
266
  MiddlewareMaker.ManyProvided<MiddlewareProviders>,
266
267
  MiddlewareMaker.ManyErrors<MiddlewareProviders>,
267
268
  Exclude<
@@ -270,42 +271,32 @@ const middlewareMaker = <
270
271
  > extends never ? never
271
272
  : Exclude<MiddlewareMaker.ManyRequired<MiddlewareProviders>, MiddlewareMaker.ManyProvided<MiddlewareProviders>>
272
273
  >
273
- > => {
274
+ type Next = Parameters<Middleware>[0]
275
+ type Options = Parameters<Middleware>[1]
276
+
274
277
  // we want to run them in reverse order because latter middlewares will provide context to former ones
275
- middlewares = middlewares.toReversed() as any
276
-
277
- return Effect.gen(function*() {
278
- const context = yield* Effect.services()
279
-
280
- // returns a Effect/RpcMiddlewareV4 with Scope.Scope in requirements
281
- // v4: wrap middleware takes (effect, options) as two params instead of a single options bag
282
- return (
283
- next: Effect.Effect<any, any, any>,
284
- options: {
285
- readonly clientId: number
286
- readonly requestId: RequestId
287
- readonly rpc: Rpc.AnyWithProps
288
- readonly payload: unknown
289
- readonly headers: HttpHeaders.Headers
290
- }
291
- ) => {
292
- // we start with the actual handler
293
- let handler = next
294
-
295
- // inspired from Effect/RpcMiddleware
296
- for (const tag of middlewares) {
297
- // use the tag to get the middleware from context
298
- const middleware = ServiceMap.getUnsafe(context, tag)
299
-
300
- // wrap the current handler, allowing the middleware to run before and after it
301
- handler = PreludeLogger.logDebug("Applying middleware wrap " + tag.key).pipe(
302
- Effect.andThen(middleware(handler, options))
303
- ) as any
304
- }
305
- return handler
278
+ const reversed = middlewares.toReversed()
279
+ const context = yield* Effect.context()
280
+
281
+ // returns a Effect/RpcMiddlewareV4 with Scope.Scope in requirements
282
+ // v4: wrap middleware takes (effect, options) as two params instead of a single options bag
283
+ return (next: Next, options: Options) => {
284
+ // we start with the actual handler
285
+ let handler = next
286
+
287
+ // inspired from Effect/RpcMiddleware
288
+ for (const tag of reversed) {
289
+ // use the tag to get the middleware from context
290
+ const middleware = Context.getUnsafe(context, tag)
291
+
292
+ // wrap the current handler, allowing the middleware to run before and after it
293
+ handler = PreludeLogger.logDebug("Applying middleware wrap " + tag.key).pipe(
294
+ Effect.andThen(middleware(handler, options))
295
+ ) as any
306
296
  }
307
- }) as any
308
- }
297
+ return handler
298
+ }
299
+ })
309
300
 
310
301
  const makeMiddlewareBasic = <Self>() =>
311
302
  // by setting RequestContextMap beforehand, execute contextual typing does not fuck up itself to anys
@@ -321,7 +312,26 @@ const makeMiddlewareBasic = <Self>() =>
321
312
  // reverse middlewares and wrap one after the other
322
313
  const middleware = middlewareMaker(make)
323
314
 
324
- const failures = make.map((_) => _.error).filter(Boolean)
315
+ // Per-middleware error: union of the static `error` on the tag (if any) AND
316
+ // the rcm config entry pointed at by the middleware's `dynamic.key` (if any).
317
+ // Reason: middlewares declared with `dynamic: RequestContextMap.get("foo")`
318
+ // don't set a static `error` field — at runtime their `.error` defaults to
319
+ // `S.Never`. Without pulling from rcm, the composite middleware's
320
+ // `.error` collapses to `Never`, and `Rpc.exitSchema` (which walks
321
+ // `rpc.middlewares[*].error` to build the wire failure union) can't decode
322
+ // the actual middleware-thrown error type. Critical for stream rpcs whose
323
+ // top-level `errorSchema` is force-set to `Never` by effect-rpc.
324
+ const isMeaningfulError = (e: S.Top | undefined): e is S.Top => e !== undefined && e !== null && e !== S.Never
325
+ const rcmRecord = rcm as Record<string, RpcContextMap.Any>
326
+ const failures: Array<S.Top> = make.flatMap((_) => {
327
+ const out: Array<S.Top> = []
328
+ if (isMeaningfulError(_.error)) out.push(_.error)
329
+ const key = _.dynamic?.key as string | undefined
330
+ if (key && rcmRecord[key] && isMeaningfulError(rcmRecord[key].error)) {
331
+ out.push(rcmRecord[key].error)
332
+ }
333
+ return out
334
+ })
325
335
  const provides = make.flatMap((_) => !_.provides ? [] : Array.isArray(_.provides) ? _.provides : [_.provides])
326
336
  const requires = make
327
337
  .flatMap((_) => !_.requires ? [] : Array.isArray(_.requires) ? _.requires : [_.requires])
@@ -357,17 +367,18 @@ const makeMiddlewareBasic = <Self>() =>
357
367
  .effect(
358
368
  MiddlewareMaker,
359
369
  middleware as Effect.Effect<
360
- any,
361
- Effect.Error<typeof middleware>,
362
- Effect.Services<typeof middleware>
370
+ any
363
371
  >
372
+ // todo; they dont change the type..
373
+ // Effect.Error<typeof middleware>,
374
+ // Effect.Services<typeof middleware>
364
375
  )
365
376
 
366
377
  // add to the tag a default implementation
367
378
  return Object.assign(MiddlewareMaker, {
368
379
  layer,
369
380
  // tag to be used to retrieve the RequestContextConfig from Rpc annotations
370
- requestContext: ServiceMap.Service<"RequestContextConfig", GetContextConfig<RequestContextMap>>(
381
+ requestContext: Context.Service<"RequestContextConfig", GetContextConfig<RequestContextMap>>(
371
382
  "RequestContextConfig"
372
383
  ),
373
384
  requestContextMap: rcm
@@ -379,8 +390,8 @@ export const Tag = <Self>() =>
379
390
  const Id extends string,
380
391
  RequestContextMap extends RequestContextMapTagAny
381
392
  >(id: Id, rcm: RequestContextMap): MiddlewaresBuilder<Self, Id, RequestContextMap["config"]> => {
382
- let allMiddleware: MiddlewareMaker.Any[] = []
383
- const requestContext = ServiceMap.Service<"RequestContextConfig", GetContextConfig<RequestContextMap["config"]>>(
393
+ const allMiddleware: MiddlewareMaker.Any[] = []
394
+ const requestContext = Context.Service<"RequestContextConfig", GetContextConfig<RequestContextMap["config"]>>(
384
395
  "RequestContextConfig"
385
396
  )
386
397
  const it = {
@@ -388,9 +399,9 @@ export const Tag = <Self>() =>
388
399
  // rpc with config
389
400
  rpc: <
390
401
  const Tag extends string,
391
- Payload extends Schema.Top | Schema.Struct.Fields = typeof Schema.Void,
392
- Success extends Schema.Top = typeof Schema.Void,
393
- Error extends Schema.Top = typeof Schema.Never,
402
+ Payload extends S.Top | S.Struct.Fields = typeof S.Void,
403
+ Success extends S.Top = typeof S.Void,
404
+ Error extends S.Top = typeof S.Never,
394
405
  const Stream extends boolean = false,
395
406
  Config extends GetContextConfig<RequestContextMap["config"]> = {}
396
407
  >(tag: Tag, options?: {
@@ -399,35 +410,32 @@ export const Tag = <Self>() =>
399
410
  readonly error?: Error
400
411
  readonly stream?: Stream
401
412
  readonly config?: Config
402
- readonly primaryKey?: [Payload] extends [Schema.Struct.Fields] ? ((
403
- payload: Payload extends Schema.Struct.Fields ? Simplify<Schema.Struct<Payload>["Type"]> : Payload["Type"]
413
+ readonly primaryKey?: [Payload] extends [S.Struct.Fields] ? ((
414
+ payload: Payload extends S.Struct.Fields ? Simplify<S.Struct<Payload>["Type"]> : Payload["Type"]
404
415
  ) => string)
405
416
  : never
406
417
  }):
407
418
  & Rpc.Rpc<
408
419
  Tag,
409
- Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload,
420
+ Payload extends S.Struct.Fields ? S.Struct<Payload> : Payload,
410
421
  // TODO: enhance `Error`. type based on middleware config.
411
422
  Stream extends true ? RpcSchema.Stream<Success, Error> : Success,
412
- Stream extends true ? typeof Schema.Never : Error
423
+ Stream extends true ? typeof S.Never : Error
413
424
  >
414
425
  & { config: Config } =>
415
426
  {
416
427
  const config = options?.config ?? {} as Config
417
428
 
418
- // based on the config, we must enhance (union) or set failures.
419
- // TODO: we should only include errors that are relevant based on the middleware config.ks
420
- const error = options?.error
421
- const errors = typedValuesOf(rcm.config).map((_) => _.error).filter((_) => _ && _ !== S.Never) // TODO: only the errors relevant based on config
422
- const allErrors = error ? [error, ...errors] : errors
423
- const [firstError, ...restErrors] = allErrors
424
- const newError = firstError ? S.Union([firstError, ...restErrors]) : S.Never
425
-
429
+ // The rpc's `error` schema carries ONLY the request's own declared errors.
430
+ // Middleware errors (rcm-derived) reach the wire via the middleware tag
431
+ // attached to the rpc group later (`RpcGroup.middleware(...)` at the
432
+ // routing/client level), and are unioned into the failure schema by
433
+ // `Rpc.exitSchema`'s `rpc.middlewares[*].error` walk.
426
434
  // @ts-expect-error — TypeScript can't prove Simplify<T> ≡ { [K in keyof T]: T[K] } for unresolved generics (primaryKey)
427
435
  const rpc = Rpc.make(tag, {
428
436
  ...options?.payload !== undefined ? { payload: options.payload } : {},
429
437
  ...options?.success !== undefined ? { success: options.success } : {},
430
- error: newError,
438
+ ...options?.error !== undefined ? { error: options.error } : {},
431
439
  ...options?.stream !== undefined ? { stream: options.stream } : {},
432
440
  ...options?.primaryKey !== undefined ? { primaryKey: options.primaryKey } : {}
433
441
  }) as any
@@ -437,7 +445,7 @@ export const Tag = <Self>() =>
437
445
  middleware: (...middlewares: any[]) => {
438
446
  for (const mw of middlewares) {
439
447
  // recall that we run middlewares in reverse order
440
- allMiddleware = [mw, ...allMiddleware]
448
+ allMiddleware.unshift(mw)
441
449
  }
442
450
  return allMiddleware.filter((m) => !!m.dynamic).length !== Object.keys(rcm.config).length
443
451
  // for sure, until all the dynamic middlewares are provided it's non sensical to call makeMiddlewareBasic
package/src/rpc/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  The extensions use V4 format of RPC middleware:
4
4
 
5
5
  - supports `requires` besides `provides`
6
- - `requires` and `provides` should be set as second generic argument: `Tag<Self, Config>`.
6
+ - `requires` and `provides` should be set as second generic argument: `Tag<Self, Config>`.
7
7
  - `wrap: true` is the default, there is no classic `provides: Tag`
8
8
 
9
9
  ## Features
@@ -34,7 +34,7 @@ NOTE: perhaps not as useful anymore if support for dynamic middleware gets integ
34
34
 
35
35
  ## Examples
36
36
 
37
- See [tests](../../../infra/test/rpc-multi-middleware.test.ts)
37
+ See [tests](../../../infra/test/rpc-multi-middleware.test.ts)
38
38
 
39
39
  ## Future
40
40
 
@@ -2,14 +2,15 @@
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-return */
3
3
  /* eslint-disable @typescript-eslint/no-explicit-any */
4
4
 
5
- import { type Schema as S, ServiceMap } from "effect"
5
+ import type * as S from "effect/Schema"
6
6
  import { type AnyWithProps } from "effect/unstable/rpc/Rpc"
7
+ import * as Context from "../Context.js"
7
8
  import { type RpcDynamic } from "./RpcMiddleware.js"
8
9
 
9
10
  type Values<T extends Record<any, any>> = T[keyof T]
10
11
 
11
12
  /**
12
- * Middleware is inactivate by default, the Key is optional in route context, and the service is optionally provided as Effect ServiceMap.
13
+ * Middleware is inactivate by default, the Key is optional in route context, and the service is optionally provided as Effect Context.
13
14
  * Unless explicitly configured as `true`.
14
15
  */
15
16
  export type RpcContextMap<Service, E> = {
@@ -22,7 +23,7 @@ export type RpcContextMap<Service, E> = {
22
23
 
23
24
  export declare namespace RpcContextMap {
24
25
  /**
25
- * Middleware is active by default, and provides the Service at Key in route context, and the Service is provided as Effect ServiceMap.
26
+ * Middleware is active by default, and provides the Service at Key in route context, and the Service is provided as Effect Context.
26
27
  * Unless explicitly omitted.
27
28
  */
28
29
  export type Inverted<Service, E> = {
@@ -97,7 +98,7 @@ export type GetEffectError<RequestContextMap extends Record<string, RpcContextMa
97
98
  }
98
99
  >
99
100
 
100
- const tag = ServiceMap.Service("RequestContextConfig")
101
+ const tag = Context.Service("RequestContextConfig")
101
102
 
102
103
  export const makeMap = <const Config extends Record<string, RpcContextMap.Any>>(config: Config) => {
103
104
  const cls = class {
@@ -109,7 +110,7 @@ export const makeMap = <const Config extends Record<string, RpcContextMap.Any>>(
109
110
  return Object.assign(cls, {
110
111
  config, /** Retrieves RequestContextConfig out of the Rpc annotations */
111
112
  getConfig: (rpc: AnyWithProps): GetContextConfig<Config> => {
112
- return ServiceMap.getOrElse(rpc.annotations, tag as any, () => ({}))
113
+ return Context.getOrElse(rpc.annotations, tag as any, () => ({}))
113
114
  },
114
115
  /** Adapter used when setting the dynamic prop on a middleware implementation */
115
116
  get: <
@@ -1,17 +1,21 @@
1
1
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-return */
3
3
  /* eslint-disable @typescript-eslint/no-explicit-any */
4
- import { type Effect, type Schema, type Schema as S, type Scope, type ServiceMap, type Stream } from "effect"
5
4
  import { type NonEmptyReadonlyArray } from "effect/Array"
5
+ import type * as Effect from "effect/Effect"
6
+ import type * as S from "effect/Schema"
7
+ import type * as Scope from "effect/Scope"
8
+ import type * as Stream from "effect/Stream"
6
9
  import { type Rpc, RpcMiddleware } from "effect/unstable/rpc"
7
10
  import { type TypeId } from "effect/unstable/rpc/RpcMiddleware"
11
+ import type * as Context from "../Context.js"
8
12
  import { type GetEffectContext, type RpcContextMap } from "./RpcContextMap.js"
9
13
 
10
14
  export type RpcMiddlewareV4<Provides, E, Requires> = RpcMiddleware.RpcMiddleware<Provides, E, Requires>
11
15
 
12
16
  export type RpcOptionsOriginal = {
13
17
  readonly optional?: boolean
14
- readonly error?: Schema.Top
18
+ readonly error?: S.Top
15
19
  readonly requiredForClient?: boolean
16
20
  }
17
21
 
@@ -39,7 +43,7 @@ export interface TagClassAny extends RpcMiddleware.AnyService {
39
43
  readonly optional: boolean
40
44
  readonly provides: any
41
45
  readonly requires: any
42
- readonly error: Schema.Top
46
+ readonly error: S.Top
43
47
  readonly dynamic?: RpcDynamic<any, any> | undefined
44
48
  readonly dependsOn?: NonEmptyReadonlyArray<AnyDynamic> | undefined
45
49
  }
@@ -49,27 +53,29 @@ export declare namespace TagClass {
49
53
  * @since 1.0.0
50
54
  * @category models
51
55
  */
52
- export type FailureSchema<Options> = Options extends { readonly error: Schema.Top; readonly optional?: false }
56
+ export type FailureSchema<Options> = Options extends { readonly error: S.Top; readonly optional?: false }
53
57
  ? Options["error"]
54
58
  // actually not, the Failure depends on Dynamic Middleware Configuration!
55
59
  // : Options extends { readonly dynamic: RpcDynamic<any, infer A> } ? A["error"]
56
- : typeof Schema.Never
60
+ : typeof S.Never
57
61
 
58
62
  /**
59
63
  * @since 1.0.0
60
64
  * @category models
61
65
  */
62
- export type Failure<Options> = Options extends { readonly error: Schema.Codec<infer _A>; readonly optional?: false }
63
- ? _A
66
+ export type Failure<Options> = Options extends { readonly error: S.Codec<infer _A>; readonly optional?: false } ? _A
64
67
  // actually not, the Failure depends on Dynamic Middleware Configuration!
65
- : Options extends { readonly dynamic: RpcDynamic<any, infer A> } ? S.Schema.Type<A["error"]>
68
+ : Options extends { readonly dynamic: RpcDynamic<any, infer A> } ? A["error"]["Type"]
66
69
  : never
67
70
 
68
71
  /**
69
72
  * @since 1.0.0
70
73
  * @category models
71
74
  */
72
- export type FailureContext<Options> = Schema.Codec.DecodingServices<FailureSchema<Options>>
75
+ // Avoid `S.Codec.DecodingServices<X> = X extends Top ? X["DecodingServices"] : never`:
76
+ // tsgo fails to reduce it here and leaves `unknown`. `FailureSchema<Options>` is
77
+ // always `S.Top` (either `Options["error"]` or `typeof S.Never`), so read directly.
78
+ export type FailureContext<Options> = FailureSchema<Options>["DecodingServices"]
73
79
 
74
80
  /**
75
81
  * @since 1.0.0
@@ -102,8 +108,8 @@ export declare namespace TagClass {
102
108
  requires?: any
103
109
  provides?: any
104
110
  }
105
- > extends ServiceMap.Service<Self, Service> {
106
- new(_: never): ServiceMap.ServiceClass.Shape<Name, Service>
111
+ > extends Context.Service<Self, Service> {
112
+ new(_: never): Context.ServiceClass.Shape<Name, Service>
107
113
  readonly [TypeId]: TypeId
108
114
  readonly optional: Optional<Options>
109
115
  readonly error: FailureSchema<Options>
@@ -226,7 +232,7 @@ export type ExtractProvides<R extends Rpc.Any, Tag extends string> = R extends
226
232
  Rpc.Rpc<Tag, infer _Payload, infer _Success, infer _Error, infer _Middleware, infer _Requires> ? _Middleware extends {
227
233
  readonly provides: infer _P
228
234
  } ? [_P] extends [never] ? never
229
- : _P /*_P extends ServiceMap.Service<infer _I, infer _S> ? _I
235
+ : _P /*_P extends Context.Service<infer _I, infer _S> ? _I
230
236
  : never */
231
237
  : never
232
238
  : never
package/src/rpc.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * as RpcX from "./rpc.js"
1
+ export * as Invalidation from "./rpc/Invalidation.js"
2
2
  export * as MiddlewareMaker from "./rpc/MiddlewareMaker.js"
3
3
  export * as RpcContextMap from "./rpc/RpcContextMap.js"
4
4
  export * as RpcMiddleware from "./rpc/RpcMiddleware.js"
package/src/runtime.ts ADDED
@@ -0,0 +1,56 @@
1
+ import * as Exit from "effect/Exit"
2
+ import { flow } from "effect/Function"
3
+ import * as Logger from "effect/Logger"
4
+ import * as ManagedRuntime from "effect/ManagedRuntime"
5
+ import { CauseException } from "./client/errors.js"
6
+ import { type Context } from "./Context.js"
7
+ import * as Effect from "./Effect.js"
8
+ import * as Layer from "./Layer.js"
9
+
10
+ export const makeAppRuntime = Effect.fnUntraced(function*<A, E>(layer: Layer.Layer<A, E>) {
11
+ const l = layer.pipe(
12
+ Layer.provide(Logger.layer([Logger.consolePretty()]))
13
+ ) as Layer.Layer<A>
14
+ const mrt = ManagedRuntime.make(l)
15
+ yield* mrt.contextEffect
16
+ return Object.assign(mrt, {
17
+ [Symbol.dispose]() {
18
+ return Effect.runSync(mrt.disposeEffect)
19
+ },
20
+
21
+ [Symbol.asyncDispose]() {
22
+ return mrt.dispose()
23
+ }
24
+ }) // as we initialise here, there is no more error left.
25
+ })
26
+
27
+ export function initializeSync<A, E>(layer: Layer.Layer<A, E>) {
28
+ const runtime = Effect.runSync(makeAppRuntime(layer))
29
+ return runtime
30
+ }
31
+
32
+ export function initializeAsync<A, E>(layer: Layer.Layer<A, E>) {
33
+ return Effect
34
+ .runPromise(makeAppRuntime(layer))
35
+ }
36
+
37
+ // we wrap into CauseException because we want to keep the full cause of the failure.
38
+ export const makeRunPromise = <T>(services: Context<T>) =>
39
+ flow(Effect.runPromiseExitWith(services), (_) =>
40
+ _.then(
41
+ Exit.match({
42
+ onFailure: (cause) => Promise.reject(new CauseException(cause, "runPromise")),
43
+ onSuccess: (value) => Promise.resolve(value)
44
+ })
45
+ ))
46
+
47
+ export const makeRunSync = <T>(services: Context<T>) =>
48
+ flow(
49
+ Effect.runSyncExitWith(services),
50
+ Exit.match({
51
+ onFailure: (cause) => {
52
+ throw new CauseException(cause, "runSync")
53
+ },
54
+ onSuccess: (value) => value
55
+ })
56
+ )
package/src/toast.ts ADDED
@@ -0,0 +1,54 @@
1
+ import * as Context from "./Context.js"
2
+ import { accessEffectFn } from "./Context.js"
3
+ import * as Effect from "./Effect.js"
4
+ import * as Option from "./Option.js"
5
+
6
+ export type ToastId = string | number
7
+ export type ToastOpts = { id?: ToastId; timeout?: number; groupId?: string; requestId?: string }
8
+ export type ToastOptsInternal = { id?: ToastId | null; timeout?: number; groupId?: string; requestId?: string }
9
+
10
+ export type UseToast = () => {
11
+ error: (this: void, message: string, options?: ToastOpts) => ToastId
12
+ warning: (this: void, message: string, options?: ToastOpts) => ToastId
13
+ success: (this: void, message: string, options?: ToastOpts) => ToastId
14
+ info: (this: void, message: string, options?: ToastOpts) => ToastId
15
+ dismiss: (this: void, id: ToastId) => void
16
+ }
17
+
18
+ export class CurrentToastId extends Context.Opaque<CurrentToastId, { toastId: ToastId }>()("CurrentToastId") {}
19
+
20
+ /** fallback to CurrentToastId when available unless id is explicitly set to a value or null */
21
+ export const wrap = (toast: ReturnType<UseToast>) => {
22
+ const wrap = (toastHandler: (message: string, options?: ToastOpts) => ToastId) => {
23
+ return (message: string, options?: ToastOptsInternal) =>
24
+ Effect.serviceOption(CurrentToastId).pipe(
25
+ Effect.flatMap((currentToast) =>
26
+ Effect.sync(() => {
27
+ const { id: _id, ...rest } = options ?? {}
28
+ const id = _id !== undefined
29
+ ? _id ?? undefined
30
+ : Option.getOrUndefined(Option.map(currentToast, (_) => _.toastId))
31
+ // when id is undefined, we may end up with no toast at all..
32
+ return toastHandler(message, id !== undefined ? { ...rest, id } : rest)
33
+ })
34
+ )
35
+ )
36
+ }
37
+ return {
38
+ error: wrap(toast.error),
39
+ info: wrap(toast.info),
40
+ success: wrap(toast.success),
41
+ warning: wrap(toast.warning),
42
+ dismiss: (toastId: ToastId) => Effect.sync(() => toast.dismiss(toastId))
43
+ }
44
+ }
45
+
46
+ type ToastShape = ReturnType<typeof wrap>
47
+
48
+ export class Toast extends Context.Opaque<Toast, ToastShape>()("Toast") {
49
+ static readonly error = accessEffectFn(this, "error")
50
+ static readonly info = accessEffectFn(this, "info")
51
+ static readonly success = accessEffectFn(this, "success")
52
+ static readonly warning = accessEffectFn(this, "warning")
53
+ static readonly dismiss = accessEffectFn(this, "dismiss")
54
+ }
package/src/transform.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { Option } from "effect"
3
2
  import type { NonEmptyReadonlyArray } from "effect/Array"
3
+ import * as Option from "effect/Option"
4
4
  import type { Misc, Union } from "ts-toolbelt"
5
5
  import type * as SET from "./Set.js"
6
6
 
@@ -51,8 +51,8 @@ const encodeOptsAsNullable_ = (value: any, cacheMap: Map<any, any>): any => {
51
51
 
52
52
  if (
53
53
  value instanceof Date
54
- || value instanceof Function
55
- || value instanceof Promise
54
+ || typeof value === "function"
55
+ || (typeof value === "object" && value !== null && "then" in value && typeof value.then === "function")
56
56
  ) {
57
57
  return value
58
58
  }
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
3
3
 
4
- import { Effect } from "effect"
4
+ import * as Effect from "effect/Effect"
5
5
 
6
6
  interface Callback<E, A> {
7
7
  (err: E, a?: A): void
package/src/utils/gen.ts CHANGED
@@ -1,24 +1,24 @@
1
- import { type Effect, type Yieldable } from "effect/Effect"
1
+ import { type Effect } from "effect/Effect"
2
2
 
3
3
  export namespace EffectGenUtils {
4
4
  export type Success<EG> = EG extends Effect<infer A, infer _E, infer _R> ? A
5
5
  // there could be a case where the generator function does not yield anything, so we need to handle that
6
6
  : EG extends (..._: infer _3) => Generator<never, infer A, infer _2> ? A
7
- // v4: generators can yield Yieldable (Effect, Service, etc.), all have asEffect()
8
- : EG extends (..._: infer _3) => Generator<Yieldable<any, infer _, infer _E, infer _R>, infer A, infer _2> ? A
7
+ // generators yield Effect values
8
+ : EG extends (..._: infer _3) => Generator<Effect<any, infer _E, infer _R>, infer A, infer _2> ? A
9
9
  : never
10
10
 
11
11
  export type Error<EG> = EG extends Effect<infer _A, infer E, infer _R> ? E
12
12
  // there could be a case where the generator function does not yield anything, so we need to handle that
13
13
  : EG extends (..._: infer _3) => Generator<never, infer _A, infer _2> ? never
14
- // v4: generators can yield Yieldable (Effect, Service, etc.), all have asEffect()
15
- : EG extends (..._: infer _3) => Generator<Yieldable<any, infer _, infer E, infer _R>, infer _A, infer _2> ? E
14
+ // generators yield Effect values
15
+ : EG extends (..._: infer _3) => Generator<Effect<any, infer E, infer _R>, infer _A, infer _2> ? E
16
16
  : never
17
17
 
18
- export type ServiceMap<EG> = EG extends Effect<infer _A, infer _E, infer R> ? R
18
+ export type Context<EG> = EG extends Effect<infer _A, infer _E, infer R> ? R
19
19
  // there could be a case where the generator function does not yield anything, so we need to handle that
20
20
  : EG extends (..._: infer _3) => Generator<never, infer _A, infer _2> ? never
21
- // v4: generators can yield Yieldable (Effect, Service, etc.), all have asEffect()
22
- : EG extends (..._: infer _3) => Generator<Yieldable<any, infer _, infer _E, infer R>, infer _A, infer _2> ? R
21
+ // generators yield Effect values
22
+ : EG extends (..._: infer _3) => Generator<Effect<any, infer _E, infer R>, infer _A, infer _2> ? R
23
23
  : never
24
24
  }
@@ -1,4 +1,4 @@
1
- import { type LogLevel } from "effect"
1
+ import type * as LogLevel from "effect/LogLevel"
2
2
 
3
3
  export const LogLevelToSentry = (level: LogLevel.LogLevel) => {
4
4
  switch (level) {
@@ -1,12 +1,13 @@
1
1
  /* eslint-disable @typescript-eslint/no-unsafe-argument */
2
2
  /* eslint-disable @typescript-eslint/no-explicit-any */
3
3
 
4
- import { Effect, type LogLevel } from "effect"
5
- import * as ServiceMap from "../ServiceMap.js"
4
+ import * as Effect from "effect/Effect"
5
+ import type * as LogLevel from "effect/LogLevel"
6
+ import * as Context from "../Context.js"
6
7
 
7
8
  type Levels = "info" | "debug" | "warn" | "error"
8
9
 
9
- export class LogLevels extends ServiceMap.Reference("LogLevels", {
10
+ export class LogLevels extends Context.Reference("LogLevels", {
10
11
  defaultValue: () => new Map<string, Levels>()
11
12
  }) {}
12
13