@reventlessdev/reventless-graphql-server 1.0.0-alpha.92 → 1.0.0-alpha.94
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 +3 -3
- package/src/GraphQL_ServerInstance.res +22 -0
- package/src/GraphQL_ServerInstance.res.mjs +22 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,21 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 1.0.0-alpha.94 (2026-08-21)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **core:** make @resolves/[@resolves](https://github.com/resolves)Many work end to end ([4c52957](https://github.com/ReventlessDev/reventless-core/commit/4c5295759dcb4b3eda4f0f4f2c1bc387fed88fcb))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# 1.0.0-alpha.93 (2026-08-20)
|
|
14
|
+
|
|
15
|
+
**Note:** Version bump only for package @reventlessdev/reventless-graphql-server
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
6
21
|
# 1.0.0-alpha.92 (2026-08-20)
|
|
7
22
|
|
|
8
23
|
**Note:** Version bump only for package @reventlessdev/reventless-graphql-server
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reventlessdev/reventless-graphql-server",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.94",
|
|
4
4
|
"description": "Transport-neutral GraphQL server runtime for Reventless: schema-from-fragments, resolver registration, an HTTP + graphql-ws listener, and a subscription fan-out bridge with a pluggable PubSub backend",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@reventlessdev/
|
|
8
|
-
"@reventlessdev/
|
|
7
|
+
"@reventlessdev/rescript-graphql-yoga": "1.0.0-alpha.27",
|
|
8
|
+
"@reventlessdev/reventless-core": "3.0.0-alpha.246"
|
|
9
9
|
},
|
|
10
10
|
"devDependencies": {
|
|
11
11
|
"rescript": "12.3.0"
|
|
@@ -42,6 +42,11 @@ type t = {
|
|
|
42
42
|
registerQueries: (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => unit,
|
|
43
43
|
registerSubscriptions: (~sdlFields: array<string>, ~resolvers: dict<resolverFn>) => unit,
|
|
44
44
|
registerTypes: (~sdlTypes: array<string>) => unit,
|
|
45
|
+
/** Resolvers for fields of an object type rather than of a root type — the
|
|
46
|
+
cross-table fields `@resolves` / `@resolvesMany` add to a queryable. The
|
|
47
|
+
SDL for those fields comes from the plugin's schema fragment, so only the
|
|
48
|
+
resolver map is registered here. */
|
|
49
|
+
registerFieldResolvers: (~typeName: string, ~resolvers: dict<resolverFn>) => unit,
|
|
45
50
|
getMutationResolver: string => option<resolverFn>,
|
|
46
51
|
getQueryResolver: string => option<resolverFn>,
|
|
47
52
|
// `~contextFactory` is the yoga context factory — when supplied, requests
|
|
@@ -76,6 +81,7 @@ let make = (~label: string="GraphQL"): t => {
|
|
|
76
81
|
let mutationResolvers: ref<dict<resolverFn>> = ref(Dict.make())
|
|
77
82
|
let queryResolvers: ref<dict<resolverFn>> = ref(Dict.make())
|
|
78
83
|
let subscriptionResolvers: ref<dict<resolverFn>> = ref(Dict.make())
|
|
84
|
+
let fieldResolvers: ref<dict<dict<resolverFn>>> = ref(Dict.make())
|
|
79
85
|
let mutationFields: ref<array<string>> = ref([])
|
|
80
86
|
let queryFields: ref<array<string>> = ref([])
|
|
81
87
|
let subscriptionFields: ref<array<string>> = ref([])
|
|
@@ -110,6 +116,17 @@ let make = (~label: string="GraphQL"): t => {
|
|
|
110
116
|
)
|
|
111
117
|
}
|
|
112
118
|
|
|
119
|
+
let registerFieldResolvers = (~typeName: string, ~resolvers: dict<resolverFn>) => {
|
|
120
|
+
let forType = switch fieldResolvers.contents->Dict.get(typeName) {
|
|
121
|
+
| Some(d) => d
|
|
122
|
+
| None =>
|
|
123
|
+
let d = Dict.make()
|
|
124
|
+
fieldResolvers.contents->Dict.set(typeName, d)
|
|
125
|
+
d
|
|
126
|
+
}
|
|
127
|
+
resolvers->Dict.toArray->Array.forEach(((k, v)) => forType->Dict.set(k, v))
|
|
128
|
+
}
|
|
129
|
+
|
|
113
130
|
// Identical type blocks dedupe: shared-type registrations (e.g. the
|
|
114
131
|
// CommandResult union family) may be repeated by every component that needs
|
|
115
132
|
// them; a duplicate definition in one document would fail createSchema.
|
|
@@ -173,6 +190,9 @@ ${mutations}
|
|
|
173
190
|
if subscriptionResolvers.contents->Dict.keysToArray->Array.length > 0 {
|
|
174
191
|
resolvers->Dict.set("Subscription", subscriptionResolvers.contents)
|
|
175
192
|
}
|
|
193
|
+
fieldResolvers.contents
|
|
194
|
+
->Dict.toArray
|
|
195
|
+
->Array.forEach(((typeName, byField)) => resolvers->Dict.set(typeName, byField))
|
|
176
196
|
let sdl = buildSdl()
|
|
177
197
|
lastFullSdl.contents = Some(sdl)
|
|
178
198
|
let schema = YG.createSchema({"typeDefs": sdl, "resolvers": resolvers})
|
|
@@ -220,6 +240,7 @@ ${mutations}
|
|
|
220
240
|
mutationResolvers.contents = Dict.make()
|
|
221
241
|
queryResolvers.contents = Dict.make()
|
|
222
242
|
subscriptionResolvers.contents = Dict.make()
|
|
243
|
+
fieldResolvers.contents = Dict.make()
|
|
223
244
|
mutationFields.contents = []
|
|
224
245
|
queryFields.contents = []
|
|
225
246
|
subscriptionFields.contents = []
|
|
@@ -318,6 +339,7 @@ ${mutations}
|
|
|
318
339
|
registerQueries,
|
|
319
340
|
registerSubscriptions,
|
|
320
341
|
registerTypes,
|
|
342
|
+
registerFieldResolvers,
|
|
321
343
|
getMutationResolver,
|
|
322
344
|
getQueryResolver,
|
|
323
345
|
start,
|
|
@@ -30,6 +30,9 @@ function make(labelOpt) {
|
|
|
30
30
|
let subscriptionResolvers = {
|
|
31
31
|
contents: {}
|
|
32
32
|
};
|
|
33
|
+
let fieldResolvers = {
|
|
34
|
+
contents: {}
|
|
35
|
+
};
|
|
33
36
|
let mutationFields = {
|
|
34
37
|
contents: []
|
|
35
38
|
};
|
|
@@ -71,6 +74,20 @@ function make(labelOpt) {
|
|
|
71
74
|
subscriptionResolvers.contents[param[0]] = param[1];
|
|
72
75
|
});
|
|
73
76
|
};
|
|
77
|
+
let registerFieldResolvers = (typeName, resolvers) => {
|
|
78
|
+
let d = fieldResolvers.contents[typeName];
|
|
79
|
+
let forType;
|
|
80
|
+
if (d !== undefined) {
|
|
81
|
+
forType = d;
|
|
82
|
+
} else {
|
|
83
|
+
let d$1 = {};
|
|
84
|
+
fieldResolvers.contents[typeName] = d$1;
|
|
85
|
+
forType = d$1;
|
|
86
|
+
}
|
|
87
|
+
Object.entries(resolvers).forEach(param => {
|
|
88
|
+
forType[param[0]] = param[1];
|
|
89
|
+
});
|
|
90
|
+
};
|
|
74
91
|
let registerTypes = sdlTypes => {
|
|
75
92
|
sdlTypes.forEach(t => {
|
|
76
93
|
if (!typeDefinitions.contents.includes(t)) {
|
|
@@ -112,6 +129,9 @@ type Mutation {
|
|
|
112
129
|
if (Object.keys(subscriptionResolvers.contents).length !== 0) {
|
|
113
130
|
resolvers["Subscription"] = subscriptionResolvers.contents;
|
|
114
131
|
}
|
|
132
|
+
Object.entries(fieldResolvers.contents).forEach(param => {
|
|
133
|
+
resolvers[param[0]] = param[1];
|
|
134
|
+
});
|
|
115
135
|
let sdl = buildSdl();
|
|
116
136
|
lastFullSdl.contents = sdl;
|
|
117
137
|
let schema = GraphqlYoga$1.createSchema({
|
|
@@ -167,6 +187,7 @@ type Mutation {
|
|
|
167
187
|
mutationResolvers.contents = {};
|
|
168
188
|
queryResolvers.contents = {};
|
|
169
189
|
subscriptionResolvers.contents = {};
|
|
190
|
+
fieldResolvers.contents = {};
|
|
170
191
|
mutationFields.contents = [];
|
|
171
192
|
queryFields.contents = [];
|
|
172
193
|
subscriptionFields.contents = [];
|
|
@@ -258,6 +279,7 @@ type Mutation {
|
|
|
258
279
|
registerQueries: registerQueries,
|
|
259
280
|
registerSubscriptions: registerSubscriptions,
|
|
260
281
|
registerTypes: registerTypes,
|
|
282
|
+
registerFieldResolvers: registerFieldResolvers,
|
|
261
283
|
getMutationResolver: getMutationResolver,
|
|
262
284
|
getQueryResolver: getQueryResolver,
|
|
263
285
|
start: start,
|