Skip to content

Commit 1156c64

Browse files
authored
chore: update to nx 21 (#2560)
## Summary: This PR does several things at once, all in order to improve release flow. - Updates Yarn to 4.9.2 (Contains a speed fix by @dannyvv ) - Moves our namespace from `@react-native-mac` to `@react-native-macos` (Turns out @dannyvv had ownership of it, and transferred it so our bot can use it 😄) - Updates NX to version 21. That last one comes with a bunch of changes, as NX 21 comes with a revamped implementation of `nx release`: - Moves the project relationship from "independent" to the default "fixed". This means 'react-native-macos` and `@react-native-macos/virtualized-lists` will always have the same version, and git tags / changelings are all centralized on the react-native-macos version, and follow `v*.*.*` - Updates our package `nx-release-version` from being a generator to a version action. This is a new thing with Nx 21's release flow. It behaves the same. - Now, by default, local dependency protocols are preserved. We still can't use this with Yarn 4 & nx to publish, so on stable branches, I'll undo the `workspace:*` for just react-native-macos's dependency on virtualized lists. Between simplifying the graph with the "fixed" project relationship, preserving the local dependency protocols, and maybe some logic update to ns release's bump algorithm, `nx release` now does what I want it to and _only_ bumps react-native-macos and virtualized-lists, instead of also bumping private packages like rn-tester, and @react-native/oss-library-example. This unblocks a persistent bug I had on the stable branches where releases would fail after version bump. ## Test Plan: `nx release --dry-run` seems to do what I want it to.
1 parent ddfd0eb commit 1156c64

31 files changed

+971
-739
lines changed

.ado/scripts/prepublish-check.mjs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@ const RNMACOS_LATEST = "react-native-macos@latest";
1212
const RNMACOS_NEXT = "react-native-macos@next";
1313

1414
/**
15-
* @typedef {import("nx/src/command-line/release/version").ReleaseVersionGeneratorSchema} ReleaseVersionGeneratorSchema;
15+
* @typedef {import("nx/src/config/nx-json").NxReleaseVersionConfiguration} NxReleaseVersionConfiguration;
1616
* @typedef {{
1717
* defaultBase: string;
1818
* release: {
19-
* version: {
20-
* generatorOptions: ReleaseVersionGeneratorSchema;
21-
* };
19+
* version: NxReleaseVersionConfiguration;
2220
* };
2321
* }} NxConfig;
2422
* @typedef {{
@@ -301,36 +299,36 @@ function enablePublishing(config, currentBranch, { npmTag: tag, prerelease, isNe
301299
}
302300

303301
// Determines whether we need to add "nightly" or "rc" to the version string.
304-
const { generatorOptions } = release.version;
305-
if (generatorOptions.preid !== prerelease) {
302+
const { versionActionsOptions = {} } = release.version;
303+
if (versionActionsOptions.preid !== prerelease) {
306304
if (prerelease) {
307-
errors.push(`'release.version.generatorOptions.preid' must be set to '${prerelease}'`);
308-
generatorOptions.preid = prerelease;
305+
errors.push(`'release.version.versionActionsOptions.preid' must be set to '${prerelease}'`);
306+
versionActionsOptions.preid = prerelease;
309307
} else {
310-
errors.push(`'release.version.generatorOptions.preid' must be removed`);
311-
generatorOptions.preid = undefined;
308+
errors.push(`'release.version.versionActionsOptions.preid' must be removed`);
309+
versionActionsOptions.preid = undefined;
312310
}
313311
}
314312

315313
// What the published version should be tagged as e.g., "latest" or "nightly".
316-
const { currentVersionResolverMetadata } = generatorOptions;
317-
if (currentVersionResolverMetadata?.tag !== tag) {
318-
errors.push(`'release.version.generatorOptions.currentVersionResolverMetadata.tag' must be set to '${tag}'`);
319-
generatorOptions.currentVersionResolverMetadata ??= {};
320-
generatorOptions.currentVersionResolverMetadata.tag = tag;
314+
const currentVersionResolverMetadata = /** @type {{ tag?: string }} */ (versionActionsOptions.currentVersionResolverMetadata || {});
315+
if (currentVersionResolverMetadata.tag !== tag) {
316+
errors.push(`'release.version.versionActionsOptions.currentVersionResolverMetadata.tag' must be set to '${tag}'`);
317+
versionActionsOptions.currentVersionResolverMetadata ??= {};
318+
/** @type {any} */ (versionActionsOptions.currentVersionResolverMetadata).tag = tag;
321319
}
322320

323321
// If we're demoting a branch, we will need to create a new tag. This will
324322
// make Nx trip if we don't specify a fallback. In all other scenarios, the
325323
// tags should exist and therefore prefer it to fail.
326324
if (isNewTag) {
327-
if (generatorOptions.fallbackCurrentVersionResolver !== "disk") {
328-
errors.push("'release.version.generatorOptions.fallbackCurrentVersionResolver' must be set to 'disk'");
329-
generatorOptions.fallbackCurrentVersionResolver = "disk";
325+
if (versionActionsOptions.fallbackCurrentVersionResolver !== "disk") {
326+
errors.push("'release.version.versionActionsOptions.fallbackCurrentVersionResolver' must be set to 'disk'");
327+
versionActionsOptions.fallbackCurrentVersionResolver = "disk";
330328
}
331-
} else if (typeof generatorOptions.fallbackCurrentVersionResolver === "string") {
332-
errors.push("'release.version.generatorOptions.fallbackCurrentVersionResolver' must be removed");
333-
generatorOptions.fallbackCurrentVersionResolver = undefined;
329+
} else if (typeof versionActionsOptions.fallbackCurrentVersionResolver === "string") {
330+
errors.push("'release.version.versionActionsOptions.fallbackCurrentVersionResolver' must be removed");
331+
versionActionsOptions.fallbackCurrentVersionResolver = undefined;
334332
}
335333

336334
if (errors.length > 0) {

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,6 @@ vendor/
182182
# Nx
183183
.nx/cache
184184
.nx/workspace-data
185+
.cursor/rules/nx-rules.mdc
186+
.github/instructions/nx.instructions.md
185187
# macOS]

.yarn/releases/yarn-4.9.0.cjs renamed to .yarn/releases/yarn-4.9.2.cjs

Lines changed: 281 additions & 287 deletions
Large diffs are not rendered by default.

.yarnrc.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
nodeLinker: node-modules
22

3-
yarnPath: .yarn/releases/yarn-4.9.0.cjs
3+
yarnPath: .yarn/releases/yarn-4.9.2.cjs

nx.json

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
"defaultBase": "main",
44
"targetDefaults": {
55
"build": {
6-
"dependsOn": [
7-
"^build"
8-
]
6+
"dependsOn": ["^build"]
97
}
108
},
119
"release": {
@@ -16,21 +14,18 @@
1614
},
1715
"workspaceChangelog": false
1816
},
19-
"projects": [
20-
"packages/react-native",
21-
"packages/virtualized-lists"
22-
],
23-
"projectsRelationship": "independent",
17+
"projects": ["packages/react-native", "packages/virtualized-lists"],
2418
"versionPlans": true,
2519
"version": {
26-
"generator": "@react-native-mac/nx-release-version:release-version",
27-
"generatorOptions": {
20+
"versionActions": "@react-native-macos/nx-release-version",
21+
"versionActionsOptions": {
2822
"currentVersionResolver": "registry",
2923
"currentVersionResolverMetadata": {
3024
"tag": "nightly"
3125
},
3226
"preid": "nightly"
33-
}
27+
},
28+
"useLegacyVersioning": false
3429
}
3530
}
3631
}

package.json

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
2-
"name": "@react-native-mac/monorepo",
2+
"name": "@react-native-macos/monorepo",
33
"private": true,
44
"version": "1000.0.0",
55
"license": "MIT",
6-
"packageManager": "[email protected].0",
6+
"packageManager": "[email protected].2",
77
"scripts": {
88
"android": "cd packages/rn-tester && npm run android",
99
"build-android": "./gradlew :packages:react-native:ReactAndroid:build",
@@ -39,10 +39,8 @@
3939
"packages/*",
4040
"tools/*",
4141
"!packages/helloworld",
42-
"// [macOS",
4342
"!packages/hermes-inspector-msggen",
44-
"!packages/react-native-bots",
45-
"// macOS]"
43+
"!packages/react-native-bots"
4644
],
4745
"devDependencies": {
4846
"@babel/core": "^7.25.2",
@@ -53,7 +51,7 @@
5351
"@babel/preset-flow": "^7.24.7",
5452
"@definitelytyped/dtslint": "^0.0.127",
5553
"@jest/create-cache-key-function": "^29.6.3",
56-
"@nx/js": "~20.0.0",
54+
"@nx/js": "^21.2.4",
5755
"@react-native/metro-babel-transformer": "0.77.0-main",
5856
"@react-native/metro-config": "0.77.0-main",
5957
"@tsconfig/node18": "1.0.1",
@@ -98,7 +96,7 @@
9896
"micromatch": "^4.0.4",
9997
"node-fetch": "^2.2.0",
10098
"nullthrows": "^1.1.1",
101-
"nx": "~20.0.0",
99+
"nx": "21.2.4",
102100
"prettier": "2.8.8",
103101
"prettier-plugin-hermes-parser": "0.25.1",
104102
"react": "19.0.0",

packages/nx-release-version/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# os/nx-release-version
2+
3+
Nx (v21) Version Actions for React Native macOS releases.
4+
5+
## Overview
6+
7+
This package provides custom Version Actions for Nx 21's modern release system (`useLegacyVersioning: false`). It extends the built-in `JsVersionActions` to include React Native platform-specific artifact updates.
8+
9+
## What it does
10+
11+
When versioning the `react-native-macos` project, this package automatically:
12+
13+
1. **Updates standard package.json files** (via the base `JsVersionActions`)
14+
2. **Updates React Native platform artifacts**:
15+
- `ReactAndroid/gradle.properties`
16+
- `ReactNativeVersion.java`
17+
- `RCTVersion.m`
18+
- `ReactNativeVersion.h`
19+
- `ReactNativeVersion.js`
20+
3. **Creates a `.rnm-publish` marker file** to indicate successful versioning
21+

packages/nx-release-version/generators.json

Lines changed: 0 additions & 12 deletions
This file was deleted.

packages/nx-release-version/index.js

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
// @ts-check
22

3-
const { releaseVersionGenerator } = require('@nx/js/src/generators/release-version/release-version');
3+
const {REPO_ROOT} = require('../../scripts/consts');
4+
const JsVersionActions = require('@nx/js/src/release/version-actions').default;
45
const fs = require('node:fs');
56
const path = require('node:path');
6-
const { REPO_ROOT } = require('../../scripts/consts');
77

88
/**
99
* @returns {Promise<string[]>}
1010
*/
1111
async function runSetVersion() {
12-
const rnmPkgJson = require.resolve('react-native-macos/package.json');
13-
const { updateReactNativeArtifacts } = require('../../scripts/releases/set-rn-artifacts-version');
12+
const rnmPkgJsonPath = path.join(REPO_ROOT, 'packages', 'react-native', 'package.json');
13+
const {updateReactNativeArtifacts} = require('../../scripts/releases/set-rn-artifacts-version');
1414

15-
const manifest = fs.readFileSync(rnmPkgJson, { encoding: 'utf-8' });
16-
const { version } = JSON.parse(manifest);
15+
const manifest = fs.readFileSync(rnmPkgJsonPath, {encoding: 'utf-8'});
16+
const {version} = JSON.parse(manifest);
1717

1818
await updateReactNativeArtifacts(version);
1919

@@ -66,23 +66,42 @@ async function runSetVersion() {
6666
];
6767
}
6868

69-
/** @type {typeof releaseVersionGenerator} */
70-
module.exports = async function(tree, options) {
71-
const { data, callback } = await releaseVersionGenerator(tree, options);
72-
return {
73-
data,
74-
callback: async (tree, options) => {
75-
const result = await callback(tree, options);
69+
/**
70+
* Custom afterAllProjectsVersioned hook for React Native macOS
71+
* Updates React Native artifacts after all projects have been versioned
72+
* @param {string} _cwd - Current working directory (unused)
73+
* @param {object} _opts - Options object containing versioning information (unused)
74+
* @returns {Promise<{changedFiles: string[], deletedFiles: string[]}>}
75+
*/
76+
const afterAllProjectsVersioned = async (_cwd, _opts) => {
77+
const changedFiles = [];
78+
79+
try {
80+
// Create the .rnm-publish file to indicate versioning has occurred
81+
fs.writeFileSync(path.join(REPO_ROOT, '.rnm-publish'), '');
82+
83+
// Update React Native artifacts
84+
const versionedFiles = await runSetVersion();
7685

77-
// Only update artifacts if there were changes
78-
const changedFiles = Array.isArray(result) ? result : result.changedFiles;
79-
if (changedFiles.length > 0) {
80-
fs.writeFile(path.join(REPO_ROOT, '.rnm-publish'), '', () => null);
81-
const versionedFiles = await runSetVersion();
82-
changedFiles.push(...versionedFiles);
83-
}
86+
// Return the versioned files so Nx can track them
87+
changedFiles.push(...versionedFiles);
8488

85-
return result;
86-
},
89+
console.log('✅ Updated React Native artifacts');
90+
console.log('🏷️ Created .rnm-publish marker file');
91+
92+
} catch (error) {
93+
console.error('Failed to update React Native artifacts:', error);
94+
const errorMessage = error instanceof Error ? error.message : String(error);
95+
console.error(`❌ Failed to update React Native artifacts: ${errorMessage}`);
96+
throw error;
97+
}
98+
99+
return {
100+
changedFiles,
101+
deletedFiles: [],
87102
};
88103
};
104+
105+
module.exports = JsVersionActions;
106+
module.exports.default = JsVersionActions;
107+
module.exports.afterAllProjectsVersioned = afterAllProjectsVersioned;
Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
{
2-
"private": true,
3-
"name": "@react-native-mac/nx-release-version",
2+
"name": "@react-native-macos/nx-release-version",
43
"version": "0.0.1-dev",
5-
"description": "Nx Release plugin that adds post-versioning logic",
4+
"description": "Nx Release Version Actions for React Native macOS",
65
"homepage": "https://github.com/microsoft/react-native-macos/tree/HEAD/packages/nx-release-version#readme",
76
"license": "MIT",
87
"files": [
9-
"generators.json",
10-
"index.js",
11-
"schema.json"
8+
"index.js"
129
],
1310
"main": "index.js",
1411
"repository": {
@@ -17,14 +14,13 @@
1714
"directory": "packages/nx-release-version"
1815
},
1916
"dependencies": {
20-
"@nx/js": "~20.0.0"
17+
"@nx/js": "^21.2.4"
2118
},
2219
"devDependencies": {
2320
"@rnx-kit/tsconfig": "^2.0.0",
2421
"typescript": "^5.6.3"
2522
},
2623
"engines": {
2724
"node": ">=18"
28-
},
29-
"generators": "./generators.json"
25+
}
3026
}

0 commit comments

Comments
 (0)