Files
react-native/scripts/releases/set-rn-version.js
T
Riccardo Cipolleschi 7c5e4262d4 Fix publishing of React Native with the right version (#42783)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/42783

This change will fix the publishing of Nightlies for React Native with the right version

## Changelog:
[Internal] - Update the package.json of react native correctly.

Reviewed By: cortinico, huntie

Differential Revision: D53309082

fbshipit-source-id: 2fa4d4fdf4f984603c6b3d3690fa3c464ee6d030
2024-02-01 07:40:11 -08:00

150 lines
3.9 KiB
JavaScript
Executable File

/**
* 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
* @format
* @oncall react_native
*/
/*::
import type {BuildType, Version} from './utils/version-utils';
*/
const {applyPackageVersions} = require('../npm-utils');
const {getNpmInfo} = require('../npm-utils');
const updateTemplatePackage = require('./update-template-package');
const {parseVersion, validateBuildType} = require('./utils/version-utils');
const {parseArgs} = require('@pkgjs/parseargs');
const {promises: fs} = require('fs');
const GRADLE_FILE_PATH = 'packages/react-native/ReactAndroid/gradle.properties';
const REACT_NATIVE_PACKAGE_JSON = 'packages/react-native/package.json';
const config = {
options: {
'build-type': {
type: 'string',
short: 'b',
},
'to-version': {
type: 'string',
short: 'v',
},
help: {type: 'boolean'},
},
};
async function main() {
const {
values: {help, 'build-type': buildType, 'to-version': toVersion},
} = parseArgs(config);
if (help) {
console.log(`
Usage: node ./scripts/releases/set-rn-version.js [OPTIONS]
Updates relevant files in the react-native package and template to
materialize the given release version.
Options:
--build-type One of ['dry-run', 'nightly', 'release', 'prealpha'].
--to-version The new version string.
`);
return;
}
if (!validateBuildType(buildType)) {
throw new Error(`Unsupported build type: ${buildType}`);
}
await setReactNativeVersion(
toVersion ?? getNpmInfo(buildType).version,
{},
buildType,
);
}
async function setReactNativeVersion(
version /*: string */,
dependencyVersions /*: ?Record<string, string> */,
buildType /*: BuildType */,
) {
const versionInfo = parseVersion(version, buildType);
updateTemplatePackage({
...(dependencyVersions ?? {}),
'react-native': versionInfo.version,
});
await updateSourceFiles(versionInfo);
await setReactNativePackageVersion(versionInfo.version, dependencyVersions);
await updateGradleFile(versionInfo.version);
}
async function setReactNativePackageVersion(
version /*: string */,
dependencyVersions /*: ?Record<string, string> */,
) {
const originalPackageJsonContent = await fs.readFile(
REACT_NATIVE_PACKAGE_JSON,
'utf-8',
);
const originalPackageJson = JSON.parse(originalPackageJsonContent);
const packageJson =
dependencyVersions != null
? applyPackageVersions(originalPackageJson, dependencyVersions)
: originalPackageJson;
packageJson.version = version;
await fs.writeFile(
'packages/react-native/package.json',
JSON.stringify(packageJson, null, 2),
'utf-8',
);
}
function updateSourceFiles(versionInfo /*: Version */) {
const templateData = {version: versionInfo};
return Promise.all([
fs.writeFile(
'packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java',
require('./templates/ReactNativeVersion.java-template')(templateData),
),
fs.writeFile(
'packages/react-native/React/Base/RCTVersion.m',
require('./templates/RCTVersion.m-template')(templateData),
),
fs.writeFile(
'packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h',
require('./templates/ReactNativeVersion.h-template')(templateData),
),
fs.writeFile(
'packages/react-native/Libraries/Core/ReactNativeVersion.js',
require('./templates/ReactNativeVersion.js-template')(templateData),
),
]);
}
async function updateGradleFile(version /*: string */) {
const contents = await fs.readFile(GRADLE_FILE_PATH, 'utf-8');
return fs.writeFile(
GRADLE_FILE_PATH,
contents.replace(/^VERSION_NAME=.*/, `VERSION_NAME=${version}`),
);
}
module.exports = {
setReactNativeVersion,
};
if (require.main === module) {
// eslint-disable-next-line no-void
void main();
}