mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Fix remaining type errors
Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
dbb9a0f5a8
commit
31a3369dd0
@ -5,13 +5,12 @@
|
|||||||
|
|
||||||
|
|
||||||
import { action, comparer, computed, observable } from "mobx";
|
import { action, comparer, computed, observable } from "mobx";
|
||||||
import type { BaseStore } from "../persistent-storage/base-store";
|
|
||||||
import { Cluster } from "../cluster/cluster";
|
import { Cluster } from "../cluster/cluster";
|
||||||
import { toJS } from "../utils";
|
import { toJS } from "../utils";
|
||||||
import type { ClusterModel, ClusterId } from "../cluster-types";
|
import type { ClusterModel, ClusterId } from "../cluster-types";
|
||||||
import type { ReadClusterConfigSync } from "./read-cluster-config.injectable";
|
import type { ReadClusterConfigSync } from "./read-cluster-config.injectable";
|
||||||
import type { EmitAppEvent } from "../app-event-bus/emit-event.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 { Migrations } from "conf/dist/source/types";
|
||||||
import type { Logger } from "../logger";
|
import type { Logger } from "../logger";
|
||||||
|
|
||||||
@ -30,10 +29,10 @@ interface Dependencies {
|
|||||||
|
|
||||||
export class ClusterStore {
|
export class ClusterStore {
|
||||||
readonly clusters = observable.map<ClusterId, Cluster>();
|
readonly clusters = observable.map<ClusterId, Cluster>();
|
||||||
private readonly store: BaseStore<ClusterStoreModel>;
|
private readonly store: PersistentStorage;
|
||||||
|
|
||||||
constructor(protected readonly dependencies: Dependencies) {
|
constructor(protected readonly dependencies: Dependencies) {
|
||||||
this.store = this.dependencies.createPersistentStorage({
|
this.store = this.dependencies.createPersistentStorage<ClusterStoreModel>({
|
||||||
configName: "lens-cluster-store",
|
configName: "lens-cluster-store",
|
||||||
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
|
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
|
||||||
syncOptions: {
|
syncOptions: {
|
||||||
@ -102,6 +101,6 @@ export class ClusterStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
load() {
|
load() {
|
||||||
this.store.load();
|
this.store.loadAndStartSyncing();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
import type { IObservableValue } from "mobx";
|
import type { IObservableValue } from "mobx";
|
||||||
import { runInAction, action, comparer, observable } from "mobx";
|
import { runInAction, action, comparer, observable } from "mobx";
|
||||||
import type { BaseStore } from "../persistent-storage/base-store";
|
|
||||||
import type { CatalogEntity } from "../catalog";
|
import type { CatalogEntity } from "../catalog";
|
||||||
import { broadcastMessage } from "../ipc";
|
import { broadcastMessage } from "../ipc";
|
||||||
import type { Hotbar, CreateHotbarData, CreateHotbarOptions } from "./types";
|
import type { Hotbar, CreateHotbarData, CreateHotbarOptions } from "./types";
|
||||||
@ -16,7 +15,7 @@ import type { Logger } from "../logger";
|
|||||||
import assert from "assert";
|
import assert from "assert";
|
||||||
import { getShortName } from "../catalog/helpers";
|
import { getShortName } from "../catalog/helpers";
|
||||||
import type { Migrations } from "conf/dist/source/types";
|
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 {
|
export interface HotbarStoreModel {
|
||||||
hotbars: Hotbar[];
|
hotbars: Hotbar[];
|
||||||
@ -32,14 +31,14 @@ interface Dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class HotbarStore {
|
export class HotbarStore {
|
||||||
private readonly store: BaseStore<HotbarStoreModel>;
|
private readonly store: PersistentStorage;
|
||||||
|
|
||||||
readonly hotbars = observable.array<Hotbar>();
|
readonly hotbars = observable.array<Hotbar>();
|
||||||
|
|
||||||
readonly activeHotbarId = observable.box() as IObservableValue<string>;
|
readonly activeHotbarId = observable.box() as IObservableValue<string>;
|
||||||
|
|
||||||
constructor(protected readonly dependencies: Dependencies) {
|
constructor(protected readonly dependencies: Dependencies) {
|
||||||
this.store = this.dependencies.createPersistentStorage({
|
this.store = this.dependencies.createPersistentStorage<HotbarStoreModel>({
|
||||||
configName: "lens-hotbar-store",
|
configName: "lens-hotbar-store",
|
||||||
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
|
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
|
||||||
syncOptions: {
|
syncOptions: {
|
||||||
@ -96,7 +95,7 @@ export class HotbarStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
load() {
|
load() {
|
||||||
this.store.load();
|
this.store.loadAndStartSyncing();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -31,7 +31,6 @@ export interface PersistentStorageParams<T extends object> extends Omit<Options<
|
|||||||
equals?: IEqualsComparer<T>;
|
equals?: IEqualsComparer<T>;
|
||||||
};
|
};
|
||||||
readonly configName: string;
|
readonly configName: string;
|
||||||
readonly cwd: string;
|
|
||||||
|
|
||||||
migrations?: Migrations<Record<string, unknown>>;
|
migrations?: Migrations<Record<string, unknown>>;
|
||||||
|
|
||||||
|
|||||||
@ -10,13 +10,13 @@ import { isDefined, iter } from "@k8slens/utilities";
|
|||||||
import { pathToRegexp } from "path-to-regexp";
|
import { pathToRegexp } from "path-to-regexp";
|
||||||
import type Url from "url-parse";
|
import type Url from "url-parse";
|
||||||
import { RoutingError, RoutingErrorType } from "./error";
|
import { RoutingError, RoutingErrorType } from "./error";
|
||||||
import type { ExtensionsStore } from "../../extensions/extensions-store/extensions-store";
|
|
||||||
import type { ExtensionLoader } from "../../extensions/extension-loader";
|
import type { ExtensionLoader } from "../../extensions/extension-loader";
|
||||||
import type { LensExtension } from "../../extensions/lens-extension";
|
import type { LensExtension } from "../../extensions/lens-extension";
|
||||||
import type { RouteHandler, RouteParams } from "./registration";
|
import type { RouteHandler, RouteParams } from "./registration";
|
||||||
import { when } from "mobx";
|
import { when } from "mobx";
|
||||||
import { ipcRenderer } from "electron";
|
import { ipcRenderer } from "electron";
|
||||||
import type { Logger } from "../logger";
|
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.
|
// IPC channel for protocol actions. Main broadcasts the open-url events to this channel.
|
||||||
export const ProtocolHandlerIpcPrefix = "protocol-handler";
|
export const ProtocolHandlerIpcPrefix = "protocol-handler";
|
||||||
@ -65,7 +65,7 @@ export function foldAttemptResults(mainAttempt: RouteAttempt, rendererAttempt: R
|
|||||||
|
|
||||||
export interface LensProtocolRouterDependencies {
|
export interface LensProtocolRouterDependencies {
|
||||||
readonly extensionLoader: ExtensionLoader;
|
readonly extensionLoader: ExtensionLoader;
|
||||||
readonly extensionsStore: ExtensionsStore;
|
readonly enabledExtensionsState: EnabledExtensionsState;
|
||||||
readonly logger: Logger;
|
readonly logger: Logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +209,7 @@ export abstract class LensProtocolRouter {
|
|||||||
return name;
|
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`);
|
this.dependencies.logger.info(`${LensProtocolRouter.LoggingPrefix}: Extension ${name} matched, but not enabled`);
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
|
|||||||
@ -4,7 +4,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { action, observable, makeObservable, isObservableArray, isObservableSet, isObservableMap, runInAction } from "mobx";
|
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 { getOrInsertSet, toggle, object } from "@k8slens/utilities";
|
||||||
import type { UserPreferencesModel, StoreType } from "./preferences-helpers";
|
import type { UserPreferencesModel, StoreType } from "./preferences-helpers";
|
||||||
import type { EmitAppEvent } from "../app-event-bus/emit-event.injectable";
|
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 { 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 { ReleaseChannel } from "../../features/application-update/common/update-channels";
|
||||||
import type { PreferenceDescriptors } from "./preference-descriptors.injectable";
|
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 { Logger } from "../logger";
|
||||||
import type { Migrations } from "conf/dist/source/types";
|
import type { Migrations } from "conf/dist/source/types";
|
||||||
import { toJS } from "../utils";
|
import { toJS } from "../utils";
|
||||||
@ -33,10 +32,10 @@ interface Dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class UserStore {
|
export class UserStore {
|
||||||
private readonly store: BaseStore<UserStoreModel>;
|
private readonly store: PersistentStorage;
|
||||||
|
|
||||||
constructor(protected readonly dependencies: Dependencies) {
|
constructor(protected readonly dependencies: Dependencies) {
|
||||||
this.store = this.dependencies.createPersistentStorage({
|
this.store = this.dependencies.createPersistentStorage<UserStoreModel>({
|
||||||
configName: "lens-user-store",
|
configName: "lens-user-store",
|
||||||
projectVersion: this.dependencies.storeMigrationVersion,
|
projectVersion: this.dependencies.storeMigrationVersion,
|
||||||
migrations: this.dependencies.migrations,
|
migrations: this.dependencies.migrations,
|
||||||
@ -153,6 +152,6 @@ export class UserStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
load() {
|
load() {
|
||||||
this.store.load();
|
this.store.loadAndStartSyncing();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,9 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { action, comparer, observable, runInAction } from "mobx";
|
import { action, comparer, observable, runInAction } from "mobx";
|
||||||
import type { BaseStore } from "../persistent-storage/base-store";
|
|
||||||
import * as uuid from "uuid";
|
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";
|
import type { Migrations } from "conf/dist/source/types";
|
||||||
|
|
||||||
export interface WeblinkData {
|
export interface WeblinkData {
|
||||||
@ -33,12 +32,12 @@ interface Dependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class WeblinkStore {
|
export class WeblinkStore {
|
||||||
private readonly store: BaseStore<WeblinkStoreModel>;
|
private readonly store: PersistentStorage;
|
||||||
|
|
||||||
readonly weblinks = observable.array<WeblinkData>();
|
readonly weblinks = observable.array<WeblinkData>();
|
||||||
|
|
||||||
constructor(private readonly dependencies: Dependencies) {
|
constructor(private readonly dependencies: Dependencies) {
|
||||||
this.store = this.dependencies.createPersistentStorage({
|
this.store = this.dependencies.createPersistentStorage<WeblinkStoreModel>({
|
||||||
configName: "lens-weblink-store",
|
configName: "lens-weblink-store",
|
||||||
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
|
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
|
||||||
syncOptions: {
|
syncOptions: {
|
||||||
@ -54,7 +53,7 @@ export class WeblinkStore {
|
|||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
this.store.load();
|
this.store.loadAndStartSyncing();
|
||||||
}
|
}
|
||||||
|
|
||||||
add(data: WeblinkCreateOptions) {
|
add(data: WeblinkCreateOptions) {
|
||||||
|
|||||||
@ -3,11 +3,11 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import extensionsStoreInjectable from "../../extensions-store/extensions-store.injectable";
|
import enabledExtensionsStateInjectable from "../../enabled-extensions-state.injectable";
|
||||||
|
|
||||||
const enabledExtensionsInjectable = getInjectable({
|
const enabledExtensionsInjectable = getInjectable({
|
||||||
id: "enabled-extensions",
|
id: "enabled-extensions",
|
||||||
instantiate: (di) => di.inject(extensionsStoreInjectable).enabledExtensions,
|
instantiate: (di) => di.inject(enabledExtensionsStateInjectable).enabledExtensions,
|
||||||
});
|
});
|
||||||
|
|
||||||
export default enabledExtensionsInjectable;
|
export default enabledExtensionsInjectable;
|
||||||
|
|||||||
@ -3,10 +3,13 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* 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";
|
import { BaseExtensionStore as ExtensionStore } from "../base-extension-store";
|
||||||
|
|
||||||
export {
|
export type {
|
||||||
BaseStoreParams,
|
ExtensionStoreParams,
|
||||||
ExtensionStore,
|
PersistentStorageParams,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export { ExtensionStore };
|
||||||
|
|||||||
@ -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<string[]>;
|
||||||
|
isEnabled: (desc: IsEnabledExtensionDescriptor) => boolean;
|
||||||
|
mergeState: (newPartialState: Partial<Record<LensExtensionId, LensExtensionState>> | [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<LensExtensionId, LensExtensionState>();
|
||||||
|
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;
|
||||||
@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable";
|
|||||||
import { ExtensionDiscovery } from "./extension-discovery";
|
import { ExtensionDiscovery } from "./extension-discovery";
|
||||||
import extensionLoaderInjectable from "../extension-loader/extension-loader.injectable";
|
import extensionLoaderInjectable from "../extension-loader/extension-loader.injectable";
|
||||||
import isCompatibleExtensionInjectable from "./is-compatible-extension/is-compatible-extension.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 extensionInstallationStateStoreInjectable from "../extension-installation-state-store/extension-installation-state-store.injectable";
|
||||||
import installExtensionInjectable from "../install-extension/install-extension.injectable";
|
import installExtensionInjectable from "../install-extension/install-extension.injectable";
|
||||||
import extensionPackageRootDirectoryInjectable from "../install-extension/extension-package-root-directory.injectable";
|
import extensionPackageRootDirectoryInjectable from "../install-extension/extension-package-root-directory.injectable";
|
||||||
@ -34,7 +34,7 @@ const extensionDiscoveryInjectable = getInjectable({
|
|||||||
|
|
||||||
instantiate: (di) => new ExtensionDiscovery({
|
instantiate: (di) => new ExtensionDiscovery({
|
||||||
extensionLoader: di.inject(extensionLoaderInjectable),
|
extensionLoader: di.inject(extensionLoaderInjectable),
|
||||||
extensionsStore: di.inject(extensionsStoreInjectable),
|
enabledExtensionsState: di.inject(enabledExtensionsStateInjectable),
|
||||||
extensionInstallationStateStore: di.inject(extensionInstallationStateStoreInjectable),
|
extensionInstallationStateStore: di.inject(extensionInstallationStateStoreInjectable),
|
||||||
isCompatibleExtension: di.inject(isCompatibleExtensionInjectable),
|
isCompatibleExtension: di.inject(isCompatibleExtensionInjectable),
|
||||||
installExtension: di.inject(installExtensionInjectable),
|
installExtension: di.inject(installExtensionInjectable),
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import { makeObservable, observable, reaction, when } from "mobx";
|
|||||||
import { broadcastMessage, ipcMainHandle, ipcRendererOn } from "../../common/ipc";
|
import { broadcastMessage, ipcMainHandle, ipcRendererOn } from "../../common/ipc";
|
||||||
import { toJS } from "../../common/utils";
|
import { toJS } from "../../common/utils";
|
||||||
import { isErrnoException } from "@k8slens/utilities";
|
import { isErrnoException } from "@k8slens/utilities";
|
||||||
import type { ExtensionsStore } from "../extensions-store/extensions-store";
|
|
||||||
import type { ExtensionLoader } from "../extension-loader";
|
import type { ExtensionLoader } from "../extension-loader";
|
||||||
import type { InstalledExtension, LensExtensionId, LensExtensionManifest } from "@k8slens/legacy-extensions";
|
import type { InstalledExtension, LensExtensionId, LensExtensionManifest } from "@k8slens/legacy-extensions";
|
||||||
import type { ExtensionInstallationStateStore } from "../extension-installation-state-store/extension-installation-state-store";
|
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 { GetRelativePath } from "../../common/path/get-relative-path.injectable";
|
||||||
import type { RemovePath } from "../../common/fs/remove.injectable";
|
import type { RemovePath } from "../../common/fs/remove.injectable";
|
||||||
import type TypedEventEmitter from "typed-emitter";
|
import type TypedEventEmitter from "typed-emitter";
|
||||||
|
import type { EnabledExtensionsState } from "../enabled-extensions-state.injectable";
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
readonly extensionLoader: ExtensionLoader;
|
readonly extensionLoader: ExtensionLoader;
|
||||||
readonly extensionsStore: ExtensionsStore;
|
readonly enabledExtensionsState: EnabledExtensionsState;
|
||||||
readonly extensionInstallationStateStore: ExtensionInstallationStateStore;
|
readonly extensionInstallationStateStore: ExtensionInstallationStateStore;
|
||||||
readonly extensionPackageRootDirectory: string;
|
readonly extensionPackageRootDirectory: string;
|
||||||
readonly resourcesDirectory: string;
|
readonly resourcesDirectory: string;
|
||||||
@ -334,7 +334,7 @@ export class ExtensionDiscovery {
|
|||||||
try {
|
try {
|
||||||
const manifest = await this.dependencies.readJsonFile(manifestPath) as unknown as LensExtensionManifest;
|
const manifest = await this.dependencies.readJsonFile(manifestPath) as unknown as LensExtensionManifest;
|
||||||
const id = isBundled ? manifestPath : this.getInstalledManifestPath(manifest.name);
|
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 extensionDir = this.dependencies.getDirnameOfPath(manifestPath);
|
||||||
const npmPackage = this.dependencies.joinPaths(extensionDir, `${manifest.name}-${manifest.version}.tgz`);
|
const npmPackage = this.dependencies.joinPaths(extensionDir, `${manifest.name}-${manifest.version}.tgz`);
|
||||||
const absolutePath = this.dependencies.isProduction && await this.dependencies.pathExists(npmPackage)
|
const absolutePath = this.dependencies.isProduction && await this.dependencies.pathExists(npmPackage)
|
||||||
|
|||||||
@ -10,7 +10,6 @@ import { action, computed, makeObservable, toJS, observable, observe, reaction,
|
|||||||
import { broadcastMessage, ipcMainOn, ipcRendererOn, ipcMainHandle } from "../../common/ipc";
|
import { broadcastMessage, ipcMainOn, ipcRendererOn, ipcMainHandle } from "../../common/ipc";
|
||||||
import { isDefined } from "@k8slens/utilities";
|
import { isDefined } from "@k8slens/utilities";
|
||||||
import type { LensExtension } from "../lens-extension";
|
import type { LensExtension } from "../lens-extension";
|
||||||
import type { LensExtensionState } from "../extensions-store/extensions-store";
|
|
||||||
import { extensionLoaderFromMainChannel, extensionLoaderFromRendererChannel } from "../../common/ipc/extension-handling";
|
import { extensionLoaderFromMainChannel, extensionLoaderFromRendererChannel } from "../../common/ipc/extension-handling";
|
||||||
import { requestExtensionLoaderInitialState } from "../../renderer/ipc";
|
import { requestExtensionLoaderInitialState } from "../../renderer/ipc";
|
||||||
import assert from "assert";
|
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 { JoinPaths } from "../../common/path/join-paths.injectable";
|
||||||
import type { GetDirnameOfPath } from "../../common/path/get-dirname.injectable";
|
import type { GetDirnameOfPath } from "../../common/path/get-dirname.injectable";
|
||||||
import type { LensExtensionId, BundledExtension, InstalledExtension, LensExtensionConstructor } from "@k8slens/legacy-extensions";
|
import type { LensExtensionId, BundledExtension, InstalledExtension, LensExtensionConstructor } from "@k8slens/legacy-extensions";
|
||||||
|
import type { LensExtensionState } from "../enabled-extensions-state.injectable";
|
||||||
|
|
||||||
const logModule = "[EXTENSIONS-LOADER]";
|
const logModule = "[EXTENSIONS-LOADER]";
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@ const fileSystemProvisionerStoreInjectable = getInjectable({
|
|||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
load: () => store.load(),
|
load: () => store.loadAndStartSyncing(),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,11 +3,11 @@
|
|||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import extensionsStoreInjectable from "../../extensions-store/extensions-store.injectable";
|
import enabledExtensionsStateInjectable from "../../enabled-extensions-state.injectable";
|
||||||
|
|
||||||
const updateExtensionsStateInjectable = getInjectable({
|
const updateExtensionsStateInjectable = getInjectable({
|
||||||
id: "update-extensions-state",
|
id: "update-extensions-state",
|
||||||
instantiate: (di) => di.inject(extensionsStoreInjectable).mergeState,
|
instantiate: (di) => di.inject(enabledExtensionsStateInjectable).mergeState,
|
||||||
});
|
});
|
||||||
|
|
||||||
export default updateExtensionsStateInjectable;
|
export default updateExtensionsStateInjectable;
|
||||||
|
|||||||
@ -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;
|
|
||||||
@ -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<LensExtensionId, LensExtensionState>;
|
|
||||||
}
|
|
||||||
|
|
||||||
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<LensExtensionsStoreModel>;
|
|
||||||
|
|
||||||
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<LensExtensionId, LensExtensionState>();
|
|
||||||
|
|
||||||
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> | [LensExtensionId, LensExtensionState][]) => {
|
|
||||||
this.state.merge(extensionsState);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@ -7,14 +7,14 @@ import * as uuid from "uuid";
|
|||||||
|
|
||||||
import { ProtocolHandlerExtension, ProtocolHandlerInternal, ProtocolHandlerInvalid } from "../../../common/protocol-handler";
|
import { ProtocolHandlerExtension, ProtocolHandlerInternal, ProtocolHandlerInvalid } from "../../../common/protocol-handler";
|
||||||
import { delay, noop } from "@k8slens/utilities";
|
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 type { LensProtocolRouterMain } from "../lens-protocol-router-main/lens-protocol-router-main";
|
||||||
import { getDiForUnitTesting } from "../../getDiForUnitTesting";
|
import { getDiForUnitTesting } from "../../getDiForUnitTesting";
|
||||||
import lensProtocolRouterMainInjectable from "../lens-protocol-router-main/lens-protocol-router-main.injectable";
|
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 getConfigurationFileModelInjectable from "../../../common/get-configuration-file-model/get-configuration-file-model.injectable";
|
||||||
import { LensExtension } from "../../../extensions/lens-extension";
|
import { LensExtension } from "../../../extensions/lens-extension";
|
||||||
import type { ObservableMap } from "mobx";
|
import type { ObservableMap } from "mobx";
|
||||||
|
import { computed } from "mobx";
|
||||||
import extensionInstancesInjectable from "../../../extensions/extension-loader/extension-instances.injectable";
|
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 directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
|
||||||
import broadcastMessageInjectable from "../../../common/ipc/broadcast-message.injectable";
|
import broadcastMessageInjectable from "../../../common/ipc/broadcast-message.injectable";
|
||||||
@ -46,9 +46,11 @@ describe("protocol router tests", () => {
|
|||||||
|
|
||||||
enabledExtensions = new Set();
|
enabledExtensions = new Set();
|
||||||
|
|
||||||
di.override(extensionsStoreInjectable, () => ({
|
di.override(enabledExtensionsStateInjectable, () => ({
|
||||||
isEnabled: ({ id, isBundled }: IsEnabledExtensionDescriptor) => isBundled || enabledExtensions.has(id),
|
isEnabled: ({ id, isBundled }) => isBundled || enabledExtensions.has(id),
|
||||||
} as unknown as ExtensionsStore));
|
enabledExtensions: computed(() => []),
|
||||||
|
mergeState: noop,
|
||||||
|
}));
|
||||||
|
|
||||||
di.permitSideEffects(getConfigurationFileModelInjectable);
|
di.permitSideEffects(getConfigurationFileModelInjectable);
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import extensionLoaderInjectable from "../../../extensions/extension-loader/extension-loader.injectable";
|
import extensionLoaderInjectable from "../../../extensions/extension-loader/extension-loader.injectable";
|
||||||
import { LensProtocolRouterMain } from "./lens-protocol-router-main";
|
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 showApplicationWindowInjectable from "../../start-main-application/lens-window/show-application-window.injectable";
|
||||||
import broadcastMessageInjectable from "../../../common/ipc/broadcast-message.injectable";
|
import broadcastMessageInjectable from "../../../common/ipc/broadcast-message.injectable";
|
||||||
import loggerInjectable from "../../../common/logger.injectable";
|
import loggerInjectable from "../../../common/logger.injectable";
|
||||||
@ -16,7 +16,7 @@ const lensProtocolRouterMainInjectable = getInjectable({
|
|||||||
instantiate: (di) =>
|
instantiate: (di) =>
|
||||||
new LensProtocolRouterMain({
|
new LensProtocolRouterMain({
|
||||||
extensionLoader: di.inject(extensionLoaderInjectable),
|
extensionLoader: di.inject(extensionLoaderInjectable),
|
||||||
extensionsStore: di.inject(extensionsStoreInjectable),
|
extensionsStore: di.inject(enabledExtensionsStateInjectable),
|
||||||
showApplicationWindow: di.inject(showApplicationWindowInjectable),
|
showApplicationWindow: di.inject(showApplicationWindowInjectable),
|
||||||
broadcastMessage: di.inject(broadcastMessageInjectable),
|
broadcastMessage: di.inject(broadcastMessageInjectable),
|
||||||
logger: di.inject(loggerInjectable),
|
logger: di.inject(loggerInjectable),
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import extensionLoaderInjectable from "../../../extensions/extension-loader/extension-loader.injectable";
|
import extensionLoaderInjectable from "../../../extensions/extension-loader/extension-loader.injectable";
|
||||||
import { LensProtocolRouterRenderer } from "./lens-protocol-router-renderer";
|
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 loggerInjectable from "../../../common/logger.injectable";
|
||||||
import showErrorNotificationInjectable from "../../components/notifications/show-error-notification.injectable";
|
import showErrorNotificationInjectable from "../../components/notifications/show-error-notification.injectable";
|
||||||
import showShortInfoNotificationInjectable from "../../components/notifications/show-short-info.injectable";
|
import showShortInfoNotificationInjectable from "../../components/notifications/show-short-info.injectable";
|
||||||
@ -15,7 +15,7 @@ const lensProtocolRouterRendererInjectable = getInjectable({
|
|||||||
|
|
||||||
instantiate: (di) => new LensProtocolRouterRenderer({
|
instantiate: (di) => new LensProtocolRouterRenderer({
|
||||||
extensionLoader: di.inject(extensionLoaderInjectable),
|
extensionLoader: di.inject(extensionLoaderInjectable),
|
||||||
extensionsStore: di.inject(extensionsStoreInjectable),
|
extensionsStore: di.inject(enabledExtensionsStateInjectable),
|
||||||
logger: di.inject(loggerInjectable),
|
logger: di.inject(loggerInjectable),
|
||||||
showErrorNotification: di.inject(showErrorNotificationInjectable),
|
showErrorNotification: di.inject(showErrorNotificationInjectable),
|
||||||
showShortInfoNotification: di.inject(showShortInfoNotificationInjectable),
|
showShortInfoNotification: di.inject(showShortInfoNotificationInjectable),
|
||||||
|
|||||||
@ -10,7 +10,7 @@ const enlistMessageChannelListenerInjectable = getInjectable({
|
|||||||
const ipcMain = di.inject(ipcMainInjectable);
|
const ipcMain = di.inject(ipcMainInjectable);
|
||||||
|
|
||||||
return ({ channel, handler }) => {
|
return ({ channel, handler }) => {
|
||||||
const nativeOnCallback = (nativeEvent: IpcMainEvent, message: unknown) => {
|
const nativeOnCallback = (nativeEvent: IpcMainEvent, message: any) => {
|
||||||
handler(message, { frameId: nativeEvent.frameId, processId: nativeEvent.processId });
|
handler(message, { frameId: nativeEvent.frameId, processId: nativeEvent.processId });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ const enlistMessageChannelListenerInjectable = getInjectable({
|
|||||||
const ipcRenderer = di.inject(ipcRendererInjectable);
|
const ipcRenderer = di.inject(ipcRendererInjectable);
|
||||||
|
|
||||||
return ({ channel, handler }) => {
|
return ({ channel, handler }) => {
|
||||||
const nativeCallback = (event: IpcRendererEvent, message: unknown) => {
|
const nativeCallback = (_: IpcRendererEvent, message: any) => {
|
||||||
handler(message);
|
handler(message);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -10,6 +10,7 @@ interface Iterator<T> extends Iterable<T> {
|
|||||||
filterMap<U>(fn: (val: T) => Falsy | U): Iterator<U>;
|
filterMap<U>(fn: (val: T) => Falsy | U): Iterator<U>;
|
||||||
find(fn: (val: T) => unknown): T | undefined;
|
find(fn: (val: T) => unknown): T | undefined;
|
||||||
collect<U>(fn: (values: Iterable<T>) => U): U;
|
collect<U>(fn: (values: Iterable<T>) => U): U;
|
||||||
|
toArray(): T[];
|
||||||
map<U>(fn: (val: T) => U): Iterator<U>;
|
map<U>(fn: (val: T) => U): Iterator<U>;
|
||||||
flatMap<U>(fn: (val: T) => U[]): Iterator<U>;
|
flatMap<U>(fn: (val: T) => U[]): Iterator<U>;
|
||||||
concat(src2: IterableIterator<T>): Iterator<T>;
|
concat(src2: IterableIterator<T>): Iterator<T>;
|
||||||
@ -26,6 +27,7 @@ function chain<T>(src: IterableIterator<T>): Iterator<T> {
|
|||||||
find: (fn) => find(src, fn),
|
find: (fn) => find(src, fn),
|
||||||
join: (sep) => join(src, sep),
|
join: (sep) => join(src, sep),
|
||||||
collect: (fn) => fn(src),
|
collect: (fn) => fn(src),
|
||||||
|
toArray: () => [...src],
|
||||||
concat: (src2) => chain(concat(src, src2)),
|
concat: (src2) => chain(concat(src, src2)),
|
||||||
take: (count) => chain(take(src, count)),
|
take: (count) => chain(take(src, count)),
|
||||||
[Symbol.iterator]: () => src,
|
[Symbol.iterator]: () => src,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user