-
Notifications
You must be signed in to change notification settings - Fork 212
/
Copy pathupdate-electron.js
138 lines (114 loc) · 4.43 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
138
'use strict';
const semver = require('semver');
const fetch = require('make-fetch-happen');
const fs = require('fs');
const path = require('path');
const { listAllPackages } = 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
);
// TODO(COMPASS-9098): Latest version of node-abi depends on Node.js 22. We are on 20 and will stay on this version until our version of Electron is updated along with the monorepo expected engines version. Uncomment this when we can update
// 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);
for await (const props of listAllPackages()) {
const packageJsonPath = path.resolve(props.location, 'package.json');
updatePackageVersions(packageJsonPath, newVersions);
}
console.log('Cleaning node_modules and rebootstrapping');
cleanAndBootstrap(newVersions);
}
main();