UNPKG

@interopio/desktop-cli

Version:

CLI tool for setting up, building and packaging io.Connect Desktop projects

134 lines 7.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createPackageWithElectronForge = createPackageWithElectronForge; const logger_1 = require("../../../utils/logger"); const core_1 = require("@electron-forge/core"); const path_1 = require("../../../utils/path"); const fs_extra_1 = require("fs-extra"); const path_2 = require("path"); const config_service_1 = require("../../config/config.service"); const file_1 = require("../../../utils/file"); const fs_1 = require("fs"); const promises_1 = require("fs/promises"); const pacakge_json_helper_1 = require("../../../utils/pacakge.json.helper"); const os_1 = require("os"); const logger = logger_1.Logger.getInstance(); async function createPackageWithElectronForge() { logger.info('Creating installers package with electron-forge...'); // copy PathUtils.getIOCDDir() to PathUtils.getDistDir() in a folder called <name>-<platform>-<arch>/ const projectDir = path_1.PathUtils.getIOCDDir(); const appPackageTempDir = (0, path_2.join)(path_1.PathUtils.getDistDir(), `${config_service_1.ConfigManager.config.productName}-${process.platform}-${process.arch}`); logger.debug(`Copying prepackaged app from ${projectDir} to ${appPackageTempDir}`); if ((0, fs_extra_1.existsSync)(appPackageTempDir)) { await (0, fs_1.rmSync)(appPackageTempDir, { recursive: true }); } await (0, promises_1.cp)(projectDir, appPackageTempDir, { recursive: true }); logger.debug(`Copied prepackaged app to ${appPackageTempDir} successfully!`); const electronVersion = await getElectronVersionFromComponent(); if (!electronVersion) { throw new Error('Electron version not found in iocd component metadata'); } // copy license from root dir to outDir const licenseSrc = (0, path_2.join)(path_1.PathUtils.getRootDir(), 'LICENSE'); const licenseDest = (0, path_2.join)(appPackageTempDir, 'LICENSE'); if (await file_1.FileUtils.exists(licenseSrc)) { (0, fs_1.cpSync)(licenseSrc, licenseDest); logger.debug('Copied LICENSE to packaged app'); } logger.debug(`Using Electron version: ${electronVersion}`); // read forge config from ./forge.config.js const forgeConfigPath = (0, path_2.join)(path_1.PathUtils.getRootDir(), 'forge.config.js'); let overrideTargets; if ((0, fs_extra_1.existsSync)(forgeConfigPath)) { const forgeConfig = require(forgeConfigPath); overrideTargets = forgeConfig.makers.map((t) => { const config = config_service_1.ConfigManager.config; const packageJSON = pacakge_json_helper_1.PackageJSONHelper.getPackageJson(); const ioAssetsDir = path_1.PathUtils.getIOCDAssetsDir(); let icon = (0, path_2.join)(ioAssetsDir, 'images', 'logo.ico'); if (t.name === '@electron-forge/maker-squirrel') { return { name: '@electron-forge/maker-squirrel', config: { // iconUrl: icon, // needs to be HTTPs; displayed in Control Panel ➡ Programs and Features. exe: config.win.exe.exeName, // * The name of your app's main `.exe` file. // keep this concise setupIcon: icon, setupExe: `${(0, path_2.basename)(config.win.exe.exeName).replace(".exe", "")}-Setup.exe`, version: packageJSON.version, // Optional: ensure Squirrel uses your short product name name: config.productName, // used for package IDs authors: packageJSON.author, // The `authors` value for the NuGet package metadata. owners: packageJSON.author, // The `owners` value for the NuGet package metadata. copyRight: config.copyright, // The `copyright` value for the NuGet package metadata. title: config.productDisplayName, // used as install window title description: config.productDescription, // used in Control Panel ➡ Programs and Features. noMSI: true, ...t.config ?? {}, // Keep the nuspect template nuspecTemplate: "config/win-build/template.nuspectemplate", usePackageJson: false, } }; } return t; }); } // If your app is already prepackaged & signed internally, tell Forge to skip packaging const makeOptions = { dir: appPackageTempDir, skipPackage: true, // <— consume prepackaged app in out/<name>-<platform>-<arch>/ outDir: path_1.PathUtils.getDistDir(), // default is fine if you used Forge before }; if (overrideTargets) { makeOptions.overrideTargets = overrideTargets; } logger.debug('Calling make with options:', JSON.stringify(makeOptions, null, 2)); const makeResults = await core_1.api.make(makeOptions); logger.debug('Make done results:', JSON.stringify(makeResults, null, 2)); if ((0, os_1.platform)() === "win32") { logger.debug("Signing installer files"); const signBinary = require("../windows.helper").signBinary; // Sign all produced installer artifacts BEFORE publishing for (const result of makeResults) { for (const artifact of result.artifacts) { // artifact is a full path to e.g. Setup.exe / .msi / .dmg / .zip await signBinary(artifact); } } logger.debug("Signed installer files successfully!"); } // // Now publish (GitHub/S3/etc. configured in forge.config.js) // await api.publish({ // dir: projectDir, // makeResults, // pass the results we just signed // // publishTargets: ["github"], // or rely on forge.config.js publishers // // dryRun: false, // }); // remove the temp app package dir if ((0, fs_extra_1.existsSync)(appPackageTempDir)) { await (0, fs_1.rmSync)(appPackageTempDir, { recursive: true }); } logger.info('Created installers successfully!'); } async function getElectronVersionFromComponent() { try { const resourcesDir = path_1.PathUtils.getIOCDResourcesDir(); const metadataPath = (0, path_2.join)(resourcesDir, 'metadata.json'); if (!(await file_1.FileUtils.exists(metadataPath))) { logger.debug('No iocd component metadata found, skipping electron version detection'); return null; } const metadata = await (0, fs_extra_1.readJson)(metadataPath); if (metadata && metadata.electronVersion) { return metadata.electronVersion; } logger.debug('No electron version found in iocd component metadata'); return null; } catch (error) { logger.debug(`Failed to read electron version from component: ${error instanceof Error ? error.message : String(error)}`); return null; } } //# sourceMappingURL=electronForge.js.map