aboutsummaryrefslogtreecommitdiff
path: root/src/install
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-02-10 16:42:16 -0800
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-02-10 16:42:16 -0800
commitce442aa3e13195df7f232dac992dc84e5a933ac5 (patch)
tree369e52dda5a251a0c669b197e8a59c72be32d3d5 /src/install
parent6470f26be2b059cc1b5216c60064b7e9eedbeeff (diff)
downloadbun-ce442aa3e13195df7f232dac992dc84e5a933ac5.tar.gz
bun-ce442aa3e13195df7f232dac992dc84e5a933ac5.tar.zst
bun-ce442aa3e13195df7f232dac992dc84e5a933ac5.zip
[bun install] Fix bug when linking bins from scoped packages (e.g. `@babel/parser`)
Diffstat (limited to '')
-rw-r--r--src/install/bin.zig15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/install/bin.zig b/src/install/bin.zig
index d40c43a04..89f971ae8 100644
--- a/src/install/bin.zig
+++ b/src/install/bin.zig
@@ -140,6 +140,13 @@ pub const Bin = extern struct {
NotImplementedYet,
} || std.os.SymLinkError || std.os.OpenError || std.os.RealPathError;
+ fn unscopedPackageName(name: []const u8) []const u8 {
+ if (name[0] != '@') return name;
+ var name_ = name;
+ name_ = name[1..];
+ return name_[(std.mem.indexOfScalar(u8, name_, '/') orelse return name) + 1 ..];
+ }
+
// It is important that we use symlinkat(2) with relative paths instead of symlink()
// That way, if you move your node_modules folder around, the symlinks in .bin still work
// If we used absolute paths for the symlinks, you'd end up with broken symlinks
@@ -170,6 +177,7 @@ pub const Bin = extern struct {
},
.file => {
var target = this.bin.value.file.slice(this.string_buf);
+
if (strings.hasPrefix(target, "./")) {
target = target[2..];
}
@@ -180,8 +188,11 @@ pub const Bin = extern struct {
remain = remain[1..];
var target_path: [:0]u8 = path_buf[0..target_len :0];
- std.mem.copy(u8, from_remain, name);
- from_remain = from_remain[name.len..];
+ // we need to use the unscoped package name here
+ // this is why @babel/parser would fail to link
+ const unscoped_name = unscopedPackageName(name);
+ std.mem.copy(u8, from_remain, unscoped_name);
+ from_remain = from_remain[unscoped_name.len..];
from_remain[0] = 0;
var dest_path: [:0]u8 = from_buf[0 .. @ptrToInt(from_remain.ptr) - @ptrToInt(&from_buf) :0];