-
Notifications
You must be signed in to change notification settings - Fork 201
/
Copy pathupdate-electron.js
137 lines (113 loc) · 4.17 KB
/
update-electron.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
'use strict';
const semver = require('semver');
const fetch = require('make-fetch-happen');
const fs = require('fs');
const path = require('path');
const { forEachPackage } = require('@mongodb-js/monorepo-tools');
const { runInDir } = require('./run-in-dir');
async function cleanAndBootstrap(newVersions) {
try {
await runInDir("npx lerna exec 'rm -Rf node_modules'");
await runInDir('rm -Rf node_modules');
const packageJsonBkp = fs.readFileSync('./package.json');
await runInDir('npm i');
// Make sure all new deps are hoisted on the root
const versionsToInstall = Object.entries(newVersions)
.map(([name, version]) => {
return `${name}@${version}`;
})
.join(' ');
await runInDir(`npm i ${versionsToInstall}`);
await runInDir('npm run bootstrap');
fs.writeFileSync('./package.json', packageJsonBkp);
// Run install again to make sure root level electron is removed from
// package-lock
await runInDir('npm i');
} catch (error) {
console.error(`Error running command: ${error}`);
}
}
function updatePackageVersions(packageJsonPath, newVersions) {
// Load the package.json file
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
// Update the dependencies
[
'dependencies',
'devDependencies',
'peerDependencies',
'optionalDependencies',
].forEach((depType) => {
if (packageJson[depType]) {
Object.entries(packageJson[depType]).forEach(([packageName]) => {
if (packageJson[depType][packageName]) {
packageJson[depType][packageName] =
newVersions[packageName] || packageJson[depType][packageName];
}
});
}
});
// Write the updated package.json file
fs.writeFileSync(
packageJsonPath,
`${JSON.stringify(packageJson, null, 2)}\n`
);
}
async function getLatestVersion(packageName) {
const output = await runInDir(`npm view ${packageName} version`);
const latestVersion = output.stdout.trim();
return latestVersion;
}
async function getLatestElectronVersionThatSatisfies(electronRange) {
const releasesUrl = 'https://releases.electronjs.org/releases.json';
const response = await fetch(releasesUrl);
const releases = await response.json();
// Filter the releases to exclude any pre-releases and those that don't match the Electron version range
const filteredReleases = releases.filter(
(release) =>
!semver.prerelease(release.version) &&
semver.satisfies(release.version, electronRange)
);
// Sort the filtered releases by version number in descending order
filteredReleases.sort((a, b) => semver.rcompare(a.version, b.version));
const latest = filteredReleases[0].version;
console.log(
`latest electron version that satisfies ${electronRange}: ${latest}`
);
return latest;
}
async function main() {
const majorVersion =
process.argv.slice(2)[1] ??
semver.minVersion(require('electron/package.json').version).major;
const electronVersionRange = `${majorVersion}.x`;
const latestElectronVersion = await getLatestElectronVersionThatSatisfies(
electronVersionRange
);
const latestNodeAbiVersion = await getLatestVersion('node-abi');
const latestElectronRemoteVersion = await getLatestVersion(
'@electron/remote'
);
const latestElectronRebuildVersion = await getLatestVersion(
'@electron/rebuild'
);
const latestBrowserslistVersion = await getLatestVersion('browserslist');
const latestElectronToChromiumVersion = await getLatestVersion(
'electron-to-chromium'
);
const newVersions = {
'node-abi': `^${latestNodeAbiVersion}`,
'@electron/remote': `^${latestElectronRemoteVersion}`,
'@electron/rebuild': `^${latestElectronRebuildVersion}`,
electron: `^${latestElectronVersion}`,
'electron-to-chromium': `^${latestElectronToChromiumVersion}`,
browserslist: `^${latestBrowserslistVersion}`,
};
console.log('Updating the following packages:', newVersions);
forEachPackage((props) => {
const packageJsonPath = path.resolve(props.location, 'package.json');
updatePackageVersions(packageJsonPath, newVersions);
});
console.log('Cleaning node_modules and rebootstrapping');
cleanAndBootstrap(newVersions);
}
main();