diff --git a/compiler/crates/common/src/named_item.rs b/compiler/crates/common/src/named_item.rs index 88e7e703f1393..0d71714b77e0c 100644 --- a/compiler/crates/common/src/named_item.rs +++ b/compiler/crates/common/src/named_item.rs @@ -63,7 +63,18 @@ impl FromStr for DirectiveName { } impl_lookup!(DirectiveName); -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] +#[derive( + Clone, + Copy, + Debug, + Deserialize, + Eq, + PartialEq, + Ord, + PartialOrd, + Hash, + Serialize +)] pub struct ArgumentName(pub StringKey); impl fmt::Display for ArgumentName { diff --git a/compiler/crates/relay-codegen/src/build_ast.rs b/compiler/crates/relay-codegen/src/build_ast.rs index 86aaf6f7c48ae..3544901367c56 100644 --- a/compiler/crates/relay-codegen/src/build_ast.rs +++ b/compiler/crates/relay-codegen/src/build_ast.rs @@ -54,7 +54,6 @@ use relay_transforms::RequiredMetadataDirective; use relay_transforms::ResolverOutputTypeInfo; use relay_transforms::StreamDirective; use relay_transforms::CLIENT_EXTENSION_DIRECTIVE_NAME; -use relay_transforms::DEFER_STREAM_CONSTANTS; use relay_transforms::DIRECTIVE_SPLIT_OPERATION; use relay_transforms::INLINE_DIRECTIVE_NAME; use relay_transforms::INTERNAL_METADATA_DIRECTIVE; @@ -482,7 +481,12 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> { }; if metadata.is_stream_connection { object.push(ObjectEntry { - key: DEFER_STREAM_CONSTANTS.stream_name.0, + key: self + .project_config + .schema_config + .defer_stream_interface + .stream_name + .0, value: Primitive::Bool(true), }) } @@ -528,9 +532,12 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> { vec![self.build_fragment_spread(frag_spread)] } Selection::InlineFragment(inline_fragment) => { - let defer = inline_fragment - .directives - .named(DEFER_STREAM_CONSTANTS.defer_name); + let defer = inline_fragment.directives.named( + self.project_config + .schema_config + .defer_stream_interface + .defer_name, + ); if let Some(defer) = defer { vec![self.build_defer(context, inline_fragment, defer)] } else if let Some(inline_data_directive) = @@ -577,7 +584,12 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> { } } Selection::LinkedField(field) => { - let stream = field.directives.named(DEFER_STREAM_CONSTANTS.stream_name); + let stream = field.directives.named( + self.project_config + .schema_config + .defer_stream_interface + .stream_name, + ); match stream { Some(stream) => vec![self.build_stream(context, field, stream)], @@ -1254,7 +1266,10 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> { defer: &Directive, ) -> Primitive { let next_selections = self.build_selections(context, inline_fragment.selections.iter()); - let DeferDirective { if_arg, label_arg } = DeferDirective::from(defer); + let DeferDirective { if_arg, label_arg } = DeferDirective::from( + defer, + &self.project_config.schema_config.defer_stream_interface, + ); let if_variable_name = if_arg.and_then(|arg| match &arg.value.item { // `true` is the default, remove as the AST is typed just as a variable name string // `false` constant values should've been transformed away in skip_unreachable_node @@ -1283,7 +1298,10 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> { &LinkedField { directives: remove_directive( &linked_field.directives, - DEFER_STREAM_CONSTANTS.stream_name, + self.project_config + .schema_config + .defer_stream_interface + .stream_name, ), ..linked_field.to_owned() }, @@ -1300,7 +1318,10 @@ impl<'schema, 'builder, 'config> CodegenBuilder<'schema, 'builder, 'config> { label_arg, use_customized_batch_arg: _, initial_count_arg: _, - } = StreamDirective::from(stream); + } = StreamDirective::from( + stream, + &self.project_config.schema_config.defer_stream_interface, + ); let if_variable_name = if_arg.and_then(|arg| match &arg.value.item { // `true` is the default, remove as the AST is typed just as a variable name string // `false` constant values should've been transformed away in skip_unreachable_node diff --git a/compiler/crates/relay-codegen/tests/connections/mod.rs b/compiler/crates/relay-codegen/tests/connections/mod.rs index 796ce0afd0b4c..9d7bdebf6185a 100644 --- a/compiler/crates/relay-codegen/tests/connections/mod.rs +++ b/compiler/crates/relay-codegen/tests/connections/mod.rs @@ -18,6 +18,7 @@ use graphql_test_helpers::diagnostics_to_sorted_string; use relay_codegen::build_request_params; use relay_codegen::JsModuleFormat; use relay_codegen::Printer; +use relay_config::DeferStreamInterface; use relay_config::ProjectConfig; use relay_test_schema::get_test_schema; use relay_transforms::transform_connections; @@ -41,11 +42,13 @@ pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result let program = Program::from_definitions(Arc::clone(&schema), ir); let connection_interface = ConnectionInterface::default(); + let defer_stream_interface = DeferStreamInterface::default(); validate_connections(&program, &connection_interface) .map_err(|diagnostics| diagnostics_to_sorted_string(fixture.content, &diagnostics))?; - let next_program = transform_connections(&program, &connection_interface); + let next_program = + transform_connections(&program, &connection_interface, &defer_stream_interface); let mut printed = next_program .operations() diff --git a/compiler/crates/relay-codegen/tests/defer_stream/fixtures/fragment-with-stream-default-label.expected b/compiler/crates/relay-codegen/tests/defer_stream/fixtures/fragment-with-stream-default-label.expected index 95222b6649848..a741b1fce7a72 100644 --- a/compiler/crates/relay-codegen/tests/defer_stream/fixtures/fragment-with-stream-default-label.expected +++ b/compiler/crates/relay-codegen/tests/defer_stream/fixtures/fragment-with-stream-default-label.expected @@ -8,7 +8,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1) { + actors @stream(initialCount: 1) { name } } diff --git a/compiler/crates/relay-codegen/tests/defer_stream/fixtures/fragment-with-stream-default-label.graphql b/compiler/crates/relay-codegen/tests/defer_stream/fixtures/fragment-with-stream-default-label.graphql index 23fa23b3e8e43..739db7de64c6a 100644 --- a/compiler/crates/relay-codegen/tests/defer_stream/fixtures/fragment-with-stream-default-label.graphql +++ b/compiler/crates/relay-codegen/tests/defer_stream/fixtures/fragment-with-stream-default-label.graphql @@ -7,7 +7,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1) { + actors @stream(initialCount: 1) { name } } diff --git a/compiler/crates/relay-codegen/tests/defer_stream/mod.rs b/compiler/crates/relay-codegen/tests/defer_stream/mod.rs index 82d1a988d76fe..e8a51a97b938e 100644 --- a/compiler/crates/relay-codegen/tests/defer_stream/mod.rs +++ b/compiler/crates/relay-codegen/tests/defer_stream/mod.rs @@ -15,6 +15,7 @@ use graphql_syntax::parse_executable; use relay_codegen::print_fragment; use relay_codegen::print_operation; use relay_codegen::JsModuleFormat; +use relay_config::DeferStreamInterface; use relay_config::ProjectConfig; use relay_test_schema::get_test_schema; use relay_transforms::sort_selections; @@ -29,7 +30,9 @@ pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result let schema = get_test_schema(); let ir = build(&schema, &ast.definitions).unwrap(); let program = Program::from_definitions(Arc::clone(&schema), ir); - let next_program = sort_selections(&transform_defer_stream(&program).unwrap()); + let defer_stream_interface = DeferStreamInterface::default(); + let next_program = + sort_selections(&transform_defer_stream(&program, &defer_stream_interface).unwrap()); let mut result = next_program .fragments() .map(|def| { diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-defer-in-stream.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-defer-in-stream.expected index 3e4e33feb3ed8..c401b33139ad1 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-defer-in-stream.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-defer-in-stream.expected @@ -8,7 +8,7 @@ query fragmentWithDeferInStream_QueryWithFragmentWithStreamQuery($id: ID!) { fragment fragmentWithDeferInStream_FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "StreamedActorsLabel") { + actors @stream(initialCount: 1, label: "StreamedActorsLabel") { ...fragmentWithDeferInStream_ActorFragment @defer } } @@ -194,7 +194,7 @@ fragment fragmentWithDeferInStream_ActorFragment on Actor { fragment fragmentWithDeferInStream_FeedbackFragment on Feedback { id - actors @stream(label: "fragmentWithDeferInStream_FeedbackFragment$stream$StreamedActorsLabel", initial_count: 1) { + actors @stream(label: "fragmentWithDeferInStream_FeedbackFragment$stream$StreamedActorsLabel", initialCount: 1) { __typename ...fragmentWithDeferInStream_ActorFragment @defer(label: "fragmentWithDeferInStream_FeedbackFragment$defer$fragmentWithDeferInStream_ActorFragment") id diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-defer-in-stream.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-defer-in-stream.graphql index 7886bae9ac370..d551db5e514b2 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-defer-in-stream.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-defer-in-stream.graphql @@ -7,7 +7,7 @@ query fragmentWithDeferInStream_QueryWithFragmentWithStreamQuery($id: ID!) { fragment fragmentWithDeferInStream_FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "StreamedActorsLabel") { + actors @stream(initialCount: 1, label: "StreamedActorsLabel") { ...fragmentWithDeferInStream_ActorFragment @defer } } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-stream.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-stream.expected index 6d08b8070d456..1f7a7bf9222e4 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-stream.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-stream.expected @@ -8,7 +8,7 @@ query fragmentWithStream_QueryWithFragmentWithStreamQuery($id: ID!) { fragment fragmentWithStream_FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "StreamedActorsLabel") { + actors @stream(initialCount: 1, label: "StreamedActorsLabel") { name } } @@ -174,7 +174,7 @@ query fragmentWithStream_QueryWithFragmentWithStreamQuery( fragment fragmentWithStream_FeedbackFragment on Feedback { id - actors @stream(label: "fragmentWithStream_FeedbackFragment$stream$StreamedActorsLabel", initial_count: 1) { + actors @stream(label: "fragmentWithStream_FeedbackFragment$stream$StreamedActorsLabel", initialCount: 1) { __typename name id diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-stream.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-stream.graphql index e60f16cdf1a39..c9020d678df83 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-stream.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/fragment-with-stream.graphql @@ -7,7 +7,7 @@ query fragmentWithStream_QueryWithFragmentWithStreamQuery($id: ID!) { fragment fragmentWithStream_FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "StreamedActorsLabel") { + actors @stream(initialCount: 1, label: "StreamedActorsLabel") { name } } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/refetchable-fragment-with-connection-with-stream.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/refetchable-fragment-with-connection-with-stream.expected index 12a21162fcb3c..9c7f8d0277482 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/refetchable-fragment-with-connection-with-stream.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/refetchable-fragment-with-connection-with-stream.expected @@ -306,7 +306,7 @@ fragment refetchableFragmentWithConnectionWithStream_PaginationFragment_1G22uz o ... on User { name friends(after: $cursor, first: $count) { - edges @stream(label: "refetchableFragmentWithConnectionWithStream_PaginationFragment$stream$PaginationFragment_friends", initial_count: 1) { + edges @stream(label: "refetchableFragmentWithConnectionWithStream_PaginationFragment$stream$PaginationFragment_friends", initialCount: 1) { node { id __typename diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_1.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_1.expected index 5fdb721a91354..9c25de537f05c 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_1.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_1.expected @@ -5,7 +5,7 @@ query selectionSetConflictInconsistentStreamUsage1Query { ... on User { friends { ... on FriendsConnection { - edges @stream(label: "hdijf", initial_count: 1) { + edges @stream(label: "hdijf", initialCount: 1) { node { name } @@ -25,7 +25,7 @@ query selectionSetConflictInconsistentStreamUsage1Query { selection_set_conflict_inconsistent_stream_usage_1.graphql:7:11 6 │ ... on FriendsConnection { - 7 │ edges @stream(label: "hdijf", initial_count: 1) { + 7 │ edges @stream(label: "hdijf", initialCount: 1) { │ ^^^^^ 8 │ node { diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_1.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_1.graphql index 4e97124b440fd..ae506dfaf7429 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_1.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_1.graphql @@ -4,7 +4,7 @@ query selectionSetConflictInconsistentStreamUsage1Query { ... on User { friends { ... on FriendsConnection { - edges @stream(label: "hdijf", initial_count: 1) { + edges @stream(label: "hdijf", initialCount: 1) { node { name } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_2.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_2.expected index dfd45ec01dc94..5881787317707 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_2.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_2.expected @@ -5,13 +5,13 @@ query selectionSetConflictInconsistentStreamUsage2Query { ... on User { friends { ... on FriendsConnection { - edges @stream(label: "hdijf", initial_count: 1) { + edges @stream(label: "hdijf", initialCount: 1) { node { name } } } - edges @stream(label: "hkjdf", initial_count: 2) { + edges @stream(label: "hkjdf", initialCount: 2) { node { id } @@ -25,7 +25,7 @@ query selectionSetConflictInconsistentStreamUsage2Query { selection_set_conflict_inconsistent_stream_usage_2.graphql:7:11 6 │ ... on FriendsConnection { - 7 │ edges @stream(label: "hdijf", initial_count: 1) { + 7 │ edges @stream(label: "hdijf", initialCount: 1) { │ ^^^^^ 8 │ node { @@ -33,6 +33,6 @@ query selectionSetConflictInconsistentStreamUsage2Query { selection_set_conflict_inconsistent_stream_usage_2.graphql:13:9 12 │ } - 13 │ edges @stream(label: "hkjdf", initial_count: 2) { + 13 │ edges @stream(label: "hkjdf", initialCount: 2) { │ ^^^^^ 14 │ node { diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_2.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_2.graphql index e69ddcbf87db8..1042d77fa9bcf 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_2.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_inconsistent_stream_usage_2.graphql @@ -4,13 +4,13 @@ query selectionSetConflictInconsistentStreamUsage2Query { ... on User { friends { ... on FriendsConnection { - edges @stream(label: "hdijf", initial_count: 1) { + edges @stream(label: "hdijf", initialCount: 1) { node { name } } } - edges @stream(label: "hkjdf", initial_count: 2) { + edges @stream(label: "hkjdf", initialCount: 2) { node { id } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges.expected index caf8639343dce..ceab8647d5a28 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges.expected @@ -3,7 +3,7 @@ query selectionSetConflictStreamOnNodesOrEdgesQuery { me { ... on User { friends { - edges @stream(label: "b", initial_count: 1) { + edges @stream(label: "b", initialCount: 1) { node { id } @@ -168,7 +168,7 @@ QUERY: query selectionSetConflictStreamOnNodesOrEdgesQuery { me { friends { - edges @stream(label: "selectionSetConflictStreamOnNodesOrEdgesQuery$stream$b", initial_count: 1) { + edges @stream(label: "selectionSetConflictStreamOnNodesOrEdgesQuery$stream$b", initialCount: 1) { node { id } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges.graphql index db0148987fcb8..e8902568b4a2d 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges.graphql @@ -2,7 +2,7 @@ query selectionSetConflictStreamOnNodesOrEdgesQuery { me { ... on User { friends { - edges @stream(label: "b", initial_count: 1) { + edges @stream(label: "b", initialCount: 1) { node { id } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info.expected index da48ec2941e11..0a0c7a4be544c 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info.expected @@ -9,7 +9,7 @@ query selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoQuery { hasNextPage } } - edges @stream(label: "b", initial_count: 1) { + edges @stream(label: "b", initialCount: 1) { node { id } @@ -213,7 +213,7 @@ query selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoQuery { pageInfo { hasNextPage } - edges @stream(label: "selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoQuery$stream$b", initial_count: 1) { + edges @stream(label: "selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoQuery$stream$b", initialCount: 1) { node { id } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info.graphql index 5622f4c32e72a..2b932153c1396 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info.graphql @@ -8,7 +8,7 @@ query selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoQuery { hasNextPage } } - edges @stream(label: "b", initial_count: 1) { + edges @stream(label: "b", initialCount: 1) { node { id } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info_and_page_info_alias.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info_and_page_info_alias.expected index 072e3d086aa5e..c9718e49c0623 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info_and_page_info_alias.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info_and_page_info_alias.expected @@ -9,7 +9,7 @@ query selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoAndPageInfoA hasNextPage } } - edges @stream(label: "b", initial_count: 1) { + edges @stream(label: "b", initialCount: 1) { node { id } @@ -213,7 +213,7 @@ query selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoAndPageInfoA pagination: pageInfo { hasNextPage } - edges @stream(label: "selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoAndPageInfoAliasQuery$stream$b", initial_count: 1) { + edges @stream(label: "selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoAndPageInfoAliasQuery$stream$b", initialCount: 1) { node { id } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info_and_page_info_alias.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info_and_page_info_alias.graphql index c956d3b86fd3b..52fb05a8580c7 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info_and_page_info_alias.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_stream_on_nodes_or_edges_without_defer_on_page_info_and_page_info_alias.graphql @@ -8,7 +8,7 @@ query selectionSetConflictStreamOnNodesOrEdgesWithoutDeferOnPageInfoAndPageInfoA hasNextPage } } - edges @stream(label: "b", initial_count: 1) { + edges @stream(label: "b", initialCount: 1) { node { id } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_valid_stream.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_valid_stream.expected index d2dc62828f103..e312c17dc2a5f 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_valid_stream.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_valid_stream.expected @@ -3,7 +3,7 @@ query selectionSetConflictValidStreamQuery { me { ... on User { friends { - edges @stream(label: "jkdhg", initial_count: 0) { + edges @stream(label: "jkdhg", initialCount: 0) { node { id } @@ -168,7 +168,7 @@ QUERY: query selectionSetConflictValidStreamQuery { me { friends { - edges @stream(label: "selectionSetConflictValidStreamQuery$stream$jkdhg", initial_count: 0) { + edges @stream(label: "selectionSetConflictValidStreamQuery$stream$jkdhg", initialCount: 0) { node { id } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_valid_stream.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_valid_stream.graphql index 414122e99e447..b1f17e144839e 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_valid_stream.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/selection_set_conflict_valid_stream.graphql @@ -2,7 +2,7 @@ query selectionSetConflictValidStreamQuery { me { ... on User { friends { - edges @stream(label: "jkdhg", initial_count: 0) { + edges @stream(label: "jkdhg", initialCount: 0) { node { id } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-and-handle.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-and-handle.expected index af5c86cbde306..39bf05c6bfaa7 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-and-handle.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-and-handle.expected @@ -7,7 +7,7 @@ query streamAndHandleQuery { fragment streamAndHandleFragment on Feedback { actors - @stream(label: "actors", if: true, initial_count: 0) + @stream(label: "actors", if: true, initialCount: 0) @__clientField(handle: "actors_handler") { name @__clientField(handle: "name_handler") } @@ -170,7 +170,7 @@ query streamAndHandleQuery { } fragment streamAndHandleFragment on Feedback { - actors @stream(label: "streamAndHandleFragment$stream$actors", if: true, initial_count: 0) { + actors @stream(label: "streamAndHandleFragment$stream$actors", if: true, initialCount: 0) { __typename name id diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-and-handle.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-and-handle.graphql index 0be41830dbe54..010ca4457f0cf 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-and-handle.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-and-handle.graphql @@ -6,7 +6,7 @@ query streamAndHandleQuery { fragment streamAndHandleFragment on Feedback { actors - @stream(label: "actors", if: true, initial_count: 0) + @stream(label: "actors", if: true, initialCount: 0) @__clientField(handle: "actors_handler") { name @__clientField(handle: "name_handler") } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-connection-conditional.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-connection-conditional.expected index 36f31d1241775..45f53b7d6a94e 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-connection-conditional.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-connection-conditional.expected @@ -360,7 +360,7 @@ query streamConnectionConditionalQuery( id ... on Story { comments(first: 10) { - edges @stream(label: "streamConnectionConditionalQuery$stream$NodeQuery_comments", if: $cond, initial_count: 0, use_customized_batch: $cond) { + edges @stream(label: "streamConnectionConditionalQuery$stream$NodeQuery_comments", if: $cond, initialCount: 0, useCustomizedBatch: $cond) { node { __typename id diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-connection.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-connection.expected index fccdf311a5906..1126866ef06df 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-connection.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream-connection.expected @@ -400,7 +400,7 @@ query streamConnection_NodeQuery( id ... on Story { comments(first: 10) { - edges @stream(label: "streamConnection_NodeQuery$stream$NodeQuery_comments", initial_count: 0) { + edges @stream(label: "streamConnection_NodeQuery$stream$NodeQuery_comments", initialCount: 0) { node { actor { __typename diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream_if_arguments.expected b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream_if_arguments.expected index 2669b06cf9944..ec83f7cc0765b 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream_if_arguments.expected +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream_if_arguments.expected @@ -19,27 +19,27 @@ fragment streamIfArgumentsFragment on User setToFalse: { type: "Boolean", defaultValue: false } ) { withDefaultTrue: tasks - @stream(initial_count: 1, if: $defaultsToTrue, label: "defaultTrue") { + @stream(initialCount: 1, if: $defaultsToTrue, label: "defaultTrue") { __typename } withDefaultFalse: tasks - @stream(initial_count: 1, if: $defaultsToFalse, label: "defaultFalse") { + @stream(initialCount: 1, if: $defaultsToFalse, label: "defaultFalse") { __typename } setToTrue: tasks - @stream(initial_count: 1, if: $setToTrue, label: "setToTrue") { + @stream(initialCount: 1, if: $setToTrue, label: "setToTrue") { __typename } setToFalse: tasks - @stream(initial_count: 1, if: $setToFalse, label: "setToFalse") { + @stream(initialCount: 1, if: $setToFalse, label: "setToFalse") { __typename } withValueFromQueryDirectly: tasks - @stream(initial_count: 1, if: $valueFromQuery, label: "fromQueryDirectly") { + @stream(initialCount: 1, if: $valueFromQuery, label: "fromQueryDirectly") { __typename } withValueFromQueryViaArgDef: tasks - @stream(initial_count: 1, if: $setToValue, label: "fromQueryViaArg") { + @stream(initialCount: 1, if: $setToValue, label: "fromQueryViaArg") { __typename } } @@ -283,22 +283,22 @@ query streamIfArgumentsQuery( } fragment streamIfArgumentsFragment_39RTKZ on User { - withDefaultTrue: tasks @stream(label: "streamIfArgumentsFragment$stream$defaultTrue", if: true, initial_count: 1) { + withDefaultTrue: tasks @stream(label: "streamIfArgumentsFragment$stream$defaultTrue", if: true, initialCount: 1) { __typename } withDefaultFalse: tasks { __typename } - setToTrue: tasks @stream(label: "streamIfArgumentsFragment$stream$setToTrue", if: true, initial_count: 1) { + setToTrue: tasks @stream(label: "streamIfArgumentsFragment$stream$setToTrue", if: true, initialCount: 1) { __typename } setToFalse: tasks { __typename } - withValueFromQueryDirectly: tasks @stream(label: "streamIfArgumentsFragment$stream$fromQueryDirectly", if: $valueFromQuery, initial_count: 1) { + withValueFromQueryDirectly: tasks @stream(label: "streamIfArgumentsFragment$stream$fromQueryDirectly", if: $valueFromQuery, initialCount: 1) { __typename } - withValueFromQueryViaArgDef: tasks @stream(label: "streamIfArgumentsFragment$stream$fromQueryViaArg", if: $valueFromQuery, initial_count: 1) { + withValueFromQueryViaArgDef: tasks @stream(label: "streamIfArgumentsFragment$stream$fromQueryViaArg", if: $valueFromQuery, initialCount: 1) { __typename } } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream_if_arguments.graphql b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream_if_arguments.graphql index 0ab8458f480f9..ffc1e2ae9280a 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream_if_arguments.graphql +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/fixtures/stream_if_arguments.graphql @@ -18,27 +18,27 @@ fragment streamIfArgumentsFragment on User setToFalse: { type: "Boolean", defaultValue: false } ) { withDefaultTrue: tasks - @stream(initial_count: 1, if: $defaultsToTrue, label: "defaultTrue") { + @stream(initialCount: 1, if: $defaultsToTrue, label: "defaultTrue") { __typename } withDefaultFalse: tasks - @stream(initial_count: 1, if: $defaultsToFalse, label: "defaultFalse") { + @stream(initialCount: 1, if: $defaultsToFalse, label: "defaultFalse") { __typename } setToTrue: tasks - @stream(initial_count: 1, if: $setToTrue, label: "setToTrue") { + @stream(initialCount: 1, if: $setToTrue, label: "setToTrue") { __typename } setToFalse: tasks - @stream(initial_count: 1, if: $setToFalse, label: "setToFalse") { + @stream(initialCount: 1, if: $setToFalse, label: "setToFalse") { __typename } withValueFromQueryDirectly: tasks - @stream(initial_count: 1, if: $valueFromQuery, label: "fromQueryDirectly") { + @stream(initialCount: 1, if: $valueFromQuery, label: "fromQueryDirectly") { __typename } withValueFromQueryViaArgDef: tasks - @stream(initial_count: 1, if: $setToValue, label: "fromQueryViaArg") { + @stream(initialCount: 1, if: $setToValue, label: "fromQueryViaArg") { __typename } } diff --git a/compiler/crates/relay-config/src/defer_stream_interface.rs b/compiler/crates/relay-config/src/defer_stream_interface.rs new file mode 100644 index 0000000000000..58474cc97be10 --- /dev/null +++ b/compiler/crates/relay-config/src/defer_stream_interface.rs @@ -0,0 +1,37 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +use common::ArgumentName; +use common::DirectiveName; +use intern::string_key::Intern; +use serde::Deserialize; +use serde::Serialize; + +/// Configuration where Relay should expect some fields in the schema. +#[derive(Copy, Clone, Debug, Serialize, Deserialize)] +#[serde(deny_unknown_fields, rename_all = "camelCase")] +pub struct DeferStreamInterface { + pub defer_name: DirectiveName, + pub stream_name: DirectiveName, + pub if_arg: ArgumentName, + pub label_arg: ArgumentName, + pub initial_count_arg: ArgumentName, + pub use_customized_batch_arg: ArgumentName, +} + +impl Default for DeferStreamInterface { + fn default() -> Self { + DeferStreamInterface { + defer_name: DirectiveName("defer".intern()), + stream_name: DirectiveName("stream".intern()), + if_arg: ArgumentName("if".intern()), + label_arg: ArgumentName("label".intern()), + initial_count_arg: ArgumentName("initialCount".intern()), + use_customized_batch_arg: ArgumentName("useCustomizedBatch".intern()), + } + } +} diff --git a/compiler/crates/relay-config/src/lib.rs b/compiler/crates/relay-config/src/lib.rs index a64a1fdecddb1..dd2eb8bcec278 100644 --- a/compiler/crates/relay-config/src/lib.rs +++ b/compiler/crates/relay-config/src/lib.rs @@ -10,6 +10,7 @@ #![deny(clippy::all)] mod connection_interface; +mod defer_stream_interface; mod diagnostic_report_config; mod js_module_format; mod module_import_config; @@ -19,6 +20,7 @@ mod project_name; mod typegen_config; pub use connection_interface::ConnectionInterface; +pub use defer_stream_interface::DeferStreamInterface; pub use diagnostic_report_config::DiagnosticLevel; pub use diagnostic_report_config::DiagnosticReportConfig; pub use js_module_format::JsModuleFormat; diff --git a/compiler/crates/relay-config/src/project_config.rs b/compiler/crates/relay-config/src/project_config.rs index 5653d8a8873b1..41e83cc06697b 100644 --- a/compiler/crates/relay-config/src/project_config.rs +++ b/compiler/crates/relay-config/src/project_config.rs @@ -32,6 +32,7 @@ use serde::Serialize; use serde_json::Value; use crate::connection_interface::ConnectionInterface; +use crate::defer_stream_interface::DeferStreamInterface; use crate::diagnostic_report_config::DiagnosticReportConfig; use crate::module_import_config::ModuleImportConfig; use crate::non_node_id_fields_config::NonNodeIdFieldsConfig; @@ -171,6 +172,9 @@ pub struct SchemaConfig { #[serde(default = "default_node_interface_id_field")] pub node_interface_id_field: StringKey, + #[serde(default)] + pub defer_stream_interface: DeferStreamInterface, + /// The name of the variable expected by the `node` query. #[serde(default = "default_node_interface_id_variable_name")] pub node_interface_id_variable_name: StringKey, @@ -199,6 +203,7 @@ impl Default for SchemaConfig { fn default() -> Self { Self { connection_interface: ConnectionInterface::default(), + defer_stream_interface: DeferStreamInterface::default(), node_interface_id_field: default_node_interface_id_field(), node_interface_id_variable_name: default_node_interface_id_variable_name(), non_node_id_fields: None, diff --git a/compiler/crates/relay-lsp/src/completion/test.rs b/compiler/crates/relay-lsp/src/completion/test.rs index 23a6345a445a3..a0d1d46cd1dac 100644 --- a/compiler/crates/relay-lsp/src/completion/test.rs +++ b/compiler/crates/relay-lsp/src/completion/test.rs @@ -482,7 +482,7 @@ fn empty_argument_list() { ); assert_labels( items.unwrap(), - vec!["label", "initial_count", "if", "use_customized_batch"], + vec!["label", "initialCount", "if", "useCustomizedBatch"], ); } @@ -500,7 +500,7 @@ fn argument_name_without_value() { ); assert_labels( items.unwrap(), - vec!["label", "initial_count", "if", "use_customized_batch"], + vec!["label", "initialCount", "if", "useCustomizedBatch"], ); } @@ -521,7 +521,7 @@ fn argument_name_with_existing_name() { ); assert_labels( items.unwrap(), - vec!["label", "initial_count", "use_customized_batch"], + vec!["label", "initialCount", "useCustomizedBatch"], ); } diff --git a/compiler/crates/relay-test-schema/src/testschema.graphql b/compiler/crates/relay-test-schema/src/testschema.graphql index 89317de0faa7c..3a25a32ac044b 100644 --- a/compiler/crates/relay-test-schema/src/testschema.graphql +++ b/compiler/crates/relay-test-schema/src/testschema.graphql @@ -25,9 +25,9 @@ directive @defer( directive @stream( label: String! - initial_count: Int! + initialCount: Int! if: Boolean = true - use_customized_batch: Boolean = false + useCustomizedBatch: Boolean = false ) on FIELD directive @fetchable(field_name: String!) on OBJECT diff --git a/compiler/crates/relay-test-schema/src/testschema_with_custom_id.graphql b/compiler/crates/relay-test-schema/src/testschema_with_custom_id.graphql index 553b9d585b060..5c30aad299b27 100644 --- a/compiler/crates/relay-test-schema/src/testschema_with_custom_id.graphql +++ b/compiler/crates/relay-test-schema/src/testschema_with_custom_id.graphql @@ -25,9 +25,9 @@ directive @defer( directive @stream( label: String! - initial_count: Int! + initialCount: Int! if: Boolean = true - use_customized_batch: Boolean = false + useCustomizedBatch: Boolean = false ) on FIELD directive @fetchable(field_name: String!) on OBJECT diff --git a/compiler/crates/relay-transforms/src/apply_transforms.rs b/compiler/crates/relay-transforms/src/apply_transforms.rs index e71e141f13fe8..a5c03d6a864e8 100644 --- a/compiler/crates/relay-transforms/src/apply_transforms.rs +++ b/compiler/crates/relay-transforms/src/apply_transforms.rs @@ -155,17 +155,25 @@ fn apply_common_transforms( )?; program = log_event.time("transform_connections", || { - transform_connections(&program, &project_config.schema_config.connection_interface) + transform_connections( + &program, + &project_config.schema_config.connection_interface, + &project_config.schema_config.defer_stream_interface, + ) }); program = log_event.time("mask", || mask(&program)); program = log_event.time("transform_defer_stream", || { - transform_defer_stream(&program) + transform_defer_stream( + &program, + &project_config.schema_config.defer_stream_interface, + ) })?; program = log_event.time("transform_match", || { transform_match( &program, &project_config.feature_flags, project_config.module_import_config, + project_config.schema_config.defer_stream_interface, ) })?; program = log_event.time("transform_subscriptions", || { @@ -276,14 +284,22 @@ fn apply_reader_transforms( program = log_event.time("inline_data_fragment", || inline_data_fragment(&program))?; program = log_event.time("skip_unreachable_node", || { - skip_unreachable_node_strict(&program) + skip_unreachable_node_strict( + &program, + project_config.schema_config.defer_stream_interface, + ) })?; program = log_event.time("remove_base_fragments", || { remove_base_fragments(&program, &base_fragment_names) }); log_event.time("flatten", || flatten(&mut program, true, false))?; - program = log_event.time("skip_redundant_nodes", || skip_redundant_nodes(&program)); + program = log_event.time("skip_redundant_nodes", || { + skip_redundant_nodes( + &program, + project_config.schema_config.defer_stream_interface, + ) + }); program = log_event.time("generate_data_driven_dependency_metadata", || { generate_data_driven_dependency_metadata(&program) }); @@ -440,7 +456,10 @@ fn apply_normalization_transforms( } program = log_event.time("skip_unreachable_node", || { - skip_unreachable_node_strict(&program) + skip_unreachable_node_strict( + &program, + project_config.schema_config.defer_stream_interface, + ) })?; if let Some(print_stats) = maybe_print_stats { print_stats("skip_unreachable_node", &program); @@ -466,7 +485,12 @@ fn apply_normalization_transforms( print_stats("flatten", &program); } - program = log_event.time("skip_redundant_nodes", || skip_redundant_nodes(&program)); + program = log_event.time("skip_redundant_nodes", || { + skip_redundant_nodes( + &program, + project_config.schema_config.defer_stream_interface, + ) + }); if let Some(print_stats) = maybe_print_stats { print_stats("skip_redundant_nodes", &program); } @@ -540,7 +564,10 @@ fn apply_operation_text_transforms( program = log_event.time("skip_split_operation", || skip_split_operation(&program)); program = log_event.time("skip_unreachable_node_strict", || { - skip_unreachable_node_strict(&program) + skip_unreachable_node_strict( + &program, + project_config.schema_config.defer_stream_interface, + ) })?; program = log_event.time("skip_null_arguments_transform", || { skip_null_arguments_transform(&program) @@ -554,7 +581,10 @@ fn apply_operation_text_transforms( skip_client_extensions(&program) }); program = log_event.time("skip_unreachable_node_loose", || { - skip_unreachable_node_loose(&program) + skip_unreachable_node_loose( + &program, + project_config.schema_config.defer_stream_interface, + ) }); program = log_event.time("generate_typename", || generate_typename(&program, false)); @@ -569,7 +599,10 @@ fn apply_operation_text_transforms( validate_required_arguments(&program) })?; program = log_event.time("unwrap_custom_directive_selection", || { - unwrap_custom_directive_selection(&program) + unwrap_custom_directive_selection( + &program, + project_config.schema_config.defer_stream_interface, + ) }); program = apply_after_custom_transforms( @@ -619,6 +652,7 @@ fn apply_typegen_transforms( &program, &project_config.feature_flags, project_config.module_import_config, + project_config.schema_config.defer_stream_interface, ) })?; program = log_event.time("transform_subscriptions", || { diff --git a/compiler/crates/relay-transforms/src/connections/connection_constants.rs b/compiler/crates/relay-transforms/src/connections/connection_constants.rs index 87c10224625ab..7abd4a52a6d1f 100644 --- a/compiler/crates/relay-transforms/src/connections/connection_constants.rs +++ b/compiler/crates/relay-transforms/src/connections/connection_constants.rs @@ -14,6 +14,10 @@ use intern::string_key::StringKey; pub struct ConnectionConstants { pub connection_directive_name: DirectiveName, pub stream_connection_directive_name: DirectiveName, + pub stream_connection_if_arg: ArgumentName, + pub stream_connection_label_arg: ArgumentName, + pub stream_connection_initial_count_arg: ArgumentName, + pub stream_connection_use_customized_batch_arg: ArgumentName, pub direction_forward: StringKey, pub direction_backward: StringKey, @@ -43,6 +47,12 @@ impl Default for ConnectionConstants { Self { connection_directive_name: DirectiveName("connection".intern()), stream_connection_directive_name: DirectiveName("stream_connection".intern()), + stream_connection_if_arg: ArgumentName("if".intern()), + stream_connection_label_arg: ArgumentName("label".intern()), + stream_connection_initial_count_arg: ArgumentName("initial_count".intern()), + stream_connection_use_customized_batch_arg: ArgumentName( + "use_customized_batch".intern(), + ), direction_forward: "forward".intern(), direction_backward: "backward".intern(), diff --git a/compiler/crates/relay-transforms/src/defer_stream/directives.rs b/compiler/crates/relay-transforms/src/defer_stream/directives.rs index 9c68debed3543..d177f14dff377 100644 --- a/compiler/crates/relay-transforms/src/defer_stream/directives.rs +++ b/compiler/crates/relay-transforms/src/defer_stream/directives.rs @@ -7,8 +7,7 @@ use graphql_ir::Argument; use graphql_ir::Directive; - -use super::DEFER_STREAM_CONSTANTS; +use relay_config::DeferStreamInterface; /// Utility to access the arguments of the @defer directive. pub struct DeferDirective<'a> { @@ -20,13 +19,13 @@ impl<'a> DeferDirective<'a> { /// Extracts the arguments from the given directive assumed to be a @defer /// directive. /// Panics on any unexpected arguments. - pub fn from(directive: &'a Directive) -> Self { + pub fn from(directive: &'a Directive, defer_stream_interface: &DeferStreamInterface) -> Self { let mut if_arg = None; let mut label_arg = None; for arg in &directive.arguments { - if arg.name.item == DEFER_STREAM_CONSTANTS.if_arg { + if arg.name.item == defer_stream_interface.if_arg { if_arg = Some(arg); - } else if arg.name.item == DEFER_STREAM_CONSTANTS.label_arg { + } else if arg.name.item == defer_stream_interface.label_arg { label_arg = Some(arg); } else { panic!("Unexpected argument to @defer: {}", arg.name.item); @@ -48,19 +47,19 @@ impl<'a> StreamDirective<'a> { /// Extracts the arguments from the given directive assumed to be a @stream /// directive. /// Panics on any unexpected arguments. - pub fn from(directive: &'a Directive) -> Self { + pub fn from(directive: &'a Directive, defer_stream_interface: &DeferStreamInterface) -> Self { let mut if_arg = None; let mut label_arg = None; let mut initial_count_arg = None; let mut use_customized_batch_arg = None; for arg in &directive.arguments { - if arg.name.item == DEFER_STREAM_CONSTANTS.if_arg { + if arg.name.item == defer_stream_interface.if_arg { if_arg = Some(arg); - } else if arg.name.item == DEFER_STREAM_CONSTANTS.label_arg { + } else if arg.name.item == defer_stream_interface.label_arg { label_arg = Some(arg); - } else if arg.name.item == DEFER_STREAM_CONSTANTS.initial_count_arg { + } else if arg.name.item == defer_stream_interface.initial_count_arg { initial_count_arg = Some(arg); - } else if arg.name.item == DEFER_STREAM_CONSTANTS.use_customized_batch_arg { + } else if arg.name.item == defer_stream_interface.use_customized_batch_arg { use_customized_batch_arg = Some(arg); } else { panic!("Unexpected argument to @stream: {}", arg.name.item); diff --git a/compiler/crates/relay-transforms/src/defer_stream/mod.rs b/compiler/crates/relay-transforms/src/defer_stream/mod.rs index cf7759ebb3a64..7641ffcbbccb8 100644 --- a/compiler/crates/relay-transforms/src/defer_stream/mod.rs +++ b/compiler/crates/relay-transforms/src/defer_stream/mod.rs @@ -38,7 +38,7 @@ use graphql_ir::Value; use intern::string_key::Intern; use intern::string_key::StringKey; use intern::Lookup; -use lazy_static::lazy_static; +use relay_config::DeferStreamInterface; use schema::Schema; use thiserror::Error; @@ -46,38 +46,16 @@ use super::get_applied_fragment_name; use crate::util::remove_directive; use crate::util::replace_directive; -pub struct DeferStreamConstants { - pub defer_name: DirectiveName, - pub stream_name: DirectiveName, - pub if_arg: ArgumentName, - pub label_arg: ArgumentName, - pub initial_count_arg: ArgumentName, - pub use_customized_batch_arg: ArgumentName, -} - -impl Default for DeferStreamConstants { - fn default() -> Self { - Self { - defer_name: DirectiveName("defer".intern()), - stream_name: DirectiveName("stream".intern()), - if_arg: ArgumentName("if".intern()), - label_arg: ArgumentName("label".intern()), - initial_count_arg: ArgumentName("initial_count".intern()), - use_customized_batch_arg: ArgumentName("use_customized_batch".intern()), - } - } -} - -lazy_static! { - pub static ref DEFER_STREAM_CONSTANTS: DeferStreamConstants = Default::default(); -} - -pub fn transform_defer_stream(program: &Program) -> DiagnosticsResult { +pub fn transform_defer_stream( + program: &Program, + defer_stream_interface: &DeferStreamInterface, +) -> DiagnosticsResult { let mut transformer = DeferStreamTransform { program, current_document_name: None, labels: Default::default(), errors: Default::default(), + defer_stream_interface, }; let next_program = transformer.transform_program(program); @@ -93,6 +71,7 @@ struct DeferStreamTransform<'s> { current_document_name: Option, labels: HashMap, errors: Vec, + defer_stream_interface: &'s DeferStreamInterface, } impl DeferStreamTransform<'_> { @@ -100,14 +79,19 @@ impl DeferStreamTransform<'_> { self.current_document_name = Some(document_name) } - fn record_label(&mut self, label: StringKey, directive: &Directive) { + fn record_label( + &mut self, + label: StringKey, + directive: &Directive, + defer_stream_interface: &DeferStreamInterface, + ) { let prev_directive = self.labels.get(&label); match prev_directive { Some(prev) => { self.errors.push( Diagnostic::error( ValidationMessage::LabelNotUniqueForDeferStream { - directive_name: DEFER_STREAM_CONSTANTS.defer_name, + directive_name: defer_stream_interface.defer_name, }, prev.name.location, ) @@ -124,8 +108,10 @@ impl DeferStreamTransform<'_> { &mut self, spread: &FragmentSpread, defer: &Directive, + defer_stream_interface: &DeferStreamInterface, ) -> Result, Diagnostic> { - let DeferDirective { if_arg, label_arg } = DeferDirective::from(defer); + let DeferDirective { if_arg, label_arg } = + DeferDirective::from(defer, defer_stream_interface); if is_literal_false_arg(if_arg) { return Ok(Transformed::Replace(Selection::FragmentSpread(Arc::new( @@ -143,14 +129,14 @@ impl DeferStreamTransform<'_> { let transformed_label = transform_label( self.current_document_name .expect("We expect the parent name to be defined here."), - DEFER_STREAM_CONSTANTS.defer_name, + defer_stream_interface.defer_name, label, ); - self.record_label(transformed_label, defer); + self.record_label(transformed_label, defer, defer_stream_interface); let next_label_value = Value::Constant(ConstantValue::String(transformed_label)); let next_label_arg = Argument { name: WithLocation { - item: DEFER_STREAM_CONSTANTS.label_arg, + item: defer_stream_interface.label_arg, location: label_arg.map_or(defer.name.location, |arg| arg.name.location), }, value: WithLocation { @@ -188,6 +174,7 @@ impl DeferStreamTransform<'_> { &mut self, linked_field: &LinkedField, stream: &Directive, + defer_stream_interface: &DeferStreamInterface, ) -> Result, Diagnostic> { let schema_field = self.program.schema.field(linked_field.definition.item); if !schema_field.type_.is_list() { @@ -204,7 +191,7 @@ impl DeferStreamTransform<'_> { label_arg, initial_count_arg, use_customized_batch_arg, - } = StreamDirective::from(stream); + } = StreamDirective::from(stream, defer_stream_interface); let transformed_linked_field = self.default_transform_linked_field(linked_field); let get_next_selection = |directives| match transformed_linked_field { @@ -245,14 +232,14 @@ impl DeferStreamTransform<'_> { let transformed_label = transform_label( self.current_document_name .expect("We expect the parent name to be defined here."), - DEFER_STREAM_CONSTANTS.stream_name, + defer_stream_interface.stream_name, label, ); - self.record_label(transformed_label, stream); + self.record_label(transformed_label, stream, defer_stream_interface); let next_label_value = Value::Constant(ConstantValue::String(transformed_label)); let next_label_arg = Argument { name: WithLocation { - item: DEFER_STREAM_CONSTANTS.label_arg, + item: defer_stream_interface.label_arg, location: label_arg.map_or(stream.name.location, |arg| arg.name.location), }, value: WithLocation { @@ -314,10 +301,13 @@ impl<'s> Transformer for DeferStreamTransform<'s> { ) -> Transformed { let defer_directive = inline_fragment .directives - .named(DEFER_STREAM_CONSTANTS.defer_name); + .named(self.defer_stream_interface.defer_name); if let Some(directive) = defer_directive { // Special case for @defer generated by transform_connection - if let Some(label) = directive.arguments.named(DEFER_STREAM_CONSTANTS.label_arg) { + if let Some(label) = directive + .arguments + .named(self.defer_stream_interface.label_arg) + { if let Some(label) = label.value.item.get_string_literal() { if label.lookup().contains("$defer$") { return self.default_transform_inline_fragment(inline_fragment); @@ -335,9 +325,11 @@ impl<'s> Transformer for DeferStreamTransform<'s> { /// Transform of fragment spread with @defer is delegated to `transform_defer`. fn transform_fragment_spread(&mut self, spread: &FragmentSpread) -> Transformed { - let defer_directive = spread.directives.named(DEFER_STREAM_CONSTANTS.defer_name); + let defer_directive = spread + .directives + .named(self.defer_stream_interface.defer_name); if let Some(defer) = defer_directive { - match self.transform_defer(spread, defer) { + match self.transform_defer(spread, defer, self.defer_stream_interface) { Ok(transformed) => transformed, Err(err) => { self.errors.push(err); @@ -353,7 +345,7 @@ impl<'s> Transformer for DeferStreamTransform<'s> { fn transform_scalar_field(&mut self, scalar_field: &ScalarField) -> Transformed { let stream_directive = &scalar_field .directives - .named(DEFER_STREAM_CONSTANTS.stream_name); + .named(self.defer_stream_interface.stream_name); if let Some(directive) = stream_directive { self.errors.push(Diagnostic::error( ValidationMessage::InvalidStreamOnScalarField { @@ -369,9 +361,9 @@ impl<'s> Transformer for DeferStreamTransform<'s> { fn transform_linked_field(&mut self, linked_field: &LinkedField) -> Transformed { let stream_directive = linked_field .directives - .named(DEFER_STREAM_CONSTANTS.stream_name); + .named(self.defer_stream_interface.stream_name); if let Some(stream) = stream_directive { - match self.transform_stream(linked_field, stream) { + match self.transform_stream(linked_field, stream, self.defer_stream_interface) { Ok(transformed) => transformed, Err(err) => { self.errors.push(err); diff --git a/compiler/crates/relay-transforms/src/lib.rs b/compiler/crates/relay-transforms/src/lib.rs index accf02fe92051..24b962ca442fc 100644 --- a/compiler/crates/relay-transforms/src/lib.rs +++ b/compiler/crates/relay-transforms/src/lib.rs @@ -119,7 +119,6 @@ pub use declarative_connection::transform_declarative_connection; pub use defer_stream::transform_defer_stream; pub use defer_stream::DeferDirective; pub use defer_stream::StreamDirective; -pub use defer_stream::DEFER_STREAM_CONSTANTS; pub use directive_finder::DirectiveFinder; pub use flatten::flatten; pub use fragment_alias_directive::fragment_alias_directive; diff --git a/compiler/crates/relay-transforms/src/match_/match_transform.rs b/compiler/crates/relay-transforms/src/match_/match_transform.rs index 2937c91ca32c8..73da706cfc14c 100644 --- a/compiler/crates/relay-transforms/src/match_/match_transform.rs +++ b/compiler/crates/relay-transforms/src/match_/match_transform.rs @@ -44,6 +44,7 @@ use indexmap::IndexSet; use intern::string_key::Intern; use intern::string_key::StringKey; use intern::Lookup; +use relay_config::DeferStreamInterface; use relay_config::ModuleImportConfig; use schema::FieldID; use schema::ScalarID; @@ -52,7 +53,6 @@ use schema::Type; use schema::TypeReference; use super::validation_message::ValidationMessage; -use crate::defer_stream::DEFER_STREAM_CONSTANTS; use crate::inline_data_fragment::INLINE_DIRECTIVE_NAME; use crate::match_::MATCH_CONSTANTS; use crate::no_inline::attach_no_inline_directives_to_fragments; @@ -64,8 +64,14 @@ pub fn transform_match( program: &Program, feature_flags: &FeatureFlags, module_import_config: ModuleImportConfig, + defer_stream_interface: DeferStreamInterface, ) -> DiagnosticsResult { - let mut transformer = MatchTransform::new(program, feature_flags, module_import_config); + let mut transformer = MatchTransform::new( + program, + feature_flags, + module_import_config, + defer_stream_interface, + ); let next_program = transformer.transform_program(program); if transformer.errors.is_empty() { Ok(next_program.replace_or_else(|| program.clone())) @@ -113,6 +119,7 @@ pub struct MatchTransform<'program, 'flag> { // Stores the fragments that should use @no_inline and their parent document name no_inline_fragments: FragmentDefinitionNameMap>, module_import_config: ModuleImportConfig, + defer_stream_interface: DeferStreamInterface, } impl<'program, 'flag> MatchTransform<'program, 'flag> { @@ -120,6 +127,7 @@ impl<'program, 'flag> MatchTransform<'program, 'flag> { program: &'program Program, feature_flags: &'flag FeatureFlags, module_import_config: ModuleImportConfig, + defer_stream_interface: DeferStreamInterface, ) -> Self { Self { program, @@ -136,6 +144,7 @@ impl<'program, 'flag> MatchTransform<'program, 'flag> { no_inline_flag: &feature_flags.no_inline, no_inline_fragments: Default::default(), module_import_config, + defer_stream_interface, } } @@ -317,7 +326,7 @@ impl<'program, 'flag> MatchTransform<'program, 'flag> { && !(spread.directives.len() == 2 && spread .directives - .named(DEFER_STREAM_CONSTANTS.defer_name) + .named(self.defer_stream_interface.defer_name) .is_some()) { // allow @defer and @module in typegen transforms diff --git a/compiler/crates/relay-transforms/src/skip_redundant_nodes.rs b/compiler/crates/relay-transforms/src/skip_redundant_nodes.rs index fa7d9c5160bae..1bd110145c683 100644 --- a/compiler/crates/relay-transforms/src/skip_redundant_nodes.rs +++ b/compiler/crates/relay-transforms/src/skip_redundant_nodes.rs @@ -21,12 +21,12 @@ use graphql_ir::Program; use graphql_ir::Selection; use graphql_ir::Transformed; use graphql_ir::TransformedValue; +use relay_config::DeferStreamInterface; use schema::SDLSchema; use crate::util::is_relay_custom_inline_fragment_directive; use crate::ClientEdgeMetadataDirective; use crate::RelayLocationAgnosticBehavior; -use crate::DEFER_STREAM_CONSTANTS; /** * A transform that removes redundant fields and fragment spreads. Redundancy is @@ -119,8 +119,11 @@ use crate::DEFER_STREAM_CONSTANTS; * * 1 can be skipped because it is already fetched at the outer level. */ -pub fn skip_redundant_nodes(program: &Program) -> Program { - let transform = SkipRedundantNodesTransform::new(program); +pub fn skip_redundant_nodes( + program: &Program, + defer_stream_interface: DeferStreamInterface, +) -> Program { + let transform = SkipRedundantNodesTransform::new(program, defer_stream_interface); transform .transform_program(program) .replace_or_else(|| program.clone()) @@ -134,20 +137,26 @@ type Cache = DashMap, SelectionMap)>; pub struct SkipRedundantNodesTransform { schema: Arc, cache: Cache, + defer_stream_interface: DeferStreamInterface, } impl<'s> SkipRedundantNodesTransform { - fn new(program: &'_ Program) -> Self { + fn new(program: &'_ Program, defer_stream_interface: DeferStreamInterface) -> Self { Self { schema: Arc::clone(&program.schema), cache: DashMap::new(), + defer_stream_interface, } } - pub fn from_schema(schema: &Arc) -> Self { + pub fn from_schema( + schema: &Arc, + defer_stream_interface: DeferStreamInterface, + ) -> Self { Self { schema: Arc::clone(schema), cache: DashMap::new(), + defer_stream_interface, } } @@ -278,8 +287,10 @@ impl<'s> SkipRedundantNodesTransform { field: &LinkedField, selection_map: &mut SelectionMap, ) -> Transformed> { - let selections = - self.transform_selections(get_partitioned_selections(&field.selections), selection_map); + let selections = self.transform_selections( + self.get_partitioned_selections(&field.selections), + selection_map, + ); match selections { TransformedValue::Keep => Transformed::Keep, TransformedValue::Replace(selections) => { @@ -301,7 +312,7 @@ impl<'s> SkipRedundantNodesTransform { selection_map: &mut SelectionMap, ) -> Transformed> { let selections = self.transform_selections( - get_partitioned_selections(&condition.selections), + self.get_partitioned_selections(&condition.selections), selection_map, ); match selections { @@ -333,7 +344,7 @@ impl<'s> SkipRedundantNodesTransform { { Vec::from_iter(&fragment.selections) } else { - get_partitioned_selections(&fragment.selections) + self.get_partitioned_selections(&fragment.selections) }, selection_map, ); @@ -406,7 +417,7 @@ impl<'s> SkipRedundantNodesTransform { ) -> Transformed { let mut selection_map = Default::default(); let selections = self.transform_selections( - get_partitioned_selections(&operation.selections), + self.get_partitioned_selections(&operation.selections), &mut selection_map, ); match selections { @@ -424,7 +435,7 @@ impl<'s> SkipRedundantNodesTransform { ) -> Transformed { let mut selection_map = Default::default(); let selections = self.transform_selections( - get_partitioned_selections(&fragment.selections), + self.get_partitioned_selections(&fragment.selections), &mut selection_map, ); match selections { @@ -460,41 +471,41 @@ impl<'s> SkipRedundantNodesTransform { } TransformedValue::Replace(next_program) } -} -/* Selections are sorted with fields first, "conditionals" - * (inline fragments & conditions) last. This means that all fields that are - * guaranteed to be fetched are encountered prior to any duplicates that may be - * fetched within a conditional. - */ -fn get_partitioned_selections(selections: &[Selection]) -> Vec<&Selection> { - let mut result = Vec::with_capacity(selections.len()); - unsafe { result.set_len(selections.len()) }; - let mut non_field_index = selections - .iter() - .filter(|sel| is_selection_linked_or_scalar(sel)) - .count(); - let mut field_index = 0; - for sel in selections.iter() { - if is_selection_linked_or_scalar(sel) { - result[field_index] = sel; - field_index += 1; - } else { - result[non_field_index] = sel; - non_field_index += 1; + /* Selections are sorted with fields first, "conditionals" + * (inline fragments & conditions) last. This means that all fields that are + * guaranteed to be fetched are encountered prior to any duplicates that may be + * fetched within a conditional. + */ + fn get_partitioned_selections<'a>(&self, selections: &'a [Selection]) -> Vec<&'a Selection> { + let mut result = Vec::with_capacity(selections.len()); + unsafe { result.set_len(selections.len()) }; + let mut non_field_index = selections + .iter() + .filter(|sel| self.is_selection_linked_or_scalar(sel)) + .count(); + let mut field_index = 0; + for sel in selections.iter() { + if self.is_selection_linked_or_scalar(sel) { + result[field_index] = sel; + field_index += 1; + } else { + result[non_field_index] = sel; + non_field_index += 1; + } } + result } - result -} -fn is_selection_linked_or_scalar(selection: &Selection) -> bool { - match selection { - Selection::LinkedField(field) => field - .directives - .named(DEFER_STREAM_CONSTANTS.stream_name) - .is_none(), - Selection::ScalarField(_) => true, - _ => false, + fn is_selection_linked_or_scalar(&self, selection: &Selection) -> bool { + match selection { + Selection::LinkedField(field) => field + .directives + .named(self.defer_stream_interface.stream_name) + .is_none(), + Selection::ScalarField(_) => true, + _ => false, + } } } diff --git a/compiler/crates/relay-transforms/src/skip_unreachable_node.rs b/compiler/crates/relay-transforms/src/skip_unreachable_node.rs index fdb2ba1adfc83..ffad4e1eb5954 100644 --- a/compiler/crates/relay-transforms/src/skip_unreachable_node.rs +++ b/compiler/crates/relay-transforms/src/skip_unreachable_node.rs @@ -28,9 +28,9 @@ use graphql_ir::TransformedValue; use graphql_ir::Transformer; use graphql_ir::Value; use intern::string_key::StringKey; +use relay_config::DeferStreamInterface; use thiserror::Error; -use super::defer_stream::DEFER_STREAM_CONSTANTS; use crate::DeferDirective; use crate::NoInlineFragmentSpreadMetadata; use crate::StreamDirective; @@ -40,10 +40,13 @@ enum ValidationMode { Loose, } -pub fn skip_unreachable_node_strict(program: &Program) -> DiagnosticsResult { +pub fn skip_unreachable_node_strict( + program: &Program, + defer_stream_interface: DeferStreamInterface, +) -> DiagnosticsResult { let errors = vec![]; let mut validation_mode = ValidationMode::Strict(errors); - let next_program = skip_unreachable_node(program, &mut validation_mode); + let next_program = skip_unreachable_node(program, &mut validation_mode, defer_stream_interface); if let ValidationMode::Strict(errors) = validation_mode { if !errors.is_empty() { @@ -53,14 +56,21 @@ pub fn skip_unreachable_node_strict(program: &Program) -> DiagnosticsResult Program { +pub fn skip_unreachable_node_loose( + program: &Program, + defer_stream_interface: DeferStreamInterface, +) -> Program { let mut validation_mode = ValidationMode::Loose; - skip_unreachable_node(program, &mut validation_mode) + skip_unreachable_node(program, &mut validation_mode, defer_stream_interface) } -fn skip_unreachable_node(program: &Program, validation_mode: &mut ValidationMode) -> Program { +fn skip_unreachable_node( + program: &Program, + validation_mode: &mut ValidationMode, + defer_stream_interface: DeferStreamInterface, +) -> Program { let mut skip_unreachable_node_transform = - SkipUnreachableNodeTransform::new(program, validation_mode); + SkipUnreachableNodeTransform::new(program, validation_mode, defer_stream_interface); let transformed = skip_unreachable_node_transform.transform_program(program); transformed.replace_or_else(|| program.clone()) @@ -73,6 +83,7 @@ pub struct SkipUnreachableNodeTransform<'s> { visited_fragments: VisitedFragments, program: &'s Program, validation_mode: &'s mut ValidationMode, + defer_stream_interface: DeferStreamInterface, } impl<'s> Transformer for SkipUnreachableNodeTransform<'s> { @@ -213,8 +224,13 @@ impl<'s> Transformer for SkipUnreachableNodeTransform<'s> { fn transform_linked_field(&mut self, field: &LinkedField) -> Transformed { let transformed_field = self.default_transform_linked_field(field); - if let Some(directive) = field.directives.named(DEFER_STREAM_CONSTANTS.stream_name) { - if let Some(if_arg) = StreamDirective::from(directive).if_arg { + if let Some(directive) = field + .directives + .named(self.defer_stream_interface.stream_name) + { + if let Some(if_arg) = + StreamDirective::from(directive, &self.defer_stream_interface).if_arg + { if let Value::Constant(ConstantValue::Boolean(false)) = &if_arg.value.item { let mut next_field = match transformed_field { Transformed::Delete => return Transformed::Delete, @@ -228,7 +244,7 @@ impl<'s> Transformer for SkipUnreachableNodeTransform<'s> { Arc::make_mut(&mut next_field) .directives .retain(|directive| { - directive.name.item != DEFER_STREAM_CONSTANTS.stream_name + directive.name.item != self.defer_stream_interface.stream_name }); assert_eq!( previous_directive_len, @@ -244,11 +260,16 @@ impl<'s> Transformer for SkipUnreachableNodeTransform<'s> { } impl<'s> SkipUnreachableNodeTransform<'s> { - fn new(program: &'s Program, validation_mode: &'s mut ValidationMode) -> Self { + fn new( + program: &'s Program, + validation_mode: &'s mut ValidationMode, + defer_stream_interface: DeferStreamInterface, + ) -> Self { Self { visited_fragments: Default::default(), program, validation_mode, + defer_stream_interface, } } @@ -292,10 +313,12 @@ impl<'s> SkipUnreachableNodeTransform<'s> { ) -> TransformedMulti { if let Some(directive) = inline_fragment .directives - .named(DEFER_STREAM_CONSTANTS.defer_name) + .named(self.defer_stream_interface.defer_name) { assert!(inline_fragment.directives.len() == 1); - if let Some(if_arg) = DeferDirective::from(directive).if_arg { + if let Some(if_arg) = + DeferDirective::from(directive, &self.defer_stream_interface).if_arg + { if let Value::Constant(ConstantValue::Boolean(false)) = &if_arg.value.item { return TransformedMulti::ReplaceMultiple( self.transform_selections(&inline_fragment.selections) diff --git a/compiler/crates/relay-transforms/src/transform_connections.rs b/compiler/crates/relay-transforms/src/transform_connections.rs index 733e70e5734aa..b9fac91ace30e 100644 --- a/compiler/crates/relay-transforms/src/transform_connections.rs +++ b/compiler/crates/relay-transforms/src/transform_connections.rs @@ -25,6 +25,7 @@ use graphql_ir::Value; use intern::string_key::Intern; use intern::string_key::StringKey; use intern::Lookup; +use relay_config::DeferStreamInterface; use schema::Schema; use crate::connections::assert_connection_selections; @@ -37,15 +38,16 @@ use crate::connections::ConnectionConstants; use crate::connections::ConnectionInterface; use crate::connections::ConnectionMetadata; use crate::connections::ConnectionMetadataDirective; -use crate::defer_stream::DEFER_STREAM_CONSTANTS; use crate::handle_fields::build_handle_field_directive_from_connection_directive; use crate::handle_fields::KEY_ARG_NAME; pub fn transform_connections( program: &Program, connection_interface: &ConnectionInterface, + defer_stream_interface: &DeferStreamInterface, ) -> Program { - let mut transform = ConnectionTransform::new(program, connection_interface); + let mut transform = + ConnectionTransform::new(program, connection_interface, defer_stream_interface); transform .transform_program(program) .replace_or_else(|| program.clone()) @@ -58,10 +60,15 @@ struct ConnectionTransform<'s> { current_connection_metadata: Vec, current_document_name: StringKey, program: &'s Program, + defer_stream_interface: &'s DeferStreamInterface, } impl<'s> ConnectionTransform<'s> { - fn new(program: &'s Program, connection_interface: &'s ConnectionInterface) -> Self { + fn new( + program: &'s Program, + connection_interface: &'s ConnectionInterface, + defer_stream_interface: &'s DeferStreamInterface, + ) -> Self { Self { connection_constants: ConnectionConstants::default(), connection_interface, @@ -69,6 +76,7 @@ impl<'s> ConnectionTransform<'s> { current_document_name: connection_interface.cursor, // Set an arbitrary value to avoid Option current_connection_metadata: Vec::new(), program, + defer_stream_interface, } } @@ -132,16 +140,43 @@ impl<'s> ConnectionTransform<'s> { if is_stream_connection { let mut arguments = vec![]; for arg in &connection_directive.arguments { - if arg.name.item == DEFER_STREAM_CONSTANTS.if_arg - || arg.name.item == DEFER_STREAM_CONSTANTS.initial_count_arg - || arg.name.item == DEFER_STREAM_CONSTANTS.use_customized_batch_arg + if arg.name.item == self.connection_constants.stream_connection_if_arg { + arguments.push(Argument { + name: WithLocation::new( + arg.name.location, + self.defer_stream_interface.if_arg, + ), + value: arg.value.clone(), + }); + } else if arg.name.item + == self + .connection_constants + .stream_connection_initial_count_arg + { + arguments.push(Argument { + name: WithLocation::new( + arg.name.location, + self.defer_stream_interface.initial_count_arg, + ), + value: arg.value.clone(), + }); + } else if arg.name.item + == self + .connection_constants + .stream_connection_use_customized_batch_arg { - arguments.push(arg.clone()); + arguments.push(Argument { + name: WithLocation::new( + arg.name.location, + self.defer_stream_interface.use_customized_batch_arg, + ), + value: arg.value.clone(), + }); } else if arg.name.item == *KEY_ARG_NAME { arguments.push(Argument { name: WithLocation::new( arg.name.location, - DEFER_STREAM_CONSTANTS.label_arg, + self.defer_stream_interface.label_arg, ), value: arg.value.clone(), }); @@ -150,7 +185,7 @@ impl<'s> ConnectionTransform<'s> { transformed_edges_field.directives.push(Directive { name: WithLocation::new( connection_directive.name.location, - DEFER_STREAM_CONSTANTS.stream_name, + self.defer_stream_interface.stream_name, ), arguments, data: None, @@ -218,7 +253,7 @@ impl<'s> ConnectionTransform<'s> { arguments.push(Argument { name: WithLocation::new( key_arg.name.location, - DEFER_STREAM_CONSTANTS.label_arg, + self.defer_stream_interface.label_arg, ), value: WithLocation::new( key_arg.value.location, @@ -234,8 +269,16 @@ impl<'s> ConnectionTransform<'s> { ), }); } - if let Some(if_arg) = connection_args.named(DEFER_STREAM_CONSTANTS.if_arg) { - arguments.push(if_arg.clone()); + if let Some(if_arg) = + connection_args.named(self.connection_constants.stream_connection_if_arg) + { + arguments.push(Argument { + name: WithLocation::new( + if_arg.name.location, + self.defer_stream_interface.if_arg, + ), + value: if_arg.value.clone(), + }) } Selection::InlineFragment(Arc::new(InlineFragment { type_condition: None, @@ -245,7 +288,7 @@ impl<'s> ConnectionTransform<'s> { directives: vec![Directive { name: WithLocation::new( connection_directive.name.location, - DEFER_STREAM_CONSTANTS.defer_name, + self.defer_stream_interface.defer_name, ), arguments, data: None, diff --git a/compiler/crates/relay-transforms/src/unwrap_custom_directive_selection.rs b/compiler/crates/relay-transforms/src/unwrap_custom_directive_selection.rs index e698fd15256c8..e9722ba92d70e 100644 --- a/compiler/crates/relay-transforms/src/unwrap_custom_directive_selection.rs +++ b/compiler/crates/relay-transforms/src/unwrap_custom_directive_selection.rs @@ -15,19 +15,31 @@ use graphql_ir::Program; use graphql_ir::Selection; use graphql_ir::Transformed; use graphql_ir::Transformer; - -use crate::DEFER_STREAM_CONSTANTS; +use relay_config::DeferStreamInterface; /// Transform to unwrap selections wrapped in a InlineFragment with custom /// directive for printing -pub fn unwrap_custom_directive_selection(program: &Program) -> Program { - let mut transform = UnwrapCustomDirectiveSelection; +pub fn unwrap_custom_directive_selection( + program: &Program, + defer_stream_interface: DeferStreamInterface, +) -> Program { + let mut transform = UnwrapCustomDirectiveSelection::new(defer_stream_interface); transform .transform_program(program) .replace_or_else(|| program.clone()) } -struct UnwrapCustomDirectiveSelection; +struct UnwrapCustomDirectiveSelection { + defer_stream_interface: DeferStreamInterface, +} + +impl UnwrapCustomDirectiveSelection { + fn new(defer_stream_interface: DeferStreamInterface) -> Self { + Self { + defer_stream_interface, + } + } +} impl Transformer for UnwrapCustomDirectiveSelection { const NAME: &'static str = "UnwrapCustomDirectiveSelection"; @@ -37,7 +49,9 @@ impl Transformer for UnwrapCustomDirectiveSelection { fn transform_inline_fragment(&mut self, fragment: &InlineFragment) -> Transformed { if fragment.type_condition.is_none() { // Remove the wrapping `... @defer` for `@defer` on fragment spreads. - let defer = fragment.directives.named(DEFER_STREAM_CONSTANTS.defer_name); + let defer = fragment + .directives + .named(self.defer_stream_interface.defer_name); if let Some(defer) = defer { if let Selection::FragmentSpread(frag_spread) = &fragment.selections[0] { return Transformed::Replace(Selection::FragmentSpread(Arc::new( diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-default-label.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-default-label.expected index 4b424a088dd26..0061be156e355 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-default-label.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-default-label.expected @@ -8,7 +8,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1) { + actors @stream(initialCount: 1) { name } } @@ -24,7 +24,7 @@ query QueryWithFragmentWithStream( fragment FeedbackFragment on Feedback { id - actors @stream(label: "FeedbackFragment$stream$actors", initial_count: 1) { + actors @stream(label: "FeedbackFragment$stream$actors", initialCount: 1) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-default-label.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-default-label.graphql index 23fa23b3e8e43..739db7de64c6a 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-default-label.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-default-label.graphql @@ -7,7 +7,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1) { + actors @stream(initialCount: 1) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-duplicate-label.invalid.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-duplicate-label.invalid.expected index 37c40c910a975..7fe5f5834cdda 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-duplicate-label.invalid.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-duplicate-label.invalid.expected @@ -9,10 +9,10 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "actors") { + actors @stream(initialCount: 1, label: "actors") { name } - otherActors: actors @stream(initial_count: 1, label: "actors") { + otherActors: actors @stream(initialCount: 1, label: "actors") { # invalid: duplicate label name } @@ -22,7 +22,7 @@ fragment FeedbackFragment on Feedback { fragment-with-stream-duplicate-label.invalid.graphql:11:10 10 │ id - 11 │ actors @stream(initial_count: 1, label: "actors") { + 11 │ actors @stream(initialCount: 1, label: "actors") { │ ^^^^^^^ 12 │ name @@ -30,6 +30,6 @@ fragment FeedbackFragment on Feedback { fragment-with-stream-duplicate-label.invalid.graphql:14:23 13 │ } - 14 │ otherActors: actors @stream(initial_count: 1, label: "actors") { + 14 │ otherActors: actors @stream(initialCount: 1, label: "actors") { │ ^^^^^^^ 15 │ # invalid: duplicate label diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-duplicate-label.invalid.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-duplicate-label.invalid.graphql index 6f0d3488b2cb9..a05f524d1de46 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-duplicate-label.invalid.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-duplicate-label.invalid.graphql @@ -8,10 +8,10 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "actors") { + actors @stream(initialCount: 1, label: "actors") { name } - otherActors: actors @stream(initial_count: 1, label: "actors") { + otherActors: actors @stream(initialCount: 1, label: "actors") { # invalid: duplicate label name } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-if-arg.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-if-arg.expected index 07a4e1cfba531..d3db2ff831380 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-if-arg.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-if-arg.expected @@ -9,7 +9,7 @@ query QueryWithFragmentWithStream($id: ID!, $enableStream: Boolean) { fragment FeedbackFragment on Feedback { id actors - @stream(initial_count: 1, label: "StreamedActorsLabel", if: $enableStream) { + @stream(initialCount: 1, label: "StreamedActorsLabel", if: $enableStream) { name } } @@ -26,7 +26,7 @@ query QueryWithFragmentWithStream( fragment FeedbackFragment on Feedback { id - actors @stream(label: "FeedbackFragment$stream$StreamedActorsLabel", if: $enableStream, initial_count: 1) { + actors @stream(label: "FeedbackFragment$stream$StreamedActorsLabel", if: $enableStream, initialCount: 1) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-if-arg.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-if-arg.graphql index 20ae2c07f0bcf..266ebda30663d 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-if-arg.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-if-arg.graphql @@ -8,7 +8,7 @@ query QueryWithFragmentWithStream($id: ID!, $enableStream: Boolean) { fragment FeedbackFragment on Feedback { id actors - @stream(initial_count: 1, label: "StreamedActorsLabel", if: $enableStream) { + @stream(initialCount: 1, label: "StreamedActorsLabel", if: $enableStream) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-initial-count-arg.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-initial-count-arg.expected index 4c128c9f3f139..1f8aade373550 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-initial-count-arg.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-initial-count-arg.expected @@ -8,7 +8,7 @@ query QueryWithFragmentWithStream($id: ID!, $initialCount: Int) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: $initialCount, label: "StreamedActorsLabel") { + actors @stream(initialCount: $initialCount, label: "StreamedActorsLabel") { name } } @@ -25,7 +25,7 @@ query QueryWithFragmentWithStream( fragment FeedbackFragment on Feedback { id - actors @stream(label: "FeedbackFragment$stream$StreamedActorsLabel", initial_count: $initialCount) { + actors @stream(label: "FeedbackFragment$stream$StreamedActorsLabel", initialCount: $initialCount) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-initial-count-arg.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-initial-count-arg.graphql index 9e689d6875cb5..338a8274a7ed7 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-initial-count-arg.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-initial-count-arg.graphql @@ -7,7 +7,7 @@ query QueryWithFragmentWithStream($id: ID!, $initialCount: Int) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: $initialCount, label: "StreamedActorsLabel") { + actors @stream(initialCount: $initialCount, label: "StreamedActorsLabel") { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-missing-initial-count-arg.invalid.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-missing-initial-count-arg.invalid.expected index e8b5acc305d89..58d629b758765 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-missing-initial-count-arg.invalid.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-missing-initial-count-arg.invalid.expected @@ -10,15 +10,15 @@ query QueryWithFragmentWithStream($id: ID!, $initialCount: Int) { fragment FeedbackFragment on Feedback { id actors @stream(label: "StreamedActorsLabel") { - # invalid: missing initial_count + # invalid: missing initialCount name } } ==================================== ERROR ==================================== -✖︎ Missing required argument: `initial_count` +✖︎ Missing required argument: `initialCount` fragment-with-stream-missing-initial-count-arg.invalid.graphql:11:11 10 │ id 11 │ actors @stream(label: "StreamedActorsLabel") { │ ^^^^^^ - 12 │ # invalid: missing initial_count + 12 │ # invalid: missing initialCount diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-missing-initial-count-arg.invalid.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-missing-initial-count-arg.invalid.graphql index c21bf7d7967ff..205c6284cd71c 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-missing-initial-count-arg.invalid.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-missing-initial-count-arg.invalid.graphql @@ -9,7 +9,7 @@ query QueryWithFragmentWithStream($id: ID!, $initialCount: Int) { fragment FeedbackFragment on Feedback { id actors @stream(label: "StreamedActorsLabel") { - # invalid: missing initial_count + # invalid: missing initialCount name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-on-scalar-field.invalid.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-on-scalar-field.invalid.expected index fe338e6a8ba90..d1b7e4edc6d6d 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-on-scalar-field.invalid.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-on-scalar-field.invalid.expected @@ -9,13 +9,13 @@ query QueryWithFragmentWithStream($id: ID!, $label: String!) { fragment UserFragment on User { id - name @stream(initial_count: 1, label: $label) + name @stream(initialCount: 1, label: $label) } ==================================== ERROR ==================================== ✖︎ Invalid use of @stream on scalar field 'name' fragment-with-stream-on-scalar-field.invalid.graphql:11:8 10 │ id - 11 │ name @stream(initial_count: 1, label: $label) + 11 │ name @stream(initialCount: 1, label: $label) │ ^^^^^^^ 12 │ } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-on-scalar-field.invalid.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-on-scalar-field.invalid.graphql index 5ee3aa3cc33fc..907553dc9f516 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-on-scalar-field.invalid.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-on-scalar-field.invalid.graphql @@ -8,5 +8,5 @@ query QueryWithFragmentWithStream($id: ID!, $label: String!) { fragment UserFragment on User { id - name @stream(initial_count: 1, label: $label) + name @stream(initialCount: 1, label: $label) } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-statically-disabled.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-statically-disabled.expected index fdcdc1f94f927..18a1d123489f1 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-statically-disabled.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-statically-disabled.expected @@ -8,7 +8,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "StreamedActorsLabel", if: false) { + actors @stream(initialCount: 1, label: "StreamedActorsLabel", if: false) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-statically-disabled.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-statically-disabled.graphql index cc529d908f6db..9fb1e0e3212d6 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-statically-disabled.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-statically-disabled.graphql @@ -7,7 +7,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "StreamedActorsLabel", if: false) { + actors @stream(initialCount: 1, label: "StreamedActorsLabel", if: false) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-use_customized_batch-arg.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-use_customized_batch-arg.expected index e63411c2c5e3f..f7e18f6a86691 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-use_customized_batch-arg.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-use_customized_batch-arg.expected @@ -11,9 +11,9 @@ fragment FeedbackFragment on Feedback { actors @stream( if: true - initial_count: 1 + initialCount: 1 label: "StreamedActorsLabel" - use_customized_batch: $useCustomizedBatch + useCustomizedBatch: $useCustomizedBatch ) { name } @@ -31,7 +31,7 @@ query QueryWithFragmentWithStream( fragment FeedbackFragment on Feedback { id - actors @stream(label: "FeedbackFragment$stream$StreamedActorsLabel", if: true, initial_count: 1, use_customized_batch: $useCustomizedBatch) { + actors @stream(label: "FeedbackFragment$stream$StreamedActorsLabel", if: true, initialCount: 1, useCustomizedBatch: $useCustomizedBatch) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-use_customized_batch-arg.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-use_customized_batch-arg.graphql index 5c0f7c15b697e..b252e2ba8dfbe 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-use_customized_batch-arg.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-use_customized_batch-arg.graphql @@ -10,9 +10,9 @@ fragment FeedbackFragment on Feedback { actors @stream( if: true - initial_count: 1 + initialCount: 1 label: "StreamedActorsLabel" - use_customized_batch: $useCustomizedBatch + useCustomizedBatch: $useCustomizedBatch ) { name } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-variable-label.invalid.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-variable-label.invalid.expected index 7c03a46f98759..de2cc3bf22754 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-variable-label.invalid.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-variable-label.invalid.expected @@ -9,7 +9,7 @@ query QueryWithFragmentWithStream($id: ID!, $label: String!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: $label) { + actors @stream(initialCount: 1, label: $label) { name } } @@ -18,6 +18,6 @@ fragment FeedbackFragment on Feedback { fragment-with-stream-variable-label.invalid.graphql:11:10 10 │ id - 11 │ actors @stream(initial_count: 1, label: $label) { + 11 │ actors @stream(initialCount: 1, label: $label) { │ ^^^^^^^ 12 │ name diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-variable-label.invalid.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-variable-label.invalid.graphql index 0877996f4bd7b..9d6f748019d5d 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-variable-label.invalid.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream-variable-label.invalid.graphql @@ -8,7 +8,7 @@ query QueryWithFragmentWithStream($id: ID!, $label: String!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: $label) { + actors @stream(initialCount: 1, label: $label) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream.expected index 61c9e8b532e49..2c4055bc32bc2 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream.expected @@ -8,7 +8,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "StreamedActorsLabel") { + actors @stream(initialCount: 1, label: "StreamedActorsLabel") { name } } @@ -24,7 +24,7 @@ query QueryWithFragmentWithStream( fragment FeedbackFragment on Feedback { id - actors @stream(label: "FeedbackFragment$stream$StreamedActorsLabel", initial_count: 1) { + actors @stream(label: "FeedbackFragment$stream$StreamedActorsLabel", initialCount: 1) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream.graphql index 8891fba1b9c8d..ceb87c5700edc 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/fragment-with-stream.graphql @@ -7,7 +7,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - actors @stream(initial_count: 1, label: "StreamedActorsLabel") { + actors @stream(initialCount: 1, label: "StreamedActorsLabel") { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/query-with-stream.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/query-with-stream.expected index 94b95aa77dd22..99d8ff40f48c6 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/query-with-stream.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/query-with-stream.expected @@ -2,7 +2,7 @@ query QueryWithStream($id: ID!) { node(id: $id) { ... on Feedback { - actors @stream(initial_count: 1, label: "StreamedActorsLabel") { + actors @stream(initialCount: 1, label: "StreamedActorsLabel") { name } } @@ -14,7 +14,7 @@ query QueryWithStream( ) { node(id: $id) { ... on Feedback { - actors @stream(label: "QueryWithStream$stream$StreamedActorsLabel", initial_count: 1) { + actors @stream(label: "QueryWithStream$stream$StreamedActorsLabel", initialCount: 1) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/query-with-stream.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/query-with-stream.graphql index 2b7d7173527d1..cb244a79f1267 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/query-with-stream.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/query-with-stream.graphql @@ -1,7 +1,7 @@ query QueryWithStream($id: ID!) { node(id: $id) { ... on Feedback { - actors @stream(initial_count: 1, label: "StreamedActorsLabel") { + actors @stream(initialCount: 1, label: "StreamedActorsLabel") { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/stream.invalid.expected b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/stream.invalid.expected index 4d392cfd59708..e5a18b3a14b11 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/stream.invalid.expected +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/stream.invalid.expected @@ -3,7 +3,7 @@ fragment FeedbackFragment on Feedback { id - actor @stream(initial_count: 1) { + actor @stream(initialCount: 1) { name } } @@ -12,6 +12,6 @@ fragment FeedbackFragment on Feedback { stream.invalid.graphql:5:9 4 │ id - 5 │ actor @stream(initial_count: 1) { + 5 │ actor @stream(initialCount: 1) { │ ^^^^^^^ 6 │ name diff --git a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/stream.invalid.graphql b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/stream.invalid.graphql index b8e9a950fe4fc..5c640c998741a 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/fixtures/stream.invalid.graphql +++ b/compiler/crates/relay-transforms/tests/defer_stream/fixtures/stream.invalid.graphql @@ -2,7 +2,7 @@ fragment FeedbackFragment on Feedback { id - actor @stream(initial_count: 1) { + actor @stream(initialCount: 1) { name } } diff --git a/compiler/crates/relay-transforms/tests/defer_stream/mod.rs b/compiler/crates/relay-transforms/tests/defer_stream/mod.rs index 0d323659287f2..a7435de962b42 100644 --- a/compiler/crates/relay-transforms/tests/defer_stream/mod.rs +++ b/compiler/crates/relay-transforms/tests/defer_stream/mod.rs @@ -7,13 +7,15 @@ use fixture_tests::Fixture; use graphql_test_helpers::apply_transform_for_test; +use relay_config::DeferStreamInterface; use relay_transforms::transform_defer_stream; use relay_transforms::unwrap_custom_directive_selection; pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result { + let defer_stream_interface = DeferStreamInterface::default(); apply_transform_for_test(fixture, |program| { - let program = transform_defer_stream(program)?; - let program = unwrap_custom_directive_selection(&program); + let program = transform_defer_stream(program, &defer_stream_interface)?; + let program = unwrap_custom_directive_selection(&program, defer_stream_interface); Ok(program) }) } diff --git a/compiler/crates/relay-transforms/tests/generate_data_driven_dependency_metadata/mod.rs b/compiler/crates/relay-transforms/tests/generate_data_driven_dependency_metadata/mod.rs index 529407f910278..8b64bac9f068f 100644 --- a/compiler/crates/relay-transforms/tests/generate_data_driven_dependency_metadata/mod.rs +++ b/compiler/crates/relay-transforms/tests/generate_data_driven_dependency_metadata/mod.rs @@ -14,7 +14,7 @@ use relay_transforms::transform_match; pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result { apply_transform_for_test(fixture, |program| { let flags = FeatureFlags::default(); - let program = transform_match(program, &flags, Default::default())?; + let program = transform_match(program, &flags, Default::default(), Default::default())?; let program = generate_data_driven_dependency_metadata(&program); Ok(program) }) diff --git a/compiler/crates/relay-transforms/tests/match_transform/mod.rs b/compiler/crates/relay-transforms/tests/match_transform/mod.rs index 5990774232094..263344ccd37ef 100644 --- a/compiler/crates/relay-transforms/tests/match_transform/mod.rs +++ b/compiler/crates/relay-transforms/tests/match_transform/mod.rs @@ -13,6 +13,6 @@ use relay_transforms::transform_match; pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result { let flags = FeatureFlags::default(); apply_transform_for_test(fixture, |program| { - transform_match(program, &flags, Default::default()) + transform_match(program, &flags, Default::default(), Default::default()) }) } diff --git a/compiler/crates/relay-transforms/tests/match_transform_local/mod.rs b/compiler/crates/relay-transforms/tests/match_transform_local/mod.rs index 9909018d83a49..47c1dff650dcc 100644 --- a/compiler/crates/relay-transforms/tests/match_transform_local/mod.rs +++ b/compiler/crates/relay-transforms/tests/match_transform_local/mod.rs @@ -8,6 +8,7 @@ use common::FeatureFlags; use fixture_tests::Fixture; use graphql_test_helpers::apply_transform_for_test; +use relay_config::DeferStreamInterface; use relay_config::DynamicModuleProvider; use relay_config::ModuleImportConfig; use relay_transforms::transform_match; @@ -17,7 +18,13 @@ pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result let module_import_config = ModuleImportConfig { dynamic_module_provider: Some(DynamicModuleProvider::JSResource), }; + let defer_stream_interface = DeferStreamInterface::default(); apply_transform_for_test(fixture, |program| { - transform_match(program, &flags, module_import_config) + transform_match( + program, + &flags, + module_import_config, + defer_stream_interface, + ) }) } diff --git a/compiler/crates/relay-transforms/tests/refetchable_fragment/fixtures/refetchable-fragment-with-connection-with-stream.expected b/compiler/crates/relay-transforms/tests/refetchable_fragment/fixtures/refetchable-fragment-with-connection-with-stream.expected index 0e0f21a623129..4d7f7a261c324 100644 --- a/compiler/crates/relay-transforms/tests/refetchable_fragment/fixtures/refetchable-fragment-with-connection-with-stream.expected +++ b/compiler/crates/relay-transforms/tests/refetchable_fragment/fixtures/refetchable-fragment-with-connection-with-stream.expected @@ -80,7 +80,7 @@ fragment PaginationFragment on Node @refetchable(queryName: "RefetchableFragment ... on User { name friends(after: $cursor, first: $count) @__clientField(key: "PaginationFragment_friends", handle: "connection", filters: null, dynamicKey_UNSTABLE: null) { - edges @stream(label: "PaginationFragment_friends", initial_count: 1) { + edges @stream(label: "PaginationFragment_friends", initialCount: 1) { node { id } diff --git a/compiler/crates/relay-transforms/tests/refetchable_fragment/mod.rs b/compiler/crates/relay-transforms/tests/refetchable_fragment/mod.rs index 8c9d0fd2fbac7..0d3d7988f2f62 100644 --- a/compiler/crates/relay-transforms/tests/refetchable_fragment/mod.rs +++ b/compiler/crates/relay-transforms/tests/refetchable_fragment/mod.rs @@ -7,13 +7,18 @@ use fixture_tests::Fixture; use graphql_test_helpers::apply_transform_for_test; +use relay_config::DeferStreamInterface; use relay_transforms::transform_connections; use relay_transforms::transform_refetchable_fragment; use relay_transforms::ConnectionInterface; pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result { apply_transform_for_test(fixture, |program| { - let program = transform_connections(program, &ConnectionInterface::default()); + let program = transform_connections( + program, + &ConnectionInterface::default(), + &DeferStreamInterface::default(), + ); let base_fragments = Default::default(); transform_refetchable_fragment(&program, &Default::default(), &base_fragments, false) }) diff --git a/compiler/crates/relay-transforms/tests/skip_redundant_nodes/mod.rs b/compiler/crates/relay-transforms/tests/skip_redundant_nodes/mod.rs index ce6d01c4c28f3..c76e0ae33721c 100644 --- a/compiler/crates/relay-transforms/tests/skip_redundant_nodes/mod.rs +++ b/compiler/crates/relay-transforms/tests/skip_redundant_nodes/mod.rs @@ -14,6 +14,7 @@ use graphql_ir::Program; use graphql_syntax::parse_executable; use graphql_text_printer::print_operation; use graphql_text_printer::PrinterOptions; +use relay_config::DeferStreamInterface; use relay_test_schema::get_test_schema; use relay_test_schema::get_test_schema_with_extensions; use relay_transforms::inline_fragments; @@ -26,12 +27,14 @@ pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result debug_directive_data: true, ..Default::default() }; + let defer_stream_interface = DeferStreamInterface::default(); let mut printed = if let [base, extensions] = parts.as_slice() { let ast = parse_executable(base, source_location).unwrap(); let schema = get_test_schema_with_extensions(extensions); let ir = build(&schema, &ast.definitions).unwrap(); let program = Program::from_definitions(Arc::clone(&schema), ir); - let next_program = skip_redundant_nodes(&inline_fragments(&program)); + let next_program = + skip_redundant_nodes(&inline_fragments(&program), defer_stream_interface); next_program .operations() .map(|def| print_operation(&schema, def, printer_options.clone())) @@ -41,7 +44,8 @@ pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result let ast = parse_executable(fixture.content, source_location).unwrap(); let ir = build(&schema, &ast.definitions).unwrap(); let program = Program::from_definitions(Arc::clone(&schema), ir); - let next_program = skip_redundant_nodes(&inline_fragments(&program)); + let next_program = + skip_redundant_nodes(&inline_fragments(&program), defer_stream_interface); next_program .operations() .map(|def| print_operation(&schema, def, printer_options.clone())) diff --git a/compiler/crates/relay-transforms/tests/skip_unreachable_nodes/mod.rs b/compiler/crates/relay-transforms/tests/skip_unreachable_nodes/mod.rs index 8c9e73a0ca8d2..84c23c75d5cce 100644 --- a/compiler/crates/relay-transforms/tests/skip_unreachable_nodes/mod.rs +++ b/compiler/crates/relay-transforms/tests/skip_unreachable_nodes/mod.rs @@ -7,8 +7,12 @@ use fixture_tests::Fixture; use graphql_test_helpers::apply_transform_for_test; +use relay_config::DeferStreamInterface; use relay_transforms::skip_unreachable_node_strict; pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result { - apply_transform_for_test(fixture, skip_unreachable_node_strict) + let defer_stream_interface = DeferStreamInterface::default(); + apply_transform_for_test(fixture, |program| { + skip_unreachable_node_strict(program, defer_stream_interface) + }) } diff --git a/compiler/crates/relay-transforms/tests/skip_unused_variables/fixtures/kitchen-sink.expected b/compiler/crates/relay-transforms/tests/skip_unused_variables/fixtures/kitchen-sink.expected index 7cbd27d973980..3b954212f932a 100644 --- a/compiler/crates/relay-transforms/tests/skip_unused_variables/fixtures/kitchen-sink.expected +++ b/compiler/crates/relay-transforms/tests/skip_unused_variables/fixtures/kitchen-sink.expected @@ -54,7 +54,7 @@ query StreamQuerry($RELAY_INCREMENTAL_DELIVERY: Boolean!) { node(id: 4) { id ... on Feedback { - actors @stream(if: $RELAY_INCREMENTAL_DELIVERY, label: "foo", initial_count: 3) { + actors @stream(if: $RELAY_INCREMENTAL_DELIVERY, label: "foo", initialCount: 3) { name } } @@ -78,7 +78,7 @@ query StreamQuerry( node(id: 4) { id ... on Feedback { - actors @stream(if: $RELAY_INCREMENTAL_DELIVERY, label: "foo", initial_count: 3) { + actors @stream(if: $RELAY_INCREMENTAL_DELIVERY, label: "foo", initialCount: 3) { name } } diff --git a/compiler/crates/relay-transforms/tests/skip_unused_variables/fixtures/kitchen-sink.graphql b/compiler/crates/relay-transforms/tests/skip_unused_variables/fixtures/kitchen-sink.graphql index 16577bd68b6dd..19ad1dec6ad0e 100644 --- a/compiler/crates/relay-transforms/tests/skip_unused_variables/fixtures/kitchen-sink.graphql +++ b/compiler/crates/relay-transforms/tests/skip_unused_variables/fixtures/kitchen-sink.graphql @@ -53,7 +53,7 @@ query StreamQuerry($RELAY_INCREMENTAL_DELIVERY: Boolean!) { node(id: 4) { id ... on Feedback { - actors @stream(if: $RELAY_INCREMENTAL_DELIVERY, label: "foo", initial_count: 3) { + actors @stream(if: $RELAY_INCREMENTAL_DELIVERY, label: "foo", initialCount: 3) { name } } diff --git a/compiler/crates/relay-transforms/tests/transform_connections/fixtures/stream-connection-no-label.expected b/compiler/crates/relay-transforms/tests/transform_connections/fixtures/stream-connection-no-label.expected index 96ceba0afdd37..fbb0c3a357e52 100644 --- a/compiler/crates/relay-transforms/tests/transform_connections/fixtures/stream-connection-no-label.expected +++ b/compiler/crates/relay-transforms/tests/transform_connections/fixtures/stream-connection-no-label.expected @@ -47,7 +47,7 @@ query NodeQuery( id ... on Story { comments(first: 10) @__clientField(key: "NodeQuery_comments", handle: "connection", filters: null, dynamicKey_UNSTABLE: null) { - edges @stream(label: "NodeQuery_comments", initial_count: 0) { + edges @stream(label: "NodeQuery_comments", initialCount: 0) { node { actor { name diff --git a/compiler/crates/relay-transforms/tests/transform_connections/fixtures/stream-connection.expected b/compiler/crates/relay-transforms/tests/transform_connections/fixtures/stream-connection.expected index e279dc6f8b7e3..e580e264ed066 100644 --- a/compiler/crates/relay-transforms/tests/transform_connections/fixtures/stream-connection.expected +++ b/compiler/crates/relay-transforms/tests/transform_connections/fixtures/stream-connection.expected @@ -51,7 +51,7 @@ query NodeQuery( id ... on Story { comments(first: 10) @__clientField(key: "NodeQuery_comments", handle: "connection", filters: null, dynamicKey_UNSTABLE: null) { - edges @stream(label: "NodeQuery_comments", initial_count: 0) { + edges @stream(label: "NodeQuery_comments", initialCount: 0) { node { actor { name diff --git a/compiler/crates/relay-transforms/tests/transform_connections/mod.rs b/compiler/crates/relay-transforms/tests/transform_connections/mod.rs index 5a5dffa040d08..169eb95210664 100644 --- a/compiler/crates/relay-transforms/tests/transform_connections/mod.rs +++ b/compiler/crates/relay-transforms/tests/transform_connections/mod.rs @@ -16,6 +16,7 @@ use graphql_test_helpers::diagnostics_to_sorted_string; use graphql_text_printer::print_fragment; use graphql_text_printer::print_operation; use graphql_text_printer::PrinterOptions; +use relay_config::DeferStreamInterface; use relay_test_schema::get_test_schema; use relay_transforms::transform_connections; use relay_transforms::validate_connections; @@ -33,11 +34,13 @@ pub async fn transform_fixture(fixture: &Fixture<'_>) -> Result let program = Program::from_definitions(Arc::clone(&schema), ir); let connection_interface = ConnectionInterface::default(); + let defer_stream_interface = DeferStreamInterface::default(); validate_connections(&program, &connection_interface) .map_err(|diagnostics| diagnostics_to_sorted_string(fixture.content, &diagnostics))?; - let next_program = transform_connections(&program, &connection_interface); + let next_program = + transform_connections(&program, &connection_interface, &defer_stream_interface); let printer_options = PrinterOptions { debug_directive_data: true, diff --git a/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-child-of-client.invalid.expected b/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-child-of-client.invalid.expected index 71e9b5d1152c7..f581b57be4a83 100644 --- a/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-child-of-client.invalid.expected +++ b/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-child-of-client.invalid.expected @@ -11,7 +11,7 @@ fragment FeedbackFragment on Feedback { id foo { bar { - users @stream(initial_count: 1, label: "StreamedActorsLabel") { + users @stream(initialCount: 1, label: "StreamedActorsLabel") { id name } @@ -36,7 +36,7 @@ type Bar { fragment-with-stream-child-of-client.invalid.graphql:13:13 12 │ bar { - 13 │ users @stream(initial_count: 1, label: "StreamedActorsLabel") { + 13 │ users @stream(initialCount: 1, label: "StreamedActorsLabel") { │ ^^^^^^^ 14 │ id diff --git a/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-child-of-client.invalid.graphql b/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-child-of-client.invalid.graphql index 49880cbacd8cc..ce5213ab3d448 100644 --- a/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-child-of-client.invalid.graphql +++ b/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-child-of-client.invalid.graphql @@ -10,7 +10,7 @@ fragment FeedbackFragment on Feedback { id foo { bar { - users @stream(initial_count: 1, label: "StreamedActorsLabel") { + users @stream(initialCount: 1, label: "StreamedActorsLabel") { id name } diff --git a/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-on-client.invalid.expected b/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-on-client.invalid.expected index 0a8232ffb6cbd..f15daf0a8c3e7 100644 --- a/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-on-client.invalid.expected +++ b/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-on-client.invalid.expected @@ -9,7 +9,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - foos @stream(initial_count: 1, label: "StreamedActorsLabel") { + foos @stream(initialCount: 1, label: "StreamedActorsLabel") { bar } } @@ -28,7 +28,7 @@ type Foo { fragment-with-stream-on-client.invalid.graphql:11:8 10 │ id - 11 │ foos @stream(initial_count: 1, label: "StreamedActorsLabel") { + 11 │ foos @stream(initialCount: 1, label: "StreamedActorsLabel") { │ ^^^^^^^ 12 │ bar @@ -36,6 +36,6 @@ type Foo { fragment-with-stream-on-client.invalid.graphql:11:3 10 │ id - 11 │ foos @stream(initial_count: 1, label: "StreamedActorsLabel") { + 11 │ foos @stream(initialCount: 1, label: "StreamedActorsLabel") { │ ^^^^ 12 │ bar diff --git a/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-on-client.invalid.graphql b/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-on-client.invalid.graphql index 045192ee83bfa..5a45d44cf6645 100644 --- a/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-on-client.invalid.graphql +++ b/compiler/crates/relay-transforms/tests/validate_server_only_directives/fixtures/fragment-with-stream-on-client.invalid.graphql @@ -8,7 +8,7 @@ query QueryWithFragmentWithStream($id: ID!) { fragment FeedbackFragment on Feedback { id - foos @stream(initial_count: 1, label: "StreamedActorsLabel") { + foos @stream(initialCount: 1, label: "StreamedActorsLabel") { bar } } diff --git a/scripts/config.tests.json b/scripts/config.tests.json index ca85391376546..e0766f58a5eb9 100644 --- a/scripts/config.tests.json +++ b/scripts/config.tests.json @@ -26,6 +26,22 @@ "OpaqueScalarType": {"name": "OpaqueScalarType", "path": "../OpaqueScalarType"} }, "jsModuleFormat": "commonjs", + "schemaConfig": { + "nonNodeIdFields": { + "allowedIdTypes": { + "IDFieldTests": "IDFieldIsID", + "NonNode": "NonNodeID" + } + }, + "deferStreamInterface": { + "deferName": "defer", + "streamName": "stream", + "ifArg": "if", + "labelArg": "label", + "initialCountArg": "initial_count", + "useCustomizedBatchArg": "use_customized_batch" + } + }, "featureFlags": { "enable_relay_resolver_transform": true, "no_inline": {