From b5178c7cdf64ca195a346f2648345da51f3fe89e Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 21 Mar 2023 14:42:58 -0400 Subject: [PATCH] Fix type errors Signed-off-by: Sebastian Malton --- .../persistent-storage/create.injectable.ts | 11 +++--- .../migrations.injectable.ts | 36 ++++++++++--------- .../src/extensions/base-extension-store.ts | 7 ++-- .../storage/common/storage.injectable.ts | 6 ++-- .../utility-features/utilities/src/iter.ts | 4 +++ 5 files changed, 35 insertions(+), 29 deletions(-) diff --git a/packages/core/src/common/persistent-storage/create.injectable.ts b/packages/core/src/common/persistent-storage/create.injectable.ts index 63da72f413..07513ef910 100644 --- a/packages/core/src/common/persistent-storage/create.injectable.ts +++ b/packages/core/src/common/persistent-storage/create.injectable.ts @@ -6,7 +6,6 @@ import { disposer, isPromiseLike } from "@k8slens/utilities"; import { getInjectable } from "@ogre-tools/injectable"; import type Conf from "conf/dist/source"; import type { Options } from "conf/dist/source"; -import type { Migrations } from "conf/dist/source/types"; import { isEqual, kebabCase } from "lodash"; import type { IEqualsComparer } from "mobx"; import { reaction } from "mobx"; @@ -20,6 +19,7 @@ import type { MessageChannel } from "@k8slens/messaging"; import { persistentStorageIpcChannelPrefixesInjectionToken } from "./channel-prefix"; import { shouldPersistentStorageDisableSyncInIpcListenerInjectionToken } from "./disable-sync"; import { persistStateToConfigInjectionToken } from "./save-to-file"; +import type { Migrations } from "./migrations.injectable"; export interface PersistentStorage { /** @@ -30,13 +30,12 @@ export interface PersistentStorage { } export interface PersistentStorageParams extends Omit, "migrations"> { - syncOptions?: { - fireImmediately?: boolean; + readonly syncOptions?: { + readonly fireImmediately?: boolean; equals?: IEqualsComparer; }; readonly configName: string; - - migrations?: Migrations>; + readonly migrations?: Migrations; /** * fromStore is called internally when a child class syncs with the file @@ -91,7 +90,7 @@ const createPersistentStorageInjectable = getInjectable({ const config = getConfigurationFileModel({ projectName: "lens", cwd, - migrations: migrations as Migrations, + migrations: migrations as Options["migrations"], ...params, }); diff --git a/packages/core/src/common/persistent-storage/migrations.injectable.ts b/packages/core/src/common/persistent-storage/migrations.injectable.ts index 772b7c5bb5..e4bd43d1de 100644 --- a/packages/core/src/common/persistent-storage/migrations.injectable.ts +++ b/packages/core/src/common/persistent-storage/migrations.injectable.ts @@ -4,19 +4,26 @@ */ import type { InjectionToken } from "@ogre-tools/injectable"; import { lifecycleEnum, getInjectable } from "@ogre-tools/injectable"; -import type { Migrations } from "conf/dist/source/types"; import loggerInjectable from "../logger.injectable"; -import { getOrInsert, iter } from "@k8slens/utilities"; +import { getOrInsert, iter, object } from "@k8slens/utilities"; + +export type AllowedSetValue = T extends (...args: any[]) => any + ? never + : T extends undefined | symbol + ? never + : T; export interface MigrationStore { + readonly path: string; get(key: string): unknown; delete(key: string): void; has(key: string): boolean; clear(): void; - set(key: string, value: number | string | boolean | unknown[]): void; - set(key: string, value: Record): void; + set(key: string, value: AllowedSetValue): void; } +export type Migrations = Partial void>>; + export interface MigrationDeclaration { version: string; run(store: MigrationStore): void; @@ -24,7 +31,7 @@ export interface MigrationDeclaration { const persistentStorageMigrationsInjectable = getInjectable({ id: "persistent-storage-migrations", - instantiate: (di, token): Migrations> => { + instantiate: (di, token) => { const logger = di.inject(loggerInjectable); const declarations = di.injectMany(token); const migrations = new Map(); @@ -33,18 +40,15 @@ const persistentStorageMigrationsInjectable = getInjectable({ getOrInsert(migrations, decl.version, []).push(decl.run); } - return Object.fromEntries( - iter.map( - migrations, - ([v, fns]) => [v, (store) => { - logger.info(`Running ${v} migration for ${store.path}`); + return iter.chain(migrations.entries()) + .map(([v, fns]) => [v, (store: MigrationStore) => { + logger.info(`Running ${v} migration for ${store.path}`); - for (const fn of fns) { - fn(store); - } - }], - ), - ); + for (const fn of fns) { + fn(store); + } + }] as const) + .collect(object.fromEntries); }, lifecycle: lifecycleEnum.keyedSingleton({ getInstanceKey: (di, token: InjectionToken) => token.id, diff --git a/packages/core/src/extensions/base-extension-store.ts b/packages/core/src/extensions/base-extension-store.ts index d6b42c3d39..703edfafd0 100644 --- a/packages/core/src/extensions/base-extension-store.ts +++ b/packages/core/src/extensions/base-extension-store.ts @@ -8,14 +8,15 @@ import type { LensExtension } from "./lens-extension"; import type { StaticThis } from "../common/utils/singleton"; import { getOrInsertWith } from "@k8slens/utilities"; import { getLegacyGlobalDiForExtensionApi } from "./as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; -import type { Migrations } from "conf/dist/source/types"; import type { PersistentStorage, PersistentStorageParams } from "../common/persistent-storage/create.injectable"; import createPersistentStorageInjectable from "../common/persistent-storage/create.injectable"; import directoryForUserDataInjectable from "../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; import assert from "assert"; +import type { Options } from "conf"; +import type { Migrations } from "../common/persistent-storage/migrations.injectable"; export interface ExtensionStoreParams extends Omit, "migrations" | "cwd" | "fromStore" | "toJSON"> { - migrations?: Migrations; + migrations?: Options["migrations"]; cwd?: string; } @@ -76,7 +77,7 @@ export abstract class BaseExtensionStore { ...params, cwd: this.cwd(), projectVersion, - migrations: migrations as Migrations>, + migrations: migrations as Migrations, fromStore: (data) => this.fromStore(data), toJSON: () => this.toJSON(), }); diff --git a/packages/core/src/features/cluster/storage/common/storage.injectable.ts b/packages/core/src/features/cluster/storage/common/storage.injectable.ts index e2778275c4..eaac8376cf 100644 --- a/packages/core/src/features/cluster/storage/common/storage.injectable.ts +++ b/packages/core/src/features/cluster/storage/common/storage.injectable.ts @@ -26,8 +26,6 @@ const clustersPersistentStorageInjectable = getInjectable({ const readClusterConfigSync = di.inject(readClusterConfigSyncInjectable); const clustersState = di.inject(clustersStateInjectable); const logger = di.inject(loggerInjectable); - const storeMigrationVersion = di.inject(storeMigrationVersionInjectable); - const migrations = di.inject(persistentStorageMigrationsInjectable, clusterStoreMigrationInjectionToken); return createPersistentStorage({ configName: "lens-cluster-store", @@ -35,8 +33,8 @@ const clustersPersistentStorageInjectable = getInjectable({ syncOptions: { equals: comparer.structural, }, - projectVersion: storeMigrationVersion, - migrations, + projectVersion: di.inject(storeMigrationVersionInjectable), + migrations: di.inject(persistentStorageMigrationsInjectable, clusterStoreMigrationInjectionToken), fromStore: action(({ clusters = [] }) => { const currentClusters = new Map(clustersState); const newClusters = new Map(); diff --git a/packages/utility-features/utilities/src/iter.ts b/packages/utility-features/utilities/src/iter.ts index 8051e90a6d..b20f48a67a 100644 --- a/packages/utility-features/utilities/src/iter.ts +++ b/packages/utility-features/utilities/src/iter.ts @@ -11,6 +11,8 @@ interface Iterator extends Iterable { find(fn: (val: T) => unknown): T | undefined; collect(fn: (values: Iterable) => U): U; toArray(): T[]; + toMap(): T extends [infer K, infer V] ? Map : never; + toSet(): Set; map(fn: (val: T) => U): Iterator; flatMap(fn: (val: T) => U[]): Iterator; concat(src2: IterableIterator): Iterator; @@ -28,6 +30,8 @@ function chain(src: IterableIterator): Iterator { join: (sep) => join(src, sep), collect: (fn) => fn(src), toArray: () => [...src], + toMap: () => new Map(src as IterableIterator<[any, any]>) as any, + toSet: () => new Set(src), concat: (src2) => chain(concat(src, src2)), take: (count) => chain(take(src, count)), [Symbol.iterator]: () => src,