Skip to content

Commit

Permalink
generate type assertion for interface model resolver field
Browse files Browse the repository at this point in the history
Reviewed By: captbaritone

Differential Revision: D54604216

fbshipit-source-id: c2c7e0421789e3acb9cb485c3383acb9ae2ec1cc
  • Loading branch information
monicatang authored and facebook-github-bot committed Mar 18, 2024
1 parent f908dee commit 66818de
Show file tree
Hide file tree
Showing 13 changed files with 522 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ module.exports = ((node/*: any*/)/*: Fragment<

//- __generated__/PersonComponentFragment.graphql.js
/**
* <auto-generated> SignedSource<<0d61709f01a89f93e5085f76f5b629a4>>
* <auto-generated> SignedSource<<af781562da3ea98baeb304e107b03b34>>
* @flow
* @lightSyntaxTransform
* @nogrep
Expand All @@ -175,10 +175,14 @@ module.exports = ((node/*: any*/)/*: Fragment<
/*::
import type { Fragment, ReaderFragment } from 'relay-runtime';
import type { FragmentType } from "relay-runtime";
import {Admin as adminRelayModelInstanceResolverType} from "AdminTypeResolvers";
import {User as userRelayModelInstanceResolverType} from "UserTypeResolvers";
import {name as iPersonNameResolverType} from "IPersonResolvers";
// Type assertion validating that `iPersonNameResolverType` resolver is correctly implemented.
// A type error here indicates that the type signature of the resolver module is incorrect.
(iPersonNameResolverType: () => ?string);
(iPersonNameResolverType: (
model: ReturnType<typeof adminRelayModelInstanceResolverType> | ReturnType<typeof userRelayModelInstanceResolverType>,
) => ?string);
declare export opaque type PersonComponentFragment$fragmentType: FragmentType;
export type PersonComponentFragment$data = {|
+name: ?string,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
==================================== INPUT ====================================
//- PersonComponent.js
graphql`fragment PersonComponentFragment on IPerson {
name
}`


//- UserTypeResolvers.js
/**
* @RelayResolver User implements IPerson
* @weak
*/

//- AdminTypeResolvers.js
/**
* @RelayResolver Admin implements IPerson
* @weak
*/

//- IPersonResolvers.js
/**
* @RelayResolver IPerson.name: String
*/

//- relay.config.json
{
"language": "flow",
"jsModuleFormat": "haste",
"schema": "schema.graphql",
"schemaExtensions": [
"schema-extensions"
],
"featureFlags": {
"enable_relay_resolver_transform": true,
"enable_resolver_normalization_ast": true,
"relay_resolver_enable_interface_output_type": { "kind": "enabled" }
}
}

//- schema.graphql

//- schema-extensions/extension.graphql
interface IPerson {
id: ID!
}
==================================== OUTPUT ===================================
//- __generated__/Admin____relay_model_instance.graphql.js
/**
* <auto-generated> SignedSource<<523d097198aa2ffa2a1209e24ac2a337>>
* @flow
* @lightSyntaxTransform
* @nogrep
*/

/* eslint-disable */

'use strict';

/*::
import type { Fragment, ReaderFragment } from 'relay-runtime';
import type { Admin } from "AdminTypeResolvers";
import type { FragmentType } from "relay-runtime";
declare export opaque type Admin____relay_model_instance$fragmentType: FragmentType;
export type Admin____relay_model_instance$data = {|
+__relay_model_instance: Admin,
+$fragmentType: Admin____relay_model_instance$fragmentType,
|};
export type Admin____relay_model_instance$key = {
+$data?: Admin____relay_model_instance$data,
+$fragmentSpreads: Admin____relay_model_instance$fragmentType,
...
};
*/

var node/*: ReaderFragment*/ = {
"argumentDefinitions": [],
"kind": "Fragment",
"metadata": null,
"name": "Admin____relay_model_instance",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__relay_model_instance",
"storageKey": null
}
]
}
],
"type": "Admin",
"abstractKey": null
};

module.exports = ((node/*: any*/)/*: Fragment<
Admin____relay_model_instance$fragmentType,
Admin____relay_model_instance$data,
>*/);

//- __generated__/PersonComponentFragment.graphql.js
/**
* <auto-generated> SignedSource<<af781562da3ea98baeb304e107b03b34>>
* @flow
* @lightSyntaxTransform
* @nogrep
*/

/* eslint-disable */

'use strict';

/*::
import type { Fragment, ReaderFragment } from 'relay-runtime';
import type { FragmentType } from "relay-runtime";
import {Admin as adminRelayModelInstanceResolverType} from "AdminTypeResolvers";
import {User as userRelayModelInstanceResolverType} from "UserTypeResolvers";
import {name as iPersonNameResolverType} from "IPersonResolvers";
// Type assertion validating that `iPersonNameResolverType` resolver is correctly implemented.
// A type error here indicates that the type signature of the resolver module is incorrect.
(iPersonNameResolverType: (
model: ReturnType<typeof adminRelayModelInstanceResolverType> | ReturnType<typeof userRelayModelInstanceResolverType>,
) => ?string);
declare export opaque type PersonComponentFragment$fragmentType: FragmentType;
export type PersonComponentFragment$data = {|
+name: ?string,
+$fragmentType: PersonComponentFragment$fragmentType,
|};
export type PersonComponentFragment$key = {
+$data?: PersonComponentFragment$data,
+$fragmentSpreads: PersonComponentFragment$fragmentType,
...
};
*/

var node/*: ReaderFragment*/ = {
"argumentDefinitions": [],
"kind": "Fragment",
"metadata": null,
"name": "PersonComponentFragment",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": null,
"fragment": {
"args": null,
"kind": "FragmentSpread",
"name": "Admin____relay_model_instance"
},
"kind": "RelayResolver",
"name": "name",
"resolverModule": require('relay-runtime/experimental').resolverDataInjector(require('Admin____relay_model_instance.graphql'), require('IPersonResolvers').name, '__relay_model_instance', true),
"path": "name"
}
],
"type": "Admin",
"abstractKey": null
},
{
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": null,
"fragment": {
"args": null,
"kind": "FragmentSpread",
"name": "User____relay_model_instance"
},
"kind": "RelayResolver",
"name": "name",
"resolverModule": require('relay-runtime/experimental').resolverDataInjector(require('User____relay_model_instance.graphql'), require('IPersonResolvers').name, '__relay_model_instance', true),
"path": "name"
}
],
"type": "User",
"abstractKey": null
}
]
}
],
"type": "IPerson",
"abstractKey": "__isIPerson"
};

(node/*: any*/).hash = "a57dd30bd59412781e9566e1553e2d70";

module.exports = ((node/*: any*/)/*: Fragment<
PersonComponentFragment$fragmentType,
PersonComponentFragment$data,
>*/);

//- __generated__/User____relay_model_instance.graphql.js
/**
* <auto-generated> SignedSource<<9a188c26688bb46f65ed80df4ae938c3>>
* @flow
* @lightSyntaxTransform
* @nogrep
*/

/* eslint-disable */

'use strict';

/*::
import type { Fragment, ReaderFragment } from 'relay-runtime';
import type { User } from "UserTypeResolvers";
import type { FragmentType } from "relay-runtime";
declare export opaque type User____relay_model_instance$fragmentType: FragmentType;
export type User____relay_model_instance$data = {|
+__relay_model_instance: User,
+$fragmentType: User____relay_model_instance$fragmentType,
|};
export type User____relay_model_instance$key = {
+$data?: User____relay_model_instance$data,
+$fragmentSpreads: User____relay_model_instance$fragmentType,
...
};
*/

var node/*: ReaderFragment*/ = {
"argumentDefinitions": [],
"kind": "Fragment",
"metadata": null,
"name": "User____relay_model_instance",
"selections": [
{
"kind": "ClientExtension",
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__relay_model_instance",
"storageKey": null
}
]
}
],
"type": "User",
"abstractKey": null
};

module.exports = ((node/*: any*/)/*: Fragment<
User____relay_model_instance$fragmentType,
User____relay_model_instance$data,
>*/);
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//- PersonComponent.js
graphql`fragment PersonComponentFragment on IPerson {
name
}`


//- UserTypeResolvers.js
/**
* @RelayResolver User implements IPerson
* @weak
*/

//- AdminTypeResolvers.js
/**
* @RelayResolver Admin implements IPerson
* @weak
*/

//- IPersonResolvers.js
/**
* @RelayResolver IPerson.name: String
*/

//- relay.config.json
{
"language": "flow",
"jsModuleFormat": "haste",
"schema": "schema.graphql",
"schemaExtensions": [
"schema-extensions"
],
"featureFlags": {
"enable_relay_resolver_transform": true,
"enable_resolver_normalization_ast": true,
"relay_resolver_enable_interface_output_type": { "kind": "enabled" }
}
}

//- schema.graphql

//- schema-extensions/extension.graphql
interface IPerson {
id: ID!
}
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<<bdc63bb42a9050607cf80744f245dddd>>
* @generated SignedSource<<7bc74fd259b90f455e2dbd166114cc72>>
*/

mod relay_compiler_integration;
Expand Down Expand Up @@ -110,6 +110,13 @@ async fn resolver_on_interface_of_all_strong_model_type() {
test_fixture(transform_fixture, file!(), "resolver_on_interface_of_all_strong_model_type.input", "relay_compiler_integration/fixtures/resolver_on_interface_of_all_strong_model_type.expected", input, expected).await;
}

#[tokio::test]
async fn resolver_on_interface_of_all_weak_model_type() {
let input = include_str!("relay_compiler_integration/fixtures/resolver_on_interface_of_all_weak_model_type.input");
let expected = include_str!("relay_compiler_integration/fixtures/resolver_on_interface_of_all_weak_model_type.expected");
test_fixture(transform_fixture, file!(), "resolver_on_interface_of_all_weak_model_type.input", "relay_compiler_integration/fixtures/resolver_on_interface_of_all_weak_model_type.expected", input, expected).await;
}

#[tokio::test]
async fn resolver_returns_interface_of_all_live_model_type() {
let input = include_str!("relay_compiler_integration/fixtures/resolver_returns_interface_of_all_live_model_type.input");
Expand Down
1 change: 1 addition & 0 deletions compiler/crates/relay-transforms/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ pub use relay_directive::RelayDirective;
pub use relay_node_identifier::RelayLocationAgnosticBehavior;
pub use relay_resolvers::get_resolver_fragment_dependency_name;
pub use relay_resolvers::relay_resolvers;
pub use relay_resolvers::resolver_type_import_alias;
pub use relay_resolvers::FragmentDataInjectionMode;
pub use relay_resolvers::RelayResolverMetadata;
pub use relay_resolvers::ResolverOutputTypeInfo;
Expand Down
Loading

0 comments on commit 66818de

Please sign in to comment.