mirror of
https://github.com/wassname/talk.git
synced 2026-06-28 02:31:37 +08:00
46 lines
1.7 KiB
JavaScript
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,
|
|
};
|