diff options
author | 2023-04-25 03:56:43 +0300 | |
---|---|---|
committer | 2023-04-24 17:56:43 -0700 | |
commit | 6e16bb67eb7b80b18c585590f1da024e677f54ed (patch) | |
tree | 0bb6fecd41a1e0fe03ef7c2d9c865e5a52055612 | |
parent | e9e76450487d3fd173bdc372b65aaf436247b83f (diff) | |
download | bun-6e16bb67eb7b80b18c585590f1da024e677f54ed.tar.gz bun-6e16bb67eb7b80b18c585590f1da024e677f54ed.tar.zst bun-6e16bb67eb7b80b18c585590f1da024e677f54ed.zip |
[install] fix `bun add` on non-aliased dependency (#2728)
-rw-r--r-- | src/install/install.zig | 23 | ||||
-rw-r--r-- | test/cli/install/bun-add.test.ts | 64 |
2 files changed, 82 insertions, 5 deletions
diff --git a/src/install/install.zig b/src/install/install.zig index ddad15dd9..54131fc2a 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -4771,10 +4771,15 @@ pub const PackageManager = struct { ast_modifier: { // Try to use the existing spot in the dependencies list if possible for (updates) |*update| { - outer: for (dependency_lists_to_check) |list| { + for (dependency_lists_to_check) |list| { if (current_package_json.asProperty(list)) |query| { if (query.expr.data == .e_object) { - if (query.expr.asProperty(update.name)) |value| { + if (query.expr.asProperty( + if (update.is_aliased) + update.name + else + update.version.literal.slice(update.version_buf), + )) |value| { if (value.expr.data == .e_string) { if (!update.resolved_name.isEmpty() and strings.eql(list, dependency_list)) { replacing += 1; @@ -4783,7 +4788,7 @@ pub const PackageManager = struct { remaining -= 1; } } - break :outer; + break; } } } @@ -4811,7 +4816,13 @@ pub const PackageManager = struct { var k: usize = 0; while (k < new_dependencies.len) : (k += 1) { if (new_dependencies[k].key) |key| { - if (key.data.e_string.eql(string, update.name)) { + if (key.data.e_string.eql( + string, + if (update.is_aliased) + update.name + else + update.version.literal.slice(update.version_buf), + )) { if (update.resolved_name.isEmpty()) { // This actually is a duplicate // like "react" appearing in both "dependencies" and "optionalDependencies" @@ -4832,8 +4843,10 @@ pub const PackageManager = struct { new_dependencies[k].key = try JSAst.Expr.init( JSAst.E.String, JSAst.E.String{ - .data = try allocator.dupe(u8, if (update.is_aliased or update.resolved_name.isEmpty()) + .data = try allocator.dupe(u8, if (update.is_aliased) update.name + else if (update.resolved_name.isEmpty()) + update.version.literal.slice(update.version_buf) else update.resolved_name.slice(update.version_buf)), }, diff --git a/test/cli/install/bun-add.test.ts b/test/cli/install/bun-add.test.ts index 0f3f13895..05105c747 100644 --- a/test/cli/install/bun-add.test.ts +++ b/test/cli/install/bun-add.test.ts @@ -350,6 +350,70 @@ it("should add dependency with specified semver", async () => { await access(join(package_dir, "bun.lockb")); }); +it("should add dependency (GitHub)", async () => { + const urls: string[] = []; + setHandler(dummyRegistry(urls)); + await writeFile( + join(package_dir, "package.json"), + JSON.stringify({ + name: "foo", + version: "0.0.1", + }), + ); + const { stdout, stderr, exited } = spawn({ + cmd: [bunExe(), "add", "mishoo/UglifyJS#v3.14.1"], + cwd: package_dir, + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + expect(stderr).toBeDefined(); + const err = await new Response(stderr).text(); + expect(err).toContain("Saved lockfile"); + expect(stdout).toBeDefined(); + const out = await new Response(stdout).text(); + expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ + "", + " installed uglify-js@github:mishoo/UglifyJS#e219a9a with binaries:", + " - uglifyjs", + "", + "", + " 1 packages installed", + ]); + expect(await exited).toBe(0); + expect(urls.sort()).toEqual([]); + expect(requested).toBe(0); + expect(await readdirSorted(join(package_dir, "node_modules"))).toEqual([".bin", ".cache", "uglify-js"]); + expect(await readdirSorted(join(package_dir, "node_modules", ".bin"))).toEqual(["uglifyjs"]); + expect(await readdirSorted(join(package_dir, "node_modules", ".cache"))).toEqual(["@GH@mishoo-UglifyJS-e219a9a"]); + expect(await readdirSorted(join(package_dir, "node_modules", "uglify-js"))).toEqual([ + ".bun-tag", + ".gitattributes", + ".github", + ".gitignore", + "CONTRIBUTING.md", + "LICENSE", + "README.md", + "bin", + "lib", + "package.json", + "test", + "tools", + ]); + const package_json = await file(join(package_dir, "node_modules", "uglify-js", "package.json")).json(); + expect(package_json.name).toBe("uglify-js"); + expect(package_json.version).toBe("3.14.1"); + expect(await file(join(package_dir, "package.json")).json()).toEqual({ + name: "foo", + version: "0.0.1", + dependencies: { + "uglify-js": "mishoo/UglifyJS#v3.14.1", + }, + }); + await access(join(package_dir, "bun.lockb")); +}); + it("should add dependency alongside workspaces", async () => { const urls: string[] = []; setHandler( |