Skip to content

Commit f56c39d

Browse files
committed
chore: update to nx 21
1 parent c63d5f9 commit f56c39d

File tree

10 files changed

+352
-406
lines changed

10 files changed

+352
-406
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]

nx.json

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
"defaultBase": "0.78-stable",
44
"targetDefaults": {
55
"build": {
6-
"dependsOn": [
7-
"^build"
8-
]
6+
"dependsOn": ["^build"]
97
}
108
},
119
"release": {
@@ -16,20 +14,17 @@
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": "latest"
3125
}
32-
}
26+
},
27+
"useLegacyVersioning": false
3328
}
3429
}
3530
}

package.json

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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.78.2",
5856
"@react-native/metro-config": "0.78.2",
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",
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# os/nx-release-version
2+
3+
Modern Nx 21 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+
22+
## Migration from Legacy
23+
24+
This package has been migrated from the legacy generator-based approach to the modern Nx 21 Version Actions API:
25+
26+
### Before (Legacy)
27+
```json
28+
{
29+
"release": {
30+
"version": {
31+
"generator": "@react-native-mac/nx-release-version:release-version",
32+
"generatorOptions": { ... },
33+
"useLegacyVersioning": true
34+
}
35+
}
36+
}
37+
```
38+
39+
### After (Modern)
40+
```json
41+
{
42+
"release": {
43+
"version": {
44+
"versionActions": "@react-native-mac/nx-release-version",
45+
"versionActionsOptions": { ... },
46+
"useLegacyVersioning": false
47+
}
48+
}
49+
}
50+
```
51+
52+
## Architecture
53+
54+
- **`index.js`**: Main entry point containing the `ReactNativeMacOSVersionActions` class that extends `JsVersionActions`
55+
- **Legacy files removed**: `generators.json`, `schema.json`, `src/` directory
56+
57+
## Benefits of Modern Approach
58+
59+
1. **Better Integration**: Seamless integration with Nx 21's release lifecycle
60+
2. **Type Safety**: Better TypeScript support and IDE integration
61+
3. **Ecosystem Support**: Works with other Nx 21 ecosystem plugins
62+
4. **Future Proof**: No longer depends on legacy APIs that will be removed in Nx 22
63+
64+
## Usage
65+
66+
This package is automatically used when running `nx release` commands. No direct invocation needed.
67+
68+
```bash
69+
# Version and release projects
70+
npx nx release
71+
72+
# Create version plans
73+
npx nx release plan patch
74+
75+
# Version with specific increment
76+
npx nx release version patch
77+
```

packages/nx-release-version/generators.json

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

packages/nx-release-version/index.js

Lines changed: 59 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
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
async function runSetVersion() {
9-
const rnmPkgJson = require.resolve('react-native-macos/package.json');
10-
const { REPO_ROOT } = require('../../scripts/consts');
11-
const { updateReactNativeArtifacts } = require('../../scripts/releases/set-rn-artifacts-version');
9+
const rnmPkgJsonPath = path.join(REPO_ROOT, 'packages', 'react-native', 'package.json');
10+
const {updateReactNativeArtifacts} = require('../../scripts/releases/set-rn-artifacts-version');
1211

13-
const manifest = fs.readFileSync(rnmPkgJson, { encoding: 'utf-8' });
14-
const { version } = JSON.parse(manifest);
12+
const manifest = fs.readFileSync(rnmPkgJsonPath, {encoding: 'utf-8'});
13+
const {version} = JSON.parse(manifest);
1514

1615
await updateReactNativeArtifacts(version);
1716

@@ -64,21 +63,59 @@ async function runSetVersion() {
6463
];
6564
}
6665

67-
/** @type {typeof releaseVersionGenerator} */
68-
module.exports = async function(tree, options) {
69-
const { data, callback } = await releaseVersionGenerator(tree, options);
70-
return {
71-
data,
72-
callback: async (tree, options) => {
73-
const result = await callback(tree, options);
66+
/**
67+
* Custom Version Actions for React Native macOS
68+
* Extends the built-in JsVersionActions to add React Native artifact updates
69+
*/
70+
class ReactNativeMacOSVersionActions extends JsVersionActions {
71+
/**
72+
* @override
73+
* Override updateProjectVersion to include React Native artifact updates
74+
* @param {import('@nx/devkit').Tree} tree
75+
* @param {string} newVersion
76+
* @returns {Promise<string[]>}
77+
*/
78+
async updateProjectVersion(tree, newVersion) {
79+
// First, run the standard JS version update (package.json, etc.)
80+
const standardLogMessages = await super.updateProjectVersion(tree, newVersion);
7481

75-
const versionedFiles = await runSetVersion();
76-
if (versionedFiles) {
77-
const changedFiles = Array.isArray(result) ? result : result.changedFiles;
78-
changedFiles.push(...versionedFiles);
82+
// Only update React Native artifacts for the react-native-macos project
83+
if (this.projectGraphNode.name === 'react-native-macos') {
84+
try {
85+
// Create the .rnm-publish file to indicate versioning has occurred
86+
fs.writeFileSync(path.join(REPO_ROOT, '.rnm-publish'), '');
87+
88+
// Update React Native artifacts
89+
const versionedFiles = await runSetVersion();
90+
91+
// Add the versioned files to the tree so they are tracked by Nx
92+
for (const filePath of versionedFiles) {
93+
if (fs.existsSync(filePath)) {
94+
const content = fs.readFileSync(filePath, 'utf-8');
95+
const relativePath = path.relative(REPO_ROOT, filePath);
96+
tree.write(relativePath, content);
97+
}
98+
}
99+
100+
return [
101+
...standardLogMessages,
102+
`✅ Updated React Native platform artifacts for version ${newVersion}`,
103+
`📁 Updated ${versionedFiles.length} platform-specific files`,
104+
'🏷️ Created .rnm-publish marker file',
105+
];
106+
} catch (error) {
107+
console.error('Failed to update React Native artifacts:', error);
108+
const errorMessage = error instanceof Error ? error.message : String(error);
109+
return [
110+
...standardLogMessages,
111+
`❌ Failed to update React Native artifacts: ${errorMessage}`,
112+
];
79113
}
114+
}
115+
116+
return standardLogMessages;
117+
}
118+
}
80119

81-
return result;
82-
},
83-
};
84-
};
120+
module.exports = ReactNativeMacOSVersionActions;
121+
module.exports.default = ReactNativeMacOSVersionActions;
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)