From 672ddc7b8d080dc029d050ff9b3489c226735f3f Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 4 Apr 2023 10:36:04 -0400 Subject: [PATCH] chore: Convert show-details telemetry to instantiationDecoratorToken - Fix bug about throwing error on some calls to showDetails Signed-off-by: Sebastian Malton --- ...y-decorator-for-show-details.injectable.ts | 40 ++++++++++++ .../telemetry-decorator.injectable.ts | 65 ++----------------- ...try-white-list-for-functions.injectable.ts | 20 +----- 3 files changed, 47 insertions(+), 78 deletions(-) create mode 100644 packages/core/src/features/telemetry/renderer/telemetry-decorator-for-show-details.injectable.ts diff --git a/packages/core/src/features/telemetry/renderer/telemetry-decorator-for-show-details.injectable.ts b/packages/core/src/features/telemetry/renderer/telemetry-decorator-for-show-details.injectable.ts new file mode 100644 index 0000000000..2a48b2d0b1 --- /dev/null +++ b/packages/core/src/features/telemetry/renderer/telemetry-decorator-for-show-details.injectable.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable, createInstantiationTargetDecorator, instantiationDecoratorToken } from "@ogre-tools/injectable"; +import { parseKubeApi } from "../../../common/k8s-api/kube-api-parse"; +import showDetailsInjectable from "../../../renderer/components/kube-detail-params/show-details.injectable"; +import emitTelemetryInjectable from "./emit-telemetry.injectable"; + +const telemetryDecoratorForShowDetailsInjectable = getInjectable({ + id: "telemetry-decorator-for-show-details", + instantiate: (diForDecorator) => createInstantiationTargetDecorator({ + target: showDetailsInjectable, + decorate: (instantiate) => (di) => { + const emitTelemetry = diForDecorator.inject(emitTelemetryInjectable); + const showDetails = instantiate(di); + + return (...args) => { + emitTelemetry({ + action: showDetailsInjectable.id, + params: { + kind: (() => { + try { + return parseKubeApi(args[0] || "").resource; + } catch { + return ""; + } + })(), + }, + }); + + return showDetails(...args); + }; + }, + }), + decorable: false, + injectionToken: instantiationDecoratorToken, +}); + +export default telemetryDecoratorForShowDetailsInjectable; diff --git a/packages/core/src/features/telemetry/renderer/telemetry-decorator.injectable.ts b/packages/core/src/features/telemetry/renderer/telemetry-decorator.injectable.ts index 757777fd1c..5c5a423803 100644 --- a/packages/core/src/features/telemetry/renderer/telemetry-decorator.injectable.ts +++ b/packages/core/src/features/telemetry/renderer/telemetry-decorator.injectable.ts @@ -5,13 +5,11 @@ import { injectionDecoratorToken, getInjectable } from "@ogre-tools/injectable"; import assert from "assert"; import emitTelemetryInjectable from "./emit-telemetry.injectable"; -import type { WhiteListItem } from "./telemetry-white-list-for-functions.injectable"; import telemetryWhiteListForFunctionsInjectable from "./telemetry-white-list-for-functions.injectable"; -import logErrorInjectable from "../../../common/log-error.injectable"; -import { isFunction, isString } from "@k8slens/utilities"; +import { isFunction } from "@k8slens/utilities"; -const telemetryDecoratorInjectable = getInjectable({ - id: "telemetry-decorator", +const basicTelemetryDecoratorInjectable = getInjectable({ + id: "basic-telemetry-decorator", instantiate: (diForDecorator) => ({ decorate: (instantiateToBeDecorated) => @@ -25,31 +23,11 @@ const telemetryDecoratorInjectable = getInjectable({ assert(currentContext); const emitTelemetry = diForDecorator.inject(emitTelemetryInjectable); - const logError = diForDecorator.inject(logErrorInjectable); const whiteList = diForDecorator.inject(telemetryWhiteListForFunctionsInjectable); - const { isWhiteListed, getParams } = findWhiteListEntry(whiteList, currentContext.injectable.id); - - if (isWhiteListed) { - let params; - - try { - params = getParams(...args); - } catch (e) { - params = { - error: - "Tried to produce params for telemetry, but getParams() threw an error", - }; - - logError( - `Tried to produce params for telemetry of "${currentContext.injectable.id}", but getParams() threw an error`, - e, - ); - } - + if (whiteList.has(currentContext.injectable.id)) { emitTelemetry({ action: currentContext.injectable.id, - params, }); } @@ -65,37 +43,4 @@ const telemetryDecoratorInjectable = getInjectable({ injectionToken: injectionDecoratorToken, }); -type WhiteListEntry = { - isWhiteListed: true; - getParams: (...args: unknown[]) => Record | undefined; -} | { - isWhiteListed: false; - getParams?: undefined; -}; - - -const findWhiteListEntry = (whiteList: WhiteListItem[], id: string): WhiteListEntry => { - for (const entry of whiteList) { - if (isString(entry)) { - if (entry === id) { - return { - isWhiteListed: true, - getParams: () => undefined, - }; - } - } else { - if (entry.id === id) { - return { - isWhiteListed: true, - getParams: entry.getParams, - }; - } - } - } - - return { - isWhiteListed: false, - }; -}; - -export default telemetryDecoratorInjectable; +export default basicTelemetryDecoratorInjectable; diff --git a/packages/core/src/features/telemetry/renderer/telemetry-white-list-for-functions.injectable.ts b/packages/core/src/features/telemetry/renderer/telemetry-white-list-for-functions.injectable.ts index b4d6634d94..19fe990102 100644 --- a/packages/core/src/features/telemetry/renderer/telemetry-white-list-for-functions.injectable.ts +++ b/packages/core/src/features/telemetry/renderer/telemetry-white-list-for-functions.injectable.ts @@ -3,8 +3,6 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import type { AppEvent } from "../../../common/app-event-bus/event-bus"; -import { parseKubeApi } from "../../../common/k8s-api/kube-api-parse"; const navigateTo = [ "navigate-to-preference-tab-id", @@ -92,32 +90,18 @@ const extensions = [ const externalActions = ["open-link-in-browser"]; -const uiInteraction = [{ - id: "show-details", - getParams: (selfLink: string) => { - return { - kind: selfLink ? parseKubeApi(selfLink).resource : "", - }; - }, -}]; - const terminal = ["create-terminal-tab"]; -export type WhiteListItem = - | string - | { id: string; getParams: (...args: any[]) => AppEvent["params"] }; - const telemetryWhiteListForFunctionsInjectable = getInjectable({ id: "telemetry-white-list-for-functions", - instantiate: (): WhiteListItem[] => [ + instantiate: () => new Set([ ...navigateTo, ...helmInjectableIds, ...kubeConfigActions, ...extensions, ...externalActions, - ...uiInteraction, ...terminal, - ], + ]), decorable: false, });