From 2f301e840410b82dff2c50718fee4b77fce95ca5 Mon Sep 17 00:00:00 2001 From: Dylan Conway Date: Mon, 6 Nov 2023 17:10:59 -0800 Subject: [PATCH] skip tags in version ranges --- src/install/dependency.zig | 9 +- src/install/semver.zig | 3 + .../registry/bun-install-registry.test.ts | 83 +++++++++++ .../registry/packages/.verdaccio-db.json | 2 +- .../dep-with-tags/dep-with-tags-1.0.0.tgz | Bin 0 -> 159 bytes .../dep-with-tags/dep-with-tags-1.0.1.tgz | Bin 0 -> 160 bytes .../dep-with-tags/dep-with-tags-2.0.0.tgz | Bin 0 -> 160 bytes .../dep-with-tags/dep-with-tags-2.0.1.tgz | Bin 0 -> 160 bytes .../dep-with-tags/dep-with-tags-3.0.0.tgz | Bin 0 -> 160 bytes .../dep-with-tags/dep-with-tags-3.0.1.tgz | Bin 0 -> 160 bytes .../packages/dep-with-tags/package.json | 137 ++++++++++++++++++ 11 files changed, 231 insertions(+), 3 deletions(-) create mode 100644 test/cli/install/registry/packages/dep-with-tags/dep-with-tags-1.0.0.tgz create mode 100644 test/cli/install/registry/packages/dep-with-tags/dep-with-tags-1.0.1.tgz create mode 100644 test/cli/install/registry/packages/dep-with-tags/dep-with-tags-2.0.0.tgz create mode 100644 test/cli/install/registry/packages/dep-with-tags/dep-with-tags-2.0.1.tgz create mode 100644 test/cli/install/registry/packages/dep-with-tags/dep-with-tags-3.0.0.tgz create mode 100644 test/cli/install/registry/packages/dep-with-tags/dep-with-tags-3.0.1.tgz create mode 100644 test/cli/install/registry/packages/dep-with-tags/package.json diff --git a/src/install/dependency.zig b/src/install/dependency.zig index 314e364d9e..68bbcdfeb6 100644 --- a/src/install/dependency.zig +++ b/src/install/dependency.zig @@ -400,7 +400,7 @@ pub const Version = struct { // ^1.2.3 // * // || 1.x - '=', '>', '<', '^', '*', '|' => return .npm, + '=', '>', '<', '^', '*', '|', '&' => return .npm, // ./foo.tgz // ./path/to/foo // ../path/to/bar @@ -615,7 +615,12 @@ pub const Version = struct { // git@example.com:path/to/repo.git if (isSCPLikePath(dependency)) return .git; // beta - return .dist_tag; + + if (!strings.containsChar(dependency, '|') and !strings.containsChar(dependency, '&')) { + return .dist_tag; + } + + return .npm; } }; diff --git a/src/install/semver.zig b/src/install/semver.zig index e9fa11ef8f..45519f5b57 100644 --- a/src/install/semver.zig +++ b/src/install/semver.zig @@ -1941,6 +1941,9 @@ pub const Query = struct { else => { i += 1; token.tag = Token.Tag.none; + + // skip tagged versions + while (i < input.len and input[i] != ' ') : (i += 1) {} skip_round = true; }, } diff --git a/test/cli/install/registry/bun-install-registry.test.ts b/test/cli/install/registry/bun-install-registry.test.ts index 53a6c33c87..b56d4d3934 100644 --- a/test/cli/install/registry/bun-install-registry.test.ts +++ b/test/cli/install/registry/bun-install-registry.test.ts @@ -214,6 +214,89 @@ test("package added after install", async () => { } as any); }); +describe("semver", () => { + const taggedVersionTests = [ + { + title: "tagged version last in range", + depVersion: "1 || 2 || pre-3", + expected: "2.0.1", + }, + { + title: "tagged version in middle of range", + depVersion: "1 || pre-3 || 2", + expected: "2.0.1", + }, + { + title: "tagged version first in range", + depVersion: "pre-3 || 2 || 1", + expected: "2.0.1", + }, + { + title: "multiple tagged versions in range", + depVersion: "pre-3 || 2 || pre-1 || 1 || 3 || pre-3", + expected: "3.0.0", + }, + { + title: "start with &&", + depVersion: "&& 1", + expected: "1.0.1", + }, + { + title: "start with ||", + depVersion: "|| 1", + expected: "1.0.1", + }, + { + title: "start with || no space", + depVersion: "||2", + expected: "2.0.1", + }, + { + title: "|| with no space on both sides", + depVersion: "1||2", + expected: "2.0.1", + }, + ]; + + for (const { title, depVersion, expected } of taggedVersionTests) { + test(title, async () => { + await writeFile( + join(packageDir, "package.json"), + JSON.stringify({ + name: "foo", + version: "1.0.0", + dependencies: { + "dep-with-tags": depVersion, + }, + }), + ); + + var { stdout, stderr, exited } = spawn({ + cmd: [bunExe(), "install"], + cwd: packageDir, + stdout: null, + stdin: "pipe", + stderr: "pipe", + env, + }); + + expect(stderr).toBeDefined(); + var err = await new Response(stderr).text(); + expect(stdout).toBeDefined(); + var out = await new Response(stdout).text(); + expect(await exited).toBe(0); + expect(err).toContain("Saved lockfile"); + expect(err).not.toContain("not found"); + expect(err).not.toContain("error:"); + expect(out.replace(/\s*\[[0-9\.]+m?s\]\s*$/, "").split(/\r?\n/)).toEqual([ + ` + dep-with-tags@${expected}`, + "", + " 1 package installed", + ]); + }); + } +}); + describe("prereleases", () => { const prereleaseTests = [ [ diff --git a/test/cli/install/registry/packages/.verdaccio-db.json b/test/cli/install/registry/packages/.verdaccio-db.json index 619a0d7eba..fca64c97c5 100644 --- a/test/cli/install/registry/packages/.verdaccio-db.json +++ b/test/cli/install/registry/packages/.verdaccio-db.json @@ -1 +1 @@ -{"list":["basic-1","@babel/parser","@babel/traverse","@private/has-bin-entry","@private/package","@private/unconventional-tarball","@scoped/create-test-app","@scoped/has-bin-entry","@types/babel__traverse","@types/is-number","@types/no-deps","binding-gyp-scripts","broken-peer-deps","create-test-app","dep-loop-entry","dep-loop-exit","dev-deps","dragon-test-1-a","dragon-test-1-b","dragon-test-1-c","dragon-test-1-d","dragon-test-1-e","dragon-test-3-a","dragon-test-3-b","dragon-test-7-a","dragon-test-7-b","dragon-test-7-c","dragon-test-7-d","dragon-test-8-a","dragon-test-8-b","dragon-test-8-c","dragon-test-8-d","dragon-test-11-a","dragon-test-11-b","fallback-peer-deps","forward-peer-deps","forward-peer-deps-too","has-bin-entries","has-symlinks","has-types","hoisting-peer-check-child","hoisting-peer-check-parent","inject-node-gyp","invalid-main","is-number","left-pad","mismatched-peer-deps-lvl0","mismatched-peer-deps-lvl1","mismatched-peer-deps-lvl2","native","native-bar-x64","native-foo-x64","native-foo-x86","native-libc-glibc","native-libc-musl","no-deps","no-deps-backward-tags","no-deps-bins","no-deps-bins-esm","no-deps-browser-field","no-deps-build-metadata","no-deps-checked","no-deps-deprecated","no-deps-deprecated-empty","no-deps-deprecated-whitespace","no-deps-esm","no-deps-exports","no-deps-failing","no-deps-mjs","no-deps-nested-postinstall","no-deps-scripted","no-deps-scripted-bis","no-deps-scripted-empty","no-deps-scripted-to-fail","no-deps-scripted-to-deeply-fail","no-deps-tags","node-gyp","node-modules-path","one-deep1-dep-bins","one-deep2-dep-bins","one-dep-scripted","one-fixed-dep","one-fixed-dep-bins","one-fixed-dep-checked","one-fixed-dep-scripted","one-fixed-dep-with-types","one-range-dep","one-range-dep-too","optional-native","optional-peer-deps","optional-peer-deps-implicit","path-parse","peer-deps","peer-deps-fixed","peer-deps-lvl0","peer-deps-lvl1","peer-deps-lvl2","peer-deps-too","prefer-unplugged-false","prefer-unplugged-true","private-package","private-unconventional-tarball","provides-peer-deps-1-0-0","provides-peer-deps-1-0-0-too","provides-peer-deps-2-0-0","resolve","self-require-dep","self-require-trap","two-range-deps","unconventional-tarball","various-requires","vulnerable","vulnerable-dep","vulnerable-many","vulnerable-peer-deps","prereleases-1","prereleases-2"],"secret":"4f8fdf3ae3425c5661cbdd85990a5f44365b989c3c6f478ed48ccf5bae9e14b1"} \ No newline at end of file +{"list":["basic-1","@babel/parser","@babel/traverse","@private/has-bin-entry","@private/package","@private/unconventional-tarball","@scoped/create-test-app","@scoped/has-bin-entry","@types/babel__traverse","@types/is-number","@types/no-deps","binding-gyp-scripts","broken-peer-deps","create-test-app","dep-loop-entry","dep-loop-exit","dev-deps","dragon-test-1-a","dragon-test-1-b","dragon-test-1-c","dragon-test-1-d","dragon-test-1-e","dragon-test-3-a","dragon-test-3-b","dragon-test-7-a","dragon-test-7-b","dragon-test-7-c","dragon-test-7-d","dragon-test-8-a","dragon-test-8-b","dragon-test-8-c","dragon-test-8-d","dragon-test-11-a","dragon-test-11-b","fallback-peer-deps","forward-peer-deps","forward-peer-deps-too","has-bin-entries","has-symlinks","has-types","hoisting-peer-check-child","hoisting-peer-check-parent","inject-node-gyp","invalid-main","is-number","left-pad","mismatched-peer-deps-lvl0","mismatched-peer-deps-lvl1","mismatched-peer-deps-lvl2","native","native-bar-x64","native-foo-x64","native-foo-x86","native-libc-glibc","native-libc-musl","no-deps","no-deps-backward-tags","no-deps-bins","no-deps-bins-esm","no-deps-browser-field","no-deps-build-metadata","no-deps-checked","no-deps-deprecated","no-deps-deprecated-empty","no-deps-deprecated-whitespace","no-deps-esm","no-deps-exports","no-deps-failing","no-deps-mjs","no-deps-nested-postinstall","no-deps-scripted","no-deps-scripted-bis","no-deps-scripted-empty","no-deps-scripted-to-fail","no-deps-scripted-to-deeply-fail","no-deps-tags","node-gyp","node-modules-path","one-deep1-dep-bins","one-deep2-dep-bins","one-dep-scripted","one-fixed-dep","one-fixed-dep-bins","one-fixed-dep-checked","one-fixed-dep-scripted","one-fixed-dep-with-types","one-range-dep","one-range-dep-too","optional-native","optional-peer-deps","optional-peer-deps-implicit","path-parse","peer-deps","peer-deps-fixed","peer-deps-lvl0","peer-deps-lvl1","peer-deps-lvl2","peer-deps-too","prefer-unplugged-false","prefer-unplugged-true","private-package","private-unconventional-tarball","provides-peer-deps-1-0-0","provides-peer-deps-1-0-0-too","provides-peer-deps-2-0-0","resolve","self-require-dep","self-require-trap","two-range-deps","unconventional-tarball","various-requires","vulnerable","vulnerable-dep","vulnerable-many","vulnerable-peer-deps","prereleases-1","prereleases-2","dep-with-tags"],"secret":"4f8fdf3ae3425c5661cbdd85990a5f44365b989c3c6f478ed48ccf5bae9e14b1"} \ No newline at end of file diff --git a/test/cli/install/registry/packages/dep-with-tags/dep-with-tags-1.0.0.tgz b/test/cli/install/registry/packages/dep-with-tags/dep-with-tags-1.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..accce0455adf08623dc7564b30ec984d52266082 GIT binary patch literal 159 zcmV;Q0AT+giwFP!00002|LxDQ3d0}}24Lqrg*Z3%Y>h+TMv^17rADG@hmd#ANuX25 zPzd-f|8c*F2HQSukLR$Ze8j=CodJN+n*Z8oN>O)h3=PHr%``OnLdpJMiph@jlpQ`v z_%{z?t~eLozEIq_=rGhDm+p14eH5o$y>X0g@VQkIBy3wch`vMLI*e51OO|S3MNt&R NVXT1~@Tvd^008q?N=^U( literal 0 HcmV?d00001 diff --git a/test/cli/install/registry/packages/dep-with-tags/dep-with-tags-1.0.1.tgz b/test/cli/install/registry/packages/dep-with-tags/dep-with-tags-1.0.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..d042f4f83d39e60731029afc09f82eefdf307bca GIT binary patch literal 160 zcmV;R0AK$fiwFP!00002|LxDQ3d0}}24Lqrg*Z1>TjS8Tk>p5isgay%hmd#ANuX25 zPzd-f|8c*FM%O-F59he0eBcn+&XiKt82)RYX-(a=u{2n#Xr`et7fSXA6DBv(Q+D_y z;om%nx#C;|_X2U_qJvm}e7e`k^(aocdc%l*2)Wf#Nxg09AcPJ=>jA0Cmn_x7ilQir O!&m{&Le$v+2mk=3dQA5K literal 0 HcmV?d00001 diff --git a/test/cli/install/registry/packages/dep-with-tags/dep-with-tags-2.0.0.tgz b/test/cli/install/registry/packages/dep-with-tags/dep-with-tags-2.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..d5e81f79203ac0ead27174ddcfd0977c5eaca4ee GIT binary patch literal 160 zcmV;R0AK$fiwFP!00002|LxDQ3d0}}24Lqrg*Z3%k{XA;jU-2EOO51gJCwY8PXe7f zhC;w^`H%ZWG`jxgMm)wf^_8X|HUWMS?Dde`*pkdweK@0p5isgay*hmd#gNuX25 zPzd-f|8c*FM%Uln2u<8l-f#+RXG$q+4F9#yw5IOdSsJWWG}F+TmXiI!6O)_iDLZ_U z@NXW(QgJSVdw{rbF+i-}K3(hNMii%9yWMS?Dde`*pkdweK@0p5isgay*hmd#gNuX25 zPzd-f|8c*FM%Uln2u<8l-f#+RXG$q+4F9#yw5G1@EDhEwnrZ0FnUej%6O)_iDLZ_U z@NXW(QgJSVdw{rbF+i-}K3(hNMii%9y