Skip to content

Commit

Permalink
Support live resolvers that whant to return @weak type
Browse files Browse the repository at this point in the history
Summary:
For live resolvers that what to return weak object our `weakObjectWrapper` was not fully correct.

We need to wrap the result of the `read` function.

This diff changes the LiveState value, by wrapping `read` into `weakObjectWrapper` HOC.

Reviewed By: captbaritone

Differential Revision: D41037791

fbshipit-source-id: fba126cda7fe12343cbb643f42b0e963460d9cc3
  • Loading branch information
alunyov authored and facebook-github-bot committed Nov 7, 2022
1 parent d0afc51 commit 500d91b
Show file tree
Hide file tree
Showing 14 changed files with 558 additions and 14 deletions.
1 change: 1 addition & 0 deletions compiler/crates/relay-codegen/src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ pub enum Primitive {
resolver: Box<Primitive>,
key: StringKey,
plural: bool,
live: bool,
},
}

Expand Down
1 change: 1 addition & 0 deletions compiler/crates/relay-codegen/src/build_ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1049,6 +1049,7 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> {
resolver: Box::new(resolver_module),
key,
plural,
live: relay_resolver_metadata.live,
}
} else {
resolver_module
Expand Down
9 changes: 8 additions & 1 deletion compiler/crates/relay-codegen/src/printer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -520,11 +520,13 @@ impl<'b> JSONPrinter<'b> {
resolver,
key,
plural,
live,
} => self.write_relay_resolver_weak_object_wrapper(
f,
resolver,
*key,
*plural,
*live,
indent,
is_dedupe_var,
),
Expand Down Expand Up @@ -621,11 +623,16 @@ impl<'b> JSONPrinter<'b> {
resolver: &Primitive,
key: StringKey,
plural: bool,
live: bool,
indent: usize,
is_dedupe_var: bool,
) -> FmtResult {
let relay_runtime_experimental = "relay-runtime/experimental";
let weak_object_wrapper = "weakObjectWrapper";
let weak_object_wrapper = if live {
"weakObjectWrapperLive"
} else {
"weakObjectWrapper"
};

self.write_js_dependency(
f,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
==================================== INPUT ====================================
query relayResolverLiveWeakObject_Query {
client_types {
__typename
}
}

# %extensions%

scalar MyClientTypeModel @__RelayCustomScalar(path: "/path/to/test/fixture/weak-type.js", export_name: "MyClientType")

type MyClientType @__RelayResolverModel @RelayOutputType @__RelayWeakObject {
__relay_model_instance: MyClientTypeModel
}

extend type Query {
client_types: MyClientType @relay_resolver(
fragment_name: "MyClientType____relay_model_instance"
import_path: "./path/to/ClientTypeResolver.js"
has_output_type: true
live: true,
)
}
==================================== OUTPUT ===================================
{
"kind": "SplitOperation",
"metadata": {},
"name": "Query__client_types$normalization",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__relay_model_instance",
"storageKey": null
}
]
}
]
}

{
"fragment": {
"argumentDefinitions": [],
"kind": "Fragment",
"metadata": {
"hasClientEdges": true
},
"name": "relayResolverLiveWeakObject_Query",
"selections": [
{
"kind": "ClientEdgeToClientObject",
"concreteType": "MyClientType",
"backingField": {
"alias": null,
"args": null,
"fragment": {
"args": null,
"kind": "FragmentSpread",
"name": "MyClientType____relay_model_instance"
},
"kind": "RelayLiveResolver",
"name": "client_types",
"resolverModule": require('relay-runtime/experimental').weakObjectWrapperLive(require('ClientTypeResolver'), '__relay_model_instance', false),
"path": "client_types",
"normalizationInfo": {
"concreteType": "MyClientType",
"plural": false,
"normalizationNode": require('Query__client_types$normalization.graphql')
}
},
"linkedField": {
"alias": null,
"args": null,
"concreteType": "MyClientType",
"kind": "LinkedField",
"name": "client_types",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
}
],
"storageKey": null
}
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [],
"kind": "Operation",
"name": "relayResolverLiveWeakObject_Query",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"name": "client_types",
"args": null,
"fragment": {
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__relay_model_instance",
"storageKey": null
}
],
"type": "MyClientType",
"abstractKey": null
},
"kind": "RelayResolver",
"storageKey": null
}
]
}
]
},
"params": {
"cacheID": "b9f4901608de1ebafc06cb1f4ecaec9a",
"id": null,
"metadata": {},
"name": "relayResolverLiveWeakObject_Query",
"operationKind": "query",
"text": null
}
}

QUERY:

Query Text is Empty.

{
"argumentDefinitions": [],
"kind": "Fragment",
"metadata": null,
"name": "MyClientType____relay_model_instance",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__relay_model_instance",
"storageKey": null
}
]
}
],
"type": "MyClientType",
"abstractKey": null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
query relayResolverLiveWeakObject_Query {
client_types {
__typename
}
}

# %extensions%

scalar MyClientTypeModel @__RelayCustomScalar(path: "/path/to/test/fixture/weak-type.js", export_name: "MyClientType")

type MyClientType @__RelayResolverModel @RelayOutputType @__RelayWeakObject {
__relay_model_instance: MyClientTypeModel
}

extend type Query {
client_types: MyClientType @relay_resolver(
fragment_name: "MyClientType____relay_model_instance"
import_path: "./path/to/ClientTypeResolver.js"
has_output_type: true
live: true,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<<2dc303928ff3615db2ad2ba0e7a5aff2>>
* @generated SignedSource<<91eb3240b55e761ddf8a237ee850be9c>>
*/

mod compile_relay_artifacts;
Expand Down Expand Up @@ -1111,6 +1111,13 @@ fn relay_resolver_es_modules() {
test_fixture(transform_fixture, "relay-resolver-es-modules.graphql", "compile_relay_artifacts/fixtures/relay-resolver-es-modules.expected", input, expected);
}

#[test]
fn relay_resolver_live_weak_object() {
let input = include_str!("compile_relay_artifacts/fixtures/relay-resolver-live-weak-object.graphql");
let expected = include_str!("compile_relay_artifacts/fixtures/relay-resolver-live-weak-object.expected");
test_fixture(transform_fixture, "relay-resolver-live-weak-object.graphql", "compile_relay_artifacts/fixtures/relay-resolver-live-weak-object.expected", input, expected);
}

#[test]
fn relay_resolver_named_import() {
let input = include_str!("compile_relay_artifacts/fixtures/relay-resolver-named-import.graphql");
Expand Down
39 changes: 39 additions & 0 deletions packages/react-relay/__tests__/RelayResolverModel-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const RelayNetwork = require('relay-runtime/network/RelayNetwork');
const {graphql} = require('relay-runtime/query/GraphQLTag');
const {
addTodo,
completeTodo,
resetStore,
} = require('relay-runtime/store/__tests__/resolvers/ExampleTodoStore');
const LiveResolverStore = require('relay-runtime/store/experimental-live-resolvers/LiveResolverStore.js');
Expand Down Expand Up @@ -238,4 +239,42 @@ describe.each([
);
expect(renderer.toJSON()).toEqual('Test todo - red');
});

test('read live @weak resolver field', () => {
function TodoComponentWithPluralResolverComponent(props: {todoID: string}) {
const data = useClientQuery(
graphql`
query RelayResolverModelTestWeakLiveFieldQuery($id: ID!) {
live_todo_description(todoID: $id) {
text
color
}
}
`,
{id: props.todoID},
);
if (data?.live_todo_description == null) {
return null;
}

return `${data.live_todo_description?.text ?? 'unknown'} - ${
data.live_todo_description?.color ?? 'unknown'
}`;
}

addTodo('Test todo');

const renderer = TestRenderer.create(
<EnvironmentWrapper environment={environment}>
<TodoComponentWithPluralResolverComponent todoID="todo-1" />
</EnvironmentWrapper>,
);
expect(renderer.toJSON()).toEqual('Test todo - red');

TestRenderer.act(() => {
completeTodo('todo-1');
jest.runAllImmediates();
});
expect(renderer.toJSON()).toEqual('Test todo - green');
});
});
Loading

0 comments on commit 500d91b

Please sign in to comment.