diff options
author | 2023-07-19 14:08:52 -0700 | |
---|---|---|
committer | 2023-07-20 00:08:52 +0300 | |
commit | d74d95d9abbed699e15a8e105e2fe87d0195161e (patch) | |
tree | 39c664259d42e8b620d126ff1eab1936860cda00 | |
parent | a59ddb131eab3dbfaf193c11b230c0e4709b3b66 (diff) | |
download | bun-d74d95d9abbed699e15a8e105e2fe87d0195161e.tar.gz bun-d74d95d9abbed699e15a8e105e2fe87d0195161e.tar.zst bun-d74d95d9abbed699e15a8e105e2fe87d0195161e.zip |
Better error for workspace dependency not found (#3678)
-rw-r--r-- | src/install/install.zig | 78 | ||||
-rw-r--r-- | src/install/resolvers/folder_resolver.zig | 28 |
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 { |