UNPKG

@electron-forge/core

Version:

A complete tool for building modern Electron applications

257 lines 22.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.listrMake = void 0; const path_1 = __importDefault(require("path")); const core_utils_1 = require("@electron-forge/core-utils"); const maker_base_1 = require("@electron-forge/maker-base"); const get_1 = require("@electron/get"); const chalk_1 = __importDefault(require("chalk")); const filenamify_1 = __importDefault(require("filenamify")); const fs_extra_1 = __importDefault(require("fs-extra")); const listr2_1 = require("listr2"); const log_symbols_1 = __importDefault(require("log-symbols")); const forge_config_1 = __importDefault(require("../util/forge-config")); const hook_1 = require("../util/hook"); const out_dir_1 = __importDefault(require("../util/out-dir")); const parse_archs_1 = __importDefault(require("../util/parse-archs")); 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 package_1 = require("./package"); // eslint-disable-next-line @typescript-eslint/no-explicit-any class MakerImpl extends maker_base_1.MakerBase { constructor() { super(...arguments); this.name = 'impl'; this.defaultPlatforms = []; } } function generateTargets(forgeConfig, overrideTargets) { if (overrideTargets) { return overrideTargets.map((target) => { if (typeof target === 'string') { return forgeConfig.makers.find((maker) => maker.name === target) || { name: target }; } return target; }); } return forgeConfig.makers; } // eslint-disable-next-line @typescript-eslint/no-explicit-any function isElectronForgeMaker(target) { // eslint-disable-next-line @typescript-eslint/no-explicit-any return target.__isElectronForgeMaker; } const listrMake = ({ dir: providedDir = process.cwd(), interactive = false, skipPackage = false, arch = (0, get_1.getHostArch)(), platform = process.platform, overrideTargets, outDir, }, receiveMakeResults) => { const listrOptions = { concurrent: false, rendererOptions: { collapse: false, collapseErrors: false, }, rendererSilent: !interactive, rendererFallback: Boolean(process.env.DEBUG && process.env.DEBUG.includes('electron-forge')), }; const runner = new listr2_1.Listr([ { title: 'Loading configuration', task: async (ctx) => { const resolvedDir = await (0, resolve_dir_1.default)(providedDir); if (!resolvedDir) { throw new Error('Failed to locate startable Electron application'); } ctx.dir = resolvedDir; ctx.forgeConfig = await (0, forge_config_1.default)(resolvedDir); }, }, { title: 'Resolving make targets', task: async (ctx, task) => { const { dir, forgeConfig } = ctx; ctx.actualOutDir = outDir || (0, out_dir_1.default)(dir, forgeConfig); if (!['darwin', 'win32', 'linux', 'mas'].includes(platform)) { throw new Error(`'${platform}' is an invalid platform. Choices are 'darwin', 'mas', 'win32' or 'linux'.`); } // eslint-disable-next-line @typescript-eslint/no-explicit-any const makers = []; const possibleMakers = generateTargets(forgeConfig, overrideTargets); for (const possibleMaker of possibleMakers) { /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ let maker; if (isElectronForgeMaker(possibleMaker)) { maker = possibleMaker; if (!maker.platforms.includes(platform)) continue; } else { const resolvableTarget = possibleMaker; // non-false falsy values should be 'true' if (resolvableTarget.enabled === false) continue; if (!resolvableTarget.name) { throw new Error(`The following maker config is missing a maker name: ${JSON.stringify(resolvableTarget)}`); } else if (typeof resolvableTarget.name !== 'string') { throw new Error(`The following maker config has a maker name that is not a string: ${JSON.stringify(resolvableTarget)}`); } const MakerClass = (0, require_search_1.default)(dir, [resolvableTarget.name]); if (!MakerClass) { throw new Error(`Could not find module with name '${resolvableTarget.name}'. If this is a package from NPM, make sure it's listed in the devDependencies of your package.json. If this is a local module, make sure you have the correct path to its entry point. Try using the DEBUG="electron-forge:require-search" environment variable for more information.`); } maker = new MakerClass(resolvableTarget.config, resolvableTarget.platforms || undefined); if (!maker.platforms.includes(platform)) continue; } if (!maker.isSupportedOnCurrentPlatform) { throw new Error([ `Maker for target ${maker.name} is incompatible with this version of `, 'Electron Forge, please upgrade or contact the maintainer ', "(needs to implement 'isSupportedOnCurrentPlatform)')", ].join('')); } if (!maker.isSupportedOnCurrentPlatform()) { throw new Error(`Cannot make for ${platform} and target ${maker.name}: the maker declared that it cannot run on ${process.platform}.`); } maker.ensureExternalBinariesExist(); makers.push(maker); } if (makers.length === 0) { throw new Error(`Could not find any make targets configured for the "${platform}" platform.`); } ctx.makers = makers; task.output = `Making for the following targets: ${chalk_1.default.magenta(`${makers.map((maker) => maker.name).join(', ')}`)}`; }, options: { persistentOutput: true, }, }, { title: `Running ${chalk_1.default.yellow('package')} command`, task: async (ctx, task) => { if (!skipPackage) { return (0, package_1.listrPackage)({ dir: ctx.dir, interactive, arch, outDir: ctx.actualOutDir, platform, }); } else { task.output = chalk_1.default.yellow(`${log_symbols_1.default.warning} Skipping could result in an out of date build`); task.skip(); } }, options: { persistentOutput: true, }, }, { title: `Running ${chalk_1.default.yellow('preMake')} hook`, task: async (ctx, task) => { return task.newListr(await (0, hook_1.getHookListrTasks)(ctx.forgeConfig, 'preMake')); }, }, { title: 'Making distributables', task: async (ctx, task) => { const { actualOutDir, dir, forgeConfig, makers } = ctx; const packageJSON = await (0, read_package_json_1.readMutatedPackageJson)(dir, forgeConfig); const appName = (0, filenamify_1.default)(forgeConfig.packagerConfig.name || packageJSON.productName || packageJSON.name, { replacement: '-' }); const outputs = []; ctx.outputs = outputs; const subRunner = task.newListr([], { ...listrOptions, rendererOptions: { collapse: false, collapseErrors: false, }, }); for (const targetArch of (0, parse_archs_1.default)(platform, arch, await (0, core_utils_1.getElectronVersion)(dir, packageJSON))) { const packageDir = path_1.default.resolve(actualOutDir, `${appName}-${platform}-${targetArch}`); if (!(await fs_extra_1.default.pathExists(packageDir))) { throw new Error(`Couldn't find packaged app at: ${packageDir}`); } for (const maker of makers) { subRunner.add({ title: `Making a ${chalk_1.default.magenta(maker.name)} distributable for ${chalk_1.default.cyan(`${platform}/${targetArch}`)}`, task: async () => { try { /** * WARNING: DO NOT ATTEMPT TO PARALLELIZE MAKERS * * Currently it is assumed we have 1 maker per make call but that is * not enforced. It is technically possible to have 1 maker be called * multiple times. The "prepareConfig" method however implicitly * requires a lock that is not enforced. There are two options: * * * Provide makers a getConfig() method * * Remove support for config being provided as a method * * Change the entire API of maker from a single constructor to * providing a MakerFactory */ maker.prepareConfig(targetArch); const artifacts = await maker.make({ appName, forgeConfig, packageJSON, targetArch, dir: packageDir, makeDir: path_1.default.resolve(actualOutDir, 'make'), targetPlatform: platform, }); outputs.push({ artifacts, packageJSON, platform, arch: targetArch, }); } catch (err) { if (err) { throw err; } else { throw new Error(`An unknown error occurred while making for target: ${maker.name}`); } } }, options: { showTimer: true, }, }); } } return subRunner; }, }, { title: `Running ${chalk_1.default.yellow('postMake')} hook`, task: async (ctx, task) => { // If the postMake hooks modifies the locations / names of the outputs it must return // the new locations so that the publish step knows where to look ctx.outputs = await (0, hook_1.runMutatingHook)(ctx.forgeConfig, 'postMake', ctx.outputs); receiveMakeResults === null || receiveMakeResults === void 0 ? void 0 : receiveMakeResults(ctx.outputs); task.output = `Artifacts available at: ${chalk_1.default.green(path_1.default.resolve(ctx.actualOutDir, 'make'))}`; }, options: { persistentOutput: true, }, }, ], { ...listrOptions, ctx: {}, }); return runner; }; exports.listrMake = listrMake; const make = async (opts) => { const runner = (0, exports.listrMake)(opts); await runner.run(); return runner.ctx.outputs; }; exports.default = make; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWFrZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnREFBd0I7QUFFeEIsMkRBQWdFO0FBQ2hFLDJEQUF1RDtBQUV2RCx1Q0FBNEM7QUFDNUMsa0RBQTBCO0FBQzFCLDREQUFvQztBQUNwQyx3REFBMEI7QUFDMUIsbUNBQStCO0FBQy9CLDhEQUFxQztBQUVyQyx3RUFBa0Q7QUFDbEQsdUNBQWtFO0FBQ2xFLDhEQUErQztBQUMvQyxzRUFBNkM7QUFDN0MsaUVBQW1FO0FBQ25FLDRFQUFtRDtBQUNuRCxzRUFBNkM7QUFFN0MsdUNBQXlDO0FBRXpDLDhEQUE4RDtBQUM5RCxNQUFNLFNBQVUsU0FBUSxzQkFBYztJQUF0Qzs7UUFDRSxTQUFJLEdBQUcsTUFBTSxDQUFDO1FBRWQscUJBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7Q0FBQTtBQUlELFNBQVMsZUFBZSxDQUFDLFdBQWdDLEVBQUUsZUFBNkI7SUFDdEYsSUFBSSxlQUFlLEVBQUU7UUFDbkIsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFFLEtBQStCLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBNEIsQ0FBQzthQUM1STtZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUM7QUFDNUIsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxTQUFTLG9CQUFvQixDQUFDLE1BQWdDO0lBQzVELDhEQUE4RDtJQUM5RCxPQUFRLE1BQXlCLENBQUMsc0JBQXNC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