aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alex Lam S.L <alexlamsl@gmail.com> 2022-12-26 07:20:35 +0200
committerGravatar GitHub <noreply@github.com> 2022-12-25 21:20:35 -0800
commit74251fbf5e011191721c96ea520f29a7cc4ea94a (patch)
tree600e52c4dce92afca5bb9befe00ca6f6d0f20fbc
parent08a738c6c8841dcb1b84933b483396d66d702f87 (diff)
downloadbun-74251fbf5e011191721c96ea520f29a7cc4ea94a.tar.gz
bun-74251fbf5e011191721c96ea520f29a7cc4ea94a.tar.zst
bun-74251fbf5e011191721c96ea520f29a7cc4ea94a.zip
[install] use default URL when only auth token is specified (#1664)
Previously it would default to `http://localhost/` which was inconsistent with the case sans token. Use official `npm` registry as fallback in both cases.
-rw-r--r--src/install/install.zig145
-rw-r--r--src/install/npm.zig21
-rw-r--r--test/bun.js/bun-install.test.ts38
-rw-r--r--test/bun.js/bun-install.toml2
4 files changed, 170 insertions, 36 deletions
diff --git a/src/install/install.zig b/src/install/install.zig
index 4c3837a6f..7fba71b76 100644
--- a/src/install/install.zig
+++ b/src/install/install.zig
@@ -3449,11 +3449,7 @@ pub const PackageManager = struct {
lockfile_path: stringZ = Lockfile.default_filename,
save_lockfile_path: stringZ = Lockfile.default_filename,
did_override_default_scope: bool = false,
- scope: Npm.Registry.Scope = .{
- .name = "",
- .token = "",
- .url = URL.parse("https://registry.npmjs.org/"),
- },
+ scope: Npm.Registry.Scope = undefined,
registries: Npm.Registry.Map = Npm.Registry.Map{},
cache_directory: string = "",
@@ -3594,18 +3590,17 @@ pub const PackageManager = struct {
) !void {
this.save_lockfile_path = this.lockfile_path;
+ var registry = if (bun_install_) |bun_install| bun_install.default_registry else null;
+ this.scope = try Npm.Registry.Scope.fromAPI("", registry orelse Api.NpmRegistry{
+ .url = "",
+ .username = "",
+ .password = "",
+ .token = "",
+ }, allocator, env_loader);
defer {
- this.did_override_default_scope = !strings.eqlComptime(this.scope.url.href, "https://registry.npmjs.org/");
+ this.did_override_default_scope = !strings.eqlComptime(this.scope.url.href, Npm.Registry.DefaultURL);
}
if (bun_install_) |bun_install| {
- if (bun_install.default_registry) |*registry| {
- if (registry.url.len == 0) {
- registry.url = "https://registry.npmjs.org/";
- }
-
- this.scope = try Npm.Registry.Scope.fromAPI("", registry.*, allocator, env_loader);
- }
-
if (bun_install.scoped) |scoped| {
for (scoped.scopes) |name, i| {
try this.registries.put(allocator, Npm.Registry.Scope.hash(name), try Npm.Registry.Scope.fromAPI(name, scoped.registries[i], allocator, env_loader));
@@ -6747,6 +6742,16 @@ pub const PackageManager = struct {
const Package = Lockfile.Package;
+pub const PackageManifestError = error{
+ PackageManifestHTTP400,
+ PackageManifestHTTP401,
+ PackageManifestHTTP402,
+ PackageManifestHTTP403,
+ PackageManifestHTTP404,
+ PackageManifestHTTP4xx,
+ PackageManifestHTTP5xx,
+};
+
test "UpdateRequests.parse" {
var log = logger.Log.init(default_allocator);
var array = PackageManager.UpdateRequest.Array.init(0) catch unreachable;
@@ -6773,12 +6778,106 @@ test "UpdateRequests.parse" {
try std.testing.expectEqual(updates.len, 6);
}
-pub const PackageManifestError = error{
- PackageManifestHTTP400,
- PackageManifestHTTP401,
- PackageManifestHTTP402,
- PackageManifestHTTP403,
- PackageManifestHTTP404,
- PackageManifestHTTP4xx,
- PackageManifestHTTP5xx,
-};
+test "PackageManager.Options - default registry, default values" {
+ var allocator = default_allocator;
+ var log = logger.Log.init(allocator);
+ defer log.deinit();
+ var env_loader = DotEnv.Loader.init(&DotEnv.Map.init(allocator), allocator);
+ var options = PackageManager.Options{};
+
+ try options.load(allocator, &log, &env_loader, null, null);
+
+ try std.testing.expectEqualStrings(options.scope.name, "");
+ try std.testing.expectEqualStrings(options.scope.auth, "");
+ try std.testing.expectEqualStrings(options.scope.url.href, Npm.Registry.DefaultURL);
+ try std.testing.expectEqualStrings(options.scope.token, "");
+}
+
+test "PackageManager.Options - default registry, custom token" {
+ var allocator = default_allocator;
+ var log = logger.Log.init(allocator);
+ defer log.deinit();
+ var env_loader = DotEnv.Loader.init(&DotEnv.Map.init(allocator), allocator);
+ var install = Api.BunInstall{
+ .default_registry = Api.NpmRegistry{
+ .url = "",
+ .username = "",
+ .password = "",
+ .token = "foo",
+ },
+ .native_bin_links = &.{},
+ };
+ var options = PackageManager.Options{};
+
+ try options.load(allocator, &log, &env_loader, null, &install);
+
+ try std.testing.expectEqualStrings(options.scope.name, "");
+ try std.testing.expectEqualStrings(options.scope.auth, "");
+ try std.testing.expectEqualStrings(options.scope.url.href, Npm.Registry.DefaultURL);
+ try std.testing.expectEqualStrings(options.scope.token, "foo");
+}
+
+test "PackageManager.Options - default registry, custom URL" {
+ var allocator = default_allocator;
+ var log = logger.Log.init(allocator);
+ defer log.deinit();
+ var env_loader = DotEnv.Loader.init(&DotEnv.Map.init(allocator), allocator);
+ var install = Api.BunInstall{
+ .default_registry = Api.NpmRegistry{
+ .url = "https://example.com/",
+ .username = "foo",
+ .password = "bar",
+ .token = "",
+ },
+ .native_bin_links = &.{},
+ };
+ var options = PackageManager.Options{};
+
+ try options.load(allocator, &log, &env_loader, null, &install);
+
+ try std.testing.expectEqualStrings(options.scope.name, "");
+ try std.testing.expectEqualStrings(options.scope.auth, "Zm9vOmJhcg==");
+ try std.testing.expectEqualStrings(options.scope.url.href, "https://example.com/");
+ try std.testing.expectEqualStrings(options.scope.token, "");
+}
+
+test "PackageManager.Options - scoped registry" {
+ var allocator = default_allocator;
+ var log = logger.Log.init(allocator);
+ defer log.deinit();
+ var env_loader = DotEnv.Loader.init(&DotEnv.Map.init(allocator), allocator);
+ var install = Api.BunInstall{
+ .scoped = Api.NpmRegistryMap{
+ .scopes = &.{
+ "foo",
+ },
+ .registries = &.{
+ Api.NpmRegistry{
+ .url = "",
+ .username = "",
+ .password = "",
+ .token = "bar",
+ },
+ },
+ },
+ .native_bin_links = &.{},
+ };
+ var options = PackageManager.Options{};
+
+ try options.load(allocator, &log, &env_loader, null, &install);
+
+ try std.testing.expectEqualStrings(options.scope.name, "");
+ try std.testing.expectEqualStrings(options.scope.auth, "");
+ try std.testing.expectEqualStrings(options.scope.url.href, Npm.Registry.DefaultURL);
+ try std.testing.expectEqualStrings(options.scope.token, "");
+
+ var scoped = options.registries.getPtr(Npm.Registry.Scope.hash(Npm.Registry.Scope.getName("foo")));
+
+ try std.testing.expect(scoped != null);
+ if (scoped) |scope| {
+ try std.testing.expectEqualStrings(scope.name, "foo");
+ try std.testing.expectEqualStrings(scope.auth, "");
+ try std.testing.expectEqualStrings(scope.url.href, Npm.Registry.DefaultURL);
+ try std.testing.expectEqualStrings(scope.token, "bar");
+ }
+}
diff --git a/src/install/npm.zig b/src/install/npm.zig
index 965157d50..3874c2c01 100644
--- a/src/install/npm.zig
+++ b/src/install/npm.zig
@@ -35,12 +35,7 @@ const ComptimeStringMap = @import("../comptime_string_map.zig").ComptimeStringMa
const Npm = @This();
pub const Registry = struct {
- url: URL = URL.parse("https://registry.npmjs.org/"),
- scopes: Map = Map{},
-
- token: string = "",
- auth: string = "",
-
+ pub const DefaultURL = "https://registry.npmjs.org/";
pub const BodyPool = ObjectPool(MutableString, MutableString.init2048, true, 8);
pub const Scope = struct {
@@ -72,7 +67,7 @@ pub const Registry = struct {
pub fn fromAPI(name: string, registry_: Api.NpmRegistry, allocator: std.mem.Allocator, env: *DotEnv.Loader) !Scope {
var registry = registry_;
- var url = URL.parse(registry.url);
+ var url = URL.parse(if (registry.url.len == 0) DefaultURL else registry.url);
var auth: string = "";
if (registry.token.len == 0) {
@@ -620,15 +615,15 @@ pub const PackageManifest = struct {
pub fn reportSize(this: *const PackageManifest) void {
Output.prettyErrorln(
- \\ Versions count: {d}
- \\ External Strings count: {d}
+ \\ Versions count: {d}
+ \\ External Strings count: {d}
\\ Package Versions count: {d}
- \\
+ \\
\\ Bytes:
\\
- \\ Versions: {d}
- \\ External: {d}
- \\ Packages: {d}
+ \\ Versions: {d}
+ \\ External: {d}
+ \\ Packages: {d}
\\ Strings: {d}
\\ Total: {d}
, .{
diff --git a/test/bun.js/bun-install.test.ts b/test/bun.js/bun-install.test.ts
new file mode 100644
index 000000000..1bc4655eb
--- /dev/null
+++ b/test/bun.js/bun-install.test.ts
@@ -0,0 +1,38 @@
+import { spawn, spawnSync } from "bun";
+import { describe, expect, it, test } from "bun:test";
+import { bunExe } from "bunExe";
+
+test("bun install", async () => {
+ const urls = [];
+ const server = Bun.serve({
+ async fetch(request) {
+ try {
+ expect(request.method).toBe("GET");
+ expect(request.headers.get("accept")).toBe("application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*");
+ expect(await request.text()).toBe("");
+ urls.push(request.url);
+ return new Response("bar", { status: 404 });
+ } finally {
+ server.stop();
+ }
+ },
+ port: 54321,
+ });
+ const { stdout, stderr, exited } = spawn({
+ cmd: [bunExe(), "install", "foo", "--config", import.meta.dir + "/bun-install.toml"],
+ stdout: null,
+ stdin: "pipe",
+ stderr: "pipe",
+ env: {
+ ...process.env,
+ BUN_DEBUG_QUIET_LOGS: "1",
+ },
+ });
+ expect(stdout).toBeDefined();
+ expect(stderr).toBeDefined();
+ expect(await new Response(stdout).text()).toBe("");
+ var err = await new Response(stderr).text();
+ expect(err.split(/\n/)).toContain('error: package "foo" not found localhost/foo 404');
+ expect(urls).toContain("http://localhost:54321/foo");
+ expect(await exited).toBe(1);
+});
diff --git a/test/bun.js/bun-install.toml b/test/bun.js/bun-install.toml
new file mode 100644
index 000000000..112c61f86
--- /dev/null
+++ b/test/bun.js/bun-install.toml
@@ -0,0 +1,2 @@
+[install]
+registry = "http://localhost:54321/"