export type RendererMenuItem = { label?: string; type?: "normal" | "separator" | "submenu" | "checkbox" | "radio"; click?: () => any; }; export function invokeMenu(menu: RendererMenuItem[]) { const menuWithoutClick = menu.map((m) => { return { label: m.label, type: m.type }; }); // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // eslint-disable-next-line @typescript-eslint/no-floating-promises ipc.platform.openContextMenu(menuWithoutClick).then((i: number) => { if (i !== -1) { menu[i].click(); } }); } export function isDev() { // ref: https://github.com/sindresorhus/electron-is-dev if ("ELECTRON_IS_DEV" in process.env) { return parseInt(process.env.ELECTRON_IS_DEV, 10) === 1; } return process.defaultApp || /node_modules[\\/]electron[\\/]/.test(process.execPath); } export function isLinux() { return process.platform === "linux"; } export function isAppImage() { return isLinux() && "APPIMAGE" in process.env; } export function isSnapStore() { return isLinux() && process.env.SNAP_USER_DATA != null; } export function isMac() { return process.platform === "darwin"; } export function isMacAppStore() { return isMac() && process.mas === true; } export function isWindows() { return process.platform === "win32"; } export function isWindowsStore() { const windows = isWindows(); let windowsStore = process.windowsStore; if ( windows && !windowsStore && process.resourcesPath?.indexOf("8bitSolutionsLLC.bitwardendesktop_") > -1 ) { windowsStore = true; } return windows && windowsStore === true; } export function isFlatpak() { return process.platform === "linux" && process.env.container != null; } export function isWindowsPortable() { return isWindows() && process.env.PORTABLE_EXECUTABLE_DIR != null; } /** * Sanitize user agent so external resources used by the app can't built data on our users. */ export function cleanUserAgent(userAgent: string): string { const userAgentItem = (startString: string, endString: string) => { const startIndex = userAgent.indexOf(startString); return userAgent.substring(startIndex, userAgent.indexOf(endString, startIndex) + 1); }; const systemInformation = "(Windows NT 10.0; Win64; x64)"; // Set system information, remove bitwarden, and electron information return userAgent .replace(userAgentItem("(", ")"), systemInformation) .replace(userAgentItem("Bitwarden", " "), "") .replace(userAgentItem("Electron", " "), ""); }