diff options
Diffstat (limited to 'desktop/node_modules/electron/install.js')
-rw-r--r-- | desktop/node_modules/electron/install.js | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/desktop/node_modules/electron/install.js b/desktop/node_modules/electron/install.js new file mode 100644 index 0000000..8fb438e --- /dev/null +++ b/desktop/node_modules/electron/install.js @@ -0,0 +1,107 @@ +#!/usr/bin/env node + +const { version } = require('./package'); + +const childProcess = require('child_process'); +const fs = require('fs'); +const os = require('os'); +const path = require('path'); +const extract = require('extract-zip'); +const { downloadArtifact } = require('@electron/get'); + +if (process.env.ELECTRON_SKIP_BINARY_DOWNLOAD) { + process.exit(0); +} + +const platformPath = getPlatformPath(); + +if (isInstalled()) { + process.exit(0); +} + +const platform = process.env.npm_config_platform || process.platform; +let arch = process.env.npm_config_arch || process.arch; + +if (platform === 'darwin' && process.platform === 'darwin' && arch === 'x64' && + process.env.npm_config_arch === undefined) { + // When downloading for macOS ON macOS and we think we need x64 we should + // check if we're running under rosetta and download the arm64 version if appropriate + try { + const output = childProcess.execSync('sysctl -in sysctl.proc_translated'); + if (output.toString().trim() === '1') { + arch = 'arm64'; + } + } catch { + // Ignore failure + } +} + +// downloads if not cached +downloadArtifact({ + version, + artifactName: 'electron', + force: process.env.force_no_cache === 'true', + cacheRoot: process.env.electron_config_cache, + checksums: process.env.electron_use_remote_checksums ? undefined : require('./checksums.json'), + platform, + arch +}).then(extractFile).catch(err => { + console.error(err.stack); + process.exit(1); +}); + +function isInstalled () { + try { + if (fs.readFileSync(path.join(__dirname, 'dist', 'version'), 'utf-8').replace(/^v/, '') !== version) { + return false; + } + + if (fs.readFileSync(path.join(__dirname, 'path.txt'), 'utf-8') !== platformPath) { + return false; + } + } catch (ignored) { + return false; + } + + const electronPath = process.env.ELECTRON_OVERRIDE_DIST_PATH || path.join(__dirname, 'dist', platformPath); + + return fs.existsSync(electronPath); +} + +// unzips and makes path.txt point at the correct executable +function extractFile (zipPath) { + const distPath = process.env.ELECTRON_OVERRIDE_DIST_PATH || path.join(__dirname, 'dist'); + + return extract(zipPath, { dir: path.join(__dirname, 'dist') }).then(() => { + // If the zip contains an "electron.d.ts" file, + // move that up + const srcTypeDefPath = path.join(distPath, 'electron.d.ts'); + const targetTypeDefPath = path.join(__dirname, 'electron.d.ts'); + const hasTypeDefinitions = fs.existsSync(srcTypeDefPath); + + if (hasTypeDefinitions) { + fs.renameSync(srcTypeDefPath, targetTypeDefPath); + } + + // Write a "path.txt" file. + return fs.promises.writeFile(path.join(__dirname, 'path.txt'), platformPath); + }); +} + +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); + } +} |