@graphql-tools/merge
Version:
A set of utils for faster development of GraphQL tools
69 lines (68 loc) • 2.34 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeResolvers = void 0;
const utils_1 = require("@graphql-tools/utils");
/**
* Deep merges multiple resolver definition objects into a single definition.
* @param resolversDefinitions Resolver definitions to be merged
* @param options Additional options
*
* ```js
* const { mergeResolvers } = require('@graphql-tools/merge');
* const clientResolver = require('./clientResolver');
* const productResolver = require('./productResolver');
*
* const resolvers = mergeResolvers([
* clientResolver,
* productResolver,
* ]);
* ```
*
* If you don't want to manually create the array of resolver objects, you can
* also use this function along with loadFiles:
*
* ```js
* const path = require('path');
* const { mergeResolvers } = require('@graphql-tools/merge');
* const { loadFilesSync } = require('@graphql-tools/load-files');
*
* const resolversArray = loadFilesSync(path.join(__dirname, './resolvers'));
*
* const resolvers = mergeResolvers(resolversArray)
* ```
*/
function mergeResolvers(resolversDefinitions, options) {
if (!resolversDefinitions ||
(Array.isArray(resolversDefinitions) && resolversDefinitions.length === 0)) {
return {};
}
if (!Array.isArray(resolversDefinitions)) {
return resolversDefinitions;
}
if (resolversDefinitions.length === 1) {
return resolversDefinitions[0] || {};
}
const resolvers = new Array();
for (let resolversDefinition of resolversDefinitions) {
if (Array.isArray(resolversDefinition)) {
resolversDefinition = mergeResolvers(resolversDefinition);
}
if (typeof resolversDefinition === 'object' && resolversDefinition) {
resolvers.push(resolversDefinition);
}
}
const result = (0, utils_1.mergeDeep)(resolvers, true);
if (options?.exclusions) {
for (const exclusion of options.exclusions) {
const [typeName, fieldName] = exclusion.split('.');
if (!fieldName || fieldName === '*') {
delete result[typeName];
}
else if (result[typeName]) {
delete result[typeName][fieldName];
}
}
}
return result;
}
exports.mergeResolvers = mergeResolvers;
;