diff --git a/packages/cli-opt/src/file.rs b/packages/cli-opt/src/file.rs index 5c0e462174..16ae754e3d 100644 --- a/packages/cli-opt/src/file.rs +++ b/packages/cli-opt/src/file.rs @@ -97,7 +97,8 @@ pub(crate) fn process_file_to_with_options( } // If everything was successful, rename the temp file to the final output path - std::fs::rename(temp_path, output_path).context("Failed to rename output file")?; + std::fs::rename(temp_path, output_path) + .with_context(|| format!("Failed to rename output file to: {}", output_path.display()))?; Ok(()) } diff --git a/packages/cli-opt/src/hash.rs b/packages/cli-opt/src/hash.rs index 79cfb2b8e4..05163e050e 100644 --- a/packages/cli-opt/src/hash.rs +++ b/packages/cli-opt/src/hash.rs @@ -152,7 +152,10 @@ pub fn add_hash_to_asset(asset: &mut BundledAsset) { }; if let Some(ext) = ext { - bundled_path.set_extension(ext); + // Push the extension to the bundled path. There may be multiple extensions (e.g. .js.map) + // with one left after the file_stem is extracted above so we need to push the extension + // instead of setting it + bundled_path.as_mut_os_string().push(format!(".{ext}")); } let bundled_path = bundled_path.to_string_lossy().to_string(); diff --git a/packages/cli-opt/src/lib.rs b/packages/cli-opt/src/lib.rs index c52313527d..b84252a211 100644 --- a/packages/cli-opt/src/lib.rs +++ b/packages/cli-opt/src/lib.rs @@ -79,9 +79,14 @@ impl AssetManifest { .is_some_and(|assets| assets.contains(asset)) } - /// Iterate over all the assets in the manifest - pub fn assets(&self) -> impl Iterator { - self.assets.values().flat_map(|assets| assets.iter()) + /// Iterate over all the assets with unique output paths in the manifest. This will not include + /// assets that have different source paths, but the same file contents. + pub fn unique_assets(&self) -> impl Iterator { + let mut seen = HashSet::new(); + self.assets + .values() + .flat_map(|assets| assets.iter()) + .filter(move |asset| seen.insert(asset.bundled_path())) } pub fn load_from_file(path: &Path) -> anyhow::Result { diff --git a/packages/cli/src/build/builder.rs b/packages/cli/src/build/builder.rs index 84f8df388a..8b00b24c97 100644 --- a/packages/cli/src/build/builder.rs +++ b/packages/cli/src/build/builder.rs @@ -637,7 +637,7 @@ impl AppBuilder { let asset_dir = self.build.asset_dir(); // Hotpatch asset!() calls - for bundled in res.assets.assets() { + for bundled in res.assets.unique_assets() { let original_artifacts = self .artifacts .as_mut() diff --git a/packages/cli/src/build/request.rs b/packages/cli/src/build/request.rs index 51e6e189a0..b398fed121 100644 --- a/packages/cli/src/build/request.rs +++ b/packages/cli/src/build/request.rs @@ -1189,7 +1189,7 @@ impl BuildRequest { // Create a set of all the paths that new files will be bundled to let mut keep_bundled_output_paths: HashSet<_> = assets - .assets() + .unique_assets() .map(|a| asset_dir.join(a.bundled_path())) .collect(); @@ -1228,7 +1228,7 @@ impl BuildRequest { let mut assets_to_transfer = vec![]; // Queue the bundled assets - for bundled in assets.assets() { + for bundled in assets.unique_assets() { let from = PathBuf::from(bundled.absolute_source_path()); let to = asset_dir.join(bundled.bundled_path()); @@ -4310,7 +4310,7 @@ __wbg_init({{module_or_path: "/{}/{wasm_path}"}}).then((wasm) => {{ } // Inject any resources from manganis into the head - for asset in assets.assets() { + for asset in assets.unique_assets() { let asset_path = asset.bundled_path(); match asset.options().variant() { AssetVariant::Css(css_options) => { diff --git a/packages/cli/src/cli/build_assets.rs b/packages/cli/src/cli/build_assets.rs index f8688b2caf..4023d58f46 100644 --- a/packages/cli/src/cli/build_assets.rs +++ b/packages/cli/src/cli/build_assets.rs @@ -19,7 +19,7 @@ impl BuildAssets { let manifest = extract_assets_from_file(&self.executable)?; create_dir_all(&self.destination)?; - for asset in manifest.assets() { + for asset in manifest.unique_assets() { let source_path = PathBuf::from(asset.absolute_source_path()); let destination_path = self.destination.join(asset.bundled_path()); debug!(