From d47f4b2f3463421f827f7a4b4fe5d43a1b945a27 Mon Sep 17 00:00:00 2001 From: Bushuo Date: Tue, 15 Jul 2025 23:24:23 +0200 Subject: [PATCH 1/4] feat: deprecate bs-deps and bs-dev-deps --- rewatch/src/build.rs | 37 +++- rewatch/src/build/compile.rs | 4 +- rewatch/src/build/deps.rs | 11 +- rewatch/src/build/packages.rs | 161 +++++++++--------- rewatch/src/config.rs | 149 ++++++++++++---- rewatch/src/helpers.rs | 10 +- rewatch/src/helpers/deserialize.rs | 9 + rewatch/src/sourcedirs.rs | 4 +- rewatch/testrepo/bsconfig.json | 8 +- rewatch/testrepo/package.json | 3 +- rewatch/testrepo/packages/dep01/bsconfig.json | 2 +- rewatch/testrepo/packages/dep02/bsconfig.json | 2 +- .../packages/deprecated-config/package.json | 9 + .../packages/deprecated-config/rescript.json | 15 ++ .../packages/deprecated-config/src/Main.mjs | 12 ++ .../packages/deprecated-config/src/Main.res | 2 + .../packages/file-casing/rescript.json | 2 +- rewatch/testrepo/packages/main/bsconfig.json | 4 +- .../packages/namespace-casing/bsconfig.json | 40 ++--- .../packages/new-namespace/bsconfig.json | 2 +- .../packages/with-dev-deps/rescript.json | 4 +- rewatch/testrepo/yarn.lock | 6 + rewatch/tests/compile.sh | 7 +- rewatch/tests/format.sh | 1 + ...-dev-dependency-used-by-non-dev-source.txt | 8 +- rewatch/tests/snapshots/dependency-cycle.txt | 8 +- rewatch/tests/snapshots/remove-file.txt | 8 +- .../rename-file-internal-dep-namespace.txt | 8 +- .../snapshots/rename-file-internal-dep.txt | 8 +- .../snapshots/rename-file-with-interface.txt | 8 +- rewatch/tests/snapshots/rename-file.txt | 8 +- .../tests/snapshots/rename-interface-file.txt | 8 +- rewatch/tests/suffix.sh | 2 +- 33 files changed, 379 insertions(+), 191 deletions(-) create mode 100644 rewatch/src/helpers/deserialize.rs create mode 100644 rewatch/testrepo/packages/deprecated-config/package.json create mode 100644 rewatch/testrepo/packages/deprecated-config/rescript.json create mode 100644 rewatch/testrepo/packages/deprecated-config/src/Main.mjs create mode 100644 rewatch/testrepo/packages/deprecated-config/src/Main.res diff --git a/rewatch/src/build.rs b/rewatch/src/build.rs index d215e18b61..b349b48a46 100644 --- a/rewatch/src/build.rs +++ b/rewatch/src/build.rs @@ -13,7 +13,7 @@ use self::parse::parser_args; use crate::build::compile::{mark_modules_with_deleted_deps_dirty, mark_modules_with_expired_deps_dirty}; use crate::helpers::emojis::*; use crate::helpers::{self, get_workspace_root}; -use crate::sourcedirs; +use crate::{config, sourcedirs}; use anyhow::{Result, anyhow}; use build_types::*; use console::style; @@ -280,7 +280,7 @@ impl fmt::Display for IncrementalBuildError { pub fn incremental_build( build_state: &mut BuildState, default_timing: Option, - _initial_build: bool, + initial_build: bool, show_progress: bool, only_incremental: bool, create_sourcedirs: bool, @@ -426,6 +426,9 @@ pub fn incremental_build( if helpers::contains_ascii_characters(&compile_warnings) { println!("{}", &compile_warnings); } + if initial_build { + log_deprecations(build_state); + } if helpers::contains_ascii_characters(&compile_errors) { println!("{}", &compile_errors); } @@ -452,10 +455,40 @@ pub fn incremental_build( if helpers::contains_ascii_characters(&compile_warnings) { println!("{}", &compile_warnings); } + if initial_build { + log_deprecations(build_state); + } + Ok(()) } } +fn log_deprecations(build_state: &BuildState) { + build_state.packages.iter().for_each(|(_, package)| { + package + .config + .get_deprecations() + .iter() + .for_each(|deprecation_warning| match deprecation_warning { + config::DeprecationWarning::BsDependencies => { + log_deprecated_config_field(&package.name, "bs-dependencies", "dependencies"); + } + config::DeprecationWarning::BsDevDependencies => { + log_deprecated_config_field(&package.name, "bs-dev-dependencies", "dev-dependencies"); + } + }); + }); +} + +fn log_deprecated_config_field(package_name: &str, field_name: &str, new_field_name: &str) { + let warning = format!( + "The field '{}' found in the package config of '{}' is deprecated and will be removed in a future version.\n\ + Use '{}' instead.", + field_name, package_name, new_field_name + ); + println!("\n{}", style(warning).yellow()); +} + // write build.ninja files in the packages after a non-incremental build // this is necessary to bust the editor tooling cache. The editor tooling // is watching this file. diff --git a/rewatch/src/build/compile.rs b/rewatch/src/build/compile.rs index 494968f48d..7f9c0cee65 100644 --- a/rewatch/src/build/compile.rs +++ b/rewatch/src/build/compile.rs @@ -504,7 +504,7 @@ fn get_dependency_paths( is_file_type_dev: bool, ) -> Vec> { let normal_deps = config - .bs_dependencies + .dependencies .clone() .unwrap_or_default() .into_iter() @@ -514,7 +514,7 @@ fn get_dependency_paths( // We can only access dev dependencies for source_files that are marked as "type":"dev" let dev_deps = if is_file_type_dev { config - .bs_dev_dependencies + .dev_dependencies .clone() .unwrap_or_default() .into_iter() diff --git a/rewatch/src/build/deps.rs b/rewatch/src/build/deps.rs index 2abf80731d..947915c385 100644 --- a/rewatch/src/build/deps.rs +++ b/rewatch/src/build/deps.rs @@ -37,18 +37,11 @@ fn get_dep_modules( // Get the list of allowed dependency packages for this package let allowed_dependencies: AHashSet = package .config - .bs_dependencies + .dependencies .as_ref() .unwrap_or(&vec![]) .iter() - .chain( - package - .config - .bs_dev_dependencies - .as_ref() - .unwrap_or(&vec![]) - .iter(), - ) + .chain(package.config.dev_dependencies.as_ref().unwrap_or(&vec![]).iter()) .cloned() .collect(); diff --git a/rewatch/src/build/packages.rs b/rewatch/src/build/packages.rs index 2b4f193766..2b6a8c1d16 100644 --- a/rewatch/src/build/packages.rs +++ b/rewatch/src/build/packages.rs @@ -243,9 +243,9 @@ pub fn read_config(package_dir: &Path) -> Result { let bsconfig_json_path = package_dir.join("bsconfig.json"); if Path::new(&rescript_json_path).exists() { - config::read(&rescript_json_path) + config::Config::new(&rescript_json_path) } else { - config::read(&bsconfig_json_path) + config::Config::new(&bsconfig_json_path) } } @@ -310,10 +310,10 @@ fn read_dependencies( show_progress: bool, build_dev_deps: bool, ) -> Vec { - let mut dependencies = parent_config.bs_dependencies.to_owned().unwrap_or_default(); + let mut dependencies = parent_config.dependencies.to_owned().unwrap_or_default(); // Concatenate dev dependencies if build_dev_deps is true - if build_dev_deps && let Some(dev_deps) = parent_config.bs_dev_dependencies.to_owned() { + if build_dev_deps && let Some(dev_deps) = parent_config.dev_dependencies.to_owned() { dependencies.extend(dev_deps); } @@ -916,9 +916,9 @@ pub fn validate_packages_dependencies(packages: &AHashMap) -> b let mut detected_unallowed_dependencies: AHashMap = AHashMap::new(); for (package_name, package) in packages { - let bs_dependencies = &package.config.bs_dependencies.to_owned().unwrap_or(vec![]); + let bs_dependencies = &package.config.dependencies.to_owned().unwrap_or(vec![]); let pinned_dependencies = &package.config.pinned_dependencies.to_owned().unwrap_or(vec![]); - let dev_dependencies = &package.config.bs_dev_dependencies.to_owned().unwrap_or(vec![]); + let dev_dependencies = &package.config.dev_dependencies.to_owned().unwrap_or(vec![]); [ ("bs-dependencies", bs_dependencies), @@ -984,39 +984,30 @@ pub fn validate_packages_dependencies(packages: &AHashMap) -> b #[cfg(test)] mod test { + use crate::config; + use super::{Namespace, Package}; - use crate::config::Source; use ahash::{AHashMap, AHashSet}; use std::path::PathBuf; - fn create_package( + pub struct CreatePackageArgs { name: String, bs_deps: Vec, pinned_deps: Vec, build_dev_deps: Vec, allowed_dependents: Option>, - ) -> Package { + } + + fn create_package(args: CreatePackageArgs) -> Package { Package { - name: name.clone(), - config: crate::config::Config { - name: name.clone(), - sources: Some(crate::config::OneOrMore::Single(Source::Shorthand(String::from( - "Source", - )))), - package_specs: None, - warnings: None, - suffix: None, - pinned_dependencies: Some(pinned_deps), - bs_dependencies: Some(bs_deps), - bs_dev_dependencies: Some(build_dev_deps), - ppx_flags: None, - bsc_flags: None, - namespace: None, - jsx: None, - gentype_config: None, - namespace_entry: None, - allowed_dependents, - }, + name: args.name.clone(), + config: config::tests::create_config(config::tests::CreateConfigArgs { + name: args.name, + bs_deps: args.bs_deps, + pinned_deps: args.pinned_deps, + build_dev_deps: args.build_dev_deps, + allowed_dependents: args.allowed_dependents, + }), source_folders: AHashSet::new(), source_files: None, namespace: Namespace::Namespace(String::from("Package1")), @@ -1033,23 +1024,23 @@ mod test { let mut packages: AHashMap = AHashMap::new(); packages.insert( String::from("Package1"), - create_package( - String::from("Package1"), - vec![String::from("Package2")], - vec![], - vec![], - None, - ), + create_package(CreatePackageArgs { + name: String::from("Package1"), + bs_deps: vec![String::from("Package2")], + pinned_deps: vec![], + build_dev_deps: vec![], + allowed_dependents: None, + }), ); packages.insert( String::from("Package2"), - create_package( - String::from("Package2"), - vec![], - vec![], - vec![], - Some(vec![String::from("Package3")]), - ), + create_package(CreatePackageArgs { + name: String::from("Package2"), + bs_deps: vec![], + pinned_deps: vec![], + build_dev_deps: vec![], + allowed_dependents: Some(vec![String::from("Package3")]), + }), ); let is_valid = super::validate_packages_dependencies(&packages); @@ -1061,23 +1052,23 @@ mod test { let mut packages: AHashMap = AHashMap::new(); packages.insert( String::from("Package1"), - create_package( - String::from("Package1"), - vec![], - vec![String::from("Package2")], - vec![], - None, - ), + create_package(CreatePackageArgs { + name: String::from("Package1"), + bs_deps: vec![], + pinned_deps: vec![String::from("Package2")], + build_dev_deps: vec![], + allowed_dependents: None, + }), ); packages.insert( String::from("Package2"), - create_package( - String::from("Package2"), - vec![], - vec![], - vec![], - Some(vec![String::from("Package3")]), - ), + create_package(CreatePackageArgs { + name: String::from("Package2"), + bs_deps: vec![], + pinned_deps: vec![], + build_dev_deps: vec![], + allowed_dependents: Some(vec![String::from("Package3")]), + }), ); let is_valid = super::validate_packages_dependencies(&packages); @@ -1089,23 +1080,23 @@ mod test { let mut packages: AHashMap = AHashMap::new(); packages.insert( String::from("Package1"), - create_package( - String::from("Package1"), - vec![], - vec![], - vec![String::from("Package2")], - None, - ), + create_package(CreatePackageArgs { + name: String::from("Package1"), + bs_deps: vec![], + pinned_deps: vec![], + build_dev_deps: vec![String::from("Package2")], + allowed_dependents: None, + }), ); packages.insert( String::from("Package2"), - create_package( - String::from("Package2"), - vec![], - vec![], - vec![], - Some(vec![String::from("Package3")]), - ), + create_package(CreatePackageArgs { + name: String::from("Package2"), + bs_deps: vec![], + pinned_deps: vec![], + build_dev_deps: vec![], + allowed_dependents: Some(vec![String::from("Package3")]), + }), ); let is_valid = super::validate_packages_dependencies(&packages); @@ -1117,23 +1108,23 @@ mod test { let mut packages: AHashMap = AHashMap::new(); packages.insert( String::from("Package1"), - create_package( - String::from("Package1"), - vec![String::from("Package2")], - vec![], - vec![], - None, - ), + create_package(CreatePackageArgs { + name: String::from("Package1"), + bs_deps: vec![String::from("Package2")], + pinned_deps: vec![], + build_dev_deps: vec![], + allowed_dependents: None, + }), ); packages.insert( String::from("Package2"), - create_package( - String::from("Package2"), - vec![], - vec![], - vec![], - Some(vec![String::from("Package1")]), - ), + create_package(CreatePackageArgs { + name: String::from("Package2"), + bs_deps: vec![], + pinned_deps: vec![], + build_dev_deps: vec![], + allowed_dependents: Some(vec![String::from("Package1")]), + }), ); let is_valid = super::validate_packages_dependencies(&packages); diff --git a/rewatch/src/config.rs b/rewatch/src/config.rs index b547ea61c4..707cdcc945 100644 --- a/rewatch/src/config.rs +++ b/rewatch/src/config.rs @@ -1,6 +1,6 @@ use crate::build::packages; use crate::helpers::deserialize::*; -use anyhow::Result; +use anyhow::{Result, bail}; use convert_case::{Case, Casing}; use serde::Deserialize; use std::fs; @@ -218,6 +218,12 @@ pub struct JsxSpecs { /// We do not care about the internal structure because the gentype config is loaded by bsc. pub type GenTypeConfig = serde_json::Value; +#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] +pub enum DeprecationWarning { + BsDependencies, + BsDevDependencies, +} + /// # bsconfig.json representation /// This is tricky, there is a lot of ambiguity. This is probably incomplete. #[derive(Deserialize, Debug, Clone, Default)] @@ -232,10 +238,19 @@ pub struct Config { pub suffix: Option, #[serde(rename = "pinned-dependencies")] pub pinned_dependencies: Option>, - #[serde(rename = "dependencies", alias = "bs-dependencies")] - pub bs_dependencies: Option>, - #[serde(rename = "bs-dev-dependencies", alias = "dev-dependencies")] - pub bs_dev_dependencies: Option>, + pub dependencies: Option>, + #[serde(rename = "dev-dependencies")] + pub dev_dependencies: Option>, + // Deprecated field: overwrites dependencies + #[serde(rename = "bs-dependencies")] + bs_dependencies: Option>, + // Deprecated field: overwrites dev_dependencies + #[serde(rename = "bs-dev-dependencies")] + bs_dev_dependencies: Option>, + // Holds all deprecation warnings for the config struct + #[serde(skip)] + deprecation_warnings: Vec, + #[serde(rename = "ppx-flags")] pub ppx_flags: Option>>, #[serde(rename = "bsc-flags", alias = "compiler-flags")] @@ -270,8 +285,8 @@ pub fn flatten_flags(flags: &Option>>) -> Vec { } } -/// Since ppx-flags could be one or more, and could be nested potentiall, this function takes the -/// flags and flattens them outright. +/// Since ppx-flags could be one or more, and could potentially be nested, this function takes the +/// flags and flattens them. pub fn flatten_ppx_flags( node_modules_dir: &Path, flags: &Option>>, @@ -326,14 +341,6 @@ pub fn flatten_ppx_flags( } } -/// Try to convert a bsconfig from a certain path to a bsconfig struct -pub fn read(path: &Path) -> Result { - let read = fs::read_to_string(path)?; - let parse = serde_json::from_str::(&read)?; - - Ok(parse) -} - fn namespace_from_package_name(package_name: &str) -> String { let len = package_name.len(); let mut buf = String::with_capacity(len); @@ -364,6 +371,21 @@ fn namespace_from_package_name(package_name: &str) -> String { } impl Config { + /// Try to convert a bsconfig from a certain path to a bsconfig struct + pub fn new(path: &Path) -> Result { + let read = fs::read_to_string(path)?; + Config::new_from_json_string(&read) + } + + /// Try to convert a bsconfig from a string to a bsconfig struct + pub fn new_from_json_string(config_str: &str) -> Result { + let mut config = serde_json::from_str::(config_str)?; + + config.handle_deprecations()?; + + Ok(config) + } + pub fn get_namespace(&self) -> packages::Namespace { let namespace_from_package = namespace_from_package_name(&self.name); match (self.namespace.as_ref(), self.namespace_entry.as_ref()) { @@ -399,6 +421,7 @@ impl Config { }, } } + pub fn get_jsx_args(&self) -> Vec { match self.jsx.to_owned() { Some(jsx) => match jsx.version { @@ -550,12 +573,72 @@ impl Config { } }) } + + pub fn get_deprecations(&self) -> &[DeprecationWarning] { + &self.deprecation_warnings + } + + fn handle_deprecations(&mut self) -> Result<()> { + if self.dependencies.is_some() && self.bs_dependencies.is_some() { + bail!("dependencies and bs-dependencies are mutually exclusive. Please use 'dependencies'."); + } + if self.dev_dependencies.is_some() && self.bs_dev_dependencies.is_some() { + bail!( + "dev-dependencies and bs-dev-dependencies are mutually exclusive. Please use 'dev-dependencies'" + ); + } + + if self.bs_dependencies.is_some() { + self.dependencies = self.bs_dependencies.take(); + self.deprecation_warnings.push(DeprecationWarning::BsDependencies); + } + if self.bs_dev_dependencies.is_some() { + self.dev_dependencies = self.bs_dev_dependencies.take(); + self.deprecation_warnings + .push(DeprecationWarning::BsDevDependencies); + } + + Ok(()) + } } #[cfg(test)] -mod tests { +pub mod tests { use super::*; + pub struct CreateConfigArgs { + pub name: String, + pub bs_deps: Vec, + pub pinned_deps: Vec, + pub build_dev_deps: Vec, + pub allowed_dependents: Option>, + } + + pub fn create_config(args: CreateConfigArgs) -> Config { + Config { + name: args.name, + sources: Some(crate::config::OneOrMore::Single(Source::Shorthand(String::from( + "Source", + )))), + package_specs: None, + warnings: None, + suffix: None, + pinned_dependencies: Some(args.pinned_deps), + dependencies: Some(args.bs_deps), + dev_dependencies: Some(args.build_dev_deps), + bs_dependencies: None, + bs_dev_dependencies: None, + ppx_flags: None, + bsc_flags: None, + namespace: None, + jsx: None, + gentype_config: None, + namespace_entry: None, + deprecation_warnings: vec![], + allowed_dependents: args.allowed_dependents, + } + } + #[test] fn test_getters() { let json = r#" @@ -751,7 +834,7 @@ mod tests { } #[test] - fn test_dependencies() { + fn test_dependencies_deprecation() { let json = r#" { "name": "testrepo", @@ -770,12 +853,13 @@ mod tests { } "#; - let config = serde_json::from_str::(json).unwrap(); - assert_eq!(config.bs_dependencies, Some(vec!["@testrepo/main".to_string()])); + let config = Config::new_from_json_string(json).expect("a valid json string"); + assert_eq!(config.dependencies, Some(vec!["@testrepo/main".to_string()])); + assert_eq!(config.get_deprecations(), [DeprecationWarning::BsDependencies]); } #[test] - fn test_dependencies_alias() { + fn test_dependencies() { let json = r#" { "name": "testrepo", @@ -794,12 +878,13 @@ mod tests { } "#; - let config = serde_json::from_str::(json).unwrap(); - assert_eq!(config.bs_dependencies, Some(vec!["@testrepo/main".to_string()])); + let config = Config::new_from_json_string(json).expect("a valid json string"); + assert_eq!(config.dependencies, Some(vec!["@testrepo/main".to_string()])); + assert_eq!(config.get_deprecations().is_empty(), true); } #[test] - fn test_dev_dependencies() { + fn test_dev_dependencies_deprecation() { let json = r#" { "name": "testrepo", @@ -818,15 +903,13 @@ mod tests { } "#; - let config = serde_json::from_str::(json).unwrap(); - assert_eq!( - config.bs_dev_dependencies, - Some(vec!["@testrepo/main".to_string()]) - ); + let config = Config::new_from_json_string(json).expect("a valid json string"); + assert_eq!(config.dev_dependencies, Some(vec!["@testrepo/main".to_string()])); + assert_eq!(config.get_deprecations(), [DeprecationWarning::BsDevDependencies]); } #[test] - fn test_dev_dependencies_alias() { + fn test_dev_dependencies() { let json = r#" { "name": "testrepo", @@ -845,11 +928,9 @@ mod tests { } "#; - let config = serde_json::from_str::(json).unwrap(); - assert_eq!( - config.bs_dev_dependencies, - Some(vec!["@testrepo/main".to_string()]) - ); + let config = Config::new_from_json_string(json).expect("a valid json string"); + assert_eq!(config.dev_dependencies, Some(vec!["@testrepo/main".to_string()])); + assert_eq!(config.get_deprecations().is_empty(), true); } fn test_find_is_type_dev(source: OneOrMore, path: &Path, expected: bool) { diff --git a/rewatch/src/helpers.rs b/rewatch/src/helpers.rs index 66632d9afb..e673135a1d 100644 --- a/rewatch/src/helpers.rs +++ b/rewatch/src/helpers.rs @@ -9,15 +9,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; pub type StdErr = String; -pub mod deserialize { - pub fn default_false() -> bool { - false - } - - pub fn default_true() -> bool { - true - } -} +pub mod deserialize; pub mod emojis { use console::Emoji; diff --git a/rewatch/src/helpers/deserialize.rs b/rewatch/src/helpers/deserialize.rs new file mode 100644 index 0000000000..16e37dab89 --- /dev/null +++ b/rewatch/src/helpers/deserialize.rs @@ -0,0 +1,9 @@ +//! Helper functions for deserializing config files + +pub fn default_false() -> bool { + false +} + +pub fn default_true() -> bool { + true +} diff --git a/rewatch/src/sourcedirs.rs b/rewatch/src/sourcedirs.rs index 46325b3842..411607759b 100644 --- a/rewatch/src/sourcedirs.rs +++ b/rewatch/src/sourcedirs.rs @@ -73,8 +73,8 @@ pub fn print(buildstate: &BuildState) { // Extract Pkgs let pkgs = [ &package.config.pinned_dependencies, - &package.config.bs_dependencies, - &package.config.bs_dev_dependencies, + &package.config.dependencies, + &package.config.dev_dependencies, ] .into_iter() .map(|dependencies| deps_to_pkgs(&buildstate.packages, dependencies)); diff --git a/rewatch/testrepo/bsconfig.json b/rewatch/testrepo/bsconfig.json index f55b950dcd..ccaaa8f683 100644 --- a/rewatch/testrepo/bsconfig.json +++ b/rewatch/testrepo/bsconfig.json @@ -22,9 +22,10 @@ "@testrepo/namespace-casing", "@testrepo/with-dev-deps", "@testrepo/compiled-by-legacy", - "@testrepo/nonexisting-dev-files" + "@testrepo/nonexisting-dev-files", + "@testrepo/deprecated-config" ], - "bs-dependencies": [ + "dependencies": [ "@testrepo/main", "@testrepo/dep01", "@testrepo/dep02", @@ -32,6 +33,7 @@ "@testrepo/namespace-casing", "@testrepo/with-dev-deps", "@testrepo/compiled-by-legacy", - "@testrepo/nonexisting-dev-files" + "@testrepo/nonexisting-dev-files", + "@testrepo/deprecated-config" ] } diff --git a/rewatch/testrepo/package.json b/rewatch/testrepo/package.json index e91c4a11b5..f2544040d1 100644 --- a/rewatch/testrepo/package.json +++ b/rewatch/testrepo/package.json @@ -10,7 +10,8 @@ "packages/namespace-casing", "packages/with-dev-deps", "packages/compiled-by-legacy", - "packages/nonexisting-dev-files" + "packages/nonexisting-dev-files", + "packages/deprecated-config" ] }, "dependencies": { diff --git a/rewatch/testrepo/packages/dep01/bsconfig.json b/rewatch/testrepo/packages/dep01/bsconfig.json index 106a46fd01..abecd75563 100644 --- a/rewatch/testrepo/packages/dep01/bsconfig.json +++ b/rewatch/testrepo/packages/dep01/bsconfig.json @@ -9,5 +9,5 @@ "in-source": true }, "suffix": ".bs.js", - "bs-dependencies": ["@testrepo/dep02"] + "dependencies": ["@testrepo/dep02"] } diff --git a/rewatch/testrepo/packages/dep02/bsconfig.json b/rewatch/testrepo/packages/dep02/bsconfig.json index 0355169956..67199231f5 100644 --- a/rewatch/testrepo/packages/dep02/bsconfig.json +++ b/rewatch/testrepo/packages/dep02/bsconfig.json @@ -9,5 +9,5 @@ "in-source": true }, "suffix": ".bs.js", - "bs-dependencies": ["@testrepo/new-namespace"] + "dependencies": ["@testrepo/new-namespace"] } diff --git a/rewatch/testrepo/packages/deprecated-config/package.json b/rewatch/testrepo/packages/deprecated-config/package.json new file mode 100644 index 0000000000..b7cd38be62 --- /dev/null +++ b/rewatch/testrepo/packages/deprecated-config/package.json @@ -0,0 +1,9 @@ +{ + "name": "@testrepo/deprecated-config", + "version": "0.0.1", + "keywords": [ + "rescript" + ], + "author": "", + "license": "MIT" +} diff --git a/rewatch/testrepo/packages/deprecated-config/rescript.json b/rewatch/testrepo/packages/deprecated-config/rescript.json new file mode 100644 index 0000000000..1c7e0630ce --- /dev/null +++ b/rewatch/testrepo/packages/deprecated-config/rescript.json @@ -0,0 +1,15 @@ +{ + "name": "@testrepo/deprecated-config", + "namespace": true, + "sources": { + "dir": "src", + "subdirs": true + }, + "package-specs": { + "module": "es6", + "in-source": true + }, + "suffix": ".mjs", + "bs-dependencies": [], + "bs-dev-dependencies": [] +} diff --git a/rewatch/testrepo/packages/deprecated-config/src/Main.mjs b/rewatch/testrepo/packages/deprecated-config/src/Main.mjs new file mode 100644 index 0000000000..c1a9a872bc --- /dev/null +++ b/rewatch/testrepo/packages/deprecated-config/src/Main.mjs @@ -0,0 +1,12 @@ +// Generated by ReScript, PLEASE EDIT WITH CARE + + +let x = 1; + +let y = 1; + +export { + x, + y, +} +/* No side effect */ diff --git a/rewatch/testrepo/packages/deprecated-config/src/Main.res b/rewatch/testrepo/packages/deprecated-config/src/Main.res new file mode 100644 index 0000000000..4220e78d3f --- /dev/null +++ b/rewatch/testrepo/packages/deprecated-config/src/Main.res @@ -0,0 +1,2 @@ +let x = 1 +let y = 1 diff --git a/rewatch/testrepo/packages/file-casing/rescript.json b/rewatch/testrepo/packages/file-casing/rescript.json index 01f353df54..941781cb67 100644 --- a/rewatch/testrepo/packages/file-casing/rescript.json +++ b/rewatch/testrepo/packages/file-casing/rescript.json @@ -13,7 +13,7 @@ } ], "suffix": ".mjs", - "bs-dependencies": [], + "dependencies": [], "bsc-flags": [], "jsx": { "version": 4 diff --git a/rewatch/testrepo/packages/main/bsconfig.json b/rewatch/testrepo/packages/main/bsconfig.json index f169104564..b26faec2af 100644 --- a/rewatch/testrepo/packages/main/bsconfig.json +++ b/rewatch/testrepo/packages/main/bsconfig.json @@ -9,7 +9,5 @@ "in-source": true }, "suffix": ".bs.js", - "bs-dependencies": [ - "@testrepo/dep01" - ] + "dependencies": ["@testrepo/dep01"] } diff --git a/rewatch/testrepo/packages/namespace-casing/bsconfig.json b/rewatch/testrepo/packages/namespace-casing/bsconfig.json index 000bbfdc47..412681015d 100644 --- a/rewatch/testrepo/packages/namespace-casing/bsconfig.json +++ b/rewatch/testrepo/packages/namespace-casing/bsconfig.json @@ -1,22 +1,22 @@ { - "name": "@testrepo/namespace-casing", - "namespace": "NamespaceCasingAPI", - "sources": [ - { - "dir": "src", - "subdirs": true - } - ], - "package-specs": [ - { - "module": "es6", - "in-source": true - } - ], - "suffix": ".mjs", - "bs-dependencies": [], - "bsc-flags": [], - "jsx": { - "version": 4 + "name": "@testrepo/namespace-casing", + "namespace": "NamespaceCasingAPI", + "sources": [ + { + "dir": "src", + "subdirs": true } -} \ No newline at end of file + ], + "package-specs": [ + { + "module": "es6", + "in-source": true + } + ], + "suffix": ".mjs", + "dependencies": [], + "bsc-flags": [], + "jsx": { + "version": 4 + } +} diff --git a/rewatch/testrepo/packages/new-namespace/bsconfig.json b/rewatch/testrepo/packages/new-namespace/bsconfig.json index 3b796b905a..9c0696b15c 100644 --- a/rewatch/testrepo/packages/new-namespace/bsconfig.json +++ b/rewatch/testrepo/packages/new-namespace/bsconfig.json @@ -10,6 +10,6 @@ "module": "es6", "in-source": true }, - "bs-dependencies": ["@testrepo/dep01"], + "dependencies": ["@testrepo/dep01"], "suffix": ".bs.js" } diff --git a/rewatch/testrepo/packages/with-dev-deps/rescript.json b/rewatch/testrepo/packages/with-dev-deps/rescript.json index 77d543741b..af67bfbaa2 100644 --- a/rewatch/testrepo/packages/with-dev-deps/rescript.json +++ b/rewatch/testrepo/packages/with-dev-deps/rescript.json @@ -9,9 +9,7 @@ "type": "dev" } ], - "bs-dev-dependencies": [ - "@rescript/webapi" - ], + "dev-dependencies": ["@rescript/webapi"], "package-specs": { "module": "es6", "in-source": true diff --git a/rewatch/testrepo/yarn.lock b/rewatch/testrepo/yarn.lock index 4bb7280e3e..7a81460a11 100644 --- a/rewatch/testrepo/yarn.lock +++ b/rewatch/testrepo/yarn.lock @@ -69,6 +69,12 @@ __metadata: languageName: unknown linkType: soft +"@testrepo/deprecated-config@workspace:packages/deprecated-config": + version: 0.0.0-use.local + resolution: "@testrepo/deprecated-config@workspace:packages/deprecated-config" + languageName: unknown + linkType: soft + "@testrepo/main@workspace:packages/main": version: 0.0.0-use.local resolution: "@testrepo/main@workspace:packages/main" diff --git a/rewatch/tests/compile.sh b/rewatch/tests/compile.sh index 31c1f9f9f7..a8fe71ea91 100755 --- a/rewatch/tests/compile.sh +++ b/rewatch/tests/compile.sh @@ -38,32 +38,29 @@ node ./packages/main/src/Main.mjs > ./packages/main/src/output.txt mv ./packages/main/src/Main.res ./packages/main/src/Main2.res rewatch build --snapshot-output &> ../tests/snapshots/rename-file.txt +normalize_paths ../tests/snapshots/rename-file.txt mv ./packages/main/src/Main2.res ./packages/main/src/Main.res # Rename a file with a dependent - this should trigger an error mv ./packages/main/src/InternalDep.res ./packages/main/src/InternalDep2.res rewatch build --snapshot-output &> ../tests/snapshots/rename-file-internal-dep.txt -# normalize paths so the snapshot is the same on all machines normalize_paths ../tests/snapshots/rename-file-internal-dep.txt mv ./packages/main/src/InternalDep2.res ./packages/main/src/InternalDep.res # Rename a file with a dependent in a namespaced package - this should trigger an error (regression) mv ./packages/new-namespace/src/Other_module.res ./packages/new-namespace/src/Other_module2.res rewatch build --snapshot-output &> ../tests/snapshots/rename-file-internal-dep-namespace.txt -# normalize paths so the snapshot is the same on all machines normalize_paths ../tests/snapshots/rename-file-internal-dep-namespace.txt mv ./packages/new-namespace/src/Other_module2.res ./packages/new-namespace/src/Other_module.res rewatch build &> /dev/null mv ./packages/main/src/ModuleWithInterface.resi ./packages/main/src/ModuleWithInterface2.resi rewatch build --snapshot-output &> ../tests/snapshots/rename-interface-file.txt -# normalize paths so the snapshot is the same on all machines normalize_paths ../tests/snapshots/rename-interface-file.txt mv ./packages/main/src/ModuleWithInterface2.resi ./packages/main/src/ModuleWithInterface.resi rewatch build &> /dev/null mv ./packages/main/src/ModuleWithInterface.res ./packages/main/src/ModuleWithInterface2.res rewatch build --snapshot-output &> ../tests/snapshots/rename-file-with-interface.txt -# normalize paths so the snapshot is the same on all machines normalize_paths ../tests/snapshots/rename-file-with-interface.txt mv ./packages/main/src/ModuleWithInterface2.res ./packages/main/src/ModuleWithInterface.res rewatch build &> /dev/null @@ -71,7 +68,6 @@ rewatch build &> /dev/null # when deleting a file that other files depend on, the compile should fail rm packages/dep02/src/Dep02.res rewatch build --snapshot-output &> ../tests/snapshots/remove-file.txt -# normalize paths so the snapshot is the same on all machines normalize_paths ../tests/snapshots/remove-file.txt git checkout -- packages/dep02/src/Dep02.res rewatch build &> /dev/null @@ -79,6 +75,7 @@ rewatch build &> /dev/null # it should show an error when we have a dependency cycle echo 'Dep01.log()' >> packages/new-namespace/src/NS_alias.res rewatch build --snapshot-output &> ../tests/snapshots/dependency-cycle.txt +normalize_paths ../tests/snapshots/dependency-cycle.txt git checkout -- packages/new-namespace/src/NS_alias.res # this should not compile because "@rescript/webapi" is part of bs-dev-dependencies diff --git a/rewatch/tests/format.sh b/rewatch/tests/format.sh index 84d328dce4..6520a33a42 100755 --- a/rewatch/tests/format.sh +++ b/rewatch/tests/format.sh @@ -12,6 +12,7 @@ then git restore . else error "Error formatting test package" + echo "Expected 4 files to be changed, got $git_diff_file_count" echo $error_output exit 1 fi diff --git a/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt b/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt index cdd55a694f..231dfdf7a8 100644 --- a/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt +++ b/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt @@ -1,7 +1,13 @@ -Cleaned 0/15 +Cleaned 0/16 Parsed 2 source files Compiled 2 modules +The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dependencies' instead. + +The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dev-dependencies' instead. + We've found a bug for you! /packages/with-dev-deps/src/FileToTest.res:2:6-11 diff --git a/rewatch/tests/snapshots/dependency-cycle.txt b/rewatch/tests/snapshots/dependency-cycle.txt index c6d7f793e8..b0bf9628a7 100644 --- a/rewatch/tests/snapshots/dependency-cycle.txt +++ b/rewatch/tests/snapshots/dependency-cycle.txt @@ -1,7 +1,13 @@ -Cleaned 0/15 +Cleaned 0/16 Parsed 1 source files Compiled 0 modules +The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dependencies' instead. + +The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dev-dependencies' instead. + Can't continue... Found a circular dependency in your code: Dep01 → Dep02 diff --git a/rewatch/tests/snapshots/remove-file.txt b/rewatch/tests/snapshots/remove-file.txt index 8d68cdd418..aa52a7fb8d 100644 --- a/rewatch/tests/snapshots/remove-file.txt +++ b/rewatch/tests/snapshots/remove-file.txt @@ -1,7 +1,13 @@ -Cleaned 1/15 +Cleaned 1/16 Parsed 0 source files Compiled 1 modules +The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dependencies' instead. + +The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dev-dependencies' instead. + We've found a bug for you! /packages/dep01/src/Dep01.res:3:9-17 diff --git a/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt b/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt index 3263c0fe88..752741f5af 100644 --- a/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt +++ b/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt @@ -1,7 +1,13 @@ -Cleaned 2/15 +Cleaned 2/16 Parsed 2 source files Compiled 3 modules +The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dependencies' instead. + +The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dev-dependencies' instead. + We've found a bug for you! /packages/new-namespace/src/NS_alias.res:2:1-16 diff --git a/rewatch/tests/snapshots/rename-file-internal-dep.txt b/rewatch/tests/snapshots/rename-file-internal-dep.txt index 829a187871..97910017d5 100644 --- a/rewatch/tests/snapshots/rename-file-internal-dep.txt +++ b/rewatch/tests/snapshots/rename-file-internal-dep.txt @@ -1,7 +1,13 @@ -Cleaned 2/15 +Cleaned 2/16 Parsed 2 source files Compiled 2 modules +The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dependencies' instead. + +The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dev-dependencies' instead. + We've found a bug for you! /packages/main/src/Main.res:4:8-24 diff --git a/rewatch/tests/snapshots/rename-file-with-interface.txt b/rewatch/tests/snapshots/rename-file-with-interface.txt index e784d71b9e..9d8975cfaa 100644 --- a/rewatch/tests/snapshots/rename-file-with-interface.txt +++ b/rewatch/tests/snapshots/rename-file-with-interface.txt @@ -1,4 +1,10 @@  No implementation file found for interface file (skipping): src/ModuleWithInterface.resi -Cleaned 2/15 +Cleaned 2/16 Parsed 1 source files Compiled 2 modules + +The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dependencies' instead. + +The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dev-dependencies' instead. diff --git a/rewatch/tests/snapshots/rename-file.txt b/rewatch/tests/snapshots/rename-file.txt index 5458530d74..89f74dabf3 100644 --- a/rewatch/tests/snapshots/rename-file.txt +++ b/rewatch/tests/snapshots/rename-file.txt @@ -1,3 +1,9 @@ -Cleaned 1/15 +Cleaned 1/16 Parsed 1 source files Compiled 1 modules + +The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dependencies' instead. + +The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dev-dependencies' instead. diff --git a/rewatch/tests/snapshots/rename-interface-file.txt b/rewatch/tests/snapshots/rename-interface-file.txt index 26d7ffe3e6..e71f86ba40 100644 --- a/rewatch/tests/snapshots/rename-interface-file.txt +++ b/rewatch/tests/snapshots/rename-interface-file.txt @@ -1,4 +1,10 @@  No implementation file found for interface file (skipping): src/ModuleWithInterface2.resi -Cleaned 1/15 +Cleaned 1/16 Parsed 1 source files Compiled 2 modules + +The field 'bs-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dependencies' instead. + +The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'dev-dependencies' instead. diff --git a/rewatch/tests/suffix.sh b/rewatch/tests/suffix.sh index 499738ab9d..51d8c9e816 100755 --- a/rewatch/tests/suffix.sh +++ b/rewatch/tests/suffix.sh @@ -31,7 +31,7 @@ fi # Count files with new extension file_count=$(find ./packages -name *.res.js | wc -l) -if [ "$file_count" -eq 26 ]; +if [ "$file_count" -eq 28 ]; then success "Found files with correct suffix" else From 289b59765ee3fe41ad17959777afd6404aa8ce91 Mon Sep 17 00:00:00 2001 From: Bushuo Date: Sat, 19 Jul 2025 10:24:16 +0200 Subject: [PATCH 2/4] feat: deprecate `bsc-flags` --- rewatch/src/build.rs | 3 +++ rewatch/src/build/compile.rs | 2 +- rewatch/src/build/parse.rs | 2 +- rewatch/src/config.rs | 27 ++++++++++++++----- .../packages/deprecated-config/rescript.json | 3 ++- .../packages/namespace-casing/bsconfig.json | 2 +- ...-dev-dependency-used-by-non-dev-source.txt | 3 +++ rewatch/tests/snapshots/dependency-cycle.txt | 3 +++ rewatch/tests/snapshots/remove-file.txt | 3 +++ .../rename-file-internal-dep-namespace.txt | 3 +++ .../snapshots/rename-file-internal-dep.txt | 3 +++ .../snapshots/rename-file-with-interface.txt | 3 +++ rewatch/tests/snapshots/rename-file.txt | 3 +++ .../tests/snapshots/rename-interface-file.txt | 3 +++ 14 files changed, 53 insertions(+), 10 deletions(-) diff --git a/rewatch/src/build.rs b/rewatch/src/build.rs index b349b48a46..e72a13b31d 100644 --- a/rewatch/src/build.rs +++ b/rewatch/src/build.rs @@ -476,6 +476,9 @@ fn log_deprecations(build_state: &BuildState) { config::DeprecationWarning::BsDevDependencies => { log_deprecated_config_field(&package.name, "bs-dev-dependencies", "dev-dependencies"); } + config::DeprecationWarning::BscFlags => { + log_deprecated_config_field(&package.name, "bsc-flags", "compiler-flags"); + } }); }); } diff --git a/rewatch/src/build/compile.rs b/rewatch/src/build/compile.rs index 7f9c0cee65..a3e78383fb 100644 --- a/rewatch/src/build/compile.rs +++ b/rewatch/src/build/compile.rs @@ -361,7 +361,7 @@ pub fn compiler_args( is_type_dev: bool, is_local_dep: bool, ) -> Vec { - let bsc_flags = config::flatten_flags(&config.bsc_flags); + let bsc_flags = config::flatten_flags(&config.compiler_flags); let dependency_paths = get_dependency_paths(config, project_root, workspace_root, packages, is_type_dev); diff --git a/rewatch/src/build/parse.rs b/rewatch/src/build/parse.rs index 696c7655bb..4298f75f71 100644 --- a/rewatch/src/build/parse.rs +++ b/rewatch/src/build/parse.rs @@ -266,7 +266,7 @@ pub fn parser_args( let jsx_module_args = root_config.get_jsx_module_args(); let jsx_mode_args = root_config.get_jsx_mode_args(); let jsx_preserve_args = root_config.get_jsx_preserve_args(); - let bsc_flags = config::flatten_flags(&config.bsc_flags); + let bsc_flags = config::flatten_flags(&config.compiler_flags); let file = PathBuf::from("..").join("..").join(file); diff --git a/rewatch/src/config.rs b/rewatch/src/config.rs index 707cdcc945..9e955104c8 100644 --- a/rewatch/src/config.rs +++ b/rewatch/src/config.rs @@ -222,6 +222,7 @@ pub type GenTypeConfig = serde_json::Value; pub enum DeprecationWarning { BsDependencies, BsDevDependencies, + BscFlags, } /// # bsconfig.json representation @@ -247,14 +248,15 @@ pub struct Config { // Deprecated field: overwrites dev_dependencies #[serde(rename = "bs-dev-dependencies")] bs_dev_dependencies: Option>, - // Holds all deprecation warnings for the config struct - #[serde(skip)] - deprecation_warnings: Vec, - #[serde(rename = "ppx-flags")] pub ppx_flags: Option>>, - #[serde(rename = "bsc-flags", alias = "compiler-flags")] - pub bsc_flags: Option>>, + + #[serde(rename = "compiler-flags")] + pub compiler_flags: Option>>, + // Deprecated field: overwrites compiler_flags + #[serde(rename = "bsc-flags")] + bsc_flags: Option>>, + pub namespace: Option, pub jsx: Option, #[serde(rename = "gentypeconfig")] @@ -265,6 +267,10 @@ pub struct Config { // this is a new feature of rewatch, and it's not part of the bsconfig.json spec #[serde(rename = "allowed-dependents")] pub allowed_dependents: Option>, + + // Holds all deprecation warnings for the config struct + #[serde(skip)] + deprecation_warnings: Vec, } /// This flattens string flags @@ -588,6 +594,10 @@ impl Config { ); } + if self.compiler_flags.is_some() && self.bsc_flags.is_some() { + bail!("compiler-flags and bsc-flags are mutually exclusive. Please use 'compiler-flags'"); + } + if self.bs_dependencies.is_some() { self.dependencies = self.bs_dependencies.take(); self.deprecation_warnings.push(DeprecationWarning::BsDependencies); @@ -597,6 +607,10 @@ impl Config { self.deprecation_warnings .push(DeprecationWarning::BsDevDependencies); } + if self.bsc_flags.is_some() { + self.compiler_flags = self.bsc_flags.take(); + self.deprecation_warnings.push(DeprecationWarning::BscFlags); + } Ok(()) } @@ -629,6 +643,7 @@ pub mod tests { bs_dependencies: None, bs_dev_dependencies: None, ppx_flags: None, + compiler_flags: None, bsc_flags: None, namespace: None, jsx: None, diff --git a/rewatch/testrepo/packages/deprecated-config/rescript.json b/rewatch/testrepo/packages/deprecated-config/rescript.json index 1c7e0630ce..4fbfa98214 100644 --- a/rewatch/testrepo/packages/deprecated-config/rescript.json +++ b/rewatch/testrepo/packages/deprecated-config/rescript.json @@ -11,5 +11,6 @@ }, "suffix": ".mjs", "bs-dependencies": [], - "bs-dev-dependencies": [] + "bs-dev-dependencies": [], + "bsc-flags": [] } diff --git a/rewatch/testrepo/packages/namespace-casing/bsconfig.json b/rewatch/testrepo/packages/namespace-casing/bsconfig.json index 412681015d..7a739a9a88 100644 --- a/rewatch/testrepo/packages/namespace-casing/bsconfig.json +++ b/rewatch/testrepo/packages/namespace-casing/bsconfig.json @@ -15,7 +15,7 @@ ], "suffix": ".mjs", "dependencies": [], - "bsc-flags": [], + "compiler-flags": [], "jsx": { "version": 4 } diff --git a/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt b/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt index 231dfdf7a8..886b5e09a4 100644 --- a/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt +++ b/rewatch/tests/snapshots/bs-dev-dependency-used-by-non-dev-source.txt @@ -8,6 +8,9 @@ Use 'dependencies' instead. The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. Use 'dev-dependencies' instead. +The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'compiler-flags' instead. + We've found a bug for you! /packages/with-dev-deps/src/FileToTest.res:2:6-11 diff --git a/rewatch/tests/snapshots/dependency-cycle.txt b/rewatch/tests/snapshots/dependency-cycle.txt index b0bf9628a7..b0463dddf6 100644 --- a/rewatch/tests/snapshots/dependency-cycle.txt +++ b/rewatch/tests/snapshots/dependency-cycle.txt @@ -8,6 +8,9 @@ Use 'dependencies' instead. The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. Use 'dev-dependencies' instead. +The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'compiler-flags' instead. + Can't continue... Found a circular dependency in your code: Dep01 → Dep02 diff --git a/rewatch/tests/snapshots/remove-file.txt b/rewatch/tests/snapshots/remove-file.txt index aa52a7fb8d..58ef8ea12b 100644 --- a/rewatch/tests/snapshots/remove-file.txt +++ b/rewatch/tests/snapshots/remove-file.txt @@ -8,6 +8,9 @@ Use 'dependencies' instead. The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. Use 'dev-dependencies' instead. +The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'compiler-flags' instead. + We've found a bug for you! /packages/dep01/src/Dep01.res:3:9-17 diff --git a/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt b/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt index 752741f5af..ff4835befa 100644 --- a/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt +++ b/rewatch/tests/snapshots/rename-file-internal-dep-namespace.txt @@ -8,6 +8,9 @@ Use 'dependencies' instead. The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. Use 'dev-dependencies' instead. +The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'compiler-flags' instead. + We've found a bug for you! /packages/new-namespace/src/NS_alias.res:2:1-16 diff --git a/rewatch/tests/snapshots/rename-file-internal-dep.txt b/rewatch/tests/snapshots/rename-file-internal-dep.txt index 97910017d5..5c76412440 100644 --- a/rewatch/tests/snapshots/rename-file-internal-dep.txt +++ b/rewatch/tests/snapshots/rename-file-internal-dep.txt @@ -8,6 +8,9 @@ Use 'dependencies' instead. The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. Use 'dev-dependencies' instead. +The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'compiler-flags' instead. + We've found a bug for you! /packages/main/src/Main.res:4:8-24 diff --git a/rewatch/tests/snapshots/rename-file-with-interface.txt b/rewatch/tests/snapshots/rename-file-with-interface.txt index 9d8975cfaa..4c2522e129 100644 --- a/rewatch/tests/snapshots/rename-file-with-interface.txt +++ b/rewatch/tests/snapshots/rename-file-with-interface.txt @@ -8,3 +8,6 @@ Use 'dependencies' instead. The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. Use 'dev-dependencies' instead. + +The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'compiler-flags' instead. diff --git a/rewatch/tests/snapshots/rename-file.txt b/rewatch/tests/snapshots/rename-file.txt index 89f74dabf3..29c1b2b461 100644 --- a/rewatch/tests/snapshots/rename-file.txt +++ b/rewatch/tests/snapshots/rename-file.txt @@ -7,3 +7,6 @@ Use 'dependencies' instead. The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. Use 'dev-dependencies' instead. + +The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'compiler-flags' instead. diff --git a/rewatch/tests/snapshots/rename-interface-file.txt b/rewatch/tests/snapshots/rename-interface-file.txt index e71f86ba40..6eabc087b8 100644 --- a/rewatch/tests/snapshots/rename-interface-file.txt +++ b/rewatch/tests/snapshots/rename-interface-file.txt @@ -8,3 +8,6 @@ Use 'dependencies' instead. The field 'bs-dev-dependencies' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. Use 'dev-dependencies' instead. + +The field 'bsc-flags' found in the package config of '@testrepo/deprecated-config' is deprecated and will be removed in a future version. +Use 'compiler-flags' instead. From 7dda4aa84f69896e4a5364f048c3f3a992a1928e Mon Sep 17 00:00:00 2001 From: Bushuo Date: Sat, 19 Jul 2025 10:30:16 +0200 Subject: [PATCH 3/4] chore: CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25244b7b5d..fb3c59682e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ # 12.0.0-beta.3 (Unreleased) +#### :nail_care: Polish + +- Configuration fields `bs-dependencies`, `bs-dev-dependencies` and `bsc-flags` are now deprecated in favor of `dependencies`, `dev-dependencies` and `compiler-flags`. https://github.com/rescript-lang/rescript/pull/7658 + # 12.0.0-beta.2 #### :boom: Breaking Change From 1770a4bc15484226270989892fde4d00f8ee7f0d Mon Sep 17 00:00:00 2001 From: Bushuo Date: Sat, 19 Jul 2025 10:43:51 +0200 Subject: [PATCH 4/4] tests: add tests for compiler-flags --- rewatch/src/config.rs | 59 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/rewatch/src/config.rs b/rewatch/src/config.rs index 9e955104c8..2c62a2c900 100644 --- a/rewatch/src/config.rs +++ b/rewatch/src/config.rs @@ -948,6 +948,65 @@ pub mod tests { assert_eq!(config.get_deprecations().is_empty(), true); } + #[test] + fn test_compiler_flags() { + let json = r#" + { + "name": "testrepo", + "sources": { + "dir": "src", + "subdirs": true + }, + "package-specs": [ + { + "module": "es6", + "in-source": true + } + ], + "suffix": ".mjs", + "compiler-flags": [ "-open ABC" ] + } + "#; + + let config = Config::new_from_json_string(json).expect("a valid json string"); + if let Some(flags) = &config.compiler_flags { + if let Some(OneOrMore::Single(flag)) = flags.get(0) { + assert_eq!(flag.as_str(), "-open ABC"); + } else { + dbg!(config.compiler_flags); + unreachable!("Expected first flag to be OneOrMore::Single"); + } + } else { + dbg!(config.compiler_flags); + unreachable!("Expected compiler flags to be Some"); + } + assert_eq!(config.get_deprecations().is_empty(), true); + } + + #[test] + fn test_compiler_flags_deprecation() { + let json = r#" + { + "name": "testrepo", + "sources": { + "dir": "src", + "subdirs": true + }, + "package-specs": [ + { + "module": "es6", + "in-source": true + } + ], + "suffix": ".mjs", + "bsc-flags": [ "-w" ] + } + "#; + + let config = Config::new_from_json_string(json).expect("a valid json string"); + assert_eq!(config.get_deprecations(), [DeprecationWarning::BscFlags]); + } + fn test_find_is_type_dev(source: OneOrMore, path: &Path, expected: bool) { let config = Config { name: String::from("testrepo"),