diff --git a/extensions/support-page/main.ts b/extensions/support-page/main.ts index b875c89a19..5f34334c69 100644 --- a/extensions/support-page/main.ts +++ b/extensions/support-page/main.ts @@ -1,4 +1,4 @@ -import { LensMainExtension, Registry } from "@lens/extensions"; +import { LensMainExtension, Registry } from "@k8slens/extensions"; import { supportPageURL } from "./src/support.route"; export default class SupportPageMainExtension extends LensMainExtension { diff --git a/extensions/support-page/renderer.tsx b/extensions/support-page/renderer.tsx index f273f42759..44f5985398 100644 --- a/extensions/support-page/renderer.tsx +++ b/extensions/support-page/renderer.tsx @@ -1,4 +1,4 @@ -import { LensRendererExtension, Registry } from "@lens/ui-extensions"; +import { LensRendererExtension, Registry } from "@k8slens/extensions"; import { Support } from "./src/support"; import { supportPageRoute, supportPageURL } from "./src/support.route"; diff --git a/extensions/support-page/src/support.tsx b/extensions/support-page/src/support.tsx index 9325adc940..4f189286f1 100644 --- a/extensions/support-page/src/support.tsx +++ b/extensions/support-page/src/support.tsx @@ -3,7 +3,7 @@ import React from "react" import { observer } from "mobx-react" -import { CommonVars, Component } from "@lens/ui-extensions"; +import { CommonVars, Component } from "@k8slens/extensions"; @observer export class Support extends React.Component { diff --git a/extensions/support-page/tsconfig.json b/extensions/support-page/tsconfig.json index 8501a46ab4..c32d3f0b74 100644 --- a/extensions/support-page/tsconfig.json +++ b/extensions/support-page/tsconfig.json @@ -24,7 +24,7 @@ }, "include": [ "renderer.ts", - "../../types/", + "../../src/extensions/npm/**/*.d.ts", "src/**/*" ] } diff --git a/extensions/support-page/webpack.config.ts b/extensions/support-page/webpack.config.ts index 70f28d0e0e..c7e5e56cb0 100644 --- a/extensions/support-page/webpack.config.ts +++ b/extensions/support-page/webpack.config.ts @@ -3,6 +3,13 @@ import path from "path" const outputPath = path.resolve(__dirname, 'dist'); // TODO: figure out how to share base TS and Webpack configs from Lens (npm, filesystem, etc?) +const lensExternals = { + "@k8slens/extensions": "var global.LensExtensions", + "react": "var global.React", + "mobx": "var global.Mobx", + "mobx-react": "var global.MobxReact", +}; + export default [ { entry: './main.ts', @@ -19,14 +26,10 @@ export default [ ], }, externals: [ - { - "@lens/extensions": "var global.LensExtensions", - "react": "var global.React", - "mobx": "var global.Mobx" - } + lensExternals, ], resolve: { - extensions: [ '.tsx', '.ts', '.js' ], + extensions: ['.tsx', '.ts', '.js'], }, output: { libraryTarget: "commonjs2", @@ -50,15 +53,10 @@ export default [ ], }, externals: [ - { - "@lens/ui-extensions": "var global.LensExtensions", - "@lens/extensions": "var global.LensMainExtensions", - "react": "var global.React", - "mobx": "var global.Mobx" - } + lensExternals, ], resolve: { - extensions: [ '.tsx', '.ts', '.js' ], + extensions: ['.tsx', '.ts', '.js'], }, output: { libraryTarget: "commonjs2", diff --git a/extensions/telemetry/package.json b/extensions/telemetry/package.json index 564d627894..238a69b454 100644 --- a/extensions/telemetry/package.json +++ b/extensions/telemetry/package.json @@ -9,8 +9,8 @@ "styles": [] }, "scripts": { - "build": "webpack --config webpack.config.js", - "dev": "npm run build --watch" + "build": "webpack -p", + "dev": "webpack --watch" }, "dependencies": {}, "devDependencies": { diff --git a/extensions/telemetry/tsconfig.json b/extensions/telemetry/tsconfig.json index d62add616f..c32d3f0b74 100644 --- a/extensions/telemetry/tsconfig.json +++ b/extensions/telemetry/tsconfig.json @@ -26,5 +26,5 @@ "renderer.ts", "../../src/extensions/npm/**/*.d.ts", "src/**/*" - ], + ] } diff --git a/src/extensions/core-api/index.ts b/src/extensions/core-api/index.ts new file mode 100644 index 0000000000..d2caf01db5 --- /dev/null +++ b/src/extensions/core-api/index.ts @@ -0,0 +1,18 @@ +// Lens-extensions api developer's kit +export * from "../lens-main-extension" +export * from "../lens-renderer-extension" + +// APIs +import * as EventBus from "./event-bus" +import * as Store from "./stores" +import * as Util from "./utils" +import * as Registry from "../registries" +import * as CommonVars from "../../common/vars"; + +export { + EventBus, + Store, + Util, + Registry, + CommonVars, +} diff --git a/src/extensions/core-extension-api.ts b/src/extensions/core-extension-api.ts deleted file mode 100644 index 2dcce47178..0000000000 --- a/src/extensions/core-extension-api.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Lens-extensions api developer's kit -export type { LensExtensionRuntimeEnv } from "./lens-runtime"; -export * from "./lens-main-extension" -export * from "./lens-renderer-extension" - -// APIs -import * as EventBus from "./core-api/event-bus" -import * as Store from "./core-api/stores" -import * as Util from "./core-api/utils" -import * as Registry from "./core-api/registries" - -export { - EventBus, - Registry, - Store, - Util -} diff --git a/src/extensions/dynamic-page.tsx b/src/extensions/dynamic-page.tsx index 9d6cb57cce..854e0f27fd 100644 --- a/src/extensions/dynamic-page.tsx +++ b/src/extensions/dynamic-page.tsx @@ -1,7 +1,7 @@ import React from "react"; import { cssNames } from "../renderer/utils"; import { TabLayout } from "../renderer/components/layout/tab-layout"; -import { PageRegistration } from "./page-registry" +import { PageRegistration } from "./registries/page-registry" export class DynamicPage extends React.Component<{ page: PageRegistration }> { render() { diff --git a/src/extensions/extension-api.ts b/src/extensions/extension-api.ts index 17bb510ea3..f3d3ff02ec 100644 --- a/src/extensions/extension-api.ts +++ b/src/extensions/extension-api.ts @@ -1,2 +1,4 @@ -export * from "./core-extension-api" -export * from "./renderer-extension-api" +// Extension-api types generation bundle (used by rollup.js) + +export * from "./core-api" +export * from "./renderer-api" diff --git a/src/extensions/extension-loader.ts b/src/extensions/extension-loader.ts index f3aeb99602..5dc6a56277 100644 --- a/src/extensions/extension-loader.ts +++ b/src/extensions/extension-loader.ts @@ -1,17 +1,12 @@ -import type { ExtensionId, LensExtension, ExtensionManifest, ExtensionModel } from "./lens-extension" +import type { ExtensionId, ExtensionManifest, ExtensionModel, LensExtension } from "./lens-extension" import type { LensMainExtension } from "./lens-main-extension" import type { LensRendererExtension } from "./lens-renderer-extension" -import type { LensExtensionMainRuntimeEnv } from "./lens-runtime" -import type { LensExtensionRendererRuntimeEnv } from "./lens-renderer-runtime" import path from "path" import { broadcastIpc } from "../common/ipc" import { observable, reaction, toJS, } from "mobx" import logger from "../main/logger" -import { app, remote, ipcRenderer } from "electron" -import { pageRegistry } from "./page-registry"; -import { appPreferenceRegistry } from "./app-preference-registry" -import { menuRegistry } from "./menu-registry"; -import { statusBarRegistry } from "./status-bar-registry"; +import { app, ipcRenderer, remote } from "electron" +import { appPreferenceRegistry, menuRegistry, pageRegistry, statusBarRegistry } from "./registries"; export interface InstalledExtension extends ExtensionModel { manifestPath: string; @@ -39,32 +34,32 @@ export class ExtensionLoader { } } - loadOnClusterRenderer(getLensRuntimeEnv: () => LensExtensionRendererRuntimeEnv) { + loadOnClusterRenderer() { logger.info('[EXTENSIONS-LOADER]: load on cluster renderer') - this.autoloadExtensions(getLensRuntimeEnv, (instance: LensRendererExtension) => { + this.autoloadExtensions((instance: LensRendererExtension) => { instance.registerPages(pageRegistry) }) } - loadOnMainRenderer(getLensRuntimeEnv: () => LensExtensionRendererRuntimeEnv) { + loadOnMainRenderer() { logger.info('[EXTENSIONS-LOADER]: load on main renderer') - this.autoloadExtensions(getLensRuntimeEnv, (instance: LensRendererExtension) => { + this.autoloadExtensions((instance: LensRendererExtension) => { instance.registerPages(pageRegistry) instance.registerAppPreferences(appPreferenceRegistry) }) } - loadOnMain(getLensRuntimeEnv: () => LensExtensionMainRuntimeEnv) { + loadOnMain() { logger.info('[EXTENSIONS-LOADER]: load on main') - this.autoloadExtensions(getLensRuntimeEnv, (instance: LensMainExtension) => { + this.autoloadExtensions((instance: LensMainExtension) => { instance.registerAppMenus(menuRegistry); instance.registerStatusBarIcon(statusBarRegistry); }) } - protected autoloadExtensions(getLensRuntimeEnv: () => object, callback: (instance: LensExtension) => void) { + protected autoloadExtensions(callback: (instance: LensExtension) => void) { return reaction(() => this.extensions.toJS(), (installedExtensions) => { - for(const [id, ext] of installedExtensions) { + for (const [id, ext] of installedExtensions) { let instance = this.instances.get(ext.manifestPath) if (!instance) { const extensionModule = this.requireExtension(ext) @@ -73,7 +68,7 @@ export class ExtensionLoader { } const LensExtensionClass = extensionModule.default; instance = new LensExtensionClass({ ...ext.manifest, manifestPath: ext.manifestPath, id: ext.manifestPath }, ext.manifest); - instance.enable(getLensRuntimeEnv()) + instance.enable(); callback(instance) this.instances.set(ext.id, instance) } @@ -109,7 +104,9 @@ export class ExtensionLoader { const extension = this.getById(id); if (extension) { const instance = this.instances.get(extension.id) - if (instance) { await instance.disable() } + if (instance) { + await instance.disable() + } this.extensions.delete(id); } } diff --git a/src/extensions/lens-extension.ts b/src/extensions/lens-extension.ts index 3a03b06a05..b348cd6868 100644 --- a/src/extensions/lens-extension.ts +++ b/src/extensions/lens-extension.ts @@ -33,7 +33,6 @@ export class LensExtension implements ExtensionModel { @observable manifest: ExtensionManifest; @observable manifestPath: string; @observable isEnabled = false; - @observable.ref runtime: any; constructor(model: ExtensionModel, manifest: ExtensionManifest) { this.importModel(model, manifest); @@ -55,9 +54,8 @@ export class LensExtension implements ExtensionModel { // mock } - async enable(runtime: any) { + async enable() { this.isEnabled = true; - this.runtime = runtime; logger.info(`[EXTENSION]: enabled ${this.name}@${this.version}`); this.onActivate(); } @@ -65,7 +63,6 @@ export class LensExtension implements ExtensionModel { async disable() { this.onDeactivate(); this.isEnabled = false; - this.runtime = null; this.disposers.forEach(cleanUp => cleanUp()); this.disposers.length = 0; logger.info(`[EXTENSION]: disabled ${this.name}@${this.version}`); diff --git a/src/extensions/lens-main-extension.ts b/src/extensions/lens-main-extension.ts index 71ff39a130..c19184bb84 100644 --- a/src/extensions/lens-main-extension.ts +++ b/src/extensions/lens-main-extension.ts @@ -1,6 +1,6 @@ import { LensExtension } from "./lens-extension" -import type { MenuRegistry } from "./menu-registry"; -import type { StatusBarRegistry } from "./status-bar-registry"; +import type { MenuRegistry } from "./registries/menu-registry"; +import type { StatusBarRegistry } from "./registries/status-bar-registry"; export class LensMainExtension extends LensExtension { registerAppMenus(registry: MenuRegistry) { diff --git a/src/extensions/lens-renderer-extension.ts b/src/extensions/lens-renderer-extension.ts index 5545bb0d65..5031c3caa8 100644 --- a/src/extensions/lens-renderer-extension.ts +++ b/src/extensions/lens-renderer-extension.ts @@ -1,9 +1,8 @@ import { LensExtension } from "./lens-extension" -import type { PageRegistry } from "./page-registry" -import type { AppPreferenceRegistry } from "./app-preference-registry"; +import type { PageRegistry } from "./registries/page-registry" +import type { AppPreferenceRegistry } from "./registries/app-preference-registry"; export class LensRendererExtension extends LensExtension { - registerPages(registry: PageRegistry) { return } diff --git a/src/extensions/lens-runtime.ts b/src/extensions/lens-runtime.ts deleted file mode 100644 index 677e4aeda5..0000000000 --- a/src/extensions/lens-runtime.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Lens extension runtime params available to extensions after activation - -import logger from "../main/logger"; - -export interface LensExtensionMainRuntimeEnv { - logger: typeof logger; -} - -export function getLensRuntime(): LensExtensionMainRuntimeEnv { - return { - logger - } -} diff --git a/src/extensions/app-preference-registry.ts b/src/extensions/registries/app-preference-registry.ts similarity index 100% rename from src/extensions/app-preference-registry.ts rename to src/extensions/registries/app-preference-registry.ts diff --git a/src/extensions/registries/index.ts b/src/extensions/registries/index.ts new file mode 100644 index 0000000000..4ac48757ac --- /dev/null +++ b/src/extensions/registries/index.ts @@ -0,0 +1,4 @@ +export * from "./page-registry" +export * from "./menu-registry" +export * from "./app-preference-registry" +export * from "./status-bar-registry" diff --git a/src/extensions/menu-registry.ts b/src/extensions/registries/menu-registry.ts similarity index 91% rename from src/extensions/menu-registry.ts rename to src/extensions/registries/menu-registry.ts index 7651e676e1..dba3718017 100644 --- a/src/extensions/menu-registry.ts +++ b/src/extensions/registries/menu-registry.ts @@ -2,7 +2,7 @@ import { observable } from "mobx"; import { MenuItemConstructorOptions } from "electron"; -import type { MenuTopId } from "../main/menu"; +import type { MenuTopId } from "../../main/menu"; export interface MenuRegistration extends MenuItemConstructorOptions { parentId?: MenuTopId; diff --git a/src/extensions/page-registry.ts b/src/extensions/registries/page-registry.ts similarity index 76% rename from src/extensions/page-registry.ts rename to src/extensions/registries/page-registry.ts index de7d608dcf..2de9f59ec3 100644 --- a/src/extensions/page-registry.ts +++ b/src/extensions/registries/page-registry.ts @@ -1,11 +1,11 @@ // Extensions-api -> Dynamic pages +import type React from "react"; +import type { RouteProps } from "react-router"; +import type { IconProps } from "../../renderer/components/icon"; +import type { IClassName } from "../../renderer/utils"; +import type { TabRoute } from "../../renderer/components/layout/tab-layout"; import { computed, observable } from "mobx"; -import React from "react"; -import { RouteProps } from "react-router"; -import { IconProps } from "../renderer/components/icon"; -import { IClassName } from "../renderer/utils"; -import { TabRoute } from "../renderer/components/layout/tab-layout"; export enum PageRegistryType { GLOBAL = "lens-scope", @@ -40,9 +40,7 @@ export class PageRegistry { // fixme: validate route paths to avoid collisions add(pageInit: PageRegistration) { this.pages.push(pageInit); - return () => { - this.pages.remove(pageInit); // works because of {deep: false} - }; + return () => this.pages.remove(pageInit); // works because of {deep: false}; } } diff --git a/src/extensions/status-bar-registry.ts b/src/extensions/registries/status-bar-registry.ts similarity index 100% rename from src/extensions/status-bar-registry.ts rename to src/extensions/registries/status-bar-registry.ts diff --git a/src/extensions/renderer-api/index.ts b/src/extensions/renderer-api/index.ts new file mode 100644 index 0000000000..ef6de69e61 --- /dev/null +++ b/src/extensions/renderer-api/index.ts @@ -0,0 +1,12 @@ +// Lens-extensions apis, required in renderer process runtime + +// APIs +import * as Component from "./components" +import * as K8sApi from "./k8s-api" +import * as Navigation from "./navigation" + +export { + Component, + K8sApi, + Navigation, +} diff --git a/src/extensions/renderer-extension-api.ts b/src/extensions/renderer-extension-api.ts deleted file mode 100644 index d96c45b845..0000000000 --- a/src/extensions/renderer-extension-api.ts +++ /dev/null @@ -1,10 +0,0 @@ -// APIs -import * as Component from "./renderer-api/components" -import * as K8sApi from "./renderer-api/k8s-api" -import * as Navigation from "./renderer-api/navigation" - -export { - Component, - K8sApi, - Navigation, -} diff --git a/src/main/index.ts b/src/main/index.ts index adc5cc229e..4306f1dd1e 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -17,10 +17,9 @@ import { clusterStore } from "../common/cluster-store" import { userStore } from "../common/user-store"; import { workspaceStore } from "../common/workspace-store"; import { appEventBus } from "../common/event-bus" -import * as LensExtensions from "../extensions/core-extension-api"; +import * as LensExtensions from "../extensions/core-api"; import { extensionManager } from "../extensions/extension-manager"; import { extensionLoader } from "../extensions/extension-loader"; -import { getLensRuntime } from "../extensions/lens-runtime"; import logger from "./logger" import * as Mobx from "mobx" @@ -85,7 +84,7 @@ async function main() { // create window manager and open app windowManager = new WindowManager(proxyPort); - extensionLoader.loadOnMain(getLensRuntime) + extensionLoader.loadOnMain() extensionLoader.extensions.replace(await extensionManager.load()) extensionLoader.broadcastExtensions() diff --git a/src/main/menu.ts b/src/main/menu.ts index 7f8b08bafc..d3aacc8118 100644 --- a/src/main/menu.ts +++ b/src/main/menu.ts @@ -6,7 +6,7 @@ import { addClusterURL } from "../renderer/components/+add-cluster/add-cluster.r import { preferencesURL } from "../renderer/components/+preferences/preferences.route"; import { whatsNewURL } from "../renderer/components/+whats-new/whats-new.route"; import { clusterSettingsURL } from "../renderer/components/+cluster-settings/cluster-settings.route"; -import { menuRegistry } from "../extensions/menu-registry"; +import { menuRegistry } from "../extensions/registries/menu-registry"; import logger from "./logger"; export type MenuTopId = "mac" | "file" | "edit" | "view" | "help" diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index bcbc9fb5a1..5d92dd624d 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -1,4 +1,5 @@ import "./components/app.scss" + import React from "react"; import * as Mobx from "mobx" import * as MobxReact from "mobx-react" diff --git a/src/renderer/components/+preferences/preferences.tsx b/src/renderer/components/+preferences/preferences.tsx index adf8e51835..4b9532229f 100644 --- a/src/renderer/components/+preferences/preferences.tsx +++ b/src/renderer/components/+preferences/preferences.tsx @@ -16,7 +16,7 @@ import { Badge } from "../badge"; import { themeStore } from "../../theme.store"; import { Tooltip } from "../tooltip"; import { KubectlBinaries } from "./kubectl-binaries"; -import { appPreferenceRegistry } from "../../../extensions/app-preference-registry"; +import { appPreferenceRegistry } from "../../../extensions/registries/app-preference-registry"; import { PageLayout } from "../layout/page-layout"; @observer diff --git a/src/renderer/components/app.tsx b/src/renderer/components/app.tsx index f439d2c84c..265d76236e 100755 --- a/src/renderer/components/app.tsx +++ b/src/renderer/components/app.tsx @@ -35,10 +35,9 @@ import { getHostedCluster, getHostedClusterId } from "../../common/cluster-store import logger from "../../main/logger"; import { clusterIpc } from "../../common/cluster-ipc"; import { webFrame } from "electron"; -import { pageRegistry } from "../../extensions/page-registry"; +import { pageRegistry } from "../../extensions/registries/page-registry"; import { DynamicPage } from "../../extensions/dynamic-page"; import { extensionLoader } from "../../extensions/extension-loader"; -import { getLensRuntimeRenderer } from "../../extensions/lens-renderer-runtime"; import { appEventBus } from "../../common/event-bus" @observer @@ -51,7 +50,7 @@ export class App extends React.Component { await clusterIpc.setFrameId.invokeFromRenderer(clusterId, frameId); await getHostedCluster().whenReady; // cluster.activate() is done at this point - extensionLoader.loadOnClusterRenderer(getLensRuntimeRenderer) + extensionLoader.loadOnClusterRenderer(); appEventBus.emit({name: "cluster", action: "open", params: { clusterId: clusterId }}) diff --git a/src/renderer/components/cluster-manager/cluster-manager.tsx b/src/renderer/components/cluster-manager/cluster-manager.tsx index 5276b0edf1..a2d819b742 100644 --- a/src/renderer/components/cluster-manager/cluster-manager.tsx +++ b/src/renderer/components/cluster-manager/cluster-manager.tsx @@ -14,7 +14,7 @@ import { ClusterSettings, clusterSettingsRoute } from "../+cluster-settings"; import { clusterViewRoute, clusterViewURL, getMatchedCluster, getMatchedClusterId } from "./cluster-view.route"; import { clusterStore } from "../../../common/cluster-store"; import { hasLoadedView, initView, lensViews, refreshViews } from "./lens-views"; -import { pageRegistry } from "../../../extensions/page-registry"; +import { pageRegistry } from "../../../extensions/registries/page-registry"; @observer export class ClusterManager extends React.Component { diff --git a/src/renderer/components/cluster-manager/clusters-menu.tsx b/src/renderer/components/cluster-manager/clusters-menu.tsx index 20f792a0c2..ad977afbb1 100644 --- a/src/renderer/components/cluster-manager/clusters-menu.tsx +++ b/src/renderer/components/cluster-manager/clusters-menu.tsx @@ -22,7 +22,7 @@ import { ConfirmDialog } from "../confirm-dialog"; import { clusterIpc } from "../../../common/cluster-ipc"; import { clusterViewURL } from "./cluster-view.route"; import { DragDropContext, Draggable, DraggableProvided, Droppable, DroppableProvided, DropResult } from "react-beautiful-dnd"; -import { pageRegistry } from "../../../extensions/page-registry"; +import { pageRegistry } from "../../../extensions/registries/page-registry"; interface Props { className?: IClassName; diff --git a/src/renderer/components/layout/sidebar.tsx b/src/renderer/components/layout/sidebar.tsx index 8bf270a28b..6c4751e1bf 100644 --- a/src/renderer/components/layout/sidebar.tsx +++ b/src/renderer/components/layout/sidebar.tsx @@ -28,7 +28,7 @@ import { CrdList, crdResourcesRoute, crdRoute, crdURL } from "../+custom-resourc import { CustomResources } from "../+custom-resources/custom-resources"; import { navigation } from "../../navigation"; import { isAllowedResource } from "../../../common/rbac" -import { pageRegistry } from "../../../extensions/page-registry"; +import { pageRegistry } from "../../../extensions/registries/page-registry"; const SidebarContext = React.createContext({ pinned: false }); type SidebarContextValue = { diff --git a/src/renderer/lens-app.tsx b/src/renderer/lens-app.tsx index c907574dcd..e23056b9f8 100644 --- a/src/renderer/lens-app.tsx +++ b/src/renderer/lens-app.tsx @@ -12,12 +12,11 @@ import { WhatsNew, whatsNewRoute } from "./components/+whats-new"; import { Notifications } from "./components/notifications"; import { ConfirmDialog } from "./components/confirm-dialog"; import { extensionLoader } from "../extensions/extension-loader"; -import { getLensRuntimeRenderer } from "../extensions/lens-renderer-runtime"; @observer export class LensApp extends React.Component { static async init() { - extensionLoader.loadOnMainRenderer(getLensRuntimeRenderer) + extensionLoader.loadOnMainRenderer(); } render() {