Improve how extension-api is exposed/loaded (#1055)

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
This commit is contained in:
Jari Kolehmainen authored and GitHub committed 2020-10-09 14:12:40 +03:00
1 parent aa864fc199
commit 4f98a01a8b
17 files changed
+3552 -107

No files matched your search

-10
View File
@@ -2,7 +2,6 @@
import path from "path";
import packageInfo from "../../package.json"
import { defineGlobal } from "./utils/defineGlobal";
import { addAlias } from "module-alias";
export const isMac = process.platform === "darwin"
export const isWindows = process.platform === "win32"
@@ -37,15 +36,6 @@ defineGlobal("__static", {
}
})
// Special dynamic module aliases
if (isProduction && process.resourcesPath) {
addAlias("@lens/extensions", path.join(process.resourcesPath, "static", `build/${extensionsLibName}.js`))
addAlias("@lens/ui-extensions", path.join(process.resourcesPath, "static", `build/${extensionsRendererLibName}.js`))
} else {
addAlias("@lens/extensions", path.join(contextDir, "static", `build/${extensionsLibName}.js`))
addAlias("@lens/ui-extensions", path.join(contextDir, "static", `build/${extensionsRendererLibName}.js`))
}
// Apis
export const apiPrefix = "/api" // local router apis
export const apiKubePrefix = "/api-kube" // k8s cluster apis
+12 -24
View File
@@ -18,16 +18,6 @@ export function extensionPackagesRoot() {
return path.join((app || remote.app).getPath("userData"))
}
export function withExtensionPackagesRoot(callback: Function) {
const cwd = process.cwd()
try {
process.chdir(extensionPackagesRoot())
return callback()
} finally {
process.chdir(cwd)
}
}
export class ExtensionLoader {
@observable extensions = observable.map<ExtensionId, InstalledExtension>([], { deep: false });
@observable instances = observable.map<ExtensionId, LensExtension>([], { deep: false })
@@ -89,21 +79,19 @@ export class ExtensionLoader {
protected requireExtension(extension: InstalledExtension) {
let extEntrypoint = ""
return withExtensionPackagesRoot(() => {
try {
if (ipcRenderer && extension.manifest.renderer) {
extEntrypoint = path.resolve(path.join(path.dirname(extension.manifestPath), extension.manifest.renderer))
} else if (extension.manifest.main) {
extEntrypoint = path.resolve(path.join(path.dirname(extension.manifestPath), extension.manifest.main))
}
if (extEntrypoint !== "") {
return __non_webpack_require__(extEntrypoint)
}
} catch (err) {
console.error(`[EXTENSION-LOADER]: can't load extension main at ${extEntrypoint}: ${err}`, { extension });
console.trace(err)
try {
if (ipcRenderer && extension.manifest.renderer) {
extEntrypoint = path.resolve(path.join(path.dirname(extension.manifestPath), extension.manifest.renderer))
} else if (extension.manifest.main) {
extEntrypoint = path.resolve(path.join(path.dirname(extension.manifestPath), extension.manifest.main))
}
})
if (extEntrypoint !== "") {
return __non_webpack_require__(extEntrypoint)
}
} catch (err) {
console.error(`[EXTENSION-LOADER]: can't load extension main at ${extEntrypoint}: ${err}`, { extension });
console.trace(err)
}
}
getById(id: ExtensionId): InstalledExtension {
+2 -3
View File
@@ -1,13 +1,12 @@
// Lens-extensions api developer's kit
export type { LensExtensionRuntimeEnv } from "./lens-renderer-runtime"
export type { PageStore } from "./page-store"
// APIs
export * from "./lens-extension"
export * from "./lens-renderer-extension"
export { DynamicPageType } from "./page-store"
export { DynamicPageType, PageStore } from "./page-store"
// TODO: add more common re-usable UI components + refactor interfaces (Props -> ComponentProps)
export { default as React } from "react"
export * from "../renderer/components/icon"
export * from "../renderer/components/tooltip"
export * from "../renderer/components/button"
+2 -1
View File
@@ -2,7 +2,8 @@ import type { PageStore } from "./extension-renderer-api"
import type { PageRegistration } from "./page-store"
import { LensExtension } from "./lens-extension"
export abstract class LensRendererExtension extends LensExtension {
export class LensRendererExtension extends LensExtension {
registerPages(pageStore: PageStore) {
return
}
+7
View File
@@ -17,10 +17,17 @@ import { clusterStore } from "../common/cluster-store"
import { userStore } from "../common/user-store";
import { workspaceStore } from "../common/workspace-store";
import { tracker } from "../common/tracker";
import * as LensExtensions from "../extensions/extension-api";
import { extensionManager } from "../extensions/extension-manager";
import { extensionLoader } from "../extensions/extension-loader";
import { getLensRuntime } from "../extensions/lens-runtime";
import logger from "./logger"
import * as Mobx from "mobx"
export {
LensExtensions,
Mobx
}
const workingDir = path.join(app.getPath("appData"), appName);
app.setName(appName);
+8
View File
@@ -1,5 +1,7 @@
import "./components/app.scss"
import React from "react";
import * as Mobx from "mobx"
import * as LensExtensions from "../extensions/extension-renderer-api"
import { render, unmountComponentAtNode } from "react-dom";
import { isMac } from "../common/vars";
import { userStore } from "../common/user-store";
@@ -14,6 +16,12 @@ type AppComponent = React.ComponentType & {
init?(): void;
}
export {
React,
Mobx,
LensExtensions
}
export async function bootstrap(App: AppComponent) {
const rootElem = document.getElementById("app")
rootElem.classList.toggle("is-mac", isMac);