@electron-forge/core
Version:
A complete tool for building modern Electron applications
202 lines • 18.3 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_child_process_1 = require("node:child_process");
const node_readline_1 = __importDefault(require("node:readline"));
const core_utils_1 = require("@electron-forge/core-utils");
const tracer_1 = require("@electron-forge/tracer");
const chalk_1 = __importDefault(require("chalk"));
const debug_1 = __importDefault(require("debug"));
const listr2_1 = require("listr2");
const electron_executable_1 = __importDefault(require("../util/electron-executable"));
const forge_config_1 = __importDefault(require("../util/forge-config"));
const hook_1 = require("../util/hook");
const read_package_json_1 = require("../util/read-package-json");
const resolve_dir_1 = __importDefault(require("../util/resolve-dir"));
const d = (0, debug_1.default)('electron-forge:start');
exports.default = (0, tracer_1.autoTrace)({ name: 'start()', category: '@electron-forge/core' }, async (childTrace, { dir: providedDir = process.cwd(), appPath = '.', interactive = false, enableLogging = false, args = [], runAsNode = false, inspect = false, inspectBrk = false, }) => {
const platform = process.env.npm_config_platform || process.platform;
const arch = process.env.npm_config_arch || process.arch;
const listrOptions = {
concurrent: false,
registerSignalListeners: false, // Don't re-render on SIGINT
rendererOptions: {
collapseErrors: false,
collapseSubtasks: false,
},
silentRendererCondition: !interactive,
fallbackRendererCondition: Boolean(process.env.DEBUG) || Boolean(process.env.CI),
};
const runner = new listr2_1.Listr([
{
title: 'Locating application',
task: childTrace({ name: 'locate-application', 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;
}),
},
{
title: 'Loading configuration',
task: childTrace({ name: 'load-forge-config', category: '@electron-forge/core' }, async (_, ctx) => {
const { dir } = ctx;
ctx.forgeConfig = await (0, forge_config_1.default)(dir);
ctx.packageJSON = await (0, read_package_json_1.readMutatedPackageJson)(dir, ctx.forgeConfig);
if (!ctx.packageJSON.version) {
throw new Error(`Please set your application's 'version' in '${dir}/package.json'.`);
}
}),
},
{
title: 'Preparing native dependencies',
task: childTrace({
name: 'prepare-native-dependencies',
category: '@electron-forge/core',
}, async (_, { dir, forgeConfig, packageJSON }, task) => {
await (0, core_utils_1.listrCompatibleRebuildHook)(dir, await (0, core_utils_1.getElectronVersion)(dir, packageJSON), platform, arch, forgeConfig.rebuildConfig, task);
}),
rendererOptions: {
persistentOutput: true,
bottomBar: Infinity,
timer: { ...listr2_1.PRESET_TIMER },
},
},
{
title: `Running ${chalk_1.default.yellow('generateAssets')} hook`,
task: childTrace({
name: 'run-generateAssets-hook',
category: '@electron-forge/core',
}, async (childTrace, { forgeConfig }, task) => {
return (0, tracer_1.delayTraceTillSignal)(childTrace, task.newListr(await (0, hook_1.getHookListrTasks)(childTrace, forgeConfig, 'generateAssets', platform, arch)), 'run');
}),
},
{
title: `Running ${chalk_1.default.yellow('preStart')} hook`,
task: childTrace({ name: 'run-preStart-hook', category: '@electron-forge/core' }, async (childTrace, { forgeConfig }, task) => {
return (0, tracer_1.delayTraceTillSignal)(childTrace, task.newListr(await (0, hook_1.getHookListrTasks)(childTrace, forgeConfig, 'preStart')), 'run');
}),
},
{
task: (_ctx, task) => {
task.title = `${chalk_1.default.dim(`Launched Electron app. Type`)} ${chalk_1.default.bold('rs')} ${chalk_1.default.dim(`in terminal to restart main process.`)}`;
},
},
], listrOptions);
await runner.run();
const { dir, forgeConfig, packageJSON } = runner.ctx;
let lastSpawned = null;
const forgeSpawn = async () => {
let electronExecPath = null;
// If a plugin has taken over the start command let's stop here
let spawnedPluginChild = await forgeConfig.pluginInterface.overrideStartLogic({
dir,
appPath,
interactive,
enableLogging,
args,
runAsNode,
inspect,
inspectBrk,
});
if (typeof spawnedPluginChild === 'object' &&
'tasks' in spawnedPluginChild) {
const innerRunner = new listr2_1.Listr([], listrOptions);
for (const task of spawnedPluginChild.tasks) {
innerRunner.add(task);
}
await innerRunner.run();
spawnedPluginChild = spawnedPluginChild.result;
}
let prefixArgs = [];
if (typeof spawnedPluginChild === 'string') {
electronExecPath = spawnedPluginChild;
}
else if (Array.isArray(spawnedPluginChild)) {
[electronExecPath, ...prefixArgs] = spawnedPluginChild;
}
else if (spawnedPluginChild) {
await (0, hook_1.runHook)(forgeConfig, 'postStart', spawnedPluginChild);
return spawnedPluginChild;
}
if (!electronExecPath) {
electronExecPath = await (0, electron_executable_1.default)(dir, packageJSON);
}
d('Electron binary path:', electronExecPath);
const spawnOpts = {
cwd: dir,
stdio: 'inherit',
env: {
...process.env,
...(enableLogging
? {
ELECTRON_ENABLE_LOGGING: 'true',
ELECTRON_ENABLE_STACK_DUMPING: 'true',
}
: {}),
},
};
if (runAsNode) {
spawnOpts.env.ELECTRON_RUN_AS_NODE = 'true';
}
else {
delete spawnOpts.env.ELECTRON_RUN_AS_NODE;
}
if (inspect) {
args = ['--inspect'].concat(args);
}
if (inspectBrk) {
args = ['--inspect-brk'].concat(args);
}
const spawned = (0, node_child_process_1.spawn)(electronExecPath, // eslint-disable-line @typescript-eslint/no-non-null-assertion
prefixArgs.concat([appPath]).concat(args), spawnOpts);
await (0, hook_1.runHook)(forgeConfig, 'postStart', spawned);
return spawned;
};
const forgeSpawnWrapper = async () => {
const spawned = await forgeSpawn();
// When the child app is closed we should stop listening for stdin
if (spawned) {
if (interactive && process.stdin.isPaused()) {
process.stdin.resume();
}
spawned.on('exit', () => {
if (spawned.restarted) {
return;
}
if (interactive && !process.stdin.isPaused()) {
process.stdin.pause();
}
});
}
else if (interactive && !process.stdin.isPaused()) {
process.stdin.pause();
}
lastSpawned = spawned;
return lastSpawned;
};
if (interactive) {
process.stdin.on('data', (data) => {
if (data.toString().trim() === 'rs' && lastSpawned) {
node_readline_1.default.moveCursor(process.stdout, 0, -1);
node_readline_1.default.clearLine(process.stdout, 0);
node_readline_1.default.cursorTo(process.stdout, 0);
console.info(`${chalk_1.default.green('✔ ')}${chalk_1.default.dim('Restarting Electron app')}`);
lastSpawned.restarted = true;
lastSpawned.on('exit', async () => {
lastSpawned.emit('restarted', await forgeSpawnWrapper());
});
lastSpawned.kill('SIGTERM');
}
});
process.stdin.resume();
}
const spawned = await forgeSpawnWrapper();
if (interactive)
console.log('');
return spawned;
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3N0YXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMkRBQXlEO0FBQ3pELGtFQUFxQztBQUVyQywyREFHb0M7QUFVcEMsbURBQXlFO0FBQ3pFLGtEQUEwQjtBQUMxQixrREFBMEI7QUFDMUIsbUNBQTZDO0FBRTdDLHNGQUFtRTtBQUNuRSx3RUFBa0Q7QUFDbEQsdUNBQTBEO0FBQzFELGlFQUFtRTtBQUNuRSxzRUFBNkM7QUFFN0MsTUFBTSxDQUFDLEdBQUcsSUFBQSxlQUFLLEVBQUMsc0JBQXNCLENBQUMsQ0FBQztBQVd4QyxrQkFBZSxJQUFBLGtCQUFTLEVBQ3RCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsRUFDckQsS0FBSyxFQUNILFVBQVUsRUFDVixFQUNFLEdBQUcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUNoQyxPQUFPLEdBQUcsR0FBRyxFQUNiLFdBQVcsR0FBRyxLQUFLLEVBQ25CLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLElBQUksR0FBRyxFQUFFLEVBQ1QsU0FBUyxHQUFHLEtBQUssRUFDakIsT0FBTyxHQUFHLEtBQUssRUFDZixVQUFVLEdBQUcsS0FBSyxHQUNMLEVBQ1csRUFBRTtJQUM1QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDckUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQztJQUN6RCxNQUFNLFlBQVksR0FBb0M7UUFDcEQsVUFBVSxFQUFFLEtBQUs7UUFDakIsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLDRCQUE0QjtRQUM1RCxlQUFlLEVBQUU7WUFDZixjQUFjLEVBQUUsS0FBSztZQUNyQixnQkFBZ0IsRUFB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