diff --git a/.changeset/quiet-versions-compare.md b/.changeset/quiet-versions-compare.md new file mode 100644 index 0000000000..6712b7c578 --- /dev/null +++ b/.changeset/quiet-versions-compare.md @@ -0,0 +1,5 @@ +--- +"@uploadthing/shared": patch +--- + +Compare numeric minor and patch versions in peer dependency checks. Valid double-digit minor versions no longer trigger a warning, and installed versions below the required patch version are rejected. diff --git a/packages/shared/src/utils.ts b/packages/shared/src/utils.ts index 85cd5e5a84..0d78cd29ba 100644 --- a/packages/shared/src/utils.ts +++ b/packages/shared/src/utils.ts @@ -208,19 +208,22 @@ export function semverLite(required: string, toCheck: string) { const [_1, rMajor, rMinor, rPatch] = requiredMatch; const [_2, cMajor, cMinor, cPatch] = toCheckMatch; + const meetsMinimum = + Number(cMinor ?? 0) > Number(rMinor ?? 0) || + (Number(cMinor ?? 0) === Number(rMinor ?? 0) && + Number(cPatch ?? 0) >= Number(rPatch ?? 0)); if (required.startsWith("^")) { // Major must be equal, minor must be greater or equal if (rMajor !== cMajor) return false; - if (rMinor && cMinor && rMinor > cMinor) return false; - return true; + return meetsMinimum; } if (required.startsWith("~")) { // Major must be equal, minor must be equal if (rMajor !== cMajor) return false; if (rMinor !== cMinor) return false; - return true; + return Number(cPatch ?? 0) >= Number(rPatch ?? 0); } // Exact match diff --git a/packages/shared/test/semver.test.ts b/packages/shared/test/semver.test.ts new file mode 100644 index 0000000000..e895c4f04d --- /dev/null +++ b/packages/shared/test/semver.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, it } from "vitest"; + +import { semverLite } from "../src/utils"; + +describe("semverLite", () => { + it.each([ + ["^7.2.0", "7.10.0", true], + ["^7.10.0", "7.2.0", false], + ["^7.2.5", "7.2.4", false], + ["^7.2.5", "7.2.5", true], + ["^7.2.5", "7.3.0", true], + ["^7.2.5", "8.0.0", false], + ["~7.2.5", "7.2.4", false], + ["~7.2.5", "7.2.10", true], + ["~7.2.5", "7.3.0", false], + ["7.2.5", "7.2.5", true], + ["7.2.5", "7.2.6", false], + ])("matches %s against %s as %s", (required, installed, matches) => { + expect(semverLite(required, installed)).toBe(matches); + }); +});