mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Adapt code and unit tests to recent changes in application setup and event handling
Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com> Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
parent
0d7cbcfaab
commit
f18926ab66
@ -83,17 +83,16 @@ describe("cluster-store", () => {
|
|||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
mainDi = getDiForUnitTesting({ doGeneralOverrides: true });
|
mainDi = getDiForUnitTesting({ doGeneralOverrides: true });
|
||||||
|
|
||||||
await runSetups(mainDi);
|
|
||||||
|
|
||||||
mockFs();
|
mockFs();
|
||||||
|
|
||||||
mainDi.override(clusterStoreInjectable, (di) => ClusterStore.createInstance({ createCluster: di.inject(createClusterInjectionToken) }));
|
|
||||||
mainDi.override(directoryForUserDataInjectable, () => "some-directory-for-user-data");
|
mainDi.override(directoryForUserDataInjectable, () => "some-directory-for-user-data");
|
||||||
|
|
||||||
mainDi.permitSideEffects(getConfigurationFileModelInjectable);
|
mainDi.permitSideEffects(getConfigurationFileModelInjectable);
|
||||||
mainDi.permitSideEffects(appVersionInjectable);
|
mainDi.permitSideEffects(appVersionInjectable);
|
||||||
|
mainDi.permitSideEffects(clusterStoreInjectable);
|
||||||
|
|
||||||
createCluster = mainDi.inject(createClusterInjectionToken);
|
// @ts-ignore
|
||||||
|
mainDi.unoverride(clusterStoreInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
@ -108,10 +107,6 @@ describe("cluster-store", () => {
|
|||||||
getCustomKubeConfigDirectoryInjectable,
|
getCustomKubeConfigDirectoryInjectable,
|
||||||
);
|
);
|
||||||
|
|
||||||
// TODO: Remove these by removing Singleton base-class from BaseStore
|
|
||||||
ClusterStore.getInstance(false)?.unregisterIpcListener();
|
|
||||||
ClusterStore.resetInstance();
|
|
||||||
|
|
||||||
const mockOpts = {
|
const mockOpts = {
|
||||||
"some-directory-for-user-data": {
|
"some-directory-for-user-data": {
|
||||||
"lens-cluster-store.json": JSON.stringify({}),
|
"lens-cluster-store.json": JSON.stringify({}),
|
||||||
@ -120,7 +115,13 @@ describe("cluster-store", () => {
|
|||||||
|
|
||||||
mockFs(mockOpts);
|
mockFs(mockOpts);
|
||||||
|
|
||||||
|
await runSetups(mainDi);
|
||||||
|
|
||||||
|
createCluster = mainDi.inject(createClusterInjectionToken);
|
||||||
|
|
||||||
clusterStore = mainDi.inject(clusterStoreInjectable);
|
clusterStore = mainDi.inject(clusterStoreInjectable);
|
||||||
|
|
||||||
|
clusterStore.unregisterIpcListener();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
@ -199,9 +200,7 @@ describe("cluster-store", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("config with existing clusters", () => {
|
describe("config with existing clusters", () => {
|
||||||
beforeEach(() => {
|
beforeEach(async () => {
|
||||||
ClusterStore.resetInstance();
|
|
||||||
|
|
||||||
const mockOpts = {
|
const mockOpts = {
|
||||||
"temp-kube-config": kubeconfig,
|
"temp-kube-config": kubeconfig,
|
||||||
"some-directory-for-user-data": {
|
"some-directory-for-user-data": {
|
||||||
@ -240,6 +239,10 @@ describe("cluster-store", () => {
|
|||||||
|
|
||||||
mockFs(mockOpts);
|
mockFs(mockOpts);
|
||||||
|
|
||||||
|
await runSetups(mainDi);
|
||||||
|
|
||||||
|
createCluster = mainDi.inject(createClusterInjectionToken);
|
||||||
|
|
||||||
clusterStore = mainDi.inject(clusterStoreInjectable);
|
clusterStore = mainDi.inject(clusterStoreInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -267,7 +270,7 @@ describe("cluster-store", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("config with invalid cluster kubeconfig", () => {
|
describe("config with invalid cluster kubeconfig", () => {
|
||||||
beforeEach(() => {
|
beforeEach(async () => {
|
||||||
const invalidKubeconfig = `
|
const invalidKubeconfig = `
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
clusters:
|
clusters:
|
||||||
@ -322,6 +325,10 @@ users:
|
|||||||
|
|
||||||
mockFs(mockOpts);
|
mockFs(mockOpts);
|
||||||
|
|
||||||
|
await runSetups(mainDi);
|
||||||
|
|
||||||
|
createCluster = mainDi.inject(createClusterInjectionToken);
|
||||||
|
|
||||||
clusterStore = mainDi.inject(clusterStoreInjectable);
|
clusterStore = mainDi.inject(clusterStoreInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -337,7 +344,7 @@ users:
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("pre 3.6.0-beta.1 config with an existing cluster", () => {
|
describe("pre 3.6.0-beta.1 config with an existing cluster", () => {
|
||||||
beforeEach(() => {
|
beforeEach(async () => {
|
||||||
ClusterStore.resetInstance();
|
ClusterStore.resetInstance();
|
||||||
const mockOpts = {
|
const mockOpts = {
|
||||||
"some-directory-for-user-data": {
|
"some-directory-for-user-data": {
|
||||||
@ -364,6 +371,10 @@ users:
|
|||||||
|
|
||||||
mockFs(mockOpts);
|
mockFs(mockOpts);
|
||||||
|
|
||||||
|
await runSetups(mainDi);
|
||||||
|
|
||||||
|
createCluster = mainDi.inject(createClusterInjectionToken);
|
||||||
|
|
||||||
clusterStore = mainDi.inject(clusterStoreInjectable);
|
clusterStore = mainDi.inject(clusterStoreInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -15,60 +15,8 @@ import hotbarStoreInjectable from "../hotbar-store.injectable";
|
|||||||
import { HotbarStore } from "../hotbar-store";
|
import { HotbarStore } from "../hotbar-store";
|
||||||
import catalogCatalogEntityInjectable from "../catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable";
|
import catalogCatalogEntityInjectable from "../catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable";
|
||||||
import { runSetups } from "../setupable-injection-token/run-setups";
|
import { runSetups } from "../setupable-injection-token/run-setups";
|
||||||
|
import catalogEntityRegistryInjectable from "../../main/catalog/catalog-entity-registry.injectable";
|
||||||
|
|
||||||
jest.mock("../../main/catalog/catalog-entity-registry", () => ({
|
|
||||||
catalogEntityRegistry: {
|
|
||||||
items: [
|
|
||||||
getMockCatalogEntity({
|
|
||||||
apiVersion: "v1",
|
|
||||||
kind: "Cluster",
|
|
||||||
|
|
||||||
status: {
|
|
||||||
phase: "Running",
|
|
||||||
},
|
|
||||||
|
|
||||||
metadata: {
|
|
||||||
uid: "1dfa26e2ebab15780a3547e9c7fa785c",
|
|
||||||
name: "mycluster",
|
|
||||||
source: "local",
|
|
||||||
labels: {},
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
|
|
||||||
getMockCatalogEntity({
|
|
||||||
apiVersion: "v1",
|
|
||||||
kind: "Cluster",
|
|
||||||
|
|
||||||
status: {
|
|
||||||
phase: "Running",
|
|
||||||
},
|
|
||||||
|
|
||||||
metadata: {
|
|
||||||
uid: "55b42c3c7ba3b04193416cda405269a5",
|
|
||||||
name: "my_shiny_cluster",
|
|
||||||
source: "remote",
|
|
||||||
labels: {},
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
|
|
||||||
getMockCatalogEntity({
|
|
||||||
apiVersion: "v1",
|
|
||||||
kind: "Cluster",
|
|
||||||
|
|
||||||
status: {
|
|
||||||
phase: "Running",
|
|
||||||
},
|
|
||||||
|
|
||||||
metadata: {
|
|
||||||
uid: "catalog-entity",
|
|
||||||
name: "Catalog",
|
|
||||||
source: "app",
|
|
||||||
labels: {},
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
|
|
||||||
function getMockCatalogEntity(data: Partial<CatalogEntityData> & CatalogEntityKindData): CatalogEntity {
|
function getMockCatalogEntity(data: Partial<CatalogEntityData> & CatalogEntityKindData): CatalogEntity {
|
||||||
return {
|
return {
|
||||||
@ -134,6 +82,59 @@ describe("HotbarStore", () => {
|
|||||||
di.permitSideEffects(getConfigurationFileModelInjectable);
|
di.permitSideEffects(getConfigurationFileModelInjectable);
|
||||||
di.permitSideEffects(appVersionInjectable);
|
di.permitSideEffects(appVersionInjectable);
|
||||||
|
|
||||||
|
di.override(catalogEntityRegistryInjectable, () => ({
|
||||||
|
addComputedSource: (id, source) => {},
|
||||||
|
items: [
|
||||||
|
getMockCatalogEntity({
|
||||||
|
apiVersion: "v1",
|
||||||
|
kind: "Cluster",
|
||||||
|
|
||||||
|
status: {
|
||||||
|
phase: "Running",
|
||||||
|
},
|
||||||
|
|
||||||
|
metadata: {
|
||||||
|
uid: "1dfa26e2ebab15780a3547e9c7fa785c",
|
||||||
|
name: "mycluster",
|
||||||
|
source: "local",
|
||||||
|
labels: {},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
|
||||||
|
getMockCatalogEntity({
|
||||||
|
apiVersion: "v1",
|
||||||
|
kind: "Cluster",
|
||||||
|
|
||||||
|
status: {
|
||||||
|
phase: "Running",
|
||||||
|
},
|
||||||
|
|
||||||
|
metadata: {
|
||||||
|
uid: "55b42c3c7ba3b04193416cda405269a5",
|
||||||
|
name: "my_shiny_cluster",
|
||||||
|
source: "remote",
|
||||||
|
labels: {},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
|
||||||
|
getMockCatalogEntity({
|
||||||
|
apiVersion: "v1",
|
||||||
|
kind: "Cluster",
|
||||||
|
|
||||||
|
status: {
|
||||||
|
phase: "Running",
|
||||||
|
},
|
||||||
|
|
||||||
|
metadata: {
|
||||||
|
uid: "catalog-entity",
|
||||||
|
name: "Catalog",
|
||||||
|
source: "app",
|
||||||
|
labels: {},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}));
|
||||||
|
|
||||||
di.override(hotbarStoreInjectable, () => {
|
di.override(hotbarStoreInjectable, () => {
|
||||||
HotbarStore.resetInstance();
|
HotbarStore.resetInstance();
|
||||||
|
|
||||||
|
|||||||
@ -16,8 +16,8 @@ import installExtensionsInjectable from "../extension-installer/install-extensio
|
|||||||
const extensionDiscoveryInjectable = getInjectable({
|
const extensionDiscoveryInjectable = getInjectable({
|
||||||
id: "extension-discovery",
|
id: "extension-discovery",
|
||||||
|
|
||||||
instantiate: (di) => {
|
instantiate: (di) =>
|
||||||
const extensionDiscovery = new ExtensionDiscovery({
|
new ExtensionDiscovery({
|
||||||
extensionLoader: di.inject(extensionLoaderInjectable),
|
extensionLoader: di.inject(extensionLoaderInjectable),
|
||||||
extensionsStore: di.inject(extensionsStoreInjectable),
|
extensionsStore: di.inject(extensionsStoreInjectable),
|
||||||
|
|
||||||
@ -37,13 +37,7 @@ const extensionDiscoveryInjectable = getInjectable({
|
|||||||
extensionPackageRootDirectory: di.inject(
|
extensionPackageRootDirectory: di.inject(
|
||||||
extensionPackageRootDirectoryInjectable,
|
extensionPackageRootDirectoryInjectable,
|
||||||
),
|
),
|
||||||
});
|
}),
|
||||||
|
|
||||||
// TODO: Missing await
|
|
||||||
extensionDiscovery.init();
|
|
||||||
|
|
||||||
return extensionDiscovery;
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default extensionDiscoveryInjectable;
|
export default extensionDiscoveryInjectable;
|
||||||
|
|||||||
@ -4,17 +4,14 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { LensExtension } from "./lens-extension";
|
import { LensExtension } from "./lens-extension";
|
||||||
import { catalogEntityRegistry } from "../main/catalog";
|
|
||||||
import type { CatalogEntity } from "../common/catalog";
|
import type { CatalogEntity } from "../common/catalog";
|
||||||
import type { IObservableArray } from "mobx";
|
import type { IObservableArray } from "mobx";
|
||||||
import type { MenuRegistration } from "../main/menu/menu-registration";
|
import type { MenuRegistration } from "../main/menu/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 {
|
import { Environments, getEnvironmentSpecificLegacyGlobalDiForExtensionApi } from "./as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api";
|
||||||
Environments,
|
|
||||||
getEnvironmentSpecificLegacyGlobalDiForExtensionApi,
|
|
||||||
} from "./as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api";
|
|
||||||
import windowManagerInjectable from "../main/window-manager.injectable";
|
import windowManagerInjectable from "../main/window-manager.injectable";
|
||||||
|
import catalogEntityRegistryInjectable from "../main/catalog/catalog-entity-registry.injectable";
|
||||||
|
|
||||||
export class LensMainExtension extends LensExtension {
|
export class LensMainExtension extends LensExtension {
|
||||||
appMenus: MenuRegistration[] = [];
|
appMenus: MenuRegistration[] = [];
|
||||||
@ -44,10 +41,18 @@ export class LensMainExtension extends LensExtension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addCatalogSource(id: string, source: IObservableArray<CatalogEntity>) {
|
addCatalogSource(id: string, source: IObservableArray<CatalogEntity>) {
|
||||||
|
const di = getEnvironmentSpecificLegacyGlobalDiForExtensionApi(Environments.main);
|
||||||
|
|
||||||
|
const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable);
|
||||||
|
|
||||||
catalogEntityRegistry.addObservableSource(`${this.name}:${id}`, source);
|
catalogEntityRegistry.addObservableSource(`${this.name}:${id}`, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeCatalogSource(id: string) {
|
removeCatalogSource(id: string) {
|
||||||
|
const di = getEnvironmentSpecificLegacyGlobalDiForExtensionApi(Environments.main);
|
||||||
|
|
||||||
|
const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable);
|
||||||
|
|
||||||
catalogEntityRegistry.removeSource(`${this.name}:${id}`);
|
catalogEntityRegistry.removeSource(`${this.name}:${id}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,13 +4,18 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import type { CatalogEntity } from "../../common/catalog";
|
import type { CatalogEntity } from "../../common/catalog";
|
||||||
import { catalogEntityRegistry as registry } from "../../main/catalog";
|
import { Environments, getEnvironmentSpecificLegacyGlobalDiForExtensionApi } from "../as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api";
|
||||||
|
import catalogEntityRegistryInjectable from "../../main/catalog/catalog-entity-registry.injectable";
|
||||||
|
|
||||||
export { catalogCategoryRegistry as catalogCategories } from "../../common/catalog/catalog-category-registry";
|
export { catalogCategoryRegistry as catalogCategories } from "../../common/catalog/catalog-category-registry";
|
||||||
|
|
||||||
export class CatalogEntityRegistry {
|
export class CatalogEntityRegistry {
|
||||||
getItemsForApiKind<T extends CatalogEntity>(apiVersion: string, kind: string): T[] {
|
getItemsForApiKind<T extends CatalogEntity>(apiVersion: string, kind: string): T[] {
|
||||||
return registry.getItemsForApiKind<T>(apiVersion, kind);
|
const di = getEnvironmentSpecificLegacyGlobalDiForExtensionApi(Environments.main);
|
||||||
|
|
||||||
|
const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable);
|
||||||
|
|
||||||
|
return catalogEntityRegistry.getItemsForApiKind<T>(apiVersion, kind);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -48,6 +48,9 @@ describe("kubeconfig-sync.source tests", () => {
|
|||||||
ClusterStore.createInstance({ createCluster: () => null }),
|
ClusterStore.createInstance({ createCluster: () => null }),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
di.permitSideEffects(getConfigurationFileModelInjectable);
|
||||||
|
di.permitSideEffects(appVersionInjectable);
|
||||||
|
|
||||||
await runSetups(di);
|
await runSetups(di);
|
||||||
|
|
||||||
computeDiff = computeDiffFor({
|
computeDiff = computeDiffFor({
|
||||||
@ -56,9 +59,6 @@ describe("kubeconfig-sync.source tests", () => {
|
|||||||
clusterManager: di.inject(clusterManagerInjectable),
|
clusterManager: di.inject(clusterManagerInjectable),
|
||||||
});
|
});
|
||||||
|
|
||||||
di.permitSideEffects(getConfigurationFileModelInjectable);
|
|
||||||
di.permitSideEffects(appVersionInjectable);
|
|
||||||
|
|
||||||
di.inject(clusterStoreInjectable);
|
di.inject(clusterStoreInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import directoryForKubeConfigsInjectable from "../../../common/app-paths/directo
|
|||||||
import { KubeconfigSyncManager } from "./kubeconfig-sync-manager";
|
import { KubeconfigSyncManager } from "./kubeconfig-sync-manager";
|
||||||
import { createClusterInjectionToken } from "../../../common/cluster/create-cluster-injection-token";
|
import { createClusterInjectionToken } from "../../../common/cluster/create-cluster-injection-token";
|
||||||
import clusterManagerInjectable from "../../cluster-manager.injectable";
|
import clusterManagerInjectable from "../../cluster-manager.injectable";
|
||||||
|
import catalogEntityRegistryInjectable from "../../catalog/catalog-entity-registry.injectable";
|
||||||
|
|
||||||
const kubeconfigSyncManagerInjectable = getInjectable({
|
const kubeconfigSyncManagerInjectable = getInjectable({
|
||||||
id: "kubeconfig-sync-manager",
|
id: "kubeconfig-sync-manager",
|
||||||
@ -15,6 +16,7 @@ const kubeconfigSyncManagerInjectable = getInjectable({
|
|||||||
directoryForKubeConfigs: di.inject(directoryForKubeConfigsInjectable),
|
directoryForKubeConfigs: di.inject(directoryForKubeConfigsInjectable),
|
||||||
createCluster: di.inject(createClusterInjectionToken),
|
createCluster: di.inject(createClusterInjectionToken),
|
||||||
clusterManager: di.inject(clusterManagerInjectable),
|
clusterManager: di.inject(clusterManagerInjectable),
|
||||||
|
catalogEntityRegistry: di.inject(catalogEntityRegistryInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
import type { IComputedValue, ObservableMap } from "mobx";
|
import type { IComputedValue, ObservableMap } from "mobx";
|
||||||
import { action, observable, computed, runInAction, makeObservable, observe } from "mobx";
|
import { action, observable, computed, runInAction, makeObservable, observe } from "mobx";
|
||||||
import type { CatalogEntity } from "../../../common/catalog";
|
import type { CatalogEntity } from "../../../common/catalog";
|
||||||
import { catalogEntityRegistry } from "../../catalog";
|
import type { CatalogEntityRegistry } from "../../catalog";
|
||||||
import type { FSWatcher } from "chokidar";
|
import type { FSWatcher } from "chokidar";
|
||||||
import { watch } from "chokidar";
|
import { watch } from "chokidar";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
@ -50,10 +50,11 @@ const ignoreGlobs = [
|
|||||||
const folderSyncMaxAllowedFileReadSize = 2 * 1024 * 1024; // 2 MiB
|
const folderSyncMaxAllowedFileReadSize = 2 * 1024 * 1024; // 2 MiB
|
||||||
const fileSyncMaxAllowedFileReadSize = 16 * folderSyncMaxAllowedFileReadSize; // 32 MiB
|
const fileSyncMaxAllowedFileReadSize = 16 * folderSyncMaxAllowedFileReadSize; // 32 MiB
|
||||||
|
|
||||||
interface Dependencies {
|
interface KubeconfigSyncManagerDependencies {
|
||||||
directoryForKubeConfigs: string;
|
directoryForKubeConfigs: string;
|
||||||
createCluster: (model: ClusterModel) => Cluster;
|
createCluster: (model: ClusterModel) => Cluster;
|
||||||
clusterManager: ClusterManager;
|
clusterManager: ClusterManager;
|
||||||
|
catalogEntityRegistry: CatalogEntityRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
const kubeConfigSyncName = "lens:kube-sync";
|
const kubeConfigSyncName = "lens:kube-sync";
|
||||||
@ -63,7 +64,7 @@ export class KubeconfigSyncManager {
|
|||||||
protected syncing = false;
|
protected syncing = false;
|
||||||
protected syncListDisposer?: Disposer;
|
protected syncListDisposer?: Disposer;
|
||||||
|
|
||||||
constructor(private dependencies: Dependencies) {
|
constructor(private dependencies: KubeconfigSyncManagerDependencies) {
|
||||||
makeObservable(this);
|
makeObservable(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,7 +78,7 @@ export class KubeconfigSyncManager {
|
|||||||
|
|
||||||
logger.info(`${logPrefix} starting requested syncs`);
|
logger.info(`${logPrefix} starting requested syncs`);
|
||||||
|
|
||||||
catalogEntityRegistry.addComputedSource(kubeConfigSyncName, computed(() => (
|
this.dependencies.catalogEntityRegistry.addComputedSource(kubeConfigSyncName, computed(() => (
|
||||||
Array.from(iter.flatMap(
|
Array.from(iter.flatMap(
|
||||||
this.sources.values(),
|
this.sources.values(),
|
||||||
([entities]) => entities.get(),
|
([entities]) => entities.get(),
|
||||||
@ -111,7 +112,7 @@ export class KubeconfigSyncManager {
|
|||||||
this.stopOldSync(filePath);
|
this.stopOldSync(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
catalogEntityRegistry.removeSource(kubeConfigSyncName);
|
this.dependencies.catalogEntityRegistry.removeSource(kubeConfigSyncName);
|
||||||
this.syncing = false;
|
this.syncing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,8 +165,14 @@ export function configToModels(rootConfig: KubeConfig, filePath: string): Update
|
|||||||
type RootSourceValue = [Cluster, CatalogEntity];
|
type RootSourceValue = [Cluster, CatalogEntity];
|
||||||
type RootSource = ObservableMap<string, RootSourceValue>;
|
type RootSource = ObservableMap<string, RootSourceValue>;
|
||||||
|
|
||||||
|
interface ComputeDiffDependencies {
|
||||||
|
directoryForKubeConfigs: string;
|
||||||
|
createCluster: (model: ClusterModel) => Cluster;
|
||||||
|
clusterManager: ClusterManager;
|
||||||
|
}
|
||||||
|
|
||||||
// exported for testing
|
// exported for testing
|
||||||
export const computeDiff = ({ directoryForKubeConfigs, createCluster, clusterManager }: Dependencies) => (contents: string, source: RootSource, filePath: string): void => {
|
export const computeDiff = ({ directoryForKubeConfigs, createCluster, clusterManager }: ComputeDiffDependencies) => (contents: string, source: RootSource, filePath: string): void => {
|
||||||
runInAction(() => {
|
runInAction(() => {
|
||||||
try {
|
try {
|
||||||
const { config, error } = loadConfigFromString(contents);
|
const { config, error } = loadConfigFromString(contents);
|
||||||
@ -241,7 +248,7 @@ interface DiffChangedConfigArgs {
|
|||||||
maxAllowedFileReadSize: number;
|
maxAllowedFileReadSize: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
const diffChangedConfigFor = (dependencies: Dependencies) => ({ filePath, source, stats, maxAllowedFileReadSize }: DiffChangedConfigArgs): Disposer => {
|
const diffChangedConfigFor = (dependencies: ComputeDiffDependencies) => ({ filePath, source, stats, maxAllowedFileReadSize }: DiffChangedConfigArgs): Disposer => {
|
||||||
logger.debug(`${logPrefix} file changed`, { filePath });
|
logger.debug(`${logPrefix} file changed`, { filePath });
|
||||||
|
|
||||||
if (stats.size >= maxAllowedFileReadSize) {
|
if (stats.size >= maxAllowedFileReadSize) {
|
||||||
@ -297,7 +304,7 @@ const diffChangedConfigFor = (dependencies: Dependencies) => ({ filePath, source
|
|||||||
return cleanup;
|
return cleanup;
|
||||||
};
|
};
|
||||||
|
|
||||||
const watchFileChanges = (filePath: string, dependencies: Dependencies): [IComputedValue<CatalogEntity[]>, Disposer] => {
|
const watchFileChanges = (filePath: string, dependencies: ComputeDiffDependencies): [IComputedValue<CatalogEntity[]>, Disposer] => {
|
||||||
const rootSource = observable.map<string, ObservableMap<string, RootSourceValue>>();
|
const rootSource = observable.map<string, ObservableMap<string, RootSourceValue>>();
|
||||||
const derivedSource = computed(() => Array.from(iter.flatMap(rootSource.values(), from => iter.map(from.values(), child => child[1]))));
|
const derivedSource = computed(() => Array.from(iter.flatMap(rootSource.values(), from => iter.map(from.values(), child => child[1]))));
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
import { computed, observable, reaction } from "mobx";
|
import { computed, observable, reaction } from "mobx";
|
||||||
import type { WeblinkStore } from "../../common/weblink-store";
|
import type { WeblinkStore } from "../../common/weblink-store";
|
||||||
import { WebLink } from "../../common/catalog-entities";
|
import { WebLink } from "../../common/catalog-entities";
|
||||||
import { catalogEntityRegistry } from "../catalog";
|
import type { CatalogEntityRegistry } from "../catalog";
|
||||||
import got from "got";
|
import got from "got";
|
||||||
import type { Disposer } from "../../common/utils";
|
import type { Disposer } from "../../common/utils";
|
||||||
import { random } from "lodash";
|
import { random } from "lodash";
|
||||||
@ -28,8 +28,12 @@ async function validateLink(link: WebLink) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
weblinkStore: WeblinkStore;
|
||||||
|
catalogEntityRegistry: CatalogEntityRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
export function syncWeblinks(weblinkStore: WeblinkStore) {
|
export function syncWeblinks({ weblinkStore, catalogEntityRegistry }: Dependencies) {
|
||||||
const webLinkEntities = observable.map<string, [WebLink, Disposer]>();
|
const webLinkEntities = observable.map<string, [WebLink, Disposer]>();
|
||||||
|
|
||||||
function periodicallyCheckLink(link: WebLink): Disposer {
|
function periodicallyCheckLink(link: WebLink): Disposer {
|
||||||
|
|||||||
@ -3,12 +3,17 @@
|
|||||||
* 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 { catalogEntityRegistry } from "./catalog-entity-registry";
|
import { CatalogEntityRegistry } from "./catalog-entity-registry";
|
||||||
|
import catalogCategoryRegistryInjectable from "../../common/catalog/catalog-category-registry.injectable";
|
||||||
|
|
||||||
const catalogEntityRegistryInjectable = getInjectable({
|
const catalogEntityRegistryInjectable = getInjectable({
|
||||||
id: "catalog-entity-registry",
|
id: "catalog-entity-registry",
|
||||||
instantiate: () => catalogEntityRegistry,
|
|
||||||
causesSideEffects: true,
|
instantiate: (di) => {
|
||||||
|
const categoryRegistryRegistry = di.inject(catalogCategoryRegistryInjectable);
|
||||||
|
|
||||||
|
return new CatalogEntityRegistry(categoryRegistryRegistry);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default catalogEntityRegistryInjectable;
|
export default catalogEntityRegistryInjectable;
|
||||||
|
|||||||
@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
import { action, computed, type IComputedValue, type IObservableArray, makeObservable, observable } from "mobx";
|
import { action, computed, type IComputedValue, type IObservableArray, makeObservable, observable } from "mobx";
|
||||||
import type { CatalogCategoryRegistry, CatalogEntity, CatalogEntityConstructor } from "../../common/catalog";
|
import type { CatalogCategoryRegistry, CatalogEntity, CatalogEntityConstructor } from "../../common/catalog";
|
||||||
import { catalogCategoryRegistry } from "../../common/catalog";
|
|
||||||
import { iter } from "../../common/utils";
|
import { iter } from "../../common/utils";
|
||||||
|
|
||||||
export class CatalogEntityRegistry {
|
export class CatalogEntityRegistry {
|
||||||
@ -48,8 +47,3 @@ export class CatalogEntityRegistry {
|
|||||||
return this.items.filter((item) => item instanceof constructor) as T[];
|
return this.items.filter((item) => item instanceof constructor) as T[];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Switch to using catalogEntityRegistryInjectable
|
|
||||||
*/
|
|
||||||
export const catalogEntityRegistry = new CatalogEntityRegistry(catalogCategoryRegistry);
|
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { ClusterManager } from "./cluster-manager";
|
import { ClusterManager } from "./cluster-manager";
|
||||||
import clusterStoreInjectable from "../common/cluster-store/cluster-store.injectable";
|
import clusterStoreInjectable from "../common/cluster-store/cluster-store.injectable";
|
||||||
|
import catalogEntityRegistryInjectable from "./catalog/catalog-entity-registry.injectable";
|
||||||
|
|
||||||
const clusterManagerInjectable = getInjectable({
|
const clusterManagerInjectable = getInjectable({
|
||||||
id: "cluster-manager",
|
id: "cluster-manager",
|
||||||
@ -12,6 +13,7 @@ const clusterManagerInjectable = getInjectable({
|
|||||||
instantiate: (di) => {
|
instantiate: (di) => {
|
||||||
const clusterManager = new ClusterManager({
|
const clusterManager = new ClusterManager({
|
||||||
store: di.inject(clusterStoreInjectable),
|
store: di.inject(clusterStoreInjectable),
|
||||||
|
catalogEntityRegistry: di.inject(catalogEntityRegistryInjectable),
|
||||||
});
|
});
|
||||||
|
|
||||||
clusterManager.init();
|
clusterManager.init();
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import type { Cluster } from "../common/cluster/cluster";
|
|||||||
import logger from "./logger";
|
import logger from "./logger";
|
||||||
import { apiKubePrefix } from "../common/vars";
|
import { apiKubePrefix } from "../common/vars";
|
||||||
import { getClusterIdFromHost } from "../common/utils";
|
import { getClusterIdFromHost } from "../common/utils";
|
||||||
import { catalogEntityRegistry } from "./catalog";
|
import type { CatalogEntityRegistry } from "./catalog";
|
||||||
import type { KubernetesClusterPrometheusMetrics } from "../common/catalog-entities/kubernetes-cluster";
|
import type { KubernetesClusterPrometheusMetrics } from "../common/catalog-entities/kubernetes-cluster";
|
||||||
import { KubernetesCluster, LensKubernetesClusterStatus } from "../common/catalog-entities/kubernetes-cluster";
|
import { KubernetesCluster, LensKubernetesClusterStatus } from "../common/catalog-entities/kubernetes-cluster";
|
||||||
import { ipcMainOn } from "../common/ipc";
|
import { ipcMainOn } from "../common/ipc";
|
||||||
@ -24,6 +24,7 @@ const lensSpecificClusterStatuses: Set<string> = new Set(Object.values(LensKuber
|
|||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
store: ClusterStore;
|
store: ClusterStore;
|
||||||
|
catalogEntityRegistry: CatalogEntityRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ClusterManager {
|
export class ClusterManager {
|
||||||
@ -51,12 +52,12 @@ export class ClusterManager {
|
|||||||
);
|
);
|
||||||
|
|
||||||
reaction(
|
reaction(
|
||||||
() => catalogEntityRegistry.getItemsByEntityClass(KubernetesCluster) as KubernetesCluster[],
|
() => this.dependencies.catalogEntityRegistry.getItemsByEntityClass(KubernetesCluster) as KubernetesCluster[],
|
||||||
entities => this.syncClustersFromCatalog(entities),
|
entities => this.syncClustersFromCatalog(entities),
|
||||||
);
|
);
|
||||||
|
|
||||||
reaction(() => [
|
reaction(() => [
|
||||||
catalogEntityRegistry.getItemsByEntityClass(KubernetesCluster),
|
this.dependencies.catalogEntityRegistry.getItemsByEntityClass(KubernetesCluster),
|
||||||
this.visibleCluster,
|
this.visibleCluster,
|
||||||
] as const, ([entities, visibleCluster]) => {
|
] as const, ([entities, visibleCluster]) => {
|
||||||
for (const entity of entities) {
|
for (const entity of entities) {
|
||||||
@ -70,7 +71,7 @@ export class ClusterManager {
|
|||||||
|
|
||||||
observe(this.deleting, change => {
|
observe(this.deleting, change => {
|
||||||
if (change.type === "add") {
|
if (change.type === "add") {
|
||||||
this.updateEntityStatus(catalogEntityRegistry.getById(change.newValue));
|
this.updateEntityStatus(this.dependencies.catalogEntityRegistry.getById(change.newValue));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -88,13 +89,13 @@ export class ClusterManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected updateEntityFromCluster(cluster: Cluster) {
|
protected updateEntityFromCluster(cluster: Cluster) {
|
||||||
const index = catalogEntityRegistry.items.findIndex((entity) => entity.getId() === cluster.id);
|
const index = this.dependencies.catalogEntityRegistry.items.findIndex((entity) => entity.getId() === cluster.id);
|
||||||
|
|
||||||
if (index === -1) {
|
if (index === -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const entity = catalogEntityRegistry.items[index] as KubernetesCluster;
|
const entity = this.dependencies.catalogEntityRegistry.items[index] as KubernetesCluster;
|
||||||
|
|
||||||
this.updateEntityStatus(entity, cluster);
|
this.updateEntityStatus(entity, cluster);
|
||||||
|
|
||||||
@ -135,7 +136,7 @@ export class ClusterManager {
|
|||||||
cluster.preferences.icon = undefined;
|
cluster.preferences.icon = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
catalogEntityRegistry.items.splice(index, 1, entity);
|
this.dependencies.catalogEntityRegistry.items.splice(index, 1, entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
|||||||
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* 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 electronAppInjectable from "./electron-app.injectable";
|
||||||
|
|
||||||
|
const requestSingleInstanceLockInjectable = getInjectable({
|
||||||
|
id: "request-single-instance-lock",
|
||||||
|
|
||||||
|
instantiate: (di) => {
|
||||||
|
const app = di.inject(electronAppInjectable);
|
||||||
|
|
||||||
|
return () => app.requestSingleInstanceLock();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default requestSingleInstanceLockInjectable;
|
||||||
27
src/main/electron-app/should-start-hidden.injectable.ts
Normal file
27
src/main/electron-app/should-start-hidden.injectable.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* 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 electronAppInjectable from "./electron-app.injectable";
|
||||||
|
import isMacInjectable from "../../common/vars/is-mac.injectable";
|
||||||
|
import commandLineArgumentsInjectable from "../utils/command-line-arguments.injectable";
|
||||||
|
|
||||||
|
const shouldStartHiddenInjectable = getInjectable({
|
||||||
|
id: "should-start-hidden",
|
||||||
|
|
||||||
|
instantiate: (di) => {
|
||||||
|
const app = di.inject(electronAppInjectable);
|
||||||
|
const isMac = di.inject(isMacInjectable);
|
||||||
|
const commandLineArguments = di.inject(commandLineArgumentsInjectable);
|
||||||
|
|
||||||
|
// Start the app without showing the main window when auto starting on login
|
||||||
|
// (On Windows and Linux, we get a flag. On MacOS, we get special API.)
|
||||||
|
return (
|
||||||
|
commandLineArguments.includes("--hidden") ||
|
||||||
|
(isMac && app.getLoginItemSettings().wasOpenedAsHidden)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default shouldStartHiddenInjectable;
|
||||||
@ -54,12 +54,24 @@ import lensResourcesDirInjectable from "../common/vars/lens-resources-dir.inject
|
|||||||
import registerFileProtocolInjectable from "./electron-app/register-file-protocol.injectable";
|
import registerFileProtocolInjectable from "./electron-app/register-file-protocol.injectable";
|
||||||
import environmentVariablesInjectable from "../common/utils/environment-variables.injectable";
|
import environmentVariablesInjectable from "../common/utils/environment-variables.injectable";
|
||||||
import disableHardwareAccelerationInjectable from "./electron-app/disable-hardware-acceleration.injectable";
|
import disableHardwareAccelerationInjectable from "./electron-app/disable-hardware-acceleration.injectable";
|
||||||
import catalogEntityRegistryInjectable from "./catalog/catalog-entity-registry.injectable";
|
|
||||||
import { CatalogCategoryRegistry } from "../common/catalog";
|
import { CatalogCategoryRegistry } from "../common/catalog";
|
||||||
import { CatalogEntityRegistry } from "./catalog";
|
|
||||||
import catalogCategoryRegistryInjectable from "../common/catalog/catalog-category-registry.injectable";
|
import catalogCategoryRegistryInjectable from "../common/catalog/catalog-category-registry.injectable";
|
||||||
import setupIpcMainHandlersInjectable from "./start-main-application/after-application-is-ready/implementations/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable";
|
import setupIpcMainHandlersInjectable from "./start-main-application/after-application-is-ready/implementations/setup-ipc-main-handlers/setup-ipc-main-handlers.injectable";
|
||||||
import setupLensProxyInjectable from "./start-main-application/after-application-is-ready/implementations/setup-lens-proxy.injectable";
|
import setupLensProxyInjectable from "./start-main-application/after-application-is-ready/implementations/setup-lens-proxy.injectable";
|
||||||
|
import setupListenerForRootFrameRenderingInjectable from "./start-main-application/after-application-is-ready/implementations/setup-listener-for-root-frame-rendering.injectable";
|
||||||
|
import setupOsThemeUpdatesInjectable from "./start-main-application/after-application-is-ready/implementations/setup-os-theme-updates.injectable";
|
||||||
|
import setupSentryInjectable from "./start-main-application/after-application-is-ready/implementations/setup-sentry.injectable";
|
||||||
|
import setupShellInjectable from "./start-main-application/after-application-is-ready/implementations/setup-shell.injectable";
|
||||||
|
import requestSingleInstanceLockInjectable from "./electron-app/request-single-instance-lock.injectable";
|
||||||
|
import setupSyncingOfWeblinksInjectable from "./start-main-application/after-application-is-ready/implementations/setup-syncing-of-weblinks.injectable";
|
||||||
|
import shouldStartHiddenInjectable from "./electron-app/should-start-hidden.injectable";
|
||||||
|
import stopServicesAndExitAppInjectable from "./stop-services-and-exit-app.injectable";
|
||||||
|
import trayInjectable from "./tray/tray.injectable";
|
||||||
|
import applicationMenuInjectable from "./menu/application-menu.injectable";
|
||||||
|
import windowManagerInjectable from "./window-manager.injectable";
|
||||||
|
import isDevelopmentInjectable from "../common/vars/is-development.injectable";
|
||||||
|
import setupSystemCaInjectable
|
||||||
|
from "./start-main-application/before-application-is-ready/implementations/setup-system-ca.injectable";
|
||||||
|
|
||||||
export const getDiForUnitTesting = (
|
export const getDiForUnitTesting = (
|
||||||
{ doGeneralOverrides } = { doGeneralOverrides: false },
|
{ doGeneralOverrides } = { doGeneralOverrides: false },
|
||||||
@ -84,6 +96,7 @@ export const getDiForUnitTesting = (
|
|||||||
di.override(isMacInjectable, () => true);
|
di.override(isMacInjectable, () => true);
|
||||||
di.override(isWindowsInjectable, () => false);
|
di.override(isWindowsInjectable, () => false);
|
||||||
di.override(isLinuxInjectable, () => false);
|
di.override(isLinuxInjectable, () => false);
|
||||||
|
di.override(isDevelopmentInjectable, () => false);
|
||||||
|
|
||||||
di.override(getAbsolutePathInjectable, () => getAbsolutePathFake);
|
di.override(getAbsolutePathInjectable, () => getAbsolutePathFake);
|
||||||
di.override(joinPathsInjectable, () => joinPathsFake);
|
di.override(joinPathsInjectable, () => joinPathsFake);
|
||||||
@ -98,21 +111,29 @@ export const getDiForUnitTesting = (
|
|||||||
di.override(getCommandLineSwitchInjectable, () => () => "irrelevant");
|
di.override(getCommandLineSwitchInjectable, () => () => "irrelevant");
|
||||||
di.override(isAutoUpdateEnabledInjectable, () => () => false);
|
di.override(isAutoUpdateEnabledInjectable, () => () => false);
|
||||||
di.override(registerProtocolClientInjectable, () => () => {});
|
di.override(registerProtocolClientInjectable, () => () => {});
|
||||||
di.override(initializeExtensionsInjectable, () => ({ run: () => {} }));
|
|
||||||
di.override(lensResourcesDirInjectable, () => "/irrelevant");
|
di.override(lensResourcesDirInjectable, () => "/irrelevant");
|
||||||
di.override(registerFileProtocolInjectable, () => () => {});
|
di.override(registerFileProtocolInjectable, () => () => {});
|
||||||
|
di.override(requestSingleInstanceLockInjectable, () => () => true);
|
||||||
di.override(disableHardwareAccelerationInjectable, () => () => {});
|
di.override(disableHardwareAccelerationInjectable, () => () => {});
|
||||||
|
di.override(shouldStartHiddenInjectable, () => true);
|
||||||
|
di.override(stopServicesAndExitAppInjectable, () => () => {});
|
||||||
|
di.override(windowManagerInjectable, () => ({ ensureMainWindow: () => Promise.resolve(null) }));
|
||||||
|
|
||||||
|
di.override(initializeExtensionsInjectable, () => ({ run: () => {} }));
|
||||||
di.override(setupIpcMainHandlersInjectable, () => ({ run: () => {} }));
|
di.override(setupIpcMainHandlersInjectable, () => ({ run: () => {} }));
|
||||||
di.override(setupLensProxyInjectable, () => ({ run: () => {} }));
|
di.override(setupLensProxyInjectable, () => ({ run: () => {} }));
|
||||||
|
di.override(setupListenerForRootFrameRenderingInjectable, () => ({ run: () => {} }));
|
||||||
|
di.override(setupOsThemeUpdatesInjectable, () => ({ run: () => {} }));
|
||||||
|
di.override(setupSentryInjectable, () => ({ run: () => {} }));
|
||||||
|
di.override(setupShellInjectable, () => ({ run: () => {} }));
|
||||||
|
di.override(setupSyncingOfWeblinksInjectable, () => ({ run: () => {} }));
|
||||||
|
di.override(setupSystemCaInjectable, () => ({ run: () => {} }));
|
||||||
|
|
||||||
|
di.override(trayInjectable, () => ({ start: () => {}, stop: () => {} }));
|
||||||
|
di.override(applicationMenuInjectable, () => ({ start: () => {}, stop: () => {} }));
|
||||||
|
|
||||||
di.override(catalogCategoryRegistryInjectable, () => new CatalogCategoryRegistry());
|
di.override(catalogCategoryRegistryInjectable, () => new CatalogCategoryRegistry());
|
||||||
|
|
||||||
di.override(catalogEntityRegistryInjectable, (diForInstantiate) => {
|
|
||||||
const catalogCategoryRegistry = diForInstantiate.inject(catalogCategoryRegistryInjectable);
|
|
||||||
|
|
||||||
return new CatalogEntityRegistry(catalogCategoryRegistry);
|
|
||||||
});
|
|
||||||
|
|
||||||
di.override(environmentVariablesInjectable, () => ({}));
|
di.override(environmentVariablesInjectable, () => ({}));
|
||||||
di.override(commandLineArgumentsInjectable, () => []);
|
di.override(commandLineArgumentsInjectable, () => []);
|
||||||
|
|
||||||
@ -122,13 +143,13 @@ export const getDiForUnitTesting = (
|
|||||||
// eslint-disable-next-line unused-imports/no-unused-vars-ts
|
// eslint-disable-next-line unused-imports/no-unused-vars-ts
|
||||||
di.override(extensionsStoreInjectable, () => ({ isEnabled: ({ id, isBundled }) => false }) as ExtensionsStore);
|
di.override(extensionsStoreInjectable, () => ({ isEnabled: ({ id, isBundled }) => false }) as ExtensionsStore);
|
||||||
|
|
||||||
di.override(hotbarStoreInjectable, () => ({}));
|
di.override(hotbarStoreInjectable, () => ({ load: () => {} }));
|
||||||
|
|
||||||
di.override(fileSystemProvisionerStoreInjectable, () => ({}) as FileSystemProvisionerStore);
|
di.override(fileSystemProvisionerStoreInjectable, () => ({}) as FileSystemProvisionerStore);
|
||||||
|
|
||||||
// eslint-disable-next-line unused-imports/no-unused-vars-ts
|
// eslint-disable-next-line unused-imports/no-unused-vars-ts
|
||||||
di.override(clusterStoreInjectable, () => ({ getById: (id): Cluster => ({}) as Cluster }) as ClusterStore);
|
di.override(clusterStoreInjectable, () => ({ provideInitialFromMain: () => {}, getById: (id): Cluster => ({}) as Cluster }) as ClusterStore);
|
||||||
di.override(userStoreInjectable, () => ({}) as UserStore);
|
di.override(userStoreInjectable, () => ({ startMainReactions: () => {} }) as UserStore);
|
||||||
|
|
||||||
di.override(
|
di.override(
|
||||||
getElectronAppPathInjectable,
|
getElectronAppPathInjectable,
|
||||||
|
|||||||
@ -7,13 +7,14 @@ import type { IComputedValue } from "mobx";
|
|||||||
import { computed } from "mobx";
|
import { computed } from "mobx";
|
||||||
import type { ClusterId } from "../../../common/cluster-types";
|
import type { ClusterId } from "../../../common/cluster-types";
|
||||||
import type { LensMainExtension } from "../../../extensions/lens-main-extension";
|
import type { LensMainExtension } from "../../../extensions/lens-main-extension";
|
||||||
import { catalogEntityRegistry } from "../../catalog";
|
import type { CatalogEntityRegistry } from "../../catalog";
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
extensions: IComputedValue<LensMainExtension[]>;
|
extensions: IComputedValue<LensMainExtension[]>;
|
||||||
|
catalogEntityRegistry: CatalogEntityRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const terminalShellEnvModify = ({ extensions }: Dependencies) =>
|
export const terminalShellEnvModify = ({ extensions, catalogEntityRegistry }: Dependencies) =>
|
||||||
(clusterId: ClusterId, env: Record<string, string>) => {
|
(clusterId: ClusterId, env: Record<string, string>) => {
|
||||||
const terminalShellEnvModifiers = computed(() => (
|
const terminalShellEnvModifiers = computed(() => (
|
||||||
extensions.get()
|
extensions.get()
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import mainExtensionsInjectable from "../../../extensions/main-extensions.injectable";
|
import mainExtensionsInjectable from "../../../extensions/main-extensions.injectable";
|
||||||
import { terminalShellEnvModify } from "./terminal-shell-env-modifiers";
|
import { terminalShellEnvModify } from "./terminal-shell-env-modifiers";
|
||||||
|
import catalogEntityRegistryInjectable from "../../catalog/catalog-entity-registry.injectable";
|
||||||
|
|
||||||
const terminalShellEnvModifyInjectable = getInjectable({
|
const terminalShellEnvModifyInjectable = getInjectable({
|
||||||
id: "terminal-shell-env-modify",
|
id: "terminal-shell-env-modify",
|
||||||
@ -13,6 +14,7 @@ const terminalShellEnvModifyInjectable = getInjectable({
|
|||||||
instantiate: (di) =>
|
instantiate: (di) =>
|
||||||
terminalShellEnvModify({
|
terminalShellEnvModify({
|
||||||
extensions: di.inject(mainExtensionsInjectable),
|
extensions: di.inject(mainExtensionsInjectable),
|
||||||
|
catalogEntityRegistry: di.inject(catalogEntityRegistryInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -5,18 +5,18 @@
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";
|
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";
|
||||||
import exitAppInjectable from "../../../electron-app/exit-app.injectable";
|
import exitAppInjectable from "../../../electron-app/exit-app.injectable";
|
||||||
import electronAppInjectable from "../../../electron-app/electron-app.injectable";
|
import requestSingleInstanceLockInjectable from "../../../electron-app/request-single-instance-lock.injectable";
|
||||||
|
|
||||||
const setupSingleInstanceLockInjectable = getInjectable({
|
const enforceSingleApplicationInstanceInjectable = getInjectable({
|
||||||
id: "setup-single-instance-lock",
|
id: "enforce-single-application-instance",
|
||||||
|
|
||||||
instantiate: (di) => {
|
instantiate: (di) => {
|
||||||
const exitApp = di.inject(exitAppInjectable);
|
const exitApp = di.inject(exitAppInjectable);
|
||||||
const app = di.inject(electronAppInjectable);
|
const requestSingleInstanceLock = di.inject(requestSingleInstanceLockInjectable);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
run: () => {
|
run: () => {
|
||||||
if (!app.requestSingleInstanceLock()) {
|
if (!requestSingleInstanceLock()) {
|
||||||
exitApp();
|
exitApp();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -28,4 +28,4 @@ const setupSingleInstanceLockInjectable = getInjectable({
|
|||||||
injectionToken: afterApplicationIsReadyInjectionToken,
|
injectionToken: afterApplicationIsReadyInjectionToken,
|
||||||
});
|
});
|
||||||
|
|
||||||
export default setupSingleInstanceLockInjectable;
|
export default enforceSingleApplicationInstanceInjectable;
|
||||||
@ -23,6 +23,8 @@ const initializeExtensionsInjectable = getInjectable({
|
|||||||
run: async () => {
|
run: async () => {
|
||||||
logger.info("🧩 Initializing extensions");
|
logger.info("🧩 Initializing extensions");
|
||||||
|
|
||||||
|
await extensionDiscovery.init();
|
||||||
|
|
||||||
await extensionLoader.init();
|
await extensionLoader.init();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import clusterManagerInjectable from "../../../../cluster-manager.injectable";
|
|||||||
import applicationMenuItemsInjectable from "../../../../menu/application-menu-items.injectable";
|
import applicationMenuItemsInjectable from "../../../../menu/application-menu-items.injectable";
|
||||||
import getAbsolutePathInjectable from "../../../../../common/path/get-absolute-path.injectable";
|
import getAbsolutePathInjectable from "../../../../../common/path/get-absolute-path.injectable";
|
||||||
import { afterApplicationIsReadyInjectionToken } from "../../after-application-is-ready-injection-token";
|
import { afterApplicationIsReadyInjectionToken } from "../../after-application-is-ready-injection-token";
|
||||||
|
import catalogEntityRegistryInjectable from "../../../../catalog/catalog-entity-registry.injectable";
|
||||||
|
|
||||||
const setupIpcMainHandlersInjectable = getInjectable({
|
const setupIpcMainHandlersInjectable = getInjectable({
|
||||||
id: "setup-ipc-main-handlers",
|
id: "setup-ipc-main-handlers",
|
||||||
@ -24,6 +25,7 @@ const setupIpcMainHandlersInjectable = getInjectable({
|
|||||||
const clusterManager = di.inject(clusterManagerInjectable);
|
const clusterManager = di.inject(clusterManagerInjectable);
|
||||||
const applicationMenuItems = di.inject(applicationMenuItemsInjectable);
|
const applicationMenuItems = di.inject(applicationMenuItemsInjectable);
|
||||||
const getAbsolutePath = di.inject(getAbsolutePathInjectable);
|
const getAbsolutePath = di.inject(getAbsolutePathInjectable);
|
||||||
|
const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
run: () => {
|
run: () => {
|
||||||
@ -34,6 +36,7 @@ const setupIpcMainHandlersInjectable = getInjectable({
|
|||||||
getAbsolutePath,
|
getAbsolutePath,
|
||||||
directoryForLensLocalStorage,
|
directoryForLensLocalStorage,
|
||||||
clusterManager,
|
clusterManager,
|
||||||
|
catalogEntityRegistry,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import type { ClusterId } from "../../../../../common/cluster-types";
|
|||||||
import { ClusterStore } from "../../../../../common/cluster-store/cluster-store";
|
import { ClusterStore } from "../../../../../common/cluster-store/cluster-store";
|
||||||
import { appEventBus } from "../../../../../common/app-event-bus/event-bus";
|
import { appEventBus } from "../../../../../common/app-event-bus/event-bus";
|
||||||
import { broadcastMainChannel, broadcastMessage, ipcMainHandle, ipcMainOn } from "../../../../../common/ipc";
|
import { broadcastMainChannel, broadcastMessage, ipcMainHandle, ipcMainOn } from "../../../../../common/ipc";
|
||||||
import { catalogEntityRegistry } from "../../../../catalog";
|
import type { CatalogEntityRegistry } from "../../../../catalog";
|
||||||
import { pushCatalogToRenderer } from "../../../../catalog-pusher";
|
import { pushCatalogToRenderer } from "../../../../catalog-pusher";
|
||||||
import type { ClusterManager } from "../../../../cluster-manager";
|
import type { ClusterManager } from "../../../../cluster-manager";
|
||||||
import { ResourceApplier } from "../../../../resource-applier";
|
import { ResourceApplier } from "../../../../resource-applier";
|
||||||
@ -30,9 +30,10 @@ interface Dependencies {
|
|||||||
getAbsolutePath: GetAbsolutePath;
|
getAbsolutePath: GetAbsolutePath;
|
||||||
applicationMenuItems: IComputedValue<MenuItemOpts[]>;
|
applicationMenuItems: IComputedValue<MenuItemOpts[]>;
|
||||||
clusterManager: ClusterManager;
|
clusterManager: ClusterManager;
|
||||||
|
catalogEntityRegistry: CatalogEntityRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const setupIpcMainHandlers = ({ applicationMenuItems, directoryForLensLocalStorage, getAbsolutePath, clusterManager }: Dependencies) => {
|
export const setupIpcMainHandlers = ({ applicationMenuItems, directoryForLensLocalStorage, getAbsolutePath, clusterManager, catalogEntityRegistry }: Dependencies) => {
|
||||||
ipcMainHandle(clusterActivateHandler, (event, clusterId: ClusterId, force = false) => {
|
ipcMainHandle(clusterActivateHandler, (event, clusterId: ClusterId, force = false) => {
|
||||||
return ClusterStore.getInstance()
|
return ClusterStore.getInstance()
|
||||||
.getById(clusterId)
|
.getById(clusterId)
|
||||||
|
|||||||
@ -6,16 +6,18 @@ import { getInjectable } from "@ogre-tools/injectable";
|
|||||||
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";
|
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";
|
||||||
import { syncWeblinks } from "../../../catalog-sources";
|
import { syncWeblinks } from "../../../catalog-sources";
|
||||||
import weblinkStoreInjectable from "../../../../common/weblink-store.injectable";
|
import weblinkStoreInjectable from "../../../../common/weblink-store.injectable";
|
||||||
|
import catalogEntityRegistryInjectable from "../../../catalog/catalog-entity-registry.injectable";
|
||||||
|
|
||||||
const setupSyncingOfWeblinksInjectable = getInjectable({
|
const setupSyncingOfWeblinksInjectable = getInjectable({
|
||||||
id: "setup-syncing-of-weblinks",
|
id: "setup-syncing-of-weblinks",
|
||||||
|
|
||||||
instantiate: (di) => {
|
instantiate: (di) => {
|
||||||
const weblinkStore = di.inject(weblinkStoreInjectable);
|
const weblinkStore = di.inject(weblinkStoreInjectable);
|
||||||
|
const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
run: () => {
|
run: () => {
|
||||||
syncWeblinks(weblinkStore);
|
syncWeblinks({ weblinkStore, catalogEntityRegistry });
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@ -4,34 +4,23 @@
|
|||||||
*/
|
*/
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import windowManagerInjectable from "../../../window-manager.injectable";
|
import windowManagerInjectable from "../../../window-manager.injectable";
|
||||||
import electronAppInjectable from "../../../electron-app/electron-app.injectable";
|
|
||||||
import loggerInjectable from "../../../../common/logger.injectable";
|
import loggerInjectable from "../../../../common/logger.injectable";
|
||||||
import isMacInjectable from "../../../../common/vars/is-mac.injectable";
|
|
||||||
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";
|
import { afterApplicationIsReadyInjectionToken } from "../after-application-is-ready-injection-token";
|
||||||
import commandLineArgumentsInjectable from "../../../utils/command-line-arguments.injectable";
|
import shouldStartHiddenInjectable from "../../../electron-app/should-start-hidden.injectable";
|
||||||
|
|
||||||
const startMainWindowInjectable = getInjectable({
|
const startMainWindowInjectable = getInjectable({
|
||||||
id: "start-main-window",
|
id: "start-main-window",
|
||||||
|
|
||||||
instantiate: (di) => {
|
instantiate: (di) => {
|
||||||
const windowManager = di.inject(windowManagerInjectable);
|
const windowManager = di.inject(windowManagerInjectable);
|
||||||
const app = di.inject(electronAppInjectable);
|
|
||||||
const logger = di.inject(loggerInjectable);
|
const logger = di.inject(loggerInjectable);
|
||||||
const isMac = di.inject(isMacInjectable);
|
const shouldStartHidden = di.inject(shouldStartHiddenInjectable);
|
||||||
const commandLineArguments = di.inject(commandLineArgumentsInjectable);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
run: async () => {
|
run: async () => {
|
||||||
|
|
||||||
// Start the app without showing the main window when auto starting on login
|
|
||||||
// (On Windows and Linux, we get a flag. On MacOS, we get special API.)
|
|
||||||
const startHidden =
|
|
||||||
commandLineArguments.includes("--hidden") ||
|
|
||||||
(isMac && app.getLoginItemSettings().wasOpenedAsHidden);
|
|
||||||
|
|
||||||
logger.info("🖥️ Starting WindowManager");
|
logger.info("🖥️ Starting WindowManager");
|
||||||
|
|
||||||
if (!startHidden) {
|
if (!shouldStartHidden) {
|
||||||
await windowManager.ensureMainWindow();
|
await windowManager.ensureMainWindow();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -15,6 +15,8 @@ const setupSystemCaInjectable = getInjectable({
|
|||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
causesSideEffects: true,
|
||||||
|
|
||||||
injectionToken: beforeApplicationIsReadyInjectionToken,
|
injectionToken: beforeApplicationIsReadyInjectionToken,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -4,8 +4,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import type { Hotbar } from "../../common/hotbar-types";
|
import type { Hotbar } from "../../common/hotbar-types";
|
||||||
import { catalogEntityRegistry } from "../../main/catalog";
|
|
||||||
import type { MigrationDeclaration } from "../helpers";
|
import type { MigrationDeclaration } from "../helpers";
|
||||||
|
import {
|
||||||
|
getLegacyGlobalDiForExtensionApi,
|
||||||
|
} from "../../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api";
|
||||||
|
import catalogEntityRegistryInjectable from "../../main/catalog/catalog-entity-registry.injectable";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
version: "5.0.0-beta.5",
|
version: "5.0.0-beta.5",
|
||||||
@ -13,6 +16,9 @@ export default {
|
|||||||
const rawHotbars = store.get("hotbars");
|
const rawHotbars = store.get("hotbars");
|
||||||
const hotbars: Hotbar[] = Array.isArray(rawHotbars) ? rawHotbars : [];
|
const hotbars: Hotbar[] = Array.isArray(rawHotbars) ? rawHotbars : [];
|
||||||
|
|
||||||
|
const di = getLegacyGlobalDiForExtensionApi();
|
||||||
|
const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable);
|
||||||
|
|
||||||
for (const hotbar of hotbars) {
|
for (const hotbar of hotbars) {
|
||||||
for (let i = 0; i < hotbar.items.length; i += 1) {
|
for (let i = 0; i < hotbar.items.length; i += 1) {
|
||||||
const item = hotbar.items[i];
|
const item = hotbar.items[i];
|
||||||
|
|||||||
@ -21,10 +21,8 @@ import { renderFor } from "../../test-utils/renderFor";
|
|||||||
import extensionDiscoveryInjectable from "../../../../extensions/extension-discovery/extension-discovery.injectable";
|
import extensionDiscoveryInjectable from "../../../../extensions/extension-discovery/extension-discovery.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 directoryForDownloadsInjectable from "../../../../common/app-paths/directory-for-downloads/directory-for-downloads.injectable";
|
import directoryForDownloadsInjectable from "../../../../common/app-paths/directory-for-downloads/directory-for-downloads.injectable";
|
||||||
import getConfigurationFileModelInjectable
|
import getConfigurationFileModelInjectable from "../../../../common/get-configuration-file-model/get-configuration-file-model.injectable";
|
||||||
from "../../../../common/get-configuration-file-model/get-configuration-file-model.injectable";
|
import appVersionInjectable from "../../../../common/get-configuration-file-model/app-version/app-version.injectable";
|
||||||
import appVersionInjectable
|
|
||||||
from "../../../../common/get-configuration-file-model/app-version/app-version.injectable";
|
|
||||||
|
|
||||||
mockWindow();
|
mockWindow();
|
||||||
|
|
||||||
|
|||||||
@ -76,6 +76,7 @@ export const getApplicationBuilder = () => {
|
|||||||
const dis = { rendererDi, mainDi };
|
const dis = { rendererDi, mainDi };
|
||||||
|
|
||||||
const clusterStoreStub = {
|
const clusterStoreStub = {
|
||||||
|
provideInitialFromMain: () => {},
|
||||||
getById: (): null => null,
|
getById: (): null => null,
|
||||||
} as unknown as ClusterStore;
|
} as unknown as ClusterStore;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user