Files
talk/graph/utils.js
2018-01-11 20:00:34 -07:00

46 lines
1.7 KiB
JavaScript

const { GraphQLObjectType, GraphQLInterfaceType } = require('graphql');
/**
* Iterates over each field in a schema.
* This function is pretty much copied verbatim from the graphql-tools repo:
* https://github.com/apollographql/graphql-tools/blob/b12973c86e00be209d04af0184780998056051c4/src/schemaGenerator.ts#L180-L194
* With the small alteration that we look for the `resolveType` function on the
* schema so we can wrap post hooks around it to provide additional resolve
* points. (Only when `options.includeResolveType` is set to true).
*
* @param {GraphQLSchema} schema the schema to iterate over
* @param {function} fn callback to call on each field
* @param {object} [options] options
* @param {boolean} [options.includeResolveType] include resolveType during iteration
* @return {void}
*/
const forEachField = (schema, fn, options = {}) => {
const { includeResolveType = false } = options;
const typeMap = schema.getTypeMap();
Object.keys(typeMap).forEach(typeName => {
const type = typeMap[typeName];
if (
type instanceof GraphQLObjectType ||
type instanceof GraphQLInterfaceType
) {
// Here we capture the change to extract the resolve type. We pass this
// with the `isResolveType = true` to introduce the specific beheviour.
if (includeResolveType && 'resolveType' in type) {
fn(type, typeName, '__resolveType', true);
}
const fields = type.getFields();
Object.keys(fields).forEach(fieldName => {
const field = fields[fieldName];
fn(field, typeName, fieldName);
});
}
});
};
module.exports = {
forEachField,
};