| const SemVer = require('../classes/semver') | 
| const Range = require('../classes/range') | 
| const gt = require('../functions/gt') | 
|   | 
| const minVersion = (range, loose) => { | 
|   range = new Range(range, loose) | 
|   | 
|   let minver = new SemVer('0.0.0') | 
|   if (range.test(minver)) { | 
|     return minver | 
|   } | 
|   | 
|   minver = new SemVer('0.0.0-0') | 
|   if (range.test(minver)) { | 
|     return minver | 
|   } | 
|   | 
|   minver = null | 
|   for (let i = 0; i < range.set.length; ++i) { | 
|     const comparators = range.set[i] | 
|   | 
|     let setMin = null | 
|     comparators.forEach((comparator) => { | 
|       // Clone to avoid manipulating the comparator's semver object. | 
|       const compver = new SemVer(comparator.semver.version) | 
|       switch (comparator.operator) { | 
|         case '>': | 
|           if (compver.prerelease.length === 0) { | 
|             compver.patch++ | 
|           } else { | 
|             compver.prerelease.push(0) | 
|           } | 
|           compver.raw = compver.format() | 
|           /* fallthrough */ | 
|         case '': | 
|         case '>=': | 
|           if (!setMin || gt(compver, setMin)) { | 
|             setMin = compver | 
|           } | 
|           break | 
|         case '<': | 
|         case '<=': | 
|           /* Ignore maximum versions */ | 
|           break | 
|         /* istanbul ignore next */ | 
|         default: | 
|           throw new Error(`Unexpected operation: ${comparator.operator}`) | 
|       } | 
|     }) | 
|     if (setMin && (!minver || gt(minver, setMin))) { | 
|       minver = setMin | 
|     } | 
|   } | 
|   | 
|   if (minver && range.test(minver)) { | 
|     return minver | 
|   } | 
|   | 
|   return null | 
| } | 
| module.exports = minVersion |