@reventlessdev/reventless-local 3.0.0-alpha.138 → 3.0.0-alpha.140
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.
- package/CHANGELOG.md +15 -0
- package/package.json +10 -9
- package/rescript.json +1 -0
- package/src/Platform.res +3 -3
- package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res +27 -54
- package/src/adapter/Api/LocalGraphQL_SubscriptionResolvers.res.mjs +13 -26
- package/src/adapter/CommandGenerator/CommandGeneratorResolvers_GraphQL.res +5 -5
- package/src/adapter/CommandGenerator/InboundTranslationResolvers_GraphQL.res +2 -2
- package/src/adapter/DomainGraphQL_Server.res +6 -6
- package/src/adapter/PlatformGraphQL_Server.res +6 -6
- package/src/adapter/PlatformGraphQL_Server.res.mjs +2 -2
- package/src/adapter/QueryDb/QueryDbResolvers_GraphQL.res +11 -11
- package/tests/SplitApiFixtures.res +4 -4
- package/tests/SplitApiFixtures.res.mjs +2 -2
- package/tests/SplitApiTest.res +2 -2
- package/tests/adapter/GraphQLSubscriptionBridgeTest.res +120 -0
- package/tests/adapter/GraphQLSubscriptionBridgeTest.res.mjs +96 -0
- package/src/adapter/GraphQL_ServerInstance.res +0 -310
- package/src/adapter/GraphQL_ServerInstance.res.mjs +0 -257
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
-
|
|
3
|
-
import * as Ws from "ws";
|
|
4
|
-
import * as Http from "http";
|
|
5
|
-
import * as GraphqlYoga from "graphql-yoga";
|
|
6
|
-
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
7
|
-
import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
|
|
8
|
-
import * as Logger$ReventlessCore from "@reventlessdev/reventless-core/src/util/Logger.res.mjs";
|
|
9
|
-
import * as Ws$1 from "graphql-ws/lib/use/ws";
|
|
10
|
-
import * as GraphQL_Stitcher$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_Stitcher.res.mjs";
|
|
11
|
-
|
|
12
|
-
let log = Logger$ReventlessCore.fromEnv();
|
|
13
|
-
|
|
14
|
-
let debug = Stdlib_Option.isSome(process.env["GRAPHQL_DEBUG"]);
|
|
15
|
-
|
|
16
|
-
function extractFieldName(sdlField) {
|
|
17
|
-
let trimmed = sdlField.trim();
|
|
18
|
-
return Stdlib_Option.getOr(Stdlib_Option.getOr(trimmed.split("(")[0], "").trim().split(":")[0], "").trim();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function make(labelOpt) {
|
|
22
|
-
let label = labelOpt !== undefined ? labelOpt : "GraphQL";
|
|
23
|
-
let mutationResolvers = {
|
|
24
|
-
contents: {}
|
|
25
|
-
};
|
|
26
|
-
let queryResolvers = {
|
|
27
|
-
contents: {}
|
|
28
|
-
};
|
|
29
|
-
let subscriptionResolvers = {
|
|
30
|
-
contents: {}
|
|
31
|
-
};
|
|
32
|
-
let mutationFields = {
|
|
33
|
-
contents: []
|
|
34
|
-
};
|
|
35
|
-
let queryFields = {
|
|
36
|
-
contents: []
|
|
37
|
-
};
|
|
38
|
-
let subscriptionFields = {
|
|
39
|
-
contents: []
|
|
40
|
-
};
|
|
41
|
-
let typeDefinitions = {
|
|
42
|
-
contents: []
|
|
43
|
-
};
|
|
44
|
-
let activeServer = {
|
|
45
|
-
contents: undefined
|
|
46
|
-
};
|
|
47
|
-
let activeSchema = {
|
|
48
|
-
contents: undefined
|
|
49
|
-
};
|
|
50
|
-
let lastFullSdl = {
|
|
51
|
-
contents: undefined
|
|
52
|
-
};
|
|
53
|
-
let registerMutations = (sdlFields, resolvers) => {
|
|
54
|
-
mutationFields.contents = mutationFields.contents.concat(sdlFields);
|
|
55
|
-
Object.entries(resolvers).forEach(param => {
|
|
56
|
-
mutationResolvers.contents[param[0]] = param[1];
|
|
57
|
-
});
|
|
58
|
-
};
|
|
59
|
-
let registerQueries = (sdlFields, resolvers) => {
|
|
60
|
-
queryFields.contents = queryFields.contents.concat(sdlFields);
|
|
61
|
-
Object.entries(resolvers).forEach(param => {
|
|
62
|
-
queryResolvers.contents[param[0]] = param[1];
|
|
63
|
-
});
|
|
64
|
-
};
|
|
65
|
-
let registerSubscriptions = (sdlFields, resolvers) => {
|
|
66
|
-
subscriptionFields.contents = subscriptionFields.contents.concat(sdlFields);
|
|
67
|
-
Object.entries(resolvers).forEach(param => {
|
|
68
|
-
subscriptionResolvers.contents[param[0]] = param[1];
|
|
69
|
-
});
|
|
70
|
-
};
|
|
71
|
-
let registerTypes = sdlTypes => {
|
|
72
|
-
typeDefinitions.contents = typeDefinitions.contents.concat(sdlTypes);
|
|
73
|
-
};
|
|
74
|
-
let getMutationResolver = fieldName => mutationResolvers.contents[fieldName];
|
|
75
|
-
let getQueryResolver = fieldName => queryResolvers.contents[fieldName];
|
|
76
|
-
let buildSdl = () => {
|
|
77
|
-
let typesSdl = typeDefinitions.contents.length !== 0 ? typeDefinitions.contents.join("\n\n") : "";
|
|
78
|
-
let mutations = mutationFields.contents.length !== 0 ? mutationFields.contents.join("\n") : " _noop: String";
|
|
79
|
-
let queries = queryFields.contents.length !== 0 ? queryFields.contents.join("\n") : " _noop: String";
|
|
80
|
-
let queriesMutationsSdl = `type Query {
|
|
81
|
-
` + queries + `
|
|
82
|
-
}
|
|
83
|
-
type Mutation {
|
|
84
|
-
` + mutations + `
|
|
85
|
-
}`;
|
|
86
|
-
let subscriptionsSdl = subscriptionFields.contents.length !== 0 ? `\n\ntype Subscription {\n` + subscriptionFields.contents.join("\n") + `\n}` : "";
|
|
87
|
-
let base = typesSdl.length > 0 ? typesSdl + "\n\n" + queriesMutationsSdl : queriesMutationsSdl;
|
|
88
|
-
return base + subscriptionsSdl;
|
|
89
|
-
};
|
|
90
|
-
let stop = () => {
|
|
91
|
-
let server = activeServer.contents;
|
|
92
|
-
if (server !== undefined) {
|
|
93
|
-
Primitive_option.valFromOption(server).close(() => {});
|
|
94
|
-
activeServer.contents = undefined;
|
|
95
|
-
activeSchema.contents = undefined;
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
let start = (portOpt, contextFactory, param) => {
|
|
100
|
-
let port = portOpt !== undefined ? portOpt : 4000;
|
|
101
|
-
let resolvers = {};
|
|
102
|
-
resolvers["Query"] = queryResolvers.contents;
|
|
103
|
-
resolvers["Mutation"] = mutationResolvers.contents;
|
|
104
|
-
if (Object.keys(subscriptionResolvers.contents).length !== 0) {
|
|
105
|
-
resolvers["Subscription"] = subscriptionResolvers.contents;
|
|
106
|
-
}
|
|
107
|
-
let sdl = buildSdl();
|
|
108
|
-
lastFullSdl.contents = sdl;
|
|
109
|
-
let schema = GraphqlYoga.createSchema({
|
|
110
|
-
typeDefs: sdl,
|
|
111
|
-
resolvers: resolvers
|
|
112
|
-
});
|
|
113
|
-
activeSchema.contents = Primitive_option.some(schema);
|
|
114
|
-
let yoga = contextFactory !== undefined ? GraphqlYoga.createYoga({
|
|
115
|
-
schema: schema,
|
|
116
|
-
graphiql: true,
|
|
117
|
-
logging: debug,
|
|
118
|
-
maskedErrors: !debug,
|
|
119
|
-
context: contextFactory
|
|
120
|
-
}) : GraphqlYoga.createYoga({
|
|
121
|
-
schema: schema,
|
|
122
|
-
graphiql: true,
|
|
123
|
-
logging: debug,
|
|
124
|
-
maskedErrors: !debug
|
|
125
|
-
});
|
|
126
|
-
let server = Http.createServer(yoga);
|
|
127
|
-
server.listen(port, () => log.info(label, undefined, `listening on http://localhost:` + port.toString() + `/graphql`));
|
|
128
|
-
if (Object.keys(subscriptionResolvers.contents).length !== 0) {
|
|
129
|
-
let wss = new Ws.WebSocketServer({
|
|
130
|
-
server: server,
|
|
131
|
-
path: "/graphql"
|
|
132
|
-
});
|
|
133
|
-
Ws$1.useServer({
|
|
134
|
-
schema: schema
|
|
135
|
-
}, wss);
|
|
136
|
-
log.info(label, undefined, `graphql-ws subscriptions on ws://localhost:` + port.toString() + `/graphql`);
|
|
137
|
-
}
|
|
138
|
-
activeServer.contents = Primitive_option.some(server);
|
|
139
|
-
};
|
|
140
|
-
let reset = () => {
|
|
141
|
-
mutationResolvers.contents = {};
|
|
142
|
-
queryResolvers.contents = {};
|
|
143
|
-
subscriptionResolvers.contents = {};
|
|
144
|
-
mutationFields.contents = [];
|
|
145
|
-
queryFields.contents = [];
|
|
146
|
-
subscriptionFields.contents = [];
|
|
147
|
-
typeDefinitions.contents = [];
|
|
148
|
-
activeSchema.contents = undefined;
|
|
149
|
-
lastFullSdl.contents = undefined;
|
|
150
|
-
};
|
|
151
|
-
let getFullSdl = () => lastFullSdl.contents;
|
|
152
|
-
let getSchema = () => activeSchema.contents;
|
|
153
|
-
let diagnostics = () => {
|
|
154
|
-
let mutFieldNames = mutationFields.contents.map(extractFieldName).filter(n => n !== "_noop");
|
|
155
|
-
let queryFieldNames = queryFields.contents.map(extractFieldName).filter(n => n !== "_noop");
|
|
156
|
-
let mutResolverNames = Object.keys(mutationResolvers.contents);
|
|
157
|
-
let queryResolverNames = Object.keys(queryResolvers.contents);
|
|
158
|
-
let mismatches = [];
|
|
159
|
-
let mutResolverSet = new Set(mutResolverNames);
|
|
160
|
-
mutFieldNames.forEach(name => {
|
|
161
|
-
if (!mutResolverSet.has(name)) {
|
|
162
|
-
mismatches.push(`Mutation "` + name + `": SDL field but no resolver`);
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
let queryResolverSet = new Set(queryResolverNames);
|
|
167
|
-
queryFieldNames.forEach(name => {
|
|
168
|
-
if (!queryResolverSet.has(name)) {
|
|
169
|
-
mismatches.push(`Query "` + name + `": SDL field but no resolver`);
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
let mutFieldSet = new Set(mutFieldNames);
|
|
174
|
-
mutResolverNames.forEach(name => {
|
|
175
|
-
if (!mutFieldSet.has(name)) {
|
|
176
|
-
mismatches.push(`Mutation "` + name + `": resolver but no SDL field`);
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
let queryFieldSet = new Set(queryFieldNames);
|
|
181
|
-
queryResolverNames.forEach(name => {
|
|
182
|
-
if (!queryFieldSet.has(name)) {
|
|
183
|
-
mismatches.push(`Query "` + name + `": resolver but no SDL field`);
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
let typeNames = typeDefinitions.contents.map(GraphQL_Stitcher$ReventlessCore.extractLeadingName);
|
|
188
|
-
return {
|
|
189
|
-
registeredTypeDefinitions: typeNames,
|
|
190
|
-
registeredMutationFields: mutFieldNames,
|
|
191
|
-
registeredQueryFields: queryFieldNames,
|
|
192
|
-
registeredMutationResolvers: mutResolverNames,
|
|
193
|
-
registeredQueryResolvers: queryResolverNames,
|
|
194
|
-
typeCount: typeNames.length,
|
|
195
|
-
sdlMutationCount: mutFieldNames.length,
|
|
196
|
-
sdlQueryCount: queryFieldNames.length,
|
|
197
|
-
resolverMutationCount: mutResolverNames.length,
|
|
198
|
-
resolverQueryCount: queryResolverNames.length,
|
|
199
|
-
mismatches: mismatches,
|
|
200
|
-
fullSdl: lastFullSdl.contents,
|
|
201
|
-
serverRunning: Stdlib_Option.isSome(activeServer.contents)
|
|
202
|
-
};
|
|
203
|
-
};
|
|
204
|
-
let printDiagnostics = () => {
|
|
205
|
-
let p = s => log.info(label, undefined, s);
|
|
206
|
-
let d = diagnostics();
|
|
207
|
-
p("Diagnostics");
|
|
208
|
-
p(` Types: ` + d.typeCount.toString());
|
|
209
|
-
p(` Mutations: ` + d.sdlMutationCount.toString() + ` SDL fields, ` + d.resolverMutationCount.toString() + ` resolvers`);
|
|
210
|
-
p(` Queries: ` + d.sdlQueryCount.toString() + ` SDL fields, ` + d.resolverQueryCount.toString() + ` resolvers`);
|
|
211
|
-
if (d.mismatches.length !== 0) {
|
|
212
|
-
p(` Mismatches (` + d.mismatches.length.toString() + `):`);
|
|
213
|
-
d.mismatches.forEach(m => p(` - ` + m));
|
|
214
|
-
} else {
|
|
215
|
-
p(" No mismatches");
|
|
216
|
-
}
|
|
217
|
-
p(` Server running: ` + (
|
|
218
|
-
d.serverRunning ? "yes" : "no"
|
|
219
|
-
));
|
|
220
|
-
let sdl = d.fullSdl;
|
|
221
|
-
if (sdl !== undefined) {
|
|
222
|
-
p("");
|
|
223
|
-
p("--- Full SDL ---");
|
|
224
|
-
sdl.split("\n").forEach(p);
|
|
225
|
-
return p("--- End ---");
|
|
226
|
-
} else {
|
|
227
|
-
return p(" No SDL recorded");
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
return {
|
|
231
|
-
registerMutations: registerMutations,
|
|
232
|
-
registerQueries: registerQueries,
|
|
233
|
-
registerSubscriptions: registerSubscriptions,
|
|
234
|
-
registerTypes: registerTypes,
|
|
235
|
-
getMutationResolver: getMutationResolver,
|
|
236
|
-
getQueryResolver: getQueryResolver,
|
|
237
|
-
start: start,
|
|
238
|
-
stop: stop,
|
|
239
|
-
reset: reset,
|
|
240
|
-
buildSdl: buildSdl,
|
|
241
|
-
getFullSdl: getFullSdl,
|
|
242
|
-
getSchema: getSchema,
|
|
243
|
-
diagnostics: diagnostics,
|
|
244
|
-
printDiagnostics: printDiagnostics
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
let YG;
|
|
249
|
-
|
|
250
|
-
export {
|
|
251
|
-
YG,
|
|
252
|
-
log,
|
|
253
|
-
debug,
|
|
254
|
-
extractFieldName,
|
|
255
|
-
make,
|
|
256
|
-
}
|
|
257
|
-
/* log Not a pure module */
|