Skip to content

Commit 930864a

Browse files
captbaritonefacebook-github-bot
authored andcommitted
Deprecate verbose resolver syntax with feature flag to enable
Reviewed By: alunyov Differential Revision: D50513041 fbshipit-source-id: c04ce5736ee602b0335e18a8ab9017e6ec9f86a4
1 parent 5c835e9 commit 930864a

File tree

120 files changed

+539
-171
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

120 files changed

+539
-171
lines changed

compiler/crates/common/src/feature_flags.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ pub struct FeatureFlags {
7676
/// Enforce strict flavors for relay resolvers and disallow mixing flavors
7777
#[serde(default)]
7878
pub relay_resolvers_enable_strict_resolver_flavors: FeatureFlag,
79+
80+
/// Allow legacy verbose resolver syntax
81+
#[serde(default)]
82+
pub relay_resolvers_allow_legacy_verbose_syntax: FeatureFlag,
7983
}
8084

8185
#[derive(Debug, Deserialize, Clone, Serialize)]

compiler/crates/relay-compiler/src/docblocks.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ fn parse_source(
8282
enable_strict_resolver_flavors: &project_config
8383
.feature_flags
8484
.relay_resolvers_enable_strict_resolver_flavors,
85+
allow_legacy_verbose_syntax: &project_config
86+
.feature_flags
87+
.relay_resolvers_allow_legacy_verbose_syntax,
8588
},
8689
)?;
8790
maybe_ir

compiler/crates/relay-compiler/tests/compile_relay_artifacts/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result<String, String>
120120
.contains("# enable_resolver_normalization_ast"),
121121
enable_schema_resolvers: false,
122122
relay_resolvers_enable_strict_resolver_flavors: FeatureFlag::Disabled,
123+
relay_resolvers_allow_legacy_verbose_syntax: FeatureFlag::Disabled,
123124
};
124125

125126
let default_project_config = ProjectConfig {

compiler/crates/relay-compiler/tests/compile_relay_artifacts_with_custom_id/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result<String, String>
9898
enable_resolver_normalization_ast: false,
9999
enable_schema_resolvers: false,
100100
relay_resolvers_enable_strict_resolver_flavors: FeatureFlag::Disabled,
101+
relay_resolvers_allow_legacy_verbose_syntax: FeatureFlag::Disabled,
101102
};
102103

103104
let default_schema_config = SchemaConfig::default();

compiler/crates/relay-docblock/src/docblock_ir.rs

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ use crate::ir::WeakObjectIr;
5555
use crate::untyped_representation::AllowedFieldName;
5656
use crate::untyped_representation::UntypedDocblockRepresentation;
5757
use crate::DocblockIr;
58+
use crate::LegacyVerboseResolverIr;
5859
use crate::On;
5960
use crate::ParseOptions;
60-
use crate::RelayResolverIr;
6161

6262
pub(crate) fn parse_docblock_ir(
6363
project_name: ProjectName,
@@ -97,7 +97,7 @@ pub(crate) fn parse_docblock_ir(
9797
};
9898
let parsed_docblock_ir = match resolver_field {
9999
IrField::UnpopulatedIrField(unpopulated_ir_field) => {
100-
DocblockIr::RelayResolver(parse_relay_resolver_ir(
100+
let legacy_verbose_resolver = parse_relay_resolver_ir(
101101
&mut fields,
102102
definitions_in_file,
103103
description,
@@ -106,7 +106,35 @@ pub(crate) fn parse_docblock_ir(
106106
unpopulated_ir_field,
107107
parse_options,
108108
source_hash,
109-
)?)
109+
)?;
110+
111+
let field_name = format!(
112+
"{}.{}",
113+
legacy_verbose_resolver.on.type_name(),
114+
legacy_verbose_resolver.field.name.value
115+
)
116+
.intern();
117+
118+
if !parse_options
119+
.allow_legacy_verbose_syntax
120+
.is_enabled_for(field_name)
121+
{
122+
match legacy_verbose_resolver.on {
123+
On::Type(field) => {
124+
return Err(vec![Diagnostic::error(
125+
IrParsingErrorMessages::UnexpectedOnType { field_name },
126+
field.key_location,
127+
)]);
128+
}
129+
On::Interface(field) => {
130+
return Err(vec![Diagnostic::error(
131+
IrParsingErrorMessages::UnexpectedOnInterface { field_name },
132+
field.key_location,
133+
)]);
134+
}
135+
}
136+
}
137+
DocblockIr::LegacyVerboseResolver(legacy_verbose_resolver)
110138
}
111139
IrField::PopulatedIrField(populated_ir_field) => {
112140
if populated_ir_field.value.item.lookup().contains('.') {
@@ -165,7 +193,7 @@ fn parse_relay_resolver_ir(
165193
_resolver_field: UnpopulatedIrField,
166194
parse_options: &ParseOptions<'_>,
167195
source_hash: ResolverSourceHash,
168-
) -> DiagnosticsResult<RelayResolverIr> {
196+
) -> DiagnosticsResult<LegacyVerboseResolverIr> {
169197
let root_fragment =
170198
get_optional_populated_field_named(fields, AllowedFieldName::RootFragmentField)?;
171199
let field_name =
@@ -215,7 +243,7 @@ fn parse_relay_resolver_ir(
215243

216244
validate_field_arguments(&field_definition_stub.arguments, location.source_location())?;
217245

218-
Ok(RelayResolverIr {
246+
Ok(LegacyVerboseResolverIr {
219247
live: get_optional_unpopulated_field_named(fields, AllowedFieldName::LiveField)?,
220248
on,
221249
root_fragment: root_fragment
@@ -729,7 +757,7 @@ fn extract_fragment_arguments(
729757

730758
fn get_resolver_field_path(docblock_ir: &DocblockIr) -> Option<String> {
731759
match docblock_ir {
732-
DocblockIr::RelayResolver(resolver_ir) => {
760+
DocblockIr::LegacyVerboseResolver(resolver_ir) => {
733761
let parent_type_name = match resolver_ir.on {
734762
On::Type(field) => field.value.item,
735763
On::Interface(field) => field.value.item,
@@ -757,7 +785,7 @@ fn validate_strict_resolver_flavors(
757785
output_type: Option<Location>,
758786
}
759787
let validation_info: Option<ResolverFlavorValidationInfo> = match docblock_ir {
760-
DocblockIr::RelayResolver(resolver_ir) => {
788+
DocblockIr::LegacyVerboseResolver(resolver_ir) => {
761789
let output_type_location = resolver_ir.output_type.as_ref().map(|ot| {
762790
let type_loc = ot.inner().location;
763791
let (type_start, _) = type_loc.span().as_usize();
@@ -806,14 +834,14 @@ fn validate_strict_resolver_flavors(
806834
let mut errs = vec![];
807835
if let Some(live_loc) = validation_info.live {
808836
errs.push(Diagnostic::error(
809-
"@live is incompatible with @rootFragment",
837+
IrParsingErrorMessages::IncompatibleLiveAndRootFragment,
810838
live_loc,
811839
));
812840
}
813841

814842
if let Some(output_type_loc) = validation_info.output_type {
815843
errs.push(Diagnostic::error(
816-
"@outputType is incompatible with @rootFragment",
844+
IrParsingErrorMessages::IncompatibleOutputTypeAndRootFragment,
817845
output_type_loc,
818846
));
819847
}

compiler/crates/relay-docblock/src/errors.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,22 @@ pub enum IrParsingErrorMessages {
122122
"Unexpected `@outputType`. The deprecated `@outputType` option is not enabled for the field `{field_name}`."
123123
)]
124124
UnexpectedOutputType { field_name: StringKey },
125+
126+
#[error(
127+
"Unexpected `@onType`. The deprecated `@onType` option is not enabled for the field `{field_name}`. Please use the new syntax: `@RelayResolver ParentType.field_name`."
128+
)]
129+
UnexpectedOnType { field_name: StringKey },
130+
131+
#[error(
132+
"Unexpected `@onInterface`. The deprecated `@onType` option is not enabled for the field `{field_name}`. Please use the new syntax: `@RelayResolver ParentInterface.field_name`."
133+
)]
134+
UnexpectedOnInterface { field_name: StringKey },
135+
136+
#[error("@live is incompatible with @rootFragment")]
137+
IncompatibleLiveAndRootFragment,
138+
139+
#[error("@outputType is incompatible with @rootFragment")]
140+
IncompatibleOutputTypeAndRootFragment,
125141
}
126142

127143
#[derive(Clone, Debug, Error, Eq, PartialEq, Ord, PartialOrd, Hash)]

compiler/crates/relay-docblock/src/ir.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ lazy_static! {
8989

9090
#[derive(Debug, Clone, PartialEq)]
9191
pub enum DocblockIr {
92-
RelayResolver(RelayResolverIr),
92+
LegacyVerboseResolver(LegacyVerboseResolverIr),
9393
TerseRelayResolver(TerseRelayResolverIr),
9494
StrongObjectResolver(StrongObjectIr),
9595
WeakObjectType(WeakObjectIr),
@@ -98,7 +98,7 @@ pub enum DocblockIr {
9898
impl DocblockIr {
9999
pub(crate) fn get_variant_name(&self) -> &'static str {
100100
match self {
101-
DocblockIr::RelayResolver(_) => "legacy resolver declaration",
101+
DocblockIr::LegacyVerboseResolver(_) => "legacy resolver declaration",
102102
DocblockIr::TerseRelayResolver(_) => "terse resolver declaration",
103103
DocblockIr::StrongObjectResolver(_) => "strong object type declaration",
104104
DocblockIr::WeakObjectType(_) => "weak object type declaration",
@@ -143,7 +143,7 @@ impl DocblockIr {
143143
};
144144

145145
match self {
146-
DocblockIr::RelayResolver(relay_resolver) => {
146+
DocblockIr::LegacyVerboseResolver(relay_resolver) => {
147147
relay_resolver.to_graphql_schema_ast(project_config)
148148
}
149149
DocblockIr::TerseRelayResolver(relay_resolver) => {
@@ -229,6 +229,15 @@ pub enum On {
229229
Interface(PopulatedIrField),
230230
}
231231

232+
impl On {
233+
pub fn type_name(&self) -> StringKey {
234+
match self {
235+
On::Type(field) => field.value.item,
236+
On::Interface(field) => field.value.item,
237+
}
238+
}
239+
}
240+
232241
#[derive(Debug, Clone, PartialEq)]
233242
pub struct Argument {
234243
pub name: Identifier,
@@ -745,7 +754,7 @@ impl ResolverTypeDefinitionIr for TerseRelayResolverIr {
745754
}
746755

747756
#[derive(Debug, Clone, PartialEq)]
748-
pub struct RelayResolverIr {
757+
pub struct LegacyVerboseResolverIr {
749758
pub field: FieldDefinitionStub,
750759
pub on: On,
751760
pub root_fragment: Option<WithLocation<FragmentDefinitionName>>,
@@ -759,7 +768,7 @@ pub struct RelayResolverIr {
759768
pub source_hash: ResolverSourceHash,
760769
}
761770

762-
impl ResolverIr for RelayResolverIr {
771+
impl ResolverIr for LegacyVerboseResolverIr {
763772
fn definitions(
764773
self,
765774
project_config: ResolverProjectConfig<'_, '_>,
@@ -897,7 +906,7 @@ impl ResolverIr for RelayResolverIr {
897906
}
898907
}
899908

900-
impl ResolverTypeDefinitionIr for RelayResolverIr {
909+
impl ResolverTypeDefinitionIr for LegacyVerboseResolverIr {
901910
fn field_name(&self) -> &Identifier {
902911
&self.field.name
903912
}

compiler/crates/relay-docblock/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,16 @@ use graphql_syntax::ExecutableDefinition;
3131
use graphql_syntax::TypeSystemDefinition;
3232
use intern::Lookup;
3333
pub use ir::DocblockIr;
34+
use ir::LegacyVerboseResolverIr;
3435
pub use ir::On;
35-
use ir::RelayResolverIr;
3636
use relay_config::ProjectName;
3737
use schema::SDLSchema;
3838
use untyped_representation::parse_untyped_docblock_representation;
3939

4040
pub struct ParseOptions<'a> {
4141
pub enable_output_type: &'a FeatureFlag,
4242
pub enable_strict_resolver_flavors: &'a FeatureFlag,
43+
pub allow_legacy_verbose_syntax: &'a FeatureFlag,
4344
}
4445

4546
pub fn parse_docblock_ast(

compiler/crates/relay-docblock/tests/parse/fixtures/edge-to-non-null-plural-item.invalid.expected

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88

99
// expected-to-throw
10+
// relay:allow_legacy_verbose_syntax
1011

1112
/**
1213
* @RelayResolver
@@ -30,8 +31,8 @@ graphql`
3031
==================================== ERROR ====================================
3132
✖︎ Unexpected non-nullable item in list type given in `@edgeTo`.
3233

33-
/path/to/test/fixture/edge-to-non-null-plural-item.invalid.js:15:12
34-
14 │ * @fieldName favorite_page
35-
15 │ * @edgeTo [Page!]
34+
/path/to/test/fixture/edge-to-non-null-plural-item.invalid.js:16:12
35+
15 │ * @fieldName favorite_page
36+
16 │ * @edgeTo [Page!]
3637
│ ^^^^^^^
37-
16 │ * @rootFragment myRootFragment
38+
17 │ * @rootFragment myRootFragment

compiler/crates/relay-docblock/tests/parse/fixtures/edge-to-non-null-plural-item.invalid.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
// expected-to-throw
9+
// relay:allow_legacy_verbose_syntax
910

1011
/**
1112
* @RelayResolver

0 commit comments

Comments
 (0)