Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 19 additions & 21 deletions .ado/scripts/prepublish-check.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,11 @@ const RNMACOS_LATEST = "react-native-macos@latest";
const RNMACOS_NEXT = "react-native-macos@next";

/**
* @typedef {import("nx/src/command-line/release/version").ReleaseVersionGeneratorSchema} ReleaseVersionGeneratorSchema;
* @typedef {import("nx/src/config/nx-json").NxReleaseVersionConfiguration} NxReleaseVersionConfiguration;
* @typedef {{
* defaultBase: string;
* release: {
* version: {
* generatorOptions: ReleaseVersionGeneratorSchema;
* };
* version: NxReleaseVersionConfiguration;
* };
* }} NxConfig;
* @typedef {{
Expand Down Expand Up @@ -301,36 +299,36 @@ function enablePublishing(config, currentBranch, { npmTag: tag, prerelease, isNe
}

// Determines whether we need to add "nightly" or "rc" to the version string.
const { generatorOptions } = release.version;
if (generatorOptions.preid !== prerelease) {
const { versionActionsOptions = {} } = release.version;
if (versionActionsOptions.preid !== prerelease) {
if (prerelease) {
errors.push(`'release.version.generatorOptions.preid' must be set to '${prerelease}'`);
generatorOptions.preid = prerelease;
errors.push(`'release.version.versionActionsOptions.preid' must be set to '${prerelease}'`);
versionActionsOptions.preid = prerelease;
} else {
errors.push(`'release.version.generatorOptions.preid' must be removed`);
generatorOptions.preid = undefined;
errors.push(`'release.version.versionActionsOptions.preid' must be removed`);
versionActionsOptions.preid = undefined;
}
}

// What the published version should be tagged as e.g., "latest" or "nightly".
const { currentVersionResolverMetadata } = generatorOptions;
if (currentVersionResolverMetadata?.tag !== tag) {
errors.push(`'release.version.generatorOptions.currentVersionResolverMetadata.tag' must be set to '${tag}'`);
generatorOptions.currentVersionResolverMetadata ??= {};
generatorOptions.currentVersionResolverMetadata.tag = tag;
const currentVersionResolverMetadata = /** @type {{ tag?: string }} */ (versionActionsOptions.currentVersionResolverMetadata || {});
if (currentVersionResolverMetadata.tag !== tag) {
errors.push(`'release.version.versionActionsOptions.currentVersionResolverMetadata.tag' must be set to '${tag}'`);
versionActionsOptions.currentVersionResolverMetadata ??= {};
/** @type {any} */ (versionActionsOptions.currentVersionResolverMetadata).tag = tag;
}

// If we're demoting a branch, we will need to create a new tag. This will
// make Nx trip if we don't specify a fallback. In all other scenarios, the
// tags should exist and therefore prefer it to fail.
if (isNewTag) {
if (generatorOptions.fallbackCurrentVersionResolver !== "disk") {
errors.push("'release.version.generatorOptions.fallbackCurrentVersionResolver' must be set to 'disk'");
generatorOptions.fallbackCurrentVersionResolver = "disk";
if (versionActionsOptions.fallbackCurrentVersionResolver !== "disk") {
errors.push("'release.version.versionActionsOptions.fallbackCurrentVersionResolver' must be set to 'disk'");
versionActionsOptions.fallbackCurrentVersionResolver = "disk";
}
} else if (typeof generatorOptions.fallbackCurrentVersionResolver === "string") {
errors.push("'release.version.generatorOptions.fallbackCurrentVersionResolver' must be removed");
generatorOptions.fallbackCurrentVersionResolver = undefined;
} else if (typeof versionActionsOptions.fallbackCurrentVersionResolver === "string") {
errors.push("'release.version.versionActionsOptions.fallbackCurrentVersionResolver' must be removed");
versionActionsOptions.fallbackCurrentVersionResolver = undefined;
}

if (errors.length > 0) {
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -182,4 +182,6 @@ vendor/
# Nx
.nx/cache
.nx/workspace-data
.cursor/rules/nx-rules.mdc
.github/instructions/nx.instructions.md
# macOS]
568 changes: 281 additions & 287 deletions .yarn/releases/yarn-4.9.0.cjs → .yarn/releases/yarn-4.9.2.cjs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .yarnrc.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
nodeLinker: node-modules

yarnPath: .yarn/releases/yarn-4.9.0.cjs
yarnPath: .yarn/releases/yarn-4.9.2.cjs
17 changes: 6 additions & 11 deletions nx.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
"defaultBase": "main",
"targetDefaults": {
"build": {
"dependsOn": [
"^build"
]
"dependsOn": ["^build"]
}
},
"release": {
Expand All @@ -16,21 +14,18 @@
},
"workspaceChangelog": false
},
"projects": [
"packages/react-native",
"packages/virtualized-lists"
],
"projectsRelationship": "independent",
"projects": ["packages/react-native", "packages/virtualized-lists"],
"versionPlans": true,
"version": {
"generator": "@react-native-mac/nx-release-version:release-version",
"generatorOptions": {
"versionActions": "@react-native-macos/nx-release-version",
"versionActionsOptions": {
"currentVersionResolver": "registry",
"currentVersionResolverMetadata": {
"tag": "nightly"
},
"preid": "nightly"
}
},
"useLegacyVersioning": false
}
}
}
12 changes: 5 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"name": "@react-native-mac/monorepo",
"name": "@react-native-macos/monorepo",
"private": true,
"version": "1000.0.0",
"license": "MIT",
"packageManager": "[email protected].0",
"packageManager": "[email protected].2",
"scripts": {
"android": "cd packages/rn-tester && npm run android",
"build-android": "./gradlew :packages:react-native:ReactAndroid:build",
Expand Down Expand Up @@ -39,10 +39,8 @@
"packages/*",
"tools/*",
"!packages/helloworld",
"// [macOS",
"!packages/hermes-inspector-msggen",
"!packages/react-native-bots",
"// macOS]"
"!packages/react-native-bots"
],
"devDependencies": {
"@babel/core": "^7.25.2",
Expand All @@ -53,7 +51,7 @@
"@babel/preset-flow": "^7.24.7",
"@definitelytyped/dtslint": "^0.0.127",
"@jest/create-cache-key-function": "^29.6.3",
"@nx/js": "~20.0.0",
"@nx/js": "^21.2.4",
"@react-native/metro-babel-transformer": "0.77.0-main",
"@react-native/metro-config": "0.77.0-main",
"@tsconfig/node18": "1.0.1",
Expand Down Expand Up @@ -98,7 +96,7 @@
"micromatch": "^4.0.4",
"node-fetch": "^2.2.0",
"nullthrows": "^1.1.1",
"nx": "~20.0.0",
"nx": "21.2.4",
"prettier": "2.8.8",
"prettier-plugin-hermes-parser": "0.25.1",
"react": "19.0.0",
Expand Down
21 changes: 21 additions & 0 deletions packages/nx-release-version/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# os/nx-release-version

Nx (v21) Version Actions for React Native macOS releases.

## Overview

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.

## What it does

When versioning the `react-native-macos` project, this package automatically:

1. **Updates standard package.json files** (via the base `JsVersionActions`)
2. **Updates React Native platform artifacts**:
- `ReactAndroid/gradle.properties`
- `ReactNativeVersion.java`
- `RCTVersion.m`
- `ReactNativeVersion.h`
- `ReactNativeVersion.js`
3. **Creates a `.rnm-publish` marker file** to indicate successful versioning

12 changes: 0 additions & 12 deletions packages/nx-release-version/generators.json

This file was deleted.

63 changes: 41 additions & 22 deletions packages/nx-release-version/index.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
// @ts-check

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

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

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

await updateReactNativeArtifacts(version);

Expand Down Expand Up @@ -66,23 +66,42 @@ async function runSetVersion() {
];
}

/** @type {typeof releaseVersionGenerator} */
module.exports = async function(tree, options) {
const { data, callback } = await releaseVersionGenerator(tree, options);
return {
data,
callback: async (tree, options) => {
const result = await callback(tree, options);
/**
* Custom afterAllProjectsVersioned hook for React Native macOS
* Updates React Native artifacts after all projects have been versioned
* @param {string} _cwd - Current working directory (unused)
* @param {object} _opts - Options object containing versioning information (unused)
* @returns {Promise<{changedFiles: string[], deletedFiles: string[]}>}
*/
const afterAllProjectsVersioned = async (_cwd, _opts) => {
const changedFiles = [];

try {
// Create the .rnm-publish file to indicate versioning has occurred
fs.writeFileSync(path.join(REPO_ROOT, '.rnm-publish'), '');

// Update React Native artifacts
const versionedFiles = await runSetVersion();

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

return result;
},
console.log('✅ Updated React Native artifacts');
console.log('🏷️ Created .rnm-publish marker file');

} catch (error) {
console.error('Failed to update React Native artifacts:', error);
const errorMessage = error instanceof Error ? error.message : String(error);
console.error(`❌ Failed to update React Native artifacts: ${errorMessage}`);
throw error;
}

return {
changedFiles,
deletedFiles: [],
};
};

module.exports = JsVersionActions;
module.exports.default = JsVersionActions;
module.exports.afterAllProjectsVersioned = afterAllProjectsVersioned;
14 changes: 5 additions & 9 deletions packages/nx-release-version/package.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
{
"private": true,
"name": "@react-native-mac/nx-release-version",
"name": "@react-native-macos/nx-release-version",
"version": "0.0.1-dev",
"description": "Nx Release plugin that adds post-versioning logic",
"description": "Nx Release Version Actions for React Native macOS",
"homepage": "https://github.com/microsoft/react-native-macos/tree/HEAD/packages/nx-release-version#readme",
"license": "MIT",
"files": [
"generators.json",
"index.js",
"schema.json"
"index.js"
],
"main": "index.js",
"repository": {
Expand All @@ -17,14 +14,13 @@
"directory": "packages/nx-release-version"
},
"dependencies": {
"@nx/js": "~20.0.0"
"@nx/js": "^21.2.4"
},
"devDependencies": {
"@rnx-kit/tsconfig": "^2.0.0",
"typescript": "^5.6.3"
},
"engines": {
"node": ">=18"
},
"generators": "./generators.json"
}
}
68 changes: 0 additions & 68 deletions packages/nx-release-version/schema.json

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

'use strict';

import type {RenderItemProps} from '@react-native-mac/virtualized-lists'; // [macOS]
import type {RenderItemProps} from '@react-native-macos/virtualized-lists'; // [macOS]

const ScrollView = require('../Components/ScrollView/ScrollView');
const TouchableHighlight = require('../Components/Touchable/TouchableHighlight');
Expand Down
Loading
Loading