@graphql-tools/merge 8.2.15 → 8.3.0-alpha-6c480b2d.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.
Files changed (63) hide show
  1. package/cjs/extensions.js +132 -0
  2. package/cjs/index.js +6 -0
  3. package/cjs/merge-resolvers.js +67 -0
  4. package/cjs/package.json +1 -0
  5. package/cjs/typedefs-mergers/arguments.js +21 -0
  6. package/cjs/typedefs-mergers/directives.js +100 -0
  7. package/cjs/typedefs-mergers/enum-values.js +40 -0
  8. package/cjs/typedefs-mergers/enum.js +27 -0
  9. package/cjs/typedefs-mergers/fields.js +85 -0
  10. package/cjs/typedefs-mergers/index.js +17 -0
  11. package/cjs/typedefs-mergers/input-type.js +34 -0
  12. package/cjs/typedefs-mergers/interface.js +38 -0
  13. package/cjs/typedefs-mergers/merge-named-type-array.js +15 -0
  14. package/cjs/typedefs-mergers/merge-nodes.js +72 -0
  15. package/cjs/typedefs-mergers/merge-typedefs.js +121 -0
  16. package/cjs/typedefs-mergers/scalar.js +27 -0
  17. package/cjs/typedefs-mergers/schema-def.js +39 -0
  18. package/cjs/typedefs-mergers/type.js +36 -0
  19. package/cjs/typedefs-mergers/union.js +28 -0
  20. package/cjs/typedefs-mergers/utils.js +65 -0
  21. package/esm/extensions.js +125 -0
  22. package/esm/index.js +3 -0
  23. package/esm/merge-resolvers.js +63 -0
  24. package/esm/typedefs-mergers/arguments.js +17 -0
  25. package/esm/typedefs-mergers/directives.js +95 -0
  26. package/esm/typedefs-mergers/enum-values.js +36 -0
  27. package/esm/typedefs-mergers/enum.js +23 -0
  28. package/esm/typedefs-mergers/fields.js +81 -0
  29. package/esm/typedefs-mergers/index.js +14 -0
  30. package/esm/typedefs-mergers/input-type.js +30 -0
  31. package/esm/typedefs-mergers/interface.js +34 -0
  32. package/esm/typedefs-mergers/merge-named-type-array.js +11 -0
  33. package/esm/typedefs-mergers/merge-nodes.js +67 -0
  34. package/esm/typedefs-mergers/merge-typedefs.js +116 -0
  35. package/esm/typedefs-mergers/scalar.js +23 -0
  36. package/esm/typedefs-mergers/schema-def.js +35 -0
  37. package/esm/typedefs-mergers/type.js +32 -0
  38. package/esm/typedefs-mergers/union.js +24 -0
  39. package/esm/typedefs-mergers/utils.js +54 -0
  40. package/package.json +32 -11
  41. package/{extensions.d.ts → typings/extensions.d.ts} +0 -0
  42. package/typings/index.d.ts +3 -0
  43. package/{merge-resolvers.d.ts → typings/merge-resolvers.d.ts} +0 -0
  44. package/{typedefs-mergers → typings/typedefs-mergers}/arguments.d.ts +1 -1
  45. package/{typedefs-mergers → typings/typedefs-mergers}/directives.d.ts +1 -1
  46. package/{typedefs-mergers → typings/typedefs-mergers}/enum-values.d.ts +1 -1
  47. package/{typedefs-mergers → typings/typedefs-mergers}/enum.d.ts +1 -1
  48. package/{typedefs-mergers → typings/typedefs-mergers}/fields.d.ts +1 -1
  49. package/typings/typedefs-mergers/index.d.ts +14 -0
  50. package/{typedefs-mergers → typings/typedefs-mergers}/input-type.d.ts +1 -1
  51. package/{typedefs-mergers → typings/typedefs-mergers}/interface.d.ts +1 -1
  52. package/{typedefs-mergers → typings/typedefs-mergers}/merge-named-type-array.d.ts +1 -1
  53. package/{typedefs-mergers → typings/typedefs-mergers}/merge-nodes.d.ts +1 -1
  54. package/{typedefs-mergers → typings/typedefs-mergers}/merge-typedefs.d.ts +1 -1
  55. package/{typedefs-mergers → typings/typedefs-mergers}/scalar.d.ts +1 -1
  56. package/{typedefs-mergers → typings/typedefs-mergers}/schema-def.d.ts +1 -1
  57. package/{typedefs-mergers → typings/typedefs-mergers}/type.d.ts +1 -1
  58. package/{typedefs-mergers → typings/typedefs-mergers}/union.d.ts +1 -1
  59. package/{typedefs-mergers → typings/typedefs-mergers}/utils.d.ts +0 -0
  60. package/index.d.ts +0 -3
  61. package/index.js +0 -869
  62. package/index.mjs +0 -837
  63. package/typedefs-mergers/index.d.ts +0 -14
package/index.js DELETED
@@ -1,869 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- const utils = require('@graphql-tools/utils');
6
- const graphql = require('graphql');
7
-
8
- /**
9
- * Deep merges multiple resolver definition objects into a single definition.
10
- * @param resolversDefinitions Resolver definitions to be merged
11
- * @param options Additional options
12
- *
13
- * ```js
14
- * const { mergeResolvers } = require('@graphql-tools/merge');
15
- * const clientResolver = require('./clientResolver');
16
- * const productResolver = require('./productResolver');
17
- *
18
- * const resolvers = mergeResolvers([
19
- * clientResolver,
20
- * productResolver,
21
- * ]);
22
- * ```
23
- *
24
- * If you don't want to manually create the array of resolver objects, you can
25
- * also use this function along with loadFiles:
26
- *
27
- * ```js
28
- * const path = require('path');
29
- * const { mergeResolvers } = require('@graphql-tools/merge');
30
- * const { loadFilesSync } = require('@graphql-tools/load-files');
31
- *
32
- * const resolversArray = loadFilesSync(path.join(__dirname, './resolvers'));
33
- *
34
- * const resolvers = mergeResolvers(resolversArray)
35
- * ```
36
- */
37
- function mergeResolvers(resolversDefinitions, options) {
38
- if (!resolversDefinitions || (Array.isArray(resolversDefinitions) && resolversDefinitions.length === 0)) {
39
- return {};
40
- }
41
- if (!Array.isArray(resolversDefinitions)) {
42
- return resolversDefinitions;
43
- }
44
- if (resolversDefinitions.length === 1) {
45
- return resolversDefinitions[0] || {};
46
- }
47
- const resolvers = new Array();
48
- for (let resolversDefinition of resolversDefinitions) {
49
- if (Array.isArray(resolversDefinition)) {
50
- resolversDefinition = mergeResolvers(resolversDefinition);
51
- }
52
- if (typeof resolversDefinition === 'object' && resolversDefinition) {
53
- resolvers.push(resolversDefinition);
54
- }
55
- }
56
- const result = utils.mergeDeep(resolvers, true);
57
- if (options === null || options === void 0 ? void 0 : options.exclusions) {
58
- for (const exclusion of options.exclusions) {
59
- const [typeName, fieldName] = exclusion.split('.');
60
- if (!fieldName || fieldName === '*') {
61
- delete result[typeName];
62
- }
63
- else if (result[typeName]) {
64
- delete result[typeName][fieldName];
65
- }
66
- }
67
- }
68
- return result;
69
- }
70
-
71
- function mergeArguments(args1, args2, config) {
72
- const result = deduplicateArguments([...args2, ...args1].filter(utils.isSome));
73
- if (config && config.sort) {
74
- result.sort(utils.compareNodes);
75
- }
76
- return result;
77
- }
78
- function deduplicateArguments(args) {
79
- return args.reduce((acc, current) => {
80
- const dup = acc.find(arg => arg.name.value === current.name.value);
81
- if (!dup) {
82
- return acc.concat([current]);
83
- }
84
- return acc;
85
- }, []);
86
- }
87
-
88
- function directiveAlreadyExists(directivesArr, otherDirective) {
89
- return !!directivesArr.find(directive => directive.name.value === otherDirective.name.value);
90
- }
91
- function nameAlreadyExists(name, namesArr) {
92
- return namesArr.some(({ value }) => value === name.value);
93
- }
94
- function mergeArguments$1(a1, a2) {
95
- const result = [...a2];
96
- for (const argument of a1) {
97
- const existingIndex = result.findIndex(a => a.name.value === argument.name.value);
98
- if (existingIndex > -1) {
99
- const existingArg = result[existingIndex];
100
- if (existingArg.value.kind === 'ListValue') {
101
- const source = existingArg.value.values;
102
- const target = argument.value.values;
103
- // merge values of two lists
104
- existingArg.value.values = deduplicateLists(source, target, (targetVal, source) => {
105
- const value = targetVal.value;
106
- return !value || !source.some((sourceVal) => sourceVal.value === value);
107
- });
108
- }
109
- else {
110
- existingArg.value = argument.value;
111
- }
112
- }
113
- else {
114
- result.push(argument);
115
- }
116
- }
117
- return result;
118
- }
119
- function deduplicateDirectives(directives) {
120
- return directives
121
- .map((directive, i, all) => {
122
- const firstAt = all.findIndex(d => d.name.value === directive.name.value);
123
- if (firstAt !== i) {
124
- const dup = all[firstAt];
125
- directive.arguments = mergeArguments$1(directive.arguments, dup.arguments);
126
- return null;
127
- }
128
- return directive;
129
- })
130
- .filter(utils.isSome);
131
- }
132
- function mergeDirectives(d1 = [], d2 = [], config) {
133
- const reverseOrder = config && config.reverseDirectives;
134
- const asNext = reverseOrder ? d1 : d2;
135
- const asFirst = reverseOrder ? d2 : d1;
136
- const result = deduplicateDirectives([...asNext]);
137
- for (const directive of asFirst) {
138
- if (directiveAlreadyExists(result, directive)) {
139
- const existingDirectiveIndex = result.findIndex(d => d.name.value === directive.name.value);
140
- const existingDirective = result[existingDirectiveIndex];
141
- result[existingDirectiveIndex].arguments = mergeArguments$1(directive.arguments || [], existingDirective.arguments || []);
142
- }
143
- else {
144
- result.push(directive);
145
- }
146
- }
147
- return result;
148
- }
149
- function validateInputs(node, existingNode) {
150
- const printedNode = graphql.print({
151
- ...node,
152
- description: undefined,
153
- });
154
- const printedExistingNode = graphql.print({
155
- ...existingNode,
156
- description: undefined,
157
- });
158
- // eslint-disable-next-line
159
- const leaveInputs = new RegExp('(directive @w*d*)|( on .*$)', 'g');
160
- const sameArguments = printedNode.replace(leaveInputs, '') === printedExistingNode.replace(leaveInputs, '');
161
- if (!sameArguments) {
162
- throw new Error(`Unable to merge GraphQL directive "${node.name.value}". \nExisting directive: \n\t${printedExistingNode} \nReceived directive: \n\t${printedNode}`);
163
- }
164
- }
165
- function mergeDirective(node, existingNode) {
166
- if (existingNode) {
167
- validateInputs(node, existingNode);
168
- return {
169
- ...node,
170
- locations: [
171
- ...existingNode.locations,
172
- ...node.locations.filter(name => !nameAlreadyExists(name, existingNode.locations)),
173
- ],
174
- };
175
- }
176
- return node;
177
- }
178
- function deduplicateLists(source, target, filterFn) {
179
- return source.concat(target.filter(val => filterFn(val, source)));
180
- }
181
-
182
- function mergeEnumValues(first, second, config) {
183
- if (config === null || config === void 0 ? void 0 : config.consistentEnumMerge) {
184
- const reversed = [];
185
- if (first) {
186
- reversed.push(...first);
187
- }
188
- first = second;
189
- second = reversed;
190
- }
191
- const enumValueMap = new Map();
192
- if (first) {
193
- for (const firstValue of first) {
194
- enumValueMap.set(firstValue.name.value, firstValue);
195
- }
196
- }
197
- if (second) {
198
- for (const secondValue of second) {
199
- const enumValue = secondValue.name.value;
200
- if (enumValueMap.has(enumValue)) {
201
- const firstValue = enumValueMap.get(enumValue);
202
- firstValue.description = secondValue.description || firstValue.description;
203
- firstValue.directives = mergeDirectives(secondValue.directives, firstValue.directives);
204
- }
205
- else {
206
- enumValueMap.set(enumValue, secondValue);
207
- }
208
- }
209
- }
210
- const result = [...enumValueMap.values()];
211
- if (config && config.sort) {
212
- result.sort(utils.compareNodes);
213
- }
214
- return result;
215
- }
216
-
217
- function mergeEnum(e1, e2, config) {
218
- if (e2) {
219
- return {
220
- name: e1.name,
221
- description: e1['description'] || e2['description'],
222
- kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || e1.kind === 'EnumTypeDefinition' || e2.kind === 'EnumTypeDefinition'
223
- ? 'EnumTypeDefinition'
224
- : 'EnumTypeExtension',
225
- loc: e1.loc,
226
- directives: mergeDirectives(e1.directives, e2.directives, config),
227
- values: mergeEnumValues(e1.values, e2.values, config),
228
- };
229
- }
230
- return (config === null || config === void 0 ? void 0 : config.convertExtensions)
231
- ? {
232
- ...e1,
233
- kind: graphql.Kind.ENUM_TYPE_DEFINITION,
234
- }
235
- : e1;
236
- }
237
-
238
- function isStringTypes(types) {
239
- return typeof types === 'string';
240
- }
241
- function isSourceTypes(types) {
242
- return types instanceof graphql.Source;
243
- }
244
- function extractType(type) {
245
- let visitedType = type;
246
- while (visitedType.kind === graphql.Kind.LIST_TYPE || visitedType.kind === 'NonNullType') {
247
- visitedType = visitedType.type;
248
- }
249
- return visitedType;
250
- }
251
- function isWrappingTypeNode(type) {
252
- return type.kind !== graphql.Kind.NAMED_TYPE;
253
- }
254
- function isListTypeNode(type) {
255
- return type.kind === graphql.Kind.LIST_TYPE;
256
- }
257
- function isNonNullTypeNode(type) {
258
- return type.kind === graphql.Kind.NON_NULL_TYPE;
259
- }
260
- function printTypeNode(type) {
261
- if (isListTypeNode(type)) {
262
- return `[${printTypeNode(type.type)}]`;
263
- }
264
- if (isNonNullTypeNode(type)) {
265
- return `${printTypeNode(type.type)}!`;
266
- }
267
- return type.name.value;
268
- }
269
- (function (CompareVal) {
270
- CompareVal[CompareVal["A_SMALLER_THAN_B"] = -1] = "A_SMALLER_THAN_B";
271
- CompareVal[CompareVal["A_EQUALS_B"] = 0] = "A_EQUALS_B";
272
- CompareVal[CompareVal["A_GREATER_THAN_B"] = 1] = "A_GREATER_THAN_B";
273
- })(exports.CompareVal || (exports.CompareVal = {}));
274
- function defaultStringComparator(a, b) {
275
- if (a == null && b == null) {
276
- return exports.CompareVal.A_EQUALS_B;
277
- }
278
- if (a == null) {
279
- return exports.CompareVal.A_SMALLER_THAN_B;
280
- }
281
- if (b == null) {
282
- return exports.CompareVal.A_GREATER_THAN_B;
283
- }
284
- if (a < b)
285
- return exports.CompareVal.A_SMALLER_THAN_B;
286
- if (a > b)
287
- return exports.CompareVal.A_GREATER_THAN_B;
288
- return exports.CompareVal.A_EQUALS_B;
289
- }
290
-
291
- function fieldAlreadyExists(fieldsArr, otherField, config) {
292
- const result = fieldsArr.find(field => field.name.value === otherField.name.value);
293
- if (result && !(config === null || config === void 0 ? void 0 : config.ignoreFieldConflicts)) {
294
- const t1 = extractType(result.type);
295
- const t2 = extractType(otherField.type);
296
- if (t1.name.value !== t2.name.value) {
297
- throw new Error(`Field "${otherField.name.value}" already defined with a different type. Declared as "${t1.name.value}", but you tried to override with "${t2.name.value}"`);
298
- }
299
- }
300
- return !!result;
301
- }
302
- function mergeFields(type, f1, f2, config) {
303
- const result = [];
304
- if (f2 != null) {
305
- result.push(...f2);
306
- }
307
- if (f1 != null) {
308
- for (const field of f1) {
309
- if (fieldAlreadyExists(result, field, config)) {
310
- const existing = result.find((f) => f.name.value === field.name.value);
311
- if (!(config === null || config === void 0 ? void 0 : config.ignoreFieldConflicts)) {
312
- if (config === null || config === void 0 ? void 0 : config.throwOnConflict) {
313
- preventConflicts(type, existing, field, false);
314
- }
315
- else {
316
- preventConflicts(type, existing, field, true);
317
- }
318
- if (isNonNullTypeNode(field.type) && !isNonNullTypeNode(existing.type)) {
319
- existing.type = field.type;
320
- }
321
- }
322
- existing.arguments = mergeArguments(field['arguments'] || [], existing.arguments || [], config);
323
- existing.directives = mergeDirectives(field.directives, existing.directives, config);
324
- existing.description = field.description || existing.description;
325
- }
326
- else {
327
- result.push(field);
328
- }
329
- }
330
- }
331
- if (config && config.sort) {
332
- result.sort(utils.compareNodes);
333
- }
334
- if (config && config.exclusions) {
335
- const exclusions = config.exclusions;
336
- return result.filter(field => !exclusions.includes(`${type.name.value}.${field.name.value}`));
337
- }
338
- return result;
339
- }
340
- function preventConflicts(type, a, b, ignoreNullability = false) {
341
- const aType = printTypeNode(a.type);
342
- const bType = printTypeNode(b.type);
343
- if (aType !== bType && !safeChangeForFieldType(a.type, b.type, ignoreNullability)) {
344
- throw new Error(`Field '${type.name.value}.${a.name.value}' changed type from '${aType}' to '${bType}'`);
345
- }
346
- }
347
- function safeChangeForFieldType(oldType, newType, ignoreNullability = false) {
348
- // both are named
349
- if (!isWrappingTypeNode(oldType) && !isWrappingTypeNode(newType)) {
350
- return oldType.toString() === newType.toString();
351
- }
352
- // new is non-null
353
- if (isNonNullTypeNode(newType)) {
354
- const ofType = isNonNullTypeNode(oldType) ? oldType.type : oldType;
355
- return safeChangeForFieldType(ofType, newType.type);
356
- }
357
- // old is non-null
358
- if (isNonNullTypeNode(oldType)) {
359
- return safeChangeForFieldType(newType, oldType, ignoreNullability);
360
- }
361
- // old is list
362
- if (isListTypeNode(oldType)) {
363
- return ((isListTypeNode(newType) && safeChangeForFieldType(oldType.type, newType.type)) ||
364
- (isNonNullTypeNode(newType) && safeChangeForFieldType(oldType, newType['type'])));
365
- }
366
- return false;
367
- }
368
-
369
- function mergeInputType(node, existingNode, config) {
370
- if (existingNode) {
371
- try {
372
- return {
373
- name: node.name,
374
- description: node['description'] || existingNode['description'],
375
- kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
376
- node.kind === 'InputObjectTypeDefinition' ||
377
- existingNode.kind === 'InputObjectTypeDefinition'
378
- ? 'InputObjectTypeDefinition'
379
- : 'InputObjectTypeExtension',
380
- loc: node.loc,
381
- fields: mergeFields(node, node.fields, existingNode.fields, config),
382
- directives: mergeDirectives(node.directives, existingNode.directives, config),
383
- };
384
- }
385
- catch (e) {
386
- throw new Error(`Unable to merge GraphQL input type "${node.name.value}": ${e.message}`);
387
- }
388
- }
389
- return (config === null || config === void 0 ? void 0 : config.convertExtensions)
390
- ? {
391
- ...node,
392
- kind: graphql.Kind.INPUT_OBJECT_TYPE_DEFINITION,
393
- }
394
- : node;
395
- }
396
-
397
- function mergeInterface(node, existingNode, config) {
398
- if (existingNode) {
399
- try {
400
- return {
401
- name: node.name,
402
- description: node['description'] || existingNode['description'],
403
- kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
404
- node.kind === 'InterfaceTypeDefinition' ||
405
- existingNode.kind === 'InterfaceTypeDefinition'
406
- ? 'InterfaceTypeDefinition'
407
- : 'InterfaceTypeExtension',
408
- loc: node.loc,
409
- fields: mergeFields(node, node.fields, existingNode.fields, config),
410
- directives: mergeDirectives(node.directives, existingNode.directives, config),
411
- interfaces: node['interfaces']
412
- ? mergeNamedTypeArray(node['interfaces'], existingNode['interfaces'], config)
413
- : undefined,
414
- };
415
- }
416
- catch (e) {
417
- throw new Error(`Unable to merge GraphQL interface "${node.name.value}": ${e.message}`);
418
- }
419
- }
420
- return (config === null || config === void 0 ? void 0 : config.convertExtensions)
421
- ? {
422
- ...node,
423
- kind: graphql.Kind.INTERFACE_TYPE_DEFINITION,
424
- }
425
- : node;
426
- }
427
-
428
- function alreadyExists(arr, other) {
429
- return !!arr.find(i => i.name.value === other.name.value);
430
- }
431
- function mergeNamedTypeArray(first = [], second = [], config = {}) {
432
- const result = [...second, ...first.filter(d => !alreadyExists(second, d))];
433
- if (config && config.sort) {
434
- result.sort(utils.compareNodes);
435
- }
436
- return result;
437
- }
438
-
439
- function mergeType(node, existingNode, config) {
440
- if (existingNode) {
441
- try {
442
- return {
443
- name: node.name,
444
- description: node['description'] || existingNode['description'],
445
- kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
446
- node.kind === 'ObjectTypeDefinition' ||
447
- existingNode.kind === 'ObjectTypeDefinition'
448
- ? 'ObjectTypeDefinition'
449
- : 'ObjectTypeExtension',
450
- loc: node.loc,
451
- fields: mergeFields(node, node.fields, existingNode.fields, config),
452
- directives: mergeDirectives(node.directives, existingNode.directives, config),
453
- interfaces: mergeNamedTypeArray(node.interfaces, existingNode.interfaces, config),
454
- };
455
- }
456
- catch (e) {
457
- throw new Error(`Unable to merge GraphQL type "${node.name.value}": ${e.message}`);
458
- }
459
- }
460
- return (config === null || config === void 0 ? void 0 : config.convertExtensions)
461
- ? {
462
- ...node,
463
- kind: graphql.Kind.OBJECT_TYPE_DEFINITION,
464
- }
465
- : node;
466
- }
467
-
468
- function mergeScalar(node, existingNode, config) {
469
- if (existingNode) {
470
- return {
471
- name: node.name,
472
- description: node['description'] || existingNode['description'],
473
- kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
474
- node.kind === 'ScalarTypeDefinition' ||
475
- existingNode.kind === 'ScalarTypeDefinition'
476
- ? 'ScalarTypeDefinition'
477
- : 'ScalarTypeExtension',
478
- loc: node.loc,
479
- directives: mergeDirectives(node.directives, existingNode.directives, config),
480
- };
481
- }
482
- return (config === null || config === void 0 ? void 0 : config.convertExtensions)
483
- ? {
484
- ...node,
485
- kind: graphql.Kind.SCALAR_TYPE_DEFINITION,
486
- }
487
- : node;
488
- }
489
-
490
- function mergeUnion(first, second, config) {
491
- if (second) {
492
- return {
493
- name: first.name,
494
- description: first['description'] || second['description'],
495
- // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility
496
- directives: mergeDirectives(first.directives, second.directives, config),
497
- kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || first.kind === 'UnionTypeDefinition' || second.kind === 'UnionTypeDefinition'
498
- ? graphql.Kind.UNION_TYPE_DEFINITION
499
- : graphql.Kind.UNION_TYPE_EXTENSION,
500
- loc: first.loc,
501
- types: mergeNamedTypeArray(first.types, second.types, config),
502
- };
503
- }
504
- return (config === null || config === void 0 ? void 0 : config.convertExtensions)
505
- ? {
506
- ...first,
507
- kind: graphql.Kind.UNION_TYPE_DEFINITION,
508
- }
509
- : first;
510
- }
511
-
512
- const DEFAULT_OPERATION_TYPE_NAME_MAP = {
513
- query: 'Query',
514
- mutation: 'Mutation',
515
- subscription: 'Subscription',
516
- };
517
- function mergeOperationTypes(opNodeList = [], existingOpNodeList = []) {
518
- const finalOpNodeList = [];
519
- for (const opNodeType in DEFAULT_OPERATION_TYPE_NAME_MAP) {
520
- const opNode = opNodeList.find(n => n.operation === opNodeType) || existingOpNodeList.find(n => n.operation === opNodeType);
521
- if (opNode) {
522
- finalOpNodeList.push(opNode);
523
- }
524
- }
525
- return finalOpNodeList;
526
- }
527
- function mergeSchemaDefs(node, existingNode, config) {
528
- if (existingNode) {
529
- return {
530
- kind: node.kind === graphql.Kind.SCHEMA_DEFINITION || existingNode.kind === graphql.Kind.SCHEMA_DEFINITION
531
- ? graphql.Kind.SCHEMA_DEFINITION
532
- : graphql.Kind.SCHEMA_EXTENSION,
533
- description: node['description'] || existingNode['description'],
534
- directives: mergeDirectives(node.directives, existingNode.directives, config),
535
- operationTypes: mergeOperationTypes(node.operationTypes, existingNode.operationTypes),
536
- };
537
- }
538
- return ((config === null || config === void 0 ? void 0 : config.convertExtensions)
539
- ? {
540
- ...node,
541
- kind: graphql.Kind.SCHEMA_DEFINITION,
542
- }
543
- : node);
544
- }
545
-
546
- const schemaDefSymbol = 'SCHEMA_DEF_SYMBOL';
547
- function isNamedDefinitionNode(definitionNode) {
548
- return 'name' in definitionNode;
549
- }
550
- function mergeGraphQLNodes(nodes, config) {
551
- var _a, _b, _c;
552
- const mergedResultMap = {};
553
- for (const nodeDefinition of nodes) {
554
- if (isNamedDefinitionNode(nodeDefinition)) {
555
- const name = (_a = nodeDefinition.name) === null || _a === void 0 ? void 0 : _a.value;
556
- if (config === null || config === void 0 ? void 0 : config.commentDescriptions) {
557
- utils.collectComment(nodeDefinition);
558
- }
559
- if (name == null) {
560
- continue;
561
- }
562
- if (((_b = config === null || config === void 0 ? void 0 : config.exclusions) === null || _b === void 0 ? void 0 : _b.includes(name + '.*')) || ((_c = config === null || config === void 0 ? void 0 : config.exclusions) === null || _c === void 0 ? void 0 : _c.includes(name))) {
563
- delete mergedResultMap[name];
564
- }
565
- else {
566
- switch (nodeDefinition.kind) {
567
- case graphql.Kind.OBJECT_TYPE_DEFINITION:
568
- case graphql.Kind.OBJECT_TYPE_EXTENSION:
569
- mergedResultMap[name] = mergeType(nodeDefinition, mergedResultMap[name], config);
570
- break;
571
- case graphql.Kind.ENUM_TYPE_DEFINITION:
572
- case graphql.Kind.ENUM_TYPE_EXTENSION:
573
- mergedResultMap[name] = mergeEnum(nodeDefinition, mergedResultMap[name], config);
574
- break;
575
- case graphql.Kind.UNION_TYPE_DEFINITION:
576
- case graphql.Kind.UNION_TYPE_EXTENSION:
577
- mergedResultMap[name] = mergeUnion(nodeDefinition, mergedResultMap[name], config);
578
- break;
579
- case graphql.Kind.SCALAR_TYPE_DEFINITION:
580
- case graphql.Kind.SCALAR_TYPE_EXTENSION:
581
- mergedResultMap[name] = mergeScalar(nodeDefinition, mergedResultMap[name], config);
582
- break;
583
- case graphql.Kind.INPUT_OBJECT_TYPE_DEFINITION:
584
- case graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION:
585
- mergedResultMap[name] = mergeInputType(nodeDefinition, mergedResultMap[name], config);
586
- break;
587
- case graphql.Kind.INTERFACE_TYPE_DEFINITION:
588
- case graphql.Kind.INTERFACE_TYPE_EXTENSION:
589
- mergedResultMap[name] = mergeInterface(nodeDefinition, mergedResultMap[name], config);
590
- break;
591
- case graphql.Kind.DIRECTIVE_DEFINITION:
592
- mergedResultMap[name] = mergeDirective(nodeDefinition, mergedResultMap[name]);
593
- break;
594
- }
595
- }
596
- }
597
- else if (nodeDefinition.kind === graphql.Kind.SCHEMA_DEFINITION || nodeDefinition.kind === graphql.Kind.SCHEMA_EXTENSION) {
598
- mergedResultMap[schemaDefSymbol] = mergeSchemaDefs(nodeDefinition, mergedResultMap[schemaDefSymbol], config);
599
- }
600
- }
601
- return mergedResultMap;
602
- }
603
-
604
- function mergeTypeDefs(typeSource, config) {
605
- utils.resetComments();
606
- const doc = {
607
- kind: graphql.Kind.DOCUMENT,
608
- definitions: mergeGraphQLTypes(typeSource, {
609
- useSchemaDefinition: true,
610
- forceSchemaDefinition: false,
611
- throwOnConflict: false,
612
- commentDescriptions: false,
613
- ...config,
614
- }),
615
- };
616
- let result;
617
- if (config === null || config === void 0 ? void 0 : config.commentDescriptions) {
618
- result = utils.printWithComments(doc);
619
- }
620
- else {
621
- result = doc;
622
- }
623
- utils.resetComments();
624
- return result;
625
- }
626
- function visitTypeSources(typeSource, options, allNodes = [], visitedTypeSources = new Set()) {
627
- if (typeSource && !visitedTypeSources.has(typeSource)) {
628
- visitedTypeSources.add(typeSource);
629
- if (typeof typeSource === 'function') {
630
- visitTypeSources(typeSource(), options, allNodes, visitedTypeSources);
631
- }
632
- else if (Array.isArray(typeSource)) {
633
- for (const type of typeSource) {
634
- visitTypeSources(type, options, allNodes, visitedTypeSources);
635
- }
636
- }
637
- else if (graphql.isSchema(typeSource)) {
638
- const documentNode = utils.getDocumentNodeFromSchema(typeSource, options);
639
- visitTypeSources(documentNode.definitions, options, allNodes, visitedTypeSources);
640
- }
641
- else if (isStringTypes(typeSource) || isSourceTypes(typeSource)) {
642
- const documentNode = graphql.parse(typeSource, options);
643
- visitTypeSources(documentNode.definitions, options, allNodes, visitedTypeSources);
644
- }
645
- else if (typeof typeSource === 'object' && graphql.isDefinitionNode(typeSource)) {
646
- allNodes.push(typeSource);
647
- }
648
- else if (utils.isDocumentNode(typeSource)) {
649
- visitTypeSources(typeSource.definitions, options, allNodes, visitedTypeSources);
650
- }
651
- else {
652
- throw new Error(`typeDefs must contain only strings, documents, schemas, or functions, got ${typeof typeSource}`);
653
- }
654
- }
655
- return allNodes;
656
- }
657
- function mergeGraphQLTypes(typeSource, config) {
658
- var _a, _b, _c;
659
- utils.resetComments();
660
- const allNodes = visitTypeSources(typeSource, config);
661
- const mergedNodes = mergeGraphQLNodes(allNodes, config);
662
- if (config === null || config === void 0 ? void 0 : config.useSchemaDefinition) {
663
- // XXX: right now we don't handle multiple schema definitions
664
- const schemaDef = mergedNodes[schemaDefSymbol] || {
665
- kind: graphql.Kind.SCHEMA_DEFINITION,
666
- operationTypes: [],
667
- };
668
- const operationTypes = schemaDef.operationTypes;
669
- for (const opTypeDefNodeType in DEFAULT_OPERATION_TYPE_NAME_MAP) {
670
- const opTypeDefNode = operationTypes.find(operationType => operationType.operation === opTypeDefNodeType);
671
- if (!opTypeDefNode) {
672
- const possibleRootTypeName = DEFAULT_OPERATION_TYPE_NAME_MAP[opTypeDefNodeType];
673
- const existingPossibleRootType = mergedNodes[possibleRootTypeName];
674
- if (existingPossibleRootType != null && existingPossibleRootType.name != null) {
675
- operationTypes.push({
676
- kind: graphql.Kind.OPERATION_TYPE_DEFINITION,
677
- type: {
678
- kind: graphql.Kind.NAMED_TYPE,
679
- name: existingPossibleRootType.name,
680
- },
681
- operation: opTypeDefNodeType,
682
- });
683
- }
684
- }
685
- }
686
- if (((_a = schemaDef === null || schemaDef === void 0 ? void 0 : schemaDef.operationTypes) === null || _a === void 0 ? void 0 : _a.length) != null && schemaDef.operationTypes.length > 0) {
687
- mergedNodes[schemaDefSymbol] = schemaDef;
688
- }
689
- }
690
- if ((config === null || config === void 0 ? void 0 : config.forceSchemaDefinition) && !((_c = (_b = mergedNodes[schemaDefSymbol]) === null || _b === void 0 ? void 0 : _b.operationTypes) === null || _c === void 0 ? void 0 : _c.length)) {
691
- mergedNodes[schemaDefSymbol] = {
692
- kind: graphql.Kind.SCHEMA_DEFINITION,
693
- operationTypes: [
694
- {
695
- kind: graphql.Kind.OPERATION_TYPE_DEFINITION,
696
- operation: 'query',
697
- type: {
698
- kind: graphql.Kind.NAMED_TYPE,
699
- name: {
700
- kind: graphql.Kind.NAME,
701
- value: 'Query',
702
- },
703
- },
704
- },
705
- ],
706
- };
707
- }
708
- const mergedNodeDefinitions = Object.values(mergedNodes);
709
- if (config === null || config === void 0 ? void 0 : config.sort) {
710
- const sortFn = typeof config.sort === 'function' ? config.sort : defaultStringComparator;
711
- mergedNodeDefinitions.sort((a, b) => { var _a, _b; return sortFn((_a = a.name) === null || _a === void 0 ? void 0 : _a.value, (_b = b.name) === null || _b === void 0 ? void 0 : _b.value); });
712
- }
713
- return mergedNodeDefinitions;
714
- }
715
-
716
- function travelSchemaPossibleExtensions(schema, hooks) {
717
- hooks.onSchema(schema);
718
- const typesMap = schema.getTypeMap();
719
- for (const [, type] of Object.entries(typesMap)) {
720
- const isPredefinedScalar = graphql.isScalarType(type) && graphql.isSpecifiedScalarType(type);
721
- const isIntrospection = graphql.isIntrospectionType(type);
722
- if (isPredefinedScalar || isIntrospection) {
723
- continue;
724
- }
725
- if (graphql.isObjectType(type)) {
726
- hooks.onObjectType(type);
727
- const fields = type.getFields();
728
- for (const [, field] of Object.entries(fields)) {
729
- hooks.onObjectField(type, field);
730
- const args = field.args || [];
731
- for (const arg of args) {
732
- hooks.onObjectFieldArg(type, field, arg);
733
- }
734
- }
735
- }
736
- else if (graphql.isInterfaceType(type)) {
737
- hooks.onInterface(type);
738
- const fields = type.getFields();
739
- for (const [, field] of Object.entries(fields)) {
740
- hooks.onInterfaceField(type, field);
741
- const args = field.args || [];
742
- for (const arg of args) {
743
- hooks.onInterfaceFieldArg(type, field, arg);
744
- }
745
- }
746
- }
747
- else if (graphql.isInputObjectType(type)) {
748
- hooks.onInputType(type);
749
- const fields = type.getFields();
750
- for (const [, field] of Object.entries(fields)) {
751
- hooks.onInputFieldType(type, field);
752
- }
753
- }
754
- else if (graphql.isUnionType(type)) {
755
- hooks.onUnion(type);
756
- }
757
- else if (graphql.isScalarType(type)) {
758
- hooks.onScalar(type);
759
- }
760
- else if (graphql.isEnumType(type)) {
761
- hooks.onEnum(type);
762
- for (const value of type.getValues()) {
763
- hooks.onEnumValue(type, value);
764
- }
765
- }
766
- }
767
- }
768
- function mergeExtensions(extensions) {
769
- return utils.mergeDeep(extensions);
770
- }
771
- function applyExtensionObject(obj, extensions) {
772
- if (!obj) {
773
- return;
774
- }
775
- obj.extensions = utils.mergeDeep([obj.extensions || {}, extensions || {}]);
776
- }
777
- function applyExtensions(schema, extensions) {
778
- applyExtensionObject(schema, extensions.schemaExtensions);
779
- for (const [typeName, data] of Object.entries(extensions.types || {})) {
780
- const type = schema.getType(typeName);
781
- if (type) {
782
- applyExtensionObject(type, data.extensions);
783
- if (data.type === 'object' || data.type === 'interface') {
784
- for (const [fieldName, fieldData] of Object.entries(data.fields)) {
785
- const field = type.getFields()[fieldName];
786
- if (field) {
787
- applyExtensionObject(field, fieldData.extensions);
788
- for (const [arg, argData] of Object.entries(fieldData.arguments)) {
789
- applyExtensionObject(field.args.find(a => a.name === arg), argData);
790
- }
791
- }
792
- }
793
- }
794
- else if (data.type === 'input') {
795
- for (const [fieldName, fieldData] of Object.entries(data.fields)) {
796
- const field = type.getFields()[fieldName];
797
- applyExtensionObject(field, fieldData.extensions);
798
- }
799
- }
800
- else if (data.type === 'enum') {
801
- for (const [valueName, valueData] of Object.entries(data.values)) {
802
- const value = type.getValue(valueName);
803
- applyExtensionObject(value, valueData);
804
- }
805
- }
806
- }
807
- }
808
- return schema;
809
- }
810
- function extractExtensionsFromSchema(schema) {
811
- const result = {
812
- schemaExtensions: {},
813
- types: {},
814
- };
815
- travelSchemaPossibleExtensions(schema, {
816
- onSchema: schema => (result.schemaExtensions = schema.extensions || {}),
817
- onObjectType: type => (result.types[type.name] = { fields: {}, type: 'object', extensions: type.extensions || {} }),
818
- onObjectField: (type, field) => (result.types[type.name].fields[field.name] = {
819
- arguments: {},
820
- extensions: field.extensions || {},
821
- }),
822
- onObjectFieldArg: (type, field, arg) => (result.types[type.name].fields[field.name].arguments[arg.name] = arg.extensions || {}),
823
- onInterface: type => (result.types[type.name] = { fields: {}, type: 'interface', extensions: type.extensions || {} }),
824
- onInterfaceField: (type, field) => (result.types[type.name].fields[field.name] = {
825
- arguments: {},
826
- extensions: field.extensions || {},
827
- }),
828
- onInterfaceFieldArg: (type, field, arg) => (result.types[type.name].fields[field.name].arguments[arg.name] =
829
- arg.extensions || {}),
830
- onEnum: type => (result.types[type.name] = { values: {}, type: 'enum', extensions: type.extensions || {} }),
831
- onEnumValue: (type, value) => (result.types[type.name].values[value.name] = value.extensions || {}),
832
- onScalar: type => (result.types[type.name] = { type: 'scalar', extensions: type.extensions || {} }),
833
- onUnion: type => (result.types[type.name] = { type: 'union', extensions: type.extensions || {} }),
834
- onInputType: type => (result.types[type.name] = { fields: {}, type: 'input', extensions: type.extensions || {} }),
835
- onInputFieldType: (type, field) => (result.types[type.name].fields[field.name] = { extensions: field.extensions || {} }),
836
- });
837
- return result;
838
- }
839
-
840
- exports.applyExtensions = applyExtensions;
841
- exports.defaultStringComparator = defaultStringComparator;
842
- exports.extractExtensionsFromSchema = extractExtensionsFromSchema;
843
- exports.extractType = extractType;
844
- exports.isListTypeNode = isListTypeNode;
845
- exports.isNamedDefinitionNode = isNamedDefinitionNode;
846
- exports.isNonNullTypeNode = isNonNullTypeNode;
847
- exports.isSourceTypes = isSourceTypes;
848
- exports.isStringTypes = isStringTypes;
849
- exports.isWrappingTypeNode = isWrappingTypeNode;
850
- exports.mergeArguments = mergeArguments;
851
- exports.mergeDirective = mergeDirective;
852
- exports.mergeDirectives = mergeDirectives;
853
- exports.mergeEnum = mergeEnum;
854
- exports.mergeEnumValues = mergeEnumValues;
855
- exports.mergeExtensions = mergeExtensions;
856
- exports.mergeFields = mergeFields;
857
- exports.mergeGraphQLNodes = mergeGraphQLNodes;
858
- exports.mergeGraphQLTypes = mergeGraphQLTypes;
859
- exports.mergeInputType = mergeInputType;
860
- exports.mergeInterface = mergeInterface;
861
- exports.mergeNamedTypeArray = mergeNamedTypeArray;
862
- exports.mergeResolvers = mergeResolvers;
863
- exports.mergeScalar = mergeScalar;
864
- exports.mergeType = mergeType;
865
- exports.mergeTypeDefs = mergeTypeDefs;
866
- exports.mergeUnion = mergeUnion;
867
- exports.printTypeNode = printTypeNode;
868
- exports.schemaDefSymbol = schemaDefSymbol;
869
- exports.travelSchemaPossibleExtensions = travelSchemaPossibleExtensions;