merge-resolvers.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { mergeDeep } from '@graphql-tools/utils';
  2. /**
  3. * Deep merges multiple resolver definition objects into a single definition.
  4. * @param resolversDefinitions Resolver definitions to be merged
  5. * @param options Additional options
  6. *
  7. * ```js
  8. * const { mergeResolvers } = require('@graphql-tools/merge');
  9. * const clientResolver = require('./clientResolver');
  10. * const productResolver = require('./productResolver');
  11. *
  12. * const resolvers = mergeResolvers([
  13. * clientResolver,
  14. * productResolver,
  15. * ]);
  16. * ```
  17. *
  18. * If you don't want to manually create the array of resolver objects, you can
  19. * also use this function along with loadFiles:
  20. *
  21. * ```js
  22. * const path = require('path');
  23. * const { mergeResolvers } = require('@graphql-tools/merge');
  24. * const { loadFilesSync } = require('@graphql-tools/load-files');
  25. *
  26. * const resolversArray = loadFilesSync(path.join(__dirname, './resolvers'));
  27. *
  28. * const resolvers = mergeResolvers(resolversArray)
  29. * ```
  30. */
  31. export function mergeResolvers(resolversDefinitions, options) {
  32. if (!resolversDefinitions ||
  33. (Array.isArray(resolversDefinitions) && resolversDefinitions.length === 0)) {
  34. return {};
  35. }
  36. if (!Array.isArray(resolversDefinitions)) {
  37. return resolversDefinitions;
  38. }
  39. if (resolversDefinitions.length === 1) {
  40. return resolversDefinitions[0] || {};
  41. }
  42. const resolvers = new Array();
  43. for (let resolversDefinition of resolversDefinitions) {
  44. if (Array.isArray(resolversDefinition)) {
  45. resolversDefinition = mergeResolvers(resolversDefinition);
  46. }
  47. if (typeof resolversDefinition === 'object' && resolversDefinition) {
  48. resolvers.push(resolversDefinition);
  49. }
  50. }
  51. const result = mergeDeep(resolvers, true);
  52. if (options?.exclusions) {
  53. for (const exclusion of options.exclusions) {
  54. const [typeName, fieldName] = exclusion.split('.');
  55. if (!fieldName || fieldName === '*') {
  56. delete result[typeName];
  57. }
  58. else if (result[typeName]) {
  59. delete result[typeName][fieldName];
  60. }
  61. }
  62. }
  63. return result;
  64. }