feat(webpack): consider prereleases in runtime detection for commonjs auto-fallback

This commit is contained in:
Nathan Walker
2025-08-28 12:37:02 -07:00
parent e9d3219db2
commit 591ec958c9
2 changed files with 49 additions and 12 deletions

View File

@@ -76,7 +76,10 @@ export function getDependencyVersion(dependencyName: string): string | null {
* - fall back to declared version in project package.json (dependencies/devDependencies)
* - if declared is a common dist-tag (alpha|beta|rc|next) return a 9.x prerelease
*/
export function getResolvedDependencyVersionForCheck(dependencyName: string, target: string): string | null {
export function getResolvedDependencyVersionForCheck(
dependencyName: string,
target: string,
): string | null {
// try installed
const installed = getDependencyVersion(dependencyName);
if (installed) {
@@ -85,19 +88,17 @@ export function getResolvedDependencyVersionForCheck(dependencyName: string, tar
// try declared in project package.json
const pkg = getPackageJson();
const declared = (pkg.dependencies && pkg.dependencies[dependencyName]) || (pkg.devDependencies && pkg.devDependencies[dependencyName]);
const declared =
(pkg.dependencies && pkg.dependencies[dependencyName]) ||
(pkg.devDependencies && pkg.devDependencies[dependencyName]);
if (!declared) {
return null;
}
// if declared already satisfies semver check, use it
try {
if (satisfies(declared, `>=${target}`)) {
return declared;
}
} catch (e) {
// ignore parse errors
}
// Note: declared may be a dist-tag like 'alpha' or a range. We only treat
// common tags as prereleases of target. Avoid trying to interpret arbitrary
// ranges here.
// common dist-tags -> treat as prerelease of 9.x for the purpose of >=9 checks
if (/^(alpha|beta|rc|next)$/.test(String(declared))) {
@@ -106,3 +107,38 @@ export function getResolvedDependencyVersionForCheck(dependencyName: string, tar
return declared ?? null;
}
/**
* Numeric comparison that treats prerelease versions as being at the same
* numeric level as their base version. e.g. 9.0.0-alpha.2 >= 9.0.0
*/
export function isVersionGteConsideringPrerelease(
version: string | null | undefined,
target: string,
): boolean {
if (!version) {
return false;
}
try {
const v = require('semver').parse(String(version));
const t = require('semver').parse(String(target));
if (!v || !t) {
// fallback to semver.satisfies with a prerelease-aware lower bound
return require('semver').satisfies(String(version), `>=${target}-0`);
}
if (v.major > t.major) return true;
if (v.major < t.major) return false;
if (v.minor > t.minor) return true;
if (v.minor < t.minor) return false;
if (v.patch >= t.patch) return true;
return false;
} catch (e) {
try {
return require('semver').satisfies(String(version), `>=${target}-0`);
} catch (e) {
return false;
}
}
}