From 03321fd7af75fd507b1f4c106747ea68f3dd67b0 Mon Sep 17 00:00:00 2001 From: Christopher Pruijsen Date: Sun, 13 Sep 2026 10:01:53 +0000 Subject: [PATCH] fix: keep existing package.json when --no-pack is passed create_pkg_dir unconditionally deleted out_dir/package.json so a stale wasm-pack manifest could not break the dependency merge in write_package_json. With --no-pack that merge never runs, so the deletion only destroyed a user-provided file. Skip the cleanup when no_pack is set. Fixes #1521 --- src/command/build.rs | 2 +- src/command/utils.rs | 7 +++++-- tests/all/build.rs | 18 ++++++++++++++++++ tests/all/manifest.rs | 28 ++++++++++++++-------------- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/command/build.rs b/src/command/build.rs index 531503a0d..448d9aad8 100644 --- a/src/command/build.rs +++ b/src/command/build.rs @@ -439,7 +439,7 @@ impl Build { fn step_create_dir(&mut self) -> Result<()> { info!("Creating a pkg directory..."); - create_pkg_dir(&self.out_dir, self.no_gitignore)?; + create_pkg_dir(&self.out_dir, self.no_gitignore, self.no_pack)?; info!("Created a pkg directory at {:#?}.", &self.crate_path); Ok(()) } diff --git a/src/command/utils.rs b/src/command/utils.rs index d0754167a..e671eaa44 100644 --- a/src/command/utils.rs +++ b/src/command/utils.rs @@ -36,8 +36,11 @@ fn find_manifest_from_cwd() -> Result { } /// Construct our `pkg` directory in the crate. -pub fn create_pkg_dir(out_dir: &Path, no_gitignore: bool) -> Result<()> { - let _ = fs::remove_file(out_dir.join("package.json")); // Clean up package.json from previous runs +pub fn create_pkg_dir(out_dir: &Path, no_gitignore: bool, no_pack: bool) -> Result<()> { + if !no_pack { + // Clean up package.json from previous runs + let _ = fs::remove_file(out_dir.join("package.json")); + } fs::create_dir_all(&out_dir)?; if !no_gitignore { fs::write(out_dir.join(".gitignore"), "*")?; diff --git a/tests/all/build.rs b/tests/all/build.rs index e61585ffa..0a181bda4 100644 --- a/tests/all/build.rs +++ b/tests/all/build.rs @@ -37,6 +37,24 @@ fn it_should_not_make_a_pkg_json_if_passed_no_pack() { assert_eq!(pkg_path.join("licence").exists(), false); } +#[test] +fn it_should_not_delete_existing_pkg_json_if_passed_no_pack() { + let fixture = utils::fixture::js_hello_world(); + let package_json_path = fixture.path.join("pkg").join("package.json"); + fixture.file("pkg/package.json", r#"{ "name": "pre-existing" }"#); + fixture + .wasm_pack() + .arg("build") + .arg("--no-pack") + .assert() + .success(); + + assert_eq!( + fs::read_to_string(&package_json_path).unwrap(), + r#"{ "name": "pre-existing" }"# + ); +} + #[test] fn it_should_build_js_hello_world_example_with_custom_target_dir() { let fixture = utils::fixture::js_hello_world(); diff --git a/tests/all/manifest.rs b/tests/all/manifest.rs index ec4418604..4d25f02e9 100644 --- a/tests/all/manifest.rs +++ b/tests/all/manifest.rs @@ -77,7 +77,7 @@ fn it_creates_a_package_json_default_path() { let fixture = fixture::js_hello_world(); let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); assert!(crate_data .write_package_json(&out_dir, &None, false, Target::Bundler) .is_ok()); @@ -117,7 +117,7 @@ fn it_creates_a_package_json_provided_path() { let fixture = fixture::js_hello_world(); let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); assert!(crate_data .write_package_json(&out_dir, &None, false, Target::Bundler) .is_ok()); @@ -147,7 +147,7 @@ fn it_creates_a_package_json_provided_path_with_scope() { let fixture = fixture::js_hello_world(); let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); assert!(crate_data .write_package_json(&out_dir, &Some("test".to_string()), false, Target::Bundler,) .is_ok()); @@ -177,7 +177,7 @@ fn it_creates_a_pkg_json_with_correct_files_on_node() { let fixture = fixture::js_hello_world(); let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); assert!(crate_data .write_package_json(&out_dir, &None, false, Target::Nodejs) .is_ok()); @@ -211,7 +211,7 @@ 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 crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); assert!(crate_data .write_package_json(&out_dir, &None, false, Target::NoModules) .is_ok()); @@ -245,7 +245,7 @@ fn it_creates_a_package_json_with_correct_files_when_out_name_is_provided() { let fixture = fixture::js_hello_world(); let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, Some("index".to_owned())).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); assert!(crate_data .write_package_json(&out_dir, &None, false, Target::Bundler) .is_ok()); @@ -278,7 +278,7 @@ fn it_creates_a_pkg_json_in_out_dir() { let fixture = fixture::js_hello_world(); let out_dir = fixture.path.join("./custom/out"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); assert!(crate_data .write_package_json(&out_dir, &None, false, Target::Bundler) .is_ok()); @@ -293,7 +293,7 @@ fn it_creates_a_package_json_with_correct_keys_when_types_are_skipped() { let fixture = fixture::js_hello_world(); let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); assert!(crate_data .write_package_json(&out_dir, &None, true, Target::Bundler) .is_ok()); @@ -341,7 +341,7 @@ fn it_creates_a_package_json_with_npm_dependencies_provided_by_wasm_bindgen() { let fixture = fixture::js_hello_world(); let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); // Write a `package.json` in the out_dir, as wasm-bindgen does: utils::manifest::create_wbg_package_json( &out_dir, @@ -421,7 +421,7 @@ fn it_sets_homepage_field_if_available_in_cargo_toml() { let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); crate_data .write_package_json(&out_dir, &None, true, Target::Bundler) .unwrap(); @@ -437,7 +437,7 @@ fn it_sets_homepage_field_if_available_in_cargo_toml() { let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); crate_data .write_package_json(&out_dir, &None, true, Target::Bundler) .unwrap(); @@ -476,7 +476,7 @@ fn it_sets_keywords_field_if_available_in_cargo_toml() { let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); crate_data .write_package_json(&out_dir, &None, true, Target::Bundler) .unwrap(); @@ -494,7 +494,7 @@ fn it_sets_keywords_field_if_available_in_cargo_toml() { let out_dir = fixture.path.join("pkg"); let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); crate_data .write_package_json(&out_dir, &None, true, Target::Bundler) .unwrap(); @@ -592,7 +592,7 @@ fn it_lists_license_files_in_files_field_of_package_json() { let crate_data = manifest::CrateData::new(&fixture.path, None).unwrap(); - wasm_pack::command::utils::create_pkg_dir(&out_dir, false).unwrap(); + wasm_pack::command::utils::create_pkg_dir(&out_dir, false, false).unwrap(); license::copy_from_crate(&crate_data, &fixture.path, &out_dir).unwrap(); crate_data .write_package_json(&out_dir, &None, false, Target::Bundler)