diff --git a/app/common/config-util.ts b/app/common/config-util.ts index 66843abe1..63c26c1ed 100644 --- a/app/common/config-util.ts +++ b/app/common/config-util.ts @@ -80,7 +80,7 @@ export function removeConfigItem(key: string): void { function reloadDB(): void { const settingsJsonPath = path.join( app.getPath("userData"), - "/config/settings.json", + "config/settings.json", ); try { const file = fs.readFileSync(settingsJsonPath, "utf8"); diff --git a/app/common/default-util.ts b/app/common/default-util.ts index 8e53d376f..a01bde9ec 100644 --- a/app/common/default-util.ts +++ b/app/common/default-util.ts @@ -1,13 +1,13 @@ import electron from "electron"; import fs from "fs"; +import path from "path"; const {app} = process.type === "renderer" ? electron.remote : electron; let setupCompleted = false; const zulipDir = app.getPath("userData"); -const logDir = `${zulipDir}/Logs/`; -const configDir = `${zulipDir}/config/`; +const configDir = path.join(zulipDir, "config"); export const initSetUp = (): void => { // If it is the first time the app is running // create zulip dir in userData folder to @@ -17,18 +17,14 @@ export const initSetUp = (): void => { fs.mkdirSync(zulipDir); } - if (!fs.existsSync(logDir)) { - fs.mkdirSync(logDir); - } - // Migrate config files from app data folder to config folder inside app // data folder. This will be done once when a user updates to the new version. if (!fs.existsSync(configDir)) { fs.mkdirSync(configDir); - const domainJson = `${zulipDir}/domain.json`; - const settingsJson = `${zulipDir}/settings.json`; - const updatesJson = `${zulipDir}/updates.json`; - const windowStateJson = `${zulipDir}/window-state.json`; + const domainJson = path.join(zulipDir, "domain.json"); + const settingsJson = path.join(zulipDir, "settings.json"); + const updatesJson = path.join(zulipDir, "updates.json"); + const windowStateJson = path.join(zulipDir, "window-state.json"); const configData = [ { path: domainJson, diff --git a/app/common/logger-util.ts b/app/common/logger-util.ts index bf4c88c9b..b9fe1b952 100644 --- a/app/common/logger-util.ts +++ b/app/common/logger-util.ts @@ -2,6 +2,7 @@ import {Console} from "console"; // eslint-disable-line node/prefer-global/conso import electron from "electron"; import fs from "fs"; import os from "os"; +import path from "path"; import {initSetUp} from "./default-util"; import {captureException, sentryInit} from "./sentry-util"; @@ -32,7 +33,7 @@ if (process.type === "renderer") { ); } -const logDir = `${app.getPath("userData")}/Logs`; +const logDir = app.getPath("logs"); type Level = "log" | "debug" | "info" | "warn" | "error"; @@ -42,7 +43,7 @@ export default class Logger { constructor(options: LoggerOptions = {}) { let {file = "console.log"} = options; - file = `${logDir}/${file}`; + file = path.join(logDir, file); // Trim log according to type of process if (process.type === "renderer") { diff --git a/app/main/index.ts b/app/main/index.ts index c623ae485..57f1ffc27 100644 --- a/app/main/index.ts +++ b/app/main/index.ts @@ -27,8 +27,8 @@ let badgeCount: number; let isQuitting = false; -// Load this url in main window -const mainURL = "file://" + path.join(__dirname, "../renderer", "main.html"); +// Load this file in main window +const mainFile = "app/renderer/main.html"; const permissionCallbacks = new Map void>(); let nextPermissionCallbackId = 0; @@ -52,7 +52,7 @@ function createMainWindow(): Electron.BrowserWindow { mainWindowState = windowStateKeeper({ defaultWidth: 1100, defaultHeight: 720, - path: `${app.getPath("userData")}/config`, + path: path.join(app.getPath("userData"), "config"), }); const win = new electron.BrowserWindow({ @@ -80,7 +80,7 @@ function createMainWindow(): Electron.BrowserWindow { send(win.webContents, "focus"); }); - (async () => win.loadURL(mainURL))(); + (async () => win.loadFile(mainFile))(); // Keep the app running in background on close event win.on("close", (event) => { diff --git a/app/main/linux-update-util.ts b/app/main/linux-update-util.ts index eba7f3a51..684f2016d 100644 --- a/app/main/linux-update-util.ts +++ b/app/main/linux-update-util.ts @@ -48,7 +48,7 @@ export function removeUpdateItem(key: string): void { function reloadDB(): void { const linuxUpdateJsonPath = path.join( app.getPath("userData"), - "/config/updates.json", + "config/updates.json", ); try { const file = fs.readFileSync(linuxUpdateJsonPath, "utf8"); diff --git a/app/main/menu.ts b/app/main/menu.ts index 67b4afb88..e8d69d0a5 100644 --- a/app/main/menu.ts +++ b/app/main/menu.ts @@ -1,4 +1,5 @@ import {BrowserWindow, Menu, app, shell} from "electron"; +import * as path from "path"; import AdmZip from "adm-zip"; @@ -68,13 +69,14 @@ function getToolsSubmenu(): Electron.MenuItemConstructorOptions[] { const dateString = date.toLocaleDateString().replace(/\//g, "-"); // Create a zip file of all the logs and config data - zip.addLocalFolder(`${app.getPath("appData")}/${appName}/Logs`); - zip.addLocalFolder(`${app.getPath("appData")}/${appName}/config`); + zip.addLocalFolder(app.getPath("logs")); + zip.addLocalFolder(path.join(app.getPath("userData"), "config")); // Put the log file in downloads folder - const logFilePath = `${app.getPath( - "downloads", - )}/Zulip-logs-${dateString}.zip`; + const logFilePath = path.join( + app.getPath("downloads"), + `Zulip-logs-${dateString}.zip`, + ); zip.writeZip(logFilePath); // Open and select the log file diff --git a/app/main/request.ts b/app/main/request.ts index e609b1ae4..2d3e75143 100644 --- a/app/main/request.ts +++ b/app/main/request.ts @@ -36,7 +36,7 @@ const logger = new Logger({ }); const generateFilePath = (url: string): string => { - const dir = `${app.getPath("userData")}/server-icons`; + const dir = path.join(app.getPath("userData"), "server-icons"); const extension = path.extname(url).split("?")[0]; let hash = 5381; @@ -51,7 +51,7 @@ const generateFilePath = (url: string): string => { fs.mkdirSync(dir); } - return `${dir}/${hash >>> 0}${extension}`; + return path.join(dir, `${hash >>> 0}${extension}`); }; export const _getServerSettings = async ( diff --git a/app/renderer/js/components/handle-external-link.ts b/app/renderer/js/components/handle-external-link.ts index 2bfcc4d82..65393ec9f 100644 --- a/app/renderer/js/components/handle-external-link.ts +++ b/app/renderer/js/components/handle-external-link.ts @@ -19,7 +19,7 @@ export default function handleExternalLink( const url = new URL(event.url); const downloadPath = ConfigUtil.getConfigItem( "downloadsPath", - `${app.getPath("downloads")}`, + app.getPath("downloads"), ); if (LinkUtil.isUploadsUrl(this.props.url, url)) { diff --git a/app/renderer/js/feedback.ts b/app/renderer/js/feedback.ts index aff360d27..c44de9c2d 100644 --- a/app/renderer/js/feedback.ts +++ b/app/renderer/js/feedback.ts @@ -47,8 +47,7 @@ sendFeedback.addEventListener("feedback-cancelled", () => { feedbackHolder.classList.remove("show"); }); -const dataDir = app.getPath("userData"); -const logsDir = path.join(dataDir, "/Logs"); +const logsDir = app.getPath("logs"); sendFeedback.logs.push( ...fs.readdirSync(logsDir).map((file) => path.join(logsDir, file)), ); diff --git a/app/renderer/js/main.ts b/app/renderer/js/main.ts index df83aa22b..1959b0a59 100644 --- a/app/renderer/js/main.ts +++ b/app/renderer/js/main.ts @@ -191,7 +191,7 @@ class ServerManagerView { showNotification: true, silent: false, }, - downloadsPath: `${app.getPath("downloads")}`, + downloadsPath: app.getPath("downloads"), quitOnClose: false, promptDownload: false, }; diff --git a/scripts/notarize.js b/scripts/notarize.js index 2351b50d8..18ca227a3 100644 --- a/scripts/notarize.js +++ b/scripts/notarize.js @@ -4,7 +4,7 @@ const path = require("path"); const dotenv = require("dotenv"); const {notarize} = require("electron-notarize"); -dotenv.config({path: path.join(__dirname, "/../.env")}); +dotenv.config({path: path.join(__dirname, "../.env")}); exports.default = async function (context) { const {electronPlatformName, appOutDir} = context; @@ -16,7 +16,7 @@ exports.default = async function (context) { return notarize({ appBundleId: "org.zulip.zulip-electron", - appPath: `${appOutDir}/${appName}.app`, + appPath: path.join(appOutDir, `${appName}.app`), appleId: process.env.APPLE_ID, appleIdPassword: process.env.APPLE_ID_PASS, ascProvider: process.env.ASC_PROVIDER, // Team short name