12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import { mergeDeep } from '@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)
- * ```
- */
- export 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 = 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;
- }
|