effect 4.0.3 → 4.0.4

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 (207) 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 +111 -0
  5. package/ai-docs/src/52_graphql/20_testing.ts +45 -0
  6. package/ai-docs/src/52_graphql/30_batching.ts +116 -0
  7. package/ai-docs/src/52_graphql/40_aliased-batching.ts +122 -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/Context.d.ts.map +1 -1
  11. package/dist/Context.js +9 -0
  12. package/dist/Context.js.map +1 -1
  13. package/dist/RequestResolver.d.ts.map +1 -1
  14. package/dist/RequestResolver.js +4 -10
  15. package/dist/RequestResolver.js.map +1 -1
  16. package/dist/Scheduler.d.ts +9 -0
  17. package/dist/Scheduler.d.ts.map +1 -1
  18. package/dist/Scheduler.js +9 -0
  19. package/dist/Scheduler.js.map +1 -1
  20. package/dist/Schema.d.ts +8 -0
  21. package/dist/Schema.d.ts.map +1 -1
  22. package/dist/Schema.js +7 -0
  23. package/dist/Schema.js.map +1 -1
  24. package/dist/SchemaGetter.d.ts +4 -0
  25. package/dist/SchemaGetter.d.ts.map +1 -1
  26. package/dist/SchemaGetter.js +52 -33
  27. package/dist/SchemaGetter.js.map +1 -1
  28. package/dist/Sink.d.ts.map +1 -1
  29. package/dist/Sink.js +38 -17
  30. package/dist/Sink.js.map +1 -1
  31. package/dist/Stream.d.ts +11 -0
  32. package/dist/Stream.d.ts.map +1 -1
  33. package/dist/Stream.js +16 -1
  34. package/dist/Stream.js.map +1 -1
  35. package/dist/Utils.js +8 -3
  36. package/dist/Utils.js.map +1 -1
  37. package/dist/ai/AnthropicStructuredOutput.js +0 -2
  38. package/dist/ai/AnthropicStructuredOutput.js.map +1 -1
  39. package/dist/ai/Chat.d.ts +2 -2
  40. package/dist/ai/Chat.d.ts.map +1 -1
  41. package/dist/ai/LanguageModel.d.ts +38 -7
  42. package/dist/ai/LanguageModel.d.ts.map +1 -1
  43. package/dist/ai/LanguageModel.js +25 -7
  44. package/dist/ai/LanguageModel.js.map +1 -1
  45. package/dist/ai/McpServer.d.ts +55 -0
  46. package/dist/ai/McpServer.d.ts.map +1 -1
  47. package/dist/ai/McpServer.js +132 -22
  48. package/dist/ai/McpServer.js.map +1 -1
  49. package/dist/ai/Prompt.d.ts.map +1 -1
  50. package/dist/ai/Prompt.js +28 -5
  51. package/dist/ai/Prompt.js.map +1 -1
  52. package/dist/ai/Response.d.ts +4 -3
  53. package/dist/ai/Response.d.ts.map +1 -1
  54. package/dist/ai/Response.js.map +1 -1
  55. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  56. package/dist/cluster/ClusterWorkflowEngine.js +46 -8
  57. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  58. package/dist/cluster/Sharding.d.ts.map +1 -1
  59. package/dist/cluster/Sharding.js +6 -4
  60. package/dist/cluster/Sharding.js.map +1 -1
  61. package/dist/encoding/Sse.d.ts +6 -0
  62. package/dist/encoding/Sse.d.ts.map +1 -1
  63. package/dist/encoding/Sse.js +62 -70
  64. package/dist/encoding/Sse.js.map +1 -1
  65. package/dist/graphql/GraphQL.d.ts +349 -0
  66. package/dist/graphql/GraphQL.d.ts.map +1 -0
  67. package/dist/graphql/GraphQL.js +207 -0
  68. package/dist/graphql/GraphQL.js.map +1 -0
  69. package/dist/graphql/GraphQLClient.d.ts +562 -0
  70. package/dist/graphql/GraphQLClient.d.ts.map +1 -0
  71. package/dist/graphql/GraphQLClient.js +498 -0
  72. package/dist/graphql/GraphQLClient.js.map +1 -0
  73. package/dist/graphql/GraphQLClientError.d.ts +445 -0
  74. package/dist/graphql/GraphQLClientError.d.ts.map +1 -0
  75. package/dist/graphql/GraphQLClientError.js +479 -0
  76. package/dist/graphql/GraphQLClientError.js.map +1 -0
  77. package/dist/graphql/GraphQLGroup.d.ts +118 -0
  78. package/dist/graphql/GraphQLGroup.d.ts.map +1 -0
  79. package/dist/graphql/GraphQLGroup.js +109 -0
  80. package/dist/graphql/GraphQLGroup.js.map +1 -0
  81. package/dist/graphql/GraphQLMiddleware.d.ts +249 -0
  82. package/dist/graphql/GraphQLMiddleware.d.ts.map +1 -0
  83. package/dist/graphql/GraphQLMiddleware.js +130 -0
  84. package/dist/graphql/GraphQLMiddleware.js.map +1 -0
  85. package/dist/graphql/GraphQLProtocol.d.ts +731 -0
  86. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -0
  87. package/dist/graphql/GraphQLProtocol.js +719 -0
  88. package/dist/graphql/GraphQLProtocol.js.map +1 -0
  89. package/dist/graphql/GraphQLResolver.d.ts +453 -0
  90. package/dist/graphql/GraphQLResolver.d.ts.map +1 -0
  91. package/dist/graphql/GraphQLResolver.js +552 -0
  92. package/dist/graphql/GraphQLResolver.js.map +1 -0
  93. package/dist/graphql/index.d.ts +40 -0
  94. package/dist/graphql/index.d.ts.map +1 -0
  95. package/dist/graphql/index.js +41 -0
  96. package/dist/graphql/index.js.map +1 -0
  97. package/dist/http/HttpClient.d.ts +15 -0
  98. package/dist/http/HttpClient.d.ts.map +1 -1
  99. package/dist/http/HttpClient.js +24 -10
  100. package/dist/http/HttpClient.js.map +1 -1
  101. package/dist/http/HttpEffect.d.ts.map +1 -1
  102. package/dist/http/HttpEffect.js +14 -7
  103. package/dist/http/HttpEffect.js.map +1 -1
  104. package/dist/http/HttpMiddleware.d.ts.map +1 -1
  105. package/dist/http/HttpMiddleware.js +31 -32
  106. package/dist/http/HttpMiddleware.js.map +1 -1
  107. package/dist/http/HttpRouter.d.ts +35 -0
  108. package/dist/http/HttpRouter.d.ts.map +1 -1
  109. package/dist/http/HttpRouter.js +35 -0
  110. package/dist/http/HttpRouter.js.map +1 -1
  111. package/dist/http/HttpServerResponse.d.ts +8 -6
  112. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  113. package/dist/http/HttpServerResponse.js +27 -16
  114. package/dist/http/HttpServerResponse.js.map +1 -1
  115. package/dist/http/Multipart.d.ts.map +1 -1
  116. package/dist/http/Multipart.js +15 -1
  117. package/dist/http/Multipart.js.map +1 -1
  118. package/dist/http-api/HttpApiScalar.d.ts +5 -0
  119. package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
  120. package/dist/http-api/HttpApiScalar.js.map +1 -1
  121. package/dist/internal/dateTime.js +40 -35
  122. package/dist/internal/dateTime.js.map +1 -1
  123. package/dist/internal/effect.js +8 -3
  124. package/dist/internal/effect.js.map +1 -1
  125. package/dist/internal/graphql.d.ts +2 -0
  126. package/dist/internal/graphql.d.ts.map +1 -0
  127. package/dist/internal/graphql.js +195 -0
  128. package/dist/internal/graphql.js.map +1 -0
  129. package/dist/internal/graphqlHeaders.d.ts +4 -0
  130. package/dist/internal/graphqlHeaders.d.ts.map +1 -0
  131. package/dist/internal/graphqlHeaders.js +11 -0
  132. package/dist/internal/graphqlHeaders.js.map +1 -0
  133. package/dist/internal/request.js +20 -1
  134. package/dist/internal/request.js.map +1 -1
  135. package/dist/internal/schema/toCodeDocument.js +4 -1
  136. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  137. package/dist/internal/schema/toJsonSchemaDocument.js +29 -5
  138. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  139. package/dist/internal/version.js +1 -1
  140. package/dist/net/Host.d.ts +49 -0
  141. package/dist/net/Host.d.ts.map +1 -1
  142. package/dist/net/Host.js +55 -0
  143. package/dist/net/Host.js.map +1 -1
  144. package/dist/net/NetAddress.d.ts +8 -0
  145. package/dist/net/NetAddress.d.ts.map +1 -1
  146. package/dist/net/NetAddress.js +8 -0
  147. package/dist/net/NetAddress.js.map +1 -1
  148. package/dist/rpc/RpcServer.d.ts.map +1 -1
  149. package/dist/rpc/RpcServer.js +36 -9
  150. package/dist/rpc/RpcServer.js.map +1 -1
  151. package/dist/socket/Socket.d.ts +6 -0
  152. package/dist/socket/Socket.d.ts.map +1 -1
  153. package/dist/socket/Socket.js.map +1 -1
  154. package/dist/workflow/DurableDeferred.d.ts.map +1 -1
  155. package/dist/workflow/DurableDeferred.js +32 -3
  156. package/dist/workflow/DurableDeferred.js.map +1 -1
  157. package/dist/workflow/WorkflowEngine.d.ts +24 -2
  158. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  159. package/dist/workflow/WorkflowEngine.js +11 -2
  160. package/dist/workflow/WorkflowEngine.js.map +1 -1
  161. package/package.json +6 -3
  162. package/src/Context.ts +9 -0
  163. package/src/RequestResolver.ts +4 -10
  164. package/src/Scheduler.ts +9 -0
  165. package/src/Schema.ts +8 -0
  166. package/src/SchemaGetter.ts +47 -35
  167. package/src/Sink.ts +45 -18
  168. package/src/Stream.ts +33 -4
  169. package/src/Utils.ts +8 -5
  170. package/src/ai/AnthropicStructuredOutput.ts +2 -2
  171. package/src/ai/Chat.ts +2 -2
  172. package/src/ai/LanguageModel.ts +96 -24
  173. package/src/ai/McpServer.ts +244 -90
  174. package/src/ai/Prompt.ts +24 -10
  175. package/src/ai/Response.ts +6 -3
  176. package/src/cluster/ClusterWorkflowEngine.ts +51 -12
  177. package/src/cluster/Sharding.ts +12 -9
  178. package/src/encoding/Sse.ts +69 -79
  179. package/src/graphql/GraphQL.ts +494 -0
  180. package/src/graphql/GraphQLClient.ts +912 -0
  181. package/src/graphql/GraphQLClientError.ts +542 -0
  182. package/src/graphql/GraphQLGroup.ts +167 -0
  183. package/src/graphql/GraphQLMiddleware.ts +253 -0
  184. package/src/graphql/GraphQLProtocol.ts +1286 -0
  185. package/src/graphql/GraphQLResolver.ts +1010 -0
  186. package/src/graphql/index.ts +48 -0
  187. package/src/http/HttpClient.ts +54 -10
  188. package/src/http/HttpEffect.ts +11 -5
  189. package/src/http/HttpMiddleware.ts +33 -34
  190. package/src/http/HttpRouter.ts +35 -0
  191. package/src/http/HttpServerResponse.ts +28 -16
  192. package/src/http/Multipart.ts +17 -1
  193. package/src/http-api/HttpApiScalar.ts +5 -0
  194. package/src/internal/dateTime.ts +13 -10
  195. package/src/internal/effect.ts +8 -3
  196. package/src/internal/graphql.ts +263 -0
  197. package/src/internal/graphqlHeaders.ts +11 -0
  198. package/src/internal/request.ts +31 -3
  199. package/src/internal/schema/toCodeDocument.ts +7 -1
  200. package/src/internal/schema/toJsonSchemaDocument.ts +34 -2
  201. package/src/internal/version.ts +1 -1
  202. package/src/net/Host.ts +72 -0
  203. package/src/net/NetAddress.ts +9 -0
  204. package/src/rpc/RpcServer.ts +55 -15
  205. package/src/socket/Socket.ts +6 -0
  206. package/src/workflow/DurableDeferred.ts +43 -5
  207. package/src/workflow/WorkflowEngine.ts +48 -4
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Groups of GraphQL operations, merged to build a client. Group middleware
3
+ * runs outside operation middleware. `@effect/graphql-generator` emits one
4
+ * group per document file.
5
+ *
6
+ * @stability experimental
7
+ * @since 4.0.0
8
+ */
9
+ import { pipeArguments } from "../Pipeable.js";
10
+ import { hasProperty } from "../Predicate.js";
11
+ const TypeId = "~effect/graphql/GraphQLGroup";
12
+ /**
13
+ * Tests whether a value is a {@link GraphQLGroup}.
14
+ *
15
+ * @stability experimental
16
+ * @category guards
17
+ * @since 4.0.0
18
+ */
19
+ export const isGraphQLGroup = u => hasProperty(u, TypeId);
20
+ const Proto = {
21
+ [TypeId]: TypeId,
22
+ pipe() {
23
+ return pipeArguments(this, arguments);
24
+ },
25
+ middleware(middleware) {
26
+ return makeProto(this.operations, [...this.middlewares, middleware]);
27
+ }
28
+ };
29
+ // The operation and middleware types of a group are phantom: at runtime a
30
+ // group holds erased `GraphQL.Any` operations and `AnyService` tags, so the
31
+ // typed constructors below state their group type with one assertion each.
32
+ const makeProto = (operations, middlewares) => {
33
+ const byName = new Map();
34
+ for (const operation of operations) {
35
+ const existing = byName.get(operation.name);
36
+ if (existing !== undefined && existing !== operation) {
37
+ throw new Error(`GraphQLGroup: duplicate operation name "${operation.name}"`);
38
+ }
39
+ byName.set(operation.name, operation);
40
+ }
41
+ return Object.assign(Object.create(Proto), {
42
+ operations: Array.from(byName.values()),
43
+ middlewares
44
+ });
45
+ };
46
+ /**
47
+ * Builds a group from operations. Operation names must be unique within a
48
+ * group, because they become the client's method names.
49
+ *
50
+ * **Example** (One group per `.graphql` file)
51
+ *
52
+ * ```ts import.meta.vitest
53
+ * import { Schema } from "effect"
54
+ * import { GraphQL, GraphQLGroup } from "effect/graphql"
55
+ *
56
+ * const Viewer = GraphQL.query("Viewer", {
57
+ * document: "query Viewer{viewer{login}}",
58
+ * result: Schema.Struct({ viewer: Schema.Struct({ login: Schema.String }) })
59
+ * })
60
+ *
61
+ * const ViewerGraphQLGroup = GraphQLGroup.make(Viewer)
62
+ *
63
+ * ViewerGraphQLGroup.operations.map((op) => op.name) // => ["Viewer"]
64
+ * ```
65
+ *
66
+ * @stability experimental
67
+ * @category constructors
68
+ * @since 4.0.0
69
+ */
70
+ export const make = (...operations) => makeProto(operations, []);
71
+ /**
72
+ * Merges groups into one. Middleware attached to a source group stays
73
+ * attached to that group's operations; middleware attached to the merged
74
+ * group afterwards runs outside all of it.
75
+ *
76
+ * **Example** (Auth on one file, logging on everything)
77
+ *
78
+ * ```ts import.meta.vitest
79
+ * import { Schema } from "effect"
80
+ * import { GraphQL, GraphQLGroup, GraphQLMiddleware } from "effect/graphql"
81
+ *
82
+ * class Auth extends GraphQLMiddleware.Service<Auth>()("app/Auth") {}
83
+ * class Logging extends GraphQLMiddleware.Service<Logging>()("app/Logging") {}
84
+ *
85
+ * const Viewer = GraphQL.query("Viewer", {
86
+ * document: "query Viewer{viewer{login}}",
87
+ * result: Schema.Struct({ viewer: Schema.Struct({ login: Schema.String }) })
88
+ * })
89
+ * const Rate = GraphQL.query("Rate", {
90
+ * document: "query Rate{rateLimit{remaining}}",
91
+ * result: Schema.Struct({ rateLimit: Schema.Struct({ remaining: Schema.Int }) })
92
+ * })
93
+ *
94
+ * const all = GraphQLGroup.merge(GraphQLGroup.make(Viewer).middleware(Auth), GraphQLGroup.make(Rate))
95
+ * .middleware(Logging)
96
+ *
97
+ * all.operations.map((op) => op.name) // => ["Viewer", "Rate"]
98
+ * all.middlewares.map((m) => m.key) // => ["app/Logging"]
99
+ * all.operations[0].middlewares.map((m) => m.key) // => ["app/Auth"]
100
+ * ```
101
+ *
102
+ * @stability experimental
103
+ * @category combinators
104
+ * @since 4.0.0
105
+ */
106
+ export const merge = (...groups) => makeProto(groups.flatMap(group => group.middlewares.length === 0 ? group.operations : group.operations.map(operation => Object.assign(Object.create(Object.getPrototypeOf(operation)), operation, {
107
+ middlewares: [...group.middlewares, ...operation.middlewares]
108
+ }))), []);
109
+ //# sourceMappingURL=GraphQLGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphQLGroup.js","names":[],"sources":["../../src/graphql/GraphQLGroup.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;;;;AAQA,SAAwB,aAAa,QAAQ,gBAAgB;AAC7D,SAAS,WAAW,QAAQ,iBAAiB;AAI7C,MAAM,MAAM,GAAG,8BAA8B;AAwC7C;;;;;;;AAOA,OAAO,MAAM,cAAc,GAAI,CAAU,IAAe,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC;AAE9E,MAAM,KAAK,GAAG;EACZ,CAAC,MAAM,GAAG,MAAM;EAChB,IAAI;IACF,OAAO,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC;EACvC,CAAC;EACD,UAAU,CAAY,UAAwC;IAC5D,OAAO,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;EACtE;CACD;AAED;AACA;AACA;AACA,MAAM,SAAS,GAAG,CAChB,UAAsC,EACtC,WAAwD,KACjD;EACP,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB;EAC7C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;IAC3C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE;MACpD,MAAM,IAAI,KAAK,CAAC,2CAA2C,SAAS,CAAC,IAAI,GAAG,CAAC;IAC/E;IACA,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC;EACvC;EACA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAAE;EAAW,CAAE,CAAC;AACtG,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,OAAO,MAAM,IAAI,GAAG,CAA+C,GAAG,UAAe,KACnF,SAAS,CAAC,UAAU,EAAE,EAAE,CAA8B;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,OAAO,MAAM,KAAK,GAAG,CACnB,GAAG,MAAc,KAEjB,SAAS,CACP,MAAM,CAAC,OAAO,CAAE,KAAK,IACnB,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,GAC1B,KAAK,CAAC,UAAU,GAChB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAE,SAAS,IAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE;EACxE,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,WAAW;CAC7D,CAAC,CACH,CACJ,EACD,EAAE,CACyC","ignoreList":[]}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * GraphQL-level middleware provided as `Context.Service` implementations.
3
+ * Middleware can rewrite requests and inspect raw results, including response
4
+ * extensions and HTTP headers. Provide implementations with `Layer.succeed`
5
+ * or `Layer.effect`.
6
+ *
7
+ * @stability experimental
8
+ * @since 4.0.0
9
+ */
10
+ import * as Context from "../Context.ts";
11
+ import * as Effect from "../Effect.ts";
12
+ import * as Stream from "../Stream.ts";
13
+ import type * as Types from "../Types.ts";
14
+ import type * as GraphQL from "./GraphQL.ts";
15
+ import type { GraphQLClientError } from "./GraphQLClientError.ts";
16
+ import type { ExecutionResult, GraphQLRequest } from "./GraphQLProtocol.ts";
17
+ declare const TypeId = "~effect/graphql/GraphQLMiddleware";
18
+ /**
19
+ * Middleware handlers for queries, mutations and subscriptions. Both
20
+ * `execute` and `subscribe` are required.
21
+ *
22
+ * **Details**
23
+ *
24
+ * `execute` runs once per query or mutation. `subscribe` runs once per
25
+ * subscription attempt (the client re-runs the whole chain when it retries a
26
+ * subscription) and can map or tap the event stream.
27
+ *
28
+ * Both receive the operation being run, the request so far, and `next`, which
29
+ * runs the rest of the chain with the given request and returns the raw
30
+ * `ExecutionResult` (or, for `subscribe`, the stream of them). Its `status`
31
+ * and `headers` are the HTTP status and response headers the transport
32
+ * reported, if any; a middleware may rewrite them, and a failed call's
33
+ * `ResponseError` carries the final values. Request and response headers
34
+ * are `Headers.Headers` values; use `Headers.set` to rewrite them.
35
+ *
36
+ * `next` fails with `GraphQLClientError`, or with the error of a middleware
37
+ * further in, which is typed as `Types.unhandled`, as in `RpcMiddleware`.
38
+ * Narrow it, for example with `Effect.catchTag("GraphQLClientError", ...)`,
39
+ * before reading `reason`.
40
+ *
41
+ * Use {@link mapRequest} when the middleware only needs to transform the
42
+ * request.
43
+ *
44
+ * **Example** (Reading a rate-limit header)
45
+ *
46
+ * ```ts import.meta.vitest
47
+ * import { Effect } from "effect"
48
+ * import { GraphQLMiddleware } from "effect/graphql"
49
+ * import { Headers } from "effect/http"
50
+ *
51
+ * const rateLimit: GraphQLMiddleware.Implementation = {
52
+ * execute: ({ next, request }) =>
53
+ * Effect.tap(next(request), (result) =>
54
+ * Effect.log(result.headers === undefined ? undefined : Headers.get(result.headers, "x-ratelimit-remaining"))
55
+ * ),
56
+ * subscribe: ({ next, request }) => next(request)
57
+ * }
58
+ * ```
59
+ *
60
+ * @stability experimental
61
+ * @category models
62
+ * @since 4.0.0
63
+ */
64
+ export interface Implementation<E = never, R = never> {
65
+ readonly execute: (options: {
66
+ readonly operation: GraphQL.Any;
67
+ readonly request: GraphQLRequest;
68
+ readonly next: (request: GraphQLRequest) => Effect.Effect<ExecutionResult, GraphQLClientError | Types.unhandled>;
69
+ }) => Effect.Effect<ExecutionResult, GraphQLClientError | Types.unhandled | E, R>;
70
+ readonly subscribe: (options: {
71
+ readonly operation: GraphQL.Any;
72
+ readonly request: GraphQLRequest;
73
+ readonly next: (request: GraphQLRequest) => Stream.Stream<ExecutionResult, GraphQLClientError | Types.unhandled>;
74
+ }) => Stream.Stream<ExecutionResult, GraphQLClientError | Types.unhandled | E, R>;
75
+ }
76
+ /**
77
+ * The class returned by {@link Service}: a `Context.Service` for an
78
+ * {@link Implementation}, carrying the declared `error` and `requires` types.
79
+ *
80
+ * @stability experimental
81
+ * @category services
82
+ * @since 4.0.0
83
+ */
84
+ export interface ServiceClass<Self, Key extends string, E, R> extends Context.Service<Self, Implementation<E, R>> {
85
+ new (_: never): Context.ServiceClass.Shape<Key, Implementation<E, R>> & {
86
+ readonly [TypeId]: {
87
+ readonly error: E;
88
+ readonly requires: R;
89
+ };
90
+ };
91
+ readonly [TypeId]: {
92
+ readonly error: E;
93
+ readonly requires: R;
94
+ };
95
+ readonly key: Key;
96
+ }
97
+ /**
98
+ * Any middleware service class, with its error and requirement types erased.
99
+ *
100
+ * @stability experimental
101
+ * @category utility types
102
+ * @since 4.0.0
103
+ */
104
+ export interface AnyService extends Context.Service<any, Implementation<any, any>> {
105
+ readonly [TypeId]: {
106
+ readonly error: any;
107
+ readonly requires: any;
108
+ };
109
+ }
110
+ /**
111
+ * Extracts the service identifier of a middleware, which is what
112
+ * `GraphQLClient.make` requires.
113
+ *
114
+ * @stability experimental
115
+ * @category utility types
116
+ * @since 4.0.0
117
+ */
118
+ export type Identifier<M> = M extends Context.Service<infer I, any> ? I : never;
119
+ /**
120
+ * Extracts the error type a middleware declared.
121
+ *
122
+ * @stability experimental
123
+ * @category utility types
124
+ * @since 4.0.0
125
+ */
126
+ export type Error<M> = M extends {
127
+ readonly [TypeId]: {
128
+ readonly error: infer E;
129
+ };
130
+ } ? E : never;
131
+ /**
132
+ * Extracts the services a middleware declared it requires per call.
133
+ *
134
+ * @stability experimental
135
+ * @category utility types
136
+ * @since 4.0.0
137
+ */
138
+ export type Requires<M> = M extends {
139
+ readonly [TypeId]: {
140
+ readonly requires: infer R;
141
+ };
142
+ } ? R : never;
143
+ /**
144
+ * Declares a middleware tag. `requires` are services the implementation needs
145
+ * on every call, and `error` is what it can fail with; both show up on the
146
+ * requirements and error type of every client method the middleware is
147
+ * attached to.
148
+ *
149
+ * **Example** (An auth middleware that needs the current user)
150
+ *
151
+ * ```ts import.meta.vitest
152
+ * import { Context, Effect, Layer, Schema, Stream } from "effect"
153
+ * import { GraphQL, GraphQLClient, GraphQLGroup, GraphQLMiddleware, GraphQLProtocol } from "effect/graphql"
154
+ * import { Headers } from "effect/http"
155
+ *
156
+ * class CurrentUser extends Context.Service<CurrentUser, { readonly token: string }>()("CurrentUser") {}
157
+ * class TokenExpired extends Schema.TaggedError<TokenExpired>()("TokenExpired", {}) {}
158
+ *
159
+ * class Auth extends GraphQLMiddleware.Service<Auth, {
160
+ * requires: CurrentUser
161
+ * error: TokenExpired
162
+ * }>()("app/Auth") {}
163
+ *
164
+ * const AuthLive = Layer.succeed(
165
+ * Auth,
166
+ * GraphQLMiddleware.mapRequest(Effect.fnUntraced(function*(request) {
167
+ * const user = yield* CurrentUser
168
+ * if (user.token === "") return yield* new TokenExpired()
169
+ * return { ...request, headers: Headers.set(request.headers, "authorization", `Bearer ${user.token}`) }
170
+ * }))
171
+ * )
172
+ *
173
+ * const Viewer = GraphQL.query("Viewer", {
174
+ * document: "query Viewer{viewer{login}}",
175
+ * result: Schema.Struct({ viewer: Schema.Struct({ login: Schema.String }) })
176
+ * })
177
+ *
178
+ * const Scripted = Layer.succeed(GraphQLProtocol.GraphQLProtocol, {
179
+ * execute: (request) => Effect.succeed({ body: { data: { viewer: { login: request.headers.authorization } } } }),
180
+ * subscribe: () => Stream.empty
181
+ * })
182
+ *
183
+ * const program = Effect.gen(function*() {
184
+ * const client = yield* GraphQLClient.make(GraphQLGroup.make(Viewer).middleware(Auth))
185
+ * // CurrentUser is required by the method because Auth is attached
186
+ * return yield* client.Viewer().pipe(Effect.provideService(CurrentUser, { token: "abc" }))
187
+ * })
188
+ *
189
+ * await Effect.runPromise(program.pipe(Effect.provide([Scripted, AuthLive]))) // => { viewer: { login: "Bearer abc" } }
190
+ * ```
191
+ *
192
+ * @stability experimental
193
+ * @category constructors
194
+ * @since 4.0.0
195
+ */
196
+ export declare const Service: <Self, Config extends {
197
+ readonly requires?: any;
198
+ readonly error?: any;
199
+ } = {}>() => <const Key extends string>(key: Key) => ServiceClass<Self, Key, Config extends {
200
+ readonly error: infer E;
201
+ } ? E : never, Config extends {
202
+ readonly requires: infer R;
203
+ } ? R : never>;
204
+ /**
205
+ * Builds an {@link Implementation} that transforms requests for queries,
206
+ * mutations and subscriptions. Use it to set headers, auth or extensions.
207
+ *
208
+ * **Example** (Adding a header to every request)
209
+ *
210
+ * ```ts import.meta.vitest
211
+ * import { Effect, Layer, Schema, Stream } from "effect"
212
+ * import { GraphQL, GraphQLClient, GraphQLGroup, GraphQLMiddleware, GraphQLProtocol } from "effect/graphql"
213
+ * import { Headers } from "effect/http"
214
+ *
215
+ * class RequestId extends GraphQLMiddleware.Service<RequestId>()("app/RequestId") {}
216
+ *
217
+ * const RequestIdLive = Layer.succeed(
218
+ * RequestId,
219
+ * GraphQLMiddleware.mapRequest((request) =>
220
+ * Effect.succeed({ ...request, headers: Headers.set(request.headers, "x-request-id", "abc") })
221
+ * )
222
+ * )
223
+ *
224
+ * const Viewer = GraphQL.query("Viewer", {
225
+ * document: "query Viewer{viewer{login}}",
226
+ * result: Schema.Struct({ viewer: Schema.Struct({ login: Schema.String }) })
227
+ * })
228
+ *
229
+ * const Scripted = Layer.succeed(GraphQLProtocol.GraphQLProtocol, {
230
+ * execute: (request) =>
231
+ * Effect.succeed({ body: { data: { viewer: { login: request.headers["x-request-id"] } } } }),
232
+ * subscribe: () => Stream.empty
233
+ * })
234
+ *
235
+ * const program = Effect.gen(function*() {
236
+ * const client = yield* GraphQLClient.make(GraphQLGroup.make(Viewer).middleware(RequestId))
237
+ * return yield* client.Viewer()
238
+ * })
239
+ *
240
+ * await Effect.runPromise(program.pipe(Effect.provide([Scripted, RequestIdLive]))) // => { viewer: { login: "abc" } }
241
+ * ```
242
+ *
243
+ * @stability experimental
244
+ * @category constructors
245
+ * @since 4.0.0
246
+ */
247
+ export declare const mapRequest: <E = never, R = never>(f: (request: GraphQLRequest, operation: GraphQL.Any) => Effect.Effect<GraphQLRequest, E, R>) => Implementation<E, R>;
248
+ export {};
249
+ //# sourceMappingURL=GraphQLMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphQLMiddleware.d.ts","sourceRoot":"","sources":["../../src/graphql/GraphQLMiddleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * GraphQL-level middleware provided as `Context.Service` implementations.
3
+ * Middleware can rewrite requests and inspect raw results, including response
4
+ * extensions and HTTP headers. Provide implementations with `Layer.succeed`
5
+ * or `Layer.effect`.
6
+ *
7
+ * @stability experimental
8
+ * @since 4.0.0
9
+ */
10
+ import * as Context from "../Context.js";
11
+ import * as Effect from "../Effect.js";
12
+ import * as Stream from "../Stream.js";
13
+ const TypeId = "~effect/graphql/GraphQLMiddleware";
14
+ /**
15
+ * Declares a middleware tag. `requires` are services the implementation needs
16
+ * on every call, and `error` is what it can fail with; both show up on the
17
+ * requirements and error type of every client method the middleware is
18
+ * attached to.
19
+ *
20
+ * **Example** (An auth middleware that needs the current user)
21
+ *
22
+ * ```ts import.meta.vitest
23
+ * import { Context, Effect, Layer, Schema, Stream } from "effect"
24
+ * import { GraphQL, GraphQLClient, GraphQLGroup, GraphQLMiddleware, GraphQLProtocol } from "effect/graphql"
25
+ * import { Headers } from "effect/http"
26
+ *
27
+ * class CurrentUser extends Context.Service<CurrentUser, { readonly token: string }>()("CurrentUser") {}
28
+ * class TokenExpired extends Schema.TaggedError<TokenExpired>()("TokenExpired", {}) {}
29
+ *
30
+ * class Auth extends GraphQLMiddleware.Service<Auth, {
31
+ * requires: CurrentUser
32
+ * error: TokenExpired
33
+ * }>()("app/Auth") {}
34
+ *
35
+ * const AuthLive = Layer.succeed(
36
+ * Auth,
37
+ * GraphQLMiddleware.mapRequest(Effect.fnUntraced(function*(request) {
38
+ * const user = yield* CurrentUser
39
+ * if (user.token === "") return yield* new TokenExpired()
40
+ * return { ...request, headers: Headers.set(request.headers, "authorization", `Bearer ${user.token}`) }
41
+ * }))
42
+ * )
43
+ *
44
+ * const Viewer = GraphQL.query("Viewer", {
45
+ * document: "query Viewer{viewer{login}}",
46
+ * result: Schema.Struct({ viewer: Schema.Struct({ login: Schema.String }) })
47
+ * })
48
+ *
49
+ * const Scripted = Layer.succeed(GraphQLProtocol.GraphQLProtocol, {
50
+ * execute: (request) => Effect.succeed({ body: { data: { viewer: { login: request.headers.authorization } } } }),
51
+ * subscribe: () => Stream.empty
52
+ * })
53
+ *
54
+ * const program = Effect.gen(function*() {
55
+ * const client = yield* GraphQLClient.make(GraphQLGroup.make(Viewer).middleware(Auth))
56
+ * // CurrentUser is required by the method because Auth is attached
57
+ * return yield* client.Viewer().pipe(Effect.provideService(CurrentUser, { token: "abc" }))
58
+ * })
59
+ *
60
+ * await Effect.runPromise(program.pipe(Effect.provide([Scripted, AuthLive]))) // => { viewer: { login: "Bearer abc" } }
61
+ * ```
62
+ *
63
+ * @stability experimental
64
+ * @category constructors
65
+ * @since 4.0.0
66
+ */
67
+ export const Service = () => key => {
68
+ function ServiceClass() {}
69
+ Object.setPrototypeOf(ServiceClass, Object.getPrototypeOf(Context.Service(key)));
70
+ return Object.assign(ServiceClass, {
71
+ key,
72
+ [TypeId]: TypeId
73
+ });
74
+ };
75
+ /**
76
+ * Builds an {@link Implementation} that transforms requests for queries,
77
+ * mutations and subscriptions. Use it to set headers, auth or extensions.
78
+ *
79
+ * **Example** (Adding a header to every request)
80
+ *
81
+ * ```ts import.meta.vitest
82
+ * import { Effect, Layer, Schema, Stream } from "effect"
83
+ * import { GraphQL, GraphQLClient, GraphQLGroup, GraphQLMiddleware, GraphQLProtocol } from "effect/graphql"
84
+ * import { Headers } from "effect/http"
85
+ *
86
+ * class RequestId extends GraphQLMiddleware.Service<RequestId>()("app/RequestId") {}
87
+ *
88
+ * const RequestIdLive = Layer.succeed(
89
+ * RequestId,
90
+ * GraphQLMiddleware.mapRequest((request) =>
91
+ * Effect.succeed({ ...request, headers: Headers.set(request.headers, "x-request-id", "abc") })
92
+ * )
93
+ * )
94
+ *
95
+ * const Viewer = GraphQL.query("Viewer", {
96
+ * document: "query Viewer{viewer{login}}",
97
+ * result: Schema.Struct({ viewer: Schema.Struct({ login: Schema.String }) })
98
+ * })
99
+ *
100
+ * const Scripted = Layer.succeed(GraphQLProtocol.GraphQLProtocol, {
101
+ * execute: (request) =>
102
+ * Effect.succeed({ body: { data: { viewer: { login: request.headers["x-request-id"] } } } }),
103
+ * subscribe: () => Stream.empty
104
+ * })
105
+ *
106
+ * const program = Effect.gen(function*() {
107
+ * const client = yield* GraphQLClient.make(GraphQLGroup.make(Viewer).middleware(RequestId))
108
+ * return yield* client.Viewer()
109
+ * })
110
+ *
111
+ * await Effect.runPromise(program.pipe(Effect.provide([Scripted, RequestIdLive]))) // => { viewer: { login: "abc" } }
112
+ * ```
113
+ *
114
+ * @stability experimental
115
+ * @category constructors
116
+ * @since 4.0.0
117
+ */
118
+ export const mapRequest = f => ({
119
+ execute: ({
120
+ next,
121
+ operation,
122
+ request
123
+ }) => Effect.flatMap(f(request, operation), next),
124
+ subscribe: ({
125
+ next,
126
+ operation,
127
+ request
128
+ }) => Stream.unwrap(Effect.map(f(request, operation), next))
129
+ });
130
+ //# sourceMappingURL=GraphQLMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphQLMiddleware.js","names":[],"sources":["../../src/graphql/GraphQLMiddleware.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;;;;;AASA,OAAO,KAAK,OAAO,MAAM,eAAe;AACxC,OAAO,KAAK,MAAM,MAAM,cAAc;AACtC,OAAO,KAAK,MAAM,MAAM,cAAc;AAMtC,MAAM,MAAM,GAAG,mCAAmC;AAoHlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA,OAAO,MAAM,OAAO,GAAG,MAYtB,GAAW,IAAI;EACd,SAAS,YAAY,IAAI;EACzB,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAY,GAAG,CAAC,CAAC,CAAC;EAC3F,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;IAAE,GAAG;IAAE,CAAC,MAAM,GAAG;EAAM,CAAE,CAAQ;AACtE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,OAAO,MAAM,UAAU,GACrB,CAA2F,KACjE;EAC1B,OAAO,EAAE,CAAC;IAAE,IAAI;IAAE,SAAS;IAAE;EAAO,CAAE,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC;EACtF,SAAS,EAAE,CAAC;IAAE,IAAI;IAAE,SAAS;IAAE;EAAO,CAAE,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC;CACnG,CAAC","ignoreList":[]}