import type { EntityDatabaseAdapter, EntityTableDataCoordinator } from '@expo/entity'; import assert from 'assert'; import { BasePostgresEntityDatabaseAdapter } from '../BasePostgresEntityDatabaseAdapter.ts'; import { EntityKnexDataManager } from './EntityKnexDataManager.ts'; import { computeIfAbsentInWeakMap } from './weakMaps.ts'; const knexDataManagerCache = new WeakMap< EntityTableDataCoordinator, EntityKnexDataManager >(); export function getKnexDataManager< TFields extends Record, TIDField extends keyof TFields, >( tableDataCoordinator: EntityTableDataCoordinator, ): EntityKnexDataManager { return computeIfAbsentInWeakMap( knexDataManagerCache, tableDataCoordinator, (coordinator) => new EntityKnexDataManager( coordinator.entityConfiguration, requireBasePostgresAdapter(coordinator.databaseAdapter), coordinator.metricsAdapter, coordinator.entityClassName, ), ); } function requireBasePostgresAdapter< TFields extends Record, TIDField extends keyof TFields, >( databaseAdapter: EntityDatabaseAdapter, ): BasePostgresEntityDatabaseAdapter { assert( databaseAdapter instanceof BasePostgresEntityDatabaseAdapter, `Cannot create KnexDataManager for EntityTableDataCoordinator with non-Postgres database adapter.`, ); return databaseAdapter; }