diff --git a/packages/core/src/common/cluster-store/cluster-store.ts b/packages/core/src/common/cluster-store/cluster-store.ts index 6e9b76e013..9e2f3b3f69 100644 --- a/packages/core/src/common/cluster-store/cluster-store.ts +++ b/packages/core/src/common/cluster-store/cluster-store.ts @@ -5,13 +5,12 @@ import { action, comparer, computed, observable } from "mobx"; -import type { BaseStore } from "../persistent-storage/base-store"; import { Cluster } from "../cluster/cluster"; import { toJS } from "../utils"; import type { ClusterModel, ClusterId } from "../cluster-types"; import type { ReadClusterConfigSync } from "./read-cluster-config.injectable"; import type { EmitAppEvent } from "../app-event-bus/emit-event.injectable"; -import type { CreatePersistentStorage } from "../persistent-storage/create.injectable"; +import type { CreatePersistentStorage, PersistentStorage } from "../persistent-storage/create.injectable"; import type { Migrations } from "conf/dist/source/types"; import type { Logger } from "../logger"; @@ -30,10 +29,10 @@ interface Dependencies { export class ClusterStore { readonly clusters = observable.map(); - private readonly store: BaseStore; + private readonly store: PersistentStorage; constructor(protected readonly dependencies: Dependencies) { - this.store = this.dependencies.createPersistentStorage({ + this.store = this.dependencies.createPersistentStorage({ configName: "lens-cluster-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { @@ -102,6 +101,6 @@ export class ClusterStore { } load() { - this.store.load(); + this.store.loadAndStartSyncing(); } } diff --git a/packages/core/src/common/hotbars/store.ts b/packages/core/src/common/hotbars/store.ts index 09b18438bb..bddf070b34 100644 --- a/packages/core/src/common/hotbars/store.ts +++ b/packages/core/src/common/hotbars/store.ts @@ -5,7 +5,6 @@ import type { IObservableValue } from "mobx"; import { runInAction, action, comparer, observable } from "mobx"; -import type { BaseStore } from "../persistent-storage/base-store"; import type { CatalogEntity } from "../catalog"; import { broadcastMessage } from "../ipc"; import type { Hotbar, CreateHotbarData, CreateHotbarOptions } from "./types"; @@ -16,7 +15,7 @@ import type { Logger } from "../logger"; import assert from "assert"; import { getShortName } from "../catalog/helpers"; import type { Migrations } from "conf/dist/source/types"; -import type { CreatePersistentStorage } from "../persistent-storage/create.injectable"; +import type { CreatePersistentStorage, PersistentStorage } from "../persistent-storage/create.injectable"; export interface HotbarStoreModel { hotbars: Hotbar[]; @@ -32,14 +31,14 @@ interface Dependencies { } export class HotbarStore { - private readonly store: BaseStore; + private readonly store: PersistentStorage; readonly hotbars = observable.array(); readonly activeHotbarId = observable.box() as IObservableValue; constructor(protected readonly dependencies: Dependencies) { - this.store = this.dependencies.createPersistentStorage({ + this.store = this.dependencies.createPersistentStorage({ configName: "lens-hotbar-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { @@ -96,7 +95,7 @@ export class HotbarStore { } load() { - this.store.load(); + this.store.loadAndStartSyncing(); } /** diff --git a/packages/core/src/common/persistent-storage/create.injectable.ts b/packages/core/src/common/persistent-storage/create.injectable.ts index 98bc59f03b..47c7b159b5 100644 --- a/packages/core/src/common/persistent-storage/create.injectable.ts +++ b/packages/core/src/common/persistent-storage/create.injectable.ts @@ -31,7 +31,6 @@ export interface PersistentStorageParams extends Omit; }; readonly configName: string; - readonly cwd: string; migrations?: Migrations>; diff --git a/packages/core/src/common/protocol-handler/router.ts b/packages/core/src/common/protocol-handler/router.ts index 0018c385c2..950020d793 100644 --- a/packages/core/src/common/protocol-handler/router.ts +++ b/packages/core/src/common/protocol-handler/router.ts @@ -10,13 +10,13 @@ import { isDefined, iter } from "@k8slens/utilities"; import { pathToRegexp } from "path-to-regexp"; import type Url from "url-parse"; import { RoutingError, RoutingErrorType } from "./error"; -import type { ExtensionsStore } from "../../extensions/extensions-store/extensions-store"; import type { ExtensionLoader } from "../../extensions/extension-loader"; import type { LensExtension } from "../../extensions/lens-extension"; import type { RouteHandler, RouteParams } from "./registration"; import { when } from "mobx"; import { ipcRenderer } from "electron"; import type { Logger } from "../logger"; +import type { EnabledExtensionsState } from "../../extensions/enabled-extensions-state.injectable"; // IPC channel for protocol actions. Main broadcasts the open-url events to this channel. export const ProtocolHandlerIpcPrefix = "protocol-handler"; @@ -65,7 +65,7 @@ export function foldAttemptResults(mainAttempt: RouteAttempt, rendererAttempt: R export interface LensProtocolRouterDependencies { readonly extensionLoader: ExtensionLoader; - readonly extensionsStore: ExtensionsStore; + readonly enabledExtensionsState: EnabledExtensionsState; readonly logger: Logger; } @@ -209,7 +209,7 @@ export abstract class LensProtocolRouter { return name; } - if (!this.dependencies.extensionsStore.isEnabled(extension)) { + if (!this.dependencies.enabledExtensionsState.isEnabled(extension)) { this.dependencies.logger.info(`${LensProtocolRouter.LoggingPrefix}: Extension ${name} matched, but not enabled`); return name; diff --git a/packages/core/src/common/user-store/user-store.ts b/packages/core/src/common/user-store/user-store.ts index f1871930a2..63f80ab146 100644 --- a/packages/core/src/common/user-store/user-store.ts +++ b/packages/core/src/common/user-store/user-store.ts @@ -4,7 +4,6 @@ */ import { action, observable, makeObservable, isObservableArray, isObservableSet, isObservableMap, runInAction } from "mobx"; -import type { BaseStore } from "../persistent-storage/base-store"; import { getOrInsertSet, toggle, object } from "@k8slens/utilities"; import type { UserPreferencesModel, StoreType } from "./preferences-helpers"; import type { EmitAppEvent } from "../app-event-bus/emit-event.injectable"; @@ -13,7 +12,7 @@ import type { EmitAppEvent } from "../app-event-bus/emit-event.injectable"; import type { SelectedUpdateChannel } from "../../features/application-update/common/selected-update-channel/selected-update-channel.injectable"; import type { ReleaseChannel } from "../../features/application-update/common/update-channels"; import type { PreferenceDescriptors } from "./preference-descriptors.injectable"; -import type { CreatePersistentStorage } from "../persistent-storage/create.injectable"; +import type { CreatePersistentStorage, PersistentStorage } from "../persistent-storage/create.injectable"; import type { Logger } from "../logger"; import type { Migrations } from "conf/dist/source/types"; import { toJS } from "../utils"; @@ -33,10 +32,10 @@ interface Dependencies { } export class UserStore { - private readonly store: BaseStore; + private readonly store: PersistentStorage; constructor(protected readonly dependencies: Dependencies) { - this.store = this.dependencies.createPersistentStorage({ + this.store = this.dependencies.createPersistentStorage({ configName: "lens-user-store", projectVersion: this.dependencies.storeMigrationVersion, migrations: this.dependencies.migrations, @@ -153,6 +152,6 @@ export class UserStore { } load() { - this.store.load(); + this.store.loadAndStartSyncing(); } } diff --git a/packages/core/src/common/weblinks-store/weblink-store.ts b/packages/core/src/common/weblinks-store/weblink-store.ts index 4de96820f9..0bc0095b1b 100644 --- a/packages/core/src/common/weblinks-store/weblink-store.ts +++ b/packages/core/src/common/weblinks-store/weblink-store.ts @@ -4,9 +4,8 @@ */ import { action, comparer, observable, runInAction } from "mobx"; -import type { BaseStore } from "../persistent-storage/base-store"; import * as uuid from "uuid"; -import type { CreatePersistentStorage } from "../persistent-storage/create.injectable"; +import type { CreatePersistentStorage, PersistentStorage } from "../persistent-storage/create.injectable"; import type { Migrations } from "conf/dist/source/types"; export interface WeblinkData { @@ -33,12 +32,12 @@ interface Dependencies { } export class WeblinkStore { - private readonly store: BaseStore; + private readonly store: PersistentStorage; readonly weblinks = observable.array(); constructor(private readonly dependencies: Dependencies) { - this.store = this.dependencies.createPersistentStorage({ + this.store = this.dependencies.createPersistentStorage({ configName: "lens-weblink-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { @@ -54,7 +53,7 @@ export class WeblinkStore { }), }); - this.store.load(); + this.store.loadAndStartSyncing(); } add(data: WeblinkCreateOptions) { diff --git a/packages/core/src/extensions/common-api/get-enabled-extensions/get-enabled-extensions.injectable.ts b/packages/core/src/extensions/common-api/get-enabled-extensions/get-enabled-extensions.injectable.ts index 72a866ff49..7460672ee8 100644 --- a/packages/core/src/extensions/common-api/get-enabled-extensions/get-enabled-extensions.injectable.ts +++ b/packages/core/src/extensions/common-api/get-enabled-extensions/get-enabled-extensions.injectable.ts @@ -3,11 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import extensionsStoreInjectable from "../../extensions-store/extensions-store.injectable"; +import enabledExtensionsStateInjectable from "../../enabled-extensions-state.injectable"; const enabledExtensionsInjectable = getInjectable({ id: "enabled-extensions", - instantiate: (di) => di.inject(extensionsStoreInjectable).enabledExtensions, + instantiate: (di) => di.inject(enabledExtensionsStateInjectable).enabledExtensions, }); export default enabledExtensionsInjectable; diff --git a/packages/core/src/extensions/common-api/stores.ts b/packages/core/src/extensions/common-api/stores.ts index 3052e09383..4585a1661d 100644 --- a/packages/core/src/extensions/common-api/stores.ts +++ b/packages/core/src/extensions/common-api/stores.ts @@ -3,10 +3,13 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { BaseStoreParams } from "../../common/persistent-storage/base-store"; +import type { PersistentStorageParams } from "../../common/persistent-storage/create.injectable"; +import type { ExtensionStoreParams } from "../base-extension-store"; import { BaseExtensionStore as ExtensionStore } from "../base-extension-store"; -export { - BaseStoreParams, - ExtensionStore, +export type { + ExtensionStoreParams, + PersistentStorageParams, }; + +export { ExtensionStore }; diff --git a/packages/core/src/extensions/enabled-extensions-state.injectable.ts b/packages/core/src/extensions/enabled-extensions-state.injectable.ts new file mode 100644 index 0000000000..d8997fa0aa --- /dev/null +++ b/packages/core/src/extensions/enabled-extensions-state.injectable.ts @@ -0,0 +1,69 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import type { LensExtensionId } from "@k8slens/legacy-extensions"; +import { iter, object } from "@k8slens/utilities"; +import { getInjectable } from "@ogre-tools/injectable"; +import type { IComputedValue } from "mobx"; +import { action, computed, observable } from "mobx"; +import createPersistentStorageInjectable from "../common/persistent-storage/create.injectable"; +import storeMigrationVersionInjectable from "../common/vars/store-migration-version.injectable"; + +export interface LensExtensionState { + enabled?: boolean; + name: string; +} + +export interface IsEnabledExtensionDescriptor { + id: string; + isBundled: boolean; +} + +export interface EnabledExtensionsState { + readonly enabledExtensions: IComputedValue; + isEnabled: (desc: IsEnabledExtensionDescriptor) => boolean; + mergeState: (newPartialState: Partial> | [LensExtensionId, LensExtensionState][]) => void; +} + +const enabledExtensionsStateInjectable = getInjectable({ + id: "enabled-extensions-state", + instantiate: (di): EnabledExtensionsState => { + const storeMigrationVersion = di.inject(storeMigrationVersionInjectable); + const createPersistentStorage = di.inject(createPersistentStorageInjectable); + + const state = observable.map(); + const storage = createPersistentStorage({ + configName: "lens-extensions", + fromStore: action(({ extensions = {}}) => { + state.merge(extensions); + }), + toJSON: () => ({ + extensions: Object.fromEntries(state), + }), + projectVersion: storeMigrationVersion, + }); + + // NOTE: this is done implicitly here currently + storage.loadAndStartSyncing(); + + return { + enabledExtensions: computed(() => ( + iter.chain(state.values()) + .filter(({ enabled }) => enabled) + .map(({ name }) => name) + .toArray() + )), + isEnabled: ({ id, isBundled }) => isBundled || (state.get(id)?.enabled ?? false), + mergeState: action((newPartialState) => { + if (Array.isArray(newPartialState)) { + state.merge(newPartialState); + } else { + state.merge(object.entries(newPartialState)); + } + }), + }; + }, +}); + +export default enabledExtensionsStateInjectable; diff --git a/packages/core/src/extensions/extension-discovery/extension-discovery.injectable.ts b/packages/core/src/extensions/extension-discovery/extension-discovery.injectable.ts index 5e2a4cd84d..59695cf0f2 100644 --- a/packages/core/src/extensions/extension-discovery/extension-discovery.injectable.ts +++ b/packages/core/src/extensions/extension-discovery/extension-discovery.injectable.ts @@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import { ExtensionDiscovery } from "./extension-discovery"; import extensionLoaderInjectable from "../extension-loader/extension-loader.injectable"; import isCompatibleExtensionInjectable from "./is-compatible-extension/is-compatible-extension.injectable"; -import extensionsStoreInjectable from "../extensions-store/extensions-store.injectable"; +import enabledExtensionsStateInjectable from "../enabled-extensions-state.injectable"; import extensionInstallationStateStoreInjectable from "../extension-installation-state-store/extension-installation-state-store.injectable"; import installExtensionInjectable from "../install-extension/install-extension.injectable"; import extensionPackageRootDirectoryInjectable from "../install-extension/extension-package-root-directory.injectable"; @@ -34,7 +34,7 @@ const extensionDiscoveryInjectable = getInjectable({ instantiate: (di) => new ExtensionDiscovery({ extensionLoader: di.inject(extensionLoaderInjectable), - extensionsStore: di.inject(extensionsStoreInjectable), + enabledExtensionsState: di.inject(enabledExtensionsStateInjectable), extensionInstallationStateStore: di.inject(extensionInstallationStateStoreInjectable), isCompatibleExtension: di.inject(isCompatibleExtensionInjectable), installExtension: di.inject(installExtensionInjectable), diff --git a/packages/core/src/extensions/extension-discovery/extension-discovery.ts b/packages/core/src/extensions/extension-discovery/extension-discovery.ts index 88864d8663..2c8c4d9fc1 100644 --- a/packages/core/src/extensions/extension-discovery/extension-discovery.ts +++ b/packages/core/src/extensions/extension-discovery/extension-discovery.ts @@ -9,7 +9,6 @@ import { makeObservable, observable, reaction, when } from "mobx"; import { broadcastMessage, ipcMainHandle, ipcRendererOn } from "../../common/ipc"; import { toJS } from "../../common/utils"; import { isErrnoException } from "@k8slens/utilities"; -import type { ExtensionsStore } from "../extensions-store/extensions-store"; import type { ExtensionLoader } from "../extension-loader"; import type { InstalledExtension, LensExtensionId, LensExtensionManifest } from "@k8slens/legacy-extensions"; import type { ExtensionInstallationStateStore } from "../extension-installation-state-store/extension-installation-state-store"; @@ -31,10 +30,11 @@ import type { GetDirnameOfPath } from "../../common/path/get-dirname.injectable" import type { GetRelativePath } from "../../common/path/get-relative-path.injectable"; import type { RemovePath } from "../../common/fs/remove.injectable"; import type TypedEventEmitter from "typed-emitter"; +import type { EnabledExtensionsState } from "../enabled-extensions-state.injectable"; interface Dependencies { readonly extensionLoader: ExtensionLoader; - readonly extensionsStore: ExtensionsStore; + readonly enabledExtensionsState: EnabledExtensionsState; readonly extensionInstallationStateStore: ExtensionInstallationStateStore; readonly extensionPackageRootDirectory: string; readonly resourcesDirectory: string; @@ -334,7 +334,7 @@ export class ExtensionDiscovery { try { const manifest = await this.dependencies.readJsonFile(manifestPath) as unknown as LensExtensionManifest; const id = isBundled ? manifestPath : this.getInstalledManifestPath(manifest.name); - const isEnabled = this.dependencies.extensionsStore.isEnabled({ id, isBundled }); + const isEnabled = this.dependencies.enabledExtensionsState.isEnabled({ id, isBundled }); const extensionDir = this.dependencies.getDirnameOfPath(manifestPath); const npmPackage = this.dependencies.joinPaths(extensionDir, `${manifest.name}-${manifest.version}.tgz`); const absolutePath = this.dependencies.isProduction && await this.dependencies.pathExists(npmPackage) diff --git a/packages/core/src/extensions/extension-loader/extension-loader.ts b/packages/core/src/extensions/extension-loader/extension-loader.ts index 7d41ec1fda..eec5924dab 100644 --- a/packages/core/src/extensions/extension-loader/extension-loader.ts +++ b/packages/core/src/extensions/extension-loader/extension-loader.ts @@ -10,7 +10,6 @@ import { action, computed, makeObservable, toJS, observable, observe, reaction, import { broadcastMessage, ipcMainOn, ipcRendererOn, ipcMainHandle } from "../../common/ipc"; import { isDefined } from "@k8slens/utilities"; import type { LensExtension } from "../lens-extension"; -import type { LensExtensionState } from "../extensions-store/extensions-store"; import { extensionLoaderFromMainChannel, extensionLoaderFromRendererChannel } from "../../common/ipc/extension-handling"; import { requestExtensionLoaderInitialState } from "../../renderer/ipc"; import assert from "assert"; @@ -21,6 +20,7 @@ import type { Logger } from "../../common/logger"; import type { JoinPaths } from "../../common/path/join-paths.injectable"; import type { GetDirnameOfPath } from "../../common/path/get-dirname.injectable"; import type { LensExtensionId, BundledExtension, InstalledExtension, LensExtensionConstructor } from "@k8slens/legacy-extensions"; +import type { LensExtensionState } from "../enabled-extensions-state.injectable"; const logModule = "[EXTENSIONS-LOADER]"; diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts index b6d6e3b19f..fe78674d11 100644 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts @@ -30,7 +30,7 @@ const fileSystemProvisionerStoreInjectable = getInjectable({ }); return { - load: () => store.load(), + load: () => store.loadAndStartSyncing(), }; }, }); diff --git a/packages/core/src/extensions/extension-loader/update-extensions-state/update-extensions-state.injectable.ts b/packages/core/src/extensions/extension-loader/update-extensions-state/update-extensions-state.injectable.ts index 754375dd5a..10f35bfc32 100644 --- a/packages/core/src/extensions/extension-loader/update-extensions-state/update-extensions-state.injectable.ts +++ b/packages/core/src/extensions/extension-loader/update-extensions-state/update-extensions-state.injectable.ts @@ -3,11 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import extensionsStoreInjectable from "../../extensions-store/extensions-store.injectable"; +import enabledExtensionsStateInjectable from "../../enabled-extensions-state.injectable"; const updateExtensionsStateInjectable = getInjectable({ id: "update-extensions-state", - instantiate: (di) => di.inject(extensionsStoreInjectable).mergeState, + instantiate: (di) => di.inject(enabledExtensionsStateInjectable).mergeState, }); export default updateExtensionsStateInjectable; diff --git a/packages/core/src/extensions/extensions-store/extensions-store.injectable.ts b/packages/core/src/extensions/extensions-store/extensions-store.injectable.ts deleted file mode 100644 index 6e21fb3260..0000000000 --- a/packages/core/src/extensions/extensions-store/extensions-store.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * 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 createPersistentStorageInjectable from "../../common/persistent-storage/create.injectable"; -import storeMigrationVersionInjectable from "../../common/vars/store-migration-version.injectable"; -import { ExtensionsStore } from "./extensions-store"; - -const extensionsStoreInjectable = getInjectable({ - id: "extensions-store", - instantiate: (di) => new ExtensionsStore({ - storeMigrationVersion: di.inject(storeMigrationVersionInjectable), - createPersistentStorage: di.inject(createPersistentStorageInjectable), - }), -}); - -export default extensionsStoreInjectable; diff --git a/packages/core/src/extensions/extensions-store/extensions-store.ts b/packages/core/src/extensions/extensions-store/extensions-store.ts deleted file mode 100644 index 3a575d95cd..0000000000 --- a/packages/core/src/extensions/extensions-store/extensions-store.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { LensExtensionId } from "@k8slens/legacy-extensions"; -import { action, computed, observable } from "mobx"; -import type { BaseStore } from "../../common/persistent-storage/base-store"; -import type { CreatePersistentStorage } from "../../common/persistent-storage/create.injectable"; - -export interface LensExtensionsStoreModel { - extensions?: Record; -} - -export interface LensExtensionState { - enabled?: boolean; - name: string; -} - -export interface IsEnabledExtensionDescriptor { - id: string; - isBundled: boolean; -} - -export interface ExtensionsStoreDependencies { - createPersistentStorage: CreatePersistentStorage; - readonly storeMigrationVersion: string; -} - -export class ExtensionsStore { - private readonly store: BaseStore; - - constructor(private readonly dependencies: ExtensionsStoreDependencies) { - this.store = this.dependencies.createPersistentStorage({ - configName: "lens-extensions", - fromStore: action(({ extensions = {}}) => { - this.state.merge(extensions); - }), - toJSON: () => ({ - extensions: Object.fromEntries(this.state), - }), - projectVersion: this.dependencies.storeMigrationVersion, - }); - this.store.load(); - } - - readonly enabledExtensions = computed(() => ( - Array.from(this.state.values()) - .filter(({ enabled }) => enabled) - .map(({ name }) => name) - )); - - protected readonly state = observable.map(); - - isEnabled({ id, isBundled }: IsEnabledExtensionDescriptor): boolean { - // By default false, so that copied extensions are disabled by default. - // If user installs the extension from the UI, the Extensions component will specifically enable it. - return isBundled || Boolean(this.state.get(id)?.enabled); - } - - mergeState = action((extensionsState: Record | [LensExtensionId, LensExtensionState][]) => { - this.state.merge(extensionsState); - }); -} diff --git a/packages/core/src/main/protocol-handler/__test__/router.test.ts b/packages/core/src/main/protocol-handler/__test__/router.test.ts index 5af2e588d8..47933aa5dd 100644 --- a/packages/core/src/main/protocol-handler/__test__/router.test.ts +++ b/packages/core/src/main/protocol-handler/__test__/router.test.ts @@ -7,14 +7,14 @@ import * as uuid from "uuid"; import { ProtocolHandlerExtension, ProtocolHandlerInternal, ProtocolHandlerInvalid } from "../../../common/protocol-handler"; import { delay, noop } from "@k8slens/utilities"; -import type { ExtensionsStore, IsEnabledExtensionDescriptor } from "../../../extensions/extensions-store/extensions-store"; import type { LensProtocolRouterMain } from "../lens-protocol-router-main/lens-protocol-router-main"; import { getDiForUnitTesting } from "../../getDiForUnitTesting"; import lensProtocolRouterMainInjectable from "../lens-protocol-router-main/lens-protocol-router-main.injectable"; -import extensionsStoreInjectable from "../../../extensions/extensions-store/extensions-store.injectable"; +import enabledExtensionsStateInjectable from "../../../extensions/enabled-extensions-state.injectable"; import getConfigurationFileModelInjectable from "../../../common/get-configuration-file-model/get-configuration-file-model.injectable"; import { LensExtension } from "../../../extensions/lens-extension"; import type { ObservableMap } from "mobx"; +import { computed } from "mobx"; import extensionInstancesInjectable from "../../../extensions/extension-loader/extension-instances.injectable"; import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; import broadcastMessageInjectable from "../../../common/ipc/broadcast-message.injectable"; @@ -46,9 +46,11 @@ describe("protocol router tests", () => { enabledExtensions = new Set(); - di.override(extensionsStoreInjectable, () => ({ - isEnabled: ({ id, isBundled }: IsEnabledExtensionDescriptor) => isBundled || enabledExtensions.has(id), - } as unknown as ExtensionsStore)); + di.override(enabledExtensionsStateInjectable, () => ({ + isEnabled: ({ id, isBundled }) => isBundled || enabledExtensions.has(id), + enabledExtensions: computed(() => []), + mergeState: noop, + })); di.permitSideEffects(getConfigurationFileModelInjectable); diff --git a/packages/core/src/main/protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable.ts b/packages/core/src/main/protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable.ts index bce91119c2..79cd732575 100644 --- a/packages/core/src/main/protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable.ts +++ b/packages/core/src/main/protocol-handler/lens-protocol-router-main/lens-protocol-router-main.injectable.ts @@ -5,7 +5,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import extensionLoaderInjectable from "../../../extensions/extension-loader/extension-loader.injectable"; import { LensProtocolRouterMain } from "./lens-protocol-router-main"; -import extensionsStoreInjectable from "../../../extensions/extensions-store/extensions-store.injectable"; +import enabledExtensionsStateInjectable from "../../../extensions/enabled-extensions-state.injectable"; import showApplicationWindowInjectable from "../../start-main-application/lens-window/show-application-window.injectable"; import broadcastMessageInjectable from "../../../common/ipc/broadcast-message.injectable"; import loggerInjectable from "../../../common/logger.injectable"; @@ -16,7 +16,7 @@ const lensProtocolRouterMainInjectable = getInjectable({ instantiate: (di) => new LensProtocolRouterMain({ extensionLoader: di.inject(extensionLoaderInjectable), - extensionsStore: di.inject(extensionsStoreInjectable), + extensionsStore: di.inject(enabledExtensionsStateInjectable), showApplicationWindow: di.inject(showApplicationWindowInjectable), broadcastMessage: di.inject(broadcastMessageInjectable), logger: di.inject(loggerInjectable), diff --git a/packages/core/src/renderer/protocol-handler/lens-protocol-router-renderer/lens-protocol-router-renderer.injectable.ts b/packages/core/src/renderer/protocol-handler/lens-protocol-router-renderer/lens-protocol-router-renderer.injectable.ts index 35938b32fd..b074d8f13f 100644 --- a/packages/core/src/renderer/protocol-handler/lens-protocol-router-renderer/lens-protocol-router-renderer.injectable.ts +++ b/packages/core/src/renderer/protocol-handler/lens-protocol-router-renderer/lens-protocol-router-renderer.injectable.ts @@ -5,7 +5,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import extensionLoaderInjectable from "../../../extensions/extension-loader/extension-loader.injectable"; import { LensProtocolRouterRenderer } from "./lens-protocol-router-renderer"; -import extensionsStoreInjectable from "../../../extensions/extensions-store/extensions-store.injectable"; +import enabledExtensionsStateInjectable from "../../../extensions/enabled-extensions-state.injectable"; import loggerInjectable from "../../../common/logger.injectable"; import showErrorNotificationInjectable from "../../components/notifications/show-error-notification.injectable"; import showShortInfoNotificationInjectable from "../../components/notifications/show-short-info.injectable"; @@ -15,7 +15,7 @@ const lensProtocolRouterRendererInjectable = getInjectable({ instantiate: (di) => new LensProtocolRouterRenderer({ extensionLoader: di.inject(extensionLoaderInjectable), - extensionsStore: di.inject(extensionsStoreInjectable), + extensionsStore: di.inject(enabledExtensionsStateInjectable), logger: di.inject(loggerInjectable), showErrorNotification: di.inject(showErrorNotificationInjectable), showShortInfoNotification: di.inject(showShortInfoNotificationInjectable), diff --git a/packages/technical-features/messaging/electron/main/src/channel-listeners/enlist-message-channel-listener.injectable.ts b/packages/technical-features/messaging/electron/main/src/channel-listeners/enlist-message-channel-listener.injectable.ts index 5a33ed39d9..a8368c489b 100644 --- a/packages/technical-features/messaging/electron/main/src/channel-listeners/enlist-message-channel-listener.injectable.ts +++ b/packages/technical-features/messaging/electron/main/src/channel-listeners/enlist-message-channel-listener.injectable.ts @@ -10,7 +10,7 @@ const enlistMessageChannelListenerInjectable = getInjectable({ const ipcMain = di.inject(ipcMainInjectable); return ({ channel, handler }) => { - const nativeOnCallback = (nativeEvent: IpcMainEvent, message: unknown) => { + const nativeOnCallback = (nativeEvent: IpcMainEvent, message: any) => { handler(message, { frameId: nativeEvent.frameId, processId: nativeEvent.processId }); }; diff --git a/packages/technical-features/messaging/electron/renderer/src/listening-of-messages/enlist-message-channel-listener.injectable.ts b/packages/technical-features/messaging/electron/renderer/src/listening-of-messages/enlist-message-channel-listener.injectable.ts index 6948e51073..fb1840f33f 100644 --- a/packages/technical-features/messaging/electron/renderer/src/listening-of-messages/enlist-message-channel-listener.injectable.ts +++ b/packages/technical-features/messaging/electron/renderer/src/listening-of-messages/enlist-message-channel-listener.injectable.ts @@ -10,7 +10,7 @@ const enlistMessageChannelListenerInjectable = getInjectable({ const ipcRenderer = di.inject(ipcRendererInjectable); return ({ channel, handler }) => { - const nativeCallback = (event: IpcRendererEvent, message: unknown) => { + const nativeCallback = (_: IpcRendererEvent, message: any) => { handler(message); }; diff --git a/packages/utility-features/utilities/src/iter.ts b/packages/utility-features/utilities/src/iter.ts index 8c8c4866db..8051e90a6d 100644 --- a/packages/utility-features/utilities/src/iter.ts +++ b/packages/utility-features/utilities/src/iter.ts @@ -10,6 +10,7 @@ interface Iterator extends Iterable { filterMap(fn: (val: T) => Falsy | U): Iterator; find(fn: (val: T) => unknown): T | undefined; collect(fn: (values: Iterable) => U): U; + toArray(): T[]; map(fn: (val: T) => U): Iterator; flatMap(fn: (val: T) => U[]): Iterator; concat(src2: IterableIterator): Iterator; @@ -26,6 +27,7 @@ function chain(src: IterableIterator): Iterator { find: (fn) => find(src, fn), join: (sep) => join(src, sep), collect: (fn) => fn(src), + toArray: () => [...src], concat: (src2) => chain(concat(src, src2)), take: (count) => chain(take(src, count)), [Symbol.iterator]: () => src,