UNPKG

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