semver.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. var semver = require('semver');
  2. var mout = require('mout');
  3. function maxSatisfying(versions, range, strictMatch) {
  4. var version;
  5. var filteredVersions;
  6. // Filter only valid versions, since semver.maxSatisfying() throws an error
  7. versions = versions.filter(function (version) {
  8. return semver.valid(version);
  9. });
  10. // Exact version & range match
  11. if (semver.valid(range)) {
  12. version = mout.array.find(versions, function (version) {
  13. return version === range;
  14. });
  15. if (version) {
  16. return version;
  17. }
  18. }
  19. range = typeof range === 'string' ? range.trim() : range;
  20. // When strict match is enabled give priority to non-pre-releases
  21. // We do this by filtering every pre-release version
  22. if (strictMatch) {
  23. filteredVersions = versions.map(function (version) {
  24. return !isPreRelease(version) ? version : null;
  25. });
  26. version = semver.maxSatisfying(filteredVersions, range);
  27. if (version) {
  28. return version;
  29. }
  30. }
  31. // Fallback to regular semver max satisfies
  32. return semver.maxSatisfying(versions, range);
  33. }
  34. function maxSatisfyingIndex(versions, range, strictMatch) {
  35. var version = maxSatisfying(versions, range, strictMatch);
  36. if (!version) {
  37. return -1;
  38. }
  39. return versions.indexOf(version);
  40. }
  41. function clean(version) {
  42. var parsed = semver.parse(version);
  43. if (!parsed) {
  44. return null;
  45. }
  46. // Keep builds!
  47. return parsed.version + (parsed.build.length ? '+' + parsed.build.join('.') : '');
  48. }
  49. function isPreRelease(version) {
  50. var parsed = semver.parse(version);
  51. return parsed && parsed.prerelease && parsed.prerelease.length;
  52. }
  53. // Export a semver like object but with our custom functions
  54. mout.object.mixIn(module.exports, semver, {
  55. maxSatisfying: maxSatisfying,
  56. maxSatisfyingIndex: maxSatisfyingIndex,
  57. clean: clean,
  58. valid: clean
  59. });