@launchmenu/launcher
Version:
The installer + launcher of LM
155 lines • 13.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const electron_1 = require("electron");
const installer_1 = require("./installer");
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const util_1 = require("util");
const handleMacPermissionsDialog_1 = require("./permissions/handleMacPermissionsDialog");
const InstallerWindow_1 = require("./installerWindow/InstallerWindow");
const os_1 = __importDefault(require("os"));
const handleWindowsPermissionsDialog_1 = require("./permissions/handleWindowsPermissionsDialog");
launch();
/**
* The launch process is currently a bit messy and hacky in order to get later installed applets to share the same packages with LM.
* Launching the application will actually install a number of packages beforehand - in the same directory as the exe is in - if they aren't there yet. Afterwards it will run the launcher of core to start LM.
*/
async function launch() {
// Some setup
setupWorkingDir();
electron_1.app.commandLine.appendSwitch("ignore-certificate-errors", "true"); // https://github.com/electron/electron/issues/25354#issuecomment-739804891
global.DEV = process.env.NODE_ENV == "dev";
// Specify program directory and launch function
const installDir = process.platform == "darwin"
? `${os_1.default.homedir()}/Library/Application Support/LaunchMenu`
: process.cwd();
const launchLM = () => require(installer_1.getInstalledPath(installDir, "@launchmenu/core/build/windowController/launcher")).launch({ root: installDir });
// Install LM if necessary, and launch it
if (!installer_1.isInstalled(installDir, "@launchmenu/core"))
await firstTimeSetup(installDir, launchLM);
else
launchLM();
}
/**
* Sets up LM for the first launch:
* + Prompts user to install applets
* - Installs packages
* - Adds required initial settings files
* @param installDir The directory that the modules as well as all LM data should be stored in
* @param launchLM The function to LM after installation
*/
async function firstTimeSetup(installDir, launchLM) {
await electron_1.app.whenReady();
const window = new InstallerWindow_1.InstallerWindow();
try {
// Perform some initialization
await Promise.all([setupDirs(installDir), window.init()]);
// Present the user with some first time setup stuff
const chosenApplets = await window.getInitialApplets();
const applets = [
"@launchmenu/applet-applet-manager",
"@launchmenu/applet-session-manager",
"@launchmenu/applet-settings-manager",
"@launchmenu/applet-window-manager",
"@launchmenu/applet-help",
...chosenApplets,
];
const packages = ["@launchmenu/core", ...applets];
// Create an initial package
await initPackage(installDir);
for (let p of packages) {
window.setState({ type: "loading", name: `Installing ${p}` });
await installer_1.install(installDir, p);
}
// Ask for permissions on mac if needed
if (process.platform == "darwin")
await handleMacPermissionsDialog_1.handleMacPermissionsDialog(window);
if (process.platform == "win32")
await handleWindowsPermissionsDialog_1.handleWindowsPermissionsDialog(window);
// Finalize
window.setState({ type: "loading", name: `Finishing up` });
await initAppletsFile(installDir, applets);
// Launch LM
const { show, shown } = await launchLM();
window.setState({ type: "finished", name: "Finished" });
// Wait for the user to open LM
await shown;
}
catch (e) {
// Handle failures by showing the user something went wrong, and shitting the error message to some file
window.setState({
type: "loading",
name: `Something went wrong during installation`,
});
await util_1.promisify(fs_1.default.writeFile)(path_1.default.join(installDir, "errorReport.txt"), e.toString() + "\n" + (e instanceof Error ? e.stack : ""), "utf8");
console.error(e);
await new Promise(res => setTimeout(res, 5000));
}
// Close the window
window.close();
}
/*********************************************
* Some helpers to perform the initial setup *
*********************************************/
async function setupDirs(root) {
const dirs = ["node_modules", "data/settings"];
for (let dir of dirs) {
const dirPath = path_1.default.join(root, dir);
if (!fs_1.default.existsSync(dirPath))
await util_1.promisify(fs_1.default.mkdir)(dirPath, { recursive: true });
}
}
async function initPackage(root) {
const path = path_1.default.join(root, "package.json");
if (fs_1.default.existsSync(path))
return;
const file = {
name: "launchmenu",
private: true,
description: "The launchmenu program thing",
dependencies: {},
};
await util_1.promisify(fs_1.default.writeFile)(path, JSON.stringify(file, null, 4), "utf8");
}
async function initAppletsFile(root, applet) {
if (DEV)
return;
const path = path_1.default.join(root, "data/settings/applets.json");
if (fs_1.default.existsSync(path))
return;
const file = {};
applet.forEach(module => {
const match = module.match(/(([^\/@\s]*)\/)?([^\/@\s]+)(\@[^\/\s]*)?$/);
if (!match) {
console.error(`${module} doesn't fit regex pattern`);
return;
}
const namespace = match[2];
const name = match[3];
const path = namespace ? `${namespace}@${name}` : name;
try {
file[path] = installer_1.getInstalledPath(root, installer_1.getPackageNameWithoutVersion(module));
}
catch (e) {
console.error(e);
}
});
await util_1.promisify(fs_1.default.writeFile)(path, JSON.stringify(file, null, 4), "utf8");
}
/**
* Fixes the working directory. Window's auto startup doesn't use the file location as the working dir by default.
*/
function setupWorkingDir() {
const regex = /workingDir=(.*)/;
const dir = process.argv.reduce((cur, arg) => {
const match = regex.exec(arg);
if (match)
return match[1];
return cur;
}, path_1.default.dirname(process.argv[0]));
process.chdir(dir);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx1Q0FBNkI7QUFDN0IsMkNBS3FCO0FBQ3JCLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsK0JBQStCO0FBQy9CLHlGQUFvRjtBQUNwRix1RUFBa0U7QUFDbEUsNENBQW9CO0FBQ3BCLGlHQUE0RjtBQUU1RixNQUFNLEVBQUUsQ0FBQztBQUVUOzs7R0FHRztBQUNILEtBQUssVUFBVSxNQUFNO0lBQ2pCLGFBQWE7SUFDYixlQUFlLEVBQUUsQ0FBQztJQUNsQixjQUFHLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLDJFQUEyRTtJQUM5SSxNQUFNLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztJQUUzQyxnREFBZ0Q7SUFDaEQsTUFBTSxVQUFVLEdBQ1osT0FBTyxDQUFDLFFBQVEsSUFBSSxRQUFRO1FBQ3hCLENBQUMsQ0FBQyxHQUFHLFlBQUUsQ0FBQyxPQUFPLEVBQUUseUNBQXlDO1FBQzFELENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDeEIsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQ2xCLE9BQU8sQ0FBQyw0QkFBZ0IsQ0FDcEIsVUFBVSxFQUNWLGtEQUFrRCxDQUNyRCxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7SUFFbEMseUNBQXlDO0lBQ3pDLElBQUksQ0FBQyx1QkFBVyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQztRQUM1QyxNQUFNLGNBQWMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7O1FBQzFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxV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