mirror of
https://github.com/zebrajr/react.git
synced 2025-12-06 12:20:20 +01:00
This PR adds a `--replaceBuild` option to the script that downloads older React version builds. If this flag is true, we will replace the contents of the `build` folder with the contents of the `build-regression` folder and remove the `build-regression` folder after, which was the original behavior. However, for e2e tests, we need both the original build (for DevTools) and the new build (for the React Apps), so we need both the `build` and the `build-regression` folders. Not adding the `--replaceBuild` option will do this. This PR also modifies the circle CI config to reflect this change.
133 lines
4.0 KiB
JavaScript
Executable File
133 lines
4.0 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
'use strict';
|
|
|
|
const {exec} = require('child-process-promise');
|
|
const chalk = require('chalk');
|
|
const {join} = require('path');
|
|
const semver = require('semver');
|
|
const yargs = require('yargs');
|
|
const fs = require('fs');
|
|
|
|
const INSTALL_PACKAGES = ['react-dom', 'react', 'react-test-renderer'];
|
|
const REGRESSION_FOLDER = 'build-regression';
|
|
|
|
const ROOT_PATH = join(__dirname, '..', '..');
|
|
|
|
const buildPath = join(ROOT_PATH, `build`, 'oss-experimental');
|
|
const regressionBuildPath = join(ROOT_PATH, REGRESSION_FOLDER);
|
|
|
|
const argv = yargs(process.argv.slice(2)).argv;
|
|
|
|
const version = process.argv[2];
|
|
const shouldReplaceBuild = !!argv.replaceBuild;
|
|
|
|
async function downloadRegressionBuild() {
|
|
console.log(chalk.bold.white(`Downloading React v${version}\n`));
|
|
|
|
// Make build directory for temporary modules we're going to download
|
|
// from NPM
|
|
console.log(
|
|
chalk.white(
|
|
`Make Build directory at ${chalk.underline.blue(regressionBuildPath)}\n`
|
|
)
|
|
);
|
|
await exec(`mkdir ${regressionBuildPath}`);
|
|
|
|
// Install all necessary React packages that have the same version
|
|
const downloadPackagesStr = INSTALL_PACKAGES.reduce(
|
|
(str, name) => `${str} ${name}@${version}`,
|
|
''
|
|
);
|
|
await exec(
|
|
`npm install --prefix ${REGRESSION_FOLDER} ${downloadPackagesStr}`
|
|
);
|
|
|
|
// If we shouldn't replace the build folder, we can stop here now
|
|
// before we modify anything
|
|
if (!shouldReplaceBuild) {
|
|
return;
|
|
}
|
|
|
|
// Remove all the packages that we downloaded in the original build folder
|
|
// so we can move the modules from the regression build over
|
|
const removePackagesStr = INSTALL_PACKAGES.reduce(
|
|
(str, name) => `${str} ${join(buildPath, name)}`,
|
|
''
|
|
);
|
|
console.log(
|
|
chalk.white(
|
|
`Removing ${removePackagesStr
|
|
.split(' ')
|
|
.map(str => chalk.underline.blue(str) + '\n')
|
|
.join(' ')}\n`
|
|
)
|
|
);
|
|
await exec(`rm -r ${removePackagesStr}`);
|
|
|
|
// Move all packages that we downloaded to the original build folder
|
|
// We need to separately move the scheduler package because it might
|
|
// be called schedule
|
|
const movePackageString = INSTALL_PACKAGES.reduce(
|
|
(str, name) => `${str} ${join(regressionBuildPath, 'node_modules', name)}`,
|
|
''
|
|
);
|
|
console.log(
|
|
chalk.white(
|
|
`Moving ${movePackageString
|
|
.split(' ')
|
|
.map(str => chalk.underline.blue(str) + '\n')
|
|
.join(' ')} to ${chalk.underline.blue(buildPath)}\n`
|
|
)
|
|
);
|
|
await exec(`mv ${movePackageString} ${buildPath}`);
|
|
|
|
// For React versions earlier than 18.0.0, we explicitly scheduler v0.20.1, which
|
|
// is the first version that has unstable_mock, which DevTools tests need, but also
|
|
// has Scheduler.unstable_trace, which, although we don't use in DevTools tests
|
|
// is imported by older React versions and will break if it's not there
|
|
if (semver.lte(semver.coerce(version).version, '18.0.0')) {
|
|
await exec(`npm install --prefix ${REGRESSION_FOLDER} scheduler@0.20.1`);
|
|
}
|
|
|
|
// In v16.5, scheduler is called schedule. We need to make sure we also move
|
|
// this over. Otherwise the code will break.
|
|
if (fs.existsSync(join(regressionBuildPath, 'node_modules', 'schedule'))) {
|
|
console.log(chalk.white(`Downloading schedule\n`));
|
|
await exec(
|
|
`mv ${join(regressionBuildPath, 'node_modules', 'schedule')} ${buildPath}`
|
|
);
|
|
} else {
|
|
console.log(chalk.white(`Downloading scheduler\n`));
|
|
await exec(`rm -r ${join(buildPath, 'scheduler')}`);
|
|
await exec(
|
|
`mv ${join(
|
|
regressionBuildPath,
|
|
'node_modules',
|
|
'scheduler'
|
|
)} ${buildPath}`
|
|
);
|
|
}
|
|
}
|
|
|
|
async function main() {
|
|
try {
|
|
if (!version) {
|
|
console.log(chalk.red('Must specify React version to download'));
|
|
return;
|
|
}
|
|
await downloadRegressionBuild();
|
|
} catch (e) {
|
|
console.log(chalk.red(e));
|
|
} finally {
|
|
// We shouldn't remove the regression-build folder unless we're using
|
|
// it to replace the build folder
|
|
if (shouldReplaceBuild) {
|
|
console.log(chalk.bold.white(`Removing regression build`));
|
|
await exec(`rm -r ${regressionBuildPath}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
main();
|