UNPKG

6.08 kBJavaScriptView Raw
1import { GraphQLDirective, GraphQLEnumType, GraphQLInputObjectType, GraphQLInterfaceType, GraphQLList, GraphQLObjectType, GraphQLNonNull, GraphQLScalarType, GraphQLUnionType, isInterfaceType, isEnumType, isInputObjectType, isListType, isNamedType, isNonNullType, isObjectType, isScalarType, isUnionType, isSpecifiedScalarType, isSpecifiedDirective, } from 'graphql';
2import { getBuiltInForStub, isNamedStub } from './stub.js';
3export function rewireTypes(originalTypeMap, directives) {
4 const referenceTypeMap = Object.create(null);
5 for (const typeName in originalTypeMap) {
6 referenceTypeMap[typeName] = originalTypeMap[typeName];
7 }
8 const newTypeMap = Object.create(null);
9 for (const typeName in referenceTypeMap) {
10 const namedType = referenceTypeMap[typeName];
11 if (namedType == null || typeName.startsWith('__')) {
12 continue;
13 }
14 const newName = namedType.name;
15 if (newName.startsWith('__')) {
16 continue;
17 }
18 if (newTypeMap[newName] != null) {
19 throw new Error(`Duplicate schema type name ${newName}`);
20 }
21 newTypeMap[newName] = namedType;
22 }
23 for (const typeName in newTypeMap) {
24 newTypeMap[typeName] = rewireNamedType(newTypeMap[typeName]);
25 }
26 const newDirectives = directives.map(directive => rewireDirective(directive));
27 return {
28 typeMap: newTypeMap,
29 directives: newDirectives,
30 };
31 function rewireDirective(directive) {
32 if (isSpecifiedDirective(directive)) {
33 return directive;
34 }
35 const directiveConfig = directive.toConfig();
36 directiveConfig.args = rewireArgs(directiveConfig.args);
37 return new GraphQLDirective(directiveConfig);
38 }
39 function rewireArgs(args) {
40 const rewiredArgs = {};
41 for (const argName in args) {
42 const arg = args[argName];
43 const rewiredArgType = rewireType(arg.type);
44 if (rewiredArgType != null) {
45 arg.type = rewiredArgType;
46 rewiredArgs[argName] = arg;
47 }
48 }
49 return rewiredArgs;
50 }
51 function rewireNamedType(type) {
52 if (isObjectType(type)) {
53 const config = type.toConfig();
54 const newConfig = {
55 ...config,
56 fields: () => rewireFields(config.fields),
57 interfaces: () => rewireNamedTypes(config.interfaces),
58 };
59 return new GraphQLObjectType(newConfig);
60 }
61 else if (isInterfaceType(type)) {
62 const config = type.toConfig();
63 const newConfig = {
64 ...config,
65 fields: () => rewireFields(config.fields),
66 };
67 if ('interfaces' in newConfig) {
68 newConfig.interfaces = () => rewireNamedTypes(config.interfaces);
69 }
70 return new GraphQLInterfaceType(newConfig);
71 }
72 else if (isUnionType(type)) {
73 const config = type.toConfig();
74 const newConfig = {
75 ...config,
76 types: () => rewireNamedTypes(config.types),
77 };
78 return new GraphQLUnionType(newConfig);
79 }
80 else if (isInputObjectType(type)) {
81 const config = type.toConfig();
82 const newConfig = {
83 ...config,
84 fields: () => rewireInputFields(config.fields),
85 };
86 return new GraphQLInputObjectType(newConfig);
87 }
88 else if (isEnumType(type)) {
89 const enumConfig = type.toConfig();
90 return new GraphQLEnumType(enumConfig);
91 }
92 else if (isScalarType(type)) {
93 if (isSpecifiedScalarType(type)) {
94 return type;
95 }
96 const scalarConfig = type.toConfig();
97 return new GraphQLScalarType(scalarConfig);
98 }
99 throw new Error(`Unexpected schema type: ${type}`);
100 }
101 function rewireFields(fields) {
102 const rewiredFields = {};
103 for (const fieldName in fields) {
104 const field = fields[fieldName];
105 const rewiredFieldType = rewireType(field.type);
106 if (rewiredFieldType != null && field.args) {
107 field.type = rewiredFieldType;
108 field.args = rewireArgs(field.args);
109 rewiredFields[fieldName] = field;
110 }
111 }
112 return rewiredFields;
113 }
114 function rewireInputFields(fields) {
115 const rewiredFields = {};
116 for (const fieldName in fields) {
117 const field = fields[fieldName];
118 const rewiredFieldType = rewireType(field.type);
119 if (rewiredFieldType != null) {
120 field.type = rewiredFieldType;
121 rewiredFields[fieldName] = field;
122 }
123 }
124 return rewiredFields;
125 }
126 function rewireNamedTypes(namedTypes) {
127 const rewiredTypes = [];
128 for (const namedType of namedTypes) {
129 const rewiredType = rewireType(namedType);
130 if (rewiredType != null) {
131 rewiredTypes.push(rewiredType);
132 }
133 }
134 return rewiredTypes;
135 }
136 function rewireType(type) {
137 if (isListType(type)) {
138 const rewiredType = rewireType(type.ofType);
139 return rewiredType != null ? new GraphQLList(rewiredType) : null;
140 }
141 else if (isNonNullType(type)) {
142 const rewiredType = rewireType(type.ofType);
143 return rewiredType != null ? new GraphQLNonNull(rewiredType) : null;
144 }
145 else if (isNamedType(type)) {
146 let rewiredType = referenceTypeMap[type.name];
147 if (rewiredType === undefined) {
148 rewiredType = isNamedStub(type) ? getBuiltInForStub(type) : rewireNamedType(type);
149 newTypeMap[rewiredType.name] = referenceTypeMap[type.name] = rewiredType;
150 }
151 return rewiredType != null ? newTypeMap[rewiredType.name] : null;
152 }
153 return null;
154 }
155}