@apollo/server
Version:
Core engine for Apollo GraphQL server
75 lines • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.symbolUserFieldResolver = exports.symbolExecutionDispatcherWillResolveField = void 0;
exports.enablePluginsForSchemaResolvers = enablePluginsForSchemaResolvers;
exports.pluginsEnabledForSchemaResolvers = pluginsEnabledForSchemaResolvers;
exports.whenResultIsFinished = whenResultIsFinished;
const graphql_1 = require("graphql");
exports.symbolExecutionDispatcherWillResolveField = Symbol('apolloServerExecutionDispatcherWillResolveField');
exports.symbolUserFieldResolver = Symbol('apolloServerUserFieldResolver');
const symbolPluginsEnabled = Symbol('apolloServerPluginsEnabled');
function enablePluginsForSchemaResolvers(schema) {
if (pluginsEnabledForSchemaResolvers(schema)) {
return schema;
}
Object.defineProperty(schema, symbolPluginsEnabled, {
value: true,
});
const typeMap = schema.getTypeMap();
Object.values(typeMap).forEach((type) => {
if (!(0, graphql_1.getNamedType)(type).name.startsWith('__') &&
type instanceof graphql_1.GraphQLObjectType) {
const fields = type.getFields();
Object.values(fields).forEach((field) => {
wrapField(field);
});
}
});
return schema;
}
function pluginsEnabledForSchemaResolvers(schema) {
return !!schema[symbolPluginsEnabled];
}
function wrapField(field) {
const originalFieldResolve = field.resolve;
field.resolve = (source, args, contextValue, info) => {
const willResolveField = contextValue?.[exports.symbolExecutionDispatcherWillResolveField];
const userFieldResolver = contextValue?.[exports.symbolUserFieldResolver];
const didResolveField = typeof willResolveField === 'function' &&
willResolveField({ source, args, contextValue, info });
const fieldResolver = originalFieldResolve || userFieldResolver || graphql_1.defaultFieldResolver;
try {
const result = fieldResolver(source, args, contextValue, info);
if (typeof didResolveField === 'function') {
whenResultIsFinished(result, didResolveField);
}
return result;
}
catch (error) {
if (typeof didResolveField === 'function') {
didResolveField(error);
}
throw error;
}
};
}
function isPromise(x) {
return x && typeof x.then === 'function';
}
function whenResultIsFinished(result, callback) {
if (isPromise(result)) {
result.then((r) => whenResultIsFinished(r, callback), (err) => callback(err));
}
else if (Array.isArray(result)) {
if (result.some(isPromise)) {
Promise.all(result).then((r) => callback(null, r), (err) => callback(err));
}
else {
callback(null, result);
}
}
else {
callback(null, result);
}
}
//# sourceMappingURL=schemaInstrumentation.js.map