diff --git a/.eslintrc.js b/.eslintrc.js index a80fcdc805..3fda195286 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,6 +16,12 @@ module.exports = { react: { version: packageJson.devDependencies.react || "detect", }, + // the package eslint-import-resolver-typescript is required for this line which fixes errors when using .d.ts files + "import/resolver": { + "typescript": { + "alwaysTryTypes": true, + }, + }, }, overrides: [ { diff --git a/package.json b/package.json index 0443b60eea..2667dea25b 100644 --- a/package.json +++ b/package.json @@ -340,6 +340,7 @@ "esbuild": "^0.13.15", "esbuild-loader": "^2.16.0", "eslint": "^7.32.0", + "eslint-import-resolver-typescript": "^2.5.0", "eslint-plugin-header": "^3.1.1", "eslint-plugin-import": "^2.25.3", "eslint-plugin-react": "^7.27.1", diff --git a/src/extensions/common-api/registrations.ts b/src/extensions/common-api/registrations.ts index be1f24d025..666ed01a26 100644 --- a/src/extensions/common-api/registrations.ts +++ b/src/extensions/common-api/registrations.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -export type { AppPreferenceRegistration, AppPreferenceComponents } from "../registries/app-preference-registry"; +export type { AppPreferenceRegistration, AppPreferenceComponents } from "../../renderer/components/+preferences/app-preferences/app-preference-registration"; export type { KubeObjectDetailRegistration, KubeObjectDetailComponents } from "../registries/kube-object-detail-registry"; export type { KubeObjectMenuRegistration, KubeObjectMenuComponents } from "../registries/kube-object-menu-registry"; export type { KubeObjectStatusRegistration } from "../registries/kube-object-status-registry"; diff --git a/src/extensions/extension-loader/extension-loader.ts b/src/extensions/extension-loader/extension-loader.ts index dd86857cf3..3a0539666a 100644 --- a/src/extensions/extension-loader/extension-loader.ts +++ b/src/extensions/extension-loader/extension-loader.ts @@ -252,7 +252,6 @@ export class ExtensionLoader { return this.autoInitExtensions(async (extension: LensRendererExtension) => { const removeItems = [ registries.GlobalPageRegistry.getInstance().add(extension.globalPages, extension), - registries.AppPreferenceRegistry.getInstance().add(extension.appPreferences), registries.EntitySettingRegistry.getInstance().add(extension.entitySettings), registries.StatusBarRegistry.getInstance().add(extension.statusBarItems), registries.CatalogEntityDetailRegistry.getInstance().add(extension.catalogEntityDetailItems), diff --git a/src/extensions/lens-renderer-extension.ts b/src/extensions/lens-renderer-extension.ts index 9504b7b70a..26d2f2d810 100644 --- a/src/extensions/lens-renderer-extension.ts +++ b/src/extensions/lens-renderer-extension.ts @@ -15,13 +15,14 @@ import type { KubernetesCluster } from "../common/catalog-entities"; import type { WelcomeMenuRegistration } from "../renderer/components/+welcome/welcome-menu-items/welcome-menu-registration"; import type { WelcomeBannerRegistration } from "../renderer/components/+welcome/welcome-banner-items/welcome-banner-registration"; import type { CommandRegistration } from "../renderer/components/command-palette/registered-commands/commands"; +import type { AppPreferenceRegistration } from "../renderer/components/+preferences/app-preferences/app-preference-registration"; export class LensRendererExtension extends LensExtension { globalPages: registries.PageRegistration[] = []; clusterPages: registries.PageRegistration[] = []; clusterPageMenus: registries.ClusterPageMenuRegistration[] = []; kubeObjectStatusTexts: registries.KubeObjectStatusRegistration[] = []; - appPreferences: registries.AppPreferenceRegistration[] = []; + appPreferences: AppPreferenceRegistration[] = []; entitySettings: registries.EntitySettingRegistration[] = []; statusBarItems: registries.StatusBarRegistration[] = []; kubeObjectDetailItems: registries.KubeObjectDetailRegistration[] = []; diff --git a/src/extensions/registries/index.ts b/src/extensions/registries/index.ts index 2d49670973..477f406b2c 100644 --- a/src/extensions/registries/index.ts +++ b/src/extensions/registries/index.ts @@ -7,7 +7,6 @@ export * from "./page-registry"; export * from "./page-menu-registry"; -export * from "./app-preference-registry"; export * from "./status-bar-registry"; export * from "./kube-object-detail-registry"; export * from "./kube-object-menu-registry"; diff --git a/src/extensions/registries/app-preference-registry.ts b/src/renderer/components/+preferences/app-preferences/app-preference-registration.d.ts similarity index 60% rename from src/extensions/registries/app-preference-registry.ts rename to src/renderer/components/+preferences/app-preferences/app-preference-registration.d.ts index f533418ca6..4c76722dd5 100644 --- a/src/extensions/registries/app-preference-registry.ts +++ b/src/renderer/components/+preferences/app-preferences/app-preference-registration.d.ts @@ -4,7 +4,6 @@ */ import type React from "react"; -import { BaseRegistry } from "./base-registry"; export interface AppPreferenceComponents { Hint: React.ComponentType; @@ -22,11 +21,3 @@ export interface RegisteredAppPreference extends AppPreferenceRegistration { id: string; } -export class AppPreferenceRegistry extends BaseRegistry { - getRegisteredItem(item: AppPreferenceRegistration): RegisteredAppPreference { - return { - id: item.id || item.title.toLowerCase().replace(/[^0-9a-zA-Z]+/g, "-"), - ...item, - }; - } -} diff --git a/src/renderer/components/+preferences/app-preferences/app-preferences.injectable.ts b/src/renderer/components/+preferences/app-preferences/app-preferences.injectable.ts new file mode 100644 index 0000000000..fc9deb8656 --- /dev/null +++ b/src/renderer/components/+preferences/app-preferences/app-preferences.injectable.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; +import rendererExtensionsInjectable from "../../../../extensions/renderer-extensions.injectable"; +import { getAppPreferences } from "./get-app-preferences"; + +const appPreferencesInjectable = getInjectable({ + instantiate: (di) => + getAppPreferences({ + extensions: di.inject(rendererExtensionsInjectable), + }), + + lifecycle: lifecycleEnum.singleton, +}); + +export default appPreferencesInjectable; diff --git a/src/renderer/components/+preferences/app-preferences/get-app-preferences.ts b/src/renderer/components/+preferences/app-preferences/get-app-preferences.ts new file mode 100644 index 0000000000..3120e14f77 --- /dev/null +++ b/src/renderer/components/+preferences/app-preferences/get-app-preferences.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 { computed, IComputedValue } from "mobx"; +import type { LensRendererExtension } from "../../../../extensions/lens-renderer-extension"; +import type { AppPreferenceRegistration, RegisteredAppPreference } from "./app-preference-registration"; + +interface Dependencies { + extensions: IComputedValue; +} + +function getRegisteredItem(item: AppPreferenceRegistration): RegisteredAppPreference { + return { + id: item.id || item.title.toLowerCase().replace(/[^0-9a-zA-Z]+/g, "-"), + ...item, + }; +} + + +export const getAppPreferences = ({ extensions }: Dependencies) => { + return computed(() => ( + extensions.get() + .flatMap((extension) => extension.appPreferences) + .map(getRegisteredItem) + )); +}; diff --git a/src/renderer/components/+preferences/application.tsx b/src/renderer/components/+preferences/application.tsx index 99edcfe84e..deaae917d0 100644 --- a/src/renderer/components/+preferences/application.tsx +++ b/src/renderer/components/+preferences/application.tsx @@ -14,10 +14,12 @@ import { isWindows } from "../../../common/vars"; import { Switch } from "../switch"; import moment from "moment-timezone"; import { CONSTANTS, defaultExtensionRegistryUrl, ExtensionRegistryLocation } from "../../../common/user-store/preferences-helpers"; -import { action } from "mobx"; +import { action, IComputedValue } from "mobx"; import { isUrl } from "../input/input_validators"; -import { AppPreferenceRegistry } from "../../../extensions/registries"; import { ExtensionSettings } from "./extension-settings"; +import type { RegisteredAppPreference } from "./app-preferences/app-preference-registration"; +import { withInjectables } from "@ogre-tools/injectable-react"; +import appPreferencesInjectable from "./app-preferences/app-preferences.injectable"; const timezoneOptions: SelectOption[] = moment.tz.names().map(zone => ({ label: zone, @@ -28,7 +30,11 @@ const updateChannelOptions: SelectOption[] = Array.from( ([value, { label }]) => ({ value, label }), ); -export const Application = observer(() => { +interface Dependencies { + appPreferenceItems: IComputedValue +} + +const NonInjectedApplication: React.FC = ({ appPreferenceItems }) => { const userStore = UserStore.getInstance(); const defaultShell = process.env.SHELL || process.env.PTYSHELL @@ -40,7 +46,7 @@ export const Application = observer(() => { const [customUrl, setCustomUrl] = React.useState(userStore.extensionRegistryUrl.customUrl || ""); const [shell, setShell] = React.useState(userStore.shell || ""); - const extensionSettings = AppPreferenceRegistry.getInstance().getItems().filter((preference) => preference.showInPreferencesTab === "application"); + const extensionSettings = appPreferenceItems.get().filter((preference) => preference.showInPreferencesTab === "application"); const themeStore = ThemeStore.getInstance(); return ( @@ -125,10 +131,10 @@ export const Application = observer(() => { /> -
+
- + userStore.openAtLogin = !userStore.openAtLogin}> Automatically start Lens on login @@ -141,7 +147,7 @@ export const Application = observer(() => { ))}
- +