Skip to content

Commit

Permalink
Always pass an args object to resolvers that define runtime args
Browse files Browse the repository at this point in the history
Reviewed By: tyao1

Differential Revision: D50863441

fbshipit-source-id: 7ad0a2d7aa8273814f67a2929033774d16cf49c0
  • Loading branch information
captbaritone authored and facebook-github-bot committed Nov 1, 2023
1 parent 52b2c13 commit 70a5ff0
Show file tree
Hide file tree
Showing 19 changed files with 421 additions and 25 deletions.
20 changes: 15 additions & 5 deletions compiler/crates/relay-codegen/src/build_ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1141,7 +1141,20 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> {
.project_config
.js_module_import_path(self.definition_source_location, module);

let args = self.build_arguments(field_arguments);
let args = if field.arguments.is_empty() {
Primitive::SkippableNull
} else {
self.build_arguments(field_arguments).map_or_else(
|| {
// Passing an empty array here, rather than `null`, allows the runtime
// to know that it should still create an arguments object to pass to
// the resolver, even though no arguments were provided at the callsite,
// since all arguments are optional.
Primitive::Key(self.array(vec![]))
},
Primitive::Key,
)
};

let variable_name = relay_resolver_metadata.generate_local_resolver_name(self.schema);
let resolver_js_module = JSModuleDependency {
Expand Down Expand Up @@ -1208,10 +1221,7 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> {
// module itself.
let mut object_props = object! {
:build_alias(field_alias, field_name),
args: match args {
None => Primitive::SkippableNull,
Some(key) => Primitive::Key(key),
},
args: args,
fragment: match fragment_primitive {
None => Primitive::SkippableNull,
Some(fragment_primitive) => fragment_primitive,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ extend type User {
"selections": [
{
"alias": null,
"args": null,
"args": [],
"fragment": {
"args": [
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
==================================== INPUT ====================================
query resolverFieldWithAllFragmentArgsOmitted_Query {
greeting
}

fragment resolverFieldWithAllFragmentArgsOmitted_Fragment on Query
@argumentDefinitions(task_number: {type: "Int"}) {
task(number: $task_number) {
__typename
}
}

# %extensions%

extend type Query {
greeting: String
@relay_resolver(
import_path: "./path/to/Resolver.js"
root_fragment: "resolverFieldWithAllFragmentArgsOmitted_Fragment"
)
}
==================================== OUTPUT ===================================
{
"fragment": {
"argumentDefinitions": [],
"kind": "Fragment",
"metadata": null,
"name": "resolverFieldWithAllFragmentArgsOmitted_Query",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"alias": null,
"args": null,
"fragment": null,
"kind": "RelayResolver",
"name": "greeting",
"resolverModule": require('Resolver'),
"path": "greeting"
}
]
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [],
"kind": "Operation",
"name": "resolverFieldWithAllFragmentArgsOmitted_Query",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"name": "greeting",
"args": null,
"fragment": null,
"kind": "RelayResolver",
"storageKey": null,
"isOutputType": false
}
]
}
]
},
"params": {
"cacheID": "19967942cdd7d0f409f239fcaf48f375",
"id": null,
"metadata": {},
"name": "resolverFieldWithAllFragmentArgsOmitted_Query",
"operationKind": "query",
"text": null
}
}

QUERY:

Query Text is Empty.

{
"argumentDefinitions": [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "task_number"
}
],
"kind": "Fragment",
"metadata": null,
"name": "resolverFieldWithAllFragmentArgsOmitted_Fragment",
"selections": [
{
"alias": null,
"args": [
{
"kind": "Variable",
"name": "number",
"variableName": "task_number"
}
],
"concreteType": "Task",
"kind": "LinkedField",
"name": "task",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
}
],
"storageKey": null
}
],
"type": "Query",
"abstractKey": null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
query resolverFieldWithAllFragmentArgsOmitted_Query {
greeting
}

fragment resolverFieldWithAllFragmentArgsOmitted_Fragment on Query
@argumentDefinitions(task_number: {type: "Int"}) {
task(number: $task_number) {
__typename
}
}

# %extensions%

extend type Query {
greeting: String
@relay_resolver(
import_path: "./path/to/Resolver.js"
root_fragment: "resolverFieldWithAllFragmentArgsOmitted_Fragment"
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
==================================== INPUT ====================================
query resolverFieldWithAllRuntimeArgsOmitted_Query {
greeting
}

# %extensions%

extend type Query {
greeting(salutation: String): String
@relay_resolver(import_path: "./path/to/Resolver.js")
}
==================================== OUTPUT ===================================
{
"fragment": {
"argumentDefinitions": [],
"kind": "Fragment",
"metadata": null,
"name": "resolverFieldWithAllRuntimeArgsOmitted_Query",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"alias": null,
"args": [],
"fragment": null,
"kind": "RelayResolver",
"name": "greeting",
"resolverModule": require('Resolver'),
"path": "greeting"
}
]
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [],
"kind": "Operation",
"name": "resolverFieldWithAllRuntimeArgsOmitted_Query",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"name": "greeting",
"args": null,
"fragment": null,
"kind": "RelayResolver",
"storageKey": null,
"isOutputType": false
}
]
}
]
},
"params": {
"cacheID": "92bc6f17961b64dccbe679004d425389",
"id": null,
"metadata": {},
"name": "resolverFieldWithAllRuntimeArgsOmitted_Query",
"operationKind": "query",
"text": null
}
}

QUERY:

Query Text is Empty.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
query resolverFieldWithAllRuntimeArgsOmitted_Query {
greeting
}

# %extensions%

extend type Query {
greeting(salutation: String): String
@relay_resolver(import_path: "./path/to/Resolver.js")
}
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<<4a85869bb6831356ca25ffc4ee7af4fb>>
* @generated SignedSource<<3ed14fc48e8c146f608dbd13c65f89d7>>
*/

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

#[tokio::test]
async fn resolver_field_with_all_fragment_args_omitted() {
let input = include_str!("compile_relay_artifacts/fixtures/resolver-field-with-all-fragment-args-omitted.graphql");
let expected = include_str!("compile_relay_artifacts/fixtures/resolver-field-with-all-fragment-args-omitted.expected");
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;
}

#[tokio::test]
async fn resolver_field_with_all_runtime_args_omitted() {
let input = include_str!("compile_relay_artifacts/fixtures/resolver-field-with-all-runtime-args-omitted.graphql");
let expected = include_str!("compile_relay_artifacts/fixtures/resolver-field-with-all-runtime-args-omitted.expected");
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;
}

#[tokio::test]
async fn resolver_with_root_fragment_on_model_type() {
let input = include_str!("compile_relay_artifacts/fixtures/resolver-with-root-fragment-on-model-type.graphql");
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 70a5ff0

Please sign in to comment.