Skip to content

Latest commit

 

History

History
316 lines (229 loc) · 18.7 KB

File metadata and controls

316 lines (229 loc) · 18.7 KB

0.0.1-beta - 2016-04-19

  • Initial release

0.0.2-beta - 2016-09-01

  • 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.

0.0.3-beta - 2018-03-22

  • Introduced a sample for GraphQL over WebSocket Protocol
  • Introduced support for Stream and Defer directives
  • Minor bugfixes.

0.0.4-beta - 2018-05-31

  • 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).

0.0.4-beta01 - 2018-05-31

  • Fix package dependency versions

0.0.5-beta - 2018-08-10

  • 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.

0.0.6-beta - 2018-08-10

  • Fixes for introspection query
  • Use string identifier to publish to subscription

0.0.7-beta - 2018-09-17

  • Breaking Change: Async Pub/Sub methods for subscription and live directive handler interfaces
  • Add Long Scalar definition

0.0.8-beta - 2018-10-27

  • Add subscription field to introspection schema

0.0.8-beta01 - 2018-10-28

  • Add subscription field to introspection schema

0.0.9 - 2018-11-02

  • Fixed a bug where output def of a subscription field was not reachable for introspection.

0.0.10-beta - 2018-11-13

  • 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.

0.0.11-beta - 2018-11-21

  • Deferred and Streamed results fixes for GQL interfaces.

0.0.12-beta - 2018-11-21

  • Deferred and Streamed results fixes for GQL interfaces when at the top-level of query.

0.0.16-beta - 2019-01-03

  • Breaking Change The ISubscriptionProvider interface now has additional methods to publish to subscriptions by tag.
  • Breaking Change Renamed interface methods in ISubscriptionProvider from XxAsync to AsyncXx to reserve the former for TPL extensions.
  • Fixes for stream and defer execution.

0.0.17-beta - 2019-01-11

  • Execute deferred results in parallel.

0.0.18-beta - 2019-01-16

  • Fix dispose of deferred/stream responses.

1.0.0-beta - 2019-04-27

  • Breaking Change New type provider API! see samples/client-provider for details.
  • Fixes for #216 enum as a variable.
  • Upgraded paket and dependencies.

1.0.0-beta2 - 2019-04-27

  • 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

1.0.0-beta3 - 2019-05-10

  • 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

1.0.0-beta4 - 2019-05-13

  • Fixing a bug when converting variable types to variables json in a query

1.0.0-beta5 - 2019-05-13

  • Fixing a bug when parsing json objects with no fields in serialization

1.0.0-beta6 - 2019-05-17

  • 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 [] and Map<string, obj>)

1.0.0-beta7 - 2019-05-17

  • Minor bug fixes
  • Fixing an error on overload constructor definition

1.0.0-beta8 - 2019-05-22

  • Performance improvements

1.0.0-beta9 - 2019-05-22

  • Fixing dependency issue on Server component

1.0.0-beta90 - 2019-05-29

  • 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

1.0.0 - 2019-07-04

  • 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.Middlewares package to FSharp.Data.GraphQL.Server.Middleware

1.0.1 - 2019-07-05

  • Adjusting package dependencies (FParsec, System.Net.Http, and FSharp.Data.GraphQL.Server are not locked anymore)

1.0.2 - 2019-08-19

  • fixed false positive validation errors related to variable usage.

1.0.3 - 2020-03-03

  • 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

1.0.4 - 2020-03-22

  • TypeProvider now treats custom scalars as strings
  • The Guid scalar was mapped to a DateTime

1.0.5 - 2020-03-23

  • Support opening static classes
  • Add additional case in client to support failed requests that don't return a path.

1.0.6 - 2020-12-15

  • TypeProvider accepts IHttpClientFactory as input

1.0.7 - 2020-12-30

  • Add static TypeProvider parameter explicitOptionalParameters.

1.0.8 - 2021-04-18

  • 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

2.0.0 - 2024-03-24

  • Breaking Change Migrated to .NET 6/7 and F# 7
  • Breaking Change Implemented GraphQL error handling using IGQLError interface instead of exceptions
  • Breaking Change Implemented parsing variables as JsonElement
  • Breaking Change Added Type suffix to all built-in GraphQL type definitions
  • New Package FSharp.Data.GraphQL.Server.AspNetCore for ASP.NET Core integration
  • Migrated from Paket and FAKE CLI to FAKE build project
  • Added Path to ResolveFieldContext
  • Added ability to deprecate fields defined with any combination of parameters (more overloads to the Define static class)
  • Added support of Option variable 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.WrappedScalar for value object scalar definitions
  • Added coercion of nested input objects
  • Added support for ValueOption in AutoField
  • 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

2.1.0 - 2024-04-13

  • Improved server exception logging by including exception in log message
  • Documentation and README improvements

2.2.0 - 2024-05-08

  • Improved AddGraphQLOptions
  • Added Altair and GraphiQL to sample projects

2.2.1 - 2024-06-16

  • Fixed JsonSerializerOptions read-only instance error

3.0.0 - 2025-11-30

  • Breaking Change Migrated to .NET 8 and F# 9.0 with FSharp.Core 9.0.x
  • Breaking Change Updated scalar CoerceOutput signature to objnull -> 'Primitive option
  • Breaking Change Moved GraphQL error extensions to standard extensions field according to specification
  • Breaking Change Renamed ObjectListFilter type definition to ObjectListFilterType
  • Breaking Change Removed ObjectListFilter.NoFilter case
  • Breaking Change Reworked Relay types to enable async fetching and switched to ValueOption
  • Breaking Change Giraffe web framework integration moved to separate package
  • New Package FSharp.Data.GraphQL.Server.Giraffe for Giraffe web framework integration
  • New Package FSharp.Data.GraphQL.Server.Oxpecker for Oxpecker web framework integration
  • Removed unused Suave NuGet package
  • Added Oxpecker web framework support
  • Added per-field authorization sample using ASP.NET authorization policies
  • Added file upload support via GraphQL Multipart Request Spec with FileData type
  • Added OfTypes filter case for ObjectListFilter to filter union cases by type
  • Added ObjectListFilter value parsing from variables in addition to supported inline value
  • Added ObjectListFilter value parsing from inline object with variables
  • Added ObjectListFilter additional operators (In, Contains, StartsWith, EndsWith)
  • Added StructNullable to support ValueOption fields 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 AddGraphQLOptions including additional converters
  • Added support for optional properties usage in non-Enumerable LINQ queries
  • Fixed ID type deserialization
  • Fixed ObjectListFilter Contains and In operators implementation for collections
  • Fixed generation of discriminator comparing expressions to be translatable to database queries
  • Fixed IInputExecutionContext resolution
  • Fixed graphql-transport-ws WebSocket 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

3.1.0 - 2026-02-04

  • Added TimeOnly GraphQL type
  • Added map function for Relay Connection and Edge types
  • Excluded GraphQLWebSocketMiddleware from exception stack trace if request not a Web Socket
  • Changed GraphQLOptionsDefaults.WebSocketConnectionInitTimeoutInMs const type to double
  • Improved Relay XML documentation comments

3.1.1 - 2026-04-19

  • 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.

4.0.0 - Unreleased

  • Breaking Change Migrated to .NET 10
  • Breaking Change Made Relay Edge a read-only struct
  • Breaking Change SubscriptionExecutionResult.Data is now obj voption Skippable, and the record has new Path and HasNext fields for incremental delivery
  • Breaking Change BufferedStreamOptions.Interval and BufferedStreamOptions.PreferredBatchSize are now int voption
  • Breaking Change ServerMessage.Error and ServerRawPayload.ErrorMessages now carry GQLProblemDetails list instead of NameValueLookup list, so an error message's payload is a standard GraphQL error array as the graphql-transport-ws protocol requires
  • Breaking Change A query or mutation whose non-null root field fails during execution now produces a Direct (execution) result with null data instead of a RequestError, 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 and graphql-transport-ws responses for such a failure now carry data: null as the spec requires, instead of omitting data entirely. This also changes the public GQLResponse.Data, GQLResponseContent.Direct.Data, DeferredErrors.Data, and SubscriptionErrors.Data signatures to use voption
  • 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 MalformedGQLQueryException for invalid queries, NotSupportedException for unsupported type definition implementations and InvalidOperationException for internal planning errors instead of System.Exception, with messages naming the affected field, type and execution kind
  • Added Define.TaskSeqField for list fields resolved from IAsyncEnumerable<'T>, such as taskSeq { } or Azure SDK AsyncPageable<T>. Without directives the sequence is enumerated into a list, @defer delivers the whole list, and @stream delivers every item as soon as it is produced and its fields are resolved
  • Added cancellation of a streamed Define.TaskSeqField enumeration 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 @stream on an ordinary list; a concurrency slot is never leaked even if delivering an item's result fails
  • Added maxConcurrency to Define.TaskSeqField, bounding how many items of a streamed sequence are pulled and resolved at the same time; defaults to Environment.ProcessorCount
  • Added StreamBatching to group streamed items of a Define.TaskSeqField into batches of a fixed size or of a size computed from the sequence, such as a page size kept with a paged SDK sequence. The preferredBatchSize argument of @stream takes precedence, and the batching function itself is evaluated lazily, only for a @stream query that does not supply its own preferredBatchSize
  • Added Microsoft.Bcl.AsyncInterfaces dependency of FSharp.Data.GraphQL.Shared for netstandard2.0
  • Added Human.friendsStream field 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 Direct result with null data instead of a RequestError; 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.TaskSeqField streaming retaining a task for every item already delivered until the sequence ends
  • Fixed graphql-transport-ws delivery of @defer and @stream results, which are now sent as soon as they are produced with path and hasNext instead of after a fixed 5 second delay, followed by a final payload with hasNext: false
  • Fixed graphql-transport-ws failure on deferred and streamed results that are not objects, such as streamed list items and scalars
  • Fixed graphql-transport-ws dropping errors of the initial payload of a deferred result together with all its deferred results
  • Fixed graphql-transport-ws discarding the partial data of a subscription result that also had field errors, sending null instead
  • Fixed graphql-transport-ws discarding the field errors of a Direct (non-subscription) result, sending an empty error list instead
  • Fixed graphql-transport-ws stranding a subscription id forever when its deferred result completed synchronously, before it was registered
  • Fixed graphql-transport-ws leaving a subscription id occupied when subscribing to its result failed synchronously
  • Fixed graphql-transport-ws addressing a batch of streamed items (grouped by preferredBatchSize or StreamBatching) with a path ending 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-ws never sending complete after the next of a query or mutation result, as the protocol requires
  • Fixed graphql-transport-ws sending a request error (rejected before execution: validation, planning, variable coercion, a middleware, or the executor itself failing) as a next result followed by complete, instead of the terminal error message the protocol requires for it; a query or mutation whose non-null root field fails during execution still gets next + complete, since it is a result, not a request error
  • Fixed graphql-transport-ws throwing while serializing an error message or a pong carrying a payload, since neither was written under the payload property name Utf8JsonWriter requires