fix: neoforge mc version inferring incorrectly (#6068)

* fix: neoforge mc version infering

* fix: check if versionRange exists
This commit is contained in:
ThatGravyBoat
2026-05-11 13:23:09 -02:30
committed by GitHub
parent 12e5f02e57
commit 840b556c51
2 changed files with 74 additions and 37 deletions

View File

@@ -28,26 +28,44 @@ export function createLoaderParsers(
if (metadata.dependencies) {
const neoForgeDependency = Object.values(metadata.dependencies)
.flat()
.find((dependency: any) => dependency.modId === 'neoforge')
.filter((dependency: any) => dependency.modId === 'neoforge')
.map((dependency: any) => dependency.versionRange)
.find((range) => range)
const minecraftDependency = Object.values(metadata.dependencies)
.flat()
.filter((dependency: any) => dependency.modId === 'minecraft')
.map((dependency: any) => dependency.versionRange)
.find((range) => range)
if (neoForgeDependency) {
try {
// https://docs.neoforged.net/docs/gettingstarted/versioning/#neoforge
const mcVersionRange = (neoForgeDependency as any).versionRange
.replace('-beta', '')
.replace(
/(\d+)(?:\.(\d+))?(?:\.(\d+)?)?/g,
(_match: string, major: string, minor: string) => {
return `1.${major}${minor ? '.' + minor : ''}`
},
)
newGameVersions = getGameVersionsMatchingMavenRange(
mcVersionRange,
simplifiedGameVersions,
)
} catch {
// Ignore parsing errors, just leave game_versions empty
}
if (minecraftDependency) {
newGameVersions = getGameVersionsMatchingMavenRange(
minecraftDependency,
simplifiedGameVersions,
)
} else if (neoForgeDependency) {
// https://docs.neoforged.net/docs/gettingstarted/versioning/#neoforge
// NeoForge's versioning changed after Mojang changed from 1.<major>.<minor> to <year>.<drop>.<patch>, so both cases need to be handled
const neoPre26Regex = /^(?<mc_major>\d+)(?:\.(?<mc_minor>\d+))?(?:\.(?<neo>\d+)?)?$/
const neoPost26Regex =
/^(?<mc_year>\d+)(?:\.(?<mc_drop>\d+))?(?:\.(?<mc_patch>\d+)?)?(?:\.(\d+))?$/
newGameVersions = getGameVersionsMatchingMavenRange(
neoForgeDependency.replace('-beta', ''),
simplifiedGameVersions,
(version) => {
const matchPre26 = version.match(neoPre26Regex)
if (matchPre26 && matchPre26.groups) {
const { mc_major, mc_minor } = matchPre26.groups
return mc_minor ? `1.${mc_major}.${mc_minor}` : `1.${mc_major}`
}
const matchPost26 = version.match(neoPost26Regex)
if (matchPost26 && matchPost26.groups) {
const { mc_year, mc_drop, mc_patch } = matchPost26.groups
return `${mc_year}${mc_drop ? `.${mc_drop}` : ''}${mc_patch ? `.${mc_patch}` : ''}`
}
return version
},
)
}
}

View File

@@ -25,6 +25,7 @@ export function getGameVersionsMatchingSemverRange(
export function getGameVersionsMatchingMavenRange(
range: string | undefined,
gameVersions: string[],
processor: (version: string) => string | null = (v) => v,
): string[] {
if (!range) {
return []
@@ -63,24 +64,42 @@ export function getGameVersionsMatchingMavenRange(
for (const range of ranges) {
let result
if ((result = range.match(LESS_THAN_EQUAL))) {
semverRanges.push(`<=${result[1]}`)
} else if ((result = range.match(LESS_THAN))) {
semverRanges.push(`<${result[1]}`)
} else if ((result = range.match(EQUAL))) {
semverRanges.push(`${result[1]}`)
} else if ((result = range.match(GREATER_THAN_EQUAL))) {
semverRanges.push(`>=${result[1]}`)
} else if ((result = range.match(GREATER_THAN))) {
semverRanges.push(`>${result[1]}`)
} else if ((result = range.match(BETWEEN))) {
semverRanges.push(`>${result[1]} <${result[2]}`)
} else if ((result = range.match(BETWEEN_EQUAL))) {
semverRanges.push(`>=${result[1]} <=${result[2]}`)
} else if ((result = range.match(BETWEEN_LESS_THAN_EQUAL))) {
semverRanges.push(`>${result[1]} <=${result[2]}`)
} else if ((result = range.match(BETWEEN_GREATER_THAN_EQUAL))) {
semverRanges.push(`>=${result[1]} <${result[2]}`)
let version1
let version2
if ((result = range.match(LESS_THAN_EQUAL)) && (version1 = processor(result[1]))) {
semverRanges.push(`<=${version1}`)
} else if ((result = range.match(LESS_THAN)) && (version1 = processor(result[1]))) {
semverRanges.push(`<${version1}`)
} else if ((result = range.match(EQUAL)) && (version1 = processor(result[1]))) {
semverRanges.push(`${version1}`)
} else if ((result = range.match(GREATER_THAN_EQUAL)) && (version1 = processor(result[1]))) {
semverRanges.push(`>=${version1}`)
} else if ((result = range.match(GREATER_THAN)) && (version1 = processor(result[1]))) {
semverRanges.push(`>${version1}`)
} else if (
(result = range.match(BETWEEN)) &&
(version1 = processor(result[1])) &&
(version2 = processor(result[2]))
) {
semverRanges.push(`>${version1} <${version2}`)
} else if (
(result = range.match(BETWEEN_EQUAL)) &&
(version1 = processor(result[1])) &&
(version2 = processor(result[2]))
) {
semverRanges.push(`>=${version1} <=${version2}`)
} else if (
(result = range.match(BETWEEN_LESS_THAN_EQUAL)) &&
(version1 = processor(result[1])) &&
(version2 = processor(result[2]))
) {
semverRanges.push(`>${version1} <=${version2}`)
} else if (
(result = range.match(BETWEEN_GREATER_THAN_EQUAL)) &&
(version1 = processor(result[1])) &&
(version2 = processor(result[2]))
) {
semverRanges.push(`>=${version1} <${version2}`)
}
}
return getGameVersionsMatchingSemverRange(semverRanges, gameVersions)