You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.3 KiB
47 lines
1.3 KiB
// 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 |
|
}
|
|
|