UNPKG

@envelop/on-resolve

Version:

This plugin allows you to hook into resolves of every field in the GraphQL schema.

58 lines (57 loc) 2.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useOnResolve = void 0; const graphql_1 = require("graphql"); /** * Wraps the provided schema by hooking into the resolvers of every field. * * Use the `onResolve` argument to manipulate the resolver and its results/errors. */ function useOnResolve(onResolve) { return { onSchemaChange({ schema: _schema }) { const schema = _schema; if (!schema) return; // nothing to do if schema is missing for (const type of Object.values(schema.getTypeMap())) { if (!(0, graphql_1.isIntrospectionType)(type) && (0, graphql_1.isObjectType)(type)) { for (const field of Object.values(type.getFields())) { let resolver = (field.resolve || graphql_1.defaultFieldResolver); field.resolve = async (root, args, context, info) => { const afterResolve = await onResolve({ root, args, context, info, resolver, replaceResolver: newResolver => { resolver = newResolver; }, }); let result; try { result = await resolver(root, args, context, info); } catch (err) { result = err; } if (typeof afterResolve === 'function') { await afterResolve({ result, setResult: newResult => { result = newResult; }, }); } if (result instanceof Error) { throw result; } return result; }; } } } }, }; } exports.useOnResolve = useOnResolve;