diff --git a/src/bindgen.rs b/src/bindgen.rs index 898743dc..13da5904 100644 --- a/src/bindgen.rs +++ b/src/bindgen.rs @@ -41,25 +41,19 @@ pub fn wasm_bindgen_build( "--typescript" }; let bindgen_path = bindgen.binary("wasm-bindgen")?; - let target_arg = match target { - Target::Nodejs => "--nodejs", - Target::NoModules => "--no-modules", - Target::Web => { - if supports_web_target(&bindgen_path)? { - "--web" - } else { - bail!("Your current version of wasm-bindgen does not support the 'web' target. Please update your project to wasm-bindgen version >= 0.2.39.") - } - } - Target::Bundler => "--browser", - }; let mut cmd = Command::new(&bindgen_path); cmd.arg(&wasm_path) .arg("--out-dir") .arg(out_dir) - .arg(dts_arg) - .arg(target_arg); + .arg(dts_arg); + + let target_arg = build_target_arg(target, &bindgen_path)?; + if supports_dash_dash_target(&bindgen_path)? { + cmd.arg("--target").arg(target_arg); + } else { + cmd.arg(target_arg); + } if let Some(value) = out_name { cmd.arg("--out-name").arg(value); @@ -80,7 +74,7 @@ pub fn wasm_bindgen_build( Ok(()) } -/// Check if the `wasm-bindgen` dependency is locally satisfied. +/// Check if the `wasm-bindgen` dependency is locally satisfied for the web target fn supports_web_target(cli_path: &PathBuf) -> Result { let cli_version = semver::Version::parse(&install::get_cli_version( &install::Tool::WasmBindgen, @@ -89,3 +83,38 @@ fn supports_web_target(cli_path: &PathBuf) -> Result { let expected_version = semver::Version::parse("0.2.39")?; Ok(cli_version >= expected_version) } + +/// Check if the `wasm-bindgen` dependency is locally satisfied for the --target flag +fn supports_dash_dash_target(cli_path: &PathBuf) -> Result { + let cli_version = semver::Version::parse(&install::get_cli_version( + &install::Tool::WasmBindgen, + cli_path, + )?)?; + let expected_version = semver::Version::parse("0.2.40")?; + Ok(cli_version >= expected_version) +} + +fn build_target_arg(target: Target, cli_path: &PathBuf) -> Result { + if !supports_dash_dash_target(cli_path)? { + Ok(build_target_arg_legacy(target, cli_path)?) + } else { + Ok(target.to_string()) + } +} + +fn build_target_arg_legacy(target: Target, cli_path: &PathBuf) -> Result { + log::info!("Your version of wasm-bindgen is out of date. You should consider updating your Cargo.toml to a version >= 0.2.40."); + let target_arg = match target { + Target::Nodejs => "--nodejs", + Target::NoModules => "--no-modules", + Target::Web => { + if supports_web_target(&cli_path)? { + "--web" + } else { + bail!("Your current version of wasm-bindgen does not support the 'web' target. Please update your project to wasm-bindgen version >= 0.2.39.") + } + } + Target::Bundler => "--browser", + }; + Ok(target_arg.to_string()) +} diff --git a/src/command/build.rs b/src/command/build.rs index b47c545a..723f5074 100644 --- a/src/command/build.rs +++ b/src/command/build.rs @@ -14,6 +14,7 @@ use lockfile::Lockfile; use log::info; use manifest; use readme; +use std::fmt; use std::path::PathBuf; use std::str::FromStr; use std::time::Instant; @@ -61,6 +62,18 @@ impl Default for Target { } } +impl fmt::Display for Target { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let s = match self { + Target::Bundler => "bundler", + Target::Web => "web", + Target::Nodejs => "nodejs", + Target::NoModules => "no-modules", + }; + write!(f, "{}", s) + } +} + impl FromStr for Target { type Err = Error; fn from_str(s: &str) -> Result { diff --git a/tests/all/utils/fixture.rs b/tests/all/utils/fixture.rs index 1c816848..e076fc01 100644 --- a/tests/all/utils/fixture.rs +++ b/tests/all/utils/fixture.rs @@ -249,7 +249,7 @@ impl Fixture { wasm_pack::wasm_opt::find_wasm_opt(&cache, true).unwrap(); }); } - + /// Install a local cargo-generate for this fixture. /// /// Takes care not to re-install for every fixture, but only the one time