@warlock.js/cascade 4.4.0 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -3
- package/cjs/index.cjs +933 -90
- package/cjs/index.cjs.map +1 -1
- package/esm/contracts/database-driver.contract.d.mts +27 -4
- package/esm/contracts/database-driver.contract.d.mts.map +1 -1
- package/esm/contracts/database-id-generator.contract.d.mts +38 -0
- package/esm/contracts/database-id-generator.contract.d.mts.map +1 -1
- package/esm/contracts/index.d.mts +1 -1
- package/esm/contracts/query-builder.contract.d.mts +27 -0
- package/esm/contracts/query-builder.contract.d.mts.map +1 -1
- package/esm/data-source/data-source.d.mts +21 -1
- package/esm/data-source/data-source.d.mts.map +1 -1
- package/esm/data-source/data-source.mjs +22 -0
- package/esm/data-source/data-source.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-driver.d.mts +2 -2
- package/esm/drivers/mongodb/mongodb-driver.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-driver.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-id-generator.d.mts +98 -48
- package/esm/drivers/mongodb/mongodb-id-generator.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-id-generator.mjs +153 -59
- package/esm/drivers/mongodb/mongodb-id-generator.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-builder.d.mts +25 -0
- package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-builder.mjs +32 -0
- package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-parser.d.mts +36 -0
- package/esm/drivers/mongodb/mongodb-query-parser.d.mts.map +1 -1
- package/esm/drivers/mongodb/mongodb-query-parser.mjs +80 -1
- package/esm/drivers/mongodb/mongodb-query-parser.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-dialect.d.mts +32 -4
- package/esm/drivers/postgres/postgres-dialect.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-dialect.mjs +57 -4
- package/esm/drivers/postgres/postgres-dialect.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-driver.d.mts +42 -0
- package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-driver.mjs +55 -6
- package/esm/drivers/postgres/postgres-driver.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-query-builder.d.mts +32 -0
- package/esm/drivers/postgres/postgres-query-builder.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-query-builder.mjs +47 -1
- package/esm/drivers/postgres/postgres-query-builder.mjs.map +1 -1
- package/esm/drivers/postgres/postgres-query-parser.d.mts +13 -2
- package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -1
- package/esm/drivers/postgres/postgres-query-parser.mjs +21 -4
- package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -1
- package/esm/drivers/postgres/types.d.mts +15 -0
- package/esm/drivers/postgres/types.d.mts.map +1 -1
- package/esm/drivers/sql/sql-dialect.contract.d.mts +20 -0
- package/esm/drivers/sql/sql-dialect.contract.d.mts.map +1 -1
- package/esm/expressions/aggregate-expressions.d.mts +71 -34
- package/esm/expressions/aggregate-expressions.d.mts.map +1 -1
- package/esm/expressions/aggregate-expressions.mjs +80 -7
- package/esm/expressions/aggregate-expressions.mjs.map +1 -1
- package/esm/expressions/column-expressions.d.mts +193 -0
- package/esm/expressions/column-expressions.d.mts.map +1 -0
- package/esm/expressions/column-expressions.mjs +152 -0
- package/esm/expressions/column-expressions.mjs.map +1 -0
- package/esm/index.d.mts +3 -2
- package/esm/index.mjs +2 -1
- package/esm/model/methods/write-methods.d.mts +29 -0
- package/esm/model/methods/write-methods.d.mts.map +1 -0
- package/esm/model/methods/write-methods.mjs +164 -2
- package/esm/model/methods/write-methods.mjs.map +1 -1
- package/esm/model/model.d.mts +64 -3
- package/esm/model/model.d.mts.map +1 -1
- package/esm/model/model.mjs +65 -3
- package/esm/model/model.mjs.map +1 -1
- package/esm/writer/database-writer.d.mts.map +1 -1
- package/esm/writer/database-writer.mjs +4 -3
- package/esm/writer/database-writer.mjs.map +1 -1
- package/llms-full.txt +106 -7
- package/llms.txt +3 -3
- package/package.json +4 -4
- package/skills/README.md +3 -3
- package/skills/aggregate-data/SKILL.md +43 -3
- package/skills/manage-transactions/SKILL.md +40 -1
- package/skills/perform-atomic-ops/SKILL.md +23 -3
|
@@ -56,6 +56,25 @@ type InsertResult<TDocument = unknown> = {
|
|
|
56
56
|
type UpdateResult = {
|
|
57
57
|
modifiedCount: number;
|
|
58
58
|
};
|
|
59
|
+
/**
|
|
60
|
+
* Result returned by a raw query execution ({@link DriverContract.query}).
|
|
61
|
+
*
|
|
62
|
+
* Mirrors the shape both the `pg` and MongoDB drivers already return: an
|
|
63
|
+
* array of typed `rows` and the affected `rowCount` (`null` for statements
|
|
64
|
+
* that don't report one). `command` / `fields` are optional driver extras
|
|
65
|
+
* (the `pg` driver populates them; MongoDB does not).
|
|
66
|
+
*
|
|
67
|
+
* @typeParam T - The row shape (defaults to a generic record).
|
|
68
|
+
*/
|
|
69
|
+
type RawQueryResult<T = Record<string, unknown>> = {
|
|
70
|
+
/** Rows returned by the query, typed as `T`. */readonly rows: T[]; /** Rows affected by INSERT/UPDATE/DELETE, or `null` when not reported. */
|
|
71
|
+
readonly rowCount: number | null; /** Command executed (SELECT, INSERT, …) — driver-dependent. */
|
|
72
|
+
readonly command?: string; /** Result column metadata — driver-dependent. */
|
|
73
|
+
readonly fields?: ReadonlyArray<{
|
|
74
|
+
readonly name: string;
|
|
75
|
+
readonly dataTypeID: number;
|
|
76
|
+
}>;
|
|
77
|
+
};
|
|
59
78
|
/**
|
|
60
79
|
* Database-agnostic update operations.
|
|
61
80
|
*
|
|
@@ -318,13 +337,17 @@ interface DriverContract {
|
|
|
318
337
|
getSQLSerializer(): SQLSerializer;
|
|
319
338
|
/**
|
|
320
339
|
* Execute a raw SQL query.
|
|
321
|
-
* Used by the runner to execute phase-ordered SQL.
|
|
322
340
|
*
|
|
341
|
+
* Transaction-aware: when called inside a `transaction()` scope the driver
|
|
342
|
+
* routes the query through the active transaction client automatically.
|
|
343
|
+
* Used by the runner to execute phase-ordered SQL and by `Model.raw()`.
|
|
344
|
+
*
|
|
345
|
+
* @typeParam T - The expected row shape.
|
|
323
346
|
* @param sql - SQL query string
|
|
324
347
|
* @param params - Optional query parameters
|
|
325
|
-
* @returns
|
|
348
|
+
* @returns The query result (`rows` + `rowCount`)
|
|
326
349
|
*/
|
|
327
|
-
query<T = unknown
|
|
350
|
+
query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<RawQueryResult<T>>;
|
|
328
351
|
/**
|
|
329
352
|
* Create a new database.
|
|
330
353
|
*
|
|
@@ -439,5 +462,5 @@ type DropDatabaseOptions = {
|
|
|
439
462
|
ifExists?: boolean;
|
|
440
463
|
};
|
|
441
464
|
//#endregion
|
|
442
|
-
export { CreateDatabaseOptions, DriverContract, DriverEvent, DriverEventListener, DriverTransactionContract, DropDatabaseOptions, InsertResult, TransactionContext, UpdateOperations, UpdateResult };
|
|
465
|
+
export { CreateDatabaseOptions, DriverContract, DriverEvent, DriverEventListener, DriverTransactionContract, DropDatabaseOptions, InsertResult, RawQueryResult, TransactionContext, UpdateOperations, UpdateResult };
|
|
443
466
|
//# sourceMappingURL=database-driver.contract.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-driver.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/contracts/database-driver.contract.ts"],"mappings":";;;;;;;;;;;KASY,WAAA;;KAGA,mBAAA,OAA0B,IAAI;;UAGzB,yBAAA;EANM;EAQrB,OAAA,EAAS,QAAA;EALC;EAOV,MAAA,IAAU,OAAA;;EAEV,QAAA,IAAY,OAAA;AAAA;AANd;;;;;;AAAA,UAeiB,kBAAA;EATI;;;;;;;;;AAAA;AASrB;;;;AAmB0B;AAI1B;;;EAJE,QAAA,CAAS,MAAe;AAAA;;KAId,YAAA;EACV,QAAA,EAAU,SAAS;AAAA;AAIrB;AAAA,KAAY,YAAA;EACV,aAAa;AAAA;AAAA;
|
|
1
|
+
{"version":3,"file":"database-driver.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/contracts/database-driver.contract.ts"],"mappings":"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"}
|
|
@@ -63,6 +63,44 @@ interface IdGeneratorContract {
|
|
|
63
63
|
* ```
|
|
64
64
|
*/
|
|
65
65
|
generateNextId(options: GenerateIdOptions): Promise<number>;
|
|
66
|
+
/**
|
|
67
|
+
* Reserve a contiguous block of `count` ids in a SINGLE atomic operation.
|
|
68
|
+
*
|
|
69
|
+
* This is the batch counterpart of {@link generateNextId}, intended for
|
|
70
|
+
* multi-row inserts (`createMany`): instead of N separate counter round-trips
|
|
71
|
+
* (one per row), the counter is advanced by `count * incrementIdBy` in one
|
|
72
|
+
* atomic step and the whole block is handed back at once.
|
|
73
|
+
*
|
|
74
|
+
* Semantics:
|
|
75
|
+
* - Returns the `count` reserved ids in ascending order. The FIRST id of the
|
|
76
|
+
* first-ever block for a table equals `initialId` (same anchor as
|
|
77
|
+
* {@link generateNextId}); subsequent blocks continue from the stored
|
|
78
|
+
* counter, so blocks never overlap — even across concurrent callers.
|
|
79
|
+
* - Goal of "update the stored last id" is satisfied by the same atomic op:
|
|
80
|
+
* advancing the counter by `count * incrementIdBy` leaves the persisted
|
|
81
|
+
* counter equal to the block's LAST id, so {@link getLastId} stays
|
|
82
|
+
* consistent with no extra write. Do NOT pair this with {@link setLastId}.
|
|
83
|
+
* - **Not transactional.** Like {@link generateNextId} (and SQL `SERIAL`),
|
|
84
|
+
* the counter write is standalone and durable immediately; if a surrounding
|
|
85
|
+
* transaction rolls back, the reserved block is consumed and left as a gap.
|
|
86
|
+
*
|
|
87
|
+
* Optional: drivers without a counter (SQL with native `AUTO_INCREMENT` /
|
|
88
|
+
* `SERIAL`) do not implement this — callers must feature-detect it and fall
|
|
89
|
+
* back to per-row {@link generateNextId}.
|
|
90
|
+
*
|
|
91
|
+
* @param options - `GenerateIdOptions` plus the block `count` (`>= 1`)
|
|
92
|
+
* @returns The reserved ids in ascending order (length `count`)
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* // Reserve 100 ids in one atomic op for a bulk insert
|
|
97
|
+
* const ids = await idGenerator.generateNextIds({ table: "users", count: 100 });
|
|
98
|
+
* // ids[0] is the first, ids[99] the last; getLastId("users") === ids[99]
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
generateNextIds?(options: GenerateIdOptions & {
|
|
102
|
+
count: number;
|
|
103
|
+
}): Promise<number[]>;
|
|
66
104
|
/**
|
|
67
105
|
* Get the last generated ID for a table.
|
|
68
106
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-id-generator.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/contracts/database-id-generator.contract.ts"],"mappings":";;AAGA;;KAAY,iBAAA;EAAiB,gCAE3B,KAAA,UAEA;EAAA,SAAA,WAEa;EAAb,aAAA;AAAA
|
|
1
|
+
{"version":3,"file":"database-id-generator.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/contracts/database-id-generator.contract.ts"],"mappings":";;AAGA;;KAAY,iBAAA;EAAiB,gCAE3B,KAAA,UAEA;EAAA,SAAA,WAEa;EAAb,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyI6C;;;;UAvG9B,mBAAA;;;;;;;;;;;;;;;;;;;;;;;;EAwBf,cAAA,CAAe,OAAA,EAAS,iBAAA,GAAoB,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqC5C,eAAA,EAAiB,OAAA,EAAS,iBAAA;IAAsB,KAAA;EAAA,IAAkB,OAAA;;;;;;;;;;;;;;;EAgBlE,SAAA,CAAU,KAAA,WAAgB,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;EA0B1B,SAAA,CAAU,KAAA,UAAe,EAAA,WAAa,OAAA;AAAA"}
|
|
@@ -2,7 +2,7 @@ import { DriverBlueprintContract, TableIndexInformation } from "./driver-bluepri
|
|
|
2
2
|
import { ColumnDefinition, ColumnType, ForeignKeyDefinition, FullTextIndexOptions, GeoIndexOptions, IndexDefinition, MigrationDriverContract, MigrationDriverFactory, VectorIndexOptions } from "./migration-driver.contract.mjs";
|
|
3
3
|
import { ChunkCallback, CursorPaginationOptions, CursorPaginationResult, DriverQuery, GroupByInput, HavingInput, JoinOptions, OrderDirection, PaginationOptions, PaginationResult, QueryBuilderContract, RawExpression, WhereCallback, WhereObject, WhereOperator } from "./query-builder.contract.mjs";
|
|
4
4
|
import { SyncAdapterContract, SyncInstruction } from "./sync-adapter.contract.mjs";
|
|
5
|
-
import { CreateDatabaseOptions, DriverContract, DriverEvent, DriverEventListener, DriverTransactionContract, DropDatabaseOptions, InsertResult, TransactionContext, UpdateOperations, UpdateResult } from "./database-driver.contract.mjs";
|
|
5
|
+
import { CreateDatabaseOptions, DriverContract, DriverEvent, DriverEventListener, DriverTransactionContract, DropDatabaseOptions, InsertResult, RawQueryResult, TransactionContext, UpdateOperations, UpdateResult } from "./database-driver.contract.mjs";
|
|
6
6
|
import { GenerateIdOptions, IdGeneratorContract } from "./database-id-generator.contract.mjs";
|
|
7
7
|
import { RemoverContract, RemoverOptions, RemoverResult } from "./database-remover.contract.mjs";
|
|
8
8
|
import { RestorerContract, RestorerOptions, RestorerResult } from "./database-restorer.contract.mjs";
|
|
@@ -1360,6 +1360,33 @@ interface QueryBuilderContract<T = unknown> {
|
|
|
1360
1360
|
* ```
|
|
1361
1361
|
*/
|
|
1362
1362
|
groupBy(fields: GroupByInput, aggregates: Record<string, RawExpression>): this;
|
|
1363
|
+
/**
|
|
1364
|
+
* Portable date-bucketed GROUP BY.
|
|
1365
|
+
*
|
|
1366
|
+
* Buckets `column` to the given granularity and groups by the truncated
|
|
1367
|
+
* value, exposing the bucket under the column's own name in the result.
|
|
1368
|
+
* Optional `aggregates` follow the same rules as the two-arg {@link groupBy}
|
|
1369
|
+
* (`$agg.*` helpers or driver-native raw expressions).
|
|
1370
|
+
*
|
|
1371
|
+
* - **PostgreSQL**: `date_trunc('<unit>', "column")`
|
|
1372
|
+
* - **MongoDB**: `{ $dateTrunc: { date: "$column", unit } }` in the `$group` `_id`
|
|
1373
|
+
*
|
|
1374
|
+
* @param column - The date/timestamp column to bucket
|
|
1375
|
+
* @param unit - The bucket granularity (`day` / `week` / `month` / `year`)
|
|
1376
|
+
* @param aggregates - Optional aggregate projections keyed by output alias
|
|
1377
|
+
*
|
|
1378
|
+
* @example
|
|
1379
|
+
* ```typescript
|
|
1380
|
+
* import { $agg, $expr } from "@warlock.js/cascade";
|
|
1381
|
+
*
|
|
1382
|
+
* await Order.query()
|
|
1383
|
+
* .groupByDate("created_at", "month", {
|
|
1384
|
+
* revenue: $agg.sum($expr.mul("price", "quantity")),
|
|
1385
|
+
* })
|
|
1386
|
+
* .get();
|
|
1387
|
+
* ```
|
|
1388
|
+
*/
|
|
1389
|
+
groupByDate(column: string, unit: "day" | "week" | "month" | "year", aggregates?: Record<string, RawExpression>): this;
|
|
1363
1390
|
/**
|
|
1364
1391
|
* Apply raw grouping expressions.
|
|
1365
1392
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/contracts/query-builder.contract.ts"],"mappings":";;;;;KAGY,cAAA;AAAZ;;;AAAA,KAKY,WAAA;EALc,kCAOxB,KAAA,UAFqB;EAIrB,UAAA,WAcmB;EAZnB,QAAA,WAFA;EAIA,YAAA;EAEA,IAAA,kDAEA;EAAA,KAAA,WAEU;EAAV,OAAA,GAAU,MAAA,mBAIV;EAFA,MAAA,aAIA;EAFA,UAAA,GAAa,MAAM,mBAEX;EAAR,QAAA;AAAA;;;;KAMU,gBAAA;EACV,IAAA,EAAM,CAAC;EACP,UAAA;IACE,KAAA;IACA,IAAA;IACA,KAAA;IACA,KAAA;EAAA;AAAA;AAOJ;;;AAAA,KAAY,sBAAA;EACV,IAAA,EAAM,CAAC;EACP,UAAA;IACE,OAAA;IACA,OAAA;IACA,UAAA;IACA,UAAA;EAAA;AAAA;;AAAU;AAOd;KAAY,aAAA,OACV,IAAA,EAAM,CAAA,IACN,UAAA,aACG,OAAO;;;;KAKA,uBAAA;EACV,MAAA;EACA,SAAA;EACA,KAAA;EACA,MAAA;AAAA;AAJF;;;AAAA,KAUY,iBAAA;EACV,IAAA;EACA,KAAK;AAAA;;;AARC;KAcI,aAAA;AAAA,KAwBA,WAAA,GAAc,MAAM;;;;KAKpB,aAAA,OAAoB,OAAA,EAAS,oBAAoB,CAAC,CAAA;AAL9D;;;AAAA,KAUY,YAAA,uBAGR,MAAA,oBACA,KAAA,CAAM,MAAA;AAdsB;AAKhC;;AALgC,KAmBpB,WAAA,GACR,MAAA,qBACC,KAAA,UAAe,KAAA,cACf,KAAA,UAAe,QAAA,EAAU,aAAa,EAAE,KAAA;;;;KAKjC,aAAA,YAAyB,MAAM;;;AAtBqB;AAKhE;;;;;;;;;;;;AAIgB;AAKhB;KA2BY,WAAA;wDAEV,KAAA,WA5BE;EA8BF,QAAA,cA7BkB;EA+BlB,QAAA,cA9BkB;EAgClB,MAAA;AAAA;;AAhCgD;AAKlD;;;;AAA2C;UAqC1B,oBAAA;EAlBM;;;EAsBrB,KAAA;EAlBA;;;;EAuBA,OAAA,CAAQ,QAAA,GAAW,IAAA,OAAW,KAAA;EATf;;;;;EAgBf,UAAA,CAAW,QAAA,GAAW,KAAA,kBAAuB,OAAA;EAwBX;;;;;EAjBlC,WAAA,CAAY,QAAA,GAAW,OAAA,SAAgB,OAAA,iBAAwB,OAAA;EA6C1C;;;;;EAtCrB,SAAA,CAAU,QAAA,GAAW,OAAA,SAAgB,OAAA,iBAAwB,OAAA;EA8L/B;;;;EApL9B,mBAAA,GAAsB,GAAA,SAAY,qBAAA;EAqNK;;;;EA/MvC,oBAAA,GAAuB,GAAA,SAAY,kBAAA;EAoPG;;;EA/OtC,oBAAA,GAAuB,GAAA;EA8TN;;;EAzTjB,aAAA;EA4VqB;;;;;;EAhVrB,kBAAA,GAAqB,GAAA,qBAAwB,KAAA,EAAO,oBAAA;EA6WpB;;;;;;;;;;;EAhWhC,cAAA,GAAiB,GAAA;IAukBD,wFAnkBZ,QAAA,UA8kBkB;IA5kBlB,aAAA;EAAA;EA6nBwC;;;;EArnB5C,aAAA,GAAgB,GAAA;IAGZ,KAAA;IACA,IAAA;IACA,KAAA;IACA,QAAA;IACA,UAAA;IACA,QAAA;IACA,UAAA;IACA,YAAA;IACA,WAAA;IACA,MAAA;EAAA;EAo0Be;;;;EA5zBnB,mBAAA,GAAsB,MAAA;EAs9BN;;;EAj9BhB,UAAA;EAymC+C;;;;;;;;;;;;;;;;;;;;;;;;;EA9kC/C,QAAA,IAAY,SAAA;EAm4CS;;;;;;;;;;;;;;;EAl3CrB,kBAAA,IAAsB,UAAA;EAo8CZ;;;;;;;;;;;EAv7CV,mBAAA;EAkgD8C;;;;;;;;;;;;;;;;EAh/C9C,KAAA,CAAM,SAAA,aAAsB,IAAA;EAnLN;;;;;;;;;;;;;;;;EAyMtB,KAAA,CAAM,KAAA,UAAe,KAAA;EACrB,KAAA,CAAM,KAAA,UAAe,QAAA,EAAU,aAAA,EAAe,KAAA;EAC9C,KAAA,CAAM,UAAA,EAAY,WAAA;EAClB,KAAA,CAAM,QAAA,EAAU,aAAA,CAAc,CAAA;EAzKP;;;;;;;EAkLvB,QAAA,CAAS,UAAA,EAAY,aAAA,EAAe,QAAA;EAhJhC;;;;;;EAwJJ,UAAA,CAAW,UAAA,EAAY,aAAA,EAAe,QAAA;EAxIlC;;;;;;EAgJJ,WAAA,CAAY,KAAA,UAAe,QAAA,EAAU,aAAA,EAAe,MAAA;EAlIpD;;;;;;EA0IA,aAAA,CAAc,KAAA,UAAe,QAAA,EAAU,aAAA,EAAe,MAAA;EA5EtD;;;;;;;;;EAuFA,YAAA,CAAa,WAAA,EAAa,KAAA,EAAO,IAAA,UAAc,QAAA,EAAU,aAAA,EAAe,KAAA;EA9CnD;;;;;;EAsDrB,mBAAA,CAAoB,KAAA,UAAe,WAAA,UAAqB,WAAA;EApD1B;;;;;;EA4D9B,SAAA,CAAU,KAAA,UAAe,KAAA,EAAO,IAAA;EA3CT;;;EAgDvB,eAAA,CAAgB,KAAA,UAAe,KAAA,EAAO,IAAA;EAxC1B;;;EA6CZ,eAAA,CAAgB,KAAA,UAAe,KAAA,EAAO,IAAA;EArCtC;;;EA0CA,cAAA,CAAe,KAAA,UAAe,KAAA,EAAO,IAAA;EA1CiB;;;;;;EAkDtD,SAAA,CAAU,KAAA,UAAe,KAAA;EAvCZ;;;EA4Cb,QAAA,CAAS,KAAA,UAAe,KAAA;EApCgC;;;EAyCxD,UAAA,CAAW,KAAA,UAAe,KAAA;EAjCD;;;EAsCzB,SAAA,CAAU,KAAA,UAAe,KAAA;EAjCM;;;EAsC/B,iBAAA,CAAkB,IAAA,UAAc,KAAA;EAjCD;;;EAsC/B,sBAAA,CAAuB,IAAA,UAAc,KAAA;EAjCP;;;EAsC9B,oBAAA,CAAqB,IAAA;EAzBrB;;;;;;EAiCA,eAAA,CAAgB,IAAA,UAAc,QAAA,EAAU,aAAA,EAAe,KAAA;EAvB7C;;;EA4BV,gBAAA,CAAiB,IAAA;EAvBe;;;EA4BhC,iBAAA,CAAkB,IAAA;EAlBlB;;;;;;EA0BA,gBAAA,CAAiB,KAAA,UAAe,QAAA,EAAU,aAAA,EAAe,KAAA;EAbzD;;;EAkBA,OAAA,CAAQ,KAAA;EALR;;;EAUA,QAAA,CAAS,MAAA,EAAQ,KAAA;EAVwC;;;EAezD,SAAA,CAAU,KAAA;EALO;;;EAUjB,SAAA,CAAU,KAAA;EAAV;;;EAKA,aAAA,CAAc,MAAA,qBAA2B,KAAA;EAAA;;;EAKzC,eAAA,CAAgB,MAAA,qBAA2B,KAAA;EAK3C;;;EAAA,WAAA,CAAY,KAAA,UAAe,KAAA;EAKR;;;EAAnB,QAAA,CAAS,QAAA,EAAU,aAAA,CAAc,CAAA;EAKZ;;;EAArB,UAAA,CAAW,QAAA,EAAU,aAAA,CAAc,CAAA;EASb;;;;;;;EAAtB,WAAA,CAAY,QAAA,EAAU,aAAA,CAAc,CAAA;EAiB5B;;;;;;;EARR,cAAA,CAAe,QAAA,EAAU,aAAA,CAAc,CAAA;EAUnB;;;;;;EAFpB,OAAA,CAAQ,KAAA,UAAe,KAAA;EACvB,OAAA,CAAQ,KAAA,UAAe,QAAA,EAAU,aAAA,EAAe,KAAA;EAChD,OAAA,CAAQ,UAAA,EAAY,WAAA;EACpB,OAAA,CAAQ,QAAA,EAAU,aAAA,CAAc,CAAA;EAgBrB;;;;;;EARX,OAAA,CAAQ,KAAA,UAAe,MAAA;EAgCV;;;;;;EAxBb,UAAA,CAAW,KAAA,UAAe,MAAA;EAwCQ;;;;;;EAhClC,SAAA,CAAU,KAAA;EAgDqB;;;;;;EAxC/B,YAAA,CAAa,KAAA;EAgEb;;;;;;EAxDA,YAAA,CAAa,KAAA,UAAe,KAAA;EAgEI;;;;;;EAxDhC,eAAA,CAAgB,KAAA,UAAe,KAAA;EAwEnB;;;;;;EAhEZ,SAAA,CAAU,KAAA,UAAe,OAAA,EAAS,MAAA;EAqFxB;;;;;;EA7EV,YAAA,CAAa,KAAA,UAAe,OAAA;EAkG5B;;;;;;EA1FA,eAAA,CAAgB,KAAA,UAAe,KAAA;EAkGsB;;;;;;EA1FrD,kBAAA,CAAmB,KAAA,UAAe,KAAA;EA0GM;;;;;;EAlGxC,aAAA,CAAc,KAAA,UAAe,KAAA;EAgH7B;;;;;;EAxGA,gBAAA,CAAiB,KAAA,UAAe,KAAA;EAiHvB;;;;;;EAzGT,gBAAA,CAAiB,KAAA,UAAe,KAAA,GAAQ,IAAA,EAAM,IAAA;EA6H/B;;;;;;EArHf,mBAAA,CAAoB,KAAA,UAAe,KAAA,GAAQ,IAAA,EAAM,IAAA;EAkI3B;;;;;;EA1HtB,WAAA,CAAY,KAAA;EAuIZ;;;;;;EA/HA,cAAA,CAAe,KAAA;EAmJf;;;;;;;;;;EAvIA,SAAA,CAAU,KAAA,UAAe,IAAA;EACzB,SAAA,CAAU,KAAA,UAAe,QAAA,iCAAyC,IAAA;EAwJhE;;;;;;EAhJF,UAAA,CAAW,KAAA,UAAe,OAAA,GAAU,WAAA;EA4JlC;;;;;;;;;;;EA/IF,kBAAA,CAAmB,KAAA,UAAe,KAAA,WAAgB,GAAA;EA2KtB;;;;;;EAnK5B,qBAAA,CAAsB,KAAA,UAAe,KAAA,WAAgB,GAAA;EAgLxC;;;;;;EAxKb,oBAAA,CAAqB,KAAA,UAAe,KAAA,WAAgB,GAAA;EA4LpD;;;;;;EApLA,wBAAA,CAAyB,KAAA,UAAe,KAAA,WAAgB,GAAA;EA2MxD;;;;;;EA/LA,MAAA,CAAO,MAAA;EACP,MAAA,CAAO,MAAA,EAAQ,MAAA;EACf,MAAA,IAAU,MAAA,EAAQ,KAAA;EAClB,MAAA,IAAU,IAAA,EAAM,KAAA;EAgPF;;;;;;EAxOd,QAAA,CAAS,KAAA,UAAe,KAAA;EA+PN;;;;;;EAvPlB,SAAA,CAAU,UAAA,EAAY,aAAA,EAAe,QAAA;EA8QlB;;;;;;;;;EAnQnB,aAAA,CACE,WAAA,EAAa,KAAA;IACX,KAAA;IACA,UAAA,EAAY,aAAA;IACZ,QAAA;EAAA;EA4Sc;;;;;;EAlSlB,SAAA,CAAU,UAAA,EAAY,aAAA,EAAe,KAAA;EAoVF;;;EA/UnC,YAAA,CAAa,UAAA,EAAY,aAAA,EAAe,KAAA;EAmXhC;;;;;;EA3WR,eAAA,CACE,KAAA,UACA,SAAA,8DACA,KAAA;EAsZc;;;;;;EA7YhB,YAAA,CAAa,KAAA,UAAe,KAAA;EAgbf;;;;;;EAxab,WAAA,CAAY,KAAA,UAAe,KAAA;EAidzB;;;;;;;;;;;;;EAlcF,UAAA,CACE,KAAA,EAAO,KAAA;IAAQ,IAAA,EAAM,aAAA;IAAe,IAAA,EAAM,aAAA;EAAA,IAC1C,SAAA,EAAW,aAAA,YACX,KAAA;EAyhBF;;;;;;EAhhBA,UAAA,CACE,SAAA,EAAW,aAAA,EACX,SAAA,EAAW,aAAA,YACX,SAAA,EAAW,aAAA,YACX,KAAA;EA4iBF;;;;;;;;EAjiBA,sBAAA,CAAuB,QAAA,GAAW,UAAA,EAAY,MAAA;EA0iBlC;;;;;;EAliBZ,UAAA,CAAW,IAAA,UAAc,KAAA;EA4jBzB;;;;;;EApjBA,aAAA,CAAc,IAAA,UAAc,UAAA,EAAY,aAAA,EAAe,KAAA;EAykBjD;;;EApkBN,YAAA,CAAa,IAAA;EAolBN;;;;;;EA5kBP,YAAA,CAAa,MAAA,EAAQ,KAAA,UAAe,aAAA,GAAgB,KAAA;EAymBpC;;;;;;EAjmBhB,cAAA,CAAe,MAAA,EAAQ,KAAA,UAAe,aAAA,GAAgB,KAAA;EAsoBxB;;;;;;;;;;EA1nB9B,YAAA,CAAa,IAAA,EAAM,aAAA;EA2oBG;;;;;;EAnoBtB,QAAA,CAAS,MAAA;EA4oBC;;;EAvoBV,WAAA;EAwpBK;;;EAnpBL,SAAA;EA0qBA;;;EArqBA,aAAA;EAqqBkD;;;;;;;EA5pBlD,cAAA,CAAe,MAAA;EAurBb;;;;;;EA/qBF,SAAA,CAAU,MAAA;EA8rBV;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA5pBA,IAAA,CAAK,KAAA,UAAe,UAAA,UAAoB,YAAA;EACxC,IAAA,CAAK,OAAA,EAAS,WAAA;EAotBV;;;;;;;;;;;;;;;;;;;;EA9rBJ,QAAA,CAAS,KAAA,UAAe,UAAA,UAAoB,YAAA;EAC5C,QAAA,CAAS,OAAA,EAAS,WAAA;EAuvBlB;;;;;;;;;;;;;;;;;;;;EAjuBA,SAAA,CAAU,KAAA,UAAe,UAAA,UAAoB,YAAA;EAC7C,SAAA,CAAU,OAAA,EAAS,WAAA;EAkxByB;;;;;;;;;;;;;;;;;;;;EA5vB5C,SAAA,CAAU,KAAA,UAAe,UAAA,UAAoB,YAAA;EAC7C,SAAA,CAAU,OAAA,EAAS,WAAA;EA80BO;;;AAAmC;;;;;;;;;;;;;;;;EAzzB7D,QAAA,CAAS,KAAA,UAAe,UAAA,UAAoB,YAAA;EAC5C,QAAA,CAAS,OAAA,EAAS,WAAA;;;;;;;;;;;;;;;;;;;EAoBlB,SAAA,CAAU,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BV,OAAA,CAAQ,UAAA,EAAY,aAAA,EAAe,QAAA;;;;;;;;;;;;;;;;;;;;;;;EA4BnC,IAAA,CAAK,QAAA;;;;;;;EAQL,IAAA,IAAQ,SAAA;;;;;;;;;;;;;;;;;;;;;;EAuBR,IAAA,CAAK,QAAA,UAAkB,UAAA,GAAa,KAAA,EAAO,oBAAA;;;;;;;;;;;;;;;;;;;;;;EAuB3C,IAAA,CAAK,SAAA,EAAW,MAAA,qBAA2B,KAAA,EAAO,oBAAA;;;;;;;;;;;;;;;;;;;EAoBlD,SAAA,CAAU,QAAA;;;;;;;;;;;;;;EAeV,SAAA,IAAa,SAAA;;;;;;;;;;;EAYb,SAAA,CAAU,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BV,SAAA,CACE,SAAA,EAAW,MAAA,2BAAiC,KAAA,EAAO,oBAAA;;;;;;;;;;;;;EAerD,GAAA,CAAI,QAAA;;;;;;;;;;;;;;;;;;EAmBJ,GAAA,CAAI,QAAA,UAAkB,QAAA,UAAkB,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;EA0BxC,QAAA,CAAS,QAAA,UAAkB,QAAA,GAAW,KAAA,EAAO,oBAAA;;;;;;;;;;;;;;;EAgB7C,UAAA,CAAW,QAAA,UAAkB,QAAA,GAAW,KAAA,EAAO,oBAAA;;;;;;;;;;;;;EAc/C,UAAA,CAAW,QAAA;;;;;;;;;;;;;;;;;;EAmBX,eAAA,CAAgB,QAAA,UAAkB,QAAA,GAAW,KAAA,EAAO,oBAAA;;;;;;;;EAapD,OAAA,CAAQ,KAAA,UAAe,SAAA,GAAY,cAAA;EACnC,OAAA,CAAQ,MAAA,EAAQ,MAAA,SAAe,cAAA;;;;;;;EAQ/B,WAAA,CAAY,KAAA;;;;;;;EAQZ,UAAA,CAAW,UAAA,EAAY,aAAA,EAAe,QAAA;;;;;;;EAQtC,aAAA,CAAc,KAAA;;;;;;;;;EAUd,MAAA,CAAO,MAAA,YAAkB,OAAA,CAAQ,CAAA;;;;;;;;EASjC,MAAA,CAAO,MAAA;;;;;;;EAYP,KAAA,CAAM,KAAA;;;;;;;EAQN,IAAA,CAAK,KAAA;;;;;;;EAQL,MAAA,CAAO,KAAA;;;;;;;EAQP,IAAA,CAAK,KAAA;;;;;;;EAQL,MAAA,CAAO,KAAA,YAAiB,MAAA;;;;;;;;EAaxB,OAAA,CAAQ,MAAA,EAAQ,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqChB,OAAA,CAAQ,MAAA,EAAQ,YAAA,EAAc,UAAA,EAAY,MAAA,SAAe,aAAA;;;;;;;EAQzD,UAAA,CAAW,UAAA,EAAY,aAAA,EAAe,QAAA;;;;;;;EAQtC,MAAA,CAAO,KAAA,UAAe,KAAA;EACtB,MAAA,CAAO,KAAA,UAAe,QAAA,EAAU,aAAA,EAAe,KAAA;EAC/C,MAAA,CAAO,SAAA,EAAW,WAAA;;;;;;;EAQlB,SAAA,CAAU,UAAA,EAAY,aAAA,EAAe,QAAA;;;;;;;;;;;;EAiBrC,IAAA,CAAK,OAAA,EAAS,WAAA;;;;;;;;;;EAed,GAAA,CAAI,OAAA,GAAU,MAAA;;;;;;;EAQd,MAAA,IAAU,SAAA,aAAsB,IAAA,cAAkB,CAAA;;;;;;;;EASlD,KAAA;;;;;;;;EASA,GAAA,CAAI,QAAA,GAAW,OAAA;;;;;;;EAQf,IAAA,IACE,SAAA,EAAW,CAAA,8BACX,QAAA,GAAW,OAAA,QAAe,KAAA,EAAO,CAAA,WACjC,SAAA,IAAa,OAAA;;;;;;;EAaf,GAAA,UAAa,CAAA,KAAM,OAAA,CAAQ,MAAA;;;;;;;EAQ3B,KAAA,UAAe,CAAA,KAAM,OAAA,CAAQ,MAAA;;;;;;;;EAS7B,WAAA,UAAqB,CAAA,KAAM,OAAA,CAAQ,MAAA;;;;;;;EAQnC,IAAA,UAAc,CAAA,EAAG,KAAA,YAAiB,OAAA,CAAQ,MAAA;;;;;;;EAQ1C,KAAA,IAAS,OAAA;;;;;;;EAQT,GAAA,CAAI,KAAA,WAAgB,OAAA;;;;;;;EAQpB,GAAA,CAAI,KAAA,WAAgB,OAAA;;;;;;;EAQpB,GAAA,CAAI,KAAA,WAAgB,OAAA;;;;;;;EAQpB,GAAA,CAAI,KAAA,WAAgB,OAAA;;;;;;;;;EAUpB,QAAA,cAAsB,KAAA,WAAgB,OAAA,CAAQ,CAAA;;;;;;;EAQ9C,KAAA,CAAM,KAAA,WAAgB,OAAA;;;;;;;EAQtB,KAAA,cAAmB,KAAA,WAAgB,OAAA,CAAQ,CAAA;;;;;;;EAQ3C,MAAA,IAAU,OAAA;;;;;;;EAQV,SAAA,IAAa,OAAA;;;;;;;EAQb,aAAA,CAAc,KAAA,WAAgB,OAAA;;;;;;;;EAS9B,SAAA,CAAU,KAAA,UAAe,MAAA,YAAkB,OAAA;;;;;;;;EAS3C,SAAA,CAAU,KAAA,UAAe,MAAA,YAAkB,OAAA;;;;;;;EAQ3C,aAAA,CAAc,KAAA,UAAe,MAAA,YAAkB,OAAA;;;;;;;EAQ/C,aAAA,CAAc,KAAA,UAAe,MAAA,YAAkB,OAAA;;;;;;;;;;;EAgB/C,KAAA,CAAM,IAAA,UAAc,QAAA,EAAU,aAAA,CAAc,CAAA,IAAK,OAAA;;;;;;;;EASjD,QAAA,CAAS,OAAA,EAAS,iBAAA,GAAoB,OAAA,CAAQ,gBAAA,CAAiB,CAAA;;;;;;;;EAS/D,cAAA,CAAe,OAAA,EAAS,uBAAA,GAA0B,OAAA,CAAQ,sBAAA,CAAuB,CAAA;;;;;;;;;;;;;;;EAoBjF,KAAA,IAAS,WAAA;;;;;EAMT,MAAA;;;;;;;EAQA,OAAA,IAAW,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BX,SAAA,CAAU,MAAA,UAAgB,SAAA,YAAqB,KAAA;AAAA"}
|
|
1
|
+
{"version":3,"file":"query-builder.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/contracts/query-builder.contract.ts"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DeleteStrategy, MigrationDefaults, ModelDefaults, RelationDefaults } from "../types.mjs";
|
|
2
|
-
import { DriverContract } from "../contracts/database-driver.contract.mjs";
|
|
2
|
+
import { DriverContract, RawQueryResult } from "../contracts/database-driver.contract.mjs";
|
|
3
3
|
import { IdGeneratorContract } from "../contracts/database-id-generator.contract.mjs";
|
|
4
4
|
//#region ../@warlock.js/cascade/src/data-source/data-source.d.ts
|
|
5
5
|
/**
|
|
@@ -154,6 +154,26 @@ declare class DataSource {
|
|
|
154
154
|
* ```
|
|
155
155
|
*/
|
|
156
156
|
get idGenerator(): IdGeneratorContract | undefined;
|
|
157
|
+
/**
|
|
158
|
+
* Execute a raw query against this data source's driver.
|
|
159
|
+
*
|
|
160
|
+
* Thin passthrough to `driver.query`, so it is transaction-aware: inside a
|
|
161
|
+
* `transaction()` scope the query auto-joins the active transaction
|
|
162
|
+
* client/session.
|
|
163
|
+
*
|
|
164
|
+
* @typeParam T - The expected row shape.
|
|
165
|
+
* @param sql - Raw SQL string (driver dialect).
|
|
166
|
+
* @param params - Optional positional query parameters.
|
|
167
|
+
* @returns The driver's raw query result (`rows` + `rowCount`).
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```typescript
|
|
171
|
+
* const { rows } = await dataSource.raw<{ count: number }>(
|
|
172
|
+
* "SELECT COUNT(*)::int AS count FROM users",
|
|
173
|
+
* );
|
|
174
|
+
* ```
|
|
175
|
+
*/
|
|
176
|
+
raw<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<RawQueryResult<T>>;
|
|
157
177
|
}
|
|
158
178
|
//#endregion
|
|
159
179
|
export { DataSource, DataSourceOptions };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/data-source/data-source.ts"],"mappings":";;;;;;;KAMY,iBAAA;EAAA,+CAEV,IAAA;EAEA,MAAA,EAAQ,cAAA,EAagB;EAXxB,SAAA;EAiCgB;;;;;;;;;;EAtBhB,qBAAA,GAAwB,cAAA;EAYxB;;;;;;;;;;EAAA,iBAAA;EAuDO;AAAA;AA8BT;;;;;;EA3EE,aAAA,GAAgB,OAAA,CAAQ,aAAA;EA+FY;;;;;;;;EArFpC,iBAAA,GAAoB,iBAAA;
|
|
1
|
+
{"version":3,"file":"data-source.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/data-source/data-source.ts"],"mappings":";;;;;;;KAMY,iBAAA;EAAA,+CAEV,IAAA;EAEA,MAAA,EAAQ,cAAA,EAagB;EAXxB,SAAA;EAiCgB;;;;;;;;;;EAtBhB,qBAAA,GAAwB,cAAA;EAYxB;;;;;;;;;;EAAA,iBAAA;EAuDO;AAAA;AA8BT;;;;;;EA3EE,aAAA,GAAgB,OAAA,CAAQ,aAAA;EA+FY;;;;;;;;EArFpC,iBAAA,GAAoB,iBAAA;EAgKV;;;;;;;;;EArJV,gBAAA,GAAmB,gBAAA;EAuEqB;;;EAlExC,UAAA;IAwEmC;;;;;;;;;;;IA5DjC,aAAA;IAkIA;;;;;IA3HA,KAAA;EAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;cA8BS,UAAA;;WAEK,IAAA;;WAGA,MAAA,EAAQ,cAAA;;WAGR,SAAA;;WAGA,qBAAA,GAAwB,cAAA;;WAGxB,iBAAA;;WAGA,aAAA,GAAgB,OAAA,CAAQ,aAAA;;WAGxB,iBAAA,GAAoB,iBAAA;;WAGpB,gBAAA,GAAmB,gBAAA;;WAGnB,UAAA;IACd,aAAA;IACA,KAAA;EAAA;;;;;;cAQiB,OAAA,EAAS,iBAAA;;;;;;;;;;;;;;;;;MA4BjB,WAAA,IAAe,mBAAA;;;;;;;;;;;;;;;;;;;;EA4BnB,GAAA,KAAQ,MAAA,mBACb,GAAA,UACA,MAAA,eACC,OAAA,CAAQ,cAAA,CAAe,CAAA;AAAA"}
|
|
@@ -80,6 +80,28 @@ var DataSource = class {
|
|
|
80
80
|
const driver = this.driver;
|
|
81
81
|
if (typeof driver.getIdGenerator === "function") return driver.getIdGenerator();
|
|
82
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Execute a raw query against this data source's driver.
|
|
85
|
+
*
|
|
86
|
+
* Thin passthrough to `driver.query`, so it is transaction-aware: inside a
|
|
87
|
+
* `transaction()` scope the query auto-joins the active transaction
|
|
88
|
+
* client/session.
|
|
89
|
+
*
|
|
90
|
+
* @typeParam T - The expected row shape.
|
|
91
|
+
* @param sql - Raw SQL string (driver dialect).
|
|
92
|
+
* @param params - Optional positional query parameters.
|
|
93
|
+
* @returns The driver's raw query result (`rows` + `rowCount`).
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* const { rows } = await dataSource.raw<{ count: number }>(
|
|
98
|
+
* "SELECT COUNT(*)::int AS count FROM users",
|
|
99
|
+
* );
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
raw(sql, params) {
|
|
103
|
+
return this.driver.query(sql, params);
|
|
104
|
+
}
|
|
83
105
|
};
|
|
84
106
|
|
|
85
107
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.mjs","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/data-source/data-source.ts"],"sourcesContent":["import type { DriverContract, IdGeneratorContract } from \"../contracts\";\nimport type { DeleteStrategy, MigrationDefaults, ModelDefaults, RelationDefaults } from \"../types\";\n\n/**\n * Configuration options used when registering a data source.\n */\nexport type DataSourceOptions = {\n /** Unique name identifying the data source. */\n name: string;\n /** Driver bound to the data source. */\n driver: DriverContract;\n /** Whether this data source should be considered the default one. */\n isDefault?: boolean;\n /**\n * Default delete strategy for models using this data source.\n *\n * - MongoDB: Typically `\"trash\"` (uses RecycleBin collection)\n * - PostgreSQL: Typically `\"permanent\"` or `\"soft\"`\n *\n * Can be overridden by model static property or destroy() options.\n *\n * @default undefined (falls back to \"permanent\")\n */\n defaultDeleteStrategy?: DeleteStrategy;\n\n /**\n * Default trash table/collection name for \"trash\" delete strategy.\n *\n * - MongoDB: Typically `\"RecycleBin\"`\n * - If not set, defaults to `{table}Trash` pattern\n *\n * Can be overridden by Model.trashTable static property.\n *\n * @default undefined (uses {table}Trash pattern)\n */\n defaultTrashTable?: string;\n\n /**\n * Default model configuration for all models using this data source.\n *\n * These defaults override driver defaults but are overridden by\n * individual model static properties.\n *\n * @default undefined\n */\n modelDefaults?: Partial<ModelDefaults>;\n\n /**\n * Migration-level defaults (UUID strategy, etc.).\n *\n * These defaults override driver migration defaults but can be\n * overridden by individual migration calls.\n *\n * @default undefined (uses driver defaults)\n */\n migrationDefaults?: MigrationDefaults;\n\n /**\n * Default relation conventions (FK suffix, pivot-table naming order).\n *\n * Consumed by the runtime convention helpers in\n * `relations/key-conventions.ts` whenever a relation definition omits\n * an explicit `foreignKey` / `pivot` / pivot-column override.\n *\n * @default undefined (uses framework defaults)\n */\n relationDefaults?: RelationDefaults;\n\n /**\n * Migration configuration options.\n */\n migrations?: {\n /**\n * Whether to wrap migrations in database transactions.\n *\n * Overrides driver defaults:\n * - PostgreSQL default: `true` (DDL is transactional)\n * - MongoDB default: `false` (DDL cannot be transactional)\n *\n * Individual migrations can override this with their own `transactional` property.\n *\n * @default undefined (uses driver default)\n */\n transactional?: boolean;\n\n /**\n * Name of the migrations tracking table/collection.\n *\n * @default \"_migrations\"\n */\n table?: string;\n };\n};\n\n/**\n * Wrapper that couples a driver with its metadata.\n *\n * A data source represents a database connection with all its associated services.\n * The ID generator (if needed) is provided by the driver itself.\n *\n * @example\n * ```typescript\n * // MongoDB with auto ID generation\n * const mongoDriver = new MongoDbDriver({\n * host: \"localhost\",\n * port: 27017,\n * database: \"myapp\",\n * autoGenerateId: true, // Driver creates its own ID generator\n * });\n *\n * const dataSource = new DataSource({\n * name: \"primary\",\n * driver: mongoDriver,\n * isDefault: true,\n * });\n *\n * // Access ID generator from driver\n * const idGenerator = dataSource.idGenerator;\n * ```\n */\nexport class DataSource {\n /** Unique name identifying this data source. */\n public readonly name: string;\n\n /** Database driver for executing queries. */\n public readonly driver: DriverContract;\n\n /** Whether this is the default data source. */\n public readonly isDefault: boolean;\n\n /** Default delete strategy for models using this data source. */\n public readonly defaultDeleteStrategy?: DeleteStrategy;\n\n /** Default trash table/collection name for \"trash\" delete strategy. */\n public readonly defaultTrashTable?: string;\n\n /** Default model configuration for all models using this data source. */\n public readonly modelDefaults?: Partial<ModelDefaults>;\n\n /** Migration-level defaults (UUID strategy, etc.). */\n public readonly migrationDefaults?: MigrationDefaults;\n\n /** Default relation conventions (FK suffix, pivot ordering). */\n public readonly relationDefaults?: RelationDefaults;\n\n /** Migration configuration options. */\n public readonly migrations?: {\n transactional?: boolean;\n table?: string;\n };\n\n /**\n * Create a new data source.\n *\n * @param options - Configuration options\n */\n public constructor(options: DataSourceOptions) {\n this.name = options.name;\n this.driver = options.driver;\n this.isDefault = Boolean(options.isDefault);\n this.defaultDeleteStrategy = options.defaultDeleteStrategy;\n this.defaultTrashTable = options.defaultTrashTable;\n this.modelDefaults = options.modelDefaults;\n this.migrationDefaults = options.migrationDefaults;\n this.relationDefaults = options.relationDefaults;\n this.migrations = options.migrations;\n }\n\n /**\n * Get the ID generator from the driver (if available).\n *\n * NoSQL drivers like MongoDB can provide their own ID generator.\n * SQL drivers return undefined as they use native AUTO_INCREMENT.\n *\n * @returns The ID generator instance, or undefined\n *\n * @example\n * ```typescript\n * const idGenerator = dataSource.idGenerator;\n * if (idGenerator) {\n * const id = await idGenerator.generateNextId({ table: \"users\" });\n * }\n * ```\n */\n public get idGenerator(): IdGeneratorContract | undefined {\n // Check if driver has a getIdGenerator method (duck typing)\n const driver = this.driver as any;\n if (typeof driver.getIdGenerator === \"function\") {\n return driver.getIdGenerator();\n }\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAwHA,IAAa,aAAb,MAAwB;;CAEtB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;;;;;CAUhB,AAAO,YAAY,SAA4B;EAC7C,KAAK,OAAO,QAAQ;EACpB,KAAK,SAAS,QAAQ;EACtB,KAAK,YAAY,QAAQ,QAAQ,SAAS;EAC1C,KAAK,wBAAwB,QAAQ;EACrC,KAAK,oBAAoB,QAAQ;EACjC,KAAK,gBAAgB,QAAQ;EAC7B,KAAK,oBAAoB,QAAQ;EACjC,KAAK,mBAAmB,QAAQ;EAChC,KAAK,aAAa,QAAQ;CAC5B;;;;;;;;;;;;;;;;;CAkBA,IAAW,cAA+C;EAExD,MAAM,SAAS,KAAK;EACpB,IAAI,OAAO,OAAO,mBAAmB,YACnC,OAAO,OAAO,eAAe;CAGjC;AACF"}
|
|
1
|
+
{"version":3,"file":"data-source.mjs","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/data-source/data-source.ts"],"sourcesContent":["import type { DriverContract, IdGeneratorContract, RawQueryResult } from \"../contracts\";\nimport type { DeleteStrategy, MigrationDefaults, ModelDefaults, RelationDefaults } from \"../types\";\n\n/**\n * Configuration options used when registering a data source.\n */\nexport type DataSourceOptions = {\n /** Unique name identifying the data source. */\n name: string;\n /** Driver bound to the data source. */\n driver: DriverContract;\n /** Whether this data source should be considered the default one. */\n isDefault?: boolean;\n /**\n * Default delete strategy for models using this data source.\n *\n * - MongoDB: Typically `\"trash\"` (uses RecycleBin collection)\n * - PostgreSQL: Typically `\"permanent\"` or `\"soft\"`\n *\n * Can be overridden by model static property or destroy() options.\n *\n * @default undefined (falls back to \"permanent\")\n */\n defaultDeleteStrategy?: DeleteStrategy;\n\n /**\n * Default trash table/collection name for \"trash\" delete strategy.\n *\n * - MongoDB: Typically `\"RecycleBin\"`\n * - If not set, defaults to `{table}Trash` pattern\n *\n * Can be overridden by Model.trashTable static property.\n *\n * @default undefined (uses {table}Trash pattern)\n */\n defaultTrashTable?: string;\n\n /**\n * Default model configuration for all models using this data source.\n *\n * These defaults override driver defaults but are overridden by\n * individual model static properties.\n *\n * @default undefined\n */\n modelDefaults?: Partial<ModelDefaults>;\n\n /**\n * Migration-level defaults (UUID strategy, etc.).\n *\n * These defaults override driver migration defaults but can be\n * overridden by individual migration calls.\n *\n * @default undefined (uses driver defaults)\n */\n migrationDefaults?: MigrationDefaults;\n\n /**\n * Default relation conventions (FK suffix, pivot-table naming order).\n *\n * Consumed by the runtime convention helpers in\n * `relations/key-conventions.ts` whenever a relation definition omits\n * an explicit `foreignKey` / `pivot` / pivot-column override.\n *\n * @default undefined (uses framework defaults)\n */\n relationDefaults?: RelationDefaults;\n\n /**\n * Migration configuration options.\n */\n migrations?: {\n /**\n * Whether to wrap migrations in database transactions.\n *\n * Overrides driver defaults:\n * - PostgreSQL default: `true` (DDL is transactional)\n * - MongoDB default: `false` (DDL cannot be transactional)\n *\n * Individual migrations can override this with their own `transactional` property.\n *\n * @default undefined (uses driver default)\n */\n transactional?: boolean;\n\n /**\n * Name of the migrations tracking table/collection.\n *\n * @default \"_migrations\"\n */\n table?: string;\n };\n};\n\n/**\n * Wrapper that couples a driver with its metadata.\n *\n * A data source represents a database connection with all its associated services.\n * The ID generator (if needed) is provided by the driver itself.\n *\n * @example\n * ```typescript\n * // MongoDB with auto ID generation\n * const mongoDriver = new MongoDbDriver({\n * host: \"localhost\",\n * port: 27017,\n * database: \"myapp\",\n * autoGenerateId: true, // Driver creates its own ID generator\n * });\n *\n * const dataSource = new DataSource({\n * name: \"primary\",\n * driver: mongoDriver,\n * isDefault: true,\n * });\n *\n * // Access ID generator from driver\n * const idGenerator = dataSource.idGenerator;\n * ```\n */\nexport class DataSource {\n /** Unique name identifying this data source. */\n public readonly name: string;\n\n /** Database driver for executing queries. */\n public readonly driver: DriverContract;\n\n /** Whether this is the default data source. */\n public readonly isDefault: boolean;\n\n /** Default delete strategy for models using this data source. */\n public readonly defaultDeleteStrategy?: DeleteStrategy;\n\n /** Default trash table/collection name for \"trash\" delete strategy. */\n public readonly defaultTrashTable?: string;\n\n /** Default model configuration for all models using this data source. */\n public readonly modelDefaults?: Partial<ModelDefaults>;\n\n /** Migration-level defaults (UUID strategy, etc.). */\n public readonly migrationDefaults?: MigrationDefaults;\n\n /** Default relation conventions (FK suffix, pivot ordering). */\n public readonly relationDefaults?: RelationDefaults;\n\n /** Migration configuration options. */\n public readonly migrations?: {\n transactional?: boolean;\n table?: string;\n };\n\n /**\n * Create a new data source.\n *\n * @param options - Configuration options\n */\n public constructor(options: DataSourceOptions) {\n this.name = options.name;\n this.driver = options.driver;\n this.isDefault = Boolean(options.isDefault);\n this.defaultDeleteStrategy = options.defaultDeleteStrategy;\n this.defaultTrashTable = options.defaultTrashTable;\n this.modelDefaults = options.modelDefaults;\n this.migrationDefaults = options.migrationDefaults;\n this.relationDefaults = options.relationDefaults;\n this.migrations = options.migrations;\n }\n\n /**\n * Get the ID generator from the driver (if available).\n *\n * NoSQL drivers like MongoDB can provide their own ID generator.\n * SQL drivers return undefined as they use native AUTO_INCREMENT.\n *\n * @returns The ID generator instance, or undefined\n *\n * @example\n * ```typescript\n * const idGenerator = dataSource.idGenerator;\n * if (idGenerator) {\n * const id = await idGenerator.generateNextId({ table: \"users\" });\n * }\n * ```\n */\n public get idGenerator(): IdGeneratorContract | undefined {\n // Check if driver has a getIdGenerator method (duck typing)\n const driver = this.driver as any;\n if (typeof driver.getIdGenerator === \"function\") {\n return driver.getIdGenerator();\n }\n return undefined;\n }\n\n /**\n * Execute a raw query against this data source's driver.\n *\n * Thin passthrough to `driver.query`, so it is transaction-aware: inside a\n * `transaction()` scope the query auto-joins the active transaction\n * client/session.\n *\n * @typeParam T - The expected row shape.\n * @param sql - Raw SQL string (driver dialect).\n * @param params - Optional positional query parameters.\n * @returns The driver's raw query result (`rows` + `rowCount`).\n *\n * @example\n * ```typescript\n * const { rows } = await dataSource.raw<{ count: number }>(\n * \"SELECT COUNT(*)::int AS count FROM users\",\n * );\n * ```\n */\n public raw<T = Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n ): Promise<RawQueryResult<T>> {\n return this.driver.query<T>(sql, params);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAwHA,IAAa,aAAb,MAAwB;;CAEtB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;CAGhB,AAAgB;;;;;;CAUhB,AAAO,YAAY,SAA4B;EAC7C,KAAK,OAAO,QAAQ;EACpB,KAAK,SAAS,QAAQ;EACtB,KAAK,YAAY,QAAQ,QAAQ,SAAS;EAC1C,KAAK,wBAAwB,QAAQ;EACrC,KAAK,oBAAoB,QAAQ;EACjC,KAAK,gBAAgB,QAAQ;EAC7B,KAAK,oBAAoB,QAAQ;EACjC,KAAK,mBAAmB,QAAQ;EAChC,KAAK,aAAa,QAAQ;CAC5B;;;;;;;;;;;;;;;;;CAkBA,IAAW,cAA+C;EAExD,MAAM,SAAS,KAAK;EACpB,IAAI,OAAO,OAAO,mBAAmB,YACnC,OAAO,OAAO,eAAe;CAGjC;;;;;;;;;;;;;;;;;;;;CAqBA,AAAO,IACL,KACA,QAC4B;EAC5B,OAAO,KAAK,OAAO,MAAS,KAAK,MAAM;CACzC;AACF"}
|
|
@@ -5,7 +5,7 @@ import { DatabaseDirtyTracker } from "../../database-dirty-tracker.mjs";
|
|
|
5
5
|
import { SQLSerializer } from "../../migration/sql-serializer.mjs";
|
|
6
6
|
import { QueryBuilderContract } from "../../contracts/query-builder.contract.mjs";
|
|
7
7
|
import { SyncAdapterContract } from "../../contracts/sync-adapter.contract.mjs";
|
|
8
|
-
import { DriverContract, DriverEvent, DriverEventListener, DriverTransactionContract, InsertResult, TransactionContext, UpdateOperations, UpdateResult } from "../../contracts/database-driver.contract.mjs";
|
|
8
|
+
import { DriverContract, DriverEvent, DriverEventListener, DriverTransactionContract, InsertResult, RawQueryResult, TransactionContext, UpdateOperations, UpdateResult } from "../../contracts/database-driver.contract.mjs";
|
|
9
9
|
import { IdGeneratorContract } from "../../contracts/database-id-generator.contract.mjs";
|
|
10
10
|
import { MongoDriverOptions } from "./types.mjs";
|
|
11
11
|
import { ClientSession, Db, MongoClient, MongoClientOptions } from "mongodb";
|
|
@@ -278,7 +278,7 @@ declare class MongoDbDriver implements DriverContract {
|
|
|
278
278
|
* Execute a raw SQL query.
|
|
279
279
|
* Not supported for MongoDB.
|
|
280
280
|
*/
|
|
281
|
-
query<T = unknown
|
|
281
|
+
query<T = Record<string, unknown>>(_sql: string, _params?: unknown[]): Promise<RawQueryResult<T>>;
|
|
282
282
|
/**
|
|
283
283
|
* Create a new database.
|
|
284
284
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb-driver.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/cascade/src/drivers/mongodb/mongodb-driver.ts"],"mappings":";;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"mongodb-driver.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/cascade/src/drivers/mongodb/mongodb-driver.ts"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb-driver.mjs","names":[],"sources":["../../../../../../../../@warlock.js/cascade/src/drivers/mongodb/mongodb-driver.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\r\nimport { log } from \"@warlock.js/logger\";\r\nimport type {\r\n BulkWriteOptions,\r\n ClientSession,\r\n Db,\r\n DeleteOptions,\r\n FindOneAndDeleteOptions,\r\n FindOneAndUpdateOptions,\r\n InsertManyResult,\r\n InsertOneOptions,\r\n MongoClient,\r\n MongoClientOptions,\r\n TransactionOptions,\r\n UpdateFilter,\r\n UpdateOptions,\r\n} from \"mongodb\";\r\nimport { EventEmitter } from \"node:events\";\r\nimport { databaseTransactionContext } from \"../../context/database-transaction-context\";\r\nimport type {\r\n DriverBlueprintContract,\r\n DriverContract,\r\n DriverEvent,\r\n DriverEventListener,\r\n DriverTransactionContract,\r\n IdGeneratorContract,\r\n InsertResult,\r\n MigrationDriverContract,\r\n QueryBuilderContract,\r\n SyncAdapterContract,\r\n TransactionContext,\r\n UpdateOperations,\r\n UpdateResult,\r\n} from \"../../contracts\";\r\nimport { dataSourceRegistry } from \"../../data-source/data-source-registry\";\r\nimport { DatabaseDirtyTracker } from \"../../database-dirty-tracker\";\r\nimport { TransactionRollbackError } from \"../../errors/transaction-rollback.error\";\r\nimport { type SQLSerializer } from \"../../migration/sql-serializer\";\r\nimport type { ModelDefaults } from \"../../types\";\r\nimport { isValidDateValue } from \"../../utils/is-valid-date-value\";\r\nimport { MongoDBBlueprint } from \"./mongodb-blueprint\";\r\nimport { MongoIdGenerator } from \"./mongodb-id-generator\";\r\nimport { MongoMigrationDriver } from \"./mongodb-migration-driver\";\r\nimport { MongoQueryBuilder } from \"./mongodb-query-builder\";\r\nimport { MongoSyncAdapter } from \"./mongodb-sync-adapter\";\r\nimport type { MongoDriverOptions } from \"./types\";\r\n\r\nconst DEFAULT_TRANSACTION_OPTIONS: TransactionOptions = {\r\n readPreference: \"primary\",\r\n readConcern: { level: \"local\" },\r\n writeConcern: { w: \"majority\" },\r\n};\r\n\r\n// ============================================================\r\n// Lazy-loaded MongoDB SDK Types\r\n// ============================================================\r\n\r\n/**\r\n * Cached MongoDB module (loaded once, reused)\r\n */\r\nlet MongoDBClient: typeof import(\"mongodb\");\r\n\r\nlet ObjectId: typeof import(\"mongodb\").ObjectId;\r\n\r\nlet isModuleExists: boolean | null = null;\r\n\r\nlet loadingPromise: Promise<any>;\r\n\r\n/**\r\n * Installation instructions for MongoDB package\r\n */\r\nconst MONGODB_INSTALL_INSTRUCTIONS = `\r\nMongoDB driver requires the mongodb package.\r\nInstall it with:\r\n\r\n npm install mongodb\r\n\r\nOr with your preferred package manager:\r\n\r\n pnpm add mongodb\r\n yarn add mongodb\r\n`.trim();\r\n\r\n/**\r\n * Load MongoDB module\r\n */\r\nasync function loadMongoDB() {\r\n try {\r\n loadingPromise = import(\"mongodb\");\r\n MongoDBClient = await loadingPromise;\r\n ObjectId = MongoDBClient.ObjectId;\r\n isModuleExists = true;\r\n } catch {\r\n isModuleExists = false;\r\n }\r\n}\r\n\r\nloadMongoDB();\r\n\r\nexport function isMongoDBDriverLoaded() {\r\n return isModuleExists;\r\n}\r\n\r\nasync function assertModuleIsLoaded() {\r\n if (isModuleExists === false) {\r\n throw new Error(MONGODB_INSTALL_INSTRUCTIONS);\r\n }\r\n\r\n if (isModuleExists === null) {\r\n await loadingPromise;\r\n\r\n return await assertModuleIsLoaded();\r\n }\r\n}\r\n\r\n/**\r\n * MongoDB driver implementation that fulfils the Cascade driver contract.\r\n *\r\n * It encapsulates the native Mongo client, exposes lifecycle events, and\r\n * provides helpers for CRUD, transactions, atomic updates, and sync adapters.\r\n */\r\nexport class MongoDbDriver implements DriverContract {\r\n private readonly events = new EventEmitter();\r\n public client?: MongoClient;\r\n public database?: Db;\r\n private connected = false;\r\n private syncAdapterInstance?: MongoSyncAdapter;\r\n private migrationDriverInstance?: MigrationDriverContract;\r\n private readonly transactionOptions: TransactionOptions;\r\n private idGeneratorInstance?: IdGeneratorContract;\r\n private _blueprint?: DriverBlueprintContract;\r\n\r\n public get blueprint(): DriverBlueprintContract {\r\n if (!this._blueprint) {\r\n this._blueprint = new MongoDBBlueprint(this.database!);\r\n }\r\n\r\n return this._blueprint!;\r\n }\r\n\r\n /**\r\n * The name of this driver.\r\n */\r\n public readonly name = \"mongodb\";\r\n\r\n /**\r\n * Current database name\r\n */\r\n protected _databaseName?: string;\r\n\r\n /**\r\n * MongoDB driver model defaults.\r\n *\r\n * MongoDB follows NoSQL conventions:\r\n * - camelCase naming for fields (createdAt, updatedAt, deletedAt)\r\n * - Manual ID generation (auto-increment id field separate from _id)\r\n * - Timestamps enabled by default\r\n * - Trash delete strategy with per-collection trash tables\r\n */\r\n public readonly modelDefaults: Partial<ModelDefaults> = {\r\n namingConvention: \"camelCase\",\r\n createdAtColumn: \"createdAt\",\r\n updatedAtColumn: \"updatedAt\",\r\n deletedAtColumn: \"deletedAt\",\r\n timestamps: true,\r\n autoGenerateId: true, // MongoDB needs manual ID generation\r\n strictMode: \"strip\",\r\n deleteStrategy: \"trash\",\r\n trashTable: (table) => `${table}Trash`, // Per-collection trash (usersTrash, productsTrash)\r\n };\r\n\r\n /**\r\n * Create a new MongoDB driver using the supplied connection options.\r\n *\r\n * @param config - Connection configuration\r\n * @param driverOptions - Driver-specific options\r\n */\r\n public constructor(\r\n private readonly config: {\r\n database: string;\r\n uri?: string;\r\n host?: string;\r\n port?: number;\r\n username?: string;\r\n password?: string;\r\n authSource?: string;\r\n logging?: boolean;\r\n clientOptions?: MongoClientOptions;\r\n },\r\n private readonly driverOptions?: MongoDriverOptions,\r\n ) {\r\n this.transactionOptions = {\r\n ...DEFAULT_TRANSACTION_OPTIONS,\r\n ...driverOptions?.transactionOptions,\r\n };\r\n }\r\n\r\n /**\r\n * Get data base name\r\n */\r\n public get databaseName(): string | undefined {\r\n if (!this._databaseName) {\r\n this.resolveDatabaseName();\r\n }\r\n\r\n return this._databaseName;\r\n }\r\n\r\n /**\r\n * Resolve database name either from config or uri\r\n */\r\n private resolveDatabaseName() {\r\n if (this.config.database) {\r\n this._databaseName = this.config.database;\r\n } else if (this.config.uri) {\r\n this._databaseName = this.config.uri.split(\"/\").pop()?.split(\"?\")?.[0];\r\n }\r\n }\r\n\r\n /**\r\n * Indicates whether the driver currently maintains an active connection.\r\n */\r\n public get isConnected(): boolean {\r\n return this.connected;\r\n }\r\n\r\n /**\r\n * Get the MongoDB database instance.\r\n *\r\n * @returns The MongoDB Db instance\r\n * @throws {Error} If not connected\r\n *\r\n * @example\r\n * ```typescript\r\n * const db = driver.getDatabase();\r\n * const collection = db.collection(\"users\");\r\n * ```\r\n */\r\n public getDatabase(): Db {\r\n if (!this.database) {\r\n throw new Error(\r\n \"Database not available. Ensure the driver is connected before accessing the database.\",\r\n );\r\n }\r\n return this.database;\r\n }\r\n\r\n /**\r\n * Get the ID generator instance for this driver.\r\n *\r\n * Creates a MongoIdGenerator on first access if autoGenerateId is enabled.\r\n *\r\n * @returns The ID generator instance, or undefined if disabled\r\n *\r\n * @example\r\n * ```typescript\r\n * const idGenerator = driver.getIdGenerator();\r\n * if (idGenerator) {\r\n * const id = await idGenerator.generateNextId({ table: \"users\" });\r\n * }\r\n * ```\r\n */\r\n public getIdGenerator(): IdGeneratorContract | undefined {\r\n // Return undefined if ID generation is disabled\r\n if (this.driverOptions?.autoGenerateId === false) {\r\n return undefined;\r\n }\r\n\r\n // Create ID generator lazily on first access\r\n if (!this.idGeneratorInstance) {\r\n this.idGeneratorInstance = new MongoIdGenerator(this, this.driverOptions?.counterCollection);\r\n }\r\n\r\n return this.idGeneratorInstance;\r\n }\r\n\r\n /**\r\n * Establish a MongoDB connection using the configured options.\r\n * Throws if the connection attempt fails.\r\n */\r\n public async connect(): Promise<void> {\r\n if (this.connected) {\r\n return;\r\n }\r\n\r\n await assertModuleIsLoaded();\r\n\r\n const uri = this.resolveUri();\r\n\r\n const { MongoClient, ObjectId: ObjectIdMongoDB } = MongoDBClient;\r\n\r\n ObjectId = ObjectIdMongoDB;\r\n\r\n const client = new MongoClient(uri, this.buildClientOptions());\r\n\r\n try {\r\n log.info(\r\n \"database.mongodb\",\r\n \"connection\",\r\n `Connecting to database ${colors.bold(colors.yellowBright(this.databaseName))}`,\r\n );\r\n await client.connect();\r\n this.client = client;\r\n this.database = client.db(this.databaseName);\r\n\r\n this.connected = true;\r\n log.success(\"database.mongodb\", \"connection\", \"Connected to database\");\r\n\r\n client.on(\"close\", () => {\r\n if (this.connected) {\r\n this.connected = false;\r\n this.emit(\"disconnected\");\r\n log.warn(\"database.mongodb\", \"connection\", \"Disconnected from database\");\r\n }\r\n });\r\n\r\n if (this.config.logging) {\r\n const ignoredCommands = [\"isMaster\", \"hello\", \"ping\", \"saslStart\", \"saslContinue\"];\r\n\r\n client.on(\"commandStarted\", (event: any) => {\r\n if (ignoredCommands.includes(event.commandName)) return;\r\n\r\n let cmdStr = JSON.stringify(event.command);\r\n if (cmdStr.length > 300) {\r\n cmdStr = cmdStr.substring(0, 300) + \"...\";\r\n }\r\n\r\n log.info({\r\n module: \"database.mongodb\",\r\n action: \"query.executing\",\r\n message: `[${event.commandName}] ${cmdStr}`,\r\n context: { command: event.command },\r\n });\r\n });\r\n\r\n client.on(\"commandSucceeded\", (event: any) => {\r\n if (ignoredCommands.includes(event.commandName)) return;\r\n\r\n log.success({\r\n module: \"database.mongodb\",\r\n action: \"query.executed\",\r\n message: `[${event.duration.toFixed(2)}ms] [${event.commandName}]`,\r\n });\r\n });\r\n\r\n client.on(\"commandFailed\", (event: any) => {\r\n if (ignoredCommands.includes(event.commandName)) return;\r\n\r\n log.error({\r\n module: \"database.mongodb\",\r\n action: \"query.error\",\r\n message: `[${event.duration.toFixed(2)}ms] [${event.commandName}]`,\r\n context: { failure: event.failure },\r\n });\r\n });\r\n }\r\n\r\n this.emit(\"connected\");\r\n } catch (error: any) {\r\n await client.close().catch(() => undefined);\r\n this.emit(\"disconnected\");\r\n // Boot-time database connection failure is unrecoverable in every\r\n // realistic caller (app boot, CLI migrations, workers) — `fatal` makes\r\n // \"page on fatal only\" alerting clean. Per-query failures stay at error.\r\n log.fatal(\r\n \"database.mongodb\",\r\n \"connection\",\r\n `Failed to connect to database: ${error.message}`,\r\n );\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Close the underlying MongoDB connection.\r\n */\r\n public async disconnect(): Promise<void> {\r\n if (!this.client) {\r\n return;\r\n }\r\n\r\n try {\r\n await this.client.close();\r\n } finally {\r\n this.connected = false;\r\n this.emit(\"disconnected\");\r\n }\r\n }\r\n\r\n /**\r\n * Subscribe to driver lifecycle events.\r\n */\r\n public on(event: DriverEvent, listener: DriverEventListener): void {\r\n this.events.on(event, listener);\r\n }\r\n\r\n /**\r\n * Insert a single document into the given collection.\r\n */\r\n public async insert(\r\n table: string,\r\n document: Record<string, unknown>,\r\n options?: Record<string, unknown>,\r\n ): Promise<InsertResult> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<InsertOneOptions>(options);\r\n const result = await collection.insertOne(document, mongoOptions);\r\n\r\n return {\r\n document: {\r\n ...document,\r\n _id: result.insertedId,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Insert multiple documents into the given collection.\r\n */\r\n public async insertMany(\r\n table: string,\r\n documents: Record<string, unknown>[],\r\n options?: Record<string, unknown>,\r\n ): Promise<InsertResult[]> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<BulkWriteOptions>(options);\r\n const result: InsertManyResult<Record<string, unknown>> = await collection.insertMany(\r\n documents,\r\n mongoOptions,\r\n );\r\n\r\n return documents.map((document, index) => {\r\n const insertedId = result.insertedIds[index as unknown as keyof typeof result.insertedIds];\r\n\r\n return {\r\n document: {\r\n ...document,\r\n _id: insertedId,\r\n },\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Update a single document that matches the provided filter.\r\n */\r\n public async update(\r\n table: string,\r\n filter: Record<string, unknown>,\r\n update: Record<string, unknown>,\r\n options?: Record<string, unknown>,\r\n ): Promise<UpdateResult> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<UpdateOptions>(options);\r\n const result = await collection.updateOne(\r\n filter,\r\n update as UpdateFilter<Record<string, unknown>>,\r\n mongoOptions,\r\n );\r\n\r\n return { modifiedCount: result.modifiedCount };\r\n }\r\n\r\n /**\r\n * Replace a single document that matches the provided filter.\r\n */\r\n public async replace<T = unknown>(\r\n table: string,\r\n filter: Record<string, unknown>,\r\n document: Record<string, unknown>,\r\n options?: Record<string, unknown>,\r\n ): Promise<T | null> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const result = await collection.findOneAndReplace(filter, document as Record<string, unknown>);\r\n\r\n return result?.value as T | null;\r\n }\r\n\r\n /**\r\n * Find one and update a single document that matches the provided filter and return the updated document\r\n */\r\n public async findOneAndUpdate<T = unknown>(\r\n table: string,\r\n filter: Record<string, unknown>,\r\n update: UpdateOperations,\r\n options?: Record<string, unknown>,\r\n ): Promise<T | null> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<FindOneAndUpdateOptions>(options);\r\n const result = await collection.findOneAndUpdate(filter, update as Record<string, unknown>, {\r\n returnDocument: \"after\",\r\n ...mongoOptions,\r\n });\r\n\r\n return result as T | null;\r\n }\r\n\r\n /**\r\n * Upsert (insert or update) a single document.\r\n *\r\n * Uses MongoDB's findOneAndUpdate with upsert option.\r\n *\r\n * @param table - Target collection name\r\n * @param filter - Filter conditions to find existing document\r\n * @param document - Document data to insert or update\r\n * @param options - Optional upsert options\r\n * @returns The upserted document\r\n */\r\n public async upsert<T = unknown>(\r\n table: string,\r\n filter: Record<string, unknown>,\r\n document: Record<string, unknown>,\r\n options?: Record<string, unknown>,\r\n ): Promise<T> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<FindOneAndUpdateOptions>(options);\r\n\r\n // Use $set to update all fields from document\r\n const update = { $set: document };\r\n\r\n const result = await collection.findOneAndUpdate(filter, update, {\r\n upsert: true,\r\n returnDocument: \"after\",\r\n ...mongoOptions,\r\n });\r\n\r\n return result as T;\r\n }\r\n\r\n /**\r\n * Find one and delete a single document that matches the provided filter and return the deleted document.\r\n *\r\n * @param table - Target collection name\r\n * @param filter - Filter conditions\r\n * @param options - Optional delete options\r\n * @returns The deleted document or null if not found\r\n */\r\n public async findOneAndDelete<T = unknown>(\r\n table: string,\r\n filter: Record<string, unknown>,\r\n options?: Record<string, unknown>,\r\n ): Promise<T | null> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<FindOneAndDeleteOptions>(options);\r\n\r\n const result = await collection.findOneAndDelete(filter, mongoOptions || {});\r\n\r\n return result as T | null;\r\n }\r\n\r\n /**\r\n * Update multiple documents that match the provided filter.\r\n */\r\n public async updateMany(\r\n table: string,\r\n filter: Record<string, unknown>,\r\n update: UpdateOperations,\r\n options?: Record<string, unknown>,\r\n ): Promise<UpdateResult> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<UpdateOptions>(options);\r\n const result = await collection.updateMany(\r\n filter,\r\n update as UpdateFilter<Record<string, unknown>>,\r\n mongoOptions,\r\n );\r\n\r\n return { modifiedCount: result.modifiedCount };\r\n }\r\n\r\n /**\r\n * Delete a single document that matches the provided filter.\r\n */\r\n public async delete(\r\n table: string,\r\n filter: Record<string, unknown> = {},\r\n options?: Record<string, unknown>,\r\n ): Promise<number> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<DeleteOptions>(options);\r\n const result = await collection.deleteOne(filter, mongoOptions);\r\n\r\n return result.deletedCount > 0 ? 1 : 0;\r\n }\r\n\r\n /**\r\n * Delete documents that match the provided filter.\r\n */\r\n public async deleteMany(\r\n table: string,\r\n filter: Record<string, unknown> = {},\r\n options?: Record<string, unknown>,\r\n ): Promise<number> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<DeleteOptions>(options);\r\n\r\n const result = await collection.deleteMany(filter, mongoOptions);\r\n\r\n return result.deletedCount ?? 0;\r\n }\r\n\r\n /**\r\n * Remove all records from a collection.\r\n *\r\n * This uses deleteMany with an empty filter to remove all documents.\r\n * For very large collections, consider using the migration driver's\r\n * dropTable + createTable approach for better performance.\r\n */\r\n public async truncateTable(table: string, options?: Record<string, unknown>): Promise<number> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<DeleteOptions>(options);\r\n const result = await collection.deleteMany({}, mongoOptions);\r\n\r\n return result.deletedCount ?? 0;\r\n }\r\n\r\n /**\r\n * Serialize the given data\r\n */\r\n public serialize(data: Record<string, unknown>): Record<string, unknown> {\r\n const serialized: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(data)) {\r\n if (value === undefined) {\r\n continue; // Skip undefined values\r\n }\r\n\r\n if (value instanceof ObjectId) {\r\n serialized[key] = value.toString();\r\n } else if (value instanceof Date) {\r\n serialized[key] = value.toISOString();\r\n } else if (typeof value === \"bigint\") {\r\n serialized[key] = value.toString();\r\n } else if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\r\n // Nested objects will be stored as JSONB\r\n serialized[key] = value;\r\n } else {\r\n serialized[key] = value;\r\n }\r\n }\r\n\r\n return serialized;\r\n }\r\n\r\n /**\r\n * Get the dirty tracker for this driver.\r\n */\r\n public getDirtyTracker(data: Record<string, unknown>): DatabaseDirtyTracker {\r\n return new DatabaseDirtyTracker(data);\r\n }\r\n\r\n /**\r\n * Deserialize the given data\r\n */\r\n public deserialize(data: Record<string, unknown>): Record<string, unknown> {\r\n if (data._id && typeof data._id === \"string\") {\r\n data._id = new ObjectId(data._id);\r\n }\r\n\r\n for (const [key, value] of Object.entries(data)) {\r\n // Only re-inflate strings — Mongo driver already returns Date objects from DB reads\r\n if (typeof value === \"string\" && isValidDateValue(value)) {\r\n data[key] = new Date(value);\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Provide a Mongo-backed query builder instance for the given collection.\r\n */\r\n public queryBuilder<T = unknown>(table: string): QueryBuilderContract<T> {\r\n return new MongoQueryBuilder(table, dataSourceRegistry.get());\r\n }\r\n\r\n /**\r\n * Begin a MongoDB transaction, returning commit/rollback helpers.\r\n */\r\n public async beginTransaction(): Promise<DriverTransactionContract<ClientSession>> {\r\n const client = this.getClientInstance();\r\n const session = client.startSession();\r\n\r\n await session.startTransaction(this.transactionOptions);\r\n databaseTransactionContext.enter({ session });\r\n let finished = false;\r\n\r\n const finalize = async (operation: () => Promise<void>): Promise<void> => {\r\n if (finished) return;\r\n\r\n try {\r\n await operation();\r\n } finally {\r\n finished = true;\r\n databaseTransactionContext.exit();\r\n await session.endSession().catch(() => undefined);\r\n }\r\n };\r\n\r\n return {\r\n context: session,\r\n commit: async () => {\r\n await finalize(async () => {\r\n try {\r\n await session.commitTransaction();\r\n } catch (error) {\r\n await session.abortTransaction().catch(() => undefined);\r\n throw error;\r\n }\r\n });\r\n },\r\n rollback: async () => {\r\n await finalize(async () => {\r\n await session.abortTransaction();\r\n });\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Execute a function within a transaction scope (recommended pattern).\r\n *\r\n * Automatically commits on success, rolls back on any error, and guarantees\r\n * resource cleanup. This is the recommended way to use transactions.\r\n *\r\n * **MongoDB Requirements:**\r\n * - Requires MongoDB 4.0+ with replica set or sharded cluster\r\n * - Standalone MongoDB instances do not support transactions\r\n *\r\n * @param fn - Async function to execute within transaction\r\n * @param options - Transaction options (read preference, write concern, etc.)\r\n * @returns The return value of the callback function\r\n * @throws {Error} If transaction fails, is explicitly rolled back, or replica set not configured\r\n */\r\n public async transaction<T>(\r\n fn: (ctx: TransactionContext) => Promise<T>,\r\n options?: Record<string, unknown>,\r\n ): Promise<T> {\r\n // Prevent nested transaction() calls\r\n if (databaseTransactionContext.hasActiveTransaction()) {\r\n throw new Error(\r\n \"Nested transaction() calls are not supported. \" +\r\n \"Use beginTransaction() with savepoints for advanced transaction patterns.\",\r\n );\r\n }\r\n\r\n // Check if MongoDB is running as a replica set (required for transactions)\r\n await this.ensureReplicaSetAvailable();\r\n\r\n const client = this.getClientInstance();\r\n const session = client.startSession();\r\n\r\n try {\r\n await session.startTransaction({\r\n ...this.transactionOptions,\r\n ...(options as TransactionOptions),\r\n });\r\n\r\n // Set transaction context for queries within callback\r\n databaseTransactionContext.enter({ session });\r\n\r\n try {\r\n // Create transaction context with rollback method\r\n const ctx: TransactionContext = {\r\n rollback(reason?: string): never {\r\n throw new TransactionRollbackError(reason);\r\n },\r\n };\r\n\r\n // Execute callback\r\n const result = await fn(ctx);\r\n\r\n // Auto-commit on success\r\n await session.commitTransaction();\r\n\r\n return result;\r\n } catch (error) {\r\n // Auto-rollback on any error (including explicit rollback)\r\n await session.abortTransaction().catch(() => undefined);\r\n throw error;\r\n } finally {\r\n // Guaranteed context cleanup\r\n databaseTransactionContext.exit();\r\n }\r\n } finally {\r\n // Guaranteed session cleanup\r\n await session.endSession().catch(() => undefined);\r\n }\r\n }\r\n\r\n /**\r\n * Execute atomic operations (typically $inc/$set style updates) against documents.\r\n *\r\n * Uses `updateMany` so callers can atomically modify any set of documents.\r\n */\r\n public async atomic(\r\n table: string,\r\n filter: Record<string, unknown>,\r\n operations: Record<string, unknown>,\r\n options?: Record<string, unknown>,\r\n ): Promise<UpdateResult> {\r\n const collection = this.getDatabaseInstance().collection(table);\r\n const mongoOptions = this.withSession<UpdateOptions>(options);\r\n const result = await collection.updateMany(\r\n filter,\r\n operations as UpdateFilter<Record<string, unknown>>,\r\n mongoOptions,\r\n );\r\n\r\n return { modifiedCount: result.modifiedCount };\r\n }\r\n\r\n /**\r\n * Lazily create (and cache) the Mongo sync adapter.\r\n * The adapter uses this driver instance to ensure all operations\r\n * participate in active transactions via the session context.\r\n */\r\n public syncAdapter(): SyncAdapterContract {\r\n if (!this.syncAdapterInstance) {\r\n this.syncAdapterInstance = new MongoSyncAdapter(this);\r\n }\r\n\r\n return this.syncAdapterInstance;\r\n }\r\n\r\n /**\r\n * Lazily create (and cache) the Mongo migration driver.\r\n * The migration driver handles schema operations like indexes, collections, etc.\r\n */\r\n public migrationDriver(): MigrationDriverContract {\r\n if (!this.migrationDriverInstance) {\r\n this.migrationDriverInstance = new MongoMigrationDriver(this);\r\n }\r\n\r\n return this.migrationDriverInstance!;\r\n }\r\n\r\n /**\r\n * Expose the underlying Mongo client for advanced consumers.\r\n */\r\n public getClient<Client = MongoClient>(): Client {\r\n return this.getClientInstance() as Client;\r\n }\r\n\r\n /**\r\n * Retrieve the active Mongo client, throwing if the driver is disconnected.\r\n */\r\n private getClientInstance(): MongoClient {\r\n if (!this.client) {\r\n throw new Error(\"Mongo driver is not connected.\");\r\n }\r\n\r\n return this.client;\r\n }\r\n\r\n /**\r\n * Retrieve the active Mongo database, throwing if the driver is disconnected.\r\n * @private\r\n */\r\n private getDatabaseInstance(): Db {\r\n if (!this.database) {\r\n throw new Error(\"Mongo driver is not connected to a database.\");\r\n }\r\n\r\n return this.database;\r\n }\r\n\r\n /**\r\n * Resolve the Mongo connection string based on provided options.\r\n */\r\n private resolveUri(): string {\r\n if (this.config.uri) {\r\n return this.config.uri;\r\n }\r\n\r\n const host = this.config.host ?? \"localhost\";\r\n const port = this.config.port ?? 27017;\r\n\r\n return `mongodb://${host}:${port}`;\r\n }\r\n\r\n /**\r\n * Build the Mongo client options derived from the driver configuration.\r\n */\r\n private buildClientOptions(): MongoClientOptions {\r\n const baseOptions: MongoClientOptions = {\r\n ...(this.config.clientOptions ?? {}),\r\n };\r\n\r\n if (this.config.logging) {\r\n baseOptions.monitorCommands = true;\r\n }\r\n\r\n if (this.config.username && !baseOptions.auth) {\r\n baseOptions.auth = {\r\n username: this.config.username,\r\n password: this.config.password,\r\n };\r\n }\r\n\r\n if (this.config.authSource && !baseOptions.authSource) {\r\n baseOptions.authSource = this.config.authSource;\r\n }\r\n\r\n return baseOptions;\r\n }\r\n\r\n /**\r\n * Emit a driver lifecycle event.\r\n */\r\n private emit(event: DriverEvent, ...args: unknown[]): void {\r\n this.events.emit(event, ...args);\r\n }\r\n\r\n /**\r\n * Ensure MongoDB is running as a replica set (required for transactions).\r\n *\r\n * @throws {Error} If MongoDB is running as a standalone instance\r\n */\r\n private async ensureReplicaSetAvailable(): Promise<void> {\r\n try {\r\n const admin = this.database!.admin();\r\n const status = await admin.serverStatus();\r\n\r\n if (!status.repl) {\r\n throw new Error(\r\n \"MongoDB transactions require a replica set or sharded cluster. \" +\r\n \"Standalone MongoDB instances do not support transactions.\\n\\n\" +\r\n \"For local development:\\n\" +\r\n \" - Run MongoDB with --replSet flag: mongod --replSet rs0\\n\" +\r\n \" - Or use Docker with replica set configuration\\n\" +\r\n \" - Or use MongoDB Atlas (cloud) which provides replica sets by default\",\r\n );\r\n }\r\n } catch (error: any) {\r\n if (error.message?.includes(\"replica set\")) {\r\n throw error;\r\n }\r\n throw new Error(`Failed to check MongoDB replica set status: ${error.message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Attach the active transaction session (when available) to Mongo options.\r\n */\r\n private withSession<TOptions extends { session?: ClientSession }>(\r\n options?: Record<string, unknown>,\r\n ): TOptions | undefined {\r\n const session = databaseTransactionContext.getSession<ClientSession>();\r\n\r\n if (!session) {\r\n return options as TOptions | undefined;\r\n }\r\n\r\n const baseOptions = options ? ({ ...options } as TOptions) : ({} as TOptions);\r\n\r\n baseOptions.session = session;\r\n\r\n return baseOptions;\r\n }\r\n\r\n // ============================================================\r\n // SQL Compatibility Operations (Not supported in MongoDB)\r\n // ============================================================\r\n\r\n /**\r\n * Return a SQL serializer for this driver's dialect.\r\n * Not supported for MongoDB.\r\n */\r\n public getSQLSerializer(): SQLSerializer {\r\n throw new Error(\"MongoDB driver does not support SQL serialization.\");\r\n }\r\n\r\n /**\r\n * Execute a raw SQL query.\r\n * Not supported for MongoDB.\r\n */\r\n public async query<T = unknown>(_sql: string, _params?: unknown[]): Promise<any> {\r\n throw new Error(\"MongoDB driver does not support raw SQL queries.\");\r\n }\r\n\r\n // ============================================================\r\n // Database Lifecycle Operations\r\n // ============================================================\r\n\r\n /**\r\n * Create a new database.\r\n *\r\n * In MongoDB, databases are created automatically when data is first written.\r\n * This method creates an empty collection to ensure the database exists.\r\n *\r\n * @param name - Database name to create\r\n * @returns true if created, false if already exists\r\n */\r\n public async createDatabase(name: string): Promise<boolean> {\r\n const client = this.getClientInstance();\r\n\r\n // Check if database already exists\r\n if (await this.databaseExists(name)) {\r\n return false;\r\n }\r\n\r\n try {\r\n // MongoDB creates databases on first write, so create a system collection\r\n const db = client.db(name);\r\n await db.createCollection(\"__init__\");\r\n // Drop the temp collection\r\n await db.collection(\"__init__\").drop();\r\n\r\n log.success(\"database\", \"lifecycle\", `Created database ${name}`);\r\n return true;\r\n } catch (error) {\r\n log.error(\"database\", \"lifecycle\", `Failed to create database ${name}: ${error}`);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Drop a database.\r\n *\r\n * @param name - Database name to drop\r\n * @returns true if dropped, false if didn't exist\r\n */\r\n public async dropDatabase(name: string): Promise<boolean> {\r\n const client = this.getClientInstance();\r\n\r\n // Check if database exists\r\n if (!(await this.databaseExists(name))) {\r\n return false;\r\n }\r\n\r\n try {\r\n await client.db(name).dropDatabase();\r\n log.success(\"database\", \"lifecycle\", `Dropped database ${name}`);\r\n return true;\r\n } catch (error) {\r\n log.error(\"database\", \"lifecycle\", `Failed to drop database ${name}: ${error}`);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Check if a database exists.\r\n *\r\n * @param name - Database name to check\r\n * @returns true if database exists\r\n */\r\n public async databaseExists(name: string): Promise<boolean> {\r\n const client = this.getClientInstance();\r\n\r\n const result = await client.db(\"admin\").admin().listDatabases();\r\n return result.databases.some((db) => db.name === name);\r\n }\r\n\r\n /**\r\n * List all databases.\r\n *\r\n * @returns Array of database names\r\n */\r\n public async listDatabases(): Promise<string[]> {\r\n const client = this.getClientInstance();\r\n\r\n const result = await client.db(\"admin\").admin().listDatabases();\r\n return result.databases\r\n .map((db) => db.name)\r\n .filter((name) => ![\"admin\", \"local\", \"config\"].includes(name));\r\n }\r\n\r\n // ============================================================\r\n // Table/Collection Management Operations\r\n // ============================================================\r\n\r\n /**\r\n * Drop a collection.\r\n *\r\n * @param name - Collection name to drop\r\n * @throws Error if collection doesn't exist\r\n */\r\n public async dropTable(name: string): Promise<void> {\r\n const db = this.getDatabaseInstance();\r\n await db.collection(name).drop();\r\n log.success(\"database\", \"collection\", `Dropped collection ${name}`);\r\n }\r\n\r\n /**\r\n * Drop a collection if it exists.\r\n *\r\n * @param name - Collection name to drop\r\n */\r\n public async dropTableIfExists(name: string): Promise<void> {\r\n if (await this.blueprint.tableExists(name)) {\r\n await this.dropTable(name);\r\n }\r\n }\r\n\r\n /**\r\n * Drop all collections in the current database.\r\n *\r\n * Useful for `migrate:fresh` command.\r\n */\r\n public async dropAllTables(): Promise<void> {\r\n const collections = await this.blueprint.listTables();\r\n\r\n if (collections.length === 0) {\r\n return;\r\n }\r\n\r\n const db = this.getDatabaseInstance();\r\n\r\n for (const collection of collections) {\r\n await db.collection(collection).drop();\r\n }\r\n\r\n log.success(\"database\", \"collection\", `Dropped ${collections.length} collections`);\r\n }\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mongodb-driver.mjs","names":[],"sources":["../../../../../../../../@warlock.js/cascade/src/drivers/mongodb/mongodb-driver.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport { log } from \"@warlock.js/logger\";\nimport type {\n BulkWriteOptions,\n ClientSession,\n Db,\n DeleteOptions,\n FindOneAndDeleteOptions,\n FindOneAndUpdateOptions,\n InsertManyResult,\n InsertOneOptions,\n MongoClient,\n MongoClientOptions,\n TransactionOptions,\n UpdateFilter,\n UpdateOptions,\n} from \"mongodb\";\nimport { EventEmitter } from \"node:events\";\nimport { databaseTransactionContext } from \"../../context/database-transaction-context\";\nimport type {\n DriverBlueprintContract,\n DriverContract,\n DriverEvent,\n DriverEventListener,\n DriverTransactionContract,\n IdGeneratorContract,\n InsertResult,\n MigrationDriverContract,\n QueryBuilderContract,\n RawQueryResult,\n SyncAdapterContract,\n TransactionContext,\n UpdateOperations,\n UpdateResult,\n} from \"../../contracts\";\nimport { dataSourceRegistry } from \"../../data-source/data-source-registry\";\nimport { DatabaseDirtyTracker } from \"../../database-dirty-tracker\";\nimport { TransactionRollbackError } from \"../../errors/transaction-rollback.error\";\nimport { type SQLSerializer } from \"../../migration/sql-serializer\";\nimport type { ModelDefaults } from \"../../types\";\nimport { isValidDateValue } from \"../../utils/is-valid-date-value\";\nimport { MongoDBBlueprint } from \"./mongodb-blueprint\";\nimport { MongoIdGenerator } from \"./mongodb-id-generator\";\nimport { MongoMigrationDriver } from \"./mongodb-migration-driver\";\nimport { MongoQueryBuilder } from \"./mongodb-query-builder\";\nimport { MongoSyncAdapter } from \"./mongodb-sync-adapter\";\nimport type { MongoDriverOptions } from \"./types\";\n\nconst DEFAULT_TRANSACTION_OPTIONS: TransactionOptions = {\n readPreference: \"primary\",\n readConcern: { level: \"local\" },\n writeConcern: { w: \"majority\" },\n};\n\n// ============================================================\n// Lazy-loaded MongoDB SDK Types\n// ============================================================\n\n/**\n * Cached MongoDB module (loaded once, reused)\n */\nlet MongoDBClient: typeof import(\"mongodb\");\n\nlet ObjectId: typeof import(\"mongodb\").ObjectId;\n\nlet isModuleExists: boolean | null = null;\n\nlet loadingPromise: Promise<any>;\n\n/**\n * Installation instructions for MongoDB package\n */\nconst MONGODB_INSTALL_INSTRUCTIONS = `\nMongoDB driver requires the mongodb package.\nInstall it with:\n\n npm install mongodb\n\nOr with your preferred package manager:\n\n pnpm add mongodb\n yarn add mongodb\n`.trim();\n\n/**\n * Load MongoDB module\n */\nasync function loadMongoDB() {\n try {\n loadingPromise = import(\"mongodb\");\n MongoDBClient = await loadingPromise;\n ObjectId = MongoDBClient.ObjectId;\n isModuleExists = true;\n } catch {\n isModuleExists = false;\n }\n}\n\nloadMongoDB();\n\nexport function isMongoDBDriverLoaded() {\n return isModuleExists;\n}\n\nasync function assertModuleIsLoaded() {\n if (isModuleExists === false) {\n throw new Error(MONGODB_INSTALL_INSTRUCTIONS);\n }\n\n if (isModuleExists === null) {\n await loadingPromise;\n\n return await assertModuleIsLoaded();\n }\n}\n\n/**\n * MongoDB driver implementation that fulfils the Cascade driver contract.\n *\n * It encapsulates the native Mongo client, exposes lifecycle events, and\n * provides helpers for CRUD, transactions, atomic updates, and sync adapters.\n */\nexport class MongoDbDriver implements DriverContract {\n private readonly events = new EventEmitter();\n public client?: MongoClient;\n public database?: Db;\n private connected = false;\n private syncAdapterInstance?: MongoSyncAdapter;\n private migrationDriverInstance?: MigrationDriverContract;\n private readonly transactionOptions: TransactionOptions;\n private idGeneratorInstance?: IdGeneratorContract;\n private _blueprint?: DriverBlueprintContract;\n\n public get blueprint(): DriverBlueprintContract {\n if (!this._blueprint) {\n this._blueprint = new MongoDBBlueprint(this.database!);\n }\n\n return this._blueprint!;\n }\n\n /**\n * The name of this driver.\n */\n public readonly name = \"mongodb\";\n\n /**\n * Current database name\n */\n protected _databaseName?: string;\n\n /**\n * MongoDB driver model defaults.\n *\n * MongoDB follows NoSQL conventions:\n * - camelCase naming for fields (createdAt, updatedAt, deletedAt)\n * - Manual ID generation (auto-increment id field separate from _id)\n * - Timestamps enabled by default\n * - Trash delete strategy with per-collection trash tables\n */\n public readonly modelDefaults: Partial<ModelDefaults> = {\n namingConvention: \"camelCase\",\n createdAtColumn: \"createdAt\",\n updatedAtColumn: \"updatedAt\",\n deletedAtColumn: \"deletedAt\",\n timestamps: true,\n autoGenerateId: true, // MongoDB needs manual ID generation\n strictMode: \"strip\",\n deleteStrategy: \"trash\",\n trashTable: (table) => `${table}Trash`, // Per-collection trash (usersTrash, productsTrash)\n };\n\n /**\n * Create a new MongoDB driver using the supplied connection options.\n *\n * @param config - Connection configuration\n * @param driverOptions - Driver-specific options\n */\n public constructor(\n private readonly config: {\n database: string;\n uri?: string;\n host?: string;\n port?: number;\n username?: string;\n password?: string;\n authSource?: string;\n logging?: boolean;\n clientOptions?: MongoClientOptions;\n },\n private readonly driverOptions?: MongoDriverOptions,\n ) {\n this.transactionOptions = {\n ...DEFAULT_TRANSACTION_OPTIONS,\n ...driverOptions?.transactionOptions,\n };\n }\n\n /**\n * Get data base name\n */\n public get databaseName(): string | undefined {\n if (!this._databaseName) {\n this.resolveDatabaseName();\n }\n\n return this._databaseName;\n }\n\n /**\n * Resolve database name either from config or uri\n */\n private resolveDatabaseName() {\n if (this.config.database) {\n this._databaseName = this.config.database;\n } else if (this.config.uri) {\n this._databaseName = this.config.uri.split(\"/\").pop()?.split(\"?\")?.[0];\n }\n }\n\n /**\n * Indicates whether the driver currently maintains an active connection.\n */\n public get isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Get the MongoDB database instance.\n *\n * @returns The MongoDB Db instance\n * @throws {Error} If not connected\n *\n * @example\n * ```typescript\n * const db = driver.getDatabase();\n * const collection = db.collection(\"users\");\n * ```\n */\n public getDatabase(): Db {\n if (!this.database) {\n throw new Error(\n \"Database not available. Ensure the driver is connected before accessing the database.\",\n );\n }\n return this.database;\n }\n\n /**\n * Get the ID generator instance for this driver.\n *\n * Creates a MongoIdGenerator on first access if autoGenerateId is enabled.\n *\n * @returns The ID generator instance, or undefined if disabled\n *\n * @example\n * ```typescript\n * const idGenerator = driver.getIdGenerator();\n * if (idGenerator) {\n * const id = await idGenerator.generateNextId({ table: \"users\" });\n * }\n * ```\n */\n public getIdGenerator(): IdGeneratorContract | undefined {\n // Return undefined if ID generation is disabled\n if (this.driverOptions?.autoGenerateId === false) {\n return undefined;\n }\n\n // Create ID generator lazily on first access\n if (!this.idGeneratorInstance) {\n this.idGeneratorInstance = new MongoIdGenerator(this, this.driverOptions?.counterCollection);\n }\n\n return this.idGeneratorInstance;\n }\n\n /**\n * Establish a MongoDB connection using the configured options.\n * Throws if the connection attempt fails.\n */\n public async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n await assertModuleIsLoaded();\n\n const uri = this.resolveUri();\n\n const { MongoClient, ObjectId: ObjectIdMongoDB } = MongoDBClient;\n\n ObjectId = ObjectIdMongoDB;\n\n const client = new MongoClient(uri, this.buildClientOptions());\n\n try {\n log.info(\n \"database.mongodb\",\n \"connection\",\n `Connecting to database ${colors.bold(colors.yellowBright(this.databaseName))}`,\n );\n await client.connect();\n this.client = client;\n this.database = client.db(this.databaseName);\n\n this.connected = true;\n log.success(\"database.mongodb\", \"connection\", \"Connected to database\");\n\n client.on(\"close\", () => {\n if (this.connected) {\n this.connected = false;\n this.emit(\"disconnected\");\n log.warn(\"database.mongodb\", \"connection\", \"Disconnected from database\");\n }\n });\n\n if (this.config.logging) {\n const ignoredCommands = [\"isMaster\", \"hello\", \"ping\", \"saslStart\", \"saslContinue\"];\n\n client.on(\"commandStarted\", (event: any) => {\n if (ignoredCommands.includes(event.commandName)) return;\n\n let cmdStr = JSON.stringify(event.command);\n if (cmdStr.length > 300) {\n cmdStr = cmdStr.substring(0, 300) + \"...\";\n }\n\n log.info({\n module: \"database.mongodb\",\n action: \"query.executing\",\n message: `[${event.commandName}] ${cmdStr}`,\n context: { command: event.command },\n });\n });\n\n client.on(\"commandSucceeded\", (event: any) => {\n if (ignoredCommands.includes(event.commandName)) return;\n\n log.success({\n module: \"database.mongodb\",\n action: \"query.executed\",\n message: `[${event.duration.toFixed(2)}ms] [${event.commandName}]`,\n });\n });\n\n client.on(\"commandFailed\", (event: any) => {\n if (ignoredCommands.includes(event.commandName)) return;\n\n log.error({\n module: \"database.mongodb\",\n action: \"query.error\",\n message: `[${event.duration.toFixed(2)}ms] [${event.commandName}]`,\n context: { failure: event.failure },\n });\n });\n }\n\n this.emit(\"connected\");\n } catch (error: any) {\n await client.close().catch(() => undefined);\n this.emit(\"disconnected\");\n // Boot-time database connection failure is unrecoverable in every\n // realistic caller (app boot, CLI migrations, workers) — `fatal` makes\n // \"page on fatal only\" alerting clean. Per-query failures stay at error.\n log.fatal(\n \"database.mongodb\",\n \"connection\",\n `Failed to connect to database: ${error.message}`,\n );\n throw error;\n }\n }\n\n /**\n * Close the underlying MongoDB connection.\n */\n public async disconnect(): Promise<void> {\n if (!this.client) {\n return;\n }\n\n try {\n await this.client.close();\n } finally {\n this.connected = false;\n this.emit(\"disconnected\");\n }\n }\n\n /**\n * Subscribe to driver lifecycle events.\n */\n public on(event: DriverEvent, listener: DriverEventListener): void {\n this.events.on(event, listener);\n }\n\n /**\n * Insert a single document into the given collection.\n */\n public async insert(\n table: string,\n document: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<InsertResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<InsertOneOptions>(options);\n const result = await collection.insertOne(document, mongoOptions);\n\n return {\n document: {\n ...document,\n _id: result.insertedId,\n },\n };\n }\n\n /**\n * Insert multiple documents into the given collection.\n */\n public async insertMany(\n table: string,\n documents: Record<string, unknown>[],\n options?: Record<string, unknown>,\n ): Promise<InsertResult[]> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<BulkWriteOptions>(options);\n const result: InsertManyResult<Record<string, unknown>> = await collection.insertMany(\n documents,\n mongoOptions,\n );\n\n return documents.map((document, index) => {\n const insertedId = result.insertedIds[index as unknown as keyof typeof result.insertedIds];\n\n return {\n document: {\n ...document,\n _id: insertedId,\n },\n };\n });\n }\n\n /**\n * Update a single document that matches the provided filter.\n */\n public async update(\n table: string,\n filter: Record<string, unknown>,\n update: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<UpdateResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<UpdateOptions>(options);\n const result = await collection.updateOne(\n filter,\n update as UpdateFilter<Record<string, unknown>>,\n mongoOptions,\n );\n\n return { modifiedCount: result.modifiedCount };\n }\n\n /**\n * Replace a single document that matches the provided filter.\n */\n public async replace<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n document: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<T | null> {\n const collection = this.getDatabaseInstance().collection(table);\n const result = await collection.findOneAndReplace(filter, document as Record<string, unknown>);\n\n return result?.value as T | null;\n }\n\n /**\n * Find one and update a single document that matches the provided filter and return the updated document\n */\n public async findOneAndUpdate<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n update: UpdateOperations,\n options?: Record<string, unknown>,\n ): Promise<T | null> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<FindOneAndUpdateOptions>(options);\n const result = await collection.findOneAndUpdate(filter, update as Record<string, unknown>, {\n returnDocument: \"after\",\n ...mongoOptions,\n });\n\n return result as T | null;\n }\n\n /**\n * Upsert (insert or update) a single document.\n *\n * Uses MongoDB's findOneAndUpdate with upsert option.\n *\n * @param table - Target collection name\n * @param filter - Filter conditions to find existing document\n * @param document - Document data to insert or update\n * @param options - Optional upsert options\n * @returns The upserted document\n */\n public async upsert<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n document: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<T> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<FindOneAndUpdateOptions>(options);\n\n // Use $set to update all fields from document\n const update = { $set: document };\n\n const result = await collection.findOneAndUpdate(filter, update, {\n upsert: true,\n returnDocument: \"after\",\n ...mongoOptions,\n });\n\n return result as T;\n }\n\n /**\n * Find one and delete a single document that matches the provided filter and return the deleted document.\n *\n * @param table - Target collection name\n * @param filter - Filter conditions\n * @param options - Optional delete options\n * @returns The deleted document or null if not found\n */\n public async findOneAndDelete<T = unknown>(\n table: string,\n filter: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<T | null> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<FindOneAndDeleteOptions>(options);\n\n const result = await collection.findOneAndDelete(filter, mongoOptions || {});\n\n return result as T | null;\n }\n\n /**\n * Update multiple documents that match the provided filter.\n */\n public async updateMany(\n table: string,\n filter: Record<string, unknown>,\n update: UpdateOperations,\n options?: Record<string, unknown>,\n ): Promise<UpdateResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<UpdateOptions>(options);\n const result = await collection.updateMany(\n filter,\n update as UpdateFilter<Record<string, unknown>>,\n mongoOptions,\n );\n\n return { modifiedCount: result.modifiedCount };\n }\n\n /**\n * Delete a single document that matches the provided filter.\n */\n public async delete(\n table: string,\n filter: Record<string, unknown> = {},\n options?: Record<string, unknown>,\n ): Promise<number> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<DeleteOptions>(options);\n const result = await collection.deleteOne(filter, mongoOptions);\n\n return result.deletedCount > 0 ? 1 : 0;\n }\n\n /**\n * Delete documents that match the provided filter.\n */\n public async deleteMany(\n table: string,\n filter: Record<string, unknown> = {},\n options?: Record<string, unknown>,\n ): Promise<number> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<DeleteOptions>(options);\n\n const result = await collection.deleteMany(filter, mongoOptions);\n\n return result.deletedCount ?? 0;\n }\n\n /**\n * Remove all records from a collection.\n *\n * This uses deleteMany with an empty filter to remove all documents.\n * For very large collections, consider using the migration driver's\n * dropTable + createTable approach for better performance.\n */\n public async truncateTable(table: string, options?: Record<string, unknown>): Promise<number> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<DeleteOptions>(options);\n const result = await collection.deleteMany({}, mongoOptions);\n\n return result.deletedCount ?? 0;\n }\n\n /**\n * Serialize the given data\n */\n public serialize(data: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) {\n continue; // Skip undefined values\n }\n\n if (value instanceof ObjectId) {\n serialized[key] = value.toString();\n } else if (value instanceof Date) {\n serialized[key] = value.toISOString();\n } else if (typeof value === \"bigint\") {\n serialized[key] = value.toString();\n } else if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n // Nested objects will be stored as JSONB\n serialized[key] = value;\n } else {\n serialized[key] = value;\n }\n }\n\n return serialized;\n }\n\n /**\n * Get the dirty tracker for this driver.\n */\n public getDirtyTracker(data: Record<string, unknown>): DatabaseDirtyTracker {\n return new DatabaseDirtyTracker(data);\n }\n\n /**\n * Deserialize the given data\n */\n public deserialize(data: Record<string, unknown>): Record<string, unknown> {\n if (data._id && typeof data._id === \"string\") {\n data._id = new ObjectId(data._id);\n }\n\n for (const [key, value] of Object.entries(data)) {\n // Only re-inflate strings — Mongo driver already returns Date objects from DB reads\n if (typeof value === \"string\" && isValidDateValue(value)) {\n data[key] = new Date(value);\n }\n }\n\n return data;\n }\n\n /**\n * Provide a Mongo-backed query builder instance for the given collection.\n */\n public queryBuilder<T = unknown>(table: string): QueryBuilderContract<T> {\n return new MongoQueryBuilder(table, dataSourceRegistry.get());\n }\n\n /**\n * Begin a MongoDB transaction, returning commit/rollback helpers.\n */\n public async beginTransaction(): Promise<DriverTransactionContract<ClientSession>> {\n const client = this.getClientInstance();\n const session = client.startSession();\n\n await session.startTransaction(this.transactionOptions);\n databaseTransactionContext.enter({ session });\n let finished = false;\n\n const finalize = async (operation: () => Promise<void>): Promise<void> => {\n if (finished) return;\n\n try {\n await operation();\n } finally {\n finished = true;\n databaseTransactionContext.exit();\n await session.endSession().catch(() => undefined);\n }\n };\n\n return {\n context: session,\n commit: async () => {\n await finalize(async () => {\n try {\n await session.commitTransaction();\n } catch (error) {\n await session.abortTransaction().catch(() => undefined);\n throw error;\n }\n });\n },\n rollback: async () => {\n await finalize(async () => {\n await session.abortTransaction();\n });\n },\n };\n }\n\n /**\n * Execute a function within a transaction scope (recommended pattern).\n *\n * Automatically commits on success, rolls back on any error, and guarantees\n * resource cleanup. This is the recommended way to use transactions.\n *\n * **MongoDB Requirements:**\n * - Requires MongoDB 4.0+ with replica set or sharded cluster\n * - Standalone MongoDB instances do not support transactions\n *\n * @param fn - Async function to execute within transaction\n * @param options - Transaction options (read preference, write concern, etc.)\n * @returns The return value of the callback function\n * @throws {Error} If transaction fails, is explicitly rolled back, or replica set not configured\n */\n public async transaction<T>(\n fn: (ctx: TransactionContext) => Promise<T>,\n options?: Record<string, unknown>,\n ): Promise<T> {\n // Prevent nested transaction() calls\n if (databaseTransactionContext.hasActiveTransaction()) {\n throw new Error(\n \"Nested transaction() calls are not supported. \" +\n \"Use beginTransaction() with savepoints for advanced transaction patterns.\",\n );\n }\n\n // Check if MongoDB is running as a replica set (required for transactions)\n await this.ensureReplicaSetAvailable();\n\n const client = this.getClientInstance();\n const session = client.startSession();\n\n try {\n await session.startTransaction({\n ...this.transactionOptions,\n ...(options as TransactionOptions),\n });\n\n // Set transaction context for queries within callback\n databaseTransactionContext.enter({ session });\n\n try {\n // Create transaction context with rollback method\n const ctx: TransactionContext = {\n rollback(reason?: string): never {\n throw new TransactionRollbackError(reason);\n },\n };\n\n // Execute callback\n const result = await fn(ctx);\n\n // Auto-commit on success\n await session.commitTransaction();\n\n return result;\n } catch (error) {\n // Auto-rollback on any error (including explicit rollback)\n await session.abortTransaction().catch(() => undefined);\n throw error;\n } finally {\n // Guaranteed context cleanup\n databaseTransactionContext.exit();\n }\n } finally {\n // Guaranteed session cleanup\n await session.endSession().catch(() => undefined);\n }\n }\n\n /**\n * Execute atomic operations (typically $inc/$set style updates) against documents.\n *\n * Uses `updateMany` so callers can atomically modify any set of documents.\n */\n public async atomic(\n table: string,\n filter: Record<string, unknown>,\n operations: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<UpdateResult> {\n const collection = this.getDatabaseInstance().collection(table);\n const mongoOptions = this.withSession<UpdateOptions>(options);\n const result = await collection.updateMany(\n filter,\n operations as UpdateFilter<Record<string, unknown>>,\n mongoOptions,\n );\n\n return { modifiedCount: result.modifiedCount };\n }\n\n /**\n * Lazily create (and cache) the Mongo sync adapter.\n * The adapter uses this driver instance to ensure all operations\n * participate in active transactions via the session context.\n */\n public syncAdapter(): SyncAdapterContract {\n if (!this.syncAdapterInstance) {\n this.syncAdapterInstance = new MongoSyncAdapter(this);\n }\n\n return this.syncAdapterInstance;\n }\n\n /**\n * Lazily create (and cache) the Mongo migration driver.\n * The migration driver handles schema operations like indexes, collections, etc.\n */\n public migrationDriver(): MigrationDriverContract {\n if (!this.migrationDriverInstance) {\n this.migrationDriverInstance = new MongoMigrationDriver(this);\n }\n\n return this.migrationDriverInstance!;\n }\n\n /**\n * Expose the underlying Mongo client for advanced consumers.\n */\n public getClient<Client = MongoClient>(): Client {\n return this.getClientInstance() as Client;\n }\n\n /**\n * Retrieve the active Mongo client, throwing if the driver is disconnected.\n */\n private getClientInstance(): MongoClient {\n if (!this.client) {\n throw new Error(\"Mongo driver is not connected.\");\n }\n\n return this.client;\n }\n\n /**\n * Retrieve the active Mongo database, throwing if the driver is disconnected.\n * @private\n */\n private getDatabaseInstance(): Db {\n if (!this.database) {\n throw new Error(\"Mongo driver is not connected to a database.\");\n }\n\n return this.database;\n }\n\n /**\n * Resolve the Mongo connection string based on provided options.\n */\n private resolveUri(): string {\n if (this.config.uri) {\n return this.config.uri;\n }\n\n const host = this.config.host ?? \"localhost\";\n const port = this.config.port ?? 27017;\n\n return `mongodb://${host}:${port}`;\n }\n\n /**\n * Build the Mongo client options derived from the driver configuration.\n */\n private buildClientOptions(): MongoClientOptions {\n const baseOptions: MongoClientOptions = {\n ...(this.config.clientOptions ?? {}),\n };\n\n if (this.config.logging) {\n baseOptions.monitorCommands = true;\n }\n\n if (this.config.username && !baseOptions.auth) {\n baseOptions.auth = {\n username: this.config.username,\n password: this.config.password,\n };\n }\n\n if (this.config.authSource && !baseOptions.authSource) {\n baseOptions.authSource = this.config.authSource;\n }\n\n return baseOptions;\n }\n\n /**\n * Emit a driver lifecycle event.\n */\n private emit(event: DriverEvent, ...args: unknown[]): void {\n this.events.emit(event, ...args);\n }\n\n /**\n * Ensure MongoDB is running as a replica set (required for transactions).\n *\n * @throws {Error} If MongoDB is running as a standalone instance\n */\n private async ensureReplicaSetAvailable(): Promise<void> {\n try {\n const admin = this.database!.admin();\n const status = await admin.serverStatus();\n\n if (!status.repl) {\n throw new Error(\n \"MongoDB transactions require a replica set or sharded cluster. \" +\n \"Standalone MongoDB instances do not support transactions.\\n\\n\" +\n \"For local development:\\n\" +\n \" - Run MongoDB with --replSet flag: mongod --replSet rs0\\n\" +\n \" - Or use Docker with replica set configuration\\n\" +\n \" - Or use MongoDB Atlas (cloud) which provides replica sets by default\",\n );\n }\n } catch (error: any) {\n if (error.message?.includes(\"replica set\")) {\n throw error;\n }\n throw new Error(`Failed to check MongoDB replica set status: ${error.message}`);\n }\n }\n\n /**\n * Attach the active transaction session (when available) to Mongo options.\n */\n private withSession<TOptions extends { session?: ClientSession }>(\n options?: Record<string, unknown>,\n ): TOptions | undefined {\n const session = databaseTransactionContext.getSession<ClientSession>();\n\n if (!session) {\n return options as TOptions | undefined;\n }\n\n const baseOptions = options ? ({ ...options } as TOptions) : ({} as TOptions);\n\n baseOptions.session = session;\n\n return baseOptions;\n }\n\n // ============================================================\n // SQL Compatibility Operations (Not supported in MongoDB)\n // ============================================================\n\n /**\n * Return a SQL serializer for this driver's dialect.\n * Not supported for MongoDB.\n */\n public getSQLSerializer(): SQLSerializer {\n throw new Error(\"MongoDB driver does not support SQL serialization.\");\n }\n\n /**\n * Execute a raw SQL query.\n * Not supported for MongoDB.\n */\n public async query<T = Record<string, unknown>>(\n _sql: string,\n _params?: unknown[],\n ): Promise<RawQueryResult<T>> {\n throw new Error(\"MongoDB driver does not support raw SQL queries.\");\n }\n\n // ============================================================\n // Database Lifecycle Operations\n // ============================================================\n\n /**\n * Create a new database.\n *\n * In MongoDB, databases are created automatically when data is first written.\n * This method creates an empty collection to ensure the database exists.\n *\n * @param name - Database name to create\n * @returns true if created, false if already exists\n */\n public async createDatabase(name: string): Promise<boolean> {\n const client = this.getClientInstance();\n\n // Check if database already exists\n if (await this.databaseExists(name)) {\n return false;\n }\n\n try {\n // MongoDB creates databases on first write, so create a system collection\n const db = client.db(name);\n await db.createCollection(\"__init__\");\n // Drop the temp collection\n await db.collection(\"__init__\").drop();\n\n log.success(\"database\", \"lifecycle\", `Created database ${name}`);\n return true;\n } catch (error) {\n log.error(\"database\", \"lifecycle\", `Failed to create database ${name}: ${error}`);\n throw error;\n }\n }\n\n /**\n * Drop a database.\n *\n * @param name - Database name to drop\n * @returns true if dropped, false if didn't exist\n */\n public async dropDatabase(name: string): Promise<boolean> {\n const client = this.getClientInstance();\n\n // Check if database exists\n if (!(await this.databaseExists(name))) {\n return false;\n }\n\n try {\n await client.db(name).dropDatabase();\n log.success(\"database\", \"lifecycle\", `Dropped database ${name}`);\n return true;\n } catch (error) {\n log.error(\"database\", \"lifecycle\", `Failed to drop database ${name}: ${error}`);\n throw error;\n }\n }\n\n /**\n * Check if a database exists.\n *\n * @param name - Database name to check\n * @returns true if database exists\n */\n public async databaseExists(name: string): Promise<boolean> {\n const client = this.getClientInstance();\n\n const result = await client.db(\"admin\").admin().listDatabases();\n return result.databases.some((db) => db.name === name);\n }\n\n /**\n * List all databases.\n *\n * @returns Array of database names\n */\n public async listDatabases(): Promise<string[]> {\n const client = this.getClientInstance();\n\n const result = await client.db(\"admin\").admin().listDatabases();\n return result.databases\n .map((db) => db.name)\n .filter((name) => ![\"admin\", \"local\", \"config\"].includes(name));\n }\n\n // ============================================================\n // Table/Collection Management Operations\n // ============================================================\n\n /**\n * Drop a collection.\n *\n * @param name - Collection name to drop\n * @throws Error if collection doesn't exist\n */\n public async dropTable(name: string): Promise<void> {\n const db = this.getDatabaseInstance();\n await db.collection(name).drop();\n log.success(\"database\", \"collection\", `Dropped collection ${name}`);\n }\n\n /**\n * Drop a collection if it exists.\n *\n * @param name - Collection name to drop\n */\n public async dropTableIfExists(name: string): Promise<void> {\n if (await this.blueprint.tableExists(name)) {\n await this.dropTable(name);\n }\n }\n\n /**\n * Drop all collections in the current database.\n *\n * Useful for `migrate:fresh` command.\n */\n public async dropAllTables(): Promise<void> {\n const collections = await this.blueprint.listTables();\n\n if (collections.length === 0) {\n return;\n }\n\n const db = this.getDatabaseInstance();\n\n for (const collection of collections) {\n await db.collection(collection).drop();\n }\n\n log.success(\"database\", \"collection\", `Dropped ${collections.length} collections`);\n }\n}\n"],"mappings":"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"}
|