1"use strict";(self.webpackChunk=self.webpackChunk||[]).push([["11571"],{1198(e,i,t){t.r(i),t.d(i,{assets:()=>s,contentTitle:()=>c,default:()=>m,frontMatter:()=>a,metadata:()=>o,toc:()=>l});var o=t(32500),n=t(74848),r=t(28453);let a={title:"Relay v20.0",author:"The Relay Team",hide_table_of_contents:!1},c="Version 20.0.0 Release Notes",s={authorsImageUrls:[void 0]},l=[{value:"Announcement: ESLint Plugin v2.0.0 Released",id:"announcement-eslint-plugin-v200-released",level:2},{value:"Generated Documentation",id:"generated-documentation",level:2},{value:"Breaking Changes",id:"breaking-changes",level:2},{value:"Bug fixes",id:"bug-fixes",level:2},{value:"Improvements",id:"improvements",level:2},{value:"Documentation Improvements",id:"documentation-improvements",level:2}];function d(e){let i={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h2,{id:"announcement-eslint-plugin-v200-released",children:"Announcement: ESLint Plugin v2.0.0 Released"}),"\n",(0,n.jsxs)(i.p,{children:["Relay's ESLint plugin, ",(0,n.jsx)(i.a,{href:"https://github.com/relayjs/eslint-plugin-relay",children:"eslint-plugin-relay"}),", was recently updated to v2.0.0. This release includes a number of compatibility updates and removes a couple of deprecated rules. For more info, see the ",(0,n.jsx)(i.a,{href:"https://github.com/relayjs/eslint-plugin-relay/blob/main/CHANGELOG.mdx",children:"eslint-plugin-relay changelog"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:"generated-documentation",children:"Generated Documentation"}),"\n",(0,n.jsxs)(i.p,{children:["This release includes a brand new page covering the ",(0,n.jsx)(i.a,{href:"https://relay.dev/docs/next/getting-started/compiler-config/",children:"Relay compiler config"}),". This has largely been undocumented so far and now includes autogenerated documentation! We also added tooling to autogenerate API docs from source code. The documentation for ",(0,n.jsx)(i.a,{href:"https://relay.dev/docs/next/api-reference/use-relay-environment/",children:(0,n.jsx)(i.code,{children:"useRelayEnvironment"})})," and ",(0,n.jsx)(i.a,{href:"https://relay.dev/docs/next/api-reference/use-lazy-load-query/",children:(0,n.jsx)(i.code,{children:"useLazyLoadQuery"})})," are examples of the new autogenerated tooling."]}),"\n",(0,n.jsx)(i.h2,{id:"breaking-changes",children:"Breaking Changes"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Deprecate returning non-model weak types from resolvers. If you were using client side resolvers with the ",(0,n.jsx)(i.code,{children:"@outputType"})," directive, these must be migrated to be strong or weak objects. You can continue to use the ",(0,n.jsx)(i.code,{children:"@outputType"})," directive by enabling the ",(0,n.jsx)(i.code,{children:"allow_output_type_resolvers"})," feature flag in the compiler config. (#5004) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/8fbc0b9cc87f",children:"commit"}),")"]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"bug-fixes",children:"Bug fixes"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Fix operation cleanup in RelayModernMockEnvironment by Martin Booth (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/239f6d9351b1",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fix nested @defer + 3D when server doesn't support streaming by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/00594e1b7141",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fix nested @defer when server doesn't support streaming by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/b801db036d13",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fix incremental bug where resolver artifacts were not cleaned up by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/b270988c0849",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fetch missing client edge server queries discovered in nested fragments (#4992) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/611f6d9cfc99",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Pass client edge context to resolver root fragments by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/4177f3e27b26",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fix variable name for imported model resolvers when using ES module imports (#4984) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/1073517d9842",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fix excluding generated dir under xplat_react by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/9cbd126f113e",children:"commit"}),")"]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"improvements",children:"Improvements"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Add more time loggings in try_saved_state by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/cba7007c7aaf",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Log saved state info query time in relay compiler by Lynn Yu (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/60b906b921a4",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Annotate read time resolver promises by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/5ec796e48509",children:"commit"}),")"]}
1),"\n",(0,n.jsxs)(i.li,{children:["Add VSCode tasks for common commands (#5003) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/6ab766a3e684",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Surface prefetchExpiryInHours from the entrypoint by Alice Liu (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/ca7ddea7ed4b",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Regression test for client edge server data discovered missing in resolver root fragment (#4994) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/48c81ad22bbf",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Run client edge tests for both versions of useFragment by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/16cd20078c84",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Update babel transform to default to ES modules to match compiler behavior (#4982) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/281d76a0b0b4",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Stop unnecessary runtime transforms by Lynn Yu (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/1eca4a5720ee",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Support enquoted field alias by Arseniy Panfilov (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/1182ca64e0a0",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Parser option to allow literal string aliases by Arseniy Panfilov (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/fb9f4d7fcb10",children:"commit"}),")"]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"documentation-improvements",children:"Documentation Improvements"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Update graphql.md readability (#5018) by Josh Maloon (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/9facd47af415",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Add argument definitions to usePaginationFragment docs (#5015) by DrillableBit (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/2b85d3740f40",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Remove docs on comet_routing_prefetch by Nithik Balachandran (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/5cb92f41b9fc",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fix typo in description of the @throwOnFieldError directive by Marius Schulz (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/abedb68a3ad1",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["A couple grammar fixes (#5008) by Roman A (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/8c30f80fe6a2",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Replace out of date compiler readme with link to up-to-date docs page (#5005) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/2c773876c7e8",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Handle args and returns, convert useLazyLoadQuery by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/c3b70bc3a787",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Parse some docblock syntax and gen markdown for ",(0,n.jsx)(i.code,{children:"useRelayEnvironment"})," by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/9b7f643c006b",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Pass compiler config json schema as a prop (#4997) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/9f242bb00f54",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Add docs page describing the Relay lint rules by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/7eca724d0aea",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Prevent json schema css for h2 from leaking into the rest of the site by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/35229211f119",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Compiler Docs: Improve separators in JSON arrays and objects (#4990) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/e59619e23998",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Make comment into doc comment in config struct (#4989) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/0b10aa591cf1",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fill in missing documentation in compiler config by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/70b27dfdfa16",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Add page documenting the compiler config (#4985) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/50fcf8726308",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Add missing generic type parameter for mutation tutorial example (#4981) by Joey Yu (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/f25a9d19aa91",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fixups to quickstart (#4983) by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/3de18da10cdf",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Update quick start guide to align with new version of Relay by Jordan Eldredge (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/19c33bbb4d02",children:"commit"}),")"]}),"\n"]}),"\n",(0,n.jsx)(i.h1,{id:"experimental-changes",children:"Experimental Changes"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Do not mark a query as inactive when waiting for resolver or server payload by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/dce1a2eaa7ec",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["In a exec time query, mark query as completed if all initial payloads are received by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/ba09a88925c0",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Fix operation executor for exec time by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/4136a8cd71d9",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Expose a loadClientQuery helper by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/21926a531f4f",children:"commit"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["Support normalized responses in OperationExecutor by Tianyu Yao (",(0,n.jsx)(i.a,{href:"https://github.com/facebook/relay/commit/f3a9afa895ba",children:"commit"}),")"]}),"\n"]})]})}function m(e={}){let{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},28453(e,i,t){t.d(i,{R:()=>a,x:()=>c});var o=t(96540);let n={},r=o.createContext(n);function a(e){let i=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(r.Provider,{value:i},e.children)}},32500(e){e.exports=JSON.parse('{"permalink":"/blog/2025/06/13/relay-20","source":"@site/blog/2025-06-13-relay-20.mdx","title":"Relay v20.0","description":"Announcement: ESLint Plugin v2.0.0 Released","date":"2025-06-13T00:00:00.000Z","tags":[],"readingTime":4.81,"hasTruncateMarker":false,"authors":[{"name":"The Relay Team","key":null,"page":null}],"frontMatter":{"title":"Relay v20.0","author":"The Relay Team","hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Relay v21.0","permalink":"/blog/2026/05/18/relay-21"},"nextItem":{"title":"Relay v19.0","permalink":"/blog/2025/04/02/relay-19"}}')}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.