Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] feat(build): allow specifying multiple targets #523

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/bindgen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ pub fn wasm_bindgen_build(
};

let out_dir = out_dir.to_str().unwrap();
let out_name = &[data.crate_name(), target.to_owned()].join("_");

let wasm_path = data
.target_directory()
Expand All @@ -212,6 +213,8 @@ pub fn wasm_bindgen_build(
cmd.arg(&wasm_path)
.arg("--out-dir")
.arg(out_dir)
.arg("--out-name")
.arg(out_name)
.arg(dts_arg)
.arg(target_arg);

Expand Down
36 changes: 20 additions & 16 deletions src/command/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub struct Build {
pub crate_data: manifest::CrateData,
pub scope: Option<String>,
pub disable_dts: bool,
pub target: String,
pub targets: Vec<String>,
pub profile: BuildProfile,
pub mode: BuildMode,
pub out_dir: PathBuf,
Expand Down Expand Up @@ -99,7 +99,7 @@ pub struct BuildOptions {

#[structopt(long = "target", short = "t", default_value = "browser")]
/// Sets the target environment. [possible values: browser, nodejs, no-modules]
pub target: String,
pub target: Vec<String>,

#[structopt(long = "debug")]
/// Deprecated. Renamed to `--dev`.
Expand Down Expand Up @@ -134,7 +134,7 @@ impl Default for BuildOptions {
scope: None,
mode: BuildMode::Normal,
disable_dts: false,
target: String::new(),
target: vec![],
debug: false,
dev: false,
release: false,
Expand Down Expand Up @@ -166,16 +166,18 @@ impl Build {

// `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");
for target in &build_opts.target {
if !possible_targets.contains(&target.as_str()) {
bail!("Supported targets: browser, nodejs, no-modules");
}
}

Ok(Build {
crate_path,
crate_data,
scope: build_opts.scope,
disable_dts: build_opts.disable_dts,
target: build_opts.target,
targets: build_opts.target,
profile,
mode: build_opts.mode,
out_dir,
Expand Down Expand Up @@ -315,7 +317,7 @@ impl Build {
&self.out_dir,
&self.scope,
self.disable_dts,
&self.target,
&self.targets.iter().map(|n| n.as_ref()).collect::<Vec<_>>(),
step,
)?;
info!(
Expand Down Expand Up @@ -358,15 +360,17 @@ impl Build {

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(),
&self.out_dir,
self.disable_dts,
&self.target,
self.profile,
step,
)?;
for target in &self.targets {
bindgen::wasm_bindgen_build(
&self.crate_data,
self.bindgen.as_ref().unwrap(),
&self.out_dir,
self.disable_dts,
target,
self.profile,
step,
)?;
}
info!("wasm bindings were built at {:#?}.", &self.out_dir);
Ok(())
}
Expand Down
2 changes: 1 addition & 1 deletion src/command/publish/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ pub fn publish(
.to_string();
let build_opts = BuildOptions {
path: Some(crate_path.clone()),
target,
target: vec![target],
out_dir: out_dir.clone(),
..Default::default()
};
Expand Down
125 changes: 33 additions & 92 deletions src/manifest/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@ mod npm;
use std::fs;
use std::path::Path;

use self::npm::{
repository::Repository, CommonJSPackage, ESModulesPackage, NoModulesPackage, NpmPackage,
};
use self::npm::NpmPackage;
use cargo_metadata::Metadata;
use command::build::BuildProfile;
use emoji;
Expand Down Expand Up @@ -366,22 +364,32 @@ impl CrateData {
out_dir: &Path,
scope: &Option<String>,
disable_dts: bool,
target: &str,
targets: &[&str],
step: &Step,
) -> Result<(), Error> {
let msg = format!("{}Writing a package.json...", emoji::MEMO);

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)
} else if target == "no-modules" {
self.to_nomodules(scope, disable_dts)
} else {
self.to_esmodules(scope, disable_dts)
};
let mut npm_package = self.to_base_package(scope, disable_dts, targets[0]);
for target in targets {
if target == &"nodejs" {
let mut npm_data = self.npm_data(scope, false, disable_dts, target);
npm_package.main = Some(npm_data.main);
npm_package.files.append(&mut npm_data.files);
} else if target == &"no-modules" {
let mut npm_data = self.npm_data(scope, false, disable_dts, target);
npm_package.browser = Some(npm_data.main.clone());
npm_package.files.append(&mut npm_data.files);
} else {
let mut npm_data = self.npm_data(scope, false, disable_dts, target);
npm_package.module = Some(npm_data.main.clone());
npm_package.side_effects = Some("false".to_string());
npm_package.files.append(&mut npm_data.files);
}
}

let npm_json = serde_json::to_string_pretty(&npm_data)?;
let npm_json = serde_json::to_string_pretty(&npm_package)?;
fs::write(&pkg_file_path, npm_json)
.with_context(|_| format!("failed to write: {}", pkg_file_path.display()))?;
Ok(())
Expand All @@ -392,15 +400,16 @@ impl CrateData {
scope: &Option<String>,
include_commonjs_shim: bool,
disable_dts: bool,
target: &str,
) -> NpmData {
let crate_name = self.crate_name();
let wasm_file = format!("{}_bg.wasm", crate_name);
let js_file = format!("{}.js", crate_name);
let wasm_file = format!("{}_{}_bg.wasm", crate_name, target);
let js_file = format!("{}_{}.js", crate_name, target);
let mut files = vec![wasm_file];

files.push(js_file.clone());
if include_commonjs_shim {
let js_bg_file = format!("{}_bg.js", crate_name);
let js_bg_file = format!("{}_{}_bg.js", crate_name, target);
files.push(js_bg_file.to_string());
}

Expand All @@ -411,7 +420,7 @@ impl CrateData {
};

let dts_file = if !disable_dts {
let file = format!("{}.d.ts", crate_name);
let file = format!("{}_{}.d.ts", crate_name, target);
files.push(file.to_string());
Some(file)
} else {
Expand All @@ -425,86 +434,18 @@ impl CrateData {
}
}

fn to_commonjs(&self, scope: &Option<String>, disable_dts: bool) -> NpmPackage {
let data = self.npm_data(scope, true, disable_dts);
let pkg = &self.data.packages[self.current_idx];

self.check_optional_fields();

NpmPackage::CommonJSPackage(CommonJSPackage {
name: data.name,
collaborators: pkg.authors.clone(),
description: self.manifest.package.description.clone(),
version: pkg.version.clone(),
license: self.manifest.package.license.clone(),
repository: self
.manifest
.package
.repository
.clone()
.map(|repo_url| Repository {
ty: "git".to_string(),
url: repo_url,
}),
files: data.files,
main: data.main,
types: data.dts_file,
})
}

fn to_esmodules(&self, scope: &Option<String>, disable_dts: bool) -> NpmPackage {
let data = self.npm_data(scope, false, disable_dts);
let pkg = &self.data.packages[self.current_idx];

self.check_optional_fields();

NpmPackage::ESModulesPackage(ESModulesPackage {
name: data.name,
collaborators: pkg.authors.clone(),
description: self.manifest.package.description.clone(),
version: pkg.version.clone(),
license: self.manifest.package.license.clone(),
repository: self
.manifest
.package
.repository
.clone()
.map(|repo_url| Repository {
ty: "git".to_string(),
url: repo_url,
}),
files: data.files,
module: data.main,
types: data.dts_file,
side_effects: "false".to_string(),
})
}

fn to_nomodules(&self, scope: &Option<String>, disable_dts: bool) -> NpmPackage {
let data = self.npm_data(scope, false, disable_dts);
fn to_base_package(
&self,
scope: &Option<String>,
disable_dts: bool,
target: &str,
) -> NpmPackage {
let data = self.npm_data(scope, false, disable_dts, target);
let pkg = &self.data.packages[self.current_idx];

self.check_optional_fields();

NpmPackage::NoModulesPackage(NoModulesPackage {
name: data.name,
collaborators: pkg.authors.clone(),
description: self.manifest.package.description.clone(),
version: pkg.version.clone(),
license: self.manifest.package.license.clone(),
repository: self
.manifest
.package
.repository
.clone()
.map(|repo_url| Repository {
ty: "git".to_string(),
url: repo_url,
}),
files: data.files,
browser: data.main,
types: data.dts_file,
})
NpmPackage::base(data, &pkg, &self.manifest)
}

fn check_optional_fields(&self) {
Expand Down
20 changes: 0 additions & 20 deletions src/manifest/npm/commonjs.rs

This file was deleted.

22 changes: 0 additions & 22 deletions src/manifest/npm/esmodules.rs

This file was deleted.

Loading