{"version":3,"names":["isDiffPurgeEntry","data","name","zipball_url","tarball_url","commit","sha","url","node_id","indexOf","getLatestRelease","currentVersion","logger","debug","includes","cachedLatest","cacheManager","get","eTag","stable","candidate","getLatestRnDiffPurgeVersion","semver","compare","changelogUrl","buildChangelogUrl","diffUrl","buildDiffUrl","e","undefined","version","options","headers","status","fetch","result","body","filter","eTagHeader","substring","set"],"sources":["../../src/releaseChecker/getLatestRelease.ts"],"sourcesContent":["import semver from 'semver';\nimport cacheManager from '../cacheManager';\nimport {fetch} from '../fetch';\nimport logger from '../logger';\n\nexport type Release = {\n // The current stable release\n stable: string;\n // The current candidate release. These are only populated if the latest release is a candidate release.\n candidate?: string;\n changelogUrl: string;\n diffUrl: string;\n};\n\ninterface DiffPurge {\n name: string;\n zipball_url: string;\n tarball_url: string;\n commit: {\n sha: string;\n url: string;\n };\n node_id: string;\n}\n\nfunction isDiffPurgeEntry(data: any): data is DiffPurge {\n return (\n [\n data.name,\n data.zipball_url,\n data.tarball_url,\n data.commit?.sha,\n data.commit?.url,\n data.node_id,\n ].indexOf(false) === -1\n );\n}\n\n/**\n * Checks via GitHub API if there is a newer stable React Native release and,\n * if it exists, returns the release data.\n *\n * If the latest release is not newer or if it's a prerelease, the function\n * will return undefined.\n */\nexport default async function getLatestRelease(\n name: string,\n currentVersion: string,\n): Promise {\n logger.debug('Checking for a newer version of React Native');\n try {\n logger.debug(`Current version: ${currentVersion}`);\n\n // if the version is a 1000.0.0 version or 0.0.0, we want to bail\n // since they are nightlies or unreleased versions\n if (\n currentVersion.includes('1000.0.0') ||\n currentVersion.includes('0.0.0')\n ) {\n return;\n }\n\n const cachedLatest = cacheManager.get(name, 'latestVersion');\n\n if (cachedLatest) {\n logger.debug(`Cached release version: ${cachedLatest}`);\n }\n\n logger.debug('Checking for newer releases on GitHub');\n const eTag = cacheManager.get(name, 'eTag');\n const {stable, candidate} = await getLatestRnDiffPurgeVersion(name, eTag);\n logger.debug(`Latest release: ${stable} (${candidate})`);\n\n if (semver.compare(stable, currentVersion) >= 0) {\n return {\n stable,\n candidate,\n changelogUrl: buildChangelogUrl(stable),\n diffUrl: buildDiffUrl(stable),\n };\n }\n } catch (e) {\n logger.debug(\n 'Something went wrong with remote version checking, moving on',\n );\n logger.debug(e as any);\n }\n return undefined;\n}\n\nfunction buildChangelogUrl(version: string) {\n return `https://github.com/facebook/react-native/releases/tag/v${version}`;\n}\n\nfunction buildDiffUrl(version: string) {\n return `https://react-native-community.github.io/upgrade-helper/?from=${version}`;\n}\n\ntype LatestVersions = {\n candidate?: string;\n stable: string;\n};\n\n/**\n * Returns the most recent React Native version available to upgrade to.\n */\nasync function getLatestRnDiffPurgeVersion(\n name: string,\n eTag?: string,\n): Promise {\n const options = {\n // https://developer.github.com/v3/#user-agent-required\n headers: {'User-Agent': 'React-Native-CLI'} as Headers,\n };\n\n if (eTag) {\n options.headers['If-None-Match'] = eTag;\n }\n\n const {data, status, headers} = await fetch(\n 'https://api.github.com/repos/react-native-community/rn-diff-purge/tags',\n options,\n );\n\n const result: LatestVersions = {stable: '0.0.0'};\n\n // Remote is newer.\n if (status === 200) {\n const body: DiffPurge[] = data.filter(isDiffPurgeEntry);\n const eTagHeader = headers.get('eTag');\n\n for (let {name: version} of body) {\n if (!result.candidate && version.includes('-rc')) {\n result.candidate = version.substring(8);\n continue;\n }\n if (!version.includes('-rc')) {\n result.stable = version.substring(8);\n if (eTagHeader) {\n logger.debug(`Saving ${eTagHeader} to cache`);\n cacheManager.set(name, 'eTag', eTagHeader);\n cacheManager.set(name, 'latestVersion', result.stable);\n }\n return result;\n }\n }\n return result;\n }\n\n // Cache is still valid.\n if (status === 304) {\n result.stable = cacheManager.get(name, 'latestVersion') ?? result.stable;\n }\n\n // Should be returned only if something went wrong.\n return result;\n}\n\ntype Headers = {\n 'User-Agent': string;\n [header: string]: string;\n};\n"],"mappings":"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"}