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

extensions-api -- fixes

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2020-09-06 22:14:42 +03:00
parent eca3cadd80
commit 95db1b3b11
3 changed files with 21 additions and 20 deletions

View File

@ -1,7 +1,7 @@
import type { LensRuntimeRendererEnv } from "./lens-runtime"; import type { LensRuntimeRendererEnv } from "./lens-runtime";
import path from "path"; import path from "path";
import fs from "fs-extra"; 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 { BaseStore } from "../common/base-store";
import { ExtensionId, ExtensionManifest, ExtensionVersion, LensExtension } from "./extension"; import { ExtensionId, ExtensionManifest, ExtensionVersion, LensExtension } from "./extension";
import { isDevelopment } from "../common/vars"; import { isDevelopment } from "../common/vars";
@ -35,13 +35,14 @@ export class ExtensionStore extends BaseStore<ExtensionStoreModel> {
private constructor() { private constructor() {
super({ super({
configName: "lens-extension-store", configName: "lens-extension-store",
syncEnabled: false,
}); });
} }
@observable version: ExtensionVersion = "0.0.0"; @observable version: ExtensionVersion = "0.0.0";
@observable extensions = observable.map<ExtensionId, LensExtension>(); @observable extensions = observable.map<ExtensionId, LensExtension>();
@observable removed = observable.map<ExtensionId, LensExtension>(); @observable removed = observable.map<ExtensionId, LensExtension>();
@observable.shallow installed = observable.map<string, InstalledExtension>([]); @observable installed = observable.map<ExtensionId, InstalledExtension>([], { deep: false });
get folderPath(): string { get folderPath(): string {
if (isDevelopment) { if (isDevelopment) {
@ -55,16 +56,16 @@ export class ExtensionStore extends BaseStore<ExtensionStoreModel> {
return super.load(); return super.load();
} }
enableAutoInitOnLoad(getLensRuntimeEnv: () => LensRuntimeRendererEnv, { delay = 0 } = {}) { autoEnableOnLoad(getLensRuntimeEnv: () => LensRuntimeRendererEnv, { delay = 0 } = {}) {
logger.info('[EXTENSIONS-STORE]: enabled: auto-init loaded extensions'); logger.info('[EXTENSIONS-STORE]: enabled auto-activation all installed extensions');
return reaction(() => Array.from(this.installed.values()), installedExtensions => { return reaction(() => this.installed.toJS(), installedExtensions => {
installedExtensions.forEach(({ extensionModule, manifest, manifestPath }) => { installedExtensions.forEach(({ extensionModule, manifest, manifestPath }) => {
let instance = this.getById(manifestPath); let instance = this.getById(manifestPath);
if (!instance) { if (!instance) {
const LensExtension = extensionModule.default; const LensExtensionClass = extensionModule.default;
instance = new LensExtension({ ...manifest }, manifest); instance = new LensExtensionClass({ ...manifest }, manifest);
this.extensions.set(manifestPath, instance); // fixme: mobx error
instance.enable(getLensRuntimeEnv()); instance.enable(getLensRuntimeEnv());
this.extensions.set(manifestPath, instance); // save
} }
}) })
}, { }, {
@ -138,22 +139,23 @@ export class ExtensionStore extends BaseStore<ExtensionStoreModel> {
} }
}) })
currentExtensions.forEach(model => { currentExtensions.forEach(model => {
const manifest = this.installed.get(model.manifestPath); const extensionId = model.id || model.manifestPath;
const manifest = this.installed.get(extensionId);
if (!manifest) { if (!manifest) {
console.error(`[EXTENSION-STORE]: can't load extension manifest at ${model.manifestPath}`, { model }) console.error(`[EXTENSION-STORE]: can't load extension manifest at ${model.manifestPath}`, { model })
return; return;
} }
const extension = this.getById(model.id) const extensionInstance = this.getById(extensionId)
if (!extension) { if (!extensionInstance) {
try { try {
const { manifest: manifestJson, extensionModule } = manifest; const { manifest: manifestJson, extensionModule } = manifest;
const LensExtension = extensionModule.default; const LensExtensionClass = extensionModule.default;
this.extensions.set(model.id, new LensExtension(model, manifestJson)); this.extensions.set(model.id, new LensExtensionClass(model, manifestJson));
} catch (err) { } catch (err) {
console.error(`[EXTENSION-STORE]: init extension failed: ${err}`, { model, manifest }) console.error(`[EXTENSION-STORE]: init extension failed: ${err}`, { model, manifest })
} }
} else { } else {
extension.importModel(model); extensionInstance.importModel(model);
} }
}) })
} }

View File

@ -5,7 +5,7 @@ import { action, observable } from "mobx";
import extensionManifest from "./example-extension/package.json" import extensionManifest from "./example-extension/package.json"
import logger from "../main/logger"; 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 ExtensionVersion = string | number;
export type ExtensionManifest = typeof extensionManifest & ExtensionModel; export type ExtensionManifest = typeof extensionManifest & ExtensionModel;
@ -30,7 +30,6 @@ export class LensExtension implements ExtensionModel {
try { try {
this.manifest = manifest || await readJsonSync(manifestPath, { throws: true }) this.manifest = manifest || await readJsonSync(manifestPath, { throws: true })
this.manifestPath = manifestPath; this.manifestPath = manifestPath;
this.isEnabled = enabled;
Object.assign(this, model); Object.assign(this, model);
} catch (err) { } catch (err) {
logger.error(`[EXTENSION]: cannot read manifest at ${manifestPath}`, { ...model, err: String(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) { async enable(runtime: LensRuntimeRendererEnv) {
this.isEnabled = true; this.isEnabled = true;
this.runtime = runtime; 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() { async disable() {
this.isEnabled = false; this.isEnabled = false;
this.runtime = {}; this.runtime = {};
logger.info(`[EXTENSION]: disable ${this.name}@${this.version}`, this.getMeta()); console.log(`[EXTENSION]: disable ${this.name}@${this.version}`, this.getMeta());
} }
// todo // todo
@ -70,7 +69,7 @@ export class LensExtension implements ExtensionModel {
manifest: this.manifest, manifest: this.manifest,
manifestPath: this.manifestPath, manifestPath: this.manifestPath,
enabled: this.isEnabled, enabled: this.isEnabled,
runtime: Object.keys(this.runtime), runtime: this.runtime,
} }
} }

View File

@ -17,7 +17,7 @@ import { getLensRuntime } from "../extensions/lens-runtime";
@observer @observer
export class LensApp extends React.Component { export class LensApp extends React.Component {
componentDidMount() { componentDidMount() {
extensionStore.enableAutoInitOnLoad(getLensRuntime); extensionStore.autoEnableOnLoad(getLensRuntime);
} }
render() { render() {