// given a set of versions and a range, create a "simplified" range | |
// that includes the same versions that the original range does | |
// If the original range is shorter than the simplified one, return that. | |
const satisfies = require('../functions/satisfies.js') | |
const compare = require('../functions/compare.js') | |
module.exports = (versions, range, options) => { | |
const set = [] | |
let first = null | |
let prev = null | |
const v = versions.sort((a, b) => compare(a, b, options)) | |
for (const version of v) { | |
const included = satisfies(version, range, options) | |
if (included) { | |
prev = version | |
if (!first) { | |
first = version | |
} | |
} else { | |
if (prev) { | |
set.push([first, prev]) | |
} | |
prev = null | |
first = null | |
} | |
} | |
if (first) { | |
set.push([first, null]) | |
} | |
const ranges = [] | |
for (const [min, max] of set) { | |
if (min === max) { | |
ranges.push(min) | |
} else if (!max && min === v[0]) { | |
ranges.push('*') | |
} else if (!max) { | |
ranges.push(`>=${min}`) | |
} else if (min === v[0]) { | |
ranges.push(`<=${max}`) | |
} else { | |
ranges.push(`${min} - ${max}`) | |
} | |
} | |
const simplified = ranges.join(' || ') | |
const original = typeof range.raw === 'string' ? range.raw : String(range) | |
return simplified.length < original.length ? simplified : range | |
} | |