diff --git a/package.json b/package.json index 82442c1829..06775dfce8 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ }, "scripts": { "dev": "concurrently -k \"yarn dev-run -C\" \"yarn dev:main\" \"yarn dev:renderer\"", - "dev-run": "cross-env DEBUG=true nodemon --watch static/build/main.js --exec \"electron --inspect .\"", - "dev:main": "cross-env DEBUG=true yarn compile:main --watch", - "dev:renderer": "cross-env DEBUG=true yarn compile:renderer --watch", + "dev-run": "nodemon --watch static/build/main.js --exec \"electron --inspect .\"", + "dev:main": "yarn compile:main --watch", + "dev:renderer": "yarn compile:renderer --watch", "compile": "env NODE_ENV=production concurrently yarn:compile:*", "compile:main": "webpack --config webpack.main.ts", "compile:renderer": "webpack --config webpack.renderer.ts", diff --git a/src/extensions/extension-store.ts b/src/extensions/extension-store.ts new file mode 100644 index 0000000000..e12abacb8f --- /dev/null +++ b/src/extensions/extension-store.ts @@ -0,0 +1,77 @@ +import { action, observable, toJS } from "mobx"; +import { BaseStore } from "../common/base-store"; +import { LensExtension } from "./extension"; + +export type ExtensionId = string; +export type ExtensionVersion = string | number; + +export interface ExtensionStoreModel { + version: ExtensionVersion; + extensions: Record +} + +export interface ExtensionModel { + id: ExtensionId; + version: ExtensionVersion; + name: string; + description?: string; + enabled?: boolean; +} + +export class ExtensionStore extends BaseStore { + private constructor() { + super({ + configName: "lens-extension-store", + }); + } + + @observable version: ExtensionVersion = "0.0.0"; + @observable extensions = observable.map(); + @observable removed = observable.map(); + + getById(id: ExtensionId): LensExtension { + return this.extensions.get(id); + } + + async removeById(id: ExtensionId) { + const extension = this.getById(id); + if (extension) { + this.extensions.delete(id); + return extension.uninstall(); + } + } + + @action + protected fromStore({ extensions, version }: ExtensionStoreModel) { + if (version) { + this.version = version; + } + if (extensions) { + const currentExtensions = new Map(Object.entries(extensions)); + this.extensions.forEach(extension => { + if (!currentExtensions.has(extension.id)) { + this.removed.set(extension.id, extension); + } + }) + currentExtensions.forEach(model => { + const extension = this.getById(model.id) + if (!extension) { + this.extensions.set(model.id, new LensExtension(model)); + } else { + extension.importModel(model); + } + }) + } + } + + toJSON(): ExtensionStoreModel { + return toJS({ + version: this.version, + extensions: this.extensions.toJSON(), + }, { + recurseEverything: true, + }) + } +} + +export const extensionStore = ExtensionStore.getInstance() diff --git a/src/extensions/extension.ts b/src/extensions/extension.ts new file mode 100644 index 0000000000..1e1eb48333 --- /dev/null +++ b/src/extensions/extension.ts @@ -0,0 +1,38 @@ +import { observable } from "mobx"; +import { ExtensionModel } from "./extension-store"; + +export type ExtensionId = string; +export type ExtensionVersion = string | number; + +export class LensExtension implements ExtensionModel { + public id: ExtensionId; + public version: string | number; + + @observable name = ""; + @observable description = ""; + @observable isEnabled = false; + + constructor(model: ExtensionModel) { + this.importModel(model); + } + + importModel(model: ExtensionModel) { + Object.assign(this, model); + } + + async install() { + // todo + } + + async uninstall() { + // todo + } + + async enable() { + // todo + } + + async disable() { + // todo + } +} diff --git a/src/extensions/index.ts b/src/extensions/index.ts new file mode 100644 index 0000000000..e69de29bb2