mirror of
https://github.com/barkeser2002/node-minecraft-data.git
synced 2026-09-25 17:25:55 +03:00
* Don't cache ambiguous keys * Add support for returning values from supportFeature * Support _major in version range Co-authored-by: Romain Beaumont <romain.rom1@gmail.com>
64 lines
2.0 KiB
JavaScript
64 lines
2.0 KiB
JavaScript
const features = require('../minecraft-data/data/pc/common/features.json')
|
|
const nameToFeature = Object.fromEntries(features.map(feature => [feature.name, feature]))
|
|
|
|
function isFeatureInRange (featureName, versionObj) {
|
|
const feature = nameToFeature[featureName]
|
|
if (feature === undefined) {
|
|
throw new Error(`Feature ${feature} doesn't exist`)
|
|
}
|
|
|
|
if (feature.values) {
|
|
for (const { value, versions, version } of feature.values) { // we're using feature.version
|
|
if (version) {
|
|
const ver = version.replace('_major', '')
|
|
if (!/^\d\.\d+$/.test(ver)) {
|
|
throw new Error(`Not a correct major version value, instead the version is: "${version}"`)
|
|
}
|
|
if (versionObj.majorVersion === ver) {
|
|
return value
|
|
}
|
|
} else { // we're using feature.versions
|
|
const [minVer, maxVer] = versions
|
|
if (isVersionInRange(minVer, versionObj, maxVer)) {
|
|
return value
|
|
}
|
|
}
|
|
}
|
|
return null // if we didn't match anything, return null
|
|
} else {
|
|
const [minVer, maxVer] = feature.versions
|
|
return isVersionInRange(minVer, versionObj, maxVer)
|
|
}
|
|
}
|
|
|
|
function isVersionInRange (minVer, versionObj, maxVer) {
|
|
let inRange = true
|
|
const { majorVersion } = versionObj
|
|
if (minVer.endsWith('_major')) {
|
|
const ver = removeMajorSuffix(minVer)
|
|
inRange = inRange && getVersionObj(majorVersion)['>='](ver)
|
|
} else {
|
|
inRange = inRange && versionObj['>='](minVer)
|
|
}
|
|
if (maxVer === 'latest') { // no need to check upper bound if upperbound is latest
|
|
return inRange
|
|
}
|
|
if (maxVer.endsWith('_major')) {
|
|
const ver = removeMajorSuffix(maxVer)
|
|
inRange = inRange && getVersionObj(majorVersion)['<='](ver)
|
|
} else {
|
|
inRange = inRange && versionObj['<='](maxVer)
|
|
}
|
|
return inRange
|
|
}
|
|
|
|
function removeMajorSuffix (verStr) {
|
|
return verStr.replace('_major', '')
|
|
}
|
|
|
|
function getVersionObj (ver) {
|
|
return require('minecraft-data')(ver).version
|
|
}
|
|
|
|
module.exports = isFeatureInRange
|