@electron-forge/core
Version:
A complete tool for building modern Electron applications
198 lines • 17.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
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 out_dir_1 = __importDefault(require("../util/out-dir"));
const publish_state_1 = __importDefault(require("../util/publish-state"));
const require_search_1 = __importDefault(require("../util/require-search"));
const resolve_dir_1 = __importDefault(require("../util/resolve-dir"));
const make_1 = require("./make");
const d = (0, debug_1.default)('electron-forge:publish');
const publish = async ({ 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,
},
rendererSilent: !interactive,
rendererFallback: Boolean(process.env.DEBUG && process.env.DEBUG.includes('electron-forge')),
};
const publishDistributablesTasks = [
{
title: 'Publishing distributables',
task: async ({ dir, forgeConfig, makeResults, publishers }, task) => {
if (publishers.length === 0) {
task.output = 'No publishers configured';
task.skip();
return;
}
return task.newListr(publishers.map((publisher) => ({
title: `${chalk_1.default.cyan(`[publisher-${publisher.name}]`)} Running the ${chalk_1.default.yellow('publish')} command`,
task: async (_, task) => {
const setStatusLine = (s) => {
task.output = s;
};
await publisher.publish({
dir,
makeResults: makeResults,
forgeConfig,
setStatusLine,
});
},
options: {
persistentOutput: true,
},
})), {
rendererOptions: {
collapse: false,
collapseErrors: false,
},
});
},
options: {
persistentOutput: true,
},
},
];
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 publishable Electron application');
}
ctx.dir = resolvedDir;
ctx.forgeConfig = await (0, forge_config_1.default)(resolvedDir);
},
},
{
title: 'Resolving publish targets',
task: async (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 = (0, require_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(', ')}`)}`;
}
},
options: {
persistentOutput: true,
},
},
{
title: dryRunResume ? 'Resuming from dry run...' : `Running ${chalk_1.default.yellow('make')} command`,
task: async (ctx, task) => {
const { dir, forgeConfig } = ctx;
const calculatedOutDir = outDir || (0, out_dir_1.default)(dir, forgeConfig);
const dryRunDir = 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 task.newListr(publishes.map((publishStates, index) => {
return {
title: `Publishing dry-run ${chalk_1.default.blue(`#${index + 1}`)}`,
task: async (ctx, task) => {
const restoredMakeResults = publishStates.map(({ state }) => state);
d('restoring publish settings from dry run');
for (const makeResult of restoredMakeResults) {
for (const makePath of makeResult.artifacts) {
if (!(await fs_extra_1.default.pathExists(makePath))) {
throw new Error(`Attempted to resume a dry run but an artifact (${makePath}) could not be found`);
}
}
}
d('publishing for given state set');
return task.newListr(publishDistributablesTasks, {
ctx: {
...ctx,
makeResults: restoredMakeResults,
},
rendererOptions: {
collapse: false,
collapseErrors: false,
},
});
},
};
}), {
rendererOptions: {
collapse: false,
collapseErrors: false,
},
});
}
d('triggering make');
return (0, make_1.listrMake)({
dir,
interactive,
...makeOptions,
}, (results) => {
ctx.makeResults = results;
});
},
},
...(dryRunResume
? []
: dryRun
? [
{
title: 'Saving dry-run state',
task: async ({ 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 = 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),
], listrOptions);
await runner.run();
};
exports.default = publish;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcHVibGlzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdEQUF3QjtBQVl4QixrREFBMEI7QUFDMUIsa0RBQTBCO0FBQzFCLHdEQUEwQjtBQUMxQixtQ0FBK0I7QUFFL0Isd0VBQWtEO0FBQ2xELDhEQUErQztBQUMvQywwRUFBaUQ7QUFDakQsNEVBQW1EO0FBQ25ELHNFQUE2QztBQUU3QyxpQ0FBZ0Q7QUFFaEQsTUFBTSxDQUFDLEdBQUcsSUFBQSxlQUFLLEVBQUMsd0JBQXdCLENBQUMsQ0FBQztBQTJDMUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLEVBQ3JCLEdBQUcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUNoQyxXQUFXLEdBQUcsS0FBSyxFQUNuQixXQUFXLEdBQUcsRUFBRSxFQUNoQixjQUFjLEdBQUcsU0FBUyxFQUMxQixNQUFNLEdBQUcsS0FBSyxFQUNkLFlBQVksR0FBRyxLQUFLLEVBQ3BCLE1BQU0sR0FDUyxFQUFpQixFQUFFO0lBQ2xDLElBQUksTUFBTSxJQUFJLFlBQVksRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7S0FDeEU7SUFFRCxNQUFNLFlBQVksR0FBRztRQUNuQixVQUFVLEVBQUUsS0FBSztRQUNqQixlQUFlLEVBQUU7WUFDZixjQUFjLEVBQUUsS0FBSztTQUN0QjtRQUNELGNBQWMsRUFBRSxDQUFDLFdBQVc7UUFDNUIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQzdGLENBQUM7SUFFRixNQUFNLDBCQUEwQixHQUFHO1FBQ2pDO1lBQ0UsS0FBSyxFQUFFLDJCQUEyQjtZQUNsQyxJQUFJLEVBQUUs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