From 64c5a22ff6f20a9b20790b50480dceb1c5e1d28d Mon Sep 17 00:00:00 2001 From: Ashley Williams Date: Fri, 21 Sep 2018 11:19:13 -0400 Subject: [PATCH 1/5] feat(bindgen): accept no-modules as target --- src/bindgen.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bindgen.rs b/src/bindgen.rs index 2d4a2bb0..60fd72cb 100644 --- a/src/bindgen.rs +++ b/src/bindgen.rs @@ -136,6 +136,7 @@ pub fn wasm_bindgen_build( }; let target_arg = match target { "nodejs" => "--nodejs", + "no-modules" => "--no-modules", _ => "--browser", }; let bindgen_path = Path::new(&wasm_bindgen_path); From 1985db371f8006c9eae7ebc7dcad80d8e6415c9c Mon Sep 17 00:00:00 2001 From: Ashley Williams Date: Fri, 21 Sep 2018 11:22:46 -0400 Subject: [PATCH 2/5] feat(manifest:npm): add nomodules manifest struct --- src/manifest/npm/mod.rs | 3 +++ src/manifest/npm/nomodules.rs | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/manifest/npm/nomodules.rs diff --git a/src/manifest/npm/mod.rs b/src/manifest/npm/mod.rs index 36244169..c8d65821 100644 --- a/src/manifest/npm/mod.rs +++ b/src/manifest/npm/mod.rs @@ -1,13 +1,16 @@ mod commonjs; mod esmodules; +mod nomodules; pub mod repository; pub use self::commonjs::CommonJSPackage; pub use self::esmodules::ESModulesPackage; +pub use self::nomodules::NoModulesPackage; #[derive(Serialize)] #[serde(untagged)] pub enum NpmPackage { CommonJSPackage(CommonJSPackage), ESModulesPackage(ESModulesPackage), + NoModulesPackage(NoModulesPackage), } diff --git a/src/manifest/npm/nomodules.rs b/src/manifest/npm/nomodules.rs new file mode 100644 index 00000000..696a74b0 --- /dev/null +++ b/src/manifest/npm/nomodules.rs @@ -0,0 +1,20 @@ +use manifest::npm::repository::Repository; + +#[derive(Serialize)] +pub struct NoModulesPackage { + pub name: String, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub collaborators: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + pub version: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub license: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub repository: Option, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub files: Vec, + pub browser: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub types: Option, +} From d79349e1f5943b6ba6f16af51332b8c7c5015257 Mon Sep 17 00:00:00 2001 From: Ashley Williams Date: Fri, 21 Sep 2018 11:26:41 -0400 Subject: [PATCH 3/5] feat(manifest): build no_modules npmpkg --- src/manifest/mod.rs | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/manifest/mod.rs b/src/manifest/mod.rs index fe178cae..75dbd170 100644 --- a/src/manifest/mod.rs +++ b/src/manifest/mod.rs @@ -7,7 +7,7 @@ use std::fs::File; use std::io::prelude::*; use std::path::Path; -use self::npm::{repository::Repository, CommonJSPackage, ESModulesPackage, NpmPackage}; +use self::npm::{repository::Repository, CommonJSPackage, ESModulesPackage, NoModulesPackage, NpmPackage}; use console::style; use emoji; use error::Error; @@ -193,6 +193,42 @@ impl CargoManifest { side_effects: "false".to_string(), }) } + + fn into_nomodules(mut self, scope: &Option, disable_dts: bool) -> NpmPackage { + let filename = self.package.name.replace("-", "_"); + let wasm_file = format!("{}_bg.wasm", filename); + let js_file = format!("{}.js", filename); + let mut files = vec![wasm_file, js_file.clone()]; + + let dts_file = if disable_dts == false { + let file = format!("{}.d.ts", filename); + files.push(file.to_string()); + Some(file) + } else { + None + }; + + if let Some(s) = scope { + self.package.name = format!("@{}/{}", s, self.package.name); + } + + &self.package.check_optional_fields(); + + NpmPackage::NoModulesPackage(NoModulesPackage { + name: self.package.name, + collaborators: self.package.authors, + description: self.package.description, + version: self.package.version, + license: self.package.license, + repository: self.package.repository.map(|repo_url| Repository { + ty: "git".to_string(), + url: repo_url, + }), + files: files, + browser: js_file, + types: dts_file, + }) + } } /// Generate a package.json file inside in `./pkg`. @@ -212,6 +248,8 @@ pub fn write_package_json( let crate_data = read_cargo_toml(path)?; let npm_data = if target == "nodejs" { crate_data.into_commonjs(scope, disable_dts) + } else if target == "no-modules" { + crate_data.into_nomodules(scope, disable_dts) } else { crate_data.into_esmodules(scope, disable_dts) }; From 286bed9c276b3d1af42eb80e5998ffd84705d4bf Mon Sep 17 00:00:00 2001 From: Ashley Williams Date: Fri, 21 Sep 2018 12:16:24 -0400 Subject: [PATCH 4/5] test(no-modules): no-modules works --- tests/all/manifest.rs | 35 +++++++++++++++++++++++++++++++++++ tests/all/utils/manifest.rs | 2 ++ 2 files changed, 37 insertions(+) diff --git a/tests/all/manifest.rs b/tests/all/manifest.rs index 1a948198..8d84e358 100644 --- a/tests/all/manifest.rs +++ b/tests/all/manifest.rs @@ -179,6 +179,41 @@ fn it_creates_a_pkg_json_with_correct_files_on_node() { assert_eq!(actual_files, expected_files); } +#[test] +fn it_creates_a_pkg_json_with_correct_files_on_nomodules() { + let fixture = fixture::js_hello_world(); + let out_dir = fixture.path.join("pkg"); + let step = wasm_pack::progressbar::Step::new(1); + wasm_pack::command::utils::create_pkg_dir(&out_dir, &step).unwrap(); + assert!( + manifest::write_package_json(&fixture.path, &out_dir, &None, false, "no-modules", &step) + .is_ok() + ); + let package_json_path = &out_dir.join("package.json"); + assert!(fs::metadata(package_json_path).is_ok()); + utils::manifest::read_package_json(&fixture.path, &out_dir).unwrap(); + let pkg = utils::manifest::read_package_json(&fixture.path, &out_dir).unwrap(); + assert_eq!(pkg.name, "js-hello-world"); + assert_eq!(pkg.repository.ty, "git"); + assert_eq!( + pkg.repository.url, + "https://github.com/rustwasm/wasm-pack.git" + ); + assert_eq!(pkg.browser, "js_hello_world.js"); + assert_eq!(pkg.types, "js_hello_world.d.ts"); + + let actual_files: HashSet = pkg.files.into_iter().collect(); + let expected_files: HashSet = [ + "js_hello_world_bg.wasm", + "js_hello_world.js", + "js_hello_world.d.ts", + ] + .iter() + .map(|&s| String::from(s)) + .collect(); + assert_eq!(actual_files, expected_files); +} + #[test] fn it_creates_a_pkg_json_in_out_dir() { let fixture = fixture::js_hello_world(); diff --git a/tests/all/utils/manifest.rs b/tests/all/utils/manifest.rs index ebc767d8..2f811ecc 100644 --- a/tests/all/utils/manifest.rs +++ b/tests/all/utils/manifest.rs @@ -18,6 +18,8 @@ pub struct NpmPackage { #[serde(default = "default_none")] pub module: String, #[serde(default = "default_none")] + pub browser: String, + #[serde(default = "default_none")] pub types: String, #[serde(default = "default_none", rename = "sideEffects")] pub side_effects: String, From 120236f1a93e5e96b9b7692e9630aad93fcdd70d Mon Sep 17 00:00:00 2001 From: Ashley Williams Date: Fri, 21 Sep 2018 12:19:28 -0400 Subject: [PATCH 5/5] fix(style): appease cargo fmt --- src/manifest/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/manifest/mod.rs b/src/manifest/mod.rs index 75dbd170..f59baefc 100644 --- a/src/manifest/mod.rs +++ b/src/manifest/mod.rs @@ -7,7 +7,9 @@ use std::fs::File; use std::io::prelude::*; use std::path::Path; -use self::npm::{repository::Repository, CommonJSPackage, ESModulesPackage, NoModulesPackage, NpmPackage}; +use self::npm::{ + repository::Repository, CommonJSPackage, ESModulesPackage, NoModulesPackage, NpmPackage, +}; use console::style; use emoji; use error::Error;