From 77a5080c140999682ba0be8357944a2bfb84d6a5 Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Fri, 17 Dec 2021 16:55:41 -0800 Subject: [PATCH 1/5] Fix test_js/test_js_prev_lts Differential Revision: D33197965 fbshipit-source-id: 5d56c65e69fe4f42ef61762c882d429cef771dc9 --- .circleci/config.yml | 4 ++-- scripts/run-ci-e2e-tests.js | 22 +++++----------------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a219b03fb064..9129098dce57 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -78,7 +78,7 @@ commands: steps: - restore_cache: keys: - - v4-yarn-cache-{{ arch }}-{{ checksum "yarn.lock" }} + - v5-yarn-cache-{{ arch }}-{{ checksum "yarn.lock" }} - run: name: "Yarn: Install Dependencies" command: | @@ -90,7 +90,7 @@ commands: - save_cache: paths: - ~/.cache/yarn - key: v4-yarn-cache-{{ arch }}-{{ checksum "yarn.lock" }} + key: v5-yarn-cache-{{ arch }}-{{ checksum "yarn.lock" }} install_buck_tooling: steps: diff --git a/scripts/run-ci-e2e-tests.js b/scripts/run-ci-e2e-tests.js index a2bcb45c4216..fa7fe3f6e556 100644 --- a/scripts/run-ci-e2e-tests.js +++ b/scripts/run-ci-e2e-tests.js @@ -56,25 +56,13 @@ try { } } - if (argv.js) { - describe('Install Flow'); - if ( - tryExecNTimes( - () => { - return exec('npm install --save-dev flow-bin').code; - }, - numberOfRetries, - () => exec('sleep 10s'), - ) - ) { - echo('Failed to install Flow'); - echo('Most common reason is npm registry connectivity, try again'); - exitCode = 1; - throw Error(exitCode); - } + describe('Create react-native package'); + if (exec('node ./scripts/set-rn-version.js --version 1000.0.0').code) { + echo('Failed to set version and update package.json ready for release'); + exitCode = 1; + throw Error(exitCode); } - describe('Create react-native package'); if (exec('npm pack').code) { echo('Failed to pack react-native'); exitCode = 1; From f5fd80824f4dba3c2b1a932eb18164d967fa93eb Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Fri, 17 Dec 2021 16:55:41 -0800 Subject: [PATCH 2/5] Use tag to set publish version Differential Revision: D33101594 fbshipit-source-id: 8aae32ab657043996998abf12f0f8bbc039b25a9 --- .circleci/config.yml | 3 +- scripts/__tests__/version-utils-test.js | 74 +++++++++++-------------- scripts/prepare-package-for-release.js | 54 +++++++++++------- scripts/version-utils.js | 68 ++++++----------------- 4 files changed, 84 insertions(+), 115 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9129098dce57..0ef257b0f425 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -920,7 +920,8 @@ workflows: releases: jobs: - # This job will trigger on pushes to release branch and commit a version tag to trigger `build_npm_package` for release + # This job will trigger on relevant `publish...` tags. + # It prepares the package and triggers `build_npm_package` for release - prepare_package_for_release: name: prepare_package_for_release filters: diff --git a/scripts/__tests__/version-utils-test.js b/scripts/__tests__/version-utils-test.js index ec4c2ac77ebd..ba07eb464199 100644 --- a/scripts/__tests__/version-utils-test.js +++ b/scripts/__tests__/version-utils-test.js @@ -9,10 +9,10 @@ const { parseVersion, - getNextVersionFromTags, isTaggedLatest, - isTaggedVersion, + getPublishVersion, isReleaseBranch, + getPublishTag, } = require('../version-utils'); let execResult = null; @@ -25,33 +25,6 @@ jest.mock('shelljs', () => ({ })); describe('version-utils', () => { - describe('isTaggedVersion', () => { - it('should return true on pre-release versions', () => { - execResult = 'v0.66.0-rc.3\nlatest\n\n'; - expect(isTaggedVersion('6c19dc3266b84f47a076b647a1c93b3c3b69d2c5')).toBe( - true, - ); - }); - it('should return true on release versions', () => { - execResult = 'latest\nv0.66.2\n\n'; - expect(isTaggedVersion('6c19dc3266b84f47a076b647a1c93b3c3b69d2c5')).toBe( - true, - ); - }); - it('should return false when no tags', () => { - execResult = '\n'; - expect(isTaggedVersion('6c19dc3266b84f47a076b647a1c93b3c3b69d2c5')).toBe( - false, - ); - }); - it('should return false on tags that are not versions', () => { - execResult = 'latest\n0.someother-made-up-tag\n\n'; - expect(isTaggedVersion('6c19dc3266b84f47a076b647a1c93b3c3b69d2c5')).toBe( - false, - ); - }); - }); - describe('isReleaseBranch', () => { it('should identify as release branch', () => { expect(isReleaseBranch('v0.66-stable')).toBe(true); @@ -76,22 +49,39 @@ describe('version-utils', () => { }); }); - describe('getNextVersionFromTags', () => { - it('should increment last stable tag', () => { - execResult = - 'v0.66.3\nv0.66.2\nv0.66.1\nv0.66.0-rc.4\nv0.66.0-rc.3\nv0.66.0-rc.2\nv0.66.0-rc.1\nv0.66.0-rc.0'; - expect(getNextVersionFromTags('0.66-stable')).toBe('0.66.4'); + describe('getPublishTag', () => { + it('Should return null no tags are returned', () => { + execResult = '\n'; + expect(getPublishTag()).toBe(null); }); - - it('should find last prerelease tag and increment', () => { - execResult = - 'v0.66.0-rc.4\nv0.66.0-rc.3\nv0.66.0-rc.2\nv0.66.0-rc.1\nv0.66.0-rc.0'; - expect(getNextVersionFromTags('0.66-stable')).toBe('0.66.0-rc.5'); + it('Should return tag', () => { + execResult = 'publish-v999.0.0-rc.0\n'; + expect(getPublishTag()).toBe('publish-v999.0.0-rc.0'); }); + }); - it('should return rc.0 version if no previous tags', () => { - execResult = '\n'; - expect(getNextVersionFromTags('0.66-stable')).toBe('0.66.0-rc.0'); + describe('getPublishVersion', () => { + it('Should return null if invalid tag provided', () => { + expect(getPublishVersion('')).toBe(null); + expect(getPublishVersion('something')).toBe(null); + }); + it('should throw error if invalid tag version provided', () => { + function testInvalidVersion() { + getPublishVersion('publish-'); + } + expect(testInvalidVersion).toThrowErrorMatchingInlineSnapshot( + `"You must pass a correctly formatted version; couldn't parse "`, + ); + }); + it('Should return version for tag', () => { + const {version, major, minor, patch, prerelease} = getPublishVersion( + 'publish-v0.67.0-rc.6', + ); + expect(version).toBe('0.67.0-rc.6'); + expect(major).toBe('0'); + expect(minor).toBe('67'); + expect(patch).toBe('0'); + expect(prerelease).toBe('rc.6'); }); }); diff --git a/scripts/prepare-package-for-release.js b/scripts/prepare-package-for-release.js index 529fa5e870f0..d5a47e0e60c3 100755 --- a/scripts/prepare-package-for-release.js +++ b/scripts/prepare-package-for-release.js @@ -23,8 +23,8 @@ const yargs = require('yargs'); const { isReleaseBranch, isTaggedLatest, - isTaggedVersion, - getNextVersionFromTags, + getPublishVersion, + getPublishTag, } = require('./version-utils'); const branch = process.env.CIRCLE_BRANCH; @@ -34,12 +34,12 @@ const argv = yargs.option('r', { alias: 'remote', default: 'origin', }).argv; +const remote = argv.remote; -// We do this check to prevent a loop of commit in this script to trigger the job again. -// I haven't figured out a way for CircleCI to filter out commits from CircleCI jobs -if (isTaggedVersion(currentCommit)) { +const tag = getPublishTag(); +if (tag == null) { console.log( - 'Skip running prepare-package-for-release as this job was triggered from previous run of this script.', + 'No publish tag set. Not publishing this release.\nCircleCI cannot filter workflows on both branch and tag so we do this check in prepare-package-for-release', ); exit(0); } @@ -49,8 +49,21 @@ if (!isReleaseBranch(branch)) { exit(1); } -// Progress the version by 1 using existing git tags -const version = getNextVersionFromTags(branch); +// Get the version we're publishing from the publish tag +// Tag of the form `publish-v{versionStr}` +const versionInfo = getPublishVersion(tag); +if (versionInfo == null) { + console.error( + `Invalid tag provided: ${tag}, needs to be of form 'publish-v{major}.{minor}.{patch}'`, + ); + exit(1); +} + +// Clean up tag now that we're publishing the release. +exec(`git tag -d ${tag}`); +exec(`git push ${remote} :${tag}`); + +const {version} = versionInfo; if (exec(`node scripts/set-rn-version.js --to-version ${version}`).code) { echo(`Failed to set React Native version to ${version}`); @@ -65,24 +78,12 @@ if (exec('source scripts/update_podfile_lock.sh && update_pods').code) { exit(1); } -// Check if this release has been tagged as latest -const isLatest = isTaggedLatest(currentCommit); - // Make commit [0.21.0-rc] Bump version numbers if (exec(`git commit -a -m "[${version}] Bump version numbers"`).code) { echo('failed to commit'); exit(1); } -// Since we just committed, if `isLatest`, move the tag to commit we just made -// This tag will also update npm release as `latest` -if (isLatest) { - exec('git tag -d latest'); - exec(`git push ${remote} :latest`); - exec('git tag latest'); - exec(`git push ${remote} latest`); -} - // Add tag v0.21.0-rc.1 if (exec(`git tag v${version}`).code) { echo( @@ -93,8 +94,19 @@ if (exec(`git tag v${version}`).code) { exit(1); } +// See if `latest` was set on the commit that triggered this script +// If yes, move the tag to commit we just made +// This tag will also update npm release as `latest` +const isLatest = isTaggedLatest(currentCommit); +if (isLatest) { + exec('git tag -d latest'); + exec(`git push ${remote} :latest`); + + // This will be pushed with the `--follow-tags` + exec('git tag latest'); +} + // Push newly created tag -let remote = argv.remote; exec(`git push ${remote} v${version}`); exec(`git push ${remote} ${branch} --follow-tags`); diff --git a/scripts/version-utils.js b/scripts/version-utils.js index 807bd9a5fd2a..58177067c539 100644 --- a/scripts/version-utils.js +++ b/scripts/version-utils.js @@ -28,59 +28,17 @@ function parseVersion(versionStr) { }; } -function getLatestVersionTag(branchVersion) { - // Returns list of tags like ["v0.67.2", "v0.67.1", "v0.67.0-rc.3", "v0.67.0-rc.2", ...] in reverse lexical order - const tags = exec(`git tag --list "v${branchVersion}*" --sort=-refname`, { - silent: true, - }) - .stdout.trim() - .split('\n') - .filter(tag => tag.length > 0); - - // If there are no tags, return null - if (tags.length === 0) { - return null; - } - - // Return most recent tag (with the "v" prefix) - return tags[0]; -} - -function getNextVersionFromTags(branch) { - // Assumption that branch names will follow pattern `{major}.{minor}-stable` - // Ex. "0.67-stable" -> "0.67" - const branchVersion = branch.replace('-stable', ''); - - // Get the latest version tag of the release branch - const versionTag = getLatestVersionTag(branchVersion); - - // If there are no tags , we assume this is the first pre-release - if (versionTag == null) { - return `${branchVersion}.0-rc.0`; - } - - const {major, minor, patch, prerelease} = parseVersion(versionTag); - if (prerelease != null) { - // prelease is of the form "rc.X" - const prereleasePatch = parseInt(prerelease.slice(3), 10); - return `${major}.${minor}.${patch}-rc.${prereleasePatch + 1}`; - } - - // If not prerelease, increment the patch version - return `${major}.${minor}.${parseInt(patch, 10) + 1}`; -} - function isReleaseBranch(branch) { return branch.endsWith('-stable'); } -function isTaggedVersion(commitSha) { - const tags = exec(`git tag --points-at ${commitSha}`, { - silent: true, - }) - .stdout.trim() - .split('\n'); - return tags.some(tag => !!tag.match(VERSION_REGEX)); +function getPublishVersion(tag) { + if (!tag.startsWith('publish-')) { + return null; + } + + const versionStr = tag.replace('publish-', ''); + return parseVersion(versionStr); } function isTaggedLatest(commitSha) { @@ -91,10 +49,18 @@ function isTaggedLatest(commitSha) { ); } +function getPublishTag() { + // Assumes we only ever have one tag with the prefix `publish-v` + const tag = exec("git tag --points-at HEAD | grep 'publish-v'", { + silent: true, + }).stdout.trim(); + return tag ? tag : null; +} + module.exports = { isTaggedLatest, - isTaggedVersion, + getPublishTag, + getPublishVersion, parseVersion, - getNextVersionFromTags, isReleaseBranch, }; From f6a04b32dba9e3cda9ab2c23d2d6e6c8b73ca389 Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Fri, 17 Dec 2021 16:55:41 -0800 Subject: [PATCH 3/5] Remove usages of bump-oss-version from generated scripts Differential Revision: D33110408 fbshipit-source-id: 2f5c4300a2a6a71c1779b406e6421af49323c303 --- Libraries/Core/ReactNativeVersion.js | 2 +- React/Base/RCTVersion.m | 2 +- .../facebook/react/modules/systeminfo/ReactNativeVersion.java | 2 +- ReactCommon/cxxreact/ReactNativeVersion.h | 2 +- scripts/versiontemplates/RCTVersion.m.template | 2 +- scripts/versiontemplates/ReactNativeVersion.h.template | 2 +- scripts/versiontemplates/ReactNativeVersion.java.template | 2 +- scripts/versiontemplates/ReactNativeVersion.js.template | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Libraries/Core/ReactNativeVersion.js b/Libraries/Core/ReactNativeVersion.js index 67ca7cd62bcf..9a6cfd3855ae 100644 --- a/Libraries/Core/ReactNativeVersion.js +++ b/Libraries/Core/ReactNativeVersion.js @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. * * @format - * @generated by scripts/bump-oss-version.js + * @generated by scripts/set-rn-version.js * @flow strict */ diff --git a/React/Base/RCTVersion.m b/React/Base/RCTVersion.m index 7258e0ddb39d..81a0ae27be54 100644 --- a/React/Base/RCTVersion.m +++ b/React/Base/RCTVersion.m @@ -1,5 +1,5 @@ /** - * @generated by scripts/bump-oss-version.js + * @generated by scripts/set-rn-version.js * * Copyright (c) Facebook, Inc. and its affiliates. * diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java b/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java index 6278912404c9..8388299941bb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java @@ -1,5 +1,5 @@ /** - * @generated by scripts/bump-oss-version.js + * @generated by scripts/set-rn-version.js * * Copyright (c) Facebook, Inc. and its affiliates. * diff --git a/ReactCommon/cxxreact/ReactNativeVersion.h b/ReactCommon/cxxreact/ReactNativeVersion.h index d6cbbcd82a9c..27beee378d3c 100644 --- a/ReactCommon/cxxreact/ReactNativeVersion.h +++ b/ReactCommon/cxxreact/ReactNativeVersion.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated by scripts/bump-oss-version.js + * @generated by scripts/set-rn-version.js */ #pragma once diff --git a/scripts/versiontemplates/RCTVersion.m.template b/scripts/versiontemplates/RCTVersion.m.template index 5df4b8fabdb4..cbb183b5c52c 100644 --- a/scripts/versiontemplates/RCTVersion.m.template +++ b/scripts/versiontemplates/RCTVersion.m.template @@ -1,5 +1,5 @@ /** - * @generated by scripts/bump-oss-version.js + * @generated by scripts/set-rn-version.js * * Copyright (c) Facebook, Inc. and its affiliates. * diff --git a/scripts/versiontemplates/ReactNativeVersion.h.template b/scripts/versiontemplates/ReactNativeVersion.h.template index ed9d242c72a4..a290a5994d45 100644 --- a/scripts/versiontemplates/ReactNativeVersion.h.template +++ b/scripts/versiontemplates/ReactNativeVersion.h.template @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated by scripts/bump-oss-version.js + * @generated by scripts/set-rn-version.js */ #pragma once diff --git a/scripts/versiontemplates/ReactNativeVersion.java.template b/scripts/versiontemplates/ReactNativeVersion.java.template index 94d103f10002..4f1930434ac0 100644 --- a/scripts/versiontemplates/ReactNativeVersion.java.template +++ b/scripts/versiontemplates/ReactNativeVersion.java.template @@ -1,5 +1,5 @@ /** - * @generated by scripts/bump-oss-version.js + * @generated by scripts/set-rn-version.js * * Copyright (c) Facebook, Inc. and its affiliates. * diff --git a/scripts/versiontemplates/ReactNativeVersion.js.template b/scripts/versiontemplates/ReactNativeVersion.js.template index 72bfcfef1105..cfeb6eebd0a6 100644 --- a/scripts/versiontemplates/ReactNativeVersion.js.template +++ b/scripts/versiontemplates/ReactNativeVersion.js.template @@ -1,5 +1,5 @@ /** - * @generated by scripts/bump-oss-version.js + * @generated by scripts/set-rn-version.js * * Copyright (c) Facebook, Inc. and its affiliates. * From ec02d247b7d84e05c6129d0de2654b429341f1e5 Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Fri, 17 Dec 2021 16:55:41 -0800 Subject: [PATCH 4/5] Update comments in publish-npm and leverage isTaggedLatest Differential Revision: D33110407 fbshipit-source-id: 9858a90dd9ef10edf33811fbc9fb2006825cca71 --- scripts/publish-npm.js | 57 +++++++++++++----------------------------- 1 file changed, 18 insertions(+), 39 deletions(-) diff --git a/scripts/publish-npm.js b/scripts/publish-npm.js index f0cbad2ebf40..552b41dcc27d 100644 --- a/scripts/publish-npm.js +++ b/scripts/publish-npm.js @@ -13,45 +13,27 @@ * This script prepares a release version of react-native and may publish to NPM. * It is supposed to run in CI environment, not on a developer's machine. * - * To make it easier for developers it uses some logic to identify with which - * version to publish the package. + * For a dry run (commitly), this script will: + * * Version the commitly of the form `1000.0.0-` + * * Create Android artifacts + * * It will not publish to npm * - * To cut a branch (and release RC): - * - Developer: `git checkout -b 0.XY-stable` - * - Developer: `./scripts/bump-oss-version.js -v v0.XY.0-rc.0` - * - CI: test and deploy to npm (run this script) with version `0.XY.0-rc.0` - * with tag "next" + * For a nightly run, this script will: + * * Version the nightly release of the form `0.0.0--` + * * Create Android artifacts + * * Publish to npm using `nightly` tag * - * To update RC release: - * - Developer: `git checkout 0.XY-stable` - * - Developer: cherry-pick whatever changes needed - * - Developer: `./scripts/bump-oss-version.js -v v0.XY.0-rc.1` - * - CI: test and deploy to npm (run this script) with version `0.XY.0-rc.1` - * with tag "next" - * - * To publish a release: - * - Developer: `git checkout 0.XY-stable` - * - Developer: cherry-pick whatever changes needed - * - Developer: `./scripts/bump-oss-version.js -v v0.XY.0` - * - CI: test and deploy to npm (run this script) with version `0.XY.0` - * and no tag ("latest" is implied by npm) - * - * To patch old release: - * - Developer: `git checkout 0.XY-stable` - * - Developer: cherry-pick whatever changes needed - * - Developer: `git tag v0.XY.Z` - * - Developer: `git push` to git@github.com:facebook/react-native.git (or merge as pull request) - * - CI: test and deploy to npm (run this script) with version 0.XY.Z with no tag, npm will not mark it as latest if - * there is a version higher than XY - * - * Important tags: - * If tag v0.XY.0-rc.Z is present on the commit then publish to npm with version 0.XY.0-rc.Z and tag next - * If tag v0.XY.Z is present on the commit then publish to npm with version 0.XY.Z and no tag (npm will consider it latest) + * For a release run, this script will: + * * Version the release by the tag version that triggered CI + * * Create Android artifacts + * * Publish to npm + * * using `latest` tag if commit is currently tagged `latest` + * * or otherwise `{major}.{minor}-stable` */ const {exec, echo, exit, test} = require('shelljs'); const yargs = require('yargs'); -const {parseVersion} = require('./version-utils'); +const {parseVersion, isTaggedLatest} = require('./version-utils'); const buildTag = process.env.CIRCLE_TAG; const otp = process.env.NPM_CONFIG_OTP; @@ -113,12 +95,12 @@ if (dryRunBuild) { } // Bump version number in various files (package.json, gradle.properties etc) -// For stable, pre-release releases, we manually call bump-oss-version on release branch +// For stable, pre-release releases, we rely on CircleCI job `prepare_package_for_release` to handle this if (nightlyBuild || dryRunBuild) { if ( exec(`node scripts/set-rn-version.js --to-version ${releaseVersion}`).code ) { - echo('Failed to bump version number'); + echo(`Failed to set version number to ${releaseVersion}`); exit(1); } } @@ -156,10 +138,7 @@ if (dryRunBuild) { } // Running to see if this commit has been git tagged as `latest` -const latestCommit = exec("git rev-list -n 1 'latest'", { - silent: true, -}).stdout.replace('\n', ''); -const isLatest = currentCommit === latestCommit; +const isLatest = isTaggedLatest(currentCommit); const releaseBranch = `${major}.${minor}-stable`; From f7424e01eb1ee91215424faf7062007a1461fe46 Mon Sep 17 00:00:00 2001 From: Luna Wei Date: Fri, 17 Dec 2021 16:58:54 -0800 Subject: [PATCH 5/5] Update bump-oss-version.js to guide releaser through release actions (#32769) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/32769 Changelog: [Internal] Re-purpose bump-oss-version to guide releaser to correctly tag the release and trigger relevant CircleCI jobs Reviewed By: sota000 Differential Revision: D33121691 fbshipit-source-id: 54f4630b88270bc5c83dee216651cdb5eca724a0 --- .circleci/config.yml | 7 +- repo-config/package.json | 1 + scripts/bump-oss-version.js | 298 ++++++++----------------- scripts/prepare-package-for-release.js | 15 +- scripts/version-utils.js | 7 + yarn.lock | 105 ++++++++- 6 files changed, 216 insertions(+), 217 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0ef257b0f425..e1143cdf357f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -920,10 +920,12 @@ workflows: releases: jobs: - # This job will trigger on relevant `publish...` tags. + # This job will trigger on relevant release branch pushes. # It prepares the package and triggers `build_npm_package` for release - prepare_package_for_release: name: prepare_package_for_release + # Since CircleCI does not support branch AND tag filters, we manually check in job + # and no-op if there is no `publish-v{version}` tag set. filters: branches: only: @@ -934,6 +936,9 @@ workflows: name: build_and_publish_npm_package context: react-native-bot publish_npm_args: --release + # CircleCI filters are OR-ed, with all branches triggering by default and tags excluded by default + # CircleCI env-vars are only set with the branch OR tag that triggered the job, not both. + # In this case, CIRCLE_BRANCH is unset, but CIRCLE_TAG is set filters: # Both of the following conditions must be included! # Ignore any commit on any branch by default. diff --git a/repo-config/package.json b/repo-config/package.json index c997c99f8097..3863babe1f78 100644 --- a/repo-config/package.json +++ b/repo-config/package.json @@ -35,6 +35,7 @@ "eslint-plugin-react-native": "^3.11.0", "eslint-plugin-relay": "^1.8.2", "flow-bin": "^0.168.0", + "inquirer": "^7.1.0", "jest": "^26.6.3", "jest-junit": "^10.0.0", "jscodeshift": "^0.11.0", diff --git a/scripts/bump-oss-version.js b/scripts/bump-oss-version.js index 46b5a4f91feb..ccc87c69b178 100755 --- a/scripts/bump-oss-version.js +++ b/scripts/bump-oss-version.js @@ -11,239 +11,131 @@ 'use strict'; /** - * This script bumps a new version for open source releases. - * It updates the version in json/gradle files and makes sure they are consistent between each other - * After changing the files it makes a commit and tags it. - * All you have to do is push changes to remote and CI will make a new build. + * This script walks a releaser through bumping the version for a release + * It will commit the appropriate tags to trigger the CircleCI jobs. */ -const fs = require('fs'); -const {cat, echo, exec, exit, sed} = require('shelljs'); +const {exec, exit} = require('shelljs'); const yargs = require('yargs'); -const {parseVersion} = require('./version-utils'); +const inquirer = require('inquirer'); +const { + parseVersion, + isReleaseBranch, + getBranchName, +} = require('./version-utils'); let argv = yargs .option('r', { alias: 'remote', default: 'origin', }) - .option('n', { - alias: 'nightly', - type: 'boolean', - default: false, - }) - .option('v', { - alias: 'to-version', - type: 'string', - }) - .option('l', { - alias: 'latest', - type: 'boolean', - default: false, + .check(() => { + const branch = getBranchName(); + exitIfNotOnReleaseBranch(branch); + return true; }).argv; -const nightlyBuild = argv.nightly; -const version = argv.toVersion; - -if (!version) { - echo('You must specify a version using -v'); - exit(1); -} - -let branch; -if (!nightlyBuild) { - // Check we are in release branch, e.g. 0.33-stable - branch = exec('git symbolic-ref --short HEAD', { - silent: true, - }).stdout.trim(); - - if (branch.indexOf('-stable') === -1) { - echo('You must be in 0.XX-stable branch to bump a version'); - exit(1); - } - - // e.g. 0.33 - let versionMajor = branch.slice(0, branch.indexOf('-stable')); - - // - check that argument version matches branch - // e.g. 0.33.1 or 0.33.0-rc4 - if (version.indexOf(versionMajor) !== 0) { - echo( - `You must specify a version tag like 0.${versionMajor}.[X]-rc[Y] to bump a version`, +function exitIfNotOnReleaseBranch(branch) { + if (!isReleaseBranch(branch)) { + console.log( + 'This script must be run in a react-native git repository checkout and on a release branch', ); exit(1); } } -let major, - minor, - patch, - prerelease = -1; -try { - ({major, minor, patch, prerelease} = parseVersion(version)); -} catch (e) { - echo(e.message); - exit(1); +function getLatestTag(versionPrefix) { + const tags = exec(`git tag --list "v${versionPrefix}*" --sort=-refname`, { + silent: true, + }) + .stdout.trim() + .split('\n') + .filter(tag => tag.length > 0); + if (tags.length > 0) { + return tags[0]; + } + return null; } -fs.writeFileSync( - 'ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java', - cat('scripts/versiontemplates/ReactNativeVersion.java.template') - .replace('${major}', major) - .replace('${minor}', minor) - .replace('${patch}', patch) - .replace( - '${prerelease}', - prerelease !== undefined ? `"${prerelease}"` : 'null', - ), - 'utf-8', -); - -fs.writeFileSync( - 'React/Base/RCTVersion.m', - cat('scripts/versiontemplates/RCTVersion.m.template') - .replace('${major}', `@(${major})`) - .replace('${minor}', `@(${minor})`) - .replace('${patch}', `@(${patch})`) - .replace( - '${prerelease}', - prerelease !== undefined ? `@"${prerelease}"` : '[NSNull null]', - ), - 'utf-8', -); - -fs.writeFileSync( - 'ReactCommon/cxxreact/ReactNativeVersion.h', - cat('scripts/versiontemplates/ReactNativeVersion.h.template') - .replace('${major}', major) - .replace('${minor}', minor) - .replace('${patch}', patch) - .replace( - '${prerelease}', - prerelease !== undefined ? `"${prerelease}"` : '""', - ), - 'utf-8', -); - -fs.writeFileSync( - 'Libraries/Core/ReactNativeVersion.js', - cat('scripts/versiontemplates/ReactNativeVersion.js.template') - .replace('${major}', major) - .replace('${minor}', minor) - .replace('${patch}', patch) - .replace( - '${prerelease}', - prerelease !== undefined ? `'${prerelease}'` : 'null', - ), - 'utf-8', -); - -let packageJson = JSON.parse(cat('package.json')); -packageJson.version = version; -delete packageJson.workspaces; -delete packageJson.private; - -// Copy repo-config/package.json dependencies as devDependencies -const repoConfigJson = JSON.parse(cat('repo-config/package.json')); -packageJson.devDependencies = { - ...packageJson.devDependencies, - ...repoConfigJson.dependencies, -}; -// Make react-native-codegen a direct dependency of react-native -delete packageJson.devDependencies['react-native-codegen']; -packageJson.dependencies = { - ...packageJson.dependencies, - 'react-native-codegen': repoConfigJson.dependencies['react-native-codegen'], -}; -fs.writeFileSync('package.json', JSON.stringify(packageJson, null, 2), 'utf-8'); - -// Change ReactAndroid/gradle.properties -if ( - sed( - '-i', - /^VERSION_NAME=.*/, - `VERSION_NAME=${version}`, - 'ReactAndroid/gradle.properties', - ).code -) { - echo("Couldn't update version for Gradle"); - exit(1); -} +async function main() { + const branch = getBranchName(); -// Change react-native version in the template's package.json -exec(`node scripts/set-rn-template-version.js ${version}`); - -// Verify that files changed, we just do a git diff and check how many times version is added across files -const filesToValidate = [ - 'package.json', - 'ReactAndroid/gradle.properties', - 'template/package.json', -]; -let numberOfChangedLinesWithNewVersion = exec( - `git diff -U0 ${filesToValidate.join( - ' ', - )}| grep '^[+]' | grep -c ${version} `, - {silent: true}, -).stdout.trim(); - -// Make sure to update ruby version -if (exec('scripts/update-ruby.sh').code) { - echo('Failed to update Ruby version'); - exit(1); -} + const {pulled} = await inquirer.prompt({ + type: 'confirm', + name: 'pulled', + message: `You are currently on branch: ${branch}. Have you run "git pull ${argv.remote} ${branch} --tags"?`, + }); -// Release builds should commit the version bumps, and create tags. -// Nightly builds do not need to do that. -if (!nightlyBuild) { - if (+numberOfChangedLinesWithNewVersion !== filesToValidate.length) { - echo( - `Failed to update all the files: [${filesToValidate.join( - ', ', - )}] must have versions in them`, - ); - echo('Fix the issue, revert and try again'); - exec('git diff'); + if (!pulled) { + console.log(`Please run 'git pull ${argv.remote} ${branch} --tags'`); exit(1); + return; } - // Update Podfile.lock only on release builds, not nightlies. - // Nightly builds don't need it as the main branch will already be up-to-date. - echo('Updating RNTester Podfile.lock...'); - if (exec('source scripts/update_podfile_lock.sh && update_pods').code) { - echo('Failed to update RNTester Podfile.lock.'); - echo('Fix the issue, revert and try again.'); - exit(1); + const lastVersionTag = getLatestTag(branch.replace('-stable', '')); + const lastVersion = lastVersionTag + ? parseVersion(lastVersionTag).version + : null; + const lastVersionMessage = lastVersion + ? `Last version tagged is ${lastVersion}.\n` + : ''; + + const {releaseVersion} = await inquirer.prompt({ + type: 'input', + name: 'releaseVersion', + message: `What version are you releasing? (Ex. 0.66.0-rc.4)\n${lastVersionMessage}`, + }); + + let setLatest = false; + + const {version, prerelease} = parseVersion(releaseVersion); + if (!prerelease) { + const {latest} = await inquirer.prompt({ + type: 'confirm', + name: 'latest', + message: 'Set this version as "latest" on npm?', + }); + setLatest = latest; } - - // Make commit [0.21.0-rc] Bump version numbers - if (exec(`git commit -a -m "[${version}] Bump version numbers"`).code) { - echo('failed to commit'); - exit(1); + const npmTag = setLatest ? 'latest' : !prerelease ? branch : 'next'; + const {confirmRelease} = await inquirer.prompt({ + type: 'confirm', + name: 'confirmRelease', + message: `Releasing version "${version}" with npm tag "${npmTag}". Is this correct?`, + }); + + if (!confirmRelease) { + console.log('Aborting.'); + return; } - // Add tag v0.21.0-rc - if (exec(`git tag v${version}`).code) { - echo( - `failed to tag the commit with v${version}, are you sure this release wasn't made earlier?`, - ); - echo('You may want to rollback the last commit'); - echo('git reset --hard HEAD~1'); + if ( + exec(`git tag -a publish-v${version} -m "publish version ${version}"`).code + ) { + console.error(`Failed to tag publish-v${version}`); exit(1); + return; } - // Push newly created tag - let remote = argv.remote; - exec(`git push ${remote} v${version}`); - - // Tag latest if doing stable release. - // This will also tag npm release as `latest` - if (prerelease == null && argv.latest) { + if (setLatest) { exec('git tag -d latest'); - exec(`git push ${remote} :latest`); - exec('git tag latest'); - exec(`git push ${remote} latest`); + exec(`git push ${argv.remote} :latest`); + exec('git tag -a latest -m "latest"'); + } + + if (exec(`git push ${argv.remote} ${branch} --follow-tags`).code) { + console.error(`Failed to push tag publish-v${version}`); + exit(1); + return; } - exec(`git push ${remote} ${branch} --follow-tags`); + // TODO + // 1. Link to CircleCI job to watch + // 2. Output the release changelog to paste into Github releases + // 3. Link to release discussions to update + // 4. Verify RN-diff publish is through + // 5. General changelog update on PR? } -exit(0); +main().then(() => { + exit(0); +}); diff --git a/scripts/prepare-package-for-release.js b/scripts/prepare-package-for-release.js index d5a47e0e60c3..19242fb9acf6 100755 --- a/scripts/prepare-package-for-release.js +++ b/scripts/prepare-package-for-release.js @@ -27,13 +27,13 @@ const { getPublishTag, } = require('./version-utils'); -const branch = process.env.CIRCLE_BRANCH; -const currentCommit = process.env.CIRCLE_SHA1; - const argv = yargs.option('r', { alias: 'remote', default: 'origin', }).argv; + +const currentCommit = process.env.CIRCLE_SHA1; +const branch = process.env.CIRCLE_BRANCH; const remote = argv.remote; const tag = getPublishTag(); @@ -45,7 +45,7 @@ if (tag == null) { } if (!isReleaseBranch(branch)) { - console.error('This needs to be on a release branch'); + console.error(`This needs to be on a release branch. On branch: ${branch}`); exit(1); } @@ -85,7 +85,7 @@ if (exec(`git commit -a -m "[${version}] Bump version numbers"`).code) { } // Add tag v0.21.0-rc.1 -if (exec(`git tag v${version}`).code) { +if (exec(`git tag -a v${version} -m "v${version}"`).code) { echo( `failed to tag the commit with v${version}, are you sure this release wasn't made earlier?`, ); @@ -103,12 +103,9 @@ if (isLatest) { exec(`git push ${remote} :latest`); // This will be pushed with the `--follow-tags` - exec('git tag latest'); + exec('git tag -a latest -m "latest"'); } -// Push newly created tag -exec(`git push ${remote} v${version}`); - exec(`git push ${remote} ${branch} --follow-tags`); exit(0); diff --git a/scripts/version-utils.js b/scripts/version-utils.js index 58177067c539..861aae527dac 100644 --- a/scripts/version-utils.js +++ b/scripts/version-utils.js @@ -32,6 +32,12 @@ function isReleaseBranch(branch) { return branch.endsWith('-stable'); } +function getBranchName() { + return exec('git rev-parse --abbrev-ref HEAD', { + silent: true, + }).stdout.trim(); +} + function getPublishVersion(tag) { if (!tag.startsWith('publish-')) { return null; @@ -58,6 +64,7 @@ function getPublishTag() { } module.exports = { + getBranchName, isTaggedLatest, getPublishTag, getPublishVersion, diff --git a/yarn.lock b/yarn.lock index 19eed0c6a2a1..0de34467e523 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2099,11 +2099,24 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + child-process-promise@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074" @@ -2149,11 +2162,23 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-spinners@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.1.0.tgz#22c34b4d51f573240885b201efda4e4ec9fff3c7" integrity sha512-8B00fJOEh1HPrx4fo5eW16XmE1PcL1tGpGrxy63CXGP9nHdPBN63X75hA1zhvQuhVztJWLqV58Roj2qlNM7cAA== +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -3169,6 +3194,15 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -3238,6 +3272,13 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -3685,7 +3726,7 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -3759,6 +3800,25 @@ ini@^1.3.4: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +inquirer@^7.1.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -4872,7 +4932,7 @@ lodash@4.x.x, lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.5: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.21: +lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5365,6 +5425,11 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + mv@~2: version "2.1.1" resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" @@ -5724,7 +5789,7 @@ os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -6350,6 +6415,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -6396,6 +6469,11 @@ rsvp@^3.3.3: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -6403,6 +6481,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -7136,6 +7221,18 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -7209,7 +7306,7 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -tslib@^1.8.1: +tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==