UNPKG

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