cmpver.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. 'use strict';
  2. /**
  3. Copied from https://github.com/violentmonkey/violentmonkey/blob/master/src/common/util.js
  4. and switched to Math.sign
  5. */
  6. /* exported compareVersion */
  7. const VERSION_RE = /^(.*?)-([-.0-9a-z]+)|$/i;
  8. const DIGITS_RE = /^\d+$/; // using regexp to avoid +'1e2' being parsed as 100
  9. /** @return -1 | 0 | 1 */
  10. function compareVersion(ver1, ver2) {
  11. const [, main1 = ver1 || '', pre1] = VERSION_RE.exec(ver1);
  12. const [, main2 = ver2 || '', pre2] = VERSION_RE.exec(ver2);
  13. const delta = compareVersionChunk(main1, main2)
  14. || !pre1 - !pre2 // 1.2.3-pre-release is less than 1.2.3
  15. || pre1 && compareVersionChunk(pre1, pre2, true); // if pre1 is present, pre2 is too
  16. return Math.sign(delta);
  17. }
  18. function compareVersionChunk(ver1, ver2, isSemverMode) {
  19. const parts1 = ver1.split('.');
  20. const parts2 = ver2.split('.');
  21. const len1 = parts1.length;
  22. const len2 = parts2.length;
  23. const len = (isSemverMode ? Math.min : Math.max)(len1, len2);
  24. let delta;
  25. for (let i = 0; !delta && i < len; i += 1) {
  26. const a = parts1[i];
  27. const b = parts2[i];
  28. if (isSemverMode) {
  29. delta = DIGITS_RE.test(a) && DIGITS_RE.test(b)
  30. ? a - b
  31. : a > b || a < b && -1;
  32. } else {
  33. delta = (parseInt(a, 10) || 0) - (parseInt(b, 10) || 0);
  34. }
  35. }
  36. return delta || isSemverMode && (len1 - len2);
  37. }