All Versions
30
Latest Version
Avg Release Cycle
16 days
Latest Release
-

Changelog History
Page 2

  • v0.10.0 Changes

    January 07, 2020

    ๐Ÿ’ฅ Breaking Changes

    • all constructors of Resolver: QueryResolver,MutResolver,SubResolver are unexposed. use lift , publish or subscribe. e.g
      -- Query Resolver
      resolveUser :: ResolveQ EVENT IO User
      resolveUser = lift getDBUser
    
      -- Mutation Resolver
      resolveCreateUser :: ResolveM EVENT IO User
      resolveCreateUser = do
        publish [userUpdate] -- publishes event inside mutation
        lift setDBUser
    
      -- Subscription Resolver
      resolveNewUser :: ResolveS EVENT IO User
      resolveNewUser = subscribe [USER] $ do
        pure $ \(Event _ content) -> lift (getDBUserByContent content)
    

    ๐Ÿ†• New features

    • ๐Ÿ”ฆ exposed publish for mutation resolvers, now you can write
      resolveCreateUser :: ResolveM EVENT IO User
      resolveCreateUser = do
          requireAuthorized
          publish [userUpdate]
          liftEither setDBUser
    
    • ๐Ÿ”ฆ exposed subscribe for subscription resolvers, now you can write
      resolveNewUser :: ResolveS EVENT IO User
      resolveNewUser = subscribe [USER] $ do
          requireAuthorized
          pure userByEvent
        where userByEvent (Event _ content) = liftEither (getDBUser content)
    
    • type SubField will convert your subscription monad to query monad. SubField (Resolver Subscription Event IO) User will generate same as Resolver Subscription Event IO (User ((Resolver QUERY Event IO)))

    now if you want define subscription as follows

      data Subscription m = Subscription {
        newUser :: SubField m User
      }
    
    • unsafeInternalContext to get resolver context, use only if it really necessary. the code depending on it may break even on minor version changes.
      resolveUser :: ResolveQ EVENT IO User
      resolveUser = do
        Context { currentSelection, schema, operation } <- unsafeInternalContext
        lift (getDBUser currentSelection)
    

    Minor

    • MonadIO instance for resolvers. Thanks @dandoh
    • Example using STM, authentication, monad transformers. Thanks @dandoh
    • โž• added dependency mtl
  • v0.9.2 Changes

    ๐Ÿ’ฅ Breaking Changes

    • all constructors of Resolver: QueryResolver,MutResolver,SubResolver are unexposed. use lift , publish or subscribe. e.g
      -- Query Resolver
      resolveUser :: ResolveQ EVENT IO User
      resolveUser = lift getDBUser
    
      -- Mutation Resolver
      resolveCreateUser :: ResolveM EVENT IO User
      resolveCreateUser = do
        publish [userUpdate] -- publishes event inside mutation
        lift setDBUser
    
      -- Subscription Resolver
      resolveNewUser :: ResolveS EVENT IO User
      resolveNewUser = subscribe [USER] $ do
        pure $ \(Event _ content) -> lift (getDBUserByContent content)
    

    ๐Ÿ†• New features

    • ๐Ÿ”ฆ exposed publish for mutation resolvers, now you can write
      resolveCreateUser :: ResolveM EVENT IO User
      resolveCreateUser = do
          requireAuthorized
          publish [userUpdate]
          liftEither setDBUser
    
    • ๐Ÿ”ฆ exposed subscribe for subscription resolvers, now you can write
      resolveNewUser :: ResolveS EVENT IO User
      resolveNewUser = subscribe [USER] $ do
          requireAuthorized
          pure userByEvent
        where userByEvent (Event _ content) = liftEither (getDBUser content)
    

    Minor

    • MonadIO instance for resolvers. Thanks @dandoh
    • Example using STM, authentication, monad transformers. Thanks @dandoh
    • โž• added dependency mtl
  • v0.9.1 Changes

    January 02, 2020
    • โœ‚ removed dependency mtl
    • MonadIO instance for resolvers. Thanks @dandoh
    • Example using STM, authentication, monad transformers. Thanks @dandoh
  • v0.9.0 Changes

    January 01, 2020

    โž• Added

    • WithOperation constraint for Generic Resolvers (#347) thanks @dandoh

    ๐Ÿ›  Fixed

    ๐Ÿ‘ liftEither support in MutResolver (#351)

    selection of __typename on object und union objects (#337)

    auto inferece of external types in gql document (#343)

    th will generate field m (Type m) if type has an argument

    e.g for this types and DSL

    data Type1 = Type1 { ... }type Type2 m = SomeType mdata Type3 m = Type2 { bla :: m Text } deriving ...
    
    type Query { field1 : Type1! field2 : Type2! field3 : Type3! }
    

    morpheus generates

    data Query m = Query {field1 :: m Type1field2 :: m (Type2 m) field3 :: m (Type3 m)} deriving ...
    

    now you can combine multiple gql documents:

    importDocumentWithNamespace `coreTypes.gql` importDocumentWithNamespace `operations.gql`
    

    ๐Ÿ”„ Changed

    ๐Ÿ‘Œ support of resolver fields m type for the fields without arguments

    data Diety m = Deity {name :: m Text}-- is equal todata Diety m = Deity {name :: () -\> m Text}
    

    template haskell generates m type insead of () -> m type for fields without argument (#334)

    data Diety m = Deity {name :: (Arrow () (m Text)), power :: (Arrow () (m (Maybe Text)))}-- changed todata Diety m = Deity {name :: m Text, power :: m (Maybe Text)}
    
  • v0.8.1 Changes

    ๐Ÿ›  Fixed

    • selection of __typename on object und union objects (#337)
    • auto inferece of external types in gql document (#343)

    th will generate field m (Type m) if type has an argument

    e.g for this types and DSL

      data Type1 = Type1 { ... }
      type Type2 m = SomeType m
      data Type3 m = Type2 { bla :: m Text } deriving ...
    
      type Query {
        field1 : Type1!
        field2 : Type2!
        field3 : Type3!
      }
    

    morpheus generates

      data Query m = Query {
        field1 :: m Type1
        field2 :: m (Type2 m)
        field3 :: m (Type3 m)
      } deriving ...
    

    now you can combine multiple gql documents:

      importDocumentWithNamespace `coreTypes.gql`
      importDocumentWithNamespace `operations.gql`
    

    ๐Ÿ”„ Changed

    • ๐Ÿ‘Œ support of resolver fields m type for the fields without arguments
      data Diety m = Deity {
          name :: m Text
      }
      -- is equal to
      data Diety m = Deity {
          name :: () -> m Text
      }
    
    • template haskell generates m type insead of () -> m type for fields without argument (#334)
      data Diety m = Deity {
          name :: (Arrow () (m Text)),
          power :: (Arrow () (m (Maybe Text)))
      }
      -- changed to
      data Diety m = Deity {
          name :: m Text,
          power :: m (Maybe Text)
      }
    
  • v0.8.0 Changes

    December 15, 2019

    ๐Ÿ”„ Changed

    ๐Ÿ—„ deprecated: INPUT_OBJECT, OBJECT, UNION,

    • use INPUT instead of INPUT_OBJECT

    - use deriving(GQLType) insead of OBJECT or UNION

    only namespaced Unions generate regular graphql Union, other attempts will be wrapped inside an object with constructor name :

    e.g:

    data Character =CharacterDeity DeitySomeDeity Deityderiving (GQLType)
    

    where Deity is Object.
    will generate

    union CHaracter = Deity | SomeDeitytype SomeDeity { \_0: Deity }
    

    โž• Added

    • failRes for resolver failures
    • โž• added kind: INPUT , OUTPUT
    • Automatic Type Inference (only for Object, Union and Enum)
    • More general stateful resolvers which accept instances of MonadIO (Authored by Sebastian Pulido [sebashack])
    • ๐ŸŒ Utility to create web-socket applications with custom MonadIO instances (Authored by Sebastian Pulido [sebashack])

      data Realm=Sky | Sea | Underworldderiving (Generic, GQLType)data Deity= Deity{fullName:: Text, realm:: Realm} deriving (Generic, GQLType)data Character=CharacterDeity Deity -- Only <tyconName><conName> should generate direct link-- RECORDS | Creature { creatureName :: Text, creatureAge :: Int }--- Types | SomeDeity Deity | CharacterInt Int | SomeMutli Int Text--- ENUMS | Zeus | Cronus deriving (Generic, GQLType)

    will generate schema:

    enum Realm { Sky Sea Underworld}type Deity { fullName: String!realm: Realm!}union Character = Deity | Creature | SomeDeity | CharacterInt | SomeMutli | CharacterEnumObjecttype Creature { creatureName: String!creatureAge: Int!}type SomeDeity { \_0: Deity!}type CharacterInt { \_0: Int!}type SomeMutli { \_0: Int!\_1: String!}# enumtype CharacterEnumObject { enum: CharacterEnum!}enum CharacterEnum { Zeus Cronus}
    

    rules:

    haskell union type with only empty constructors (e.g Realm), will generate graphql enum

    haskell record without union (e.g Deity), will generate graphql object

    namespaced Unions: CharacterDeity where Character is TypeConstructor and Deity referenced object (not scalar) type: will be generate regular graphql Union

    union Character = Deity | ...
    

    for union recrods (Creature { creatureName :: Text, creatureAge :: Int }) will be referenced in union type, plus type Creaturewill be added in schema.

    e.g

    union Character = ... | Creature | ... type Creature { creatureName : String! creatureAge: Int! }
    

    all empty constructors in union will be summed in type <tyConName>Enum (e.g CharacterEnum), this enum will be wrapped in CharacterEnumObject and this type will be added to union Character. as in example above

    there is only types left with form TypeName Type1 2Type ..(e.g SomeDeity Deity ,CharacterInt Int, SomeMutli Int Text),

    morpheus will generate objet type from it:

    type TypeName { \_0: Type1!\_1: Type2! ... }
    

    โœ‚ Removed

    • โœ‚ removed kind: INPUT_UNION

    ๐Ÿ›  Fixed

    • ๐Ÿ‘ป on filed resolver was displayed. unexhausted case exception of graphql error
    • ๐Ÿ‘Œ support of signed numbers (e.g -4)
    • ๐Ÿ‘Œ support of round floats (e.g 1.000)
    • validation checks undefined fields on inputObject
    • ๐Ÿ‘ variables are supported inside input values
  • v0.7.1 Changes

    November 26, 2019
    • ๐Ÿ“œ max bound includes: support-megaparsec-8.0
  • v0.7.0 Changes

    November 23, 2019

    โœ‚ Removed

    • toMorpheusHaskellAPi from Data.Morpheus.Document functionality will be migrated in morpheus-graphql-cli

    ๐Ÿ”„ Changed

    • liftM to MonadTrans instance method lift

    • liftEitherM to liftEither

    • Resolver operation m event value -> Resolver operation event m value , monad trans needs that last 2 type arguments are monad and value that why it was necessary

    • ๐Ÿ”ฆ exposed Data.Morpheus.Types.Internal.AST

    • Mutation Resolver was changed from

    resolver :: () -> ResolveM EVENT IO Address
    resolver = MutResolver  {
      mutEvents = [someEventForSubscription],
      mutResolver = lift setDBAddress
    }
    
    -- Mutation Wit Event Triggering : sends events to subscription
    resolver :: () -> ResolveM EVENT IO Address
    resolver = MutResolver \$ do
      value <- lift setDBAddress
      pure ([someEventForSubscription], value)
    -- or
    -- Mutation Without Event Triggering
    resolver :: () -> ResolveM EVENT IO Address
    resolver _args = lift setDBAddress
    

    โž• Added

    • โž• added parseDSL to Data.Morpheus.Document

    • ๐Ÿ‘ GraphQL SDL support fully supports descriptions: onTypes, fields , args ... with (enums, inputObjects , union, object) for example :

      """
      Description for Type Address
      """
      type Address {
        """
        Description for Field city
        """
        city: String!
        street(
          """
          Description argument id
          """
          id: ID!
        ): Int!
      }
    

    ###### GraphQL SDL

      type User {
        name: String! @deprecated(reason: "some reason")
      }
    

    will displayed in introspection

    ###### introspection.json

      {
        "data": {
          "__type": {
            "fields": [
              {
                "name": "city",
                "isDeprecated": true,
                "deprecationReason": "test deprecation field with reason"
              }
            ]
          }
        }
      }
    
    • ๐Ÿ—„ basic support of directive @deprecated on enumValue and object field, only on introspection

    • ๐Ÿ—„ GraphQL Client deprecation warnings

    on type

      type Human {
        humanName: String!
        lifetime: Lifetime! @deprecated(reason: "some reason")
        profession: Profession
      }
    

    compiler output:

      warning:
        Morpheus Client Warning:
        {
          "message":"the field \"Human.lifetime\" is deprecated. some reason",
          "locations":[{"line":24,"column":15}]
        }
    
    • ๐Ÿ†• new helper resolver types aliases:

      • ResolveQ : for Query
      • ResolveM : for Mutation
      • ResolveS : for Subscription

    ResolveM EVENT IO Address is same as MutRes EVENT IO (Address (MutRes EVENT IO))

    is helpfull wenn you want to resolve GraphQL object

    ๐Ÿ›  Fixed

    • โž• added missing Monad instance for Mutation resolver
    • defineByIntrospectionFile does not breaks if schema contains interfaces
    • ๐Ÿ‘ Morpheus Client supports Subscription and Mutationoperations
  • v0.6.2 Changes

    November 02, 2019

    โž• Added

    • ๐Ÿ‘Œ support of ghc 8.8.1
  • v0.6.0 Changes

    November 02, 2019

    โœ‚ Removed

    • โœ‚ removed morpheus cli for code generating, if you need cli you should use morpheus-graphql-cli

    • ๐Ÿ— example API executable is removed from Production build

    • ๐Ÿ—„ deprecated Data.Morpheus.Document.toGraphQLDocument

    โž• Added

    • helper functions: liftEitherM , liftM
        liftM :: m a -> Resolver o m e a
        liftEitherM :: m (Either String a) -> Resolver o m e a