packages feed

morpheus-graphql-app 0.22.1 → 0.23.0

raw patch · 10 files changed

+85/−20 lines, 10 filesdep ~morpheus-graphql-coredep ~morpheus-graphql-testsPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: morpheus-graphql-core, morpheus-graphql-tests

API changes (from Hackage documentation)

- Data.Morpheus.App.Internal.Resolving: mkValue :: Monad m => Value -> ResolverValue m
+ Data.Morpheus.App.Internal.Resolving: mkValue :: (MonadReader ResolverContext f, MonadReader ResolverContext m) => Value -> f (ResolverValue m)

Files

morpheus-graphql-app.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           morpheus-graphql-app-version:        0.22.1+version:        0.23.0 synopsis:       Morpheus GraphQL App description:    Build GraphQL APIs with your favourite functional language! category:       web, graphql@@ -38,6 +38,10 @@     test/api/validation/fragment/on-type/query.gql     test/api/validation/fragment/on-union-type/query.gql     test/api/validation/fragment/schema.gql+    test/api/validation/input-coercion/list/list-many/query.gql+    test/api/validation/input-coercion/list/list-single/query.gql+    test/api/validation/input-coercion/list/schema.gql+    test/api/validation/input-coercion/list/signle-value/query.gql     test/merge/schema/query-subscription-mutation/app-1.gql     test/merge/schema/query-subscription-mutation/app-2.gql     test/merge/schema/query-subscription-mutation/mutation/query.gql@@ -78,6 +82,10 @@     test/api/validation/fragment/on-type/response.json     test/api/validation/fragment/on-union-type/response.json     test/api/validation/fragment/resolvers.json+    test/api/validation/input-coercion/list/list-many/response.json+    test/api/validation/input-coercion/list/list-single/response.json+    test/api/validation/input-coercion/list/resolvers.json+    test/api/validation/input-coercion/list/signle-value/response.json     test/merge/schema/query-subscription-mutation/app-1.json     test/merge/schema/query-subscription-mutation/app-2.json     test/merge/schema/query-subscription-mutation/mutation/response.json@@ -132,7 +140,7 @@     , containers >=0.4.2.1 && <0.7.0     , hashable >=1.0.0 && <2.0.0     , megaparsec >=7.0.0 && <10.0.0-    , morpheus-graphql-core >=0.22.0 && <0.23.0+    , morpheus-graphql-core >=0.23.0 && <0.24.0     , mtl >=2.0.0 && <3.0.0     , relude >=0.3.0 && <2.0.0     , scientific >=0.3.6.2 && <0.4.0@@ -163,8 +171,8 @@     , hashable >=1.0.0 && <2.0.0     , megaparsec >=7.0.0 && <10.0.0     , morpheus-graphql-app-    , morpheus-graphql-core >=0.22.0 && <0.23.0-    , morpheus-graphql-tests >=0.22.0 && <0.23.0+    , morpheus-graphql-core >=0.23.0 && <0.24.0+    , morpheus-graphql-tests >=0.23.0 && <0.24.0     , mtl >=2.0.0 && <3.0.0     , relude >=0.3.0 && <2.0.0     , scientific >=0.3.6.2 && <0.4.0
src/Data/Morpheus/App/Internal/Resolving/Utils.hs view
@@ -21,6 +21,7 @@  import Control.Monad.Except (MonadError (throwError)) import qualified Data.Aeson as A+import Data.Morpheus.App.Internal.Resolving.ResolverState import Data.Morpheus.App.Internal.Resolving.Types   ( NamedResolverRef (..),     ObjectTypeResolver (..),@@ -41,14 +42,23 @@     packName,     unpackName,   )+import Data.Morpheus.Types.SelectionTree (SelectionTree (..))+import Data.Text (breakOnEnd, splitOn) import qualified Data.Vector as V-import Relude+import Relude hiding (break) -lookupResJSON :: (MonadError GQLError f, Monad m) => FieldName -> A.Value -> f (ObjectTypeResolver m)+lookupResJSON ::+  ( MonadError GQLError f,+    MonadReader ResolverContext f,+    MonadReader ResolverContext m+  ) =>+  FieldName ->+  A.Value ->+  f (ObjectTypeResolver m) lookupResJSON name (A.Object fields) =   selectOr     mkEmptyObject-    (requireObject . mkValue)+    (requireObject <=< mkValue)     (unpackName name)     fields lookupResJSON _ _ = mkEmptyObject@@ -57,20 +67,35 @@ mkEmptyObject = pure $ ObjectTypeResolver mempty  mkValue ::-  (Monad m) =>+  ( MonadReader ResolverContext f,+    MonadReader ResolverContext m+  ) =>   A.Value ->-  ResolverValue m-mkValue (A.Object v) =-  mkObjectMaybe-    (U.lookup "__typename" v >>= unpackJSONName)-    $ fmap-      (bimap packName (pure . mkValue))-      (toAssoc v)-mkValue (A.Array ls) = mkList (fmap mkValue (V.toList ls))-mkValue A.Null = mkNull-mkValue (A.Number x) = ResScalar (decodeScientific x)-mkValue (A.String x) = ResScalar (String x)-mkValue (A.Bool x) = ResScalar (Boolean x)+  f (ResolverValue m)+mkValue (A.Object v) = pure $ mkObjectMaybe typename fields+  where+    typename = U.lookup "__typename" v >>= unpackJSONName+    fields = map (bimap packName mkValue) (toAssoc v)+mkValue (A.Array ls) = mkList <$> traverse mkValue (V.toList ls)+mkValue A.Null = pure mkNull+mkValue (A.Number x) = pure $ ResScalar (decodeScientific x)+mkValue (A.String txt) = case withSelf txt of+  ARG name -> do+    sel <- asks currentSelection+    mkValue (fromMaybe A.Null (getArgument name sel))+  NoAPI v -> pure $ ResScalar (String v)+mkValue (A.Bool x) = pure $ ResScalar (Boolean x)++data SelfAPI+  = ARG Text+  | NoAPI Text++withSelf :: Text -> SelfAPI+withSelf txt = case breakOnEnd "::" txt of+  ("@SELF::", field) -> case splitOn "." field of+    ["ARG", name] -> ARG name+    _ -> NoAPI txt+  _ -> NoAPI txt  requireObject :: MonadError GQLError f => ResolverValue m -> f (ObjectTypeResolver m) requireObject (ResObject _ x) = pure x
+ test/api/validation/input-coercion/list/list-many/query.gql view
@@ -0,0 +1,3 @@+query {+  foo(bar: [3, 124, 5, 6])+}
+ test/api/validation/input-coercion/list/list-many/response.json view
@@ -0,0 +1,5 @@+{+  "data": {+    "foo": [3, 124, 5, 6]+  }+}
+ test/api/validation/input-coercion/list/list-single/query.gql view
@@ -0,0 +1,3 @@+query {+  foo(bar: [3])+}
+ test/api/validation/input-coercion/list/list-single/response.json view
@@ -0,0 +1,5 @@+{+  "data": {+    "foo": [3]+  }+}
+ test/api/validation/input-coercion/list/resolvers.json view
@@ -0,0 +1,5 @@+{+  "query": {+    "foo": "@SELF::ARG.bar"+  }+}
+ test/api/validation/input-coercion/list/schema.gql view
@@ -0,0 +1,3 @@+type Query {+  foo(bar: [Int!]): Int!+}
+ test/api/validation/input-coercion/list/signle-value/query.gql view
@@ -0,0 +1,3 @@+query {+  foo(bar: 3)+}
+ test/api/validation/input-coercion/list/signle-value/response.json view
@@ -0,0 +1,5 @@+{+  "data": {+    "foo": [3]+  }+}