47 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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
 | |
| }
 |