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) { if (metadata.dependencies) {
const neoForgeDependency = Object.values(metadata.dependencies) const neoForgeDependency = Object.values(metadata.dependencies)
.flat() .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) { if (minecraftDependency) {
try { newGameVersions = getGameVersionsMatchingMavenRange(
// https://docs.neoforged.net/docs/gettingstarted/versioning/#neoforge minecraftDependency,
const mcVersionRange = (neoForgeDependency as any).versionRange simplifiedGameVersions,
.replace('-beta', '') )
.replace( } else if (neoForgeDependency) {
/(\d+)(?:\.(\d+))?(?:\.(\d+)?)?/g, // https://docs.neoforged.net/docs/gettingstarted/versioning/#neoforge
(_match: string, major: string, minor: string) => { // NeoForge's versioning changed after Mojang changed from 1.<major>.<minor> to <year>.<drop>.<patch>, so both cases need to be handled
return `1.${major}${minor ? '.' + minor : ''}` const neoPre26Regex = /^(?<mc_major>\d+)(?:\.(?<mc_minor>\d+))?(?:\.(?<neo>\d+)?)?$/
}, const neoPost26Regex =
) /^(?<mc_year>\d+)(?:\.(?<mc_drop>\d+))?(?:\.(?<mc_patch>\d+)?)?(?:\.(\d+))?$/
newGameVersions = getGameVersionsMatchingMavenRange(
mcVersionRange, newGameVersions = getGameVersionsMatchingMavenRange(
simplifiedGameVersions, neoForgeDependency.replace('-beta', ''),
) simplifiedGameVersions,
} catch { (version) => {
// Ignore parsing errors, just leave game_versions empty 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( export function getGameVersionsMatchingMavenRange(
range: string | undefined, range: string | undefined,
gameVersions: string[], gameVersions: string[],
processor: (version: string) => string | null = (v) => v,
): string[] { ): string[] {
if (!range) { if (!range) {
return [] return []
@@ -63,24 +64,42 @@ export function getGameVersionsMatchingMavenRange(
for (const range of ranges) { for (const range of ranges) {
let result let result
if ((result = range.match(LESS_THAN_EQUAL))) { let version1
semverRanges.push(`<=${result[1]}`) let version2
} else if ((result = range.match(LESS_THAN))) { if ((result = range.match(LESS_THAN_EQUAL)) && (version1 = processor(result[1]))) {
semverRanges.push(`<${result[1]}`) semverRanges.push(`<=${version1}`)
} else if ((result = range.match(EQUAL))) { } else if ((result = range.match(LESS_THAN)) && (version1 = processor(result[1]))) {
semverRanges.push(`${result[1]}`) semverRanges.push(`<${version1}`)
} else if ((result = range.match(GREATER_THAN_EQUAL))) { } else if ((result = range.match(EQUAL)) && (version1 = processor(result[1]))) {
semverRanges.push(`>=${result[1]}`) semverRanges.push(`${version1}`)
} else if ((result = range.match(GREATER_THAN))) { } else if ((result = range.match(GREATER_THAN_EQUAL)) && (version1 = processor(result[1]))) {
semverRanges.push(`>${result[1]}`) semverRanges.push(`>=${version1}`)
} else if ((result = range.match(BETWEEN))) { } else if ((result = range.match(GREATER_THAN)) && (version1 = processor(result[1]))) {
semverRanges.push(`>${result[1]} <${result[2]}`) semverRanges.push(`>${version1}`)
} else if ((result = range.match(BETWEEN_EQUAL))) { } else if (
semverRanges.push(`>=${result[1]} <=${result[2]}`) (result = range.match(BETWEEN)) &&
} else if ((result = range.match(BETWEEN_LESS_THAN_EQUAL))) { (version1 = processor(result[1])) &&
semverRanges.push(`>${result[1]} <=${result[2]}`) (version2 = processor(result[2]))
} else if ((result = range.match(BETWEEN_GREATER_THAN_EQUAL))) { ) {
semverRanges.push(`>=${result[1]} <${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) return getGameVersionsMatchingSemverRange(semverRanges, gameVersions)