diff --git a/src/common/utils/environment-variables.injectable.ts b/src/common/utils/environment-variables.injectable.ts index 897b349d56..e820312f81 100644 --- a/src/common/utils/environment-variables.injectable.ts +++ b/src/common/utils/environment-variables.injectable.ts @@ -3,14 +3,15 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import nodeEnvInjectionToken from "../vars/node-env-injection-token"; const environmentVariablesInjectable = getInjectable({ id: "environment-variables", - instantiate: () => { + instantiate: (di) => { // IMPORTANT: The syntax needs to be exactly this in order to make environment variable values // hard-coded at compile-time by Webpack. - const NODE_ENV = process.env.NODE_ENV; + const NODE_ENV = di.inject(nodeEnvInjectionToken); const JEST_WORKER_ID = process.env.JEST_WORKER_ID; const CICD = process.env.CICD; diff --git a/src/common/vars/node-env-injection-token.ts b/src/common/vars/node-env-injection-token.ts new file mode 100644 index 0000000000..9de463c1cb --- /dev/null +++ b/src/common/vars/node-env-injection-token.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectionToken } from "@ogre-tools/injectable"; + +const nodeEnvInjectionToken = getInjectionToken({ + id: "node-env-injection-token", +}); + +export default nodeEnvInjectionToken; diff --git a/src/main/create-app.ts b/src/main/create-app.ts new file mode 100644 index 0000000000..d0cccae5f8 --- /dev/null +++ b/src/main/create-app.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type { DiContainer } from "@ogre-tools/injectable"; +import { getInjectable } from "@ogre-tools/injectable"; +import { runInAction } from "mobx"; +import nodeEnvInjectionToken from "../common/vars/node-env-injection-token"; +import { registerInjectables } from "./register-injectables"; +import startMainApplicationInjectable from "./start-main-application/start-main-application.injectable"; + +interface AppConfig { + di: DiContainer; + mode: string; +} + +export function createApp(conf: AppConfig) { + const { di, mode } = conf; + + runInAction(() => { + di.register(getInjectable({ + id: "node-env", + instantiate: () => mode, + injectionToken: nodeEnvInjectionToken, + })); + + registerInjectables(di); + }); + + const startMainApplication = di.inject(startMainApplicationInjectable); + + return { + start: () => startMainApplication(), + }; +} diff --git a/src/main/getDiForUnitTesting.ts b/src/main/getDiForUnitTesting.ts index 3e93d9d7b9..51c99b9ca3 100644 --- a/src/main/getDiForUnitTesting.ts +++ b/src/main/getDiForUnitTesting.ts @@ -5,7 +5,7 @@ import { kebabCase, noop, chunk } from "lodash/fp"; import type { DiContainer, Injectable } from "@ogre-tools/injectable"; -import { createContainer, isInjectable } from "@ogre-tools/injectable"; +import { createContainer, isInjectable, getInjectable } from "@ogre-tools/injectable"; import { Environments, setLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; import writeJsonFileInjectable from "../common/fs/write-json-file.injectable"; import readJsonFileInjectable from "../common/fs/read-json-file.injectable"; @@ -72,6 +72,7 @@ import initializeClusterManagerInjectable from "./cluster/initialize-manager.inj import addKubeconfigSyncAsEntitySourceInjectable from "./start-main-application/runnables/kube-config-sync/add-source.injectable"; import type { GlobalOverride } from "../common/test-utils/get-global-override"; import applicationInformationInjectable from "../common/vars/application-information-injectable"; +import nodeEnvInjectionToken from "../common/vars/node-env-injection-token"; export function getDiForUnitTesting(opts: { doGeneralOverrides?: boolean } = {}) { const { @@ -80,6 +81,12 @@ export function getDiForUnitTesting(opts: { doGeneralOverrides?: boolean } = {}) const di = createContainer("main"); + di.register(getInjectable({ + id: "node-env", + instantiate: () => "test", + injectionToken: nodeEnvInjectionToken, + })); + setLegacyGlobalDiForExtensionApi(di, Environments.main); di.preventSideEffects(); diff --git a/src/main/index.ts b/src/main/index.ts index bbf92a6a00..e7e5aad291 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -7,19 +7,17 @@ import { getDi } from "./getDi"; import { Mobx, LensExtensions, Pty } from "./extension-api"; -import { startApp } from "./start-app"; +import { createApp } from "./create-app"; const di = getDi(); +const app = createApp({ + di, + mode: process.env.NODE_ENV || "development", +}); -(async () => { - try { - await startApp({ - di, - }); - } catch (error) { - console.error(error); - process.exit(1); - } -})(); +app.start().catch((error) => { + console.error(error); + process.exit(1); +}); export { Mobx, LensExtensions, Pty }; diff --git a/src/main/library.ts b/src/main/library.ts index 310d01f61c..f10d36929d 100644 --- a/src/main/library.ts +++ b/src/main/library.ts @@ -3,18 +3,16 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { registerInjectables } from "./register-injectables"; import { afterApplicationIsLoadedInjectionToken } from "./start-main-application/runnable-tokens/after-application-is-loaded-injection-token"; import { beforeApplicationIsLoadingInjectionToken } from "./start-main-application/runnable-tokens/before-application-is-loading-injection-token"; import { beforeElectronIsReadyInjectionToken } from "./start-main-application/runnable-tokens/before-electron-is-ready-injection-token"; import { onLoadOfApplicationInjectionToken } from "./start-main-application/runnable-tokens/on-load-of-application-injection-token"; import * as extensionApi from "./extension-api"; -import { startApp } from "./start-app"; +import { createApp } from "./create-app"; // @experimental export { - registerInjectables, - startApp, + createApp, extensionApi, afterApplicationIsLoadedInjectionToken, beforeApplicationIsLoadingInjectionToken, diff --git a/src/main/start-app.ts b/src/main/start-app.ts deleted file mode 100644 index ea73f48eb8..0000000000 --- a/src/main/start-app.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { DiContainer } from "@ogre-tools/injectable"; -import environmentVariablesInjectable from "../common/utils/environment-variables.injectable"; -import startMainApplicationInjectable from "./start-main-application/start-main-application.injectable"; - -interface AppConfig { - di: DiContainer; - mode?: "production" | "development"; -} - -export async function startApp(conf: AppConfig) { - const { di, mode } = conf; - - if (mode) { - const environmentVariables = di.inject(environmentVariablesInjectable); - - environmentVariables.NODE_ENV = mode; - } - - const startMainApplication = di.inject(startMainApplicationInjectable); - - await startMainApplication(); - - return di; -} diff --git a/src/renderer/create-app.ts b/src/renderer/create-app.ts new file mode 100644 index 0000000000..3a511af5ec --- /dev/null +++ b/src/renderer/create-app.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import "./components/app.scss"; + +import { bootstrap } from "./bootstrap"; +import type { DiContainer } from "@ogre-tools/injectable"; +import { getInjectable } from "@ogre-tools/injectable"; +import nodeEnvInjectionToken from "../common/vars/node-env-injection-token"; +import { runInAction } from "mobx"; +import { registerInjectables } from "./register-injectables"; + +interface AppConfig { + di: DiContainer; + mode: string; +} + +export function createApp(conf: AppConfig) { + const { di, mode } = conf; + + runInAction(() => { + di.register(getInjectable({ + id: "node-env", + instantiate: () => mode, + injectionToken: nodeEnvInjectionToken, + })); + registerInjectables(di); + }); + + return { + start: () => bootstrap(di), + }; +} diff --git a/src/renderer/getDiForUnitTesting.tsx b/src/renderer/getDiForUnitTesting.tsx index 89f6fad2b3..a2d7f30e0d 100644 --- a/src/renderer/getDiForUnitTesting.tsx +++ b/src/renderer/getDiForUnitTesting.tsx @@ -5,7 +5,7 @@ import { noop, chunk } from "lodash/fp"; import type { DiContainer, Injectable } from "@ogre-tools/injectable"; -import { createContainer, isInjectable } from "@ogre-tools/injectable"; +import { createContainer, isInjectable, getInjectable } from "@ogre-tools/injectable"; import { Environments, setLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; import requestFromChannelInjectable from "./utils/channel/request-from-channel.injectable"; import loggerInjectable from "../common/logger.injectable"; @@ -42,6 +42,7 @@ import storageSaveDelayInjectable from "./utils/create-storage/storage-save-dela import environmentVariablesInjectable from "../common/utils/environment-variables.injectable"; import type { GlobalOverride } from "../common/test-utils/get-global-override"; import applicationInformationInjectable from "../common/vars/application-information-injectable"; +import nodeEnvInjectionToken from "../common/vars/node-env-injection-token"; export const getDiForUnitTesting = ( opts: { doGeneralOverrides?: boolean } = {}, @@ -50,6 +51,12 @@ export const getDiForUnitTesting = ( const di = createContainer("renderer"); + di.register(getInjectable({ + id: "node-env", + instantiate: () => "test", + injectionToken: nodeEnvInjectionToken, + })); + di.preventSideEffects(); setLegacyGlobalDiForExtensionApi(di, Environments.renderer); diff --git a/src/renderer/index.ts b/src/renderer/index.ts index 66cbbb43e2..4ccc568a2e 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -10,14 +10,16 @@ import { React, ReactDOM, ReactRouter, ReactRouterDom, Mobx, MobxReact, LensExtensions, } from "./extension-api"; -import { startApp } from "./start-app"; +import { createApp } from "./create-app"; const di = getDi(); +const app = createApp({ + di, + mode: process.env.NODE_ENV || "development", +}); // run -startApp({ - di, -}); +app.start(); export { React, diff --git a/src/renderer/library.ts b/src/renderer/library.ts index 4e509a30aa..6e3b2eada1 100644 --- a/src/renderer/library.ts +++ b/src/renderer/library.ts @@ -5,12 +5,10 @@ import "./components/app.scss"; import * as extensionApi from "./extension-api"; -import { registerInjectables } from "./register-injectables"; -import { startApp } from "./start-app"; +import { createApp } from "./create-app"; // @experimental export { - startApp, + createApp, extensionApi, - registerInjectables, }; diff --git a/src/renderer/start-app.ts b/src/renderer/start-app.ts deleted file mode 100644 index 35afa4c8cb..0000000000 --- a/src/renderer/start-app.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import "./components/app.scss"; - -import { bootstrap } from "./bootstrap"; -import type { DiContainer } from "@ogre-tools/injectable"; -import environmentVariablesInjectable from "../common/utils/environment-variables.injectable"; - -interface AppConfig { - di: DiContainer; - mode?: "production" | "development"; -} - -export function startApp(conf: AppConfig) { - const { di, mode } = conf; - - if (mode) { - const environmentVariables = di.inject(environmentVariablesInjectable); - - environmentVariables.NODE_ENV = mode; - } - - bootstrap(di); -}