Changelog History
Page 2
-
v0.10.0 Changes
January 07, 2020๐ฅ Breaking Changes
- all constructors of
Resolver
:QueryResolver
,MutResolver
,SubResolver
are unexposed. uselift
,publish
orsubscribe
. 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 asResolver 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
- all constructors of
-
v0.9.2 Changes
๐ฅ Breaking Changes
- all constructors of
Resolver
:QueryResolver
,MutResolver
,SubResolver
are unexposed. uselift
,publish
orsubscribe
. 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
- all constructors of
-
v0.9.1 Changes
January 02, 2020- โ removed dependency
mtl
- MonadIO instance for resolvers. Thanks @dandoh
- Example using STM, authentication, monad transformers. Thanks @dandoh
- โ removed dependency
-
v0.9.0 Changes
January 01, 2020โ Added
๐ 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 argumente.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 argumentsdata 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 argumente.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) }
- selection of
-
v0.8.0 Changes
December 15, 2019๐ Changed
๐ deprecated:
INPUT_OBJECT
,OBJECT
,UNION
,- use
INPUT
instead ofINPUT_OBJECT
- use
deriving(GQLType)
insead ofOBJECT
orUNION
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 generateunion 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 graphqlenum
haskell record without union (e.g
Deity
), will generate graphqlobject
namespaced Unions:
CharacterDeity
whereCharacter
is TypeConstructor andDeity
referenced object (not scalar) type: will be generate regular graphql Unionunion Character = Deity | ...
for union recrods (
Creature { creatureName :: Text, creatureAge :: Int }
) will be referenced in union type, plus typeCreature
will 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.gCharacterEnum
), this enum will be wrapped inCharacterEnumObject
and this type will be added to unionCharacter
. as in example abovethere is only types left with form
TypeName Type1 2Type ..
(e.gSomeDeity 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
- use
-
v0.7.1 Changes
November 26, 2019- ๐ max bound includes: support-megaparsec-8.0
-
v0.7.0 Changes
November 23, 2019โ Removed
toMorpheusHaskellAPi
fromData.Morpheus.Document
functionality will be migrated inmorpheus-graphql-cli
๐ Changed
liftM
toMonadTrans
instance methodlift
liftEitherM
toliftEither
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
toData.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
onenumValue
and objectfield
, 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 asMutRes 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
andMutation
operations
-
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