mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Initial telemetry extension (#1067)
* initial telemetry extension Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * Fix preferences saving and default value Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com> Co-authored-by: Lauri Nevala <lauri.nevala@gmail.com>
This commit is contained in:
1 parent
4f98a01a8b
commit
45abc740e9
28 files changed
+3837
-48
No files matched your search
@@ -0,0 +1,27 @@
|
||||
import { observable } from "mobx"
|
||||
import React from "react"
|
||||
|
||||
export interface AppPreferenceComponents {
|
||||
Hint: React.ComponentType<any>;
|
||||
Input: React.ComponentType<any>;
|
||||
}
|
||||
|
||||
export interface AppPreferenceRegistration {
|
||||
title: string;
|
||||
components: AppPreferenceComponents;
|
||||
}
|
||||
|
||||
export class AppPreferenceRegistry {
|
||||
preferences = observable.array<AppPreferenceRegistration>([], { deep: false });
|
||||
|
||||
add(preference: AppPreferenceRegistration) {
|
||||
this.preferences.push(preference)
|
||||
return () => {
|
||||
this.preferences.replace(
|
||||
this.preferences.filter(c => c !== preference)
|
||||
)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export const appPreferenceRegistry = new AppPreferenceRegistry()
|
||||
@@ -1,7 +1,7 @@
|
||||
import React from "react";
|
||||
import { cssNames } from "../renderer/utils";
|
||||
import { TabLayout } from "../renderer/components/layout/tab-layout";
|
||||
import { PageRegistration } from "./page-store"
|
||||
import { PageRegistration } from "./page-registry"
|
||||
|
||||
export class DynamicPage extends React.Component<{ page: PageRegistration }> {
|
||||
render() {
|
||||
|
||||
@@ -3,3 +3,4 @@ export type { LensExtensionRuntimeEnv } from "./lens-runtime";
|
||||
|
||||
// APIs
|
||||
export * from "./lens-main-extension"
|
||||
export { BaseStore } from "../common/base-store"
|
||||
@@ -6,7 +6,8 @@ import path from "path"
|
||||
import { observable, reaction, toJS, } from "mobx"
|
||||
import logger from "../main/logger"
|
||||
import { app, remote, ipcRenderer } from "electron"
|
||||
import { pageStore } from "./page-store";
|
||||
import { pageRegistry } from "./page-registry";
|
||||
import { appPreferenceRegistry } from "./app-preference-registry"
|
||||
|
||||
export interface InstalledExtension extends ExtensionModel {
|
||||
manifestPath: string;
|
||||
@@ -37,14 +38,15 @@ export class ExtensionLoader {
|
||||
loadOnClusterRenderer(getLensRuntimeEnv: () => LensExtensionRuntimeEnv) {
|
||||
logger.info('[EXTENSIONS-LOADER]: load on cluster renderer')
|
||||
this.autoloadExtensions(getLensRuntimeEnv, (instance: LensRendererExtension) => {
|
||||
instance.registerPages(pageStore)
|
||||
instance.registerPages(pageRegistry)
|
||||
})
|
||||
}
|
||||
|
||||
loadOnMainRenderer(getLensRuntimeEnv: () => LensExtensionRuntimeEnv) {
|
||||
logger.info('[EXTENSIONS-LOADER]: load on main renderer')
|
||||
this.autoloadExtensions(getLensRuntimeEnv, (instance: LensRendererExtension) => {
|
||||
instance.registerPages(pageStore)
|
||||
instance.registerPages(pageRegistry)
|
||||
instance.registerAppPreferences(appPreferenceRegistry)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -82,7 +84,7 @@ export class ExtensionLoader {
|
||||
try {
|
||||
if (ipcRenderer && extension.manifest.renderer) {
|
||||
extEntrypoint = path.resolve(path.join(path.dirname(extension.manifestPath), extension.manifest.renderer))
|
||||
} else if (extension.manifest.main) {
|
||||
} else if (!ipcRenderer && extension.manifest.main) {
|
||||
extEntrypoint = path.resolve(path.join(path.dirname(extension.manifestPath), extension.manifest.main))
|
||||
}
|
||||
if (extEntrypoint !== "") {
|
||||
|
||||
@@ -4,6 +4,7 @@ import fs from "fs-extra"
|
||||
import logger from "../main/logger"
|
||||
import { extensionPackagesRoot, InstalledExtension } from "./extension-loader"
|
||||
import * as child_process from 'child_process';
|
||||
import { getBundledExtensions } from "../common/utils/app-version"
|
||||
|
||||
type Dependencies = {
|
||||
[name: string]: string;
|
||||
@@ -80,7 +81,11 @@ export class ExtensionManager {
|
||||
async loadFromFolder(folderPath: string): Promise<InstalledExtension[]> {
|
||||
const paths = await fs.readdir(folderPath);
|
||||
const extensions: InstalledExtension[] = []
|
||||
const bundledExtensions = getBundledExtensions()
|
||||
for (const fileName of paths) {
|
||||
if (!bundledExtensions.includes(fileName)) {
|
||||
continue
|
||||
}
|
||||
const absPath = path.resolve(folderPath, fileName);
|
||||
const manifestPath = path.resolve(absPath, "package.json");
|
||||
await fs.access(manifestPath, fs.constants.F_OK)
|
||||
|
||||
@@ -4,10 +4,12 @@ export type { LensExtensionRuntimeEnv } from "./lens-renderer-runtime"
|
||||
// APIs
|
||||
export * from "./lens-extension"
|
||||
export * from "./lens-renderer-extension"
|
||||
export { DynamicPageType, PageStore } from "./page-store"
|
||||
export { DynamicPageType, PageRegistry } from "./page-registry"
|
||||
export { AppPreferenceRegistry } from "./app-preference-registry"
|
||||
|
||||
// TODO: add more common re-usable UI components + refactor interfaces (Props -> ComponentProps)
|
||||
export * from "../renderer/components/icon"
|
||||
export * from "../renderer/components/checkbox"
|
||||
export * from "../renderer/components/tooltip"
|
||||
export * from "../renderer/components/button"
|
||||
export * from "../renderer/components/tabs"
|
||||
|
||||
@@ -59,7 +59,7 @@ export class LensExtension implements ExtensionModel {
|
||||
async enable(runtime: LensExtensionRuntimeEnv) {
|
||||
this.isEnabled = true;
|
||||
this.runtime = runtime;
|
||||
logger.info(`[EXTENSION]: enabled ${this.name}@${this.version}`, this.getMeta());
|
||||
logger.info(`[EXTENSION]: enabled ${this.name}@${this.version}`);
|
||||
this.onActivate();
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ export class LensExtension implements ExtensionModel {
|
||||
this.runtime = null;
|
||||
this.disposers.forEach(cleanUp => cleanUp());
|
||||
this.disposers.length = 0;
|
||||
logger.info(`[EXTENSION]: disabled ${this.name}@${this.version}`, this.getMeta());
|
||||
logger.info(`[EXTENSION]: disabled ${this.name}@${this.version}`);
|
||||
}
|
||||
|
||||
// todo: add more hooks
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
import type { PageStore } from "./extension-renderer-api"
|
||||
import type { PageRegistration } from "./page-store"
|
||||
import { LensExtension } from "./lens-extension"
|
||||
import type { PageRegistry } from "./extension-renderer-api"
|
||||
import { AppPreferenceRegistry } from "./app-preference-registry";
|
||||
|
||||
export class LensRendererExtension extends LensExtension {
|
||||
|
||||
registerPages(pageStore: PageStore) {
|
||||
registerPages(pageStore: PageRegistry) {
|
||||
return
|
||||
}
|
||||
|
||||
// Runtime helpers
|
||||
protected registerPage(pageStore: PageStore, params: PageRegistration) {
|
||||
const dispose = pageStore.register(params);
|
||||
this.disposers.push(dispose)
|
||||
registerAppPreferences(appPreferenceStore: AppPreferenceRegistry) {
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,7 @@ export interface PageComponents {
|
||||
MenuIcon: React.ComponentType<IconProps>;
|
||||
}
|
||||
|
||||
export class PageStore {
|
||||
export class PageRegistry {
|
||||
protected pages = observable.array<PageRegistration>([], { deep: false });
|
||||
|
||||
@computed get globalPages() {
|
||||
@@ -39,7 +39,7 @@ export class PageStore {
|
||||
}
|
||||
|
||||
// todo: verify paths to avoid collision with existing pages
|
||||
register(params: PageRegistration) {
|
||||
add(params: PageRegistration) {
|
||||
this.pages.push(params);
|
||||
return () => {
|
||||
this.pages.replace(
|
||||
@@ -49,4 +49,4 @@ export class PageStore {
|
||||
}
|
||||
}
|
||||
|
||||
export const pageStore = new PageStore();
|
||||
export const pageRegistry = new PageRegistry();
|
||||
Reference in new issue
Block a user