diff --git a/src/command.rs b/src/command/init.rs similarity index 53% rename from src/command.rs rename to src/command/init.rs index 5d2ea8e..c409a86 100644 --- a/src/command.rs +++ b/src/command/init.rs @@ -1,159 +1,17 @@ use bindgen; use build; +use command::utils::set_crate_path; use emoji; use error::Error; use indicatif::HumanDuration; use manifest; -use npm; use progressbar::Step; -#[allow(unused)] use readme; use slog::Logger; -use std::fs; -use std::result; use std::time::Instant; +use std::{fs, result}; use PBAR; -#[derive(Debug, StructOpt)] -pub enum Command { - #[structopt(name = "init")] - /// 🐣 initialize a package.json based on your compiled wasm! - Init { - path: Option, - - #[structopt(long = "scope", short = "s")] - scope: Option, - - #[structopt(long = "--skip-build")] - /// Do not build, only update metadata - skip_build: bool, - - #[structopt(long = "no-typescript")] - /// By default a *.d.ts file is generated for the generated JS file, but - /// this flag will disable generating this TypeScript file. - disable_dts: bool, - - #[structopt(long = "target", short = "t", default_value = "browser")] - /// Sets the target environment. [possible values: browser, nodejs] - target: String, - - #[structopt(long = "debug")] - /// Build without --release. - debug: bool, - }, - - #[structopt(name = "pack")] - /// 🍱 create a tar of your npm package but don't publish! - Pack { path: Option }, - - #[structopt(name = "publish")] - /// 🎆 pack up your npm package and publish! - Publish { path: Option }, - - #[structopt(name = "login", alias = "adduser", alias = "add-user")] - /// 👤 Add a registry user account! (aliases: adduser, add-user) - Login { - #[structopt(long = "registry", short = "r")] - /// Default: 'https://registry.npmjs.org/'. - /// The base URL of the npm package registry. If scope is also - /// specified, this registry will only be used for packages with that - /// scope. scope defaults to the scope of the project directory you're - /// currently in, if any. - registry: Option, - - #[structopt(long = "scope", short = "s")] - /// Default: none. - /// If specified, the user and login credentials given will be - /// associated with the specified scope. - scope: Option, - - #[structopt(long = "always-auth", short = "a")] - /// If specified, save configuration indicating that all requests to the - /// given registry should include authorization information. Useful for - /// private registries. Can be used with --registry and / or --scope - always_auth: bool, - - #[structopt(long = "auth-type", short = "t")] - /// Default: 'legacy'. - /// Type: 'legacy', 'sso', 'saml', 'oauth'. - /// What authentication strategy to use with adduser/login. Some npm - /// registries (for example, npmE) might support alternative auth - /// strategies besides classic username/password entry in legacy npm. - auth_type: Option, - }, -} - -pub fn run_wasm_pack(command: Command, log: &Logger) -> result::Result<(), Error> { - // Run the correct command based off input and store the result of it so that we can clear - // the progress bar then return it - let status = match command { - Command::Init { - path, - scope, - skip_build, - disable_dts, - target, - debug, - } => { - info!(&log, "Running init command..."); - info!( - &log, - "Path: {:?}, Scope: {:?}, Skip build: {}, Disable Dts: {}, Target: {}, Debug: {}", - &path, - &scope, - &skip_build, - &disable_dts, - &target, - debug - ); - let mode = if skip_build { - InitMode::Nobuild - } else { - InitMode::Normal - }; - Init::new(path, scope, disable_dts, target, debug).process(&log, mode) - } - Command::Pack { path } => { - info!(&log, "Running pack command..."); - info!(&log, "Path: {:?}", &path); - pack(path, &log) - } - Command::Publish { path } => { - info!(&log, "Running publish command..."); - info!(&log, "Path: {:?}", &path); - publish(path, &log) - } - Command::Login { - registry, - scope, - always_auth, - auth_type, - } => { - info!(&log, "Running login command..."); - info!( - &log, - "Registry: {:?}, Scope: {:?}, Always Auth: {}, Auth Type: {:?}", - ®istry, - &scope, - &always_auth, - &auth_type - ); - login(registry, scope, always_auth, auth_type, &log) - } - }; - - match status { - Ok(_) => {} - Err(ref e) => { - error!(&log, "{}", e); - PBAR.error(e.error_type())?; - } - } - - // Return the actual status of the program to the main function - status -} - // quicli::prelude::* imports a different result struct which gets // precedence over the std::result::Result, so have had to specify // the correct type here. @@ -165,12 +23,12 @@ pub fn create_pkg_dir(path: &str, step: &Step) -> result::Result<(), Error> { Ok(()) } -enum InitMode { +pub enum InitMode { Normal, Nobuild, } -struct Init { +pub struct Init { crate_path: String, scope: Option, disable_dts: bool, @@ -222,11 +80,7 @@ impl Init { step_install_wasm_bindgen, step_running_wasm_bindgen, ], - InitMode::Nobuild => steps![ - step_create_dir, - step_create_json, - step_copy_readme, - ], + InitMode::Nobuild => steps![step_create_dir, step_create_json, step_copy_readme,], } } @@ -385,67 +239,6 @@ impl Init { } } -fn pack(path: Option, log: &Logger) -> result::Result<(), Error> { - let crate_path = set_crate_path(path); - - info!(&log, "Packing up the npm package..."); - npm::npm_pack(&crate_path)?; - #[cfg(not(target_os = "windows"))] - info!(&log, "Your package is located at {}/pkg", &crate_path); - #[cfg(target_os = "windows")] - info!(&log, "Your package is located at {}\\pkg", &crate_path); - - PBAR.message("🎒 packed up your package!")?; - Ok(()) -} - -fn publish(path: Option, log: &Logger) -> result::Result<(), Error> { - let crate_path = set_crate_path(path); - - info!(&log, "Publishing the npm package..."); - info!(&log, "npm info located in the npm debug log"); - npm::npm_publish(&crate_path)?; - info!(&log, "Published your package!"); - - PBAR.message("💥 published your package!")?; - Ok(()) -} - -fn login( - registry: Option, - scope: Option, - always_auth: bool, - auth_type: Option, - log: &Logger, -) -> result::Result<(), Error> { - let registry = registry.unwrap_or(npm::DEFAULT_NPM_REGISTRY.to_string()); - - info!(&log, "Logging in to npm..."); - info!( - &log, - "Scope: {:?} Registry: {}, Always Auth: {}, Auth Type: {:?}.", - &scope, - ®istry, - always_auth, - &auth_type - ); - info!(&log, "npm info located in the npm debug log"); - npm::npm_login(®istry, &scope, always_auth, &auth_type)?; - info!(&log, "Logged you in!"); - - PBAR.message(&format!("👋 logged you in!"))?; - Ok(()) -} - -fn set_crate_path(path: Option) -> String { - let crate_path = match path { - Some(p) => p, - None => ".".to_string(), - }; - - crate_path -} - #[cfg(test)] mod test { use super::*; @@ -479,11 +272,7 @@ mod test { .collect(); assert_eq!( steps, - [ - "step_create_dir", - "step_create_json", - "step_copy_readme" - ] + ["step_create_dir", "step_create_json", "step_copy_readme"] ); } } diff --git a/src/command/login.rs b/src/command/login.rs new file mode 100644 index 0000000..f28e1ec --- /dev/null +++ b/src/command/login.rs @@ -0,0 +1,31 @@ +use error::Error; +use npm; +use slog::Logger; +use std::result; +use PBAR; + +pub fn login( + registry: Option, + scope: Option, + always_auth: bool, + auth_type: Option, + log: &Logger, +) -> result::Result<(), Error> { + let registry = registry.unwrap_or(npm::DEFAULT_NPM_REGISTRY.to_string()); + + info!(&log, "Logging in to npm..."); + info!( + &log, + "Scope: {:?} Registry: {}, Always Auth: {}, Auth Type: {:?}.", + &scope, + ®istry, + always_auth, + &auth_type + ); + info!(&log, "npm info located in the npm debug log"); + npm::npm_login(®istry, &scope, always_auth, &auth_type)?; + info!(&log, "Logged you in!"); + + PBAR.message(&format!("👋 logged you in!"))?; + Ok(()) +} diff --git a/src/command/mod.rs b/src/command/mod.rs new file mode 100644 index 0000000..18da885 --- /dev/null +++ b/src/command/mod.rs @@ -0,0 +1,154 @@ +pub mod init; +mod login; +mod pack; +mod publish; +pub mod utils; + +use self::init::{Init, InitMode}; +use self::login::login; +use self::pack::pack; +use self::publish::publish; +use error::Error; +use slog::Logger; +use std::result; +use PBAR; + +#[derive(Debug, StructOpt)] +pub enum Command { + #[structopt(name = "init")] + /// 🐣 initialize a package.json based on your compiled wasm! + Init { + path: Option, + + #[structopt(long = "scope", short = "s")] + scope: Option, + + #[structopt(long = "--skip-build")] + /// Do not build, only update metadata + skip_build: bool, + + #[structopt(long = "no-typescript")] + /// By default a *.d.ts file is generated for the generated JS file, but + /// this flag will disable generating this TypeScript file. + disable_dts: bool, + + #[structopt(long = "target", short = "t", default_value = "browser")] + /// Sets the target environment. [possible values: browser, nodejs] + target: String, + + #[structopt(long = "debug")] + /// Build without --release. + debug: bool, + }, + + #[structopt(name = "pack")] + /// 🍱 create a tar of your npm package but don't publish! + Pack { path: Option }, + + #[structopt(name = "publish")] + /// 🎆 pack up your npm package and publish! + Publish { path: Option }, + + #[structopt(name = "login", alias = "adduser", alias = "add-user")] + /// 👤 Add a registry user account! (aliases: adduser, add-user) + Login { + #[structopt(long = "registry", short = "r")] + /// Default: 'https://registry.npmjs.org/'. + /// The base URL of the npm package registry. If scope is also + /// specified, this registry will only be used for packages with that + /// scope. scope defaults to the scope of the project directory you're + /// currently in, if any. + registry: Option, + + #[structopt(long = "scope", short = "s")] + /// Default: none. + /// If specified, the user and login credentials given will be + /// associated with the specified scope. + scope: Option, + + #[structopt(long = "always-auth", short = "a")] + /// If specified, save configuration indicating that all requests to the + /// given registry should include authorization information. Useful for + /// private registries. Can be used with --registry and / or --scope + always_auth: bool, + + #[structopt(long = "auth-type", short = "t")] + /// Default: 'legacy'. + /// Type: 'legacy', 'sso', 'saml', 'oauth'. + /// What authentication strategy to use with adduser/login. Some npm + /// registries (for example, npmE) might support alternative auth + /// strategies besides classic username/password entry in legacy npm. + auth_type: Option, + }, +} + +pub fn run_wasm_pack(command: Command, log: &Logger) -> result::Result<(), Error> { + // Run the correct command based off input and store the result of it so that we can clear + // the progress bar then return it + let status = match command { + Command::Init { + path, + scope, + skip_build, + disable_dts, + target, + debug, + } => { + info!(&log, "Running init command..."); + info!( + &log, + "Path: {:?}, Scope: {:?}, Skip build: {}, Disable Dts: {}, Target: {}, Debug: {}", + &path, + &scope, + &skip_build, + &disable_dts, + &target, + debug + ); + let mode = if skip_build { + InitMode::Nobuild + } else { + InitMode::Normal + }; + Init::new(path, scope, disable_dts, target, debug).process(&log, mode) + } + Command::Pack { path } => { + info!(&log, "Running pack command..."); + info!(&log, "Path: {:?}", &path); + pack(path, &log) + } + Command::Publish { path } => { + info!(&log, "Running publish command..."); + info!(&log, "Path: {:?}", &path); + publish(path, &log) + } + Command::Login { + registry, + scope, + always_auth, + auth_type, + } => { + info!(&log, "Running login command..."); + info!( + &log, + "Registry: {:?}, Scope: {:?}, Always Auth: {}, Auth Type: {:?}", + ®istry, + &scope, + &always_auth, + &auth_type + ); + login(registry, scope, always_auth, auth_type, &log) + } + }; + + match status { + Ok(_) => {} + Err(ref e) => { + error!(&log, "{}", e); + PBAR.error(e.error_type())?; + } + } + + // Return the actual status of the program to the main function + status +} diff --git a/src/command/pack.rs b/src/command/pack.rs new file mode 100644 index 0000000..0c8c989 --- /dev/null +++ b/src/command/pack.rs @@ -0,0 +1,20 @@ +use command::utils::set_crate_path; +use error::Error; +use npm; +use slog::Logger; +use std::result; +use PBAR; + +pub fn pack(path: Option, log: &Logger) -> result::Result<(), Error> { + let crate_path = set_crate_path(path); + + info!(&log, "Packing up the npm package..."); + npm::npm_pack(&crate_path)?; + #[cfg(not(target_os = "windows"))] + info!(&log, "Your package is located at {}/pkg", &crate_path); + #[cfg(target_os = "windows")] + info!(&log, "Your package is located at {}\\pkg", &crate_path); + + PBAR.message("🎒 packed up your package!")?; + Ok(()) +} diff --git a/src/command/publish.rs b/src/command/publish.rs new file mode 100644 index 0000000..dd213d0 --- /dev/null +++ b/src/command/publish.rs @@ -0,0 +1,18 @@ +use command::utils::set_crate_path; +use error::Error; +use npm; +use slog::Logger; +use std::result; +use PBAR; + +pub fn publish(path: Option, log: &Logger) -> result::Result<(), Error> { + let crate_path = set_crate_path(path); + + info!(&log, "Publishing the npm package..."); + info!(&log, "npm info located in the npm debug log"); + npm::npm_publish(&crate_path)?; + info!(&log, "Published your package!"); + + PBAR.message("💥 published your package!")?; + Ok(()) +} diff --git a/src/command/utils.rs b/src/command/utils.rs new file mode 100644 index 0000000..ff85ef0 --- /dev/null +++ b/src/command/utils.rs @@ -0,0 +1,8 @@ +pub fn set_crate_path(path: Option) -> String { + let crate_path = match path { + Some(p) => p, + None => ".".to_string(), + }; + + crate_path +} diff --git a/src/manifest.rs b/src/manifest.rs index 703fd3f..22c95c4 100644 --- a/src/manifest.rs +++ b/src/manifest.rs @@ -149,11 +149,11 @@ pub fn get_crate_name(path: &str) -> Result { } pub fn check_crate_config(path: &str, step: &Step) -> Result<(), Error> { - let msg = format!("{}Checking crate configuration...", emoji::WRENCH); - PBAR.step(&step, &msg)?; - check_wasm_bindgen(path)?; - check_crate_type(path)?; - Ok(()) + let msg = format!("{}Checking crate configuration...", emoji::WRENCH); + PBAR.step(&step, &msg)?; + check_wasm_bindgen(path)?; + check_crate_type(path)?; + Ok(()) } fn check_wasm_bindgen(path: &str) -> Result<(), Error> { diff --git a/tests/manifest/main.rs b/tests/manifest/main.rs index ebc3e85..6f2b039 100644 --- a/tests/manifest/main.rs +++ b/tests/manifest/main.rs @@ -27,24 +27,27 @@ fn it_gets_the_crate_name_provided_path() { #[test] fn it_checks_has_cdylib_default_path() { - assert!(manifest::check_crate_type(".").is_err()); + let step = wasm_pack::progressbar::Step::new(1); + assert!(manifest::check_crate_config(".", &step).is_err()); } #[test] fn it_checks_has_cdylib_provided_path() { - assert!(manifest::check_crate_type("tests/fixtures/js-hello-world").is_ok()); + let step = wasm_pack::progressbar::Step::new(1); + assert!(manifest::check_crate_config("tests/fixtures/js-hello-world", &step).is_ok()); } #[test] fn it_checks_has_cdylib_wrong_crate_type() { - assert!(manifest::check_crate_type("tests/fixtures/bad-cargo-toml").is_err()); + let step = wasm_pack::progressbar::Step::new(1); + assert!(manifest::check_crate_config("tests/fixtures/bad-cargo-toml", &step).is_err()); } #[test] fn it_creates_a_package_json_default_path() { let step = wasm_pack::progressbar::Step::new(1); let path = ".".to_string(); - wasm_pack::command::create_pkg_dir(&path, &step).unwrap(); + wasm_pack::command::init::create_pkg_dir(&path, &step).unwrap(); assert!(manifest::write_package_json(&path, &None, false, &step).is_ok()); let package_json_path = format!("{}/pkg/package.json", &path); assert!(fs::metadata(package_json_path).is_ok()); @@ -66,7 +69,7 @@ fn it_creates_a_package_json_default_path() { fn it_creates_a_package_json_provided_path() { let step = wasm_pack::progressbar::Step::new(1); let path = "tests/fixtures/js-hello-world".to_string(); - wasm_pack::command::create_pkg_dir(&path, &step).unwrap(); + wasm_pack::command::init::create_pkg_dir(&path, &step).unwrap(); assert!(manifest::write_package_json(&path, &None, false, &step).is_ok()); let package_json_path = format!("{}/pkg/package.json", &path); assert!(fs::metadata(package_json_path).is_ok()); @@ -79,7 +82,7 @@ fn it_creates_a_package_json_provided_path() { fn it_creates_a_package_json_provided_path_with_scope() { let step = wasm_pack::progressbar::Step::new(1); let path = "tests/fixtures/scopes".to_string(); - wasm_pack::command::create_pkg_dir(&path, &step).unwrap(); + wasm_pack::command::init::create_pkg_dir(&path, &step).unwrap(); assert!(manifest::write_package_json(&path, &Some("test".to_string()), false, &step).is_ok()); let package_json_path = format!("{}/pkg/package.json", &path); assert!(fs::metadata(package_json_path).is_ok()); @@ -90,10 +93,12 @@ fn it_creates_a_package_json_provided_path_with_scope() { #[test] fn it_errors_when_wasm_bindgen_is_not_declared() { - assert!(manifest::check_wasm_bindgen("tests/fixtures/bad-cargo-toml").is_err()); + let step = wasm_pack::progressbar::Step::new(1); + assert!(manifest::check_crate_config("tests/fixtures/bad-cargo-toml", &step).is_err()); } #[test] fn it_does_not_error_when_wasm_bindgen_is_declared() { - assert!(manifest::check_wasm_bindgen("tests/fixtures/js-hello-world").is_ok()); + let step = wasm_pack::progressbar::Step::new(1); + assert!(manifest::check_crate_config("tests/fixtures/js-hello-world", &step).is_ok()); }