diff --git a/src/lib/mysql/repository/materialized-view.ts b/src/lib/mysql/repository/materialized-view.ts index dba579a..65f2a7b 100644 --- a/src/lib/mysql/repository/materialized-view.ts +++ b/src/lib/mysql/repository/materialized-view.ts @@ -1,4 +1,5 @@ import * as ModelTypes from "../model/types.js"; +import * as SharedHelpers from "../../../shared-helpers/index.js"; import * as SharedTypes from "../../../shared-types/index.js"; import * as Types from "../domain/types.js"; import { @@ -51,9 +52,12 @@ export class MaterializedView[]>; }) { - this.#initialArgs = structuredClone(config); + this.#initialArgs = SharedHelpers.cloneRepositoryInitialArgs(config); - this.#model = new Model(config.schema, config.dbCreds, config.options); + this.#model = new Model(config.schema, config.dbCreds, { + ...config.options, + client: config.client, + }); this.#name = this.#model.name; this.#coreFields = this.#model.coreFields; diff --git a/src/lib/mysql/repository/sequence.ts b/src/lib/mysql/repository/sequence.ts index 713f30f..e8a065c 100644 --- a/src/lib/mysql/repository/sequence.ts +++ b/src/lib/mysql/repository/sequence.ts @@ -1,4 +1,5 @@ import * as ModelTypes from "../model/types.js"; +import * as SharedHelpers from "../../../shared-helpers/index.js"; import * as SharedTypes from "../../../shared-types/index.js"; import { BaseSequence as Model, TExecutor } from "../model/index.js"; import { QueryBuilder } from "../query-builder/query-builder.js"; @@ -44,9 +45,12 @@ export class Sequence { options?: ModelTypes.TSOptionsWithoutClient; schema: ModelTypes.TSequence; }) { - this.#initialArgs = structuredClone(config); + this.#initialArgs = SharedHelpers.cloneRepositoryInitialArgs(config); - this.#model = new Model(config.schema, config.dbCreds, config.options); + this.#model = new Model(config.schema, config.dbCreds, { + ...config.options, + client: config.client, + }); this.#name = this.#model.name; } diff --git a/src/lib/mysql/repository/table.ts b/src/lib/mysql/repository/table.ts index e284c05..33d3805 100644 --- a/src/lib/mysql/repository/table.ts +++ b/src/lib/mysql/repository/table.ts @@ -1,4 +1,5 @@ import * as ModelTypes from "../model/types.js"; +import * as SharedHelpers from "../../../shared-helpers/index.js"; import * as SharedTypes from "../../../shared-types/index.js"; import * as Types from "../domain/types.js"; import { @@ -58,9 +59,12 @@ export class Table { options?: ModelTypes.TDBOptionsWithoutClient; schema: ModelTypes.TTable[]>; }) { - this.#initialArgs = structuredClone(config); + this.#initialArgs = SharedHelpers.cloneRepositoryInitialArgs(config); - this.#model = new Model(config.schema, config.dbCreds, config.options); + this.#model = new Model(config.schema, config.dbCreds, { + ...config.options, + client: config.client, + }); this.#createField = this.#model.createField; this.#primaryKey = this.#model.primaryKey; diff --git a/src/lib/mysql/repository/view.ts b/src/lib/mysql/repository/view.ts index b046711..4506b47 100644 --- a/src/lib/mysql/repository/view.ts +++ b/src/lib/mysql/repository/view.ts @@ -1,4 +1,5 @@ import * as ModelTypes from "../model/types.js"; +import * as SharedHelpers from "../../../shared-helpers/index.js"; import * as SharedTypes from "../../../shared-types/index.js"; import * as Types from "../domain/types.js"; import { @@ -51,9 +52,12 @@ export class View { options?: ModelTypes.TMVOptionsWithoutClient; schema: ModelTypes.TView[]>; }) { - this.#initialArgs = structuredClone(config); + this.#initialArgs = SharedHelpers.cloneRepositoryInitialArgs(config); - this.#model = new Model(config.schema, config.dbCreds, config.options); + this.#model = new Model(config.schema, config.dbCreds, { + ...config.options, + client: config.client, + }); this.#name = this.#model.name; this.#coreFields = this.#model.coreFields; diff --git a/src/lib/pg/repository/materialized-view.ts b/src/lib/pg/repository/materialized-view.ts index e5da3d7..d0eba1f 100644 --- a/src/lib/pg/repository/materialized-view.ts +++ b/src/lib/pg/repository/materialized-view.ts @@ -1,4 +1,5 @@ import * as ModelTypes from "../model/types.js"; +import * as SharedHelpers from "../../../shared-helpers/index.js"; import * as SharedTypes from "../../../shared-types/index.js"; import * as Types from "../domain/types.js"; import { @@ -51,9 +52,12 @@ export class MaterializedView[]>; }) { - this.#initialArgs = structuredClone(config); + this.#initialArgs = SharedHelpers.cloneRepositoryInitialArgs(config); - this.#model = new Model(config.schema, config.dbCreds, config.options); + this.#model = new Model(config.schema, config.dbCreds, { + ...config.options, + client: config.client, + }); this.#name = this.#model.name; this.#coreFields = this.#model.coreFields; diff --git a/src/lib/pg/repository/sequence.ts b/src/lib/pg/repository/sequence.ts index 9264310..8bdf23f 100644 --- a/src/lib/pg/repository/sequence.ts +++ b/src/lib/pg/repository/sequence.ts @@ -1,4 +1,5 @@ import * as ModelTypes from "../model/types.js"; +import * as SharedHelpers from "../../../shared-helpers/index.js"; import { BaseSequence as Model, TExecutor } from "../model/index.js"; import { BaseSequenceGeneric as SequenceGeneric } from "../domain/sequence.js"; @@ -42,9 +43,12 @@ export class Sequence { options?: ModelTypes.TSOptionsWithoutClient; schema: ModelTypes.TSequence; }) { - this.#initialArgs = structuredClone(config); + this.#initialArgs = SharedHelpers.cloneRepositoryInitialArgs(config); - this.#model = new Model(config.schema, config.dbCreds, config.options); + this.#model = new Model(config.schema, config.dbCreds, { + ...config.options, + client: config.client, + }); this.#name = this.#model.name; } diff --git a/src/lib/pg/repository/table.ts b/src/lib/pg/repository/table.ts index 4424819..5a5bf83 100644 --- a/src/lib/pg/repository/table.ts +++ b/src/lib/pg/repository/table.ts @@ -1,4 +1,5 @@ import * as ModelTypes from "../model/types.js"; +import * as SharedHelpers from "../../../shared-helpers/index.js"; import * as SharedTypes from "../../../shared-types/index.js"; import * as Types from "../domain/types.js"; import { @@ -58,9 +59,12 @@ export class Table { options?: ModelTypes.TDBOptionsWithoutClient; schema: ModelTypes.TTable[]>; }) { - this.#initialArgs = structuredClone(config); + this.#initialArgs = SharedHelpers.cloneRepositoryInitialArgs(config); - this.#model = new Model(config.schema, config.dbCreds, config.options); + this.#model = new Model(config.schema, config.dbCreds, { + ...config.options, + client: config.client, + }); this.#createField = this.#model.createField; this.#primaryKey = this.#model.primaryKey; diff --git a/src/lib/pg/repository/view.ts b/src/lib/pg/repository/view.ts index b45f611..4315d18 100644 --- a/src/lib/pg/repository/view.ts +++ b/src/lib/pg/repository/view.ts @@ -1,4 +1,5 @@ import * as ModelTypes from "../model/types.js"; +import * as SharedHelpers from "../../../shared-helpers/index.js"; import * as SharedTypes from "../../../shared-types/index.js"; import * as Types from "../domain/types.js"; import { @@ -51,9 +52,12 @@ export class View { options?: ModelTypes.TMVOptionsWithoutClient; schema: ModelTypes.TView[]>; }) { - this.#initialArgs = structuredClone(config); + this.#initialArgs = SharedHelpers.cloneRepositoryInitialArgs(config); - this.#model = new Model(config.schema, config.dbCreds, config.options); + this.#model = new Model(config.schema, config.dbCreds, { + ...config.options, + client: config.client, + }); this.#name = this.#model.name; this.#coreFields = this.#model.coreFields; diff --git a/src/shared-helpers/index.ts b/src/shared-helpers/index.ts index 3246fea..8f0b5b8 100644 --- a/src/shared-helpers/index.ts +++ b/src/shared-helpers/index.ts @@ -12,6 +12,46 @@ export function clearUndefinedFields(params: SharedTypes.TRawParams): SharedType return result; } +/** + * Snapshots repository constructor args for later recreation via `setupClient`. + * + * Omits `client` and keeps `options.logger` by reference — both are not + * `structuredClone`-compatible (executors are EventEmitters; loggers are functions). + */ +export function cloneRepositoryInitialArgs< + TSchema, + TDbCreds, + TOptions extends { logger?: SharedTypes.TLogger; }, +>(config: { + client?: unknown; + dbCreds?: TDbCreds; + options?: TOptions; + schema: TSchema; +}): { + dbCreds?: TDbCreds; + options?: TOptions; + schema: TSchema; +} { + const { dbCreds, options, schema } = config; + + let clonedOptions: TOptions | undefined; + + if (options) { + const { logger, ...restOptions } = options; + + clonedOptions = { + ...structuredClone(restOptions), + ...(logger !== undefined ? { logger } : {}), + } as TOptions; + } + + return { + dbCreds: dbCreds !== undefined ? structuredClone(dbCreds) : undefined, + options: clonedOptions, + schema: structuredClone(schema), + }; +} + export function isHasFields( obj: T, fields: Array | string>,