effect-app 4.0.0-beta.99 → 4.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 (391) hide show
  1. package/CHANGELOG.md +2042 -0
  2. package/dist/Array.d.ts +1 -17
  3. package/dist/Array.d.ts.map +1 -1
  4. package/dist/Array.js +3 -27
  5. package/dist/Chunk.d.ts +3 -27
  6. package/dist/Chunk.d.ts.map +1 -1
  7. package/dist/Chunk.js +4 -39
  8. package/dist/Config/SecretURL.d.ts +3 -1
  9. package/dist/Config/SecretURL.d.ts.map +1 -1
  10. package/dist/Config/SecretURL.js +3 -6
  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 +0 -5
  14. package/dist/Config.d.ts.map +1 -1
  15. package/dist/Config.js +7 -5
  16. package/dist/ConfigProvider.d.ts +0 -37
  17. package/dist/ConfigProvider.d.ts.map +1 -1
  18. package/dist/ConfigProvider.js +5 -41
  19. package/dist/Context.d.ts +6 -4
  20. package/dist/Context.d.ts.map +1 -1
  21. package/dist/Context.js +4 -3
  22. package/dist/DataDependencies.d.ts +136 -0
  23. package/dist/DataDependencies.d.ts.map +1 -0
  24. package/dist/DataDependencies.js +112 -0
  25. package/dist/DateTime.d.ts +33 -0
  26. package/dist/DateTime.d.ts.map +1 -0
  27. package/dist/DateTime.js +18 -0
  28. package/dist/Effect.d.ts +3 -14
  29. package/dist/Effect.d.ts.map +1 -1
  30. package/dist/Effect.js +8 -26
  31. package/dist/Emailer.d.ts +51 -0
  32. package/dist/Emailer.d.ts.map +1 -0
  33. package/dist/Emailer.js +7 -0
  34. package/dist/Function.d.ts +0 -4
  35. package/dist/Function.d.ts.map +1 -1
  36. package/dist/Function.js +1 -7
  37. package/dist/Layer.d.ts +6 -3
  38. package/dist/Layer.d.ts.map +1 -1
  39. package/dist/Layer.js +3 -2
  40. package/dist/Model/Repository/Registry.d.ts +22 -0
  41. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  42. package/dist/Model/Repository/Registry.js +18 -0
  43. package/dist/Model/Repository/dependency.d.ts +6 -0
  44. package/dist/Model/Repository/dependency.d.ts.map +1 -0
  45. package/dist/Model/Repository/dependency.js +29 -0
  46. package/dist/Model/Repository/ext.d.ts +60 -0
  47. package/dist/Model/Repository/ext.d.ts.map +1 -0
  48. package/dist/Model/Repository/ext.js +124 -0
  49. package/dist/Model/Repository/internal/internal.d.ts +68 -0
  50. package/dist/Model/Repository/internal/internal.d.ts.map +1 -0
  51. package/dist/Model/Repository/internal/internal.js +610 -0
  52. package/dist/Model/Repository/legacy.d.ts +21 -0
  53. package/dist/Model/Repository/legacy.d.ts.map +1 -0
  54. package/dist/Model/Repository/legacy.js +2 -0
  55. package/dist/Model/Repository/makeRepo.d.ts +71 -0
  56. package/dist/Model/Repository/makeRepo.d.ts.map +1 -0
  57. package/dist/Model/Repository/makeRepo.js +30 -0
  58. package/dist/Model/Repository/service.d.ts +121 -0
  59. package/dist/Model/Repository/service.d.ts.map +1 -0
  60. package/dist/Model/Repository/service.js +2 -0
  61. package/dist/Model/Repository/validation.d.ts +72 -0
  62. package/dist/Model/Repository/validation.d.ts.map +1 -0
  63. package/dist/Model/Repository/validation.js +39 -0
  64. package/dist/Model/Repository.d.ts +8 -0
  65. package/dist/Model/Repository.d.ts.map +1 -0
  66. package/dist/Model/Repository.js +8 -0
  67. package/dist/Model/dsl.d.ts +34 -0
  68. package/dist/Model/dsl.d.ts.map +1 -0
  69. package/dist/Model/dsl.js +45 -0
  70. package/dist/Model/filter/filterApi.d.ts +30 -0
  71. package/dist/Model/filter/filterApi.d.ts.map +1 -0
  72. package/dist/Model/filter/filterApi.js +2 -0
  73. package/dist/Model/filter/types/errors.d.ts +29 -0
  74. package/dist/Model/filter/types/errors.d.ts.map +1 -0
  75. package/dist/Model/filter/types/errors.js +2 -0
  76. package/dist/Model/filter/types/fields.d.ts +15 -0
  77. package/dist/Model/filter/types/fields.d.ts.map +1 -0
  78. package/dist/Model/filter/types/fields.js +2 -0
  79. package/dist/Model/filter/types/path/common.d.ts +316 -0
  80. package/dist/Model/filter/types/path/common.d.ts.map +1 -0
  81. package/dist/Model/filter/types/path/common.js +2 -0
  82. package/dist/Model/filter/types/path/eager.d.ts +94 -0
  83. package/dist/Model/filter/types/path/eager.d.ts.map +1 -0
  84. package/dist/Model/filter/types/path/eager.js +36 -0
  85. package/dist/Model/filter/types/path/index.d.ts +4 -0
  86. package/dist/Model/filter/types/path/index.d.ts.map +1 -0
  87. package/dist/Model/filter/types/path/index.js +3 -0
  88. package/dist/Model/filter/types/utils.d.ts +79 -0
  89. package/dist/Model/filter/types/utils.d.ts.map +1 -0
  90. package/dist/Model/filter/types/utils.js +2 -0
  91. package/dist/Model/filter/types/validator.d.ts +30 -0
  92. package/dist/Model/filter/types/validator.d.ts.map +1 -0
  93. package/dist/Model/filter/types/validator.js +2 -0
  94. package/dist/Model/filter/types.d.ts +5 -0
  95. package/dist/Model/filter/types.d.ts.map +1 -0
  96. package/dist/Model/filter/types.js +7 -0
  97. package/dist/Model/query/dsl.d.ts +630 -0
  98. package/dist/Model/query/dsl.d.ts.map +1 -0
  99. package/dist/Model/query/dsl.js +376 -0
  100. package/dist/Model/query/new-kid-interpreter.d.ts +132 -0
  101. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -0
  102. package/dist/Model/query/new-kid-interpreter.js +369 -0
  103. package/dist/Model/query.d.ts +15 -0
  104. package/dist/Model/query.d.ts.map +1 -0
  105. package/dist/Model/query.js +3 -0
  106. package/dist/Model.d.ts +6 -0
  107. package/dist/Model.d.ts.map +1 -0
  108. package/dist/Model.js +6 -0
  109. package/dist/NonEmptySet.d.ts +3 -1
  110. package/dist/NonEmptySet.d.ts.map +1 -1
  111. package/dist/NonEmptySet.js +2 -2
  112. package/dist/Option.d.ts +1 -2
  113. package/dist/Option.d.ts.map +1 -1
  114. package/dist/Option.js +3 -7
  115. package/dist/Pure.d.ts +9 -7
  116. package/dist/Pure.d.ts.map +1 -1
  117. package/dist/Pure.js +20 -17
  118. package/dist/QueueMaker.d.ts +11 -0
  119. package/dist/QueueMaker.d.ts.map +1 -0
  120. package/dist/QueueMaker.js +11 -0
  121. package/dist/RequestContext.d.ts +87 -0
  122. package/dist/RequestContext.d.ts.map +1 -0
  123. package/dist/RequestContext.js +45 -0
  124. package/dist/RequestScopedDependencies.d.ts +21 -0
  125. package/dist/RequestScopedDependencies.d.ts.map +1 -0
  126. package/dist/RequestScopedDependencies.js +16 -0
  127. package/dist/Schema/Class.d.ts +163 -16
  128. package/dist/Schema/Class.d.ts.map +1 -1
  129. package/dist/Schema/Class.js +193 -21
  130. package/dist/Schema/FastCheck.d.ts.map +1 -1
  131. package/dist/Schema/SchemaParser.d.ts +5 -0
  132. package/dist/Schema/SchemaParser.d.ts.map +1 -0
  133. package/dist/Schema/SchemaParser.js +6 -0
  134. package/dist/Schema/SpecialJsonSchema.d.ts +15 -2
  135. package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -1
  136. package/dist/Schema/SpecialJsonSchema.js +70 -12
  137. package/dist/Schema/SpecialOpenApi.d.ts +1 -1
  138. package/dist/Schema/SpecialOpenApi.js +3 -3
  139. package/dist/Schema/brand.d.ts +5 -5
  140. package/dist/Schema/brand.d.ts.map +1 -1
  141. package/dist/Schema/brand.js +6 -4
  142. package/dist/Schema/email.d.ts.map +1 -1
  143. package/dist/Schema/email.js +8 -5
  144. package/dist/Schema/ext.d.ts +279 -75
  145. package/dist/Schema/ext.d.ts.map +1 -1
  146. package/dist/Schema/ext.js +330 -72
  147. package/dist/Schema/moreStrings.d.ts +82 -48
  148. package/dist/Schema/moreStrings.d.ts.map +1 -1
  149. package/dist/Schema/moreStrings.js +85 -51
  150. package/dist/Schema/numbers.d.ts +33 -21
  151. package/dist/Schema/numbers.d.ts.map +1 -1
  152. package/dist/Schema/numbers.js +64 -12
  153. package/dist/Schema/phoneNumber.d.ts.map +1 -1
  154. package/dist/Schema/phoneNumber.js +6 -6
  155. package/dist/Schema/schema.d.ts +1 -1
  156. package/dist/Schema/schema.d.ts.map +1 -1
  157. package/dist/Schema/schema.js +2 -2
  158. package/dist/Schema/strings.d.ts +18 -4
  159. package/dist/Schema/strings.d.ts.map +1 -1
  160. package/dist/Schema/strings.js +1 -5
  161. package/dist/Schema.d.ts +224 -7
  162. package/dist/Schema.d.ts.map +1 -1
  163. package/dist/Schema.js +190 -24
  164. package/dist/SchemaAST.d.ts +2 -0
  165. package/dist/SchemaAST.d.ts.map +1 -0
  166. package/dist/SchemaAST.js +2 -0
  167. package/dist/Set.d.ts +4 -1
  168. package/dist/Set.d.ts.map +1 -1
  169. package/dist/Set.js +8 -6
  170. package/dist/Store.d.ts +215 -0
  171. package/dist/Store.d.ts.map +1 -0
  172. package/dist/Store.js +113 -0
  173. package/dist/_ext/Array.d.ts +1 -1
  174. package/dist/_ext/Array.d.ts.map +1 -1
  175. package/dist/_ext/Array.js +4 -2
  176. package/dist/_ext/ord.ext.d.ts +2 -1
  177. package/dist/_ext/ord.ext.d.ts.map +1 -1
  178. package/dist/_ext/ord.ext.js +2 -2
  179. package/dist/builtin.d.ts +2 -14
  180. package/dist/builtin.d.ts.map +1 -1
  181. package/dist/builtin.js +1 -1
  182. package/dist/client/InvalidationKeys.d.ts +30 -0
  183. package/dist/client/InvalidationKeys.d.ts.map +1 -0
  184. package/dist/client/InvalidationKeys.js +37 -0
  185. package/dist/client/apiClientFactory.d.ts +13 -8
  186. package/dist/client/apiClientFactory.d.ts.map +1 -1
  187. package/dist/client/apiClientFactory.js +154 -34
  188. package/dist/client/clientFor.d.ts +48 -13
  189. package/dist/client/clientFor.d.ts.map +1 -1
  190. package/dist/client/clientFor.js +9 -1
  191. package/dist/client/errors.d.ts +74 -28
  192. package/dist/client/errors.d.ts.map +1 -1
  193. package/dist/client/errors.js +41 -10
  194. package/dist/client/makeClient.d.ts +487 -32
  195. package/dist/client/makeClient.d.ts.map +1 -1
  196. package/dist/client/makeClient.js +47 -21
  197. package/dist/client.d.ts +2 -0
  198. package/dist/client.d.ts.map +1 -1
  199. package/dist/client.js +3 -1
  200. package/dist/faker.d.ts.map +1 -1
  201. package/dist/http/Request.d.ts +2 -2
  202. package/dist/http/Request.d.ts.map +1 -1
  203. package/dist/http/Request.js +2 -2
  204. package/dist/http/internal/lib.d.ts +12 -12
  205. package/dist/http/internal/lib.d.ts.map +1 -1
  206. package/dist/http/internal/lib.js +13 -13
  207. package/dist/ids.d.ts +32 -14
  208. package/dist/ids.d.ts.map +1 -1
  209. package/dist/ids.js +38 -7
  210. package/dist/index.d.ts +3 -0
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +5 -1
  213. package/dist/middleware.d.ts +12 -6
  214. package/dist/middleware.d.ts.map +1 -1
  215. package/dist/middleware.js +13 -7
  216. package/dist/migration/nativeEffect.d.ts +21 -0
  217. package/dist/migration/nativeEffect.d.ts.map +1 -0
  218. package/dist/migration/nativeEffect.js +598 -0
  219. package/dist/rpc/Invalidation.d.ts +1124 -0
  220. package/dist/rpc/Invalidation.d.ts.map +1 -0
  221. package/dist/rpc/Invalidation.js +178 -0
  222. package/dist/rpc/MiddlewareMaker.d.ts +10 -7
  223. package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
  224. package/dist/rpc/MiddlewareMaker.js +57 -37
  225. package/dist/rpc/RpcContextMap.d.ts +2 -2
  226. package/dist/rpc/RpcContextMap.d.ts.map +1 -1
  227. package/dist/rpc/RpcMiddleware.d.ts +13 -10
  228. package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
  229. package/dist/rpc/RpcMiddleware.js +2 -2
  230. package/dist/rpc.d.ts +1 -1
  231. package/dist/rpc.d.ts.map +1 -1
  232. package/dist/rpc.js +2 -2
  233. package/dist/runtime.d.ts +19 -0
  234. package/dist/runtime.d.ts.map +1 -0
  235. package/dist/runtime.js +40 -0
  236. package/dist/setupRequest.d.ts +20 -0
  237. package/dist/setupRequest.d.ts.map +1 -0
  238. package/dist/setupRequest.js +72 -0
  239. package/dist/toast.d.ts +51 -0
  240. package/dist/toast.d.ts.map +1 -0
  241. package/dist/toast.js +34 -0
  242. package/dist/transform.d.ts +1 -1
  243. package/dist/transform.d.ts.map +1 -1
  244. package/dist/transform.js +4 -5
  245. package/dist/utils/effectify.d.ts +1 -1
  246. package/dist/utils/effectify.d.ts.map +1 -1
  247. package/dist/utils/effectify.js +2 -2
  248. package/dist/utils/extend.d.ts +6 -1
  249. package/dist/utils/extend.d.ts.map +1 -1
  250. package/dist/utils/extend.js +24 -6
  251. package/dist/utils/gen.d.ts +4 -4
  252. package/dist/utils/gen.d.ts.map +1 -1
  253. package/dist/utils/logLevel.d.ts +2 -2
  254. package/dist/utils/logLevel.d.ts.map +1 -1
  255. package/dist/utils/logger.d.ts +2 -1
  256. package/dist/utils/logger.d.ts.map +1 -1
  257. package/dist/utils/logger.js +2 -2
  258. package/dist/utils.d.ts +34 -45
  259. package/dist/utils.d.ts.map +1 -1
  260. package/dist/utils.js +33 -49
  261. package/dist/validation/validators.d.ts.map +1 -1
  262. package/dist/validation.d.ts.map +1 -1
  263. package/dist/withToast.d.ts +30 -0
  264. package/dist/withToast.d.ts.map +1 -0
  265. package/dist/withToast.js +64 -0
  266. package/package.json +25 -266
  267. package/src/Array.ts +7 -39
  268. package/src/Chunk.ts +6 -55
  269. package/src/Config/SecretURL.ts +6 -3
  270. package/src/Config/internal/configSecretURL.ts +2 -2
  271. package/src/Config.ts +6 -13
  272. package/src/ConfigProvider.ts +4 -47
  273. package/src/Context.ts +9 -8
  274. package/src/DataDependencies.ts +171 -0
  275. package/src/DateTime.ts +473 -0
  276. package/src/Effect.ts +10 -32
  277. package/src/Emailer.ts +51 -0
  278. package/src/Function.ts +0 -7
  279. package/src/Inputify.type.ts +1 -1
  280. package/src/Layer.ts +8 -5
  281. package/src/Model/Repository/Registry.ts +35 -0
  282. package/src/Model/Repository/dependency.ts +32 -0
  283. package/src/Model/Repository/ext.ts +374 -0
  284. package/src/Model/Repository/internal/internal.ts +987 -0
  285. package/src/Model/Repository/legacy.ts +29 -0
  286. package/src/Model/Repository/makeRepo.ts +168 -0
  287. package/src/Model/Repository/service.ts +676 -0
  288. package/src/Model/Repository/validation.ts +38 -0
  289. package/src/Model/Repository.ts +7 -0
  290. package/src/Model/dsl.ts +130 -0
  291. package/src/Model/filter/filterApi.ts +78 -0
  292. package/src/Model/filter/types/errors.ts +47 -0
  293. package/src/Model/filter/types/fields.ts +50 -0
  294. package/src/Model/filter/types/path/common.ts +404 -0
  295. package/src/Model/filter/types/path/eager.ts +329 -0
  296. package/src/Model/filter/types/path/index.ts +4 -0
  297. package/src/Model/filter/types/utils.ts +128 -0
  298. package/src/Model/filter/types/validator.ts +46 -0
  299. package/src/Model/filter/types.ts +6 -0
  300. package/src/Model/query/dsl.ts +3092 -0
  301. package/src/Model/query/new-kid-interpreter.ts +531 -0
  302. package/src/Model/query.ts +13 -0
  303. package/src/Model.ts +5 -0
  304. package/src/NonEmptySet.ts +6 -4
  305. package/src/Option.ts +3 -8
  306. package/src/Pure.ts +20 -17
  307. package/src/QueueMaker.ts +11 -0
  308. package/src/RequestContext.ts +48 -0
  309. package/src/RequestScopedDependencies.ts +45 -0
  310. package/src/Schema/Class.ts +550 -56
  311. package/src/Schema/SchemaParser.ts +12 -0
  312. package/src/Schema/SpecialJsonSchema.ts +75 -7
  313. package/src/Schema/SpecialOpenApi.ts +5 -5
  314. package/src/Schema/brand.ts +27 -12
  315. package/src/Schema/email.ts +9 -7
  316. package/src/Schema/ext.ts +405 -95
  317. package/src/Schema/moreStrings.ts +213 -88
  318. package/src/Schema/numbers.ts +107 -29
  319. package/src/Schema/phoneNumber.ts +8 -9
  320. package/src/Schema/schema.ts +1 -1
  321. package/src/Schema/strings.ts +23 -14
  322. package/src/Schema.ts +403 -46
  323. package/src/SchemaAST.ts +1 -0
  324. package/src/Set.ts +10 -5
  325. package/src/Store.ts +325 -0
  326. package/src/_ext/Array.ts +4 -2
  327. package/src/_ext/ord.ext.ts +2 -1
  328. package/src/builtin-json.d.ts +24 -0
  329. package/src/builtin.ts +16 -21
  330. package/src/client/InvalidationKeys.ts +55 -0
  331. package/src/client/apiClientFactory.ts +295 -129
  332. package/src/client/clientFor.ts +101 -33
  333. package/src/client/errors.ts +66 -20
  334. package/src/client/makeClient.ts +519 -60
  335. package/src/client.ts +6 -4
  336. package/src/http/Request.ts +4 -4
  337. package/src/http/internal/lib.ts +12 -12
  338. package/src/http.ts +1 -1
  339. package/src/ids.ts +45 -8
  340. package/src/index.ts +20 -16
  341. package/src/middleware.ts +12 -8
  342. package/src/migration/nativeEffect.ts +645 -0
  343. package/src/rpc/Invalidation.ts +278 -0
  344. package/src/rpc/MiddlewareMaker.ts +86 -79
  345. package/src/rpc/README.md +2 -2
  346. package/src/rpc/RpcContextMap.ts +4 -4
  347. package/src/rpc/RpcMiddleware.ts +18 -13
  348. package/src/rpc.ts +4 -4
  349. package/src/runtime.ts +57 -0
  350. package/src/setupRequest.ts +138 -0
  351. package/src/toast.ts +54 -0
  352. package/src/transform.ts +4 -4
  353. package/src/utils/effectify.ts +1 -1
  354. package/src/utils/extend.ts +24 -5
  355. package/src/utils/gen.ts +7 -7
  356. package/src/utils/logLevel.ts +1 -1
  357. package/src/utils/logger.ts +3 -2
  358. package/src/utils.ts +85 -175
  359. package/src/validation.ts +2 -2
  360. package/src/withToast.ts +133 -0
  361. package/test/dateTimeLocal.test.ts +55 -0
  362. package/test/dist/dateTimeLocal.test.d.ts.map +1 -0
  363. package/test/dist/nativeEffectMigration.test.d.ts.map +1 -0
  364. package/test/dist/rpc.test.d.ts.map +1 -1
  365. package/test/dist/rpcMiddlewareContext.test.d.ts.map +1 -0
  366. package/test/moreStrings.test.ts +55 -10
  367. package/test/nativeEffectMigration.test.ts +77 -0
  368. package/test/rpc.test.ts +28 -11
  369. package/test/rpcMiddlewareContext.test.ts +63 -0
  370. package/test/schema.test.ts +318 -55
  371. package/test/secretURL.test.ts +4 -1
  372. package/test/special.test.ts +663 -131
  373. package/test/utils.test.ts +5 -5
  374. package/tsconfig.base.json +6 -4
  375. package/tsconfig.json +9 -1
  376. package/tsconfig.src.json +29 -29
  377. package/tsconfig.test.json +2 -2
  378. package/dist/Operations.d.ts +0 -124
  379. package/dist/Operations.d.ts.map +0 -1
  380. package/dist/Operations.js +0 -29
  381. package/dist/_ext/date.d.ts +0 -15
  382. package/dist/_ext/date.d.ts.map +0 -1
  383. package/dist/_ext/date.js +0 -16
  384. package/dist/_ext/misc.d.ts +0 -14
  385. package/dist/_ext/misc.d.ts.map +0 -1
  386. package/dist/_ext/misc.js +0 -17
  387. package/eslint.config.mjs +0 -26
  388. package/src/Operations.ts +0 -55
  389. package/src/_ext/date.ts +0 -27
  390. package/src/_ext/misc.ts +0 -46
  391. package/tsconfig.json.bak +0 -12
@@ -0,0 +1,171 @@
1
+ import type { NonEmptyReadonlyArray } from "effect/Array"
2
+ import * as Ref from "effect/Ref"
3
+ import * as Stream from "effect/Stream"
4
+ import * as Context from "./Context.ts"
5
+ import * as Effect from "./Effect.ts"
6
+ import * as RequestScopedDependencies from "./RequestScopedDependencies.ts"
7
+ import * as S from "./Schema.ts"
8
+
9
+ export const DataDependency = S.Union([
10
+ S.Struct({
11
+ type: S.Literal("repo"),
12
+ name: S.String,
13
+ ids: S.optional(S.NonEmptyArray(S.String))
14
+ }),
15
+ S.Struct({
16
+ type: S.Literal("signal"),
17
+ name: S.String,
18
+ ids: S.optional(S.NonEmptyArray(S.String))
19
+ })
20
+ ])
21
+ export type DataDependency = S.Schema.Type<typeof DataDependency>
22
+
23
+ export const DataDependencies = S.ReadonlySet(DataDependency)
24
+ export type DataDependencies = S.Schema.Type<typeof DataDependencies>
25
+
26
+ export const empty = (): DataDependencies => new Set()
27
+
28
+ export const DataDependencySet = S.Struct({
29
+ reads: DataDependencies,
30
+ writes: DataDependencies
31
+ })
32
+ export type DataDependencySet = S.Schema.Type<typeof DataDependencySet>
33
+
34
+ export interface DataDependencyRecorderService {
35
+ readonly read: (dependency: DataDependency) => Effect.Effect<void>
36
+ readonly write: (dependency: DataDependency) => Effect.Effect<void>
37
+ readonly get: Effect.Effect<DataDependencySet>
38
+ readonly drain: Effect.Effect<DataDependencySet>
39
+ readonly drainWrites: Effect.Effect<DataDependencies>
40
+ }
41
+
42
+ const sameDomain = (a: DataDependency, b: DataDependency) => a.type === b.type && a.name === b.name
43
+
44
+ const dependenciesOverlap = (a: DataDependency, b: DataDependency) => {
45
+ if (!sameDomain(a, b)) return false
46
+ if (a.ids === undefined || b.ids === undefined) return true
47
+ return a.ids.some((id) => b.ids?.includes(id))
48
+ }
49
+
50
+ const containsDependency = (dependencies: ReadonlySet<DataDependency>, dependency: DataDependency) => {
51
+ for (const _ of dependencies) {
52
+ if (dependenciesOverlap(_, dependency)) return true
53
+ }
54
+ return false
55
+ }
56
+
57
+ const appendDependency = (dependency: DataDependency) => (dependencies: DataDependencies): DataDependencies => {
58
+ const existing = [...dependencies].find((_) => sameDomain(_, dependency))
59
+ if (existing === undefined) return new Set([...dependencies, dependency])
60
+ if (existing.ids === undefined) return dependencies
61
+ if (dependency.ids === undefined) {
62
+ return new Set([...dependencies].filter((_) => _ !== existing).concat(dependency))
63
+ }
64
+ const first = existing.ids[0]
65
+ const ids: NonEmptyReadonlyArray<string> = [
66
+ first,
67
+ ...new Set([...existing.ids.slice(1), ...dependency.ids].filter((id) => id !== first))
68
+ ]
69
+ if (ids.length === existing.ids.length) return dependencies
70
+ const merged = existing.type === "repo" ? repo(existing.name, ids) : signal(existing.name, ids)
71
+ return new Set([...dependencies].filter((_) => _ !== existing).concat(merged))
72
+ }
73
+
74
+ export const merge = (...groups: ReadonlyArray<DataDependencies>): DataDependencies => {
75
+ let merged = empty()
76
+ for (const group of groups) {
77
+ for (const dependency of group) merged = appendDependency(dependency)(merged)
78
+ }
79
+ return merged
80
+ }
81
+
82
+ export const DataDependencyRecorder = RequestScopedDependencies.make(
83
+ "effect-app/DataDependencyRecorder",
84
+ Effect.gen(function*() {
85
+ const readsRef = yield* Ref.make(empty())
86
+ const writesRef = yield* Ref.make(empty())
87
+ return makeDataDependencyRecorder(readsRef, writesRef)
88
+ })
89
+ )
90
+ export type DataDependencyRecorder = typeof DataDependencyRecorder
91
+
92
+ export type DataDependencyRecorderNotStartedError = RequestScopedDependencies.RequestScopedDependencyNotStartedError
93
+
94
+ export const getDataDependencyRecorder = DataDependencyRecorder.current
95
+
96
+ /**
97
+ * Guarantee a recorder is in scope for `self`, providing a fresh one per request when none is
98
+ * (e.g. a top-level client call with no parent query/command tracking its dependencies). An
99
+ * existing recorder is inherited, so nested calls forward into their parent rather than shadow it.
100
+ */
101
+ export const ensureDataDependencyRecorder = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
102
+ Effect.flatMap(
103
+ DataDependencyRecorder,
104
+ (current) => current === "root" ? Effect.provide(self, DataDependencyRecorder.layer) : self
105
+ )
106
+
107
+ /** Stream variant of {@link ensureDataDependencyRecorder}. */
108
+ export const ensureDataDependencyRecorderStream = <A, E, R>(self: Stream.Stream<A, E, R>): Stream.Stream<A, E, R> =>
109
+ Stream.unwrap(
110
+ Effect.map(
111
+ DataDependencyRecorder,
112
+ (current) => current === "root" ? Stream.provide(self, DataDependencyRecorder.layer) : self
113
+ )
114
+ )
115
+
116
+ export const makeDataDependencyRecorder = (
117
+ readsRef: Ref.Ref<DataDependencies>,
118
+ writesRef: Ref.Ref<DataDependencies>
119
+ ): DataDependencyRecorderService => ({
120
+ read: (dependency) => Ref.update(readsRef, appendDependency(dependency)),
121
+ write: (dependency) => Ref.update(writesRef, appendDependency(dependency)),
122
+ get: Effect.all({
123
+ reads: Ref.get(readsRef),
124
+ writes: Ref.get(writesRef)
125
+ }),
126
+ drain: Effect.all({
127
+ reads: Ref.getAndSet(readsRef, empty()),
128
+ writes: Ref.getAndSet(writesRef, empty())
129
+ }),
130
+ drainWrites: Ref.getAndSet(writesRef, empty())
131
+ })
132
+
133
+ export const repo = (name: string, ids?: NonEmptyReadonlyArray<string>): DataDependency =>
134
+ ids === undefined ? { type: "repo", name } : { type: "repo", name, ids }
135
+ export const signal = (name: string, ids?: NonEmptyReadonlyArray<string>): DataDependency =>
136
+ ids === undefined ? { type: "signal", name } : { type: "signal", name, ids }
137
+
138
+ const RepoReadScope = Context.Reference<DataDependency | undefined>("effect-app/DataDependencies/RepoReadScope", {
139
+ defaultValue: () => undefined
140
+ })
141
+
142
+ export const readRepo = (name: string) =>
143
+ Effect.flatMap(
144
+ RepoReadScope,
145
+ (scope) => read(scope?.type === "repo" && scope.name === name ? scope : repo(name))
146
+ )
147
+
148
+ export const withRepoReadScope =
149
+ (name: string, ids: NonEmptyReadonlyArray<string>) =>
150
+ <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
151
+ Effect.provideService(self, RepoReadScope, repo(name, ids))
152
+
153
+ export const QueryReadDependenciesMetaKey = "effect-app.query.readDependencies"
154
+
155
+ export const read = (dependency: DataDependency) =>
156
+ getDataDependencyRecorder.pipe(Effect.flatMap((_) => _.read(dependency)))
157
+
158
+ export const write = (dependency: DataDependency) =>
159
+ getDataDependencyRecorder.pipe(Effect.flatMap((_) => _.write(dependency)))
160
+
161
+ export const intersects = (
162
+ a: ReadonlySet<DataDependency>,
163
+ b: ReadonlySet<DataDependency>
164
+ ) => {
165
+ for (const dependency of a) {
166
+ if (containsDependency(b, dependency)) return true
167
+ }
168
+ return false
169
+ }
170
+
171
+ export const isNonEmpty = (dependencies: DataDependencies) => dependencies.size > 0
@@ -0,0 +1,473 @@
1
+ import * as DateTime from "effect/DateTime"
2
+
3
+ /**
4
+ * The same instant as `date`, zoned with the process timezone.
5
+ *
6
+ * A JavaScript `Date` stores no zone. This attaches `DateTime.zoneMakeLocal()` without moving the instant.
7
+ */
8
+ export const makeZonedLocal = (date: Date): DateTime.Zoned =>
9
+ DateTime.makeZonedUnsafe(date, { timeZone: DateTime.zoneMakeLocal() })
10
+
11
+ /**
12
+ * Zones `date` with the process timezone, runs the functions, then returns the instant with `DateTime.toDateUtc`.
13
+ *
14
+ * Accepts as many functions as `pipe`. The last function must return a `DateTime`. Calendar parts follow the process timezone, as `Date#setDate` does.
15
+ */
16
+ export function pipeZonedLocal(date: Date): Date
17
+ export function pipeZonedLocal<A extends DateTime.DateTime = never>(
18
+ date: Date,
19
+ ab: (self: DateTime.Zoned) => A
20
+ ): Date
21
+ export function pipeZonedLocal<A = never, B extends DateTime.DateTime = never>(
22
+ date: Date,
23
+ ab: (self: DateTime.Zoned) => A,
24
+ bc: (a: A) => B
25
+ ): Date
26
+ export function pipeZonedLocal<A = never, B = never, C extends DateTime.DateTime = never>(
27
+ date: Date,
28
+ ab: (self: DateTime.Zoned) => A,
29
+ bc: (a: A) => B,
30
+ cd: (b: B) => C
31
+ ): Date
32
+ export function pipeZonedLocal<
33
+ A = never,
34
+ B = never,
35
+ C = never,
36
+ D extends DateTime.DateTime = never
37
+ >(
38
+ date: Date,
39
+ ab: (self: DateTime.Zoned) => A,
40
+ bc: (a: A) => B,
41
+ cd: (b: B) => C,
42
+ de: (c: C) => D
43
+ ): Date
44
+ export function pipeZonedLocal<
45
+ A = never,
46
+ B = never,
47
+ C = never,
48
+ D = never,
49
+ E extends DateTime.DateTime = never
50
+ >(
51
+ date: Date,
52
+ ab: (self: DateTime.Zoned) => A,
53
+ bc: (a: A) => B,
54
+ cd: (b: B) => C,
55
+ de: (c: C) => D,
56
+ ef: (d: D) => E
57
+ ): Date
58
+ export function pipeZonedLocal<
59
+ A = never,
60
+ B = never,
61
+ C = never,
62
+ D = never,
63
+ E = never,
64
+ F extends DateTime.DateTime = never
65
+ >(
66
+ date: Date,
67
+ ab: (self: DateTime.Zoned) => A,
68
+ bc: (a: A) => B,
69
+ cd: (b: B) => C,
70
+ de: (c: C) => D,
71
+ ef: (d: D) => E,
72
+ fg: (e: E) => F
73
+ ): Date
74
+ export function pipeZonedLocal<
75
+ A = never,
76
+ B = never,
77
+ C = never,
78
+ D = never,
79
+ E = never,
80
+ F = never,
81
+ G extends DateTime.DateTime = never
82
+ >(
83
+ date: Date,
84
+ ab: (self: DateTime.Zoned) => A,
85
+ bc: (a: A) => B,
86
+ cd: (b: B) => C,
87
+ de: (c: C) => D,
88
+ ef: (d: D) => E,
89
+ fg: (e: E) => F,
90
+ gh: (f: F) => G
91
+ ): Date
92
+ export function pipeZonedLocal<
93
+ A = never,
94
+ B = never,
95
+ C = never,
96
+ D = never,
97
+ E = never,
98
+ F = never,
99
+ G = never,
100
+ H extends DateTime.DateTime = never
101
+ >(
102
+ date: Date,
103
+ ab: (self: DateTime.Zoned) => A,
104
+ bc: (a: A) => B,
105
+ cd: (b: B) => C,
106
+ de: (c: C) => D,
107
+ ef: (d: D) => E,
108
+ fg: (e: E) => F,
109
+ gh: (f: F) => G,
110
+ hi: (g: G) => H
111
+ ): Date
112
+ export function pipeZonedLocal<
113
+ A = never,
114
+ B = never,
115
+ C = never,
116
+ D = never,
117
+ E = never,
118
+ F = never,
119
+ G = never,
120
+ H = never,
121
+ I extends DateTime.DateTime = never
122
+ >(
123
+ date: Date,
124
+ ab: (self: DateTime.Zoned) => A,
125
+ bc: (a: A) => B,
126
+ cd: (b: B) => C,
127
+ de: (c: C) => D,
128
+ ef: (d: D) => E,
129
+ fg: (e: E) => F,
130
+ gh: (f: F) => G,
131
+ hi: (g: G) => H,
132
+ ij: (h: H) => I
133
+ ): Date
134
+ export function pipeZonedLocal<
135
+ A = never,
136
+ B = never,
137
+ C = never,
138
+ D = never,
139
+ E = never,
140
+ F = never,
141
+ G = never,
142
+ H = never,
143
+ I = never,
144
+ J extends DateTime.DateTime = never
145
+ >(
146
+ date: Date,
147
+ ab: (self: DateTime.Zoned) => A,
148
+ bc: (a: A) => B,
149
+ cd: (b: B) => C,
150
+ de: (c: C) => D,
151
+ ef: (d: D) => E,
152
+ fg: (e: E) => F,
153
+ gh: (f: F) => G,
154
+ hi: (g: G) => H,
155
+ ij: (h: H) => I,
156
+ jk: (i: I) => J
157
+ ): Date
158
+ export function pipeZonedLocal<
159
+ A = never,
160
+ B = never,
161
+ C = never,
162
+ D = never,
163
+ E = never,
164
+ F = never,
165
+ G = never,
166
+ H = never,
167
+ I = never,
168
+ J = never,
169
+ K extends DateTime.DateTime = never
170
+ >(
171
+ date: Date,
172
+ ab: (self: DateTime.Zoned) => A,
173
+ bc: (a: A) => B,
174
+ cd: (b: B) => C,
175
+ de: (c: C) => D,
176
+ ef: (d: D) => E,
177
+ fg: (e: E) => F,
178
+ gh: (f: F) => G,
179
+ hi: (g: G) => H,
180
+ ij: (h: H) => I,
181
+ jk: (i: I) => J,
182
+ kl: (j: J) => K
183
+ ): Date
184
+ export function pipeZonedLocal<
185
+ A = never,
186
+ B = never,
187
+ C = never,
188
+ D = never,
189
+ E = never,
190
+ F = never,
191
+ G = never,
192
+ H = never,
193
+ I = never,
194
+ J = never,
195
+ K = never,
196
+ L extends DateTime.DateTime = never
197
+ >(
198
+ date: Date,
199
+ ab: (self: DateTime.Zoned) => A,
200
+ bc: (a: A) => B,
201
+ cd: (b: B) => C,
202
+ de: (c: C) => D,
203
+ ef: (d: D) => E,
204
+ fg: (e: E) => F,
205
+ gh: (f: F) => G,
206
+ hi: (g: G) => H,
207
+ ij: (h: H) => I,
208
+ jk: (i: I) => J,
209
+ kl: (j: J) => K,
210
+ lm: (k: K) => L
211
+ ): Date
212
+ export function pipeZonedLocal<
213
+ A = never,
214
+ B = never,
215
+ C = never,
216
+ D = never,
217
+ E = never,
218
+ F = never,
219
+ G = never,
220
+ H = never,
221
+ I = never,
222
+ J = never,
223
+ K = never,
224
+ L = never,
225
+ M extends DateTime.DateTime = never
226
+ >(
227
+ date: Date,
228
+ ab: (self: DateTime.Zoned) => A,
229
+ bc: (a: A) => B,
230
+ cd: (b: B) => C,
231
+ de: (c: C) => D,
232
+ ef: (d: D) => E,
233
+ fg: (e: E) => F,
234
+ gh: (f: F) => G,
235
+ hi: (g: G) => H,
236
+ ij: (h: H) => I,
237
+ jk: (i: I) => J,
238
+ kl: (j: J) => K,
239
+ lm: (k: K) => L,
240
+ mn: (l: L) => M
241
+ ): Date
242
+ export function pipeZonedLocal<
243
+ A = never,
244
+ B = never,
245
+ C = never,
246
+ D = never,
247
+ E = never,
248
+ F = never,
249
+ G = never,
250
+ H = never,
251
+ I = never,
252
+ J = never,
253
+ K = never,
254
+ L = never,
255
+ M = never,
256
+ N extends DateTime.DateTime = never
257
+ >(
258
+ date: Date,
259
+ ab: (self: DateTime.Zoned) => A,
260
+ bc: (a: A) => B,
261
+ cd: (b: B) => C,
262
+ de: (c: C) => D,
263
+ ef: (d: D) => E,
264
+ fg: (e: E) => F,
265
+ gh: (f: F) => G,
266
+ hi: (g: G) => H,
267
+ ij: (h: H) => I,
268
+ jk: (i: I) => J,
269
+ kl: (j: J) => K,
270
+ lm: (k: K) => L,
271
+ mn: (l: L) => M,
272
+ no: (m: M) => N
273
+ ): Date
274
+ export function pipeZonedLocal<
275
+ A = never,
276
+ B = never,
277
+ C = never,
278
+ D = never,
279
+ E = never,
280
+ F = never,
281
+ G = never,
282
+ H = never,
283
+ I = never,
284
+ J = never,
285
+ K = never,
286
+ L = never,
287
+ M = never,
288
+ N = never,
289
+ O extends DateTime.DateTime = never
290
+ >(
291
+ date: Date,
292
+ ab: (self: DateTime.Zoned) => A,
293
+ bc: (a: A) => B,
294
+ cd: (b: B) => C,
295
+ de: (c: C) => D,
296
+ ef: (d: D) => E,
297
+ fg: (e: E) => F,
298
+ gh: (f: F) => G,
299
+ hi: (g: G) => H,
300
+ ij: (h: H) => I,
301
+ jk: (i: I) => J,
302
+ kl: (j: J) => K,
303
+ lm: (k: K) => L,
304
+ mn: (l: L) => M,
305
+ no: (m: M) => N,
306
+ op: (n: N) => O
307
+ ): Date
308
+ export function pipeZonedLocal<
309
+ A = never,
310
+ B = never,
311
+ C = never,
312
+ D = never,
313
+ E = never,
314
+ F = never,
315
+ G = never,
316
+ H = never,
317
+ I = never,
318
+ J = never,
319
+ K = never,
320
+ L = never,
321
+ M = never,
322
+ N = never,
323
+ O = never,
324
+ P extends DateTime.DateTime = never
325
+ >(
326
+ date: Date,
327
+ ab: (self: DateTime.Zoned) => A,
328
+ bc: (a: A) => B,
329
+ cd: (b: B) => C,
330
+ de: (c: C) => D,
331
+ ef: (d: D) => E,
332
+ fg: (e: E) => F,
333
+ gh: (f: F) => G,
334
+ hi: (g: G) => H,
335
+ ij: (h: H) => I,
336
+ jk: (i: I) => J,
337
+ kl: (j: J) => K,
338
+ lm: (k: K) => L,
339
+ mn: (l: L) => M,
340
+ no: (m: M) => N,
341
+ op: (n: N) => O,
342
+ pq: (o: O) => P
343
+ ): Date
344
+ export function pipeZonedLocal<
345
+ A = never,
346
+ B = never,
347
+ C = never,
348
+ D = never,
349
+ E = never,
350
+ F = never,
351
+ G = never,
352
+ H = never,
353
+ I = never,
354
+ J = never,
355
+ K = never,
356
+ L = never,
357
+ M = never,
358
+ N = never,
359
+ O = never,
360
+ P = never,
361
+ Q extends DateTime.DateTime = never
362
+ >(
363
+ date: Date,
364
+ ab: (self: DateTime.Zoned) => A,
365
+ bc: (a: A) => B,
366
+ cd: (b: B) => C,
367
+ de: (c: C) => D,
368
+ ef: (d: D) => E,
369
+ fg: (e: E) => F,
370
+ gh: (f: F) => G,
371
+ hi: (g: G) => H,
372
+ ij: (h: H) => I,
373
+ jk: (i: I) => J,
374
+ kl: (j: J) => K,
375
+ lm: (k: K) => L,
376
+ mn: (l: L) => M,
377
+ no: (m: M) => N,
378
+ op: (n: N) => O,
379
+ pq: (o: O) => P,
380
+ qr: (p: P) => Q
381
+ ): Date
382
+ export function pipeZonedLocal<
383
+ A = never,
384
+ B = never,
385
+ C = never,
386
+ D = never,
387
+ E = never,
388
+ F = never,
389
+ G = never,
390
+ H = never,
391
+ I = never,
392
+ J = never,
393
+ K = never,
394
+ L = never,
395
+ M = never,
396
+ N = never,
397
+ O = never,
398
+ P = never,
399
+ Q = never,
400
+ R extends DateTime.DateTime = never
401
+ >(
402
+ date: Date,
403
+ ab: (self: DateTime.Zoned) => A,
404
+ bc: (a: A) => B,
405
+ cd: (b: B) => C,
406
+ de: (c: C) => D,
407
+ ef: (d: D) => E,
408
+ fg: (e: E) => F,
409
+ gh: (f: F) => G,
410
+ hi: (g: G) => H,
411
+ ij: (h: H) => I,
412
+ jk: (i: I) => J,
413
+ kl: (j: J) => K,
414
+ lm: (k: K) => L,
415
+ mn: (l: L) => M,
416
+ no: (m: M) => N,
417
+ op: (n: N) => O,
418
+ pq: (o: O) => P,
419
+ qr: (p: P) => Q,
420
+ rs: (q: Q) => R
421
+ ): Date
422
+ export function pipeZonedLocal<
423
+ A = never,
424
+ B = never,
425
+ C = never,
426
+ D = never,
427
+ E = never,
428
+ F = never,
429
+ G = never,
430
+ H = never,
431
+ I = never,
432
+ J = never,
433
+ K = never,
434
+ L = never,
435
+ M = never,
436
+ N = never,
437
+ O = never,
438
+ P = never,
439
+ Q = never,
440
+ R = never,
441
+ S extends DateTime.DateTime = never
442
+ >(
443
+ date: Date,
444
+ ab: (self: DateTime.Zoned) => A,
445
+ bc: (a: A) => B,
446
+ cd: (b: B) => C,
447
+ de: (c: C) => D,
448
+ ef: (d: D) => E,
449
+ fg: (e: E) => F,
450
+ gh: (f: F) => G,
451
+ hi: (g: G) => H,
452
+ ij: (h: H) => I,
453
+ jk: (i: I) => J,
454
+ kl: (j: J) => K,
455
+ lm: (k: K) => L,
456
+ mn: (l: L) => M,
457
+ no: (m: M) => N,
458
+ op: (n: N) => O,
459
+ pq: (o: O) => P,
460
+ qr: (p: P) => Q,
461
+ rs: (q: Q) => R,
462
+ st: (r: R) => S
463
+ ): Date
464
+ export function pipeZonedLocal(date: Date, ...steps: ReadonlyArray<(value: any) => any>): Date {
465
+ let current: unknown = makeZonedLocal(date)
466
+ for (const step of steps) {
467
+ current = step(current)
468
+ }
469
+ if (!DateTime.isDateTime(current)) {
470
+ throw new TypeError("pipeZonedLocal must finish on a DateTime")
471
+ }
472
+ return DateTime.toDateUtc(current)
473
+ }