From 8fa1621dfa091049ec12a8e7c837229b0f308046 Mon Sep 17 00:00:00 2001 From: Will Schurman Date: Thu, 12 Feb 2026 20:25:43 -0700 Subject: [PATCH] fix: pass in augmentable classes to installation --- .../StubPostgresDatabaseAdapterProvider.ts | 20 ++++++++++++++----- .../PostgresEntityDatabaseAdapterProvider.ts | 20 ++++++++++++++----- .../StubPostgresDatabaseAdapterProvider.ts | 20 ++++++++++++++----- .../extensions/EntityCompanionExtensions.ts | 8 ++++++-- .../EntityTableDataCoordinatorExtensions.ts | 8 ++++++-- .../extensions/ReadonlyEntityExtensions.ts | 10 +++++++--- .../ViewerScopedEntityCompanionExtensions.ts | 8 ++++++-- .../entity/src/EntityCompanionProvider.ts | 8 +++++++- .../src/IEntityDatabaseAdapterProvider.ts | 16 ++++++++++++++- 9 files changed, 92 insertions(+), 26 deletions(-) diff --git a/packages/entity-database-adapter-knex-testing-utils/src/StubPostgresDatabaseAdapterProvider.ts b/packages/entity-database-adapter-knex-testing-utils/src/StubPostgresDatabaseAdapterProvider.ts index f7f71d5c4..7b916a6aa 100644 --- a/packages/entity-database-adapter-knex-testing-utils/src/StubPostgresDatabaseAdapterProvider.ts +++ b/packages/entity-database-adapter-knex-testing-utils/src/StubPostgresDatabaseAdapterProvider.ts @@ -17,11 +17,21 @@ export class StubPostgresDatabaseAdapterProvider implements IEntityDatabaseAdapt return 'StubPostgresDatabaseAdapterProvider'; } - installExtensions(): void { - installEntityCompanionExtensions(); - installEntityTableDataCoordinatorExtensions(); - installViewerScopedEntityCompanionExtensions(); - installReadonlyEntityExtensions(); + installExtensions({ + EntityCompanionClass, + EntityTableDataCoordinatorClass, + ViewerScopedEntityCompanionClass, + ReadonlyEntityClass, + }: { + EntityCompanionClass: typeof import('@expo/entity').EntityCompanion; + EntityTableDataCoordinatorClass: typeof import('@expo/entity').EntityTableDataCoordinator; + ViewerScopedEntityCompanionClass: typeof import('@expo/entity').ViewerScopedEntityCompanion; + ReadonlyEntityClass: typeof import('@expo/entity').ReadonlyEntity; + }): void { + installEntityCompanionExtensions({ EntityCompanionClass }); + installEntityTableDataCoordinatorExtensions({ EntityTableDataCoordinatorClass }); + installViewerScopedEntityCompanionExtensions({ ViewerScopedEntityCompanionClass }); + installReadonlyEntityExtensions({ ReadonlyEntityClass }); } private readonly objectCollection = new Map(); diff --git a/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapterProvider.ts b/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapterProvider.ts index 5a4e97dff..8363a81ef 100644 --- a/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapterProvider.ts +++ b/packages/entity-database-adapter-knex/src/PostgresEntityDatabaseAdapterProvider.ts @@ -24,11 +24,21 @@ export class PostgresEntityDatabaseAdapterProvider implements IEntityDatabaseAda return 'PostgresEntityDatabaseAdapterProvider'; } - installExtensions(): void { - installEntityCompanionExtensions(); - installEntityTableDataCoordinatorExtensions(); - installViewerScopedEntityCompanionExtensions(); - installReadonlyEntityExtensions(); + installExtensions({ + EntityCompanionClass, + EntityTableDataCoordinatorClass, + ViewerScopedEntityCompanionClass, + ReadonlyEntityClass, + }: { + EntityCompanionClass: typeof import('@expo/entity').EntityCompanion; + EntityTableDataCoordinatorClass: typeof import('@expo/entity').EntityTableDataCoordinator; + ViewerScopedEntityCompanionClass: typeof import('@expo/entity').ViewerScopedEntityCompanion; + ReadonlyEntityClass: typeof import('@expo/entity').ReadonlyEntity; + }): void { + installEntityCompanionExtensions({ EntityCompanionClass }); + installEntityTableDataCoordinatorExtensions({ EntityTableDataCoordinatorClass }); + installViewerScopedEntityCompanionExtensions({ ViewerScopedEntityCompanionClass }); + installReadonlyEntityExtensions({ ReadonlyEntityClass }); } getDatabaseAdapter, TIDField extends keyof TFields>( diff --git a/packages/entity-database-adapter-knex/src/__tests__/fixtures/StubPostgresDatabaseAdapterProvider.ts b/packages/entity-database-adapter-knex/src/__tests__/fixtures/StubPostgresDatabaseAdapterProvider.ts index be03094df..1ad0525e8 100644 --- a/packages/entity-database-adapter-knex/src/__tests__/fixtures/StubPostgresDatabaseAdapterProvider.ts +++ b/packages/entity-database-adapter-knex/src/__tests__/fixtures/StubPostgresDatabaseAdapterProvider.ts @@ -15,11 +15,21 @@ export class StubPostgresDatabaseAdapterProvider implements IEntityDatabaseAdapt return 'StubPostgresDatabaseAdapterProvider'; } - installExtensions(): void { - installEntityCompanionExtensions(); - installEntityTableDataCoordinatorExtensions(); - installViewerScopedEntityCompanionExtensions(); - installReadonlyEntityExtensions(); + installExtensions({ + EntityCompanionClass, + EntityTableDataCoordinatorClass, + ViewerScopedEntityCompanionClass, + ReadonlyEntityClass, + }: { + EntityCompanionClass: typeof import('@expo/entity').EntityCompanion; + EntityTableDataCoordinatorClass: typeof import('@expo/entity').EntityTableDataCoordinator; + ViewerScopedEntityCompanionClass: typeof import('@expo/entity').ViewerScopedEntityCompanion; + ReadonlyEntityClass: typeof import('@expo/entity').ReadonlyEntity; + }): void { + installEntityCompanionExtensions({ EntityCompanionClass }); + installEntityTableDataCoordinatorExtensions({ EntityTableDataCoordinatorClass }); + installViewerScopedEntityCompanionExtensions({ ViewerScopedEntityCompanionClass }); + installReadonlyEntityExtensions({ ReadonlyEntityClass }); } private readonly objectCollection = new Map(); diff --git a/packages/entity-database-adapter-knex/src/extensions/EntityCompanionExtensions.ts b/packages/entity-database-adapter-knex/src/extensions/EntityCompanionExtensions.ts index 44fac0c19..2be80331f 100644 --- a/packages/entity-database-adapter-knex/src/extensions/EntityCompanionExtensions.ts +++ b/packages/entity-database-adapter-knex/src/extensions/EntityCompanionExtensions.ts @@ -41,8 +41,12 @@ declare module '@expo/entity' { } } -export function installEntityCompanionExtensions(): void { - EntityCompanion.prototype.getKnexLoaderFactory = function < +export function installEntityCompanionExtensions({ + EntityCompanionClass, +}: { + EntityCompanionClass: typeof EntityCompanion; +}): void { + EntityCompanionClass.prototype.getKnexLoaderFactory = function < TFields extends Record, TIDField extends keyof NonNullable>, TViewerContext extends ViewerContext, diff --git a/packages/entity-database-adapter-knex/src/extensions/EntityTableDataCoordinatorExtensions.ts b/packages/entity-database-adapter-knex/src/extensions/EntityTableDataCoordinatorExtensions.ts index 156a60a17..155da9bbd 100644 --- a/packages/entity-database-adapter-knex/src/extensions/EntityTableDataCoordinatorExtensions.ts +++ b/packages/entity-database-adapter-knex/src/extensions/EntityTableDataCoordinatorExtensions.ts @@ -29,8 +29,12 @@ function requireBasePostgresAdapter< return databaseAdapter; } -export function installEntityTableDataCoordinatorExtensions(): void { - EntityTableDataCoordinator.prototype.getKnexDataManager = function < +export function installEntityTableDataCoordinatorExtensions({ + EntityTableDataCoordinatorClass, +}: { + EntityTableDataCoordinatorClass: typeof EntityTableDataCoordinator; +}): void { + EntityTableDataCoordinatorClass.prototype.getKnexDataManager = function < TFields extends Record, TIDField extends keyof TFields, >(this: EntityTableDataCoordinator): EntityKnexDataManager { diff --git a/packages/entity-database-adapter-knex/src/extensions/ReadonlyEntityExtensions.ts b/packages/entity-database-adapter-knex/src/extensions/ReadonlyEntityExtensions.ts index adfa1b766..ff9569a5e 100644 --- a/packages/entity-database-adapter-knex/src/extensions/ReadonlyEntityExtensions.ts +++ b/packages/entity-database-adapter-knex/src/extensions/ReadonlyEntityExtensions.ts @@ -172,8 +172,12 @@ class ReadonlyEntityExtensions { } } -export function installReadonlyEntityExtensions(): void { - ReadonlyEntity.knexLoader = ReadonlyEntityExtensions.knexLoader; - ReadonlyEntity.knexLoaderWithAuthorizationResults = +export function installReadonlyEntityExtensions({ + ReadonlyEntityClass, +}: { + ReadonlyEntityClass: typeof ReadonlyEntity; +}): void { + ReadonlyEntityClass.knexLoader = ReadonlyEntityExtensions.knexLoader; + ReadonlyEntityClass.knexLoaderWithAuthorizationResults = ReadonlyEntityExtensions.knexLoaderWithAuthorizationResults; } diff --git a/packages/entity-database-adapter-knex/src/extensions/ViewerScopedEntityCompanionExtensions.ts b/packages/entity-database-adapter-knex/src/extensions/ViewerScopedEntityCompanionExtensions.ts index 7c2198fd2..9fa988bf6 100644 --- a/packages/entity-database-adapter-knex/src/extensions/ViewerScopedEntityCompanionExtensions.ts +++ b/packages/entity-database-adapter-knex/src/extensions/ViewerScopedEntityCompanionExtensions.ts @@ -33,8 +33,12 @@ declare module '@expo/entity' { } } -export function installViewerScopedEntityCompanionExtensions(): void { - ViewerScopedEntityCompanion.prototype.getKnexLoaderFactory = function < +export function installViewerScopedEntityCompanionExtensions({ + ViewerScopedEntityCompanionClass, +}: { + ViewerScopedEntityCompanionClass: typeof ViewerScopedEntityCompanion; +}): void { + ViewerScopedEntityCompanionClass.prototype.getKnexLoaderFactory = function < TFields extends Record, TIDField extends keyof NonNullable>, TViewerContext extends ViewerContext, diff --git a/packages/entity/src/EntityCompanionProvider.ts b/packages/entity/src/EntityCompanionProvider.ts index 6c0d1e977..6334316ac 100644 --- a/packages/entity/src/EntityCompanionProvider.ts +++ b/packages/entity/src/EntityCompanionProvider.ts @@ -11,6 +11,7 @@ import { IEntityCacheAdapterProvider } from './IEntityCacheAdapterProvider'; import { IEntityDatabaseAdapterProvider } from './IEntityDatabaseAdapterProvider'; import { ReadonlyEntity } from './ReadonlyEntity'; import { ViewerContext } from './ViewerContext'; +import { ViewerScopedEntityCompanion } from './ViewerScopedEntityCompanion'; import { EntityTableDataCoordinator } from './internal/EntityTableDataCoordinator'; import { IEntityMetricsAdapter } from './metrics/IEntityMetricsAdapter'; import { computeIfAbsent } from './utils/collections/maps'; @@ -167,7 +168,12 @@ export class EntityCompanionProvider { flavorDefinition.adapterProvider.getExtensionsKey(), ) ) { - flavorDefinition.adapterProvider.installExtensions(); + flavorDefinition.adapterProvider.installExtensions({ + EntityCompanionClass: EntityCompanion, + EntityTableDataCoordinatorClass: EntityTableDataCoordinator, + ViewerScopedEntityCompanionClass: ViewerScopedEntityCompanion, + ReadonlyEntityClass: ReadonlyEntity, + }); EntityCompanionProvider.installedExtensions.add( flavorDefinition.adapterProvider.getExtensionsKey(), ); diff --git a/packages/entity/src/IEntityDatabaseAdapterProvider.ts b/packages/entity/src/IEntityDatabaseAdapterProvider.ts index 8bf5a0c73..f010771fb 100644 --- a/packages/entity/src/IEntityDatabaseAdapterProvider.ts +++ b/packages/entity/src/IEntityDatabaseAdapterProvider.ts @@ -1,7 +1,11 @@ /* c8 ignore start - interface only */ +import { EntityCompanion } from './EntityCompanion'; import { EntityConfiguration } from './EntityConfiguration'; import { EntityDatabaseAdapter } from './EntityDatabaseAdapter'; +import { ReadonlyEntity } from './ReadonlyEntity'; +import { ViewerScopedEntityCompanion } from './ViewerScopedEntityCompanion'; +import { EntityTableDataCoordinator } from './internal/EntityTableDataCoordinator'; /** * A database adapter provider vends database adapters for a particular database adapter type. @@ -16,7 +20,17 @@ export interface IEntityDatabaseAdapterProvider { /** * Install any necessary extensions to the Entity system. */ - installExtensions(): void; + installExtensions({ + EntityCompanionClass, + EntityTableDataCoordinatorClass, + ViewerScopedEntityCompanionClass, + ReadonlyEntityClass, + }: { + EntityCompanionClass: typeof EntityCompanion; + EntityTableDataCoordinatorClass: typeof EntityTableDataCoordinator; + ViewerScopedEntityCompanionClass: typeof ViewerScopedEntityCompanion; + ReadonlyEntityClass: typeof ReadonlyEntity; + }): void; /** * Vend a database adapter.