Skip to content

Commit 70a5ff0

Browse files
captbaritonefacebook-github-bot
authored andcommitted
Always pass an args object to resolvers that define runtime args
Reviewed By: tyao1 Differential Revision: D50863441 fbshipit-source-id: 7ad0a2d7aa8273814f67a2929033774d16cf49c0
1 parent 52b2c13 commit 70a5ff0

19 files changed

+421
-25
lines changed

compiler/crates/relay-codegen/src/build_ast.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,7 +1141,20 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> {
11411141
.project_config
11421142
.js_module_import_path(self.definition_source_location, module);
11431143

1144-
let args = self.build_arguments(field_arguments);
1144+
let args = if field.arguments.is_empty() {
1145+
Primitive::SkippableNull
1146+
} else {
1147+
self.build_arguments(field_arguments).map_or_else(
1148+
|| {
1149+
// Passing an empty array here, rather than `null`, allows the runtime
1150+
// to know that it should still create an arguments object to pass to
1151+
// the resolver, even though no arguments were provided at the callsite,
1152+
// since all arguments are optional.
1153+
Primitive::Key(self.array(vec![]))
1154+
},
1155+
Primitive::Key,
1156+
)
1157+
};
11451158

11461159
let variable_name = relay_resolver_metadata.generate_local_resolver_name(self.schema);
11471160
let resolver_js_module = JSModuleDependency {
@@ -1208,10 +1221,7 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> {
12081221
// module itself.
12091222
let mut object_props = object! {
12101223
:build_alias(field_alias, field_name),
1211-
args: match args {
1212-
None => Primitive::SkippableNull,
1213-
Some(key) => Primitive::Key(key),
1214-
},
1224+
args: args,
12151225
fragment: match fragment_primitive {
12161226
None => Primitive::SkippableNull,
12171227
Some(fragment_primitive) => fragment_primitive,

compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/relay-resolver-with-args.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ extend type User {
4646
"selections": [
4747
{
4848
"alias": null,
49-
"args": null,
49+
"args": [],
5050
"fragment": {
5151
"args": [
5252
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
==================================== INPUT ====================================
2+
query resolverFieldWithAllFragmentArgsOmitted_Query {
3+
greeting
4+
}
5+
6+
fragment resolverFieldWithAllFragmentArgsOmitted_Fragment on Query
7+
@argumentDefinitions(task_number: {type: "Int"}) {
8+
task(number: $task_number) {
9+
__typename
10+
}
11+
}
12+
13+
# %extensions%
14+
15+
extend type Query {
16+
greeting: String
17+
@relay_resolver(
18+
import_path: "./path/to/Resolver.js"
19+
root_fragment: "resolverFieldWithAllFragmentArgsOmitted_Fragment"
20+
)
21+
}
22+
==================================== OUTPUT ===================================
23+
{
24+
"fragment": {
25+
"argumentDefinitions": [],
26+
"kind": "Fragment",
27+
"metadata": null,
28+
"name": "resolverFieldWithAllFragmentArgsOmitted_Query",
29+
"selections": [
30+
{
31+
"kind": "ClientExtension",
32+
"selections": [
33+
{
34+
"alias": null,
35+
"args": null,
36+
"fragment": null,
37+
"kind": "RelayResolver",
38+
"name": "greeting",
39+
"resolverModule": require('Resolver'),
40+
"path": "greeting"
41+
}
42+
]
43+
}
44+
],
45+
"type": "Query",
46+
"abstractKey": null
47+
},
48+
"kind": "Request",
49+
"operation": {
50+
"argumentDefinitions": [],
51+
"kind": "Operation",
52+
"name": "resolverFieldWithAllFragmentArgsOmitted_Query",
53+
"selections": [
54+
{
55+
"kind": "ClientExtension",
56+
"selections": [
57+
{
58+
"name": "greeting",
59+
"args": null,
60+
"fragment": null,
61+
"kind": "RelayResolver",
62+
"storageKey": null,
63+
"isOutputType": false
64+
}
65+
]
66+
}
67+
]
68+
},
69+
"params": {
70+
"cacheID": "19967942cdd7d0f409f239fcaf48f375",
71+
"id": null,
72+
"metadata": {},
73+
"name": "resolverFieldWithAllFragmentArgsOmitted_Query",
74+
"operationKind": "query",
75+
"text": null
76+
}
77+
}
78+
79+
QUERY:
80+
81+
Query Text is Empty.
82+
83+
{
84+
"argumentDefinitions": [
85+
{
86+
"defaultValue": null,
87+
"kind": "LocalArgument",
88+
"name": "task_number"
89+
}
90+
],
91+
"kind": "Fragment",
92+
"metadata": null,
93+
"name": "resolverFieldWithAllFragmentArgsOmitted_Fragment",
94+
"selections": [
95+
{
96+
"alias": null,
97+
"args": [
98+
{
99+
"kind": "Variable",
100+
"name": "number",
101+
"variableName": "task_number"
102+
}
103+
],
104+
"concreteType": "Task",
105+
"kind": "LinkedField",
106+
"name": "task",
107+
"plural": false,
108+
"selections": [
109+
{
110+
"alias": null,
111+
"args": null,
112+
"kind": "ScalarField",
113+
"name": "__typename",
114+
"storageKey": null
115+
}
116+
],
117+
"storageKey": null
118+
}
119+
],
120+
"type": "Query",
121+
"abstractKey": null
122+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
query resolverFieldWithAllFragmentArgsOmitted_Query {
2+
greeting
3+
}
4+
5+
fragment resolverFieldWithAllFragmentArgsOmitted_Fragment on Query
6+
@argumentDefinitions(task_number: {type: "Int"}) {
7+
task(number: $task_number) {
8+
__typename
9+
}
10+
}
11+
12+
# %extensions%
13+
14+
extend type Query {
15+
greeting: String
16+
@relay_resolver(
17+
import_path: "./path/to/Resolver.js"
18+
root_fragment: "resolverFieldWithAllFragmentArgsOmitted_Fragment"
19+
)
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
==================================== INPUT ====================================
2+
query resolverFieldWithAllRuntimeArgsOmitted_Query {
3+
greeting
4+
}
5+
6+
# %extensions%
7+
8+
extend type Query {
9+
greeting(salutation: String): String
10+
@relay_resolver(import_path: "./path/to/Resolver.js")
11+
}
12+
==================================== OUTPUT ===================================
13+
{
14+
"fragment": {
15+
"argumentDefinitions": [],
16+
"kind": "Fragment",
17+
"metadata": null,
18+
"name": "resolverFieldWithAllRuntimeArgsOmitted_Query",
19+
"selections": [
20+
{
21+
"kind": "ClientExtension",
22+
"selections": [
23+
{
24+
"alias": null,
25+
"args": [],
26+
"fragment": null,
27+
"kind": "RelayResolver",
28+
"name": "greeting",
29+
"resolverModule": require('Resolver'),
30+
"path": "greeting"
31+
}
32+
]
33+
}
34+
],
35+
"type": "Query",
36+
"abstractKey": null
37+
},
38+
"kind": "Request",
39+
"operation": {
40+
"argumentDefinitions": [],
41+
"kind": "Operation",
42+
"name": "resolverFieldWithAllRuntimeArgsOmitted_Query",
43+
"selections": [
44+
{
45+
"kind": "ClientExtension",
46+
"selections": [
47+
{
48+
"name": "greeting",
49+
"args": null,
50+
"fragment": null,
51+
"kind": "RelayResolver",
52+
"storageKey": null,
53+
"isOutputType": false
54+
}
55+
]
56+
}
57+
]
58+
},
59+
"params": {
60+
"cacheID": "92bc6f17961b64dccbe679004d425389",
61+
"id": null,
62+
"metadata": {},
63+
"name": "resolverFieldWithAllRuntimeArgsOmitted_Query",
64+
"operationKind": "query",
65+
"text": null
66+
}
67+
}
68+
69+
QUERY:
70+
71+
Query Text is Empty.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
query resolverFieldWithAllRuntimeArgsOmitted_Query {
2+
greeting
3+
}
4+
5+
# %extensions%
6+
7+
extend type Query {
8+
greeting(salutation: String): String
9+
@relay_resolver(import_path: "./path/to/Resolver.js")
10+
}

compiler/crates/relay-compiler/tests/compile_relay_artifacts_test.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<4a85869bb6831356ca25ffc4ee7af4fb>>
7+
* @generated SignedSource<<3ed14fc48e8c146f608dbd13c65f89d7>>
88
*/
99

1010
mod compile_relay_artifacts;
@@ -1349,6 +1349,20 @@ async fn required_directive() {
13491349
test_fixture(transform_fixture, "required-directive.graphql", "compile_relay_artifacts/fixtures/required-directive.expected", input, expected).await;
13501350
}
13511351

1352+
#[tokio::test]
1353+
async fn resolver_field_with_all_fragment_args_omitted() {
1354+
let input = include_str!("compile_relay_artifacts/fixtures/resolver-field-with-all-fragment-args-omitted.graphql");
1355+
let expected = include_str!("compile_relay_artifacts/fixtures/resolver-field-with-all-fragment-args-omitted.expected");
1356+
test_fixture(transform_fixture, "resolver-field-with-all-fragment-args-omitted.graphql", "compile_relay_artifacts/fixtures/resolver-field-with-all-fragment-args-omitted.expected", input, expected).await;
1357+
}
1358+
1359+
#[tokio::test]
1360+
async fn resolver_field_with_all_runtime_args_omitted() {
1361+
let input = include_str!("compile_relay_artifacts/fixtures/resolver-field-with-all-runtime-args-omitted.graphql");
1362+
let expected = include_str!("compile_relay_artifacts/fixtures/resolver-field-with-all-runtime-args-omitted.expected");
1363+
test_fixture(transform_fixture, "resolver-field-with-all-runtime-args-omitted.graphql", "compile_relay_artifacts/fixtures/resolver-field-with-all-runtime-args-omitted.expected", input, expected).await;
1364+
}
1365+
13521366
#[tokio::test]
13531367
async fn resolver_with_root_fragment_on_model_type() {
13541368
let input = include_str!("compile_relay_artifacts/fixtures/resolver-with-root-fragment-on-model-type.graphql");

packages/react-relay/__tests__/__generated__/LiveResolversTest7Query.graphql.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-relay/__tests__/__generated__/LiveResolversTest9Query.graphql.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/relay-runtime/store/__tests__/__generated__/RelayReaderResolverTest16Query.graphql.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)