outside.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. 'use strict'
  2. const SemVer = require('../classes/semver')
  3. const Comparator = require('../classes/comparator')
  4. const { ANY } = Comparator
  5. const Range = require('../classes/range')
  6. const satisfies = require('../functions/satisfies')
  7. const gt = require('../functions/gt')
  8. const lt = require('../functions/lt')
  9. const lte = require('../functions/lte')
  10. const gte = require('../functions/gte')
  11. const outside = (version, range, hilo, options) => {
  12. version = new SemVer(version, options)
  13. range = new Range(range, options)
  14. let gtfn, ltefn, ltfn, comp, ecomp
  15. switch (hilo) {
  16. case '>':
  17. gtfn = gt
  18. ltefn = lte
  19. ltfn = lt
  20. comp = '>'
  21. ecomp = '>='
  22. break
  23. case '<':
  24. gtfn = lt
  25. ltefn = gte
  26. ltfn = gt
  27. comp = '<'
  28. ecomp = '<='
  29. break
  30. default:
  31. throw new TypeError('Must provide a hilo val of "<" or ">"')
  32. }
  33. // If it satisfies the range it is not outside
  34. if (satisfies(version, range, options)) {
  35. return false
  36. }
  37. // From now on, variable terms are as if we're in "gtr" mode.
  38. // but note that everything is flipped for the "ltr" function.
  39. for (let i = 0; i < range.set.length; ++i) {
  40. const comparators = range.set[i]
  41. let high = null
  42. let low = null
  43. comparators.forEach((comparator) => {
  44. if (comparator.semver === ANY) {
  45. comparator = new Comparator('>=0.0.0')
  46. }
  47. high = high || comparator
  48. low = low || comparator
  49. if (gtfn(comparator.semver, high.semver, options)) {
  50. high = comparator
  51. } else if (ltfn(comparator.semver, low.semver, options)) {
  52. low = comparator
  53. }
  54. })
  55. // If the edge version comparator has a operator then our version
  56. // isn't outside it
  57. if (high.operator === comp || high.operator === ecomp) {
  58. return false
  59. }
  60. // If the lowest version comparator has an operator and our version
  61. // is less than it then it isn't higher than the range
  62. if ((!low.operator || low.operator === comp) &&
  63. ltefn(version, low.semver)) {
  64. return false
  65. } else if (low.operator === ecomp && ltfn(version, low.semver)) {
  66. return false
  67. }
  68. }
  69. return true
  70. }
  71. module.exports = outside