diff options
author | 2021-12-16 00:43:39 -0800 | |
---|---|---|
committer | 2021-12-16 00:43:39 -0800 | |
commit | 873cacc15aaeac0d5b91a0a7605726226c8fa494 (patch) | |
tree | 67ad3f93c5a6b730aa14aa1cb1705accd984e246 /src | |
parent | 55ff681976f7bae5a428c409061991c07fa492e7 (diff) | |
download | bun-873cacc15aaeac0d5b91a0a7605726226c8fa494.tar.gz bun-873cacc15aaeac0d5b91a0a7605726226c8fa494.tar.zst bun-873cacc15aaeac0d5b91a0a7605726226c8fa494.zip |
[bundler] Fix edgecase where certain modules would load unbundled versions
Some packages have many `package.json` files with no `name` in them, often to indicate `sideEffects` or change `exports`.
When bundling node_modules, we need a name to map a package back to the list of bundled packages.
Diffstat (limited to 'src')
-rw-r--r-- | src/resolver/dir_info.zig | 2 | ||||
-rw-r--r-- | src/resolver/resolver.zig | 17 |
2 files changed, 17 insertions, 2 deletions
diff --git a/src/resolver/dir_info.zig b/src/resolver/dir_info.zig index 396413327..b79067a48 100644 --- a/src/resolver/dir_info.zig +++ b/src/resolver/dir_info.zig @@ -18,6 +18,8 @@ enclosing_browser_scope: Index = allocators.NotFound, package_json_for_browser_field: ?*const PackageJSON = null, enclosing_tsconfig_json: ?*const TSConfigJSON = null, +/// package.json used for bundling +/// it's the deepest one in the hierarchy with a "name" field enclosing_package_json: ?*PackageJSON = null, abs_path: string = "", diff --git a/src/resolver/resolver.zig b/src/resolver/resolver.zig index bc9d98832..1b6e049f4 100644 --- a/src/resolver/resolver.zig +++ b/src/resolver/resolver.zig @@ -707,6 +707,10 @@ pub const Resolver = struct { var iter = result.path_pair.iter(); while (iter.next()) |path| { var dir: *DirInfo = (r.readDirInfo(path.name.dir) catch continue) orelse continue; + if (result.package_json) |existing| { + if (existing.name.len == 0) result.package_json = null; + } + result.package_json = result.package_json orelse dir.enclosing_package_json; if (dir.enclosing_tsconfig_json) |tsconfig| { @@ -2570,7 +2574,14 @@ pub const Resolver = struct { info.enclosing_browser_scope = parent.?.enclosing_browser_scope; info.package_json_for_browser_field = parent.?.package_json_for_browser_field; info.enclosing_tsconfig_json = parent.?.enclosing_tsconfig_json; - info.enclosing_package_json = parent.?.package_json orelse parent.?.enclosing_package_json; + + if (parent.?.package_json) |parent_package_json| { + if (parent_package_json.name.len > 0) { + info.enclosing_package_json = parent_package_json; + } + } + + info.enclosing_package_json = info.enclosing_package_json orelse parent.?.enclosing_package_json; // Make sure "absRealPath" is the real path of the directory (resolving any symlinks) if (!r.opts.preserve_symlinks) { @@ -2612,7 +2623,9 @@ pub const Resolver = struct { info.enclosing_browser_scope = result.index; info.package_json_for_browser_field = pkg; } - info.enclosing_package_json = pkg; + + if (pkg.name.len > 0) + info.enclosing_package_json = pkg; if (r.debug_logs) |*logs| { logs.addNoteFmt("Resolved package.json in \"{s}\"", .{ |