From 642406f0039f5ea2402e7fe2830461111d522b64 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 30 Aug 2022 16:31:47 -0400 Subject: [PATCH] Fix type errors after upgrade Signed-off-by: Sebastian Malton --- src/common/base-store.ts | 2 +- ...get-configuration-file-model.injectable.ts | 2 +- src/common/k8s-api/endpoints/metrics.api.ts | 48 ++++++++++--------- src/common/protocol-handler/router.ts | 30 +++++------- src/common/utils/readableStream.ts | 1 + src/common/utils/singleton.ts | 2 +- ...ct-for-extension-api-with-modifications.ts | 2 +- src/extensions/extension-store.ts | 2 +- .../metrics/add-metrics-route.injectable.ts | 3 +- src/main/routes/metrics/metrics-query.ts | 7 --- ...or-general-entity-navigation.injectable.ts | 3 +- src/renderer/navigation/index.ts | 6 --- .../navigation/match-route.injectable.ts | 2 +- src/renderer/utils/storageHelper.ts | 4 +- 14 files changed, 50 insertions(+), 64 deletions(-) delete mode 100644 src/main/routes/metrics/metrics-query.ts diff --git a/src/common/base-store.ts b/src/common/base-store.ts index 1bc2357458..ecaa281864 100644 --- a/src/common/base-store.ts +++ b/src/common/base-store.ts @@ -31,7 +31,7 @@ export interface BaseStoreParams extends ConfOptions { /** * Note: T should only contain base JSON serializable types. */ -export abstract class BaseStore extends Singleton { +export abstract class BaseStore extends Singleton { protected storeConfig?: Config; protected syncDisposers: Disposer[] = []; diff --git a/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts b/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts index a1027c22c6..dc54e96de1 100644 --- a/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts +++ b/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts @@ -8,7 +8,7 @@ import type { BaseStoreParams } from "../base-store"; const getConfigurationFileModelInjectable = getInjectable({ id: "get-configuration-file-model", - instantiate: () => (content: BaseStoreParams) => new Config(content), + instantiate: () => (content: BaseStoreParams) => new Config(content), causesSideEffects: true, }); diff --git a/src/common/k8s-api/endpoints/metrics.api.ts b/src/common/k8s-api/endpoints/metrics.api.ts index 7b0028b061..b5469e8a24 100644 --- a/src/common/k8s-api/endpoints/metrics.api.ts +++ b/src/common/k8s-api/endpoints/metrics.api.ts @@ -7,7 +7,6 @@ import moment from "moment"; import { apiBase } from "../index"; -import type { IMetricsQuery } from "../../../main/routes/metrics/metrics-query"; export interface MetricData { status: string; @@ -55,28 +54,33 @@ export interface IResourceMetrics { networkTransmit: T; } +async function getMetrics(query: string, reqParams?: IMetricsReqParams): Promise; +async function getMetrics(query: string[], reqParams?: IMetricsReqParams): Promise; +async function getMetrics(query: Record>>, reqParams?: IMetricsReqParams): Promise>; + +async function getMetrics(query: string | string[] | Partial>>>, reqParams: IMetricsReqParams = {}): Promise>> { + const { range = 3600, step = 60, namespace } = reqParams; + let { start, end } = reqParams; + + if (!start && !end) { + const timeNow = Date.now() / 1000; + const now = moment.unix(timeNow).startOf("minute").unix(); // round date to minutes + + start = now - range; + end = now; + } + + return apiBase.post("/metrics", { + data: query, + query: { + start, end, step, + "kubernetes_namespace": namespace, + }, + }); +} + export const metricsApi = { - async getMetrics(query: T, reqParams: IMetricsReqParams = {}): Promise { - const { range = 3600, step = 60, namespace } = reqParams; - let { start, end } = reqParams; - - if (!start && !end) { - const timeNow = Date.now() / 1000; - const now = moment.unix(timeNow).startOf("minute").unix(); // round date to minutes - - start = now - range; - end = now; - } - - return apiBase.post("/metrics", { - data: query, - query: { - start, end, step, - "kubernetes_namespace": namespace, - }, - }); - }, - + getMetrics, async getMetricProviders(): Promise { return apiBase.get("/metrics/providers"); }, diff --git a/src/common/protocol-handler/router.ts b/src/common/protocol-handler/router.ts index 1c0ae909eb..3204a5356c 100644 --- a/src/common/protocol-handler/router.ts +++ b/src/common/protocol-handler/router.ts @@ -113,7 +113,17 @@ export abstract class LensProtocolRouter { } // if no exact match pick the one that is the most specific - return matches.sort(([a], [b]) => compareMatches(a, b))[0] ?? null; + return matches.sort(([a], [b]) => { + if (a.path === "/") { + return 1; + } + + if (b.path === "/") { + return -1; + } + + return countBy(b.path)["/"] - countBy(a.path)["/"]; + })[0] ?? null; } /** @@ -265,21 +275,3 @@ export abstract class LensProtocolRouter { this.internalRoutes.delete(urlSchema); } } - -/** - * a comparison function for `array.sort(...)`. Sort order should be most path - * parts to least path parts. - * @param a the left side to compare - * @param b the right side to compare - */ -function compareMatches(a: match, b: match): number { - if (a.path === "/") { - return 1; - } - - if (b.path === "/") { - return -1; - } - - return countBy(b.path)["/"] - countBy(a.path)["/"]; -} diff --git a/src/common/utils/readableStream.ts b/src/common/utils/readableStream.ts index 5fd49ba699..136e18c841 100644 --- a/src/common/utils/readableStream.ts +++ b/src/common/utils/readableStream.ts @@ -4,6 +4,7 @@ */ import { Readable } from "readable-stream"; +import type { ReadableStreamDefaultReadResult } from "stream/web"; import type { TypedArray } from "type-fest"; /** diff --git a/src/common/utils/singleton.ts b/src/common/utils/singleton.ts index d553de52db..d60fdb0490 100644 --- a/src/common/utils/singleton.ts +++ b/src/common/utils/singleton.ts @@ -27,7 +27,7 @@ export class Singleton { * @param args The constructor arguments for the child class * @returns An instance of the child class */ - static createInstance(this: StaticThis, ...args: R): T { + static createInstance(this: StaticThis, ...args: R): T { if (!Singleton.instances.has(this)) { if (Singleton.creating.length > 0) { throw new TypeError(`Cannot create a second singleton (${this.name}) while creating a first (${Singleton.creating})`); diff --git a/src/extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api-with-modifications.ts b/src/extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api-with-modifications.ts index 340a97c941..a5261d2917 100644 --- a/src/extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api-with-modifications.ts +++ b/src/extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api-with-modifications.ts @@ -9,7 +9,7 @@ import type { Injectable } from "@ogre-tools/injectable"; * @deprecated use asLegacyGlobalForExtensionApi instead, and use proper implementations instead of "modifications". */ export const asLegacyGlobalObjectForExtensionApiWithModifications = < - InjectableInstance extends InjectionTokenInstance, + InjectableInstance extends InjectionTokenInstance & object, InjectionTokenInstance, ModificationObject extends object, >( diff --git a/src/extensions/extension-store.ts b/src/extensions/extension-store.ts index 62799f9843..59a7ce86b9 100644 --- a/src/extensions/extension-store.ts +++ b/src/extensions/extension-store.ts @@ -8,7 +8,7 @@ import * as path from "path"; import type { LensExtension } from "./lens-extension"; import assert from "assert"; -export abstract class ExtensionStore extends BaseStore { +export abstract class ExtensionStore extends BaseStore { readonly displayName = "ExtensionStore"; protected extension?: LensExtension; diff --git a/src/main/routes/metrics/add-metrics-route.injectable.ts b/src/main/routes/metrics/add-metrics-route.injectable.ts index b97a08d827..5f97ddf4c3 100644 --- a/src/main/routes/metrics/add-metrics-route.injectable.ts +++ b/src/main/routes/metrics/add-metrics-route.injectable.ts @@ -9,7 +9,6 @@ import type { ClusterPrometheusMetadata } from "../../../common/cluster-types"; import { ClusterMetadataKey } from "../../../common/cluster-types"; import logger from "../../logger"; import type { Cluster } from "../../../common/cluster/cluster"; -import type { IMetricsQuery } from "./metrics-query"; import { clusterRoute } from "../../router/route"; import { isObject } from "lodash"; import { isRequestError } from "../../../common/utils"; @@ -60,7 +59,7 @@ const addMetricsRouteInjectable = getRouteInjectable({ const getMetrics = di.inject(getMetricsInjectable); const loadMetrics = loadMetricsFor(getMetrics); - const queryParams: IMetricsQuery = Object.fromEntries(query.entries()); + const queryParams = Object.fromEntries(query.entries()); const prometheusMetadata: ClusterPrometheusMetadata = {}; try { diff --git a/src/main/routes/metrics/metrics-query.ts b/src/main/routes/metrics/metrics-query.ts deleted file mode 100644 index d6d9532b3b..0000000000 --- a/src/main/routes/metrics/metrics-query.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -export type IMetricsQuery = string | string[] | { - [metricName: string]: string; -}; diff --git a/src/renderer/api/helpers/watch-for-general-entity-navigation.injectable.ts b/src/renderer/api/helpers/watch-for-general-entity-navigation.injectable.ts index 14ae9f9f98..0e73acfcd1 100644 --- a/src/renderer/api/helpers/watch-for-general-entity-navigation.injectable.ts +++ b/src/renderer/api/helpers/watch-for-general-entity-navigation.injectable.ts @@ -4,6 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { reaction, when } from "mobx"; +import type { GeneralEntity } from "../../../common/catalog-entities"; import generalCategoryInjectable from "../../../common/catalog/categories/general.injectable"; import isActiveRouteInjectable from "../../navigation/is-route-active.injectable"; import observableHistoryInjectable from "../../navigation/observable-history.injectable"; @@ -30,7 +31,7 @@ const watchForGeneralEntityNavigationInjectable = getInjectable({ dispose.push(reaction( () => observableHistory.location, () => { - const entities = entityRegistry.getItemsForCategory(generalCategory); + const entities = entityRegistry.getItemsForCategory(generalCategory) as GeneralEntity[]; const activeEntity = entities.find(entity => isActiveRoute(entity.spec.path)); if (activeEntity) { diff --git a/src/renderer/navigation/index.ts b/src/renderer/navigation/index.ts index fc8fbc314f..efa63e34cf 100644 --- a/src/renderer/navigation/index.ts +++ b/src/renderer/navigation/index.ts @@ -5,7 +5,6 @@ import { asLegacyGlobalFunctionForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-function-for-extension-api"; import { asLegacyGlobalForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; -import matchRouteInjectable from "./match-route.injectable"; import navigateInjectable from "./navigate.injectable"; import observableHistoryInjectable from "./observable-history.injectable"; @@ -21,9 +20,4 @@ export const navigation = asLegacyGlobalForExtensionApi(observableHistoryInjecta */ export const navigate = asLegacyGlobalFunctionForExtensionApi(navigateInjectable); -/** - * @deprecated use `di.inject(matchRouteInjectable)` instead - */ -export const matchRoute = asLegacyGlobalFunctionForExtensionApi(matchRouteInjectable); - export * from "./page-param"; diff --git a/src/renderer/navigation/match-route.injectable.ts b/src/renderer/navigation/match-route.injectable.ts index df079f335f..44518c3e09 100644 --- a/src/renderer/navigation/match-route.injectable.ts +++ b/src/renderer/navigation/match-route.injectable.ts @@ -7,7 +7,7 @@ import type { match, RouteProps } from "react-router"; import { matchPath } from "react-router"; import observableHistoryInjectable from "./observable-history.injectable"; -export type MatchRoute = (route: string | string[] | RouteProps) => match | null; +export type MatchRoute = (route: string | string[] | RouteProps) => match | null; const matchRouteInjectable = getInjectable({ id: "match-route", diff --git a/src/renderer/utils/storageHelper.ts b/src/renderer/utils/storageHelper.ts index 6a690654da..613778cc3d 100755 --- a/src/renderer/utils/storageHelper.ts +++ b/src/renderer/utils/storageHelper.ts @@ -9,6 +9,7 @@ import type { Draft } from "immer"; import { produce, isDraft } from "immer"; import { isEqual, isPlainObject } from "lodash"; import logger from "../../main/logger"; +import assert from "assert"; export interface StorageChange { key: string; @@ -154,8 +155,9 @@ export class StorageHelper implements StorageLayer { } @action - merge(value: Partial | ((draft: Draft) => Partial | void)) { + merge(value: T extends object ? Partial | ((draft: Draft) => Partial | void) : never) { const nextValue = produce(toJS(this.get()), (draft) => { + assert(typeof draft === "object" && draft); if (typeof value == "function") { const newValue = value(draft);