From 1386365510126b337a1409dd2a7ff11dbe895f66 Mon Sep 17 00:00:00 2001 From: Jan Kassens Date: Thu, 30 Jul 2020 07:30:36 -0700 Subject: [PATCH] move ConnectionInterface into config file Summary: This removes the FB specifics from the OSS part of the compiler and makes it easy to configure connection names to a different format. Reviewed By: tyao1 Differential Revision: D22819909 fbshipit-source-id: a6c54a5196d9ce060e4abe0e4c077eb69798e91f --- compiler/crates/graphql-transforms/Cargo.toml | 1 + .../src/connections/connection_interface.rs | 59 ++++++++----------- .../src/connections/connection_util.rs | 28 +++------ .../graphql-transforms/src/connections/mod.rs | 4 +- compiler/crates/graphql-transforms/src/lib.rs | 1 - .../src/transform_connections.rs | 18 ++---- .../src/validations/validate_connections.rs | 24 ++++---- .../tests/refetchable_fragment/mod.rs | 4 +- .../tests/transform_connections/mod.rs | 8 ++- .../tests/validate_connections/mod.rs | 4 +- .../tests/validate_connections_schema/mod.rs | 4 +- .../relay-codegen/tests/connections/mod.rs | 8 ++- .../relay-compiler-neon/native/src/lib.rs | 5 +- .../src/build_project/apply_transforms.rs | 6 +- .../relay-compiler/src/build_project/mod.rs | 10 +++- .../crates/relay-compiler/src/compiler.rs | 1 + compiler/crates/relay-compiler/src/config.rs | 9 +++ .../tests/compile_relay_artifacts/mod.rs | 8 ++- compiler/crates/relay-lsp/src/lsp_compiler.rs | 1 + .../relay-typegen/tests/generate_flow/mod.rs | 4 +- 20 files changed, 100 insertions(+), 107 deletions(-) diff --git a/compiler/crates/graphql-transforms/Cargo.toml b/compiler/crates/graphql-transforms/Cargo.toml index 390c7601d3085..e57d754195641 100644 --- a/compiler/crates/graphql-transforms/Cargo.toml +++ b/compiler/crates/graphql-transforms/Cargo.toml @@ -110,6 +110,7 @@ indexmap = { version = "1.3", features = ["serde-1", "rayon"] } lazy_static = "1.0" parking_lot = "0.10.2" rayon = "1.2" +serde = { version = "1.0", features = ["derive", "rc"] } [dev-dependencies] fixture-tests = { path = "../fixture-tests" } diff --git a/compiler/crates/graphql-transforms/src/connections/connection_interface.rs b/compiler/crates/graphql-transforms/src/connections/connection_interface.rs index 7cc018fe70d43..9fbe1696e2a9a 100644 --- a/compiler/crates/graphql-transforms/src/connections/connection_interface.rs +++ b/compiler/crates/graphql-transforms/src/connections/connection_interface.rs @@ -7,42 +7,33 @@ use interner::{Intern, StringKey}; -use lazy_static::lazy_static; -use std::sync::Arc; +use serde::Deserialize; -#[derive(Debug)] +/// Configuration where Relay should expect some fields in the schema. +#[derive(Debug, Deserialize)] +#[serde(deny_unknown_fields, rename_all = "camelCase")] pub struct ConnectionInterface { - pub cursor_selection_name: StringKey, - pub edges_selection_name: StringKey, - pub end_cursor_selection_name: StringKey, - pub has_next_page_selection_name: StringKey, - pub has_prev_page_selection_name: StringKey, - pub node_selection_name: StringKey, - pub page_info_selection_name: StringKey, - pub start_cursor_selection_name: StringKey, + pub cursor: StringKey, + pub edges: StringKey, + pub end_cursor: StringKey, + pub has_next_page: StringKey, + pub has_previous_page: StringKey, + pub node: StringKey, + pub page_info: StringKey, + pub start_cursor: StringKey, } -lazy_static! { - pub static ref OSS_CONNECTION_INTERFACE: Arc = - Arc::new(ConnectionInterface { - cursor_selection_name: "cursor".intern(), - edges_selection_name: "edges".intern(), - end_cursor_selection_name: "endCursor".intern(), - has_next_page_selection_name: "hasNextPage".intern(), - has_prev_page_selection_name: "hasPreviousPage".intern(), - node_selection_name: "node".intern(), - page_info_selection_name: "pageInfo".intern(), - start_cursor_selection_name: "startCursor".intern(), - }); - pub static ref FB_CONNECTION_INTERFACE: Arc = - Arc::new(ConnectionInterface { - cursor_selection_name: "cursor".intern(), - edges_selection_name: "edges".intern(), - end_cursor_selection_name: "end_cursor".intern(), - has_next_page_selection_name: "has_next_page".intern(), - has_prev_page_selection_name: "has_previous_page".intern(), - node_selection_name: "node".intern(), - page_info_selection_name: "page_info".intern(), - start_cursor_selection_name: "start_cursor".intern(), - }); +impl Default for ConnectionInterface { + fn default() -> Self { + ConnectionInterface { + cursor: "cursor".intern(), + edges: "edges".intern(), + end_cursor: "endCursor".intern(), + has_next_page: "hasNextPage".intern(), + has_previous_page: "hasPreviousPage".intern(), + node: "node".intern(), + page_info: "pageInfo".intern(), + start_cursor: "startCursor".intern(), + } + } } diff --git a/compiler/crates/graphql-transforms/src/connections/connection_util.rs b/compiler/crates/graphql-transforms/src/connections/connection_util.rs index daf4910ca254e..309c8bbcffe28 100644 --- a/compiler/crates/graphql-transforms/src/connections/connection_util.rs +++ b/compiler/crates/graphql-transforms/src/connections/connection_util.rs @@ -27,13 +27,13 @@ pub fn assert_connection_selections<'s>( for (ix, selection) in selections.iter().enumerate() { if let Selection::LinkedField(field) = selection { let field_name = schema.field(field.definition.item).name; - if field_name == connection_interface.edges_selection_name { + if field_name == connection_interface.edges { if edges_selection.is_some() { unreachable!("Unexpected duplicate selection for edges") } edges_selection = Some((ix, field.as_ref())); } - if field_name == connection_interface.page_info_selection_name { + if field_name == connection_interface.page_info { if page_info_selection.is_some() { unreachable!("Unexpected duplicate selection for page_info") } @@ -268,10 +268,10 @@ pub fn build_edge_selections( connection_interface: &ConnectionInterface, ) -> Selection { let cursor_field_id = schema - .named_field(edge_type, connection_interface.cursor_selection_name) + .named_field(edge_type, connection_interface.cursor) .expect("Expected presence of cursor field to have been previously validated."); let node_field_id = schema - .named_field(edge_type, connection_interface.node_selection_name) + .named_field(edge_type, connection_interface.node) .expect("Expected presence of node field to have been previously validated."); let typename_field_id = schema.typename_field(); @@ -314,28 +314,16 @@ pub fn build_page_info_selections( connection_interface: &ConnectionInterface, ) -> Selection { let end_cursor_field_id = schema - .named_field( - page_info_type, - connection_interface.end_cursor_selection_name, - ) + .named_field(page_info_type, connection_interface.end_cursor) .expect("Expected presence of end_cursor field to have been previously validated."); let has_next_page_field_id = schema - .named_field( - page_info_type, - connection_interface.has_next_page_selection_name, - ) + .named_field(page_info_type, connection_interface.has_next_page) .expect("Expected presence of has_next_page field to have been previously validated."); let has_prev_page_field_id = schema - .named_field( - page_info_type, - connection_interface.has_prev_page_selection_name, - ) + .named_field(page_info_type, connection_interface.has_previous_page) .expect("Expected presence of has_previous_page field to have been previously validated."); let start_cursor_field_id = schema - .named_field( - page_info_type, - connection_interface.start_cursor_selection_name, - ) + .named_field(page_info_type, connection_interface.start_cursor) .expect("Expected presence of start_cursor field to have been previously validated."); if connection_metadata.direction == connection_constants.direction_forward { diff --git a/compiler/crates/graphql-transforms/src/connections/mod.rs b/compiler/crates/graphql-transforms/src/connections/mod.rs index 7120d54687a6d..fffa0902c5007 100644 --- a/compiler/crates/graphql-transforms/src/connections/mod.rs +++ b/compiler/crates/graphql-transforms/src/connections/mod.rs @@ -10,9 +10,7 @@ mod connection_interface; mod connection_util; pub use connection_constants::ConnectionConstants; -pub use connection_interface::{ - ConnectionInterface, FB_CONNECTION_INTERFACE, OSS_CONNECTION_INTERFACE, -}; +pub use connection_interface::ConnectionInterface; pub use connection_util::{ assert_connection_selections, build_connection_metadata, build_connection_metadata_as_directive, build_edge_selections, build_page_info_selections, diff --git a/compiler/crates/graphql-transforms/src/lib.rs b/compiler/crates/graphql-transforms/src/lib.rs index 5ccbbb88ee5b0..d96a1f745dc3b 100644 --- a/compiler/crates/graphql-transforms/src/lib.rs +++ b/compiler/crates/graphql-transforms/src/lib.rs @@ -64,7 +64,6 @@ pub use connections::{ extract_connection_metadata_from_directive, ConnectionConstants, ConnectionInterface, ConnectionMetadata, }; -pub use connections::{FB_CONNECTION_INTERFACE, OSS_CONNECTION_INTERFACE}; pub use dedupe_type_discriminator::dedupe_type_discriminator; pub use defer_stream::{ transform_defer_stream, DeferDirective, StreamDirective, DEFER_STREAM_CONSTANTS, diff --git a/compiler/crates/graphql-transforms/src/transform_connections.rs b/compiler/crates/graphql-transforms/src/transform_connections.rs index 338d5b9b81c5a..376d2714fadee 100644 --- a/compiler/crates/graphql-transforms/src/transform_connections.rs +++ b/compiler/crates/graphql-transforms/src/transform_connections.rs @@ -23,9 +23,9 @@ use std::sync::Arc; pub fn transform_connections( program: &Program, - connection_interface: Arc, + connection_interface: &ConnectionInterface, ) -> Program { - let mut transform = ConnectionTransform::new(program, &connection_interface); + let mut transform = ConnectionTransform::new(program, connection_interface); transform .transform_program(program) .replace_or_else(|| program.clone()) @@ -49,7 +49,7 @@ impl<'s> ConnectionTransform<'s> { connection_constants: ConnectionConstants::default(), connection_interface, current_path: None, - current_document_name: connection_interface.cursor_selection_name, // Set an arbitrary value to avoid Option + current_document_name: connection_interface.cursor, // Set an arbitrary value to avoid Option current_connection_metadata: Vec::new(), handle_field_constants, handle_field_constants_for_connection: HandleFieldConstants { @@ -82,10 +82,7 @@ impl<'s> ConnectionTransform<'s> { // Construct edges selection let edges_schema_field_id = schema - .named_field( - connection_field_type, - self.connection_interface.edges_selection_name, - ) + .named_field(connection_field_type, self.connection_interface.edges) .expect("Expected presence of edges field to have been previously validated."); let edges_schema_field = schema.field(edges_schema_field_id); let edges_field_name = edges_schema_field.name; @@ -149,10 +146,7 @@ impl<'s> ConnectionTransform<'s> { // Construct page_info selection let page_info_schema_field_id = schema - .named_field( - connection_field_type, - self.connection_interface.page_info_selection_name, - ) + .named_field(connection_field_type, self.connection_interface.page_info) .expect("Expected presence of page_info field to have been previously validated."); let page_info_schema_field = schema.field(page_info_schema_field_id); let page_info_field_name = page_info_schema_field.name; @@ -222,7 +216,7 @@ impl<'s> ConnectionTransform<'s> { "{}$defer${}${}", self.current_document_name, key.lookup(), - self.connection_interface.page_info_selection_name + self.connection_interface.page_info ) .intern(), )), diff --git a/compiler/crates/graphql-transforms/src/validations/validate_connections.rs b/compiler/crates/graphql-transforms/src/validations/validate_connections.rs index 0d9489f1827ac..ebab2186be513 100644 --- a/compiler/crates/graphql-transforms/src/validations/validate_connections.rs +++ b/compiler/crates/graphql-transforms/src/validations/validate_connections.rs @@ -97,7 +97,7 @@ impl<'s> ConnectionValidation<'s> { )]); } - let edges_selection_name = self.connection_interface.edges_selection_name; + let edges_selection_name = self.connection_interface.edges; let edges_selection: Option<&Selection> = connection_field.selections.iter().find(|sel| match sel { Selection::LinkedField(field) => { @@ -170,7 +170,7 @@ impl<'s> ConnectionValidation<'s> { let connection_directive_name = connection_directive.name.item; let connection_type_name = schema.get_type_name(connection_field_type); let connection_field_name = connection_schema_field.name; - let edges_selection_name = self.connection_interface.edges_selection_name; + let edges_selection_name = self.connection_interface.edges; // Validate edges selection let (_, edges_type) = self.validate_selection( @@ -198,8 +198,8 @@ impl<'s> ConnectionValidation<'s> { )?; let edge_type = edges_type.inner(); - let node_selection_name = self.connection_interface.node_selection_name; - let cursor_selection_name = self.connection_interface.cursor_selection_name; + let node_selection_name = self.connection_interface.node; + let cursor_selection_name = self.connection_interface.cursor; validate!( // Validate edges.node selection self.validate_selection( @@ -262,7 +262,7 @@ impl<'s> ConnectionValidation<'s> { let connection_directive_name = connection_directive.name.item; let connection_type_name = schema.get_type_name(connection_field_type); let connection_field_name = connection_schema_field.name; - let page_info_selection_name = self.connection_interface.page_info_selection_name; + let page_info_selection_name = self.connection_interface.page_info; // Validate page_info selection let (_, page_info_type) = self.validate_selection( @@ -286,10 +286,10 @@ impl<'s> ConnectionValidation<'s> { let page_info_type = page_info_type.inner(); let page_info_sub_fields = vec![ - self.connection_interface.end_cursor_selection_name, - self.connection_interface.has_next_page_selection_name, - self.connection_interface.has_prev_page_selection_name, - self.connection_interface.start_cursor_selection_name, + self.connection_interface.end_cursor, + self.connection_interface.has_next_page, + self.connection_interface.has_previous_page, + self.connection_interface.start_cursor, ]; validate_map(page_info_sub_fields.iter(), |page_info_sub_field_name| { @@ -526,7 +526,7 @@ impl<'s> ConnectionValidation<'s> { if edges_field.alias.is_some() { return Err(vec![ValidationError::new( ValidationMessage::UnsupportedAliasingInStreamConnection { - field_name: self.connection_interface.edges_selection_name, + field_name: self.connection_interface.edges, }, vec![edges_field.definition.location], )]); @@ -538,7 +538,7 @@ impl<'s> ConnectionValidation<'s> { .find_map(|sel| match sel { Selection::LinkedField(field) => { if self.program.schema.field(field.definition.item).name - == self.connection_interface.page_info_selection_name + == self.connection_interface.page_info { Some(field) } else { @@ -551,7 +551,7 @@ impl<'s> ConnectionValidation<'s> { if page_info_selection.alias.is_some() { return Err(vec![ValidationError::new( ValidationMessage::UnsupportedAliasingInStreamConnection { - field_name: self.connection_interface.page_info_selection_name, + field_name: self.connection_interface.page_info, }, vec![page_info_selection.definition.location], )]); diff --git a/compiler/crates/graphql-transforms/tests/refetchable_fragment/mod.rs b/compiler/crates/graphql-transforms/tests/refetchable_fragment/mod.rs index 9936e6fc724ed..4f291fccbe191 100644 --- a/compiler/crates/graphql-transforms/tests/refetchable_fragment/mod.rs +++ b/compiler/crates/graphql-transforms/tests/refetchable_fragment/mod.rs @@ -12,7 +12,7 @@ use graphql_ir::{build, Program}; use graphql_syntax::parse; use graphql_text_printer::{print_fragment, print_operation}; use graphql_transforms::{ - transform_connections, transform_refetchable_fragment, OSS_CONNECTION_INTERFACE, + transform_connections, transform_refetchable_fragment, ConnectionInterface, }; use std::sync::Arc; use test_schema::get_test_schema; @@ -30,7 +30,7 @@ pub fn transform_fixture(fixture: &Fixture) -> Result { Err(err) => return Err(format!("{:?}", err)), }; let program = Program::from_definitions(Arc::clone(&schema), ir); - let program = transform_connections(&program, Arc::clone(&OSS_CONNECTION_INTERFACE)); + let program = transform_connections(&program, &ConnectionInterface::default()); let base_fragments = Default::default(); let next_program = transform_refetchable_fragment(&program, &base_fragments, false).map_err(|errors| { diff --git a/compiler/crates/graphql-transforms/tests/transform_connections/mod.rs b/compiler/crates/graphql-transforms/tests/transform_connections/mod.rs index ea981f089f717..73cf40f71765a 100644 --- a/compiler/crates/graphql-transforms/tests/transform_connections/mod.rs +++ b/compiler/crates/graphql-transforms/tests/transform_connections/mod.rs @@ -11,7 +11,7 @@ use fnv::FnvHashMap; use graphql_ir::{build, Program}; use graphql_syntax::parse; use graphql_text_printer::{print_fragment, print_operation}; -use graphql_transforms::{transform_connections, validate_connections, OSS_CONNECTION_INTERFACE}; +use graphql_transforms::{transform_connections, validate_connections, ConnectionInterface}; use std::sync::Arc; use test_schema::get_test_schema; @@ -39,7 +39,9 @@ pub fn transform_fixture(fixture: &Fixture) -> Result { let program = Program::from_definitions(Arc::clone(&schema), ir); - let validation_result = validate_connections(&program, &*OSS_CONNECTION_INTERFACE); + let connection_interface = ConnectionInterface::default(); + + let validation_result = validate_connections(&program, &connection_interface); match validation_result { Ok(_) => {} Err(errors) => { @@ -52,7 +54,7 @@ pub fn transform_fixture(fixture: &Fixture) -> Result { } } - let next_program = transform_connections(&program, Arc::clone(&OSS_CONNECTION_INTERFACE)); + let next_program = transform_connections(&program, &connection_interface); let mut printed = next_program .operations() diff --git a/compiler/crates/graphql-transforms/tests/validate_connections/mod.rs b/compiler/crates/graphql-transforms/tests/validate_connections/mod.rs index e81d2d2467d49..be140af63c54d 100644 --- a/compiler/crates/graphql-transforms/tests/validate_connections/mod.rs +++ b/compiler/crates/graphql-transforms/tests/validate_connections/mod.rs @@ -10,7 +10,7 @@ use fixture_tests::Fixture; use fnv::FnvHashMap; use graphql_ir::{build, Program}; use graphql_syntax::parse; -use graphql_transforms::{validate_connections, OSS_CONNECTION_INTERFACE}; +use graphql_transforms::{validate_connections, ConnectionInterface}; use std::sync::Arc; use test_schema::TEST_SCHEMA; @@ -35,7 +35,7 @@ pub fn transform_fixture(fixture: &Fixture) -> Result { }; let program = Program::from_definitions(Arc::clone(&TEST_SCHEMA), ir); - let validation_result = validate_connections(&program, &*OSS_CONNECTION_INTERFACE); + let validation_result = validate_connections(&program, &ConnectionInterface::default()); match validation_result { Ok(_) => Ok("OK".to_owned()), diff --git a/compiler/crates/graphql-transforms/tests/validate_connections_schema/mod.rs b/compiler/crates/graphql-transforms/tests/validate_connections_schema/mod.rs index e55d91961afb2..7449338091594 100644 --- a/compiler/crates/graphql-transforms/tests/validate_connections_schema/mod.rs +++ b/compiler/crates/graphql-transforms/tests/validate_connections_schema/mod.rs @@ -10,7 +10,7 @@ use fixture_tests::Fixture; use fnv::FnvHashMap; use graphql_ir::{build, Program}; use graphql_syntax::parse; -use graphql_transforms::{validate_connections, OSS_CONNECTION_INTERFACE}; +use graphql_transforms::{validate_connections, ConnectionInterface}; use std::sync::Arc; use test_schema::get_test_schema_with_extensions; @@ -26,7 +26,7 @@ pub fn transform_fixture(fixture: &Fixture) -> Result { let ir = build(&schema, &ast.definitions).unwrap(); let program = Program::from_definitions(Arc::clone(&schema), ir); - let result = validate_connections(&program, &*OSS_CONNECTION_INTERFACE); + let result = validate_connections(&program, &ConnectionInterface::default()); match result { Ok(_) => Ok("OK".to_owned()), diff --git a/compiler/crates/relay-codegen/tests/connections/mod.rs b/compiler/crates/relay-codegen/tests/connections/mod.rs index b4b588eb3f883..9bc3baf821901 100644 --- a/compiler/crates/relay-codegen/tests/connections/mod.rs +++ b/compiler/crates/relay-codegen/tests/connections/mod.rs @@ -10,7 +10,7 @@ use fixture_tests::Fixture; use fnv::FnvHashMap; use graphql_ir::{build, FragmentDefinition, Program}; use graphql_syntax::parse; -use graphql_transforms::{transform_connections, validate_connections, OSS_CONNECTION_INTERFACE}; +use graphql_transforms::{transform_connections, validate_connections, ConnectionInterface}; use relay_codegen::{build_request_params, Printer}; use std::sync::Arc; use test_schema::get_test_schema; @@ -40,7 +40,9 @@ pub fn transform_fixture(fixture: &Fixture) -> Result { let program = Program::from_definitions(Arc::clone(&schema), ir); - let validation_result = validate_connections(&program, &*OSS_CONNECTION_INTERFACE); + let connection_interface = ConnectionInterface::default(); + + let validation_result = validate_connections(&program, &connection_interface); match validation_result { Ok(_) => {} Err(errors) => { @@ -53,7 +55,7 @@ pub fn transform_fixture(fixture: &Fixture) -> Result { } } - let next_program = transform_connections(&program, Arc::clone(&OSS_CONNECTION_INTERFACE)); + let next_program = transform_connections(&program, &connection_interface); let mut printed = next_program .operations() diff --git a/compiler/crates/relay-compiler-neon/native/src/lib.rs b/compiler/crates/relay-compiler-neon/native/src/lib.rs index ec1a8290b0fd5..827209483f04b 100644 --- a/compiler/crates/relay-compiler-neon/native/src/lib.rs +++ b/compiler/crates/relay-compiler-neon/native/src/lib.rs @@ -10,7 +10,7 @@ use graphql_ir::{build, Program}; use graphql_syntax::{ parse, Document, ExecutableDefinition, SyntaxError, SyntaxErrorKind, SyntaxResult, }; -use graphql_transforms::OSS_CONNECTION_INTERFACE; +use graphql_transforms::ConnectionInterface; use interner::Intern; use neon::prelude::*; use relay_codegen::Printer; @@ -99,6 +99,7 @@ fn create_configs() -> (Config, ProjectConfig) { sources: Default::default(), saved_state_config: None, saved_state_loader: None, + connection_interface: Default::default(), }; (config, project_config) @@ -123,7 +124,7 @@ fn compile(mut cx: FunctionContext) -> JsResult { project_config.name, Arc::new(program), Arc::new(Default::default()), - Arc::clone(&OSS_CONNECTION_INTERFACE), + &ConnectionInterface::default(), Arc::new(ConsoleLogger), ) .expect("Unable to apply transforms"); diff --git a/compiler/crates/relay-compiler/src/build_project/apply_transforms.rs b/compiler/crates/relay-compiler/src/build_project/apply_transforms.rs index 7b814710b5406..7d18af124b5ee 100644 --- a/compiler/crates/relay-compiler/src/build_project/apply_transforms.rs +++ b/compiler/crates/relay-compiler/src/build_project/apply_transforms.rs @@ -34,7 +34,7 @@ pub fn apply_transforms( project_name: StringKey, program: Arc, base_fragment_names: Arc>, - connection_interface: Arc, + connection_interface: &ConnectionInterface, perf_logger: Arc, ) -> ValidationResult where @@ -57,7 +57,7 @@ where let common_program = apply_common_transforms( project_name, Arc::clone(&program), - Arc::clone(&connection_interface), + connection_interface, Arc::clone(&base_fragment_names), Arc::clone(&perf_logger), )?; @@ -121,7 +121,7 @@ where fn apply_common_transforms( project_name: StringKey, program: Arc, - connection_interface: Arc, + connection_interface: &ConnectionInterface, base_fragment_names: Arc>, perf_logger: Arc, ) -> ValidationResult> { diff --git a/compiler/crates/relay-compiler/src/build_project/mod.rs b/compiler/crates/relay-compiler/src/build_project/mod.rs index a07ace5318495..ef626eefd415e 100644 --- a/compiler/crates/relay-compiler/src/build_project/mod.rs +++ b/compiler/crates/relay-compiler/src/build_project/mod.rs @@ -34,7 +34,6 @@ pub use generate_artifacts::{ }; use generate_extra_artifacts::generate_extra_artifacts; use graphql_ir::Program; -use graphql_transforms::FB_CONNECTION_INTERFACE; use interner::StringKey; use log::info; use persist_operations::persist_operations; @@ -44,6 +43,7 @@ use std::{collections::hash_map::Entry, sync::Arc}; pub use validate::validate; fn build_programs( + config: &Config, project_config: &ProjectConfig, compiler_state: &CompilerState, graphql_asts: &FnvHashMap, @@ -73,7 +73,7 @@ fn build_programs( // Call validation rules that go beyond type checking. log_event.time("validate_time", || { // TODO(T63482263): Pass connection interface from configuration - validate(&program, &*FB_CONNECTION_INTERFACE) + validate(&program, &config.connection_interface) .map_err(|errors| BuildProjectError::ValidationErrors { errors }) })?; @@ -83,7 +83,7 @@ fn build_programs( project_name, Arc::new(program), Arc::new(base_fragment_names), - Arc::clone(&FB_CONNECTION_INTERFACE), + &config.connection_interface, perf_logger, ) .map_err(|errors| BuildProjectError::ValidationErrors { errors }) @@ -93,6 +93,7 @@ fn build_programs( } pub fn check_project( + config: &Config, project_config: &ProjectConfig, compiler_state: &CompilerState, graphql_asts: &FnvHashMap, @@ -105,6 +106,7 @@ pub fn check_project( log_event.string("project", project_name.to_string()); let (programs, _) = build_programs( + config, project_config, compiler_state, graphql_asts, @@ -120,6 +122,7 @@ pub fn check_project( } pub fn build_project( + config: &Config, project_config: &ProjectConfig, compiler_state: &CompilerState, graphql_asts: &FnvHashMap, @@ -137,6 +140,7 @@ pub fn build_project( // Apply different transform pipelines to produce the `Programs`. let (programs, source_hashes) = build_programs( + config, project_config, compiler_state, graphql_asts, diff --git a/compiler/crates/relay-compiler/src/compiler.rs b/compiler/crates/relay-compiler/src/compiler.rs index 2d63ded549544..1c2e2cfdd095c 100644 --- a/compiler/crates/relay-compiler/src/compiler.rs +++ b/compiler/crates/relay-compiler/src/compiler.rs @@ -198,6 +198,7 @@ async fn build_projects( .filter(|project_config| compiler_state.project_has_pending_changes(project_config.name)) .map(|project_config| { build_project( + &config, project_config, compiler_state, &graphql_asts, diff --git a/compiler/crates/relay-compiler/src/config.rs b/compiler/crates/relay-compiler/src/config.rs index 3dbadc0c913ac..35158d31e93eb 100644 --- a/compiler/crates/relay-compiler/src/config.rs +++ b/compiler/crates/relay-compiler/src/config.rs @@ -12,6 +12,7 @@ use crate::build_project::generate_extra_artifacts::GenerateExtraArtifactsFn; use crate::compiler_state::{ProjectName, SourceSet}; use crate::errors::{ConfigValidationError, Error, Result}; use crate::saved_state::SavedStateLoader; +use graphql_transforms::ConnectionInterface; use rayon::prelude::*; use regex::Regex; use relay_typegen::TypegenConfig; @@ -43,6 +44,8 @@ pub struct Config { pub codegen_filepath: Option, pub full_build: bool, + pub connection_interface: ConnectionInterface, + pub saved_state_config: Option, pub saved_state_loader: Option>, } @@ -160,6 +163,7 @@ impl Config { codegen_filepath: None, saved_state_config: config_file.saved_state_config, saved_state_loader: None, + connection_interface: config_file.connection_interface, }; let mut validation_errors = Vec::new(); @@ -293,6 +297,7 @@ impl fmt::Debug for Config { codegen_filepath, saved_state_config, saved_state_loader, + connection_interface, } = self; f.debug_struct("Config") .field("root_dir", root_dir) @@ -321,6 +326,7 @@ impl fmt::Debug for Config { &"None" }, ) + .field("connection_interface", connection_interface) .finish() } } @@ -373,6 +379,9 @@ struct ConfigFile { /// Configuration of projects to compile. projects: HashMap, + #[serde(default)] + connection_interface: ConnectionInterface, + /// Watchman saved state config. saved_state_config: Option, } diff --git a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/mod.rs b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/mod.rs index 4a7a99f6785a0..1519a98046898 100644 --- a/compiler/crates/relay-compiler/tests/compile_relay_artifacts/mod.rs +++ b/compiler/crates/relay-compiler/tests/compile_relay_artifacts/mod.rs @@ -11,7 +11,7 @@ use fnv::FnvHashMap; use graphql_ir::{build, FragmentDefinition, OperationDefinition, Program, ValidationError}; use graphql_syntax::parse; use graphql_text_printer::print_full_operation; -use graphql_transforms::{MATCH_CONSTANTS, OSS_CONNECTION_INTERFACE}; +use graphql_transforms::{ConnectionInterface, MATCH_CONSTANTS}; use interner::Intern; use relay_codegen::{build_request_params, print_fragment, print_operation, print_request}; use relay_compiler::{apply_transforms, validate}; @@ -51,14 +51,16 @@ pub fn transform_fixture(fixture: &Fixture) -> Result { let ir = build(&schema, &ast.definitions).map_err(validation_errors_to_string)?; let program = Program::from_definitions(Arc::clone(&schema), ir); - validate(&program, &*OSS_CONNECTION_INTERFACE).map_err(validation_errors_to_string)?; + let connection_interface = ConnectionInterface::default(); + + validate(&program, &connection_interface).map_err(validation_errors_to_string)?; // TODO pass base fragment names let programs = apply_transforms( "test".intern(), Arc::new(program), Default::default(), - Arc::clone(&OSS_CONNECTION_INTERFACE), + &connection_interface, Arc::new(ConsoleLogger), ) .map_err(validation_errors_to_string)?; diff --git a/compiler/crates/relay-lsp/src/lsp_compiler.rs b/compiler/crates/relay-lsp/src/lsp_compiler.rs index 8876087ea9f4e..599e677f097b9 100644 --- a/compiler/crates/relay-lsp/src/lsp_compiler.rs +++ b/compiler/crates/relay-lsp/src/lsp_compiler.rs @@ -216,6 +216,7 @@ impl<'schema, 'config> LSPCompiler<'schema, 'config> { let schema = Arc::clone(self.schemas.get(&project_config.name).unwrap()); // TODO: consider running all projects in parallel let programs = check_project( + &self.config, project_config, &self.compiler_state, &graphql_asts, diff --git a/compiler/crates/relay-typegen/tests/generate_flow/mod.rs b/compiler/crates/relay-typegen/tests/generate_flow/mod.rs index ea37da913a641..ee5f4f1c5d3db 100644 --- a/compiler/crates/relay-typegen/tests/generate_flow/mod.rs +++ b/compiler/crates/relay-typegen/tests/generate_flow/mod.rs @@ -10,7 +10,7 @@ use fixture_tests::Fixture; use fnv::FnvHashMap; use graphql_ir::{build, Program}; use graphql_syntax::parse; -use graphql_transforms::OSS_CONNECTION_INTERFACE; +use graphql_transforms::ConnectionInterface; use interner::Intern; use relay_compiler::apply_transforms; use relay_typegen::{self, TypegenConfig}; @@ -36,7 +36,7 @@ pub fn transform_fixture(fixture: &Fixture) -> Result { "test".intern(), Arc::new(program), Default::default(), - Arc::clone(&OSS_CONNECTION_INTERFACE), + &ConnectionInterface::default(), Arc::new(ConsoleLogger), ) .unwrap();