aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-07-19 14:08:52 -0700
committerGravatar GitHub <noreply@github.com> 2023-07-20 00:08:52 +0300
commitd74d95d9abbed699e15a8e105e2fe87d0195161e (patch)
tree39c664259d42e8b620d126ff1eab1936860cda00
parenta59ddb131eab3dbfaf193c11b230c0e4709b3b66 (diff)
downloadbun-d74d95d9abbed699e15a8e105e2fe87d0195161e.tar.gz
bun-d74d95d9abbed699e15a8e105e2fe87d0195161e.tar.zst
bun-d74d95d9abbed699e15a8e105e2fe87d0195161e.zip
Better error for workspace dependency not found (#3678)
-rw-r--r--src/install/install.zig78
-rw-r--r--src/install/resolvers/folder_resolver.zig28
2 files changed, 85 insertions, 21 deletions
diff --git a/src/install/install.zig b/src/install/install.zig
index a71ad6a5a..a91a3dd93 100644
--- a/src/install/install.zig
+++ b/src/install/install.zig
@@ -2601,7 +2601,9 @@ pub const PackageManager = struct {
},
.workspace => {
// relative to cwd
- const res = FolderResolution.getOrPut(.{ .relative = .workspace }, version, this.lockfile.str(&version.value.workspace), this);
+ const workspace_path: *const String = this.lockfile.workspace_paths.getPtr(@truncate(String.Builder.stringHash(this.lockfile.str(&version.value.workspace)))) orelse &version.value.workspace;
+
+ const res = FolderResolution.getOrPut(.{ .relative = .workspace }, version, this.lockfile.str(workspace_path), this);
switch (res) {
.err => |err| return err,
@@ -3166,7 +3168,7 @@ pub const PackageManager = struct {
this.enqueueNetworkTask(network_task);
}
},
- .symlink, .workspace => {
+ inline .symlink, .workspace => |dependency_tag| {
const _result = this.getOrPutResolvedPackage(
name_hash,
name,
@@ -3183,7 +3185,15 @@ pub const PackageManager = struct {
return err;
};
- const not_found_fmt =
+ const workspace_not_found_fmt =
+ \\workspace dependency "{[name]s}" not found
+ \\
+ \\Searched in <b>{[search_path]}<r>
+ \\
+ \\Workspace documentation: https://bun.sh/docs/install/workspaces
+ \\
+ ;
+ const link_not_found_fmt =
\\package "{[name]s}" is not linked
\\
\\To install a linked package:
@@ -3214,25 +3224,51 @@ pub const PackageManager = struct {
// should not trigger a network call
if (comptime Environment.allow_assert) std.debug.assert(result.network_task == null);
} else if (dependency.behavior.isRequired()) {
- this.log.addErrorFmt(
- null,
- logger.Loc.Empty,
- this.allocator,
- not_found_fmt,
- .{
- .name = this.lockfile.str(&name),
- },
- ) catch unreachable;
+ if (comptime dependency_tag == .workspace) {
+ this.log.addErrorFmt(
+ null,
+ logger.Loc.Empty,
+ this.allocator,
+ workspace_not_found_fmt,
+ .{
+ .name = this.lockfile.str(&name),
+ .search_path = FolderResolution.PackageWorkspaceSearchPathFormatter{ .manager = this, .version = version },
+ },
+ ) catch unreachable;
+ } else {
+ this.log.addErrorFmt(
+ null,
+ logger.Loc.Empty,
+ this.allocator,
+ link_not_found_fmt,
+ .{
+ .name = this.lockfile.str(&name),
+ },
+ ) catch unreachable;
+ }
} else if (this.options.log_level.isVerbose()) {
- this.log.addWarningFmt(
- null,
- logger.Loc.Empty,
- this.allocator,
- not_found_fmt,
- .{
- .name = this.lockfile.str(&name),
- },
- ) catch unreachable;
+ if (comptime dependency_tag == .workspace) {
+ this.log.addWarningFmt(
+ null,
+ logger.Loc.Empty,
+ this.allocator,
+ workspace_not_found_fmt,
+ .{
+ .name = this.lockfile.str(&name),
+ .search_path = FolderResolution.PackageWorkspaceSearchPathFormatter{ .manager = this, .version = version },
+ },
+ ) catch unreachable;
+ } else {
+ this.log.addWarningFmt(
+ null,
+ logger.Loc.Empty,
+ this.allocator,
+ link_not_found_fmt,
+ .{
+ .name = this.lockfile.str(&name),
+ },
+ ) catch unreachable;
+ }
}
},
.tarball => {
diff --git a/src/install/resolvers/folder_resolver.zig b/src/install/resolvers/folder_resolver.zig
index 0ece2be7f..335a40864 100644
--- a/src/install/resolvers/folder_resolver.zig
+++ b/src/install/resolvers/folder_resolver.zig
@@ -23,6 +23,34 @@ pub const FolderResolution = union(Tag) {
pub const Tag = enum { package_id, err, new_package_id };
+ pub const PackageWorkspaceSearchPathFormatter = struct {
+ manager: *PackageManager,
+ version: Dependency.Version,
+ quoted: bool = true,
+
+ pub fn format(this: PackageWorkspaceSearchPathFormatter, comptime fmt: []const u8, opts: std.fmt.FormatOptions, writer: anytype) !void {
+ var joined: [bun.MAX_PATH_BYTES + 2]u8 = undefined;
+ const str_to_use = this.manager.lockfile.workspace_paths.getPtr(
+ @truncate(String.Builder.stringHash(this.manager.lockfile.str(&this.version.value.workspace))),
+ ) orelse &this.version.value.workspace;
+ var paths = normalizePackageJSONPath(.{ .relative = .workspace }, joined[2..], this.manager.lockfile.str(str_to_use));
+
+ if (!strings.startsWithChar(paths.rel, '.') and !strings.startsWithChar(paths.rel, std.fs.path.sep)) {
+ joined[0..2].* = ("." ++ std.fs.path.sep_str).*;
+ paths.rel = joined[0 .. paths.rel.len + 2];
+ }
+
+ if (this.quoted) {
+ const quoted = strings.QuotedFormatter{
+ .text = paths.rel,
+ };
+ try quoted.format(fmt, opts, writer);
+ } else {
+ try writer.writeAll(paths.rel);
+ }
+ }
+ };
+
pub const Map = std.HashMapUnmanaged(u64, FolderResolution, IdentityContext(u64), 80);
pub fn normalize(path: string) string {