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 +12/−4
- src/Data/Morpheus/App/Internal/Resolving/Utils.hs +41/−16
- test/api/validation/input-coercion/list/list-many/query.gql +3/−0
- test/api/validation/input-coercion/list/list-many/response.json +5/−0
- test/api/validation/input-coercion/list/list-single/query.gql +3/−0
- test/api/validation/input-coercion/list/list-single/response.json +5/−0
- test/api/validation/input-coercion/list/resolvers.json +5/−0
- test/api/validation/input-coercion/list/schema.gql +3/−0
- test/api/validation/input-coercion/list/signle-value/query.gql +3/−0
- test/api/validation/input-coercion/list/signle-value/response.json +5/−0
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]+ }+}