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

Load extensions also from local folder

Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com>
This commit is contained in:
Lauri Nevala 2020-10-26 16:33:18 +02:00
parent 4e8bdace79
commit 46c3738213

View File

@ -1,5 +1,6 @@
import type { ExtensionManifest } from "./lens-extension" import type { ExtensionManifest } from "./lens-extension"
import path from "path" import path from "path"
import os from "os"
import fs from "fs-extra" import fs from "fs-extra"
import logger from "../main/logger" import logger from "../main/logger"
import { extensionPackagesRoot, InstalledExtension } from "./extension-loader" import { extensionPackagesRoot, InstalledExtension } from "./extension-loader"
@ -24,10 +25,14 @@ export class ExtensionManager {
return extensionPackagesRoot() return extensionPackagesRoot()
} }
get folderPath(): string { get inTreeFolderPath(): string {
return path.resolve(__static, "../extensions"); return path.resolve(__static, "../extensions");
} }
get localFolderPath(): string {
return path.join(os.homedir(), ".k8slens", "extensions");
}
get npmPath() { get npmPath() {
return __non_webpack_require__.resolve('npm/bin/npm-cli') return __non_webpack_require__.resolve('npm/bin/npm-cli')
} }
@ -35,7 +40,7 @@ export class ExtensionManager {
async load() { async load() {
logger.info("[EXTENSION-MANAGER] loading extensions from " + this.extensionPackagesRoot) logger.info("[EXTENSION-MANAGER] loading extensions from " + this.extensionPackagesRoot)
await fs.ensureDir(path.join(this.extensionPackagesRoot, "node_modules")) await fs.ensureDir(path.join(this.extensionPackagesRoot, "node_modules"))
await fs.ensureDir(this.localFolderPath)
return await this.loadExtensions(); return await this.loadExtensions();
} }
@ -74,31 +79,36 @@ export class ExtensionManager {
} }
async loadExtensions() { async loadExtensions() {
const extensions = await this.loadFromFolder(this.folderPath); const extensions = await this.loadFromFolder([this.inTreeFolderPath, this.localFolderPath])
return new Map(extensions.map(ext => [ext.id, ext])); return new Map(extensions.map(ext => [ext.id, ext]));
} }
async loadFromFolder(folderPath: string): Promise<InstalledExtension[]> { async loadFromFolder(folderPaths: string[]): Promise<InstalledExtension[]> {
const paths = await fs.readdir(folderPath); let allExtensions: InstalledExtension[] = []
const extensions: InstalledExtension[] = []
const bundledExtensions = getBundledExtensions() const bundledExtensions = getBundledExtensions()
for (const fileName of paths) { for (const folderPath of folderPaths) {
if (!bundledExtensions.includes(fileName)) { const extensions: InstalledExtension[] = []
continue const paths = await fs.readdir(folderPath);
} for (const fileName of paths) {
const absPath = path.resolve(folderPath, fileName); if (!bundledExtensions.includes(fileName)) {
const manifestPath = path.resolve(absPath, "package.json"); continue
await fs.access(manifestPath, fs.constants.F_OK) }
const ext = await this.getExtensionByManifest(manifestPath).catch(() => null) const absPath = path.resolve(folderPath, fileName);
if (ext) { const manifestPath = path.resolve(absPath, "package.json");
extensions.push(ext) await fs.access(manifestPath, fs.constants.F_OK)
const ext = await this.getExtensionByManifest(manifestPath).catch(() => null)
if (ext) {
extensions.push(ext)
}
} }
logger.debug(`[EXTENSION-MANAGER]: ${extensions.length} extensions loaded`, { folderPath, extensions });
allExtensions = allExtensions.concat(extensions)
} }
await fs.writeFile(path.join(this.extensionPackagesRoot, "package.json"), JSON.stringify(this.packagesJson), {mode: 0o600}) await fs.writeFile(path.join(this.extensionPackagesRoot, "package.json"), JSON.stringify(this.packagesJson), {mode: 0o600})
await this.installPackages() await this.installPackages()
logger.debug(`[EXTENSION-MANAGER]: ${extensions.length} extensions loaded`, { folderPath, extensions }); return allExtensions;
return extensions;
} }
} }