diff --git a/CHANGELOG.md b/CHANGELOG.md index fc468173db..c8924a442d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ - Fix rewatch swallowing parse warnings (%todo). https://github.com/rescript-lang/rescript/pull/8135 - Rewatch: log errors and warnings to `stderr`. https://github.com/rescript-lang/rescript/pull/8147 https://github.com/rescript-lang/rescript/pull/8148 +- Rewatch: warn about deprecated package specs `es6`/`es6-global`. https://github.com/rescript-lang/rescript/pull/8146 #### :memo: Documentation diff --git a/rewatch/src/build.rs b/rewatch/src/build.rs index 0bd5419b0f..c5eb31b092 100644 --- a/rewatch/src/build.rs +++ b/rewatch/src/build.rs @@ -428,6 +428,12 @@ fn log_config_warnings(build_state: &BuildCommandState) { config::DeprecationWarning::BscFlags => { log_deprecated_config_field(&package.name, "bsc-flags", "compiler-flags"); } + config::DeprecationWarning::PackageSpecsEs6 => { + log_deprecated_package_specs_module("es6"); + } + config::DeprecationWarning::PackageSpecsEs6Global => { + log_deprecated_package_specs_module("es6-global"); + } }, ); @@ -454,6 +460,11 @@ fn log_deprecated_config_field(package_name: &str, field_name: &str, new_field_n eprintln!("\n{}", style(warning).yellow()); } +fn log_deprecated_package_specs_module(module_name: &str) { + let warning = format!("deprecated: Option \"{module_name}\" is deprecated. Use \"esmodule\" instead."); + eprintln!("\n{}", style(warning).yellow()); +} + fn log_unsupported_config_field(package_name: &str, field_name: &str) { let warning = format!( "The field '{field_name}' found in the package config of '{package_name}' is not supported by ReScript 12's new build system." diff --git a/rewatch/src/config.rs b/rewatch/src/config.rs index 151cde100a..cca0e51a0f 100644 --- a/rewatch/src/config.rs +++ b/rewatch/src/config.rs @@ -224,6 +224,8 @@ pub enum DeprecationWarning { BsDependencies, BsDevDependencies, BscFlags, + PackageSpecsEs6, + PackageSpecsEs6Global, } #[derive(Debug, Clone, Eq, PartialEq, Hash)] @@ -746,6 +748,23 @@ impl Config { self.deprecation_warnings.push(DeprecationWarning::BscFlags); } + let (has_es6, has_es6_global) = match &self.package_specs { + None => (false, false), + Some(OneOrMore::Single(spec)) => (spec.module == "es6", spec.module == "es6-global"), + Some(OneOrMore::Multiple(specs)) => ( + specs.iter().any(|spec| spec.module == "es6"), + specs.iter().any(|spec| spec.module == "es6-global"), + ), + }; + if has_es6 { + self.deprecation_warnings + .push(DeprecationWarning::PackageSpecsEs6); + } + if has_es6_global { + self.deprecation_warnings + .push(DeprecationWarning::PackageSpecsEs6Global); + } + Ok(()) } } @@ -992,7 +1011,7 @@ pub mod tests { }, "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], @@ -1017,7 +1036,7 @@ pub mod tests { }, "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], @@ -1042,7 +1061,7 @@ pub mod tests { }, "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], @@ -1067,7 +1086,7 @@ pub mod tests { }, "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], @@ -1081,6 +1100,55 @@ pub mod tests { assert!(config.get_deprecations().is_empty()); } + #[test] + fn test_package_specs_es6_global_deprecation() { + let json = r#" + { + "name": "testrepo", + "sources": { + "dir": "src", + "subdirs": true + }, + "package-specs": [ + { + "module": "es6-global", + "in-source": true + } + ], + "suffix": ".mjs" + } + "#; + + let config = Config::new_from_json_string(json).expect("a valid json string"); + assert_eq!( + config.get_deprecations(), + [DeprecationWarning::PackageSpecsEs6Global] + ); + } + + #[test] + fn test_package_specs_es6_deprecation() { + let json = r#" + { + "name": "testrepo", + "sources": { + "dir": "src", + "subdirs": true + }, + "package-specs": [ + { + "module": "es6", + "in-source": true + } + ], + "suffix": ".mjs" + } + "#; + + let config = Config::new_from_json_string(json).expect("a valid json string"); + assert_eq!(config.get_deprecations(), [DeprecationWarning::PackageSpecsEs6]); + } + #[test] fn test_unknown_fields_are_collected() { let json = r#" @@ -1150,7 +1218,7 @@ pub mod tests { }, "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], @@ -1185,7 +1253,7 @@ pub mod tests { }, "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], diff --git a/rewatch/testrepo/packages/dep01/rescript.json b/rewatch/testrepo/packages/dep01/rescript.json index abecd75563..870e9b9fd9 100644 --- a/rewatch/testrepo/packages/dep01/rescript.json +++ b/rewatch/testrepo/packages/dep01/rescript.json @@ -5,7 +5,7 @@ "subdirs": true }, "package-specs": { - "module": "es6", + "module": "esmodule", "in-source": true }, "suffix": ".bs.js", diff --git a/rewatch/testrepo/packages/dep02/rescript.json b/rewatch/testrepo/packages/dep02/rescript.json index 67199231f5..f84064c9cf 100644 --- a/rewatch/testrepo/packages/dep02/rescript.json +++ b/rewatch/testrepo/packages/dep02/rescript.json @@ -5,7 +5,7 @@ "subdirs": true }, "package-specs": { - "module": "es6", + "module": "esmodule", "in-source": true }, "suffix": ".bs.js", diff --git a/rewatch/testrepo/packages/deprecated-config/rescript.json b/rewatch/testrepo/packages/deprecated-config/rescript.json index 8a1d772c6c..5b69e72f5c 100644 --- a/rewatch/testrepo/packages/deprecated-config/rescript.json +++ b/rewatch/testrepo/packages/deprecated-config/rescript.json @@ -6,7 +6,7 @@ "subdirs": true }, "package-specs": { - "module": "es6", + "module": "esmodule", "in-source": true }, "suffix": ".mjs", diff --git a/rewatch/testrepo/packages/file-casing-no-namespace/rescript.json b/rewatch/testrepo/packages/file-casing-no-namespace/rescript.json index d1d6797059..836f679109 100644 --- a/rewatch/testrepo/packages/file-casing-no-namespace/rescript.json +++ b/rewatch/testrepo/packages/file-casing-no-namespace/rescript.json @@ -8,7 +8,7 @@ ], "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], diff --git a/rewatch/testrepo/packages/file-casing/rescript.json b/rewatch/testrepo/packages/file-casing/rescript.json index 39a3626510..62eb32d122 100644 --- a/rewatch/testrepo/packages/file-casing/rescript.json +++ b/rewatch/testrepo/packages/file-casing/rescript.json @@ -9,7 +9,7 @@ ], "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], diff --git a/rewatch/testrepo/packages/namespace-casing/rescript.json b/rewatch/testrepo/packages/namespace-casing/rescript.json index a46ee03dcf..9526c28c58 100644 --- a/rewatch/testrepo/packages/namespace-casing/rescript.json +++ b/rewatch/testrepo/packages/namespace-casing/rescript.json @@ -9,7 +9,7 @@ ], "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], diff --git a/rewatch/testrepo/packages/new-namespace/rescript.json b/rewatch/testrepo/packages/new-namespace/rescript.json index 9c0696b15c..5eef4fdcef 100644 --- a/rewatch/testrepo/packages/new-namespace/rescript.json +++ b/rewatch/testrepo/packages/new-namespace/rescript.json @@ -7,7 +7,7 @@ "subdirs": true }, "package-specs": { - "module": "es6", + "module": "esmodule", "in-source": true }, "dependencies": ["@testrepo/dep01"], diff --git a/rewatch/testrepo/packages/standalone/rescript.json b/rewatch/testrepo/packages/standalone/rescript.json index c04ff06f22..1e660442bd 100644 --- a/rewatch/testrepo/packages/standalone/rescript.json +++ b/rewatch/testrepo/packages/standalone/rescript.json @@ -5,7 +5,7 @@ "subdirs": true }, "package-specs": { - "module": "es6", + "module": "esmodule", "in-source": true }, "suffix": ".mjs", diff --git a/rewatch/testrepo/packages/with-dev-deps/rescript.json b/rewatch/testrepo/packages/with-dev-deps/rescript.json index c440306251..331abb6025 100644 --- a/rewatch/testrepo/packages/with-dev-deps/rescript.json +++ b/rewatch/testrepo/packages/with-dev-deps/rescript.json @@ -12,7 +12,7 @@ "dependencies": ["rescript-nodejs"], "dev-dependencies": ["@rescript/webapi"], "package-specs": { - "module": "es6", + "module": "esmodule", "in-source": true }, "suffix": ".res.js" diff --git a/rewatch/testrepo/packages/with-ppx/rescript.json b/rewatch/testrepo/packages/with-ppx/rescript.json index e8b4facce3..6c884903a0 100644 --- a/rewatch/testrepo/packages/with-ppx/rescript.json +++ b/rewatch/testrepo/packages/with-ppx/rescript.json @@ -10,7 +10,7 @@ "sury" ], "package-specs": { - "module": "es6", + "module": "esmodule", "in-source": true }, "suffix": ".res.js", diff --git a/rewatch/testrepo/rescript.json b/rewatch/testrepo/rescript.json index 3141aedeb4..77e7b791ca 100644 --- a/rewatch/testrepo/rescript.json +++ b/rewatch/testrepo/rescript.json @@ -6,7 +6,7 @@ }, "package-specs": [ { - "module": "es6", + "module": "esmodule", "in-source": true } ], diff --git a/tests/build_tests/deprecated-package-specs/input.js b/tests/build_tests/deprecated-package-specs/input.js index 053f2177b8..4294fd8e1d 100644 --- a/tests/build_tests/deprecated-package-specs/input.js +++ b/tests/build_tests/deprecated-package-specs/input.js @@ -3,10 +3,13 @@ import assert from "node:assert"; import { setup } from "#dev/process"; -const { execBuildLegacy } = setup(import.meta.dirname); +const { execBuild, execClean } = setup(import.meta.dirname); + +const { stderr } = await execBuild(); -const out = await execBuildLegacy(); assert.match( - out.stderr, + stderr, /deprecated: Option "es6-global" is deprecated\. Use "esmodule" instead\./, ); + +await execClean(); diff --git a/tests/build_tests/deprecated-package-specs/src/Index.res b/tests/build_tests/deprecated-package-specs/src/Index.res index 8d0b19151f..3bfb9a1da2 100644 --- a/tests/build_tests/deprecated-package-specs/src/Index.res +++ b/tests/build_tests/deprecated-package-specs/src/Index.res @@ -1 +1 @@ -let () = Js.log("Hello, ReScript") +let () = Console.log("Hello, ReScript")