diff --git a/Cargo.lock b/Cargo.lock index cc8a2f9..eb3fba5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -274,6 +274,16 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "dialoguer" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "console 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "dirs" version = "1.0.4" @@ -658,6 +668,16 @@ dependencies = [ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand" version = "0.4.3" @@ -843,6 +863,14 @@ name = "ryu" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "same-file" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "schannel" version = "0.1.14" @@ -1041,6 +1069,18 @@ dependencies = [ "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tempfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tempfile" version = "3.0.5" @@ -1185,6 +1225,16 @@ name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "walkdir" +version = "2.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "wasm-pack" version = "0.5.1" @@ -1192,6 +1242,7 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "cargo_metadata 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "console 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dialoguer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "human-panic 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1210,6 +1261,7 @@ dependencies = [ "structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-pack-binary-install 0.1.0", "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1261,6 +1313,14 @@ name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1325,6 +1385,7 @@ dependencies = [ "checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192" "checksum curl 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "c7c9d851c825e0c033979d4516c9173bc19a78a96eb4d6ae51d4045440eafa16" "checksum curl-sys 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "721c204978be2143fab0a84b708c49d79d1f6100b8785610f456043a90708870" +"checksum dialoguer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ad1c29a0368928e78c551354dbff79f103a962ad820519724ef0d74f1c62fa9" "checksum dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "88972de891f6118092b643d85a0b28e0678e0f948d7f879aa32f2d5aafe97d2a" "checksum encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd" "checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" @@ -1371,6 +1432,7 @@ dependencies = [ "checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd" "checksum proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "77619697826f31a02ae974457af0b29b723e5619e113e9397b8b82c6bd253f09" "checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c" +"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" "checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" "checksum rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9d223d52ae411a33cf7e54ec6034ec165df296ccd23533d671a28252b6f66a" @@ -1392,6 +1454,7 @@ dependencies = [ "checksum rustc-demangle 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "01b90379b8664dd83460d59bdc5dd1fd3172b8913788db483ed1325171eab2f7" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" "checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" "checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" @@ -1417,6 +1480,7 @@ dependencies = [ "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum tar 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "a303ba60a099fcd2aaa646b14d2724591a96a75283e4b7ed3d1a1658909d9ae2" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" +"checksum tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "11ce2fe9db64b842314052e2421ac61a73ce41b898dc8e3750398b219c5fc1e0" "checksum tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7e91405c14320e5c79b3d148e1c86f40749a36e490642202a31689cb1a3452b2" "checksum term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6b677dd1e8214ea1ef4297f85dbcbed8e8cdddb561040cc998ca2551c37561" "checksum termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "adc4587ead41bf016f11af03e55a624c06568b5a19db4e90fde573d805074f83" @@ -1437,11 +1501,13 @@ dependencies = [ "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" "checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb06499a3a4d44302791052df005d5232b927ed1a9658146d842165c4de7767" "checksum xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" diff --git a/Cargo.toml b/Cargo.toml index dced6ff..dcf45e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ documentation = "https://rustwasm.github.io/wasm-pack/" atty = "0.2.11" cargo_metadata = "0.6.0" console = "0.6.1" +dialoguer = "0.3.0" failure = "0.1.2" human-panic = "1.0.1" glob = "0.2" @@ -32,6 +33,7 @@ structopt = "0.2" toml = "0.4" which = "2.0.0" wasm-pack-binary-install = { version = "0.1.0", path = "./binary-install" } +walkdir = "2" [dev-dependencies] tempfile = "3" diff --git a/src/command/build.rs b/src/command/build.rs index 075ddc2..0fbbff3 100644 --- a/src/command/build.rs +++ b/src/command/build.rs @@ -102,26 +102,43 @@ pub struct BuildOptions { #[structopt(long = "debug")] /// Deprecated. Renamed to `--dev`. - debug: bool, + pub debug: bool, #[structopt(long = "dev")] /// Create a development build. Enable debug info, and disable /// optimizations. - dev: bool, + pub dev: bool, #[structopt(long = "release")] /// Create a release build. Enable optimizations and disable debug info. - release: bool, + pub release: bool, #[structopt(long = "profiling")] /// Create a profiling build. Enable optimizations and debug info. - profiling: bool, + pub profiling: bool, #[structopt(long = "out-dir", short = "d", default_value = "pkg")] /// Sets the output directory with a relative path. pub out_dir: String, } +impl Default for BuildOptions { + fn default() -> Self { + Self { + path: None, + scope: None, + mode: BuildMode::Normal, + disable_dts: false, + target: String::new(), + debug: false, + dev: false, + release: false, + profiling: false, + out_dir: String::new(), + } + } +} + type BuildStep = fn(&mut Build, &Step, &Logger) -> Result<(), Error>; impl Build { @@ -177,15 +194,16 @@ impl Build { info!(&log, "Done in {}.", &duration); info!( &log, - "Your wasm pkg is ready to publish at {:#?}.", &self.out_dir + "Your wasm pkg is ready to publish at {}.", + self.out_dir.display() ); PBAR.message(&format!("{} Done in {}", emoji::SPARKLE, &duration)); PBAR.message(&format!( - "{} Your wasm pkg is ready to publish at {:#?}.", + "{} Your wasm pkg is ready to publish at {}.", emoji::PACKAGE, - self.out_dir.canonicalize().unwrap_or(self.out_dir.clone()) + self.out_dir.display() )); Ok(()) } diff --git a/src/command/mod.rs b/src/command/mod.rs index 0b186c0..06353ec 100644 --- a/src/command/mod.rs +++ b/src/command/mod.rs @@ -36,6 +36,10 @@ pub enum Command { #[structopt(name = "publish")] /// 🎆 pack up your npm package and publish! Publish { + #[structopt(long = "target", short = "t", default_value = "browser")] + /// Sets the target environment. [possible values: browser, nodejs, no-modules] + target: String, + /// The access level for the package to be published #[structopt(long = "access", short = "a")] access: Option, @@ -96,10 +100,14 @@ pub fn run_wasm_pack(command: Command, log: &Logger) -> result::Result<(), Error info!(&log, "Path: {:?}", &path); pack(path, &log) } - Command::Publish { path, access } => { + Command::Publish { + target, + path, + access, + } => { info!(&log, "Running publish command..."); info!(&log, "Path: {:?}", &path); - publish(path, access, &log) + publish(target, path, access, &log) } Command::Login { registry, diff --git a/src/command/publish/mod.rs b/src/command/publish/mod.rs index 8b2c564..b2c0916 100644 --- a/src/command/publish/mod.rs +++ b/src/command/publish/mod.rs @@ -2,7 +2,9 @@ pub mod access; use self::access::Access; +use command::build::{Build, BuildOptions}; use command::utils::{find_pkg_directory, set_crate_path}; +use dialoguer::{Confirmation, Input, Select}; use failure::Error; use npm; use slog::Logger; @@ -13,6 +15,7 @@ use PBAR; /// Creates a tarball from a 'pkg' directory /// and publishes it to the NPM registry pub fn publish( + _target: String, path: Option, access: Option, log: &Logger, @@ -21,14 +24,55 @@ pub fn publish( info!(&log, "Publishing the npm package..."); info!(&log, "npm info located in the npm debug log"); - let pkg_directory = find_pkg_directory(&crate_path).ok_or_else(|| { - format_err!( - "Unable to find the pkg directory at path '{:#?}', or in a child directory of '{:#?}'", - &crate_path, - &crate_path - ) - })?; + let pkg_directory = match find_pkg_directory(&crate_path) { + Some(path) => Ok(path), + None => { + // while `wasm-pack publish`, if the pkg directory cannot be found, + // then try to `wasm-pack build` + if Confirmation::new() + .with_text("Your package hasn't been built, build it?") + .interact()? + { + let out_dir = Input::new() + .with_prompt("out_dir[default: pkg]") + .default(".".to_string()) + .show_default(false) + .interact()?; + let out_dir = format!("{}/pkg", out_dir); + let target = Select::new() + .with_prompt("target[default: browser]") + .items(&["browser", "nodejs", "no-modules"]) + .default(0) + .interact()? + .to_string(); + let build_opts = BuildOptions { + path: Some(crate_path.clone()), + target, + out_dir: out_dir.clone(), + ..Default::default() + }; + Build::try_from_opts(build_opts) + .and_then(|mut build| build.run(&log)) + .map(|()| crate_path.join(out_dir)) + .map_err(|_| { + format_err!( + "Unable to find the pkg directory at path '{:#?}',\ + or in a child directory of '{:#?}'", + &crate_path, + &crate_path + ) + }) + } else { + bail!( + "Unable to find the pkg directory at path '{:#?}',\ + or in a child directory of '{:#?}'", + &crate_path, + &crate_path + ) + } + } + }?; npm::npm_publish(log, &pkg_directory.to_string_lossy(), access)?; info!(&log, "Published your package!"); diff --git a/src/command/utils.rs b/src/command/utils.rs index 5927982..f171115 100644 --- a/src/command/utils.rs +++ b/src/command/utils.rs @@ -5,6 +5,7 @@ use failure; use progressbar::Step; use std::fs; use std::path::{Path, PathBuf}; +use walkdir::WalkDir; use PBAR; /// If an explicit path is given, then use it, otherwise assume the current @@ -29,11 +30,10 @@ pub fn find_pkg_directory(path: &Path) -> Option { return Some(path.to_owned()); } - path.read_dir().ok().and_then(|entries| { - entries - .filter_map(|x| x.ok().map(|v| v.path())) - .find(|x| is_pkg_directory(&x)) - }) + WalkDir::new(path) + .into_iter() + .filter_map(|x| x.ok().map(|e| e.into_path())) + .find(|x| is_pkg_directory(&x)) } fn is_pkg_directory(path: &Path) -> bool { diff --git a/src/lib.rs b/src/lib.rs index 6daee26..901e1a3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,9 +22,11 @@ extern crate serde_json; extern crate structopt; #[macro_use] extern crate slog; +extern crate dialoguer; extern crate slog_async; extern crate slog_term; extern crate toml; +extern crate walkdir; extern crate wasm_pack_binary_install; pub mod bindgen; diff --git a/src/logger.rs b/src/logger.rs index f8f6cc4..08add5d 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -38,7 +38,11 @@ fn log_file_path(cmd: &Command) -> PathBuf { let path = match cmd { Command::Build(build_opts) => &build_opts.path, Command::Pack { path } => path, - Command::Publish { path, access: _ } => path, + Command::Publish { + target: _, + path, + access: _, + } => path, Command::Test(test_opts) => &test_opts.path, Command::Login { .. } => &None, }; diff --git a/tests/all/build.rs b/tests/all/build.rs index cc21fbb..7d06f15 100644 --- a/tests/all/build.rs +++ b/tests/all/build.rs @@ -228,3 +228,23 @@ fn build_with_and_without_wasm_bindgen_debug() { ); } } + +#[cfg(target_os = "windows")] +#[test] +fn it_format_out_dir_on_windows() { + let fixture = utils::fixture::js_hello_world(); + fixture.install_local_wasm_bindgen(); + let cli = Cli::from_iter_safe(vec![ + "wasm-pack", + "build", + &fixture.path.display().to_string(), + ]) + .unwrap(); + fixture.run(cli.cmd).unwrap(); + + let wasm_pack_log = utils::file::read_file(&fixture.path.join("wasm-pack.log")).unwrap(); + assert!( + wasm_pack_log.contains(r"Your wasm pkg is ready to publish at C:\"), + "directories in wasm-pack.log should be well formatted", + ); +}