@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
JavaScript
;
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;