schemaInstrumentation.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.whenResultIsFinished = exports.pluginsEnabledForSchemaResolvers = exports.enablePluginsForSchemaResolvers = exports.symbolUserFieldResolver = exports.symbolExecutionDispatcherWillResolveField = void 0;
  4. const graphql_1 = require("graphql");
  5. exports.symbolExecutionDispatcherWillResolveField = Symbol('apolloServerExecutionDispatcherWillResolveField');
  6. exports.symbolUserFieldResolver = Symbol('apolloServerUserFieldResolver');
  7. const symbolPluginsEnabled = Symbol('apolloServerPluginsEnabled');
  8. function enablePluginsForSchemaResolvers(schema) {
  9. if (pluginsEnabledForSchemaResolvers(schema)) {
  10. return schema;
  11. }
  12. Object.defineProperty(schema, symbolPluginsEnabled, {
  13. value: true,
  14. });
  15. const typeMap = schema.getTypeMap();
  16. Object.values(typeMap).forEach((type) => {
  17. if (!(0, graphql_1.getNamedType)(type).name.startsWith('__') &&
  18. type instanceof graphql_1.GraphQLObjectType) {
  19. const fields = type.getFields();
  20. Object.values(fields).forEach((field) => {
  21. wrapField(field);
  22. });
  23. }
  24. });
  25. return schema;
  26. }
  27. exports.enablePluginsForSchemaResolvers = enablePluginsForSchemaResolvers;
  28. function pluginsEnabledForSchemaResolvers(schema) {
  29. return !!schema[symbolPluginsEnabled];
  30. }
  31. exports.pluginsEnabledForSchemaResolvers = pluginsEnabledForSchemaResolvers;
  32. function wrapField(field) {
  33. const originalFieldResolve = field.resolve;
  34. field.resolve = (source, args, contextValue, info) => {
  35. const willResolveField = contextValue?.[exports.symbolExecutionDispatcherWillResolveField];
  36. const userFieldResolver = contextValue?.[exports.symbolUserFieldResolver];
  37. const didResolveField = typeof willResolveField === 'function' &&
  38. willResolveField({ source, args, contextValue, info });
  39. const fieldResolver = originalFieldResolve || userFieldResolver || graphql_1.defaultFieldResolver;
  40. try {
  41. const result = fieldResolver(source, args, contextValue, info);
  42. if (typeof didResolveField === 'function') {
  43. whenResultIsFinished(result, didResolveField);
  44. }
  45. return result;
  46. }
  47. catch (error) {
  48. if (typeof didResolveField === 'function') {
  49. didResolveField(error);
  50. }
  51. throw error;
  52. }
  53. };
  54. }
  55. function isPromise(x) {
  56. return x && typeof x.then === 'function';
  57. }
  58. function whenResultIsFinished(result, callback) {
  59. if (isPromise(result)) {
  60. result.then((r) => whenResultIsFinished(r, callback), (err) => callback(err));
  61. }
  62. else if (Array.isArray(result)) {
  63. if (result.some(isPromise)) {
  64. Promise.all(result).then((r) => callback(null, r), (err) => callback(err));
  65. }
  66. else {
  67. callback(null, result);
  68. }
  69. }
  70. else {
  71. callback(null, result);
  72. }
  73. }
  74. exports.whenResultIsFinished = whenResultIsFinished;
  75. //# sourceMappingURL=schemaInstrumentation.js.map