mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Simplify extension dependency injection
- Has better typing - Removes use of unnusual unique symbol Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
e3c0bc34fd
commit
a045006a02
@ -1,17 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { getInjectionToken } from "@ogre-tools/injectable";
|
|
||||||
import type { BundledInstalledExtension, ExternalInstalledExtension } from "../extension-discovery/extension-discovery";
|
|
||||||
import type { BundledLensExtensionContructor, LensExtension, LensExtensionConstructor } from "../lens-extension";
|
|
||||||
|
|
||||||
export interface CreateExtensionInstance {
|
|
||||||
(ExtensionClass: LensExtensionConstructor, extension: ExternalInstalledExtension): LensExtension;
|
|
||||||
(ExtensionClass: BundledLensExtensionContructor, extension: BundledInstalledExtension): LensExtension;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const createExtensionInstanceInjectionToken = getInjectionToken<CreateExtensionInstance>({
|
|
||||||
id: "create-extension-instance-token",
|
|
||||||
});
|
|
||||||
@ -5,7 +5,6 @@
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { ExtensionLoader } from "./extension-loader";
|
import { ExtensionLoader } from "./extension-loader";
|
||||||
import updateExtensionsStateInjectable from "./update-extensions-state/update-extensions-state.injectable";
|
import updateExtensionsStateInjectable from "./update-extensions-state/update-extensions-state.injectable";
|
||||||
import { createExtensionInstanceInjectionToken } from "./create-extension-instance.token";
|
|
||||||
import extensionInstancesInjectable from "./extension-instances.injectable";
|
import extensionInstancesInjectable from "./extension-instances.injectable";
|
||||||
import type { LensExtension } from "../lens-extension";
|
import type { LensExtension } from "../lens-extension";
|
||||||
import extensionInjectable from "./extension/extension.injectable";
|
import extensionInjectable from "./extension/extension.injectable";
|
||||||
@ -20,7 +19,6 @@ const extensionLoaderInjectable = getInjectable({
|
|||||||
|
|
||||||
instantiate: (di) => new ExtensionLoader({
|
instantiate: (di) => new ExtensionLoader({
|
||||||
updateExtensionsState: di.inject(updateExtensionsStateInjectable),
|
updateExtensionsState: di.inject(updateExtensionsStateInjectable),
|
||||||
createExtensionInstance: di.inject(createExtensionInstanceInjectionToken),
|
|
||||||
extensionInstances: di.inject(extensionInstancesInjectable),
|
extensionInstances: di.inject(extensionInstancesInjectable),
|
||||||
getExtension: (instance: LensExtension) => di.inject(extensionInjectable, instance),
|
getExtension: (instance: LensExtension) => di.inject(extensionInjectable, instance),
|
||||||
bundledExtensions: di.injectMany(bundledExtensionInjectionToken),
|
bundledExtensions: di.injectMany(bundledExtensionInjectionToken),
|
||||||
|
|||||||
@ -9,14 +9,13 @@ import type { ObservableMap } from "mobx";
|
|||||||
import { runInAction, action, computed, observable, reaction, when } from "mobx";
|
import { runInAction, action, computed, observable, reaction, when } from "mobx";
|
||||||
import { broadcastMessage, ipcMainOn, ipcRendererOn, ipcMainHandle } from "../../common/ipc";
|
import { broadcastMessage, ipcMainOn, ipcRendererOn, ipcMainHandle } from "../../common/ipc";
|
||||||
import { isDefined, iter, toJS } from "../../common/utils";
|
import { isDefined, iter, toJS } from "../../common/utils";
|
||||||
import type { ExternalInstalledExtension, InstalledExtension } from "../extension-discovery/extension-discovery";
|
import type { BundledInstalledExtension, ExternalInstalledExtension, InstalledExtension } from "../extension-discovery/extension-discovery";
|
||||||
import type { LensExtension, LensExtensionConstructor, LensExtensionId } from "../lens-extension";
|
import type { LensExtension, LensExtensionConstructor, LensExtensionId } from "../lens-extension";
|
||||||
import type { LensExtensionState } from "../extensions-store/extensions-store";
|
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";
|
||||||
import { EventEmitter } from "../../common/event-emitter";
|
import { EventEmitter } from "../../common/event-emitter";
|
||||||
import type { CreateExtensionInstance } from "./create-extension-instance.token";
|
|
||||||
import type { Extension } from "./extension/extension.injectable";
|
import type { Extension } from "./extension/extension.injectable";
|
||||||
import type { Logger } from "../../common/logger";
|
import type { Logger } from "../../common/logger";
|
||||||
import type { JoinPaths } from "../../common/path/join-paths.injectable";
|
import type { JoinPaths } from "../../common/path/join-paths.injectable";
|
||||||
@ -31,7 +30,6 @@ interface Dependencies {
|
|||||||
readonly logger: Logger;
|
readonly logger: Logger;
|
||||||
readonly extensionEntryPointName: "main" | "renderer";
|
readonly extensionEntryPointName: "main" | "renderer";
|
||||||
updateExtensionsState: (extensionsState: Record<LensExtensionId, LensExtensionState>) => void;
|
updateExtensionsState: (extensionsState: Record<LensExtensionId, LensExtensionState>) => void;
|
||||||
createExtensionInstance: CreateExtensionInstance;
|
|
||||||
getExtension: (instance: LensExtension) => Extension;
|
getExtension: (instance: LensExtension) => Extension;
|
||||||
joinPaths: JoinPaths;
|
joinPaths: JoinPaths;
|
||||||
getDirnameOfPath: GetDirnameOfPath;
|
getDirnameOfPath: GetDirnameOfPath;
|
||||||
@ -239,7 +237,7 @@ export class ExtensionLoader {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const installedExtension: InstalledExtension = {
|
const installedExtension: BundledInstalledExtension = {
|
||||||
absolutePath: "irrelevant",
|
absolutePath: "irrelevant",
|
||||||
id: extension.manifest.name,
|
id: extension.manifest.name,
|
||||||
isBundled: true,
|
isBundled: true,
|
||||||
@ -248,10 +246,7 @@ export class ExtensionLoader {
|
|||||||
manifest: extension.manifest,
|
manifest: extension.manifest,
|
||||||
manifestPath: "irrelevant",
|
manifestPath: "irrelevant",
|
||||||
};
|
};
|
||||||
const instance = this.dependencies.createExtensionInstance(
|
const instance = new LensExtensionClass(installedExtension);
|
||||||
LensExtensionClass,
|
|
||||||
installedExtension,
|
|
||||||
);
|
|
||||||
|
|
||||||
this.dependencies.extensionInstances.set(extension.manifest.name, instance);
|
this.dependencies.extensionInstances.set(extension.manifest.name, instance);
|
||||||
|
|
||||||
@ -310,35 +305,32 @@ export class ExtensionLoader {
|
|||||||
|
|
||||||
return [...installedExtensions.entries()]
|
return [...installedExtensions.entries()]
|
||||||
.filter((entry): entry is [string, ExternalInstalledExtension] => !entry[1].isBundled)
|
.filter((entry): entry is [string, ExternalInstalledExtension] => !entry[1].isBundled)
|
||||||
.map(([extId, extension]) => {
|
.map(([extId, installedExtension]) => {
|
||||||
const alreadyInit = this.dependencies.extensionInstances.has(extId) || this.nonInstancesByName.has(extension.manifest.name);
|
const alreadyInit = this.dependencies.extensionInstances.has(extId) || this.nonInstancesByName.has(installedExtension.manifest.name);
|
||||||
|
|
||||||
if (extension.isCompatible && extension.isEnabled && !alreadyInit) {
|
if (installedExtension.isCompatible && installedExtension.isEnabled && !alreadyInit) {
|
||||||
try {
|
try {
|
||||||
const LensExtensionClass = this.requireExtension(extension);
|
const LensExtensionClass = this.requireExtension(installedExtension);
|
||||||
|
|
||||||
if (!LensExtensionClass) {
|
if (!LensExtensionClass) {
|
||||||
this.nonInstancesByName.add(extension.manifest.name);
|
this.nonInstancesByName.add(installedExtension.manifest.name);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const instance = this.dependencies.createExtensionInstance(
|
const instance = new LensExtensionClass(installedExtension);
|
||||||
LensExtensionClass,
|
|
||||||
extension,
|
|
||||||
);
|
|
||||||
|
|
||||||
this.dependencies.extensionInstances.set(extId, instance);
|
this.dependencies.extensionInstances.set(extId, instance);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
instance,
|
instance,
|
||||||
installedExtension: extension,
|
installedExtension,
|
||||||
activated: instance.activate(),
|
activated: instance.activate(),
|
||||||
} as ExtensionBeingActivated;
|
} as ExtensionBeingActivated;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.dependencies.logger.error(`${logModule}: error loading extension`, { ext: extension, err });
|
this.dependencies.logger.error(`${logModule}: error loading extension`, { ext: installedExtension, err });
|
||||||
}
|
}
|
||||||
} else if (!extension.isEnabled && alreadyInit) {
|
} else if (!installedExtension.isEnabled && alreadyInit) {
|
||||||
this.removeInstance(extId);
|
this.removeInstance(extId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,33 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import type { IComputedValue } from "mobx";
|
|
||||||
import type { CatalogCategoryRegistry } from "../common/catalog";
|
|
||||||
import type { NavigateToRoute } from "../common/front-end-routing/navigate-to-route-injection-token";
|
|
||||||
import type { Route } from "../common/front-end-routing/front-end-route-injection-token";
|
|
||||||
import type { CatalogEntityRegistry as MainCatalogEntityRegistry } from "../main/catalog";
|
|
||||||
import type { CatalogEntityRegistry as RendererCatalogEntityRegistry } from "../renderer/api/catalog/entity/registry";
|
|
||||||
import type { GetExtensionPageParameters } from "../renderer/routes/get-extension-page-parameters.injectable";
|
|
||||||
import type { FileSystemProvisionerStore } from "./extension-loader/file-system-provisioner-store/file-system-provisioner-store";
|
|
||||||
import type { NavigateForExtension } from "../main/start-main-application/lens-window/navigate-for-extension.injectable";
|
|
||||||
import type { Logger } from "../common/logger";
|
|
||||||
|
|
||||||
export interface LensExtensionDependencies {
|
|
||||||
readonly fileSystemProvisionerStore: FileSystemProvisionerStore;
|
|
||||||
readonly logger: Logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface LensMainExtensionDependencies extends LensExtensionDependencies {
|
|
||||||
readonly entityRegistry: MainCatalogEntityRegistry;
|
|
||||||
readonly navigate: NavigateForExtension;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface LensRendererExtensionDependencies extends LensExtensionDependencies {
|
|
||||||
navigateToRoute: NavigateToRoute;
|
|
||||||
getExtensionPageParameters: GetExtensionPageParameters;
|
|
||||||
readonly routes: IComputedValue<Route<unknown>[]>;
|
|
||||||
readonly entityRegistry: RendererCatalogEntityRegistry;
|
|
||||||
readonly categoryRegistry: CatalogCategoryRegistry;
|
|
||||||
}
|
|
||||||
@ -6,9 +6,10 @@
|
|||||||
import type { BundledInstalledExtension, ExternalInstalledExtension, InstalledExtension } from "./extension-discovery/extension-discovery";
|
import type { BundledInstalledExtension, ExternalInstalledExtension, InstalledExtension } from "./extension-discovery/extension-discovery";
|
||||||
import { action, computed, makeObservable, observable } from "mobx";
|
import { action, computed, makeObservable, observable } from "mobx";
|
||||||
import { disposer } from "../common/utils";
|
import { disposer } from "../common/utils";
|
||||||
import type { LensExtensionDependencies } from "./lens-extension-set-dependencies";
|
|
||||||
import type { ProtocolHandlerRegistration } from "../common/protocol-handler/registration";
|
import type { ProtocolHandlerRegistration } from "../common/protocol-handler/registration";
|
||||||
import type { PackageJson } from "type-fest";
|
import type { PackageJson } from "type-fest";
|
||||||
|
import type { FileSystemProvisionerStore } from "./extension-loader/file-system-provisioner-store/file-system-provisioner-store";
|
||||||
|
import type { Logger } from "../common/logger";
|
||||||
|
|
||||||
export type LensExtensionId = string; // path to manifest (package.json)
|
export type LensExtensionId = string; // path to manifest (package.json)
|
||||||
export type LensExtensionConstructor = new (ext: ExternalInstalledExtension) => LensExtension;
|
export type LensExtensionConstructor = new (ext: ExternalInstalledExtension) => LensExtension;
|
||||||
@ -20,6 +21,11 @@ export interface BundledLensExtensionManifest extends PackageJson {
|
|||||||
publishConfig?: Partial<Record<string, string>>;
|
publishConfig?: Partial<Record<string, string>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface LensExtensionDependencies {
|
||||||
|
readonly fileSystemProvisionerStore: FileSystemProvisionerStore;
|
||||||
|
readonly logger: Logger;
|
||||||
|
}
|
||||||
|
|
||||||
export interface LensExtensionManifest extends BundledLensExtensionManifest {
|
export interface LensExtensionManifest extends BundledLensExtensionManifest {
|
||||||
main?: string; // path to %ext/dist/main.js
|
main?: string; // path to %ext/dist/main.js
|
||||||
renderer?: string; // path to %ext/dist/renderer.js
|
renderer?: string; // path to %ext/dist/renderer.js
|
||||||
@ -37,15 +43,9 @@ export interface LensExtensionManifest extends BundledLensExtensionManifest {
|
|||||||
storeName?: string;
|
storeName?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const lensExtensionDependencies = Symbol("lens-extension-dependencies");
|
|
||||||
export const Disposers = Symbol("disposers");
|
export const Disposers = Symbol("disposers");
|
||||||
|
|
||||||
export class LensExtension<
|
export class LensExtension {
|
||||||
/**
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
Dependencies extends LensExtensionDependencies = LensExtensionDependencies,
|
|
||||||
> {
|
|
||||||
readonly id: LensExtensionId;
|
readonly id: LensExtensionId;
|
||||||
readonly manifest: LensExtensionManifest;
|
readonly manifest: LensExtensionManifest;
|
||||||
readonly manifestPath: string;
|
readonly manifestPath: string;
|
||||||
@ -55,6 +55,11 @@ export class LensExtension<
|
|||||||
return sanitizeExtensionName(this.name);
|
return sanitizeExtensionName(this.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
protected readonly dependencies: LensExtensionDependencies;
|
||||||
|
|
||||||
protocolHandlers: ProtocolHandlerRegistration[] = [];
|
protocolHandlers: ProtocolHandlerRegistration[] = [];
|
||||||
|
|
||||||
@observable private _isEnabled = false;
|
@observable private _isEnabled = false;
|
||||||
@ -68,12 +73,12 @@ export class LensExtension<
|
|||||||
*/
|
*/
|
||||||
[Disposers] = disposer();
|
[Disposers] = disposer();
|
||||||
|
|
||||||
constructor({ id, manifest, manifestPath, isBundled }: InstalledExtension) {
|
constructor(deps: LensExtensionDependencies, { id, manifest, manifestPath, isBundled }: InstalledExtension) {
|
||||||
// id is the name of the manifest
|
this.dependencies = deps;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.manifest = manifest as LensExtensionManifest;
|
this.manifest = manifest as LensExtensionManifest;
|
||||||
this.manifestPath = manifestPath;
|
this.manifestPath = manifestPath;
|
||||||
this.isBundled = !!isBundled;
|
this.isBundled = isBundled;
|
||||||
makeObservable(this);
|
makeObservable(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,11 +99,6 @@ export class LensExtension<
|
|||||||
return this.manifest.storeName || this.name;
|
return this.manifest.storeName || this.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
readonly [lensExtensionDependencies]!: Dependencies;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getExtensionFileFolder returns the path to an already created folder. This
|
* getExtensionFileFolder returns the path to an already created folder. This
|
||||||
* folder is for the sole use of this extension.
|
* folder is for the sole use of this extension.
|
||||||
@ -108,7 +108,7 @@ export class LensExtension<
|
|||||||
*/
|
*/
|
||||||
async getExtensionFileFolder(): Promise<string> {
|
async getExtensionFileFolder(): Promise<string> {
|
||||||
// storeName is read from the manifest and has a fallback to the manifest name, which equals id
|
// storeName is read from the manifest and has a fallback to the manifest name, which equals id
|
||||||
return this[lensExtensionDependencies].fileSystemProvisionerStore.requestDirectory(this.storeName);
|
return this.dependencies.fileSystemProvisionerStore.requestDirectory(this.storeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@ -118,7 +118,7 @@ export class LensExtension<
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._isEnabled = true;
|
this._isEnabled = true;
|
||||||
this[lensExtensionDependencies].logger.info(`[EXTENSION]: enabled ${this.name}@${this.version}`);
|
this.dependencies.logger.info(`[EXTENSION]: enabled ${this.name}@${this.version}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
@ -132,9 +132,9 @@ export class LensExtension<
|
|||||||
try {
|
try {
|
||||||
await this.onDeactivate();
|
await this.onDeactivate();
|
||||||
this[Disposers]();
|
this[Disposers]();
|
||||||
this[lensExtensionDependencies].logger.info(`[EXTENSION]: disabled ${this.name}@${this.version}`);
|
this.dependencies.logger.info(`[EXTENSION]: disabled ${this.name}@${this.version}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this[lensExtensionDependencies].logger.error(`[EXTENSION]: disabling ${this.name}@${this.version} threw an error: ${error}`);
|
this.dependencies.logger.error(`[EXTENSION]: disabling ${this.name}@${this.version} threw an error: ${error}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,19 +3,49 @@
|
|||||||
* 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 { LensExtension, lensExtensionDependencies } from "./lens-extension";
|
import type { LensExtensionDependencies } from "./lens-extension";
|
||||||
|
import { LensExtension } from "./lens-extension";
|
||||||
import type { CatalogEntity } from "../common/catalog";
|
import type { CatalogEntity } from "../common/catalog";
|
||||||
import type { IComputedValue, IObservableArray } from "mobx";
|
import type { IComputedValue, IObservableArray } from "mobx";
|
||||||
import { isObservableArray } from "mobx";
|
import { isObservableArray } from "mobx";
|
||||||
import type { MenuRegistration } from "../features/application-menu/main/menu-registration";
|
import type { MenuRegistration } from "../features/application-menu/main/menu-registration";
|
||||||
import type { TrayMenuRegistration } from "../main/tray/tray-menu-registration";
|
import type { TrayMenuRegistration } from "../main/tray/tray-menu-registration";
|
||||||
import type { ShellEnvModifier } from "../main/shell-session/shell-env-modifier/shell-env-modifier-registration";
|
import type { ShellEnvModifier } from "../main/shell-session/shell-env-modifier/shell-env-modifier-registration";
|
||||||
import type { LensMainExtensionDependencies } from "./lens-extension-set-dependencies";
|
import { Environments, getEnvironmentSpecificLegacyGlobalDiForExtensionApi } from "./as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api";
|
||||||
|
import type { InstalledExtension } from "./common-api";
|
||||||
|
import type { CatalogEntityRegistry } from "../main/catalog";
|
||||||
|
import type { NavigateForExtension } from "../main/start-main-application/lens-window/navigate-for-extension.injectable";
|
||||||
|
import catalogEntityRegistryInjectable from "../main/catalog/entity-registry.injectable";
|
||||||
|
import fileSystemProvisionerStoreInjectable from "./extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable";
|
||||||
|
import loggerInjectable from "../common/logger.injectable";
|
||||||
|
import navigateForExtensionInjectable from "../main/start-main-application/lens-window/navigate-for-extension.injectable";
|
||||||
|
|
||||||
export class LensMainExtension extends LensExtension<LensMainExtensionDependencies> {
|
interface LensMainExtensionDependencies extends LensExtensionDependencies {
|
||||||
|
readonly entityRegistry: CatalogEntityRegistry;
|
||||||
|
readonly navigate: NavigateForExtension;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class LensMainExtension extends LensExtension {
|
||||||
appMenus: MenuRegistration[] | IComputedValue<MenuRegistration[]> = [];
|
appMenus: MenuRegistration[] | IComputedValue<MenuRegistration[]> = [];
|
||||||
trayMenus: TrayMenuRegistration[] | IComputedValue<TrayMenuRegistration[]> = [];
|
trayMenus: TrayMenuRegistration[] | IComputedValue<TrayMenuRegistration[]> = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
declare readonly dependencies: LensMainExtensionDependencies;
|
||||||
|
|
||||||
|
constructor(extension: InstalledExtension) {
|
||||||
|
const di = getEnvironmentSpecificLegacyGlobalDiForExtensionApi(Environments.main);
|
||||||
|
const deps: LensMainExtensionDependencies = {
|
||||||
|
entityRegistry: di.inject(catalogEntityRegistryInjectable),
|
||||||
|
fileSystemProvisionerStore: di.inject(fileSystemProvisionerStoreInjectable),
|
||||||
|
logger: di.inject(loggerInjectable),
|
||||||
|
navigate: di.inject(navigateForExtensionInjectable),
|
||||||
|
};
|
||||||
|
|
||||||
|
super(deps, extension);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* implement this to modify the shell environment that Lens terminals are opened with. The ShellEnvModifier type has the signature
|
* implement this to modify the shell environment that Lens terminals are opened with. The ShellEnvModifier type has the signature
|
||||||
*
|
*
|
||||||
@ -32,18 +62,18 @@ export class LensMainExtension extends LensExtension<LensMainExtensionDependenci
|
|||||||
terminalShellEnvModifier?: ShellEnvModifier;
|
terminalShellEnvModifier?: ShellEnvModifier;
|
||||||
|
|
||||||
async navigate(pageId?: string, params?: Record<string, any>, frameId?: number) {
|
async navigate(pageId?: string, params?: Record<string, any>, frameId?: number) {
|
||||||
await this[lensExtensionDependencies].navigate(this.id, pageId, params, frameId);
|
await this.dependencies.navigate(this.id, pageId, params, frameId);
|
||||||
}
|
}
|
||||||
|
|
||||||
addCatalogSource(id: string, source: IObservableArray<CatalogEntity> | IComputedValue<CatalogEntity[]>) {
|
addCatalogSource(id: string, source: IObservableArray<CatalogEntity> | IComputedValue<CatalogEntity[]>) {
|
||||||
if (isObservableArray(source)) {
|
if (isObservableArray(source)) {
|
||||||
this[lensExtensionDependencies].entityRegistry.addObservableSource(`${this.name}:${id}`, source);
|
this.dependencies.entityRegistry.addObservableSource(`${this.name}:${id}`, source);
|
||||||
} else {
|
} else {
|
||||||
this[lensExtensionDependencies].entityRegistry.addComputedSource(`${this.name}:${id}`, source);
|
this.dependencies.entityRegistry.addComputedSource(`${this.name}:${id}`, source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
removeCatalogSource(id: string) {
|
removeCatalogSource(id: string) {
|
||||||
this[lensExtensionDependencies].entityRegistry.removeSource(`${this.name}:${id}`);
|
this.dependencies.entityRegistry.removeSource(`${this.name}:${id}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,10 +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 { Disposers, LensExtension, lensExtensionDependencies } from "./lens-extension";
|
import type { LensExtensionDependencies } from "./lens-extension";
|
||||||
import type { CatalogEntity, CategoryFilter } from "../common/catalog";
|
import { Disposers, LensExtension } from "./lens-extension";
|
||||||
|
import type { CatalogEntity, CategoryFilter, CatalogCategoryRegistry } from "../common/catalog";
|
||||||
import type { Disposer } from "../common/utils";
|
import type { Disposer } from "../common/utils";
|
||||||
import type { EntityFilter } from "../renderer/api/catalog/entity/registry";
|
import type { EntityFilter, CatalogEntityRegistry } from "../renderer/api/catalog/entity/registry";
|
||||||
import type { TopBarRegistration } from "../renderer/components/layout/top-bar/top-bar-registration";
|
import type { TopBarRegistration } from "../renderer/components/layout/top-bar/top-bar-registration";
|
||||||
import type { KubernetesCluster } from "../common/catalog-entities";
|
import type { KubernetesCluster } from "../common/catalog-entities";
|
||||||
import type { WelcomeMenuRegistration } from "../renderer/components/+welcome/welcome-menu-items/welcome-menu-registration";
|
import type { WelcomeMenuRegistration } from "../renderer/components/+welcome/welcome-menu-items/welcome-menu-registration";
|
||||||
@ -22,7 +23,6 @@ import type { KubeObjectStatusRegistration } from "../renderer/components/kube-o
|
|||||||
import { fromPairs, map, matches, toPairs } from "lodash/fp";
|
import { fromPairs, map, matches, toPairs } from "lodash/fp";
|
||||||
import { pipeline } from "@ogre-tools/fp";
|
import { pipeline } from "@ogre-tools/fp";
|
||||||
import { getExtensionRoutePath } from "../renderer/routes/for-extension";
|
import { getExtensionRoutePath } from "../renderer/routes/for-extension";
|
||||||
import type { LensRendererExtensionDependencies } from "./lens-extension-set-dependencies";
|
|
||||||
import type { KubeObjectHandlerRegistration } from "../renderer/kube-object/handler";
|
import type { KubeObjectHandlerRegistration } from "../renderer/kube-object/handler";
|
||||||
import type { AppPreferenceTabRegistration } from "../features/preferences/renderer/compliance-for-legacy-extension-api/app-preference-tab-registration";
|
import type { AppPreferenceTabRegistration } from "../features/preferences/renderer/compliance-for-legacy-extension-api/app-preference-tab-registration";
|
||||||
import type { KubeObjectDetailRegistration } from "../renderer/components/kube-object-details/kube-object-detail-registration";
|
import type { KubeObjectDetailRegistration } from "../renderer/components/kube-object-details/kube-object-detail-registration";
|
||||||
@ -31,8 +31,20 @@ import type { EntitySettingRegistration } from "../renderer/components/+entity-s
|
|||||||
import type { CatalogEntityDetailRegistration } from "../renderer/components/+catalog/entity-details/token";
|
import type { CatalogEntityDetailRegistration } from "../renderer/components/+catalog/entity-details/token";
|
||||||
import type { PageRegistration } from "../renderer/routes/page-registration";
|
import type { PageRegistration } from "../renderer/routes/page-registration";
|
||||||
import type { ClusterPageMenuRegistration } from "../renderer/components/layout/cluster-page-menu";
|
import type { ClusterPageMenuRegistration } from "../renderer/components/layout/cluster-page-menu";
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
|
import type { NavigateToRoute } from "../common/front-end-routing/navigate-to-route-injection-token";
|
||||||
|
import type { Route } from "../common/front-end-routing/front-end-route-injection-token";
|
||||||
|
import type { GetExtensionPageParameters } from "../renderer/routes/get-extension-page-parameters.injectable";
|
||||||
|
|
||||||
export class LensRendererExtension extends LensExtension<LensRendererExtensionDependencies> {
|
interface LensRendererExtensionDependencies extends LensExtensionDependencies {
|
||||||
|
navigateToRoute: NavigateToRoute;
|
||||||
|
getExtensionPageParameters: GetExtensionPageParameters;
|
||||||
|
readonly routes: IComputedValue<Route<unknown>[]>;
|
||||||
|
readonly entityRegistry: CatalogEntityRegistry;
|
||||||
|
readonly categoryRegistry: CatalogCategoryRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class LensRendererExtension extends LensExtension {
|
||||||
globalPages: PageRegistration[] = [];
|
globalPages: PageRegistration[] = [];
|
||||||
clusterPages: PageRegistration[] = [];
|
clusterPages: PageRegistration[] = [];
|
||||||
clusterPageMenus: ClusterPageMenuRegistration[] = [];
|
clusterPageMenus: ClusterPageMenuRegistration[] = [];
|
||||||
@ -54,8 +66,13 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
customCategoryViews: CustomCategoryViewRegistration[] = [];
|
customCategoryViews: CustomCategoryViewRegistration[] = [];
|
||||||
kubeObjectHandlers: KubeObjectHandlerRegistration[] = [];
|
kubeObjectHandlers: KubeObjectHandlerRegistration[] = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
declare protected readonly dependencies: LensRendererExtensionDependencies;
|
||||||
|
|
||||||
async navigate(pageId?: string, params: object = {}) {
|
async navigate(pageId?: string, params: object = {}) {
|
||||||
const routes = this[lensExtensionDependencies].routes.get();
|
const routes = this.dependencies.routes.get();
|
||||||
const targetRegistration = [...this.globalPages, ...this.clusterPages]
|
const targetRegistration = [...this.globalPages, ...this.clusterPages]
|
||||||
.find(registration => registration.id === (pageId || undefined));
|
.find(registration => registration.id === (pageId || undefined));
|
||||||
|
|
||||||
@ -70,7 +87,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const normalizedParams = this[lensExtensionDependencies].getExtensionPageParameters({
|
const normalizedParams = this.dependencies.getExtensionPageParameters({
|
||||||
extension: this,
|
extension: this,
|
||||||
registration: targetRegistration,
|
registration: targetRegistration,
|
||||||
});
|
});
|
||||||
@ -84,7 +101,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
fromPairs,
|
fromPairs,
|
||||||
);
|
);
|
||||||
|
|
||||||
this[lensExtensionDependencies].navigateToRoute(targetRoute, {
|
this.dependencies.navigateToRoute(targetRoute, {
|
||||||
query,
|
query,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -107,7 +124,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
* @returns A function to clean up the filter
|
* @returns A function to clean up the filter
|
||||||
*/
|
*/
|
||||||
addCatalogFilter(fn: EntityFilter): Disposer {
|
addCatalogFilter(fn: EntityFilter): Disposer {
|
||||||
const dispose = this[lensExtensionDependencies].entityRegistry.addCatalogFilter(fn);
|
const dispose = this.dependencies.entityRegistry.addCatalogFilter(fn);
|
||||||
|
|
||||||
this[Disposers].push(dispose);
|
this[Disposers].push(dispose);
|
||||||
|
|
||||||
@ -120,7 +137,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
* @returns A function to clean up the filter
|
* @returns A function to clean up the filter
|
||||||
*/
|
*/
|
||||||
addCatalogCategoryFilter(fn: CategoryFilter): Disposer {
|
addCatalogCategoryFilter(fn: CategoryFilter): Disposer {
|
||||||
const dispose = this[lensExtensionDependencies].categoryRegistry.addCatalogCategoryFilter(fn);
|
const dispose = this.dependencies.categoryRegistry.addCatalogCategoryFilter(fn);
|
||||||
|
|
||||||
this[Disposers].push(dispose);
|
this[Disposers].push(dispose);
|
||||||
|
|
||||||
|
|||||||
@ -1,37 +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 type { Writable } from "type-fest";
|
|
||||||
import loggerInjectable from "../../common/logger.injectable";
|
|
||||||
import { createExtensionInstanceInjectionToken } from "../../extensions/extension-loader/create-extension-instance.token";
|
|
||||||
import fileSystemProvisionerStoreInjectable from "../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable";
|
|
||||||
import { lensExtensionDependencies } from "../../extensions/lens-extension";
|
|
||||||
import type { LensMainExtensionDependencies } from "../../extensions/lens-extension-set-dependencies";
|
|
||||||
import type { LensMainExtension } from "../../extensions/lens-main-extension";
|
|
||||||
import catalogEntityRegistryInjectable from "../catalog/entity-registry.injectable";
|
|
||||||
import navigateForExtensionInjectable from "../start-main-application/lens-window/navigate-for-extension.injectable";
|
|
||||||
|
|
||||||
const createExtensionInstanceInjectable = getInjectable({
|
|
||||||
id: "create-extension-instance",
|
|
||||||
instantiate: (di) => {
|
|
||||||
const deps: LensMainExtensionDependencies = {
|
|
||||||
fileSystemProvisionerStore: di.inject(fileSystemProvisionerStoreInjectable),
|
|
||||||
entityRegistry: di.inject(catalogEntityRegistryInjectable),
|
|
||||||
navigate: di.inject(navigateForExtensionInjectable),
|
|
||||||
logger: di.inject(loggerInjectable),
|
|
||||||
};
|
|
||||||
|
|
||||||
return (ExtensionClass, extension) => {
|
|
||||||
const instance = new ExtensionClass(extension as any) as LensMainExtension;
|
|
||||||
|
|
||||||
(instance as Writable<LensMainExtension>)[lensExtensionDependencies] = deps;
|
|
||||||
|
|
||||||
return instance;
|
|
||||||
};
|
|
||||||
},
|
|
||||||
injectionToken: createExtensionInstanceInjectionToken,
|
|
||||||
});
|
|
||||||
|
|
||||||
export default createExtensionInstanceInjectable;
|
|
||||||
@ -1,43 +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 type { Writable } from "type-fest";
|
|
||||||
import catalogCategoryRegistryInjectable from "../../common/catalog/category-registry.injectable";
|
|
||||||
import loggerInjectable from "../../common/logger.injectable";
|
|
||||||
import { createExtensionInstanceInjectionToken } from "../../extensions/extension-loader/create-extension-instance.token";
|
|
||||||
import fileSystemProvisionerStoreInjectable from "../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable";
|
|
||||||
import { lensExtensionDependencies } from "../../extensions/lens-extension";
|
|
||||||
import type { LensRendererExtensionDependencies } from "../../extensions/lens-extension-set-dependencies";
|
|
||||||
import type { LensRendererExtension } from "../../extensions/lens-renderer-extension";
|
|
||||||
import catalogEntityRegistryInjectable from "../api/catalog/entity/registry.injectable";
|
|
||||||
import getExtensionPageParametersInjectable from "../routes/get-extension-page-parameters.injectable";
|
|
||||||
import navigateToRouteInjectable from "../routes/navigate-to-route.injectable";
|
|
||||||
import routesInjectable from "../routes/routes.injectable";
|
|
||||||
|
|
||||||
const createExtensionInstanceInjectable = getInjectable({
|
|
||||||
id: "create-extension-instance",
|
|
||||||
instantiate: (di) => {
|
|
||||||
const deps: LensRendererExtensionDependencies = {
|
|
||||||
categoryRegistry: di.inject(catalogCategoryRegistryInjectable),
|
|
||||||
entityRegistry: di.inject(catalogEntityRegistryInjectable),
|
|
||||||
fileSystemProvisionerStore: di.inject(fileSystemProvisionerStoreInjectable),
|
|
||||||
getExtensionPageParameters: di.inject(getExtensionPageParametersInjectable),
|
|
||||||
navigateToRoute: di.inject(navigateToRouteInjectable),
|
|
||||||
routes: di.inject(routesInjectable),
|
|
||||||
logger: di.inject(loggerInjectable),
|
|
||||||
};
|
|
||||||
|
|
||||||
return (ExtensionClass, extension) => {
|
|
||||||
const instance = new ExtensionClass(extension as any) as LensRendererExtension;
|
|
||||||
|
|
||||||
(instance as Writable<LensRendererExtension>)[lensExtensionDependencies] = deps;
|
|
||||||
|
|
||||||
return instance;
|
|
||||||
};
|
|
||||||
},
|
|
||||||
injectionToken: createExtensionInstanceInjectionToken,
|
|
||||||
});
|
|
||||||
|
|
||||||
export default createExtensionInstanceInjectable;
|
|
||||||
Loading…
Reference in New Issue
Block a user