diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e07bd50..43c3cb7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,12 +1,10 @@ Make sure these boxes are checked! 📦✅ -- [ ] You have the latest version of `rustfmt` installed and have your - cloned directory set to nightly +- [ ] You have the latest version of `rustfmt` installed ```bash -$ rustup override set nightly $ rustup component add rustfmt-preview --toolchain nightly ``` -- [ ] You ran `rustfmt` on the code base before submitting +- [ ] You ran `cargo fmt` on the code base before submitting - [ ] You reference which issue is being closed in the PR text ✨✨ 😄 Thanks so much for contributing to wasm-pack! 😄 ✨✨ diff --git a/.gitignore b/.gitignore index 6ecdd21..4d85744 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ target/ **/*.rs.bk tests/.crates.toml tests/bin -wasm-pack.log /build-installer docs/book docs/installer diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b93943..b560937 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,346 @@ # Changelog +## 🌅 0.6.0 + +- ### ✨ Features + + - **Add three build profiles and infrastructure for their toml config - [fitzgen], [issue/153] [issue/160] [pull/440]** + + When originally conceived, `wasm-pack` was exclusively a packaging and publishing tool, which naively assumed + that the crate author would simply run `wasm-pack` when they were ready to publish a wasm package. As a result, + `wasm-pack` always ran `cargo build` in `--release` mode. Since then, `wasm-pack` has grown into an integrated build + tool used at all stages of development, from idea conception to publishing, and as such has developed new needs. + + In previous releases, we've supported a flag called `--debug` which will run `cargo build` in `dev` mode, which + trades faster compilation speed for a lack of optimizations. We've renamed this flag to `--dev` to match `cargo` + and added an additional flag, representing a third, intermediary, build profile, called `--profiling` which + is useful for investigating performance issues. You can see all three flags and their uses in the table below: + + | Profile | Debug Assertions | Debug Info | Optimizations | Notes | + |---------------|------------------|------------|---------------|---------------------------------------| + | `--dev` | Yes | Yes | No | Useful for development and debugging. | + | `--profiling` | No | Yes | Yes | Useful when profiling and investigating performance issues. | + | `--release` | No | No | Yes | Useful for shipping to production. | + + The meaning of these flags will evolve as the platform grows, and always be tied to the behavior of these flags + in `cargo`. You can learn more about these in the [`cargo profile` documentation]. + + This PR also introduces a way to configure `wasm-pack` in your `Cargo.toml` file that we intend to use much more + in the future. As a largely convention-based tool, `wasm-pack` will never require that you configure it manually, + however, as our community and their projects mature alongside the tool, it became clear that allowing folks the + ability to drop down and configure things was something we needed to do to meet their needs. + + Currently, you can only configure things related to the above-mentioned build profiles. To learn more, + [check out the documentation][profile-config-docs]. It leverages the `package.metadata.wasm-pack` key in your + `Cargo.toml`, and looks like this: + + ```toml + # Cargo.toml + + [package.metadata.wasm-pack.profile.dev.wasm-bindgen] + # Should we enable wasm-bindgen's debug assertions in its generated JS glue? + debug-js-glue = true + # Should wasm-bindgen demangle the symbols in the "name" custom section? + demangle-name-section = true + # Should we emit the DWARF debug info custom sections? + dwarf-debug-info = false + ``` + + As always- there are defaults for you to use, but if you love to configure (or have a project that requires it), + get excited, as your options have grown now and will continue to! + + [profile-config-docs]: https://rustwasm.github.io/wasm-pack/book/cargo-toml-configuration.html + [`cargo profile` documentation]: https://doc.rust-lang.org/cargo/reference/manifest.html#the-profile-sections + [issue/153]: https://github.com/rustwasm/wasm-pack/issues/153 + [issue/160]: https://github.com/rustwasm/wasm-pack/issues/160 + [pull/440]: https://github.com/rustwasm/wasm-pack/pull/440 + + - **DEPRECATION: Rename `--debug` to `--dev` to match `cargo` - [fitzgen], [pull/439]** + + See the discussion of the build profiles feature above. This is a strict renaming of the previous `--debug` flag, + which will now warn as deprecated. + + [pull/439]: https://github.com/rustwasm/wasm-pack/pull/439 + + - **Add an option to pass an arbitrary set of arguments to `cargo build` - [torkve], [issue/455] [pull/461]** + + As an integrated build tool, `wasm-pack` orchestrates many secondary command line tools to build your package + in a single command. Notably, one of these tools is `cargo`. `cargo` has a wide array of features and flags, and + we couldn't reasonably expect to implement them all as first class features of `wasm-pack`. As a result, we've + created the option to allow users to pass an arbitrary number of additional flags to `wasm-pack` by appending them + to the `wasm-pack build` command, after passing `--`. For example: + + ``` + wasm-pack build examples/js-hello-world --mode no-install -- -Z offline + ``` + + In the above example, the flag `-Z offline` will be passed to `cargo build`. This feature is documented + [here][cargo opts docs]. + + [cargo opts docs]: https://rustwasm.github.io/wasm-pack/book/commands/build.html#extra-options + [torkve]: https://github.com/torkve + [issue/455]: https://github.com/rustwasm/wasm-pack/issues/455 + [pull/461]: https://github.com/rustwasm/wasm-pack/pull/461 + + + - **Pre-build before wasm-pack publish - [csmoe], [issue/438] [pull/444]** + + Previously, if you ran `wasm-pack publish` before you had successfully run `wasm-pack build`, + you'd receive an error that a package could not be found- because there would be no `pkg` or + out-directory containing a `package.json`. + + In this situation, you would hope that `wasm-pack` would build your package for you when you + ran `wasm-pack publish`. This is slightly complicated by the fact that not everyone wants to + build their package to the default target or to a directory named `pkg`. + + To solve this, running `wasm-pack publish` before a successful build will give you an interactive + prompt to build your package- allowing you to specify your out directory as well as the target you'd + like to build to. Check it out in the gif below: + + ![pre-build publish workflow](https://user-images.githubusercontent.com/35686186/50500909-5984fe80-0a8f-11e9-9de6-43d1423b2969.gif) + + [issue/438]: https://github.com/rustwasm/wasm-pack/issues/438 + [pull/444]: https://github.com/rustwasm/wasm-pack/pull/444 + + - **Generate self-.gitignore as part of pkg folder - [RReverser], [pull/453]** + + Since `wasm-pack` was first published, the `pkg` directory was intended to be treated as a + build artifact, and as such should never be published to version control. This was + never enforced by any assets generated by `wasm-pack`, however. + + Now, when building your package, `wasm-pack` will also generate a `.gitignore` file so that the + `pkg`, or out-directory, will be ignored. + + If you use another version control tool, you'll need to still create or edit your own ignore file- + pull requests to support other version control tools are welcome! + + If you require editing of the generated `package.json` or add additonal assets to your package + before publishing, you'll want to remove the `.gitignore` file and commit to version control. We + intend to have a solution that makes this workflow significantly easier in upcoming releases! + + [RReverser]: https://github.com/RReverser + [pull/453]: https://github.com/rustwasm/wasm-pack/pull/453 + + - **Support cargo workspaces - [fitzgen], [issue/252] [issue/305] [pull/430]** + + Workspaces are a well-liked and used feature of cargo that allow you to build multiple crates + in a single cargo project. Because of how `wasm-pack` handled paths for `target` and out-directories, + we did not support cargo workspaces out of the box. Now they should work well and the feature is + well guarded by tests! + + [issue/252]: https://github.com/rustwasm/wasm-pack/issues/252 + [issue/305]: https://github.com/rustwasm/wasm-pack/issues/305 + [pull/430]: https://github.com/rustwasm/wasm-pack/pull/430 + + - **Use a global cache for all downloaded binaries - [alexcrichton], [pull/426]** + + `wasm-pack` is an integrated build tool that orchestrates several other command line tools to build + your wasm project for you. How `wasm-pack` does this has evolved significantly since it's early versions. + In the last version, a `bin` directory was created to house the tool binaries that `wasm-pack` needed to + build our project, but this had several limitations. Firstly, it created a `bin` directory in your project's + root, which could be confusing. Secondly, it meant that sharing these tools across multiple projects was + not possible. We did this because it gaves us the fine-grained control over the version of these tools that + you used. + + Now, `wasm-pack` will not generate a `bin` directory, but rather will use a global cache. We retain the + fine-grained control over the versions of these tools that are used, but allow multiple projects that use + the same tools at the same versions to share the already installed asset. Your global cache will generally + be in your user's home directory- we use the [`dirs` crate] to determine where to place this global cache. + This is not currently customizable but is something we intend to look into doing! + + This feature ensures that `wasm-pack` users are downloading a minimal number of binaries from the network, + which, for `wasm-pack` users with multiple projects, should speed up build times. + + [`dirs` crate]: https://docs.rs/dirs/1.0.4/dirs/fn.cache_dir.html + [pull/426]: https://github.com/rustwasm/wasm-pack/pull/426 + +- ### 🤕 Fixes + + - **Fix `pack`, `login`, and `publish` for Windows users - [danwilhelm], [issue/277] [pull/489]** + + Rust's behavior for spawning processes on some Windows targets introduced an interesting case where + Rust would fail unless the command was explicitly spawned with a prepended `cmd /c`. This failure + of `wasm-pack` was well noticed by our community - and thanks to the efforts of `danwilhelm` is now + fixed! You can read more on the background of this issue in [rust-lang/rust issue/44542]. + + [rust-lang/rust issue/44542]: https://github.com/rust-lang/rust/pull/44542 + [issue/277]: https://github.com/rustwasm/wasm-pack/issues/277 + [pull/489]: https://github.com/rustwasm/wasm-pack/pull/489 + + - **Validate `--target` argument - [csmoe], [issue/483] [pull/484]** + + For a few releases now, `wasm-pack` has supported allowing users to specifying the target module system + they'd like their package built for- `browser`, `nodejs`, and `no-modules`. We did not however, validate + this input, and so if a user made even a slight mistake, e.g. `node`, `wasm-pack` would not catch the + error and would build your project using the default, `browser`. This is of course, surprising, and + unpleasant behavior and so now we'll error out with a message containing the supported target names. + + [issue/483]: https://github.com/rustwasm/wasm-pack/issues/483 + [pull/484]: https://github.com/rustwasm/wasm-pack/pull/484 + + - **Fix login - [danwilhelm], [issue/486] [pull/487]** + + [danwilhelm]: https://github.com/danwilhelm + [issue/486]: https://github.com/rustwasm/wasm-pack/issues/486 + [pull/487]: https://github.com/rustwasm/wasm-pack/pull/487 + + - **Eliminate unecessary escaping in build success terminal output - [huangjj27], [issue/390] [pull/396]** + + Previously, on some systems, a successful `wasm-pack build` would print a unfortunate looking string: + + ``` + | :-) Your wasm pkg is ready to publish at "\\\\?\\C:\\Users\\Ferris\\tmp\\wasm-bug\\pkg". + ``` + + We've updated this to make sure the path to your project is well-formed, and most importantly, + human-readable. + + [issue/390]: https://github.com/rustwasm/wasm-pack/issues/390 + [pull/396]: https://github.com/rustwasm/wasm-pack/pull/396 + + - **Copy license file(s) to out directory - [mstallmo], [issue/407] [pull/411]** + + Since `wasm-pack` was first published, we've copied over your `Cargo.toml` license definition over to + your `package.json`. However, we overlooked copying the actual `LICENSE` files over! Now we do! + + [issue/407]: https://github.com/rustwasm/wasm-pack/issues/407 + [pull/411]: https://github.com/rustwasm/wasm-pack/pull/411 + + - **Don't require cdylib crate-type for testing - [alexcrichton], [pull/442]** + + `wasm-pack` was unecssarily checking `Cargo.toml` for the `cdylib` crate type during calls to `wasm-pack test`. + The `cdylib` output isn't necessary for the `wasm-pack test` stage because `wasm-bindgen` isn't being run over + a wasm file during testing. This check is now removed! + + [pull/442]: https://github.com/rustwasm/wasm-pack/pull/442 + + - **Fix wasm-bindgen if lib is renamed via `lib.name` - [alexcrichton], [issue/339] [pull/435]** + + In some circumstances, a library author may wish to specify a `name` in the `[package]` portion of their + `Cargo.toml`, as well as a different `name` in the `[lib]` portion, e.g.: + + ```toml + [package] + name = "hello-wasm" + + [lib] + name = "wasm-lib" + ``` + + This would cause the `wasm-bindgen` build stage of `wasm-pack` to error out because `wasm-pack` would attempt + to run `wasm-bindgen-cli` on a path using the `[package]` name, which wouldn't exist (because it would be using + the `[lib]` name). Now it works- thanks to more usage of [`cargo_metadata`] in `wasm-pack` internals! + + [`cargo_metadata`]: https://crates.io/crates/cargo_metadata + [issue/339]: https://github.com/rustwasm/wasm-pack/issues/339 + [pull/435]: https://github.com/rustwasm/wasm-pack/pull/435 + + - **Print standard error only once for failing commands - [fitzgen], [issue/422] [pull/424]** + + Previously, `wasm-pack` may have printed `stderr` twice in some circumstances. This was both confusing and not + a pleasant experience, so now we've ensued that `wasm-pack` prints `stderr` exactly once! (It's hard enough to have + errors, you don't want `wasm-pack` rubbing it in, right?) + + [issue/422]: https://github.com/rustwasm/wasm-pack/issues/422 + [pull/424]: https://github.com/rustwasm/wasm-pack/pull/424 + + - **Add no-modules to --target flag's help text - [fitzgen], [issue/416] [pull/417]** + + This is an interesting one! `fitzgen` very reasonably filed an issue asking to add `wasm-bindgen`'s + `--target no-modules` feature to `wasm-pack`. This was confusing as this feature was indeed already implemented, + and documented- BUT, notably missing from the `wasm-pack --help` text. We've fixed that now- and it was an omission + so glaring we definitely considered it a bug! + + [issue/416]: https://github.com/rustwasm/wasm-pack/issues/416 + [pull/417]: https://github.com/rustwasm/wasm-pack/pull/417 + +- ### 🛠️ Maintenance + + - **Replace `slog` with `log` - [alexcrichton], [issue/425] [pull/434]** + + For internal maintenance reasons, as well as several end-user ones, we've migrated away from the `slog` family + of crates, and are now using the `log` crate plus `env_logger`. Now, `wasm-pack` won't create a `wasm-pack.log`. + Additionally, enabling logging will now be done through `RUST_LOG=wasm_pack` instead of `-v` flags. + + [issue/425]: https://github.com/rustwasm/wasm-pack/issues/425 + [pull/434]: https://github.com/rustwasm/wasm-pack/pull/434 + + - **Move binary installation to its own crate - [drager], [issue/384] [pull/415]** + + In `wasm-pack 0.5.0`, we move away from `cargo install`ing many of the tools that `wasm-pack` orchestrates. Because + we used `cargo install`, this required an end user to sit through the compilation of each tool, which was a + prohibitively long time. We moved, instead, to building, and then installing, binaries of the tools. This sped up + build times dramatically! + + This pattern has been very beneficial to `wasm-pack` and is potentially something that could be beneficial to other + projects! As a result, we've refactored it out into a crate and have published it as it's own crate, [`binary-install`]. + + [`binary-install`]: https://crates.io/crates/binary-install + [drager]: https://github.com/drager + [issue/384]: https://github.com/rustwasm/wasm-pack/issues/384 + [pull/415]: https://github.com/rustwasm/wasm-pack/pull/415 + + - **Replace internal `Error` with `failure::Error` - [alexcrichton], [pull/436]** + + The story of error message handling in `wasm-pack` has not been the prettiest. We originally were manually implementing + errors, adding the [`failure` crate] at one point, but not fully updating the entire codebase. With this PR, we are + nearly completely handling errors with `failure`, bringing the code into a much more maintainable and + pleasant-to-work-on place. + + [`failure` crate]: https://crates.io/crates/failure + [pull/436]: https://github.com/rustwasm/wasm-pack/pull/436 + + - **Update `mdbook` version used by Travis - [fitzgen], [pull/433]** + + [pull/433]: https://github.com/rustwasm/wasm-pack/pull/433 + + - **Read the `Cargo.toml` file only once - [fitzgen], [issue/25] [pull/431]** + + This is a very fun one since it fixes one of the original issues filed by `ag_dubs` at the very beginning of `wasm-pack` + development. In a rush to implement a POC tool, `ag_dubs` noted for posterity that the `Cargo.toml` was being read + multiple times (twice), when it did not need to be. Thanks to `fitzgen` now it's read only once! A minor performance + improvement in the scheme of things, but a nice one :) + + [issue/25]: https://github.com/rustwasm/wasm-pack/issues/25 + [pull/431]: https://github.com/rustwasm/wasm-pack/pull/431 + + - **Use `name` field for Travis CI jobs - [fitzgen], [pull/432]** + + [pull/432]: https://github.com/rustwasm/wasm-pack/pull/432 + + - **Add a test for build command - [huangjj27], [pull/408]** + + [huangjj27]: https://github.com/huangjj27 + [pull/408]: https://github.com/rustwasm/wasm-pack/pull/408 + + - **Test paths on Windows - [xmclark], [issue/380] [pull/389]** + + [xmclark]: https://github.com/xmclark + [issue/380]: https://github.com/rustwasm/wasm-pack/issues/380 + [pull/389]: https://github.com/rustwasm/wasm-pack/pull/389 + + - **Fix typo in test function name for copying the README - [mstallmo], [pull/412]** + + [pull/412]: https://github.com/rustwasm/wasm-pack/pull/412 + +- ### 📖 Documentation + + - **Complete template deep dive docs - [danwilhelm], [issue/345] [issue/346] [pull/490]** + + In a rush to publish a release, `ag_dubs` left some "Coming soon!" comments on most pages + of the "Template Deep Dive" docs. These docs help walk new users through the boilerplate + that using the `wasm-pack` template generates for you. Thanks so much to `danwilhem` for + picking this up and doing an excellent job! + + [issue/345]: https://github.com/rustwasm/wasm-pack/issues/345 + [issue/346]: https://github.com/rustwasm/wasm-pack/issues/346 + [pull/490]: https://github.com/rustwasm/wasm-pack/pull/490 + + - **Minor docs updates - [fitzgen], [issue/473] [pull/485]** + + [issue/473]: https://github.com/rustwasm/wasm-pack/issues/473 + [pull/485]: https://github.com/rustwasm/wasm-pack/pull/485 + ## 🌄 0.5.1 - ### 🤕 Fixes diff --git a/Cargo.lock b/Cargo.lock index 2279393..23f52ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ name = "aho-corasick" version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -30,10 +30,21 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "assert_cmd" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "escargot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "predicates 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "predicates-tree 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -41,30 +52,51 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "autocfg" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "backtrace" -version = "0.3.9" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace-sys" -version = "0.1.24" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "binary-install" +version = "0.0.1" +dependencies = [ + "curl 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", + "dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "is_executable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tar 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", + "zip 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -77,7 +109,7 @@ name = "blake2-rfc" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -96,34 +128,34 @@ name = "bzip2" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bzip2-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "bzip2-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bzip2-sys" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cargo_metadata" -version = "0.6.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cc" -version = "1.0.25" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -131,16 +163,6 @@ name = "cfg-if" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "chrono" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "clap" version = "2.32.0" @@ -162,7 +184,18 @@ 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)", "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "clicolors-control" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -182,9 +215,26 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "clicolors-control 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "console" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -203,16 +253,24 @@ dependencies = [ "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crc32fast" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "curl" version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curl-sys 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", + "curl-sys 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -220,76 +278,125 @@ dependencies = [ [[package]] name = "curl-sys" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "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.3 (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 = "difference" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "dirs" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "redox_users 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "encode_unicode" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "env_logger" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "error-chain" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "escargot" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure_derive" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.21 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.18 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.25 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "filetime" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "flate2" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide_c_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "float-cmp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "foreign-types" version = "0.3.2" @@ -317,9 +424,14 @@ name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "glob" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "heck" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -335,36 +447,41 @@ name = "human-panic" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "os_type 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "humantime" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "indicatif" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "console 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "console 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "isatty" -version = "0.1.9" +name = "is_executable" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -394,36 +511,54 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.43" +version = "0.2.47" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "libflate" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libz-sys" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lock_api" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "log" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "memchr" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -432,8 +567,8 @@ name = "miniz-sys" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -449,33 +584,21 @@ name = "miniz_oxide_c_api" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "msdos_time" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "nodrop" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "num-integer" -version = "0.1.39" +name = "normalize-line-endings" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "num-traits" @@ -484,15 +607,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.15" +version = "0.10.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -502,20 +625,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-src" -version = "111.0.1+1.1.1" +version = "111.1.0+1.1.1a" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "openssl-sys" -version = "0.9.39" +version = "0.9.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-src 111.0.1+1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-src 111.1.0+1.1.1a (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -525,12 +648,12 @@ name = "os_type" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "owning_ref" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -541,19 +664,40 @@ name = "parking_lot" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -567,29 +711,72 @@ name = "podio" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "predicates" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "float-cmp 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "normalize-line-endings 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "predicates-core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "predicates-tree" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "treeline 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "proc-macro2" -version = "0.4.21" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "quick-error" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "quote" version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.21 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" -version = "0.4.3" +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.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand" +version = "0.4.5" +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.47 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -600,11 +787,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_chacha" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand_core" version = "0.2.2" @@ -618,9 +831,63 @@ name = "rand_core" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_os" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_pcg" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "redox_syscall" -version = "0.1.40" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -628,7 +895,7 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -637,9 +904,9 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -648,7 +915,7 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -656,12 +923,12 @@ dependencies = [ [[package]] name = "regex" -version = "1.0.6" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -671,15 +938,15 @@ name = "regex-syntax" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ucd-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ucd-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -692,7 +959,7 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.9" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -705,8 +972,16 @@ dependencies = [ [[package]] name = "ryu" -version = "0.2.6" +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" @@ -733,7 +1008,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -743,64 +1018,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.80" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "serde_derive" -version = "1.0.80" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.21 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.18 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.25 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "serde_json" -version = "1.0.32" +name = "serde_ignored" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "siphasher" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "slog" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "slog-async" -version = "2.3.0" +name = "serde_json" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "slog-term" -version = "2.4.0" +name = "siphasher" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "isatty 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "smallvec" -version = "0.6.5" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -812,8 +1071,8 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -827,32 +1086,37 @@ name = "strsim" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "structopt" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "heck 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.21 (registry+https://github.com/rust-lang/crates.io-index)", + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.18 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.25 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syn" -version = "0.15.18" +version = "0.15.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.21 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -862,25 +1126,20 @@ name = "synstructure" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.21 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.18 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.25 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "tar" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "filetime 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", "xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -889,29 +1148,32 @@ name = "tempdir" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tempfile" -version = "3.0.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (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.50 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "term" -version = "0.5.1" +name = "tempfile" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", + "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -923,13 +1185,21 @@ dependencies = [ "wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "termcolor" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "termion" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -938,7 +1208,7 @@ name = "termios" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -959,25 +1229,30 @@ dependencies = [ [[package]] name = "time" -version = "0.1.40" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "toml" -version = "0.4.8" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "treeline" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ucd-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1014,7 +1289,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1037,45 +1312,58 @@ 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" +version = "0.6.0" dependencies = [ + "assert_cmd 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "cargo_metadata 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "binary-install 0.0.1", + "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)", "curl 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", + "dialoguer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (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)", "indicatif 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", + "predicates 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_ignored 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)", "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-term 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tar 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "which 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "zip 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", + "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "which" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1102,6 +1390,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" @@ -1115,24 +1411,33 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "wincolor" +version = "1.0.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)", + "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "xattr" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "zip" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bzip2 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libflate 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [metadata] @@ -1140,118 +1445,147 @@ dependencies = [ "checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392" -"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" +"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" +"checksum assert_cmd 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ac5c260f75e4e4ba87b7342be6edcecbcb3eb6741a0507fda7ad115845cc65" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a" -"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0" +"checksum autocfg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e5f34df7a019573fb8bdc7e24a2bfebe51a2a1d6bfdbaeccedb3c41fc574727" +"checksum backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b493b66e03090ebc4343eb02f94ff944e0cbc9ac6571491d170ba026741eb5" +"checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "94f88df23a25417badc922ab0f5716cc1330e87f71ddd9203b3a3ccd9cedf75d" "checksum bzip2 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "42b7c3cbf0fa9c1b82308d57191728ca0256cb821220f4e2fd410a72ade26e3b" -"checksum bzip2-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2c5162604199bbb17690ede847eaa6120a3f33d5ab4dcc8e7c25b16d849ae79b" -"checksum cargo_metadata 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1aaa1a9856ae2d188340526d0986feb6899c9ad11c5dfd73453c784fed6e373d" -"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16" +"checksum bzip2-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6584aa36f5ad4c9247f5323b0a42f37802b37a836f0ad87084d7a33961abe25f" +"checksum cargo_metadata 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e5d1b4d380e1bab994591a24c2bdd1b054f64b60bef483a8c598c7c345bc3bbe" +"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749" "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" -"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum clicolors-control 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f84dec9bc083ce2503908cd305af98bd363da6f54bf8d4bf0ac14ee749ad5d1" +"checksum clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "73abfd4c73d003a674ce5d2933fca6ce6c42480ea84a5ffe0a2dc39ed56300f9" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum console 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd48adf136733979b49e15bc3b4c43cc0d3c85ece7bd08e6daa414c6fcb13e6" +"checksum console 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ecc3753530b959618f617b0cd6494526008d98687f1af5d8f9fa83fa9cdbb594" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"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 curl-sys 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ca79238a79fb294be6173b4057c95b22a718c94c4e38475d5faa82b8383f3502" +"checksum dialoguer 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ad1c29a0368928e78c551354dbff79f103a962ad820519724ef0d74f1c62fa9" +"checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "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 env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" "checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" -"checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7" -"checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596" -"checksum filetime 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6f57e64bf5eae62efd4efed005ae81a7115012a61f522bba54542e1a556af921" -"checksum flate2 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3b0c7353385f92079524de3b7116cf99d73947c08a7472774e9b3b04bff3b901" +"checksum escargot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "19db1f7e74438642a5018cdf263bb1325b2e792f02dd0a3ca6d6c0f0d7b1d5a5" +"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" +"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" +"checksum filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a2df5c1a8c4be27e7707789dc42ae65976e60b394afd293d1419ab915833e646" +"checksum flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2291c165c8e703ee54ef3055ad6188e3d51108e2ded18e9f2476e774fc5ad3d4" +"checksum float-cmp 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "134a8fa843d80a51a5b77d36d42bc2def9edcb0262c914861d08129fd1926600" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum heck 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea04fa3ead4e05e51a7c806fc07271fdbde4e246a6c6d1efd52e72230b771b82" +"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" +"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum human-panic 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "21638c5955a6daf3ecc42cae702335fc37a72a4abcc6959ce457b31a7d43bbdd" +"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum indicatif 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a29b2fa6f00010c268bface64c18bb0310aaa70d46a195d5382d288c477fb016" -"checksum isatty 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e31a8281fc93ec9693494da65fbf28c0c2aa60a2eaec25dc58e2f31952e95edc" +"checksum is_executable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "302d553b8abc8187beb7d663e34c065ac4570b273bc9511a50e940e99409c577" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" -"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" +"checksum libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "48450664a984b25d5b479554c29cc04e3150c97aa4c01da5604a2d4ed9151476" +"checksum libflate 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "bff3ac7d6f23730d3b533c35ed75eef638167634476a499feef16c428d74b57b" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" -"checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a" -"checksum memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0a3eb002f0535929f1199681417029ebea04aadc0c7a4224b46be99c7f5d6a16" +"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" +"checksum memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "db4c41318937f6e76648f42826b1d9ade5c09cafb5aef7e351240a70f39206e9" "checksum miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0300eafb20369952951699b68243ab4334f4b10a88f411c221d444b36c40e649" "checksum miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ad30a47319c16cde58d0314f5d98202a80c9083b5f61178457403dfb14e509c" "checksum miniz_oxide_c_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28edaef377517fd9fe3e085c37d892ce7acd1fbeab9239c5a36eec352d8a8b7e" -"checksum msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aad9dfe950c057b1bfe9c1f2aa51583a8468ef2a5baba2ebbe06d775efeb7729" -"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" +"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" +"checksum normalize-line-endings 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2e0a1a39eab95caf4f5556da9289b9e68f0aafac901b2ce80daaf020d3b733a8" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "5e1309181cdcbdb51bc3b6bedb33dfac2a83b3d585033d3f6d9e22e8c1928613" +"checksum openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ec7bd7ca4cce6dbdc77e7c1230682740d307d1218a87fb0349a571272be749f9" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-src 111.0.1+1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d1edaed888fd85a54a2646bf02992931ddefdda3b1a748fc79f088a8db27fcbe" -"checksum openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)" = "278c1ad40a89aa1e741a1eed089a2f60b18fab8089c3139b542140fc7d674106" +"checksum openssl-src 111.1.0+1.1.1a (registry+https://github.com/rust-lang/crates.io-index)" = "26bb632127731bf4ac49bf86a5dde12d2ca0918c2234fc39d79d4da2ccbc6da7" +"checksum openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)" = "1bb974e77de925ef426b6bc82fce15fd45bdcbeb5728bffcfc7cdeeb7ce1c2d6" "checksum os_type 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7edc011af0ae98b7f88cf7e4a83b70a54a75d2b8cb013d6efd02e5956207e9eb" -"checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" +"checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" +"checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" +"checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd" -"checksum proc-macro2 0.4.21 (registry+https://github.com/rust-lang/crates.io-index)" = "ab2fc21ba78ac73e4ff6b3818ece00be4e175ffbef4d0a717d978b48b24150c4" +"checksum predicates 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa984b7cd021a0bf5315bcce4c4ae61d2a535db2a8d288fc7578638690a7b7c3" +"checksum predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06075c3a3e92559ff8929e7a280684489ea27fe44805174c3ebd9328dcb37178" +"checksum predicates-tree 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e63c4859013b38a76eca2414c64911fba30def9e3202ac461a2d22831220124" +"checksum proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "77619697826f31a02ae974457af0b29b723e5619e113e9397b8b82c6bd253f09" +"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c" -"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" +"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" +"checksum rand 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "dee497e66d8d76bf08ce20c8d36e16f93749ab0bf89975b4f8ae5cee660c2da2" "checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" +"checksum rand 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3906503e80ac6cbcacb2c2973fa8e473f24d7e2747c8c92bb230c2441cad96b5" +"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" "checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372" "checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" -"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" +"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +"checksum rand_os 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f46fbd5550acf75b0c2730f5dd1873751daf9beb8f11b44027778fae50d7feca" +"checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" +"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +"checksum redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)" = "52ee9a534dc1301776eff45b4fa92d2c39b1d8c3d3357e6eb593e0d795506fc2" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum redox_users 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "214a97e49be64fd2c86f568dd0cb2c757d2cc53de95b273b6ad0a1c908482f26" "checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" -"checksum regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ee84f70c8c08744ea9641a731c7fadb475bf2ecc52d7f627feb833e0b3990467" +"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" "checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" -"checksum regex-syntax 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fbc557aac2b708fe84121caf261346cc2eed71978024337e42eb46b8a252ac6e" +"checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" -"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" +"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7" +"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" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef" -"checksum serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "225de307c6302bec3898c51ca302fc94a7a1697ef0845fcee6448f33c032249c" -"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" +"checksum serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)" = "0e732ed5a5592c17d961555e3b552985baf98d50ce418b7b655f31f6ba7eb1b7" +"checksum serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d6115a3ca25c224e409185325afc16a0d5aaaabc15c42b09587d6f1ba39a5b" +"checksum serde_ignored 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "190e9765dcedb56be63b6e0993a006c7e3b071a016a304736e4a315dc01fb142" +"checksum serde_json 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)" = "dfb1277d4d0563e4593e0b8b5d23d744d277b55d2bc0bf1c38d0d8a6589d38aa" "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" -"checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" -"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" -"checksum slog-term 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5951a808c40f419922ee014c15b6ae1cd34d963538b57d8a4778b9ca3fff1e0b" -"checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d" +"checksum smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b73ea3738b47563803ef814925e69be00799a8c07420be8b996f8e98fb2336db" "checksum socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum structopt 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "41c4a2479a078509940d82773d90ff824a8c89533ab3b59cd3ce8b0c0e369c02" -"checksum structopt-derive 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "5352090cfae7a2c85e1a31146268b53396106c88ca5d6ccee2e3fae83b6e35c2" -"checksum syn 0.15.18 (registry+https://github.com/rust-lang/crates.io-index)" = "90c39a061e2f412a9f869540471ab679e85e50c6b05604daf28bc3060f75c430" +"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +"checksum structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "670ad348dc73012fcf78c71f06f9d942232cdd4c859d4b6975e27836c3efc0c3" +"checksum structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ef98172b1a00b0bec738508d3726540edcbd186d50dfd326f2b1febbb3559f04" +"checksum syn 0.15.25 (registry+https://github.com/rust-lang/crates.io-index)" = "71b7693d9626935a362a3d1d4e59380800a919ebfa478d77a4f49e2a6d2c3ad5" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" -"checksum tar 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)" = "89b518542272d9c12195e72885c7a4c142b89226f681bb129e4a922ba1b1ee74" +"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 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "55c1195ef8513f3273d55ff59fe5da6940287a0d7a98331254397f464833675b" -"checksum term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6b677dd1e8214ea1ef4297f85dbcbed8e8cdddb561040cc998ca2551c37561" +"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 termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "adc4587ead41bf016f11af03e55a624c06568b5a19db4e90fde573d805074f83" +"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" "checksum termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72b620c5ea021d75a735c943269bb07d30c9b77d6ac6b236bc8b5c496ef05625" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" -"checksum toml 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4a2ecc31b0351ea18b3fe11274b8db6e4d82bce861bbb22e6dbed40417902c65" -"checksum ucd-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d0f8bfa9ff0cadcd210129ad9d2c5f145c13e9ced3d3e5d948a6213487d52444" +"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +"checksum treeline 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" +"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" @@ -1262,12 +1596,15 @@ 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 which 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49c4f580e93079b70ac522e7bdebbe1568c8afa7d8d05ee534ee737ca37d2f51" +"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 wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" "checksum xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" -"checksum zip 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "36b9e08fb518a65cf7e08a1e482573eb87a2f4f8c6619316612a3c1f162fe822" +"checksum zip 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00acf1fafb786ff450b6726e5be41ef029142597b47a40ce80f952f1471730a0" diff --git a/Cargo.toml b/Cargo.toml index 568327c..11e3f0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "wasm-pack" -description = "pack up the wasm and publish it to npm!" -version = "0.5.1" +description = "📦✨ your favorite rust -> wasm workflow tool!" +version = "0.6.0" authors = ["Ashley Williams "] repository = "https://github.com/ashleygwilliams/wasm-pack.git" license = "MIT/Apache-2.0" @@ -13,31 +13,34 @@ documentation = "https://rustwasm.github.io/wasm-pack/" atty = "0.2.11" cargo_metadata = "0.6.0" console = "0.6.1" +dialoguer = "0.3.0" curl = "0.4.13" dirs = "1.0.4" +env_logger = { version = "0.5.13", default-features = false } failure = "0.1.2" -flate2 = "1.0.2" -hex = "0.3" human-panic = "1.0.1" +glob = "0.2" indicatif = "0.9.0" lazy_static = "1.1.0" +log = "0.4.6" openssl = { version = '0.10.11', optional = true } parking_lot = "0.6" serde = "1.0.74" serde_derive = "1.0.74" +serde_ignored = "0.0.4" serde_json = "1.0.26" +strsim = "0.8.0" siphasher = "0.2.3" -slog = "2.3" -slog-term = "2.4" -slog-async = "2.3" structopt = "0.2" -tar = "0.4.16" toml = "0.4" which = "2.0.0" -zip = "0.4.2" tempfile = "3.0" +binary-install = { version = "0.0.1", path = "./binary-install" } +walkdir = "2" [dev-dependencies] +assert_cmd = "0.10.2" +predicates = "1.0.0" tempfile = "3" [features] diff --git a/README.md b/README.md index b145e06..53af817 100644 --- a/README.md +++ b/README.md @@ -38,14 +38,15 @@ This project requires Rust 1.30.0 or later. ## 📝 Logging -We generate a `wasm-pack.log` file if `wasm-pack` errors on you, and you can -customize the log verbosity using the verbosity flag. - -| Verbosity | Result | -| ------------- |-----------------------------------------------------| -| -v | All Info, Warn, and Errors are logged | -| -vv | All Debug, Info, Warn, and Errors are logged | -| -vvv | All Trace, Debug, Info, Warn, and Errors are logged | +`wasm-pack` uses [`env_logger`] to produces logs when `wasm-pack` runs. + +To configure your log level, use the `RUST_LOG` environment variable. For example: + +``` +RUST_LOG=info wasm-pack build +``` + +[`env_logger`]: https://crates.io/crates/env_logger ## 👯 Contributing diff --git a/binary-install/Cargo.toml b/binary-install/Cargo.toml new file mode 100644 index 0000000..b735cea --- /dev/null +++ b/binary-install/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "binary-install" +description = "install a binary from a path to a global cache" +authors = ["The wasm-pack team"] +repository = "https://github.com/rustwasm/wasm-pack/tree/master/binary-install" +license = "MIT/Apache-2.0" +version = "0.0.1" +documentation = "https://docs.rs/binary-install" +readme = "./README.md" + +[dependencies] +curl = "0.4.13" +dirs = "1.0.4" +failure = "0.1.2" +flate2 = "1.0.2" +hex = "0.3" +is_executable = "0.1.2" +siphasher = "0.2.3" +tar = "0.4.16" +zip = "0.5.0" diff --git a/binary-install/README.md b/binary-install/README.md new file mode 100644 index 0000000..a79d5df --- /dev/null +++ b/binary-install/README.md @@ -0,0 +1,2 @@ +# `binary-install` +> install a binary from a path to a global cache diff --git a/src/binaries.rs b/binary-install/src/lib.rs similarity index 91% rename from src/binaries.rs rename to binary-install/src/lib.rs index a34c872..eac1c98 100644 --- a/src/binaries.rs +++ b/binary-install/src/lib.rs @@ -1,10 +1,17 @@ //! Utilities for finding and installing binaries that we depend on. -use curl; -use dirs; +extern crate curl; +#[macro_use] +extern crate failure; +extern crate dirs; +extern crate flate2; +extern crate hex; +extern crate is_executable; +extern crate siphasher; +extern crate tar; +extern crate zip; + use failure::{Error, ResultExt}; -use flate2; -use hex; use siphasher::sip::SipHasher13; use std::collections::HashSet; use std::env; @@ -13,8 +20,6 @@ use std::fs; use std::hash::{Hash, Hasher}; use std::io; use std::path::{Path, PathBuf}; -use tar; -use zip; /// Global cache for wasm-pack, currently containing binaries downloaded from /// urls like wasm-bindgen and such. @@ -32,12 +37,13 @@ impl Cache { /// /// This function may return an error if a cache directory cannot be /// determined. - pub fn new() -> Result { + pub fn new(name: &str) -> Result { + let cache_name = format!(".{}", name); let destination = dirs::cache_dir() - .map(|p| p.join("wasm-pack")) + .map(|p| p.join(&cache_name)) .or_else(|| { let home = dirs::home_dir()?; - Some(home.join(".wasm-pack")) + Some(home.join(&cache_name)) }) .ok_or_else(|| format_err!("couldn't find your home directory, is $HOME not set?"))?; Ok(Cache::at(&destination)) @@ -218,13 +224,22 @@ impl Download { } /// Returns the path to the binary `name` within this download - pub fn binary(&self, name: &str) -> PathBuf { + pub fn binary(&self, name: &str) -> Result { + use is_executable::IsExecutable; + let ret = self .root .join(name) .with_extension(env::consts::EXE_EXTENSION); - assert!(ret.exists(), "binary {} doesn't exist", ret.display()); - return ret; + + if !ret.is_file() { + bail!("{} binary does not exist", ret.display()); + } + if !ret.is_executable() { + bail!("{} is not executable", ret.display()); + } + + Ok(ret) } } diff --git a/docs/index.html b/docs/index.html index 2590699..2566c10 100644 --- a/docs/index.html +++ b/docs/index.html @@ -42,9 +42,9 @@

📦✨ your favorite rust -> wasm workflow tool!

- ✨ Install wasm-pack 0.5.1 ✨ -

9 Oct 2018 | - + ✨ Install wasm-pack 0.6.0 ✨ +

15 Jan 2019 | + Release Notes

diff --git a/docs/src/commands/build.md b/docs/src/commands/build.md index 884963b..49b4540 100644 --- a/docs/src/commands/build.md +++ b/docs/src/commands/build.md @@ -5,6 +5,10 @@ interoperability and for publishing a package to npm. This involves compiling your code to wasm and generating a pkg folder. This pkg folder will contain the wasm binary, a JS wrapper file, your `README`, and a `package.json` file. +The `pkg` directory is automatically `.gitignore`d by default, since it contains +build artifacts which are not intended to be checked into version +control.[0](#footnote-0) + ## Path The `wasm-pack build` command can be given an optional path argument, e.g.: @@ -55,7 +59,7 @@ wasm-pack build --target nodejs | Option | Description | |-----------|-----------------------------------------------------------------------------------------------------------------| | `nodejs` | Outputs JS that uses CommonJS modules, for use with a `require` statement. `main` key in `package.json`. | -| `nomodules` | Outputs JS that use no modules. `browser` key in `package.json`. | +| `no-modules` | Outputs JS that use no modules. `browser` key in `package.json`. | | `browser` | Outputs JS that uses ES6 modules, primarily for use with `import` statements and/or bundlers such as `webpack`. `module` key in `package.json`. `sideEffects: false` by default. | ## Scope @@ -85,3 +89,20 @@ wasm-pack build examples/js-hello-world --mode no-install |---------------|------------------------------------------------------------------------------------------| | `no-install` | `wasm-pack init` implicitly and create wasm binding without installing `wasm-bindgen`. | | `normal` | do all the stuffs of `no-install` with installed `wasm-bindgen`. | + +## Extra options + +The `build` command can pass extra options straight to `cargo build` even if they are not +supported in wasm-pack. To use them you should add standalone `--` argument at the very +end of your command, and all the arguments you want to pass to cargo should go after. +For example to build previous example using unstable cargo offline feature: + +``` +wasm-pack build examples/js-hello-world --mode no-install -- -Z offline +``` + +
+ +0 If you need to include additional assets in the pkg +directory and your NPM package, we intend to have a solution for your use case +soon. [↩](#wasm-pack-build) diff --git a/docs/src/commands/pack-and-publish.md b/docs/src/commands/pack-and-publish.md index 849fb3a..0a9a4f7 100644 --- a/docs/src/commands/pack-and-publish.md +++ b/docs/src/commands/pack-and-publish.md @@ -1,9 +1,9 @@ # pack and publish -The `publish` and `pack` commands interact with the pkg directory that's -created when you run `wasm-pack init`. The `pack` command creates a tarball -from the pkg directory and the `publish` command creates a tarball from the -pkg directory __and__ publishes it to the NPM registry. +The `publish` and `pack` commands interact with the pkg directory that's +created when you run `wasm-pack build`. The `pack` command creates a tarball +from the pkg directory and the `publish` command creates a tarball from the +pkg directory __and__ publishes it to the NPM registry. Underneath, these commands use `npm pack` and `npm publish`. You can read more about these in the NPM documentation: @@ -11,8 +11,8 @@ more about these in the NPM documentation: - [`npm pack`](https://docs.npmjs.com/cli/pack) - [`npm publish`](https://docs.npmjs.com/cli/publish) -Both these commands take the path to the pkg directory as the first argument. -You can either set the argument directly to the pkg directory or to the parent +Both these commands take the path to the pkg directory as the first argument. +You can either set the argument directly to the pkg directory or to the parent of the pkg directory: ``` diff --git a/docs/src/commands/test.md b/docs/src/commands/test.md new file mode 100644 index 0000000..52913c0 --- /dev/null +++ b/docs/src/commands/test.md @@ -0,0 +1,84 @@ +# wasm-pack test + +The `wasm-pack test` command wraps the [wasm-bindgen-test-runner](https://rustwasm.github.io/wasm-bindgen/wasm-bindgen-test/index.html) +CLI allowing you to run wasm tests in different browsers without needing to install the different +webdrivers yourself. + +``` +wasm-pack test --help +``` + +## Path + +The `wasm-pack test` command can be given an optional path argument. + +This path should point to a directory that contains a `Cargo.toml` file. If no +path is given, the `test` command will run in the current directory. + +``` +# Run tests for the current directory's crate +wasm-pack test + +# Run tests for a specified crate +wasm-pack test crates/crate-in-my-workspace +``` + +## Profile + +The `test` command accepts an optional profile argument: `--release`. + +If none is supplied, then a debug test build will be used. + +## Test environment + +Choose where to run your tests by passing in any combination of testing environment flags. + +`--headless` is useful for running browser tests in a headless browser as part of a CI process. + +``` +wasm-pack test --node --firefox --chrome --safari --headless +``` + +## Extra options + +The `test` command can pass extra options straight to `cargo test` even if they are not +supported in wasm-pack. + +To use them you should add standalone `--` argument at the very +end of your command, and all the arguments you want to pass to cargo should go after. + +`cargo test -h` for a list of all options that you can pass through. + +## Running only some tests + +When debugging a specific issue, you may find yourself wanting to run a subset of tests, instead of your entire suite of tests. + +Here are a few examples of how to run a subset of your tests: + +``` +# Example directory structure +$ tree crates/foo +├── Cargo.toml +├── README.md +├── src +│   ├── diff +│   │   ├── diff_test_case.rs +│   │   └── mod.rs +│   ├── lib.rs +└── tests + ├── diff_patch.rs +``` + +``` +# Run all tests in tests/diff_patch.rs +wasm-pack test crates/foo --firefox --headless -- --tests diff_patch + +# Run all tests in tests/diff_patch.rs that contain the word "replace" +wasm-pack test crates/foo --firefox --headless -- --tests diff_patch replace + +# Run all tests inside of a `tests` module inside of src/lib/diff.rs +wasm-pack test crates/foo --firefox --headless -- --lib diff::tests + +# Same as the above, but only if they contain the word replace +wasm-pack test crates/foo --firefox --headless -- --lib diff::tests::replace +``` diff --git a/docs/src/prerequisites/index.md b/docs/src/prerequisites/index.md index 6454a69..b56901a 100644 --- a/docs/src/prerequisites/index.md +++ b/docs/src/prerequisites/index.md @@ -2,8 +2,8 @@ To run `wasm-pack` you'll need to have both Rust and npm installed and configured. -- [Rust](./rust.html) -- [npm](./npm.html) +- [Rust](/wasm-pack/book/prerequisites/rust.html) +- [npm](/wasm-pack/book/prerequisites/npm.html) In the future, we intend to rewrite the npm registry client bits so that the need for a Node runtime is eliminated. If you're excited about that work- you should diff --git a/docs/src/tutorial/getting-started.md b/docs/src/tutorial/getting-started.md index 8eee61f..a011e99 100644 --- a/docs/src/tutorial/getting-started.md +++ b/docs/src/tutorial/getting-started.md @@ -25,4 +25,4 @@ further in this guide. ⚠️ If you'd rather not use a template, or are having trouble with the template, you can do a manual setup by following [these instructions]. -[these instructions]: ../project-setup/manual-setup/index.html +[these instructions]: ../project-setup/manual-setup.html diff --git a/docs/src/tutorial/index.md b/docs/src/tutorial/index.md index 21df55c..75637ee 100644 --- a/docs/src/tutorial/index.md +++ b/docs/src/tutorial/index.md @@ -10,8 +10,8 @@ Be sure to have done the following before starting: 1. [Install `wasm-pack`](../../installer) 1. Read and install the [Prerequisites](../prerequisites/index.html). - - You'll need [Rust], version 1.30 or higher. (Currently either `beta` or `nightly` channels). [Learn more](../project-setup/rust.html). - - You'll need [Node.js] and [npm] installed. You'll also need an npm Account. [Learn more](../project-setup/npm.html). + - You'll need [Rust], version 1.30 or higher. (Currently either `beta` or `nightly` channels). [Learn more](../prerequisites/rust.html). + - You'll need [Node.js] and [npm] installed. You'll also need an npm Account. [Learn more](../prerequisites/npm.html). ⚠️ We strongly recommend that you install [Node.js] using a version manager. You can learn more [here](https://npmjs.com/get-npm). diff --git a/docs/src/tutorial/template-deep-dive/cargo-toml.md b/docs/src/tutorial/template-deep-dive/cargo-toml.md index d6af282..3e26a48 100644 --- a/docs/src/tutorial/template-deep-dive/cargo-toml.md +++ b/docs/src/tutorial/template-deep-dive/cargo-toml.md @@ -3,11 +3,11 @@ `Cargo.toml` is the manifest file for Rust's package manager, `cargo`. This file contains metadata such as name, version, and dependencies for packages, which are call "crates" in Rust. -There's a bunch of metadata that the template gives us, but there are 3 key parts to discuss: +There's a bunch of metadata that the template gives us, but there are three key parts to discuss: -- [`crate-type`](#a1-crate-type) -- [`wasm-bindgen` dependency](#a2-wasm-bindgen-dependency) -- [`[features]` and `wee-alloc`, `console-error-panic-hook` dependencies](#a3-features-and-wee-alloc-console-error-panic-hook-dependencies) +1. [`crate-type`](#a1-crate-type) +2. [`wasm-bindgen` dependency](#a2-wasm-bindgen-dependency) +3. [`[features]` and `wee_alloc`, `console_error_panic_hook` dependencies](#a3-features-and-wee_alloc-console_error_panic_hook-dependencies)
@@ -15,7 +15,7 @@ There's a bunch of metadata that the template gives us, but there are 3 key part ```toml [lib] -crate-type = ["cdylib"] +crate-type = ["cdylib", "rlib"] ``` A Rust-`wasm` crate is a bit different from a normal crate, and as a result, we need to note @@ -33,6 +33,9 @@ as a dynamic library to be loaded from another language. In our case, we'll be c `.wasm` file, but this output type will create `*.so` files on Linux, `*.dylib` files on macOS, and `*.dll` files on Windows in non-`wasm` circumstances. +`#[crate_type = "rlib"]` signifies that an intermediate "Rust library" file will be produced. +This allows tests to use the main crate. + You can read more about linking and crate types, [here](https://doc.rust-lang.org/reference/linkage.html). ## 2. `wasm-bindgen` dependency @@ -52,23 +55,24 @@ We'll see more about how to use this library when we discuss what has been gener there is no `^` or `~` symbol- it looks like we're locking to the `0.2` version. However, that's not the case! In Rust, the `^` is implied. -## 3. `[features]` and `wee-alloc`, `console-error-panic-hook` dependencies +## 3. `[features]` and `wee_alloc`, `console_error_panic_hook` dependencies As part of our effort to design a template that helps people discover useful crates -for their particular use case, this template includes 2 dependencies that can be +for their particular use case, this template includes two dependencies that can be very useful for folks developing Rust-`wasm` crates: `console-error-panic-hook` and `wee-alloc`. -Because these dependencies are useful primarily in a specifc portion of the Rust-`wasm` +Because these dependencies are useful primarily in a specific portion of the Rust-`wasm` crate development workflow, we've also set up a bit of glue code that allows us to include -them both as dependences, but allowing for them to be optionally included. +them both as dependencies, but also allows them to be optionally included. ```toml [features] -default-features = ["console_error_panic_hook", "wee_alloc"] +default = ["console_error_panic_hook"] [dependencies] cfg-if = "0.1.2" +wasm-bindgen = "0.2" # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires @@ -79,12 +83,22 @@ console_error_panic_hook = { version = "0.1.1", optional = true } # `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size # compared to the default allocator's ~10K. It is slower than the default # allocator, however. -wee_alloc = { version = "0.4.1", optional = true } +# +# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. +wee_alloc = { version = "0.4.2", optional = true } ``` -[`cfg-if`] allows us to check if certain features are enabled on a rust crate. We'll -use this crate in `utils.rs` to optionally enable `console_error_panic_hook` or -`wee_alloc`. By default, we have them enabled. To disable them, we can remove their -entry from the `default-features` vector. +[`cfg-if`] allows us to check if certain features are enabled on a Rust crate. We'll +use this crate later to optionally enable `console_error_panic_hook` or +`wee_alloc`. + +By default, only `console_error_panic_hook` is enabled. To disable either +feature, we can remove its name from the `default` vector. + +To learn more about these features, we discuss them in-depth in the `src/lib.rs` and +`src/utils.rs` sections. + +Briefly, they include: -To learn more about these features, we discuss them in depth in the `utils.rs` section. ++ **console_error_panic_hook** for logging panic messages to the developer console. ++ **wee_alloc**, an allocator optimized for small code size. diff --git a/docs/src/tutorial/template-deep-dive/src-lib-rs.md b/docs/src/tutorial/template-deep-dive/src-lib-rs.md index 1e31777..e5f72fe 100644 --- a/docs/src/tutorial/template-deep-dive/src-lib-rs.md +++ b/docs/src/tutorial/template-deep-dive/src-lib-rs.md @@ -1,3 +1,127 @@ # src/lib.rs -🚧 COMING SOON 🚧 +`lib.rs` is the template's main source file. The name `lib.rs` commonly implies that this Rust project will be compiled as a library. + +It contains three key parts: + +1. [`#[wasm_bindgen] functions`](#a1-wasm_bindgen-functions) +2. [Crate imports](#a2-crate-imports) +3. [`wee_alloc` optional dependecy](#a3-wee_alloc-optional-dependecy) + - [What is `wee_alloc`?](#what-is-wee_alloc) + +--- + +We'll start with the most important part of `lib.rs` -- the two `#[wasm_bindgen]` functions. In many cases, this is the only part of `lib.rs` you will need to modify. + +## 1. `#[wasm_bindgen]` functions + +The `#[wasm_bindgen]` attribute indicates that the function below it will be accessible both in JavaScript and Rust. + +```rust +#[wasm_bindgen] +extern { + fn alert(s: &str); +} +``` + +The `extern` block imports the external JavaScript function `alert` into Rust. This declaration is required to call `alert` from Rust. By declaring it in this way, `wasm-bindgen` will create JavaScript stubs for `alert` which allow us to pass strings back and forth between Rust and JavaScript. + +We can see that the `alert` function requires a single parameter `s` of type `&str`, a string. In Rust, any string literal such as `"Hello, test-wasm!"` is of type `&str`. So, `alert` could be called by writing `alert("Hello, test-wasm!");`. + +We knew to declare `alert` in this way because it is how we would call `alert` in JavaScript -- by passing it a string argument. + +```rust +#[wasm_bindgen] +pub fn greet() { + alert("Hello, test-wasm!"); +} +``` + +If we were to write the `greet` function without the `#[wasm_bindgen]` attribute, then `greet` would not be easily accessible within JavaScript. Furthermore, we wouldn't be able to natively convert certain types such as `&str` between JavaScript and Rust. So, both the `#[wasm_bindgen]` attribute and the prior import of `alert` allow `greet` to be called from JavaScript. + +This is all you need to know to interface with JavaScript! If you are curious about the rest, read on. + +## 2. Crate imports + +```rust +extern crate cfg_if; +extern crate wasm_bindgen; +``` + +In `Cargo.toml`, we included the crates `cfg_if` and `wasm_bindgen` as project dependencies. + +Here, we explicitly declare that these crates will be used in `lib.rs`. + +```rust +mod utils; +``` +This statement declares a new module named `utils` that is defined by the contents of `utils.rs`. Equivalently, we could place the contents of `utils.rs` inside the `utils` declaration, replacing the line with: + +```rust +mod utils { + // contents of utils.rs +} +``` + +Either way, the contents of `utils.rs` define a single public function `set_panic_hook`. Because we are placing it inside the `utils` module, we will be able to call the function directly by writing `utils::set_panic_hook()`. We will discuss how and why to use this function in `src/utils.rs`. + + +```rust +use cfg_if::cfg_if; +``` + +`use` allows us to conveniently refer to parts of a crate or module. For example, suppose the crate `cfg_if` contains a function `func`. It is always possible to call this function directly by writing `cfg_if::func()`. However, this is often tedious to write. If we first specify `use cfg_if::func;`, then `func` can be called by just writing `func()` instead. + +With this in mind, this `use` allows us to call the macro `cfg_if!` inside the crate `cfg_if` without writing `cfg_if::cfg_if!`. + +```rust +use wasm_bindgen::prelude::*; +``` + +Many modules contain a prelude, a list of things that should be automatically imported. This allows common features of the module to be conveniently accessed without a lengthy prefix. For example, in this file we can use `#[wasm_bindgen]` only because it is brought into scope by the prelude. + +The asterisk at the end of this `use` indicates that everything inside the module `wasm_bindgen::prelude` (i.e. the module `prelude` inside the crate `wasm_bindgen`) can be referred to without prefixing it with `wasm_bindgen::prelude`. + +For example, `#[wasm_bindgen]` could also be written as `#[wasm_bindgen::prelude::wasm_bindgen]`, although this is not recommended. + +## 3. `wee_alloc` optional dependecy + +```rust +cfg_if! { + if #[cfg(feature = "wee_alloc")] { + extern crate wee_alloc; + #[global_allocator] + static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + } +} +``` + +This code block is intended to initialize `wee_alloc` as the global memory allocator, but only if the `wee_alloc` feature is enabled in `Cargo.toml`. + +We immediately notice that `cfg_if!` is a macro because it ends in `!`, similarly to other Rust macros such as `println!` and `vec!`. A macro is directly replaced by other code during compile time. + +During compile time, `cfg_if!` evaluates the `if` statement. This tests whether the feature `wee_alloc` is present in the `[features]` section of `Cargo.toml` (among other possible ways to set it). + +As we saw earlier, the `default` vector in `[features]` only contains `"console_error_panic_hook"` and not `"wee_alloc"`. So, in this case, the `cfg_if!` block will be replaced by no code at all, and hence the default memory allocator will be used instead of `wee_alloc`. + +```rust +extern crate wee_alloc; +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; +``` + +However, suppose `"wee_alloc"` is appended to the `default` vector in `Cargo.toml`. Then, the `cfg_if!` block is instead replaced with the contents of the `if` block, shown above. + +This code sets the `wee_alloc` allocator to be used as the global memory allocator. + +### What is `wee_alloc`? + +Reducing the size of compiled WebAssembly code is important, since it is often transmitted over the Internet or placed on embedded devices. + +> `wee_alloc` is a tiny allocator designed for WebAssembly that has a (pre-compression) code-size footprint of only a single kilobyte. + +[An analysis](http://fitzgeraldnick.com/2018/02/09/wee-alloc.html) suggests that over half of the bare minimum WebAssembly memory footprint is required by Rust's default memory allocator. Yet, WebAssembly code often does not require a sophisticated allocator, since it often just requests a couple of large initial allocations. + +`wee_alloc` trades off size for speed. Although it has a tiny code-size footprint, it is relatively slow if additional allocations are needed. + +For more details, see the [`wee_alloc` repository](https://github.com/rustwasm/wee_alloc). \ No newline at end of file diff --git a/docs/src/tutorial/template-deep-dive/src-utils-rs.md b/docs/src/tutorial/template-deep-dive/src-utils-rs.md index ea0c3c0..0ee271b 100644 --- a/docs/src/tutorial/template-deep-dive/src-utils-rs.md +++ b/docs/src/tutorial/template-deep-dive/src-utils-rs.md @@ -1,3 +1,66 @@ # src/utils.rs -🚧 COMING SOON 🚧 +The purpose of `utils.rs` is to define the `utils` module, which contains a single function `set_panic_hook`. This function becomes part of the `utils` module in `lib.rs`, as described in the preceding section. + +If the `console_error_panic_hook` feature is not enabled, then `set_panic_hook` is defined to be an inlined empty function. So, there is no run-time performance or code-size penalty incurred by its use. + +We will discuss: +1. [Defining `set_panic_hook`](#a1-defining-set_panic_hook) +2. [What is `console_error_panic_hook`?](#a2-what-is-console_error_panic_hook) + + +--- + +## 1. Defining `set_panic_hook` + +```rust +use cfg_if::cfg_if; +``` + +This allows us to write `cfg_if!` instead of `cfg_if::cfg_if!`, identically to the line in `src/lib.rs`. + +```rust +cfg_if! { + if #[cfg(feature = "console_error_panic_hook")] { + extern crate console_error_panic_hook; + pub use self::console_error_panic_hook::set_once as set_panic_hook; + } else { + #[inline] + pub fn set_panic_hook() {} + } +} +``` + +As described in the preceding section, the macro `cfg_if!` evaluates the `if` statement during compile time. This is possible because it is essentially testing whether `"console_error_panic_hook"` is defined in the `[features]` section of `Cargo.toml`, which is available during compile time. + +The entire macro block will either be replaced with the statements in the `if` block or with those in the `else` block. These two cases are now described in turn: + +```rust +extern crate console_error_panic_hook; +pub use self::console_error_panic_hook::set_once as set_panic_hook; +``` + +Due to the `use` statement, the function `self::console_error_panic_hook::set_once` can now be accessed more conveniently as `set_panic_hook`. Due to `pub`, this function will be publicly accessible outside of the `utils` module as `utils::set_panic_hook`. + +```rust +#[inline] +pub fn set_panic_hook() {} +``` + +An inline function replaces the function call with the contents of the function during compile time. Here, `set_panic_hook` is defined to be an empty inline function. This allows the use of `set_panic_hook` without any run-time or code-size performance penalty if the feature is not enabled. + +## 2. What is `console_error_panic_hook`? + +The crate `console_error_panic_hook` enhances error messages in the web browser. This allows you to easily debug WebAssembly code. + +Let's compare error messages before and after enabling the feature: + +**Before:** `"RuntimeError: Unreachable executed"` + +**After:** `"panicked at 'index out of bounds: the len is 3 but the index is 4', libcore/slice/mod.rs:2046:10"` + +To do this, a panic hook for WebAssembly is provided that logs panics to the developer console via the JavaScript `console.error` function. + +Note that although the template sets up the function, your error messages will not automatically be enhanced. To enable the enhanced errors, call the function `utils::set_panic_hook()` in `lib.rs` when your code first runs. The function may be called multiple times if needed. + +For more details, see the [`console_error_panic_hook` repository](https://github.com/rustwasm/console_error_panic_hook). diff --git a/src/bindgen.rs b/src/bindgen.rs index 8282f6b..3bc2946 100644 --- a/src/bindgen.rs +++ b/src/bindgen.rs @@ -1,13 +1,15 @@ //! Functionality related to installing and running `wasm-bindgen`. -use binaries::{Cache, Download}; +use binary_install::{Cache, Download}; use child; use command::build::BuildProfile; use emoji; use failure::{self, ResultExt}; +use log::debug; +use log::{info, warn}; use manifest::CrateData; use progressbar::Step; -use slog::Logger; +use std::env; use std::fs; use std::path::{Path, PathBuf}; use std::process::Command; @@ -26,7 +28,6 @@ pub fn install_wasm_bindgen( version: &str, install_permitted: bool, step: &Step, - log: &Logger, ) -> Result { // If `wasm-bindgen` is installed globally and it has the right version, use // that. Assume that other tools are installed next to it. @@ -34,12 +35,8 @@ pub fn install_wasm_bindgen( // This situation can arise if `wasm-bindgen` is already installed via // `cargo install`, for example. if let Ok(path) = which("wasm-bindgen") { - debug!( - log, - "found global wasm-bindgen binary at: {}", - path.display() - ); - if wasm_bindgen_version_check(&path, version, log) { + debug!("found global wasm-bindgen binary at: {}", path.display()); + if wasm_bindgen_version_check(&path, version) { return Ok(Download::at(path.parent().unwrap())); } } @@ -52,14 +49,13 @@ pub fn install_wasm_bindgen( Ok(dl) => return Ok(dl), Err(e) => { warn!( - log, "could not download pre-built `wasm-bindgen`: {}. Falling back to `cargo install`.", e ); } } - cargo_install_wasm_bindgen(log, &cache, version, install_permitted) + cargo_install_wasm_bindgen(&cache, version, install_permitted) } /// Downloads a precompiled copy of wasm-bindgen, if available. @@ -102,14 +98,23 @@ fn prebuilt_url(version: &str) -> Option { /// Use `cargo install` to install the `wasm-bindgen` CLI locally into the given /// crate. pub fn cargo_install_wasm_bindgen( - logger: &Logger, cache: &Cache, version: &str, install_permitted: bool, ) -> Result { + debug!( + "Attempting to use a `cargo install`ed version of `wasm-bindgen={}`", + version + ); + let dirname = format!("wasm-bindgen-cargo-install-{}", version); let destination = cache.join(dirname.as_ref()); if destination.exists() { + debug!( + "`cargo install`ed `wasm-bindgen={}` already exists at {}", + version, + destination.display() + ); return Ok(Download::at(&destination)); } @@ -121,7 +126,12 @@ pub fn cargo_install_wasm_bindgen( // and ensure we don't accidentally use stale files in the future let tmp = cache.join(format!(".{}", dirname).as_ref()); drop(fs::remove_dir_all(&tmp)); - fs::create_dir_all(&tmp)?; + debug!( + "cargo installing wasm-bindgen to tempdir: {}", + tmp.display() + ); + fs::create_dir_all(&tmp) + .context("failed to create temp dir for `cargo install wasm-bindgen`")?; let mut cmd = Command::new("cargo"); cmd.arg("install") @@ -132,9 +142,30 @@ pub fn cargo_install_wasm_bindgen( .arg("--root") .arg(&tmp); - child::run(logger, cmd, "cargo install").context("Installing wasm-bindgen with cargo")?; + child::run(cmd, "cargo install").context("Installing wasm-bindgen with cargo")?; + + // `cargo install` will put the installed binaries in `$root/bin/*`, but we + // just want them in `$root/*` directly (which matches how the tarballs are + // laid out, and where the rest of our code expects them to be). So we do a + // little renaming here. + for f in ["wasm-bindgen", "wasm-bindgen-test-runner"].iter().cloned() { + let from = tmp + .join("bin") + .join(f) + .with_extension(env::consts::EXE_EXTENSION); + let to = tmp.join(from.file_name().unwrap()); + fs::rename(&from, &to).with_context(|_| { + format!( + "failed to move {} to {} for `cargo install`ed `wasm-bindgen`", + from.display(), + to.display() + ) + })?; + } + // Finally, move the `tmp` directory into our binary cache. fs::rename(&tmp, &destination)?; + Ok(Download::at(&destination)) } @@ -148,7 +179,6 @@ pub fn wasm_bindgen_build( target: &str, profile: BuildProfile, step: &Step, - log: &Logger, ) -> Result<(), failure::Error> { let msg = format!("{}Running WASM-bindgen...", emoji::RUNNER); PBAR.step(step, &msg); @@ -177,7 +207,7 @@ pub fn wasm_bindgen_build( "no-modules" => "--no-modules", _ => "--browser", }; - let bindgen_path = bindgen.binary("wasm-bindgen"); + let bindgen_path = bindgen.binary("wasm-bindgen")?; let mut cmd = Command::new(bindgen_path); cmd.arg(&wasm_path) .arg("--out-dir") @@ -196,15 +226,15 @@ pub fn wasm_bindgen_build( cmd.arg("--keep-debug"); } - child::run(log, cmd, "wasm-bindgen").context("Running the wasm-bindgen CLI")?; + child::run(cmd, "wasm-bindgen").context("Running the wasm-bindgen CLI")?; Ok(()) } /// Check if the `wasm-bindgen` dependency is locally satisfied. -fn wasm_bindgen_version_check(bindgen_path: &PathBuf, dep_version: &str, log: &Logger) -> bool { +fn wasm_bindgen_version_check(bindgen_path: &PathBuf, dep_version: &str) -> bool { let mut cmd = Command::new(bindgen_path); cmd.arg("--version"); - child::run(log, cmd, "wasm-bindgen") + child::run(cmd, "wasm-bindgen") .map(|stdout| { stdout .trim() @@ -212,10 +242,8 @@ fn wasm_bindgen_version_check(bindgen_path: &PathBuf, dep_version: &str, log: &L .nth(1) .map(|v| { info!( - log, "Checking installed `wasm-bindgen` version == expected version: {} == {}", - v, - dep_version + v, dep_version ); v == dep_version }) diff --git a/src/build.rs b/src/build.rs index 3a0da67..804892b 100644 --- a/src/build.rs +++ b/src/build.rs @@ -5,9 +5,6 @@ use command::build::BuildProfile; use emoji; use failure::{Error, ResultExt}; use progressbar::Step; -use slog::Logger; -use std::fs::File; -use std::io::Write; use std::path::Path; use std::process::Command; use std::str; @@ -29,7 +26,7 @@ pub fn check_rustc_version(step: &Step) -> Result { } else { Ok(mv.to_string()) } - }, + } None => bail!("We can't figure out what your Rust version is- which means you might not have Rust installed. Please install Rust version 1.30.0 or higher."), } } @@ -55,7 +52,7 @@ fn rustc_minor_version() -> Option { /// Ensure that `rustup` has the `wasm32-unknown-unknown` target installed for /// current toolchain -pub fn rustup_add_wasm_target(log: &Logger, step: &Step) -> Result<(), Error> { +pub fn rustup_add_wasm_target(step: &Step) -> Result<(), Error> { let msg = format!("{}Adding WASM target...", emoji::TARGET); PBAR.step(step, &msg); @@ -80,17 +77,16 @@ pub fn rustup_add_wasm_target(log: &Logger, step: &Step) -> Result<(), Error> { // If not, using rustup to add it. let mut cmd = Command::new("rustup"); cmd.arg("target").arg("add").arg("wasm32-unknown-unknown"); - child::run(log, cmd, "rustup") - .context("Adding the wasm32-unknown-unknown target with rustup")?; + child::run(cmd, "rustup").context("Adding the wasm32-unknown-unknown target with rustup")?; Ok(()) } /// Run `cargo build` targetting `wasm32-unknown-unknown`. pub fn cargo_build_wasm( - log: &Logger, path: &Path, profile: BuildProfile, step: &Step, + extra_options: &Vec, ) -> Result<(), Error> { let msg = format!("{}Compiling to WASM...", emoji::CYCLONE); PBAR.step(step, &msg); @@ -114,18 +110,22 @@ pub fn cargo_build_wasm( } } cmd.arg("--target").arg("wasm32-unknown-unknown"); - child::run(log, cmd, "cargo build").context("Compiling your crate to WebAssembly failed")?; + cmd.args(extra_options); + child::run(cmd, "cargo build").context("Compiling your crate to WebAssembly failed")?; Ok(()) } /// Run `cargo build --tests` targetting `wasm32-unknown-unknown`. -pub fn cargo_build_wasm_tests(log: &Logger, path: &Path, debug: bool) -> Result<(), Error> { +/// +/// This generates the `Cargo.lock` file that we use in order to know which version of +/// wasm-bindgen-cli to use when running tests. +pub fn cargo_build_wasm_tests(path: &Path, debug: bool) -> Result<(), Error> { let mut cmd = Command::new("cargo"); cmd.current_dir(path).arg("build").arg("--tests"); if !debug { cmd.arg("--release"); } cmd.arg("--target").arg("wasm32-unknown-unknown"); - child::run(log, cmd, "cargo build").context("Compilation of your program failed")?; + child::run(cmd, "cargo build").context("Compilation of your program failed")?; Ok(()) } diff --git a/src/cache.rs b/src/cache.rs new file mode 100644 index 0000000..4e3c2d0 --- /dev/null +++ b/src/cache.rs @@ -0,0 +1,14 @@ +//! Getting and configuring wasm-pack's binary cache. + +use binary_install::Cache; +use std::env; +use std::path::Path; + +/// Get wasm-pack's binary cache. +pub fn get_wasm_pack_cache() -> Result { + if let Ok(path) = env::var("WASM_PACK_CACHE") { + Ok(Cache::at(Path::new(&path))) + } else { + Cache::new("wasm-pack") + } +} diff --git a/src/child.rs b/src/child.rs index e312c20..6558ebd 100644 --- a/src/child.rs +++ b/src/child.rs @@ -4,10 +4,12 @@ //! properly logged and their output is logged as well. use failure::Error; -use slog::Logger; +use log::info; use std::{ io::{self, Read}, - mem, process, string, + mem, + process::{Command, Stdio}, + string, sync::mpsc, thread, }; @@ -19,6 +21,22 @@ enum OutputFragment { Stderr(Vec), } +/// Return a new Command object +pub fn new_command(program: &str) -> Command { + // On Windows, initializes launching as `cmd /c `. + // Initializing only with `Command::new("npm")` will launch + // `npm` with quotes, `"npm"`, causing a run-time error on Windows. + // See rustc: #42436, #42791, #44542 + + if cfg!(windows) { + let mut cmd = Command::new("cmd"); + cmd.arg("/c").arg(program); + cmd + } else { + Command::new(program) + } +} + /// Read data from the give reader and send it as an `OutputFragment` over the /// given sender. fn read_and_send( @@ -115,16 +133,12 @@ where } /// Run the given command and return its stdout. -pub fn run( - logger: &Logger, - mut command: process::Command, - command_name: &str, -) -> Result { - info!(logger, "Running {:?}", command); +pub fn run(mut command: Command, command_name: &str) -> Result { + info!("Running {:?}", command); let mut child = command - .stdout(process::Stdio::piped()) - .stderr(process::Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) .spawn()?; let stdout = child.stdout.take().unwrap(); @@ -144,11 +158,11 @@ pub fn run( thread::spawn(move || read_and_send(stderr, stderr_send, OutputFragment::Stderr)); let mut stdout = OutputAccumulator::new(|line| { - info!(logger, "{} (stdout): {}", command_name, line); + info!("{} (stdout): {}", command_name, line); PBAR.message(line) }); let mut stderr = OutputAccumulator::new(|line| { - info!(logger, "{} (stderr): {}", command_name, line); + info!("{} (stderr): {}", command_name, line); PBAR.message(line) }); diff --git a/src/command/build.rs b/src/command/build.rs index d3dc15f..e683030 100644 --- a/src/command/build.rs +++ b/src/command/build.rs @@ -1,23 +1,25 @@ //! Implementation of the `wasm-pack build` command. -use binaries::{Cache, Download}; +use binary_install::{Cache, Download}; use bindgen; use build; +use cache; use command::utils::{create_pkg_dir, set_crate_path}; use emoji; use failure::Error; use indicatif::HumanDuration; +use license; use lockfile::Lockfile; +use log::info; use manifest; use progressbar::Step; use readme; -use slog::Logger; use std::path::PathBuf; use std::str::FromStr; use std::time::Instant; use PBAR; -/// Everything required to configure and run the `wasm-pack init` command. +/// Everything required to configure and run the `wasm-pack build` command. #[allow(missing_docs)] pub struct Build { pub crate_path: PathBuf, @@ -30,6 +32,7 @@ pub struct Build { pub out_dir: PathBuf, pub bindgen: Option, pub cache: Cache, + pub extra_options: Vec, } /// The `BuildMode` determines which mode of initialization we are running, and @@ -87,7 +90,7 @@ pub struct BuildOptions { pub scope: Option, #[structopt(long = "mode", short = "m", default_value = "normal")] - /// Sets steps to be run. [possible values: no-install, normal] + /// Sets steps to be run. [possible values: no-install, normal, force] pub mode: BuildMode, #[structopt(long = "no-typescript")] @@ -101,27 +104,49 @@ 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, + + #[structopt(last = true)] + /// List of extra options to pass to `cargo build` + pub extra_options: Vec, +} + +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(), + extra_options: Vec::new(), + } + } } -type BuildStep = fn(&mut Build, &Step, &Logger) -> Result<(), Error>; +type BuildStep = fn(&mut Build, &Step) -> Result<(), Error>; impl Build { /// Construct a build command from the given options. @@ -140,6 +165,12 @@ impl Build { _ => bail!("Can only supply one of the --dev, --release, or --profiling flags"), }; + // `possible_values` in clap isn't supported by `structopt` + let possible_targets = ["browser", "nodejs", "no-modules"]; + if !possible_targets.contains(&build_opts.target.as_str()) { + bail!("Supported targets: browser, nodejs, no-modules"); + } + Ok(Build { crate_path, crate_data, @@ -150,7 +181,8 @@ impl Build { mode: build_opts.mode, out_dir, bindgen: None, - cache: Cache::new()?, + cache: cache::get_wasm_pack_cache()?, + extra_options: build_opts.extra_options, }) } @@ -160,7 +192,7 @@ impl Build { } /// Execute this `Build` command. - pub fn run(&mut self, log: &Logger) -> Result<(), Error> { + pub fn run(&mut self) -> Result<(), Error> { let process_steps = Build::get_process_steps(&self.mode); let mut step_counter = Step::new(process_steps.len()); @@ -168,23 +200,23 @@ impl Build { let started = Instant::now(); for (_, process_step) in process_steps { - process_step(self, &step_counter, log)?; + process_step(self, &step_counter)?; step_counter.inc(); } let duration = HumanDuration(started.elapsed()); - info!(&log, "Done in {}.", &duration); + info!("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(()) } @@ -207,58 +239,60 @@ impl Build { step_add_wasm_target, step_build_wasm, step_create_dir, - step_create_json, step_copy_readme, + step_copy_license, step_install_wasm_bindgen, step_run_wasm_bindgen, + step_create_json, ], BuildMode::Noinstall => steps![ step_check_rustc_version, step_check_crate_config, step_build_wasm, step_create_dir, - step_create_json, step_copy_readme, - step_run_wasm_bindgen + step_copy_license, + step_run_wasm_bindgen, + step_create_json, ], BuildMode::Force => steps![ step_build_wasm, step_create_dir, - step_create_json, step_copy_readme, - step_run_wasm_bindgen + step_copy_license, + step_run_wasm_bindgen, + step_create_json, ], } } - fn step_check_rustc_version(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Checking rustc version..."); + fn step_check_rustc_version(&mut self, step: &Step) -> Result<(), Error> { + info!("Checking rustc version..."); let version = build::check_rustc_version(step)?; let msg = format!("rustc version is {}.", version); - info!(&log, "{}", &msg); + info!("{}", &msg); Ok(()) } - fn step_check_crate_config(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Checking crate configuration..."); + fn step_check_crate_config(&mut self, step: &Step) -> Result<(), Error> { + info!("Checking crate configuration..."); self.crate_data.check_crate_config(step)?; - info!(&log, "Crate is correctly configured."); + info!("Crate is correctly configured."); Ok(()) } - fn step_add_wasm_target(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Adding wasm-target..."); - build::rustup_add_wasm_target(log, step)?; - info!(&log, "Adding wasm-target was successful."); + fn step_add_wasm_target(&mut self, step: &Step) -> Result<(), Error> { + info!("Adding wasm-target..."); + build::rustup_add_wasm_target(step)?; + info!("Adding wasm-target was successful."); Ok(()) } - fn step_build_wasm(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Building wasm..."); - build::cargo_build_wasm(log, &self.crate_path, self.profile, step)?; + fn step_build_wasm(&mut self, step: &Step) -> Result<(), Error> { + info!("Building wasm..."); + build::cargo_build_wasm(&self.crate_path, self.profile, step, &self.extra_options)?; info!( - &log, "wasm built at {:#?}.", &self .crate_path @@ -269,15 +303,15 @@ impl Build { Ok(()) } - fn step_create_dir(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Creating a pkg directory..."); + fn step_create_dir(&mut self, step: &Step) -> Result<(), Error> { + info!("Creating a pkg directory..."); create_pkg_dir(&self.out_dir, step)?; - info!(&log, "Created a pkg directory at {:#?}.", &self.crate_path); + info!("Created a pkg directory at {:#?}.", &self.crate_path); Ok(()) } - fn step_create_json(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Writing a package.json..."); + fn step_create_json(&mut self, step: &Step) -> Result<(), Error> { + info!("Writing a package.json..."); self.crate_data.write_package_json( &self.out_dir, &self.scope, @@ -286,44 +320,45 @@ impl Build { step, )?; info!( - &log, "Wrote a package.json at {:#?}.", &self.out_dir.join("package.json") ); Ok(()) } - fn step_copy_readme(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Copying readme from crate..."); + fn step_copy_readme(&mut self, step: &Step) -> Result<(), Error> { + info!("Copying readme from crate..."); readme::copy_from_crate(&self.crate_path, &self.out_dir, step)?; - info!(&log, "Copied readme from crate to {:#?}.", &self.out_dir); + info!("Copied readme from crate to {:#?}.", &self.out_dir); Ok(()) } - fn step_install_wasm_bindgen(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Identifying wasm-bindgen dependency..."); + fn step_copy_license(&mut self, step: &Step) -> Result<(), failure::Error> { + info!("Copying license from crate..."); + license::copy_from_crate(&self.crate_data, &self.crate_path, &self.out_dir, step)?; + info!("Copied license from crate to {:#?}.", &self.out_dir); + Ok(()) + } + + fn step_install_wasm_bindgen(&mut self, step: &Step) -> Result<(), failure::Error> { + info!("Identifying wasm-bindgen dependency..."); let lockfile = Lockfile::new(&self.crate_data)?; let bindgen_version = lockfile.require_wasm_bindgen()?; - info!(&log, "Installing wasm-bindgen-cli..."); + info!("Installing wasm-bindgen-cli..."); let install_permitted = match self.mode { BuildMode::Normal => true, BuildMode::Force => true, BuildMode::Noinstall => false, }; - let bindgen = bindgen::install_wasm_bindgen( - &self.cache, - &bindgen_version, - install_permitted, - step, - log, - )?; + let bindgen = + bindgen::install_wasm_bindgen(&self.cache, &bindgen_version, install_permitted, step)?; self.bindgen = Some(bindgen); - info!(&log, "Installing wasm-bindgen-cli was successful."); + info!("Installing wasm-bindgen-cli was successful."); Ok(()) } - fn step_run_wasm_bindgen(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Building the wasm bindings..."); + fn step_run_wasm_bindgen(&mut self, step: &Step) -> Result<(), Error> { + info!("Building the wasm bindings..."); bindgen::wasm_bindgen_build( &self.crate_data, self.bindgen.as_ref().unwrap(), @@ -332,9 +367,8 @@ impl Build { &self.target, self.profile, step, - log, )?; - info!(&log, "wasm bindings were built at {:#?}.", &self.out_dir); + info!("wasm bindings were built at {:#?}.", &self.out_dir); Ok(()) } } diff --git a/src/command/login.rs b/src/command/login.rs index a660cb9..0ee09c3 100644 --- a/src/command/login.rs +++ b/src/command/login.rs @@ -1,5 +1,5 @@ +use log::info; use npm; -use slog::Logger; use std::result; use PBAR; @@ -8,22 +8,17 @@ pub fn login( scope: Option, always_auth: bool, auth_type: Option, - log: &Logger, ) -> result::Result<(), failure::Error> { let registry = registry.unwrap_or(npm::DEFAULT_NPM_REGISTRY.to_string()); - info!(&log, "Logging in to npm..."); + info!("Logging in to npm..."); info!( - &log, "Scope: {:?} Registry: {}, Always Auth: {}, Auth Type: {:?}.", - &scope, - ®istry, - always_auth, - &auth_type + &scope, ®istry, always_auth, &auth_type ); - info!(&log, "npm info located in the npm debug log"); - npm::npm_login(log, ®istry, &scope, always_auth, &auth_type)?; - info!(&log, "Logged you in!"); + info!("npm info located in the npm debug log"); + npm::npm_login(®istry, &scope, always_auth, &auth_type)?; + info!("Logged you in!"); PBAR.message(&format!("👋 logged you in!")); Ok(()) diff --git a/src/command/mod.rs b/src/command/mod.rs index 0b186c0..c239b09 100644 --- a/src/command/mod.rs +++ b/src/command/mod.rs @@ -14,7 +14,7 @@ use self::pack::pack; use self::publish::{access::Access, publish}; use self::test::{Test, TestOptions}; use failure::Error; -use slog::Logger; +use log::info; use std::path::PathBuf; use std::result; @@ -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, @@ -46,7 +50,7 @@ pub enum Command { }, #[structopt(name = "login", alias = "adduser", alias = "add-user")] - /// 👤 Add a registry user account! (aliases: adduser, add-user) + /// 👤 Add an npm registry user account! (aliases: adduser, add-user) Login { #[structopt(long = "registry", short = "r")] /// Default: 'https://registry.npmjs.org/'. @@ -83,23 +87,27 @@ pub enum Command { } /// Run a command with the given logger! -pub fn run_wasm_pack(command: Command, log: &Logger) -> result::Result<(), Error> { +pub fn run_wasm_pack(command: Command) -> 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::Build(build_opts) => { - info!(&log, "Running build command..."); - Build::try_from_opts(build_opts).and_then(|mut b| b.run(&log)) + info!("Running build command..."); + Build::try_from_opts(build_opts).and_then(|mut b| b.run()) } Command::Pack { path } => { - info!(&log, "Running pack command..."); - info!(&log, "Path: {:?}", &path); - pack(path, &log) + info!("Running pack command..."); + info!("Path: {:?}", &path); + pack(path) } - Command::Publish { path, access } => { - info!(&log, "Running publish command..."); - info!(&log, "Path: {:?}", &path); - publish(path, access, &log) + Command::Publish { + target, + path, + access, + } => { + info!("Running publish command..."); + info!("Path: {:?}", &path); + publish(target, path, access) } Command::Login { registry, @@ -107,20 +115,16 @@ pub fn run_wasm_pack(command: Command, log: &Logger) -> result::Result<(), Error always_auth, auth_type, } => { - info!(&log, "Running login command..."); + info!("Running login command..."); info!( - &log, "Registry: {:?}, Scope: {:?}, Always Auth: {}, Auth Type: {:?}", - ®istry, - &scope, - &always_auth, - &auth_type + ®istry, &scope, &always_auth, &auth_type ); - login(registry, scope, always_auth, auth_type, &log) + login(registry, scope, always_auth, auth_type) } Command::Test(test_opts) => { - info!(&log, "Running test command..."); - Test::try_from_opts(test_opts).and_then(|t| t.run(&log)) + info!("Running test command..."); + Test::try_from_opts(test_opts).and_then(|t| t.run()) } }; diff --git a/src/command/pack.rs b/src/command/pack.rs index d9f7055..5ede602 100644 --- a/src/command/pack.rs +++ b/src/command/pack.rs @@ -1,17 +1,17 @@ use command::utils::{find_pkg_directory, set_crate_path}; use failure::Error; +use log::info; use npm; -use slog::Logger; use std::path::PathBuf; use std::result; use PBAR; /// Executes the 'npm pack' command on the 'pkg' directory /// which creates a tarball that can be published to the NPM registry -pub fn pack(path: Option, log: &Logger) -> result::Result<(), Error> { +pub fn pack(path: Option) -> result::Result<(), Error> { let crate_path = set_crate_path(path)?; - info!(&log, "Packing up the npm package..."); + info!("Packing up the npm package..."); 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 {:#?}", @@ -19,12 +19,8 @@ pub fn pack(path: Option, log: &Logger) -> result::Result<(), Error> { &crate_path ) })?; - npm::npm_pack(log, &pkg_directory.to_string_lossy())?; - info!( - &log, - "Your package is located at {:#?}", - crate_path.join("pkg") - ); + npm::npm_pack(&pkg_directory.to_string_lossy())?; + info!("Your package is located at {:#?}", crate_path.join("pkg")); PBAR.message("🎒 packed up your package!"); Ok(()) diff --git a/src/command/publish/mod.rs b/src/command/publish/mod.rs index 8b2c564..568104b 100644 --- a/src/command/publish/mod.rs +++ b/src/command/publish/mod.rs @@ -2,10 +2,12 @@ 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 log::info; use npm; -use slog::Logger; use std::path::PathBuf; use std::result; use PBAR; @@ -13,24 +15,65 @@ 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, ) -> 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"); - 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 - ) - })?; + info!("Publishing the npm package..."); + info!("npm info located in the npm debug log"); - npm::npm_publish(log, &pkg_directory.to_string_lossy(), access)?; - info!(&log, "Published your package!"); + 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()) + .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(&pkg_directory.to_string_lossy(), access)?; + info!("Published your package!"); PBAR.message("💥 published your package!"); Ok(()) diff --git a/src/command/test.rs b/src/command/test.rs index 92633dd..f07d4a9 100644 --- a/src/command/test.rs +++ b/src/command/test.rs @@ -1,18 +1,19 @@ //! Implementation of the `wasm-pack test` command. use super::build::BuildMode; -use binaries::Cache; +use binary_install::Cache; use bindgen; use build; +use cache; use command::utils::set_crate_path; use console::style; use emoji; use failure::Error; use indicatif::HumanDuration; use lockfile::Lockfile; +use log::info; use manifest; use progressbar::Step; -use slog::Logger; use std::path::PathBuf; use std::time::Instant; use test::{self, webdriver}; @@ -77,6 +78,10 @@ pub struct TestOptions { #[structopt(long = "release", short = "r")] /// Build with the release profile. pub release: bool, + + #[structopt(last = true)] + /// List of extra options to pass to `cargo test` + pub extra_options: Vec, } /// A configured `wasm-pack test` command. @@ -95,9 +100,10 @@ pub struct Test { headless: bool, release: bool, test_runner_path: Option, + extra_options: Vec, } -type TestStep = fn(&mut Test, &Step, &Logger) -> Result<(), Error>; +type TestStep = fn(&mut Test, &Step) -> Result<(), Error>; impl Test { /// Construct a test command from the given options. @@ -114,6 +120,7 @@ impl Test { geckodriver, safari, safaridriver, + extra_options, } = test_opts; let crate_path = set_crate_path(path)?; @@ -132,7 +139,7 @@ impl Test { } Ok(Test { - cache: Cache::new()?, + cache: cache::get_wasm_pack_cache()?, crate_path, crate_data, node, @@ -146,6 +153,7 @@ impl Test { headless, release, test_runner_path: None, + extra_options, }) } @@ -155,17 +163,17 @@ impl Test { } /// Execute this test command. - pub fn run(mut self, log: &Logger) -> Result<(), Error> { + pub fn run(mut self) -> Result<(), Error> { let process_steps = self.get_process_steps(); let mut step_counter = Step::new(process_steps.len()); let started = Instant::now(); for (_, process_step) in process_steps { - process_step(&mut self, &step_counter, log)?; + process_step(&mut self, &step_counter)?; step_counter.inc(); } let duration = HumanDuration(started.elapsed()); - info!(&log, "Done in {}.", &duration); + info!("Done in {}.", &duration); Ok(()) } @@ -225,34 +233,34 @@ impl Test { } } - fn step_check_rustc_version(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(log, "Checking rustc version..."); + fn step_check_rustc_version(&mut self, step: &Step) -> Result<(), Error> { + info!("Checking rustc version..."); let _ = build::check_rustc_version(step)?; - info!(log, "Rustc version is correct."); + info!("Rustc version is correct."); Ok(()) } - fn step_add_wasm_target(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Adding wasm-target..."); - build::rustup_add_wasm_target(log, step)?; - info!(&log, "Adding wasm-target was successful."); + fn step_add_wasm_target(&mut self, step: &Step) -> Result<(), Error> { + info!("Adding wasm-target..."); + build::rustup_add_wasm_target(step)?; + info!("Adding wasm-target was successful."); Ok(()) } - fn step_build_tests(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(log, "Compiling tests to wasm..."); + fn step_build_tests(&mut self, step: &Step) -> Result<(), Error> { + info!("Compiling tests to wasm..."); let msg = format!("{}Compiling tests to WASM...", emoji::CYCLONE); PBAR.step(step, &msg); - build::cargo_build_wasm_tests(log, &self.crate_path, !self.release)?; + build::cargo_build_wasm_tests(&self.crate_path, !self.release)?; - info!(log, "Finished compiling tests to wasm."); + info!("Finished compiling tests to wasm."); Ok(()) } - fn step_install_wasm_bindgen(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { - info!(&log, "Identifying wasm-bindgen dependency..."); + fn step_install_wasm_bindgen(&mut self, step: &Step) -> Result<(), Error> { + info!("Identifying wasm-bindgen dependency..."); let lockfile = Lockfile::new(&self.crate_data)?; let bindgen_version = lockfile.require_wasm_bindgen()?; @@ -272,51 +280,46 @@ impl Test { let install_permitted = match self.mode { BuildMode::Normal => { - info!(&log, "Ensuring wasm-bindgen-cli is installed..."); + info!("Ensuring wasm-bindgen-cli is installed..."); true } BuildMode::Force => { - info!(&log, "Ensuring wasm-bindgen-cli is installed..."); + info!("Ensuring wasm-bindgen-cli is installed..."); true } BuildMode::Noinstall => { - info!(&log, "Searching for existing wasm-bindgen-cli install..."); + info!("Searching for existing wasm-bindgen-cli install..."); false } }; - let dl = bindgen::install_wasm_bindgen( - &self.cache, - &bindgen_version, - install_permitted, - step, - log, - )?; + let dl = + bindgen::install_wasm_bindgen(&self.cache, &bindgen_version, install_permitted, step)?; - self.test_runner_path = Some(dl.binary("wasm-bindgen-test-runner")); + self.test_runner_path = Some(dl.binary("wasm-bindgen-test-runner")?); - info!(&log, "Getting wasm-bindgen-cli was successful."); + info!("Getting wasm-bindgen-cli was successful."); Ok(()) } - fn step_test_node(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { + fn step_test_node(&mut self, step: &Step) -> Result<(), Error> { assert!(self.node); - info!(log, "Running tests in node..."); + info!("Running tests in node..."); PBAR.step(step, "Running tests in node..."); test::cargo_test_wasm( &self.crate_path, self.release, - log, Some(( "CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER", &self.test_runner_path.as_ref().unwrap(), )), + &self.extra_options, )?; - info!(log, "Finished running tests in node."); + info!("Finished running tests in node."); Ok(()) } - fn step_get_chromedriver(&mut self, step: &Step, _log: &Logger) -> Result<(), Error> { + fn step_get_chromedriver(&mut self, step: &Step) -> Result<(), Error> { PBAR.step(step, "Getting chromedriver..."); assert!(self.chrome && self.chromedriver.is_none()); @@ -327,14 +330,14 @@ impl Test { Ok(()) } - fn step_test_chrome(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { + fn step_test_chrome(&mut self, step: &Step) -> Result<(), Error> { PBAR.step(step, "Running tests in Chrome..."); let chromedriver = self.chromedriver.as_ref().unwrap().display().to_string(); let chromedriver = chromedriver.as_str(); info!( - log, - "Running tests in Chrome with chromedriver at {}", chromedriver + "Running tests in Chrome with chromedriver at {}", + chromedriver ); let test_runner = self @@ -344,7 +347,7 @@ impl Test { .display() .to_string(); let test_runner = test_runner.as_str(); - info!(log, "Using wasm-bindgen test runner at {}", test_runner); + info!("Using wasm-bindgen test runner at {}", test_runner); let mut envs = vec![ ("CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER", test_runner), @@ -354,11 +357,11 @@ impl Test { envs.push(("NO_HEADLESS", "1")); } - test::cargo_test_wasm(&self.crate_path, self.release, log, envs)?; + test::cargo_test_wasm(&self.crate_path, self.release, envs, &self.extra_options)?; Ok(()) } - fn step_get_geckodriver(&mut self, step: &Step, _log: &Logger) -> Result<(), Error> { + fn step_get_geckodriver(&mut self, step: &Step) -> Result<(), Error> { PBAR.step(step, "Getting geckodriver..."); assert!(self.firefox && self.geckodriver.is_none()); @@ -369,14 +372,14 @@ impl Test { Ok(()) } - fn step_test_firefox(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { + fn step_test_firefox(&mut self, step: &Step) -> Result<(), Error> { PBAR.step(step, "Running tests in Firefox..."); let geckodriver = self.geckodriver.as_ref().unwrap().display().to_string(); let geckodriver = geckodriver.as_str(); info!( - log, - "Running tests in Firefox with geckodriver at {}", geckodriver + "Running tests in Firefox with geckodriver at {}", + geckodriver ); let test_runner = self @@ -386,7 +389,7 @@ impl Test { .display() .to_string(); let test_runner = test_runner.as_str(); - info!(log, "Using wasm-bindgen test runner at {}", test_runner); + info!("Using wasm-bindgen test runner at {}", test_runner); let mut envs = vec![ ("CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER", test_runner), @@ -396,11 +399,11 @@ impl Test { envs.push(("NO_HEADLESS", "1")); } - test::cargo_test_wasm(&self.crate_path, self.release, log, envs)?; + test::cargo_test_wasm(&self.crate_path, self.release, envs, &self.extra_options)?; Ok(()) } - fn step_get_safaridriver(&mut self, step: &Step, _log: &Logger) -> Result<(), Error> { + fn step_get_safaridriver(&mut self, step: &Step) -> Result<(), Error> { PBAR.step(step, "Getting safaridriver..."); assert!(self.safari && self.safaridriver.is_none()); @@ -408,14 +411,14 @@ impl Test { Ok(()) } - fn step_test_safari(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { + fn step_test_safari(&mut self, step: &Step) -> Result<(), Error> { PBAR.step(step, "Running tests in Safari..."); let safaridriver = self.safaridriver.as_ref().unwrap().display().to_string(); let safaridriver = safaridriver.as_str(); info!( - log, - "Running tests in Safari with safaridriver at {}", safaridriver + "Running tests in Safari with safaridriver at {}", + safaridriver ); let test_runner = self @@ -425,7 +428,7 @@ impl Test { .display() .to_string(); let test_runner = test_runner.as_str(); - info!(log, "Using wasm-bindgen test runner at {}", test_runner); + info!("Using wasm-bindgen test runner at {}", test_runner); let mut envs = vec![ ("CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER", test_runner), @@ -435,7 +438,7 @@ impl Test { envs.push(("NO_HEADLESS", "1")); } - test::cargo_test_wasm(&self.crate_path, self.release, log, envs)?; + test::cargo_test_wasm(&self.crate_path, self.release, envs, &self.extra_options)?; Ok(()) } } diff --git a/src/command/utils.rs b/src/command/utils.rs index fee4d4f..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 @@ -18,6 +19,7 @@ pub fn create_pkg_dir(out_dir: &Path, step: &Step) -> Result<(), failure::Error> let msg = format!("{}Creating a pkg directory...", emoji::FOLDER); PBAR.step(step, &msg); fs::create_dir_all(&out_dir)?; + fs::write(out_dir.join(".gitignore"), "*")?; Ok(()) } @@ -28,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 266408b..5c4809a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,41 +4,37 @@ extern crate cargo_metadata; extern crate console; -extern crate curl; -extern crate dirs; +extern crate strsim; #[macro_use] extern crate failure; -extern crate flate2; -extern crate hex; +extern crate glob; extern crate indicatif; +extern crate which; #[macro_use] extern crate lazy_static; extern crate parking_lot; extern crate serde; #[macro_use] extern crate serde_derive; +extern crate serde_ignored; extern crate serde_json; -extern crate siphasher; #[macro_use] extern crate structopt; -#[macro_use] -extern crate slog; -extern crate slog_async; -extern crate slog_term; -extern crate tar; +extern crate binary_install; +extern crate dialoguer; +extern crate log; extern crate tempfile; extern crate toml; -extern crate which; -extern crate zip; +extern crate walkdir; -pub mod binaries; pub mod bindgen; pub mod build; +pub mod cache; pub mod child; pub mod command; pub mod emoji; +pub mod license; pub mod lockfile; -pub mod logger; pub mod manifest; pub mod npm; pub mod progressbar; diff --git a/src/license.rs b/src/license.rs new file mode 100644 index 0000000..ee5f20b --- /dev/null +++ b/src/license.rs @@ -0,0 +1,96 @@ +//! Copy `LICENSE` file(s) for the packaged wasm. + +use failure; +use std::fs; +use std::path::Path; + +use emoji; +use glob::glob; +use manifest::CrateData; +use progressbar::Step; +use PBAR; + +fn glob_license_files(path: &Path) -> Result, failure::Error> { + let mut license_files: Vec = Vec::new(); + let path_string = match path.join("LICENSE*").to_str() { + Some(path_string) => path_string.to_owned(), + None => { + return Err(format_err!( + "Could not convert joined license path to String" + )); + } + }; + + for entry in glob(&path_string)? { + match entry { + Ok(globed_path) => { + let file_name = match globed_path.file_name() { + Some(file_name) => file_name, + None => return Err(format_err!("Could not get file name from path")), + }; + let file_name_string = match file_name.to_str() { + Some(file_name_string) => file_name_string.to_owned(), + None => return Err(format_err!("Could not convert filename to String")), + }; + license_files.push(file_name_string); + } + Err(e) => println!("{:?}", e), + } + } + Ok(license_files) +} + +/// Copy the crate's license into the `pkg` directory. +pub fn copy_from_crate( + crate_data: &CrateData, + path: &Path, + out_dir: &Path, + step: &Step, +) -> Result<(), failure::Error> { + assert!( + fs::metadata(path).ok().map_or(false, |m| m.is_dir()), + "crate directory should exist" + ); + + assert!( + fs::metadata(&out_dir).ok().map_or(false, |m| m.is_dir()), + "crate's pkg directory should exist" + ); + + match (crate_data.crate_license(), crate_data.crate_license_file()) { + (Some(_), _) => { + let msg = format!("{}Copying over your LICENSE...", emoji::DANCERS); + PBAR.step(step, &msg); + let license_files = glob_license_files(path); + + match license_files { + Ok(files) => { + if files.is_empty() { + PBAR.info("License key is set in Cargo.toml but no LICENSE file(s) were found; Please add the LICENSE file(s) to your project directory"); + return Ok(()); + } + for license_file in files { + let crate_license_path = path.join(&license_file); + let new_license_path = out_dir.join(&license_file); + if fs::copy(&crate_license_path, &new_license_path).is_err() { + PBAR.info("origin crate has no LICENSE"); + } + } + } + Err(_) => PBAR.info("origin crate has no LICENSE"), + } + } + (None, Some(license_file)) => { + let crate_license_path = path.join(&license_file); + let new_license_path = out_dir.join(&license_file); + if fs::copy(&crate_license_path, &new_license_path).is_err() { + PBAR.info("origin crate has no LICENSE"); + } + } + (None, None) => { + PBAR.step(step, "No LICENSE found in Cargo.toml, skipping..."); + } + }; + + Ok(()) +} diff --git a/src/logger.rs b/src/logger.rs deleted file mode 100644 index f8f6cc4..0000000 --- a/src/logger.rs +++ /dev/null @@ -1,72 +0,0 @@ -//! Logging facilities for `wasm-pack`. - -use command::Command; -use failure; -use slog::{Drain, Level, Logger}; -use slog_async::Async; -use slog_term::{FullFormat, PlainDecorator}; -use std::fs::OpenOptions; -use std::path::PathBuf; - -/// Create the logger for wasm-pack that will output any info warning or errors we encounter -pub fn new(cmd: &Command, verbosity: u8) -> Result { - let log_path = log_file_path(&cmd); - let file = OpenOptions::new() - .create(true) - .append(true) - .open(log_path)?; - - let decorator = PlainDecorator::new(file); - let drain = FullFormat::new(decorator).build().fuse(); - - // Set the log level based off the number of v passed in to the command line args. - // Level level means only messages of that level and higher are logged. If we have - // an error then we'll log it unconditionally, but extra levels are only available - // with extra v - let log_level = match verbosity { - 0 => Level::Error, - 1 => Level::Info, - 2 => Level::Debug, - _ => Level::Trace, - }; - let drain = Async::new(drain).build().filter_level(log_level).fuse(); - Ok(Logger::root(drain, o!())) -} - -/// Figure out where to stick the log based off the command arguments given -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::Test(test_opts) => &test_opts.path, - Command::Login { .. } => &None, - }; - - // If the path exists attempt to use it, if not default to the current directory - if let Some(ref path) = path { - let mut path_buf = PathBuf::from(path); - path_buf.push("Cargo.toml"); - - // If the manifest file exists put the log in that directory otherwise default - // to the current directory. - if path_buf.exists() { - path_buf.pop(); - path_buf.push("wasm-pack.log"); - path_buf - } else { - let mut path_buf = this_dir(); - path_buf.push("wasm-pack.log"); - path_buf - } - } else { - let mut path_buf = this_dir(); - path_buf.push("wasm-pack.log"); - path_buf - } -} - -/// Return a `PathBuf` for the current directory -fn this_dir() -> PathBuf { - PathBuf::from(".") -} diff --git a/src/main.rs b/src/main.rs index 0af8296..26698a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ extern crate atty; +extern crate env_logger; #[macro_use] extern crate failure; #[macro_use] @@ -9,11 +10,12 @@ extern crate which; use std::env; use structopt::StructOpt; -use wasm_pack::{command::run_wasm_pack, logger, Cli}; +use wasm_pack::{command::run_wasm_pack, Cli}; mod installer; fn main() { + env_logger::init(); setup_panic!(); if let Err(e) = run() { eprintln!("Error: {}", e); @@ -39,7 +41,6 @@ fn run() -> Result<(), failure::Error> { } let args = Cli::from_args(); - let log = logger::new(&args.cmd, args.verbosity)?; - run_wasm_pack(args.cmd, &log)?; + run_wasm_pack(args.cmd)?; Ok(()) } diff --git a/src/manifest/mod.rs b/src/manifest/mod.rs index 8c3e390..a06b4ec 100644 --- a/src/manifest/mod.rs +++ b/src/manifest/mod.rs @@ -15,9 +15,13 @@ use failure::{Error, ResultExt}; use progressbar::Step; use serde::{self, Deserialize}; use serde_json; +use std::collections::BTreeSet; +use strsim::levenshtein; use toml; use PBAR; +const WASM_PACK_METADATA_KEY: &'static str = "package.metadata.wasm-pack"; + /// Store for metadata learned about a crate pub struct CrateData { data: Metadata, @@ -25,8 +29,9 @@ pub struct CrateData { manifest: CargoManifest, } +#[doc(hidden)] #[derive(Deserialize)] -struct CargoManifest { +pub struct CargoManifest { package: CargoPackage, } @@ -35,7 +40,10 @@ struct CargoPackage { name: String, description: Option, license: Option, + #[serde(rename = "license-file")] + license_file: Option, repository: Option, + homepage: Option, #[serde(default)] metadata: CargoMetadata, @@ -194,6 +202,13 @@ struct NpmData { files: Vec, dts_file: Option, main: String, + homepage: Option, // https://docs.npmjs.com/files/package.json#homepage +} + +#[doc(hidden)] +pub struct ManifestAndUnsedKeys { + pub manifest: CargoManifest, + pub unused_keys: BTreeSet, } impl CrateData { @@ -208,14 +223,14 @@ impl CrateData { crate_path.display() ) } - let manifest = fs::read_to_string(&manifest_path) - .with_context(|_| format!("failed to read: {}", manifest_path.display()))?; - let manifest: CargoManifest = toml::from_str(&manifest) - .with_context(|_| format!("failed to parse manifest: {}", manifest_path.display()))?; let data = cargo_metadata::metadata(Some(&manifest_path)).map_err(error_chain_to_failure)?; + let manifest_and_keys = CrateData::parse_crate_data(&manifest_path)?; + CrateData::warn_for_unused_keys(&manifest_and_keys); + + let manifest = manifest_and_keys.manifest; let current_idx = data .packages .iter() @@ -241,6 +256,50 @@ impl CrateData { } } + /// Read the `manifest_path` file and deserializes it using the toml Deserializer. + /// Returns a Result containing `ManifestAndUnsedKeys` which contains `CargoManifest` + /// and a `BTreeSet` containing the unused keys from the parsed file. + /// + /// # Errors + /// Will return Err if the file (manifest_path) couldn't be read or + /// if deserialize to `CargoManifest` fails. + pub fn parse_crate_data(manifest_path: &Path) -> Result { + let manifest = fs::read_to_string(&manifest_path) + .with_context(|_| format!("failed to read: {}", manifest_path.display()))?; + let manifest = &mut toml::Deserializer::new(&manifest); + + let mut unused_keys = BTreeSet::new(); + let levenshtein_threshold = 1; + + let manifest: CargoManifest = serde_ignored::deserialize(manifest, |path| { + let path_string = path.to_string(); + + if path_string.starts_with("package.metadata") + && (path_string.contains("wasm-pack") + || levenshtein(WASM_PACK_METADATA_KEY, &path_string) <= levenshtein_threshold) + { + unused_keys.insert(path_string); + } + }) + .with_context(|_| format!("failed to parse manifest: {}", manifest_path.display()))?; + + Ok(ManifestAndUnsedKeys { + manifest, + unused_keys, + }) + } + + /// Iterating through all the passed `unused_keys` and output + /// a warning for each unknown key. + pub fn warn_for_unused_keys(manifest_and_keys: &ManifestAndUnsedKeys) { + manifest_and_keys.unused_keys.iter().for_each(|path| { + PBAR.warn(&format!( + "\"{}\" is an unknown key and will be ignored. Please check your Cargo.toml.", + path + )); + }); + } + /// Get the configured profile. pub fn configured_profile(&self, profile: BuildProfile) -> &CargoWasmPackProfile { match profile { @@ -289,6 +348,16 @@ impl CrateData { } } + /// Get the license for the crate at the given path. + pub fn crate_license(&self) -> &Option { + &self.manifest.package.license + } + + /// Get the license file path for the crate at the given path. + pub fn crate_license_file(&self) -> &Option { + &self.manifest.package.license_file + } + /// Returns the path to this project's target directory where artifacts are /// located after a cargo build. pub fn target_directory(&self) -> &Path { @@ -314,11 +383,11 @@ impl CrateData { PBAR.step(step, &msg); let pkg_file_path = out_dir.join("package.json"); let npm_data = if target == "nodejs" { - self.to_commonjs(scope, disable_dts) + self.to_commonjs(scope, disable_dts, out_dir) } else if target == "no-modules" { - self.to_nomodules(scope, disable_dts) + self.to_nomodules(scope, disable_dts, out_dir) } else { - self.to_esmodules(scope, disable_dts) + self.to_esmodules(scope, disable_dts, out_dir) }; let npm_json = serde_json::to_string_pretty(&npm_data)?; @@ -332,6 +401,7 @@ impl CrateData { scope: &Option, include_commonjs_shim: bool, disable_dts: bool, + out_dir: &Path, ) -> NpmData { let crate_name = self.crate_name(); let wasm_file = format!("{}_bg.wasm", crate_name); @@ -357,16 +427,43 @@ impl CrateData { } else { None }; + + let readme_file = out_dir.join("README.md"); + if readme_file.is_file() { + files.push("README.md".to_string()); + } + + if let Ok(entries) = fs::read_dir(out_dir) { + let file_names = entries + .filter_map(|e| e.ok()) + .filter(|e| e.metadata().map(|m| m.is_file()).unwrap_or(false)) + .filter_map(|e| e.file_name().into_string().ok()) + .filter(|f| f.starts_with("LICENSE")); + for file_name in file_names { + files.push(file_name); + } + } + NpmData { name: npm_name, dts_file, files, main: js_file, + homepage: self.manifest.package.homepage.clone(), } } - fn to_commonjs(&self, scope: &Option, disable_dts: bool) -> NpmPackage { - let data = self.npm_data(scope, true, disable_dts); + fn license(&self) -> Option { + self.manifest.package.license.clone().or_else(|| { + self.manifest.package.license_file.clone().map(|file| { + // When license is written in file: https://docs.npmjs.com/files/package.json#license + format!("SEE LICENSE IN {}", file) + }) + }) + } + + fn to_commonjs(&self, scope: &Option, disable_dts: bool, out_dir: &Path) -> NpmPackage { + let data = self.npm_data(scope, true, disable_dts, out_dir); let pkg = &self.data.packages[self.current_idx]; self.check_optional_fields(); @@ -376,7 +473,7 @@ impl CrateData { collaborators: pkg.authors.clone(), description: self.manifest.package.description.clone(), version: pkg.version.clone(), - license: self.manifest.package.license.clone(), + license: self.license(), repository: self .manifest .package @@ -388,12 +485,18 @@ impl CrateData { }), files: data.files, main: data.main, + homepage: data.homepage, types: data.dts_file, }) } - fn to_esmodules(&self, scope: &Option, disable_dts: bool) -> NpmPackage { - let data = self.npm_data(scope, false, disable_dts); + fn to_esmodules( + &self, + scope: &Option, + disable_dts: bool, + out_dir: &Path, + ) -> NpmPackage { + let data = self.npm_data(scope, false, disable_dts, out_dir); let pkg = &self.data.packages[self.current_idx]; self.check_optional_fields(); @@ -403,7 +506,7 @@ impl CrateData { collaborators: pkg.authors.clone(), description: self.manifest.package.description.clone(), version: pkg.version.clone(), - license: self.manifest.package.license.clone(), + license: self.license(), repository: self .manifest .package @@ -415,13 +518,19 @@ impl CrateData { }), files: data.files, module: data.main, + homepage: data.homepage, types: data.dts_file, side_effects: "false".to_string(), }) } - fn to_nomodules(&self, scope: &Option, disable_dts: bool) -> NpmPackage { - let data = self.npm_data(scope, false, disable_dts); + fn to_nomodules( + &self, + scope: &Option, + disable_dts: bool, + out_dir: &Path, + ) -> NpmPackage { + let data = self.npm_data(scope, false, disable_dts, out_dir); let pkg = &self.data.packages[self.current_idx]; self.check_optional_fields(); @@ -431,7 +540,7 @@ impl CrateData { collaborators: pkg.authors.clone(), description: self.manifest.package.description.clone(), version: pkg.version.clone(), - license: self.manifest.package.license.clone(), + license: self.license(), repository: self .manifest .package @@ -443,6 +552,7 @@ impl CrateData { }), files: data.files, browser: data.main, + homepage: data.homepage, types: data.dts_file, }) } diff --git a/src/manifest/npm/commonjs.rs b/src/manifest/npm/commonjs.rs index ed8b8f9..8d8ce8b 100644 --- a/src/manifest/npm/commonjs.rs +++ b/src/manifest/npm/commonjs.rs @@ -16,5 +16,7 @@ pub struct CommonJSPackage { pub files: Vec, pub main: String, #[serde(skip_serializing_if = "Option::is_none")] + pub homepage: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub types: Option, } diff --git a/src/manifest/npm/esmodules.rs b/src/manifest/npm/esmodules.rs index df73964..cd715ca 100644 --- a/src/manifest/npm/esmodules.rs +++ b/src/manifest/npm/esmodules.rs @@ -16,6 +16,8 @@ pub struct ESModulesPackage { pub files: Vec, pub module: String, #[serde(skip_serializing_if = "Option::is_none")] + pub homepage: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub types: Option, #[serde(rename = "sideEffects")] pub side_effects: String, diff --git a/src/manifest/npm/nomodules.rs b/src/manifest/npm/nomodules.rs index 696a74b..913e97e 100644 --- a/src/manifest/npm/nomodules.rs +++ b/src/manifest/npm/nomodules.rs @@ -16,5 +16,7 @@ pub struct NoModulesPackage { pub files: Vec, pub browser: String, #[serde(skip_serializing_if = "Option::is_none")] + pub homepage: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub types: Option, } diff --git a/src/npm.rs b/src/npm.rs index 76fe841..d99732f 100644 --- a/src/npm.rs +++ b/src/npm.rs @@ -3,71 +3,63 @@ use child; use command::publish::access::Access; use failure::{self, ResultExt}; -use slog::Logger; -use std::process::{Command, Stdio}; +use log::info; /// The default npm registry used when we aren't working with a custom registry. pub const DEFAULT_NPM_REGISTRY: &'static str = "https://registry.npmjs.org/"; /// Run the `npm pack` command. -pub fn npm_pack(log: &Logger, path: &str) -> Result<(), failure::Error> { - let mut cmd = Command::new("npm"); +pub fn npm_pack(path: &str) -> Result<(), failure::Error> { + let mut cmd = child::new_command("npm"); cmd.current_dir(path).arg("pack"); - child::run(log, cmd, "npm pack").context("Packaging up your code failed")?; + child::run(cmd, "npm pack").context("Packaging up your code failed")?; Ok(()) } /// Run the `npm publish` command. -pub fn npm_publish(log: &Logger, path: &str, access: Option) -> Result<(), failure::Error> { - let mut cmd = Command::new("npm"); +pub fn npm_publish(path: &str, access: Option) -> Result<(), failure::Error> { + let mut cmd = child::new_command("npm"); match access { Some(a) => cmd .current_dir(path) .arg("publish") - .arg(&format!("{}", a.to_string())) - .stdin(Stdio::inherit()) - .stdout(Stdio::inherit()), - None => cmd - .current_dir(path) - .arg("publish") - .stdin(Stdio::inherit()) - .stdout(Stdio::inherit()), + .arg(&format!("{}", a.to_string())), + None => cmd.current_dir(path).arg("publish"), }; - child::run(log, cmd, "npm publish").context("Publishing to npm failed")?; + child::run(cmd, "npm publish").context("Publishing to npm failed")?; Ok(()) } /// Run the `npm login` command. pub fn npm_login( - log: &Logger, registry: &String, scope: &Option, always_auth: bool, auth_type: &Option, ) -> Result<(), failure::Error> { - let mut args = String::new(); - - args.push_str(&format!("--registry={}", registry)); + let mut args = vec![format!("login"), format!("--registry={}", registry)]; if let Some(scope) = scope { - args.push_str(&format!(" --scope={}", scope)); + args.push(format!("--scope={}", scope)); } - if always_auth == true { - args.push_str(" --always_auth"); + if always_auth { + args.push(format!("--always_auth")); } if let Some(auth_type) = auth_type { - args.push_str(&format!(" --auth_type={}", auth_type)); + args.push(format!("--auth_type={}", auth_type)); } - let mut cmd = Command::new("npm"); - cmd.arg("login") - .arg(args) - .stdin(Stdio::inherit()) - .stdout(Stdio::inherit()); - child::run(log, cmd, "npm login") - .with_context(|_| format!("Login to registry {} failed", registry))?; - Ok(()) + // Interactively ask user for npm login info. + // (child::run does not support interactive input) + let mut cmd = child::new_command("npm"); + cmd.args(args); + + info!("Running {:?}", cmd); + match cmd.status()?.success() { + true => Ok(()), + false => bail!("Login to registry {} failed", registry), + } } diff --git a/src/progressbar.rs b/src/progressbar.rs index 24a8947..f0c0e6a 100644 --- a/src/progressbar.rs +++ b/src/progressbar.rs @@ -43,6 +43,13 @@ impl ProgressOutput { let mut spinner = self.spinner.write(); *spinner = Self::progressbar(message); + + if !atty::is(atty::Stream::Stderr) { + // `indicatif` won't print any output if `stderr` is not a tty, so + // to ensure that our output is still emitted, we print it manually + // here. + eprintln!("{}", message) + } } fn add_message(&self, msg: &str) { diff --git a/src/test/mod.rs b/src/test/mod.rs index 1b71fed..8edecf0 100644 --- a/src/test/mod.rs +++ b/src/test/mod.rs @@ -4,7 +4,6 @@ pub mod webdriver; use child; use failure::{self, ResultExt}; -use slog::Logger; use std::ffi::OsStr; use std::path::Path; use std::process::Command; @@ -14,29 +13,24 @@ use std::process::Command; pub fn cargo_test_wasm( path: &Path, release: bool, - log: &Logger, envs: I, + extra_options: &[String], ) -> Result<(), failure::Error> where I: IntoIterator, K: AsRef, V: AsRef, { - let output = { - let mut cmd = Command::new("cargo"); - cmd.envs(envs); - cmd.current_dir(path).arg("test"); - if release { - cmd.arg("--release"); - } - cmd.arg("--target").arg("wasm32-unknown-unknown"); - child::run(log, cmd, "cargo test") - .context("Running Wasm tests with wasm-bindgen-test failed")? - }; - - for line in output.lines() { - info!(log, "test output: {}", line); - println!("{}", line); + let mut cmd = Command::new("cargo"); + cmd.envs(envs); + cmd.current_dir(path).arg("test"); + if release { + cmd.arg("--release"); } + cmd.arg("--target").arg("wasm32-unknown-unknown"); + cmd.args(extra_options); + child::run(cmd, "cargo test").context("Running Wasm tests with wasm-bindgen-test failed")?; + + // NB: `child::run` took care of ensuring that test output gets printed. Ok(()) } diff --git a/src/test/webdriver.rs b/src/test/webdriver.rs index 4b06314..1dfe1a1 100644 --- a/src/test/webdriver.rs +++ b/src/test/webdriver.rs @@ -1,6 +1,6 @@ //! Getting WebDriver client binaries. -use binaries::Cache; +use binary_install::Cache; use command::build::BuildMode; use failure; use std::path::PathBuf; @@ -31,14 +31,14 @@ pub fn install_chromedriver( "linux64" } else if target::MACOS && target::x86_64 { "mac64" - } else if target::WINDOWS && target::x86 { + } else if target::WINDOWS { "win32" } else { - bail!("geckodriver binaries are unavailable for this target") + bail!("chromedriver binaries are unavailable for this target") }; let url = format!( - "https://chromedriver.storage.googleapis.com/2.41/chromedriver_{}.zip", + "https://chromedriver.storage.googleapis.com/2.46/chromedriver_{}.zip", target ); match cache.download( @@ -47,7 +47,7 @@ pub fn install_chromedriver( &["chromedriver"], &url, )? { - Some(dl) => Ok(dl.binary("chromedriver")), + Some(dl) => Ok(dl.binary("chromedriver")?), None => bail!( "No cached `chromedriver` binary found, and could not find a global \ `chromedriver` on the `$PATH`. Not installing `chromedriver` because of noinstall \ @@ -92,12 +92,12 @@ pub fn install_geckodriver( }; let url = format!( - "https://github.com/mozilla/geckodriver/releases/download/v0.21.0/geckodriver-v0.21.0-{}.{}", + "https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-{}.{}", target, ext, ); match cache.download(installation_allowed, "geckodriver", &["geckodriver"], &url)? { - Some(dl) => Ok(dl.binary("geckodriver")), + Some(dl) => Ok(dl.binary("geckodriver")?), None => bail!( "No cached `geckodriver` binary found, and could not find a global `geckodriver` \ on the `$PATH`. Not installing `geckodriver` because of noinstall mode." diff --git a/tests/all/bindgen.rs b/tests/all/bindgen.rs index 985a4d0..3f04450 100644 --- a/tests/all/bindgen.rs +++ b/tests/all/bindgen.rs @@ -1,5 +1,5 @@ +use binary_install::Cache; use tempfile; -use wasm_pack::binaries::Cache; use wasm_pack::bindgen; #[test] @@ -12,8 +12,8 @@ fn can_download_prebuilt_wasm_bindgen() { let dir = tempfile::TempDir::new().unwrap(); let cache = Cache::at(dir.path()); let dl = bindgen::download_prebuilt_wasm_bindgen(&cache, "0.2.21", true).unwrap(); - assert!(dl.binary("wasm-bindgen").is_file()); - assert!(dl.binary("wasm-bindgen-test-runner").is_file()) + assert!(dl.binary("wasm-bindgen").unwrap().is_file()); + assert!(dl.binary("wasm-bindgen-test-runner").unwrap().is_file()) } #[test] diff --git a/tests/all/build.rs b/tests/all/build.rs index cc21fbb..be6e191 100644 --- a/tests/all/build.rs +++ b/tests/all/build.rs @@ -1,40 +1,24 @@ +use assert_cmd::prelude::*; use std::fs; use std::path::Path; -use structopt::StructOpt; use utils; -use wasm_pack::Cli; #[test] fn build_in_non_crate_directory_doesnt_panic() { let fixture = utils::fixture::not_a_crate(); - let cli = Cli::from_iter_safe(vec![ - "wasm-pack", - "build", - &fixture.path.display().to_string(), - ]) - .unwrap(); - let result = fixture.run(cli.cmd); - assert!( - result.is_err(), - "running wasm-pack in a non-crate directory should fail, but it should not panic" - ); - let err = result.unwrap_err(); - assert!(err - .iter_chain() - .any(|e| e.to_string().contains("missing a `Cargo.toml`"))); + fixture + .wasm_pack() + .arg("build") + .assert() + .failure() + .stderr(predicates::str::contains("missing a `Cargo.toml`")); } #[test] fn it_should_build_js_hello_world_example() { 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(); + fixture.wasm_pack().arg("build").assert().success(); } #[test] @@ -75,15 +59,14 @@ fn it_should_build_crates_in_a_workspace() { #[wasm_bindgen] pub fn hello() -> u32 { 42 } "#, - ); - fixture.install_local_wasm_bindgen(); - let cli = Cli::from_iter_safe(vec![ - "wasm-pack", - "build", - &fixture.path.join("blah").display().to_string(), - ]) - .unwrap(); - fixture.run(cli.cmd).unwrap(); + ) + .install_local_wasm_bindgen(); + fixture + .wasm_pack() + .current_dir(&fixture.path.join("blah")) + .arg("build") + .assert() + .success(); } #[test] @@ -116,28 +99,21 @@ fn renamed_crate_name_works() { #[wasm_bindgen] pub fn one() -> u32 { 1 } "#, - ); - 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(); + ) + .install_local_wasm_bindgen(); + fixture.wasm_pack().arg("build").assert().success(); } #[test] fn it_should_build_nested_project_with_transitive_dependencies() { let fixture = utils::fixture::transitive_dependencies(); fixture.install_local_wasm_bindgen(); - let cli = Cli::from_iter_safe(vec![ - "wasm-pack", - "build", - &fixture.path.join("main").display().to_string(), - ]) - .unwrap(); - fixture.run(cli.cmd).unwrap(); + fixture + .wasm_pack() + .current_dir(fixture.path.join("main")) + .arg("build") + .assert() + .success(); } #[test] @@ -149,14 +125,12 @@ fn build_different_profiles() { .iter() .cloned() { - let cli = Cli::from_iter_safe(vec![ - "wasm-pack", - "build", - profile, - &fixture.path.display().to_string(), - ]) - .unwrap(); - fixture.run(cli.cmd).unwrap(); + fixture + .wasm_pack() + .arg("build") + .arg(profile) + .assert() + .success(); } } @@ -208,17 +182,15 @@ fn build_with_and_without_wasm_bindgen_debug() { pub fn take(self) {} } "#, - ); - - let cli = Cli::from_iter_safe(vec![ - "wasm-pack", - "build", - "--dev", - &fixture.path.display().to_string(), - ]) - .unwrap(); + ) + .install_local_wasm_bindgen(); - fixture.run(cli.cmd).unwrap(); + fixture + .wasm_pack() + .arg("build") + .arg("--dev") + .assert() + .success(); let contents = fs::read_to_string(fixture.path.join("pkg/whatever.js")).unwrap(); assert_eq!( @@ -228,3 +200,16 @@ fn build_with_and_without_wasm_bindgen_debug() { ); } } + +#[test] +fn build_with_arbitrary_cargo_options() { + let fixture = utils::fixture::js_hello_world(); + fixture.install_local_wasm_bindgen(); + fixture + .wasm_pack() + .arg("build") + .arg("--") + .arg("--no-default-features") + .assert() + .success(); +} diff --git a/tests/all/license.rs b/tests/all/license.rs new file mode 100644 index 0000000..5b7cd28 --- /dev/null +++ b/tests/all/license.rs @@ -0,0 +1,157 @@ +extern crate failure; +extern crate wasm_pack; + +use std::fs; + +use utils::{self, fixture}; +use wasm_pack::license; +use wasm_pack::manifest::CrateData; + +#[test] +fn it_copies_a_license_default_path() { + let fixture = fixture::single_license(); + let out_dir = fixture.path.join("pkg"); + fs::create_dir(&out_dir).expect("should create pkg directory OK"); + let crate_data = CrateData::new(&fixture.path); + + let step = wasm_pack::progressbar::Step::new(1); + assert!(license::copy_from_crate(&crate_data.unwrap(), &fixture.path, &out_dir, &step).is_ok()); + + let crate_license_path = fixture.path.join("LICENSE-WTFPL"); + let pkg_license_path = out_dir.join("LICENSE-WTFPL"); + println!( + "wasm-pack: should have copied LICENSE from '{}' to '{}'", + crate_license_path.display(), + pkg_license_path.display() + ); + assert!(fs::metadata(&crate_license_path).is_ok()); + + assert!(fs::metadata(&pkg_license_path).is_ok()); + + let crate_license = utils::file::read_file(&crate_license_path).unwrap(); + let pkg_license = utils::file::read_file(&pkg_license_path).unwrap(); + assert_eq!(crate_license, pkg_license); +} + +#[test] +fn it_copies_a_license_provided_path() { + let fixture = fixture::single_license(); + let out_dir = fixture.path.join("pkg"); + fs::create_dir(&out_dir).expect("should create pkg directory OK"); + let crate_data = CrateData::new(&fixture.path); + + let step = wasm_pack::progressbar::Step::new(1); + assert!(license::copy_from_crate(&crate_data.unwrap(), &fixture.path, &out_dir, &step).is_ok()); + let crate_license_path = fixture.path.join("LICENSE-WTFPL"); + let pkg_license_path = out_dir.join("LICENSE-WTFPL"); + println!( + "wasm-pack: should have copied LICENSE-WTFPL from '{}' to '{}'", + crate_license_path.display(), + pkg_license_path.display() + ); + assert!(fs::metadata(&crate_license_path).is_ok()); + assert!(fs::metadata(&pkg_license_path).is_ok()); + + let crate_license = utils::file::read_file(&crate_license_path).unwrap(); + let pkg_license = utils::file::read_file(&pkg_license_path).unwrap(); + assert_eq!(crate_license, pkg_license); +} + +#[test] +fn it_copies_all_licenses_default_path() { + let fixture = fixture::dual_license(); + let out_dir = fixture.path.join("pkg"); + fs::create_dir(&out_dir).expect("should create pkg directory OK"); + let crate_data = CrateData::new(&fixture.path); + + let step = wasm_pack::progressbar::Step::new(1); + assert!(license::copy_from_crate(&crate_data.unwrap(), &fixture.path, &out_dir, &step).is_ok()); + + let crate_license_path = fixture.path.join("LICENSE-WTFPL"); + let pkg_license_path = out_dir.join("LICENSE-WTFPL"); + + let crate_license_path_2 = fixture.path.join("LICENSE-MIT"); + let pkg_license_path_2 = out_dir.join("LICENSE-MIT"); + + println!( + "wasm-pack: should have copied LICENSE from '{}' to '{}'", + crate_license_path.display(), + pkg_license_path.display() + ); + assert!(fs::metadata(&crate_license_path).is_ok()); + assert!(fs::metadata(&pkg_license_path).is_ok()); + + assert!(fs::metadata(&crate_license_path_2).is_ok()); + assert!(fs::metadata(&pkg_license_path_2).is_ok()); + + let crate_license = utils::file::read_file(&crate_license_path).unwrap(); + let pkg_license = utils::file::read_file(&pkg_license_path).unwrap(); + assert_eq!(crate_license, pkg_license); + + let crate_license_2 = utils::file::read_file(&crate_license_path_2).unwrap(); + let pkg_license_2 = utils::file::read_file(&pkg_license_path_2).unwrap(); + assert_eq!(crate_license_2, pkg_license_2); +} + +#[test] +fn it_copies_all_licenses_provided_path() { + let fixture = fixture::dual_license(); + let out_dir = fixture.path.join("pkg"); + fs::create_dir(&out_dir).expect("should create pkg directory OK"); + let crate_data = CrateData::new(&fixture.path); + + let step = wasm_pack::progressbar::Step::new(1); + assert!(license::copy_from_crate(&crate_data.unwrap(), &fixture.path, &out_dir, &step).is_ok()); + + let crate_license_path = fixture.path.join("LICENSE-WTFPL"); + let pkg_license_path = out_dir.join("LICENSE-WTFPL"); + + let crate_license_path_2 = fixture.path.join("LICENSE-MIT"); + let pkg_license_path_2 = out_dir.join("LICENSE-MIT"); + + println!( + "wasm-pack: should have copied LICENSE from '{}' to '{}'", + crate_license_path.display(), + pkg_license_path.display() + ); + assert!(fs::metadata(&crate_license_path).is_ok()); + assert!(fs::metadata(&pkg_license_path).is_ok()); + + assert!(fs::metadata(&crate_license_path_2).is_ok()); + assert!(fs::metadata(&pkg_license_path_2).is_ok()); + + let crate_license = utils::file::read_file(&crate_license_path).unwrap(); + let pkg_license = utils::file::read_file(&pkg_license_path).unwrap(); + assert_eq!(crate_license, pkg_license); + + let crate_license_2 = utils::file::read_file(&crate_license_path_2).unwrap(); + let pkg_license_2 = utils::file::read_file(&pkg_license_path_2).unwrap(); + assert_eq!(crate_license_2, pkg_license_2); +} + +#[test] +fn it_copies_a_non_standard_license_provided_path() { + let license_file = "NON-STANDARD-LICENSE"; + let fixture = fixture::non_standard_license(license_file); + let out_dir = fixture.path.join("pkg"); + fs::create_dir(&out_dir).expect("should create pkg directory OK"); + let crate_data = CrateData::new(&fixture.path); + + let step = wasm_pack::progressbar::Step::new(1); + assert!(license::copy_from_crate(&crate_data.unwrap(), &fixture.path, &out_dir, &step).is_ok()); + + let crate_license_path = fixture.path.join(license_file); + let pkg_license_path = out_dir.join(license_file); + println!( + "wasm-pack: should have copied LICENSE from '{}' to '{}'", + crate_license_path.display(), + pkg_license_path.display() + ); + assert!(fs::metadata(&crate_license_path).is_ok()); + + assert!(fs::metadata(&pkg_license_path).is_ok()); + + let crate_license = utils::file::read_file(&crate_license_path).unwrap(); + let pkg_license = utils::file::read_file(&pkg_license_path).unwrap(); + assert_eq!(crate_license, pkg_license); +} diff --git a/tests/all/main.rs b/tests/all/main.rs index 3fa272f..a01018b 100644 --- a/tests/all/main.rs +++ b/tests/all/main.rs @@ -1,17 +1,19 @@ +extern crate assert_cmd; extern crate failure; +extern crate predicates; #[macro_use] extern crate lazy_static; #[macro_use] extern crate serde_derive; +extern crate binary_install; extern crate serde_json; -#[macro_use] -extern crate slog; extern crate structopt; extern crate tempfile; extern crate wasm_pack; mod bindgen; mod build; +mod license; mod lockfile; mod manifest; mod readme; diff --git a/tests/all/manifest.rs b/tests/all/manifest.rs index 6bc9df8..7638f7a 100644 --- a/tests/all/manifest.rs +++ b/tests/all/manifest.rs @@ -1,11 +1,9 @@ +use assert_cmd::prelude::*; use std::collections::HashSet; use std::fs; use std::path::PathBuf; - -use structopt::StructOpt; - use utils::{self, fixture}; -use wasm_pack::{self, manifest, Cli}; +use wasm_pack::{self, license, manifest, readme}; #[test] fn it_gets_the_crate_name_default_path() { @@ -279,6 +277,63 @@ fn it_errors_when_wasm_bindgen_is_not_declared() { assert!(crate_data.check_crate_config(&step).is_err()); } +#[test] +fn it_sets_homepage_field_if_available_in_cargo_toml() { + // When 'homepage' is available + let fixture = utils::fixture::Fixture::new(); + fixture.hello_world_src_lib().file( + "Cargo.toml", + r#" + [package] + authors = ["The wasm-pack developers"] + description = "so awesome rust+wasm package" + license = "WTFPL" + name = "homepage-field-test" + repository = "https://github.com/rustwasm/wasm-pack.git" + version = "0.1.0" + homepage = "https://rustwasm.github.io/wasm-pack/" + + [lib] + crate-type = ["cdylib"] + + [dependencies] + wasm-bindgen = "=0.2" + + [dev-dependencies] + wasm-bindgen-test = "=0.2" + "#, + ); + + let out_dir = fixture.path.join("pkg"); + let crate_data = manifest::CrateData::new(&fixture.path).unwrap(); + + let step = wasm_pack::progressbar::Step::new(2); + wasm_pack::command::utils::create_pkg_dir(&out_dir, &step).unwrap(); + crate_data + .write_package_json(&out_dir, &None, true, "", &step) + .unwrap(); + + let pkg = utils::manifest::read_package_json(&fixture.path, &out_dir).unwrap(); + assert_eq!( + pkg.homepage, + Some("https://rustwasm.github.io/wasm-pack/".to_string()), + ); + + // When 'homepage' is unavailable + let fixture = fixture::js_hello_world(); + let out_dir = fixture.path.join("pkg"); + let crate_data = manifest::CrateData::new(&fixture.path).unwrap(); + + let step = wasm_pack::progressbar::Step::new(2); + wasm_pack::command::utils::create_pkg_dir(&out_dir, &step).unwrap(); + crate_data + .write_package_json(&out_dir, &None, true, "", &step) + .unwrap(); + + let pkg = utils::manifest::read_package_json(&fixture.path, &out_dir).unwrap(); + assert_eq!(pkg.homepage, None); +} + #[test] fn it_does_not_error_when_wasm_bindgen_is_declared() { let fixture = fixture::js_hello_world(); @@ -291,6 +346,41 @@ fn it_does_not_error_when_wasm_bindgen_is_declared() { #[test] fn configure_wasm_bindgen_debug_incorrectly_is_error() { + let fixture = utils::fixture::Fixture::new(); + fixture.readme().hello_world_src_lib().file( + "Cargo.toml", + r#" + [package] + authors = ["The wasm-pack developers"] + description = "so awesome rust+wasm package" + license = "WTFPL" + name = "whatever" + repository = "https://github.com/rustwasm/wasm-pack.git" + version = "0.1.0" + + [lib] + crate-type = ["cdylib"] + + [dependencies] + wasm-bindgen = "0.2" + + [package.metadata.wasm-pack.profile.dev.wasm-bindgen] + debug-js-glue = "not a boolean" + "#, + ); + fixture + .wasm_pack() + .arg("build") + .arg("--dev") + .assert() + .failure() + .stderr(predicates::str::contains( + "package.metadata.wasm-pack.profile.dev.wasm-bindgen.debug", + )); +} + +#[test] +fn parse_crate_data_returns_unused_keys_in_cargo_toml() { let fixture = utils::fixture::Fixture::new(); fixture .readme() @@ -311,25 +401,81 @@ fn configure_wasm_bindgen_debug_incorrectly_is_error() { [dependencies] wasm-bindgen = "0.2" - [package.metadata.wasm-pack.profile.dev.wasm-bindgen] - debug-js-glue = "not a boolean" + # Note: production is not valid. + [package.metadata.wasm-pack.profile.production.wasm-bindgen] + debug-js-glue = true "#, ) - .hello_world_src_lib(); - - let cli = Cli::from_iter_safe(vec![ - "wasm-pack", - "build", - "--dev", - &fixture.path.display().to_string(), - ]) - .unwrap(); - - let result = fixture.run(cli.cmd); - assert!(result.is_err()); - - let err = result.unwrap_err(); - assert!(err.iter_chain().any(|c| c - .to_string() - .contains("package.metadata.wasm-pack.profile.dev.wasm-bindgen.debug"))); + .hello_world_src_lib() + .install_local_wasm_bindgen(); + fixture + .wasm_pack() + .arg("build") + .assert() + .success() + .stdout(predicates::str::contains( + "[WARN]: \"package.metadata.wasm-pack.profile.production\" is an unknown key and will \ + be ignored. Please check your Cargo.toml.", + )); +} + +#[test] +fn it_lists_license_files_in_files_field_of_package_json() { + let fixture = fixture::dual_license(); + let out_dir = fixture.path.join("pkg"); + + let crate_data = manifest::CrateData::new(&fixture.path).unwrap(); + + let step = wasm_pack::progressbar::Step::new(3); + wasm_pack::command::utils::create_pkg_dir(&out_dir, &step).unwrap(); + license::copy_from_crate(&crate_data, &fixture.path, &out_dir, &step).unwrap(); + crate_data + .write_package_json(&out_dir, &None, false, "", &step) + .unwrap(); + + let package_json_path = &fixture.path.join("pkg").join("package.json"); + fs::metadata(package_json_path).unwrap(); + let pkg = utils::manifest::read_package_json(&fixture.path, &out_dir).unwrap(); + + assert!( + pkg.files.contains(&"LICENSE-WTFPL".to_string()), + "LICENSE-WTFPL is not in files: {:?}", + pkg.files, + ); + + assert!( + pkg.files.contains(&"LICENSE-MIT".to_string()), + "LICENSE-MIT is not in files: {:?}", + pkg.files, + ); +} + +#[test] +fn it_lists_readme_in_files_field_of_package_json() { + let fixture = utils::fixture::Fixture::new(); + fixture + .readme() + .hello_world_src_lib() + .cargo_toml("readme-test-for-package-json"); + + let out_dir = fixture.path.join("pkg"); + + let crate_data = manifest::CrateData::new(&fixture.path).unwrap(); + + let step = wasm_pack::progressbar::Step::new(3); + wasm_pack::command::utils::create_pkg_dir(&out_dir, &step).unwrap(); + readme::copy_from_crate(&fixture.path, &out_dir, &step).unwrap(); + crate_data + .write_package_json(&out_dir, &None, false, "", &step) + .unwrap(); + + let package_json_path = &fixture.path.join("pkg").join("package.json"); + fs::metadata(package_json_path).unwrap(); + let pkg = utils::manifest::read_package_json(&fixture.path, &out_dir).unwrap(); + + assert!( + pkg.files.contains(&"README.md".to_string()), + "README.md is not in files: {:?}", + pkg.files, + ); } diff --git a/tests/all/test.rs b/tests/all/test.rs index 278959a..dbe9532 100644 --- a/tests/all/test.rs +++ b/tests/all/test.rs @@ -1,41 +1,32 @@ -use failure::Error; +use assert_cmd::prelude::*; +use predicates::prelude::*; use std::env; use utils::fixture; -use wasm_pack::command::{build, test, Command}; - -fn assert_err(result: Result, msg: &str) -> Error { - let error = result.err().expect("should have failed"); - for e in error.iter_chain() { - println!("err: {}", e); - } - assert!(error.iter_chain().any(|e| e.to_string().contains(msg))); - error -} #[test] fn it_can_run_node_tests() { let fixture = fixture::wbg_test_node(); fixture.install_local_wasm_bindgen(); - let cmd = Command::Test(test::TestOptions { - path: Some(fixture.path.clone()), - node: true, - mode: build::BuildMode::Noinstall, - ..Default::default() - }); - fixture.run(cmd).unwrap(); + let _lock = fixture.lock(); + fixture + .wasm_pack() + .arg("test") + .arg("--node") + .assert() + .success(); } #[test] fn it_can_run_tests_with_different_wbg_test_and_wbg_versions() { let fixture = fixture::wbg_test_diff_versions(); fixture.install_local_wasm_bindgen(); - let cmd = Command::Test(test::TestOptions { - path: Some(fixture.path.clone()), - node: true, - mode: build::BuildMode::Noinstall, - ..Default::default() - }); - fixture.run(cmd).unwrap(); + let _lock = fixture.lock(); + fixture + .wasm_pack() + .arg("test") + .arg("--node") + .assert() + .success(); } #[test] @@ -75,33 +66,37 @@ fn it_can_run_browser_tests() { return; } - let cmd = Command::Test(test::TestOptions { - path: Some(fixture.path.clone()), - firefox, - chrome, - safari, - headless: true, - mode: build::BuildMode::Noinstall, - ..Default::default() - }); - - fixture.run(cmd).unwrap(); + let mut cmd = fixture.wasm_pack(); + cmd.arg("test").arg("--headless"); + + if firefox { + cmd.arg("--firefox"); + } + if chrome { + cmd.arg("--chrome"); + } + if safari { + cmd.arg("--safari"); + } + + let _lock = fixture.lock(); + cmd.assert().success(); } #[test] fn it_can_run_failing_tests() { let fixture = fixture::wbg_test_fail(); fixture.install_local_wasm_bindgen(); - let cmd = Command::Test(test::TestOptions { - path: Some(fixture.path.clone()), - node: true, - mode: build::BuildMode::Noinstall, - ..Default::default() - }); - assert_err( - fixture.run(cmd), - "Running Wasm tests with wasm-bindgen-test failed", - ); + let _lock = fixture.lock(); + fixture + .wasm_pack() + .arg("test") + .arg("--node") + .assert() + .failure() + .stderr(predicates::str::contains( + "Running Wasm tests with wasm-bindgen-test failed", + )); } #[test] @@ -113,8 +108,6 @@ fn it_can_run_failing_tests() { all(target_os = "windows", target_arch = "x86_64") ))] fn it_can_find_a_webdriver_on_path() { - use std::process::Command; - let fixture = fixture::wbg_test_browser(); let local_geckodriver = fixture.install_local_geckodriver(); let local_wasm_bindgen = fixture.install_local_wasm_bindgen(); @@ -125,54 +118,44 @@ fn it_can_find_a_webdriver_on_path() { let path = env::join_paths(paths).unwrap(); let _lock = fixture.lock(); - - let mut me = env::current_exe().unwrap(); - me.pop(); - me.pop(); - me.push("wasm-pack"); - let output = Command::new(&me) + fixture + .wasm_pack() + .env("PATH", &path) .arg("test") .arg("--firefox") .arg("--headless") .arg("--mode") .arg("no-install") - .env("PATH", &path) - .arg(&fixture.path) - .output() - .unwrap(); - println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); - println!("stderr: {}", String::from_utf8_lossy(&output.stderr)); - println!("status: {}", output.status); - assert!(output.status.success()); + .assert() + .success(); } #[test] fn it_requires_node_or_a_browser() { let fixture = fixture::wbg_test_node(); fixture.install_local_wasm_bindgen(); - - let cmd = Command::Test(test::TestOptions { - path: Some(fixture.path.clone()), - mode: build::BuildMode::Noinstall, - // Note: not setting node or any browser to true here. - ..Default::default() - }); - assert_err(fixture.run(cmd), "Must specify at least one of"); + let _lock = fixture.lock(); + fixture + .wasm_pack() + .arg("test") + .assert() + .failure() + .stderr(predicates::str::contains("Must specify at least one of")); } #[test] fn the_headless_flag_requires_a_browser() { let fixture = fixture::wbg_test_node(); fixture.install_local_wasm_bindgen(); - - let cmd = Command::Test(test::TestOptions { - path: Some(fixture.path.clone()), - node: true, - mode: build::BuildMode::Noinstall, - headless: true, - ..Default::default() - }); - assert_err(fixture.run(cmd), "only applies to browser tests"); + let _lock = fixture.lock(); + fixture + .wasm_pack() + .arg("test") + .arg("--node") + .arg("--headless") + .assert() + .failure() + .stderr(predicates::str::contains("only applies to browser tests")); } #[test] @@ -203,44 +186,18 @@ fn complains_about_missing_wasm_bindgen_test_dependency() { ) .hello_world_src_lib() .install_local_wasm_bindgen(); - - let cmd = Command::Test(test::TestOptions { - path: Some(fixture.path.clone()), - node: true, - mode: build::BuildMode::Noinstall, - ..Default::default() - }); - let error = assert_err(fixture.run(cmd), "Ensure that you have"); - - // Test that the error message has two occurrences of "wasm-bindgen-test" in - // it. I am surprised to learn there is no `str` method to count - // occurrences, so we find the first and the last and assert that they - // aren't the same occurrence. - // - // This should protect against regresstions where we said: - // - // Ensure that you have "wasm-bindgen" as a dependency in your Cargo.toml file: - // [dev-dependencies] - // wasm-bindgen-test = "0.2" - // - // instead of - // - // Ensure that you have "wasm-bindgen-test" as a dependency in your Cargo.toml file: - // [dev-dependencies] - // wasm-bindgen-test = "0.2" - // - // Note that the whole reason we are doing this string manipulation instead - // of just doing `assert_eq!` is because the first occurrence of the - // dependency name is bolded with terminal escape codes and if I try to pipe - // the output to a text file, then the escape codes go away, so I can't - // figure out which exact escape codes are even used here. - - let err_msg = error.to_string(); - let first = err_msg.find("wasm-bindgen-test"); - assert!(first.is_some()); - let second = err_msg.rfind("wasm-bindgen-test"); - assert!(second.is_some()); - assert_ne!(first, second, "should have found two occurrences"); + let _lock = fixture.lock(); + fixture + .wasm_pack() + .arg("test") + .arg("--node") + .assert() + .failure() + .stderr(predicates::str::contains( + "Ensure that you have \"wasm-bindgen-test\" as a dependency in your Cargo.toml file", + )) + .stderr(predicates::str::contains("[dev-dependencies]")) + .stderr(predicates::str::contains("wasm-bindgen-test = \"0.2\"")); } #[test] @@ -276,15 +233,15 @@ fn renamed_crate_name_works() { #[wasm_bindgen] pub fn one() -> u32 { 1 } "#, - ); - fixture.install_local_wasm_bindgen(); - let cmd = Command::Test(test::TestOptions { - path: Some(fixture.path.clone()), - node: true, - mode: build::BuildMode::Noinstall, - ..Default::default() - }); - fixture.run(cmd).unwrap(); + ) + .install_local_wasm_bindgen(); + let _lock = fixture.lock(); + fixture + .wasm_pack() + .arg("test") + .arg("--node") + .assert() + .success(); } #[test] @@ -324,13 +281,54 @@ fn cdylib_not_required() { foo::foo(); } "#, - ); - fixture.install_local_wasm_bindgen(); - let cmd = Command::Test(test::TestOptions { - path: Some(fixture.path.clone()), - node: true, - mode: build::BuildMode::Noinstall, - ..Default::default() - }); - fixture.run(cmd).unwrap(); + ) + .install_local_wasm_bindgen(); + let _lock = fixture.lock(); + fixture + .wasm_pack() + .arg("test") + .arg("--node") + .assert() + .success(); +} + +#[test] +fn test_output_is_printed_once() { + let fixture = fixture::Fixture::new(); + fixture + .readme() + .cargo_toml("test-output-printed-once") + .hello_world_src_lib() + .file( + "tests/node.rs", + r#" + extern crate wasm_bindgen; + extern crate wasm_bindgen_test; + use wasm_bindgen::prelude::*; + use wasm_bindgen_test::*; + + #[wasm_bindgen] + extern { + #[wasm_bindgen(js_namespace = console)] + fn log(s: &str); + } + + #[wasm_bindgen_test] + fn yabba() { + log("YABBA DABBA DOO"); + assert_eq!(1, 2); + } + "#, + ) + .install_local_wasm_bindgen(); + let _lock = fixture.lock(); + fixture + .wasm_pack() + .arg("test") + .arg("--node") + .assert() + .failure() + .stderr(predicate::function(|err: &str| { + err.matches("YABBA DABBA DOO").count() == 1 + })); } diff --git a/tests/all/utils/fixture.rs b/tests/all/utils/fixture.rs index 9a9a58c..856fd21 100644 --- a/tests/all/utils/fixture.rs +++ b/tests/all/utils/fixture.rs @@ -1,4 +1,4 @@ -use super::logger::null_logger; +use binary_install::Cache; use std::env; use std::fs; use std::mem::ManuallyDrop; @@ -8,7 +8,6 @@ use std::sync::{MutexGuard, Once, ONCE_INIT}; use std::thread; use tempfile::TempDir; use wasm_pack; -use wasm_pack::binaries::Cache; /// A test fixture in a temporary directory. pub struct Fixture { @@ -68,6 +67,44 @@ impl Fixture { ) } + /// Add `WTFPL LICENSE` file to the fixture. + pub fn wtfpl_license(&self) -> &Self { + self.file( + "LICENSE-WTFPL", + r#" + DO WHATEVER YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHATEVER YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHATEVER YOU WANT TO. + "#, + ) + } + + /// Add `MIT LICENSE` file to the fixture. + pub fn mit_license(&self) -> &Self { + self.file( + "LICENSE-MIT", + r#" + Copyright + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + "#, + ) + } + /// Add a `Cargo.toml` with a correctly configured `wasm-bindgen` /// dependency, `wasm-bindgen-test` dev-dependency, and `crate-type = /// ["cdylib"]`. @@ -100,6 +137,39 @@ impl Fixture { ) } + /// Add a `Cargo.toml` with a correctly configured `wasm-bindgen` + /// dependency, `wasm-bindgen-test` dev-dependency, and `crate-type = + /// ["cdylib"]`. + /// + /// `name` is the crate's name. + /// `license_file` is license file path + pub fn cargo_toml_with_license_file(&self, name: &str, license_file: &str) -> &Self { + self.file( + "Cargo.toml", + &format!( + r#" + [package] + authors = ["The wasm-pack developers"] + description = "so awesome rust+wasm package" + name = "{}" + license-file = "{}" + repository = "https://github.com/rustwasm/wasm-pack.git" + version = "0.1.0" + + [lib] + crate-type = ["cdylib"] + + [dependencies] + wasm-bindgen = "=0.2.21" + + [dev-dependencies] + wasm-bindgen-test = "=0.2.21" + "#, + name, license_file + ), + ) + } + /// Add a `src/lib.rs` file that contains a "hello world" program. pub fn hello_world_src_lib(&self) -> &Self { self.file( @@ -132,7 +202,6 @@ impl Fixture { static INSTALL_WASM_BINDGEN: Once = ONCE_INIT; let cache = self.cache(); let version = "0.2.21"; - let log = &null_logger(); let download = || { if let Ok(download) = @@ -141,7 +210,7 @@ impl Fixture { return Ok(download); } - wasm_pack::bindgen::cargo_install_wasm_bindgen(log, &cache, version, true) + wasm_pack::bindgen::cargo_install_wasm_bindgen(&cache, version, true) }; // Only one thread can perform the actual download, and then afterwards @@ -149,7 +218,7 @@ impl Fixture { INSTALL_WASM_BINDGEN.call_once(|| { download().unwrap(); }); - download().unwrap().binary("wasm-bindgen") + download().unwrap().binary("wasm-bindgen").unwrap() } /// Download `geckodriver` and return its path. @@ -182,9 +251,14 @@ impl Fixture { wasm_pack::test::webdriver::install_chromedriver(&cache, true).unwrap() } + pub fn cache_dir(&self) -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("target") + .join("test_cache") + } + pub fn cache(&self) -> Cache { - let target_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("target"); - Cache::at(&target_dir.join("test_cache")) + Cache::at(&self.cache_dir()) } /// The `step_install_wasm_bindgen` and `step_run_wasm_bindgen` steps only @@ -204,22 +278,14 @@ impl Fixture { self } - pub fn run(&self, cmd: wasm_pack::command::Command) -> Result<(), failure::Error> { - let logger = wasm_pack::logger::new(&cmd, 3)?; - match cmd { - wasm_pack::command::Command::Test(cmd) => { - let _lock = self.lock(); - let mut test = wasm_pack::command::test::Test::try_from_opts(cmd)?; - test.set_cache(self.cache()); - test.run(&logger) - } - wasm_pack::command::Command::Build(cmd) => { - let mut build = wasm_pack::command::build::Build::try_from_opts(cmd)?; - build.set_cache(self.cache()); - build.run(&logger) - } - _ => unreachable!(), - } + /// Get a `wasm-pack` command configured to run in this fixure's temp + /// directory and using the test cache. + pub fn wasm_pack(&self) -> Command { + use assert_cmd::prelude::*; + let mut cmd = Command::main_binary().unwrap(); + cmd.current_dir(&self.path); + cmd.env("WASM_PACK_CACHE", self.cache_dir()); + cmd } pub fn lock(&self) -> MutexGuard<'static, ()> { @@ -590,3 +656,34 @@ pub fn transitive_dependencies() -> Fixture { project_main_fixture(&mut fixture); fixture } + +pub fn single_license() -> Fixture { + let fixture = Fixture::new(); + fixture + .readme() + .cargo_toml("single_license") + .wtfpl_license() + .hello_world_src_lib(); + fixture +} + +pub fn dual_license() -> Fixture { + let fixture = Fixture::new(); + fixture + .readme() + .cargo_toml("dual_license") + .wtfpl_license() + .mit_license() + .hello_world_src_lib(); + fixture +} + +pub fn non_standard_license(license_file: &str) -> Fixture { + let fixture = Fixture::new(); + fixture + .readme() + .cargo_toml_with_license_file("dual_license", license_file) + .file(license_file, "license file for test") + .hello_world_src_lib(); + fixture +} diff --git a/tests/all/utils/logger.rs b/tests/all/utils/logger.rs deleted file mode 100644 index 46cc0d7..0000000 --- a/tests/all/utils/logger.rs +++ /dev/null @@ -1,6 +0,0 @@ -use slog::Logger; - -// Create a logger that ignores log messages for testing. -pub fn null_logger() -> Logger { - Logger::root(slog::Discard, o!()) -} diff --git a/tests/all/utils/manifest.rs b/tests/all/utils/manifest.rs index 2f811ec..2fce9d5 100644 --- a/tests/all/utils/manifest.rs +++ b/tests/all/utils/manifest.rs @@ -23,6 +23,7 @@ pub struct NpmPackage { pub types: String, #[serde(default = "default_none", rename = "sideEffects")] pub side_effects: String, + pub homepage: Option, } fn default_none() -> String { diff --git a/tests/all/utils/mod.rs b/tests/all/utils/mod.rs index 655b80d..8b4244f 100644 --- a/tests/all/utils/mod.rs +++ b/tests/all/utils/mod.rs @@ -1,4 +1,3 @@ pub mod file; pub mod fixture; -pub mod logger; pub mod manifest; diff --git a/tests/all/webdriver.rs b/tests/all/webdriver.rs index f57c275..6223290 100644 --- a/tests/all/webdriver.rs +++ b/tests/all/webdriver.rs @@ -1,12 +1,13 @@ +use binary_install::Cache; use utils::fixture; -use wasm_pack::binaries::Cache; use wasm_pack::test::webdriver; #[test] #[cfg(any( all(target_os = "linux", target_arch = "x86_64"), all(target_os = "macos", target_arch = "x86_64"), - all(target_os = "windows", target_arch = "x86") + all(target_os = "windows", target_arch = "x86"), + all(target_os = "windows", target_arch = "x86_64") ))] fn can_install_chromedriver() { let fixture = fixture::js_hello_world();