UNPKG

27 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.extendSchema = extendSchema;
7exports.extendSchemaImpl = extendSchemaImpl;
8exports.getDescription = getDescription;
9
10var _objectValues = _interopRequireDefault(require("../polyfills/objectValues.js"));
11
12var _keyMap = _interopRequireDefault(require("../jsutils/keyMap.js"));
13
14var _inspect = _interopRequireDefault(require("../jsutils/inspect.js"));
15
16var _mapValue = _interopRequireDefault(require("../jsutils/mapValue.js"));
17
18var _invariant = _interopRequireDefault(require("../jsutils/invariant.js"));
19
20var _devAssert = _interopRequireDefault(require("../jsutils/devAssert.js"));
21
22var _kinds = require("../language/kinds.js");
23
24var _tokenKind = require("../language/tokenKind.js");
25
26var _blockString = require("../language/blockString.js");
27
28var _predicates = require("../language/predicates.js");
29
30var _validate = require("../validation/validate.js");
31
32var _values = require("../execution/values.js");
33
34var _schema = require("../type/schema.js");
35
36var _scalars = require("../type/scalars.js");
37
38var _introspection = require("../type/introspection.js");
39
40var _directives = require("../type/directives.js");
41
42var _definition = require("../type/definition.js");
43
44var _valueFromAST = require("./valueFromAST.js");
45
46function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
47
48function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
49
50function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
51
52function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
53
54/**
55 * Produces a new schema given an existing schema and a document which may
56 * contain GraphQL type extensions and definitions. The original schema will
57 * remain unaltered.
58 *
59 * Because a schema represents a graph of references, a schema cannot be
60 * extended without effectively making an entire copy. We do not know until it's
61 * too late if subgraphs remain unchanged.
62 *
63 * This algorithm copies the provided schema, applying extensions while
64 * producing the copy. The original schema remains unaltered.
65 *
66 * Accepts options as a third argument:
67 *
68 * - commentDescriptions:
69 * Provide true to use preceding comments as the description.
70 *
71 */
72function extendSchema(schema, documentAST, options) {
73 (0, _schema.assertSchema)(schema);
74 documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.default)(0, 'Must provide valid Document AST.');
75
76 if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) {
77 (0, _validate.assertValidSDLExtension)(documentAST, schema);
78 }
79
80 var schemaConfig = schema.toConfig();
81 var extendedConfig = extendSchemaImpl(schemaConfig, documentAST, options);
82 return schemaConfig === extendedConfig ? schema : new _schema.GraphQLSchema(extendedConfig);
83}
84/**
85 * @internal
86 */
87
88
89function extendSchemaImpl(schemaConfig, documentAST, options) {
90 var _schemaDef, _schemaDef$descriptio, _schemaDef2, _options$assumeValid;
91
92 // Collect the type definitions and extensions found in the document.
93 var typeDefs = [];
94 var typeExtensionsMap = Object.create(null); // New directives and types are separate because a directives and types can
95 // have the same name. For example, a type named "skip".
96
97 var directiveDefs = [];
98 var schemaDef; // Schema extensions are collected which may add additional operation types.
99
100 var schemaExtensions = [];
101
102 for (var _i2 = 0, _documentAST$definiti2 = documentAST.definitions; _i2 < _documentAST$definiti2.length; _i2++) {
103 var def = _documentAST$definiti2[_i2];
104
105 if (def.kind === _kinds.Kind.SCHEMA_DEFINITION) {
106 schemaDef = def;
107 } else if (def.kind === _kinds.Kind.SCHEMA_EXTENSION) {
108 schemaExtensions.push(def);
109 } else if ((0, _predicates.isTypeDefinitionNode)(def)) {
110 typeDefs.push(def);
111 } else if ((0, _predicates.isTypeExtensionNode)(def)) {
112 var extendedTypeName = def.name.value;
113 var existingTypeExtensions = typeExtensionsMap[extendedTypeName];
114 typeExtensionsMap[extendedTypeName] = existingTypeExtensions ? existingTypeExtensions.concat([def]) : [def];
115 } else if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) {
116 directiveDefs.push(def);
117 }
118 } // If this document contains no new types, extensions, or directives then
119 // return the same unmodified GraphQLSchema instance.
120
121
122 if (Object.keys(typeExtensionsMap).length === 0 && typeDefs.length === 0 && directiveDefs.length === 0 && schemaExtensions.length === 0 && schemaDef == null) {
123 return schemaConfig;
124 }
125
126 var typeMap = Object.create(null);
127
128 for (var _i4 = 0, _schemaConfig$types2 = schemaConfig.types; _i4 < _schemaConfig$types2.length; _i4++) {
129 var existingType = _schemaConfig$types2[_i4];
130 typeMap[existingType.name] = extendNamedType(existingType);
131 }
132
133 for (var _i6 = 0; _i6 < typeDefs.length; _i6++) {
134 var _stdTypeMap$name;
135
136 var typeNode = typeDefs[_i6];
137 var name = typeNode.name.value;
138 typeMap[name] = (_stdTypeMap$name = stdTypeMap[name]) !== null && _stdTypeMap$name !== void 0 ? _stdTypeMap$name : buildType(typeNode);
139 }
140
141 var operationTypes = _objectSpread(_objectSpread({
142 // Get the extended root operation types.
143 query: schemaConfig.query && replaceNamedType(schemaConfig.query),
144 mutation: schemaConfig.mutation && replaceNamedType(schemaConfig.mutation),
145 subscription: schemaConfig.subscription && replaceNamedType(schemaConfig.subscription)
146 }, schemaDef && getOperationTypes([schemaDef])), getOperationTypes(schemaExtensions)); // Then produce and return a Schema config with these types.
147
148
149 return _objectSpread(_objectSpread({
150 description: (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio = _schemaDef.description) === null || _schemaDef$descriptio === void 0 ? void 0 : _schemaDef$descriptio.value
151 }, operationTypes), {}, {
152 types: (0, _objectValues.default)(typeMap),
153 directives: [].concat(schemaConfig.directives.map(replaceDirective), directiveDefs.map(buildDirective)),
154 extensions: undefined,
155 astNode: (_schemaDef2 = schemaDef) !== null && _schemaDef2 !== void 0 ? _schemaDef2 : schemaConfig.astNode,
156 extensionASTNodes: schemaConfig.extensionASTNodes.concat(schemaExtensions),
157 assumeValid: (_options$assumeValid = options === null || options === void 0 ? void 0 : options.assumeValid) !== null && _options$assumeValid !== void 0 ? _options$assumeValid : false
158 }); // Below are functions used for producing this schema that have closed over
159 // this scope and have access to the schema, cache, and newly defined types.
160
161 function replaceType(type) {
162 if ((0, _definition.isListType)(type)) {
163 // $FlowFixMe[incompatible-return]
164 return new _definition.GraphQLList(replaceType(type.ofType));
165 }
166
167 if ((0, _definition.isNonNullType)(type)) {
168 // $FlowFixMe[incompatible-return]
169 return new _definition.GraphQLNonNull(replaceType(type.ofType));
170 }
171
172 return replaceNamedType(type);
173 }
174
175 function replaceNamedType(type) {
176 // Note: While this could make early assertions to get the correctly
177 // typed values, that would throw immediately while type system
178 // validation with validateSchema() will produce more actionable results.
179 return typeMap[type.name];
180 }
181
182 function replaceDirective(directive) {
183 var config = directive.toConfig();
184 return new _directives.GraphQLDirective(_objectSpread(_objectSpread({}, config), {}, {
185 args: (0, _mapValue.default)(config.args, extendArg)
186 }));
187 }
188
189 function extendNamedType(type) {
190 if ((0, _introspection.isIntrospectionType)(type) || (0, _scalars.isSpecifiedScalarType)(type)) {
191 // Builtin types are not extended.
192 return type;
193 }
194
195 if ((0, _definition.isScalarType)(type)) {
196 return extendScalarType(type);
197 }
198
199 if ((0, _definition.isObjectType)(type)) {
200 return extendObjectType(type);
201 }
202
203 if ((0, _definition.isInterfaceType)(type)) {
204 return extendInterfaceType(type);
205 }
206
207 if ((0, _definition.isUnionType)(type)) {
208 return extendUnionType(type);
209 }
210
211 if ((0, _definition.isEnumType)(type)) {
212 return extendEnumType(type);
213 } // istanbul ignore else (See: 'https://github.com/graphql/graphql-js/issues/2618')
214
215
216 if ((0, _definition.isInputObjectType)(type)) {
217 return extendInputObjectType(type);
218 } // istanbul ignore next (Not reachable. All possible types have been considered)
219
220
221 false || (0, _invariant.default)(0, 'Unexpected type: ' + (0, _inspect.default)(type));
222 }
223
224 function extendInputObjectType(type) {
225 var _typeExtensionsMap$co;
226
227 var config = type.toConfig();
228 var extensions = (_typeExtensionsMap$co = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co !== void 0 ? _typeExtensionsMap$co : [];
229 return new _definition.GraphQLInputObjectType(_objectSpread(_objectSpread({}, config), {}, {
230 fields: function fields() {
231 return _objectSpread(_objectSpread({}, (0, _mapValue.default)(config.fields, function (field) {
232 return _objectSpread(_objectSpread({}, field), {}, {
233 type: replaceType(field.type)
234 });
235 })), buildInputFieldMap(extensions));
236 },
237 extensionASTNodes: config.extensionASTNodes.concat(extensions)
238 }));
239 }
240
241 function extendEnumType(type) {
242 var _typeExtensionsMap$ty;
243
244 var config = type.toConfig();
245 var extensions = (_typeExtensionsMap$ty = typeExtensionsMap[type.name]) !== null && _typeExtensionsMap$ty !== void 0 ? _typeExtensionsMap$ty : [];
246 return new _definition.GraphQLEnumType(_objectSpread(_objectSpread({}, config), {}, {
247 values: _objectSpread(_objectSpread({}, config.values), buildEnumValueMap(extensions)),
248 extensionASTNodes: config.extensionASTNodes.concat(extensions)
249 }));
250 }
251
252 function extendScalarType(type) {
253 var _typeExtensionsMap$co2;
254
255 var config = type.toConfig();
256 var extensions = (_typeExtensionsMap$co2 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co2 !== void 0 ? _typeExtensionsMap$co2 : [];
257 var specifiedByUrl = config.specifiedByUrl;
258
259 for (var _i8 = 0; _i8 < extensions.length; _i8++) {
260 var _getSpecifiedByUrl;
261
262 var extensionNode = extensions[_i8];
263 specifiedByUrl = (_getSpecifiedByUrl = getSpecifiedByUrl(extensionNode)) !== null && _getSpecifiedByUrl !== void 0 ? _getSpecifiedByUrl : specifiedByUrl;
264 }
265
266 return new _definition.GraphQLScalarType(_objectSpread(_objectSpread({}, config), {}, {
267 specifiedByUrl: specifiedByUrl,
268 extensionASTNodes: config.extensionASTNodes.concat(extensions)
269 }));
270 }
271
272 function extendObjectType(type) {
273 var _typeExtensionsMap$co3;
274
275 var config = type.toConfig();
276 var extensions = (_typeExtensionsMap$co3 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co3 !== void 0 ? _typeExtensionsMap$co3 : [];
277 return new _definition.GraphQLObjectType(_objectSpread(_objectSpread({}, config), {}, {
278 interfaces: function interfaces() {
279 return [].concat(type.getInterfaces().map(replaceNamedType), buildInterfaces(extensions));
280 },
281 fields: function fields() {
282 return _objectSpread(_objectSpread({}, (0, _mapValue.default)(config.fields, extendField)), buildFieldMap(extensions));
283 },
284 extensionASTNodes: config.extensionASTNodes.concat(extensions)
285 }));
286 }
287
288 function extendInterfaceType(type) {
289 var _typeExtensionsMap$co4;
290
291 var config = type.toConfig();
292 var extensions = (_typeExtensionsMap$co4 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co4 !== void 0 ? _typeExtensionsMap$co4 : [];
293 return new _definition.GraphQLInterfaceType(_objectSpread(_objectSpread({}, config), {}, {
294 interfaces: function interfaces() {
295 return [].concat(type.getInterfaces().map(replaceNamedType), buildInterfaces(extensions));
296 },
297 fields: function fields() {
298 return _objectSpread(_objectSpread({}, (0, _mapValue.default)(config.fields, extendField)), buildFieldMap(extensions));
299 },
300 extensionASTNodes: config.extensionASTNodes.concat(extensions)
301 }));
302 }
303
304 function extendUnionType(type) {
305 var _typeExtensionsMap$co5;
306
307 var config = type.toConfig();
308 var extensions = (_typeExtensionsMap$co5 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co5 !== void 0 ? _typeExtensionsMap$co5 : [];
309 return new _definition.GraphQLUnionType(_objectSpread(_objectSpread({}, config), {}, {
310 types: function types() {
311 return [].concat(type.getTypes().map(replaceNamedType), buildUnionTypes(extensions));
312 },
313 extensionASTNodes: config.extensionASTNodes.concat(extensions)
314 }));
315 }
316
317 function extendField(field) {
318 return _objectSpread(_objectSpread({}, field), {}, {
319 type: replaceType(field.type),
320 // $FlowFixMe[incompatible-call]
321 args: (0, _mapValue.default)(field.args, extendArg)
322 });
323 }
324
325 function extendArg(arg) {
326 return _objectSpread(_objectSpread({}, arg), {}, {
327 type: replaceType(arg.type)
328 });
329 }
330
331 function getOperationTypes(nodes) {
332 var opTypes = {};
333
334 for (var _i10 = 0; _i10 < nodes.length; _i10++) {
335 var _node$operationTypes;
336
337 var node = nodes[_i10];
338 // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
339 var operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : [];
340
341 for (var _i12 = 0; _i12 < operationTypesNodes.length; _i12++) {
342 var operationType = operationTypesNodes[_i12];
343 opTypes[operationType.operation] = getNamedType(operationType.type);
344 }
345 } // Note: While this could make early assertions to get the correctly
346 // typed values below, that would throw immediately while type system
347 // validation with validateSchema() will produce more actionable results.
348
349
350 return opTypes;
351 }
352
353 function getNamedType(node) {
354 var _stdTypeMap$name2;
355
356 var name = node.name.value;
357 var type = (_stdTypeMap$name2 = stdTypeMap[name]) !== null && _stdTypeMap$name2 !== void 0 ? _stdTypeMap$name2 : typeMap[name];
358
359 if (type === undefined) {
360 throw new Error("Unknown type: \"".concat(name, "\"."));
361 }
362
363 return type;
364 }
365
366 function getWrappedType(node) {
367 if (node.kind === _kinds.Kind.LIST_TYPE) {
368 return new _definition.GraphQLList(getWrappedType(node.type));
369 }
370
371 if (node.kind === _kinds.Kind.NON_NULL_TYPE) {
372 return new _definition.GraphQLNonNull(getWrappedType(node.type));
373 }
374
375 return getNamedType(node);
376 }
377
378 function buildDirective(node) {
379 var locations = node.locations.map(function (_ref) {
380 var value = _ref.value;
381 return value;
382 });
383 return new _directives.GraphQLDirective({
384 name: node.name.value,
385 description: getDescription(node, options),
386 locations: locations,
387 isRepeatable: node.repeatable,
388 args: buildArgumentMap(node.arguments),
389 astNode: node
390 });
391 }
392
393 function buildFieldMap(nodes) {
394 var fieldConfigMap = Object.create(null);
395
396 for (var _i14 = 0; _i14 < nodes.length; _i14++) {
397 var _node$fields;
398
399 var node = nodes[_i14];
400 // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
401 var nodeFields = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : [];
402
403 for (var _i16 = 0; _i16 < nodeFields.length; _i16++) {
404 var field = nodeFields[_i16];
405 fieldConfigMap[field.name.value] = {
406 // Note: While this could make assertions to get the correctly typed
407 // value, that would throw immediately while type system validation
408 // with validateSchema() will produce more actionable results.
409 type: getWrappedType(field.type),
410 description: getDescription(field, options),
411 args: buildArgumentMap(field.arguments),
412 deprecationReason: getDeprecationReason(field),
413 astNode: field
414 };
415 }
416 }
417
418 return fieldConfigMap;
419 }
420
421 function buildArgumentMap(args) {
422 // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
423 var argsNodes = args !== null && args !== void 0 ? args : [];
424 var argConfigMap = Object.create(null);
425
426 for (var _i18 = 0; _i18 < argsNodes.length; _i18++) {
427 var arg = argsNodes[_i18];
428 // Note: While this could make assertions to get the correctly typed
429 // value, that would throw immediately while type system validation
430 // with validateSchema() will produce more actionable results.
431 var type = getWrappedType(arg.type);
432 argConfigMap[arg.name.value] = {
433 type: type,
434 description: getDescription(arg, options),
435 defaultValue: (0, _valueFromAST.valueFromAST)(arg.defaultValue, type),
436 deprecationReason: getDeprecationReason(arg),
437 astNode: arg
438 };
439 }
440
441 return argConfigMap;
442 }
443
444 function buildInputFieldMap(nodes) {
445 var inputFieldMap = Object.create(null);
446
447 for (var _i20 = 0; _i20 < nodes.length; _i20++) {
448 var _node$fields2;
449
450 var node = nodes[_i20];
451 // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
452 var fieldsNodes = (_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : [];
453
454 for (var _i22 = 0; _i22 < fieldsNodes.length; _i22++) {
455 var field = fieldsNodes[_i22];
456 // Note: While this could make assertions to get the correctly typed
457 // value, that would throw immediately while type system validation
458 // with validateSchema() will produce more actionable results.
459 var type = getWrappedType(field.type);
460 inputFieldMap[field.name.value] = {
461 type: type,
462 description: getDescription(field, options),
463 defaultValue: (0, _valueFromAST.valueFromAST)(field.defaultValue, type),
464 deprecationReason: getDeprecationReason(field),
465 astNode: field
466 };
467 }
468 }
469
470 return inputFieldMap;
471 }
472
473 function buildEnumValueMap(nodes) {
474 var enumValueMap = Object.create(null);
475
476 for (var _i24 = 0; _i24 < nodes.length; _i24++) {
477 var _node$values;
478
479 var node = nodes[_i24];
480 // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
481 var valuesNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : [];
482
483 for (var _i26 = 0; _i26 < valuesNodes.length; _i26++) {
484 var value = valuesNodes[_i26];
485 enumValueMap[value.name.value] = {
486 description: getDescription(value, options),
487 deprecationReason: getDeprecationReason(value),
488 astNode: value
489 };
490 }
491 }
492
493 return enumValueMap;
494 }
495
496 function buildInterfaces(nodes) {
497 var interfaces = [];
498
499 for (var _i28 = 0; _i28 < nodes.length; _i28++) {
500 var _node$interfaces;
501
502 var node = nodes[_i28];
503 // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
504 var interfacesNodes = (_node$interfaces = node.interfaces) !== null && _node$interfaces !== void 0 ? _node$interfaces : [];
505
506 for (var _i30 = 0; _i30 < interfacesNodes.length; _i30++) {
507 var type = interfacesNodes[_i30];
508 // Note: While this could make assertions to get the correctly typed
509 // values below, that would throw immediately while type system
510 // validation with validateSchema() will produce more actionable
511 // results.
512 interfaces.push(getNamedType(type));
513 }
514 }
515
516 return interfaces;
517 }
518
519 function buildUnionTypes(nodes) {
520 var types = [];
521
522 for (var _i32 = 0; _i32 < nodes.length; _i32++) {
523 var _node$types;
524
525 var node = nodes[_i32];
526 // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203')
527 var typeNodes = (_node$types = node.types) !== null && _node$types !== void 0 ? _node$types : [];
528
529 for (var _i34 = 0; _i34 < typeNodes.length; _i34++) {
530 var type = typeNodes[_i34];
531 // Note: While this could make assertions to get the correctly typed
532 // values below, that would throw immediately while type system
533 // validation with validateSchema() will produce more actionable
534 // results.
535 types.push(getNamedType(type));
536 }
537 }
538
539 return types;
540 }
541
542 function buildType(astNode) {
543 var _typeExtensionsMap$na;
544
545 var name = astNode.name.value;
546 var description = getDescription(astNode, options);
547 var extensionNodes = (_typeExtensionsMap$na = typeExtensionsMap[name]) !== null && _typeExtensionsMap$na !== void 0 ? _typeExtensionsMap$na : [];
548
549 switch (astNode.kind) {
550 case _kinds.Kind.OBJECT_TYPE_DEFINITION:
551 {
552 var extensionASTNodes = extensionNodes;
553 var allNodes = [astNode].concat(extensionASTNodes);
554 return new _definition.GraphQLObjectType({
555 name: name,
556 description: description,
557 interfaces: function interfaces() {
558 return buildInterfaces(allNodes);
559 },
560 fields: function fields() {
561 return buildFieldMap(allNodes);
562 },
563 astNode: astNode,
564 extensionASTNodes: extensionASTNodes
565 });
566 }
567
568 case _kinds.Kind.INTERFACE_TYPE_DEFINITION:
569 {
570 var _extensionASTNodes = extensionNodes;
571
572 var _allNodes = [astNode].concat(_extensionASTNodes);
573
574 return new _definition.GraphQLInterfaceType({
575 name: name,
576 description: description,
577 interfaces: function interfaces() {
578 return buildInterfaces(_allNodes);
579 },
580 fields: function fields() {
581 return buildFieldMap(_allNodes);
582 },
583 astNode: astNode,
584 extensionASTNodes: _extensionASTNodes
585 });
586 }
587
588 case _kinds.Kind.ENUM_TYPE_DEFINITION:
589 {
590 var _extensionASTNodes2 = extensionNodes;
591
592 var _allNodes2 = [astNode].concat(_extensionASTNodes2);
593
594 return new _definition.GraphQLEnumType({
595 name: name,
596 description: description,
597 values: buildEnumValueMap(_allNodes2),
598 astNode: astNode,
599 extensionASTNodes: _extensionASTNodes2
600 });
601 }
602
603 case _kinds.Kind.UNION_TYPE_DEFINITION:
604 {
605 var _extensionASTNodes3 = extensionNodes;
606
607 var _allNodes3 = [astNode].concat(_extensionASTNodes3);
608
609 return new _definition.GraphQLUnionType({
610 name: name,
611 description: description,
612 types: function types() {
613 return buildUnionTypes(_allNodes3);
614 },
615 astNode: astNode,
616 extensionASTNodes: _extensionASTNodes3
617 });
618 }
619
620 case _kinds.Kind.SCALAR_TYPE_DEFINITION:
621 {
622 var _extensionASTNodes4 = extensionNodes;
623 return new _definition.GraphQLScalarType({
624 name: name,
625 description: description,
626 specifiedByUrl: getSpecifiedByUrl(astNode),
627 astNode: astNode,
628 extensionASTNodes: _extensionASTNodes4
629 });
630 }
631
632 case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION:
633 {
634 var _extensionASTNodes5 = extensionNodes;
635
636 var _allNodes4 = [astNode].concat(_extensionASTNodes5);
637
638 return new _definition.GraphQLInputObjectType({
639 name: name,
640 description: description,
641 fields: function fields() {
642 return buildInputFieldMap(_allNodes4);
643 },
644 astNode: astNode,
645 extensionASTNodes: _extensionASTNodes5
646 });
647 }
648 } // istanbul ignore next (Not reachable. All possible type definition nodes have been considered)
649
650
651 false || (0, _invariant.default)(0, 'Unexpected type definition node: ' + (0, _inspect.default)(astNode));
652 }
653}
654
655var stdTypeMap = (0, _keyMap.default)(_scalars.specifiedScalarTypes.concat(_introspection.introspectionTypes), function (type) {
656 return type.name;
657});
658/**
659 * Given a field or enum value node, returns the string value for the
660 * deprecation reason.
661 */
662
663function getDeprecationReason(node) {
664 var deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node);
665 return deprecated === null || deprecated === void 0 ? void 0 : deprecated.reason;
666}
667/**
668 * Given a scalar node, returns the string value for the specifiedByUrl.
669 */
670
671
672function getSpecifiedByUrl(node) {
673 var specifiedBy = (0, _values.getDirectiveValues)(_directives.GraphQLSpecifiedByDirective, node);
674 return specifiedBy === null || specifiedBy === void 0 ? void 0 : specifiedBy.url;
675}
676/**
677 * Given an ast node, returns its string description.
678 * @deprecated: provided to ease adoption and will be removed in v16.
679 *
680 * Accepts options as a second argument:
681 *
682 * - commentDescriptions:
683 * Provide true to use preceding comments as the description.
684 *
685 */
686
687
688function getDescription(node, options) {
689 if (node.description) {
690 return node.description.value;
691 }
692
693 if ((options === null || options === void 0 ? void 0 : options.commentDescriptions) === true) {
694 var rawValue = getLeadingCommentBlock(node);
695
696 if (rawValue !== undefined) {
697 return (0, _blockString.dedentBlockStringValue)('\n' + rawValue);
698 }
699 }
700}
701
702function getLeadingCommentBlock(node) {
703 var loc = node.loc;
704
705 if (!loc) {
706 return;
707 }
708
709 var comments = [];
710 var token = loc.startToken.prev;
711
712 while (token != null && token.kind === _tokenKind.TokenKind.COMMENT && token.next && token.prev && token.line + 1 === token.next.line && token.line !== token.prev.line) {
713 var value = String(token.value);
714 comments.push(value);
715 token = token.prev;
716 }
717
718 return comments.length > 0 ? comments.reverse().join('\n') : undefined;
719}