aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/bindings/BunString.cpp11
-rw-r--r--src/bun.js/bindings/bindings.zig9
-rw-r--r--src/install/install.zig91
-rw-r--r--src/logger.zig29
4 files changed, 87 insertions, 53 deletions
diff --git a/src/bun.js/bindings/BunString.cpp b/src/bun.js/bindings/BunString.cpp
index 8c5a1e66b..416d5d334 100644
--- a/src/bun.js/bindings/BunString.cpp
+++ b/src/bun.js/bindings/BunString.cpp
@@ -381,6 +381,17 @@ extern "C" BunString URL__getHref(BunString* input)
return Bun::toStringRef(url.string());
}
+extern "C" BunString URL__getHrefJoin(BunString* baseStr, BunString *relativeStr)
+{
+ auto base = Bun::toWTFString(*baseStr);
+ auto relative = Bun::toWTFString(*relativeStr);
+ auto url = WTF::URL(WTF::URL(base), relative);
+ if (!url.isValid() || url.isEmpty())
+ return { BunStringTag::Dead };
+
+ return Bun::toStringRef(url.string());
+}
+
extern "C" WTF::URL* URL__fromString(BunString* input)
{
auto&& str = Bun::toWTFString(*input);
diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig
index 870b78738..6729ab9ab 100644
--- a/src/bun.js/bindings/bindings.zig
+++ b/src/bun.js/bindings/bindings.zig
@@ -5480,12 +5480,21 @@ pub const URL = opaque {
extern fn URL__getHrefFromJS(JSValue, *JSC.JSGlobalObject) String;
extern fn URL__getHref(*String) String;
extern fn URL__getFileURLString(*String) String;
+ extern fn URL__getHrefJoin(*String, *String) String;
+
pub fn hrefFromString(str: bun.String) String {
JSC.markBinding(@src());
var input = str;
return URL__getHref(&input);
}
+ pub fn join(base: bun.String, relative: bun.String) String {
+ JSC.markBinding(@src());
+ var base_str = base;
+ var relative_str = relative;
+ return URL__getHrefJoin(&base_str, &relative_str);
+ }
+
pub fn fileURLFromString(str: bun.String) String {
JSC.markBinding(@src());
var input = str;
diff --git a/src/install/install.zig b/src/install/install.zig
index 768113d35..e8b95b820 100644
--- a/src/install/install.zig
+++ b/src/install/install.zig
@@ -249,61 +249,31 @@ const NetworkTask = struct {
allocator: std.mem.Allocator,
scope: *const Npm.Registry.Scope,
loaded_manifest: ?Npm.PackageManifest,
+ warn_on_error: bool,
) !void {
- const pathname: string = if (!strings.eqlComptime(scope.url.pathname, "/"))
- scope.url.pathname
- else
- @as(string, "");
+ this.url_buf = blk: {
+ const tmp = bun.JSC.URL.join(
+ bun.String.fromUTF8(scope.url.href),
+ bun.String.fromUTF8(name),
+ );
+ defer tmp.deref();
- if (pathname.len > 0) {
- if (scope.url.getPort()) |port_number| {
- this.url_buf = try std.fmt.allocPrint(
- allocator,
- "{s}://{s}:{d}/{s}/{s}",
- .{
- scope.url.displayProtocol(),
- scope.url.displayHostname(),
- port_number,
- strings.withoutTrailingSlash(pathname),
- name,
- },
- );
- } else {
- this.url_buf = try std.fmt.allocPrint(
- allocator,
- "{s}://{s}/{s}/{s}",
- .{
- scope.url.displayProtocol(),
- scope.url.displayHostname(),
- strings.withoutTrailingSlash(pathname),
- name,
- },
- );
- }
- } else {
- if (scope.url.getPort()) |port_number| {
- this.url_buf = try std.fmt.allocPrint(
- allocator,
- "{s}://{s}:{d}/{s}",
- .{
- scope.url.displayProtocol(),
- scope.url.displayHostname(),
- port_number,
- name,
- },
- );
- } else {
- this.url_buf = try std.fmt.allocPrint(
- allocator,
- "{s}://{s}/{s}",
- .{
- scope.url.displayProtocol(),
- scope.url.displayHostname(),
- name,
- },
- );
+ if (tmp.tag == .Dead) {
+ const msg = .{
+ .fmt = "Failed to join registry \"{s}\" and package \"{s}\" URLs",
+ .args = .{ scope.url.href, name },
+ };
+
+ if (warn_on_error)
+ this.package_manager.log.addWarningFmt(null, .{}, allocator, msg.fmt, msg.args) catch unreachable
+ else
+ this.package_manager.log.addErrorFmt(null, .{}, allocator, msg.fmt, msg.args) catch unreachable;
+
+ return error.InvalidURL;
}
- }
+ // This actually duplicates the string! So we defer deref the WTF managed one above.
+ break :blk try tmp.toOwnedSlice(allocator);
+ };
var last_modified: string = "";
var etag: string = "";
@@ -3075,6 +3045,7 @@ pub const PackageManager = struct {
this.allocator,
this.scopeForPackageName(name_str),
loaded_manifest,
+ dependency.behavior.isOptional() or dependency.behavior.isPeer(),
);
this.enqueueNetworkTask(network_task);
}
@@ -3432,7 +3403,21 @@ pub const PackageManager = struct {
i,
&dependency,
resolution,
- ) catch {};
+ ) catch |err| {
+ const note = .{
+ .fmt = "error occured while resolving {s}",
+ .args = .{
+ lockfile.str(&dependency.realname()),
+ },
+ };
+
+ if (dependency.behavior.isOptional() or dependency.behavior.isPeer())
+ this.log.addWarningWithNote(null, .{}, this.allocator, @errorName(err), note.fmt, note.args) catch unreachable
+ else
+ this.log.addZigErrorWithNote(this.allocator, err, note.fmt, note.args) catch unreachable;
+
+ continue;
+ };
}
this.drainDependencyList();
diff --git a/src/logger.zig b/src/logger.zig
index 7340efc3d..dfe60e2af 100644
--- a/src/logger.zig
+++ b/src/logger.zig
@@ -1027,6 +1027,20 @@ pub const Log = struct {
});
}
+ pub fn addZigErrorWithNote(log: *Log, allocator: std.mem.Allocator, err: anyerror, comptime noteFmt: string, args: anytype) !void {
+ @setCold(true);
+ log.errors += 1;
+
+ var notes = try allocator.alloc(Data, 1);
+ notes[0] = rangeData(null, Range.None, allocPrint(allocator, noteFmt, args) catch unreachable);
+
+ try log.addMsg(.{
+ .kind = .err,
+ .data = rangeData(null, Range.None, @errorName(err)),
+ .notes = notes,
+ });
+ }
+
pub fn addRangeWarning(log: *Log, source: ?*const Source, r: Range, text: string) !void {
@setCold(true);
if (!Kind.shouldPrint(.warn, log.level)) return;
@@ -1092,6 +1106,21 @@ pub const Log = struct {
});
}
+ pub fn addWarningWithNote(log: *Log, source: ?*const Source, l: Loc, allocator: std.mem.Allocator, warn: string, comptime note_fmt: string, note_args: anytype) !void {
+ @setCold(true);
+ if (!Kind.shouldPrint(.warn, log.level)) return;
+ log.warnings += 1;
+
+ var notes = try allocator.alloc(Data, 1);
+ notes[0] = rangeData(source, Range{ .loc = l }, allocPrint(allocator, note_fmt, note_args) catch unreachable);
+
+ try log.addMsg(.{
+ .kind = .warn,
+ .data = rangeData(null, Range.None, warn),
+ .notes = notes,
+ });
+ }
+
pub fn addRangeDebug(log: *Log, source: ?*const Source, r: Range, text: string) !void {
@setCold(true);
if (!Kind.shouldPrint(.debug, log.level)) return;