Skip to content

Latest commit

 

History

History
327 lines (240 loc) · 23.4 KB

File metadata and controls

327 lines (240 loc) · 23.4 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 Skippable<obj voption> (absent, null, or an object), SubscriptionExecutionResult.Errors is now GQLProblemDetails list Skippable, SubscriptionExecutionResult.Path was removed, and the record has new Pending, Incremental, Completed and HasNext fields for incremental delivery; IncrementalResult.Data follows the same Skippable<obj voption> contract and IncrementalResult gained SubPath
  • Breaking Change Removed SubscriptionsDict, SubscriptionUnsubscriber and OnUnsubscribeAction from FSharp.Data.GraphQL.Shared.WebSockets: the graphql-transport-ws middleware keeps its subscriptions in a per-connection registry owned by a single loop
  • Breaking Change @defer and @stream now declare the arguments the incremental delivery specification requires: if: Boolean = true and label: String on both, initialCount: Int = 0 on @stream. @stream is allowed on FIELD only and @defer on FIELD, FRAGMENT_SPREAD and INLINE_FRAGMENT, no longer on FRAGMENT_DEFINITION. if: false, literal or through a variable, executes the field inline; initialCount delivers the first items with the initial payload and streams the rest; label is carried by the pending entry announcing the field
  • Breaking Change GQLDeferredResponseContent.DeferredPending gained InitialCount, the number of items of a streamed field delivered with the initial payload, so that the graphql-transport-ws translator expects the streamed items from that index
  • Breaking Change Added @defer on fragment spreads and inline fragments, as the incremental delivery specification defines it: the fragment's fields are resolved together and delivered as one payload of the object containing them, announced at that object's path with the fragment's label; a field also selected directly on the object is executed with it, together with whatever the fragment selects under it, and left out of the fragment; a fragment spread directly anywhere in the selection is resolved with the object, whichever spread of it comes first; a fragment spread twice deferred at the same place is delivered once; a fragment whose if is false through a variable is resolved with the object; a fragment on an abstract type delivers the fields of the concrete type; an error propagating up to the fragment completes it with the errors and no data. The engine reports fragments through the new DeferredFragmentPending, DeferredFragmentResult and DeferredFragmentCompleted events, and plans them as the new ResolveDeferredFragment kind
  • 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
  • Added the validation rules of incremental delivery: @stream only on list fields, no @defer or @stream in a subscription operation or on a mutation root field unless disabled with if: false, and labels must be string literals unique within each operation, counting the fragments it spreads
  • Added GraphQLTransportWS.SubProtocol, the graphql-transport-ws sub-protocol name
  • Fixed graphql-transport-ws delivery of @defer and @stream results, which are now sent as soon as they are produced instead of after a fixed 5 second delay, followed by a final payload with hasNext: false
  • Changed graphql-transport-ws incremental delivery of @defer and @stream results to the pending/incremental/completed/hasNext wire format used by graphql-js 17 and Apollo Client's GraphQL17Alpha9Handler, superseding the previous data/path/hasNext shape. Every deferred or streamed field is announced once, in a pending entry, and identified afterwards by a short id instead of its path. A deferred field is announced in the same payload as its own value, while a streamed field is announced as soon as the payload exposing its containing data is sent. A @stream field's items are always delivered to the client in list order, buffering an item that arrives out of turn until the item before it fills the gap, and a batch of items (grouped by preferredBatchSize or StreamBatching) is delivered as the items of a single incremental entry addressed by that id, rather than one payload per item
  • Added a completion signal to the engine's deferred/streamed event stream (DeferredCompleted), fired once after a @defer field's own payload and once after all of a @stream field's items, whether they succeeded or the source failed; used to build the completed entries of the new wire format
  • Changed graphql-transport-ws delivery of a deferred field to the addressing the specification and graphql-js/Apollo clients expect: the pending entry names the object containing the field and the incremental entry carries an object map of that one field; a field whose announcement the client never received, because the payload that should have exposed it resolved to null there, is no longer completed
  • Changed the graphql-transport-ws middleware to single-owner loops communicating through System.Threading.Channels: one reader of the socket, one control loop owning the subscription registry, one sender owning every write and the close of the socket, and one worker per subscription. No lock, no thread blocked on a send, a graceful close on application shutdown; a slow client's messages now queue in memory for the life of the connection instead of blocking the subscription's source
  • Changed the execution engine to work without locks: the announcements of nested deferred and streamed fields are carried as data instead of being captured under a lock at subscription time, and a streamed Define.TaskSeqField delivers its results through a single-reader channel, with SemaphoreSlim only bounding maxConcurrency
  • Changed graphql-transport-ws result payloads to omit errors when there are none, as the GraphQL response format requires, instead of sending an empty array
  • 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 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
  • Fixed validation of an inline fragment without a type condition (... { … }), which used to fail with an exception instead of applying to the parent type
  • Removed the internal Observable.withCompletionMarker