morpheus-graphql 0.24.3 → 0.25.0
raw patch · 13 files changed
+99/−224 lines, 13 filesdep ~morpheus-graphql-appdep ~morpheus-graphql-code-gendep ~morpheus-graphql-corePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: morpheus-graphql-app, morpheus-graphql-code-gen, morpheus-graphql-core, morpheus-graphql-server, morpheus-graphql-subscriptions, morpheus-graphql-tests
API changes (from Hackage documentation)
- Data.Morpheus.Document: toGraphQLDocument :: RootResolverConstraint m event query mut sub => proxy (RootResolver m event query mut sub) -> ByteString
- Data.Morpheus.Kind: type ENUM = TYPE
- Data.Morpheus.Kind: type GQL_KIND = DerivingKind
- Data.Morpheus.Kind: type INPUT = TYPE
- Data.Morpheus.Kind: type INPUT_OBJECT = TYPE
- Data.Morpheus.Kind: type INTERFACE = TYPE
- Data.Morpheus.Kind: type OBJECT = TYPE
- Data.Morpheus.Kind: type OUTPUT = TYPE
- Data.Morpheus.Kind: type UNION = TYPE
- Data.Morpheus.Types: constMutRes :: Monad m => [e] -> a -> args -> ResolverM e m a
- Data.Morpheus.Types: constructorTagModifier :: GQLTypeOptions -> String -> String
- Data.Morpheus.Types: data GQLTypeOptions
- Data.Morpheus.Types: defaultTypeOptions :: GQLTypeOptions
- Data.Morpheus.Types: defaultValues :: GQLType a => f a -> Map Text (Value CONST)
- Data.Morpheus.Types: description :: GQLType a => f a -> Maybe Text
- Data.Morpheus.Types: dropNamespaceOptions :: TypeKind -> Text -> GQLTypeOptions -> GQLTypeOptions
- Data.Morpheus.Types: failRes :: (Monad m, WithOperation o) => String -> Resolver o e m a
- Data.Morpheus.Types: fieldLabelModifier :: GQLTypeOptions -> String -> String
- Data.Morpheus.Types: getDescriptions :: GQLType a => f a -> Map Text Description
- Data.Morpheus.Types: getDirectives :: GQLType a => f a -> Map Text (Directives CONST)
- Data.Morpheus.Types: type IOMutRes e = MutRes e IO
- Data.Morpheus.Types: type IORes e = Res e IO
- Data.Morpheus.Types: type IOSubRes e = SubRes e IO
- Data.Morpheus.Types: type MutRes = Resolver MUTATION
- Data.Morpheus.Types: type Res = Resolver QUERY
- Data.Morpheus.Types: type ResolveM e m a = ResolverM e m a
- Data.Morpheus.Types: type ResolveQ e m a = ResolverQ e m a
- Data.Morpheus.Types: type ResolveS e m a = ResolverS e m a
- Data.Morpheus.Types: type SubRes = Resolver SUBSCRIPTION
- Data.Morpheus.Types: typeNameModifier :: GQLTypeOptions -> Bool -> String -> String
- Data.Morpheus.Types: typeOptions :: GQLType a => f a -> GQLTypeOptions -> GQLTypeOptions
- Data.Morpheus.Types: unsafeInternalContext :: forall (m :: Type -> Type) (o :: OperationType) e. (Monad m, LiftOperation o) => Resolver o e m ResolverContext
+ Data.Morpheus.NamedResolvers: resolveBatched :: ResolveNamed m a => [Dep a] -> m [Maybe a]
+ Data.Morpheus.NamedResolvers: useBatched :: (ResolveNamed m a, MonadError GQLError m) => Dep a -> m a
+ Data.Morpheus.Types: DefaultValue :: Value CONST -> DefaultValue
+ Data.Morpheus.Types: [defaultValue] :: DefaultValue -> Value CONST
+ Data.Morpheus.Types: class Monad m => MonadError e (m :: Type -> Type) | m -> e
+ Data.Morpheus.Types: data GQLError
+ Data.Morpheus.Types: newtype DefaultValue
+ Data.Morpheus.Types: visitFieldDefaultValue :: VisitField a => a -> Maybe (Value CONST) -> Maybe (Value CONST)
Files
- morpheus-graphql.cabal +11/−11
- src/Data/Morpheus/Document.hs +2/−15
- src/Data/Morpheus/Kind.hs +6/−40
- src/Data/Morpheus/NamedResolvers.hs +2/−0
- src/Data/Morpheus/Types.hs +5/−81
- test/Feature/Input/DefaultValues.hs +2/−1
- test/Feature/NamedResolvers/Deities.hs +27/−23
- test/Feature/NamedResolvers/Entities.hs +13/−15
- test/Feature/NamedResolvers/Realms.hs +27/−30
- test/Feature/NamedResolvers/tests/deity-simple/response.json +1/−4
- test/Feature/NamedResolvers/tests/realm-simple/response.json +1/−3
- test/Rendering/Schema.hs +1/−0
- test/Rendering/schema.gql +1/−1
morpheus-graphql.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: morpheus-graphql-version: 0.24.3+version: 0.25.0 synopsis: Morpheus GraphQL description: Build GraphQL APIs with your favourite functional language! category: web, graphql@@ -258,10 +258,10 @@ , base >=4.7.0 && <5.0.0 , bytestring >=0.10.4 && <0.12.0 , containers >=0.4.2.1 && <0.7.0- , morpheus-graphql-app >=0.24.0 && <0.25.0- , morpheus-graphql-code-gen >=0.24.0 && <0.25.0- , morpheus-graphql-core >=0.24.0 && <0.25.0- , morpheus-graphql-server >=0.24.0 && <0.25.0+ , morpheus-graphql-app >=0.25.0 && <0.26.0+ , morpheus-graphql-code-gen >=0.25.0 && <0.26.0+ , morpheus-graphql-core >=0.25.0 && <0.26.0+ , morpheus-graphql-server >=0.25.0 && <0.26.0 , mtl >=2.0.0 && <3.0.0 , relude >=0.3.0 && <2.0.0 , template-haskell >=2.0.0 && <3.0.0@@ -298,12 +298,12 @@ , bytestring >=0.10.4 && <0.12.0 , containers >=0.4.2.1 && <0.7.0 , morpheus-graphql- , morpheus-graphql-app >=0.24.0 && <0.25.0- , morpheus-graphql-code-gen >=0.24.0 && <0.25.0- , morpheus-graphql-core >=0.24.0 && <0.25.0- , morpheus-graphql-server >=0.24.0 && <0.25.0- , morpheus-graphql-subscriptions >=0.24.0 && <0.25.0- , morpheus-graphql-tests >=0.24.0 && <0.25.0+ , morpheus-graphql-app >=0.25.0 && <0.26.0+ , morpheus-graphql-code-gen >=0.25.0 && <0.26.0+ , morpheus-graphql-core >=0.25.0 && <0.26.0+ , morpheus-graphql-server >=0.25.0 && <0.26.0+ , morpheus-graphql-subscriptions >=0.25.0 && <0.26.0+ , morpheus-graphql-tests >=0.25.0 && <0.26.0 , mtl >=2.0.0 && <3.0.0 , relude >=0.3.0 && <2.0.0 , tasty >=0.1.0 && <1.5.0
src/Data/Morpheus/Document.hs view
@@ -2,25 +2,19 @@ {-# LANGUAGE NoImplicitPrelude #-} module Data.Morpheus.Document- ( toGraphQLDocument,- gqlDocument,+ ( gqlDocument, importGQLDocument, importGQLDocumentWithNamespace, RootResolverConstraint, ) where -import Data.ByteString.Lazy.Char8 (ByteString) import Data.Morpheus.CodeGen.Server ( CodeGenConfig (..), gqlDocument, importServerTypeDefinitions, )-import Data.Morpheus.Server- ( RootResolverConstraint,- printSchema,- )-import Data.Morpheus.Types (RootResolver)+import Data.Morpheus.Server (RootResolverConstraint) import Language.Haskell.TH import Relude hiding (ByteString, readFile) @@ -29,10 +23,3 @@ importGQLDocumentWithNamespace :: FilePath -> Q [Dec] importGQLDocumentWithNamespace = importServerTypeDefinitions CodeGenConfig {namespace = True}--{-# DEPRECATED toGraphQLDocument "use Data.Morpheus.Server.printSchema" #-}-toGraphQLDocument ::- RootResolverConstraint m event query mut sub =>- proxy (RootResolver m event query mut sub) ->- ByteString-toGraphQLDocument = printSchema
src/Data/Morpheus/Kind.hs view
@@ -6,51 +6,17 @@ -- | associating types to GraphQL Kinds module Data.Morpheus.Kind ( SCALAR,- OBJECT,- ENUM, WRAPPER,- UNION,- INPUT_OBJECT, DerivingKind (..),- GQL_KIND,- OUTPUT,- INPUT,- INTERFACE, TYPE, CUSTOM, ) where import Data.Morpheus.Server.Types--{-# DEPRECATED GQL_KIND "use: DerivingKind" #-}--type GQL_KIND = DerivingKind--{-# DEPRECATED INTERFACE "use: deriving(GQLType), will be automatically inferred" #-}--type INTERFACE = TYPE--{-# DEPRECATED ENUM "use: deriving(GQLType), will be automatically inferred" #-}--type ENUM = TYPE--{-# DEPRECATED OUTPUT "use: deriving(GQLType), will be automatically inferred" #-}--type OUTPUT = TYPE--{-# DEPRECATED INPUT "use: deriving(GQLType), will be automatically inferred" #-}--type INPUT = TYPE--{-# DEPRECATED INPUT_OBJECT "use: deriving(GQLType), will be automatically inferred" #-}--type INPUT_OBJECT = TYPE--{-# DEPRECATED UNION "use: deriving(GQLType), IMPORTANT: only types with <type constructor name><constructor name> will sustain their form, other union constructors will be wrapped inside an new object" #-}--type UNION = TYPE--{-# DEPRECATED OBJECT "use: deriving(GQLType), will be automatically inferred" #-}--type OBJECT = TYPE+ ( CUSTOM,+ DerivingKind (..),+ SCALAR,+ TYPE,+ WRAPPER,+ )
src/Data/Morpheus/NamedResolvers.hs view
@@ -2,6 +2,7 @@ ( ResolveNamed (..), NamedResolverT (..), resolve,+ useBatched, ) where @@ -9,4 +10,5 @@ ( NamedResolverT (..), ResolveNamed (..), resolve,+ useBatched, )
src/Data/Morpheus/Types.hs view
@@ -3,15 +3,7 @@ -- | GQL Types module Data.Morpheus.Types- ( GQLType- ( KIND,- description,- getDescriptions,- typeOptions,- getDirectives,- defaultValues,- directives- ),+ ( GQLType (..), EncodeScalar (..), EncodeWrapper (..), DecodeScalar (..),@@ -22,7 +14,6 @@ ScalarValue (..), RootResolver (..), constRes,- constMutRes, Undefined, Resolver, QUERY,@@ -30,26 +21,15 @@ SUBSCRIPTION, lift, liftEither,- failRes, WithOperation, publish, subscribe,- unsafeInternalContext, ResolverContext (..), ResolverO, ComposedResolver, ResolverQ, ResolverM, ResolverS,- ResolveQ,- ResolveM,- ResolveS,- Res,- MutRes,- SubRes,- IORes,- IOMutRes,- IOSubRes, SubscriptionField, App, RenderGQL,@@ -59,11 +39,6 @@ NamedResolvers (..), -- * GQLType naming configuration- GQLTypeOptions,- defaultTypeOptions,- fieldLabelModifier,- constructorTagModifier,- typeNameModifier, defaultRootResolver, -- * GQL directives API@@ -79,9 +54,11 @@ -- * default GQL directives GQLDirective (..), Deprecated (..),- dropNamespaceOptions, DropNamespace (..), Rename (..),+ DefaultValue (..),+ GQLError,+ MonadError, ) where @@ -92,6 +69,7 @@ Arg (..), DecodeScalar (..), DecodeWrapper (..),+ DefaultValue (..), Deprecated (..), Describe (..), DropNamespace (..),@@ -101,7 +79,6 @@ GQLRequest (..), GQLResponse (..), GQLType (..),- GQLTypeOptions (..), ID (..), MUTATION, Prefixes (..),@@ -119,67 +96,14 @@ VisitField (..), VisitType (..), WithOperation,- defaultTypeOptions,- dropNamespaceOptions, enumDirective, fieldDirective, render, subscribe, typeDirective,- unsafeInternalContext, ) import Data.Morpheus.Types.Internal.AST (GQLError) import Relude hiding (Undefined)--{-# DEPRECATED Res "use ResolverQ" #-}--type Res = Resolver QUERY--{-# DEPRECATED MutRes "use ResolverM" #-}--type MutRes = Resolver MUTATION--{-# DEPRECATED SubRes "use ResolverS" #-}--type SubRes = Resolver SUBSCRIPTION--{-# DEPRECATED IORes "use ResolverQ" #-}--type IORes e = Res e IO--{-# DEPRECATED IOMutRes "use ResolverM" #-}--type IOMutRes e = MutRes e IO--{-# DEPRECATED IOSubRes "use ResolverS" #-}--type IOSubRes e = SubRes e IO--{-# DEPRECATED ResolveQ "use ResolverQ" #-}--type ResolveQ e m a = ResolverQ e m a--{-# DEPRECATED ResolveM "use ResolverM" #-}--type ResolveM e m a = ResolverM e m a--{-# DEPRECATED ResolveS "use ResolverS" #-}--type ResolveS e m a = ResolverS e m a--constMutRes :: Monad m => [e] -> a -> args -> ResolverM e m a-constMutRes events v = const $ do- publish events- pure v--{-# DEPRECATED failRes "use \"fail\" from \"MonadFail\"" #-}-failRes ::- ( Monad m,- WithOperation o- ) =>- String ->- Resolver o e m a-failRes = fail liftEither :: (MonadTrans t, Monad (t m), MonadError GQLError (t m)) => Monad m => m (Either String a) -> t m a liftEither x = lift x >>= either (throwError . fromString) pure
test/Feature/Input/DefaultValues.hs view
@@ -19,7 +19,8 @@ import Data.Morpheus (interpreter) import Data.Morpheus.Document (importGQLDocument) import Data.Morpheus.Types- ( GQLRequest,+ ( DefaultValue (..),+ GQLRequest, GQLResponse, ID (..), RootResolver (..),
test/Feature/NamedResolvers/Deities.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-}@@ -13,6 +14,7 @@ ) where +import Control.Monad.Except import Data.Morpheus (deriveApp) import Data.Morpheus.Document ( importGQLDocument,@@ -21,10 +23,12 @@ ( NamedResolverT, ResolveNamed (..), resolve,+ useBatched, ) import Data.Morpheus.Types ( App, Arg (..),+ GQLError, ID, NamedResolvers (..), Undefined,@@ -33,35 +37,39 @@ importGQLDocument "test/Feature/NamedResolvers/deities.gql" -instance Monad m => ResolveNamed m Power where- type Dep Power = ID- resolveNamed "sp" = pure Shapeshifting- resolveNamed _ = pure Thunderbolt+getPower :: (Eq a, IsString a, Applicative f) => a -> f Power+getPower "sp" = pure Shapeshifting+getPower _ = pure Thunderbolt -instance Monad m => ResolveNamed m (Deity (NamedResolverT m)) where- type Dep (Deity (NamedResolverT m)) = ID- resolveNamed "zeus" =- pure+getDeity :: (Eq a, Monad m, Applicative f, IsString a) => a -> f (Maybe (Deity (NamedResolverT m)))+getDeity "zeus" =+ pure $+ Just Deity { name = resolve (pure "Zeus"), power = resolve (pure ["tb"]) }- resolveNamed "morpheus" =- pure+getDeity "morpheus" =+ pure $+ Just Deity { name = resolve (pure "Morpheus"), power = resolve (pure ["sp"]) }- resolveNamed _ =- pure- Deity- { name = resolve (pure "Unknown"),- power = resolve (pure [])- }+getDeity _ = pure Nothing -instance Monad m => ResolveNamed m (Query (NamedResolverT m)) where+instance Monad m => ResolveNamed m Power where+ type Dep Power = ID+ resolveNamed = getPower++instance MonadError GQLError m => ResolveNamed m (Deity (NamedResolverT m)) where+ type Dep (Deity (NamedResolverT m)) = ID+ resolveBatched = traverse getDeity+ resolveNamed = useBatched++instance MonadError GQLError m => ResolveNamed m (Query (NamedResolverT m)) where type Dep (Query (NamedResolverT m)) = ()- resolveNamed () =+ resolveNamed _ = pure Query { deity = \(Arg uid) -> resolve (pure (Just uid)),@@ -69,8 +77,4 @@ } deitiesApp :: App () IO-deitiesApp =- deriveApp- ( NamedResolvers ::- NamedResolvers IO () Query Undefined Undefined- )+deitiesApp = deriveApp (NamedResolvers :: NamedResolvers IO () Query Undefined Undefined)
test/Feature/NamedResolvers/Entities.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-}@@ -11,6 +12,7 @@ ) where +import Control.Monad.Except import Data.Morpheus (deriveApp) import Data.Morpheus.NamedResolvers ( NamedResolverT,@@ -20,6 +22,7 @@ import Data.Morpheus.Types ( App, Arg (..),+ GQLError, GQLType (..), ID, NamedResolvers (..),@@ -37,11 +40,14 @@ GQLType ) -instance Monad m => ResolveNamed m (Entity (NamedResolverT m)) where+getEntity :: (MonadError GQLError m) => ID -> m (Entity (NamedResolverT m))+getEntity "zeus" = pure $ EntityDeity (resolve $ pure "zeus")+getEntity "morpheus" = pure $ EntityDeity (resolve $ pure "morpheus")+getEntity x = pure $ EntityRealm (resolve $ pure x)++instance (MonadError GQLError m) => ResolveNamed m (Entity (NamedResolverT m)) where type Dep (Entity (NamedResolverT m)) = ID- resolveNamed "zeus" = pure $ EntityDeity (resolve $ pure "zeus")- resolveNamed "morpheus" = pure $ EntityDeity (resolve $ pure "morpheus")- resolveNamed x = pure $ EntityRealm (resolve $ pure x)+ resolveNamed = getEntity -- QUERY data Query m = Query@@ -53,20 +59,12 @@ GQLType ) -instance Monad m => ResolveNamed m (Query (NamedResolverT m)) where+instance MonadError GQLError m => ResolveNamed m (Query (NamedResolverT m)) where type Dep (Query (NamedResolverT m)) = ()- resolveNamed () =+ resolveNamed _ = pure Query- { entities =- resolve- ( pure- [ "zeus",- "morpheus",- "olympus",- "dreams"- ]- ),+ { entities = resolve (pure ["zeus", "morpheus", "olympus", "dreams"]), entity = \(Arg uid) -> resolve (pure (Just uid)) }
test/Feature/NamedResolvers/Realms.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-}@@ -14,6 +15,7 @@ ) where +import Control.Monad.Except import Data.Morpheus ( deriveApp, )@@ -24,10 +26,12 @@ ( NamedResolverT, ResolveNamed (..), resolve,+ useBatched, ) import Data.Morpheus.Types ( App, Arg (..),+ GQLError, ID, NamedResolvers (..), Undefined,@@ -36,48 +40,41 @@ importGQLDocument "test/Feature/NamedResolvers/realms.gql" -instance Monad m => ResolveNamed m (Realm (NamedResolverT m)) where- type Dep (Realm (NamedResolverT m)) = ID- resolveNamed "olympus" =- pure+getRealm :: (MonadError GQLError m) => ID -> m (Maybe (Realm (NamedResolverT m)))+getRealm "olympus" =+ pure $+ Just Realm { name = resolve (pure "Mount Olympus"), owner = resolve (pure "zeus") }- resolveNamed "dreams" =- pure+getRealm "dreams" =+ pure $+ Just Realm { name = resolve (pure "Fictional world of dreams"), owner = resolve (pure "morpheus") }- resolveNamed _ =- pure- Realm- { name = resolve (pure "Unknown"),- owner = resolve (pure "none")- }+getRealm _ = pure Nothing -instance Monad m => ResolveNamed m (Deity (NamedResolverT m)) where+instance MonadError GQLError m => ResolveNamed m (Realm (NamedResolverT m)) where+ type Dep (Realm (NamedResolverT m)) = ID+ resolveBatched = traverse getRealm+ resolveNamed = useBatched++instance (MonadError GQLError m) => ResolveNamed m (Deity (NamedResolverT m)) where type Dep (Deity (NamedResolverT m)) = ID- resolveNamed "zeus" =- pure- Deity- { realm = resolve (pure "olympus")- }- resolveNamed "morpheus" =- pure- Deity- { realm = resolve (pure "dreams")- }- resolveNamed x =- pure- Deity- { realm = resolve (pure x)- }+ resolveBatched = traverse getDeity+ resolveNamed = useBatched -instance Monad m => ResolveNamed m (Query (NamedResolverT m)) where+getDeity :: (MonadError GQLError m) => ID -> m (Maybe (Deity (NamedResolverT m)))+getDeity "zeus" = pure $ Just Deity {realm = resolve (pure "olympus")}+getDeity "morpheus" = pure $ Just Deity {realm = resolve (pure "dreams")}+getDeity _ = pure Nothing++instance MonadError GQLError m => ResolveNamed m (Query (NamedResolverT m)) where type Dep (Query (NamedResolverT m)) = ()- resolveNamed () =+ resolveNamed _ = pure Query { realm = \(Arg arg) -> resolve (pure (Just arg)),
test/Feature/NamedResolvers/tests/deity-simple/response.json view
@@ -1,8 +1,5 @@ { "data": {- "deity": {- "name": "Unknown",- "power": []- }+ "deity": null } }
test/Feature/NamedResolvers/tests/realm-simple/response.json view
@@ -1,7 +1,5 @@ { "data": {- "realm": {- "name": "Unknown"- }+ "realm": null } }
test/Rendering/Schema.hs view
@@ -22,6 +22,7 @@ ) import Data.Morpheus.Types ( DecodeScalar (..),+ DefaultValue (..), DropNamespace (..), ID, Rename (..),
test/Rendering/schema.gql view
@@ -20,7 +20,7 @@ input Coordinates @TestDirective(name: "SomeName") { latitude: TestScalar!- longitude: Int! @TestDirective(name: "SomeName")+ longitude: Int! = 4 @TestDirective(name: "SomeName") } type Address {