From 4ebfb03e27065f0e9bef768de702502453e205fe Mon Sep 17 00:00:00 2001 From: Protik Biswas Date: Mon, 16 Feb 2026 15:24:10 +0530 Subject: [PATCH 1/3] adding intehrate-rn script changes --- packages/@rnw-scripts/integrate-rn/bin.js | 4 + .../integrate-rn/src/integrateRN.ts | 22 +++-- .../integrate-rn/src/upgradeDependencies.ts | 83 ++++++++++++------- 3 files changed, 71 insertions(+), 38 deletions(-) diff --git a/packages/@rnw-scripts/integrate-rn/bin.js b/packages/@rnw-scripts/integrate-rn/bin.js index edb86763d48..287cf324c24 100755 --- a/packages/@rnw-scripts/integrate-rn/bin.js +++ b/packages/@rnw-scripts/integrate-rn/bin.js @@ -7,5 +7,9 @@ * @format */ +// Ensure the package is built from latest source before running +const {execSync} = require('child_process'); +execSync('npx tsc -p . --outDir lib-commonjs', {cwd: __dirname, stdio: 'inherit'}); + require('source-map-support').install(); require('./lib-commonjs/integrateRN.js'); diff --git a/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts b/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts index 5cb379faefd..e09704a3b1c 100644 --- a/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts +++ b/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts @@ -26,12 +26,12 @@ import { import runCommand from './runCommand'; import upgradeDependencies from './upgradeDependencies'; -import {Logger, CompositeLogger, ConsoleLogger, MarkdownLogger} from './logger'; +import { Logger, CompositeLogger, ConsoleLogger, MarkdownLogger } from './logger'; let logger: Logger; (async () => { - const {argv} = yargs + const { argv } = yargs .options({ reportPath: { type: 'string', @@ -70,11 +70,13 @@ async function performSteps(newVersion: string) { `Updating packages and dependents to react-native@${newVersion}`, async () => { await upgradeDependencies(newVersion); - return {status: 'success'}; + return { status: 'success' }; }, ); - await funcStep('Upgrading out-of-date overrides', upgradePlatformOverrides); + await funcStep('Upgrading out-of-date overrides', () => + upgradePlatformOverrides(newVersion), + ); await funcStep( 'Performing additional override validation', validatePlatformOverrides, @@ -103,13 +105,15 @@ async function isOverridePackage(pkg: NpmPackage): Promise { * Upgrade platform overrides in the repo to the current version of react * native, disallowing files with conflicts to be written */ -async function upgradePlatformOverrides(): Promise { +async function upgradePlatformOverrides( + newVersion: string, +): Promise { const overridesWithConflicts: string[] = []; for (const pkg of await enumerateOverridePackages()) { const results = await upgradeOverrides( path.join(pkg.path, 'overrides.json'), - {allowConflicts: false}, + { reactNativeVersion: newVersion, allowConflicts: false }, ); overridesWithConflicts.push( @@ -121,7 +125,7 @@ async function upgradePlatformOverrides(): Promise { } if (overridesWithConflicts.length === 0) { - return {status: 'success'}; + return { status: 'success' }; } else { return { status: 'warn', @@ -151,7 +155,7 @@ async function validatePlatformOverrides(): Promise { body: 'Override validation failed. Run `yarn validate-overrides` for more information', }; } else { - return {status: 'success'}; + return { status: 'success' }; } } @@ -198,7 +202,7 @@ async function funcStep( async function commandStep(cmd: string) { return funcStep(cmd, async () => { await runCommand(cmd); - return {status: 'success'}; + return { status: 'success' }; }); } diff --git a/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts b/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts index c8adfbff6f7..1cd00d61461 100644 --- a/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts +++ b/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts @@ -14,7 +14,7 @@ import { findRepoPackage, } from '@react-native-windows/package-utils'; import runCommand from './runCommand'; -import {upgradeOverrides} from 'react-native-platform-override'; +import { upgradeOverrides } from 'react-native-platform-override'; /** * Describes the dependencies of a package @@ -58,7 +58,7 @@ const OUT_OF_TREE_PLATFORMS = [ export default async function upgradeDependencies( newReactNativeVersion: string, ) { - const {reactNativeDiff, templateDiff} = await upgradeReactNative( + const { reactNativeDiff, templateDiff } = await upgradeReactNative( newReactNativeVersion, ); const repoConfigDiff = await upgradeRepoConfig(newReactNativeVersion); @@ -114,7 +114,7 @@ export default async function upgradeDependencies( */ async function upgradeReactNative( newReactNativeVersion: string, -): Promise<{reactNativeDiff: PackageDiff; templateDiff: PackageDiff}> { +): Promise<{ reactNativeDiff: PackageDiff; templateDiff: PackageDiff }> { const platformPackages = await enumerateRepoPackages(async pkg => OUT_OF_TREE_PLATFORMS.includes(pkg.json.name), ); @@ -125,7 +125,7 @@ async function upgradeReactNative( ); } - const findRnOpts = {searchPath: platformPackages[0].path}; + const findRnOpts = { searchPath: platformPackages[0].path }; const origJson = (await findPackage('react-native', findRnOpts))!.json; const origTemplateJson = (await findPackage( '@react-native-community/template', @@ -201,7 +201,7 @@ async function upgradeRepoConfig( .forEach(prop => { internalDevDependencies[prop] = newReactNativeVersion; }); - await newPackage.mergeProps({devDependencies: internalDevDependencies}); + await newPackage.mergeProps({ devDependencies: internalDevDependencies }); } return extractPackageDiff(origPackage.json, newPackage.json); @@ -223,7 +223,7 @@ function extractPackageDiff(origJson: any, newJson: any): PackageDiff { function extractPackageDeps(json: any): PackageDeps { return { packageName: json.name, - ...(json.dependencies && {dependencies: json.dependencies}), + ...(json.dependencies && { dependencies: json.dependencies }), ...(json.peerDependencies && { peerDependencies: json.peerDependencies, }), @@ -251,7 +251,7 @@ export function calcPackageDependencies( const newPackage: LocalPackageDeps = _.cloneDeep(pkg); if (newPackage.outOfTreePlatform) { - syncReactNativeDependencies(newPackage, reactNativePackageDiff); + syncReactNativeDependencies(newPackage, reactNativePackageDiff, newReactNativeVersion); } if (newPackage.dependencies && newPackage.dependencies['react-native']) { @@ -261,6 +261,15 @@ export function calcPackageDependencies( ); } + // All @react-native/* packages are published with matching nightly + // versions. Bump any that reference a nightly version across all packages. + if (newPackage.dependencies) { + newPackage.dependencies = bumpReactNativeNightlyDeps( + newPackage.dependencies, + newReactNativeVersion, + ); + } + ensureValidReactNativePeerDep(newPackage, newReactNativeVersion); ensureReactNativePeerDepsSatisfied( newPackage, @@ -307,6 +316,27 @@ function sortByKeys(obj: Record): Record { return _(obj).toPairs().sortBy(0).fromPairs().value(); } +/** + * All @react-native/* packages are published with matching nightly versions. + * Bump any @react-native/* dependency referencing a nightly version to the + * new nightly version. + */ +function bumpReactNativeNightlyDeps( + deps: Record, + newReactNativeVersion: string, +): Record { + if (!newReactNativeVersion.includes('nightly')) { + return deps; + } + const result = { ...deps }; + for (const [dep, version] of Object.entries(result)) { + if (dep.startsWith('@react-native/') && version.includes('nightly')) { + result[dep] = newReactNativeVersion; + } + } + return result; +} + /** * Matches dependencies + peer dependencies of an out-of-tree platform to * those used by react-native. @@ -314,6 +344,7 @@ function sortByKeys(obj: Record): Record { function syncReactNativeDependencies( pkg: LocalPackageDeps, reactNativePackageDiff: PackageDiff, + newReactNativeVersion: string, ) { // Because we host JS from RN core, we need to provide all of the // dependencies and peerDependencies declared by react-native. Pick all of @@ -323,10 +354,10 @@ function syncReactNativeDependencies( Object.keys(pkg.dependencies || {}), Object.keys(reactNativePackageDiff.oldPackage.dependencies || {}), ); - const newDeps = { + const newDeps = bumpReactNativeNightlyDeps({ ..._.pick(pkg.dependencies, extraDeps), ...reactNativePackageDiff.newPackage.dependencies, - } as Record; + } as Record, newReactNativeVersion); if (Object.keys(newDeps).length === 0) { delete pkg.dependencies; } else { @@ -373,16 +404,13 @@ function syncDependencies( ...templateDiff.newPackage.devDependencies, }; - // below packages rely on internal builds upstream in their package.json but still publish a new matching nightly version. Update our package.json to the matching nightly version. - if (pkg[dependencyType]?.['@react-native/metro-config']) { - pkg[dependencyType]!['@react-native/metro-config'] = newReactNativeVersion; - } - if (pkg[dependencyType]?.['@react-native/metro-babel-transformer']) { - pkg[dependencyType]!['@react-native/metro-babel-transformer'] = - newReactNativeVersion; - } - if (pkg[dependencyType]?.['@react-native/babel-preset']) { - pkg[dependencyType]!['@react-native/babel-preset'] = newReactNativeVersion; + // All @react-native/* packages are published with matching nightly versions. + // Bump any that reference a nightly version to the new nightly version. + if (pkg[dependencyType]) { + pkg[dependencyType] = bumpReactNativeNightlyDeps( + pkg[dependencyType]!, + newReactNativeVersion, + ); } for (const [dependency, version] of devDependencies) { @@ -463,16 +491,13 @@ function ensureValidReactNativePeerDep( newReactNativeVersion, ); - // below packages rely on internal builds upstream in their package.json but still publish a new matching nightly version. Update our package.json to the matching nightly version. - if (pkg.dependencies?.['@react-native/metro-config']) { - pkg.dependencies['@react-native/metro-config'] = newReactNativeVersion; - } - if (pkg.dependencies?.['@react-native/metro-babel-transformer']) { - pkg.dependencies['@react-native/metro-babel-transformer'] = - newReactNativeVersion; - } - if (pkg.dependencies?.['@react-native/babel-preset']) { - pkg.dependencies['@react-native/babel-preset'] = newReactNativeVersion; + // All @react-native/* packages are published with matching nightly versions. + // Bump any that reference a nightly version to the new nightly version. + if (pkg.dependencies) { + pkg.dependencies = bumpReactNativeNightlyDeps( + pkg.dependencies, + newReactNativeVersion, + ); } } From 882806dde7053d600c037af459f6b1a8e69493c6 Mon Sep 17 00:00:00 2001 From: Protik Biswas Date: Tue, 17 Feb 2026 09:40:18 +0530 Subject: [PATCH 2/3] adding bin.js chnages --- packages/@rnw-scripts/integrate-rn/bin.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/@rnw-scripts/integrate-rn/bin.js b/packages/@rnw-scripts/integrate-rn/bin.js index 287cf324c24..b9681d466b9 100755 --- a/packages/@rnw-scripts/integrate-rn/bin.js +++ b/packages/@rnw-scripts/integrate-rn/bin.js @@ -9,7 +9,10 @@ // Ensure the package is built from latest source before running const {execSync} = require('child_process'); -execSync('npx tsc -p . --outDir lib-commonjs', {cwd: __dirname, stdio: 'inherit'}); +execSync('npx tsc -p . --outDir lib-commonjs', { + cwd: __dirname, + stdio: 'inherit', +}); require('source-map-support').install(); require('./lib-commonjs/integrateRN.js'); From c604c402f27d07f0b95ff0fc3839c86866017686 Mon Sep 17 00:00:00 2001 From: Protik Biswas Date: Tue, 17 Feb 2026 14:11:56 +0530 Subject: [PATCH 3/3] linting fix --- .../integrate-rn/src/integrateRN.ts | 14 ++++----- .../integrate-rn/src/upgradeDependencies.ts | 31 ++++++++++++------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts b/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts index e09704a3b1c..a89ab6cd14a 100644 --- a/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts +++ b/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts @@ -26,12 +26,12 @@ import { import runCommand from './runCommand'; import upgradeDependencies from './upgradeDependencies'; -import { Logger, CompositeLogger, ConsoleLogger, MarkdownLogger } from './logger'; +import {Logger, CompositeLogger, ConsoleLogger, MarkdownLogger} from './logger'; let logger: Logger; (async () => { - const { argv } = yargs + const {argv} = yargs .options({ reportPath: { type: 'string', @@ -70,7 +70,7 @@ async function performSteps(newVersion: string) { `Updating packages and dependents to react-native@${newVersion}`, async () => { await upgradeDependencies(newVersion); - return { status: 'success' }; + return {status: 'success'}; }, ); @@ -113,7 +113,7 @@ async function upgradePlatformOverrides( for (const pkg of await enumerateOverridePackages()) { const results = await upgradeOverrides( path.join(pkg.path, 'overrides.json'), - { reactNativeVersion: newVersion, allowConflicts: false }, + {reactNativeVersion: newVersion, allowConflicts: false}, ); overridesWithConflicts.push( @@ -125,7 +125,7 @@ async function upgradePlatformOverrides( } if (overridesWithConflicts.length === 0) { - return { status: 'success' }; + return {status: 'success'}; } else { return { status: 'warn', @@ -155,7 +155,7 @@ async function validatePlatformOverrides(): Promise { body: 'Override validation failed. Run `yarn validate-overrides` for more information', }; } else { - return { status: 'success' }; + return {status: 'success'}; } } @@ -202,7 +202,7 @@ async function funcStep( async function commandStep(cmd: string) { return funcStep(cmd, async () => { await runCommand(cmd); - return { status: 'success' }; + return {status: 'success'}; }); } diff --git a/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts b/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts index 1cd00d61461..038ebafeaeb 100644 --- a/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts +++ b/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts @@ -14,7 +14,7 @@ import { findRepoPackage, } from '@react-native-windows/package-utils'; import runCommand from './runCommand'; -import { upgradeOverrides } from 'react-native-platform-override'; +import {upgradeOverrides} from 'react-native-platform-override'; /** * Describes the dependencies of a package @@ -58,7 +58,7 @@ const OUT_OF_TREE_PLATFORMS = [ export default async function upgradeDependencies( newReactNativeVersion: string, ) { - const { reactNativeDiff, templateDiff } = await upgradeReactNative( + const {reactNativeDiff, templateDiff} = await upgradeReactNative( newReactNativeVersion, ); const repoConfigDiff = await upgradeRepoConfig(newReactNativeVersion); @@ -114,7 +114,7 @@ export default async function upgradeDependencies( */ async function upgradeReactNative( newReactNativeVersion: string, -): Promise<{ reactNativeDiff: PackageDiff; templateDiff: PackageDiff }> { +): Promise<{reactNativeDiff: PackageDiff; templateDiff: PackageDiff}> { const platformPackages = await enumerateRepoPackages(async pkg => OUT_OF_TREE_PLATFORMS.includes(pkg.json.name), ); @@ -125,7 +125,7 @@ async function upgradeReactNative( ); } - const findRnOpts = { searchPath: platformPackages[0].path }; + const findRnOpts = {searchPath: platformPackages[0].path}; const origJson = (await findPackage('react-native', findRnOpts))!.json; const origTemplateJson = (await findPackage( '@react-native-community/template', @@ -201,7 +201,7 @@ async function upgradeRepoConfig( .forEach(prop => { internalDevDependencies[prop] = newReactNativeVersion; }); - await newPackage.mergeProps({ devDependencies: internalDevDependencies }); + await newPackage.mergeProps({devDependencies: internalDevDependencies}); } return extractPackageDiff(origPackage.json, newPackage.json); @@ -223,7 +223,7 @@ function extractPackageDiff(origJson: any, newJson: any): PackageDiff { function extractPackageDeps(json: any): PackageDeps { return { packageName: json.name, - ...(json.dependencies && { dependencies: json.dependencies }), + ...(json.dependencies && {dependencies: json.dependencies}), ...(json.peerDependencies && { peerDependencies: json.peerDependencies, }), @@ -251,7 +251,11 @@ export function calcPackageDependencies( const newPackage: LocalPackageDeps = _.cloneDeep(pkg); if (newPackage.outOfTreePlatform) { - syncReactNativeDependencies(newPackage, reactNativePackageDiff, newReactNativeVersion); + syncReactNativeDependencies( + newPackage, + reactNativePackageDiff, + newReactNativeVersion, + ); } if (newPackage.dependencies && newPackage.dependencies['react-native']) { @@ -328,7 +332,7 @@ function bumpReactNativeNightlyDeps( if (!newReactNativeVersion.includes('nightly')) { return deps; } - const result = { ...deps }; + const result = {...deps}; for (const [dep, version] of Object.entries(result)) { if (dep.startsWith('@react-native/') && version.includes('nightly')) { result[dep] = newReactNativeVersion; @@ -354,10 +358,13 @@ function syncReactNativeDependencies( Object.keys(pkg.dependencies || {}), Object.keys(reactNativePackageDiff.oldPackage.dependencies || {}), ); - const newDeps = bumpReactNativeNightlyDeps({ - ..._.pick(pkg.dependencies, extraDeps), - ...reactNativePackageDiff.newPackage.dependencies, - } as Record, newReactNativeVersion); + const newDeps = bumpReactNativeNightlyDeps( + { + ..._.pick(pkg.dependencies, extraDeps), + ...reactNativePackageDiff.newPackage.dependencies, + } as Record, + newReactNativeVersion, + ); if (Object.keys(newDeps).length === 0) { delete pkg.dependencies; } else {