min-version.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. 'use strict'
  2. const SemVer = require('../classes/semver')
  3. const Range = require('../classes/range')
  4. const gt = require('../functions/gt')
  5. const minVersion = (range, loose) => {
  6. range = new Range(range, loose)
  7. let minver = new SemVer('0.0.0')
  8. if (range.test(minver)) {
  9. return minver
  10. }
  11. minver = new SemVer('0.0.0-0')
  12. if (range.test(minver)) {
  13. return minver
  14. }
  15. minver = null
  16. for (let i = 0; i < range.set.length; ++i) {
  17. const comparators = range.set[i]
  18. let setMin = null
  19. comparators.forEach((comparator) => {
  20. // Clone to avoid manipulating the comparator's semver object.
  21. const compver = new SemVer(comparator.semver.version)
  22. switch (comparator.operator) {
  23. case '>':
  24. if (compver.prerelease.length === 0) {
  25. compver.patch++
  26. } else {
  27. compver.prerelease.push(0)
  28. }
  29. compver.raw = compver.format()
  30. /* fallthrough */
  31. case '':
  32. case '>=':
  33. if (!setMin || gt(compver, setMin)) {
  34. setMin = compver
  35. }
  36. break
  37. case '<':
  38. case '<=':
  39. /* Ignore maximum versions */
  40. break
  41. /* istanbul ignore next */
  42. default:
  43. throw new Error(`Unexpected operation: ${comparator.operator}`)
  44. }
  45. })
  46. if (setMin && (!minver || gt(minver, setMin))) {
  47. minver = setMin
  48. }
  49. }
  50. if (minver && range.test(minver)) {
  51. return minver
  52. }
  53. return null
  54. }
  55. module.exports = minVersion