UNPKG

@electron-delta/builder

Version:
133 lines (113 loc) 3.53 kB
/* eslint-disable no-nested-ternary */ const fs = require("fs-extra"); const path = require("path"); const envPaths = require("env-paths"); const { extract7zip } = require("../utils"); const { downloadFile, safeSpawn } = require("../utils"); const defaultOptions = { logger: console, nsisURL: "https://github.com/electron-delta/nsis.zip/raw/main/nsis.zip", }; class DeltaInstallerBuilder { constructor(options) { this.options = { ...defaultOptions, ...options, }; this.defines = { APP_GUID: this.options.APP_GUID, PRODUCT_NAME: this.options.PRODUCT_NAME, PROCESS_NAME: this.options.PROCESS_NAME || this.options.PRODUCT_NAME, }; } get logger() { return this.options.logger; } async getNSISPath() { const paths = envPaths("electron-delta-bins"); const deltaBinsDir = process.platform === "win32" ? path.join(process.env.APPDATA, "electron-delta-bins") : paths.data; const nsisRootPath = path.join(deltaBinsDir, "nsis-3.0.5.0"); const makeNSISPath = path.join( nsisRootPath, process.platform === "darwin" ? "mac" : process.platform === "win32" ? "Bin" : "linux", process.platform === "win32" ? "makensis.exe" : "makensis" ); if (fs.existsSync(makeNSISPath)) { this.logger.log("Cache exists: ", makeNSISPath); return { makeNSISPath, nsisRootPath }; } await fs.ensureDir(deltaBinsDir); this.logger.log("Start downloading from", this.options.nsisURL); const filePath = await downloadFile( this.options.nsisURL, path.join(deltaBinsDir, "nsis.zip") ); this.logger.log("Downloaded ", filePath); await extract7zip(filePath, deltaBinsDir); return { makeNSISPath, nsisRootPath }; } static getNSISScript() { return path.resolve(path.join(__dirname, "./nsis/installer.nsi")); } getNSISArgs() { const args = []; Object.keys(this.defines).forEach((key) => { const value = this.defines[key]; args.push(`-D${key}=${value}`); }); return args; } async executeNSIS() { const args = this.getNSISArgs(); const { makeNSISPath, nsisRootPath } = await this.getNSISPath(); args.push(this.installerNSIPath); this.logger.log("NSIS args ", args); try { this.logger.log("Compiling with makensis ", this.installerNSIPath); await safeSpawn(makeNSISPath, args, { cwd: path.dirname(this.installerNSIPath), env: { ...process.env, NSISDIR: nsisRootPath }, stdio: "inherit", }); return true; } catch (err) { this.logger.log(err); return false; } } async build({ installerOutputPath, deltaFilePath, deltaFileName, // newAppSize, // newAppVersion, productIconPath, }) { this.installerNSIPath = DeltaInstallerBuilder.getNSISScript(); this.defines.INSTALLER_OUTPUT_PATH = installerOutputPath; this.defines.DELTA_FILE_PATH = deltaFilePath; this.defines.DELTA_FILE_NAME = deltaFileName; // this.defines.NEW_APP_SIZE = newAppSize || 67540; // this.defines.NEW_APP_VERSION = newAppVersion; this.defines.PRODUCT_ICON_PATH = productIconPath; let created = false; try { created = await this.executeNSIS(); } catch (err) { console.error(err); } if (!created) { return null; } this.logger.log("EXE created: ", installerOutputPath); return installerOutputPath; } } module.exports = DeltaInstallerBuilder;