From a8ce263dc9c551b23bbf2026ba6b810770e446e0 Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 31 Aug 2020 17:47:01 +0300 Subject: [PATCH] extensions-api -- in-progress Signed-off-by: Roman --- .../extension-example/extension-example.ts | 0 src/extensions/extension-example/package.json | 8 ++++++++ src/extensions/extension-store.ts | 13 ++++++++++++- src/extensions/extension.ts | 15 ++++++++++++++- 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/extensions/extension-example/extension-example.ts create mode 100644 src/extensions/extension-example/package.json diff --git a/src/extensions/extension-example/extension-example.ts b/src/extensions/extension-example/extension-example.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/extensions/extension-example/package.json b/src/extensions/extension-example/package.json new file mode 100644 index 0000000000..e82d8d3278 --- /dev/null +++ b/src/extensions/extension-example/package.json @@ -0,0 +1,8 @@ +{ + "name": "extension-example", + "version": "1.0.0", + "description": "Example extension", + "main": "extension-example.ts", + "dependencies": { + } +} diff --git a/src/extensions/extension-store.ts b/src/extensions/extension-store.ts index e12abacb8f..d5c194935d 100644 --- a/src/extensions/extension-store.ts +++ b/src/extensions/extension-store.ts @@ -1,6 +1,8 @@ +import path from "path"; import { action, observable, toJS } from "mobx"; import { BaseStore } from "../common/base-store"; import { LensExtension } from "./extension"; +import { isDevelopment } from "../common/vars"; export type ExtensionId = string; export type ExtensionVersion = string | number; @@ -16,6 +18,7 @@ export interface ExtensionModel { name: string; description?: string; enabled?: boolean; + updateUrl?: string; } export class ExtensionStore extends BaseStore { @@ -29,6 +32,13 @@ export class ExtensionStore extends BaseStore { @observable extensions = observable.map(); @observable removed = observable.map(); + get builtInExtensionsPath(): string { + if (isDevelopment) { + return path.resolve(__static, "../src/extensions"); + } + return "" // todo: figure out prod-path + } + getById(id: ExtensionId): LensExtension { return this.extensions.get(id); } @@ -36,8 +46,9 @@ export class ExtensionStore extends BaseStore { async removeById(id: ExtensionId) { const extension = this.getById(id); if (extension) { + const unInstallStatus = await extension.uninstall() this.extensions.delete(id); - return extension.uninstall(); + return unInstallStatus; } } diff --git a/src/extensions/extension.ts b/src/extensions/extension.ts index 1e1eb48333..b85f10da80 100644 --- a/src/extensions/extension.ts +++ b/src/extensions/extension.ts @@ -1,23 +1,32 @@ import { observable } from "mobx"; import { ExtensionModel } from "./extension-store"; +// TODO: extensions api +// * Lazy load/unload extension (js/ts?) (from sources: local folder, npm_modules/@lens/some_plugin, etc.) +// * figure out how to expose lens external apis to extension: +// - opt1: import {someApi} from "@lens" => replaced to import from "$PATH/build/Lens.js" on the fly ? +// - opt2: eval with injected exposed apis / contents.executeJavaScript / script[src] / etc. ? + export type ExtensionId = string; export type ExtensionVersion = string | number; export class LensExtension implements ExtensionModel { public id: ExtensionId; public version: string | number; + public updateUrl: string; @observable name = ""; @observable description = ""; @observable isEnabled = false; + @observable isInstalled = false; constructor(model: ExtensionModel) { this.importModel(model); } - importModel(model: ExtensionModel) { + importModel({ enabled, ...model }: ExtensionModel) { Object.assign(this, model); + this.isEnabled = enabled; } async install() { @@ -28,6 +37,10 @@ export class LensExtension implements ExtensionModel { // todo } + async checkNewVersion() { + // todo + } + async enable() { // todo }