diff --git a/src/bindgen.rs b/src/bindgen.rs index 898743dc1..d2bedd2b7 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,44 @@ 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<&str, failure::Error> { + if !supports_dash_dash_target(cli_path)? { + Ok(build_target_arg_legacy(target, cli_path)?) + } else { + let target_arg = match target { + Target::Nodejs => "nodejs", + Target::NoModules => "no-modules", + Target::Web => "web", + Target::Bundler => "bundler", + }; + Ok(target_arg) + } +} + +fn build_target_arg_legacy(target: Target, cli_path: &PathBuf) -> Result<&str, failure::Error> { + 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) +}