effect 4.0.3 → 4.0.5

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 (449) hide show
  1. package/AGENTS.md +24 -0
  2. package/CLAUDE.md +24 -0
  3. package/ai-docs/package.json +2 -2
  4. package/ai-docs/src/52_graphql/10_basics.ts +117 -0
  5. package/ai-docs/src/52_graphql/20_testing.ts +45 -0
  6. package/ai-docs/src/52_graphql/30_batching.ts +118 -0
  7. package/ai-docs/src/52_graphql/40_aliased-batching.ts +124 -0
  8. package/ai-docs/src/52_graphql/50_errors-and-retries.ts +74 -0
  9. package/ai-docs/src/52_graphql/index.md +6 -0
  10. package/dist/Array.d.ts +90 -6
  11. package/dist/Array.d.ts.map +1 -1
  12. package/dist/Array.js +4 -2
  13. package/dist/Array.js.map +1 -1
  14. package/dist/Channel.d.ts +6 -1
  15. package/dist/Channel.d.ts.map +1 -1
  16. package/dist/Channel.js +17 -3
  17. package/dist/Channel.js.map +1 -1
  18. package/dist/ConfigProvider.d.ts.map +1 -1
  19. package/dist/ConfigProvider.js +33 -32
  20. package/dist/ConfigProvider.js.map +1 -1
  21. package/dist/Context.d.ts.map +1 -1
  22. package/dist/Context.js +9 -0
  23. package/dist/Context.js.map +1 -1
  24. package/dist/Duration.d.ts.map +1 -1
  25. package/dist/Duration.js +2 -5
  26. package/dist/Duration.js.map +1 -1
  27. package/dist/Effect.d.ts +61 -19
  28. package/dist/Effect.d.ts.map +1 -1
  29. package/dist/Effect.js +58 -39
  30. package/dist/Effect.js.map +1 -1
  31. package/dist/FileSystem.d.ts +23 -9
  32. package/dist/FileSystem.d.ts.map +1 -1
  33. package/dist/FileSystem.js.map +1 -1
  34. package/dist/Match.d.ts +20 -6
  35. package/dist/Match.d.ts.map +1 -1
  36. package/dist/Match.js +2 -2
  37. package/dist/Match.js.map +1 -1
  38. package/dist/Path.d.ts +37 -5
  39. package/dist/Path.d.ts.map +1 -1
  40. package/dist/Path.js +36 -5
  41. package/dist/Path.js.map +1 -1
  42. package/dist/RequestResolver.d.ts.map +1 -1
  43. package/dist/RequestResolver.js +4 -10
  44. package/dist/RequestResolver.js.map +1 -1
  45. package/dist/Scheduler.d.ts +9 -0
  46. package/dist/Scheduler.d.ts.map +1 -1
  47. package/dist/Scheduler.js +9 -0
  48. package/dist/Scheduler.js.map +1 -1
  49. package/dist/Schema.d.ts +15 -2
  50. package/dist/Schema.d.ts.map +1 -1
  51. package/dist/Schema.js +16 -2
  52. package/dist/Schema.js.map +1 -1
  53. package/dist/SchemaGetter.d.ts +4 -0
  54. package/dist/SchemaGetter.d.ts.map +1 -1
  55. package/dist/SchemaGetter.js +52 -33
  56. package/dist/SchemaGetter.js.map +1 -1
  57. package/dist/Sink.d.ts.map +1 -1
  58. package/dist/Sink.js +38 -17
  59. package/dist/Sink.js.map +1 -1
  60. package/dist/Stream.d.ts +11 -0
  61. package/dist/Stream.d.ts.map +1 -1
  62. package/dist/Stream.js +16 -1
  63. package/dist/Stream.js.map +1 -1
  64. package/dist/String.d.ts +12 -0
  65. package/dist/String.d.ts.map +1 -1
  66. package/dist/String.js +17 -4
  67. package/dist/String.js.map +1 -1
  68. package/dist/TxRef.d.ts.map +1 -1
  69. package/dist/TxRef.js +3 -2
  70. package/dist/TxRef.js.map +1 -1
  71. package/dist/Utils.js +8 -3
  72. package/dist/Utils.js.map +1 -1
  73. package/dist/ai/AiError.d.ts +10 -10
  74. package/dist/ai/AiError.d.ts.map +1 -1
  75. package/dist/ai/AiError.js +1 -1
  76. package/dist/ai/AiError.js.map +1 -1
  77. package/dist/ai/AnthropicStructuredOutput.js +0 -2
  78. package/dist/ai/AnthropicStructuredOutput.js.map +1 -1
  79. package/dist/ai/Chat.d.ts +2 -2
  80. package/dist/ai/Chat.d.ts.map +1 -1
  81. package/dist/ai/Decision.d.ts +70 -19
  82. package/dist/ai/Decision.d.ts.map +1 -1
  83. package/dist/ai/Decision.js +37 -3
  84. package/dist/ai/Decision.js.map +1 -1
  85. package/dist/ai/DecisionModel.js +1 -1
  86. package/dist/ai/DecisionModel.js.map +1 -1
  87. package/dist/ai/LanguageModel.d.ts +38 -7
  88. package/dist/ai/LanguageModel.d.ts.map +1 -1
  89. package/dist/ai/LanguageModel.js +70 -40
  90. package/dist/ai/LanguageModel.js.map +1 -1
  91. package/dist/ai/McpServer.d.ts +61 -52
  92. package/dist/ai/McpServer.d.ts.map +1 -1
  93. package/dist/ai/McpServer.js +134 -50
  94. package/dist/ai/McpServer.js.map +1 -1
  95. package/dist/ai/Prompt.d.ts.map +1 -1
  96. package/dist/ai/Prompt.js +28 -5
  97. package/dist/ai/Prompt.js.map +1 -1
  98. package/dist/ai/Response.d.ts +5 -4
  99. package/dist/ai/Response.d.ts.map +1 -1
  100. package/dist/ai/Response.js.map +1 -1
  101. package/dist/cli/Completions.d.ts +5 -0
  102. package/dist/cli/Completions.d.ts.map +1 -1
  103. package/dist/cli/Completions.js.map +1 -1
  104. package/dist/cli/Flag.d.ts +100 -0
  105. package/dist/cli/Flag.d.ts.map +1 -1
  106. package/dist/cli/Flag.js +33 -0
  107. package/dist/cli/Flag.js.map +1 -1
  108. package/dist/cli/Param.d.ts +87 -0
  109. package/dist/cli/Param.d.ts.map +1 -1
  110. package/dist/cli/Param.js +30 -0
  111. package/dist/cli/Param.js.map +1 -1
  112. package/dist/cli/internal/command.d.ts.map +1 -1
  113. package/dist/cli/internal/command.js +2 -1
  114. package/dist/cli/internal/command.js.map +1 -1
  115. package/dist/cli/internal/completions/bash.js +4 -3
  116. package/dist/cli/internal/completions/bash.js.map +1 -1
  117. package/dist/cli/internal/completions/descriptor.js +8 -1
  118. package/dist/cli/internal/completions/descriptor.js.map +1 -1
  119. package/dist/cli/internal/completions/fish.js +4 -4
  120. package/dist/cli/internal/completions/fish.js.map +1 -1
  121. package/dist/cli/internal/completions/powershell.js +3 -2
  122. package/dist/cli/internal/completions/powershell.js.map +1 -1
  123. package/dist/cli/internal/completions/zsh.js +7 -3
  124. package/dist/cli/internal/completions/zsh.js.map +1 -1
  125. package/dist/cli/internal/parser.js +11 -3
  126. package/dist/cli/internal/parser.js.map +1 -1
  127. package/dist/cli/internal/wizard.d.ts.map +1 -1
  128. package/dist/cli/internal/wizard.js +2 -1
  129. package/dist/cli/internal/wizard.js.map +1 -1
  130. package/dist/cluster/ClusterWorkflowEngine.d.ts +1 -0
  131. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  132. package/dist/cluster/ClusterWorkflowEngine.js +113 -21
  133. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  134. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  135. package/dist/cluster/MessageStorage.js +20 -12
  136. package/dist/cluster/MessageStorage.js.map +1 -1
  137. package/dist/cluster/Runners.d.ts.map +1 -1
  138. package/dist/cluster/Runners.js +54 -34
  139. package/dist/cluster/Runners.js.map +1 -1
  140. package/dist/cluster/Sharding.d.ts.map +1 -1
  141. package/dist/cluster/Sharding.js +6 -4
  142. package/dist/cluster/Sharding.js.map +1 -1
  143. package/dist/cluster/internal/entityManager.js +1 -1
  144. package/dist/cluster/internal/entityManager.js.map +1 -1
  145. package/dist/encoding/Sse.d.ts +6 -0
  146. package/dist/encoding/Sse.d.ts.map +1 -1
  147. package/dist/encoding/Sse.js +63 -71
  148. package/dist/encoding/Sse.js.map +1 -1
  149. package/dist/graphql/GraphQL.d.ts +349 -0
  150. package/dist/graphql/GraphQL.d.ts.map +1 -0
  151. package/dist/graphql/GraphQL.js +207 -0
  152. package/dist/graphql/GraphQL.js.map +1 -0
  153. package/dist/graphql/GraphQLClient.d.ts +562 -0
  154. package/dist/graphql/GraphQLClient.d.ts.map +1 -0
  155. package/dist/graphql/GraphQLClient.js +505 -0
  156. package/dist/graphql/GraphQLClient.js.map +1 -0
  157. package/dist/graphql/GraphQLClientError.d.ts +445 -0
  158. package/dist/graphql/GraphQLClientError.d.ts.map +1 -0
  159. package/dist/graphql/GraphQLClientError.js +479 -0
  160. package/dist/graphql/GraphQLClientError.js.map +1 -0
  161. package/dist/graphql/GraphQLGroup.d.ts +118 -0
  162. package/dist/graphql/GraphQLGroup.d.ts.map +1 -0
  163. package/dist/graphql/GraphQLGroup.js +109 -0
  164. package/dist/graphql/GraphQLGroup.js.map +1 -0
  165. package/dist/graphql/GraphQLMiddleware.d.ts +249 -0
  166. package/dist/graphql/GraphQLMiddleware.d.ts.map +1 -0
  167. package/dist/graphql/GraphQLMiddleware.js +130 -0
  168. package/dist/graphql/GraphQLMiddleware.js.map +1 -0
  169. package/dist/graphql/GraphQLProtocol.d.ts +969 -0
  170. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -0
  171. package/dist/graphql/GraphQLProtocol.js +809 -0
  172. package/dist/graphql/GraphQLProtocol.js.map +1 -0
  173. package/dist/graphql/GraphQLResolver.d.ts +453 -0
  174. package/dist/graphql/GraphQLResolver.d.ts.map +1 -0
  175. package/dist/graphql/GraphQLResolver.js +582 -0
  176. package/dist/graphql/GraphQLResolver.js.map +1 -0
  177. package/dist/graphql/index.d.ts +40 -0
  178. package/dist/graphql/index.d.ts.map +1 -0
  179. package/dist/graphql/index.js +41 -0
  180. package/dist/graphql/index.js.map +1 -0
  181. package/dist/http/FetchHttpClient.d.ts +6 -3
  182. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  183. package/dist/http/FetchHttpClient.js +6 -3
  184. package/dist/http/FetchHttpClient.js.map +1 -1
  185. package/dist/http/FindMyWay/internal/router.js +2 -1
  186. package/dist/http/FindMyWay/internal/router.js.map +1 -1
  187. package/dist/http/Headers.d.ts +3 -3
  188. package/dist/http/Headers.d.ts.map +1 -1
  189. package/dist/http/Headers.js +6 -5
  190. package/dist/http/Headers.js.map +1 -1
  191. package/dist/http/HttpClient.d.ts +27 -0
  192. package/dist/http/HttpClient.d.ts.map +1 -1
  193. package/dist/http/HttpClient.js +38 -11
  194. package/dist/http/HttpClient.js.map +1 -1
  195. package/dist/http/HttpClientError.d.ts.map +1 -1
  196. package/dist/http/HttpClientError.js +8 -6
  197. package/dist/http/HttpClientError.js.map +1 -1
  198. package/dist/http/HttpClientRequest.d.ts +147 -4
  199. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  200. package/dist/http/HttpClientRequest.js +47 -1
  201. package/dist/http/HttpClientRequest.js.map +1 -1
  202. package/dist/http/HttpEffect.d.ts.map +1 -1
  203. package/dist/http/HttpEffect.js +14 -7
  204. package/dist/http/HttpEffect.js.map +1 -1
  205. package/dist/http/HttpMiddleware.d.ts +60 -0
  206. package/dist/http/HttpMiddleware.d.ts.map +1 -1
  207. package/dist/http/HttpMiddleware.js +93 -32
  208. package/dist/http/HttpMiddleware.js.map +1 -1
  209. package/dist/http/HttpRouter.d.ts +35 -0
  210. package/dist/http/HttpRouter.d.ts.map +1 -1
  211. package/dist/http/HttpRouter.js +87 -13
  212. package/dist/http/HttpRouter.js.map +1 -1
  213. package/dist/http/HttpServerError.d.ts.map +1 -1
  214. package/dist/http/HttpServerError.js +6 -4
  215. package/dist/http/HttpServerError.js.map +1 -1
  216. package/dist/http/HttpServerRequest.js +2 -2
  217. package/dist/http/HttpServerRequest.js.map +1 -1
  218. package/dist/http/HttpServerResponse.d.ts +8 -6
  219. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  220. package/dist/http/HttpServerResponse.js +27 -16
  221. package/dist/http/HttpServerResponse.js.map +1 -1
  222. package/dist/http/HttpStaticServer.d.ts.map +1 -1
  223. package/dist/http/HttpStaticServer.js +4 -10
  224. package/dist/http/HttpStaticServer.js.map +1 -1
  225. package/dist/http/HttpTraceContext.js +1 -1
  226. package/dist/http/HttpTraceContext.js.map +1 -1
  227. package/dist/http/Multipart.d.ts.map +1 -1
  228. package/dist/http/Multipart.js +15 -1
  229. package/dist/http/Multipart.js.map +1 -1
  230. package/dist/http/Url.d.ts.map +1 -1
  231. package/dist/http/Url.js +2 -1
  232. package/dist/http/Url.js.map +1 -1
  233. package/dist/http/UrlParams.d.ts +112 -8
  234. package/dist/http/UrlParams.d.ts.map +1 -1
  235. package/dist/http/UrlParams.js +141 -14
  236. package/dist/http/UrlParams.js.map +1 -1
  237. package/dist/http/internal/compression.d.ts +1 -1
  238. package/dist/http/internal/compression.d.ts.map +1 -1
  239. package/dist/http/internal/compression.js +2 -10
  240. package/dist/http/internal/compression.js.map +1 -1
  241. package/dist/http/internal/compressionBody.d.ts +2 -0
  242. package/dist/http/internal/compressionBody.d.ts.map +1 -0
  243. package/dist/http/internal/compressionBody.js +36 -0
  244. package/dist/http/internal/compressionBody.js.map +1 -0
  245. package/dist/http/internal/decompression.d.ts +2 -0
  246. package/dist/http/internal/decompression.d.ts.map +1 -0
  247. package/dist/http/internal/decompression.js +162 -0
  248. package/dist/http/internal/decompression.js.map +1 -0
  249. package/dist/http/internal/tracing.js +14 -4
  250. package/dist/http/internal/tracing.js.map +1 -1
  251. package/dist/http/internal/urlParams.d.ts +2 -0
  252. package/dist/http/internal/urlParams.d.ts.map +1 -0
  253. package/dist/http/internal/urlParams.js +4 -0
  254. package/dist/http/internal/urlParams.js.map +1 -0
  255. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  256. package/dist/http-api/HttpApiClient.js +2 -1
  257. package/dist/http-api/HttpApiClient.js.map +1 -1
  258. package/dist/http-api/HttpApiScalar.d.ts +5 -0
  259. package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
  260. package/dist/http-api/HttpApiScalar.js.map +1 -1
  261. package/dist/internal/core.js +17 -1
  262. package/dist/internal/core.js.map +1 -1
  263. package/dist/internal/dateTime.js +40 -35
  264. package/dist/internal/dateTime.js.map +1 -1
  265. package/dist/internal/effect.js +13 -6
  266. package/dist/internal/effect.js.map +1 -1
  267. package/dist/internal/graphql.d.ts +2 -0
  268. package/dist/internal/graphql.d.ts.map +1 -0
  269. package/dist/internal/graphql.js +205 -0
  270. package/dist/internal/graphql.js.map +1 -0
  271. package/dist/internal/graphqlHeaders.d.ts +4 -0
  272. package/dist/internal/graphqlHeaders.d.ts.map +1 -0
  273. package/dist/internal/graphqlHeaders.js +11 -0
  274. package/dist/internal/graphqlHeaders.js.map +1 -0
  275. package/dist/internal/request.js +20 -1
  276. package/dist/internal/request.js.map +1 -1
  277. package/dist/internal/schema/toCodeDocument.js +4 -1
  278. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  279. package/dist/internal/schema/toJsonSchemaDocument.js +29 -5
  280. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  281. package/dist/internal/version.js +1 -1
  282. package/dist/net/Host.d.ts +49 -0
  283. package/dist/net/Host.d.ts.map +1 -1
  284. package/dist/net/Host.js +55 -0
  285. package/dist/net/Host.js.map +1 -1
  286. package/dist/net/NetAddress.d.ts +8 -0
  287. package/dist/net/NetAddress.d.ts.map +1 -1
  288. package/dist/net/NetAddress.js +8 -0
  289. package/dist/net/NetAddress.js.map +1 -1
  290. package/dist/observability/Otlp.d.ts +15 -0
  291. package/dist/observability/Otlp.d.ts.map +1 -1
  292. package/dist/observability/Otlp.js +3 -0
  293. package/dist/observability/Otlp.js.map +1 -1
  294. package/dist/observability/OtlpExporter.d.ts +8 -0
  295. package/dist/observability/OtlpExporter.d.ts.map +1 -1
  296. package/dist/observability/OtlpExporter.js +10 -1
  297. package/dist/observability/OtlpExporter.js.map +1 -1
  298. package/dist/observability/OtlpLogger.d.ts +17 -0
  299. package/dist/observability/OtlpLogger.d.ts.map +1 -1
  300. package/dist/observability/OtlpLogger.js +14 -1
  301. package/dist/observability/OtlpLogger.js.map +1 -1
  302. package/dist/observability/OtlpMetrics.d.ts +17 -0
  303. package/dist/observability/OtlpMetrics.d.ts.map +1 -1
  304. package/dist/observability/OtlpMetrics.js +13 -0
  305. package/dist/observability/OtlpMetrics.js.map +1 -1
  306. package/dist/observability/OtlpTracer.d.ts +17 -0
  307. package/dist/observability/OtlpTracer.d.ts.map +1 -1
  308. package/dist/observability/OtlpTracer.js +15 -2
  309. package/dist/observability/OtlpTracer.js.map +1 -1
  310. package/dist/reactivity/AsyncResult.d.ts +6 -0
  311. package/dist/reactivity/AsyncResult.d.ts.map +1 -1
  312. package/dist/reactivity/AsyncResult.js +27 -0
  313. package/dist/reactivity/AsyncResult.js.map +1 -1
  314. package/dist/reactivity/AtomRegistry.js +3 -1
  315. package/dist/reactivity/AtomRegistry.js.map +1 -1
  316. package/dist/rpc/RpcClient.d.ts.map +1 -1
  317. package/dist/rpc/RpcClient.js +6 -1
  318. package/dist/rpc/RpcClient.js.map +1 -1
  319. package/dist/rpc/RpcServer.d.ts.map +1 -1
  320. package/dist/rpc/RpcServer.js +36 -9
  321. package/dist/rpc/RpcServer.js.map +1 -1
  322. package/dist/socket/Socket.d.ts +6 -0
  323. package/dist/socket/Socket.d.ts.map +1 -1
  324. package/dist/socket/Socket.js.map +1 -1
  325. package/dist/sql/SqlClient.d.ts +8 -7
  326. package/dist/sql/SqlClient.d.ts.map +1 -1
  327. package/dist/sql/SqlClient.js +8 -7
  328. package/dist/sql/SqlClient.js.map +1 -1
  329. package/dist/testing/TestClock.d.ts +16 -3
  330. package/dist/testing/TestClock.d.ts.map +1 -1
  331. package/dist/testing/TestClock.js +112 -22
  332. package/dist/testing/TestClock.js.map +1 -1
  333. package/dist/workflow/Activity.js +1 -0
  334. package/dist/workflow/Activity.js.map +1 -1
  335. package/dist/workflow/DurableDeferred.d.ts.map +1 -1
  336. package/dist/workflow/DurableDeferred.js +32 -3
  337. package/dist/workflow/DurableDeferred.js.map +1 -1
  338. package/dist/workflow/Workflow.d.ts +22 -0
  339. package/dist/workflow/Workflow.d.ts.map +1 -1
  340. package/dist/workflow/Workflow.js +15 -3
  341. package/dist/workflow/Workflow.js.map +1 -1
  342. package/dist/workflow/WorkflowEngine.d.ts +44 -3
  343. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  344. package/dist/workflow/WorkflowEngine.js +45 -22
  345. package/dist/workflow/WorkflowEngine.js.map +1 -1
  346. package/package.json +6 -3
  347. package/src/Array.ts +95 -6
  348. package/src/Channel.ts +24 -3
  349. package/src/ConfigProvider.ts +40 -44
  350. package/src/Context.ts +9 -0
  351. package/src/Duration.ts +4 -5
  352. package/src/Effect.ts +140 -53
  353. package/src/FileSystem.ts +23 -9
  354. package/src/Match.ts +65 -12
  355. package/src/Path.ts +52 -7
  356. package/src/RequestResolver.ts +4 -10
  357. package/src/Scheduler.ts +9 -0
  358. package/src/Schema.ts +25 -4
  359. package/src/SchemaGetter.ts +47 -35
  360. package/src/Sink.ts +45 -18
  361. package/src/Stream.ts +33 -4
  362. package/src/String.ts +17 -4
  363. package/src/TxRef.ts +4 -2
  364. package/src/Utils.ts +8 -5
  365. package/src/ai/AiError.ts +3 -1
  366. package/src/ai/AnthropicStructuredOutput.ts +2 -2
  367. package/src/ai/Chat.ts +2 -2
  368. package/src/ai/Decision.ts +70 -21
  369. package/src/ai/DecisionModel.ts +1 -1
  370. package/src/ai/LanguageModel.ts +141 -63
  371. package/src/ai/McpServer.ts +259 -145
  372. package/src/ai/Prompt.ts +24 -10
  373. package/src/ai/Response.ts +6 -3
  374. package/src/cli/Completions.ts +5 -0
  375. package/src/cli/Flag.ts +101 -0
  376. package/src/cli/Param.ts +96 -0
  377. package/src/cli/internal/command.ts +2 -1
  378. package/src/cli/internal/completions/bash.ts +4 -3
  379. package/src/cli/internal/completions/descriptor.ts +10 -1
  380. package/src/cli/internal/completions/fish.ts +4 -4
  381. package/src/cli/internal/completions/powershell.ts +5 -2
  382. package/src/cli/internal/completions/zsh.ts +7 -3
  383. package/src/cli/internal/parser.ts +12 -3
  384. package/src/cli/internal/wizard.ts +2 -1
  385. package/src/cluster/ClusterWorkflowEngine.ts +143 -36
  386. package/src/cluster/MessageStorage.ts +14 -3
  387. package/src/cluster/Runners.ts +88 -66
  388. package/src/cluster/Sharding.ts +12 -9
  389. package/src/cluster/internal/entityManager.ts +1 -1
  390. package/src/encoding/Sse.ts +70 -80
  391. package/src/graphql/GraphQL.ts +494 -0
  392. package/src/graphql/GraphQLClient.ts +924 -0
  393. package/src/graphql/GraphQLClientError.ts +542 -0
  394. package/src/graphql/GraphQLGroup.ts +167 -0
  395. package/src/graphql/GraphQLMiddleware.ts +253 -0
  396. package/src/graphql/GraphQLProtocol.ts +1540 -0
  397. package/src/graphql/GraphQLResolver.ts +1038 -0
  398. package/src/graphql/index.ts +48 -0
  399. package/src/http/FetchHttpClient.ts +6 -3
  400. package/src/http/FindMyWay/internal/router.ts +2 -1
  401. package/src/http/Headers.ts +6 -9
  402. package/src/http/HttpClient.ts +72 -11
  403. package/src/http/HttpClientError.ts +10 -6
  404. package/src/http/HttpClientRequest.ts +173 -7
  405. package/src/http/HttpEffect.ts +11 -5
  406. package/src/http/HttpMiddleware.ts +113 -34
  407. package/src/http/HttpRouter.ts +95 -13
  408. package/src/http/HttpServerError.ts +8 -4
  409. package/src/http/HttpServerRequest.ts +2 -2
  410. package/src/http/HttpServerResponse.ts +28 -16
  411. package/src/http/HttpStaticServer.ts +4 -10
  412. package/src/http/HttpTraceContext.ts +1 -1
  413. package/src/http/Multipart.ts +17 -1
  414. package/src/http/Url.ts +2 -1
  415. package/src/http/UrlParams.ts +225 -26
  416. package/src/http/internal/compression.ts +3 -17
  417. package/src/http/internal/compressionBody.ts +56 -0
  418. package/src/http/internal/decompression.ts +226 -0
  419. package/src/http/internal/tracing.ts +21 -4
  420. package/src/http/internal/urlParams.ts +5 -0
  421. package/src/http-api/HttpApiClient.ts +2 -1
  422. package/src/http-api/HttpApiScalar.ts +5 -0
  423. package/src/internal/core.ts +21 -1
  424. package/src/internal/dateTime.ts +13 -10
  425. package/src/internal/effect.ts +13 -7
  426. package/src/internal/graphql.ts +286 -0
  427. package/src/internal/graphqlHeaders.ts +11 -0
  428. package/src/internal/request.ts +31 -3
  429. package/src/internal/schema/toCodeDocument.ts +7 -1
  430. package/src/internal/schema/toJsonSchemaDocument.ts +34 -2
  431. package/src/internal/version.ts +1 -1
  432. package/src/net/Host.ts +72 -0
  433. package/src/net/NetAddress.ts +9 -0
  434. package/src/observability/Otlp.ts +18 -0
  435. package/src/observability/OtlpExporter.ts +14 -3
  436. package/src/observability/OtlpLogger.ts +31 -2
  437. package/src/observability/OtlpMetrics.ts +30 -1
  438. package/src/observability/OtlpTracer.ts +32 -3
  439. package/src/reactivity/AsyncResult.ts +31 -0
  440. package/src/reactivity/AtomRegistry.ts +3 -1
  441. package/src/rpc/RpcClient.ts +6 -1
  442. package/src/rpc/RpcServer.ts +55 -15
  443. package/src/socket/Socket.ts +6 -0
  444. package/src/sql/SqlClient.ts +9 -7
  445. package/src/testing/TestClock.ts +144 -29
  446. package/src/workflow/Activity.ts +1 -0
  447. package/src/workflow/DurableDeferred.ts +43 -5
  448. package/src/workflow/Workflow.ts +31 -5
  449. package/src/workflow/WorkflowEngine.ts +107 -25
@@ -0,0 +1,505 @@
1
+ /**
2
+ * A typed client with one method per operation in a `GraphQLGroup`. Queries
3
+ * and mutations return an `Effect`; subscriptions return a `Stream`. The
4
+ * client encodes variables, runs middleware, calls the `GraphQLProtocol` in
5
+ * context and decodes results.
6
+ *
7
+ * Retryable subscription failures restart the middleware chain on the
8
+ * `subscriptionRetry` schedule. {@link pages} and {@link items} provide
9
+ * cursor pagination. {@link makeTest} builds a mock client for tests, and
10
+ * {@link layerTest} provides it as a service layer. See `GraphQLProtocol`
11
+ * for transport options.
12
+ *
13
+ * @stability experimental
14
+ * @since 4.0.0
15
+ */
16
+ import * as Cause from "../Cause.js";
17
+ import * as Context from "../Context.js";
18
+ import * as Duration from "../Duration.js";
19
+ import * as Effect from "../Effect.js";
20
+ import { identity } from "../Function.js";
21
+ import * as Headers from "../http/Headers.js";
22
+ import * as UrlParams from "../http/UrlParams.js";
23
+ import * as internalGraphQL from "../internal/graphql.js";
24
+ import { getStackTraceLimit, setStackTraceLimit } from "../internal/stackTraceLimit.js";
25
+ import * as Layer from "../Layer.js";
26
+ import * as Option from "../Option.js";
27
+ import * as Schedule from "../Schedule.js";
28
+ import * as Schema from "../Schema.js";
29
+ import * as Stream from "../Stream.js";
30
+ import * as Struct from "../Struct.js";
31
+ import { DecodeError, GraphQLClientError, isGraphQLClientError, PaginationError } from "./GraphQLClientError.js";
32
+ import { ExecutionResult, GraphQLProtocol } from "./GraphQLProtocol.js";
33
+ /**
34
+ * The default subscription retry schedule: exponential from 500 milliseconds
35
+ * with factor 1.5, capped at 5 seconds, and never shorter than the server's
36
+ * `retryAfter`.
37
+ *
38
+ * @stability experimental
39
+ * @category constants
40
+ * @since 4.0.0
41
+ */
42
+ export const defaultSubscriptionRetry = /*#__PURE__*/Schedule.exponential("500 millis", 1.5).pipe(/*#__PURE__*/Schedule.setInputType(), /*#__PURE__*/Schedule.modifyDelay(({
43
+ duration,
44
+ input
45
+ }) => {
46
+ const capped = Duration.min(duration, Duration.seconds(5));
47
+ return Effect.succeed(input.retryAfter === undefined ? capped : Duration.max(capped, input.retryAfter));
48
+ }));
49
+ /**
50
+ * Builds a client from a group, requiring `GraphQLProtocol` and every
51
+ * middleware service attached to the group or its operations.
52
+ *
53
+ * **Details**
54
+ *
55
+ * Group middleware runs outside operation middleware. Within each level,
56
+ * middleware run in the order attached.
57
+ *
58
+ * `subscriptionRetry` decides how a subscription is retried after it fails
59
+ * with a retryable error: usually a `TransportError`, but also a
60
+ * `ResponseError` whose response carried a valid `Retry-After`, including an
61
+ * event with `errors` on a graphql-sse stream whose response had that header.
62
+ * It defaults to {@link defaultSubscriptionRetry}. Fatal errors are never
63
+ * retried, whatever the schedule. A retry starts a new subscription, so the
64
+ * server may send events again that the stream already emitted.
65
+ *
66
+ * **Example** (A client as a service)
67
+ *
68
+ * ```ts import.meta.vitest
69
+ * import { Context, Effect, Layer, Schema, Stream } from "effect"
70
+ * import { GraphQL, GraphQLClient, GraphQLGroup, GraphQLProtocol } from "effect/graphql"
71
+ *
72
+ * // What the generator emits for viewer.graphql
73
+ * const Viewer = GraphQL.query("Viewer", {
74
+ * document: "query Viewer{viewer{login}}",
75
+ * result: Schema.Struct({ viewer: Schema.Struct({ login: Schema.String }) })
76
+ * })
77
+ * const ViewerGraphQLGroup = GraphQLGroup.make(Viewer)
78
+ *
79
+ * class GitHub extends Context.Service<GitHub>()("app/GitHub", {
80
+ * make: GraphQLClient.make(ViewerGraphQLGroup)
81
+ * }) {}
82
+ *
83
+ * // A scripted transport; use GraphQLProtocol.layerHttp({ url }) for a real server
84
+ * const Scripted = Layer.succeed(GraphQLProtocol.GraphQLProtocol, {
85
+ * execute: () => Effect.succeed({ body: { data: { viewer: { login: "tim" } } } }),
86
+ * subscribe: () => Stream.empty
87
+ * })
88
+ *
89
+ * const program = GitHub.use((github) => github.Viewer()).pipe(
90
+ * Effect.provide(Layer.effect(GitHub, GitHub.make).pipe(Layer.provide(Scripted)))
91
+ * )
92
+ *
93
+ * await Effect.runPromise(program) // => { viewer: { login: "tim" } }
94
+ * ```
95
+ *
96
+ * **Example** (Partial results)
97
+ *
98
+ * ```ts import.meta.vitest
99
+ * import { Effect, Layer, Schema, Stream } from "effect"
100
+ * import { GraphQL, GraphQLClient, GraphQLGroup, GraphQLProtocol } from "effect/graphql"
101
+ *
102
+ * const Repos = GraphQL.query("Repos", {
103
+ * document: "query Repos{a:repository(owner:\"x\",name:\"a\"){name} b:repository(owner:\"x\",name:\"b\"){name}}",
104
+ * result: Schema.Struct({
105
+ * a: Schema.NullOr(Schema.Struct({ name: Schema.String })),
106
+ * b: Schema.NullOr(Schema.Struct({ name: Schema.String }))
107
+ * })
108
+ * })
109
+ *
110
+ * const Scripted = Layer.succeed(GraphQLProtocol.GraphQLProtocol, {
111
+ * execute: () =>
112
+ * Effect.succeed({
113
+ * body: {
114
+ * data: { a: { name: "a" }, b: null },
115
+ * errors: [{ message: "Could not resolve to a Repository", path: ["b"] }]
116
+ * }
117
+ * }),
118
+ * subscribe: () => Stream.empty
119
+ * })
120
+ *
121
+ * const program = Effect.gen(function*() {
122
+ * const client = yield* GraphQLClient.make(GraphQLGroup.make(Repos))
123
+ * // The default call fails with a ResponseError because `errors` is non-empty
124
+ * const failed = yield* Effect.flip(client.Repos())
125
+ * // With partial: true the decoded data comes back together with the errors
126
+ * const { data, errors } = yield* client.Repos(undefined, { partial: true })
127
+ * return [failed.reason._tag, data.a?.name, errors[0].path?.[0]]
128
+ * })
129
+ *
130
+ * await Effect.runPromise(program.pipe(Effect.provide(Scripted))) // => ["ResponseError", "a", "b"]
131
+ * ```
132
+ *
133
+ * @stability experimental
134
+ * @category constructors
135
+ * @since 4.0.0
136
+ */
137
+ export const make = (group, options) => Effect.gen(function* () {
138
+ const protocol = yield* GraphQLProtocol;
139
+ const context = yield* Effect.context();
140
+ const retryPolicy = retryableOnly(options?.subscriptionRetry ?? defaultSubscriptionRetry);
141
+ return fromGroup(group, operation => makeMethod(operation, middlewareChain(context, group, operation), protocol, retryPolicy));
142
+ });
143
+ // Type boundary: a mapping over the operations cannot prove the mapped type's
144
+ // name/kind relationship.
145
+ const fromGroup = (group, f) => Object.fromEntries(group.operations.map(operation => [operation.name, f(operation)]));
146
+ // Runtime tags erase middleware types; `make` requires all their identifiers.
147
+ const middlewareChain = (context, group, operation) => [...group.middlewares, ...operation.middlewares].map(tag => Context.getUnsafe(context, tag));
148
+ // Steps `schedule` only for retryable `GraphQLClientError`s. Middleware
149
+ // errors and fatal errors end the retries before reaching it, so a custom
150
+ // schedule can rely on its input being a `GraphQLClientError`.
151
+ const retryableOnly = schedule => Schedule.fromStep(Effect.map(Schedule.toStep(schedule), step => (now, input) => isGraphQLClientError(input) && input.isRetryable ? step(now, input) : Cause.done(undefined)));
152
+ // `status` and `headers` are transport metadata, never read from the body.
153
+ const decodeExecutionResult = /*#__PURE__*/Schema.decodeUnknownEffect(/*#__PURE__*/ExecutionResult.mapFields(/*#__PURE__*/Struct.omit(["status", "headers"])));
154
+ // Type boundary: a call without `context` has `R2 = never` unless the caller
155
+ // names `R2` explicitly, so an empty context stands in for `Context<R2>`.
156
+ const callContext = options => options?.context ?? Context.empty();
157
+ const makeMethod = (operation, chain, protocol, retryPolicy) => {
158
+ const {
159
+ decodePartial,
160
+ decodeStrict,
161
+ encodeVariables,
162
+ fail,
163
+ schemaFail
164
+ } = internalGraphQL.makeCodec(operation);
165
+ const notGraphQL = schemaFail(description => new DecodeError({
166
+ description: `Not a GraphQL response: ${description}`
167
+ }));
168
+ const buildRequest = (variables, options) => encodeVariables(variables).pipe(Effect.map(encoded => ({
169
+ kind: operation.kind,
170
+ query: operation.document,
171
+ operationName: operation.name,
172
+ variables: encoded,
173
+ headers: Headers.fromInput(options?.headers),
174
+ urlParams: options?.urlParams === undefined ? UrlParams.empty : UrlParams.fromInput(options.urlParams)
175
+ })));
176
+ const decodeResponse = ({
177
+ body,
178
+ ...metadata
179
+ }) => decodeExecutionResult(body).pipe(Effect.map(result => ({
180
+ ...result,
181
+ ...metadata
182
+ })), Effect.catch(notGraphQL));
183
+ // Type boundary: a middleware sees the errors of the middleware further in
184
+ // as `Types.unhandled` (as in `RpcMiddleware`), and none of their
185
+ // requirements. Those errors are part of `GraphQL.Error<Op>`, so the chain
186
+ // restates its type here. Force POST and the resolved URL apply only at the
187
+ // transport boundary.
188
+ const execute = (index, request, forcePost, resolvedUrl) => index === chain.length ? protocol.execute(request).pipe(forcePost ? Effect.provideService(internalGraphQL.ForcePost, true) : identity, resolvedUrl === undefined ? identity : Effect.provideService(internalGraphQL.ResolvedUrl, resolvedUrl), Effect.mapError(fail), Effect.flatMap(decodeResponse)) : chain[index].execute({
189
+ operation,
190
+ request,
191
+ next: request => execute(index + 1, request, forcePost, resolvedUrl)
192
+ });
193
+ // Hands a resolver batch's URL to the transport only, so calls made by
194
+ // middleware resolve their own.
195
+ const run = (request, forcePost) => internalGraphQL.ResolvedUrl.use(resolved => resolved === undefined ? execute(0, request, forcePost, undefined) : execute(0, request, forcePost, resolved).pipe(Effect.provideService(internalGraphQL.ResolvedUrl, undefined)));
196
+ const subscribe = (index, request) => index === chain.length ? protocol.subscribe(request).pipe(Stream.mapError(fail), Stream.mapEffect(decodeResponse)) : chain[index].subscribe({
197
+ operation,
198
+ request,
199
+ next: request => subscribe(index + 1, request)
200
+ });
201
+ if (operation.kind === "subscription") {
202
+ const subscriptionMethod = (...[variables, options]) => Stream.unwrap(Effect.map(buildRequest(variables, options), request => subscribe(0, request))).pipe(Stream.mapEffect(decodeStrict), Stream.retry(retryPolicy), Stream.provideContext(callContext(options)));
203
+ return Object.assign(subscriptionMethod, {
204
+ operation
205
+ });
206
+ }
207
+ function method(variables, options) {
208
+ return buildRequest(variables, options).pipe(Effect.flatMap(request => run(request, false)), Effect.flatMap(result => options?.partial === true ? decodePartial(result) : decodeStrict(result)), Effect.provideContext(callContext(options)));
209
+ }
210
+ internalGraphQL.rawExecutors.set(method, {
211
+ execute: request => run(request, true),
212
+ url: protocol.url
213
+ });
214
+ return Object.assign(method, {
215
+ operation
216
+ });
217
+ };
218
+ /**
219
+ * Pages forward through a cursor connection, emitting one connection per
220
+ * page.
221
+ *
222
+ * **Details**
223
+ *
224
+ * Requires an optional string `$after` variable (see {@link PagingVariables}).
225
+ * The first request omits `after`; subsequent requests use the previous
226
+ * `endCursor`. Pages are fetched only when pulled, so `Stream.take` stops
227
+ * further requests. Middleware runs on each page.
228
+ *
229
+ * `connection` extracts the connection from each result. `options` is
230
+ * forwarded to every call but cannot include `partial`: errors fail the stream.
231
+ * Its `headers` accept `Headers.Input`, just as for operation calls.
232
+ *
233
+ * The stream ends after a page whose `hasNextPage` is `false`. A `null`
234
+ * connection on the first page gives an empty stream; on a later page it
235
+ * fails with a `PaginationError`, as does `hasNextPage: true` with a `null`
236
+ * or unchanged `endCursor`.
237
+ *
238
+ * Root fields that come with every page, such as GitHub's `rateLimit`, are for
239
+ * middleware to read from the raw `ExecutionResult`.
240
+ *
241
+ * **Example** (Paging issues, two per page)
242
+ *
243
+ * ```ts import.meta.vitest
244
+ * import { Effect, Layer, Schema, Stream } from "effect"
245
+ * import { GraphQL, GraphQLClient, GraphQLGroup, GraphQLProtocol } from "effect/graphql"
246
+ *
247
+ * const RepoIssues = GraphQL.query("RepoIssues", {
248
+ * document: "query RepoIssues($owner:String!,$name:String!,$after:String){repository(owner:$owner,name:$name){issues(first:2,after:$after){pageInfo{hasNextPage endCursor}nodes{number}}}}",
249
+ * variables: { owner: Schema.String, name: Schema.String, after: Schema.optional(Schema.NullOr(Schema.String)) },
250
+ * result: Schema.Struct({
251
+ * repository: Schema.NullOr(Schema.Struct({
252
+ * issues: Schema.Struct({
253
+ * pageInfo: Schema.Struct({ hasNextPage: Schema.Boolean, endCursor: Schema.NullOr(Schema.String) }),
254
+ * nodes: Schema.NullOr(Schema.Array(Schema.NullOr(Schema.Struct({ number: Schema.Int }))))
255
+ * })
256
+ * }))
257
+ * })
258
+ * })
259
+ *
260
+ * // A scripted server with two pages
261
+ * const Scripted = Layer.succeed(GraphQLProtocol.GraphQLProtocol, {
262
+ * execute: (request) => {
263
+ * const after = (request.variables as { after?: string }).after
264
+ * const page = after === undefined
265
+ * ? { pageInfo: { hasNextPage: true, endCursor: "c1" }, nodes: [{ number: 1 }, { number: 2 }] }
266
+ * : { pageInfo: { hasNextPage: false, endCursor: null }, nodes: [{ number: 3 }] }
267
+ * return Effect.succeed({ body: { data: { repository: { issues: page } } } })
268
+ * },
269
+ * subscribe: () => Stream.empty
270
+ * })
271
+ *
272
+ * const program = Effect.gen(function*() {
273
+ * const client = yield* GraphQLClient.make(GraphQLGroup.make(RepoIssues))
274
+ * const pages = GraphQLClient.pages(client.RepoIssues, {
275
+ * variables: { owner: "Effect-TS", name: "effect" },
276
+ * connection: (result) => result.repository?.issues
277
+ * })
278
+ * return yield* Stream.runCollect(Stream.map(pages, (page) => page.pageInfo.endCursor))
279
+ * })
280
+ *
281
+ * await Effect.runPromise(program.pipe(Effect.provide(Scripted))) // => ["c1", null]
282
+ * ```
283
+ *
284
+ * @stability experimental
285
+ * @category paging
286
+ * @since 4.0.0
287
+ */
288
+ export const pages = (method, options) => {
289
+ // Type boundary: `method`'s strict overload, with `variables` widened.
290
+ // `PagingVariables` has already checked that `options.variables` plus an
291
+ // optional string `after` are the operation's variables, but the overloads'
292
+ // conditional parameter types over a generic `Op` cannot carry that here.
293
+ const call = method;
294
+ // The state is the cursor to send; the first page is fetched without one.
295
+ return Stream.paginate(undefined, after => Effect.flatMap(call(after === undefined ? options.variables : {
296
+ ...options.variables,
297
+ after
298
+ }, options.options), result => {
299
+ const paginationError = description => Effect.fail(new GraphQLClientError({
300
+ operation: method.operation.name,
301
+ reason: new PaginationError({
302
+ description,
303
+ cursor: after ?? null
304
+ })
305
+ }));
306
+ const connection = options.connection(result);
307
+ if (connection === null || connection === undefined) {
308
+ return after === undefined ? Effect.succeed([[], Option.none()]) : paginationError("The connection was null on a page after the first");
309
+ }
310
+ const {
311
+ endCursor,
312
+ hasNextPage
313
+ } = connection.pageInfo;
314
+ if (!hasNextPage) return Effect.succeed([[connection], Option.none()]);
315
+ if (endCursor === null) return paginationError("hasNextPage is true but endCursor is null");
316
+ if (endCursor === after) return paginationError(`endCursor "${endCursor}" did not advance`);
317
+ return Effect.succeed([[connection], Option.some(endCursor)]);
318
+ }));
319
+ };
320
+ /**
321
+ * Like {@link pages}, but emits decoded entries from `nodes`, including
322
+ * `null` entries. Use `Stream.filter(Predicate.isNotNull)` to drop them.
323
+ * For connections selecting only `edges`, use {@link pages} with
324
+ * `Stream.flatMap`.
325
+ *
326
+ * **Example** (Flattening issue numbers across pages)
327
+ *
328
+ * ```ts import.meta.vitest
329
+ * import { Effect, Layer, Schema, Stream } from "effect"
330
+ * import { GraphQL, GraphQLClient, GraphQLGroup, GraphQLProtocol } from "effect/graphql"
331
+ *
332
+ * const RepoIssues = GraphQL.query("RepoIssues", {
333
+ * document: "query RepoIssues($owner:String!,$name:String!,$after:String){repository(owner:$owner,name:$name){issues(first:2,after:$after){pageInfo{hasNextPage endCursor}nodes{number}}}}",
334
+ * variables: { owner: Schema.String, name: Schema.String, after: Schema.optional(Schema.NullOr(Schema.String)) },
335
+ * result: Schema.Struct({
336
+ * repository: Schema.NullOr(Schema.Struct({
337
+ * issues: Schema.Struct({
338
+ * pageInfo: Schema.Struct({ hasNextPage: Schema.Boolean, endCursor: Schema.NullOr(Schema.String) }),
339
+ * nodes: Schema.NullOr(Schema.Array(Schema.NullOr(Schema.Struct({ number: Schema.Int }))))
340
+ * })
341
+ * }))
342
+ * })
343
+ * })
344
+ *
345
+ * const Scripted = Layer.succeed(GraphQLProtocol.GraphQLProtocol, {
346
+ * execute: (request) => {
347
+ * const after = (request.variables as { after?: string }).after
348
+ * const page = after === undefined
349
+ * ? { pageInfo: { hasNextPage: true, endCursor: "c1" }, nodes: [{ number: 1 }, null] }
350
+ * : { pageInfo: { hasNextPage: false, endCursor: null }, nodes: [{ number: 3 }] }
351
+ * return Effect.succeed({ body: { data: { repository: { issues: page } } } })
352
+ * },
353
+ * subscribe: () => Stream.empty
354
+ * })
355
+ *
356
+ * const program = Effect.gen(function*() {
357
+ * const client = yield* GraphQLClient.make(GraphQLGroup.make(RepoIssues))
358
+ * const items = GraphQLClient.items(client.RepoIssues, {
359
+ * variables: { owner: "Effect-TS", name: "effect" },
360
+ * connection: (result) => result.repository?.issues
361
+ * })
362
+ * return yield* Stream.runCollect(Stream.map(items, (issue) => issue?.number ?? null))
363
+ * })
364
+ *
365
+ * await Effect.runPromise(program.pipe(Effect.provide(Scripted))) // => [1, null, 3]
366
+ * ```
367
+ *
368
+ * @stability experimental
369
+ * @category paging
370
+ * @since 4.0.0
371
+ */
372
+ export const items = (method, options) => Stream.flatMap(pages(method, options), connection => Stream.fromArray(connection.nodes ?? []));
373
+ /**
374
+ * Builds a client for tests that answers each operation from a handler,
375
+ * without a protocol.
376
+ *
377
+ * **Details**
378
+ *
379
+ * Handlers receive the caller's `variables` and options unchanged and return
380
+ * values in their decoded form. Nothing is encoded, decoded or validated, and
381
+ * no middleware runs. Called with `{ partial: true }`, a method returns
382
+ * `{ data, errors: [] }`. Subscriptions are not retried. Every method carries
383
+ * `.operation`, so {@link pages} and {@link items} work on it.
384
+ *
385
+ * Calling an operation without a handler dies with an `UnimplementedError`
386
+ * defect, so `catchTag` in the code under test cannot swallow a missing stub.
387
+ *
388
+ * Methods keep the real client's types, including middleware service
389
+ * requirements. Tests must provide those services even though mocks do not
390
+ * use them.
391
+ *
392
+ * To test partial data together with `errors`, or the encode and decode path,
393
+ * provide a scripted `GraphQLProtocol` layer to {@link make} instead.
394
+ *
395
+ * **Example** (Replacing a client service in tests)
396
+ *
397
+ * ```ts import.meta.vitest
398
+ * import { Context, Effect, Layer, Schema } from "effect"
399
+ * import { GraphQL, GraphQLClient, GraphQLGroup } from "effect/graphql"
400
+ *
401
+ * const RepoIssues = GraphQL.query("RepoIssues", {
402
+ * document: "query RepoIssues($owner:String!,$name:String!){repository(owner:$owner,name:$name){issues{totalCount}}}",
403
+ * variables: { owner: Schema.String, name: Schema.String },
404
+ * result: Schema.Struct({
405
+ * repository: Schema.NullOr(Schema.Struct({ issues: Schema.Struct({ totalCount: Schema.Int }) }))
406
+ * })
407
+ * })
408
+ * const GitHubGraphQLGroup = GraphQLGroup.make(RepoIssues)
409
+ *
410
+ * class GitHub extends Context.Service<GitHub>()("app/GitHub", {
411
+ * make: GraphQLClient.make(GitHubGraphQLGroup)
412
+ * }) {}
413
+ *
414
+ * const GitHubTest = Layer.succeed(
415
+ * GitHub,
416
+ * GraphQLClient.makeTest(GitHubGraphQLGroup)({
417
+ * RepoIssues: ({ name }) => Effect.succeed({ repository: { issues: { totalCount: name.length } } })
418
+ * })
419
+ * )
420
+ *
421
+ * const program = GitHub.use((github) => github.RepoIssues({ owner: "Effect-TS", name: "effect" }))
422
+ *
423
+ * await Effect.runPromise(program.pipe(Effect.provide(GitHubTest))) // => { repository: { issues: { totalCount: 6 } } }
424
+ * ```
425
+ *
426
+ * @stability experimental
427
+ * @category testing
428
+ * @since 4.0.0
429
+ */
430
+ export const makeTest = group => handlers => {
431
+ // Type boundary: the mapped type keys handlers by name, which a lookup by a
432
+ // runtime name cannot follow.
433
+ const byName = handlers;
434
+ return fromGroup(group, operation => makeTestMethod(operation, Object.hasOwn(byName, operation.name) ? byName[operation.name] : undefined));
435
+ };
436
+ /**
437
+ * Builds a mock layer for a client service using {@link makeTest}. Bind the
438
+ * service and group once to expose a `layerTest(handlers)` helper on the service.
439
+ * The group fixes the operation types before the handlers are checked.
440
+ *
441
+ * **Example** (Binding a mock layer to a client service)
442
+ *
443
+ * ```ts import.meta.vitest
444
+ * import { Context, Effect, Schema } from "effect"
445
+ * import { GraphQL, GraphQLClient, GraphQLGroup } from "effect/graphql"
446
+ *
447
+ * const RepoIssues = GraphQL.query("RepoIssues", {
448
+ * document: "query RepoIssues($owner:String!,$name:String!){repository(owner:$owner,name:$name){issues{totalCount}}}",
449
+ * variables: { owner: Schema.String, name: Schema.String },
450
+ * result: Schema.Struct({
451
+ * repository: Schema.NullOr(Schema.Struct({ issues: Schema.Struct({ totalCount: Schema.Int }) }))
452
+ * })
453
+ * })
454
+ * const GitHubGraphQLGroup = GraphQLGroup.make(RepoIssues)
455
+ *
456
+ * class GitHub extends Context.Service<GitHub>()("app/GitHub", {
457
+ * make: GraphQLClient.make(GitHubGraphQLGroup)
458
+ * }) {
459
+ * static readonly layerTest = GraphQLClient.layerTest(GitHub, GitHubGraphQLGroup)
460
+ * }
461
+ *
462
+ * const program = GitHub.use((github) => github.RepoIssues({ owner: "Effect-TS", name: "effect" }))
463
+ *
464
+ * await Effect.runPromise(program.pipe(Effect.provide(GitHub.layerTest({
465
+ * RepoIssues: ({ name }) => Effect.succeed({ repository: { issues: { totalCount: name.length } } })
466
+ * })))) // => { repository: { issues: { totalCount: 6 } } }
467
+ * ```
468
+ *
469
+ * @see {@link makeTest} for mock behavior and the middleware-services limitation.
470
+ * @stability experimental
471
+ * @category testing
472
+ * @since 4.0.0
473
+ */
474
+ export const layerTest = (service, group) => handlers =>
475
+ // The group constraint checks that the mock satisfies the service shape.
476
+ Layer.succeed(service, makeTest(group)(handlers));
477
+ const makeTestMethod = (operation, handler) => {
478
+ const subscription = operation.kind === "subscription";
479
+ if (handler === undefined) {
480
+ const unimplemented = () => {
481
+ const prevLimit = getStackTraceLimit();
482
+ setStackTraceLimit(2);
483
+ const error = new Error(`GraphQLClient: Unimplemented operation "${operation.name}"`);
484
+ setStackTraceLimit(prevLimit);
485
+ error.name = "UnimplementedError";
486
+ return subscription ? Stream.die(error) : Effect.die(error);
487
+ };
488
+ return Object.assign(unimplemented, {
489
+ operation
490
+ });
491
+ }
492
+ const call = (variables, options) => {
493
+ const run = () => handler(variables === undefined ? {} : variables, options ?? {});
494
+ if (subscription) return Stream.suspend(run);
495
+ const result = Effect.suspend(run);
496
+ return options?.partial === true ? Effect.map(result, data => ({
497
+ data,
498
+ errors: []
499
+ })) : result;
500
+ };
501
+ return Object.assign(call, {
502
+ operation
503
+ });
504
+ };
505
+ //# sourceMappingURL=GraphQLClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphQLClient.js","names":[],"sources":["../../src/graphql/GraphQLClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}