From 22a3c89f9518d5c9bd84c0bde9fd5ec94c4ed13f Mon Sep 17 00:00:00 2001 From: Alex Danoff Date: Mon, 30 Oct 2023 17:27:08 -0700 Subject: [PATCH] import ClientRequest for client only mutations Reviewed By: alunyov Differential Revision: D50805852 fbshipit-source-id: 222e4e81becfa62b108afdb1fab17189f7163d3b --- .../build_project/artifact_generated_types.rs | 8 +- .../client_mutation_extension.expected | 103 +++++++++++++++ .../fixtures/client_mutation_extension.input | 28 +++++ .../client_mutation_resolver.expected | 117 ++++++++++++++++++ .../fixtures/client_mutation_resolver.input | 23 ++++ .../tests/relay_compiler_integration_test.rs | 16 ++- .../relay-runtime/util/RelayConcreteNode.js | 2 +- 7 files changed, 294 insertions(+), 3 deletions(-) create mode 100644 compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_extension.expected create mode 100644 compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_extension.input create mode 100644 compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_resolver.expected create mode 100644 compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_resolver.input diff --git a/compiler/crates/relay-compiler/src/build_project/artifact_generated_types.rs b/compiler/crates/relay-compiler/src/build_project/artifact_generated_types.rs index e59e1066a8c05..3152d2eb87bcc 100644 --- a/compiler/crates/relay-compiler/src/build_project/artifact_generated_types.rs +++ b/compiler/crates/relay-compiler/src/build_project/artifact_generated_types.rs @@ -43,7 +43,13 @@ impl ArtifactGeneratedTypes { ("Query", "ConcreteRequest, Query") } } - OperationKind::Mutation => ("Mutation", "ConcreteRequest, Mutation"), + OperationKind::Mutation => { + if is_client_only { + ("Mutation", "ClientRequest, Mutation") + } else { + ("Mutation", "ConcreteRequest, Mutation") + } + } OperationKind::Subscription => ( "GraphQLSubscription", "ConcreteRequest, GraphQLSubscription", diff --git a/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_extension.expected b/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_extension.expected new file mode 100644 index 0000000000000..91c78c570cdc1 --- /dev/null +++ b/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_extension.expected @@ -0,0 +1,103 @@ +==================================== INPUT ==================================== +//- bar.js +graphql`mutation barMutation { + foo_mutation +}` + +//- relay.config.json +{ + "language": "flow", + "schema": "./schema.graphql", + "eagerEsModules": true, + "featureFlags": { + "enable_relay_resolver_transform": true + }, + "schemaExtensions": [ + "./extensions.graphql" + ] +} + +//- schema.graphql + +type Mutation + + +//- extensions.graphql + +extend type Mutation { + foo_mutation: Boolean +} +==================================== OUTPUT =================================== +//- __generated__/barMutation.graphql.js +/** + * SignedSource<<8c2ec235b8b068c2c2fffbc3aae787b8>> + * @flow + * @lightSyntaxTransform + * @nogrep + */ + +/* eslint-disable */ + +'use strict'; + +/*:: +import type { ClientRequest, Mutation } from 'relay-runtime'; +export type barMutation$variables = {||}; +export type barMutation$data = {| + +foo_mutation: ?boolean, +|}; +export type barMutation = {| + response: barMutation$data, + variables: barMutation$variables, +|}; +*/ + +var node/*: ClientRequest*/ = (function(){ +var v0 = [ + { + "kind": "ClientExtension", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "foo_mutation", + "storageKey": null + } + ] + } +]; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "barMutation", + "selections": (v0/*: any*/), + "type": "Mutation", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "barMutation", + "selections": (v0/*: any*/) + }, + "params": { + "cacheID": "b7409af7b3a13247f776ad3f9192c84b", + "id": null, + "metadata": {}, + "name": "barMutation", + "operationKind": "mutation", + "text": null + } +}; +})(); + +(node/*: any*/).hash = "1f3610a117a92bb877caf826f77fae63"; + +export default ((node/*: any*/)/*: Mutation< + barMutation$variables, + barMutation$data, +>*/); diff --git a/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_extension.input b/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_extension.input new file mode 100644 index 0000000000000..2710b47d052a2 --- /dev/null +++ b/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_extension.input @@ -0,0 +1,28 @@ +//- bar.js +graphql`mutation barMutation { + foo_mutation +}` + +//- relay.config.json +{ + "language": "flow", + "schema": "./schema.graphql", + "eagerEsModules": true, + "featureFlags": { + "enable_relay_resolver_transform": true + }, + "schemaExtensions": [ + "./extensions.graphql" + ] +} + +//- schema.graphql + +type Mutation + + +//- extensions.graphql + +extend type Mutation { + foo_mutation: Boolean +} diff --git a/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_resolver.expected b/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_resolver.expected new file mode 100644 index 0000000000000..65d6c2be5d878 --- /dev/null +++ b/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_resolver.expected @@ -0,0 +1,117 @@ +==================================== INPUT ==================================== +//- foo.js +/** + * @RelayResolver Mutation.foo_mutation: Boolean + */ + +//- bar.js +graphql`mutation barMutation { + foo_mutation +}` + +//- relay.config.json +{ + "language": "flow", + "schema": "./schema.graphql", + "eagerEsModules": true, + "featureFlags": { + "enable_relay_resolver_transform": true + } +} + +//- schema.graphql + +type Mutation +==================================== OUTPUT =================================== +//- __generated__/barMutation.graphql.js +/** + * SignedSource<<7f1de50339842bab9cecc72c6fbc076f>> + * @flow + * @lightSyntaxTransform + * @nogrep + */ + +/* eslint-disable */ + +'use strict'; + +/*:: +import type { ClientRequest, Mutation } from 'relay-runtime'; +import {foo_mutation as mutationFooMutationResolverType} from "../foo.js"; +// Type assertion validating that `mutationFooMutationResolverType` resolver is correctly implemented. +// A type error here indicates that the type signature of the resolver module is incorrect. +(mutationFooMutationResolverType: () => ?boolean); +export type barMutation$variables = {||}; +export type barMutation$data = {| + +foo_mutation: ?boolean, +|}; +export type barMutation = {| + response: barMutation$data, + variables: barMutation$variables, +|}; +*/ + +import {foo_mutation as mutationFooMutationResolver} from './../foo'; + +var node/*: ClientRequest*/ = { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "barMutation", + "selections": [ + { + "kind": "ClientExtension", + "selections": [ + { + "alias": null, + "args": null, + "fragment": null, + "kind": "RelayResolver", + "name": "foo_mutation", + "resolverModule": mutationFooMutationResolver, + "path": "foo_mutation" + } + ] + } + ], + "type": "Mutation", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "barMutation", + "selections": [ + { + "kind": "ClientExtension", + "selections": [ + { + "name": "foo_mutation", + "args": null, + "fragment": null, + "kind": "RelayResolver", + "storageKey": null, + "isOutputType": true + } + ] + } + ] + }, + "params": { + "cacheID": "b7409af7b3a13247f776ad3f9192c84b", + "id": null, + "metadata": {}, + "name": "barMutation", + "operationKind": "mutation", + "text": null + } +}; + +(node/*: any*/).hash = "1f3610a117a92bb877caf826f77fae63"; + +export default ((node/*: any*/)/*: Mutation< + barMutation$variables, + barMutation$data, +>*/); diff --git a/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_resolver.input b/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_resolver.input new file mode 100644 index 0000000000000..92b1e5115c85a --- /dev/null +++ b/compiler/crates/relay-compiler/tests/relay_compiler_integration/fixtures/client_mutation_resolver.input @@ -0,0 +1,23 @@ +//- foo.js +/** + * @RelayResolver Mutation.foo_mutation: Boolean + */ + +//- bar.js +graphql`mutation barMutation { + foo_mutation +}` + +//- relay.config.json +{ + "language": "flow", + "schema": "./schema.graphql", + "eagerEsModules": true, + "featureFlags": { + "enable_relay_resolver_transform": true + } +} + +//- schema.graphql + +type Mutation diff --git a/compiler/crates/relay-compiler/tests/relay_compiler_integration_test.rs b/compiler/crates/relay-compiler/tests/relay_compiler_integration_test.rs index 9726da51be8f0..c65b2b416b317 100644 --- a/compiler/crates/relay-compiler/tests/relay_compiler_integration_test.rs +++ b/compiler/crates/relay-compiler/tests/relay_compiler_integration_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<<04c298d7b18b4ef4e4be2c9c820b2e46>> + * @generated SignedSource<<6a4360c4cb2d5b7641f3a41ae33f6a27>> */ mod relay_compiler_integration; @@ -12,6 +12,20 @@ mod relay_compiler_integration; use relay_compiler_integration::transform_fixture; use fixture_tests::test_fixture; +#[tokio::test] +async fn client_mutation_extension() { + let input = include_str!("relay_compiler_integration/fixtures/client_mutation_extension.input"); + let expected = include_str!("relay_compiler_integration/fixtures/client_mutation_extension.expected"); + test_fixture(transform_fixture, "client_mutation_extension.input", "relay_compiler_integration/fixtures/client_mutation_extension.expected", input, expected).await; +} + +#[tokio::test] +async fn client_mutation_resolver() { + let input = include_str!("relay_compiler_integration/fixtures/client_mutation_resolver.input"); + let expected = include_str!("relay_compiler_integration/fixtures/client_mutation_resolver.expected"); + test_fixture(transform_fixture, "client_mutation_resolver.input", "relay_compiler_integration/fixtures/client_mutation_resolver.expected", input, expected).await; +} + #[tokio::test] async fn simple_fragment() { let input = include_str!("relay_compiler_integration/fixtures/simple_fragment.input"); diff --git a/packages/relay-runtime/util/RelayConcreteNode.js b/packages/relay-runtime/util/RelayConcreteNode.js index 776851f3d72a7..07a1adddec455 100644 --- a/packages/relay-runtime/util/RelayConcreteNode.js +++ b/packages/relay-runtime/util/RelayConcreteNode.js @@ -74,7 +74,7 @@ export type ClientRequestParameters = { +text: null, // common fields +name: string, - +operationKind: 'query', + +operationKind: 'query' | 'mutation', +providedVariables?: ProvidedVariablesType, +metadata: {[key: string]: mixed, ...}, };