diff --git a/src/common/vars/is-integration-testing.injectable.ts b/src/common/vars/is-integration-testing.injectable.ts index 9f6b8c6412..7d6d5ce24e 100644 --- a/src/common/vars/is-integration-testing.injectable.ts +++ b/src/common/vars/is-integration-testing.injectable.ts @@ -3,11 +3,16 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import commandLineArgumentsInjectable from "../../main/utils/command-line-arguments.injectable"; const isIntegrationTestingInjectable = getInjectable({ id: "is-integration-testing", - instantiate: () => process.argv.includes("--integration-testing"), - causesSideEffects: true, + + instantiate: (di) => { + const commandLineArguments = di.inject(commandLineArgumentsInjectable); + + return commandLineArguments.includes("--integration-testing"); + }, }); export default isIntegrationTestingInjectable; diff --git a/src/main/electron-app/register-protocol-client.injectable.ts b/src/main/electron-app/register-protocol-client.injectable.ts new file mode 100644 index 0000000000..e89b4858e3 --- /dev/null +++ b/src/main/electron-app/register-protocol-client.injectable.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import loggerInjectable from "../../common/logger.injectable"; +import electronAppInjectable from "./electron-app.injectable"; + +const registerProtocolClientInjectable = getInjectable({ + id: "register-protocol-client", + + instantiate: (di) => { + const logger = di.inject(loggerInjectable); + const app = di.inject(electronAppInjectable); + + return (protocol: string) => { + logger.info(`📟 Setting protocol client for ${protocol}://`); + + if (app.setAsDefaultProtocolClient(protocol)) { + logger.info("📟 Protocol client register succeeded ✅"); + } else { + logger.info("📟 Protocol client register failed ❗"); + } + }; + }, +}); + +export default registerProtocolClientInjectable; diff --git a/src/main/getDiForUnitTesting.ts b/src/main/getDiForUnitTesting.ts index 8c6633c9b8..54e25dbe0e 100644 --- a/src/main/getDiForUnitTesting.ts +++ b/src/main/getDiForUnitTesting.ts @@ -47,6 +47,8 @@ import isAutoUpdateEnabledInjectable from "./is-auto-update-enabled.injectable"; import appEventBusInjectable from "../common/app-event-bus/app-event-bus.injectable"; import { EventEmitter } from "../common/event-emitter"; import type { AppEvent } from "../common/app-event-bus/event-bus"; +import registerProtocolClientInjectable from "./electron-app/register-protocol-client.injectable"; +import commandLineArgumentsInjectable from "./utils/command-line-arguments.injectable"; export const getDiForUnitTesting = ( { doGeneralOverrides } = { doGeneralOverrides: false }, @@ -84,6 +86,9 @@ export const getDiForUnitTesting = ( di.override(setApplicationNameInjectable, () => () => {}); di.override(getCommandLineSwitchInjectable, () => () => "irrelevant"); di.override(isAutoUpdateEnabledInjectable, () => () => false); + di.override(registerProtocolClientInjectable, () => () => {}); + + di.override(commandLineArgumentsInjectable, () => []); // TODO: Remove usages of globally exported appEventBus to get rid of this di.override(appEventBusInjectable, () => new EventEmitter<[AppEvent]>()); diff --git a/src/main/start-main-application/after-application-is-ready/implementations/setup-deep-linking.injectable.ts b/src/main/start-main-application/after-application-is-ready/implementations/setup-deep-linking.injectable.ts index 49b36e4104..de5e934565 100644 --- a/src/main/start-main-application/after-application-is-ready/implementations/setup-deep-linking.injectable.ts +++ b/src/main/start-main-application/after-application-is-ready/implementations/setup-deep-linking.injectable.ts @@ -8,11 +8,11 @@ import windowManagerInjectable from "../../../window-manager.injectable"; import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token"; import whenOpeningUrlInjectable from "../../../electron-app/when-opening-url.injectable"; import whenSecondInstanceInjectable from "../../../electron-app/when-second-instance.injectable"; -import loggerInjectable from "../../../../common/logger.injectable"; -import electronAppInjectable from "../../../electron-app/electron-app.injectable"; import type { LensProtocolRouterMain } from "../../../protocol-handler"; import { pipeline } from "@ogre-tools/fp"; import { find, map, startsWith, toLower } from "lodash/fp"; +import registerProtocolClientInjectable from "../../../electron-app/register-protocol-client.injectable"; +import commandLineArgumentsInjectable from "../../../utils/command-line-arguments.injectable"; const setupDeepLinkingInjectable = getInjectable({ id: "setup-deep-linking", @@ -21,10 +21,10 @@ const setupDeepLinkingInjectable = getInjectable({ const windowManager = di.inject(windowManagerInjectable); const whenOpeningUrl = di.inject(whenOpeningUrlInjectable); const whenSecondInstance = di.inject(whenSecondInstanceInjectable); - const logger = di.inject(loggerInjectable); - const app = di.inject(electronAppInjectable); const protocolRouter = di.inject(lensProtocolRouterMainInjectable); const routeWithProtocolRouter = routeWithProtocolRouterFor(protocolRouter); + const registerProtocolClient = di.inject(registerProtocolClientInjectable); + const commandLineArguments = di.inject(commandLineArgumentsInjectable); return { run: async () => { @@ -34,20 +34,14 @@ const setupDeepLinkingInjectable = getInjectable({ await protocolRouter.route(url); }); - whenSecondInstance(async ({ commandLineArguments }) => { - await routeWithProtocolRouter(commandLineArguments); + whenSecondInstance(async ({ commandLineArguments: secondInstanceArguments }) => { + await routeWithProtocolRouter(secondInstanceArguments); await windowManager.ensureMainWindow(); }); - logger.info(`📟 Setting protocol client for lens://`); + registerProtocolClient("lens"); - if (app.setAsDefaultProtocolClient("lens")) { - logger.info("📟 Protocol client register succeeded ✅"); - } else { - logger.info("📟 Protocol client register failed ❗"); - } - - await routeWithProtocolRouter(process.argv); + await routeWithProtocolRouter(commandLineArguments); }, }; }, diff --git a/src/main/start-main-application/after-application-is-ready/implementations/start-main-window.injectable.ts b/src/main/start-main-application/after-application-is-ready/implementations/start-main-window.injectable.ts index 5f5d22e3da..f32b446bee 100644 --- a/src/main/start-main-application/after-application-is-ready/implementations/start-main-window.injectable.ts +++ b/src/main/start-main-application/after-application-is-ready/implementations/start-main-window.injectable.ts @@ -8,6 +8,7 @@ import electronAppInjectable from "../../../electron-app/electron-app.injectable import loggerInjectable from "../../../../common/logger.injectable"; import isMacInjectable from "../../../../common/vars/is-mac.injectable"; import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token"; +import commandLineArgumentsInjectable from "../../../utils/command-line-arguments.injectable"; const startMainWindowInjectable = getInjectable({ id: "start-main-window", @@ -17,13 +18,15 @@ const startMainWindowInjectable = getInjectable({ const app = di.inject(electronAppInjectable); const logger = di.inject(loggerInjectable); const isMac = di.inject(isMacInjectable); + const commandLineArguments = di.inject(commandLineArgumentsInjectable); return { run: async () => { + // Start the app without showing the main window when auto starting on login // (On Windows and Linux, we get a flag. On MacOS, we get special API.) const startHidden = - process.argv.includes("--hidden") || + commandLineArguments.includes("--hidden") || (isMac && app.getLoginItemSettings().wasOpenedAsHidden); logger.info("🖥️ Starting WindowManager"); diff --git a/src/main/utils/command-line-arguments.injectable.ts b/src/main/utils/command-line-arguments.injectable.ts new file mode 100644 index 0000000000..e27a3802d4 --- /dev/null +++ b/src/main/utils/command-line-arguments.injectable.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; + +const commandLineArgumentsInjectable = getInjectable({ + id: "command-line-arguments", + instantiate: () => process.argv, + causesSideEffects: true, +}); + +export default commandLineArgumentsInjectable;