linkgress-orm 0.1.17 → 0.1.19

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.
Files changed (38) hide show
  1. package/dist/database/database-client.interface.d.ts +29 -0
  2. package/dist/database/database-client.interface.d.ts.map +1 -1
  3. package/dist/database/database-client.interface.js +45 -1
  4. package/dist/database/database-client.interface.js.map +1 -1
  5. package/dist/database/pg-client.d.ts +5 -0
  6. package/dist/database/pg-client.d.ts.map +1 -1
  7. package/dist/database/pg-client.js +27 -0
  8. package/dist/database/pg-client.js.map +1 -1
  9. package/dist/database/postgres-client.d.ts +6 -0
  10. package/dist/database/postgres-client.d.ts.map +1 -1
  11. package/dist/database/postgres-client.js +17 -0
  12. package/dist/database/postgres-client.js.map +1 -1
  13. package/dist/entity/db-column.d.ts +17 -0
  14. package/dist/entity/db-column.d.ts.map +1 -1
  15. package/dist/entity/db-column.js.map +1 -1
  16. package/dist/entity/db-context.d.ts +134 -25
  17. package/dist/entity/db-context.d.ts.map +1 -1
  18. package/dist/entity/db-context.js +237 -174
  19. package/dist/entity/db-context.js.map +1 -1
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/query/cte-builder.d.ts +1 -1
  24. package/dist/query/cte-builder.js +8 -8
  25. package/dist/query/cte-builder.js.map +1 -1
  26. package/dist/query/grouped-query.d.ts +8 -0
  27. package/dist/query/grouped-query.d.ts.map +1 -1
  28. package/dist/query/grouped-query.js +12 -0
  29. package/dist/query/grouped-query.js.map +1 -1
  30. package/dist/query/query-builder.d.ts +13 -2
  31. package/dist/query/query-builder.d.ts.map +1 -1
  32. package/dist/query/query-builder.js +128 -42
  33. package/dist/query/query-builder.js.map +1 -1
  34. package/dist/query/sql-utils.d.ts +2 -0
  35. package/dist/query/sql-utils.d.ts.map +1 -1
  36. package/dist/query/sql-utils.js +24 -7
  37. package/dist/query/sql-utils.js.map +1 -1
  38. package/package.json +1 -1
@@ -28,6 +28,10 @@ export interface PooledConnection {
28
28
  * Base database client interface that all drivers must implement
29
29
  */
30
30
  export declare abstract class DatabaseClient {
31
+ /**
32
+ * Whether this client is currently in a transaction
33
+ */
34
+ isInTransaction(): boolean;
31
35
  /**
32
36
  * Execute a query with optional parameters and execution options
33
37
  */
@@ -44,6 +48,14 @@ export declare abstract class DatabaseClient {
44
48
  * Get the driver name (postgres, pg, mysql, etc.)
45
49
  */
46
50
  abstract getDriverName(): string;
51
+ /**
52
+ * Execute a callback within a transaction.
53
+ * The transaction is automatically committed on success or rolled back on error.
54
+ *
55
+ * @param callback - Function to execute within the transaction. Receives a query function.
56
+ * @returns The result of the callback
57
+ */
58
+ abstract transaction<T>(callback: (query: (sql: string, params?: any[]) => Promise<QueryResult>) => Promise<T>): Promise<T>;
47
59
  /**
48
60
  * Check if the driver supports executing multiple SQL statements in a single query
49
61
  * and returning multiple result sets.
@@ -58,4 +70,21 @@ export declare abstract class DatabaseClient {
58
70
  */
59
71
  supportsBinaryProtocol(): boolean;
60
72
  }
73
+ /**
74
+ * A wrapper client that routes queries through a transactional connection.
75
+ * Used internally to ensure all operations within a transaction use the same connection.
76
+ */
77
+ export declare class TransactionalClient extends DatabaseClient {
78
+ private queryFn;
79
+ private parentClient;
80
+ constructor(queryFn: (sql: string, params?: any[]) => Promise<QueryResult>, parentClient: DatabaseClient);
81
+ isInTransaction(): boolean;
82
+ query<T = any>(sql: string, params?: any[], _options?: QueryExecutionOptions): Promise<QueryResult<T>>;
83
+ connect(): Promise<PooledConnection>;
84
+ end(): Promise<void>;
85
+ getDriverName(): string;
86
+ transaction<T>(_callback: (query: (sql: string, params?: any[]) => Promise<QueryResult>) => Promise<T>): Promise<T>;
87
+ supportsMultiStatementQueries(): boolean;
88
+ supportsBinaryProtocol(): boolean;
89
+ }
61
90
  //# sourceMappingURL=database-client.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database-client.interface.d.ts","sourceRoot":"","sources":["../../src/database/database-client.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACtG,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,8BAAsB,cAAc;IAClC;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAE9G;;OAEG;IACH,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAE7C;;OAEG;IACH,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,aAAa,IAAI,MAAM;IAEhC;;;;;;OAMG;IACH,6BAA6B,IAAI,OAAO;IAIxC;;;OAGG;IACH,sBAAsB,IAAI,OAAO;CAGlC"}
1
+ {"version":3,"file":"database-client.interface.d.ts","sourceRoot":"","sources":["../../src/database/database-client.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACtG,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,8BAAsB,cAAc;IAClC;;OAEG;IACH,eAAe,IAAI,OAAO;IAG1B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAE9G;;OAEG;IACH,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAE7C;;OAEG;IACH,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,aAAa,IAAI,MAAM;IAEhC;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAE3H;;;;;;OAMG;IACH,6BAA6B,IAAI,OAAO;IAIxC;;;OAGG;IACH,sBAAsB,IAAI,OAAO;CAGlC;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,cAAc;IAEnD,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,YAAY;gBADZ,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,EAC9D,YAAY,EAAE,cAAc;IAKtC,eAAe,IAAI,OAAO;IAIpB,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAItG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAKpC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B,aAAa,IAAI,MAAM;IAIjB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAKzH,6BAA6B,IAAI,OAAO;IAIxC,sBAAsB,IAAI,OAAO;CAGlC"}
@@ -1,10 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DatabaseClient = void 0;
3
+ exports.TransactionalClient = exports.DatabaseClient = void 0;
4
4
  /**
5
5
  * Base database client interface that all drivers must implement
6
6
  */
7
7
  class DatabaseClient {
8
+ /**
9
+ * Whether this client is currently in a transaction
10
+ */
11
+ isInTransaction() {
12
+ return false;
13
+ }
8
14
  /**
9
15
  * Check if the driver supports executing multiple SQL statements in a single query
10
16
  * and returning multiple result sets.
@@ -24,4 +30,42 @@ class DatabaseClient {
24
30
  }
25
31
  }
26
32
  exports.DatabaseClient = DatabaseClient;
33
+ /**
34
+ * A wrapper client that routes queries through a transactional connection.
35
+ * Used internally to ensure all operations within a transaction use the same connection.
36
+ */
37
+ class TransactionalClient extends DatabaseClient {
38
+ constructor(queryFn, parentClient) {
39
+ super();
40
+ this.queryFn = queryFn;
41
+ this.parentClient = parentClient;
42
+ }
43
+ isInTransaction() {
44
+ return true;
45
+ }
46
+ async query(sql, params, _options) {
47
+ return await this.queryFn(sql, params);
48
+ }
49
+ async connect() {
50
+ // In a transaction, we shouldn't allow getting a new connection
51
+ throw new Error('Cannot get a new connection while in a transaction');
52
+ }
53
+ async end() {
54
+ // No-op - the parent client manages the connection lifecycle
55
+ }
56
+ getDriverName() {
57
+ return this.parentClient.getDriverName();
58
+ }
59
+ async transaction(_callback) {
60
+ // Nested transactions not supported - could implement savepoints in the future
61
+ throw new Error('Nested transactions are not supported');
62
+ }
63
+ supportsMultiStatementQueries() {
64
+ return this.parentClient.supportsMultiStatementQueries();
65
+ }
66
+ supportsBinaryProtocol() {
67
+ return this.parentClient.supportsBinaryProtocol();
68
+ }
69
+ }
70
+ exports.TransactionalClient = TransactionalClient;
27
71
  //# sourceMappingURL=database-client.interface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"database-client.interface.js","sourceRoot":"","sources":["../../src/database/database-client.interface.ts"],"names":[],"mappings":";;;AA6BA;;GAEG;AACH,MAAsB,cAAc;IAqBlC;;;;;;OAMG;IACH,6BAA6B;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,sBAAsB;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAvCD,wCAuCC"}
1
+ {"version":3,"file":"database-client.interface.js","sourceRoot":"","sources":["../../src/database/database-client.interface.ts"],"names":[],"mappings":";;;AA6BA;;GAEG;AACH,MAAsB,cAAc;IAClC;;OAEG;IACH,eAAe;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IA8BD;;;;;;OAMG;IACH,6BAA6B;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,sBAAsB;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAtDD,wCAsDC;AAED;;;GAGG;AACH,MAAa,mBAAoB,SAAQ,cAAc;IACrD,YACU,OAA8D,EAC9D,YAA4B;QAEpC,KAAK,EAAE,CAAC;QAHA,YAAO,GAAP,OAAO,CAAuD;QAC9D,iBAAY,GAAZ,YAAY,CAAgB;IAGtC,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,MAAc,EAAE,QAAgC;QAChF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAmB,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAO;QACX,gEAAgE;QAChE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,GAAG;QACP,6DAA6D;IAC/D,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,WAAW,CAAI,SAAuF;QAC1G,+EAA+E;QAC/E,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,6BAA6B;QAC3B,OAAO,IAAI,CAAC,YAAY,CAAC,6BAA6B,EAAE,CAAC;IAC3D,CAAC;IAED,sBAAsB;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAC;IACpD,CAAC;CACF;AAzCD,kDAyCC"}
@@ -20,6 +20,11 @@ export declare class PgClient extends DatabaseClient {
20
20
  connect(): Promise<PooledConnection>;
21
21
  end(): Promise<void>;
22
22
  getDriverName(): string;
23
+ /**
24
+ * Execute a callback within a transaction.
25
+ * Uses pg's connection-based transaction with BEGIN/COMMIT/ROLLBACK.
26
+ */
27
+ transaction<T>(callback: (query: (sql: string, params?: any[]) => Promise<QueryResult>) => Promise<T>): Promise<T>;
23
28
  /**
24
29
  * pg library does NOT support retrieving ALL result sets from multi-statement queries
25
30
  * It only returns the last result, making it unsuitable for the fully optimized approach
@@ -1 +1 @@
1
- {"version":3,"file":"pg-client.d.ts","sourceRoot":"","sources":["../../src/database/pg-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACnH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,KAAK,IAAI,GAAG,GAAG,CAAC;AAmChB;;;;;;GAMG;AACH,qBAAa,QAAS,SAAQ,cAAc;IAC1C,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,cAAc,CAAU;IAEhC;;;OAGG;gBACS,MAAM,EAAE,UAAU,GAAG,IAAI;IAsB/B,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAcrG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAKpC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAO1B,aAAa,IAAI,MAAM;IAIvB;;;;OAIG;IACH,6BAA6B,IAAI,OAAO;IAIxC;;OAEG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"pg-client.d.ts","sourceRoot":"","sources":["../../src/database/pg-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACnH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,KAAK,IAAI,GAAG,GAAG,CAAC;AAmChB;;;;;;GAMG;AACH,qBAAa,QAAS,SAAQ,cAAc;IAC1C,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,cAAc,CAAU;IAEhC;;;OAGG;gBACS,MAAM,EAAE,UAAU,GAAG,IAAI;IAsB/B,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAcrG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAKpC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAO1B,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACG,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAyBxH;;;;OAIG;IACH,6BAA6B,IAAI,OAAO;IAIxC;;OAEG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
@@ -86,6 +86,33 @@ class PgClient extends database_client_interface_1.DatabaseClient {
86
86
  getDriverName() {
87
87
  return 'pg';
88
88
  }
89
+ /**
90
+ * Execute a callback within a transaction.
91
+ * Uses pg's connection-based transaction with BEGIN/COMMIT/ROLLBACK.
92
+ */
93
+ async transaction(callback) {
94
+ const client = await this.pool.connect();
95
+ try {
96
+ await client.query('BEGIN');
97
+ const queryFn = async (sql, params) => {
98
+ const result = await client.query(sql, params);
99
+ return {
100
+ rows: result.rows,
101
+ rowCount: result.rowCount,
102
+ };
103
+ };
104
+ const result = await callback(queryFn);
105
+ await client.query('COMMIT');
106
+ return result;
107
+ }
108
+ catch (error) {
109
+ await client.query('ROLLBACK');
110
+ throw error;
111
+ }
112
+ finally {
113
+ client.release();
114
+ }
115
+ }
89
116
  /**
90
117
  * pg library does NOT support retrieving ALL result sets from multi-statement queries
91
118
  * It only returns the last result, making it unsuitable for the fully optimized approach
@@ -1 +1 @@
1
- {"version":3,"file":"pg-client.js","sourceRoot":"","sources":["../../src/database/pg-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pg-client.js","sourceRoot":"","sources":["../../src/database/pg-client.ts"],"names":[],"mappings":"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"}
@@ -38,8 +38,14 @@ export declare class PostgresClient extends DatabaseClient {
38
38
  querySimpleMulti(sql: string): Promise<QueryResult[]>;
39
39
  /**
40
40
  * Begin a transaction using postgres library's built-in transaction support
41
+ * @deprecated Use transaction() method instead for cross-driver compatibility
41
42
  */
42
43
  begin<T>(callback: (sql: Sql) => Promise<T>): Promise<T>;
44
+ /**
45
+ * Execute a callback within a transaction.
46
+ * Uses postgres library's built-in sql.begin() for proper transaction handling.
47
+ */
48
+ transaction<T>(callback: (query: (sql: string, params?: any[]) => Promise<QueryResult>) => Promise<T>): Promise<T>;
43
49
  /**
44
50
  * postgres library automatically uses binary protocol where appropriate
45
51
  * No explicit toggle needed
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-client.d.ts","sourceRoot":"","sources":["../../src/database/postgres-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACnH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,KAAK,GAAG,GAAG,GAAG,CAAC;AAgCf;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,cAAc;IAChD,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,cAAc,CAAU;IAEhC;;;OAGG;gBACS,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,GAAG;IAsB5C,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAWrG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAOpC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAO1B,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,6BAA6B,IAAI,OAAO;IAIxC;;;;OAIG;IACG,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAahE;;;OAGG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAU3D;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI9D;;;OAGG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;OAEG;IACH,MAAM,IAAI,GAAG;CAGd"}
1
+ {"version":3,"file":"postgres-client.d.ts","sourceRoot":"","sources":["../../src/database/postgres-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACnH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,KAAK,GAAG,GAAG,GAAG,CAAC;AAgCf;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,cAAc;IAChD,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,cAAc,CAAU;IAEhC;;;OAGG;gBACS,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,GAAG;IAsB5C,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAWrG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAOpC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAO1B,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,6BAA6B,IAAI,OAAO;IAIxC;;;;OAIG;IACG,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAahE;;;OAGG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAU3D;;;OAGG;IACG,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI9D;;;OAGG;IACG,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAcxH;;;OAGG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;OAEG;IACH,MAAM,IAAI,GAAG;CAGd"}
@@ -121,10 +121,27 @@ class PostgresClient extends database_client_interface_1.DatabaseClient {
121
121
  }
122
122
  /**
123
123
  * Begin a transaction using postgres library's built-in transaction support
124
+ * @deprecated Use transaction() method instead for cross-driver compatibility
124
125
  */
125
126
  async begin(callback) {
126
127
  return await this.sql.begin(callback);
127
128
  }
129
+ /**
130
+ * Execute a callback within a transaction.
131
+ * Uses postgres library's built-in sql.begin() for proper transaction handling.
132
+ */
133
+ async transaction(callback) {
134
+ return await this.sql.begin(async (sql) => {
135
+ const queryFn = async (sqlStr, params) => {
136
+ const result = await sql.unsafe(sqlStr, params || []);
137
+ return {
138
+ rows: result,
139
+ rowCount: result.count ?? null,
140
+ };
141
+ };
142
+ return await callback(queryFn);
143
+ });
144
+ }
128
145
  /**
129
146
  * postgres library automatically uses binary protocol where appropriate
130
147
  * No explicit toggle needed
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-client.js","sourceRoot":"","sources":["../../src/database/postgres-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres-client.js","sourceRoot":"","sources":["../../src/database/postgres-client.ts"],"names":[],"mappings":"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"}
@@ -81,6 +81,23 @@ type UnwrapOptionalDbColumn<T> = T extends DbColumn<infer V> | undefined ? V : T
81
81
  export type ExtractDbColumns<T> = {
82
82
  [K in keyof T as IncludesDbColumn<T[K]> extends true ? K : never]: UnwrapOptionalDbColumn<T[K]>;
83
83
  };
84
+ /**
85
+ * Type helper to extract just the keys of DbColumn properties from an entity.
86
+ * Returns a union of string literal types representing the column property names.
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * interface User {
91
+ * id: DbColumn<number>;
92
+ * username: DbColumn<string>;
93
+ * posts: Post[]; // navigation property
94
+ * }
95
+ *
96
+ * type UserColumnKeys = ExtractDbColumnKeys<User>;
97
+ * // Result: 'id' | 'username'
98
+ * ```
99
+ */
100
+ export type ExtractDbColumnKeys<T> = keyof ExtractDbColumns<T> & string;
84
101
  /**
85
102
  * Type for insert data - only includes DbColumn properties, unwrapped to their values
86
103
  */
@@ -1 +1 @@
1
- {"version":3,"file":"db-column.d.ts","sourceRoot":"","sources":["../../src/entity/db-column.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db-column.d.ts","sourceRoot":"","sources":["../../src/entity/db-column.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"db-column.js","sourceRoot":"","sources":["../../src/entity/db-column.ts"],"names":[],"mappings":";;;AA8IA,gCAEC;AAhJD;;;;;GAKG;AACH,MAAa,QAAQ;IAanB;IACE,gBAAgB;IAChB,UAAkB;QAdpB,gBAAgB;QACP,iBAAY,GAAG,IAAI,CAAC;QAe3B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;CACF;AA5BD,4BA4BC;AAyGD;;GAEG;AACH,SAAgB,UAAU,CAAC,KAAU;IACnC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"db-column.js","sourceRoot":"","sources":["../../src/entity/db-column.ts"],"names":[],"mappings":";;;AAgKA,gCAEC;AAlKD;;;;;GAKG;AACH,MAAa,QAAQ;IAanB;IACE,gBAAgB;IAChB,UAAkB;QAdpB,gBAAgB;QACP,iBAAY,GAAG,IAAI,CAAC;QAe3B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;CACF;AA5BD,4BA4BC;AA2HD;;GAEG;AACH,SAAgB,UAAU,CAAC,KAAU;IACnC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;AAC3E,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { DatabaseClient, QueryResult } from '../database/database-client.interface';
2
2
  import { TableBuilder, TableSchema, InferTableType } from '../schema/table-builder';
3
- import { UnwrapDbColumns, InsertData, ExtractDbColumns } from './db-column';
3
+ import { UnwrapDbColumns, InsertData, ExtractDbColumns, ExtractDbColumnKeys } from './db-column';
4
4
  import { DbEntity, EntityConstructor } from './entity-base';
5
5
  import { DbModelConfig } from './model-config';
6
6
  import { Condition, SqlFragment, UnwrapSelection, FieldRef } from '../query/conditions';
@@ -13,6 +13,40 @@ import type { DbCte } from '../query/cte-builder';
13
13
  * Collection aggregation strategy type
14
14
  */
15
15
  export type CollectionStrategyType = 'cte' | 'temptable' | 'lateral';
16
+ /**
17
+ * Column information returned by getColumns()
18
+ *
19
+ * @typeParam TEntity - The entity type, used to strongly type propertyName as one of the entity's column keys
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * // With typed entity
24
+ * const columns: ColumnInfo<User>[] = db.users.getColumns();
25
+ * columns[0].propertyName; // Type: 'id' | 'username' | 'email' | ... (only column keys)
26
+ *
27
+ * // Get just the property names as a typed array
28
+ * const keys = db.users.getColumnKeys();
29
+ * // Type: Array<'id' | 'username' | 'email' | ...>
30
+ * ```
31
+ */
32
+ export interface ColumnInfo<TEntity = any> {
33
+ /** Property name in the entity class (TypeScript name) - typed as keyof entity columns */
34
+ propertyName: ExtractDbColumnKeys<TEntity>;
35
+ /** Column name in the database */
36
+ columnName: string;
37
+ /** SQL type (e.g., 'integer', 'varchar', 'timestamp') */
38
+ type: string;
39
+ /** Whether the column is a primary key */
40
+ isPrimaryKey: boolean;
41
+ /** Whether the column is auto-incremented (identity) */
42
+ isAutoIncrement: boolean;
43
+ /** Whether the column is nullable */
44
+ isNullable: boolean;
45
+ /** Whether the column has a unique constraint */
46
+ isUnique: boolean;
47
+ /** Default value if any */
48
+ defaultValue?: any;
49
+ }
16
50
  /**
17
51
  * Order direction for orderBy clauses
18
52
  */
@@ -185,6 +219,10 @@ export interface InsertConfig {
185
219
  * Use OVERRIDING SYSTEM VALUE to allow inserting into identity/serial columns
186
220
  */
187
221
  overridingSystemValue?: boolean;
222
+ /**
223
+ * Skip rows that would violate unique constraints (ON CONFLICT DO NOTHING)
224
+ */
225
+ onConflictDoNothing?: boolean;
188
226
  }
189
227
  /**
190
228
  * Upsert configuration
@@ -301,6 +339,8 @@ export interface FluentUpsert<TEntity extends DbEntity> extends PromiseLike<void
301
339
  * Used with db.table.where(...).delete()
302
340
  */
303
341
  export interface FluentDelete<TSelection> extends PromiseLike<void> {
342
+ /** Return the number of deleted rows */
343
+ affectedCount(): PromiseLike<number>;
304
344
  /** Return all columns from the deleted rows */
305
345
  returning(): PromiseLike<TSelection[]>;
306
346
  /** Return selected columns from the deleted rows */
@@ -311,6 +351,8 @@ export interface FluentDelete<TSelection> extends PromiseLike<void> {
311
351
  * Used with db.table.where(...).update(data)
312
352
  */
313
353
  export interface FluentQueryUpdate<TSelection> extends PromiseLike<void> {
354
+ /** Return the number of updated rows */
355
+ affectedCount(): PromiseLike<number>;
314
356
  /** Return all columns from the updated rows */
315
357
  returning(): PromiseLike<TSelection[]>;
316
358
  /** Return selected columns from the updated rows */
@@ -447,10 +489,6 @@ export declare class TableAccessor<TBuilder extends TableBuilder<any>> {
447
489
  * Upsert a single chunk (internal method)
448
490
  */
449
491
  private upsertBulkSingle;
450
- /**
451
- * Bulk insert multiple rows (simple version, kept for compatibility)
452
- */
453
- insertMany(dataArray: Partial<InferTableType<TableSchema>>[]): Promise<InferTableType<TableSchema>[]>;
454
492
  /**
455
493
  * Insert with conflict resolution (upsert)
456
494
  */
@@ -496,6 +534,7 @@ export declare class DataContext<TSchema extends ContextSchema = any> {
496
534
  private initializeSchema;
497
535
  /**
498
536
  * Get table accessor by name
537
+ * When in a transaction, creates a fresh accessor with the transactional client
499
538
  */
500
539
  getTable<K extends keyof TSchema>(name: K): InferContextSchema<TSchema>[K];
501
540
  /**
@@ -516,6 +555,8 @@ export declare class DataContext<TSchema extends ContextSchema = any> {
516
555
  query<T = any>(sql: string, params?: any[]): Promise<T[]>;
517
556
  /**
518
557
  * Execute in transaction
558
+ * Uses the database client's native transaction support for proper handling
559
+ * across different drivers (pg uses BEGIN/COMMIT, postgres uses sql.begin())
519
560
  */
520
561
  transaction<TResult>(fn: (ctx: this) => Promise<TResult>): Promise<TResult>;
521
562
  /**
@@ -630,7 +671,8 @@ export interface EntityCollectionQuery<TEntity extends DbEntity> {
630
671
  count(): SqlFragment<number>;
631
672
  toNumberList(asName?: string): number[];
632
673
  toStringList(asName?: string): string[];
633
- toList(asName: string): TEntity[];
674
+ toList(asName?: string): TEntity[];
675
+ firstOrDefault(asName?: string): TEntity | null;
634
676
  }
635
677
  export interface EntityCollectionQueryWithSelect<TEntity extends DbEntity, TSelection> {
636
678
  where(condition: (item: EntityQuery<TEntity>) => Condition): this;
@@ -645,7 +687,8 @@ export interface EntityCollectionQueryWithSelect<TEntity extends DbEntity, TSele
645
687
  count(): Promise<number>;
646
688
  toNumberList(asName?: string): number[];
647
689
  toStringList(asName?: string): string[];
648
- toList(asName: string): TSelection[];
690
+ toList(asName?: string): TSelection[];
691
+ firstOrDefault(asName?: string): TSelection | null;
649
692
  }
650
693
  /**
651
694
  * Interface for queryable entity collections that can be filtered with .where()
@@ -819,6 +862,86 @@ export declare class DbEntityTable<TEntity extends DbEntity> {
819
862
  * @internal
820
863
  */
821
864
  _getCollectionStrategy(): CollectionStrategyType | undefined;
865
+ /**
866
+ * Get information about all columns in this table.
867
+ * This method returns metadata about database columns only, excluding navigation properties.
868
+ *
869
+ * @param options - Optional configuration
870
+ * @param options.includeNavigation - If false (default), only returns database columns.
871
+ * Navigation properties are never included as they are not columns.
872
+ *
873
+ * @returns Array of column information objects
874
+ *
875
+ * @example
876
+ * ```typescript
877
+ * // Get all columns
878
+ * const columns = db.users.getColumns();
879
+ * // Returns: [
880
+ * // { propertyName: 'id', columnName: 'id', type: 'integer', isPrimaryKey: true, ... },
881
+ * // { propertyName: 'username', columnName: 'username', type: 'varchar', ... },
882
+ * // { propertyName: 'email', columnName: 'email', type: 'text', ... },
883
+ * // ]
884
+ *
885
+ * // Get column names only
886
+ * const columnNames = db.users.getColumns().map(c => c.propertyName);
887
+ * // Returns: ['id', 'username', 'email', ...]
888
+ *
889
+ * // Get database column names
890
+ * const dbColumnNames = db.users.getColumns().map(c => c.columnName);
891
+ * // Returns: ['id', 'username', 'email', ...]
892
+ * ```
893
+ */
894
+ getColumns(): ColumnInfo<TEntity>[];
895
+ /**
896
+ * Get an array of all column property names (keys) for this entity.
897
+ * Returns a strongly typed array where each element is a valid column key of TEntity.
898
+ *
899
+ * This is a convenience method equivalent to `getColumns().map(c => c.propertyName)`
900
+ * but with better type inference.
901
+ *
902
+ * @returns Array of column property names typed as ExtractDbColumnKeys<TEntity>
903
+ *
904
+ * @example
905
+ * ```typescript
906
+ * // Get all column keys
907
+ * const keys = db.users.getColumnKeys();
908
+ * // Type: ExtractDbColumnKeys<User>[] which is ('id' | 'username' | 'email' | ...)[]
909
+ *
910
+ * // Use for dynamic property access
911
+ * const user = await db.users.findOne(u => eq(u.id, 1));
912
+ * for (const key of db.users.getColumnKeys()) {
913
+ * console.log(`${key}: ${user[key]}`); // TypeScript knows key is valid
914
+ * }
915
+ *
916
+ * // Use for building dynamic queries
917
+ * const columnKeys = db.users.getColumnKeys();
918
+ * // columnKeys[0] is typed as 'id' | 'username' | 'email' | ...
919
+ * ```
920
+ */
921
+ getColumnKeys(): ExtractDbColumnKeys<TEntity>[];
922
+ /**
923
+ * Get an object containing all entity properties as DbColumn references.
924
+ * Useful for building dynamic queries or accessing column metadata.
925
+ *
926
+ * @param options - Optional configuration
927
+ * @param options.excludeNavigation - If true (default), excludes navigation properties.
928
+ * Set to false to include navigation properties.
929
+ *
930
+ * @returns Object with property names as keys and their DbColumn/navigation references as values
931
+ *
932
+ * @example
933
+ * ```typescript
934
+ * // Get all column properties (excludes navigation by default)
935
+ * const cols = db.users.props();
936
+ * // Use in select: db.users.select(u => ({ id: cols.id, name: cols.username }))
937
+ *
938
+ * // Include navigation properties
939
+ * const allProps = db.users.props({ excludeNavigation: false });
940
+ * ```
941
+ */
942
+ props(options?: {
943
+ excludeNavigation?: boolean;
944
+ }): EntityQuery<TEntity>;
822
945
  /**
823
946
  * Get qualified table name with schema prefix if specified
824
947
  * @internal
@@ -926,23 +1049,6 @@ export declare class DbEntityTable<TEntity extends DbEntity> {
926
1049
  * ```
927
1050
  */
928
1051
  insert(data: InsertData<TEntity>): FluentInsert<TEntity>;
929
- /**
930
- * Insert multiple records
931
- * Returns a fluent builder that can be awaited directly or chained with .returning()
932
- *
933
- * @example
934
- * ```typescript
935
- * // No returning (default) - returns void
936
- * await db.users.insertMany([{ username: 'alice' }, { username: 'bob' }]);
937
- *
938
- * // With returning() - returns full entities
939
- * const users = await db.users.insertMany([{ username: 'alice' }]).returning();
940
- *
941
- * // With returning(selector) - returns selected columns
942
- * const results = await db.users.insertMany([{ username: 'alice' }]).returning(u => ({ id: u.id }));
943
- * ```
944
- */
945
- insertMany(data: InsertData<TEntity>[]): FluentInsertMany<TEntity>;
946
1052
  /**
947
1053
  * Upsert (insert or update on conflict)
948
1054
  * Returns a fluent builder that can be awaited directly or chained with .returning()
@@ -973,8 +1079,11 @@ export declare class DbEntityTable<TEntity extends DbEntity> {
973
1079
  * // With returning(selector) - returns selected columns
974
1080
  * const results = await db.users.insertBulk([{ username: 'alice' }]).returning(u => ({ id: u.id }));
975
1081
  *
976
- * // With options
1082
+ * // With chunk size
977
1083
  * await db.users.insertBulk([{ username: 'alice' }], { chunkSize: 100 });
1084
+ *
1085
+ * // Skip duplicates (ON CONFLICT DO NOTHING)
1086
+ * await db.users.insertBulk([{ username: 'alice' }], { onConflictDoNothing: true });
978
1087
  * ```
979
1088
  */
980
1089
  insertBulk(value: InsertData<TEntity> | InsertData<TEntity>[], options?: InsertConfig): FluentInsertMany<TEntity>;