Track extension provisions and check bundled for routing (#3187)

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton authored and GitHub committed 2021-06-25 13:28:07 -04:00
1 parent 9790b71f8c
commit dbfdd450a8
7 files changed
+62 -31

No files matched your search

+4 -4
View File
@@ -357,8 +357,8 @@ export class ExtensionDiscovery extends Singleton {
protected async getByManifest(manifestPath: string, { isBundled = false } = {}): Promise<InstalledExtension | null> {
try {
const manifest = await fse.readJson(manifestPath) as LensExtensionManifest;
const installedManifestPath = this.getInstalledManifestPath(manifest.name);
const isEnabled = isBundled || ExtensionsStore.getInstance().isEnabled(installedManifestPath);
const id = this.getInstalledManifestPath(manifest.name);
const isEnabled = ExtensionsStore.getInstance().isEnabled({ id, isBundled });
const extensionDir = path.dirname(manifestPath);
const npmPackage = path.join(extensionDir, `${manifest.name}-${manifest.version}.tgz`);
const absolutePath = (isProduction && await fse.pathExists(npmPackage)) ? npmPackage : extensionDir;
@@ -369,9 +369,9 @@ export class ExtensionDiscovery extends Singleton {
}
return {
id: installedManifestPath,
id,
absolutePath,
manifestPath: installedManifestPath,
manifestPath: id,
manifest,
isBundled,
isEnabled,
+25 -2
View File
@@ -48,6 +48,13 @@ export class ExtensionLoader extends Singleton {
protected extensions = observable.map<LensExtensionId, InstalledExtension>();
protected instances = observable.map<LensExtensionId, LensExtension>();
/**
* This is the set of extensions that don't come with either
* - Main.LensExtension when running in the main process
* - Renderer.LensExtension when running in the renderer process
*/
protected nonInstancesByName = observable.set<string>();
/**
* This is updated by the `observe` in the constructor. DO NOT write directly to it
*/
@@ -101,7 +108,20 @@ export class ExtensionLoader extends Singleton {
return extensions;
}
getInstanceByName(name: string): LensExtension | undefined {
/**
* Get the extension instance by its manifest name
* @param name The name of the extension
* @returns one of the following:
* - the instance of `Main.LensExtension` on the main process if created
* - the instance of `Renderer.LensExtension` on the renderer process if created
* - `null` if no class definition is provided for the current process
* - `undefined` if the name is not known about
*/
getInstanceByName(name: string): LensExtension | null | undefined {
if (this.nonInstancesByName.has(name)) {
return null;
}
return this.instancesByName.get(name);
}
@@ -145,6 +165,7 @@ export class ExtensionLoader extends Singleton {
this.extensions.set(extension.id, extension);
}
@action
removeInstance(lensExtensionId: LensExtensionId) {
logger.info(`${logModule} deleting extension instance ${lensExtensionId}`);
const instance = this.instances.get(lensExtensionId);
@@ -157,6 +178,7 @@ export class ExtensionLoader extends Singleton {
instance.disable();
this.events.emit("remove", instance);
this.instances.delete(lensExtensionId);
this.nonInstancesByName.delete(instance.name);
} catch (error) {
logger.error(`${logModule}: deactivation extension error`, { lensExtensionId, error });
}
@@ -302,13 +324,14 @@ export class ExtensionLoader extends Singleton {
protected autoInitExtensions(register: (ext: LensExtension) => Promise<Disposer[]>) {
return reaction(() => this.toJSON(), installedExtensions => {
for (const [extId, extension] of installedExtensions) {
const alreadyInit = this.instances.has(extId);
const alreadyInit = this.instances.has(extId) || this.nonInstancesByName.has(extension.manifest.name);
if (extension.isCompatible && extension.isEnabled && !alreadyInit) {
try {
const LensExtensionClass = this.requireExtension(extension);
if (!LensExtensionClass) {
this.nonInstancesByName.add(extension.manifest.name);
continue;
}
+2 -4
View File
@@ -51,12 +51,10 @@ export class ExtensionsStore extends BaseStore<LensExtensionsStoreModel> {
protected state = observable.map<LensExtensionId, LensExtensionState>();
isEnabled(extId: LensExtensionId): boolean {
const state = this.state.get(extId);
isEnabled({ id, isBundled }: { id: string, isBundled: boolean }): boolean {
// By default false, so that copied extensions are disabled by default.
// If user installs the extension from the UI, the Extensions component will specifically enable it.
return Boolean(state?.enabled);
return isBundled || Boolean(this.state.get(id)?.enabled);
}
@action