morpheus-graphql-app 0.23.0 → 0.24.0
raw patch · 11 files changed
+41/−20 lines, 11 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)
Files
- morpheus-graphql-app.cabal +4/−4
- src/Data/Morpheus/App.hs +2/−1
- src/Data/Morpheus/App/Internal/Resolving/ResolveValue.hs +23/−13
- src/Data/Morpheus/App/Internal/Resolving/RootResolverValue.hs +2/−2
- test/api/validation/fragment/on-interface-inline/query.gql +1/−0
- test/api/validation/fragment/on-interface-type-casting-inline/query.gql +1/−0
- test/api/validation/fragment/on-interface-type-casting/query.gql +1/−0
- test/api/validation/fragment/on-interface/query.gql +1/−0
- test/named-resolvers/entities/query.gql +2/−0
- test/named-resolvers/entity-by-id/query.gql +2/−0
- test/named-resolvers/entity-ext-by-id/query.gql +2/−0
morpheus-graphql-app.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: morpheus-graphql-app-version: 0.23.0+version: 0.24.0 synopsis: Morpheus GraphQL App description: Build GraphQL APIs with your favourite functional language! category: web, graphql@@ -140,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.23.0 && <0.24.0+ , morpheus-graphql-core >=0.24.0 && <0.25.0 , mtl >=2.0.0 && <3.0.0 , relude >=0.3.0 && <2.0.0 , scientific >=0.3.6.2 && <0.4.0@@ -171,8 +171,8 @@ , hashable >=1.0.0 && <2.0.0 , megaparsec >=7.0.0 && <10.0.0 , morpheus-graphql-app- , morpheus-graphql-core >=0.23.0 && <0.24.0- , morpheus-graphql-tests >=0.23.0 && <0.24.0+ , morpheus-graphql-core >=0.24.0 && <0.25.0+ , morpheus-graphql-tests >=0.24.0 && <0.25.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.hs view
@@ -165,7 +165,8 @@ selectionPosition = operationPosition operation, selectionAlias = Nothing, selectionContent = SelectionSet (operationSelection operation),- selectionDirectives = empty+ selectionDirectives = empty,+ selectionOrigin = Nothing } } )
src/Data/Morpheus/App/Internal/Resolving/ResolveValue.hs view
@@ -28,7 +28,13 @@ mkUnion, ) import Data.Morpheus.Error (subfieldsNotSelected)-import Data.Morpheus.Internal.Utils (KeyOf (keyOf), selectOr, traverseCollection, (<:>))+import Data.Morpheus.Internal.Utils+ ( KeyOf (keyOf),+ empty,+ selectOr,+ traverseCollection,+ (<:>),+ ) import Data.Morpheus.Types.Internal.AST ( GQLError, Msg (msg),@@ -48,7 +54,7 @@ unitTypeName, unpackName, )-import Relude+import Relude hiding (empty) resolveSelection :: ( Monad m,@@ -78,25 +84,30 @@ resolveSelection rmap (ResRef ref) sel = ref >>= flip (resolveRef rmap) sel withObject ::- ( Monad m,- MonadError GQLError m,+ ( MonadError GQLError m, MonadReader ResolverContext m ) => Maybe TypeName ->- (SelectionSet VALID -> m value) ->+ (Maybe (SelectionSet VALID) -> m value) -> SelectionContent VALID -> m value withObject __typename f = updateCurrentType __typename . checkContent where- checkContent (SelectionSet selection) = f selection+ checkContent (SelectionSet selection) = f (Just selection) checkContent (UnionSelection interface unionSel) = do typename <- asks (typeName . currentType)- selection <- selectOr (pure interface) ((interface <:>) . unionTagSelection) typename unionSel+ selection <- selectOr (pure interface) (fx interface) typename unionSel f selection- checkContent _ = do- sel <- asks currentSelection- throwError $ subfieldsNotSelected (selectionName sel) "" (selectionPosition sel)+ where+ fx (Just x) y = Just <$> (x <:> unionTagSelection y)+ fx Nothing y = pure $ Just $ unionTagSelection y+ checkContent _ = noEmptySelection +noEmptySelection :: (MonadError GQLError m, MonadReader ResolverContext m) => m value+noEmptySelection = do+ sel <- asks currentSelection+ throwError $ subfieldsNotSelected (selectionName sel) "" (selectionPosition sel)+ resolveRef :: ( MonadError GQLError m, MonadReader ResolverContext m@@ -127,10 +138,9 @@ ) => ResolverMap m -> ObjectTypeResolver m ->- SelectionSet VALID ->+ Maybe (SelectionSet VALID) -> m ValidValue-resolveObject rmap drv =- fmap Object . traverseCollection resolver+resolveObject rmap drv = fmap Object . maybe (pure empty) (traverseCollection resolver) where resolver currentSelection = do t <- askFieldTypeName (selectionName currentSelection)
src/Data/Morpheus/App/Internal/Resolving/RootResolverValue.hs view
@@ -89,7 +89,7 @@ selection = do root <- runResolverStateT (toResolverStateT res) ctx- runResolver channels (resolveObject mempty root selection) ctx+ runResolver channels (resolveObject mempty root (Just selection)) ctx runRootResolverValue :: Monad m => RootResolverValue e m -> ResolverContext -> ResponseStream e m (Value VALID) runRootResolverValue@@ -136,7 +136,7 @@ mergeRoot y x introspection :: Monad m => SelectionSet VALID -> ResolverContext -> ResponseStream event m ValidValue-introspection selection ctx@ResolverContext {schema} = runResolver Nothing (resolveObject mempty (schemaAPI schema) selection) ctx+introspection selection ctx@ResolverContext {schema} = runResolver Nothing (resolveObject mempty (schemaAPI schema) (Just selection)) ctx mergeRoot :: MonadError GQLError m => ValidValue -> ValidValue -> m ValidValue mergeRoot (Object x) (Object y) = Object <$> merge x y
test/api/validation/fragment/on-interface-inline/query.gql view
@@ -5,6 +5,7 @@ } } character {+ __typename ... on Character { name }
test/api/validation/fragment/on-interface-type-casting-inline/query.gql view
@@ -1,5 +1,6 @@ { character {+ __typename ... on Character { name }
test/api/validation/fragment/on-interface-type-casting/query.gql view
@@ -1,5 +1,6 @@ { character {+ __typename ...OnCharacter ...onDeity ...onHero
test/api/validation/fragment/on-interface/query.gql view
@@ -3,6 +3,7 @@ ...OnSupernatural } character {+ __typename ...OnCharacter } }
test/named-resolvers/entities/query.gql view
@@ -1,6 +1,7 @@ query { entities { ... on Realm {+ __typename name owner { name@@ -14,6 +15,7 @@ } } ... on Deity {+ __typename name power }
test/named-resolvers/entity-by-id/query.gql view
@@ -1,12 +1,14 @@ query { zeus: entity(id: "zeus") { ... on Deity {+ __typename name power } } olympus: entity(id: "olympus") { ... on Realm {+ __typename name owner { name
test/named-resolvers/entity-ext-by-id/query.gql view
@@ -1,12 +1,14 @@ query { zeus: entity(id: "zeus") { ... on Deity {+ __typename name power } } olympus: entity(id: "olympus") { ... on Realm {+ __typename name owner { name