Enable Flow on misc release scripts (#42736)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/42736

- Minimally enable Flow in these scripts. This would have caught outdated imports in D53001971 and D53228096.
- Update `publish-npm` script with async `main()` function.
- Also delete leftover `ReactNativeVersion.js.template` file.

Changelog: [Internal]

Reviewed By: cortinico

Differential Revision: D53225162

fbshipit-source-id: 9521291b7c84728e3e05af510ebf3244a9a189e5
This commit is contained in:
Alex Hunt 2024-01-31 03:36:02 -08:00 коммит произвёл Facebook GitHub Bot
Родитель 0bbc311c8a
Коммит b7b55854fe
6 изменённых файлов: 63 добавлений и 52 удалений

Просмотреть файл

@ -44,7 +44,7 @@ jest
const date = new Date('2023-04-20T23:52:39.543Z');
const publishNpm = require('../publish-npm');
const {publishNpm} = require('../publish-npm');
let consoleError;
describe('publish-npm', () => {
@ -68,15 +68,15 @@ describe('publish-npm', () => {
describe('publish-npm.js', () => {
it('Fails when invalid build type is passed', () => {
expect(() => publishNpm('invalid')).toThrowError(
expect(publishNpm('invalid')).rejects.toThrow(
'Unsupported build type: invalid',
);
});
});
describe('dry-run', () => {
it('should set version and not publish', () => {
publishNpm('dry-run');
it('should set version and not publish', async () => {
await publishNpm('dry-run');
expect(removeNewArchFlags).not.toHaveBeenCalled();
expect(exitMock).toHaveBeenCalledWith(0);
@ -93,13 +93,13 @@ describe('publish-npm', () => {
});
describe('nightly', () => {
it('should publish', () => {
it('should publish', async () => {
execMock
.mockReturnValueOnce({stdout: '0.81.0-rc.1\n', code: 0})
.mockReturnValueOnce({code: 0});
const expectedVersion = '0.82.0-nightly-20230420-currentco';
publishNpm('nightly');
await publishNpm('nightly');
expect(removeNewArchFlags).not.toHaveBeenCalled();
expect(publishAndroidArtifactsToMavenMock).toHaveBeenCalledWith(
@ -116,14 +116,14 @@ describe('publish-npm', () => {
expect(exitMock).toHaveBeenCalledWith(0);
});
it('should fail to set version', () => {
it('should fail to set version', async () => {
execMock.mockReturnValueOnce({stdout: '0.81.0-rc.1\n', code: 0});
const expectedVersion = '0.82.0-nightly-20230420-currentco';
setReactNativeVersionMock.mockImplementation(() => {
throw new Error('something went wrong');
});
publishNpm('nightly');
await publishNpm('nightly');
expect(removeNewArchFlags).not.toHaveBeenCalled();
expect(publishAndroidArtifactsToMavenMock).not.toBeCalled();
@ -140,19 +140,19 @@ describe('publish-npm', () => {
describe('release', () => {
it('should fail with invalid release version', () => {
process.env.CIRCLE_TAG = '1.0.1';
expect(() => {
publishNpm('release');
}).toThrow('Version 1.0.1 is not valid for Release');
expect(publishNpm('release')).rejects.toThrow(
'Version 1.0.1 is not valid for Release',
);
expect(publishAndroidArtifactsToMavenMock).not.toBeCalled();
});
it('should publish non-latest', () => {
it('should publish non-latest', async () => {
execMock.mockReturnValueOnce({code: 0});
isTaggedLatestMock.mockReturnValueOnce(false);
process.env.CIRCLE_TAG = '0.81.1';
process.env.NPM_CONFIG_OTP = 'otp';
publishNpm('release');
await publishNpm('release');
expect(removeNewArchFlags).not.toHaveBeenCalled();
const expectedVersion = '0.81.1';
@ -171,13 +171,13 @@ describe('publish-npm', () => {
expect(execMock.mock.calls).toHaveLength(1);
});
it('should publish latest stable', () => {
it('should publish latest stable', async () => {
execMock.mockReturnValueOnce({code: 0});
isTaggedLatestMock.mockReturnValueOnce(true);
process.env.CIRCLE_TAG = '0.81.1';
process.env.NPM_CONFIG_OTP = 'otp';
publishNpm('release');
await publishNpm('release');
expect(removeNewArchFlags).not.toHaveBeenCalled();
const expectedVersion = '0.81.1';
@ -196,13 +196,13 @@ describe('publish-npm', () => {
expect(execMock.mock.calls).toHaveLength(1);
});
it('should fail to publish latest stable', () => {
it('should fail to publish latest stable', async () => {
execMock.mockReturnValueOnce({code: 1});
isTaggedLatestMock.mockReturnValueOnce(true);
process.env.CIRCLE_TAG = '0.81.1';
process.env.NPM_CONFIG_OTP = 'otp';
publishNpm('release');
await publishNpm('release');
expect(removeNewArchFlags).not.toHaveBeenCalled();
const expectedVersion = '0.81.1';
@ -219,13 +219,13 @@ describe('publish-npm', () => {
expect(execMock.mock.calls).toHaveLength(1);
});
it('should publish next', () => {
it('should publish next', async () => {
execMock.mockReturnValueOnce({code: 0});
isTaggedLatestMock.mockReturnValueOnce(true);
process.env.CIRCLE_TAG = '0.81.0-rc.4';
process.env.NPM_CONFIG_OTP = 'otp';
publishNpm('release');
await publishNpm('release');
expect(removeNewArchFlags).not.toHaveBeenCalled();
const expectedVersion = '0.81.0-rc.4';

Просмотреть файл

@ -4,6 +4,7 @@
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
*/
@ -45,11 +46,19 @@ const argv = yargs
}).argv;
const branch = process.env.CIRCLE_BRANCH;
// $FlowFixMe[prop-missing]
const remote = argv.remote;
// $FlowFixMe[prop-missing]
const releaseVersion = argv.toVersion;
// $FlowFixMe[prop-missing]
const isLatest = argv.latest;
// $FlowFixMe[prop-missing]
const isDryRun = argv.dryRun;
if (branch == null) {
throw new Error('process.env.CIRCLE_BRANCH is not set');
}
const buildType = isDryRun
? 'dry-run'
: isReleaseBranch(branch)

Просмотреть файл

@ -5,10 +5,15 @@
* LICENSE file in the root directory of this source tree.
*
* @format
* @flow
*/
'use strict';
/*::
import type {BuildType} from './releases/version-utils';
*/
const getAndUpdatePackages = require('./monorepo/get-and-update-packages');
const {getNpmInfo, publishPackage} = require('./npm-utils');
const {
@ -43,7 +48,7 @@ const yargs = require('yargs');
* * or otherwise `{major}.{minor}-stable`
*/
if (require.main === module) {
async function main() {
const argv = yargs
.option('t', {
alias: 'builtType',
@ -53,12 +58,13 @@ if (require.main === module) {
})
.strict().argv;
// $FlowFixMe[prop-missing]
const buildType = argv.builtType;
publishNpm(buildType);
await publishNpm(buildType);
}
function publishNpm(buildType) {
async function publishNpm(buildType /*: BuildType */) /*: Promise<void> */ {
const {version, tag} = getNpmInfo(buildType);
if (buildType === 'prealpha') {
@ -70,12 +76,13 @@ function publishNpm(buildType) {
if (['dry-run', 'nightly', 'prealpha'].includes(buildType)) {
// Publish monorepo nightlies and prealphas if there are updates, returns the new version for each package
const monorepoVersions =
// $FlowFixMe[incompatible-call]
buildType === 'dry-run' ? null : getAndUpdatePackages(version, buildType);
try {
// Update the react-native and template packages with the react-native version
// and nightly versions of monorepo deps
setReactNativeVersion(version, monorepoVersions, buildType);
await setReactNativeVersion(version, monorepoVersions, buildType);
} catch (e) {
console.error(`Failed to set version number to ${version}`);
console.error(e);
@ -96,6 +103,7 @@ function publishNpm(buildType) {
const packagePath = path.join(__dirname, '..', 'packages', 'react-native');
const result = publishPackage(packagePath, {
// $FlowFixMe[incompatible-call]
tags: [tag],
otp: process.env.NPM_CONFIG_OTP,
});
@ -109,4 +117,11 @@ function publishNpm(buildType) {
}
}
module.exports = publishNpm;
module.exports = {
publishNpm,
};
if (require.main === module) {
// eslint-disable-next-line no-void
void main();
}

Просмотреть файл

@ -38,7 +38,8 @@ function exitIfNotOnGit /*::<T>*/(
command /*: () => T */,
errorMessage /*: string */,
gracefulExit /*: boolean */ = false,
) /*: ?T */ {
// $FlowFixMe[incompatible-return] Asserts return value
) /*: T */ {
if (isGitRepo()) {
return command();
} else {

Просмотреть файл

@ -5,6 +5,7 @@
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
*/
@ -54,7 +55,7 @@ let argv = yargs
return true;
}).argv;
function exitIfNotOnReleaseBranch(branch) {
function exitIfNotOnReleaseBranch(branch /*: string */) {
if (!isReleaseBranch(branch)) {
console.log(
'This script must be run in a react-native git repository checkout and on a release branch',
@ -64,7 +65,11 @@ function exitIfNotOnReleaseBranch(branch) {
}
const buildExecutor =
(packageAbsolutePath, packageRelativePathFromRoot, packageManifest) =>
(
packageAbsolutePath /*: string */,
packageRelativePathFromRoot /*: string */,
packageManifest /*: $FlowFixMe */,
) =>
async () => {
const {name: packageName} = packageManifest;
if (packageManifest.private) {
@ -109,7 +114,7 @@ async function exitIfUnreleasedPackages() {
}
}
function triggerReleaseWorkflow(options) {
function triggerReleaseWorkflow(options /*: $FlowFixMe */) {
return new Promise((resolve, reject) => {
request(options, function (error, response, body) {
if (error) {
@ -144,7 +149,9 @@ async function main() {
exit(1);
}
// $FlowFixMe[prop-missing]
const token = argv.token;
// $FlowFixMe[prop-missing]
const releaseVersion = argv.toVersion;
failIfTagExists(releaseVersion, 'release');
@ -155,6 +162,7 @@ async function main() {
});
if (!pushed) {
// $FlowFixMe[prop-missing]
console.log(`Please run 'git push ${argv.remote} ${branch}'`);
exit(1);
return;
@ -206,6 +214,7 @@ async function main() {
// See response: https://circleci.com/docs/api/v2/#operation/triggerPipeline
const body = await triggerReleaseWorkflow(options);
console.log(
// $FlowFixMe[incompatible-use]
`Monitor your release workflow: https://app.circleci.com/pipelines/github/facebook/react-native/${body.number}`,
);
@ -215,6 +224,7 @@ async function main() {
// - Verify RN-diff publish is through
}
// $FlowFixMe[unused-promise]
main().then(() => {
exit(0);
});

Просмотреть файл

@ -1,24 +0,0 @@
/**
* @generated by scripts/set-rn-version.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict
*/
const version: $ReadOnly<{
major: number,
minor: number,
patch: number,
prerelease: string | null,
}> = {
major: ${major},
minor: ${minor},
patch: ${patch},
prerelease: ${prerelease},
};
module.exports = {version};