- Initial release
- Introduced intermediate representation of GraphQL operation execution.
- Introduced ability to convert GraphQL query to LINQ.
- Replaced current asynchronous API resolver internals.
- Ability to use records as complex input variables.
- Minor bugfixes and performance optimizations.
- Introduced a sample for GraphQL over WebSocket Protocol
- Introduced support for Stream and Defer directives
- Minor bugfixes.
- Introduced support for middlewares in the execution pipeline.
- Introduced new package, named FSharp.Data.GraphQL.Server.Middleware, with generic, built-in middlewares.
- Introduced QueryWeightMiddleware, a generic execution middleware to measure query complexity and optionally block query execution with a threshold.
- Introduced ObjectListFilterMiddleware, a generic schema compile middleware to add filter options to list fields of specific objects.
- Changed GQLResponse object to be a Record, which supports a Metadata bag object, that can be used to hold custom information per query request.
- Changed FieldDef interface to be able to support a Metadata bag object, that can be used to hold custom information per field.
- ISchema TypeMap is now a mutable object, to ease schema customization through schema compile middlewares.
- Fixing many minor errors when deferring or streaming results with Union and Enum types (especially when queried using fragments).
- Deferred and streamed error results now are handled.
- Added support for nested deferred and streamed results (currently does have a maximum degree of two nested operations).
- Fix package dependency versions
- Upgraded dependencies on Newtonsoft.Json to the latest version.
- Changing subscription field definitions to have a generic output type - the output is not required to be a GraphQL type anymore.
- Implemented experimental support for @live directive, through a subscription system.
- Fixed a bug that caused an exception when ToString function is called on an empty NameValueLookup.
- Added support for asynchronous subscription field definitions.
- Fixes for introspection query
- Use string identifier to publish to subscription
- Breaking Change: Async Pub/Sub methods for subscription and live directive handler interfaces
- Add Long Scalar definition
- Add subscription field to introspection schema
- Add subscription field to introspection schema
- Fixed a bug where output def of a subscription field was not reachable for introspection.
- Deferred and Streamed results now return their fields in the direct result as well. The value of those fields will be an empty list or null.
- Live results now send the immediate result in the direct result, instead of the deferred result.
- Deferred and Streamed results fixes for GQL interfaces.
- Deferred and Streamed results fixes for GQL interfaces when at the top-level of query.
- Breaking Change The
ISubscriptionProviderinterface now has additional methods to publish to subscriptions by tag. - Breaking Change Renamed interface methods in
ISubscriptionProviderfrom XxAsync to AsyncXx to reserve the former for TPL extensions. - Fixes for stream and defer execution.
- Execute deferred results in parallel.
- Fix dispose of deferred/stream responses.
- Breaking Change New type provider API! see samples/client-provider for details.
- Fixes for #216 enum as a variable.
- Upgraded paket and dependencies.
- Breaking Change GraphQLProvider now makes Nullable GraphQL inputs optional method arguments instead of options
- Breaking Change GraphQLProvider uses the operation name as the generated operation type's names. if no operation name is specified it uses "Operation" + the query string's hash
- Make the type provider cross-targeting
- Breaking Change Add postcompile phase to middleware interface
- Breaking Change GraphQLProvider record types constructors now receive option arguments as optional arguments
- Revision on scalar types parsing - fixed some wrong behaviors such as parsing ints as floats
- Fixing a bug when converting variable types to variables json in a query
- Fixing a bug when parsing json objects with no fields in serialization
- Changing constructors of provided types to have overloads instead of optional parameters (needed because of a limitation of the Type Provider SDK)
- Adding support for field aliases
- Operation result errors and custom data now are provided as their respective types instead of options (
Operation Error []andMap<string, obj>)
- Minor bug fixes
- Fixing an error on overload constructor definition
- Performance improvements
- Fixing dependency issue on Server component
- Fixing a wrong cast for System.Uri type
- Adding support for file uploads through GraphQL Multipart Request Spec
- Changing variable parameters of Run/AsyncRun methods to work as overloaded methods instead of one having optional parameters
- Minor bug fixes
- Changing the internal client of the Type provider (
System.Net.Http.HttpClient) - Fixing several minor bugs of the file upload system in the client provider
- Limiting the upload type of the client provider to be a scalar type (provider fails if it is not)
- If an upload type is specified and it is not used in a query, client provider defaults to standard HTTP protocol instead of the multipart request
- Implementing a validation system for queries based on the GraphQL Spec
- Making validation mandatory on the server component
- Implemented a cache system for query validation on both server and client components
- Client component can optionally disable query validation
- Updating parser to support unnamed operations alongside shorthand queries
- Adding null value support for the AST Input Values (it was previously parsed as an Enum Value)
- Breaking Change Renaming
FSharp.Data.GraphQL.Server.Middlewarespackage toFSharp.Data.GraphQL.Server.Middleware
- Adjusting package dependencies (
FParsec,System.Net.Http, andFSharp.Data.GraphQL.Serverare not locked anymore)
- fixed false positive validation errors related to variable usage.
- Correct printing of queries without names
- Correct printing of ListValue and ObjectValue
- Traverse list values in argument lists
- Added test cases for object inputs for GraphQL functions
- TypeProvider now treats custom scalars as strings
- The Guid scalar was mapped to a DateTime
- Support opening static classes
- Add additional case in client to support failed requests that don't return a path.
- TypeProvider accepts IHttpClientFactory as input
- Add static TypeProvider parameter
explicitOptionalParameters.
- Remove Desktop build
- Update documentation and build tools
- Upgrade build scripts
- Migrate from netcoreapp2.0 to net5.0 for tests and samples
- Target netstandard2.0 exclusively for Type Providers
- Make FSharp.Data.GraphQL.Shared a NuGet package
- Fix parser bug. Thanks to @njlr
- Breaking Change Migrated to .NET 6/7 and F# 7
- Breaking Change Implemented GraphQL error handling using
IGQLErrorinterface instead of exceptions - Breaking Change Implemented parsing variables as
JsonElement - Breaking Change Added
Typesuffix to all built-in GraphQL type definitions - New Package
FSharp.Data.GraphQL.Server.AspNetCorefor ASP.NET Core integration - Migrated from Paket and FAKE CLI to FAKE build project
- Added
PathtoResolveFieldContext - Added ability to deprecate fields defined with any combination of parameters (more overloads to the
Definestatic class) - Added support of
Optionvariable values for nullable input types - Added mapping of input query/AST lists to .NET array type in addition to F# list
- Added input object validation with detailed error messages
- Added
Define.WrappedScalarfor value object scalar definitions - Added coercion of nested input objects
- Added support for
ValueOptioninAutoField - Improved WebSocket handling to eliminate large array allocations
- Fixed nullable enum input handling
- Fixed coercing enum type variables as F# discriminated unions
- Fixed various introspection and default value encoding issues
- Improved server exception logging by including exception in log message
- Documentation and README improvements
- Improved
AddGraphQLOptions - Added Altair and GraphiQL to sample projects
- Fixed
JsonSerializerOptionsread-only instance error
- Breaking Change Migrated to .NET 8 and F# 9.0 with
FSharp.Core9.0.x - Breaking Change Updated scalar
CoerceOutputsignature toobjnull -> 'Primitive option - Breaking Change Moved GraphQL error extensions to standard
extensionsfield according to specification - Breaking Change Renamed
ObjectListFiltertype definition toObjectListFilterType - Breaking Change Removed
ObjectListFilter.NoFiltercase - Breaking Change Reworked Relay types to enable async fetching and switched to
ValueOption - Breaking Change
Giraffeweb framework integration moved to separate package - New Package
FSharp.Data.GraphQL.Server.Giraffefor Giraffe web framework integration - New Package
FSharp.Data.GraphQL.Server.Oxpeckerfor Oxpecker web framework integration - Removed unused Suave NuGet package
- Added
Oxpeckerweb framework support - Added per-field authorization sample using ASP.NET authorization policies
- Added file upload support via GraphQL Multipart Request Spec with
FileDatatype - Added
OfTypesfilter case forObjectListFilterto filter union cases by type - Added
ObjectListFiltervalue parsing from variables in addition to supported inline value - Added
ObjectListFiltervalue parsing from inline object with variables - Added
ObjectListFilteradditional operators (In,Contains,StartsWith,EndsWith) - Added
StructNullableto supportValueOptionfields in input objects - Added case-insensitive input object fields and constructor parameters matching
- Added ability to recognize if an input field is null or not present at all
- Added ability to add errors to resolved fields
- Added
FieldDef<'Val, 'Res>type to support resolver-changing middlewares - Added GraphQL extensions support via
GQLMessageException - Added more overloads to
AddGraphQLOptionsincluding additional converters - Added support for optional properties usage in non-Enumerable LINQ queries
- Fixed
IDtype deserialization - Fixed
ObjectListFilterContainsandInoperators implementation for collections - Fixed generation of discriminator comparing expressions to be translatable to database queries
- Fixed
IInputExecutionContextresolution - Fixed
graphql-transport-wsWebSocket implementation - Fixed ability to override
GraphQLRequestHandler<'Root> - Fixed input object CLR property type validation against GraphQL scalar definitions
- Migrated all solutions to SLNX format
- Various performance optimizations and bug fixes
- Added
TimeOnlyGraphQL type - Added
mapfunction for RelayConnectionandEdgetypes - Excluded
GraphQLWebSocketMiddlewarefrom exception stack trace if request not a Web Socket - Changed
GraphQLOptionsDefaults.WebSocketConnectionInitTimeoutInMsconst type todouble - Improved Relay XML documentation comments
- Fixed planning phase crash when inline fragments reference types not included in union or interface definitions
- Fixed GraphQL client provider handling for schema types that reuse reserved scalar names such as
Date, so introspection kind now takes precedence over built-in scalar mappings.
- Breaking Change Migrated to .NET 10
- Breaking Change Made Relay
Edgea read-only struct - Breaking Change
SubscriptionExecutionResult.Datais nowobj voption Skippable, and the record has newPathandHasNextfields for incremental delivery - Breaking Change
BufferedStreamOptions.IntervalandBufferedStreamOptions.PreferredBatchSizeare nowint voption - Breaking Change
ServerMessage.ErrorandServerRawPayload.ErrorMessagesnow carryGQLProblemDetails listinstead ofNameValueLookup list, so anerrormessage'spayloadis a standard GraphQL error array as thegraphql-transport-wsprotocol requires - Breaking Change A query or mutation whose non-null root field fails during execution now produces a
Direct(execution) result withnulldata instead of aRequestError, which is now only ever produced for a request rejected before execution (validation, planning, variable or inline argument coercion, a middleware, or the executor itself failing); HTTP andgraphql-transport-wsresponses for such a failure now carrydata: nullas the spec requires, instead of omittingdataentirely. This also changes the publicGQLResponse.Data,GQLResponseContent.Direct.Data,DeferredErrors.Data, andSubscriptionErrors.Datasignatures to usevoption - Added case-insensitive string comparison support to
ObjectListFilter, including comparer-aware filter cases and GraphQL filter suffix handling - Improved Relay XML documentation comments
- Changed query planning to throw
MalformedGQLQueryExceptionfor invalid queries,NotSupportedExceptionfor unsupported type definition implementations andInvalidOperationExceptionfor internal planning errors instead ofSystem.Exception, with messages naming the affected field, type and execution kind - Added
Define.TaskSeqFieldfor list fields resolved fromIAsyncEnumerable<'T>, such astaskSeq { }or Azure SDKAsyncPageable<T>. Without directives the sequence is enumerated into a list,@deferdelivers the whole list, and@streamdelivers every item as soon as it is produced and its fields are resolved - Added cancellation of a streamed
Define.TaskSeqFieldenumeration when the client unsubscribes, and delivery of a failure raised acquiring the sequence's enumerator, while enumerating, or disposing it, as a deferred error for the field, after every item already pulled has been resolved and delivered, so a slower item can never be overtaken by the error that follows it; an item resolution that throws stops the enumeration and is delivered the same way, while an item whose own fields fail is delivered as that item's deferred errors and streaming continues, exactly as for@streamon an ordinary list; a concurrency slot is never leaked even if delivering an item's result fails - Added
maxConcurrencytoDefine.TaskSeqField, bounding how many items of a streamed sequence are pulled and resolved at the same time; defaults toEnvironment.ProcessorCount - Added
StreamBatchingto group streamed items of aDefine.TaskSeqFieldinto batches of a fixed size or of a size computed from the sequence, such as a page size kept with a paged SDK sequence. ThepreferredBatchSizeargument of@streamtakes precedence, and the batching function itself is evaluated lazily, only for a@streamquery that does not supply its ownpreferredBatchSize - Added
Microsoft.Bcl.AsyncInterfacesdependency ofFSharp.Data.GraphQL.Sharedfornetstandard2.0 - Added
Human.friendsStreamfield to the Star Wars sample to demonstrate@stream - Fixed a query or mutation whose root field has an invalid inline (literal) argument, such as a custom input object validator failing, being reported as a
Directresult withnulldata instead of aRequestError; inline argument coercion is now checked for every root field before any of them execute, the same as variable coercion, so a mutation no longer executes earlier root fields before rejecting the request over a later one's invalid argument - Fixed
Define.TaskSeqFieldstreaming retaining a task for every item already delivered until the sequence ends - Fixed
graphql-transport-wsdelivery of@deferand@streamresults, which are now sent as soon as they are produced withpathandhasNextinstead of after a fixed 5 second delay, followed by a final payload withhasNext: false - Fixed
graphql-transport-wsfailure on deferred and streamed results that are not objects, such as streamed list items and scalars - Fixed
graphql-transport-wsdropping errors of the initial payload of a deferred result together with all its deferred results - Fixed
graphql-transport-wsdiscarding the partialdataof a subscription result that also had field errors, sendingnullinstead - Fixed
graphql-transport-wsdiscarding the field errors of aDirect(non-subscription) result, sending an empty error list instead - Fixed
graphql-transport-wsstranding a subscription id forever when its deferred result completed synchronously, before it was registered - Fixed
graphql-transport-wsleaving a subscription id occupied when subscribing to its result failed synchronously - Fixed
graphql-transport-wsaddressing a batch of streamed items (grouped bypreferredBatchSizeorStreamBatching) with apathending in the list of the batch's own indices, such as["numbers", [0, 1]], which no client can merge into the response tree; a batch is now sent as one independently addressed payload per item instead, in the batch's own order - Fixed
graphql-transport-wsnever sendingcompleteafter thenextof a query or mutation result, as the protocol requires - Fixed
graphql-transport-wssending a request error (rejected before execution: validation, planning, variable coercion, a middleware, or the executor itself failing) as anextresult followed bycomplete, instead of the terminalerrormessage the protocol requires for it; a query or mutation whose non-null root field fails during execution still getsnext+complete, since it is a result, not a request error - Fixed
graphql-transport-wsthrowing while serializing anerrormessage or apongcarrying a payload, since neither was written under thepayloadproperty nameUtf8JsonWriterrequires