UNPKG

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