From c03dc1211efac60ce2f8a5c503bee87f7a87a6e9 Mon Sep 17 00:00:00 2001 From: Bushuo Date: Mon, 21 Oct 2024 22:08:18 +0200 Subject: [PATCH 1/7] feat: detect gentype config --- src/bsconfig.rs | 35 +++++++++++++++++++++++++++++++++++ src/build/packages.rs | 1 + 2 files changed, 36 insertions(+) diff --git a/src/bsconfig.rs b/src/bsconfig.rs index 3abcf406..e3cafd3b 100644 --- a/src/bsconfig.rs +++ b/src/bsconfig.rs @@ -133,6 +133,10 @@ pub struct JsxSpecs { pub v3_dependencies: Option>, } +/// Empty struct - the gentype config is loaded by bsc +#[derive(Deserialize, Debug, Clone)] +pub struct GenTypeConfig {} + /// # bsconfig.json representation /// This is tricky, there is a lot of ambiguity. This is probably incomplete. #[derive(Deserialize, Debug, Clone)] @@ -157,6 +161,8 @@ pub struct Config { pub namespace: Option, pub jsx: Option, pub uncurried: Option, + #[serde(rename = "gentypeconfig")] + pub gentype_config: Option, // this is a new feature of rewatch, and it's not part of the bsconfig.json spec #[serde(rename = "namespace-entry")] pub namespace_entry: Option, @@ -366,6 +372,13 @@ impl Config { .or(self.suffix.to_owned()) .unwrap_or(".js".to_string()) } + + pub fn get_gentype_arg(&self) -> Vec { + match &self.gentype_config { + Some(_) => vec!["-bs-gentype".to_string()], + None => vec![], + } + } } #[cfg(test)] @@ -389,4 +402,26 @@ mod tests { assert_eq!(config.get_suffix(), ".mjs"); assert_eq!(config.get_module(), "es6"); } + + #[test] + fn test_detect_gentypeconfig() { + let json = r#" + { + "name": "my-monorepo", + "sources": [ { "dir": "src/", "subdirs": true } ], + "package-specs": [ { "module": "es6", "in-source": true } ], + "suffix": ".mjs", + "pinned-dependencies": [ "@teamwalnut/app" ], + "bs-dependencies": [ "@teamwalnut/app" ], + "gentypeconfig": { + "module": "esmodule", + "generatedFileExtension": ".gen.tsx" + } + } + "#; + + let config = serde_json::from_str::(json).unwrap(); + assert_eq!(config.gentype_config.is_some(), true); + assert_eq!(config.get_gentype_arg(), vec!["-bs-gentype".to_string()]); + } } diff --git a/src/build/packages.rs b/src/build/packages.rs index b5b3ec10..ee1ea170 100644 --- a/src/build/packages.rs +++ b/src/build/packages.rs @@ -864,6 +864,7 @@ mod test { namespace: None, jsx: None, uncurried: None, + gentype_config: None, namespace_entry: None, allowed_dependents, }, From 097a7ca160bc4fc7e340c1481dddfb0c0656c52f Mon Sep 17 00:00:00 2001 From: Bushuo Date: Mon, 21 Oct 2024 22:24:47 +0200 Subject: [PATCH 2/7] feat: add gentype arg to compiler args --- src/build/compile.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/build/compile.rs b/src/build/compile.rs index ea52e6a3..4b069279 100644 --- a/src/build/compile.rs +++ b/src/build/compile.rs @@ -434,6 +434,7 @@ pub fn compiler_args( let jsx_module_args = root_config.get_jsx_module_args(); let jsx_mode_args = root_config.get_jsx_mode_args(); let uncurried_args = root_config.get_uncurried_args(version); + let gentype_arg = root_config.get_gentype_arg(); let warning_args: Vec = match config.warnings.to_owned() { None => vec![], @@ -494,6 +495,7 @@ pub fn compiler_args( read_cmi_args, vec!["-I".to_string(), ".".to_string()], deps.concat(), + gentype_arg, jsx_args, jsx_module_args, jsx_mode_args, From 18691020bc152b705529b784b72f9cb673fb931b Mon Sep 17 00:00:00 2001 From: Bushuo Date: Mon, 21 Oct 2024 22:39:18 +0200 Subject: [PATCH 3/7] refactor: make version check resiliant againt non stable versions --- src/bsconfig.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/bsconfig.rs b/src/bsconfig.rs index e3cafd3b..c4a05d19 100644 --- a/src/bsconfig.rs +++ b/src/bsconfig.rs @@ -245,7 +245,17 @@ pub fn read(path: String) -> Config { } fn check_if_rescript11_or_higher(version: &str) -> bool { - version.split('.').next().unwrap().parse::().unwrap() >= 11 + // Non stable rescript versions might contain non-numeric characters + let filter_non_number_chars = |s: &str| s.chars().filter(|c| c.is_numeric()).collect::(); + + version + .split('.') + .next() + .map(filter_non_number_chars) + .unwrap() + .parse::() + .unwrap() + >= 11 } fn namespace_from_package_name(package_name: &str) -> String { From 57b7b9089c05960553eb3ae746720bae2aba8034 Mon Sep 17 00:00:00 2001 From: Bushuo Date: Tue, 22 Oct 2024 19:37:39 +0200 Subject: [PATCH 4/7] refactor: represent gentypeconfig as an opaque json value --- src/bsconfig.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/bsconfig.rs b/src/bsconfig.rs index c4a05d19..f3d07c6d 100644 --- a/src/bsconfig.rs +++ b/src/bsconfig.rs @@ -133,9 +133,8 @@ pub struct JsxSpecs { pub v3_dependencies: Option>, } -/// Empty struct - the gentype config is loaded by bsc -#[derive(Deserialize, Debug, Clone)] -pub struct GenTypeConfig {} +/// We do not care about the internal structure because the gentype config is loaded by bsc. +pub type GenTypeConfig = serde_json::Value; /// # bsconfig.json representation /// This is tricky, there is a lot of ambiguity. This is probably incomplete. From 2a8b2a271483a5b7111cb5494b75f28a9f8b298d Mon Sep 17 00:00:00 2001 From: Bushuo Date: Tue, 22 Oct 2024 21:22:15 +0200 Subject: [PATCH 5/7] refactor: improve version check and add tests --- src/bsconfig.rs | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/bsconfig.rs b/src/bsconfig.rs index f3d07c6d..0d3434bf 100644 --- a/src/bsconfig.rs +++ b/src/bsconfig.rs @@ -244,17 +244,11 @@ pub fn read(path: String) -> Config { } fn check_if_rescript11_or_higher(version: &str) -> bool { - // Non stable rescript versions might contain non-numeric characters - let filter_non_number_chars = |s: &str| s.chars().filter(|c| c.is_numeric()).collect::(); - - version - .split('.') - .next() - .map(filter_non_number_chars) - .unwrap() - .parse::() - .unwrap() - >= 11 + if let Some(major) = version.split('.').next().and_then(|s| s.parse::().ok()) { + major >= 11 + } else { + false + } } fn namespace_from_package_name(package_name: &str) -> String { @@ -433,4 +427,23 @@ mod tests { assert_eq!(config.gentype_config.is_some(), true); assert_eq!(config.get_gentype_arg(), vec!["-bs-gentype".to_string()]); } + + #[test] + fn test_check_if_rescript11_or_higher() { + assert_eq!(check_if_rescript11_or_higher("11.0.0"), true); + assert_eq!(check_if_rescript11_or_higher("11.0.1"), true); + assert_eq!(check_if_rescript11_or_higher("11.1.0"), true); + + assert_eq!(check_if_rescript11_or_higher("12.0.0"), true); + + assert_eq!(check_if_rescript11_or_higher("10.0.0"), false); + assert_eq!(check_if_rescript11_or_higher("9.0.0"), false); + } + + #[test] + fn test_check_if_rescript11_or_higher_misc() { + assert_eq!(check_if_rescript11_or_higher("11"), true); + assert_eq!(check_if_rescript11_or_higher("*"), false); + assert_eq!(check_if_rescript11_or_higher("12.0.0-alpha.4"), true); + } } From c209a87bfc90db0721edad45b039ff5ed21494fd Mon Sep 17 00:00:00 2001 From: Bushuo Date: Tue, 22 Oct 2024 21:38:43 +0200 Subject: [PATCH 6/7] refactor: return result from check version --- src/bsconfig.rs | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/src/bsconfig.rs b/src/bsconfig.rs index 0d3434bf..aa2b59e5 100644 --- a/src/bsconfig.rs +++ b/src/bsconfig.rs @@ -243,12 +243,15 @@ pub fn read(path: String) -> Config { .expect("Errors reading bsconfig") } -fn check_if_rescript11_or_higher(version: &str) -> bool { - if let Some(major) = version.split('.').next().and_then(|s| s.parse::().ok()) { - major >= 11 - } else { - false - } +fn check_if_rescript11_or_higher(version: &str) -> Result { + version + .split('.') + .next() + .and_then(|s| s.parse::().ok()) + .map_or( + Err("Could not parse version".to_string()), + |major| Ok(major >= 11), + ) } fn namespace_from_package_name(package_name: &str) -> String { @@ -340,14 +343,17 @@ impl Config { } pub fn get_uncurried_args(&self, version: &str) -> Vec { - if check_if_rescript11_or_higher(version) { - match self.uncurried.to_owned() { + match check_if_rescript11_or_higher(version) { + Ok(true) => match self.uncurried.to_owned() { // v11 is always uncurried except iff explicitly set to false in the root rescript.json Some(false) => vec![], _ => vec!["-uncurried".to_string()], + }, + Ok(false) => vec![], + Err(_) => { + eprintln!("Could not parse version: {}", version); + vec![] } - } else { - vec![] } } @@ -430,20 +436,24 @@ mod tests { #[test] fn test_check_if_rescript11_or_higher() { - assert_eq!(check_if_rescript11_or_higher("11.0.0"), true); - assert_eq!(check_if_rescript11_or_higher("11.0.1"), true); - assert_eq!(check_if_rescript11_or_higher("11.1.0"), true); + assert_eq!(check_if_rescript11_or_higher("11.0.0"), Ok(true)); + assert_eq!(check_if_rescript11_or_higher("11.0.1"), Ok(true)); + assert_eq!(check_if_rescript11_or_higher("11.1.0"), Ok(true)); - assert_eq!(check_if_rescript11_or_higher("12.0.0"), true); + assert_eq!(check_if_rescript11_or_higher("12.0.0"), Ok(true)); - assert_eq!(check_if_rescript11_or_higher("10.0.0"), false); - assert_eq!(check_if_rescript11_or_higher("9.0.0"), false); + assert_eq!(check_if_rescript11_or_higher("10.0.0"), Ok(false)); + assert_eq!(check_if_rescript11_or_higher("9.0.0"), Ok(false)); } #[test] fn test_check_if_rescript11_or_higher_misc() { - assert_eq!(check_if_rescript11_or_higher("11"), true); - assert_eq!(check_if_rescript11_or_higher("*"), false); - assert_eq!(check_if_rescript11_or_higher("12.0.0-alpha.4"), true); + assert_eq!(check_if_rescript11_or_higher("11"), Ok(true)); + assert_eq!(check_if_rescript11_or_higher("12.0.0-alpha.4"), Ok(true)); + + match check_if_rescript11_or_higher("*") { + Ok(_) => unreachable!("Should not parse"), + Err(_) => assert!(true), + } } } From 35e9a1306ea4c8ef22430e6caff381548cc2d490 Mon Sep 17 00:00:00 2001 From: Roland Peelen Date: Wed, 23 Oct 2024 08:27:15 +0200 Subject: [PATCH 7/7] Update Error Message --- src/bsconfig.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bsconfig.rs b/src/bsconfig.rs index aa2b59e5..f5bf905a 100644 --- a/src/bsconfig.rs +++ b/src/bsconfig.rs @@ -351,7 +351,7 @@ impl Config { }, Ok(false) => vec![], Err(_) => { - eprintln!("Could not parse version: {}", version); + eprintln!("Could not establish Rescript Version number for uncurried mode. Defaulting to Rescript < 11, disabling uncurried mode. Please specify an exact version if you need > 11 and default uncurried mode. Version: {}", version); vec![] } }