mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
205 lines
7.1 KiB
TypeScript
205 lines
7.1 KiB
TypeScript
/**
|
|
* Copyright (c) 2021 OpenLens Authors
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
* this software and associated documentation files (the "Software"), to deal in
|
|
* the Software without restriction, including without limitation the rights to
|
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
|
* subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
import "./components/app.scss";
|
|
|
|
import React from "react";
|
|
import * as Mobx from "mobx";
|
|
import * as MobxReact from "mobx-react";
|
|
import * as ReactRouter from "react-router";
|
|
import * as ReactRouterDom from "react-router-dom";
|
|
import * as LensExtensionsCommonApi from "../extensions/common-api";
|
|
import * as LensExtensionsRendererApi from "../extensions/renderer-api";
|
|
import { render } from "react-dom";
|
|
import { delay } from "../common/utils";
|
|
import { isMac, isDevelopment } from "../common/vars";
|
|
import { HelmRepoManager } from "../main/helm/helm-repo-manager";
|
|
import { DefaultProps } from "./mui-base-theme";
|
|
import configurePackages from "../common/configure-packages";
|
|
import * as initializers from "./initializers";
|
|
import logger from "../common/logger";
|
|
import { HotbarStore } from "../common/hotbar-store";
|
|
import { WeblinkStore } from "../common/weblink-store";
|
|
import { ThemeStore } from "./theme.store";
|
|
import { SentryInit } from "../common/sentry";
|
|
import { registerCustomThemes } from "./components/monaco-editor";
|
|
import { getDi } from "./components/getDi";
|
|
import { DiContextProvider } from "@ogre-tools/injectable-react";
|
|
import type { DependencyInjectionContainer } from "@ogre-tools/injectable";
|
|
import extensionLoaderInjectable from "../extensions/extension-loader/extension-loader.injectable";
|
|
|
|
|
|
import extensionDiscoveryInjectable
|
|
from "../extensions/extension-discovery/extension-discovery.injectable";
|
|
import extensionInstallationStateStoreInjectable
|
|
from "../extensions/extension-installation-state-store/extension-installation-state-store.injectable";
|
|
import clusterStoreInjectable from "../common/cluster-store/cluster-store.injectable";
|
|
import userStoreInjectable from "../common/user-store/user-store.injectable";
|
|
|
|
import initRootFrameInjectable from "./frames/root-frame/init-root-frame/init-root-frame.injectable";
|
|
import initClusterFrameInjectable
|
|
from "./frames/cluster-frame/init-cluster-frame/init-cluster-frame.injectable";
|
|
import createTerminalTabInjectable
|
|
from "./components/dock/create-terminal-tab/create-terminal-tab.injectable";
|
|
|
|
if (process.isMainFrame) {
|
|
SentryInit();
|
|
}
|
|
|
|
configurePackages(); // global packages
|
|
registerCustomThemes(); // monaco editor themes
|
|
|
|
/**
|
|
* If this is a development build, wait a second to attach
|
|
* Chrome Debugger to renderer process
|
|
* https://stackoverflow.com/questions/52844870/debugging-electron-renderer-process-with-vscode
|
|
*/
|
|
async function attachChromeDebugger() {
|
|
if (isDevelopment) {
|
|
await delay(1000);
|
|
}
|
|
}
|
|
|
|
export async function bootstrap(di: DependencyInjectionContainer) {
|
|
await di.runSetups();
|
|
|
|
const rootElem = document.getElementById("app");
|
|
const logPrefix = `[BOOTSTRAP-${process.isMainFrame ? "ROOT" : "CLUSTER"}-FRAME]:`;
|
|
|
|
// TODO: Remove temporal dependencies to make timing of initialization not important
|
|
di.inject(userStoreInjectable);
|
|
|
|
await attachChromeDebugger();
|
|
rootElem.classList.toggle("is-mac", isMac);
|
|
|
|
logger.info(`${logPrefix} initializing Registries`);
|
|
initializers.initRegistries();
|
|
|
|
const createTerminalTab = di.inject(createTerminalTabInjectable);
|
|
|
|
logger.info(`${logPrefix} initializing CommandRegistry`);
|
|
initializers.initCommandRegistry(createTerminalTab);
|
|
|
|
logger.info(`${logPrefix} initializing EntitySettingsRegistry`);
|
|
initializers.initEntitySettingsRegistry();
|
|
|
|
logger.info(`${logPrefix} initializing KubeObjectMenuRegistry`);
|
|
initializers.initKubeObjectMenuRegistry();
|
|
|
|
logger.info(`${logPrefix} initializing KubeObjectDetailRegistry`);
|
|
initializers.initKubeObjectDetailRegistry();
|
|
|
|
logger.info(`${logPrefix} initializing WorkloadsOverviewDetailRegistry`);
|
|
initializers.initWorkloadsOverviewDetailRegistry();
|
|
|
|
logger.info(`${logPrefix} initializing CatalogEntityDetailRegistry`);
|
|
initializers.initCatalogEntityDetailRegistry();
|
|
|
|
logger.info(`${logPrefix} initializing CatalogCategoryRegistryEntries`);
|
|
initializers.initCatalogCategoryRegistryEntries();
|
|
|
|
logger.info(`${logPrefix} initializing Catalog`);
|
|
initializers.initCatalog();
|
|
|
|
const extensionLoader = di.inject(extensionLoaderInjectable);
|
|
|
|
logger.info(`${logPrefix} initializing IpcRendererListeners`);
|
|
initializers.initIpcRendererListeners(extensionLoader);
|
|
|
|
logger.info(`${logPrefix} initializing StatusBarRegistry`);
|
|
initializers.initStatusBarRegistry();
|
|
|
|
extensionLoader.init();
|
|
|
|
const extensionDiscovery = di.inject(extensionDiscoveryInjectable);
|
|
|
|
extensionDiscovery.init();
|
|
|
|
// ClusterStore depends on: UserStore
|
|
const clusterStore = di.inject(clusterStoreInjectable);
|
|
|
|
await clusterStore.loadInitialOnRenderer();
|
|
|
|
// HotbarStore depends on: ClusterStore
|
|
HotbarStore.createInstance();
|
|
|
|
// ThemeStore depends on: UserStore
|
|
ThemeStore.createInstance();
|
|
|
|
WeblinkStore.createInstance();
|
|
|
|
const extensionInstallationStateStore = di.inject(extensionInstallationStateStoreInjectable);
|
|
|
|
extensionInstallationStateStore.bindIpcListeners();
|
|
|
|
HelmRepoManager.createInstance(); // initialize the manager
|
|
|
|
// Register additional store listeners
|
|
clusterStore.registerIpcListener();
|
|
|
|
let App;
|
|
let initializeApp;
|
|
|
|
// TODO: Introduce proper architectural boundaries between root and cluster iframes
|
|
if (process.isMainFrame) {
|
|
initializeApp = di.inject(initRootFrameInjectable);
|
|
|
|
App = (await import("./frames/root-frame/root-frame")).RootFrame;
|
|
} else {
|
|
initializeApp = di.inject(initClusterFrameInjectable);
|
|
App = (await import("./frames/cluster-frame/cluster-frame")).ClusterFrame;
|
|
}
|
|
|
|
await initializeApp(rootElem);
|
|
|
|
render(
|
|
<DiContextProvider value={{ di }}>
|
|
{DefaultProps(App)}
|
|
</DiContextProvider>,
|
|
|
|
rootElem,
|
|
);
|
|
}
|
|
|
|
const di = getDi();
|
|
|
|
// run
|
|
bootstrap(di);
|
|
|
|
/**
|
|
* Exports for virtual package "@k8slens/extensions" for renderer-process.
|
|
* All exporting names available in global runtime scope:
|
|
* e.g. Devtools -> Console -> window.LensExtensions (renderer)
|
|
*/
|
|
const LensExtensions = {
|
|
Common: LensExtensionsCommonApi,
|
|
Renderer: LensExtensionsRendererApi,
|
|
};
|
|
|
|
export {
|
|
React,
|
|
ReactRouter,
|
|
ReactRouterDom,
|
|
Mobx,
|
|
MobxReact,
|
|
LensExtensions,
|
|
};
|