@interopio/desktop-cli
Version:
CLI tool for setting up, building and packaging io.Connect Desktop projects
134 lines • 7.18 kB
JavaScript
;
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