diff options
author | 2023-02-09 00:37:14 +0200 | |
---|---|---|
committer | 2023-02-08 14:37:14 -0800 | |
commit | 18807cef03ac83a6a3dabded7a9735b87792f52e (patch) | |
tree | d40b8968840d16a7e1a96695b46e5415b3c4176a /src/install/dependency.zig | |
parent | cbc28afd51547f7a90161741cf826ee7f1485ae6 (diff) | |
download | bun-18807cef03ac83a6a3dabded7a9735b87792f52e.tar.gz bun-18807cef03ac83a6a3dabded7a9735b87792f52e.tar.zst bun-18807cef03ac83a6a3dabded7a9735b87792f52e.zip |
[install] assorted fixes & improvements (#2011)
- take `peerDependencies` into account during package placement
- do not recursively resolve `workspaces` (matches `npm`)
- link binaries to non-root packages correctly
- prune empty nodes during dependency tree construction
- support non-standard `workspace:` specifier
Diffstat (limited to 'src/install/dependency.zig')
-rw-r--r-- | src/install/dependency.zig | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/src/install/dependency.zig b/src/install/dependency.zig index 98a62ac87..315c22894 100644 --- a/src/install/dependency.zig +++ b/src/install/dependency.zig @@ -473,12 +473,24 @@ pub const Version = struct { } }, // v1.2.3 + // verilog // verilog.tar.gz // verilog/repo 'v' => { if (isTarball(dependency)) return .tarball; if (isGitHubRepoPath(dependency)) return .github; - return .npm; + if (dependency.len == 1) return .dist_tag; + return switch (dependency[1]) { + '0'...'9' => .npm, + else => .dist_tag, + }; + }, + // workspace:* + // w00t + // w00t.tar.gz + // w00t/repo + 'w' => { + if (strings.hasPrefixComptime(dependency, "workspace:")) return .workspace; }, // x // xyz.tar.gz @@ -626,7 +638,7 @@ pub fn parseWithTag( return null; }; - return Version{ + return .{ .literal = sliced.value(), .value = .{ .npm = .{ @@ -638,12 +650,12 @@ pub fn parseWithTag( }; }, .dist_tag => { - var tag_to_use: String = sliced.value(); + var tag_to_use = sliced.value(); const actual = if (strings.hasPrefixComptime(dependency, "npm:") and dependency.len > "npm:".len) // npm:@foo/bar@latest sliced.sub(brk: { - var i: usize = "npm:".len; + var i = "npm:".len; // npm:@foo/bar@latest // ^ @@ -673,7 +685,7 @@ pub fn parseWithTag( // tag should never be empty if (Environment.allow_assert) std.debug.assert(!tag_to_use.isEmpty()); - return Version{ + return .{ .literal = sliced.value(), .value = .{ .dist_tag = .{ @@ -739,7 +751,7 @@ pub fn parseWithTag( repo = repo[0 .. repo.len - ".git".len]; } - return Version{ + return .{ .literal = sliced.value(), .value = .{ .github = .{ @@ -753,26 +765,26 @@ pub fn parseWithTag( }, .tarball => { if (strings.hasPrefixComptime(dependency, "https://") or strings.hasPrefixComptime(dependency, "http://")) { - return Version{ + return .{ .tag = .tarball, .literal = sliced.value(), - .value = .{ .tarball = URI{ .remote = sliced.sub(dependency).value() } }, + .value = .{ .tarball = .{ .remote = sliced.sub(dependency).value() } }, }; } else if (strings.hasPrefixComptime(dependency, "file://")) { - return Version{ + return .{ .tag = .tarball, .literal = sliced.value(), - .value = .{ .tarball = URI{ .local = sliced.sub(dependency[7..]).value() } }, + .value = .{ .tarball = .{ .local = sliced.sub(dependency[7..]).value() } }, }; } else if (strings.contains(dependency, "://")) { if (log_) |log| log.addErrorFmt(null, logger.Loc.Empty, allocator, "invalid or unsupported dependency \"{s}\"", .{dependency}) catch unreachable; return null; } - return Version{ + return .{ .literal = sliced.value(), .value = .{ - .tarball = URI{ + .tarball = .{ .local = sliced.value(), }, }, @@ -787,14 +799,14 @@ pub fn parseWithTag( return null; } - return Version{ .literal = sliced.value(), .value = .{ .folder = sliced.sub(dependency[protocol + 1 ..]).value() }, .tag = .folder }; + return .{ .literal = sliced.value(), .value = .{ .folder = sliced.sub(dependency[protocol + 1 ..]).value() }, .tag = .folder }; } if (log_) |log| log.addErrorFmt(null, logger.Loc.Empty, allocator, "Unsupported protocol {s}", .{dependency}) catch unreachable; return null; } - return Version{ + return .{ .value = .{ .folder = sliced.value() }, .tag = .folder, .literal = sliced.value(), @@ -803,22 +815,26 @@ pub fn parseWithTag( .uninitialized => return null, .symlink => { if (strings.indexOfChar(dependency, ':')) |colon| { - return Version{ + return .{ .value = .{ .symlink = sliced.sub(dependency[colon + 1 ..]).value() }, .tag = .symlink, .literal = sliced.value(), }; } - return Version{ + return .{ .value = .{ .symlink = sliced.value() }, .tag = .symlink, .literal = sliced.value(), }; }, .workspace => { - return Version{ - .value = .{ .workspace = sliced.value() }, + var input = dependency; + if (strings.hasPrefixComptime(input, "workspace:")) { + input = input["workspace:".len..]; + } + return .{ + .value = .{ .workspace = sliced.sub(input).value() }, .tag = .workspace, .literal = sliced.value(), }; |