UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

79 lines (69 loc) 2.7 kB
import { GraphQLError } from '../../error/GraphQLError'; import suggestionList from '../../jsutils/suggestionList'; import didYouMean from '../../jsutils/didYouMean'; import { isTypeDefinitionNode, isTypeSystemDefinitionNode, isTypeSystemExtensionNode } from '../../language/predicates'; import { specifiedScalarTypes } from '../../type/scalars'; export function unknownTypeMessage(typeName, suggestedTypes) { return "Unknown type \"".concat(typeName, "\".") + didYouMean(suggestedTypes.map(function (x) { return "\"".concat(x, "\""); })); } /** * 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))); }