diff --git a/extensions/example-extension/main.ts b/extensions/example-extension/main.ts index e60540ac37..2f0a926769 100644 --- a/extensions/example-extension/main.ts +++ b/extensions/example-extension/main.ts @@ -1,4 +1,4 @@ -import { LensMainExtension } from "@lens/extensions"; +import { LensMainExtension } from "@k8slens/extensions"; export default class ExampleExtensionMain extends LensMainExtension { onActivate() { diff --git a/extensions/example-extension/page.tsx b/extensions/example-extension/page.tsx index 5112ee8305..fbb91848a9 100644 --- a/extensions/example-extension/page.tsx +++ b/extensions/example-extension/page.tsx @@ -1,13 +1,13 @@ -import { Component, LensRendererExtension } from "@lens/ui-extensions"; +import { LensRendererExtension, Component } from "@k8slens/extensions"; import { CoffeeDoodle } from "react-open-doodles"; import path from "path"; import React from "react" -export function ExtensionIcon(props: Component.IconProps) { +export function ExampleIcon(props: Component.IconProps) { return } -export class ExtensionPage extends React.Component<{ extension: LensRendererExtension }> { +export class ExamplePage extends React.Component<{ extension: LensRendererExtension }> { deactivate = () => { const { extension } = this.props; extension.disable(); @@ -27,7 +27,3 @@ export class ExtensionPage extends React.Component<{ extension: LensRendererExte ) } } - -export function examplePage(ext: LensRendererExtension) { - return () => -} diff --git a/extensions/example-extension/renderer.ts b/extensions/example-extension/renderer.tsx similarity index 70% rename from extensions/example-extension/renderer.ts rename to extensions/example-extension/renderer.tsx index cf910b4bc7..3e95ce12f7 100644 --- a/extensions/example-extension/renderer.ts +++ b/extensions/example-extension/renderer.tsx @@ -1,5 +1,6 @@ -import { Registry, LensRendererExtension } from "@lens/ui-extensions"; -import { examplePage, ExtensionIcon } from "./page" +import { LensRendererExtension, Registry } from "@k8slens/extensions"; +import { ExamplePage, ExampleIcon } from "./page" +import React from "react" export default class ExampleExtension extends LensRendererExtension { onActivate() { @@ -13,8 +14,8 @@ export default class ExampleExtension extends LensRendererExtension { path: "/extension-example", title: "Example Extension", components: { - Page: examplePage(this), - MenuIcon: ExtensionIcon, + Page: () => , + MenuIcon: ExampleIcon, } }) ) diff --git a/extensions/example-extension/tsconfig.json b/extensions/example-extension/tsconfig.json index 08f5df036f..ac83e008db 100644 --- a/extensions/example-extension/tsconfig.json +++ b/extensions/example-extension/tsconfig.json @@ -16,7 +16,7 @@ "jsx": "react" }, "include": [ - "../../types", + "../../src/extensions/npm/**/*.d.ts", "./*.ts", "./*.tsx" ], diff --git a/extensions/example-extension/webpack.config.js b/extensions/example-extension/webpack.config.js index e63a93b78e..89e84e3125 100644 --- a/extensions/example-extension/webpack.config.js +++ b/extensions/example-extension/webpack.config.js @@ -17,8 +17,9 @@ module.exports = [ }, externals: [ { - "@lens/extensions": "var global.LensExtensions", + "@k8slens/extensions": "var global.LensExtensions", "mobx": "var global.Mobx", + "react": "var global.React" } ], resolve: { @@ -31,7 +32,7 @@ module.exports = [ }, }, { - entry: './renderer.ts', + entry: './renderer.tsx', context: __dirname, target: "electron-renderer", mode: "production", @@ -46,7 +47,7 @@ module.exports = [ }, externals: [ { - "@lens/ui-extensions": "var global.LensExtensions", + "@k8slens/extensions": "var global.LensExtensions", "react": "var global.React", "mobx": "var global.Mobx" } diff --git a/extensions/telemetry/main.ts b/extensions/telemetry/main.ts index 262980700f..f0d231316d 100644 --- a/extensions/telemetry/main.ts +++ b/extensions/telemetry/main.ts @@ -1,4 +1,4 @@ -import { LensMainExtension } from "@lens/extensions"; +import { LensMainExtension } from "@k8slens/extensions"; import { telemetryPreferencesStore } from "./src/telemetry-preferences-store" import { tracker } from "./src/tracker"; @@ -7,7 +7,7 @@ export default class TelemetryMainExtension extends LensMainExtension { async onActivate() { console.log("telemetry main extension activated") tracker.start() - await telemetryPreferencesStore.load() + await telemetryPreferencesStore.loadExtension(this) } onDeactivate() { diff --git a/extensions/telemetry/package.json b/extensions/telemetry/package.json index 238a69b454..564d627894 100644 --- a/extensions/telemetry/package.json +++ b/extensions/telemetry/package.json @@ -9,8 +9,8 @@ "styles": [] }, "scripts": { - "build": "webpack -p", - "dev": "webpack --watch" + "build": "webpack --config webpack.config.js", + "dev": "npm run build --watch" }, "dependencies": {}, "devDependencies": { diff --git a/extensions/telemetry/renderer.tsx b/extensions/telemetry/renderer.tsx index 036775e9f1..3988e97097 100644 --- a/extensions/telemetry/renderer.tsx +++ b/extensions/telemetry/renderer.tsx @@ -1,4 +1,4 @@ -import { Registry, LensRendererExtension } from "@lens/ui-extensions"; +import { LensRendererExtension, Registry } from "@k8slens/extensions"; import { telemetryPreferencesStore } from "./src/telemetry-preferences-store" import { TelemetryPreferenceHint, TelemetryPreferenceInput } from "./src/telemetry-preference" import { tracker } from "./src/tracker" @@ -8,7 +8,7 @@ export default class TelemetryRendererExtension extends LensRendererExtension { async onActivate() { console.log("telemetry extension activated") tracker.start() - await telemetryPreferencesStore.load() + await telemetryPreferencesStore.loadExtension(this) } registerAppPreferences(registry: Registry.AppPreferenceRegistry) { diff --git a/extensions/telemetry/src/telemetry-preference.tsx b/extensions/telemetry/src/telemetry-preference.tsx index caf95716cc..122d722a81 100644 --- a/extensions/telemetry/src/telemetry-preference.tsx +++ b/extensions/telemetry/src/telemetry-preference.tsx @@ -1,4 +1,4 @@ -import { Component } from "@lens/ui-extensions" +import { Component } from "@k8slens/extensions" import React from "react" import { observer } from "mobx-react"; import { TelemetryPreferencesStore } from "./telemetry-preferences-store" diff --git a/extensions/telemetry/src/telemetry-preferences-store.ts b/extensions/telemetry/src/telemetry-preferences-store.ts index dd8dee28be..732ad91524 100644 --- a/extensions/telemetry/src/telemetry-preferences-store.ts +++ b/extensions/telemetry/src/telemetry-preferences-store.ts @@ -1,14 +1,14 @@ -import { Store } from "@lens/extensions"; +import { Store } from "@k8slens/extensions"; import { toJS } from "mobx" export type TelemetryPreferencesModel = { enabled: boolean; } -export class TelemetryPreferencesStore extends Store.BaseStore { +export class TelemetryPreferencesStore extends Store.ExtensionStore { private constructor() { super({ - configName: "telemetry-preferences-store", + configName: "preferences-store", defaults: { enabled: true } diff --git a/extensions/telemetry/src/tracker.ts b/extensions/telemetry/src/tracker.ts index a14d2a7c44..ed23253bd6 100644 --- a/extensions/telemetry/src/tracker.ts +++ b/extensions/telemetry/src/tracker.ts @@ -1,4 +1,4 @@ -import { EventBus, Util } from "@lens/extensions" +import { EventBus, Util } from "@k8slens/extensions" import ua from "universal-analytics" import { machineIdSync } from "node-machine-id" import { telemetryPreferencesStore } from "./telemetry-preferences-store" diff --git a/extensions/telemetry/tsconfig.json b/extensions/telemetry/tsconfig.json index 69c833aa23..d62add616f 100644 --- a/extensions/telemetry/tsconfig.json +++ b/extensions/telemetry/tsconfig.json @@ -24,7 +24,7 @@ }, "include": [ "renderer.ts", - "../../types/", + "../../src/extensions/npm/**/*.d.ts", "src/**/*" ], } diff --git a/extensions/telemetry/webpack.config.js b/extensions/telemetry/webpack.config.js index 2d8ac739ef..f13f54f9fd 100644 --- a/extensions/telemetry/webpack.config.js +++ b/extensions/telemetry/webpack.config.js @@ -17,7 +17,7 @@ module.exports = [ }, externals: [ { - "@lens/extensions": "var global.LensExtensions", + "@k8slens/extensions": "var global.LensExtensions", "react": "var global.React", "mobx": "var global.Mobx" } @@ -48,10 +48,10 @@ module.exports = [ }, externals: [ { - "@lens/ui-extensions": "var global.LensExtensions", - "@lens/extensions": "var global.LensMainExtensions", + "@k8slens/extensions": "var global.LensExtensions", "react": "var global.React", - "mobx": "var global.Mobx" + "mobx": "var global.Mobx", + "mobx-react": "var global.MobxReact" } ], resolve: { diff --git a/src/common/base-store.ts b/src/common/base-store.ts index f476965736..f29d35d877 100644 --- a/src/common/base-store.ts +++ b/src/common/base-store.ts @@ -56,13 +56,17 @@ export class BaseStore extends Singleton { ...confOptions, projectName: "lens", projectVersion: getAppVersion(), - cwd: (app || remote.app).getPath("userData"), + cwd: this.storePath(), }); logger.info(`[STORE]: LOADED from ${this.storeConfig.path}`); this.fromStore(this.storeConfig.store); this.isLoaded = true; } + protected storePath() { + return (app || remote.app).getPath("userData") + } + protected async saveToFile(model: T) { logger.info(`[STORE]: SAVING ${this.name}`); // todo: update when fixed https://github.com/sindresorhus/conf/issues/114 diff --git a/src/extensions/main-api/event-bus.ts b/src/extensions/core-api/event-bus.ts similarity index 100% rename from src/extensions/main-api/event-bus.ts rename to src/extensions/core-api/event-bus.ts diff --git a/src/extensions/core-api/stores.ts b/src/extensions/core-api/stores.ts new file mode 100644 index 0000000000..c8405bd67f --- /dev/null +++ b/src/extensions/core-api/stores.ts @@ -0,0 +1 @@ +export { ExtensionStore } from "../extension-store" diff --git a/src/extensions/main-api/utils.ts b/src/extensions/core-api/utils.ts similarity index 100% rename from src/extensions/main-api/utils.ts rename to src/extensions/core-api/utils.ts diff --git a/src/extensions/core-extension-api.ts b/src/extensions/core-extension-api.ts new file mode 100644 index 0000000000..2dcce47178 --- /dev/null +++ b/src/extensions/core-extension-api.ts @@ -0,0 +1,17 @@ +// 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/extension-api.ts b/src/extensions/extension-api.ts index 5d8955988a..17bb510ea3 100644 --- a/src/extensions/extension-api.ts +++ b/src/extensions/extension-api.ts @@ -1,17 +1,2 @@ -// Lens-extensions api developer's kit - -export type { LensExtensionMainRuntimeEnv } from "./lens-runtime"; -export * from "./lens-main-extension" - -// APIs -import * as EventBus from "./main-api/event-bus" -import * as Store from "./main-api/stores" -import * as Util from "./main-api/utils" -import * as Registry from "./main-api/registries" - -export { - EventBus, - Store, - Util, - Registry, -} +export * from "./core-extension-api" +export * from "./renderer-extension-api" diff --git a/src/extensions/extension-renderer-api.ts b/src/extensions/extension-renderer-api.ts deleted file mode 100644 index 55ea60a06e..0000000000 --- a/src/extensions/extension-renderer-api.ts +++ /dev/null @@ -1,22 +0,0 @@ -// Lens-extensions api developer's kit -export type { LensExtensionRendererRuntimeEnv } from "./lens-renderer-runtime" - -// APIs -export * from "./lens-extension" -export * from "./lens-renderer-extension" - -import * as Component from "./renderer-api/components" -import * as EventBus from "./main-api/event-bus" -import * as K8sApi from "./renderer-api/k8s-api" -import * as Registry from "./renderer-api/registries" -import * as Util from "./main-api/utils" -import * as CommonVars from "../common/vars"; - -export { - Component, - EventBus, - K8sApi, - Registry, - Util, - CommonVars, -} diff --git a/src/extensions/extension-store.ts b/src/extensions/extension-store.ts new file mode 100644 index 0000000000..5331420cd6 --- /dev/null +++ b/src/extensions/extension-store.ts @@ -0,0 +1,21 @@ +import { BaseStore } from "../common/base-store" +import * as path from "path" +import { LensExtension } from "./lens-extension" + +export class ExtensionStore extends BaseStore { + protected extension: LensExtension + + async loadExtension(extension: LensExtension) { + this.extension = extension + await super.load() + } + + async load() { + if (!this.extension) { return } + await super.load() + } + + protected storePath() { + return path.join(super.storePath(), "extension-store", this.extension.name) + } +} diff --git a/src/extensions/lens-renderer-runtime.ts b/src/extensions/lens-renderer-runtime.ts deleted file mode 100644 index 0f34d0daf0..0000000000 --- a/src/extensions/lens-renderer-runtime.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Lens extension runtime params available to renderer extensions after activation - -import logger from "../main/logger"; -import { navigate } from "../renderer/navigation"; - -export interface LensExtensionRendererRuntimeEnv { - logger: typeof logger; - navigate: typeof navigate; -} - -export function getLensRuntimeRenderer(): LensExtensionRendererRuntimeEnv { - return { - logger, - navigate - } -} diff --git a/src/extensions/main-api/registries.ts b/src/extensions/main-api/registries.ts deleted file mode 100644 index 97abb90f3a..0000000000 --- a/src/extensions/main-api/registries.ts +++ /dev/null @@ -1 +0,0 @@ -export { MenuRegistry, MenuRegistration } from "../menu-registry"; diff --git a/src/extensions/main-api/stores.ts b/src/extensions/main-api/stores.ts deleted file mode 100644 index f7e4fca311..0000000000 --- a/src/extensions/main-api/stores.ts +++ /dev/null @@ -1 +0,0 @@ -export { BaseStore } from "../../common/base-store" diff --git a/src/extensions/npm/extensions/.gitignore b/src/extensions/npm/extensions/.gitignore new file mode 100644 index 0000000000..2b33ba5bed --- /dev/null +++ b/src/extensions/npm/extensions/.gitignore @@ -0,0 +1 @@ +api.d.ts diff --git a/src/extensions/npm/extensions/package.json b/src/extensions/npm/extensions/package.json new file mode 100644 index 0000000000..7097629539 --- /dev/null +++ b/src/extensions/npm/extensions/package.json @@ -0,0 +1,15 @@ +{ + "name": "@k8slens/extensions", + "productName": "Lens extensions", + "description": "Lens - The Kubernetes IDE: extensions", + "version": "0.0.0", + "copyright": "© 2020, Mirantis, Inc.", + "license": "MIT", + "files": [ + "api.d.ts" + ], + "author": { + "name": "Mirantis, Inc.", + "email": "info@k8slens.dev" + } +} diff --git a/src/extensions/renderer-api/navigation.ts b/src/extensions/renderer-api/navigation.ts new file mode 100644 index 0000000000..a29df152ee --- /dev/null +++ b/src/extensions/renderer-api/navigation.ts @@ -0,0 +1 @@ +export { navigate } from "../../renderer/navigation" diff --git a/src/extensions/renderer-api/registries.ts b/src/extensions/renderer-api/registries.ts deleted file mode 100644 index 59bfaa93ec..0000000000 --- a/src/extensions/renderer-api/registries.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { PageRegistryType, PageRegistry, PageRegistration, PageComponents } from "../page-registry" -export { AppPreferenceRegistry, AppPreferenceComponents, AppPreferenceRegistration } from "../app-preference-registry" diff --git a/src/extensions/renderer-extension-api.ts b/src/extensions/renderer-extension-api.ts new file mode 100644 index 0000000000..d96c45b845 --- /dev/null +++ b/src/extensions/renderer-extension-api.ts @@ -0,0 +1,10 @@ +// 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/extensions/rollup.config.ts b/src/extensions/rollup.config.ts index 4c90d1e232..a076fa43ce 100644 --- a/src/extensions/rollup.config.ts +++ b/src/extensions/rollup.config.ts @@ -7,29 +7,14 @@ import json from '@rollup/plugin-json'; import dts from "rollup-plugin-dts"; import ignoreImport from 'rollup-plugin-ignore-import' -// todo: generate extension-api.js bundle also with Rollup (?) - const config: RollupOptions = { input: "src/extensions/extension-api.ts", output: [ - { file: "types/extension-api.d.ts", format: "es", } + { file: "src/extensions/npm/extensions/api.d.ts", format: "es", } ], plugins: [ dts(), - dtsModuleWrap({ name: "@lens/extensions" }), - ignoreImport({ extensions: ['.scss'] }), - json(), - ], -}; - -const rendererConfig: RollupOptions = { - input: "src/extensions/extension-renderer-api.ts", - output: [ - { file: "types/extension-renderer-api.d.ts", format: "es", } - ], - plugins: [ - dts(), - dtsModuleWrap({ name: "@lens/ui-extensions" }), + dtsModuleWrap({ name: "@k8slens/extensions" }), ignoreImport({ extensions: ['.scss'] }), json(), ], @@ -69,4 +54,4 @@ function dtsModuleWrap({ name }: { name: string }): Plugin { } } -export default [config, rendererConfig]; +export default [config]; diff --git a/src/main/index.ts b/src/main/index.ts index 6e12706a66..adc5cc229e 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -17,7 +17,7 @@ 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/extension-api"; +import * as LensExtensions from "../extensions/core-extension-api"; import { extensionManager } from "../extensions/extension-manager"; import { extensionLoader } from "../extensions/extension-loader"; import { getLensRuntime } from "../extensions/lens-runtime"; diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index 89e1ba505c..bcbc9fb5a1 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -1,8 +1,8 @@ import "./components/app.scss" import React from "react"; import * as Mobx from "mobx" -import * as LensMainExtensions from "../extensions/extension-api" -import * as LensExtensions from "../extensions/extension-renderer-api" +import * as MobxReact from "mobx-react" +import * as LensExtensions from "../extensions/extension-api" import { render, unmountComponentAtNode } from "react-dom"; import { isMac } from "../common/vars"; import { userStore } from "../common/user-store"; @@ -20,8 +20,8 @@ type AppComponent = React.ComponentType & { export { React, Mobx, - LensExtensions, - LensMainExtensions + MobxReact, + LensExtensions } export async function bootstrap(App: AppComponent) {