From 4f2f6a9c175b73f8a43bb7e5428da5a0c764381d Mon Sep 17 00:00:00 2001 From: Ernie Turner Date: Thu, 6 Apr 2023 14:45:01 -0600 Subject: [PATCH 1/7] Demo bug with TS generation for Relay Resolvers --- ...ype-relay-resolver-value-required.expected | 46 +++++++++++++++++++ ...type-relay-resolver-value-required.graphql | 19 ++++++++ ...-output-type-relay-resolver-value.expected | 46 +++++++++++++++++++ ...h-output-type-relay-resolver-value.graphql | 19 ++++++++ .../tests/generate_typescript_test.rs | 14 ++++++ 5 files changed, 144 insertions(+) create mode 100644 compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected create mode 100644 compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.graphql create mode 100644 compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected create mode 100644 compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.graphql diff --git a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected new file mode 100644 index 0000000000000..226130f3a8541 --- /dev/null +++ b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected @@ -0,0 +1,46 @@ +==================================== INPUT ==================================== +fragment Foo_user on User { + poppy: pop_star_name @required(action: THROW) +} + +fragment PopStarNameResolverFragment_name on User { + name + address { + street + } + parents { + lastName + } +} + +# %extensions% + +extend type User { + pop_star_name: RelayResolverValue @relay_resolver(fragment_name: "PopStarNameResolverFragment_name", import_path: "PopStarNameResolver", has_output_type: true) +} +==================================== OUTPUT =================================== +import { FragmentRefs } from "relay-runtime"; +export type Foo_user$data = { + readonly poppy: NonNullable>; + readonly " $fragmentType": "Foo_user"; +}; +export type Foo_user$key = { + readonly " $data"?: Foo_user$data; + readonly " $fragmentSpreads": FragmentRefs<"Foo_user">; +}; +------------------------------------------------------------------------------- +import { FragmentRefs } from "relay-runtime"; +export type PopStarNameResolverFragment_name$data = { + readonly address: { + readonly street: string | null; + } | null; + readonly name: string | null; + readonly parents: ReadonlyArray<{ + readonly lastName: string | null; + }>; + readonly " $fragmentType": "PopStarNameResolverFragment_name"; +}; +export type PopStarNameResolverFragment_name$key = { + readonly " $data"?: PopStarNameResolverFragment_name$data; + readonly " $fragmentSpreads": FragmentRefs<"PopStarNameResolverFragment_name">; +}; diff --git a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.graphql b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.graphql new file mode 100644 index 0000000000000..89bdd35c24b41 --- /dev/null +++ b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.graphql @@ -0,0 +1,19 @@ +fragment Foo_user on User { + poppy: pop_star_name @required(action: THROW) +} + +fragment PopStarNameResolverFragment_name on User { + name + address { + street + } + parents { + lastName + } +} + +# %extensions% + +extend type User { + pop_star_name: RelayResolverValue @relay_resolver(fragment_name: "PopStarNameResolverFragment_name", import_path: "PopStarNameResolver", has_output_type: true) +} \ No newline at end of file diff --git a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected new file mode 100644 index 0000000000000..045b731910eae --- /dev/null +++ b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected @@ -0,0 +1,46 @@ +==================================== INPUT ==================================== +fragment Foo_user on User { + poppy: pop_star_name +} + +fragment PopStarNameResolverFragment_name on User { + name + address { + street + } + parents { + lastName + } +} + +# %extensions% + +extend type User { + pop_star_name: RelayResolverValue @relay_resolver(fragment_name: "PopStarNameResolverFragment_name", import_path: "PopStarNameResolver", has_output_type: true) +} +==================================== OUTPUT =================================== +import { FragmentRefs } from "relay-runtime"; +export type Foo_user$data = { + readonly poppy: ReturnType | null; + readonly " $fragmentType": "Foo_user"; +}; +export type Foo_user$key = { + readonly " $data"?: Foo_user$data; + readonly " $fragmentSpreads": FragmentRefs<"Foo_user">; +}; +------------------------------------------------------------------------------- +import { FragmentRefs } from "relay-runtime"; +export type PopStarNameResolverFragment_name$data = { + readonly address: { + readonly street: string | null; + } | null; + readonly name: string | null; + readonly parents: ReadonlyArray<{ + readonly lastName: string | null; + }>; + readonly " $fragmentType": "PopStarNameResolverFragment_name"; +}; +export type PopStarNameResolverFragment_name$key = { + readonly " $data"?: PopStarNameResolverFragment_name$data; + readonly " $fragmentSpreads": FragmentRefs<"PopStarNameResolverFragment_name">; +}; diff --git a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.graphql b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.graphql new file mode 100644 index 0000000000000..87e2935762048 --- /dev/null +++ b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.graphql @@ -0,0 +1,19 @@ +fragment Foo_user on User { + poppy: pop_star_name +} + +fragment PopStarNameResolverFragment_name on User { + name + address { + street + } + parents { + lastName + } +} + +# %extensions% + +extend type User { + pop_star_name: RelayResolverValue @relay_resolver(fragment_name: "PopStarNameResolverFragment_name", import_path: "PopStarNameResolver", has_output_type: true) +} \ No newline at end of file diff --git a/compiler/crates/relay-typegen/tests/generate_typescript_test.rs b/compiler/crates/relay-typegen/tests/generate_typescript_test.rs index 62d4d84af37be..91594cdcf67b0 100644 --- a/compiler/crates/relay-typegen/tests/generate_typescript_test.rs +++ b/compiler/crates/relay-typegen/tests/generate_typescript_test.rs @@ -257,6 +257,20 @@ fn relay_resolver_with_output_type_client_object() { test_fixture(transform_fixture, "relay-resolver-with-output-type-client-object.graphql", "generate_typescript/fixtures/relay-resolver-with-output-type-client-object.expected", input, expected); } +#[test] +fn relay_resolver_with_output_type_relay_resolver_value() { + let input = include_str!("generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.graphql"); + let expected = include_str!("generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected"); + test_fixture(transform_fixture, "relay-resolver-with-output-type-relay-resolver-value.graphql", "generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected", input, expected); +} + +#[test] +fn relay_resolver_with_output_type_relay_resolver_value_required() { + let input = include_str!("generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.graphql"); + let expected = include_str!("generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected"); + test_fixture(transform_fixture, "relay-resolver-with-output-type-relay-resolver-value-required.graphql", "generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected", input, expected); +} + #[test] fn relay_weak_client_type() { let input = include_str!("generate_typescript/fixtures/relay-weak-client-type.graphql"); From eb23f7a13b30c427cef75a05d03e42292e186f6f Mon Sep 17 00:00:00 2001 From: Ernie Date: Mon, 25 Sep 2023 15:21:40 -0600 Subject: [PATCH 2/7] Remove exclusion of Relay Resolver import when doing typegen for Typescript projects --- compiler/crates/relay-typegen/src/write.rs | 14 ++------------ ...lver-with-output-type-client-interface.expected | 1 + ...esolver-with-output-type-client-object.expected | 1 + ...put-type-relay-resolver-value-required.expected | 1 + ...-with-output-type-relay-resolver-value.expected | 1 + 5 files changed, 6 insertions(+), 12 deletions(-) diff --git a/compiler/crates/relay-typegen/src/write.rs b/compiler/crates/relay-typegen/src/write.rs index f433ed99c1942..d233f8e0e91a2 100644 --- a/compiler/crates/relay-typegen/src/write.rs +++ b/compiler/crates/relay-typegen/src/write.rs @@ -164,7 +164,7 @@ pub(crate) fn write_operation_type_exports_section( write_import_actor_change_point(actor_change_status, writer)?; runtime_imports.write_runtime_imports(writer)?; write_fragment_imports(typegen_context, None, encountered_fragments, writer)?; - write_relay_resolver_imports(typegen_context, imported_resolvers, writer)?; + write_relay_resolver_imports(imported_resolvers, writer)?; write_split_raw_response_type_imports(typegen_context, imported_raw_response_types, writer)?; let mut input_object_types = IndexMap::default(); @@ -423,7 +423,7 @@ pub(crate) fn write_fragment_type_exports_section( write_custom_scalar_imports(custom_scalars, writer)?; runtime_imports.write_runtime_imports(writer)?; - write_relay_resolver_imports(typegen_context, imported_resolvers, writer)?; + write_relay_resolver_imports(imported_resolvers, writer)?; let refetchable_metadata = RefetchableMetadata::find(&fragment_definition.directives); let fragment_type_name = format!("{}$fragmentType", fragment_name); @@ -548,19 +548,9 @@ fn write_import_actor_change_point( } fn write_relay_resolver_imports( - typegen_context: &'_ TypegenContext<'_>, mut imported_resolvers: ImportedResolvers, writer: &mut Box, ) -> FmtResult { - // We don't need to import resolver modules in the type-generation - // they should be imported in the codegen. - if matches!( - typegen_context.project_config.typegen_config.language, - TypegenLanguage::TypeScript - ) { - return Ok(()); - } - imported_resolvers.0.sort_keys(); for resolver in imported_resolvers.0.values() { match resolver.resolver_name { diff --git a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-client-interface.expected b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-client-interface.expected index 18d7d97b6e360..5bcea9341d1bf 100644 --- a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-client-interface.expected +++ b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-client-interface.expected @@ -67,6 +67,7 @@ export type User__pop_star_name$normalization = { }; ------------------------------------------------------------------------------- import type { FragmentRefs } from "relay-runtime"; +import userPopStarNameResolverType from "PopStarNameResolver"; export type Foo_user$data = { readonly poppy: { readonly name: string | null; diff --git a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-client-object.expected b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-client-object.expected index 273def7834516..60ae9667cc3e7 100644 --- a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-client-object.expected +++ b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-client-object.expected @@ -37,6 +37,7 @@ export type User__pop_star_name$normalization = { }; ------------------------------------------------------------------------------- import type { FragmentRefs } from "relay-runtime"; +import userPopStarNameResolverType from "PopStarNameResolver"; export type Foo_user$data = { readonly poppy: { readonly name: string | null; diff --git a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected index 226130f3a8541..711e7038c6fb1 100644 --- a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected +++ b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value-required.expected @@ -20,6 +20,7 @@ extend type User { } ==================================== OUTPUT =================================== import { FragmentRefs } from "relay-runtime"; +import userPopStarNameResolverType from "PopStarNameResolver"; export type Foo_user$data = { readonly poppy: NonNullable>; readonly " $fragmentType": "Foo_user"; diff --git a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected index 045b731910eae..2d7ba1dc17d12 100644 --- a/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected +++ b/compiler/crates/relay-typegen/tests/generate_typescript/fixtures/relay-resolver-with-output-type-relay-resolver-value.expected @@ -20,6 +20,7 @@ extend type User { } ==================================== OUTPUT =================================== import { FragmentRefs } from "relay-runtime"; +import userPopStarNameResolverType from "PopStarNameResolver"; export type Foo_user$data = { readonly poppy: ReturnType | null; readonly " $fragmentType": "Foo_user"; From fe40be8efb13e66d19ae73f54c9f4f5fd66d048a Mon Sep 17 00:00:00 2001 From: Ernie Date: Mon, 25 Sep 2023 15:30:25 -0600 Subject: [PATCH 3/7] Update yarn.lock to attempt to get CI to pass --- yarn.lock | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index b0ef1d5a4b09a..2f2ec997d2abf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3159,6 +3159,7 @@ eslint-plugin-react@7.30.1: "eslint-plugin-relay-internal@link:./packages/eslint-plugin-relay-internal": version "0.0.0" + uid "" eslint-plugin-relay@1.8.3: version "1.8.3" @@ -3643,10 +3644,10 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== -flow-bin@^0.216.1: - version "0.216.1" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.216.1.tgz#c370af830e46645087a2aea4056507cc44acc031" - integrity sha512-mdhkQiSSZ/nyPq/pmk2tdbV3btYTlTYqBT/96nSSTGQmvTWQ0no9XMLZ/SygNafL4PPerfkpwQwprA1M35+9Bg== +flow-bin@^0.217.0: + version "0.217.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.217.0.tgz#c255b4d8d815520d396416c2f712ab849d61f467" + integrity sha512-AbbDE6QUpR+jpY9ejNROAk0P5D/2PxJzjU4D5vfmMwtS+QjjPjzfZGuatEJIn2k4PTZ2agbncaCtyHGO0AvG7A== flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.1.1" From 6b6b51657337b0d4e671606081c99415a50e677a Mon Sep 17 00:00:00 2001 From: Ernie Date: Mon, 25 Sep 2023 15:33:52 -0600 Subject: [PATCH 4/7] Fix JS lint problems --- .../relay-hooks/__tests__/loadQuery-store-behavior-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-relay/relay-hooks/__tests__/loadQuery-store-behavior-test.js b/packages/react-relay/relay-hooks/__tests__/loadQuery-store-behavior-test.js index c8e23c05074f1..060a19b4632aa 100644 --- a/packages/react-relay/relay-hooks/__tests__/loadQuery-store-behavior-test.js +++ b/packages/react-relay/relay-hooks/__tests__/loadQuery-store-behavior-test.js @@ -27,7 +27,7 @@ import type { } from './__generated__/loadQueryStoreBehaviorTestQuery.graphql'; import type {GraphQLSingularResponse} from 'relay-runtime/network/RelayNetworkTypes'; import type {Sink} from 'relay-runtime/network/RelayObservable'; -import type {OperationType, Query} from 'relay-runtime/util/RelayRuntimeTypes'; +import type {Query} from 'relay-runtime/util/RelayRuntimeTypes'; const {loadQuery} = require('../loadQuery'); const { From 783b6e3e111be2704c923c899da512160fb9c009 Mon Sep 17 00:00:00 2001 From: Ernie Date: Mon, 25 Sep 2023 15:42:42 -0600 Subject: [PATCH 5/7] Update SignedSource --- compiler/crates/relay-typegen/tests/generate_typescript_test.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/crates/relay-typegen/tests/generate_typescript_test.rs b/compiler/crates/relay-typegen/tests/generate_typescript_test.rs index 91594cdcf67b0..8261e6de4c7a9 100644 --- a/compiler/crates/relay-typegen/tests/generate_typescript_test.rs +++ b/compiler/crates/relay-typegen/tests/generate_typescript_test.rs @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<9a0b1dc4bd249d31e8cab05d665b685f>> */ mod generate_typescript; From 7652855c0af02a0082258d3c2510a04d03be7c07 Mon Sep 17 00:00:00 2001 From: Ernie Turner Date: Mon, 2 Oct 2023 14:23:16 -0600 Subject: [PATCH 6/7] Update yarn.lock --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2f2ec997d2abf..b12fdf2e92b7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3644,10 +3644,10 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== -flow-bin@^0.217.0: - version "0.217.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.217.0.tgz#c255b4d8d815520d396416c2f712ab849d61f467" - integrity sha512-AbbDE6QUpR+jpY9ejNROAk0P5D/2PxJzjU4D5vfmMwtS+QjjPjzfZGuatEJIn2k4PTZ2agbncaCtyHGO0AvG7A== +flow-bin@^0.217.2: + version "0.217.2" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.217.2.tgz#96affa17f3cb303019f740bffeb28cfab7ce1250" + integrity sha512-fk4NcfybYjzlww1sEsfk71nqXvonAYpMRFEjmZxibDWWBiaw8DGmqXWZ7XzSunVB15VkJfOstn/sYP1EYPPyWg== flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.1.1" From 7a8084348615332330a5cdb3e7d8e8abddfc4043 Mon Sep 17 00:00:00 2001 From: Ernie Turner Date: Wed, 4 Oct 2023 10:16:33 -0600 Subject: [PATCH 7/7] Update cargo.lock --- compiler/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/Cargo.lock b/compiler/Cargo.lock index 536cef743ad08..ff3a73f2f4f98 100644 --- a/compiler/Cargo.lock +++ b/compiler/Cargo.lock @@ -428,6 +428,7 @@ dependencies = [ "relay-transforms", "rustc-hash", "schema", + "serde", "tokio", ] @@ -552,7 +553,6 @@ dependencies = [ "colored", "diff", "lazy_static", - "parking_lot", "signedsource", "tokio", ]