@executor-js/plugin-graphql 0.1.0 → 0.2.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 (37) hide show
  1. package/dist/AddGraphqlSource-LGXJQEAR.js +239 -0
  2. package/dist/AddGraphqlSource-LGXJQEAR.js.map +1 -0
  3. package/dist/EditGraphqlSource-5Y47ZAZ7.js +251 -0
  4. package/dist/EditGraphqlSource-5Y47ZAZ7.js.map +1 -0
  5. package/dist/GraphqlSourceSummary-F3JWR4YN.js +70 -0
  6. package/dist/GraphqlSourceSummary-F3JWR4YN.js.map +1 -0
  7. package/dist/api/group.d.ts +169 -13
  8. package/dist/api/handlers.d.ts +15 -3
  9. package/dist/api/index.d.ts +410 -0
  10. package/dist/chunk-7QSGNR4C.js +162 -0
  11. package/dist/chunk-7QSGNR4C.js.map +1 -0
  12. package/dist/chunk-HDPYOBBG.js +1633 -0
  13. package/dist/chunk-HDPYOBBG.js.map +1 -0
  14. package/dist/chunk-M4SJY6CB.js +45 -0
  15. package/dist/chunk-M4SJY6CB.js.map +1 -0
  16. package/dist/chunk-WPRU5C6M.js +182 -0
  17. package/dist/chunk-WPRU5C6M.js.map +1 -0
  18. package/dist/client.js +75 -0
  19. package/dist/client.js.map +1 -0
  20. package/dist/core.js +32 -10
  21. package/dist/index.js +2 -1
  22. package/dist/react/GraphqlSourceFields.d.ts +8 -0
  23. package/dist/react/GraphqlSourceSummary.d.ts +3 -1
  24. package/dist/react/atoms.d.ts +170 -10
  25. package/dist/react/client.d.ts +164 -12
  26. package/dist/sdk/index.d.ts +1 -1
  27. package/dist/sdk/introspect.d.ts +437 -43
  28. package/dist/sdk/invoke.d.ts +3 -2
  29. package/dist/sdk/plugin.d.ts +120 -170
  30. package/dist/sdk/store.d.ts +84 -11
  31. package/dist/sdk/types.d.ts +107 -3
  32. package/dist/testing/index.d.ts +52 -0
  33. package/dist/testing.js +131 -0
  34. package/dist/testing.js.map +1 -0
  35. package/package.json +18 -4
  36. package/dist/chunk-EIC5WI6C.js +0 -1225
  37. package/dist/chunk-EIC5WI6C.js.map +0 -1
@@ -0,0 +1,131 @@
1
+ // src/testing/index.ts
2
+ import {
3
+ Context,
4
+ Data,
5
+ Effect,
6
+ Layer,
7
+ Predicate,
8
+ Ref,
9
+ Schema as EffectSchema
10
+ } from "effect";
11
+ import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
12
+ import { GraphQLNonNull, GraphQLObjectType, GraphQLSchema, GraphQLString } from "graphql";
13
+ import { createYoga } from "graphql-yoga";
14
+ import { serveTestHttpApp } from "@executor-js/sdk/testing";
15
+ var GraphqlRequestPayload = EffectSchema.Struct({
16
+ query: EffectSchema.optional(EffectSchema.String),
17
+ variables: EffectSchema.optional(EffectSchema.Record(EffectSchema.String, EffectSchema.Unknown)),
18
+ operationName: EffectSchema.optional(EffectSchema.NullOr(EffectSchema.String))
19
+ });
20
+ var GraphqlTestServerAddressError = class extends Data.TaggedError("GraphqlTestServerAddressError") {
21
+ };
22
+ var GraphqlTestServerHandlerError = class extends Data.TaggedError("GraphqlTestServerHandlerError") {
23
+ };
24
+ var headersFromRequest = (headers) => Object.fromEntries(headers.entries());
25
+ var payloadFromParams = (params) => ({
26
+ query: params.query,
27
+ variables: typeof params.variables === "object" && params.variables !== null ? params.variables : void 0,
28
+ operationName: params.operationName ?? null
29
+ });
30
+ var captureRequest = (initial, requests) => {
31
+ const url = new URL(initial.request.url);
32
+ const captured = {
33
+ url: initial.request.url,
34
+ method: initial.request.method,
35
+ path: url.pathname,
36
+ headers: headersFromRequest(initial.request.headers),
37
+ payload: payloadFromParams(initial.params)
38
+ };
39
+ return Effect.runPromise(
40
+ Ref.update(requests, (all) => [...all, captured]).pipe(Effect.as(captured))
41
+ );
42
+ };
43
+ var serveGraphqlTestServer = (options) => Effect.gen(function* () {
44
+ const requests = yield* Ref.make([]);
45
+ const path = options.path ?? "/graphql";
46
+ const yoga = createYoga({
47
+ schema: options.schema,
48
+ graphqlEndpoint: path,
49
+ graphiql: false,
50
+ landingPage: false,
51
+ logging: false,
52
+ maskedErrors: false,
53
+ context: (initial) => captureRequest(initial, requests).then((request) => ({
54
+ request
55
+ }))
56
+ });
57
+ const server = yield* serveTestHttpApp(
58
+ (request) => Effect.gen(function* () {
59
+ const webRequest = yield* HttpServerRequest.toWeb(request);
60
+ const response = yield* Effect.promise(() => Promise.resolve(yoga.handle(webRequest, {})));
61
+ return HttpServerResponse.fromWeb(response);
62
+ }).pipe(
63
+ Effect.catch(
64
+ () => Effect.succeed(
65
+ HttpServerResponse.text("GraphQL test server failed", {
66
+ status: 500,
67
+ contentType: "text/plain"
68
+ })
69
+ )
70
+ )
71
+ )
72
+ ).pipe(
73
+ Effect.mapError(
74
+ (error) => Predicate.isTagged(error, "TestHttpServerAddressError") ? new GraphqlTestServerAddressError({ address: error.address }) : new GraphqlTestServerHandlerError({ cause: error.cause })
75
+ )
76
+ );
77
+ return {
78
+ endpoint: server.url(path),
79
+ schema: options.schema,
80
+ requests: Ref.get(requests),
81
+ clearRequests: Ref.set(requests, [])
82
+ };
83
+ });
84
+ var GraphqlTestServer = class _GraphqlTestServer extends Context.Service()(
85
+ "@executor-js/plugin-graphql/testing/GraphqlTestServer"
86
+ ) {
87
+ static layer = (options) => Layer.effect(_GraphqlTestServer, serveGraphqlTestServer(options));
88
+ };
89
+ var stringArgument = (args, key, fallback) => {
90
+ const value = args[key];
91
+ return typeof value === "string" ? value : fallback;
92
+ };
93
+ var makeGreetingGraphqlSchema = () => {
94
+ const Query = new GraphQLObjectType({
95
+ name: "Query",
96
+ fields: {
97
+ hello: {
98
+ type: GraphQLString,
99
+ description: "Say hello",
100
+ args: {
101
+ name: { type: GraphQLString }
102
+ },
103
+ resolve: (_source, args) => `Hello ${stringArgument(args, "name", "world")}`
104
+ }
105
+ }
106
+ });
107
+ const Mutation = new GraphQLObjectType({
108
+ name: "Mutation",
109
+ fields: {
110
+ setGreeting: {
111
+ type: GraphQLString,
112
+ description: "Set greeting message",
113
+ args: {
114
+ message: { type: new GraphQLNonNull(GraphQLString) }
115
+ },
116
+ resolve: (_source, args) => stringArgument(args, "message", "")
117
+ }
118
+ }
119
+ });
120
+ return new GraphQLSchema({ query: Query, mutation: Mutation });
121
+ };
122
+ var TestLayers = {
123
+ greeting: () => GraphqlTestServer.layer({ schema: makeGreetingGraphqlSchema() })
124
+ };
125
+ export {
126
+ GraphqlTestServer,
127
+ TestLayers,
128
+ makeGreetingGraphqlSchema,
129
+ serveGraphqlTestServer
130
+ };
131
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testing/index.ts"],"sourcesContent":["import {\n Context,\n Data,\n Effect,\n Layer,\n Predicate,\n Ref,\n Schema as EffectSchema,\n Scope,\n} from \"effect\";\nimport { HttpServerRequest, HttpServerResponse } from \"effect/unstable/http\";\nimport { GraphQLNonNull, GraphQLObjectType, GraphQLSchema, GraphQLString } from \"graphql\";\nimport { createYoga, type GraphQLParams, type YogaInitialContext } from \"graphql-yoga\";\nimport { serveTestHttpApp } from \"@executor-js/sdk/testing\";\n\nconst GraphqlRequestPayload = EffectSchema.Struct({\n query: EffectSchema.optional(EffectSchema.String),\n variables: EffectSchema.optional(EffectSchema.Record(EffectSchema.String, EffectSchema.Unknown)),\n operationName: EffectSchema.optional(EffectSchema.NullOr(EffectSchema.String)),\n});\n\ntype GraphqlRequestPayload = typeof GraphqlRequestPayload.Type;\n\nexport interface GraphqlTestRequest {\n readonly url: string;\n readonly method: string;\n readonly path: string;\n readonly headers: Readonly<Record<string, string>>;\n readonly payload: GraphqlRequestPayload;\n}\n\nexport interface GraphqlTestContext {\n readonly request: GraphqlTestRequest;\n}\n\nexport interface GraphqlTestServerOptions {\n readonly schema: GraphQLSchema;\n readonly path?: string;\n}\n\nexport interface GraphqlTestServerShape {\n readonly endpoint: string;\n readonly schema: GraphQLSchema;\n readonly requests: Effect.Effect<readonly GraphqlTestRequest[]>;\n readonly clearRequests: Effect.Effect<void>;\n}\n\nclass GraphqlTestServerAddressError extends Data.TaggedError(\"GraphqlTestServerAddressError\")<{\n readonly address: unknown;\n}> {}\n\nclass GraphqlTestServerHandlerError extends Data.TaggedError(\"GraphqlTestServerHandlerError\")<{\n readonly cause: unknown;\n}> {}\n\nconst headersFromRequest = (headers: Headers): Readonly<Record<string, string>> =>\n Object.fromEntries(headers.entries());\n\nconst payloadFromParams = (params: GraphQLParams): GraphqlRequestPayload => ({\n query: params.query,\n variables:\n typeof params.variables === \"object\" && params.variables !== null\n ? params.variables\n : undefined,\n operationName: params.operationName ?? null,\n});\n\nconst captureRequest = (\n initial: YogaInitialContext,\n requests: Ref.Ref<readonly GraphqlTestRequest[]>,\n) => {\n const url = new URL(initial.request.url);\n const captured: GraphqlTestRequest = {\n url: initial.request.url,\n method: initial.request.method,\n path: url.pathname,\n headers: headersFromRequest(initial.request.headers),\n payload: payloadFromParams(initial.params),\n };\n return Effect.runPromise(\n Ref.update(requests, (all) => [...all, captured]).pipe(Effect.as(captured)),\n );\n};\n\nexport const serveGraphqlTestServer = (\n options: GraphqlTestServerOptions,\n): Effect.Effect<\n GraphqlTestServerShape,\n GraphqlTestServerAddressError | GraphqlTestServerHandlerError,\n Scope.Scope\n> =>\n Effect.gen(function* () {\n const requests = yield* Ref.make<readonly GraphqlTestRequest[]>([]);\n const path = options.path ?? \"/graphql\";\n\n const yoga = createYoga<Record<string, never>, GraphqlTestContext>({\n schema: options.schema,\n graphqlEndpoint: path,\n graphiql: false,\n landingPage: false,\n logging: false,\n maskedErrors: false,\n context: (initial) =>\n captureRequest(initial, requests).then((request) => ({\n request,\n })),\n });\n\n const server = yield* serveTestHttpApp((request) =>\n Effect.gen(function* () {\n const webRequest = yield* HttpServerRequest.toWeb(request);\n const response = yield* Effect.promise(() => Promise.resolve(yoga.handle(webRequest, {})));\n return HttpServerResponse.fromWeb(response);\n }).pipe(\n Effect.catch(() =>\n Effect.succeed(\n HttpServerResponse.text(\"GraphQL test server failed\", {\n status: 500,\n contentType: \"text/plain\",\n }),\n ),\n ),\n ),\n ).pipe(\n Effect.mapError((error) =>\n Predicate.isTagged(error, \"TestHttpServerAddressError\")\n ? new GraphqlTestServerAddressError({ address: error.address })\n : new GraphqlTestServerHandlerError({ cause: error.cause }),\n ),\n );\n\n return {\n endpoint: server.url(path),\n schema: options.schema,\n requests: Ref.get(requests),\n clearRequests: Ref.set(requests, []),\n };\n });\n\nexport class GraphqlTestServer extends Context.Service<GraphqlTestServer, GraphqlTestServerShape>()(\n \"@executor-js/plugin-graphql/testing/GraphqlTestServer\",\n) {\n static readonly layer = (options: GraphqlTestServerOptions) =>\n Layer.effect(GraphqlTestServer, serveGraphqlTestServer(options));\n}\n\nconst stringArgument = (\n args: Readonly<Record<string, unknown>>,\n key: string,\n fallback: string,\n): string => {\n const value = args[key];\n return typeof value === \"string\" ? value : fallback;\n};\n\nexport const makeGreetingGraphqlSchema = (): GraphQLSchema => {\n const Query = new GraphQLObjectType<unknown, GraphqlTestContext>({\n name: \"Query\",\n fields: {\n hello: {\n type: GraphQLString,\n description: \"Say hello\",\n args: {\n name: { type: GraphQLString },\n },\n resolve: (_source, args) => `Hello ${stringArgument(args, \"name\", \"world\")}`,\n },\n },\n });\n\n const Mutation = new GraphQLObjectType<unknown, GraphqlTestContext>({\n name: \"Mutation\",\n fields: {\n setGreeting: {\n type: GraphQLString,\n description: \"Set greeting message\",\n args: {\n message: { type: new GraphQLNonNull(GraphQLString) },\n },\n resolve: (_source, args) => stringArgument(args, \"message\", \"\"),\n },\n },\n });\n\n return new GraphQLSchema({ query: Query, mutation: Mutation });\n};\n\nexport const TestLayers = {\n greeting: () => GraphqlTestServer.layer({ schema: makeGreetingGraphqlSchema() }),\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@executor-js/plugin-graphql",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/graphql",
5
5
  "bugs": {
6
6
  "url": "https://github.com/RhysSullivan/executor/issues"
@@ -27,6 +27,18 @@
27
27
  "types": "./dist/sdk/index.d.ts",
28
28
  "default": "./dist/core.js"
29
29
  }
30
+ },
31
+ "./client": {
32
+ "import": {
33
+ "types": "./dist/react/plugin-client.d.ts",
34
+ "default": "./dist/client.js"
35
+ }
36
+ },
37
+ "./testing": {
38
+ "import": {
39
+ "types": "./dist/testing/index.d.ts",
40
+ "default": "./dist/testing.js"
41
+ }
30
42
  }
31
43
  },
32
44
  "publishConfig": {
@@ -41,9 +53,11 @@
41
53
  },
42
54
  "dependencies": {
43
55
  "@effect/platform-node": "4.0.0-beta.59",
44
- "@executor-js/config": "0.1.0",
45
- "@executor-js/sdk": "0.1.0",
46
- "effect": "4.0.0-beta.59"
56
+ "@executor-js/config": "0.2.1",
57
+ "@executor-js/sdk": "0.2.1",
58
+ "effect": "4.0.0-beta.59",
59
+ "graphql": "^16.12.0",
60
+ "graphql-yoga": "^5.17.0"
47
61
  },
48
62
  "devDependencies": {
49
63
  "@effect/atom-react": "4.0.0-beta.59",