graphql-middleware icon indicating copy to clipboard operation
graphql-middleware copied to clipboard

Subscriptions can take both subscribe/resolve in it's definition, the applyMiddlewareToField overlooks that

Open leiyangyou opened this issue 2 years ago • 1 comments

Hi! 👋

Firstly, thanks for your work on this project! 🙂

Today I used patch-package to patch [email protected] for the project I'm working on.

Here is the diff that solved my problem:

diff --git a/node_modules/graphql-middleware/dist/applicator.js b/node_modules/graphql-middleware/dist/applicator.js
index c80326c..ba4c704 100644
--- a/node_modules/graphql-middleware/dist/applicator.js
+++ b/node_modules/graphql-middleware/dist/applicator.js
@@ -21,46 +21,43 @@ function parseField(field) {
 }
 function applyMiddlewareToField(field, options, middleware) {
   const parsedField = parseField(field);
-  if (utils.isMiddlewareWithFragment(middleware) && parsedField.resolve && parsedField.resolve !== graphql.defaultFieldResolver) {
-    return {
-      ...parsedField,
-      fragment: middleware.fragment,
-      fragments: middleware.fragments,
-      resolve: wrapResolverInMiddleware(parsedField.resolve, middleware.resolve)
-    };
-  } else if (utils.isMiddlewareWithFragment(middleware) && parsedField.subscribe) {
-    return {
-      ...parsedField,
-      fragment: middleware.fragment,
-      fragments: middleware.fragments,
-      subscribe: wrapResolverInMiddleware(parsedField.subscribe, middleware.resolve)
-    };
-  } else if (utils.isMiddlewareResolver(middleware) && parsedField.resolve && parsedField.resolve !== graphql.defaultFieldResolver) {
-    return {
-      ...parsedField,
-      resolve: wrapResolverInMiddleware(parsedField.resolve, middleware)
-    };
-  } else if (utils.isMiddlewareResolver(middleware) && parsedField.subscribe) {
-    return {
-      ...parsedField,
-      subscribe: wrapResolverInMiddleware(parsedField.subscribe, middleware)
-    };
-  } else if (utils.isMiddlewareWithFragment(middleware) && !options.onlyDeclaredResolvers) {
-    return {
-      ...parsedField,
-      fragment: middleware.fragment,
-      fragments: middleware.fragments,
-      resolve: wrapResolverInMiddleware(graphql.defaultFieldResolver, middleware.resolve)
-    };
-  } else if (utils.isMiddlewareResolver(middleware) && !options.onlyDeclaredResolvers) {
-    return {
-      ...parsedField,
-      resolve: wrapResolverInMiddleware(graphql.defaultFieldResolver, middleware)
-    };
+
+  const resolve = options.onlyDeclaredResolvers ?
+    (field.resolve !== graphql_1.defaultFieldResolver ? parsedField.resolve : null) :
+    (field.resolve || graphql_1.defaultFieldResolver)
+
+  const subscribe = parsedField.subscribe
+
+  if (resolve || subscribe) {
+    let update = null
+    let middlewareResolve = null
+
+    if (utils.isMiddlewareWithFragment(middleware)) {
+      update = {}
+      update.fragment = middleware.fragment
+      update.fragments = middleware.fragments
+      middlewareResolve = middleware.resolve
+    } else if (utils.isMiddlewareResolver(middleware)) {
+      update = {}
+      middlewareResolve = middleware
+    }
+
+    if (middlewareResolve) {
+      if (resolve) {
+        update.resolve = wrapResolverInMiddleware(resolve, middlewareResolve)
+      }
+      if (subscribe) {
+        update.subscribe = wrapResolverInMiddleware(subscribe, middlewareResolve)
+      }
+      return {...parsedField, ...update}
+    } else {
+      return parsedField
+    }
   } else {
-    return { ...parsedField, resolve: graphql.defaultFieldResolver };
+    return parsedField
   }
 }
+
 function applyMiddlewareToType(type, options, middleware) {
   const fieldMap = type.getFields();
   if (utils.isMiddlewareFunction(middleware)) {

This issue body was partially generated by patch-package.

leiyangyou avatar Jan 01 '23 22:01 leiyangyou

Thanks for this, it appears to work for me. Would you consider putting up a PR?

cuzzlor avatar Aug 11 '23 08:08 cuzzlor