merge-resolvers.js 2.3 KB

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