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