diff --git a/packages/@rnw-scripts/integrate-rn/bin.js b/packages/@rnw-scripts/integrate-rn/bin.js index edb86763d48..b9681d466b9 100755 --- a/packages/@rnw-scripts/integrate-rn/bin.js +++ b/packages/@rnw-scripts/integrate-rn/bin.js @@ -7,5 +7,12 @@ * @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..a89ab6cd14a 100644 --- a/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts +++ b/packages/@rnw-scripts/integrate-rn/src/integrateRN.ts @@ -74,7 +74,9 @@ async function performSteps(newVersion: string) { }, ); - 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( diff --git a/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts b/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts index c8adfbff6f7..038ebafeaeb 100644 --- a/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts +++ b/packages/@rnw-scripts/integrate-rn/src/upgradeDependencies.ts @@ -251,7 +251,11 @@ 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 +265,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 +320,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 +348,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 +358,13 @@ function syncReactNativeDependencies( Object.keys(pkg.dependencies || {}), Object.keys(reactNativePackageDiff.oldPackage.dependencies || {}), ); - const newDeps = { - ..._.pick(pkg.dependencies, extraDeps), - ...reactNativePackageDiff.newPackage.dependencies, - } as Record; + const newDeps = bumpReactNativeNightlyDeps( + { + ..._.pick(pkg.dependencies, extraDeps), + ...reactNativePackageDiff.newPackage.dependencies, + } as Record, + newReactNativeVersion, + ); if (Object.keys(newDeps).length === 0) { delete pkg.dependencies; } else { @@ -373,16 +411,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 +498,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, + ); } }