67 lines
2 KiB
JavaScript
67 lines
2 KiB
JavaScript
const childProcess = require('child_process');
|
|
const fs = require('fs');
|
|
const os = require('os');
|
|
const path = require('path');
|
|
|
|
function getPlatformPath() {
|
|
const platform = process.env.npm_config_platform || os.platform();
|
|
|
|
switch (platform) {
|
|
case 'mas':
|
|
case 'darwin':
|
|
return 'Electron.app/Contents/MacOS/Electron';
|
|
case 'freebsd':
|
|
case 'openbsd':
|
|
case 'linux':
|
|
return 'electron';
|
|
case 'win32':
|
|
return 'electron.exe';
|
|
default:
|
|
throw new Error(`Electron builds are not available on platform: ${platform}`);
|
|
}
|
|
}
|
|
|
|
function getElectronPaths(electronDir, platformPath) {
|
|
const pathFile = path.join(electronDir, 'path.txt');
|
|
const distPath = process.env.ELECTRON_OVERRIDE_DIST_PATH || path.join(electronDir, 'dist');
|
|
const executablePath = path.join(distPath, platformPath);
|
|
|
|
return { executablePath, pathFile };
|
|
}
|
|
|
|
function ensurePathFile(electronDir, platformPath) {
|
|
const { pathFile } = getElectronPaths(electronDir, platformPath);
|
|
|
|
const currentPath = fs.existsSync(pathFile) ? fs.readFileSync(pathFile, 'utf8') : '';
|
|
if (currentPath !== platformPath) {
|
|
fs.writeFileSync(pathFile, platformPath);
|
|
}
|
|
}
|
|
|
|
function runElectronInstaller(installPath) {
|
|
const result = childProcess.spawnSync(process.execPath, [installPath], {
|
|
stdio: 'inherit',
|
|
env: process.env,
|
|
});
|
|
|
|
if (result.status !== 0) {
|
|
throw new Error(`Electron installer failed with exit code ${result.status ?? 'unknown'}`);
|
|
}
|
|
}
|
|
|
|
const electronPackagePath = require.resolve('electron/package.json');
|
|
const electronDir = path.dirname(electronPackagePath);
|
|
const installPath = path.join(electronDir, 'install.js');
|
|
const platformPath = getPlatformPath();
|
|
const { executablePath, pathFile } = getElectronPaths(electronDir, platformPath);
|
|
|
|
if (!fs.existsSync(executablePath)) {
|
|
runElectronInstaller(installPath);
|
|
}
|
|
|
|
ensurePathFile(electronDir, platformPath);
|
|
|
|
if (!fs.existsSync(executablePath)) {
|
|
console.warn(`Electron binary is missing after install: ${executablePath}`);
|
|
console.warn(`Wrote Electron import marker: ${pathFile}`);
|
|
}
|