diff --git a/packages/entity-cache-adapter-local-memory/src/GenericLocalMemoryCacher.ts b/packages/entity-cache-adapter-local-memory/src/GenericLocalMemoryCacher.ts index f7c344c35..e04de1dc9 100644 --- a/packages/entity-cache-adapter-local-memory/src/GenericLocalMemoryCacher.ts +++ b/packages/entity-cache-adapter-local-memory/src/GenericLocalMemoryCacher.ts @@ -13,7 +13,9 @@ export const DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = Symbol('doesNotExist'); type LocalMemoryCacheValue = Readonly | typeof DOES_NOT_EXIST_LOCAL_MEMORY_CACHE; export type LocalMemoryCache = LRUCache>; -export default class GenericLocalMemoryCacher implements IEntityGenericCacher { +export default class GenericLocalMemoryCacher> + implements IEntityGenericCacher +{ constructor( private readonly entityConfiguration: EntityConfiguration, private readonly localMemoryCache: LocalMemoryCache diff --git a/packages/entity-cache-adapter-local-memory/src/LocalMemoryCacheAdapterProvider.ts b/packages/entity-cache-adapter-local-memory/src/LocalMemoryCacheAdapterProvider.ts index 912d73131..5c2a2191e 100644 --- a/packages/entity-cache-adapter-local-memory/src/LocalMemoryCacheAdapterProvider.ts +++ b/packages/entity-cache-adapter-local-memory/src/LocalMemoryCacheAdapterProvider.ts @@ -39,7 +39,7 @@ export default class LocalMemoryCacheAdapterProvider implements IEntityCacheAdap private readonly localMemoryCacheCreator: () => LocalMemoryCache ) {} - public getCacheAdapter( + public getCacheAdapter>( entityConfiguration: EntityConfiguration ): IEntityCacheAdapter { return computeIfAbsent(this.localMemoryCacheAdapterMap, entityConfiguration.tableName, () => { diff --git a/packages/entity-cache-adapter-redis/src/GenericRedisCacher.ts b/packages/entity-cache-adapter-redis/src/GenericRedisCacher.ts index f451f9c8a..73b35686f 100644 --- a/packages/entity-cache-adapter-redis/src/GenericRedisCacher.ts +++ b/packages/entity-cache-adapter-redis/src/GenericRedisCacher.ts @@ -57,7 +57,9 @@ export interface GenericRedisCacheContext { ttlSecondsNegative: number; } -export default class GenericRedisCacher implements IEntityGenericCacher { +export default class GenericRedisCacher> + implements IEntityGenericCacher +{ constructor( private readonly context: GenericRedisCacheContext, private readonly entityConfiguration: EntityConfiguration diff --git a/packages/entity-cache-adapter-redis/src/RedisCacheAdapterProvider.ts b/packages/entity-cache-adapter-redis/src/RedisCacheAdapterProvider.ts index 0c3dbc127..30a72bef2 100644 --- a/packages/entity-cache-adapter-redis/src/RedisCacheAdapterProvider.ts +++ b/packages/entity-cache-adapter-redis/src/RedisCacheAdapterProvider.ts @@ -10,7 +10,7 @@ import GenericRedisCacher, { GenericRedisCacheContext } from './GenericRedisCach export default class RedisCacheAdapterProvider implements IEntityCacheAdapterProvider { constructor(private readonly context: GenericRedisCacheContext) {} - getCacheAdapter( + getCacheAdapter>( entityConfiguration: EntityConfiguration ): IEntityCacheAdapter { return new GenericEntityCacheAdapter(new GenericRedisCacher(this.context, entityConfiguration)); diff --git a/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapter.ts b/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapter.ts index 85251cab7..6271c5c98 100644 --- a/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapter.ts +++ b/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapter.ts @@ -12,7 +12,9 @@ import { Knex } from 'knex'; import { JSONArrayField, MaybeJSONArrayField } from './EntityFields'; import wrapNativePostgresCallAsync from './errors/wrapNativePostgresCallAsync'; -export default class PostgresEntityDatabaseAdapter extends EntityDatabaseAdapter { +export default class PostgresEntityDatabaseAdapter< + TFields extends Record +> extends EntityDatabaseAdapter { protected getFieldTransformerMap(): FieldTransformerMap { return new Map>([ [ diff --git a/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapterProvider.ts b/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapterProvider.ts index 79183a5eb..fe9401bb3 100644 --- a/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapterProvider.ts +++ b/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapterProvider.ts @@ -9,7 +9,7 @@ import PostgresEntityDatabaseAdapter from './PostgresEntityDatabaseAdapter'; export default class PostgresEntityDatabaseAdapterProvider implements IEntityDatabaseAdapterProvider { - getDatabaseAdapter( + getDatabaseAdapter>( entityConfiguration: EntityConfiguration ): EntityDatabaseAdapter { return new PostgresEntityDatabaseAdapter(entityConfiguration); diff --git a/packages/entity-example/src/adapters/InMemoryDatabaseAdapter.ts b/packages/entity-example/src/adapters/InMemoryDatabaseAdapter.ts index ef0dac119..b20acaa9f 100644 --- a/packages/entity-example/src/adapters/InMemoryDatabaseAdapter.ts +++ b/packages/entity-example/src/adapters/InMemoryDatabaseAdapter.ts @@ -15,7 +15,7 @@ import { v4 as uuidv4 } from 'uuid'; const dbObjects: Readonly<{ [key: string]: any }>[] = []; export class InMemoryDatabaseAdapterProvider implements IEntityDatabaseAdapterProvider { - getDatabaseAdapter( + getDatabaseAdapter>( entityConfiguration: EntityConfiguration ): EntityDatabaseAdapter { return new InMemoryDatabaseAdapter(entityConfiguration); @@ -26,7 +26,7 @@ export class InMemoryDatabaseAdapterProvider implements IEntityDatabaseAdapterPr * In-memory database adapter for entity for the purposes of this example. Normally `@expo/entity-database-adapter-knex` * or another production adapter would be used. Very similar to StubDatabaseAdapter but shared in a way more akin to a normal database. */ -class InMemoryDatabaseAdapter extends EntityDatabaseAdapter { +class InMemoryDatabaseAdapter> extends EntityDatabaseAdapter { protected getFieldTransformerMap(): FieldTransformerMap { return new Map(); } diff --git a/packages/entity-secondary-cache-local-memory/src/LocalMemorySecondaryEntityCache.ts b/packages/entity-secondary-cache-local-memory/src/LocalMemorySecondaryEntityCache.ts index b6d440c52..d3d665557 100644 --- a/packages/entity-secondary-cache-local-memory/src/LocalMemorySecondaryEntityCache.ts +++ b/packages/entity-secondary-cache-local-memory/src/LocalMemorySecondaryEntityCache.ts @@ -12,7 +12,7 @@ import { * TLoadParams must be JSON stringifyable. */ export default class LocalMemorySecondaryEntityCache< - TFields, + TFields extends Record, TLoadParams > extends GenericSecondaryEntityCache { constructor( diff --git a/packages/entity-secondary-cache-redis/src/RedisSecondaryEntityCache.ts b/packages/entity-secondary-cache-redis/src/RedisSecondaryEntityCache.ts index 26a133d7d..aa8694218 100644 --- a/packages/entity-secondary-cache-redis/src/RedisSecondaryEntityCache.ts +++ b/packages/entity-secondary-cache-redis/src/RedisSecondaryEntityCache.ts @@ -5,7 +5,7 @@ import { GenericRedisCacheContext, GenericRedisCacher } from '@expo/entity-cache * A redis GenericSecondaryEntityCache. */ export default class RedisSecondaryEntityCache< - TFields, + TFields extends Record, TLoadParams > extends GenericSecondaryEntityCache { constructor( diff --git a/packages/entity/src/EntityCompanionProvider.ts b/packages/entity/src/EntityCompanionProvider.ts index 4787dc882..03eac9137 100644 --- a/packages/entity/src/EntityCompanionProvider.ts +++ b/packages/entity/src/EntityCompanionProvider.ts @@ -209,7 +209,7 @@ export default class EntityCompanionProvider { return entityDatabaseAdapterFlavor.queryContextProvider; } - private getTableDataCoordinatorForEntity( + private getTableDataCoordinatorForEntity>( entityConfiguration: EntityConfiguration, entityClassName: string ): EntityTableDataCoordinator { diff --git a/packages/entity/src/EntityConfiguration.ts b/packages/entity/src/EntityConfiguration.ts index 323d5e8a5..cf2c4dcfe 100644 --- a/packages/entity/src/EntityConfiguration.ts +++ b/packages/entity/src/EntityConfiguration.ts @@ -7,7 +7,7 @@ import { mapMap, invertMap, reduceMap } from './utils/collections/maps'; * The data storage configuration for a type of Entity. Contains information relating to IDs, * cachable fields, field mappings, and types of cache and database adapter. */ -export default class EntityConfiguration { +export default class EntityConfiguration> { readonly idField: keyof TFields; readonly tableName: string; readonly cacheableKeys: ReadonlySet; @@ -76,7 +76,7 @@ export default class EntityConfiguration { // external schema is a Record to typecheck that all fields have FieldDefinitions, // but internally the most useful representation is a map for lookups // TODO(wschurman): validate schema - this.schema = new Map(Object.entries(schema) as any); + this.schema = new Map(Object.entries(schema)); this.cacheableKeys = EntityConfiguration.computeCacheableKeys(this.schema); this.entityToDBFieldsKeyMapping = EntityConfiguration.computeEntityToDBFieldsKeyMapping( diff --git a/packages/entity/src/EntityDatabaseAdapter.ts b/packages/entity/src/EntityDatabaseAdapter.ts index 960be938b..bf554899a 100644 --- a/packages/entity/src/EntityDatabaseAdapter.ts +++ b/packages/entity/src/EntityDatabaseAdapter.ts @@ -113,7 +113,7 @@ export interface TableQuerySelectionModifiersWithOrderByRaw extends TableQuerySe * handles all entity field transformation. Subclasses are responsible for * implementing database-specific logic for a type of database. */ -export default abstract class EntityDatabaseAdapter { +export default abstract class EntityDatabaseAdapter> { private readonly fieldTransformerMap: FieldTransformerMap; constructor(private readonly entityConfiguration: EntityConfiguration) { diff --git a/packages/entity/src/IEntityCacheAdapterProvider.ts b/packages/entity/src/IEntityCacheAdapterProvider.ts index 9e56f80c5..e7bf7141e 100644 --- a/packages/entity/src/IEntityCacheAdapterProvider.ts +++ b/packages/entity/src/IEntityCacheAdapterProvider.ts @@ -9,7 +9,7 @@ export default interface IEntityCacheAdapterProvider { /** * Vend a cache adapter for an entity configuration. */ - getCacheAdapter( + getCacheAdapter>( entityConfiguration: EntityConfiguration ): IEntityCacheAdapter; } diff --git a/packages/entity/src/IEntityDatabaseAdapterProvider.ts b/packages/entity/src/IEntityDatabaseAdapterProvider.ts index bd2dadebd..6bc84994f 100644 --- a/packages/entity/src/IEntityDatabaseAdapterProvider.ts +++ b/packages/entity/src/IEntityDatabaseAdapterProvider.ts @@ -9,7 +9,7 @@ export default interface IEntityDatabaseAdapterProvider { /** * Vend a database adapter. */ - getDatabaseAdapter( + getDatabaseAdapter>( entityConfiguration: EntityConfiguration ): EntityDatabaseAdapter; } diff --git a/packages/entity/src/__tests__/ComposedCacheAdapter-test.ts b/packages/entity/src/__tests__/ComposedCacheAdapter-test.ts index b96a48476..302bbc917 100644 --- a/packages/entity/src/__tests__/ComposedCacheAdapter-test.ts +++ b/packages/entity/src/__tests__/ComposedCacheAdapter-test.ts @@ -23,7 +23,9 @@ const entityConfiguration = new EntityConfiguration({ export const DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = Symbol('doesNotExist'); type LocalMemoryCacheValue = Readonly | typeof DOES_NOT_EXIST_LOCAL_MEMORY_CACHE; -class TestLocalCacheAdapter implements IEntityCacheAdapter { +class TestLocalCacheAdapter> + implements IEntityCacheAdapter +{ constructor( private readonly entityConfiguration: EntityConfiguration, private readonly cache: Map> diff --git a/packages/entity/src/__tests__/EntityMutator-test.ts b/packages/entity/src/__tests__/EntityMutator-test.ts index ce445c20e..c5b0f4737 100644 --- a/packages/entity/src/__tests__/EntityMutator-test.ts +++ b/packages/entity/src/__tests__/EntityMutator-test.ts @@ -303,7 +303,7 @@ const createEntityMutatorFactory = ( ) ); const customStubDatabaseAdapterProvider: IEntityDatabaseAdapterProvider = { - getDatabaseAdapter( + getDatabaseAdapter>( _entityConfiguration: EntityConfiguration ): EntityDatabaseAdapter { return databaseAdapter as any as EntityDatabaseAdapter; diff --git a/packages/entity/src/internal/EntityDataManager.ts b/packages/entity/src/internal/EntityDataManager.ts index 7a5138027..73595129c 100644 --- a/packages/entity/src/internal/EntityDataManager.ts +++ b/packages/entity/src/internal/EntityDataManager.ts @@ -25,7 +25,7 @@ import { computeIfAbsent, zipToMap } from '../utils/collections/maps'; * * It is also responsible for invalidating all sources of data when mutated using EntityMutator. */ -export default class EntityDataManager { +export default class EntityDataManager> { private readonly fieldDataLoaders: Map< keyof TFields, DataLoader, readonly Readonly[]> diff --git a/packages/entity/src/internal/EntityFieldTransformationUtils.ts b/packages/entity/src/internal/EntityFieldTransformationUtils.ts index 355c49c39..560726b64 100644 --- a/packages/entity/src/internal/EntityFieldTransformationUtils.ts +++ b/packages/entity/src/internal/EntityFieldTransformationUtils.ts @@ -20,7 +20,7 @@ export interface FieldTransformer { */ export type FieldTransformerMap = Map>; -export const getDatabaseFieldForEntityField = ( +export const getDatabaseFieldForEntityField = >( entityConfiguration: EntityConfiguration, entityField: keyof TFields ): string => { @@ -29,7 +29,7 @@ export const getDatabaseFieldForEntityField = ( return databaseField!; }; -export const transformDatabaseObjectToFields = ( +export const transformDatabaseObjectToFields = >( entityConfiguration: EntityConfiguration, fieldTransformerMap: FieldTransformerMap, databaseObject: { [key: string]: any } @@ -50,7 +50,7 @@ export const transformDatabaseObjectToFields = ( return fields; }; -export const transformFieldsToDatabaseObject = ( +export const transformFieldsToDatabaseObject = >( entityConfiguration: EntityConfiguration, fieldTransformerMap: FieldTransformerMap, fields: Readonly> @@ -70,7 +70,7 @@ export const transformFieldsToDatabaseObject = ( return databaseObject; }; -export const transformCacheObjectToFields = ( +export const transformCacheObjectToFields = >( entityConfiguration: EntityConfiguration, fieldTransformerMap: FieldTransformerMap, cacheObject: { [key: string]: any } @@ -88,7 +88,7 @@ export const transformCacheObjectToFields = ( return fields; }; -export const transformFieldsToCacheObject = ( +export const transformFieldsToCacheObject = >( entityConfiguration: EntityConfiguration, fieldTransformerMap: FieldTransformerMap, fields: Readonly> @@ -106,7 +106,10 @@ export const transformFieldsToCacheObject = ( return cacheObject; }; -const maybeTransformDatabaseValueToFieldValue = ( +const maybeTransformDatabaseValueToFieldValue = < + TFields extends Record, + N extends keyof TFields +>( entityConfiguration: EntityConfiguration, fieldTransformerMap: FieldTransformerMap, fieldName: N, @@ -120,7 +123,10 @@ const maybeTransformDatabaseValueToFieldValue = ( +const maybeTransformFieldValueToDatabaseValue = < + TFields extends Record, + N extends keyof TFields +>( entityConfiguration: EntityConfiguration, fieldTransformerMap: FieldTransformerMap, fieldName: N, @@ -132,7 +138,10 @@ const maybeTransformFieldValueToDatabaseValue = ( +const maybeTransformCacheValueToFieldValue = < + TFields extends Record, + N extends keyof TFields +>( entityConfiguration: EntityConfiguration, fieldTransformerMap: FieldTransformerMap, fieldName: N, @@ -148,7 +157,10 @@ const maybeTransformCacheValueToFieldValue = ( return readTransformer ? readTransformer(value) : value; }; -const maybeTransformFieldValueToCacheValue = ( +const maybeTransformFieldValueToCacheValue = < + TFields extends Record, + N extends keyof TFields +>( entityConfiguration: EntityConfiguration, fieldTransformerMap: FieldTransformerMap, fieldName: N, diff --git a/packages/entity/src/internal/EntityTableDataCoordinator.ts b/packages/entity/src/internal/EntityTableDataCoordinator.ts index 321fc51a0..62848d1f9 100644 --- a/packages/entity/src/internal/EntityTableDataCoordinator.ts +++ b/packages/entity/src/internal/EntityTableDataCoordinator.ts @@ -13,7 +13,7 @@ import IEntityMetricsAdapter from '../metrics/IEntityMetricsAdapter'; * table. Note that one instance is shared amongst all entities that read from * the table to ensure cross-entity data consistency. */ -export default class EntityTableDataCoordinator { +export default class EntityTableDataCoordinator> { readonly databaseAdapter: EntityDatabaseAdapter; readonly cacheAdapter: IEntityCacheAdapter; readonly dataManager: EntityDataManager; diff --git a/packages/entity/src/internal/ReadThroughEntityCache.ts b/packages/entity/src/internal/ReadThroughEntityCache.ts index 932d944e6..7d27a32b1 100644 --- a/packages/entity/src/internal/ReadThroughEntityCache.ts +++ b/packages/entity/src/internal/ReadThroughEntityCache.ts @@ -26,7 +26,7 @@ export type CacheLoadResult = * A read-through entity cache is responsible for coordinating EntityDatabaseAdapter and * EntityCacheAdapter within the EntityDataManager. */ -export default class ReadThroughEntityCache { +export default class ReadThroughEntityCache> { constructor( private readonly entityConfiguration: EntityConfiguration, private readonly entityCacheAdapter: IEntityCacheAdapter diff --git a/packages/entity/src/utils/testing/StubCacheAdapter.ts b/packages/entity/src/utils/testing/StubCacheAdapter.ts index 7421336c5..8dd5c0120 100644 --- a/packages/entity/src/utils/testing/StubCacheAdapter.ts +++ b/packages/entity/src/utils/testing/StubCacheAdapter.ts @@ -6,7 +6,7 @@ import IEntityCacheAdapterProvider from '../../IEntityCacheAdapterProvider'; import { CacheStatus, CacheLoadResult } from '../../internal/ReadThroughEntityCache'; export class NoCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider { - getCacheAdapter( + getCacheAdapter>( _entityConfiguration: EntityConfiguration ): IEntityCacheAdapter { return new NoCacheStubCacheAdapter(); @@ -45,7 +45,7 @@ export class NoCacheStubCacheAdapter implements IEntityCacheAdapter> = new Map(); - getCacheAdapter( + getCacheAdapter>( entityConfiguration: EntityConfiguration ): IEntityCacheAdapter { return new InMemoryFullCacheStubCacheAdapter( @@ -55,7 +55,9 @@ export class InMemoryFullCacheStubCacheAdapterProvider implements IEntityCacheAd } } -export class InMemoryFullCacheStubCacheAdapter implements IEntityCacheAdapter { +export class InMemoryFullCacheStubCacheAdapter> + implements IEntityCacheAdapter +{ constructor( private readonly entityConfiguration: EntityConfiguration, readonly cache: Map> diff --git a/packages/entity/src/utils/testing/StubDatabaseAdapter.ts b/packages/entity/src/utils/testing/StubDatabaseAdapter.ts index 9ad302eb9..1fc2869e0 100644 --- a/packages/entity/src/utils/testing/StubDatabaseAdapter.ts +++ b/packages/entity/src/utils/testing/StubDatabaseAdapter.ts @@ -16,7 +16,9 @@ import { } from '../../internal/EntityFieldTransformationUtils'; import { computeIfAbsent, mapMap } from '../collections/maps'; -export default class StubDatabaseAdapter extends EntityDatabaseAdapter { +export default class StubDatabaseAdapter< + T extends Record +> extends EntityDatabaseAdapter { constructor( private readonly entityConfiguration2: EntityConfiguration, private readonly dataStore: Map[]> @@ -24,7 +26,7 @@ export default class StubDatabaseAdapter extends EntityDatabaseAdapter { super(entityConfiguration2); } - public static convertFieldObjectsToDataStore( + public static convertFieldObjectsToDataStore>( entityConfiguration: EntityConfiguration, dataStore: Map[]> ): Map[]> { diff --git a/packages/entity/src/utils/testing/StubDatabaseAdapterProvider.ts b/packages/entity/src/utils/testing/StubDatabaseAdapterProvider.ts index 38c01b573..7d24c6d32 100644 --- a/packages/entity/src/utils/testing/StubDatabaseAdapterProvider.ts +++ b/packages/entity/src/utils/testing/StubDatabaseAdapterProvider.ts @@ -6,7 +6,7 @@ import IEntityDatabaseAdapterProvider from '../../IEntityDatabaseAdapterProvider export default class StubDatabaseAdapterProvider implements IEntityDatabaseAdapterProvider { private readonly objectCollection = new Map(); - getDatabaseAdapter( + getDatabaseAdapter>( entityConfiguration: EntityConfiguration ): EntityDatabaseAdapter { return new StubDatabaseAdapter(entityConfiguration, this.objectCollection);