UNPKG

@electron-forge/core

Version:

A complete tool for building modern Electron applications

349 lines 33.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.listrPackage = void 0; const path_1 = __importDefault(require("path")); const util_1 = require("util"); const core_utils_1 = require("@electron-forge/core-utils"); const get_1 = require("@electron/get"); const chalk_1 = __importDefault(require("chalk")); const debug_1 = __importDefault(require("debug")); const electron_packager_1 = __importDefault(require("electron-packager")); const fast_glob_1 = __importDefault(require("fast-glob")); const fs_extra_1 = __importDefault(require("fs-extra")); const listr2_1 = require("listr2"); const forge_config_1 = __importDefault(require("../util/forge-config")); const hook_1 = require("../util/hook"); const messages_1 = require("../util/messages"); const out_dir_1 = __importDefault(require("../util/out-dir")); const read_package_json_1 = require("../util/read-package-json"); const require_search_1 = __importDefault(require("../util/require-search")); const resolve_dir_1 = __importDefault(require("../util/resolve-dir")); const d = (0, debug_1.default)('electron-forge:packager'); /** * Resolves hooks if they are a path to a file (instead of a `Function`). */ function resolveHooks(hooks, dir) { if (hooks) { return hooks.map((hook) => (typeof hook === 'string' ? (0, require_search_1.default)(dir, [hook]) : hook)); } return []; } /** * Runs given hooks sequentially by mapping them to promises and iterating * through while awaiting */ function sequentialHooks(hooks) { return [ async (buildPath, electronVersion, platform, arch, done) => { for (const hook of hooks) { try { await (0, util_1.promisify)(hook)(buildPath, electronVersion, platform, arch); } catch (err) { d('hook failed:', hook.toString(), err); return done(err); } } done(); }, ]; } function sequentialFinalizePackageTargetsHooks(hooks) { return [ async (targets, done) => { for (const hook of hooks) { try { await (0, util_1.promisify)(hook)(targets); } catch (err) { return done(err); } } done(); }, ]; } const listrPackage = ({ dir: providedDir = process.cwd(), interactive = false, arch = (0, get_1.getHostArch)(), platform = process.platform, outDir, }) => { const runner = new listr2_1.Listr([ { title: 'Preparing to package application', task: async (ctx) => { const resolvedDir = await (0, resolve_dir_1.default)(providedDir); if (!resolvedDir) { throw new Error('Failed to locate compilable Electron application'); } ctx.dir = resolvedDir; ctx.forgeConfig = await (0, forge_config_1.default)(resolvedDir); ctx.packageJSON = await (0, read_package_json_1.readMutatedPackageJson)(resolvedDir, ctx.forgeConfig); if (!ctx.packageJSON.main) { throw new Error('packageJSON.main must be set to a valid entry point for your Electron app'); } ctx.calculatedOutDir = outDir || (0, out_dir_1.default)(resolvedDir, ctx.forgeConfig); }, }, { title: 'Running packaging hooks', task: async ({ forgeConfig }, task) => { return task.newListr([ { title: `Running ${chalk_1.default.yellow('generateAssets')} hook`, task: async (_, task) => { return task.newListr(await (0, hook_1.getHookListrTasks)(forgeConfig, 'generateAssets', platform, arch)); }, }, { title: `Running ${chalk_1.default.yellow('prePackage')} hook`, task: async (_, task) => { return task.newListr(await (0, hook_1.getHookListrTasks)(forgeConfig, 'prePackage', platform, arch)); }, }, ]); }, }, { title: 'Packaging application', task: async (ctx, task) => { const { calculatedOutDir, forgeConfig, packageJSON } = ctx; const getTargetKey = (target) => `${target.platform}/${target.arch}`; task.output = 'Determining targets...'; let provideTargets; const targetsPromise = new Promise((resolve) => { provideTargets = resolve; }); const signalCopyDone = new Map(); const signalRebuildDone = new Map(); const signalPackageDone = new Map(); const rejects = []; const signalDone = (map, target) => { var _a, _b; (_b = (_a = map.get(getTargetKey(target))) === null || _a === void 0 ? void 0 : _a.pop()) === null || _b === void 0 ? void 0 : _b(); }; const addSignalAndWait = async (map, target) => { const targetKey = getTargetKey(target); await new Promise((resolve, reject) => { rejects.push(reject); map.set(targetKey, (map.get(targetKey) || []).concat([resolve])); }); }; const rebuildTasks = new Map(); const signalRebuildStart = new Map(); const afterFinalizePackageTargetsHooks = [ (targets, done) => { provideTargets(targets); done(); }, ...resolveHooks(forgeConfig.packagerConfig.afterFinalizePackageTargets, ctx.dir), ]; const pruneEnabled = !('prune' in forgeConfig.packagerConfig) || forgeConfig.packagerConfig.prune; const afterCopyHooks = [ async (buildPath, electronVersion, platform, arch, done) => { signalDone(signalCopyDone, { platform, arch }); done(); }, async (buildPath, electronVersion, pPlatform, pArch, done) => { const bins = await (0, fast_glob_1.default)(path_1.default.join(buildPath, '**/.bin/**/*')); for (const bin of bins) { await fs_extra_1.default.remove(bin); } done(); }, async (buildPath, electronVersion, pPlatform, pArch, done) => { await (0, hook_1.runHook)(forgeConfig, 'packageAfterCopy', buildPath, electronVersion, pPlatform, pArch); done(); }, async (buildPath, electronVersion, pPlatform, pArch, done) => { var _a, _b; const targetKey = getTargetKey({ platform: pPlatform, arch: pArch }); await (0, core_utils_1.listrCompatibleRebuildHook)(buildPath, electronVersion, pPlatform, pArch, forgeConfig.rebuildConfig, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion await rebuildTasks.get(targetKey).pop()); (_b = (_a = signalRebuildDone.get(targetKey)) === null || _a === void 0 ? void 0 : _a.pop()) === null || _b === void 0 ? void 0 : _b(); done(); }, async (buildPath, electronVersion, pPlatform, pArch, done) => { const copiedPackageJSON = await (0, read_package_json_1.readMutatedPackageJson)(buildPath, forgeConfig); if (copiedPackageJSON.config && copiedPackageJSON.config.forge) { delete copiedPackageJSON.config.forge; } await fs_extra_1.default.writeJson(path_1.default.resolve(buildPath, 'package.json'), copiedPackageJSON, { spaces: 2 }); done(); }, ...resolveHooks(forgeConfig.packagerConfig.afterCopy, ctx.dir), ]; const afterCompleteHooks = [ async (buildPath, electronVersion, pPlatform, pArch, done) => { var _a, _b; (_b = (_a = signalPackageDone.get(getTargetKey({ platform: pPlatform, arch: pArch }))) === null || _a === void 0 ? void 0 : _a.pop()) === null || _b === void 0 ? void 0 : _b(); done(); }, ]; const afterPruneHooks = []; if (pruneEnabled) { afterPruneHooks.push(...resolveHooks(forgeConfig.packagerConfig.afterPrune, ctx.dir)); } afterPruneHooks.push((async (buildPath, electronVersion, pPlatform, pArch, done) => { await (0, hook_1.runHook)(forgeConfig, 'packageAfterPrune', buildPath, electronVersion, pPlatform, pArch); done(); })); const afterExtractHooks = [ (async (buildPath, electronVersion, pPlatform, pArch, done) => { await (0, hook_1.runHook)(forgeConfig, 'packageAfterExtract', buildPath, electronVersion, pPlatform, pArch); done(); }), ]; afterExtractHooks.push(...resolveHooks(forgeConfig.packagerConfig.afterExtract, ctx.dir)); const packageOpts = { asar: false, overwrite: true, ignore: [/^\/out\//g], ...forgeConfig.packagerConfig, quiet: true, dir: ctx.dir, arch: arch, platform, afterFinalizePackageTargets: sequentialFinalizePackageTargetsHooks(afterFinalizePackageTargetsHooks), afterComplete: sequentialHooks(afterCompleteHooks), afterCopy: sequentialHooks(afterCopyHooks), afterExtract: sequentialHooks(afterExtractHooks), afterPrune: sequentialHooks(afterPruneHooks), out: calculatedOutDir, electronVersion: await (0, core_utils_1.getElectronVersion)(ctx.dir, packageJSON), }; packageOpts.quiet = true; if (packageOpts.all) { throw new Error('config.forge.packagerConfig.all is not supported by Electron Forge'); } if (!packageJSON.version && !packageOpts.appVersion) { (0, messages_1.warn)(interactive, chalk_1.default.yellow('Please set "version" or "config.forge.packagerConfig.appVersion" in your application\'s package.json so auto-updates work properly')); } if (packageOpts.prebuiltAsar) { throw new Error('config.forge.packagerConfig.prebuiltAsar is not supported by Electron Forge'); } d('packaging with options', packageOpts); ctx.packagerPromise = (0, electron_packager_1.default)(packageOpts); // Handle error by failing this task // rejects is populated by the reject handlers for every // signal based promise in every subtask ctx.packagerPromise.catch((err) => { for (const reject of rejects) reject(err); }); const targets = await targetsPromise; // Copy the resolved targets into the context for later ctx.targets = [...targets]; // If we are targetting a universal build we need to add the "fake" // x64 and arm64 builds into the list of targets so that we can // show progress for those for (const target of targets) { if (target.arch === 'universal') { targets.push({ platform: target.platform, arch: 'x64', forUniversal: true, }, { platform: target.platform, arch: 'arm64', forUniversal: true, }); } } // Populate rebuildTasks with promises that resolve with the rebuild tasks // that will eventually run for (const target of targets) { // Skip universal tasks as they do not have rebuild sub-tasks if (target.arch === 'universal') continue; const targetKey = getTargetKey(target); rebuildTasks.set(targetKey, (rebuildTasks.get(targetKey) || []).concat([ new Promise((resolve) => { signalRebuildStart.set(targetKey, (signalRebuildStart.get(targetKey) || []).concat([resolve])); }), ])); } d('targets:', targets); return task.newListr(targets.map((target) => target.arch === 'universal' ? { title: `Stitching ${chalk_1.default.cyan(`${target.platform}/x64`)} and ${chalk_1.default.cyan(`${target.platform}/arm64`)} into a ${chalk_1.default.green(`${target.platform}/universal`)} package`, task: async () => { await addSignalAndWait(signalPackageDone, target); }, options: { showTimer: true, }, } : { title: `Packaging for ${chalk_1.default.cyan(target.arch)} on ${chalk_1.default.cyan(target.platform)}${target.forUniversal ? chalk_1.default.italic(' (for universal package)') : ''}`, task: async (_, task) => { return task.newListr([ { title: 'Copying files', task: async () => { await addSignalAndWait(signalCopyDone, target); }, }, { title: 'Preparing native dependencies', task: async (_, task) => { var _a, _b; (_b = (_a = signalRebuildStart.get(getTargetKey(target))) === null || _a === void 0 ? void 0 : _a.pop()) === null || _b === void 0 ? void 0 : _b(task); await addSignalAndWait(signalRebuildDone, target); }, options: { persistentOutput: true, bottomBar: Infinity, showTimer: true, }, }, { title: 'Finalizing package', task: async () => { await addSignalAndWait(signalPackageDone, target); }, }, ], { rendererOptions: { collapse: true, collapseErrors: false } }); }, options: { showTimer: true, }, }), { concurrent: true, rendererOptions: { collapse: false, collapseErrors: false } }); }, }, { title: `Running ${chalk_1.default.yellow('postPackage')} hook`, task: async ({ packagerPromise, forgeConfig }, task) => { const outputPaths = await packagerPromise; d('outputPaths:', outputPaths); return task.newListr(await (0, hook_1.getHookListrTasks)(forgeConfig, 'postPackage', { arch, outputPaths, platform, })); }, }, ], { concurrent: false, rendererSilent: !interactive, rendererFallback: Boolean(process.env.DEBUG && process.env.DEBUG.includes('electron-forge')), rendererOptions: { collapse: false, collapseErrors: false, }, ctx: {}, }); return runner; }; exports.listrPackage = listrPackage; exports.default = async (opts) => { const runner = (0, exports.listrPackage)(opts); await runner.run(); const outputPaths = await runner.ctx.packagerPromise; return runner.ctx.targets.map((target, index) => ({ platform: target.platform, arch: target.arch, packagedPath: outputPaths[index], })); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcGFja2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnREFBd0I7QUFDeEIsK0JBQWlDO0FBRWpDLDJEQUE0RjtBQUU1Rix1Q0FBNEM7QUFDNUMsa0RBQTBCO0FBQzFCLGtEQUEwQjtBQUMxQiwwRUFBaUg7QUFDakgsMERBQTZCO0FBQzdCLHdEQUEwQjtBQUMxQixtQ0FBK0I7QUFFL0Isd0VBQWtEO0FBQ2xELHVDQUEwRDtBQUMxRCwrQ0FBd0M7QUFDeEMsOERBQStDO0FBQy9DLGlFQUFtRTtBQUNuRSw0RUFBbUQ7QUFDbkQsc0VBQTZDO0FBRTdDLE1BQU0sQ0FBQyxHQUFHLElBQUEsZUFBSyxFQUFDLHlCQUF5QixDQUFDLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxTQUFTLFlBQVksQ0FBbUIsS0FBaUMsRUFBRSxHQUFXO0lBQ3BGLElBQUksS0FBSyxFQUFFO1FBQ1QsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUUsSUFBQSx3QkFBYSxFQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDdEc7SUFFRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFNRDs7O0dBR0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFxQjtJQUM1QyxPQUFPO1FBQ0wsS0FBSyxFQUFFLFNBQWlCLEVBQUUsZUFBdUIsRUFBRSxRQUFnQixFQUFFLElBQVksRUFBRSxJQUFrQixFQUFFLEVBQUU7WUFDdkcsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7Z0JBQ3hCLElBQUk7b0JBQ0YsTUFBTSxJQUFBLGdCQUFTLEVBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLGVBQWUs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