packages feed

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 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 {