Update set-version script to version private packages and workspace deps

Summary:
Addresses a gap when using the `set-version` script to update all packages on `main` (i.e. post branch cut):
- Package versions were not being set consistently. It is safe to version all workspace packages, including `"private"`.
    - Our publishing workflow is independent from this, and only considers public packages for submission to npm.
- We also need to update the root `package.json`, which includes `devDependencies` referencing workspace dependencies.

Unblocks https://github.com/facebook/react-native/pull/43132.

Changelog: [Internal]

Reviewed By: lunaleaps

Differential Revision: D54419456

fbshipit-source-id: 93eee669c5cf7c2f16b68a2bf41e9a8ace5521bf
This commit is contained in:
Alex Hunt
2024-03-18 11:09:04 +00:00
committed by Alex Hunt
parent 42e62bf963
commit 4e677f021a
4 changed files with 96 additions and 23 deletions
@@ -0,0 +1,8 @@
{
"name": "@react-native/monorepo",
"private": true,
"version": "1000.0.0",
"devDependencies": {
"@monorepo/pkg-c": "0.0.1"
}
}
@@ -1,5 +1,17 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`setVersion updates monorepo for nightly: package.json 1`] = `
"{
\\"name\\": \\"@react-native/monorepo\\",
\\"private\\": true,
\\"version\\": \\"1000.0.0\\",
\\"devDependencies\\": {
\\"@monorepo/pkg-c\\": \\"0.81.0-nightly-29282302-abcd1234\\"
}
}
"
`;
exports[`setVersion updates monorepo for nightly: packages/monorepo-pkg-a/package.json 1`] = `
"{
\\"name\\": \\"@monorepo/pkg-a\\",
@@ -198,6 +210,18 @@ exports[`setVersion updates monorepo for nightly: packages/react-native/template
"
`;
exports[`setVersion updates monorepo for release-candidate: package.json 1`] = `
"{
\\"name\\": \\"@react-native/monorepo\\",
\\"private\\": true,
\\"version\\": \\"1000.0.0\\",
\\"devDependencies\\": {
\\"@monorepo/pkg-c\\": \\"0.80.0-rc.3\\"
}
}
"
`;
exports[`setVersion updates monorepo for release-candidate: packages/monorepo-pkg-a/package.json 1`] = `
"{
\\"name\\": \\"@monorepo/pkg-a\\",
@@ -396,6 +420,18 @@ exports[`setVersion updates monorepo for release-candidate: packages/react-nativ
"
`;
exports[`setVersion updates monorepo for stable version: package.json 1`] = `
"{
\\"name\\": \\"@react-native/monorepo\\",
\\"private\\": true,
\\"version\\": \\"1000.0.0\\",
\\"devDependencies\\": {
\\"@monorepo/pkg-c\\": \\"0.80.1\\"
}
}
"
`;
exports[`setVersion updates monorepo for stable version: packages/monorepo-pkg-a/package.json 1`] = `
"{
\\"name\\": \\"@monorepo/pkg-a\\",
@@ -594,6 +630,18 @@ exports[`setVersion updates monorepo for stable version: packages/react-native/t
"
`;
exports[`setVersion updates monorepo on main after release cut: package.json 1`] = `
"{
\\"name\\": \\"@react-native/monorepo\\",
\\"private\\": true,
\\"version\\": \\"1000.0.0\\",
\\"devDependencies\\": {
\\"@monorepo/pkg-c\\": \\"0.82.0-main\\"
}
}
"
`;
exports[`setVersion updates monorepo on main after release cut: packages/monorepo-pkg-a/package.json 1`] = `
"{
\\"name\\": \\"@monorepo/pkg-a\\",
+9 -8
View File
@@ -15,7 +15,7 @@
import type {PackageJson} from '../../utils/monorepo';
*/
const {getPackages} = require('../../utils/monorepo');
const {getPackages, getWorkspaceRoot} = require('../../utils/monorepo');
const {setReactNativeVersion} = require('../set-rn-version');
const {promises: fs} = require('fs');
const path = require('path');
@@ -61,7 +61,7 @@ async function updatePackageJson(
* stays 1000.0.0.
*
* This script does the following:
* - Update all public npm packages under `<root>/packages` to specified version
* - Update all packages under `<root>/packages` to specified version
* - Update all npm dependencies of a `<root>/packages` package to specified version
* - Update npm dependencies of the template app (`packages/react-native/template`) to specified version
* - Update `packages/react-native` native source and build files to specified version if relevant
@@ -71,7 +71,7 @@ async function setVersion(
skipReactNativeVersion /*: boolean */ = false,
) /*: Promise<void> */ {
const packages = await getPackages({
includePrivate: false,
includePrivate: true,
includeReactNative: true,
});
const newPackageVersions = Object.fromEntries(
@@ -83,11 +83,12 @@ async function setVersion(
newPackageVersions,
);
// Exclude the react-native package, since this (and the template) are
// handled by `setReactNativeVersion`.
const packagesToUpdate = Object.values(packages).filter(
pkg => pkg.name !== 'react-native',
);
const packagesToUpdate = [
await getWorkspaceRoot(),
// Exclude the react-native package, since this (and the template) are
// handled by `setReactNativeVersion`.
...Object.values(packages).filter(pkg => pkg.name !== 'react-native'),
];
await Promise.all(
packagesToUpdate.map(({path: packagePath, packageJson}) =>
+31 -15
View File
@@ -65,21 +65,7 @@ async function getPackages(
? []
: ['packages/react-native/package.json'],
})
.map(async packageJsonPath => {
const packagePath = path.dirname(packageJsonPath);
const packageJson /*: PackageJson */ = JSON.parse(
await fs.promises.readFile(packageJsonPath, 'utf-8'),
);
return [
packageJson.name,
{
name: packageJson.name,
path: packagePath,
packageJson,
},
];
}),
.map(parsePackageInfo),
);
return Object.fromEntries(
@@ -89,6 +75,36 @@ async function getPackages(
);
}
/**
* Get the parsed package metadata for the workspace root.
*/
async function getWorkspaceRoot() /*: Promise<PackageInfo> */ {
const [, packageInfo] = await parsePackageInfo(
path.join(REPO_ROOT, 'package.json'),
);
return packageInfo;
}
async function parsePackageInfo(
packageJsonPath /*: string */,
) /*: Promise<[string, PackageInfo]> */ {
const packagePath = path.dirname(packageJsonPath);
const packageJson /*: PackageJson */ = JSON.parse(
await fs.promises.readFile(packageJsonPath, 'utf-8'),
);
return [
packageJson.name,
{
name: packageJson.name,
path: packagePath,
packageJson,
},
];
}
module.exports = {
getPackages,
getWorkspaceRoot,
};