Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitaa6f91a

Browse files
tyao1facebook-github-bot
authored andcommitted
Generate exec time ASTs in rootFragment $normalization files
Reviewed By: captbaritoneDifferential Revision: D72352931fbshipit-source-id: 88ed7c934767488708feb9453f1bcf4b21c7fdbc
1 parentd800611 commitaa6f91a

File tree

5 files changed

+250
-32
lines changed

5 files changed

+250
-32
lines changed

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

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -406,32 +406,6 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> {
406406
})
407407
});
408408

409-
let exec_time_resolvers_field =if has_exec_time_resolvers_directive{
410-
ifletSome(provider) = exec_time_resolvers_enabled_provider{
411-
letmut provider_path =PathBuf::from(provider.location.source_location().path());
412-
provider_path.pop();
413-
provider_path.push(PathBuf::from(provider.item.lookup()));
414-
let artifact_path =self
415-
.project_config
416-
.artifact_path_for_definition(self.definition_source_location);
417-
Some(ObjectEntry{
418-
key:"exec_time_resolvers_enabled_provider".intern(),
419-
value:Primitive::JSModuleDependency(JSModuleDependency{
420-
path:self
421-
.project_config
422-
.js_module_import_identifier(&artifact_path,&provider_path),
423-
import_name:ModuleImportName::Default(provider.item),
424-
}),
425-
})
426-
}else{
427-
Some(ObjectEntry{
428-
key:"use_exec_time_resolvers".intern(),
429-
value:Primitive::Bool(true),
430-
})
431-
}
432-
}else{
433-
None
434-
};
435409
letmut context =ContextualMetadata{
436410
has_client_edges:false,
437411
has_exec_time_resolvers_directive,
@@ -448,9 +422,6 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> {
448422
name:Primitive::String(operation.name.item.0),
449423
selections: selections,
450424
};
451-
if context.has_exec_time_resolvers_directive{
452-
fields.push(exec_time_resolvers_field.unwrap());
453-
}
454425
if !operation.variable_definitions.is_empty(){
455426
let argument_definitions =
456427
self.build_operation_variable_definitions(&operation.variable_definitions);
@@ -475,7 +446,32 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> {
475446
selections: selections,
476447
};
477448
if context.has_exec_time_resolvers_directive{
478-
fields.push(exec_time_resolvers_field.unwrap());
449+
fields.push(
450+
ifletSome(provider) = exec_time_resolvers_enabled_provider{
451+
letmut provider_path =
452+
PathBuf::from(provider.location.source_location().path());
453+
provider_path.pop();
454+
provider_path.push(PathBuf::from(provider.item.lookup()));
455+
let artifact_path =self
456+
.project_config
457+
.artifact_path_for_definition(self.definition_source_location);
458+
ObjectEntry{
459+
key:"exec_time_resolvers_enabled_provider".intern(),
460+
value:Primitive::JSModuleDependency(JSModuleDependency{
461+
path:self.project_config.js_module_import_identifier(
462+
&artifact_path,
463+
&provider_path,
464+
),
465+
import_name:ModuleImportName::Default(provider.item),
466+
}),
467+
}
468+
}else{
469+
ObjectEntry{
470+
key:"use_exec_time_resolvers".intern(),
471+
value:Primitive::Bool(true),
472+
}
473+
},
474+
);
479475
}
480476
ifletSome(client_abstract_types) =
481477
self.maybe_build_client_abstract_types(operation)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
==================================== INPUT ====================================
2+
//- User_foo.js
3+
/**
4+
* @RelayResolver User.foo: RelayResolverValue
5+
* @rootFragment UserFooFragment
6+
*/
7+
graphql`fragment UserFooFragment on User {
8+
bar
9+
}`
10+
11+
//- User_bar.js
12+
/**
13+
* @RelayResolver User.bar: RelayResolverValue
14+
*/
15+
16+
//- relay.config.json
17+
{
18+
"language": "flow",
19+
"jsModuleFormat": "haste",
20+
"schema": "schema.graphql",
21+
"featureFlags": {
22+
"enable_exec_time_resolvers_directive": true
23+
},
24+
"resolversSchemaModule": {
25+
"path": "__generated__/ResolversSchemaModule.js"
26+
}
27+
}
28+
29+
//- schema.graphql
30+
type Query { me: User }
31+
type User { name: String }
32+
==================================== OUTPUT ===================================
33+
//- __generated__/ResolversSchemaModule.js
34+
/**
35+
* <auto-generated> SignedSource<<b249fc98729ee12d20036cd89244ad25>>
36+
* @flow
37+
* @lightSyntaxTransform
38+
* @nogrep
39+
*/
40+
41+
/* eslint-disable */
42+
43+
'use strict';
44+
45+
/*::
46+
import type { SchemaResolvers } from 'ReactiveQueryExecutor';
47+
import type { ResolverFunction, NormalizationSplitOperation } from 'relay-runtime';
48+
49+
*/
50+
51+
var schema_resolvers/*: SchemaResolvers*/ = {
52+
"User": {
53+
"bar": {
54+
"resolverFunction": require('User_bar').bar,
55+
"rootFragment": null
56+
},
57+
"foo": {
58+
"resolverFunction": require('User_foo').foo,
59+
"rootFragment": require('UserFooFragment$normalization.graphql')
60+
}
61+
}
62+
};
63+
64+
module.exports = schema_resolvers;
65+
66+
//- __generated__/UserFooFragment$normalization.graphql.js
67+
/**
68+
* <auto-generated> SignedSource<<79043ca4ab6c3a1b54e21b82211b593c>>
69+
* @flow
70+
* @lightSyntaxTransform
71+
* @nogrep
72+
*/
73+
74+
/* eslint-disable */
75+
76+
'use strict';
77+
78+
/*::
79+
import type { NormalizationSplitOperation } from 'relay-runtime';
80+
81+
*/
82+
83+
var node/*: NormalizationSplitOperation*/ = {
84+
"kind": "SplitOperation",
85+
"metadata": {},
86+
"name": "UserFooFragment$normalization",
87+
"selections": [
88+
{
89+
"kind": "ClientExtension",
90+
"selections": [
91+
{
92+
"name": "bar",
93+
"args": null,
94+
"kind": "RelayResolver",
95+
"storageKey": null,
96+
"isOutputType": true,
97+
"resolverInfo": {
98+
"resolverFunction": require('User_bar').bar,
99+
"rootFragment": null
100+
}
101+
}
102+
]
103+
}
104+
]
105+
};
106+
107+
(node/*: any*/).hash = "285ee53d00b8def775c9e1ed756743bf";
108+
109+
module.exports = node;
110+
111+
//- __generated__/UserFooFragment.graphql.js
112+
/**
113+
* <auto-generated> SignedSource<<8cc1f9903984d3c06d796d4524cf1c23>>
114+
* @flow
115+
* @lightSyntaxTransform
116+
* @nogrep
117+
*/
118+
119+
/* eslint-disable */
120+
121+
'use strict';
122+
123+
/*::
124+
import type { Fragment, ReaderFragment } from 'relay-runtime';
125+
import type { FragmentType } from "relay-runtime";
126+
import {bar as userBarResolverType} from "User_bar";
127+
// Type assertion validating that `userBarResolverType` resolver is correctly implemented.
128+
// A type error here indicates that the type signature of the resolver module is incorrect.
129+
(userBarResolverType: () => ?mixed);
130+
declare export opaque type UserFooFragment$fragmentType: FragmentType;
131+
export type UserFooFragment$data = {|
132+
+bar: ?ReturnType<typeof userBarResolverType>,
133+
+$fragmentType: UserFooFragment$fragmentType,
134+
|};
135+
export type UserFooFragment$key = {
136+
+$data?: UserFooFragment$data,
137+
+$fragmentSpreads: UserFooFragment$fragmentType,
138+
...
139+
};
140+
*/
141+
142+
var node/*: ReaderFragment*/ = {
143+
"argumentDefinitions": [],
144+
"kind": "Fragment",
145+
"metadata": null,
146+
"name": "UserFooFragment",
147+
"selections": [
148+
{
149+
"kind": "ClientExtension",
150+
"selections": [
151+
{
152+
"alias": null,
153+
"args": null,
154+
"fragment": null,
155+
"kind": "RelayResolver",
156+
"name": "bar",
157+
"resolverModule": require('User_bar').bar,
158+
"path": "bar"
159+
}
160+
]
161+
}
162+
],
163+
"type": "User",
164+
"abstractKey": null
165+
};
166+
167+
(node/*: any*/).hash = "285ee53d00b8def775c9e1ed756743bf";
168+
169+
module.exports = ((node/*: any*/)/*: Fragment<
170+
UserFooFragment$fragmentType,
171+
UserFooFragment$data,
172+
>*/);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//- User_foo.js
2+
/**
3+
* @RelayResolver User.foo: RelayResolverValue
4+
* @rootFragment UserFooFragment
5+
*/
6+
graphql`fragment UserFooFragment on User {
7+
bar
8+
}`
9+
10+
//- User_bar.js
11+
/**
12+
* @RelayResolver User.bar: RelayResolverValue
13+
*/
14+
15+
//- relay.config.json
16+
{
17+
"language": "flow",
18+
"jsModuleFormat": "haste",
19+
"schema": "schema.graphql",
20+
"featureFlags": {
21+
"enable_exec_time_resolvers_directive": true
22+
},
23+
"resolversSchemaModule": {
24+
"path": "__generated__/ResolversSchemaModule.js"
25+
}
26+
}
27+
28+
//- schema.graphql
29+
type Query { me: User }
30+
type User { name: String }

‎compiler/crates/relay-compiler/tests/relay_compiler_integration_test.rs

Lines changed: 8 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<<18ad721b702d974f6b034f393230738d>>
7+
* @generated SignedSource<<01b0ce9afb404f70b894d071b74bdc74>>
88
*/
99

1010
mod relay_compiler_integration;
@@ -89,6 +89,13 @@ async fn error_handling_query() {
8989
test_fixture(transform_fixture,file!(),"error_handling_query.input","relay_compiler_integration/fixtures/error_handling_query.expected", input, expected).await;
9090
}
9191

92+
#[tokio::test]
93+
asyncfnexec_resolvers_directive_with_root_fragment(){
94+
let input =include_str!("relay_compiler_integration/fixtures/exec_resolvers_directive_with_root_fragment.input");
95+
let expected =include_str!("relay_compiler_integration/fixtures/exec_resolvers_directive_with_root_fragment.expected");
96+
test_fixture(transform_fixture,file!(),"exec_resolvers_directive_with_root_fragment.input","relay_compiler_integration/fixtures/exec_resolvers_directive_with_root_fragment.expected", input, expected).await;
97+
}
98+
9299
#[tokio::test]
93100
asyncfnfragment_alias_nested_in_inline_fragment(){
94101
let input =include_str!("relay_compiler_integration/fixtures/fragment_alias_nested_in_inline_fragment.input");

‎compiler/crates/relay-transforms/src/generate_relay_resolvers_root_fragment_split_operation.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,22 @@
77

88
use std::sync::Arc;
99

10+
use::intern::intern;
11+
use::intern::string_key::Intern;
1012
use common::DiagnosticsResult;
13+
use common::DirectiveName;
1114
use common::NamedItem;
15+
use common::WithLocation;
1216
use docblock_shared::RELAY_RESOLVER_DIRECTIVE_NAME;
1317
use graphql_ir::associated_data_impl;
18+
use graphql_ir::Directive;
1419
use graphql_ir::ExecutableDefinition;
1520
use graphql_ir::FragmentDefinition;
1621
use graphql_ir::FragmentDefinitionName;
1722
use graphql_ir::OperationDefinition;
1823
use graphql_ir::OperationDefinitionName;
1924
use graphql_ir::Program;
2025
use graphql_syntax::OperationKind;
21-
use intern::string_key::Intern;
2226
use rustc_hash::FxHashSet;
2327
use schema::SDLSchema;
2428

@@ -51,6 +55,15 @@ pub fn generate_relay_resolvers_root_fragment_split_operation(
5155
raw_response_type_generation_mode:None,
5256
}
5357
.into(),
58+
Directive{
59+
name:WithLocation::new(
60+
fragment.name.location,
61+
DirectiveName(intern!("exec_time_resolvers")),
62+
),
63+
arguments: vec![],
64+
data:None,
65+
location: fragment.name.location,
66+
},
5467
],
5568
selections: fragment.selections.clone(),
5669
kind:OperationKind::Query,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp