UNPKG

@launchmenu/launcher

Version:
155 lines 13.1 kB
"use strict"; 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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