aboutsummaryrefslogtreecommitdiff
path: root/src/install/install.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/install/install.zig')
-rw-r--r--src/install/install.zig284
1 files changed, 144 insertions, 140 deletions
diff --git a/src/install/install.zig b/src/install/install.zig
index 81e2a7bb8..22068bbf3 100644
--- a/src/install/install.zig
+++ b/src/install/install.zig
@@ -166,8 +166,8 @@ pub const ExternalStringList = ExternalSlice(ExternalString);
pub const VersionSlice = ExternalSlice(Semver.Version);
pub const ExternalStringMap = extern struct {
- name: ExternalStringList = ExternalStringList{},
- value: ExternalStringList = ExternalStringList{},
+ name: ExternalStringList = .{},
+ value: ExternalStringList = .{},
};
pub const PackageNameHash = u64;
@@ -467,7 +467,7 @@ pub const Features = struct {
is_main: bool = false,
optional_dependencies: bool = false,
peer_dependencies: bool = true,
- scripts: bool = false,
+ trusted_dependencies: bool = false,
workspaces: bool = false,
check_for_duplicate_dependencies: bool = false,
@@ -487,7 +487,7 @@ pub const Features = struct {
.dev_dependencies = true,
.is_main = true,
.optional_dependencies = true,
- .scripts = true,
+ .trusted_dependencies = true,
.workspaces = true,
};
@@ -499,7 +499,7 @@ pub const Features = struct {
pub const workspace = Features{
.dev_dependencies = true,
.optional_dependencies = true,
- .scripts = true,
+ .trusted_dependencies = true,
};
pub const link = Features{
@@ -3546,7 +3546,34 @@ pub const PackageManager = struct {
return package;
},
- else => {},
+ else => if (data.json_len > 0) {
+ const package_json_source = logger.Source.initPathString(
+ data.json_path,
+ data.json_buf[0..data.json_len],
+ );
+ initializeStore();
+ const json = json_parser.ParseJSONUTF8(
+ &package_json_source,
+ manager.log,
+ manager.allocator,
+ ) catch |err| {
+ if (comptime log_level != .silent) {
+ const string_buf = manager.lockfile.buffers.string_bytes.items;
+ Output.prettyErrorln("<r><red>error:<r> expected package.json in <b>{any}<r> to be a JSON file: {s}\n", .{
+ resolution.fmtURL(&manager.options, string_buf),
+ @errorName(err),
+ });
+ }
+ Global.crash();
+ };
+ var builder = manager.lockfile.stringBuilder();
+ Lockfile.Package.Scripts.parseCount(manager.allocator, &builder, json);
+ builder.allocate() catch unreachable;
+ if (comptime Environment.allow_assert) std.debug.assert(package_id.* != invalid_package_id);
+ var scripts = manager.lockfile.packages.items(.scripts)[package_id.*];
+ scripts.parseAlloc(manager.allocator, &builder, json);
+ scripts.filled = true;
+ },
}
return null;
@@ -3910,10 +3937,10 @@ pub const PackageManager = struct {
var task: Task = task_;
if (task.log.msgs.items.len > 0) {
- if (Output.enable_ansi_colors) {
- try task.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true);
- } else {
- try task.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false);
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ try task.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), enable_ansi_colors);
+ },
}
}
@@ -5308,36 +5335,31 @@ pub const PackageManager = struct {
// When using bun, we only do staleness checks once per day
) -| std.time.s_per_day;
- manager.lockfile = brk: {
+ if (root_dir.entries.hasComptimeQuery("bun.lockb")) {
var buf: [bun.MAX_PATH_BYTES]u8 = undefined;
+ var parts = [_]string{
+ "./bun.lockb",
+ };
+ var lockfile_path = Path.joinAbsStringBuf(
+ Fs.FileSystem.instance.top_level_dir,
+ &buf,
+ &parts,
+ .auto,
+ );
+ buf[lockfile_path.len] = 0;
+ var lockfile_path_z = buf[0..lockfile_path.len :0];
- if (root_dir.entries.hasComptimeQuery("bun.lockb")) {
- var parts = [_]string{
- "./bun.lockb",
- };
- var lockfile_path = Path.joinAbsStringBuf(
- Fs.FileSystem.instance.top_level_dir,
- &buf,
- &parts,
- .auto,
- );
- buf[lockfile_path.len] = 0;
- var lockfile_path_z = buf[0..lockfile_path.len :0];
-
- const result = manager.lockfile.loadFromDisk(
- allocator,
- log,
- lockfile_path_z,
- );
-
- if (result == .ok) {
- break :brk result.ok;
- }
+ switch (manager.lockfile.loadFromDisk(
+ allocator,
+ log,
+ lockfile_path_z,
+ )) {
+ .ok => |lockfile| manager.lockfile = lockfile,
+ else => try manager.lockfile.initEmpty(allocator),
}
-
+ } else {
try manager.lockfile.initEmpty(allocator);
- break :brk manager.lockfile;
- };
+ }
return manager;
}
@@ -5448,7 +5470,7 @@ pub const PackageManager = struct {
// create scope if specified
if (name[0] == '@') {
- if (std.mem.indexOfScalar(u8, name, '/')) |i| {
+ if (strings.indexOfChar(name, '/')) |i| {
node_modules.dir.makeDir(name[0..i]) catch |err| brk: {
if (err == error.PathAlreadyExists) break :brk;
if (manager.options.log_level != .silent)
@@ -5513,11 +5535,7 @@ pub const PackageManager = struct {
} else {
// bun link lodash
switch (manager.options.log_level) {
- .default => try updatePackageJSONAndInstallWithManager(ctx, manager, .link, .default),
- .verbose => try updatePackageJSONAndInstallWithManager(ctx, manager, .link, .verbose),
- .silent => try updatePackageJSONAndInstallWithManager(ctx, manager, .link, .silent),
- .default_no_progress => try updatePackageJSONAndInstallWithManager(ctx, manager, .link, .default_no_progress),
- .verbose_no_progress => try updatePackageJSONAndInstallWithManager(ctx, manager, .link, .verbose_no_progress),
+ inline else => |log_level| try updatePackageJSONAndInstallWithManager(ctx, manager, .link, log_level),
}
}
}
@@ -6019,11 +6037,7 @@ pub const PackageManager = struct {
}
switch (manager.options.log_level) {
- .default => try updatePackageJSONAndInstallWithManager(ctx, manager, op, .default),
- .verbose => try updatePackageJSONAndInstallWithManager(ctx, manager, op, .verbose),
- .silent => try updatePackageJSONAndInstallWithManager(ctx, manager, op, .silent),
- .default_no_progress => try updatePackageJSONAndInstallWithManager(ctx, manager, op, .default_no_progress),
- .verbose_no_progress => try updatePackageJSONAndInstallWithManager(ctx, manager, op, .verbose_no_progress),
+ inline else => |log_level| try updatePackageJSONAndInstallWithManager(ctx, manager, op, log_level),
}
}
@@ -6153,13 +6167,12 @@ pub const PackageManager = struct {
) !void {
if (ctx.log.errors > 0) {
if (comptime log_level != .silent) {
- if (Output.enable_ansi_colors) {
- ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true) catch {};
- } else {
- ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false) catch {};
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), enable_ansi_colors) catch {};
+ },
}
}
-
Global.crash();
}
@@ -6183,10 +6196,10 @@ pub const PackageManager = struct {
initializeStore();
var current_package_json = json_parser.ParseJSONUTF8(&package_json_source, ctx.log, manager.allocator) catch |err| {
- if (Output.enable_ansi_colors) {
- ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true) catch {};
- } else {
- ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false) catch {};
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), enable_ansi_colors) catch {};
+ },
}
if (err == error.ParserError and ctx.log.errors > 0) {
@@ -6313,7 +6326,7 @@ pub const PackageManager = struct {
// haha unless
defer if (auto_free) bun.default_allocator.free(old_ast_nodes);
- try installWithManager(ctx, manager, new_package_json_source, log_level);
+ try manager.installWithManager(ctx, new_package_json_source, log_level);
if (op == .update or op == .add or op == .link) {
for (manager.package_json_updates) |update| {
@@ -6435,11 +6448,7 @@ pub const PackageManager = struct {
};
try switch (manager.options.log_level) {
- .default => installWithManager(ctx, manager, package_json_contents, .default),
- .verbose => installWithManager(ctx, manager, package_json_contents, .verbose),
- .silent => installWithManager(ctx, manager, package_json_contents, .silent),
- .default_no_progress => installWithManager(ctx, manager, package_json_contents, .default_no_progress),
- .verbose_no_progress => installWithManager(ctx, manager, package_json_contents, .verbose_no_progress),
+ inline else => |log_level| manager.installWithManager(ctx, package_json_contents, log_level),
};
}
@@ -6593,10 +6602,10 @@ pub const PackageManager = struct {
const args = .{ name, @errorName(err) };
if (comptime log_level.showProgress()) {
- if (Output.enable_ansi_colors) {
- this.progress.log(comptime Output.prettyFmt(fmt, true), args);
- } else {
- this.progress.log(comptime Output.prettyFmt(fmt, false), args);
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ this.progress.log(comptime Output.prettyFmt(fmt, enable_ansi_colors), args);
+ },
}
} else {
Output.prettyErrorln(fmt, args);
@@ -6699,10 +6708,10 @@ pub const PackageManager = struct {
const args = .{ alias, @errorName(err) };
if (comptime log_level.showProgress()) {
- if (Output.enable_ansi_colors) {
- this.progress.log(comptime Output.prettyFmt(fmt, true), args);
- } else {
- this.progress.log(comptime Output.prettyFmt(fmt, false), args);
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ this.progress.log(comptime Output.prettyFmt(fmt, enable_ansi_colors), args);
+ },
}
} else {
Output.prettyErrorln(fmt, args);
@@ -6718,61 +6727,56 @@ pub const PackageManager = struct {
}
}
- var scripts = this.lockfile.packages.items(.scripts)[package_id];
- if (scripts.hasAny()) {
- var path_buf: [bun.MAX_PATH_BYTES]u8 = undefined;
- const path_str = Path.joinAbsString(
- bun.getFdPath(this.node_modules_folder.dir.fd, &path_buf) catch unreachable,
- &[_]string{destination_dir_subpath},
- .posix,
- );
+ if (resolution.tag == .workspace or this.lockfile.trusted_dependencies.contains(@truncate(u32, String.Builder.stringHash(name)))) {
+ var scripts = this.lockfile.packages.items(.scripts)[package_id];
+ if (scripts.hasAny()) {
+ var path_buf: [bun.MAX_PATH_BYTES]u8 = undefined;
+ const path_str = Path.joinAbsString(
+ bun.getFdPath(this.node_modules_folder.dir.fd, &path_buf) catch unreachable,
+ &[_]string{destination_dir_subpath},
+ .posix,
+ );
- scripts.enqueue(this.lockfile, buf, path_str);
- } else if (!scripts.filled and switch (resolution.tag) {
- .folder => Features.folder.scripts,
- .npm => Features.npm.scripts,
- .git, .github, .gitlab, .local_tarball, .remote_tarball => Features.tarball.scripts,
- .symlink => Features.link.scripts,
- .workspace => Features.workspace.scripts,
- else => false,
- }) {
- var path_buf: [bun.MAX_PATH_BYTES]u8 = undefined;
- const path_str = Path.joinAbsString(
- bun.getFdPath(this.node_modules_folder.dir.fd, &path_buf) catch unreachable,
- &[_]string{destination_dir_subpath},
- .posix,
- );
+ scripts.enqueue(this.lockfile, buf, path_str);
+ } else if (!scripts.filled) {
+ var path_buf: [bun.MAX_PATH_BYTES]u8 = undefined;
+ const path_str = Path.joinAbsString(
+ bun.getFdPath(this.node_modules_folder.dir.fd, &path_buf) catch unreachable,
+ &[_]string{destination_dir_subpath},
+ .posix,
+ );
- scripts.enqueueFromPackageJSON(
- this.manager.log,
- this.lockfile,
- this.node_modules_folder.dir,
- destination_dir_subpath,
- path_str,
- ) catch |err| {
- if (comptime log_level != .silent) {
- const fmt = "\n<r><red>error:<r> failed to parse life-cycle scripts for <b>{s}<r>: {s}\n";
- const args = .{ name, @errorName(err) };
-
- if (comptime log_level.showProgress()) {
- if (Output.enable_ansi_colors) {
- this.progress.log(comptime Output.prettyFmt(fmt, true), args);
+ scripts.enqueueFromPackageJSON(
+ this.manager.log,
+ this.lockfile,
+ this.node_modules_folder.dir,
+ destination_dir_subpath,
+ path_str,
+ ) catch |err| {
+ if (comptime log_level != .silent) {
+ const fmt = "\n<r><red>error:<r> failed to parse life-cycle scripts for <b>{s}<r>: {s}\n";
+ const args = .{ name, @errorName(err) };
+
+ if (comptime log_level.showProgress()) {
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ this.progress.log(comptime Output.prettyFmt(fmt, enable_ansi_colors), args);
+ },
+ }
} else {
- this.progress.log(comptime Output.prettyFmt(fmt, false), args);
+ Output.prettyErrorln(fmt, args);
}
- } else {
- Output.prettyErrorln(fmt, args);
}
- }
- if (this.manager.options.enable.fail_early) {
- Global.exit(1);
- }
+ if (this.manager.options.enable.fail_early) {
+ Global.exit(1);
+ }
- Output.flush();
- this.summary.fail += 1;
- return;
- };
+ Output.flush();
+ this.summary.fail += 1;
+ return;
+ };
+ }
}
},
.fail => |cause| {
@@ -7241,10 +7245,10 @@ pub const PackageManager = struct {
const args = .{ name, @errorName(err) };
if (comptime log_level.showProgress()) {
- if (Output.enable_ansi_colors) {
- this.progress.log(comptime Output.prettyFmt(fmt, true), args);
- } else {
- this.progress.log(comptime Output.prettyFmt(fmt, false), args);
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ this.progress.log(comptime Output.prettyFmt(fmt, enable_ansi_colors), args);
+ },
}
} else {
Output.prettyErrorln(fmt, args);
@@ -7262,10 +7266,10 @@ pub const PackageManager = struct {
const args = .{lockfile.str(&names[package_id])};
if (comptime log_level.showProgress()) {
- if (Output.enable_ansi_colors) {
- this.progress.log(comptime Output.prettyFmt(fmt, true), args);
- } else {
- this.progress.log(comptime Output.prettyFmt(fmt, false), args);
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ this.progress.log(comptime Output.prettyFmt(fmt, enable_ansi_colors), args);
+ },
}
} else {
Output.prettyErrorln(fmt, args);
@@ -7312,8 +7316,8 @@ pub const PackageManager = struct {
}
fn installWithManager(
- ctx: Command.Context,
manager: *PackageManager,
+ ctx: Command.Context,
package_json_contents: string,
comptime log_level: Options.LogLevel,
) !void {
@@ -7326,7 +7330,7 @@ pub const PackageManager = struct {
manager.options.lockfile_path,
)
else
- Lockfile.LoadFromDiskResult{ .not_found = {} };
+ .{ .not_found = {} };
var root = Lockfile.Package{};
var needs_new_lockfile = load_lockfile_result != .ok or (load_lockfile_result.ok.buffers.dependencies.items.len == 0 and manager.package_json_updates.len > 0);
// this defaults to false
@@ -7360,10 +7364,10 @@ pub const PackageManager = struct {
}
if (ctx.log.errors > 0) {
- if (Output.enable_ansi_colors) {
- try manager.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true);
- } else {
- try manager.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false);
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ try manager.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), enable_ansi_colors);
+ },
}
}
Output.flush();
@@ -7567,10 +7571,10 @@ pub const PackageManager = struct {
}
}
- if (Output.enable_ansi_colors) {
- try manager.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), true);
- } else {
- try manager.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false);
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ try manager.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), enable_ansi_colors);
+ },
}
if (manager.log.hasErrors()) Global.crash();
@@ -7731,10 +7735,10 @@ pub const PackageManager = struct {
.successfully_installed = install_summary.successfully_installed,
};
- if (Output.enable_ansi_colors) {
- try Lockfile.Printer.Tree.print(&printer, Output.WriterType, Output.writer(), true);
- } else {
- try Lockfile.Printer.Tree.print(&printer, Output.WriterType, Output.writer(), false);
+ switch (Output.enable_ansi_colors) {
+ inline else => |enable_ansi_colors| {
+ try Lockfile.Printer.Tree.print(&printer, Output.WriterType, Output.writer(), enable_ansi_colors);
+ },
}
if (!did_meta_hash_change) {