UNPKG

@electron-forge/core

Version:

A complete tool for building modern Electron applications

266 lines 26.4 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 node_path_1 = __importDefault(require("node:path")); const get_1 = require("@electron/get"); const core_utils_1 = require("@electron-forge/core-utils"); const tracer_1 = require("@electron-forge/tracer"); 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 import_search_1 = __importDefault(require("../util/import-search")); 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 resolve_dir_1 = __importDefault(require("../util/resolve-dir")); const package_1 = require("./package"); 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 = (childTrace, { dir: providedDir = process.cwd(), interactive = false, skipPackage = false, arch = (0, get_1.getHostArch)(), platform = process.platform, overrideTargets, outDir, }, receiveMakeResults) => { const listrOptions = { concurrent: false, rendererOptions: { collapseSubtasks: false, collapseErrors: false, }, silentRendererCondition: !interactive, fallbackRendererCondition: Boolean(process.env.DEBUG) || Boolean(process.env.CI), }; const runner = new listr2_1.Listr([ { title: 'Loading configuration', task: childTrace({ name: 'load-forge-config', category: '@electron-forge/core' }, 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: childTrace({ name: 'resolve-make-targets', category: '@electron-forge/core' }, 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 = await (0, import_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.clone()); } 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(', ')}`)}`; }), rendererOptions: { persistentOutput: true, }, }, { title: `Running ${chalk_1.default.yellow('package')} command`, task: childTrace({ name: 'package()', category: '@electron-forge/core' }, async (childTrace, ctx, task) => { if (!skipPackage) { return (0, tracer_1.delayTraceTillSignal)(childTrace, (0, package_1.listrPackage)(childTrace, { dir: ctx.dir, interactive, arch, outDir: ctx.actualOutDir, platform, }), 'run'); } else { task.output = chalk_1.default.yellow(`${log_symbols_1.default.warning} Skipping could result in an out of date build`); task.skip(); } }), rendererOptions: { persistentOutput: true, }, }, { title: `Running ${chalk_1.default.yellow('preMake')} hook`, task: childTrace({ name: 'run-preMake-hook', category: '@electron-forge/core' }, async (childTrace, ctx, task) => { return (0, tracer_1.delayTraceTillSignal)(childTrace, task.newListr(await (0, hook_1.getHookListrTasks)(childTrace, ctx.forgeConfig, 'preMake')), 'run'); }), }, { title: 'Making distributables', task: childTrace({ name: 'make-distributables', category: '@electron-forge/core' }, async (childTrace, 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, concurrent: true, rendererOptions: { collapseSubtasks: false, collapseErrors: false, }, }); for (const targetArch of (0, parse_archs_1.default)(platform, arch, await (0, core_utils_1.getElectronVersion)(dir, packageJSON))) { const packageDir = node_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) { const uniqMaker = maker(); subRunner.add({ title: `Making a ${chalk_1.default.magenta(uniqMaker.name)} distributable for ${chalk_1.default.cyan(`${platform}/${targetArch}`)}`, task: childTrace({ name: `make-${maker.name}`, category: '@electron-forge/core', newRoot: true, }, async () => { try { await Promise.resolve(uniqMaker.prepareConfig(targetArch)); const artifacts = await uniqMaker.make({ appName, forgeConfig, packageJSON, targetArch, dir: packageDir, makeDir: node_path_1.default.resolve(actualOutDir, 'make'), targetPlatform: platform, }); outputs.push({ artifacts, packageJSON, platform, arch: targetArch, }); } catch (err) { if (err instanceof Error) { throw err; } else if (typeof err === 'string') { throw new Error(err); } else { throw new Error(`An unknown error occurred while making for target: ${uniqMaker.name}`); } } }), rendererOptions: { timer: { ...listr2_1.PRESET_TIMER }, }, }); } } return (0, tracer_1.delayTraceTillSignal)(childTrace, subRunner, 'run'); }), }, { title: `Running ${chalk_1.default.yellow('postMake')} hook`, task: childTrace({ name: 'run-postMake-hook', category: '@electron-forge/core' }, 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 const originalOutputs = JSON.stringify(ctx.outputs); ctx.outputs = await (0, hook_1.runMutatingHook)(ctx.forgeConfig, 'postMake', ctx.outputs); let outputLocations = [node_path_1.default.resolve(ctx.actualOutDir, 'make')]; if (originalOutputs !== JSON.stringify(ctx.outputs)) { const newDirs = new Set(); const artifactPaths = []; for (const result of ctx.outputs) { for (const artifact of result.artifacts) { newDirs.add(node_path_1.default.dirname(artifact)); artifactPaths.push(artifact); } } if (newDirs.size <= ctx.outputs.length) { outputLocations = [...newDirs]; } else { outputLocations = artifactPaths; } } receiveMakeResults?.(ctx.outputs); task.output = `Artifacts available at: ${chalk_1.default.green(outputLocations.join(', '))}`; }), rendererOptions: { persistentOutput: true, }, }, ], { ...listrOptions, ctx: {}, }); return runner; }; exports.listrMake = listrMake; exports.default = (0, tracer_1.autoTrace)({ name: 'make()', category: '@electron-forge/core' }, async (childTrace, opts) => { const runner = (0, exports.listrMake)(childTrace, opts); await runner.run(); return runner.ctx.outputs; }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWFrZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFBNkI7QUFFN0IsdUNBQTRDO0FBQzVDLDJEQUFnRTtBQVloRSxtREFBeUU7QUFDekUsa0RBQTBCO0FBQzFCLDREQUFvQztBQUNwQyx3REFBMEI7QUFDMUIsbUNBQTZDO0FBQzdDLDhEQUFxQztBQUVyQyx3RUFBa0Q7QUFDbEQsdUNBQWtFO0FBQ2xFLDBFQUFpRDtBQUNqRCw4REFBK0M7QUFDL0Msc0VBQTZDO0FBQzdDLGlFQUFtRTtBQUNuRSxzRUFBNkM7QUFFN0MsdUNBQXlDO0FBU3pDLFNBQVMsZUFBZSxDQUN0QixXQUFnQyxFQUNoQyxlQUE2QjtJQUU3QixJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3BDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sQ0FDTCxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDckIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFFLEtBQStCLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FDNUQsSUFBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQTRCLENBQ2pELENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDO0FBQzVCLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsU0FBUyxvQkFBb0IsQ0FDM0IsTUFBZ0M7SUFFaEMsOERBQThEO0lBQzlELE9BQVEsTUFBeUIsQ0FBQyxzQkFBc0IsQ0FBQztBQUMzRCxDQUFDO0FBeUNNLE1BQU0sU0FBUyxHQUFHLENBQ3ZCLFVBQTRCLEVBQzVCLEVBQ0UsR0FBRyxFQUFFLFdBQVcsR0FB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