1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

extensions-api -- in-progress

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2020-08-31 17:47:01 +03:00
parent 0ff9c655d1
commit a8ce263dc9
4 changed files with 34 additions and 2 deletions

View File

@ -0,0 +1,8 @@
{
"name": "extension-example",
"version": "1.0.0",
"description": "Example extension",
"main": "extension-example.ts",
"dependencies": {
}
}

View File

@ -1,6 +1,8 @@
import path from "path";
import { action, observable, toJS } from "mobx"; import { action, observable, toJS } from "mobx";
import { BaseStore } from "../common/base-store"; import { BaseStore } from "../common/base-store";
import { LensExtension } from "./extension"; import { LensExtension } from "./extension";
import { isDevelopment } from "../common/vars";
export type ExtensionId = string; export type ExtensionId = string;
export type ExtensionVersion = string | number; export type ExtensionVersion = string | number;
@ -16,6 +18,7 @@ export interface ExtensionModel {
name: string; name: string;
description?: string; description?: string;
enabled?: boolean; enabled?: boolean;
updateUrl?: string;
} }
export class ExtensionStore extends BaseStore<ExtensionStoreModel> { export class ExtensionStore extends BaseStore<ExtensionStoreModel> {
@ -29,6 +32,13 @@ export class ExtensionStore extends BaseStore<ExtensionStoreModel> {
@observable extensions = observable.map<ExtensionId, LensExtension>(); @observable extensions = observable.map<ExtensionId, LensExtension>();
@observable removed = observable.map<ExtensionId, LensExtension>(); @observable removed = observable.map<ExtensionId, LensExtension>();
get builtInExtensionsPath(): string {
if (isDevelopment) {
return path.resolve(__static, "../src/extensions");
}
return "" // todo: figure out prod-path
}
getById(id: ExtensionId): LensExtension { getById(id: ExtensionId): LensExtension {
return this.extensions.get(id); return this.extensions.get(id);
} }
@ -36,8 +46,9 @@ export class ExtensionStore extends BaseStore<ExtensionStoreModel> {
async removeById(id: ExtensionId) { async removeById(id: ExtensionId) {
const extension = this.getById(id); const extension = this.getById(id);
if (extension) { if (extension) {
const unInstallStatus = await extension.uninstall()
this.extensions.delete(id); this.extensions.delete(id);
return extension.uninstall(); return unInstallStatus;
} }
} }

View File

@ -1,23 +1,32 @@
import { observable } from "mobx"; import { observable } from "mobx";
import { ExtensionModel } from "./extension-store"; 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 ExtensionId = string;
export type ExtensionVersion = string | number; export type ExtensionVersion = string | number;
export class LensExtension implements ExtensionModel { export class LensExtension implements ExtensionModel {
public id: ExtensionId; public id: ExtensionId;
public version: string | number; public version: string | number;
public updateUrl: string;
@observable name = ""; @observable name = "";
@observable description = ""; @observable description = "";
@observable isEnabled = false; @observable isEnabled = false;
@observable isInstalled = false;
constructor(model: ExtensionModel) { constructor(model: ExtensionModel) {
this.importModel(model); this.importModel(model);
} }
importModel(model: ExtensionModel) { importModel({ enabled, ...model }: ExtensionModel) {
Object.assign(this, model); Object.assign(this, model);
this.isEnabled = enabled;
} }
async install() { async install() {
@ -28,6 +37,10 @@ export class LensExtension implements ExtensionModel {
// todo // todo
} }
async checkNewVersion() {
// todo
}
async enable() { async enable() {
// todo // todo
} }