diff --git a/src/common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable.ts b/src/common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable.ts index c0869c4b11..f371860f18 100644 --- a/src/common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable.ts +++ b/src/common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable.ts @@ -4,13 +4,20 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import directoryForUserDataInjectable from "../directory-for-user-data/directory-for-user-data.injectable"; -import path from "path"; +import getAbsolutePathInjectable from "../../path/get-absolute-path.injectable"; const directoryForKubeConfigsInjectable = getInjectable({ id: "directory-for-kube-configs", - instantiate: (di) => - path.resolve(di.inject(directoryForUserDataInjectable), "kubeconfigs"), + instantiate: (di) => { + const getAbsolutePath = di.inject(getAbsolutePathInjectable); + const directoryForUserData = di.inject(directoryForUserDataInjectable); + + return getAbsolutePath( + directoryForUserData, + "kubeconfigs", + ); + }, }); export default directoryForKubeConfigsInjectable; diff --git a/src/common/app-paths/get-custom-kube-config-directory/get-custom-kube-config-directory.injectable.ts b/src/common/app-paths/get-custom-kube-config-directory/get-custom-kube-config-directory.injectable.ts index 1157ec96da..6f22aa32f2 100644 --- a/src/common/app-paths/get-custom-kube-config-directory/get-custom-kube-config-directory.injectable.ts +++ b/src/common/app-paths/get-custom-kube-config-directory/get-custom-kube-config-directory.injectable.ts @@ -3,19 +3,18 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import path from "path"; import directoryForKubeConfigsInjectable from "../directory-for-kube-configs/directory-for-kube-configs.injectable"; +import getAbsolutePathInjectable from "../../path/get-absolute-path.injectable"; const getCustomKubeConfigDirectoryInjectable = getInjectable({ id: "get-custom-kube-config-directory", - instantiate: (di) => (directoryName: string) => { + instantiate: (di) => { const directoryForKubeConfigs = di.inject(directoryForKubeConfigsInjectable); + const getAbsolutePath = di.inject(getAbsolutePathInjectable); - return path.resolve( - directoryForKubeConfigs, - directoryName, - ); + return (directoryName: string) => + getAbsolutePath(directoryForKubeConfigs, directoryName); }, }); diff --git a/src/common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable.ts b/src/common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable.ts index fc1e3ef0f0..4bb5cb2495 100644 --- a/src/common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable.ts +++ b/src/common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable.ts @@ -3,17 +3,21 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import path from "path"; import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getAbsolutePathInjectable from "../path/get-absolute-path.injectable"; const directoryForLensLocalStorageInjectable = getInjectable({ id: "directory-for-lens-local-storage", - instantiate: (di) => - path.resolve( - di.inject(directoryForUserDataInjectable), + instantiate: (di) => { + const getAbsolutePath = di.inject(getAbsolutePathInjectable); + const directoryForUserData = di.inject(directoryForUserDataInjectable); + + return getAbsolutePath( + directoryForUserData, "lens-local-storage", - ), + ); + }, }); export default directoryForLensLocalStorageInjectable; diff --git a/src/common/fs/write-file.injectable.ts b/src/common/fs/write-file.injectable.ts index d7e536fb52..70dcb76373 100644 --- a/src/common/fs/write-file.injectable.ts +++ b/src/common/fs/write-file.injectable.ts @@ -14,7 +14,7 @@ const writeFileInjectable = getInjectable({ return async (filePath: string, content: string | Buffer) => { await ensureDir(path.dirname(filePath), { mode: 0o755 }); - + await writeFile(filePath, content, { encoding: "utf-8", }); diff --git a/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable.ts b/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable.ts index d3ef034dd8..c7df388e52 100644 --- a/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable.ts +++ b/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable.ts @@ -6,6 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import directoryForLensLocalStorageInjectable from "../../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable"; import { initIpcMainHandlers } from "./init-ipc-main-handlers"; import getAppMenuItemsInjectable from "../../menu/get-app-menu-items.injectable"; +import getAbsolutePathInjectable from "../../../common/path/get-absolute-path.injectable"; const initIpcMainHandlersInjectable = getInjectable({ id: "init-ipc-main-handlers", @@ -13,6 +14,7 @@ const initIpcMainHandlersInjectable = getInjectable({ instantiate: (di) => initIpcMainHandlers({ getAppMenuItems: () => di.inject(getAppMenuItemsInjectable)(), directoryForLensLocalStorage: di.inject(directoryForLensLocalStorageInjectable), + getAbsolutePath: di.inject(getAbsolutePathInjectable), }), }); diff --git a/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.ts b/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.ts index 4d57e39e3e..24b6c89c9b 100644 --- a/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.ts +++ b/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.ts @@ -14,7 +14,6 @@ import { catalogEntityRegistry } from "../../catalog"; import { pushCatalogToRenderer } from "../../catalog-pusher"; import { ClusterManager } from "../../cluster-manager"; import { ResourceApplier } from "../../resource-applier"; -import path from "path"; import { remove } from "fs-extra"; import { onLocationChange, handleWindowAction } from "../../ipc/window"; import { openFilePickingDialogChannel } from "../../../common/ipc/dialog"; @@ -23,13 +22,15 @@ import { windowActionHandleChannel, windowLocationChangedChannel, windowOpenAppM import { getNativeColorTheme } from "../../native-theme"; import { getNativeThemeChannel } from "../../../common/ipc/native-theme"; import type { MenuItemsOpts } from "../../menu/get-app-menu-items.injectable"; +import type { GetAbsolutePath } from "../../../common/path/get-absolute-path.injectable"; interface Dependencies { getAppMenuItems: () => MenuItemsOpts[]; directoryForLensLocalStorage: string; + getAbsolutePath: GetAbsolutePath; } -export const initIpcMainHandlers = ({ getAppMenuItems, directoryForLensLocalStorage }: Dependencies) => () => { +export const initIpcMainHandlers = ({ getAppMenuItems, directoryForLensLocalStorage, getAbsolutePath }: Dependencies) => () => { ipcMainHandle(clusterActivateHandler, (event, clusterId: ClusterId, force = false) => { return ClusterStore.getInstance() .getById(clusterId) @@ -85,7 +86,7 @@ export const initIpcMainHandlers = ({ getAppMenuItems, directoryForLensLocalStor try { // remove the local storage file - const localStorageFilePath = path.resolve(directoryForLensLocalStorage, `${cluster.id}.json`); + const localStorageFilePath = getAbsolutePath(directoryForLensLocalStorage, `${cluster.id}.json`); await remove(localStorageFilePath); } catch { diff --git a/src/main/router/router.ts b/src/main/router/router.ts index ca5da23ce1..56455e52e7 100644 --- a/src/main/router/router.ts +++ b/src/main/router/router.ts @@ -7,7 +7,6 @@ import Call from "@hapi/call"; import type http from "http"; import type httpProxy from "http-proxy"; import { toPairs } from "lodash/fp"; -import path from "path"; import type { Cluster } from "../../common/cluster/cluster"; import type { LensApiResultContentType } from "./router-content-types"; import { contentTypes } from "./router-content-types"; @@ -51,7 +50,6 @@ interface Dependencies { export class Router { protected router = new Call.Router(); - protected static rootPath = path.resolve(__static); constructor(routes: Route[], private dependencies: Dependencies) { routes.forEach(route => { diff --git a/src/main/routes/static-file-route.injectable.ts b/src/main/routes/static-file-route.injectable.ts index 616cccb001..410629c9db 100644 --- a/src/main/routes/static-file-route.injectable.ts +++ b/src/main/routes/static-file-route.injectable.ts @@ -12,20 +12,22 @@ import path from "path"; import isDevelopmentInjectable from "../../common/vars/is-development.injectable"; import httpProxy from "http-proxy"; import readFileBufferInjectable from "../../common/fs/read-file-buffer.injectable"; +import getAbsolutePathInjectable, { GetAbsolutePath } from "../../common/path/get-absolute-path.injectable"; interface ProductionDependencies { readFileBuffer: (path: string) => Promise; + getAbsolutePath: GetAbsolutePath; } const handleStaticFileInProduction = - ({ readFileBuffer }: ProductionDependencies) => + ({ readFileBuffer, getAbsolutePath }: ProductionDependencies) => async ({ params }: LensApiRequest) => { - const staticPath = path.resolve(__static); + const staticPath = getAbsolutePath(__static); let filePath = params.path; for (let retryCount = 0; retryCount < 5; retryCount += 1) { const asset = path.join(staticPath, filePath); - const normalizedFilePath = path.resolve(asset); + const normalizedFilePath = getAbsolutePath(asset); if (!normalizedFilePath.startsWith(staticPath)) { return { statusCode: 404 }; @@ -79,13 +81,14 @@ const staticFileRouteInjectable = getInjectable({ instantiate: (di): Route => { const isDevelopment = di.inject(isDevelopmentInjectable); const readFileBuffer = di.inject(readFileBufferInjectable); + const getAbsolutePath = di.inject(getAbsolutePathInjectable); return { method: "get", path: `/{path*}`, handler: isDevelopment ? handleStaticFileInDevelopment({ proxy: httpProxy.createProxy() }) - : handleStaticFileInProduction({ readFileBuffer }), + : handleStaticFileInProduction({ readFileBuffer, getAbsolutePath }), }; }, diff --git a/src/renderer/components/dock/create-resource/lens-templates.injectable.ts b/src/renderer/components/dock/create-resource/lens-templates.injectable.ts index 8bd757079b..22736ec249 100644 --- a/src/renderer/components/dock/create-resource/lens-templates.injectable.ts +++ b/src/renderer/components/dock/create-resource/lens-templates.injectable.ts @@ -9,14 +9,16 @@ import "../../../../common/vars"; import readFileInjectable from "../../../../common/fs/read-file.injectable"; import readDirInjectable from "../../../../common/fs/read-dir.injectable"; import type { RawTemplates } from "./create-resource-templates.injectable"; +import getAbsolutePathInjectable, { GetAbsolutePath } from "../../../../common/path/get-absolute-path.injectable"; interface Dependencies { readDir: (dirPath: string) => Promise; readFile: (filePath: string) => Promise; + getAbsolutePath: GetAbsolutePath; } -async function getTemplates({ readDir, readFile }: Dependencies) { - const templatesFolder = path.resolve(__static, "../templates/create-resource"); +async function getTemplates({ readDir, readFile, getAbsolutePath }: Dependencies) { + const templatesFolder = getAbsolutePath(__static, "../templates/create-resource"); /** * Mapping between file names and their contents @@ -39,6 +41,7 @@ const lensCreateResourceTemplatesInjectable = getInjectable({ const templates = await getTemplates({ readFile: di.inject(readFileInjectable), readDir: di.inject(readDirInjectable), + getAbsolutePath: di.inject(getAbsolutePathInjectable), }); return ["lens", templates]; diff --git a/src/renderer/utils/create-storage/create-storage.injectable.ts b/src/renderer/utils/create-storage/create-storage.injectable.ts index df2130e5c1..f9df0315a9 100644 --- a/src/renderer/utils/create-storage/create-storage.injectable.ts +++ b/src/renderer/utils/create-storage/create-storage.injectable.ts @@ -9,6 +9,7 @@ import readJsonFileInjectable from "../../../common/fs/read-json-file.injectable import writeJsonFileInjectable from "../../../common/fs/write-json-file.injectable"; import { observable } from "mobx"; import loggerInjectable from "../../../common/logger.injectable"; +import getAbsolutePathInjectable from "../../../common/path/get-absolute-path.injectable"; const createStorageInjectable = getInjectable({ id: "create-storage", @@ -28,6 +29,8 @@ const createStorageInjectable = getInjectable({ directoryForLensLocalStorage: di.inject( directoryForLensLocalStorageInjectable, ), + + getAbsolutePath: di.inject(getAbsolutePathInjectable), }), }); diff --git a/src/renderer/utils/create-storage/create-storage.ts b/src/renderer/utils/create-storage/create-storage.ts index bee4c959f3..295e88fda7 100755 --- a/src/renderer/utils/create-storage/create-storage.ts +++ b/src/renderer/utils/create-storage/create-storage.ts @@ -5,7 +5,6 @@ // Keeps window.localStorage state in external JSON-files. // Because app creates random port between restarts => storage session wiped out each time. -import path from "path"; import { comparer, reaction, toJS, when } from "mobx"; import { StorageHelper } from "../storageHelper"; import { isTestEnv } from "../../../common/vars"; @@ -13,6 +12,7 @@ import { isTestEnv } from "../../../common/vars"; import { getHostedClusterId } from "../../../common/utils"; import type { JsonObject, JsonValue } from "type-fest"; import type { Logger } from "../../../common/logger"; +import type { GetAbsolutePath } from "../../../common/path/get-absolute-path.injectable"; interface Dependencies { storage: { initialized: boolean; loaded: boolean; data: Record }; @@ -20,19 +20,20 @@ interface Dependencies { directoryForLensLocalStorage: string; readJsonFile: (filePath: string) => Promise; writeJsonFile: (filePath: string, contentObject: JsonObject) => Promise; + getAbsolutePath: GetAbsolutePath; } /** * Creates a helper for saving data under the "key" intended for window.localStorage */ -export const createStorage = ({ storage, logger, directoryForLensLocalStorage, readJsonFile, writeJsonFile }: Dependencies) => (key: string, defaultValue: T) => { +export const createStorage = ({ storage, getAbsolutePath, logger, directoryForLensLocalStorage, readJsonFile, writeJsonFile }: Dependencies) => (key: string, defaultValue: T) => { const { logPrefix } = StorageHelper; if (!storage.initialized) { storage.initialized = true; (async () => { - const filePath = path.resolve(directoryForLensLocalStorage, `${getHostedClusterId() || "app"}.json`); + const filePath = getAbsolutePath(directoryForLensLocalStorage, `${getHostedClusterId() || "app"}.json`); try { storage.data = (await readJsonFile(filePath)) as JsonObject;