Changelog History
Page 3
-
v7.0.0 Changes
October 21, 20197.0.0
Commits: v6.0.0...v7.0.0
π₯ Breaking
Variables are no longer set in Relay Context when using a
QueryRenderer. This means that any product code that was relying on reading variables fromRelayContextwill break. If you need to access the variables that were set at a query root, the recommended approach is to manually pass them down through the component tree in product code.β Removed old RelayNetworkLogger, and
relay-runtimeno longer exportscreateRelayNetworkLogger. This logger is being replaced with event based logging on theEnvironmentwhich will allow us to have richer and more contextual events logged with more detail on what's going on. Wrapping the actual network request doesn't work well as some "requests" might never actually end up on the network when they can be fulfilled completely from the store.β‘οΈ The constructor signature of
Storeconstructor changed; specifically the second argument to the constructor is now an options object. Any product code directly constructing aStoreand passing a second argument will need to be updated.π Relay Compiler no longer relies on
graphql-jsfor query validation. Most of the validation rules we used previous are now part of the RelayParser itself, while the remainder and implemented as transforms (15e8d22). Additionally, we've removed the concept of RelayIRValidations (da01bf3), which ran after IR transformation.π
@deferis no longer allowed on inline fragments, since we canβt communicate a loading state with Suspense when used on an inline fragment.@deferis now only supported on fragment spreads.β Added
- RelayCompiler: added a new directive (3dd79e8)
@DEPRECATED__relay_ignore_unused_variables_errorto suppress errors that were surfaced after we've migrated from GraphQLNoUnusedVariablesRuleto RelayIRTransform validation. GraphQLNoUnusedVariablesRulewas not aware of the difference between root (operation) variables and local fragment variables (defined by @argumentDefinitions) - because of that, it was considering the local fragment variables that have the same name as the root variable as used and did not report the violation. But in Relay compiler, we know this distinction, and we already keep track of the root variables and can report those invalid cases. Unfortunately, this revealed multiple violations that weren't possible to fix without product team involvement. For this purpose, we added a directive that can be used to temporarily suppress the error while teams fix their queries.
π Improved
- π Relaxed the constraint for
@refetchabledirective on a fragment: we no longer enforce that the argument for thenodefield is calledid; it can be called anything as long as itβs anIDtype. - Developers can now select the
__idfield anywhere that__ typenamecan be selected, in order to fetch the internal cache key of an entity. The primary use-case for this is updating records that donβt have anid. Before, updating or deleting such entities would require writing an updater function that traversed from the nearest strong entity (w an id); now, developers can directly target records with e.g.store.get(record.__id)in an updater function.
π Fixed
- π RelayCompiler: Usage of $variables in Complex objects (or as List Items) is now disabled by RelayParser: 6946e85 This was already unsupported, but Relay previously threw an error later in compilation.
- π€‘ MockPayloadGenerator: allow
nullas default value of enum: 6946e85 - π Fix display names for containers.
- π Fixed
@refetchableconnection metadata for custom handlers. - π Fixed missing field handler behavior for plural linked fields.
- π Fixed getRefetchMetadata to handle both commonjs and esmodules. (#2875)
- π Fixed printing require module dependency in generated artifacts. (#2861)
Misc
- β¬οΈ Upgraded React peer dependency to
16.9.0. - β¬οΈ Upgraded
babel-preset-fbjsto 3.3.0 - π RelayCompiler: We've changed the field
typeandtypeConditionin GraphQL IR types to use Relay internal representation of GraphQL type (2606f32). Before this change, we were directly usinggraphql-jstype instances. But eventually, our goal in Relay compiler is to get rid of the dependency on thegraphql-jsschema representation and use a faster/less memory intensive representation of the schema. We also build a Schema wrapper: 9e6d919 - that should help us during this migration.
Experimental
- π Several performance improvements to the internal implementation of
useFragmentwere shipped. - π Fixed issue to stop tracking mutations as in flight in the RelayOperationTracker when applying the optimistic update; this caused issues with suspending unexpectedly.
- π Fixed issue to stop tracking GraphQL subscriptions as indefinitely in flight in the RelayOperationTracker; instead, subscriptions should only be tracked as in flight when theyβre waiting for incremental or module payloads. This caused issues with suspending indefinitely in some cases.
- π Fixed issue to correctly dispose of ongoing requests when unmounting a
useQueryhook; this might happen whenuseQuerystarts a long-lived request, e.g. to poll for real time data. - π Fixed issue in
useQueryto not suspend indefinitely when server response doesnβt return all of the requested data. This might occur for example when making selections on abstract types. - π Fixed re-establishing store subscriptions when using
useBlockingPagination. - π Fixed pagination with Relay Hooks when using fragments that contain
@argumentDefitions. - Pagination with Relay Hooks is now allowed even if server returns value for
hasNextPageas false. - Several improvements to new experimental representation of connections.
- Temporarily exposed new option for useQuery:
renderPolicy_UNSTABLE, which determines whether data should be eagerly or lazily rendered.
- RelayCompiler: added a new directive (3dd79e8)
-
v6.0.0 Changes
September 16, 2019Commits: v5.0.0...v6.0.0
π₯ Breaking
- π Environment no longer supports a configurable PublishQueue, this is a prerequisite for upcoming changes to support a new connection representation and the Store interface changes (see below): 44edf14
- β‘οΈ Changed the Store interface, adding snapshot() and restore() methods and changing the way that PublishQueue/Store coordinate to revert/rebase optimistic updates: a5c903d
- Note: this should have no impact on users who use the default Store implementation; the main impact is to alternate store implementations and consumers thereof.
- β Removed the unused RecordSource interface load() method: bd15d4e
- Changed dataFrom prop in ReactRelayQueryRenderer to fetchPolicy, changed 'STORE_THEN_NETWORK' to 'store-and-network'.
- π Changed $key in flow type for plural fragments to plural ($ReadOnlyArray<>)
- π environment.unstable_internal has been removed, since we no longer need to support Relay Compat.
- Minimum required React version is now 16.9.0
β Added
- Added _ unreleased _ relay-experimental package which contains experimental version of Relay Hooks using React Suspense.
- β Added a LocalQueryRenderer that has the same API as QueryRenderer, and only renders from data in the store.
- @inline directive and readInlineData() function that enables data masking for functions instead of React components.
- Added an @raw_response_type directive on query, mutation and subscription. With the directive, a new flow type will be added to the generated artifact that represents the shape of the server response.
- π New documentation for Client Schema extensions and managing local data was added.
π Improved
- Validate that required arguments are provided in compiler.
- π¦ Don't include (70453f2) @babel (https://github.com/babel) packages in generated bundles ( (70453f2#2764#2764) (#2764)) (70453f2)
- π Made several performance optimizations for our compiler transforms.
- π Allow RelayFileWriter to specify the filesystem object (#2837)
- π§ Can now configure persistFunction with relay config.
π Fixed
- π€‘ Various fixes to the MockPayloadGenerator
- π Fix edge case in ConnectionHandler when field is unset
- π Fixed relay-compiler babel polyfill problem.
- π Use reporter to report changes (#2838)
- π Use global state for persisted queries to fix --watch (#2625 (#2625))
Misc
- v6.0.0 should now be compatible with React 16.9.0.
- π Experimental: work-in-progress support for a new approach to representing connections, with changes starting in 6f01295. The new connection representation is not feature complete and disabled by a feature flag. The APIs are highly likely to change.
- β Added a new implementation of the RelayRecordsSource (available behind a feature flag)
-
v5.0.0 Changes
June 11, 2019Commits: v4.0.0...v5.0.0
π₯ Breaking
react-relaycontainers no longer consume variables from React context, but instead from fragment owners passed through fragment refs. This means that if you have a custom QueryRenderer or other component that set Relay Context, setting variables on that context will no longer affect descendant components.
β Added
- π¦ Expose ability to pass custom scalar configuration to compiler (#2745 by @alloy)
- β Add relay-config package to manage compiler configs (#2746 by @alloy)
π Improved
- π Improved DX for working on Relay as non-FB dev (#2749 by @alloy)
- β Added Support for getDataID() function: 311412b
- β‘οΈ Updated Internal Testing Tools to explicitly mark fixtures that should throw: https://github.com/facebook/relay/commit/a6b388b598c18f83811699ef1eea00887b5d217
- β Added Memoization for Compiler Transforms:
- β‘οΈ Relay Testing Tools Update: Handle Arrays in MockResolvers
- Refetchable fragments are allowed on abstract types not directly implementing Node: 87930e1
- ID field is now automatically added to @refetchable fragments on types implementing Node: 3efecaa
π Fixed
- β
Updated default compiler configuration to include files from
__tests__directories: 033a4bb - π Fixed a bug in flow type generation that fields on inline fragments with duplicated names are only included once:
[088afdf](https://github.com/facebook/relay/commit/088afdf347582533b9956adbc5b2a5e37fe9cfaf) - Deduplicate connection edges based on DataID (not just id field)
- π Fixed a bug that mutations on viewer field βoverwritingβ existing fields in the store: Add hardcoded ID to
viewerfield
Misc
- π Website is moved to https://relay.dev
- β¬οΈ Upgrade Docusaurus to 1.9.0
- crossenv for jest script (#2732) by @anikethsaha
-
v4.0.0 Changes
April 30, 2019Commits: v3.0.0...v4.0.0
π₯ Breaking
- Fragment Container, Refetch Container, Pagination Container now always expect an object as the fragment declaration (single
graphqltag is no longer valid input), sincegraphqltags no longer implicitly produce object wrappers during our babel transform: 1f26086.- Codemod to update to new signature: https://gist.github.com/kassens/3e2ef9af1e5e1128f8fba3362bb92f98
- ConnectionTransform will generate additional selections under the existing edges/pageInfo fields. A side-effect of this is that if edges/pageInfo were aliased, the generated fields now show up under the alias rather than as non-aliased sibling selections: 50008ab -
- Compiler no longer allows directives to be used in locations not defined in the schema. Previously the compiler doesn't check the directives' locations, it causes directives being used on wrong places, e.g.
@connectionon a fragment definition. - Compiler now validates that all
@argumentsare defined on the callee
π Improved
β‘οΈ Updates in testing tools:
- There are two main modules that you may use in your tests:
- createMockEnvironment(options): RelayMockEnvironment
- MockPayloadGenerator and @relay_test_operation directive
- With
createMockEnvironment,you will be able to create an instance ofRelayMockEnvironment, a Relay environment specifically for your tests. The instance created bycreateMockEnvironmentis implementing the Relay Environment Interface and it also has an additional Mock layer, with methods that allow to resolve/reject and control the flow of operations (queries/mutations/subscriptions).
- The main purpose of
MockPayloadGeneratoris to improve the process of creating and maintaining the mock data for tested components.β Added full support for client schema extensions: now full GraphQL types can be defined in the client schema (as opposed to just extending existing server types), and they will be properly retained during garbage collection when rendered.
Using new fetchQuery implementation inside QueryRenderer which de-dupes identical requests in flight.
β Add config support for babel-plugin-relay/macro (#2646) @sgwilym
π Fixed
- π Fixed compiler error when watchman cli was missing: 2958b97
Misc
- π Changed
mainentry point inpackage.jsonforreact-relayandrelay-test-utils - π¦
createRelayContextnow in relay-runtime package to prevent multiple instances of packages that have "peerDependencies". - π RelayCompat is removed.
Experimental
- β Added experimental support from
@streamand@stream_connection - π Improved support for
@matchdirective - π Fixed passing down and comparing fragment owners in a few places that were missing.
- β Added experimental scheduler to QueryExecutor.
- Fragment Container, Refetch Container, Pagination Container now always expect an object as the fragment declaration (single
-
v3.0.0 Changes
February 23, 20193.0.0
Commits: v2.0.0...v3.0.0
π₯ Breaking
- β Removed Relay Classic and Compat.
- π
react-relay/modernhas been moved toreact-relay/.
π Fixed
- π Fixes an issue with schemas with internal enum values (ie, printing as a string but internally represented as an int), these enum values will now correctly print as the enum name instead of the internal value. #2638
- π Changes commitMutation() to call onCompleted with null errors if there were no errors (instead of an empty array). c80a0fa
- π Fixed issue with sequential optimistic mutation payloads: 55ce137
- Disabled a built-in
graphql-jsvalidation rule (checking that variables are used in allowed positions) in the compiler which could incorrectly report errors when an argument in the @arguments directive conflicted with the nearest parent field argument. Relay-compiler already implements the same validation internally and is aware of @arguments/@argumentDefinitions.
π Improved
- β Remove
validateNamesoption in compiler which was always true. - Flow types are properly generated for refetchable queries.
Experimental
- β Added partial support @stream and @defer in QueryExecutor. Note that this feature is experimental and subject to change. No public API is provided yet.
- β Added support for using @module outside of @match, enabling new use-cases for data-driven dependencies. No public API is provided yet.
- β Added fragment ownership under a feature flag. Fragment ownership is a new constraint that we're rolling out in the internal model of Relay where every instantiation of a fragment at runtime (i.e. a fragment for a given dataID) is associated with an operation that "owns" it; this operation will usually be a query. This is similar to how fragments work in GraphQL, where they need to be a part of a query in order to actually be fetched. This has a few benefits:
- It allows us to stop relying on React Context to propagate query variables through the tree (which are needed in order to read fragments), and instead can be accessed directly on the fragment owner associated with a fragment.
- Not using React Context also allows fragment results to be context-free and allows us to deal better with complicated edge cases like nested context (which occurred with refetch and pagination containers). E.g. if you pass a fragment reference from "above" a RefetchContainer/PaginationContainer/QueryRenderer and try to use it somewhere within one of those, it will probably not do what you expect since the variables will be wrong. With ownership, you always get the right variables.
- This in turn also allows us to specify behavior like refetching (which has historically been confusing) more precisely: refetching a fragment simply means reparenting it under a new owning operation.
-
v2.0.0 Changes
January 26, 20192.0.0
Commits: v1.7.0...v2.0.0
π₯ Breaking
- π Relay now uses new Context API instead of Legacy Context API. Any consumers of Relay context using the Legacy context API will break.
- Removed experimental support for @deferrable directive
- β¬οΈ Upgrade
graphqlto14.0.0 - β¬οΈ Upgrade
reactto16.5.0 - relay-compiler: Rename
inputFieldWhitelisttooptionalInputFields. - π Merge graphql-compiler into relay-compiler (#2593)
- Selector type returned by
environment.unstable_internal.getSelector(...)has changed.
β Added
ReactRelayContextis now exported fromreact-relay.- β Added fragment ownership model to relay-runtime: fragments can now point to the query that owns them, which removes reliance on React Context and gives us flexibility to experiment with new apis.
- Persisted queries: Enables a simple but straightforward mechanism to use persisted queries in open-source. (#2354)
- π @arguments directive now supports literal values.
- β Add 'severity' field to
PayloadErrorin RelayNetwork interface. - β Add support for specifying
missingFieldHandlersin the Relay environment. These handlers allow developers to provide a fallback for missing data for a query whenenvironment.check()is called. - β Add support making GC scheduling configurable in the Relay environment.
- π Allow passing a custom handler to
@connection. This is useful for products that want to customize the way newly fetched items are merged into an existing connection.
π Fixed
recycleNodesIntono longer produces runtime error in DEV mode trying to mutate frozen objects (#2193)- π Fixed receiving payloads out of order in QueryRenderer.
- π Fixed issue in Pagination Container when receiving new props.
- π Fix incorrectly garbage collecting data during an optimistic update.
- Correctly fix double fetching with QueryRenderer in React Concurrent mode.
- π Fix rendering sibling QueryRenderers that have the same query and variables.
π Improved
- π Improved compiler error messages, which now show locations in source.
- β‘οΈ Updated the structure of generated
ConcreteRequestto provide more flexibility for our fetching apis. - Cleaned up Reader and Normalization AST representation.
- β¬οΈ Upgrade build dependencies to Babel 7 and Webpack 4.
- π Make generated Flow types for Input types exact objects.
- π° Simplify structure of network payloads.
- π Rename
RelayMarkSweepStoretoRelayModernStore.
Experimental
- β Added support for new @match directive for dynamically loading code and data dependencies determined by server. No user api is provided yet.
- β Added support for @refetchable directive which automatically generates a query for a fragment that is βrefetchableβ (i.e. a fragment on
Viewer,Query, or a type that implementsNode). No user api is provided yet.
- π Relay now uses new Context API instead of Legacy Context API. Any consumers of Relay context using the Legacy context API will break.
-
v2.0.0-rc.2 Changes
January 22, 20192.0.0-rc.2
Commits: v2.0.0-rc.1...v2.0.0-rc.2
π₯ Breaking
- π Merge
graphql-compilerintorelay-compiler(#2593) - Selector type returned by
environment.unstable_internal.getSelector(...)has changed.
β Added
ReactRelayContextis now exported fromreact-relay.- β Added fragment ownership model to relay-runtime: fragments can now point to the query that owns them, which removes reliance on React Context and gives us flexibility to experiment with new apis.
- Persisted queries: Enables a simple but straightforward mechanism to use persisted queries in open-source. (#2354)
- π @arguments directive now supports literal values.
Experimental
- β Added support for new @match directive for dynamically loading code and data dependencies determined by server. No user api is provided yet.
- β Added support for @refetchable directive which automatically generates a query for a fragment that is βrefetchableβ (i.e. a fragment on
Viewer,Query, or a type that implementsNode). No user api is provided yet.
π Fixed
- π Fixed receiving payloads out of order in QueryRenderer.
- π Fixed issue in Pagination Container when receiving new props.
π Improved
- π Improved compiler error messages, which now show locations in source.
- β‘οΈ Updated the structure of generated
ConcreteRequestto provide more flexibility for our fetching apis. - Cleaned up Reader and Normalization AST representation.
- π Merge
-
v2.0.0-rc.1 Changes
October 31, 2018Commits: v1.7.0-rc.1...v2.0.0-rc.1
π₯ Breaking
- π Relay now uses new Context API instead of Legacy Context API. Any consumers of Relay context using the Legacy context API will break.
- Although not officially supported, this change also breaks SSR with Relay: #2544. We will fix this issue in 2.0.0-rc.2.
- β Removed experimental support for @deferrable directive
- β¬οΈ Upgrade graphql to 14.0.0
- β¬οΈ Upgrade react to 16.5.0
- relay-compiler: Rename inputFieldWhitelist to optionalInputFields.
β Added
- β Add 'severity' field to PayloadError in RelayNetwork interface.
- β Add support for specifying missingFieldHandlers in the Relay environment. These handlers allow developers to provide a fallback for missing data for a query when environment.check() is called.
- β Add support making GC scheduling configurable in the Relay environment.
- π Allow passing a custom handler to @connection. This is useful for products that want to customize the way newly fetched items are merged into an existing connection.
Experimental
β Added a new
relay-experimentalpackage which exposes a few experimental APIs.- β Add fetchQuery_UNSTABLE api to fetch and retain data outside of React.
- β Add SuspenseQueryRenderer and SuspenseFragmentContainer. These are new versions of our containers that use Suspense to communicate loading states.
π Fixed
- π Fix incorrectly garbage collecting data during an optimistic update.
- Correctly fix double fetching with QueryRenderer in React Concurrent mode.
- π Fix rendering sibling QueryRenderers that have the same query and variables.
π Improved
- β¬οΈ Upgrade build dependencies to Babel 7 and Webpack 4.
- π Make generated Flow types for Input types exact objects.
- π° Simplify structure of network payloads.
- π Rename RelayMarkSweepStore to RelayModernStore.
- π Relay now uses new Context API instead of Legacy Context API. Any consumers of Relay context using the Legacy context API will break.
-
v1.7.0 Changes
October 31, 2018Commits: v1.6.2...v1.7.0
π This release comes with two exciting contributions from external contributors:
π Language Plugins
π¨ While we at Facebook only support JS and Flow flavored JS and generate optional Flow types, supporting TypeScript had been difficult. #2293 by @alloy does the required refactoring to allow other developers to write plugins to add this missing support.
π Create React App support
π Create React App tries to minimize dependencies, so including Relay's Babel plugin for everyone didn't make much sense. This meant that using Relay with Create React App wasn't possible without ejecting.
π This release adds babel-plugin-relay/macro (@apalm, #2171) which in the upcoming react-scripts@2.0.0 will make it possible to use Relay without ejecting powered by babel-plugin-macros (http://yarn.pm/babel-plugin-macros).β Added
- π Support for language plugins (@alloy, #2293)
- π Support for babel-plugin-macros (@apalm, #2171)
- β‘οΈ Updated to babel@7.0.0-beta.56 to extract GraphQL strings for the compiler
- Pagination and Refetch containers now warn when a request is triggered when they're unmounted. (@alunyov)
π Fixed
- π Fix double fetching in QueryRenderer in React Concurrent mode (@flarnie)
- π Fix rendering sibling QueryRenderers that have the same query and variables
- π relay-compiler is no longer a peerDependency of relay-runtime as it's not needed during deployment. Make sure to keep all Relay packages at the same version! (@kassens)
β Removed
- β Removed long deprecated RelayNetwork.streamQuery and RelayNetwork.sendSubscription
-
v1.7.0-rc.1 Changes
August 16, 20181.7.0-rc.1
π This release doesn't contain many commits, but comes with two exciting additions from external contributors:
π Language Plugins
π¨ While we at Facebook only support JS and Flow flavored JS and generate optional Flow types, supporting TypeScript had been difficult. #2293 by @alloy does the required refactoring to allow other developers to write plugins to add this missing support.
π Create React App support
π Create React App tries to minimize dependencies, so including Relay's Babel plugin for everyone didn't make much sense. This meant that using Relay with Create React App wasn't possible without ejecting.
π This release addsbabel-plugin-relay/macro(@apalm, #2171) which in the upcomingreact-scripts@2.0.0will make it possible to use Relay without ejecting powered bybabel-plugin-macros.β Added
- π Support for language plugins (@alloy, #2293)
- π Support for babel-plugin-macros (@apalm, #2171)
- β‘οΈ Updated to babel@7.0.0-beta.56 to extract GraphQL strings for the compiler
- Pagination and Refetch containers now warn when a request is triggered when they're unmounted. (@alunyov)
π Fixed
- π Fix double fetch in React Async development mode (@flarnie)
- π
relay-compileris no longer a peerDependency ofrelay-runtimeas it's not needed during deployment. Make sure to keep all Relay packages at the same version! (@kassens)
β Removed
- β Removed long deprecated
RelayNetwork.streamQueryandRelayNetwork.sendSubscription