Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 70 additions & 2 deletions compiler/crates/common/src/feature_flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use serde::Serialize;
use crate::Rollout;
use crate::rollout::RolloutRange;

#[derive(Default, Debug, Serialize, Deserialize, Clone, JsonSchema)]
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct FeatureFlags {
#[serde(default)]
Expand Down Expand Up @@ -181,7 +181,51 @@ pub struct FeatureFlags {
pub legacy_include_path_in_required_reader_nodes: FeatureFlag,
}

#[derive(Debug, serde::Deserialize, Clone, Serialize, Default, JsonSchema)]
impl Default for FeatureFlags {
fn default() -> Self {
FeatureFlags {
relay_resolver_enable_interface_output_type: Default::default(),
allow_output_type_resolvers: Default::default(),
no_inline: Default::default(),
enable_3d_branch_arg_generation: Default::default(),
actor_change_support: Default::default(),
text_artifacts: Default::default(),
skip_printing_nulls: Default::default(),
compact_query_text: Default::default(),
enable_resolver_normalization_ast: Default::default(),
enable_exec_time_resolvers_directive: Default::default(),
enable_relay_resolver_mutations: Default::default(),
enable_strict_custom_scalars: Default::default(),
allow_resolvers_in_mutation_response: Default::default(),
allow_required_in_mutation_response: Default::default(),
disable_resolver_reader_ast: Default::default(),
enable_fragment_argument_transform: Default::default(),
allow_resolver_non_nullable_return_type: Default::default(),
disable_schema_validation: Default::default(),
prefer_fetchable_in_refetch_queries: Default::default(),
disable_edge_type_name_validation_on_declerative_connection_directives:
Default::default(),
disable_full_argument_type_validation: Default::default(),
use_reader_module_imports: Default::default(),
omit_resolver_type_assertions_for_confirmed_types: Default::default(),
disable_deduping_common_structures_in_artifacts: Default::default(),
legacy_include_path_in_required_reader_nodes: Default::default(),

// enabled-by-default
enforce_fragment_alias_where_ambiguous: FeatureFlag::Enabled,
}
}
}

#[derive(
Debug,
serde::Deserialize,
Clone,
Serialize,
Default,
PartialEq,
JsonSchema
)]
#[serde(tag = "kind", rename_all = "lowercase")]
pub enum FeatureFlag {
/// Fully disabled: developers may not use this feature
Expand Down Expand Up @@ -237,3 +281,27 @@ impl Display for FeatureFlag {
}
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn default_trait_sets_enforce_fragment_alias_enabled() {
let flags = FeatureFlags::default();
assert!(matches!(
flags.enforce_fragment_alias_where_ambiguous,
FeatureFlag::Enabled
));
// A couple of quick sanity checks for other defaults
assert!(matches!(flags.no_inline, FeatureFlag::Disabled));
assert_eq!(flags.enable_resolver_normalization_ast, false);
}

#[test]
fn serde_empty_object_deserializes_to_default() {
// When deserializing from an empty JSON object, serde applies per-field defaults.
let flags: FeatureFlags = serde_json::from_str("{} ").expect("valid json");
assert_eq!(flags, FeatureFlags::default());
}
}
13 changes: 11 additions & 2 deletions compiler/crates/common/src/rollout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,16 @@ use serde::Serialize;
/// A utility to enable gradual rollout of large codegen changes.
/// Can be constructed as the Default which passes or a percentage between 0 and
/// 100.
#[derive(Default, Debug, Serialize, Deserialize, Clone, Copy, JsonSchema)]
#[derive(
Default,
Debug,
Serialize,
Deserialize,
Clone,
Copy,
PartialEq,
JsonSchema
)]
pub struct Rollout(pub Option<u8>);

impl Rollout {
Expand All @@ -34,7 +43,7 @@ impl Rollout {

/// A utility to enable gradual rollout of large codegen changes. Allows you to
/// specify a range of percentages to rollout.
#[derive(Debug, Serialize, Deserialize, Clone, Copy, JsonSchema)]
#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, JsonSchema)]
pub struct RolloutRange {
pub start: u8,
pub end: u8,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ query abstractTypeRefinementDontFlattenTypeDiscriminatorFragmentSpreadConditiona
# Fragment will be inlined:
# - Printed query should select __isNode
# - Normalization ast should include inline fragment with abstractKey
...abstractTypeRefinementDontFlattenTypeDiscriminatorFragmentSpreadConditional_NodeFragment
...abstractTypeRefinementDontFlattenTypeDiscriminatorFragmentSpreadConditional_NodeFragment @alias
}
}
}
Expand Down Expand Up @@ -47,8 +47,19 @@ fragment abstractTypeRefinementDontFlattenTypeDiscriminatorFragmentSpreadConditi
"passingValue": true,
"selections": [
{
"args": null,
"kind": "FragmentSpread",
"fragment": {
"kind": "InlineFragment",
"selections": [
{
"args": null,
"kind": "FragmentSpread",
"name": "abstractTypeRefinementDontFlattenTypeDiscriminatorFragmentSpreadConditional_NodeFragment"
}
],
"type": "Node",
"abstractKey": "__isNode"
},
"kind": "AliasedInlineFragmentSpread",
"name": "abstractTypeRefinementDontFlattenTypeDiscriminatorFragmentSpreadConditional_NodeFragment"
}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ query abstractTypeRefinementDontFlattenTypeDiscriminatorFragmentSpreadConditiona
# Fragment will be inlined:
# - Printed query should select __isNode
# - Normalization ast should include inline fragment with abstractKey
...abstractTypeRefinementDontFlattenTypeDiscriminatorFragmentSpreadConditional_NodeFragment
...abstractTypeRefinementDontFlattenTypeDiscriminatorFragmentSpreadConditional_NodeFragment @alias
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ query abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_AbstractType
# After inlining even though `id` will be skipped:
# - Printed query should still select __isNode and __isActor
# - Normalization ast should include inline fragments with abstractKeys for Node and Actor
...abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_ActorFragment
...abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_ActorFragment @alias
}
}

fragment abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_ActorFragment on Actor {
username
...abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragment
...abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragment @alias
}

fragment abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragment on Node {
Expand Down Expand Up @@ -39,8 +39,19 @@ fragment abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragm
"plural": false,
"selections": [
{
"args": null,
"kind": "FragmentSpread",
"fragment": {
"kind": "InlineFragment",
"selections": [
{
"args": null,
"kind": "FragmentSpread",
"name": "abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_ActorFragment"
}
],
"type": "Actor",
"abstractKey": "__isActor"
},
"kind": "AliasedInlineFragmentSpread",
"name": "abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_ActorFragment"
}
],
Expand Down Expand Up @@ -153,8 +164,19 @@ fragment abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragm
"storageKey": null
},
{
"args": null,
"kind": "FragmentSpread",
"fragment": {
"kind": "InlineFragment",
"selections": [
{
"args": null,
"kind": "FragmentSpread",
"name": "abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragment"
}
],
"type": "Node",
"abstractKey": "__isNode"
},
"kind": "AliasedInlineFragmentSpread",
"name": "abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragment"
}
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ query abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_AbstractType
# After inlining even though `id` will be skipped:
# - Printed query should still select __isNode and __isActor
# - Normalization ast should include inline fragments with abstractKeys for Node and Actor
...abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_ActorFragment
...abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_ActorFragment @alias
}
}

fragment abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_ActorFragment on Actor {
username
...abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragment
...abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragment @alias
}

fragment abstractTypeRefinementDontSkipTypeDiscriminatorFragmentSpread_NodeFragment on Node {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ query abstractTypeRefinementDontSkipTypeDiscriminatorInlineFragment_AbstractType
# After inlining even though `id` will be skipped:
# - Printed query should still select __isNode and __isActor
# - Normalization ast should include inline fragments with abstractKeys for Node and Actor
...abstractTypeRefinementDontSkipTypeDiscriminatorInlineFragment_ActorFragment
...abstractTypeRefinementDontSkipTypeDiscriminatorInlineFragment_ActorFragment @alias
}
}

Expand Down Expand Up @@ -37,8 +37,19 @@ fragment abstractTypeRefinementDontSkipTypeDiscriminatorInlineFragment_ActorFrag
"plural": false,
"selections": [
{
"args": null,
"kind": "FragmentSpread",
"fragment": {
"kind": "InlineFragment",
"selections": [
{
"args": null,
"kind": "FragmentSpread",
"name": "abstractTypeRefinementDontSkipTypeDiscriminatorInlineFragment_ActorFragment"
}
],
"type": "Actor",
"abstractKey": "__isActor"
},
"kind": "AliasedInlineFragmentSpread",
"name": "abstractTypeRefinementDontSkipTypeDiscriminatorInlineFragment_ActorFragment"
}
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ query abstractTypeRefinementDontSkipTypeDiscriminatorInlineFragment_AbstractType
# After inlining even though `id` will be skipped:
# - Printed query should still select __isNode and __isActor
# - Normalization ast should include inline fragments with abstractKeys for Node and Actor
...abstractTypeRefinementDontSkipTypeDiscriminatorInlineFragment_ActorFragment
...abstractTypeRefinementDontSkipTypeDiscriminatorInlineFragment_ActorFragment @alias
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ query abstractTypeRefinement_AbstractTypeRefinementQuery {
... on Named {
name_from_query: name
}
...abstractTypeRefinement_ActorFragment
...abstractTypeRefinement_ActorFragment @alias
}
}

Expand Down Expand Up @@ -51,8 +51,19 @@ fragment abstractTypeRefinement_ActorFragment on Actor {
"abstractKey": "__isNamed"
},
{
"args": null,
"kind": "FragmentSpread",
"fragment": {
"kind": "InlineFragment",
"selections": [
{
"args": null,
"kind": "FragmentSpread",
"name": "abstractTypeRefinement_ActorFragment"
}
],
"type": "Actor",
"abstractKey": "__isActor"
},
"kind": "AliasedInlineFragmentSpread",
"name": "abstractTypeRefinement_ActorFragment"
}
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ query abstractTypeRefinement_AbstractTypeRefinementQuery {
... on Named {
name_from_query: name
}
...abstractTypeRefinement_ActorFragment
...abstractTypeRefinement_ActorFragment @alias
}
}

Expand Down
Loading