@graphql-tools/merge 8.2.15-alpha-b3ffd406.0 → 8.3.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/cjs/extensions.js +132 -0
- package/cjs/index.js +6 -0
- package/cjs/merge-resolvers.js +67 -0
- package/cjs/package.json +1 -0
- package/cjs/typedefs-mergers/arguments.js +21 -0
- package/cjs/typedefs-mergers/directives.js +100 -0
- package/cjs/typedefs-mergers/enum-values.js +40 -0
- package/cjs/typedefs-mergers/enum.js +27 -0
- package/cjs/typedefs-mergers/fields.js +85 -0
- package/cjs/typedefs-mergers/index.js +17 -0
- package/cjs/typedefs-mergers/input-type.js +34 -0
- package/cjs/typedefs-mergers/interface.js +38 -0
- package/cjs/typedefs-mergers/merge-named-type-array.js +15 -0
- package/cjs/typedefs-mergers/merge-nodes.js +72 -0
- package/cjs/typedefs-mergers/merge-typedefs.js +121 -0
- package/cjs/typedefs-mergers/scalar.js +27 -0
- package/cjs/typedefs-mergers/schema-def.js +39 -0
- package/cjs/typedefs-mergers/type.js +36 -0
- package/cjs/typedefs-mergers/union.js +28 -0
- package/cjs/typedefs-mergers/utils.js +65 -0
- package/esm/extensions.js +125 -0
- package/esm/index.js +3 -0
- package/esm/merge-resolvers.js +63 -0
- package/esm/typedefs-mergers/arguments.js +17 -0
- package/esm/typedefs-mergers/directives.js +95 -0
- package/esm/typedefs-mergers/enum-values.js +36 -0
- package/esm/typedefs-mergers/enum.js +23 -0
- package/esm/typedefs-mergers/fields.js +81 -0
- package/esm/typedefs-mergers/index.js +14 -0
- package/esm/typedefs-mergers/input-type.js +30 -0
- package/esm/typedefs-mergers/interface.js +34 -0
- package/esm/typedefs-mergers/merge-named-type-array.js +11 -0
- package/esm/typedefs-mergers/merge-nodes.js +67 -0
- package/esm/typedefs-mergers/merge-typedefs.js +116 -0
- package/esm/typedefs-mergers/scalar.js +23 -0
- package/esm/typedefs-mergers/schema-def.js +35 -0
- package/esm/typedefs-mergers/type.js +32 -0
- package/esm/typedefs-mergers/union.js +24 -0
- package/esm/typedefs-mergers/utils.js +54 -0
- package/package.json +32 -11
- package/{extensions.d.ts → typings/extensions.d.ts} +0 -0
- package/typings/index.d.ts +3 -0
- package/{merge-resolvers.d.ts → typings/merge-resolvers.d.ts} +0 -0
- package/{typedefs-mergers → typings/typedefs-mergers}/arguments.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/directives.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/enum-values.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/enum.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/fields.d.ts +1 -1
- package/typings/typedefs-mergers/index.d.ts +14 -0
- package/{typedefs-mergers → typings/typedefs-mergers}/input-type.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/interface.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/merge-named-type-array.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/merge-nodes.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/merge-typedefs.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/scalar.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/schema-def.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/type.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/union.d.ts +1 -1
- package/{typedefs-mergers → typings/typedefs-mergers}/utils.d.ts +0 -0
- package/README.md +0 -5
- package/index.d.ts +0 -3
- package/index.js +0 -869
- package/index.mjs +0 -837
- package/typedefs-mergers/index.d.ts +0 -14
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractExtensionsFromSchema = exports.applyExtensions = exports.mergeExtensions = exports.travelSchemaPossibleExtensions = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
6
|
+
function travelSchemaPossibleExtensions(schema, hooks) {
|
|
7
|
+
hooks.onSchema(schema);
|
|
8
|
+
const typesMap = schema.getTypeMap();
|
|
9
|
+
for (const [, type] of Object.entries(typesMap)) {
|
|
10
|
+
const isPredefinedScalar = (0, graphql_1.isScalarType)(type) && (0, graphql_1.isSpecifiedScalarType)(type);
|
|
11
|
+
const isIntrospection = (0, graphql_1.isIntrospectionType)(type);
|
|
12
|
+
if (isPredefinedScalar || isIntrospection) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if ((0, graphql_1.isObjectType)(type)) {
|
|
16
|
+
hooks.onObjectType(type);
|
|
17
|
+
const fields = type.getFields();
|
|
18
|
+
for (const [, field] of Object.entries(fields)) {
|
|
19
|
+
hooks.onObjectField(type, field);
|
|
20
|
+
const args = field.args || [];
|
|
21
|
+
for (const arg of args) {
|
|
22
|
+
hooks.onObjectFieldArg(type, field, arg);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if ((0, graphql_1.isInterfaceType)(type)) {
|
|
27
|
+
hooks.onInterface(type);
|
|
28
|
+
const fields = type.getFields();
|
|
29
|
+
for (const [, field] of Object.entries(fields)) {
|
|
30
|
+
hooks.onInterfaceField(type, field);
|
|
31
|
+
const args = field.args || [];
|
|
32
|
+
for (const arg of args) {
|
|
33
|
+
hooks.onInterfaceFieldArg(type, field, arg);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if ((0, graphql_1.isInputObjectType)(type)) {
|
|
38
|
+
hooks.onInputType(type);
|
|
39
|
+
const fields = type.getFields();
|
|
40
|
+
for (const [, field] of Object.entries(fields)) {
|
|
41
|
+
hooks.onInputFieldType(type, field);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if ((0, graphql_1.isUnionType)(type)) {
|
|
45
|
+
hooks.onUnion(type);
|
|
46
|
+
}
|
|
47
|
+
else if ((0, graphql_1.isScalarType)(type)) {
|
|
48
|
+
hooks.onScalar(type);
|
|
49
|
+
}
|
|
50
|
+
else if ((0, graphql_1.isEnumType)(type)) {
|
|
51
|
+
hooks.onEnum(type);
|
|
52
|
+
for (const value of type.getValues()) {
|
|
53
|
+
hooks.onEnumValue(type, value);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.travelSchemaPossibleExtensions = travelSchemaPossibleExtensions;
|
|
59
|
+
function mergeExtensions(extensions) {
|
|
60
|
+
return (0, utils_1.mergeDeep)(extensions);
|
|
61
|
+
}
|
|
62
|
+
exports.mergeExtensions = mergeExtensions;
|
|
63
|
+
function applyExtensionObject(obj, extensions) {
|
|
64
|
+
if (!obj) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
obj.extensions = (0, utils_1.mergeDeep)([obj.extensions || {}, extensions || {}]);
|
|
68
|
+
}
|
|
69
|
+
function applyExtensions(schema, extensions) {
|
|
70
|
+
applyExtensionObject(schema, extensions.schemaExtensions);
|
|
71
|
+
for (const [typeName, data] of Object.entries(extensions.types || {})) {
|
|
72
|
+
const type = schema.getType(typeName);
|
|
73
|
+
if (type) {
|
|
74
|
+
applyExtensionObject(type, data.extensions);
|
|
75
|
+
if (data.type === 'object' || data.type === 'interface') {
|
|
76
|
+
for (const [fieldName, fieldData] of Object.entries(data.fields)) {
|
|
77
|
+
const field = type.getFields()[fieldName];
|
|
78
|
+
if (field) {
|
|
79
|
+
applyExtensionObject(field, fieldData.extensions);
|
|
80
|
+
for (const [arg, argData] of Object.entries(fieldData.arguments)) {
|
|
81
|
+
applyExtensionObject(field.args.find(a => a.name === arg), argData);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (data.type === 'input') {
|
|
87
|
+
for (const [fieldName, fieldData] of Object.entries(data.fields)) {
|
|
88
|
+
const field = type.getFields()[fieldName];
|
|
89
|
+
applyExtensionObject(field, fieldData.extensions);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (data.type === 'enum') {
|
|
93
|
+
for (const [valueName, valueData] of Object.entries(data.values)) {
|
|
94
|
+
const value = type.getValue(valueName);
|
|
95
|
+
applyExtensionObject(value, valueData);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return schema;
|
|
101
|
+
}
|
|
102
|
+
exports.applyExtensions = applyExtensions;
|
|
103
|
+
function extractExtensionsFromSchema(schema) {
|
|
104
|
+
const result = {
|
|
105
|
+
schemaExtensions: {},
|
|
106
|
+
types: {},
|
|
107
|
+
};
|
|
108
|
+
travelSchemaPossibleExtensions(schema, {
|
|
109
|
+
onSchema: schema => (result.schemaExtensions = schema.extensions || {}),
|
|
110
|
+
onObjectType: type => (result.types[type.name] = { fields: {}, type: 'object', extensions: type.extensions || {} }),
|
|
111
|
+
onObjectField: (type, field) => (result.types[type.name].fields[field.name] = {
|
|
112
|
+
arguments: {},
|
|
113
|
+
extensions: field.extensions || {},
|
|
114
|
+
}),
|
|
115
|
+
onObjectFieldArg: (type, field, arg) => (result.types[type.name].fields[field.name].arguments[arg.name] = arg.extensions || {}),
|
|
116
|
+
onInterface: type => (result.types[type.name] = { fields: {}, type: 'interface', extensions: type.extensions || {} }),
|
|
117
|
+
onInterfaceField: (type, field) => (result.types[type.name].fields[field.name] = {
|
|
118
|
+
arguments: {},
|
|
119
|
+
extensions: field.extensions || {},
|
|
120
|
+
}),
|
|
121
|
+
onInterfaceFieldArg: (type, field, arg) => (result.types[type.name].fields[field.name].arguments[arg.name] =
|
|
122
|
+
arg.extensions || {}),
|
|
123
|
+
onEnum: type => (result.types[type.name] = { values: {}, type: 'enum', extensions: type.extensions || {} }),
|
|
124
|
+
onEnumValue: (type, value) => (result.types[type.name].values[value.name] = value.extensions || {}),
|
|
125
|
+
onScalar: type => (result.types[type.name] = { type: 'scalar', extensions: type.extensions || {} }),
|
|
126
|
+
onUnion: type => (result.types[type.name] = { type: 'union', extensions: type.extensions || {} }),
|
|
127
|
+
onInputType: type => (result.types[type.name] = { fields: {}, type: 'input', extensions: type.extensions || {} }),
|
|
128
|
+
onInputFieldType: (type, field) => (result.types[type.name].fields[field.name] = { extensions: field.extensions || {} }),
|
|
129
|
+
});
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
exports.extractExtensionsFromSchema = extractExtensionsFromSchema;
|
package/cjs/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./merge-resolvers.js"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./typedefs-mergers/index.js"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./extensions.js"), exports);
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeResolvers = void 0;
|
|
4
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
5
|
+
/**
|
|
6
|
+
* Deep merges multiple resolver definition objects into a single definition.
|
|
7
|
+
* @param resolversDefinitions Resolver definitions to be merged
|
|
8
|
+
* @param options Additional options
|
|
9
|
+
*
|
|
10
|
+
* ```js
|
|
11
|
+
* const { mergeResolvers } = require('@graphql-tools/merge');
|
|
12
|
+
* const clientResolver = require('./clientResolver');
|
|
13
|
+
* const productResolver = require('./productResolver');
|
|
14
|
+
*
|
|
15
|
+
* const resolvers = mergeResolvers([
|
|
16
|
+
* clientResolver,
|
|
17
|
+
* productResolver,
|
|
18
|
+
* ]);
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* If you don't want to manually create the array of resolver objects, you can
|
|
22
|
+
* also use this function along with loadFiles:
|
|
23
|
+
*
|
|
24
|
+
* ```js
|
|
25
|
+
* const path = require('path');
|
|
26
|
+
* const { mergeResolvers } = require('@graphql-tools/merge');
|
|
27
|
+
* const { loadFilesSync } = require('@graphql-tools/load-files');
|
|
28
|
+
*
|
|
29
|
+
* const resolversArray = loadFilesSync(path.join(__dirname, './resolvers'));
|
|
30
|
+
*
|
|
31
|
+
* const resolvers = mergeResolvers(resolversArray)
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
function mergeResolvers(resolversDefinitions, options) {
|
|
35
|
+
if (!resolversDefinitions || (Array.isArray(resolversDefinitions) && resolversDefinitions.length === 0)) {
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
if (!Array.isArray(resolversDefinitions)) {
|
|
39
|
+
return resolversDefinitions;
|
|
40
|
+
}
|
|
41
|
+
if (resolversDefinitions.length === 1) {
|
|
42
|
+
return resolversDefinitions[0] || {};
|
|
43
|
+
}
|
|
44
|
+
const resolvers = new Array();
|
|
45
|
+
for (let resolversDefinition of resolversDefinitions) {
|
|
46
|
+
if (Array.isArray(resolversDefinition)) {
|
|
47
|
+
resolversDefinition = mergeResolvers(resolversDefinition);
|
|
48
|
+
}
|
|
49
|
+
if (typeof resolversDefinition === 'object' && resolversDefinition) {
|
|
50
|
+
resolvers.push(resolversDefinition);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const result = (0, utils_1.mergeDeep)(resolvers, true);
|
|
54
|
+
if (options === null || options === void 0 ? void 0 : options.exclusions) {
|
|
55
|
+
for (const exclusion of options.exclusions) {
|
|
56
|
+
const [typeName, fieldName] = exclusion.split('.');
|
|
57
|
+
if (!fieldName || fieldName === '*') {
|
|
58
|
+
delete result[typeName];
|
|
59
|
+
}
|
|
60
|
+
else if (result[typeName]) {
|
|
61
|
+
delete result[typeName][fieldName];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
exports.mergeResolvers = mergeResolvers;
|
package/cjs/package.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeArguments = void 0;
|
|
4
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
5
|
+
function mergeArguments(args1, args2, config) {
|
|
6
|
+
const result = deduplicateArguments([...args2, ...args1].filter(utils_1.isSome));
|
|
7
|
+
if (config && config.sort) {
|
|
8
|
+
result.sort(utils_1.compareNodes);
|
|
9
|
+
}
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
exports.mergeArguments = mergeArguments;
|
|
13
|
+
function deduplicateArguments(args) {
|
|
14
|
+
return args.reduce((acc, current) => {
|
|
15
|
+
const dup = acc.find(arg => arg.name.value === current.name.value);
|
|
16
|
+
if (!dup) {
|
|
17
|
+
return acc.concat([current]);
|
|
18
|
+
}
|
|
19
|
+
return acc;
|
|
20
|
+
}, []);
|
|
21
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeDirective = exports.mergeDirectives = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
6
|
+
function directiveAlreadyExists(directivesArr, otherDirective) {
|
|
7
|
+
return !!directivesArr.find(directive => directive.name.value === otherDirective.name.value);
|
|
8
|
+
}
|
|
9
|
+
function nameAlreadyExists(name, namesArr) {
|
|
10
|
+
return namesArr.some(({ value }) => value === name.value);
|
|
11
|
+
}
|
|
12
|
+
function mergeArguments(a1, a2) {
|
|
13
|
+
const result = [...a2];
|
|
14
|
+
for (const argument of a1) {
|
|
15
|
+
const existingIndex = result.findIndex(a => a.name.value === argument.name.value);
|
|
16
|
+
if (existingIndex > -1) {
|
|
17
|
+
const existingArg = result[existingIndex];
|
|
18
|
+
if (existingArg.value.kind === 'ListValue') {
|
|
19
|
+
const source = existingArg.value.values;
|
|
20
|
+
const target = argument.value.values;
|
|
21
|
+
// merge values of two lists
|
|
22
|
+
existingArg.value.values = deduplicateLists(source, target, (targetVal, source) => {
|
|
23
|
+
const value = targetVal.value;
|
|
24
|
+
return !value || !source.some((sourceVal) => sourceVal.value === value);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
existingArg.value = argument.value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
result.push(argument);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
function deduplicateDirectives(directives) {
|
|
38
|
+
return directives
|
|
39
|
+
.map((directive, i, all) => {
|
|
40
|
+
const firstAt = all.findIndex(d => d.name.value === directive.name.value);
|
|
41
|
+
if (firstAt !== i) {
|
|
42
|
+
const dup = all[firstAt];
|
|
43
|
+
directive.arguments = mergeArguments(directive.arguments, dup.arguments);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return directive;
|
|
47
|
+
})
|
|
48
|
+
.filter(utils_1.isSome);
|
|
49
|
+
}
|
|
50
|
+
function mergeDirectives(d1 = [], d2 = [], config) {
|
|
51
|
+
const reverseOrder = config && config.reverseDirectives;
|
|
52
|
+
const asNext = reverseOrder ? d1 : d2;
|
|
53
|
+
const asFirst = reverseOrder ? d2 : d1;
|
|
54
|
+
const result = deduplicateDirectives([...asNext]);
|
|
55
|
+
for (const directive of asFirst) {
|
|
56
|
+
if (directiveAlreadyExists(result, directive)) {
|
|
57
|
+
const existingDirectiveIndex = result.findIndex(d => d.name.value === directive.name.value);
|
|
58
|
+
const existingDirective = result[existingDirectiveIndex];
|
|
59
|
+
result[existingDirectiveIndex].arguments = mergeArguments(directive.arguments || [], existingDirective.arguments || []);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
result.push(directive);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
exports.mergeDirectives = mergeDirectives;
|
|
68
|
+
function validateInputs(node, existingNode) {
|
|
69
|
+
const printedNode = (0, graphql_1.print)({
|
|
70
|
+
...node,
|
|
71
|
+
description: undefined,
|
|
72
|
+
});
|
|
73
|
+
const printedExistingNode = (0, graphql_1.print)({
|
|
74
|
+
...existingNode,
|
|
75
|
+
description: undefined,
|
|
76
|
+
});
|
|
77
|
+
// eslint-disable-next-line
|
|
78
|
+
const leaveInputs = new RegExp('(directive @w*d*)|( on .*$)', 'g');
|
|
79
|
+
const sameArguments = printedNode.replace(leaveInputs, '') === printedExistingNode.replace(leaveInputs, '');
|
|
80
|
+
if (!sameArguments) {
|
|
81
|
+
throw new Error(`Unable to merge GraphQL directive "${node.name.value}". \nExisting directive: \n\t${printedExistingNode} \nReceived directive: \n\t${printedNode}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function mergeDirective(node, existingNode) {
|
|
85
|
+
if (existingNode) {
|
|
86
|
+
validateInputs(node, existingNode);
|
|
87
|
+
return {
|
|
88
|
+
...node,
|
|
89
|
+
locations: [
|
|
90
|
+
...existingNode.locations,
|
|
91
|
+
...node.locations.filter(name => !nameAlreadyExists(name, existingNode.locations)),
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return node;
|
|
96
|
+
}
|
|
97
|
+
exports.mergeDirective = mergeDirective;
|
|
98
|
+
function deduplicateLists(source, target, filterFn) {
|
|
99
|
+
return source.concat(target.filter(val => filterFn(val, source)));
|
|
100
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeEnumValues = void 0;
|
|
4
|
+
const directives_js_1 = require("./directives.js");
|
|
5
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
6
|
+
function mergeEnumValues(first, second, config) {
|
|
7
|
+
if (config === null || config === void 0 ? void 0 : config.consistentEnumMerge) {
|
|
8
|
+
const reversed = [];
|
|
9
|
+
if (first) {
|
|
10
|
+
reversed.push(...first);
|
|
11
|
+
}
|
|
12
|
+
first = second;
|
|
13
|
+
second = reversed;
|
|
14
|
+
}
|
|
15
|
+
const enumValueMap = new Map();
|
|
16
|
+
if (first) {
|
|
17
|
+
for (const firstValue of first) {
|
|
18
|
+
enumValueMap.set(firstValue.name.value, firstValue);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (second) {
|
|
22
|
+
for (const secondValue of second) {
|
|
23
|
+
const enumValue = secondValue.name.value;
|
|
24
|
+
if (enumValueMap.has(enumValue)) {
|
|
25
|
+
const firstValue = enumValueMap.get(enumValue);
|
|
26
|
+
firstValue.description = secondValue.description || firstValue.description;
|
|
27
|
+
firstValue.directives = (0, directives_js_1.mergeDirectives)(secondValue.directives, firstValue.directives);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
enumValueMap.set(enumValue, secondValue);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const result = [...enumValueMap.values()];
|
|
35
|
+
if (config && config.sort) {
|
|
36
|
+
result.sort(utils_1.compareNodes);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
exports.mergeEnumValues = mergeEnumValues;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeEnum = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const directives_js_1 = require("./directives.js");
|
|
6
|
+
const enum_values_js_1 = require("./enum-values.js");
|
|
7
|
+
function mergeEnum(e1, e2, config) {
|
|
8
|
+
if (e2) {
|
|
9
|
+
return {
|
|
10
|
+
name: e1.name,
|
|
11
|
+
description: e1['description'] || e2['description'],
|
|
12
|
+
kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || e1.kind === 'EnumTypeDefinition' || e2.kind === 'EnumTypeDefinition'
|
|
13
|
+
? 'EnumTypeDefinition'
|
|
14
|
+
: 'EnumTypeExtension',
|
|
15
|
+
loc: e1.loc,
|
|
16
|
+
directives: (0, directives_js_1.mergeDirectives)(e1.directives, e2.directives, config),
|
|
17
|
+
values: (0, enum_values_js_1.mergeEnumValues)(e1.values, e2.values, config),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return (config === null || config === void 0 ? void 0 : config.convertExtensions)
|
|
21
|
+
? {
|
|
22
|
+
...e1,
|
|
23
|
+
kind: graphql_1.Kind.ENUM_TYPE_DEFINITION,
|
|
24
|
+
}
|
|
25
|
+
: e1;
|
|
26
|
+
}
|
|
27
|
+
exports.mergeEnum = mergeEnum;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeFields = void 0;
|
|
4
|
+
const utils_js_1 = require("./utils.js");
|
|
5
|
+
const directives_js_1 = require("./directives.js");
|
|
6
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
7
|
+
const arguments_js_1 = require("./arguments.js");
|
|
8
|
+
function fieldAlreadyExists(fieldsArr, otherField, config) {
|
|
9
|
+
const result = fieldsArr.find(field => field.name.value === otherField.name.value);
|
|
10
|
+
if (result && !(config === null || config === void 0 ? void 0 : config.ignoreFieldConflicts)) {
|
|
11
|
+
const t1 = (0, utils_js_1.extractType)(result.type);
|
|
12
|
+
const t2 = (0, utils_js_1.extractType)(otherField.type);
|
|
13
|
+
if (t1.name.value !== t2.name.value) {
|
|
14
|
+
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}"`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return !!result;
|
|
18
|
+
}
|
|
19
|
+
function mergeFields(type, f1, f2, config) {
|
|
20
|
+
const result = [];
|
|
21
|
+
if (f2 != null) {
|
|
22
|
+
result.push(...f2);
|
|
23
|
+
}
|
|
24
|
+
if (f1 != null) {
|
|
25
|
+
for (const field of f1) {
|
|
26
|
+
if (fieldAlreadyExists(result, field, config)) {
|
|
27
|
+
const existing = result.find((f) => f.name.value === field.name.value);
|
|
28
|
+
if (!(config === null || config === void 0 ? void 0 : config.ignoreFieldConflicts)) {
|
|
29
|
+
if (config === null || config === void 0 ? void 0 : config.throwOnConflict) {
|
|
30
|
+
preventConflicts(type, existing, field, false);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
preventConflicts(type, existing, field, true);
|
|
34
|
+
}
|
|
35
|
+
if ((0, utils_js_1.isNonNullTypeNode)(field.type) && !(0, utils_js_1.isNonNullTypeNode)(existing.type)) {
|
|
36
|
+
existing.type = field.type;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
existing.arguments = (0, arguments_js_1.mergeArguments)(field['arguments'] || [], existing.arguments || [], config);
|
|
40
|
+
existing.directives = (0, directives_js_1.mergeDirectives)(field.directives, existing.directives, config);
|
|
41
|
+
existing.description = field.description || existing.description;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
result.push(field);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (config && config.sort) {
|
|
49
|
+
result.sort(utils_1.compareNodes);
|
|
50
|
+
}
|
|
51
|
+
if (config && config.exclusions) {
|
|
52
|
+
const exclusions = config.exclusions;
|
|
53
|
+
return result.filter(field => !exclusions.includes(`${type.name.value}.${field.name.value}`));
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
exports.mergeFields = mergeFields;
|
|
58
|
+
function preventConflicts(type, a, b, ignoreNullability = false) {
|
|
59
|
+
const aType = (0, utils_js_1.printTypeNode)(a.type);
|
|
60
|
+
const bType = (0, utils_js_1.printTypeNode)(b.type);
|
|
61
|
+
if (aType !== bType && !safeChangeForFieldType(a.type, b.type, ignoreNullability)) {
|
|
62
|
+
throw new Error(`Field '${type.name.value}.${a.name.value}' changed type from '${aType}' to '${bType}'`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function safeChangeForFieldType(oldType, newType, ignoreNullability = false) {
|
|
66
|
+
// both are named
|
|
67
|
+
if (!(0, utils_js_1.isWrappingTypeNode)(oldType) && !(0, utils_js_1.isWrappingTypeNode)(newType)) {
|
|
68
|
+
return oldType.toString() === newType.toString();
|
|
69
|
+
}
|
|
70
|
+
// new is non-null
|
|
71
|
+
if ((0, utils_js_1.isNonNullTypeNode)(newType)) {
|
|
72
|
+
const ofType = (0, utils_js_1.isNonNullTypeNode)(oldType) ? oldType.type : oldType;
|
|
73
|
+
return safeChangeForFieldType(ofType, newType.type);
|
|
74
|
+
}
|
|
75
|
+
// old is non-null
|
|
76
|
+
if ((0, utils_js_1.isNonNullTypeNode)(oldType)) {
|
|
77
|
+
return safeChangeForFieldType(newType, oldType, ignoreNullability);
|
|
78
|
+
}
|
|
79
|
+
// old is list
|
|
80
|
+
if ((0, utils_js_1.isListTypeNode)(oldType)) {
|
|
81
|
+
return (((0, utils_js_1.isListTypeNode)(newType) && safeChangeForFieldType(oldType.type, newType.type)) ||
|
|
82
|
+
((0, utils_js_1.isNonNullTypeNode)(newType) && safeChangeForFieldType(oldType, newType['type'])));
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./arguments.js"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./directives.js"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./enum-values.js"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./enum.js"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./fields.js"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./input-type.js"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./interface.js"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./merge-named-type-array.js"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./merge-nodes.js"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./merge-typedefs.js"), exports);
|
|
14
|
+
tslib_1.__exportStar(require("./scalar.js"), exports);
|
|
15
|
+
tslib_1.__exportStar(require("./type.js"), exports);
|
|
16
|
+
tslib_1.__exportStar(require("./union.js"), exports);
|
|
17
|
+
tslib_1.__exportStar(require("./utils.js"), exports);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeInputType = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const fields_js_1 = require("./fields.js");
|
|
6
|
+
const directives_js_1 = require("./directives.js");
|
|
7
|
+
function mergeInputType(node, existingNode, config) {
|
|
8
|
+
if (existingNode) {
|
|
9
|
+
try {
|
|
10
|
+
return {
|
|
11
|
+
name: node.name,
|
|
12
|
+
description: node['description'] || existingNode['description'],
|
|
13
|
+
kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
|
|
14
|
+
node.kind === 'InputObjectTypeDefinition' ||
|
|
15
|
+
existingNode.kind === 'InputObjectTypeDefinition'
|
|
16
|
+
? 'InputObjectTypeDefinition'
|
|
17
|
+
: 'InputObjectTypeExtension',
|
|
18
|
+
loc: node.loc,
|
|
19
|
+
fields: (0, fields_js_1.mergeFields)(node, node.fields, existingNode.fields, config),
|
|
20
|
+
directives: (0, directives_js_1.mergeDirectives)(node.directives, existingNode.directives, config),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
throw new Error(`Unable to merge GraphQL input type "${node.name.value}": ${e.message}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return (config === null || config === void 0 ? void 0 : config.convertExtensions)
|
|
28
|
+
? {
|
|
29
|
+
...node,
|
|
30
|
+
kind: graphql_1.Kind.INPUT_OBJECT_TYPE_DEFINITION,
|
|
31
|
+
}
|
|
32
|
+
: node;
|
|
33
|
+
}
|
|
34
|
+
exports.mergeInputType = mergeInputType;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeInterface = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const fields_js_1 = require("./fields.js");
|
|
6
|
+
const directives_js_1 = require("./directives.js");
|
|
7
|
+
const index_js_1 = require("./index.js");
|
|
8
|
+
function mergeInterface(node, existingNode, config) {
|
|
9
|
+
if (existingNode) {
|
|
10
|
+
try {
|
|
11
|
+
return {
|
|
12
|
+
name: node.name,
|
|
13
|
+
description: node['description'] || existingNode['description'],
|
|
14
|
+
kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
|
|
15
|
+
node.kind === 'InterfaceTypeDefinition' ||
|
|
16
|
+
existingNode.kind === 'InterfaceTypeDefinition'
|
|
17
|
+
? 'InterfaceTypeDefinition'
|
|
18
|
+
: 'InterfaceTypeExtension',
|
|
19
|
+
loc: node.loc,
|
|
20
|
+
fields: (0, fields_js_1.mergeFields)(node, node.fields, existingNode.fields, config),
|
|
21
|
+
directives: (0, directives_js_1.mergeDirectives)(node.directives, existingNode.directives, config),
|
|
22
|
+
interfaces: node['interfaces']
|
|
23
|
+
? (0, index_js_1.mergeNamedTypeArray)(node['interfaces'], existingNode['interfaces'], config)
|
|
24
|
+
: undefined,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
throw new Error(`Unable to merge GraphQL interface "${node.name.value}": ${e.message}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return (config === null || config === void 0 ? void 0 : config.convertExtensions)
|
|
32
|
+
? {
|
|
33
|
+
...node,
|
|
34
|
+
kind: graphql_1.Kind.INTERFACE_TYPE_DEFINITION,
|
|
35
|
+
}
|
|
36
|
+
: node;
|
|
37
|
+
}
|
|
38
|
+
exports.mergeInterface = mergeInterface;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeNamedTypeArray = void 0;
|
|
4
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
5
|
+
function alreadyExists(arr, other) {
|
|
6
|
+
return !!arr.find(i => i.name.value === other.name.value);
|
|
7
|
+
}
|
|
8
|
+
function mergeNamedTypeArray(first = [], second = [], config = {}) {
|
|
9
|
+
const result = [...second, ...first.filter(d => !alreadyExists(second, d))];
|
|
10
|
+
if (config && config.sort) {
|
|
11
|
+
result.sort(utils_1.compareNodes);
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
exports.mergeNamedTypeArray = mergeNamedTypeArray;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeGraphQLNodes = exports.isNamedDefinitionNode = exports.schemaDefSymbol = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const type_js_1 = require("./type.js");
|
|
6
|
+
const enum_js_1 = require("./enum.js");
|
|
7
|
+
const scalar_js_1 = require("./scalar.js");
|
|
8
|
+
const union_js_1 = require("./union.js");
|
|
9
|
+
const input_type_js_1 = require("./input-type.js");
|
|
10
|
+
const interface_js_1 = require("./interface.js");
|
|
11
|
+
const directives_js_1 = require("./directives.js");
|
|
12
|
+
const schema_def_js_1 = require("./schema-def.js");
|
|
13
|
+
const utils_1 = require("@graphql-tools/utils");
|
|
14
|
+
exports.schemaDefSymbol = 'SCHEMA_DEF_SYMBOL';
|
|
15
|
+
function isNamedDefinitionNode(definitionNode) {
|
|
16
|
+
return 'name' in definitionNode;
|
|
17
|
+
}
|
|
18
|
+
exports.isNamedDefinitionNode = isNamedDefinitionNode;
|
|
19
|
+
function mergeGraphQLNodes(nodes, config) {
|
|
20
|
+
var _a, _b, _c;
|
|
21
|
+
const mergedResultMap = {};
|
|
22
|
+
for (const nodeDefinition of nodes) {
|
|
23
|
+
if (isNamedDefinitionNode(nodeDefinition)) {
|
|
24
|
+
const name = (_a = nodeDefinition.name) === null || _a === void 0 ? void 0 : _a.value;
|
|
25
|
+
if (config === null || config === void 0 ? void 0 : config.commentDescriptions) {
|
|
26
|
+
(0, utils_1.collectComment)(nodeDefinition);
|
|
27
|
+
}
|
|
28
|
+
if (name == null) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
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))) {
|
|
32
|
+
delete mergedResultMap[name];
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
switch (nodeDefinition.kind) {
|
|
36
|
+
case graphql_1.Kind.OBJECT_TYPE_DEFINITION:
|
|
37
|
+
case graphql_1.Kind.OBJECT_TYPE_EXTENSION:
|
|
38
|
+
mergedResultMap[name] = (0, type_js_1.mergeType)(nodeDefinition, mergedResultMap[name], config);
|
|
39
|
+
break;
|
|
40
|
+
case graphql_1.Kind.ENUM_TYPE_DEFINITION:
|
|
41
|
+
case graphql_1.Kind.ENUM_TYPE_EXTENSION:
|
|
42
|
+
mergedResultMap[name] = (0, enum_js_1.mergeEnum)(nodeDefinition, mergedResultMap[name], config);
|
|
43
|
+
break;
|
|
44
|
+
case graphql_1.Kind.UNION_TYPE_DEFINITION:
|
|
45
|
+
case graphql_1.Kind.UNION_TYPE_EXTENSION:
|
|
46
|
+
mergedResultMap[name] = (0, union_js_1.mergeUnion)(nodeDefinition, mergedResultMap[name], config);
|
|
47
|
+
break;
|
|
48
|
+
case graphql_1.Kind.SCALAR_TYPE_DEFINITION:
|
|
49
|
+
case graphql_1.Kind.SCALAR_TYPE_EXTENSION:
|
|
50
|
+
mergedResultMap[name] = (0, scalar_js_1.mergeScalar)(nodeDefinition, mergedResultMap[name], config);
|
|
51
|
+
break;
|
|
52
|
+
case graphql_1.Kind.INPUT_OBJECT_TYPE_DEFINITION:
|
|
53
|
+
case graphql_1.Kind.INPUT_OBJECT_TYPE_EXTENSION:
|
|
54
|
+
mergedResultMap[name] = (0, input_type_js_1.mergeInputType)(nodeDefinition, mergedResultMap[name], config);
|
|
55
|
+
break;
|
|
56
|
+
case graphql_1.Kind.INTERFACE_TYPE_DEFINITION:
|
|
57
|
+
case graphql_1.Kind.INTERFACE_TYPE_EXTENSION:
|
|
58
|
+
mergedResultMap[name] = (0, interface_js_1.mergeInterface)(nodeDefinition, mergedResultMap[name], config);
|
|
59
|
+
break;
|
|
60
|
+
case graphql_1.Kind.DIRECTIVE_DEFINITION:
|
|
61
|
+
mergedResultMap[name] = (0, directives_js_1.mergeDirective)(nodeDefinition, mergedResultMap[name]);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (nodeDefinition.kind === graphql_1.Kind.SCHEMA_DEFINITION || nodeDefinition.kind === graphql_1.Kind.SCHEMA_EXTENSION) {
|
|
67
|
+
mergedResultMap[exports.schemaDefSymbol] = (0, schema_def_js_1.mergeSchemaDefs)(nodeDefinition, mergedResultMap[exports.schemaDefSymbol], config);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return mergedResultMap;
|
|
71
|
+
}
|
|
72
|
+
exports.mergeGraphQLNodes = mergeGraphQLNodes;
|