Skip to content

Version 17.0.0 Release Notes

Choose a tag to compare
@captbaritone captbaritone released this 14 Jun 23:56
· 96 commits to main since this release

Since our last release in January of this year, we've made many improvements to Relay. Themes include:

  • Improved correctness checking and validation
  • Additional editor features
  • Experimental features exploring error handling and nullability

Breaking Changes

Schema Validation

Relay compiler now runs spec-compliant schema validation against your schema including client schema extensions and Relay Resolvers. You can opt out of this feature by disabling validation in your Relay compiler config.

// relay.config.json
    "featureFlags": {
       "disable_schema_validation": true

[ccc4465] by Jordan Eldredge

Edge Type Validation

We now validate that the names passed to directives like @prependNode and @appendNode are valid typenames. You can opt out of this validation with the following feature flag in your compiler config:

// relay.config.json
    "featureFlags": {
       "disable_edge_type_name_validation_on_declerative_connection_directives": {
          "kind": "enabled"

[53b2436] by tobias-tengler

Bug fixes

  • [f87e77d]: Fix MockPayloadGenerator for deferred fragments in lists by Fernando Gorodscy
  • [24b557a]: Use default values from mock resolver for Relay 3D payload by Andrey Lunyov
  • [59ff9c1]: Mark resolves as clean again if we reread their fragment and find data unchanged by Jordan Eldredge
  • [0d7a3d0]: Input fields with defaults shouldn't be required (#4647) by Graeme Coupar
  • [7cc4f2b]: Check if condition on defer/stream fragments by Fernando Gorodscy
  • [05d64cc]: Update GraphQL parser to consume escaped characters by Monica Tang
  • [448aa67]: Fix Flow Types in RelayObservable by Jerry Francois


Runtime Improvements

This release includes a new implementation of our hooks which are significantly more efficient in terms of memory use. Thanks to Dave McCabe for his work on this huge project.

  • [9f03ea5]: Make new useFragment implementation the default by Andrey Lunyov

Editor Integration Improvements

Huge shout out to community contributor Tobias Tengler for many improvements to our Editor Support via our VSCode extension. Our VSCode extension is powered by the relay-compiler so upgrading to version 17.0.0 of the compiler should unlock a number of great IDE features.

  • [dc2cb85]: Add code action to rename fragment (#4697) by tobias-tengler
  • [68c7cca]: Add SchemaDocument go to definition LSP support (#4669) by tobias-tengler
  • [8fd21e7]: Attach previous location to duplicate type diagnostic by Jordan Eldredge
  • [dd9d3a0]: Support inlay hints by Jordan Eldredge (Requires upgrading to v2.3.0 of our VSCode extension)
  • [964e078]: Activate LSP for schema and schema extension files (#4652) by tobias-tengler
  • [bb41169]: Support go to definition for arguments (#4605) by tobias-tengler
  • [bbddbf3]: Report errors if location provider fails (#4588) by Jordan Eldredge
  • [964e078]: Activate LSP for schema and schema extension files (#4652) by tobias-tengler

Compiler Performance Improvements

  • [232985f]: Parallel watchman queries for saved state and changed files by Gordy French
  • [ef22ae6]: Run schema validation in parallel by Jordan Eldredge
  • [a7984bc]: Speed up watchman_query_time_before_subscribe by Tianyu Yao
  • [acd17ec]: Use multithreaded zstd compression by Gordy French
  • [a7984bc]: Speed up watchman_query_time_before_subscribe by Tianyu Yao
  • [f7b030e]: Split a project into multiple chunks and parallelize by Tianyu Yao
  • [bafd56b]: Parallelize GraphQLAsts::from_graphql_sources by Tianyu Yao
  • [69dbfee]: Parallelize from_graphql_sources_map by Tianyu Yao
  • [ce12ecf]: Parallelize building schemas by Tianyu Yao
  • [586483e]: Parallelize from_file_source_changes by Tianyu Yao
  • [ee8523f]: Implement SchemaDocument path resolution (#4639) by Tobias Tengler
  • [5f1eb8a]: Add path resolution for fragment arguments (#4651) by tobias-tengler
  • [6601a35]: Speed up LSP requests outside of GraphQL by Evan Yeung
  • [a5a7947]: Incrementally build Enum schema changes by Evan Yeung
  • [ce6ea74]: Add go to definition support for type defined in variable definition (#4629) by tobias-tengler
  • [2ba726b]: Add go to definition support for directives (#4625) by tobias-tengler

Misc. Improvements

  • [29d9e55]: Add preferFetchable argument to the @refetchable directive by Andrey Lunyov
  • [f45b35f]: New feature flag that will allow to opt-out @fetchable types from the node query generation in @refetchable by Andrey Lunyov
  • [9958e56]: Print raw response on persisting parsing error by Tianyu Yao
  • [9cf21af]: Integrate with Sapling or Git if they exist (#4691) by Jon Janzen
  • [badd538]: Migrate relay hooks to hook-syntax by Alex Taylor (alta)
  • [349b5a8]: Use client schema extension enum values as source of truth for Flow types by Jordan Eldredge
  • [d3c8d1c]: Add feature flag for fragment arguments (#4648) by tobias-tengler
  • [9e9428e]: Add support for ENABLE_RELAY_OPERATION_TRACKER_SUSPENSE flag in the the new hooks implementation by Andrey Lunyov

Documentation Improvements

  • [acb227a]: Fix search on (#4715) by Paul O’Shannessy
  • [6b91a2e]: Improve compiler explorer (#4698) by Jordan Eldredge
  • [4c5cd41]: Add docs for preferFetchable argument by Andrey Lunyov
  • [95010c8]: Relay: Update Obsolete Docs Reference to ReactTestUtils by Tim Yung
  • [51a82f6]: Document Relay Resolvers (#4547) by Jordan Eldredge
  • [ff8e80d]: Update docs to clarify behavior of refetchable variables with nullable fragment reference by Jordan Eldredge
  • [76d6d77]: Demonstrate using custom scalar to replace RelayResolverValue by Jordan Eldredge
  • [05cf065]: Fixing minor typo in website (#4673) by Jeshuran Paul
  • [906f5ed]: Relay docs: Fix shell script getting Prism'd as a JS comment by Robin Giese
  • [0109168]: Relay docs: Tutorial page should have proper title by Robin Giese
  • [ea2cbbc]: Fix typos in the Relay Resolvers docs by Evan Yeung
  • [dc36b48]: Fix typos in tutorial by Monica Tang
  • [14314f9]: Escape asterisks in (#4635) by Chris Morin
  • [ee03182]: Fix(docs): add instructions about installing watchman if necessary in the tutorial (#4620) by Mark Feng
  • [1256e73]: Remove CodeSandbox Example by Jordan Eldredge
  • [b7f59af]: Chore(doc): improve relay compiler doc for persist (#4608) by eMerzh
  • [8e557f9]: Fix typos (#4597) by Kenneth Lum
  • [615c2d2]: Fix(doc): update config name following update (#4596) by eMerzh

Experimental Changes

We are also continuing to evolve many experimental features which are not yet stable enough to be enabled by default in Relay.

Relay Resolvers

Relay Resolvers have been extended to support defining types which implement interfaces, and define resolvers that return client-defined interfaces where all implementing types are defined using Relay Resolvers. Relay Resolvers are now stable enough to have full documentation with instructions on how to enable them.

  • [ba5e48f]: Add model resolvers for interfaces by Monica Tang
  • [55b8716]: Return an interface with multiple weak concrete types from a resolver field by Monica Tang
  • [46879b4]: Multiple weak models implement an interface by Monica Tang
  • [98823ea]: Add model resolvers for unions by Monica Tang
  • [245602f]: Remove allow_legacy_verbose_syntax ParseOption by Lynn Yu
  • [cdab89f]: Remove ENABLE_CLIENT_EDGES runtime feature flag by Jordan Eldredge
  • [b26f3be]: Remove @outputType feature flag by Monica Tang
  • [7ce13bc]: Remove LiveResolverStore from experimental export namespace by Jordan Eldredge
  • [f193cda]: Invert the default for emit_normalization_node_for_client_edges by Jordan Eldredge
  • [0cac319]: Define resolver on interface with weak types by Monica Tang
  • [6bda98c]: Make interface model resolver fields compatible with client schema extension-defined concrete types by Monica Tang
    Additionally, we are exploring the ability to extract Resolver type and field definitions directly from your typed JavaScript code, similar to how Grats works. This work is still highly experimental, only supported for Flow, and not yet fully functional. If you are interested in working with us to help bring this support to TypeScript, please get in touch.
  • [722b18f]: Better error message for using an optional flow type for strong objects by Tianyu Yao
  • [4267075]: Implement schema generation for weak object fields by Evan Yeung
  • [5d2fa70]: Prevent docblock parsing error for new resolver syntax in LSP by Tianyu Yao
  • [36802d9]: Properly support nullable strong return type by Tianyu Yao
  • [8e5c565]: Add "description" to Flow schema generation by Evan Yeung
  • [7e41583]: Fix passing empty documents to schema gen by Tianyu Yao
  • [8cce449]: A RelayResolverValue generic by Tianyu Yao
  • [0d1b5c2]: Add argument support for Flow schema generation by Evan Yeung
  • [95aaa48]: IdOf<> return type by Tianyu Yao
  • [5052062]: Support boolean by Tianyu Yao
  • [77a87be]: Add root fragment support to relay resolvers by Evan Yeung
  • [35f9763]: Pass fragment information to Flow schema generation code by Evan Yeung
  • [a8a41e2]: Treat existing resolve syntax fields as fields by Tianyu Yao
  • [16e28af]: Add @LiVe to Flow schema generation by Evan Yeung
  • [49563f1]: Fix incorrect error message for Relay Resolver missing function param by Evan Yeung
  • [24510ae]: Improve error messages for Relay Resolver schema generation imports by Evan Yeung
  • [433c93e]: Improve error messages for resolver schema generation by Evan Yeung
  • [d1749df]: Add weak type definitions to Flow resolvers by Evan Yeung
  • [8fa3d43]: Crate for extracting type information from JS definitions by Tianyu Yao


We've added an experimental new directive to allow fragments to appear as fields. This can enable you, or optionally require you, to check if a fragment was fetched before using it.

Error Handling and Semantic Nullability

As part of our involvement with the GraphQL Nullability Working Group we are exploring features to enable explicit error handling and semantic nullability. Neither of these features are officially available yet, but we're excited about what will become possible here.

  • [af1f9de]: Disallow required on non-null and semanticNonNull fields by Gordy French
  • [56c099a]: Fix non-null-required validator's field traversal by Gordy French
  • [470c814]: Create CatchField for @catch on Scalar by Itamar Kestenbaum
  • [38655ec]: Create CatchField for @catch and throw unimplemented by Itamar Kestenbaum
  • [7bfd200]: Emit proper Flow for semanticNonNull RelayResolverValue by Gordy French
  • [88a6ff9]: Fix semanticNonNull levels support in resolver docblock by Gordy French
  • [c7d46c3]: Create CatchField feature flag by Itamar Kestenbaum
  • [696a1b3]: Support @catch directive in RelayReader by Itamar Kestenbaum
  • [d1cf472]: Emit semanticNonNull in generated schema by Gordy French
  • [ddfa2b0]: Parse semanticNonNull from docblock by Gordy French
  • [145c788]: Add allow_non_null_resolver_fields feature flag by Gordy French
  • [cebc7f0]: Experimental support for @semanticNonNull (#4601) by Jordan Eldredge