@graphql-tools/schema 8.4.0 → 8.5.0-alpha-b76ec274.0
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/{index.js → cjs/addResolversToSchema.js} +39 -260
- package/cjs/assertResolversPresent.js +47 -0
- package/cjs/chainResolvers.js +13 -0
- package/cjs/checkForResolveTypeResolver.js +23 -0
- package/cjs/extendResolversFromInterfaces.js +35 -0
- package/cjs/index.js +17 -0
- package/cjs/makeExecutableSchema.js +96 -0
- package/cjs/merge-schemas.js +29 -0
- package/cjs/package.json +1 -0
- package/cjs/types.js +2 -0
- package/{index.mjs → esm/addResolversToSchema.js} +5 -220
- package/esm/assertResolversPresent.js +43 -0
- package/esm/chainResolvers.js +9 -0
- package/esm/checkForResolveTypeResolver.js +19 -0
- package/esm/extendResolversFromInterfaces.js +31 -0
- package/esm/index.js +8 -0
- package/esm/makeExecutableSchema.js +92 -0
- package/esm/merge-schemas.js +25 -0
- package/esm/types.js +1 -0
- package/package.json +33 -12
- package/{addResolversToSchema.d.ts → typings/addResolversToSchema.d.ts} +0 -0
- package/{assertResolversPresent.d.ts → typings/assertResolversPresent.d.ts} +0 -0
- package/{chainResolvers.d.ts → typings/chainResolvers.d.ts} +0 -0
- package/{checkForResolveTypeResolver.d.ts → typings/checkForResolveTypeResolver.d.ts} +0 -0
- package/{extendResolversFromInterfaces.d.ts → typings/extendResolversFromInterfaces.d.ts} +0 -0
- package/typings/index.d.ts +8 -0
- package/{makeExecutableSchema.d.ts → typings/makeExecutableSchema.d.ts} +1 -1
- package/{merge-schemas.d.ts → typings/merge-schemas.d.ts} +1 -1
- package/{types.d.ts → typings/types.d.ts} +0 -0
- package/README.md +0 -5
- package/index.d.ts +0 -8
|
@@ -1,115 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
function assertResolversPresent(schema, resolverValidationOptions = {}) {
|
|
10
|
-
const { requireResolversForArgs, requireResolversForNonScalar, requireResolversForAllFields } = resolverValidationOptions;
|
|
11
|
-
if (requireResolversForAllFields && (requireResolversForArgs || requireResolversForNonScalar)) {
|
|
12
|
-
throw new TypeError('requireResolversForAllFields takes precedence over the more specific assertions. ' +
|
|
13
|
-
'Please configure either requireResolversForAllFields or requireResolversForArgs / ' +
|
|
14
|
-
'requireResolversForNonScalar, but not a combination of them.');
|
|
15
|
-
}
|
|
16
|
-
utils.forEachField(schema, (field, typeName, fieldName) => {
|
|
17
|
-
// requires a resolver for *every* field.
|
|
18
|
-
if (requireResolversForAllFields) {
|
|
19
|
-
expectResolver('requireResolversForAllFields', requireResolversForAllFields, field, typeName, fieldName);
|
|
20
|
-
}
|
|
21
|
-
// requires a resolver on every field that has arguments
|
|
22
|
-
if (requireResolversForArgs && field.args.length > 0) {
|
|
23
|
-
expectResolver('requireResolversForArgs', requireResolversForArgs, field, typeName, fieldName);
|
|
24
|
-
}
|
|
25
|
-
// requires a resolver on every field that returns a non-scalar type
|
|
26
|
-
if (requireResolversForNonScalar !== 'ignore' && !graphql.isScalarType(graphql.getNamedType(field.type))) {
|
|
27
|
-
expectResolver('requireResolversForNonScalar', requireResolversForNonScalar, field, typeName, fieldName);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
function expectResolver(validator, behavior, field, typeName, fieldName) {
|
|
32
|
-
if (!field.resolve) {
|
|
33
|
-
const message = `Resolver missing for "${typeName}.${fieldName}".
|
|
34
|
-
To disable this validator, use:
|
|
35
|
-
resolverValidationOptions: {
|
|
36
|
-
${validator}: 'ignore'
|
|
37
|
-
}`;
|
|
38
|
-
if (behavior === 'error') {
|
|
39
|
-
throw new Error(message);
|
|
40
|
-
}
|
|
41
|
-
if (behavior === 'warn') {
|
|
42
|
-
console.warn(message);
|
|
43
|
-
}
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
if (typeof field.resolve !== 'function') {
|
|
47
|
-
throw new Error(`Resolver "${typeName}.${fieldName}" must be a function`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function chainResolvers(resolvers) {
|
|
52
|
-
return (root, args, ctx, info) => resolvers.reduce((prev, curResolver) => {
|
|
53
|
-
if (curResolver != null) {
|
|
54
|
-
return curResolver(prev, args, ctx, info);
|
|
55
|
-
}
|
|
56
|
-
return graphql.defaultFieldResolver(prev, args, ctx, info);
|
|
57
|
-
}, root);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// If we have any union or interface types throw if no there is no resolveType resolver
|
|
61
|
-
function checkForResolveTypeResolver(schema, requireResolversForResolveType) {
|
|
62
|
-
utils.mapSchema(schema, {
|
|
63
|
-
[utils.MapperKind.ABSTRACT_TYPE]: type => {
|
|
64
|
-
if (!type.resolveType) {
|
|
65
|
-
const message = `Type "${type.name}" is missing a "__resolveType" resolver. Pass 'ignore' into ` +
|
|
66
|
-
'"resolverValidationOptions.requireResolversForResolveType" to disable this error.';
|
|
67
|
-
if (requireResolversForResolveType === 'error') {
|
|
68
|
-
throw new Error(message);
|
|
69
|
-
}
|
|
70
|
-
if (requireResolversForResolveType === 'warn') {
|
|
71
|
-
console.warn(message);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return undefined;
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function extendResolversFromInterfaces(schema, resolvers) {
|
|
80
|
-
const extendedResolvers = {};
|
|
81
|
-
const typeMap = schema.getTypeMap();
|
|
82
|
-
for (const typeName in typeMap) {
|
|
83
|
-
const type = typeMap[typeName];
|
|
84
|
-
if ('getInterfaces' in type) {
|
|
85
|
-
extendedResolvers[typeName] = {};
|
|
86
|
-
for (const iFace of type.getInterfaces()) {
|
|
87
|
-
if (resolvers[iFace.name]) {
|
|
88
|
-
for (const fieldName in resolvers[iFace.name]) {
|
|
89
|
-
if (fieldName === '__isTypeOf' || !fieldName.startsWith('__')) {
|
|
90
|
-
extendedResolvers[typeName][fieldName] = resolvers[iFace.name][fieldName];
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
const typeResolvers = resolvers[typeName];
|
|
96
|
-
extendedResolvers[typeName] = {
|
|
97
|
-
...extendedResolvers[typeName],
|
|
98
|
-
...typeResolvers,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
const typeResolvers = resolvers[typeName];
|
|
103
|
-
if (typeResolvers != null) {
|
|
104
|
-
extendedResolvers[typeName] = typeResolvers;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return extendedResolvers;
|
|
109
|
-
}
|
|
110
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addResolversToSchema = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
6
|
+
const checkForResolveTypeResolver_js_1 = require("./checkForResolveTypeResolver.js");
|
|
7
|
+
const extendResolversFromInterfaces_js_1 = require("./extendResolversFromInterfaces.js");
|
|
111
8
|
function addResolversToSchema(schemaOrOptions, legacyInputResolvers, legacyInputValidationOptions) {
|
|
112
|
-
const options =
|
|
9
|
+
const options = (0, graphql_1.isSchema)(schemaOrOptions)
|
|
113
10
|
? {
|
|
114
11
|
schema: schemaOrOptions,
|
|
115
12
|
resolvers: legacyInputResolvers !== null && legacyInputResolvers !== void 0 ? legacyInputResolvers : {},
|
|
@@ -119,7 +16,7 @@ function addResolversToSchema(schemaOrOptions, legacyInputResolvers, legacyInput
|
|
|
119
16
|
let { schema, resolvers: inputResolvers, defaultFieldResolver, resolverValidationOptions = {}, inheritResolversFromInterfaces = false, updateResolversInPlace = false, } = options;
|
|
120
17
|
const { requireResolversToMatchSchema = 'error', requireResolversForResolveType } = resolverValidationOptions;
|
|
121
18
|
const resolvers = inheritResolversFromInterfaces
|
|
122
|
-
? extendResolversFromInterfaces(schema, inputResolvers)
|
|
19
|
+
? (0, extendResolversFromInterfaces_js_1.extendResolversFromInterfaces)(schema, inputResolvers)
|
|
123
20
|
: inputResolvers;
|
|
124
21
|
for (const typeName in resolvers) {
|
|
125
22
|
const resolverValue = resolvers[typeName];
|
|
@@ -134,7 +31,7 @@ function addResolversToSchema(schemaOrOptions, legacyInputResolvers, legacyInput
|
|
|
134
31
|
}
|
|
135
32
|
throw new Error(`"${typeName}" defined in resolvers, but not in schema`);
|
|
136
33
|
}
|
|
137
|
-
else if (
|
|
34
|
+
else if ((0, graphql_1.isSpecifiedScalarType)(type)) {
|
|
138
35
|
// allow -- without recommending -- overriding of specified scalar types
|
|
139
36
|
for (const fieldName in resolverValue) {
|
|
140
37
|
if (fieldName.startsWith('__')) {
|
|
@@ -145,7 +42,7 @@ function addResolversToSchema(schemaOrOptions, legacyInputResolvers, legacyInput
|
|
|
145
42
|
}
|
|
146
43
|
}
|
|
147
44
|
}
|
|
148
|
-
else if (
|
|
45
|
+
else if ((0, graphql_1.isEnumType)(type)) {
|
|
149
46
|
const values = type.getValues();
|
|
150
47
|
for (const fieldName in resolverValue) {
|
|
151
48
|
if (!fieldName.startsWith('__') &&
|
|
@@ -156,7 +53,7 @@ function addResolversToSchema(schemaOrOptions, legacyInputResolvers, legacyInput
|
|
|
156
53
|
}
|
|
157
54
|
}
|
|
158
55
|
}
|
|
159
|
-
else if (
|
|
56
|
+
else if ((0, graphql_1.isUnionType)(type)) {
|
|
160
57
|
for (const fieldName in resolverValue) {
|
|
161
58
|
if (!fieldName.startsWith('__') &&
|
|
162
59
|
requireResolversToMatchSchema &&
|
|
@@ -165,7 +62,7 @@ function addResolversToSchema(schemaOrOptions, legacyInputResolvers, legacyInput
|
|
|
165
62
|
}
|
|
166
63
|
}
|
|
167
64
|
}
|
|
168
|
-
else if (
|
|
65
|
+
else if ((0, graphql_1.isObjectType)(type) || (0, graphql_1.isInterfaceType)(type)) {
|
|
169
66
|
for (const fieldName in resolverValue) {
|
|
170
67
|
if (!fieldName.startsWith('__')) {
|
|
171
68
|
const fields = type.getFields();
|
|
@@ -191,17 +88,18 @@ function addResolversToSchema(schemaOrOptions, legacyInputResolvers, legacyInput
|
|
|
191
88
|
? addResolversToExistingSchema(schema, resolvers, defaultFieldResolver)
|
|
192
89
|
: createNewSchemaWithResolvers(schema, resolvers, defaultFieldResolver);
|
|
193
90
|
if (requireResolversForResolveType && requireResolversForResolveType !== 'ignore') {
|
|
194
|
-
checkForResolveTypeResolver(schema, requireResolversForResolveType);
|
|
91
|
+
(0, checkForResolveTypeResolver_js_1.checkForResolveTypeResolver)(schema, requireResolversForResolveType);
|
|
195
92
|
}
|
|
196
93
|
return schema;
|
|
197
94
|
}
|
|
95
|
+
exports.addResolversToSchema = addResolversToSchema;
|
|
198
96
|
function addResolversToExistingSchema(schema, resolvers, defaultFieldResolver) {
|
|
199
97
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
200
98
|
const typeMap = schema.getTypeMap();
|
|
201
99
|
for (const typeName in resolvers) {
|
|
202
100
|
const type = schema.getType(typeName);
|
|
203
101
|
const resolverValue = resolvers[typeName];
|
|
204
|
-
if (
|
|
102
|
+
if ((0, graphql_1.isScalarType)(type)) {
|
|
205
103
|
for (const fieldName in resolverValue) {
|
|
206
104
|
if (fieldName.startsWith('__')) {
|
|
207
105
|
type[fieldName.substring(2)] = resolverValue[fieldName];
|
|
@@ -226,7 +124,7 @@ function addResolversToExistingSchema(schema, resolvers, defaultFieldResolver) {
|
|
|
226
124
|
}
|
|
227
125
|
}
|
|
228
126
|
}
|
|
229
|
-
else if (
|
|
127
|
+
else if ((0, graphql_1.isEnumType)(type)) {
|
|
230
128
|
const config = type.toConfig();
|
|
231
129
|
const enumValueConfigMap = config.values;
|
|
232
130
|
for (const fieldName in resolverValue) {
|
|
@@ -252,16 +150,16 @@ function addResolversToExistingSchema(schema, resolvers, defaultFieldResolver) {
|
|
|
252
150
|
enumValueConfigMap[fieldName].value = resolverValue[fieldName];
|
|
253
151
|
}
|
|
254
152
|
}
|
|
255
|
-
typeMap[typeName] = new
|
|
153
|
+
typeMap[typeName] = new graphql_1.GraphQLEnumType(config);
|
|
256
154
|
}
|
|
257
|
-
else if (
|
|
155
|
+
else if ((0, graphql_1.isUnionType)(type)) {
|
|
258
156
|
for (const fieldName in resolverValue) {
|
|
259
157
|
if (fieldName.startsWith('__')) {
|
|
260
158
|
type[fieldName.substring(2)] = resolverValue[fieldName];
|
|
261
159
|
}
|
|
262
160
|
}
|
|
263
161
|
}
|
|
264
|
-
else if (
|
|
162
|
+
else if ((0, graphql_1.isObjectType)(type) || (0, graphql_1.isInterfaceType)(type)) {
|
|
265
163
|
for (const fieldName in resolverValue) {
|
|
266
164
|
if (fieldName.startsWith('__')) {
|
|
267
165
|
// this is for isTypeOf and resolveType and all the other stuff.
|
|
@@ -284,13 +182,13 @@ function addResolversToExistingSchema(schema, resolvers, defaultFieldResolver) {
|
|
|
284
182
|
}
|
|
285
183
|
}
|
|
286
184
|
// serialize all default values prior to healing fields with new scalar/enum types.
|
|
287
|
-
|
|
185
|
+
(0, utils_1.forEachDefaultValue)(schema, utils_1.serializeInputValue);
|
|
288
186
|
// schema may have new scalar/enum types that require healing
|
|
289
|
-
|
|
187
|
+
(0, utils_1.healSchema)(schema);
|
|
290
188
|
// reparse all default values with new parsing functions.
|
|
291
|
-
|
|
189
|
+
(0, utils_1.forEachDefaultValue)(schema, utils_1.parseInputValue);
|
|
292
190
|
if (defaultFieldResolver != null) {
|
|
293
|
-
|
|
191
|
+
(0, utils_1.forEachField)(schema, field => {
|
|
294
192
|
if (!field.resolve) {
|
|
295
193
|
field.resolve = defaultFieldResolver;
|
|
296
194
|
}
|
|
@@ -299,12 +197,12 @@ function addResolversToExistingSchema(schema, resolvers, defaultFieldResolver) {
|
|
|
299
197
|
return schema;
|
|
300
198
|
}
|
|
301
199
|
function createNewSchemaWithResolvers(schema, resolvers, defaultFieldResolver) {
|
|
302
|
-
schema =
|
|
303
|
-
[
|
|
200
|
+
schema = (0, utils_1.mapSchema)(schema, {
|
|
201
|
+
[utils_1.MapperKind.SCALAR_TYPE]: type => {
|
|
304
202
|
var _a, _b, _c, _d, _e, _f;
|
|
305
203
|
const config = type.toConfig();
|
|
306
204
|
const resolverValue = resolvers[type.name];
|
|
307
|
-
if (!
|
|
205
|
+
if (!(0, graphql_1.isSpecifiedScalarType)(type) && resolverValue != null) {
|
|
308
206
|
for (const fieldName in resolverValue) {
|
|
309
207
|
if (fieldName.startsWith('__')) {
|
|
310
208
|
config[fieldName.substring(2)] = resolverValue[fieldName];
|
|
@@ -328,10 +226,10 @@ function createNewSchemaWithResolvers(schema, resolvers, defaultFieldResolver) {
|
|
|
328
226
|
config[fieldName] = resolverValue[fieldName];
|
|
329
227
|
}
|
|
330
228
|
}
|
|
331
|
-
return new
|
|
229
|
+
return new graphql_1.GraphQLScalarType(config);
|
|
332
230
|
}
|
|
333
231
|
},
|
|
334
|
-
[
|
|
232
|
+
[utils_1.MapperKind.ENUM_TYPE]: type => {
|
|
335
233
|
var _a, _b, _c, _d, _e, _f;
|
|
336
234
|
const resolverValue = resolvers[type.name];
|
|
337
235
|
const config = type.toConfig();
|
|
@@ -360,40 +258,40 @@ function createNewSchemaWithResolvers(schema, resolvers, defaultFieldResolver) {
|
|
|
360
258
|
enumValueConfigMap[fieldName].value = resolverValue[fieldName];
|
|
361
259
|
}
|
|
362
260
|
}
|
|
363
|
-
return new
|
|
261
|
+
return new graphql_1.GraphQLEnumType(config);
|
|
364
262
|
}
|
|
365
263
|
},
|
|
366
|
-
[
|
|
264
|
+
[utils_1.MapperKind.UNION_TYPE]: type => {
|
|
367
265
|
const resolverValue = resolvers[type.name];
|
|
368
266
|
if (resolverValue != null) {
|
|
369
267
|
const config = type.toConfig();
|
|
370
268
|
if (resolverValue['__resolveType']) {
|
|
371
269
|
config.resolveType = resolverValue['__resolveType'];
|
|
372
270
|
}
|
|
373
|
-
return new
|
|
271
|
+
return new graphql_1.GraphQLUnionType(config);
|
|
374
272
|
}
|
|
375
273
|
},
|
|
376
|
-
[
|
|
274
|
+
[utils_1.MapperKind.OBJECT_TYPE]: type => {
|
|
377
275
|
const resolverValue = resolvers[type.name];
|
|
378
276
|
if (resolverValue != null) {
|
|
379
277
|
const config = type.toConfig();
|
|
380
278
|
if (resolverValue['__isTypeOf']) {
|
|
381
279
|
config.isTypeOf = resolverValue['__isTypeOf'];
|
|
382
280
|
}
|
|
383
|
-
return new
|
|
281
|
+
return new graphql_1.GraphQLObjectType(config);
|
|
384
282
|
}
|
|
385
283
|
},
|
|
386
|
-
[
|
|
284
|
+
[utils_1.MapperKind.INTERFACE_TYPE]: type => {
|
|
387
285
|
const resolverValue = resolvers[type.name];
|
|
388
286
|
if (resolverValue != null) {
|
|
389
287
|
const config = type.toConfig();
|
|
390
288
|
if (resolverValue['__resolveType']) {
|
|
391
289
|
config.resolveType = resolverValue['__resolveType'];
|
|
392
290
|
}
|
|
393
|
-
return new
|
|
291
|
+
return new graphql_1.GraphQLInterfaceType(config);
|
|
394
292
|
}
|
|
395
293
|
},
|
|
396
|
-
[
|
|
294
|
+
[utils_1.MapperKind.COMPOSITE_FIELD]: (fieldConfig, fieldName, typeName) => {
|
|
397
295
|
const resolverValue = resolvers[typeName];
|
|
398
296
|
if (resolverValue != null) {
|
|
399
297
|
const fieldResolve = resolverValue[fieldName];
|
|
@@ -412,8 +310,8 @@ function createNewSchemaWithResolvers(schema, resolvers, defaultFieldResolver) {
|
|
|
412
310
|
},
|
|
413
311
|
});
|
|
414
312
|
if (defaultFieldResolver != null) {
|
|
415
|
-
schema =
|
|
416
|
-
[
|
|
313
|
+
schema = (0, utils_1.mapSchema)(schema, {
|
|
314
|
+
[utils_1.MapperKind.OBJECT_FIELD]: fieldConfig => ({
|
|
417
315
|
...fieldConfig,
|
|
418
316
|
resolve: fieldConfig.resolve != null ? fieldConfig.resolve : defaultFieldResolver,
|
|
419
317
|
}),
|
|
@@ -426,122 +324,3 @@ function setFieldProperties(field, propertiesObj) {
|
|
|
426
324
|
field[propertyName] = propertiesObj[propertyName];
|
|
427
325
|
}
|
|
428
326
|
}
|
|
429
|
-
|
|
430
|
-
/**
|
|
431
|
-
* Builds a schema from the provided type definitions and resolvers.
|
|
432
|
-
*
|
|
433
|
-
* The type definitions are written using Schema Definition Language (SDL). They
|
|
434
|
-
* can be provided as a string, a `DocumentNode`, a function, or an array of any
|
|
435
|
-
* of these. If a function is provided, it will be passed no arguments and
|
|
436
|
-
* should return an array of strings or `DocumentNode`s.
|
|
437
|
-
*
|
|
438
|
-
* Note: You can use `graphql-tag` to not only parse a string into a
|
|
439
|
-
* `DocumentNode` but also to provide additional syntax highlighting in your
|
|
440
|
-
* editor (with the appropriate editor plugin).
|
|
441
|
-
*
|
|
442
|
-
* ```js
|
|
443
|
-
* const typeDefs = gql`
|
|
444
|
-
* type Query {
|
|
445
|
-
* posts: [Post]
|
|
446
|
-
* author(id: Int!): Author
|
|
447
|
-
* }
|
|
448
|
-
* `;
|
|
449
|
-
* ```
|
|
450
|
-
*
|
|
451
|
-
* The `resolvers` object should be a map of type names to nested object, which
|
|
452
|
-
* themselves map the type's fields to their appropriate resolvers.
|
|
453
|
-
* See the [Resolvers](/docs/resolvers) section of the documentation for more details.
|
|
454
|
-
*
|
|
455
|
-
* ```js
|
|
456
|
-
* const resolvers = {
|
|
457
|
-
* Query: {
|
|
458
|
-
* posts: (obj, args, ctx, info) => getAllPosts(),
|
|
459
|
-
* author: (obj, args, ctx, info) => getAuthorById(args.id)
|
|
460
|
-
* }
|
|
461
|
-
* };
|
|
462
|
-
* ```
|
|
463
|
-
*
|
|
464
|
-
* Once you've defined both the `typeDefs` and `resolvers`, you can create your
|
|
465
|
-
* schema:
|
|
466
|
-
*
|
|
467
|
-
* ```js
|
|
468
|
-
* const schema = makeExecutableSchema({
|
|
469
|
-
* typeDefs,
|
|
470
|
-
* resolvers,
|
|
471
|
-
* })
|
|
472
|
-
* ```
|
|
473
|
-
*/
|
|
474
|
-
function makeExecutableSchema({ typeDefs, resolvers = {}, resolverValidationOptions = {}, parseOptions = {}, inheritResolversFromInterfaces = false, pruningOptions, updateResolversInPlace = false, schemaExtensions, }) {
|
|
475
|
-
// Validate and clean up arguments
|
|
476
|
-
if (typeof resolverValidationOptions !== 'object') {
|
|
477
|
-
throw new Error('Expected `resolverValidationOptions` to be an object');
|
|
478
|
-
}
|
|
479
|
-
if (!typeDefs) {
|
|
480
|
-
throw new Error('Must provide typeDefs');
|
|
481
|
-
}
|
|
482
|
-
let schema;
|
|
483
|
-
if (graphql.isSchema(typeDefs)) {
|
|
484
|
-
schema = typeDefs;
|
|
485
|
-
}
|
|
486
|
-
else if (parseOptions === null || parseOptions === void 0 ? void 0 : parseOptions.commentDescriptions) {
|
|
487
|
-
const mergedTypeDefs = merge.mergeTypeDefs(typeDefs, {
|
|
488
|
-
...parseOptions,
|
|
489
|
-
commentDescriptions: true,
|
|
490
|
-
});
|
|
491
|
-
schema = graphql.buildSchema(mergedTypeDefs, parseOptions);
|
|
492
|
-
}
|
|
493
|
-
else {
|
|
494
|
-
const mergedTypeDefs = merge.mergeTypeDefs(typeDefs, parseOptions);
|
|
495
|
-
schema = graphql.buildASTSchema(mergedTypeDefs, parseOptions);
|
|
496
|
-
}
|
|
497
|
-
if (pruningOptions) {
|
|
498
|
-
schema = utils.pruneSchema(schema);
|
|
499
|
-
}
|
|
500
|
-
// We allow passing in an array of resolver maps, in which case we merge them
|
|
501
|
-
schema = addResolversToSchema({
|
|
502
|
-
schema,
|
|
503
|
-
resolvers: merge.mergeResolvers(resolvers),
|
|
504
|
-
resolverValidationOptions,
|
|
505
|
-
inheritResolversFromInterfaces,
|
|
506
|
-
updateResolversInPlace,
|
|
507
|
-
});
|
|
508
|
-
if (Object.keys(resolverValidationOptions).length > 0) {
|
|
509
|
-
assertResolversPresent(schema, resolverValidationOptions);
|
|
510
|
-
}
|
|
511
|
-
if (schemaExtensions) {
|
|
512
|
-
schemaExtensions = merge.mergeExtensions(utils.asArray(schemaExtensions));
|
|
513
|
-
merge.applyExtensions(schema, schemaExtensions);
|
|
514
|
-
}
|
|
515
|
-
return schema;
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
* Synchronously merges multiple schemas, typeDefinitions and/or resolvers into a single schema.
|
|
520
|
-
* @param config Configuration object
|
|
521
|
-
*/
|
|
522
|
-
function mergeSchemas(config) {
|
|
523
|
-
const extractedTypeDefs = utils.asArray(config.typeDefs || []);
|
|
524
|
-
const extractedResolvers = utils.asArray(config.resolvers || []);
|
|
525
|
-
const extractedSchemaExtensions = utils.asArray(config.schemaExtensions || []);
|
|
526
|
-
const schemas = config.schemas || [];
|
|
527
|
-
for (const schema of schemas) {
|
|
528
|
-
extractedTypeDefs.push(schema);
|
|
529
|
-
extractedResolvers.push(utils.getResolversFromSchema(schema, true));
|
|
530
|
-
extractedSchemaExtensions.push(merge.extractExtensionsFromSchema(schema));
|
|
531
|
-
}
|
|
532
|
-
return makeExecutableSchema({
|
|
533
|
-
parseOptions: config,
|
|
534
|
-
...config,
|
|
535
|
-
typeDefs: extractedTypeDefs,
|
|
536
|
-
resolvers: extractedResolvers,
|
|
537
|
-
schemaExtensions: extractedSchemaExtensions,
|
|
538
|
-
});
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
exports.addResolversToSchema = addResolversToSchema;
|
|
542
|
-
exports.assertResolversPresent = assertResolversPresent;
|
|
543
|
-
exports.chainResolvers = chainResolvers;
|
|
544
|
-
exports.checkForResolveTypeResolver = checkForResolveTypeResolver;
|
|
545
|
-
exports.extendResolversFromInterfaces = extendResolversFromInterfaces;
|
|
546
|
-
exports.makeExecutableSchema = makeExecutableSchema;
|
|
547
|
-
exports.mergeSchemas = mergeSchemas;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertResolversPresent = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
6
|
+
function assertResolversPresent(schema, resolverValidationOptions = {}) {
|
|
7
|
+
const { requireResolversForArgs, requireResolversForNonScalar, requireResolversForAllFields } = resolverValidationOptions;
|
|
8
|
+
if (requireResolversForAllFields && (requireResolversForArgs || requireResolversForNonScalar)) {
|
|
9
|
+
throw new TypeError('requireResolversForAllFields takes precedence over the more specific assertions. ' +
|
|
10
|
+
'Please configure either requireResolversForAllFields or requireResolversForArgs / ' +
|
|
11
|
+
'requireResolversForNonScalar, but not a combination of them.');
|
|
12
|
+
}
|
|
13
|
+
(0, utils_1.forEachField)(schema, (field, typeName, fieldName) => {
|
|
14
|
+
// requires a resolver for *every* field.
|
|
15
|
+
if (requireResolversForAllFields) {
|
|
16
|
+
expectResolver('requireResolversForAllFields', requireResolversForAllFields, field, typeName, fieldName);
|
|
17
|
+
}
|
|
18
|
+
// requires a resolver on every field that has arguments
|
|
19
|
+
if (requireResolversForArgs && field.args.length > 0) {
|
|
20
|
+
expectResolver('requireResolversForArgs', requireResolversForArgs, field, typeName, fieldName);
|
|
21
|
+
}
|
|
22
|
+
// requires a resolver on every field that returns a non-scalar type
|
|
23
|
+
if (requireResolversForNonScalar !== 'ignore' && !(0, graphql_1.isScalarType)((0, graphql_1.getNamedType)(field.type))) {
|
|
24
|
+
expectResolver('requireResolversForNonScalar', requireResolversForNonScalar, field, typeName, fieldName);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
exports.assertResolversPresent = assertResolversPresent;
|
|
29
|
+
function expectResolver(validator, behavior, field, typeName, fieldName) {
|
|
30
|
+
if (!field.resolve) {
|
|
31
|
+
const message = `Resolver missing for "${typeName}.${fieldName}".
|
|
32
|
+
To disable this validator, use:
|
|
33
|
+
resolverValidationOptions: {
|
|
34
|
+
${validator}: 'ignore'
|
|
35
|
+
}`;
|
|
36
|
+
if (behavior === 'error') {
|
|
37
|
+
throw new Error(message);
|
|
38
|
+
}
|
|
39
|
+
if (behavior === 'warn') {
|
|
40
|
+
console.warn(message);
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (typeof field.resolve !== 'function') {
|
|
45
|
+
throw new Error(`Resolver "${typeName}.${fieldName}" must be a function`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.chainResolvers = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
function chainResolvers(resolvers) {
|
|
6
|
+
return (root, args, ctx, info) => resolvers.reduce((prev, curResolver) => {
|
|
7
|
+
if (curResolver != null) {
|
|
8
|
+
return curResolver(prev, args, ctx, info);
|
|
9
|
+
}
|
|
10
|
+
return (0, graphql_1.defaultFieldResolver)(prev, args, ctx, info);
|
|
11
|
+
}, root);
|
|
12
|
+
}
|
|
13
|
+
exports.chainResolvers = chainResolvers;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkForResolveTypeResolver = void 0;
|
|
4
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
5
|
+
// If we have any union or interface types throw if no there is no resolveType resolver
|
|
6
|
+
function checkForResolveTypeResolver(schema, requireResolversForResolveType) {
|
|
7
|
+
(0, utils_1.mapSchema)(schema, {
|
|
8
|
+
[utils_1.MapperKind.ABSTRACT_TYPE]: type => {
|
|
9
|
+
if (!type.resolveType) {
|
|
10
|
+
const message = `Type "${type.name}" is missing a "__resolveType" resolver. Pass 'ignore' into ` +
|
|
11
|
+
'"resolverValidationOptions.requireResolversForResolveType" to disable this error.';
|
|
12
|
+
if (requireResolversForResolveType === 'error') {
|
|
13
|
+
throw new Error(message);
|
|
14
|
+
}
|
|
15
|
+
if (requireResolversForResolveType === 'warn') {
|
|
16
|
+
console.warn(message);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
exports.checkForResolveTypeResolver = checkForResolveTypeResolver;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extendResolversFromInterfaces = void 0;
|
|
4
|
+
function extendResolversFromInterfaces(schema, resolvers) {
|
|
5
|
+
const extendedResolvers = {};
|
|
6
|
+
const typeMap = schema.getTypeMap();
|
|
7
|
+
for (const typeName in typeMap) {
|
|
8
|
+
const type = typeMap[typeName];
|
|
9
|
+
if ('getInterfaces' in type) {
|
|
10
|
+
extendedResolvers[typeName] = {};
|
|
11
|
+
for (const iFace of type.getInterfaces()) {
|
|
12
|
+
if (resolvers[iFace.name]) {
|
|
13
|
+
for (const fieldName in resolvers[iFace.name]) {
|
|
14
|
+
if (fieldName === '__isTypeOf' || !fieldName.startsWith('__')) {
|
|
15
|
+
extendedResolvers[typeName][fieldName] = resolvers[iFace.name][fieldName];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const typeResolvers = resolvers[typeName];
|
|
21
|
+
extendedResolvers[typeName] = {
|
|
22
|
+
...extendedResolvers[typeName],
|
|
23
|
+
...typeResolvers,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
const typeResolvers = resolvers[typeName];
|
|
28
|
+
if (typeResolvers != null) {
|
|
29
|
+
extendedResolvers[typeName] = typeResolvers;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return extendedResolvers;
|
|
34
|
+
}
|
|
35
|
+
exports.extendResolversFromInterfaces = extendResolversFromInterfaces;
|
package/cjs/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extendResolversFromInterfaces = exports.checkForResolveTypeResolver = exports.addResolversToSchema = exports.chainResolvers = exports.assertResolversPresent = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
var assertResolversPresent_js_1 = require("./assertResolversPresent.js");
|
|
6
|
+
Object.defineProperty(exports, "assertResolversPresent", { enumerable: true, get: function () { return assertResolversPresent_js_1.assertResolversPresent; } });
|
|
7
|
+
var chainResolvers_js_1 = require("./chainResolvers.js");
|
|
8
|
+
Object.defineProperty(exports, "chainResolvers", { enumerable: true, get: function () { return chainResolvers_js_1.chainResolvers; } });
|
|
9
|
+
var addResolversToSchema_js_1 = require("./addResolversToSchema.js");
|
|
10
|
+
Object.defineProperty(exports, "addResolversToSchema", { enumerable: true, get: function () { return addResolversToSchema_js_1.addResolversToSchema; } });
|
|
11
|
+
var checkForResolveTypeResolver_js_1 = require("./checkForResolveTypeResolver.js");
|
|
12
|
+
Object.defineProperty(exports, "checkForResolveTypeResolver", { enumerable: true, get: function () { return checkForResolveTypeResolver_js_1.checkForResolveTypeResolver; } });
|
|
13
|
+
var extendResolversFromInterfaces_js_1 = require("./extendResolversFromInterfaces.js");
|
|
14
|
+
Object.defineProperty(exports, "extendResolversFromInterfaces", { enumerable: true, get: function () { return extendResolversFromInterfaces_js_1.extendResolversFromInterfaces; } });
|
|
15
|
+
tslib_1.__exportStar(require("./makeExecutableSchema.js"), exports);
|
|
16
|
+
tslib_1.__exportStar(require("./types.js"), exports);
|
|
17
|
+
tslib_1.__exportStar(require("./merge-schemas.js"), exports);
|