Skip to content
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
49 changes: 23 additions & 26 deletions src/resolver/resolver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1554,7 +1554,9 @@ impl<'a> Resolver<'a> {

let mut iter = result.path_pair.iter();
let mut module_type = result.module_type;
let mut is_primary_path = true;
while let Some(path) = iter.next() {
let is_primary = core::mem::replace(&mut is_primary_path, false);
let name = path.name();
let Ok(Some(dir)) = self.read_dir_info(name.dir) else {
continue;
Expand All @@ -1570,33 +1572,28 @@ impl<'a> Resolver<'a> {
PJSideEffects::Unspecified | PJSideEffects::Glob(_) | PJSideEffects::Mixed(_)
);

result.primary_side_effects_data = match &existing.side_effects {
PJSideEffects::Unspecified => SideEffects::HasSideEffects,
PJSideEffects::False => SideEffects::NoSideEffectsPackageJson,
PJSideEffects::Map(map) => {
if map.contains_key(&crate::package_json::StringHashMapUnownedKey::init(
path.text(),
)) {
SideEffects::HasSideEffects
} else {
SideEffects::NoSideEffectsPackageJson
}
}
PJSideEffects::Glob(_) => {
if existing.side_effects.has_side_effects(path.text()) {
SideEffects::HasSideEffects
} else {
SideEffects::NoSideEffectsPackageJson
if is_primary {
result.primary_side_effects_data = match &existing.side_effects {
PJSideEffects::Unspecified => SideEffects::HasSideEffects,
PJSideEffects::False => SideEffects::NoSideEffectsPackageJson,
PJSideEffects::Map(map) => {
if map.contains_key(
&crate::package_json::StringHashMapUnownedKey::init(path.text()),
) {
SideEffects::HasSideEffects
} else {
SideEffects::NoSideEffectsPackageJson
}
}
}
PJSideEffects::Mixed(_) => {
if existing.side_effects.has_side_effects(path.text()) {
SideEffects::HasSideEffects
} else {
SideEffects::NoSideEffectsPackageJson
PJSideEffects::Glob(_) | PJSideEffects::Mixed(_) => {
if existing.side_effects.has_side_effects(path.text()) {
SideEffects::HasSideEffects
} else {
SideEffects::NoSideEffectsPackageJson
}
}
}
};
};
}

if existing.name.is_empty() || self.care_about_bin_folder {
result.package_json = None;
Expand All @@ -1607,7 +1604,7 @@ impl<'a> Resolver<'a> {
.package_json
.or_else(|| dir.enclosing_package_json.map(std::ptr::from_ref));

if needs_side_effects {
if needs_side_effects && is_primary {
if let Some(package_json) = Result::deref_package_json(result.package_json) {
use crate::package_json::SideEffects as PJSideEffects;
result.primary_side_effects_data = match &package_json.side_effects {
Expand Down
88 changes: 88 additions & 0 deletions test/bundler/esbuild/dce.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,94 @@ describe("bundler", () => {
stdout: "this should be kept\nunused import",
},
});
// https://github.com/oven-sh/bun/issues/8993
// The "name" field is load-bearing: without it the package is not recorded as the
// enclosing package.json and the secondary-path iteration is a no-op.
itBundled("dce/PackageJsonSideEffectsArrayModuleMainBareImport", {
todo: isWindows,
files: {
"/Users/user/project/src/entry.js": /* js */ `
import "demo-pkg"
console.log('after import')
`,
"/Users/user/project/node_modules/demo-pkg/dist/index-module.js": /* js */ `
import "./register.js"
export const foo = 1
`,
"/Users/user/project/node_modules/demo-pkg/dist/register.js": /* js */ `
console.log('this should be kept')
`,
"/Users/user/project/node_modules/demo-pkg/dist/index-main.js": /* js */ `
console.log('TEST FAILED')
`,
"/Users/user/project/node_modules/demo-pkg/package.json": /* json */ `
{
"name": "demo-pkg",
"main": "dist/index-main.js",
"module": "dist/index-module.js",
"sideEffects": ["./dist/index-module.js", "./dist/register.js"]
}
`,
},
dce: true,
run: {
stdout: "this should be kept\nafter import",
},
});
itBundled("dce/PackageJsonSideEffectsGlobModuleMainBareImport", {
todo: isWindows,
files: {
"/Users/user/project/src/entry.js": /* js */ `
import "demo-pkg"
console.log('after import')
`,
"/Users/user/project/node_modules/demo-pkg/dist/index-module.js": /* js */ `
console.log('this should be kept')
`,
"/Users/user/project/node_modules/demo-pkg/dist/bundle.node.js": /* js */ `
console.log('TEST FAILED')
`,
"/Users/user/project/node_modules/demo-pkg/package.json": /* json */ `
{
"name": "demo-pkg",
"main": "dist/bundle.node.js",
"module": "dist/index-module.js",
"sideEffects": ["./dist/index-*.js"]
}
`,
},
dce: true,
run: {
stdout: "this should be kept\nafter import",
},
});
itBundled("dce/PackageJsonSideEffectsArrayModuleMainBareImportRemove", {
files: {
"/Users/user/project/src/entry.js": /* js */ `
import "demo-pkg"
console.log('unused import')
`,
"/Users/user/project/node_modules/demo-pkg/dist/index-module.js": /* js */ `
export const foo = 'TEST FAILED'
console.log('TEST FAILED')
`,
"/Users/user/project/node_modules/demo-pkg/dist/index-main.js": /* js */ `
console.log('TEST FAILED')
`,
"/Users/user/project/node_modules/demo-pkg/package.json": /* json */ `
{
"name": "demo-pkg",
"main": "dist/index-main.js",
"module": "dist/index-module.js",
"sideEffects": ["./dist/index-main.js"]
}
`,
},
dce: true,
run: {
stdout: "unused import",
},
});
itBundled("dce/PackageJsonSideEffectsArrayGlob", {
files: {
"/Users/user/project/src/entry.js": /* js */ `
Expand Down
Loading