graphql

Search for an npm package
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true,
});
exports.KnownTypeNamesRule = KnownTypeNamesRule;
var _didYouMean = require('../../jsutils/didYouMean.js');
var _suggestionList = require('../../jsutils/suggestionList.js');
var _GraphQLError = require('../../error/GraphQLError.js');
var _predicates = require('../../language/predicates.js');
var _introspection = require('../../type/introspection.js');
var _scalars = require('../../type/scalars.js');
/**
* Known type names
*
* A GraphQL document is only valid if referenced types (specifically
* variable definitions and fragment conditions) are defined by the type schema.
*
* See https://spec.graphql.org/draft/#sec-Fragment-Spread-Type-Existence
*/
function KnownTypeNamesRule(context) {
const schema = context.getSchema();
const existingTypesMap = schema ? schema.getTypeMap() : Object.create(null);
const definedTypes = Object.create(null);
for (const def of context.getDocument().definitions) {
if ((0, _predicates.isTypeDefinitionNode)(def)) {
definedTypes[def.name.value] = true;
}
}
const typeNames = [
...Object.keys(existingTypesMap),
...Object.keys(definedTypes),
];
return {
NamedType(node, _1, parent, _2, ancestors) {
const typeName = node.name.value;
if (!existingTypesMap[typeName] && !definedTypes[typeName]) {
var _ancestors$;
const definitionNode =
(_ancestors$ = ancestors[2]) !== null && _ancestors$ !== void 0
? _ancestors$
: parent;
const isSDL = definitionNode != null && isSDLNode(definitionNode);
if (isSDL && standardTypeNames.includes(typeName)) {
return;
}
const suggestedTypes = (0, _suggestionList.suggestionList)(
typeName,
isSDL ? standardTypeNames.concat(typeNames) : typeNames,
);
context.reportError(
new _GraphQLError.GraphQLError(
`Unknown type "${typeName}".` +
(0, _didYouMean.didYouMean)(suggestedTypes),
{
nodes: node,
},
),
);
}
},
};
}
const standardTypeNames = [
..._scalars.specifiedScalarTypes,
..._introspection.introspectionTypes,
].map((type) => type.name);
function isSDLNode(value) {
return (
'kind' in value &&
((0, _predicates.isTypeSystemDefinitionNode)(value) ||
(0, _predicates.isTypeSystemExtensionNode)(value))
);
}