-
Notifications
You must be signed in to change notification settings - Fork 10
/
updateReactNativeVersion.js
108 lines (96 loc) · 3.18 KB
/
updateReactNativeVersion.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
const fs = require('fs');
function updateDependencies(pkgJson, update) {
console.log('Changing package.json dependencies:');
for (const [pkg, value] of Object.entries(update.dependencies ?? {})) {
const old = pkgJson.dependencies[pkg];
if (old) {
console.log(` - ${pkg}: ${old} → ${value}`);
} else {
console.log(` - ${pkg}: ${value}`);
}
pkgJson.dependencies[pkg] = value;
}
for (const [pkg, value] of Object.entries(update.devDependencies ?? {})) {
const old = pkgJson.devDependencies[pkg];
if (old) {
console.log(` - ${pkg}: ${old} → ${value}`);
} else {
console.log(` - ${pkg}: ${value}`);
}
pkgJson.devDependencies[pkg] = value;
}
return pkgJson;
}
const REACT_NATIVE_SCOPE = '@react-native/';
/**
* Packages that are scoped under @react-native need a consistent version
*/
function normalizeReactNativeDeps(deps, version) {
const updated = {};
for (const key of Object.keys(deps ?? {}).filter((pkg) =>
pkg.startsWith(REACT_NATIVE_SCOPE),
)) {
updated[key] = version;
}
return updated;
}
async function main(version) {
const PKG_JSON_PATH = 'template/package.json';
// Update the react-native dependency if using the new @react-native-community/template.
// We can figure this out as it ships with react-native@1000.0.0 set to a dummy version.
let pkgJson = JSON.parse(fs.readFileSync(PKG_JSON_PATH, 'utf8'));
pkgJson = updateDependencies(pkgJson, {
dependencies: {
'react-native': version,
...normalizeReactNativeDeps(pkgJson.dependencies, version),
},
devDependencies: {
...normalizeReactNativeDeps(pkgJson.devDependencies, version),
},
});
let updated = JSON.stringify(pkgJson, null, 2);
console.log(
`\nWriting update template/package.json to ${PKG_JSON_PATH}:\n\n${updated}`,
);
fs.writeFileSync(PKG_JSON_PATH, updated);
// 2. Update the scripts.version field in the top level package.json. This lets us leverage
// the https://registry.npmjs.org/@react-native-community/template API:
//
// "name": "@react-native-community/template",
// "dist-tags": {
// ...
// "0.75-stable": "0.75.0-rc.0"
// },
// "versions": {
// "0.75.0-rc.0": {
// "name": "@react-native-community/template",
// "version": "0.75.0-rc.0",
// "scripts": {
// "version": "0.75.1"
// ...
// },
//
// We can then correlate earlier version of react-native with earlier template. Significantly
// none of this is 'user facing'.
const PKG_JSON_ROOT_PATH = './package.json';
pkgJson = JSON.parse(fs.readFileSync(PKG_JSON_ROOT_PATH, 'utf8'));
pkgJson.scripts ??= {};
pkgJson.scripts.version = version;
updated = JSON.stringify(pkgJson, null, 2);
console.log(
`\nWriting update package.json to ${PKG_JSON_ROOT_PATH}:\n\n${updated}`,
);
fs.writeFileSync(PKG_JSON_ROOT_PATH, updated);
}
if (require.main === module) {
if (process.argv.length < 3) {
console.log(`USAGE: updateReactNativeVersion.js <version>
Updates 'react-native' and '@react-native/' scoped packages to a common version within
the template.
`);
process.exit(1);
}
main(process.argv.pop()).catch((e) => {
throw e;
});
}