Skip to content

Commit 2c28686

Browse files
gaearonakstuhl
authored andcommitted
Fix the script replacing local deps (facebook#3876)
1 parent f0f9092 commit 2c28686

File tree

2 files changed

+64
-79
lines changed

2 files changed

+64
-79
lines changed

tasks/cra.js

Lines changed: 64 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ const cp = require('child_process');
1414

1515
const cleanup = () => {
1616
console.log('Cleaning up.');
17+
// Reset changes made to package.json files.
18+
cp.execSync(`git checkout -- packages/*/package.json`);
1719
// Uncomment when snapshot testing is enabled by default:
1820
// rm ./template/src/__snapshots__/App.test.js.snap
1921
};
@@ -25,7 +27,8 @@ const handleExit = () => {
2527
};
2628

2729
const handleError = e => {
28-
console.error('ERROR! An error was encountered while executing\n', e);
30+
console.error('ERROR! An error was encountered while executing');
31+
console.error(e);
2932
cleanup();
3033
console.log('Exiting with error.');
3134
process.exit(1);
@@ -34,69 +37,81 @@ const handleError = e => {
3437
process.on('SIGINT', handleExit);
3538
process.on('uncaughtException', handleError);
3639

37-
// ******************************************************************************
38-
// Pack react- scripts so we can verify they work.
39-
// ******************************************************************************
40+
console.log();
41+
console.log('-------------------------------------------------------');
42+
console.log('Assuming you have already run `yarn` to update the deps.');
43+
console.log('If not, remember to do this before testing!');
44+
console.log('-------------------------------------------------------');
45+
console.log();
4046

41-
const rootDir = path.join(__dirname, '..');
42-
const reactScriptsDir = path.join(rootDir, 'packages', 'react-scripts');
43-
const packageJsonPath = path.join(reactScriptsDir, 'package.json');
44-
const packageJsonOrigPath = path.join(reactScriptsDir, 'package.json.orig');
45-
46-
// Install all our packages
47-
const lernaPath = path.join(rootDir, 'node_modules', '.bin', 'lerna');
48-
cp.execSync(`${lernaPath} bootstrap`, {
49-
cwd: rootDir,
50-
stdio: 'inherit',
51-
});
47+
// Temporarily overwrite package.json of all packages in monorepo
48+
// to point to each other using absolute file:/ URLs.
5249

53-
// Save package.json because we're going to touch it
54-
fs.writeFileSync(packageJsonOrigPath, fs.readFileSync(packageJsonPath));
50+
const gitStatus = cp.execSync(`git status --porcelain`).toString();
5551

56-
// Replace own dependencies (those in the`packages` dir) with the local paths
57-
// of those packages
58-
const replaceOwnDepsPath = path.join(__dirname, 'replace-own-deps.js');
59-
cp.execSync(`node ${replaceOwnDepsPath}`, { stdio: 'inherit' });
52+
if (gitStatus.trim() !== '') {
53+
console.log('Please commit your changes before running this script!');
54+
console.log('Exiting because `git status` is not empty:');
55+
console.log();
56+
console.log(gitStatus);
57+
console.log();
58+
process.exit(1);
59+
}
60+
61+
const rootDir = path.join(__dirname, '..');
62+
const packagesDir = path.join(rootDir, 'packages');
63+
const packagePathsByName = {};
64+
fs.readdirSync(packagesDir).forEach(name => {
65+
const packageDir = path.join(packagesDir, name);
66+
const packageJson = path.join(packageDir, 'package.json');
67+
if (fs.existsSync(packageJson)) {
68+
packagePathsByName[name] = packageDir;
69+
}
70+
});
71+
Object.keys(packagePathsByName).forEach(name => {
72+
const packageJson = path.join(packagePathsByName[name], 'package.json');
73+
const json = JSON.parse(fs.readFileSync(packageJson, 'utf8'));
74+
Object.keys(packagePathsByName).forEach(otherName => {
75+
if (json.dependencies && json.dependencies[otherName]) {
76+
json.dependencies[otherName] = 'file:' + packagePathsByName[otherName];
77+
}
78+
if (json.devDependencies && json.devDependencies[otherName]) {
79+
json.devDependencies[otherName] = 'file:' + packagePathsByName[otherName];
80+
}
81+
if (json.peerDependencies && json.peerDependencies[otherName]) {
82+
json.peerDependencies[otherName] =
83+
'file:' + packagePathsByName[otherName];
84+
}
85+
if (json.optionalDependencies && json.optionalDependencies[otherName]) {
86+
json.optionalDependencies[otherName] =
87+
'file:' + packagePathsByName[otherName];
88+
}
89+
});
90+
91+
fs.writeFileSync(packageJson, JSON.stringify(json, null, 2), 'utf8');
92+
console.log(
93+
'Replaced local dependencies in packages/' + name + '/package.json'
94+
);
95+
});
96+
console.log('Replaced all local dependencies for testing.');
97+
console.log('Do not edit any package.json while this task is running.');
6098

61-
// Finally, pack react-scripts
99+
// Finally, pack react-scripts.
62100
// Don't redirect stdio as we want to capture the output that will be returned
63101
// from execSync(). In this case it will be the .tgz filename.
64102
const scriptsFileName = cp
65-
.execSync(`npm pack`, { cwd: reactScriptsDir })
103+
.execSync(`npm pack`, { cwd: path.join(packagesDir, 'react-scripts') })
66104
.toString()
67105
.trim();
68-
const scriptsPath = path.join(
69-
rootDir,
70-
'packages',
71-
'react-scripts',
72-
scriptsFileName
73-
);
74-
75-
// Restore package.json
76-
fs.unlinkSync(packageJsonPath);
77-
fs.writeFileSync(packageJsonPath, fs.readFileSync(packageJsonOrigPath));
78-
fs.unlinkSync(packageJsonOrigPath);
106+
const scriptsPath = path.join(packagesDir, 'react-scripts', scriptsFileName);
79107

80-
// ******************************************************************************
81108
// Now that we have packed them, call the global CLI.
82-
// ******************************************************************************
83-
84-
// If Yarn is installed, clean its cache because it may have cached react-scripts
85-
try {
86-
cp.execSync('yarn cache clean');
87-
} catch (e) {
88-
// We can safely ignore this as the user doesn't have yarn installed
89-
}
109+
cp.execSync('yarn cache clean');
90110

91111
const args = process.argv.slice(2);
92112

93113
// Now run the CRA command
94-
const craScriptPath = path.join(
95-
rootDir,
96-
'packages',
97-
'create-react-app',
98-
'index.js'
99-
);
114+
const craScriptPath = path.join(packagesDir, 'create-react-app', 'index.js');
100115
cp.execSync(
101116
`node ${craScriptPath} --scripts-version="${scriptsPath}" ${args.join(' ')}`,
102117
{

tasks/replace-own-deps.js

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

0 commit comments

Comments
 (0)