@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
@@ -0,0 +1,23 @@
1
+ import { Kind } from 'graphql';
2
+ import { mergeDirectives } from './directives.js';
3
+ import { mergeEnumValues } from './enum-values.js';
4
+ export function mergeEnum(e1, e2, config) {
5
+ if (e2) {
6
+ return {
7
+ name: e1.name,
8
+ description: e1['description'] || e2['description'],
9
+ kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || e1.kind === 'EnumTypeDefinition' || e2.kind === 'EnumTypeDefinition'
10
+ ? 'EnumTypeDefinition'
11
+ : 'EnumTypeExtension',
12
+ loc: e1.loc,
13
+ directives: mergeDirectives(e1.directives, e2.directives, config),
14
+ values: mergeEnumValues(e1.values, e2.values, config),
15
+ };
16
+ }
17
+ return (config === null || config === void 0 ? void 0 : config.convertExtensions)
18
+ ? {
19
+ ...e1,
20
+ kind: Kind.ENUM_TYPE_DEFINITION,
21
+ }
22
+ : e1;
23
+ }
@@ -0,0 +1,81 @@
1
+ import { extractType, isWrappingTypeNode, isListTypeNode, isNonNullTypeNode, printTypeNode } from './utils.js';
2
+ import { mergeDirectives } from './directives.js';
3
+ import { compareNodes } from '@graphql-tools/utils';
4
+ import { mergeArguments } from './arguments.js';
5
+ function fieldAlreadyExists(fieldsArr, otherField, config) {
6
+ const result = fieldsArr.find(field => field.name.value === otherField.name.value);
7
+ if (result && !(config === null || config === void 0 ? void 0 : config.ignoreFieldConflicts)) {
8
+ const t1 = extractType(result.type);
9
+ const t2 = extractType(otherField.type);
10
+ if (t1.name.value !== t2.name.value) {
11
+ 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}"`);
12
+ }
13
+ }
14
+ return !!result;
15
+ }
16
+ export function mergeFields(type, f1, f2, config) {
17
+ const result = [];
18
+ if (f2 != null) {
19
+ result.push(...f2);
20
+ }
21
+ if (f1 != null) {
22
+ for (const field of f1) {
23
+ if (fieldAlreadyExists(result, field, config)) {
24
+ const existing = result.find((f) => f.name.value === field.name.value);
25
+ if (!(config === null || config === void 0 ? void 0 : config.ignoreFieldConflicts)) {
26
+ if (config === null || config === void 0 ? void 0 : config.throwOnConflict) {
27
+ preventConflicts(type, existing, field, false);
28
+ }
29
+ else {
30
+ preventConflicts(type, existing, field, true);
31
+ }
32
+ if (isNonNullTypeNode(field.type) && !isNonNullTypeNode(existing.type)) {
33
+ existing.type = field.type;
34
+ }
35
+ }
36
+ existing.arguments = mergeArguments(field['arguments'] || [], existing.arguments || [], config);
37
+ existing.directives = mergeDirectives(field.directives, existing.directives, config);
38
+ existing.description = field.description || existing.description;
39
+ }
40
+ else {
41
+ result.push(field);
42
+ }
43
+ }
44
+ }
45
+ if (config && config.sort) {
46
+ result.sort(compareNodes);
47
+ }
48
+ if (config && config.exclusions) {
49
+ const exclusions = config.exclusions;
50
+ return result.filter(field => !exclusions.includes(`${type.name.value}.${field.name.value}`));
51
+ }
52
+ return result;
53
+ }
54
+ function preventConflicts(type, a, b, ignoreNullability = false) {
55
+ const aType = printTypeNode(a.type);
56
+ const bType = printTypeNode(b.type);
57
+ if (aType !== bType && !safeChangeForFieldType(a.type, b.type, ignoreNullability)) {
58
+ throw new Error(`Field '${type.name.value}.${a.name.value}' changed type from '${aType}' to '${bType}'`);
59
+ }
60
+ }
61
+ function safeChangeForFieldType(oldType, newType, ignoreNullability = false) {
62
+ // both are named
63
+ if (!isWrappingTypeNode(oldType) && !isWrappingTypeNode(newType)) {
64
+ return oldType.toString() === newType.toString();
65
+ }
66
+ // new is non-null
67
+ if (isNonNullTypeNode(newType)) {
68
+ const ofType = isNonNullTypeNode(oldType) ? oldType.type : oldType;
69
+ return safeChangeForFieldType(ofType, newType.type);
70
+ }
71
+ // old is non-null
72
+ if (isNonNullTypeNode(oldType)) {
73
+ return safeChangeForFieldType(newType, oldType, ignoreNullability);
74
+ }
75
+ // old is list
76
+ if (isListTypeNode(oldType)) {
77
+ return ((isListTypeNode(newType) && safeChangeForFieldType(oldType.type, newType.type)) ||
78
+ (isNonNullTypeNode(newType) && safeChangeForFieldType(oldType, newType['type'])));
79
+ }
80
+ return false;
81
+ }
@@ -0,0 +1,14 @@
1
+ export * from './arguments.js';
2
+ export * from './directives.js';
3
+ export * from './enum-values.js';
4
+ export * from './enum.js';
5
+ export * from './fields.js';
6
+ export * from './input-type.js';
7
+ export * from './interface.js';
8
+ export * from './merge-named-type-array.js';
9
+ export * from './merge-nodes.js';
10
+ export * from './merge-typedefs.js';
11
+ export * from './scalar.js';
12
+ export * from './type.js';
13
+ export * from './union.js';
14
+ export * from './utils.js';
@@ -0,0 +1,30 @@
1
+ import { Kind } from 'graphql';
2
+ import { mergeFields } from './fields.js';
3
+ import { mergeDirectives } from './directives.js';
4
+ export function mergeInputType(node, existingNode, config) {
5
+ if (existingNode) {
6
+ try {
7
+ return {
8
+ name: node.name,
9
+ description: node['description'] || existingNode['description'],
10
+ kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
11
+ node.kind === 'InputObjectTypeDefinition' ||
12
+ existingNode.kind === 'InputObjectTypeDefinition'
13
+ ? 'InputObjectTypeDefinition'
14
+ : 'InputObjectTypeExtension',
15
+ loc: node.loc,
16
+ fields: mergeFields(node, node.fields, existingNode.fields, config),
17
+ directives: mergeDirectives(node.directives, existingNode.directives, config),
18
+ };
19
+ }
20
+ catch (e) {
21
+ throw new Error(`Unable to merge GraphQL input type "${node.name.value}": ${e.message}`);
22
+ }
23
+ }
24
+ return (config === null || config === void 0 ? void 0 : config.convertExtensions)
25
+ ? {
26
+ ...node,
27
+ kind: Kind.INPUT_OBJECT_TYPE_DEFINITION,
28
+ }
29
+ : node;
30
+ }
@@ -0,0 +1,34 @@
1
+ import { Kind } from 'graphql';
2
+ import { mergeFields } from './fields.js';
3
+ import { mergeDirectives } from './directives.js';
4
+ import { mergeNamedTypeArray } from './index.js';
5
+ export function mergeInterface(node, existingNode, config) {
6
+ if (existingNode) {
7
+ try {
8
+ return {
9
+ name: node.name,
10
+ description: node['description'] || existingNode['description'],
11
+ kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
12
+ node.kind === 'InterfaceTypeDefinition' ||
13
+ existingNode.kind === 'InterfaceTypeDefinition'
14
+ ? 'InterfaceTypeDefinition'
15
+ : 'InterfaceTypeExtension',
16
+ loc: node.loc,
17
+ fields: mergeFields(node, node.fields, existingNode.fields, config),
18
+ directives: mergeDirectives(node.directives, existingNode.directives, config),
19
+ interfaces: node['interfaces']
20
+ ? mergeNamedTypeArray(node['interfaces'], existingNode['interfaces'], config)
21
+ : undefined,
22
+ };
23
+ }
24
+ catch (e) {
25
+ throw new Error(`Unable to merge GraphQL interface "${node.name.value}": ${e.message}`);
26
+ }
27
+ }
28
+ return (config === null || config === void 0 ? void 0 : config.convertExtensions)
29
+ ? {
30
+ ...node,
31
+ kind: Kind.INTERFACE_TYPE_DEFINITION,
32
+ }
33
+ : node;
34
+ }
@@ -0,0 +1,11 @@
1
+ import { compareNodes } from '@graphql-tools/utils';
2
+ function alreadyExists(arr, other) {
3
+ return !!arr.find(i => i.name.value === other.name.value);
4
+ }
5
+ export function mergeNamedTypeArray(first = [], second = [], config = {}) {
6
+ const result = [...second, ...first.filter(d => !alreadyExists(second, d))];
7
+ if (config && config.sort) {
8
+ result.sort(compareNodes);
9
+ }
10
+ return result;
11
+ }
@@ -0,0 +1,67 @@
1
+ import { Kind } from 'graphql';
2
+ import { mergeType } from './type.js';
3
+ import { mergeEnum } from './enum.js';
4
+ import { mergeScalar } from './scalar.js';
5
+ import { mergeUnion } from './union.js';
6
+ import { mergeInputType } from './input-type.js';
7
+ import { mergeInterface } from './interface.js';
8
+ import { mergeDirective } from './directives.js';
9
+ import { mergeSchemaDefs } from './schema-def.js';
10
+ import { collectComment } from '@graphql-tools/utils';
11
+ export const schemaDefSymbol = 'SCHEMA_DEF_SYMBOL';
12
+ export function isNamedDefinitionNode(definitionNode) {
13
+ return 'name' in definitionNode;
14
+ }
15
+ export function mergeGraphQLNodes(nodes, config) {
16
+ var _a, _b, _c;
17
+ const mergedResultMap = {};
18
+ for (const nodeDefinition of nodes) {
19
+ if (isNamedDefinitionNode(nodeDefinition)) {
20
+ const name = (_a = nodeDefinition.name) === null || _a === void 0 ? void 0 : _a.value;
21
+ if (config === null || config === void 0 ? void 0 : config.commentDescriptions) {
22
+ collectComment(nodeDefinition);
23
+ }
24
+ if (name == null) {
25
+ continue;
26
+ }
27
+ 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))) {
28
+ delete mergedResultMap[name];
29
+ }
30
+ else {
31
+ switch (nodeDefinition.kind) {
32
+ case Kind.OBJECT_TYPE_DEFINITION:
33
+ case Kind.OBJECT_TYPE_EXTENSION:
34
+ mergedResultMap[name] = mergeType(nodeDefinition, mergedResultMap[name], config);
35
+ break;
36
+ case Kind.ENUM_TYPE_DEFINITION:
37
+ case Kind.ENUM_TYPE_EXTENSION:
38
+ mergedResultMap[name] = mergeEnum(nodeDefinition, mergedResultMap[name], config);
39
+ break;
40
+ case Kind.UNION_TYPE_DEFINITION:
41
+ case Kind.UNION_TYPE_EXTENSION:
42
+ mergedResultMap[name] = mergeUnion(nodeDefinition, mergedResultMap[name], config);
43
+ break;
44
+ case Kind.SCALAR_TYPE_DEFINITION:
45
+ case Kind.SCALAR_TYPE_EXTENSION:
46
+ mergedResultMap[name] = mergeScalar(nodeDefinition, mergedResultMap[name], config);
47
+ break;
48
+ case Kind.INPUT_OBJECT_TYPE_DEFINITION:
49
+ case Kind.INPUT_OBJECT_TYPE_EXTENSION:
50
+ mergedResultMap[name] = mergeInputType(nodeDefinition, mergedResultMap[name], config);
51
+ break;
52
+ case Kind.INTERFACE_TYPE_DEFINITION:
53
+ case Kind.INTERFACE_TYPE_EXTENSION:
54
+ mergedResultMap[name] = mergeInterface(nodeDefinition, mergedResultMap[name], config);
55
+ break;
56
+ case Kind.DIRECTIVE_DEFINITION:
57
+ mergedResultMap[name] = mergeDirective(nodeDefinition, mergedResultMap[name]);
58
+ break;
59
+ }
60
+ }
61
+ }
62
+ else if (nodeDefinition.kind === Kind.SCHEMA_DEFINITION || nodeDefinition.kind === Kind.SCHEMA_EXTENSION) {
63
+ mergedResultMap[schemaDefSymbol] = mergeSchemaDefs(nodeDefinition, mergedResultMap[schemaDefSymbol], config);
64
+ }
65
+ }
66
+ return mergedResultMap;
67
+ }
@@ -0,0 +1,116 @@
1
+ import { parse, Kind, isSchema, isDefinitionNode, } from 'graphql';
2
+ import { defaultStringComparator, isSourceTypes, isStringTypes } from './utils.js';
3
+ import { mergeGraphQLNodes, schemaDefSymbol } from './merge-nodes.js';
4
+ import { getDocumentNodeFromSchema, isDocumentNode, resetComments, printWithComments, } from '@graphql-tools/utils';
5
+ import { DEFAULT_OPERATION_TYPE_NAME_MAP } from './schema-def.js';
6
+ export function mergeTypeDefs(typeSource, config) {
7
+ resetComments();
8
+ const doc = {
9
+ kind: Kind.DOCUMENT,
10
+ definitions: mergeGraphQLTypes(typeSource, {
11
+ useSchemaDefinition: true,
12
+ forceSchemaDefinition: false,
13
+ throwOnConflict: false,
14
+ commentDescriptions: false,
15
+ ...config,
16
+ }),
17
+ };
18
+ let result;
19
+ if (config === null || config === void 0 ? void 0 : config.commentDescriptions) {
20
+ result = printWithComments(doc);
21
+ }
22
+ else {
23
+ result = doc;
24
+ }
25
+ resetComments();
26
+ return result;
27
+ }
28
+ function visitTypeSources(typeSource, options, allNodes = [], visitedTypeSources = new Set()) {
29
+ if (typeSource && !visitedTypeSources.has(typeSource)) {
30
+ visitedTypeSources.add(typeSource);
31
+ if (typeof typeSource === 'function') {
32
+ visitTypeSources(typeSource(), options, allNodes, visitedTypeSources);
33
+ }
34
+ else if (Array.isArray(typeSource)) {
35
+ for (const type of typeSource) {
36
+ visitTypeSources(type, options, allNodes, visitedTypeSources);
37
+ }
38
+ }
39
+ else if (isSchema(typeSource)) {
40
+ const documentNode = getDocumentNodeFromSchema(typeSource, options);
41
+ visitTypeSources(documentNode.definitions, options, allNodes, visitedTypeSources);
42
+ }
43
+ else if (isStringTypes(typeSource) || isSourceTypes(typeSource)) {
44
+ const documentNode = parse(typeSource, options);
45
+ visitTypeSources(documentNode.definitions, options, allNodes, visitedTypeSources);
46
+ }
47
+ else if (typeof typeSource === 'object' && isDefinitionNode(typeSource)) {
48
+ allNodes.push(typeSource);
49
+ }
50
+ else if (isDocumentNode(typeSource)) {
51
+ visitTypeSources(typeSource.definitions, options, allNodes, visitedTypeSources);
52
+ }
53
+ else {
54
+ throw new Error(`typeDefs must contain only strings, documents, schemas, or functions, got ${typeof typeSource}`);
55
+ }
56
+ }
57
+ return allNodes;
58
+ }
59
+ export function mergeGraphQLTypes(typeSource, config) {
60
+ var _a, _b, _c;
61
+ resetComments();
62
+ const allNodes = visitTypeSources(typeSource, config);
63
+ const mergedNodes = mergeGraphQLNodes(allNodes, config);
64
+ if (config === null || config === void 0 ? void 0 : config.useSchemaDefinition) {
65
+ // XXX: right now we don't handle multiple schema definitions
66
+ const schemaDef = mergedNodes[schemaDefSymbol] || {
67
+ kind: Kind.SCHEMA_DEFINITION,
68
+ operationTypes: [],
69
+ };
70
+ const operationTypes = schemaDef.operationTypes;
71
+ for (const opTypeDefNodeType in DEFAULT_OPERATION_TYPE_NAME_MAP) {
72
+ const opTypeDefNode = operationTypes.find(operationType => operationType.operation === opTypeDefNodeType);
73
+ if (!opTypeDefNode) {
74
+ const possibleRootTypeName = DEFAULT_OPERATION_TYPE_NAME_MAP[opTypeDefNodeType];
75
+ const existingPossibleRootType = mergedNodes[possibleRootTypeName];
76
+ if (existingPossibleRootType != null && existingPossibleRootType.name != null) {
77
+ operationTypes.push({
78
+ kind: Kind.OPERATION_TYPE_DEFINITION,
79
+ type: {
80
+ kind: Kind.NAMED_TYPE,
81
+ name: existingPossibleRootType.name,
82
+ },
83
+ operation: opTypeDefNodeType,
84
+ });
85
+ }
86
+ }
87
+ }
88
+ if (((_a = schemaDef === null || schemaDef === void 0 ? void 0 : schemaDef.operationTypes) === null || _a === void 0 ? void 0 : _a.length) != null && schemaDef.operationTypes.length > 0) {
89
+ mergedNodes[schemaDefSymbol] = schemaDef;
90
+ }
91
+ }
92
+ 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)) {
93
+ mergedNodes[schemaDefSymbol] = {
94
+ kind: Kind.SCHEMA_DEFINITION,
95
+ operationTypes: [
96
+ {
97
+ kind: Kind.OPERATION_TYPE_DEFINITION,
98
+ operation: 'query',
99
+ type: {
100
+ kind: Kind.NAMED_TYPE,
101
+ name: {
102
+ kind: Kind.NAME,
103
+ value: 'Query',
104
+ },
105
+ },
106
+ },
107
+ ],
108
+ };
109
+ }
110
+ const mergedNodeDefinitions = Object.values(mergedNodes);
111
+ if (config === null || config === void 0 ? void 0 : config.sort) {
112
+ const sortFn = typeof config.sort === 'function' ? config.sort : defaultStringComparator;
113
+ 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); });
114
+ }
115
+ return mergedNodeDefinitions;
116
+ }
@@ -0,0 +1,23 @@
1
+ import { Kind } from 'graphql';
2
+ import { mergeDirectives } from './directives.js';
3
+ export function mergeScalar(node, existingNode, config) {
4
+ if (existingNode) {
5
+ return {
6
+ name: node.name,
7
+ description: node['description'] || existingNode['description'],
8
+ kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
9
+ node.kind === 'ScalarTypeDefinition' ||
10
+ existingNode.kind === 'ScalarTypeDefinition'
11
+ ? 'ScalarTypeDefinition'
12
+ : 'ScalarTypeExtension',
13
+ loc: node.loc,
14
+ directives: mergeDirectives(node.directives, existingNode.directives, config),
15
+ };
16
+ }
17
+ return (config === null || config === void 0 ? void 0 : config.convertExtensions)
18
+ ? {
19
+ ...node,
20
+ kind: Kind.SCALAR_TYPE_DEFINITION,
21
+ }
22
+ : node;
23
+ }
@@ -0,0 +1,35 @@
1
+ import { Kind } from 'graphql';
2
+ import { mergeDirectives } from './directives.js';
3
+ export const DEFAULT_OPERATION_TYPE_NAME_MAP = {
4
+ query: 'Query',
5
+ mutation: 'Mutation',
6
+ subscription: 'Subscription',
7
+ };
8
+ function mergeOperationTypes(opNodeList = [], existingOpNodeList = []) {
9
+ const finalOpNodeList = [];
10
+ for (const opNodeType in DEFAULT_OPERATION_TYPE_NAME_MAP) {
11
+ const opNode = opNodeList.find(n => n.operation === opNodeType) || existingOpNodeList.find(n => n.operation === opNodeType);
12
+ if (opNode) {
13
+ finalOpNodeList.push(opNode);
14
+ }
15
+ }
16
+ return finalOpNodeList;
17
+ }
18
+ export function mergeSchemaDefs(node, existingNode, config) {
19
+ if (existingNode) {
20
+ return {
21
+ kind: node.kind === Kind.SCHEMA_DEFINITION || existingNode.kind === Kind.SCHEMA_DEFINITION
22
+ ? Kind.SCHEMA_DEFINITION
23
+ : Kind.SCHEMA_EXTENSION,
24
+ description: node['description'] || existingNode['description'],
25
+ directives: mergeDirectives(node.directives, existingNode.directives, config),
26
+ operationTypes: mergeOperationTypes(node.operationTypes, existingNode.operationTypes),
27
+ };
28
+ }
29
+ return ((config === null || config === void 0 ? void 0 : config.convertExtensions)
30
+ ? {
31
+ ...node,
32
+ kind: Kind.SCHEMA_DEFINITION,
33
+ }
34
+ : node);
35
+ }
@@ -0,0 +1,32 @@
1
+ import { Kind } from 'graphql';
2
+ import { mergeFields } from './fields.js';
3
+ import { mergeDirectives } from './directives.js';
4
+ import { mergeNamedTypeArray } from './merge-named-type-array.js';
5
+ export function mergeType(node, existingNode, config) {
6
+ if (existingNode) {
7
+ try {
8
+ return {
9
+ name: node.name,
10
+ description: node['description'] || existingNode['description'],
11
+ kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) ||
12
+ node.kind === 'ObjectTypeDefinition' ||
13
+ existingNode.kind === 'ObjectTypeDefinition'
14
+ ? 'ObjectTypeDefinition'
15
+ : 'ObjectTypeExtension',
16
+ loc: node.loc,
17
+ fields: mergeFields(node, node.fields, existingNode.fields, config),
18
+ directives: mergeDirectives(node.directives, existingNode.directives, config),
19
+ interfaces: mergeNamedTypeArray(node.interfaces, existingNode.interfaces, config),
20
+ };
21
+ }
22
+ catch (e) {
23
+ throw new Error(`Unable to merge GraphQL type "${node.name.value}": ${e.message}`);
24
+ }
25
+ }
26
+ return (config === null || config === void 0 ? void 0 : config.convertExtensions)
27
+ ? {
28
+ ...node,
29
+ kind: Kind.OBJECT_TYPE_DEFINITION,
30
+ }
31
+ : node;
32
+ }
@@ -0,0 +1,24 @@
1
+ import { Kind } from 'graphql';
2
+ import { mergeDirectives } from './directives.js';
3
+ import { mergeNamedTypeArray } from './merge-named-type-array.js';
4
+ export function mergeUnion(first, second, config) {
5
+ if (second) {
6
+ return {
7
+ name: first.name,
8
+ description: first['description'] || second['description'],
9
+ // ConstXNode has been introduced in v16 but it is not compatible with XNode so we do `as any` for backwards compatibility
10
+ directives: mergeDirectives(first.directives, second.directives, config),
11
+ kind: (config === null || config === void 0 ? void 0 : config.convertExtensions) || first.kind === 'UnionTypeDefinition' || second.kind === 'UnionTypeDefinition'
12
+ ? Kind.UNION_TYPE_DEFINITION
13
+ : Kind.UNION_TYPE_EXTENSION,
14
+ loc: first.loc,
15
+ types: mergeNamedTypeArray(first.types, second.types, config),
16
+ };
17
+ }
18
+ return (config === null || config === void 0 ? void 0 : config.convertExtensions)
19
+ ? {
20
+ ...first,
21
+ kind: Kind.UNION_TYPE_DEFINITION,
22
+ }
23
+ : first;
24
+ }
@@ -0,0 +1,54 @@
1
+ import { Source, Kind } from 'graphql';
2
+ export function isStringTypes(types) {
3
+ return typeof types === 'string';
4
+ }
5
+ export function isSourceTypes(types) {
6
+ return types instanceof Source;
7
+ }
8
+ export function extractType(type) {
9
+ let visitedType = type;
10
+ while (visitedType.kind === Kind.LIST_TYPE || visitedType.kind === 'NonNullType') {
11
+ visitedType = visitedType.type;
12
+ }
13
+ return visitedType;
14
+ }
15
+ export function isWrappingTypeNode(type) {
16
+ return type.kind !== Kind.NAMED_TYPE;
17
+ }
18
+ export function isListTypeNode(type) {
19
+ return type.kind === Kind.LIST_TYPE;
20
+ }
21
+ export function isNonNullTypeNode(type) {
22
+ return type.kind === Kind.NON_NULL_TYPE;
23
+ }
24
+ export function printTypeNode(type) {
25
+ if (isListTypeNode(type)) {
26
+ return `[${printTypeNode(type.type)}]`;
27
+ }
28
+ if (isNonNullTypeNode(type)) {
29
+ return `${printTypeNode(type.type)}!`;
30
+ }
31
+ return type.name.value;
32
+ }
33
+ export var CompareVal;
34
+ (function (CompareVal) {
35
+ CompareVal[CompareVal["A_SMALLER_THAN_B"] = -1] = "A_SMALLER_THAN_B";
36
+ CompareVal[CompareVal["A_EQUALS_B"] = 0] = "A_EQUALS_B";
37
+ CompareVal[CompareVal["A_GREATER_THAN_B"] = 1] = "A_GREATER_THAN_B";
38
+ })(CompareVal || (CompareVal = {}));
39
+ export function defaultStringComparator(a, b) {
40
+ if (a == null && b == null) {
41
+ return CompareVal.A_EQUALS_B;
42
+ }
43
+ if (a == null) {
44
+ return CompareVal.A_SMALLER_THAN_B;
45
+ }
46
+ if (b == null) {
47
+ return CompareVal.A_GREATER_THAN_B;
48
+ }
49
+ if (a < b)
50
+ return CompareVal.A_SMALLER_THAN_B;
51
+ if (a > b)
52
+ return CompareVal.A_GREATER_THAN_B;
53
+ return CompareVal.A_EQUALS_B;
54
+ }
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@graphql-tools/merge",
3
- "version": "8.2.15",
3
+ "version": "8.3.0-alpha-6c480b2d.0",
4
4
  "description": "A set of utils for faster development of GraphQL tools",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
7
7
  "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
8
8
  },
9
9
  "dependencies": {
10
- "@graphql-tools/utils": "8.7.0",
10
+ "@graphql-tools/utils": "8.8.0-alpha-6c480b2d.0",
11
11
  "tslib": "^2.4.0"
12
12
  },
13
13
  "repository": {
@@ -17,21 +17,42 @@
17
17
  },
18
18
  "author": "Dotan Simha <dotansimha@gmail.com>",
19
19
  "license": "MIT",
20
- "main": "index.js",
21
- "module": "index.mjs",
22
- "typings": "index.d.ts",
20
+ "main": "cjs/index.js",
21
+ "module": "esm/index.js",
22
+ "typings": "typings/index.d.ts",
23
23
  "typescript": {
24
- "definition": "index.d.ts"
24
+ "definition": "typings/index.d.ts"
25
25
  },
26
+ "type": "module",
26
27
  "exports": {
27
28
  ".": {
28
- "require": "./index.js",
29
- "import": "./index.mjs"
29
+ "require": {
30
+ "types": "./typings/index.d.ts",
31
+ "default": "./cjs/index.js"
32
+ },
33
+ "import": {
34
+ "types": "./typings/index.d.ts",
35
+ "default": "./esm/index.js"
36
+ },
37
+ "default": {
38
+ "types": "./typings/index.d.ts",
39
+ "default": "./esm/index.js"
40
+ }
30
41
  },
31
42
  "./*": {
32
- "require": "./*.js",
33
- "import": "./*.mjs"
43
+ "require": {
44
+ "types": "./typings/*.d.ts",
45
+ "default": "./cjs/*.js"
46
+ },
47
+ "import": {
48
+ "types": "./typings/*.d.ts",
49
+ "default": "./esm/*.js"
50
+ },
51
+ "default": {
52
+ "types": "./typings/*.d.ts",
53
+ "default": "./esm/*.js"
54
+ }
34
55
  },
35
56
  "./package.json": "./package.json"
36
57
  }
37
- }
58
+ }
File without changes
@@ -0,0 +1,3 @@
1
+ export * from './merge-resolvers.js';
2
+ export * from './typedefs-mergers/index.js';
3
+ export * from './extensions.js';
@@ -1,3 +1,3 @@
1
1
  import { InputValueDefinitionNode } from 'graphql';
2
- import { Config } from '.';
2
+ import { Config } from './index.js';
3
3
  export declare function mergeArguments(args1: InputValueDefinitionNode[], args2: InputValueDefinitionNode[], config?: Config): InputValueDefinitionNode[];
@@ -1,4 +1,4 @@
1
1
  import { DirectiveNode, DirectiveDefinitionNode } from 'graphql';
2
- import { Config } from './merge-typedefs';
2
+ import { Config } from './merge-typedefs.js';
3
3
  export declare function mergeDirectives(d1?: ReadonlyArray<DirectiveNode>, d2?: ReadonlyArray<DirectiveNode>, config?: Config): DirectiveNode[];
4
4
  export declare function mergeDirective(node: DirectiveDefinitionNode, existingNode?: DirectiveDefinitionNode): DirectiveDefinitionNode;
@@ -1,3 +1,3 @@
1
1
  import { EnumValueDefinitionNode } from 'graphql';
2
- import { Config } from './merge-typedefs';
2
+ import { Config } from './merge-typedefs.js';
3
3
  export declare function mergeEnumValues(first: ReadonlyArray<EnumValueDefinitionNode> | undefined, second: ReadonlyArray<EnumValueDefinitionNode> | undefined, config?: Config): EnumValueDefinitionNode[];
@@ -1,3 +1,3 @@
1
1
  import { EnumTypeDefinitionNode, EnumTypeExtensionNode } from 'graphql';
2
- import { Config } from './merge-typedefs';
2
+ import { Config } from './merge-typedefs.js';
3
3
  export declare function mergeEnum(e1: EnumTypeDefinitionNode | EnumTypeExtensionNode, e2: EnumTypeDefinitionNode | EnumTypeExtensionNode, config?: Config): EnumTypeDefinitionNode | EnumTypeExtensionNode;