UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

90 lines (79 loc) 2.95 kB
/** * Copyright (c) 2015-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * */ import { GraphQLError } from '../../error/GraphQLError'; import suggestionList from '../../jsutils/suggestionList'; import quotedOrList from '../../jsutils/quotedOrList'; import { isTypeDefinitionNode, isTypeSystemDefinitionNode, isTypeSystemExtensionNode } from '../../language/predicates'; import { specifiedScalarTypes } from '../../type/scalars'; export function unknownTypeMessage(typeName, suggestedTypes) { var message = "Unknown type \"".concat(typeName, "\"."); if (suggestedTypes.length) { message += " Did you mean ".concat(quotedOrList(suggestedTypes), "?"); } return message; } /** * Known type names * * A GraphQL document is only valid if referenced types (specifically * variable definitions and fragment conditions) are defined by the type schema. */ export function KnownTypeNames(context) { var schema = context.getSchema(); var existingTypesMap = schema ? schema.getTypeMap() : Object.create(null); var definedTypes = Object.create(null); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = context.getDocument().definitions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var def = _step.value; if (isTypeDefinitionNode(def)) { definedTypes[def.name.value] = true; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var typeNames = Object.keys(existingTypesMap).concat(Object.keys(definedTypes)); return { NamedType: function NamedType(node, _1, parent, _2, ancestors) { var typeName = node.name.value; if (!existingTypesMap[typeName] && !definedTypes[typeName]) { var definitionNode = ancestors[2] || parent; var isSDL = isSDLNode(definitionNode); if (isSDL && isSpecifiedScalarName(typeName)) { return; } var suggestedTypes = suggestionList(typeName, isSDL ? specifiedScalarsNames.concat(typeNames) : typeNames); context.reportError(new GraphQLError(unknownTypeMessage(typeName, suggestedTypes), node)); } } }; } var specifiedScalarsNames = specifiedScalarTypes.map(function (type) { return type.name; }); function isSpecifiedScalarName(typeName) { return specifiedScalarsNames.indexOf(typeName) !== -1; } function isSDLNode(value) { return Boolean(value && !Array.isArray(value) && (isTypeSystemDefinitionNode(value) || isTypeSystemExtensionNode(value))); }