aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-12-07 19:09:19 -0800
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-12-16 19:18:51 -0800
commit6382bb53334baf0b72d28111630f93f631d2ecdb (patch)
treef44b6855e4daba185314c662d119cd60e7efc4f4
parent41c60fb8483d012c6c874ba4e1ab70c91b227595 (diff)
downloadbun-6382bb53334baf0b72d28111630f93f631d2ecdb.tar.gz
bun-6382bb53334baf0b72d28111630f93f631d2ecdb.tar.zst
bun-6382bb53334baf0b72d28111630f93f631d2ecdb.zip
[bun install] Start add/remove command
-rw-r--r--src/bundler.zig10
-rw-r--r--src/cli.zig182
-rw-r--r--src/cli/add_command.zig8
-rw-r--r--src/cli/install_command.zig36
-rw-r--r--src/cli/remove_command.zig8
-rw-r--r--src/install/install.zig89
-rw-r--r--src/install/npm.zig12
-rw-r--r--src/install/semver.zig1
8 files changed, 191 insertions, 155 deletions
diff --git a/src/bundler.zig b/src/bundler.zig
index 9d074366a..54b007c06 100644
--- a/src/bundler.zig
+++ b/src/bundler.zig
@@ -255,10 +255,12 @@ pub const Bundler = struct {
}
}
- if (this.env.map.get("CI")) |IS_CI| {
- if (strings.eqlComptime(IS_CI, "true")) {
- Analytics.is_ci = true;
- }
+ if (this.env.map.get("CI") orelse
+ this.env.map.get("TDDIUM") orelse
+ this.env.map.get("JENKINS_URL") orelse
+ this.env.map.get("bamboo.buildKey")) |IS_CI|
+ {
+ Analytics.is_ci = true;
}
Analytics.disabled = Analytics.disabled or this.env.map.get("HYPERFINE_RANDOMIZED_ENVIRONMENT_OFFSET") != null;
diff --git a/src/cli.zig b/src/cli.zig
index 691975a3d..79f10049f 100644
--- a/src/cli.zig
+++ b/src/cli.zig
@@ -38,6 +38,8 @@ const CreateListExamplesCommand = @import("./cli/create_command.zig").CreateList
const RunCommand = @import("./cli/run_command.zig").RunCommand;
const UpgradeCommand = @import("./cli/upgrade_command.zig").UpgradeCommand;
const InstallCommand = @import("./cli/install_command.zig").InstallCommand;
+const AddCommand = @import("./cli/add_command.zig").AddCommand;
+const RemoveCommand = @import("./cli/remove_command.zig").RemoveCommand;
const InstallCompletionsCommand = @import("./cli/install_completions_command.zig").InstallCompletionsCommand;
const ShellCompletions = @import("./cli/shell_completions.zig");
@@ -153,11 +155,6 @@ pub const Arguments = struct {
clap.parseParam("-u, --origin <STR> Rewrite import URLs to start with --origin. Default: \"\"") catch unreachable,
clap.parseParam("-p, --port <STR> Port to serve Bun's dev server on. Default: \"3000\"") catch unreachable,
clap.parseParam("--silent Don't repeat the command for bun run") catch unreachable,
-
- // clap.parseParam("-o, --outdir <STR> Save output to directory (default: \"out\" if none provided and multiple entry points passed)") catch unreachable,
- // clap.parseParam("-r, --resolve <STR> Determine import/require behavior. \"disable\" ignores. \"dev\" bundles node_modules and builds everything else as independent entry points") catch unreachable,
- // clap.parseParam("-r, --resolve <STR> Determine import/require behavior. \"disable\" ignores. \"dev\" bundles node_modules and builds everything else as independent entry points") catch unreachable,
-
clap.parseParam("<POS>... ") catch unreachable,
};
@@ -457,47 +454,68 @@ const HelpCommand = struct {
invalid_command,
};
+ // someone will get mad at me for this
+ const packages_to_remove_filler = [_]string{
+ "moment",
+ "underscore",
+ "jquery",
+ "backbone",
+ "redux",
+ "browserify",
+ "webpack",
+ "babel-core",
+ };
+
+ const packages_to_add_filler = [_]string{
+ "astro",
+ "react",
+ "next@^12",
+ "tailwindcss",
+ "wrangler@beta",
+ "@compiled/react",
+ "@remix-run/dev",
+ };
+
pub fn printWithReason(comptime reason: Reason) void {
var cwd_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
const cwd = std.os.getcwd(&cwd_buf) catch unreachable;
const dirname = std.fs.path.basename(cwd);
- if (FeatureFlags.dev_only) {
- const fmt =
- \\> <r> <b><green>dev <r><d> ./a.ts ./b.jsx<r> Start a Bun Dev Server
- \\> <r> <b><magenta>bun <r><d> ./a.ts ./b.jsx<r> Bundle dependencies of input files into a <r><magenta>.bun<r>
- \\> <r> <b><green>run <r><d> test <r> Run a package.json script or executable<r>
- \\> <r> <b><green>install<r> Install dependencies for a package.json<r>
- \\> <r> <b><cyan>create <r><d>next ./app<r> Start a new project from a template <d>(shorthand: c)<r>
- \\> <r> <b><blue>upgrade <r> Get the latest version of Bun
- \\> <r> <b><d>completions<r> Install shell completions for tab-completion
- \\> <r> <b><d>discord <r> Open Bun's Discord server
- \\> <r> <b><d>help <r> Print this help menu
- \\
- ;
-
- switch (reason) {
- .explicit => Output.pretty("<r><b><magenta>Bun<r>: a fast bundler, transpiler and task runner for web software.\n\n" ++ fmt, .{}),
- .invalid_command => Output.prettyError("<r><red>Uh-oh<r> not sure what to do with that command.\n\n" ++ fmt, .{}),
- }
- } else {
- const fmt =
- \\> <r> <b><white>init<r> Setup Bun in \"{s}\"
- \\> <r> <b><green>dev <r><d> ./a.ts ./b.jsx<r> Start a Bun Dev Server
- \\<d>*<r> <b><cyan>build <r><d> ./a.ts ./b.jsx<r> Make JavaScript-like code runnable & bundle CSS
- \\> <r> <b><cyan>create<r><d> next ./app<r> Start a new project from a template<r>
- \\> <r> <b><magenta>bun <r><d> ./a.ts ./b.jsx<r> Bundle dependencies of input files into a <r><magenta>.bun<r>
- \\> <r> <green>run <r><d> ./a.ts <r> Run a JavaScript-like file with Bun.js
- \\> <r> <b><blue>discord<r> Open Bun's Discord server
- \\> <r> <b><blue>upgrade <r> Get the latest version of Bun
- \\> <r> <b><green>install<r> Install dependencies for a package.json<r>
- \\> <r> <b><d>help <r> Print this help menu
- \\
- ;
-
- switch (reason) {
- .explicit => Output.pretty("<r><b><magenta>Bun<r>: a fast bundler, transpiler and task runner for web software.\n\n" ++ fmt, .{dirname}),
- .invalid_command => Output.prettyError("<r><red>Uh-oh<r> not sure what to do with that command.\n\n" ++ fmt, .{dirname}),
- }
+
+ const fmt =
+ \\> <r> <b><green>dev <r><d> ./a.ts ./b.jsx<r> Start a Bun Dev Server
+ \\> <r> <b><magenta>bun <r><d> ./a.ts ./b.jsx<r> Bundle dependencies of input files into a <r><magenta>.bun<r>
+ \\
+ \\> <r> <b><cyan>create <r><d>next ./app<r> Start a new project from a template <d>(bun c)<r>
+ \\> <r> <b><magenta>run <r><d> test <r> Run a package.json script or executable<r>
+ \\> <r> <b><green>install<r> Install dependencies for a package.json <d>(bun i)<r>
+ \\> <r> <b><blue>add <r><d> {s:<16}<r> Add a dependency to package.json <d>(bun a)<r>
+ \\> <r> remove <r><d> {s:<16}<r> Remove a dependency from package.json <d>(bun rm)<r>
+ \\
+ \\> <r> <b><blue>upgrade <r> Get the latest version of Bun
+ \\> <r> <b><d>completions<r> Install shell completions for tab-completion
+ \\> <r> <b><d>discord <r> Open Bun's Discord server
+ \\> <r> <b><d>help <r> Print this help menu
+ \\
+ ;
+
+ var rand = std.rand.DefaultPrng.init(@intCast(u64, @maximum(std.time.milliTimestamp(), 0)));
+ const package_add_i = rand.random.uintAtMost(usize, packages_to_add_filler.len - 1);
+ const package_remove_i = rand.random.uintAtMost(usize, packages_to_remove_filler.len - 1);
+
+ const args = .{
+ packages_to_add_filler[package_add_i],
+ packages_to_remove_filler[package_remove_i],
+ };
+
+ switch (reason) {
+ .explicit => Output.pretty(
+ "<r><b><magenta>Bun<r>: a fast bundler, transpiler, JavaScript Runtime and package manager for web software.\n\n" ++ fmt,
+ args,
+ ),
+ .invalid_command => Output.prettyError(
+ "<r><red>Uh-oh<r> not sure what to do with that command.\n\n" ++ fmt,
+ args,
+ ),
}
Output.flush();
@@ -561,7 +579,7 @@ pub const Command = struct {
.allocator = allocator,
};
- if (comptime command != Command.Tag.CreateCommand) {
+ if (comptime Command.Tag.uses_global_options.get(command)) {
ctx.args = try Arguments.parse(allocator, &ctx, command);
}
@@ -586,41 +604,34 @@ pub const Command = struct {
const first_arg_name = std.mem.span(next_arg);
const RootCommandMatcher = strings.ExactSizeMatcher(16);
- if (comptime FeatureFlags.dev_only) {
- return switch (RootCommandMatcher.match(first_arg_name)) {
- RootCommandMatcher.case("init") => .InitCommand,
- RootCommandMatcher.case("bun") => .BunCommand,
- RootCommandMatcher.case("discord") => .DiscordCommand,
- RootCommandMatcher.case("upgrade") => .UpgradeCommand,
- RootCommandMatcher.case("completions") => .InstallCompletionsCommand,
- RootCommandMatcher.case("getcompletes") => .GetCompletionsCommand,
- RootCommandMatcher.case("i"), RootCommandMatcher.case("install") => .InstallCommand,
- RootCommandMatcher.case("c"), RootCommandMatcher.case("create") => .CreateCommand,
-
- RootCommandMatcher.case("b"), RootCommandMatcher.case("build") => .BuildCommand,
- RootCommandMatcher.case("r"), RootCommandMatcher.case("run") => .RunCommand,
- RootCommandMatcher.case("d"), RootCommandMatcher.case("dev") => .DevCommand,
-
- RootCommandMatcher.case("help") => .HelpCommand,
- else => .AutoCommand,
- };
- } else {
- return switch (RootCommandMatcher.match(first_arg_name)) {
- RootCommandMatcher.case("init") => .InitCommand,
- RootCommandMatcher.case("bun") => .BunCommand,
- RootCommandMatcher.case("discord") => .DiscordCommand,
- RootCommandMatcher.case("d"), RootCommandMatcher.case("dev") => .DevCommand,
- RootCommandMatcher.case("c"), RootCommandMatcher.case("create") => .CreateCommand,
- RootCommandMatcher.case("upgrade") => .UpgradeCommand,
-
- RootCommandMatcher.case("help") => .HelpCommand,
- else => .AutoCommand,
- };
- }
+ return switch (RootCommandMatcher.match(first_arg_name)) {
+ RootCommandMatcher.case("init") => .InitCommand,
+ RootCommandMatcher.case("bun") => .BunCommand,
+ RootCommandMatcher.case("discord") => .DiscordCommand,
+ RootCommandMatcher.case("upgrade") => .UpgradeCommand,
+ RootCommandMatcher.case("completions") => .InstallCompletionsCommand,
+ RootCommandMatcher.case("getcompletes") => .GetCompletionsCommand,
+
+ RootCommandMatcher.case("i"), RootCommandMatcher.case("install") => .InstallCommand,
+ RootCommandMatcher.case("c"), RootCommandMatcher.case("create") => .CreateCommand,
+
+ RootCommandMatcher.case("add"), RootCommandMatcher.case("update"), RootCommandMatcher.case("a") => .AddCommand,
+ RootCommandMatcher.case("remove"), RootCommandMatcher.case("rm") => .RemoveCommand,
+
+ RootCommandMatcher.case("b"), RootCommandMatcher.case("build") => .BuildCommand,
+ RootCommandMatcher.case("run") => .RunCommand,
+ RootCommandMatcher.case("d"), RootCommandMatcher.case("dev") => .DevCommand,
+
+ RootCommandMatcher.case("help") => .HelpCommand,
+ else => .AutoCommand,
+ };
}
const default_completions_list = [_]string{
// "build",
+ "install",
+ "add",
+ "remove",
"run",
"dev",
"install",
@@ -666,11 +677,23 @@ pub const Command = struct {
return;
},
.InstallCommand => {
- const ctx = try Command.Context.create(allocator, log, .BuildCommand);
+ const ctx = try Command.Context.create(allocator, log, .InstallCommand);
try InstallCommand.exec(ctx);
return;
},
+ .AddCommand => {
+ const ctx = try Command.Context.create(allocator, log, .AddCommand);
+
+ try AddCommand.exec(ctx);
+ return;
+ },
+ .RemoveCommand => {
+ const ctx = try Command.Context.create(allocator, log, .RemoveCommand);
+
+ try RemoveCommand.exec(ctx);
+ return;
+ },
.GetCompletionsCommand => {
const ctx = try Command.Context.create(allocator, log, .GetCompletionsCommand);
var filter = ctx.positionals;
@@ -806,8 +829,17 @@ pub const Command = struct {
HelpCommand,
InitCommand,
InstallCommand,
+ AddCommand,
+ RemoveCommand,
InstallCompletionsCommand,
RunCommand,
UpgradeCommand,
+
+ pub const uses_global_options: std.EnumArray(Tag, bool) = std.EnumArray(Tag, bool).initDefault(true, .{
+ .CreateCommand = false,
+ .InstallCommand = false,
+ .AddCommand = false,
+ .RemoveCommand = false,
+ });
};
};
diff --git a/src/cli/add_command.zig b/src/cli/add_command.zig
new file mode 100644
index 000000000..f16b6cca1
--- /dev/null
+++ b/src/cli/add_command.zig
@@ -0,0 +1,8 @@
+const Command = @import("../cli.zig").Command;
+const PackageManager = @import("../install/install.zig").PackageManager;
+
+pub const AddCommand = struct {
+ pub fn exec(ctx: Command.Context) !void {
+ try PackageManager.add(ctx);
+ }
+};
diff --git a/src/cli/install_command.zig b/src/cli/install_command.zig
index f3d25e055..6c441b859 100644
--- a/src/cli/install_command.zig
+++ b/src/cli/install_command.zig
@@ -1,40 +1,6 @@
-usingnamespace @import("../global.zig");
-const std = @import("std");
-
-const lex = @import("../js_lexer.zig");
-const logger = @import("../logger.zig");
-const alloc = @import("../alloc.zig");
-const options = @import("../options.zig");
-const js_parser = @import("../js_parser.zig");
-const json_parser = @import("../json_parser.zig");
-const js_printer = @import("../js_printer.zig");
-const js_ast = @import("../js_ast.zig");
-const linker = @import("../linker.zig");
-usingnamespace @import("../ast/base.zig");
-usingnamespace @import("../defines.zig");
-const panicky = @import("../panic_handler.zig");
-const sync = @import("../sync.zig");
-const Api = @import("../api/schema.zig").Api;
-const resolve_path = @import("../resolver/resolve_path.zig");
-const configureTransformOptionsForBun = @import("../javascript/jsc/config.zig").configureTransformOptionsForBun;
const Command = @import("../cli.zig").Command;
-const bundler = @import("../bundler.zig");
-const NodeModuleBundle = @import("../node_module_bundle.zig").NodeModuleBundle;
-const DotEnv = @import("../env_loader.zig");
-const which = @import("../which.zig").which;
-const Run = @import("../bun_js.zig").Run;
-var path_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
-var path_buf2: [std.fs.MAX_PATH_BYTES]u8 = undefined;
-const NpmArgs = struct {
- // https://github.com/npm/rfcs/blob/main/implemented/0021-reduce-lifecycle-script-environment.md#detailed-explanation
- pub const package_name: string = "npm_package_name";
- pub const package_version: string = "npm_package_version";
-};
-
-const yarn_commands: []u64 = @import("./list-of-yarn-commands.zig").all_yarn_commands;
-
-const ShellCompletions = @import("./shell_completions.zig");
const PackageManager = @import("../install/install.zig").PackageManager;
+
pub const InstallCommand = struct {
pub fn exec(ctx: Command.Context) !void {
try PackageManager.install(ctx);
diff --git a/src/cli/remove_command.zig b/src/cli/remove_command.zig
new file mode 100644
index 000000000..eec924d8d
--- /dev/null
+++ b/src/cli/remove_command.zig
@@ -0,0 +1,8 @@
+const Command = @import("../cli.zig").Command;
+const PackageManager = @import("../install/install.zig").PackageManager;
+
+pub const RemoveCommand = struct {
+ pub fn exec(ctx: Command.Context) !void {
+ try PackageManager.remove(ctx);
+ }
+};
diff --git a/src/install/install.zig b/src/install/install.zig
index ba2724a76..a9dc2251c 100644
--- a/src/install/install.zig
+++ b/src/install/install.zig
@@ -44,7 +44,7 @@ threadlocal var initialized_store = false;
// so we just make it repeat bun bun bun bun bun bun bun bun bun
// because why not
const alignment_bytes_to_repeat = "bun";
-const alignment_bytes_to_repeat_buffer = "bunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbun";
+const alignment_bytes_to_repeat_buffer = "bunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbunbun";
const JSAst = @import("../js_ast.zig");
@@ -73,6 +73,7 @@ const StructBuilder = @import("../builder.zig");
const Bin = @import("./bin.zig").Bin;
const Dependency = @import("./dependency.zig");
const Behavior = @import("./dependency.zig").Behavior;
+
pub const ExternalStringBuilder = StructBuilder.Builder(ExternalString);
pub const SmallExternalStringList = ExternalSlice(String);
@@ -413,38 +414,6 @@ pub const Lockfile = struct {
const PackageIDQueue = std.fifo.LinearFifo(PackageID, .Dynamic);
- const InstallTree = struct {};
-
- const Cleaner = struct {
- to: *Lockfile,
- from: *Lockfile,
- visited: *std.DynamicBitSetUnmanaged,
- has_duplicate_names: *std.DynamicBitSetUnmanaged,
- queue: *PackageIDQueue,
-
- // old id -> new id
- mapping: []PackageID,
-
- pub fn enqueueDependencyList(
- this: Cleaner,
- // safe because we do not reallocate these slices
- package: *const Lockfile.Package,
- list: []const Dependency,
- resolutions: []const PackageID,
- ) !void {
- for (list) |dependency, i| {
- const id = resolutions[i];
- std.debug.assert(id < this.from.packages.len);
- if (id > this.from.packages.len) continue;
-
- if (!this.visited.get(id)) {
- this.visited.set(id);
- try this.queue.writeItem(id);
- }
- }
- }
- };
-
pub const InstallResult = struct {
lockfile: *Lockfile,
summary: PackageInstall.Summary,
@@ -3719,6 +3688,7 @@ pub const PackageManager = struct {
lockfile_path: stringZ = Lockfile.default_filename,
save_lockfile_path: stringZ = Lockfile.default_filename,
registry_url: URL = URL.parse("https://registry.npmjs.org/"),
+ registries: Npm.Registry.Map = Npm.Registry.Map{},
cache_directory: string = "",
enable: Enable = .{},
do: Do = .{},
@@ -3756,11 +3726,11 @@ pub const PackageManager = struct {
this.save_lockfile_path = try allocator.dupeZ(u8, save_lockfile_path);
}
- if (env_loader.map.get("BUN_CONFIG_DISABLE_CLONEFILE") != null) {
+ if (env_loader.map.get("BUN_CONFIG_NO_CLONEFILE") != null) {
this.enable.clonefile = false;
}
- if (env_loader.map.get("BUN_CONFIG_DISABLE_DEDUPLICATE") != null) {
+ if (env_loader.map.get("BUN_CONFIG_NO_DEDUPLICATE") != null) {
this.enable.deduplicate_packages = false;
}
@@ -3785,6 +3755,9 @@ pub const PackageManager = struct {
};
fn init(ctx: Command.Context) !*PackageManager {
+ // assume that spawning a thread will take a lil so we do that asap
+ try NetworkThread.init();
+
var fs = try Fs.FileSystem.init1(ctx.allocator, null);
var original_cwd = std.mem.trimRight(u8, fs.top_level_dir, "/");
@@ -3813,6 +3786,11 @@ pub const PackageManager = struct {
};
}
+ std.mem.copy(u8, &cwd_buf, original_cwd);
+ cwd_buf[original_cwd.len] = 0;
+ var real_cwd = cwd_buf[0..original_cwd.len :0];
+ std.os.chdirZ(real_cwd) catch {};
+
return error.MissingPackageJSON;
};
};
@@ -3868,8 +3846,6 @@ pub const PackageManager = struct {
} else |err| {}
}
- try NetworkThread.init();
-
var manager = &instance;
// var progress = std.Progress{};
// var node = progress.start(name: []const u8, estimated_total_items: usize)
@@ -3931,7 +3907,32 @@ pub const PackageManager = struct {
ctx: Command.Context,
) !void {}
- pub const ParamType = clap.Param(clap.Help);
+ const ParamType = clap.Param(clap.Help);
+ pub const install_params = [_]ParamType{
+ clap.parseParam("--registry, -R <STR> Change default registry (default: $BUN_CONFIG_REGISTRY || $npm_config_registry)") catch unreachable,
+ clap.parseParam("--token, -T <STR> Authentication token used for npm registry requests (default: $npm_config_token)") catch unreachable,
+ clap.parseParam("--yarn, -Y Write a yarn.lock file (yarn v1)") catch unreachable,
+ clap.parseParam("--production, --prod Don't install devDependencies and throw if the package.json doesn't match the lockfile") catch unreachable,
+ clap.parseParam("--no-save Don't save a lockfile") catch unreachable,
+ clap.parseParam("--dry-run Don't install anything") catch unreachable,
+ clap.parseParam("--lockfile <STR> Store & load a lockfile at a specific filepath") catch unreachable,
+ clap.parseParam("--force, -F Always request the latest versions from the registry & reinstall all dependenices") catch unreachable,
+ clap.parseParam("--cache-dir <STR> Store & load cached data from a specific directory path") catch unreachable,
+ clap.parseParam("--no-dedupe Disable automatic downgrading of dependencies that would otherwise cause unnecessary duplicate package versions ($BUN_CONFIG_NO_DEDUPLICATE)") catch unreachable,
+ clap.parseParam("--no-cache Ignore manifest cache entirely") catch unreachable,
+ clap.parseParam("--silent Don't log anything") catch unreachable,
+ clap.parseParam("--verbose Excessively verbose logging") catch unreachable,
+ clap.parseParam("--cwd <STR> Set a specific cwd") catch unreachable,
+ clap.parseParam("--backend <STR> Platform-specific optimizations for installing dependencies. For macOS, \"clonefile\" (default), \"copyfile\"") catch unreachable,
+ };
+
+ pub const add_params = install_params ++ [_]ParamType{
+ clap.parseParam("<POS> ... \"name\" or \"name@version\" of packages to install") catch unreachable,
+ };
+
+ pub const remove_params = install_params ++ [_]ParamType{
+ clap.parseParam("<POS> ... \"name\" of packages to remove") catch unreachable,
+ };
fn updatePackageJSONAndInstall(
ctx: Command.Context,
@@ -3939,7 +3940,9 @@ pub const PackageManager = struct {
) !void {
var manager = PackageManager.init(ctx) catch |err| {
switch (err) {
- error.MissingPackageJSON => {},
+ error.MissingPackageJSON => {
+ if (op == .add or op == .update) {}
+ },
else => return err,
}
};
@@ -3947,10 +3950,14 @@ pub const PackageManager = struct {
var cwd_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
var package_json_cwd_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined;
- pub fn install(
+
+ pub inline fn install(
ctx: Command.Context,
) !void {
- var manager = try PackageManager.init(ctx);
+ try installWithManager(ctx, try PackageManager.init(ctx));
+ }
+
+ fn installWithManager(ctx: Command.Context, manager: *PackageManager) !void {
var load_lockfile_result: Lockfile.LoadFromDiskResult = if (manager.options.do.load_lockfile)
manager.lockfile.loadFromDisk(
ctx.allocator,
diff --git a/src/install/npm.zig b/src/install/npm.zig
index 3c56d5f80..4fdd2189d 100644
--- a/src/install/npm.zig
+++ b/src/install/npm.zig
@@ -78,6 +78,14 @@ pub const Registry = struct {
url: URL = URL.parse("https://registry.npmjs.org/"),
pub const BodyPool = ObjectPool(MutableString, MutableString.init2048, true);
+ pub const Scope = struct {
+ name: string,
+ url: URL,
+ token: string = "",
+ };
+
+ pub const Map = std.HashMapUnmanaged(u64, Scope, IdentityContext(u64), 80);
+
const PackageVersionResponse = union(Tag) {
pub const Tag = enum {
cached,
@@ -338,6 +346,10 @@ pub const PackageVersion = extern struct {
man_dir: ExternalString = ExternalString{},
+ /// can be empty!
+ /// When empty, it means that the tarball URL can be inferred
+ tarball_url: ExternalString = ExternalString{},
+
unpacked_size: u32 = 0,
file_count: u32 = 0,
diff --git a/src/install/semver.zig b/src/install/semver.zig
index f3150f6d3..c6f4189d8 100644
--- a/src/install/semver.zig
+++ b/src/install/semver.zig
@@ -1203,6 +1203,7 @@ pub const Query = struct {
return Range.initWildcard(version, .minor);
}
+ // This feels like it needs to be tested more.
var right_version = version;
right_version.minor += 1;
right_version.patch = 0;