getLatestRelease.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = getLatestRelease;
  6. function _semver() {
  7. const data = _interopRequireDefault(require("semver"));
  8. _semver = function () {
  9. return data;
  10. };
  11. return data;
  12. }
  13. var _releaseCacheManager = _interopRequireDefault(require("./releaseCacheManager"));
  14. function _cliTools() {
  15. const data = require("@react-native-community/cli-tools");
  16. _cliTools = function () {
  17. return data;
  18. };
  19. return data;
  20. }
  21. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  22. /**
  23. * Checks via GitHub API if there is a newer stable React Native release and,
  24. * if it exists, returns the release data.
  25. *
  26. * If the latest release is not newer or if it's a prerelease, the function
  27. * will return undefined.
  28. */
  29. async function getLatestRelease(name, currentVersion) {
  30. _cliTools().logger.debug('Checking for a newer version of React Native');
  31. try {
  32. _cliTools().logger.debug(`Current version: ${currentVersion}`);
  33. const cachedLatest = _releaseCacheManager.default.get(name, 'latestVersion');
  34. if (cachedLatest) {
  35. _cliTools().logger.debug(`Cached release version: ${cachedLatest}`);
  36. }
  37. const aWeek = 7 * 24 * 60 * 60 * 1000;
  38. const lastChecked = _releaseCacheManager.default.get(name, 'lastChecked');
  39. const now = new Date();
  40. if (lastChecked && Number(now) - Number(new Date(lastChecked)) < aWeek) {
  41. _cliTools().logger.debug('Cached release is still recent, skipping remote check');
  42. return;
  43. }
  44. _cliTools().logger.debug('Checking for newer releases on GitHub');
  45. const eTag = _releaseCacheManager.default.get(name, 'eTag');
  46. const latestVersion = await getLatestRnDiffPurgeVersion(name, eTag);
  47. _cliTools().logger.debug(`Latest release: ${latestVersion}`);
  48. if (_semver().default.compare(latestVersion, currentVersion) === 1 && !_semver().default.prerelease(latestVersion)) {
  49. return {
  50. version: latestVersion,
  51. changelogUrl: buildChangelogUrl(latestVersion),
  52. diffUrl: buildDiffUrl(currentVersion)
  53. };
  54. }
  55. } catch (e) {
  56. _cliTools().logger.debug('Something went wrong with remote version checking, moving on');
  57. _cliTools().logger.debug(e);
  58. }
  59. }
  60. function buildChangelogUrl(version) {
  61. return `https://github.com/facebook/react-native/releases/tag/v${version}`;
  62. }
  63. function buildDiffUrl(version) {
  64. return `https://react-native-community.github.io/upgrade-helper/?from=${version}`;
  65. }
  66. /**
  67. * Returns the most recent React Native version available to upgrade to.
  68. */
  69. async function getLatestRnDiffPurgeVersion(name, eTag) {
  70. const options = {
  71. // https://developer.github.com/v3/#user-agent-required
  72. headers: {
  73. 'User-Agent': 'React-Native-CLI'
  74. }
  75. };
  76. if (eTag) {
  77. options.headers['If-None-Match'] = eTag;
  78. }
  79. const {
  80. data,
  81. status,
  82. headers
  83. } = await (0, _cliTools().fetch)('https://api.github.com/repos/react-native-community/rn-diff-purge/tags', options); // Remote is newer.
  84. if (status === 200) {
  85. const body = data;
  86. const latestVersion = body[0].name.substring(8);
  87. const eTagHeader = headers.get('eTag'); // Update cache only if newer release is stable.
  88. if (!_semver().default.prerelease(latestVersion) && eTagHeader) {
  89. _cliTools().logger.debug(`Saving ${eTagHeader} to cache`);
  90. _releaseCacheManager.default.set(name, 'eTag', eTagHeader);
  91. _releaseCacheManager.default.set(name, 'latestVersion', latestVersion);
  92. }
  93. return latestVersion;
  94. } // Cache is still valid.
  95. if (status === 304) {
  96. const latestVersion = _releaseCacheManager.default.get(name, 'latestVersion');
  97. if (latestVersion) {
  98. return latestVersion;
  99. }
  100. } // Should be returned only if something went wrong.
  101. return '0.0.0';
  102. }
  103. //# sourceMappingURL=getLatestRelease.js.map