UNPKG

@electron-forge/core

Version:

A complete tool for building modern Electron applications

219 lines 21.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const node_path_1 = __importDefault(require("node:path")); const tracer_1 = require("@electron-forge/tracer"); const chalk_1 = __importDefault(require("chalk")); const debug_1 = __importDefault(require("debug")); const fs_extra_1 = __importDefault(require("fs-extra")); const listr2_1 = require("listr2"); const forge_config_1 = __importDefault(require("../util/forge-config")); const import_search_1 = __importDefault(require("../util/import-search")); const out_dir_1 = __importDefault(require("../util/out-dir")); const publish_state_1 = __importDefault(require("../util/publish-state")); const resolve_dir_1 = __importDefault(require("../util/resolve-dir")); const make_1 = require("./make"); const d = (0, debug_1.default)('electron-forge:publish'); exports.default = (0, tracer_1.autoTrace)({ name: 'publish()', category: '@electron-forge/core' }, async (childTrace, { dir: providedDir = process.cwd(), interactive = false, makeOptions = {}, publishTargets = undefined, dryRun = false, dryRunResume = false, outDir, }) => { if (dryRun && dryRunResume) { throw new Error("Can't dry run and resume a dry run at the same time"); } const listrOptions = { concurrent: false, rendererOptions: { collapseErrors: false, }, silentRendererCondition: !interactive, fallbackRendererCondition: Boolean(process.env.DEBUG) || Boolean(process.env.CI), }; const publishDistributablesTasks = (childTrace) => [ { title: 'Publishing distributables', task: childTrace({ name: 'publish-distributables', category: '@electron-forge/core' }, async (childTrace, { dir, forgeConfig, makeResults, publishers }, task) => { if (publishers.length === 0) { task.output = 'No publishers configured'; task.skip(); return; } return (0, tracer_1.delayTraceTillSignal)(childTrace, task.newListr(publishers.map((publisher) => ({ title: `${chalk_1.default.cyan(`[publisher-${publisher.name}]`)} Running the ${chalk_1.default.yellow('publish')} command`, task: childTrace({ name: `publish-${publisher.name}`, category: '@electron-forge/core', }, async (childTrace, _, task) => { const setStatusLine = (s) => { task.output = s; }; await publisher.publish({ dir, makeResults: makeResults, forgeConfig, setStatusLine, }); }), rendererOptions: { persistentOutput: true, }, })), { rendererOptions: { collapseSubtasks: false, collapseErrors: false, }, }), 'run'); }), rendererOptions: { persistentOutput: true, }, }, ]; const runner = new listr2_1.Listr([ { title: 'Loading configuration', task: childTrace({ name: 'load-forge-config', category: '@electron-forge/core' }, async (childTrace, ctx) => { const resolvedDir = await (0, resolve_dir_1.default)(providedDir); if (!resolvedDir) { throw new Error('Failed to locate publishable Electron application'); } ctx.dir = resolvedDir; ctx.forgeConfig = await (0, forge_config_1.default)(resolvedDir); }), }, { title: 'Resolving publish targets', task: childTrace({ name: 'resolve-publish-targets', category: '@electron-forge/core', }, async (childTrace, ctx, task) => { const { dir, forgeConfig } = ctx; if (!publishTargets) { publishTargets = forgeConfig.publishers || []; } publishTargets = publishTargets.map((target) => { if (typeof target === 'string') { return ((forgeConfig.publishers || []).find((p) => { if (typeof p === 'string') return false; if (p.__isElectronForgePublisher) return false; return (p.name === target); }) || { name: target }); } return target; }); ctx.publishers = []; for (const publishTarget of publishTargets) { // eslint-disable-next-line @typescript-eslint/no-explicit-any let publisher; if (publishTarget.__isElectronForgePublisher) { // eslint-disable-next-line @typescript-eslint/no-explicit-any publisher = publishTarget; } else { const resolvablePublishTarget = publishTarget; // eslint-disable-next-line @typescript-eslint/no-explicit-any const PublisherClass = await (0, import_search_1.default)(dir, [ resolvablePublishTarget.name, ]); if (!PublisherClass) { throw new Error(`Could not find a publish target with the name: ${resolvablePublishTarget.name}. Make sure it's listed in the devDependencies of your package.json`); } publisher = new PublisherClass(resolvablePublishTarget.config || {}, resolvablePublishTarget.platforms); } ctx.publishers.push(publisher); } if (ctx.publishers.length) { task.output = `Publishing to the following targets: ${chalk_1.default.magenta(`${ctx.publishers.map((publisher) => publisher.name).join(', ')}`)}`; } }), rendererOptions: { persistentOutput: true, }, }, { title: dryRunResume ? 'Resuming from dry run...' : `Running ${chalk_1.default.yellow('make')} command`, task: childTrace({ name: dryRunResume ? 'resume-dry-run' : 'make()', category: '@electron-forge/core', }, async (childTrace, ctx, task) => { const { dir, forgeConfig } = ctx; const calculatedOutDir = outDir || (0, out_dir_1.default)(dir, forgeConfig); const dryRunDir = node_path_1.default.resolve(calculatedOutDir, 'publish-dry-run'); if (dryRunResume) { d('attempting to resume from dry run'); const publishes = await publish_state_1.default.loadFromDirectory(dryRunDir, dir); task.title = `Resuming ${publishes.length} found dry runs...`; return (0, tracer_1.delayTraceTillSignal)(childTrace, task.newListr(publishes.map((publishStates, index) => { return { title: `Publishing dry-run ${chalk_1.default.blue(`#${index + 1}`)}`, task: childTrace({ name: `publish-dry-run-${index + 1}`, category: '@electron-forge/core', }, async (childTrace, ctx, task) => { const restoredMakeResults = publishStates.map(({ state }) => state); d('restoring publish settings from dry run'); for (const makeResult of restoredMakeResults) { makeResult.artifacts = await Promise.all(makeResult.artifacts.map(async (makePath) => { // standardize the path to artifacts across platforms const normalizedPath = makePath .split(/\/|\\/) .join(node_path_1.default.sep); if (!(await fs_extra_1.default.pathExists(normalizedPath))) { throw new Error(`Attempted to resume a dry run, but an artifact (${normalizedPath}) could not be found`); } return normalizedPath; })); } d('publishing for given state set'); return (0, tracer_1.delayTraceTillSignal)(childTrace, task.newListr(publishDistributablesTasks(childTrace), { ctx: { ...ctx, makeResults: restoredMakeResults, }, rendererOptions: { collapseSubtasks: false, collapseErrors: false, }, }), 'run'); }), }; }), { rendererOptions: { collapseSubtasks: false, collapseErrors: false, }, }), 'run'); } d('triggering make'); return (0, tracer_1.delayTraceTillSignal)(childTrace, (0, make_1.listrMake)(childTrace, { dir, interactive, ...makeOptions, }, (results) => { ctx.makeResults = results; }), 'run'); }), }, ...(dryRunResume ? [] : dryRun ? [ { title: 'Saving dry-run state', task: childTrace({ name: 'save-dry-run', category: '@electron-forge/core' }, async (childTrace, { dir, forgeConfig, makeResults }) => { d('saving results of make in dry run state', makeResults); const calculatedOutDir = outDir || (0, out_dir_1.default)(dir, forgeConfig); const dryRunDir = node_path_1.default.resolve(calculatedOutDir, 'publish-dry-run'); await fs_extra_1.default.remove(dryRunDir); await publish_state_1.default.saveToDirectory(dryRunDir, makeResults, dir); }), }, ] : publishDistributablesTasks(childTrace)), ], listrOptions); await runner.run(); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcHVibGlzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDBEQUE2QjtBQWM3QixtREFBeUU7QUFDekUsa0RBQTBCO0FBQzFCLGtEQUEwQjtBQUMxQix3REFBMEI7QUFDMUIsbUNBQStCO0FBRS9CLHdFQUFrRDtBQUNsRCwwRUFBaUQ7QUFDakQsOERBQStDO0FBQy9DLDBFQUFpRDtBQUNqRCxzRUFBNkM7QUFFN0MsaUNBQWdEO0FBRWhELE1BQU0sQ0FBQyxHQUFHLElBQUEsZUFBSyxFQUFDLHdCQUF3QixDQUFDLENBQUM7QUEyQzFDLGtCQUFlLElBQUEsa0JBQVMsRUFDdEIsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSxFQUN2RCxLQUFLLEVBQ0gsVUFBVSxFQUNWLEVBQ0UsR0FBRyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQ2hDLFdBQVcsR0FBRyxLQUFLLEVBQ25CLFdBQVcsR0FBRyxFQUFFLEVBQ2hCLGNBQWMsR0FBRyxTQUFTLEVBQzFCLE1BQU0sR0FBRyxLQUFLLEVBQ2QsWUFBWSxHQUFHLEtBQUssRUFDcEIsTUFBTSxHQUNTLEVBQ0YsRUFBRTtJQUNqQixJQUFJLE1BQU0sSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFzQztRQUN0RCxVQUFVLEVBQUUsS0FBSztRQUNqQixlQUFlLEVBQUU7WUFDZixjQUFjLEVBQUUsS0FBSztTQUN0QjtRQUNELHVCQUF1QixFQUFFLENBQUMsV0FBVztRQUNyQyx5QkFBeUIsRUFDdkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFB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