From 95db1b3b11e7c1eb2a6653e0c198b4b16418fb8e Mon Sep 17 00:00:00 2001 From: Roman Date: Sun, 6 Sep 2020 22:14:42 +0300 Subject: [PATCH] extensions-api -- fixes Signed-off-by: Roman --- src/extensions/extension-store.ts | 30 ++++++++++++++++-------------- src/extensions/extension.ts | 9 ++++----- src/renderer/lens-app.tsx | 2 +- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/extensions/extension-store.ts b/src/extensions/extension-store.ts index 43da0103d7..8e988f2be9 100644 --- a/src/extensions/extension-store.ts +++ b/src/extensions/extension-store.ts @@ -1,7 +1,7 @@ import type { LensRuntimeRendererEnv } from "./lens-runtime"; import path from "path"; import fs from "fs-extra"; -import { action, observable, reaction, toJS } from "mobx"; +import { action, observable, reaction, toJS, } from "mobx"; import { BaseStore } from "../common/base-store"; import { ExtensionId, ExtensionManifest, ExtensionVersion, LensExtension } from "./extension"; import { isDevelopment } from "../common/vars"; @@ -35,13 +35,14 @@ export class ExtensionStore extends BaseStore { private constructor() { super({ configName: "lens-extension-store", + syncEnabled: false, }); } @observable version: ExtensionVersion = "0.0.0"; @observable extensions = observable.map(); @observable removed = observable.map(); - @observable.shallow installed = observable.map([]); + @observable installed = observable.map([], { deep: false }); get folderPath(): string { if (isDevelopment) { @@ -55,16 +56,16 @@ export class ExtensionStore extends BaseStore { return super.load(); } - enableAutoInitOnLoad(getLensRuntimeEnv: () => LensRuntimeRendererEnv, { delay = 0 } = {}) { - logger.info('[EXTENSIONS-STORE]: enabled: auto-init loaded extensions'); - return reaction(() => Array.from(this.installed.values()), installedExtensions => { + autoEnableOnLoad(getLensRuntimeEnv: () => LensRuntimeRendererEnv, { delay = 0 } = {}) { + logger.info('[EXTENSIONS-STORE]: enabled auto-activation all installed extensions'); + return reaction(() => this.installed.toJS(), installedExtensions => { installedExtensions.forEach(({ extensionModule, manifest, manifestPath }) => { let instance = this.getById(manifestPath); if (!instance) { - const LensExtension = extensionModule.default; - instance = new LensExtension({ ...manifest }, manifest); - this.extensions.set(manifestPath, instance); // fixme: mobx error + const LensExtensionClass = extensionModule.default; + instance = new LensExtensionClass({ ...manifest }, manifest); instance.enable(getLensRuntimeEnv()); + this.extensions.set(manifestPath, instance); // save } }) }, { @@ -138,22 +139,23 @@ export class ExtensionStore extends BaseStore { } }) currentExtensions.forEach(model => { - const manifest = this.installed.get(model.manifestPath); + const extensionId = model.id || model.manifestPath; + const manifest = this.installed.get(extensionId); if (!manifest) { console.error(`[EXTENSION-STORE]: can't load extension manifest at ${model.manifestPath}`, { model }) return; } - const extension = this.getById(model.id) - if (!extension) { + const extensionInstance = this.getById(extensionId) + if (!extensionInstance) { try { const { manifest: manifestJson, extensionModule } = manifest; - const LensExtension = extensionModule.default; - this.extensions.set(model.id, new LensExtension(model, manifestJson)); + const LensExtensionClass = extensionModule.default; + this.extensions.set(model.id, new LensExtensionClass(model, manifestJson)); } catch (err) { console.error(`[EXTENSION-STORE]: init extension failed: ${err}`, { model, manifest }) } } else { - extension.importModel(model); + extensionInstance.importModel(model); } }) } diff --git a/src/extensions/extension.ts b/src/extensions/extension.ts index 3300c96c60..25ef66b162 100644 --- a/src/extensions/extension.ts +++ b/src/extensions/extension.ts @@ -5,7 +5,7 @@ import { action, observable } from "mobx"; import extensionManifest from "./example-extension/package.json" import logger from "../main/logger"; -export type ExtensionId = string; // id or path to "%lens-extension/manifest.json" +export type ExtensionId = string; // instance-id or abs path to "%lens-extension/manifest.json" export type ExtensionVersion = string | number; export type ExtensionManifest = typeof extensionManifest & ExtensionModel; @@ -30,7 +30,6 @@ export class LensExtension implements ExtensionModel { try { this.manifest = manifest || await readJsonSync(manifestPath, { throws: true }) this.manifestPath = manifestPath; - this.isEnabled = enabled; Object.assign(this, model); } catch (err) { logger.error(`[EXTENSION]: cannot read manifest at ${manifestPath}`, { ...model, err: String(err) }) @@ -41,13 +40,13 @@ export class LensExtension implements ExtensionModel { async enable(runtime: LensRuntimeRendererEnv) { this.isEnabled = true; this.runtime = runtime; - logger.info(`[EXTENSION]: enable ${this.name}@${this.version}`, this.getMeta()); + console.log(`[EXTENSION]: enable ${this.name}@${this.version}`, this.getMeta()); } async disable() { this.isEnabled = false; this.runtime = {}; - logger.info(`[EXTENSION]: disable ${this.name}@${this.version}`, this.getMeta()); + console.log(`[EXTENSION]: disable ${this.name}@${this.version}`, this.getMeta()); } // todo @@ -70,7 +69,7 @@ export class LensExtension implements ExtensionModel { manifest: this.manifest, manifestPath: this.manifestPath, enabled: this.isEnabled, - runtime: Object.keys(this.runtime), + runtime: this.runtime, } } diff --git a/src/renderer/lens-app.tsx b/src/renderer/lens-app.tsx index 1034c7be99..7c1f228fd3 100644 --- a/src/renderer/lens-app.tsx +++ b/src/renderer/lens-app.tsx @@ -17,7 +17,7 @@ import { getLensRuntime } from "../extensions/lens-runtime"; @observer export class LensApp extends React.Component { componentDidMount() { - extensionStore.enableAutoInitOnLoad(getLensRuntime); + extensionStore.autoEnableOnLoad(getLensRuntime); } render() {