@m2k-5f/pgtx 2.2.0 → 2.3.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/README.md +36 -17
- package/dist/clauses/abstract.clause.js +1 -5
- package/dist/clauses/array.clause.js +3 -7
- package/dist/clauses/empty.clause.js +3 -7
- package/dist/clauses/exclude.clause.js +2 -6
- package/dist/clauses/fragment.clause.js +4 -8
- package/dist/clauses/iden.caluse.js +2 -6
- package/dist/clauses/index.js +9 -25
- package/dist/clauses/insert.clause.js +2 -6
- package/dist/clauses/literal.clause.js +2 -6
- package/dist/clauses/update.clause.js +2 -6
- package/dist/clauses/where.clause.js +2 -6
- package/dist/connection.d.ts +11 -7
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +108 -111
- package/dist/error.d.ts +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +2 -6
- package/dist/index.js +24 -37
- package/dist/pool.d.ts +9 -7
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +23 -38
- package/dist/protocol/connection-request-writer.js +13 -18
- package/dist/protocol/connection-response-reader.js +4 -9
- package/dist/protocol/constants.js +4 -7
- package/dist/protocol/socket-authorization.d.ts +5 -1
- package/dist/protocol/socket-authorization.d.ts.map +1 -1
- package/dist/protocol/socket-authorization.js +38 -34
- package/dist/protocol/socket-connector.js +3 -7
- package/dist/query.js +2 -6
- package/dist/queue.js +1 -5
- package/dist/security/md5.js +4 -8
- package/dist/security/sasl.js +7 -11
- package/dist/transaction.d.ts +7 -5
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +18 -26
- package/dist/types.js +0 -2
- package/dist/utils/template-compiler.js +3 -6
- package/dist/utils/value-parser.js +2 -7
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -97,6 +97,25 @@ await pool.begin(async (tx) => {
|
|
|
97
97
|
|
|
98
98
|
---
|
|
99
99
|
|
|
100
|
+
|
|
101
|
+
## 🎯 Typed Error Handling
|
|
102
|
+
|
|
103
|
+
Pgtx queries return `Future<T, PostgresError>` from [fluent-future](https://www.npmjs.com/package/fluent-future) instead of raw `Promise<T>`. This gives you:
|
|
104
|
+
|
|
105
|
+
- **Typed errors** — `PostgresError` with `code`, `severity`, `detail`
|
|
106
|
+
- **Declarative recovery** — `.recover()`, `.recoverIf()` instead of try/catch
|
|
107
|
+
- **Chain composition** — `.andThen()`, `.orElse()`, `.tap()`, `.tapErr()`
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
const users = await pool.query<User>`SELECT * FROM users WHERE id = ${1}`
|
|
111
|
+
.recoverIf(err => err.code === '42P01', []) // undefined_table → []
|
|
112
|
+
.recoverIf(err => err.code === '23505', []) // unique_violation → []
|
|
113
|
+
.tapErr(err => logger.error(err)) // log remaining errors
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
|
|
100
119
|
## 📖 Features
|
|
101
120
|
|
|
102
121
|
### Transactions & Savepoints
|
|
@@ -105,11 +124,11 @@ await pool.begin(async (tx) => {
|
|
|
105
124
|
await pool.begin(async (tx) => {
|
|
106
125
|
await tx.query`INSERT INTO orders (user_id) VALUES (${userId})`
|
|
107
126
|
|
|
108
|
-
|
|
109
|
-
const err = await tx.savepoint('update_stock', async (stx) => {
|
|
127
|
+
await tx.savepoint('update_stock', async (stx) => {
|
|
110
128
|
await stx.query`UPDATE stock SET count = count - 1 WHERE product_id = ${productId}`
|
|
111
|
-
if (outOfStock) throw new Error() // Only savepoint rolls back
|
|
129
|
+
if (outOfStock) throw new Error('out of stock') // Only savepoint rolls back
|
|
112
130
|
})
|
|
131
|
+
.tapErr(console.log) // Error: out of stock
|
|
113
132
|
})
|
|
114
133
|
```
|
|
115
134
|
|
|
@@ -280,11 +299,11 @@ await pool.query`
|
|
|
280
299
|
class Connection {
|
|
281
300
|
static new(params: ConnectionParams): Promise<Connection>
|
|
282
301
|
|
|
283
|
-
query<T>(strings: TemplateStringsArray, ...values: any[]): Promise<T[]>
|
|
284
|
-
begin<T>(callback: (tx: Transaction) => Promise<T>):
|
|
285
|
-
notify(channelName: string, payload?: string):
|
|
286
|
-
listen(channelName: string, callback: (payload: string) => void):
|
|
287
|
-
unlisten(channelName: string, callback: (payload: string) => void):
|
|
302
|
+
query<T>(strings: TemplateStringsArray, ...values: any[]): Promise<T[], PostgresError>
|
|
303
|
+
begin<T>(callback: (tx: Transaction) => Promise<T>): Future<T, Error>
|
|
304
|
+
notify(channelName: string, payload?: string): Future<[], PostgresError>
|
|
305
|
+
listen(channelName: string, callback: (payload: string) => void): Future<[], PostgresError>
|
|
306
|
+
unlisten(channelName: string, callback: (payload: string) => void): Future<[], PostgresError>
|
|
288
307
|
|
|
289
308
|
get isAlive(): boolean
|
|
290
309
|
close(): void
|
|
@@ -306,12 +325,12 @@ interface ConnectionParams {
|
|
|
306
325
|
class Pool {
|
|
307
326
|
constructor(config: PoolConfig)
|
|
308
327
|
|
|
309
|
-
query<T>(strings: TemplateStringsArray, ...values: any[]):
|
|
310
|
-
begin<T>(callback: (tx: Transaction) => Promise<T>):
|
|
311
|
-
notify(channelName: string, payload?: string):
|
|
312
|
-
acquire():
|
|
328
|
+
query<T>(strings: TemplateStringsArray, ...values: any[]): Future<T[], Error>
|
|
329
|
+
begin<T>(callback: (tx: Transaction) => Promise<T>): Future<T, Error>
|
|
330
|
+
notify(channelName: string, payload?: string): Future<[], PostgresError>
|
|
331
|
+
acquire(): Future<Connection, Error>
|
|
313
332
|
release(conn: Connection): void
|
|
314
|
-
close():
|
|
333
|
+
close(): void
|
|
315
334
|
|
|
316
335
|
get size(): number
|
|
317
336
|
get total(): number
|
|
@@ -326,10 +345,10 @@ interface PoolConfig extends ConnectionParams {
|
|
|
326
345
|
|
|
327
346
|
```typescript
|
|
328
347
|
class Transaction {
|
|
329
|
-
query<T>(strings: TemplateStringsArray, ...values: any[]):
|
|
330
|
-
commit():
|
|
331
|
-
rollback():
|
|
332
|
-
savepoint<T>(name: string, callback: (tx: Transaction) => Promise<T>):
|
|
348
|
+
query<T>(strings: TemplateStringsArray, ...values: any[]): Future<T[], PostgresError>
|
|
349
|
+
commit(): Future<[], PostgresError>
|
|
350
|
+
rollback(): Future<[], PostgresError>
|
|
351
|
+
savepoint<T>(name: string, callback: (tx: Transaction) => Promise<T>): Future<T, Error>
|
|
333
352
|
|
|
334
353
|
get isActive(): boolean
|
|
335
354
|
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.ArrayClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class ArrayClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class ArrayClause extends Clause {
|
|
6
3
|
constructor(array, separator = ", ") {
|
|
7
4
|
super();
|
|
8
5
|
this.array = array;
|
|
@@ -20,7 +17,7 @@ class ArrayClause extends abstract_clause_1.Clause {
|
|
|
20
17
|
}
|
|
21
18
|
if (index)
|
|
22
19
|
params.text.push(this.separator);
|
|
23
|
-
if (value instanceof
|
|
20
|
+
if (value instanceof Clause) {
|
|
24
21
|
value.mapIntoQuery(params);
|
|
25
22
|
}
|
|
26
23
|
else {
|
|
@@ -30,4 +27,3 @@ class ArrayClause extends abstract_clause_1.Clause {
|
|
|
30
27
|
});
|
|
31
28
|
}
|
|
32
29
|
}
|
|
33
|
-
exports.ArrayClause = ArrayClause;
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.emptyClause = exports.EmptyClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class EmptyClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class EmptyClause extends Clause {
|
|
6
3
|
static create() {
|
|
7
4
|
return new EmptyClause();
|
|
8
5
|
}
|
|
9
6
|
mapIntoQuery(params) { }
|
|
10
7
|
}
|
|
11
|
-
|
|
12
|
-
exports.emptyClause = EmptyClause.create();
|
|
8
|
+
export const emptyClause = EmptyClause.create();
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.ExcludeUpdateClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class ExcludeUpdateClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class ExcludeUpdateClause extends Clause {
|
|
6
3
|
constructor(fields) {
|
|
7
4
|
super();
|
|
8
5
|
this.fields = fields;
|
|
@@ -15,4 +12,3 @@ class ExcludeUpdateClause extends abstract_clause_1.Clause {
|
|
|
15
12
|
.join(', '));
|
|
16
13
|
}
|
|
17
14
|
}
|
|
18
|
-
exports.ExcludeUpdateClause = ExcludeUpdateClause;
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
const template_compiler_1 = require("../utils/template-compiler");
|
|
6
|
-
class FragmentClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause, } from "./abstract.clause";
|
|
2
|
+
import { compileSqlTemplate } from "../utils/template-compiler";
|
|
3
|
+
export class FragmentClause extends Clause {
|
|
7
4
|
constructor(templates, args) {
|
|
8
5
|
super();
|
|
9
6
|
this.templates = templates;
|
|
@@ -13,7 +10,7 @@ class FragmentClause extends abstract_clause_1.Clause {
|
|
|
13
10
|
return new FragmentClause(strings, values);
|
|
14
11
|
}
|
|
15
12
|
mapIntoQuery(params) {
|
|
16
|
-
const compiled =
|
|
13
|
+
const compiled = compileSqlTemplate({
|
|
17
14
|
args: this.args,
|
|
18
15
|
templates: this.templates
|
|
19
16
|
}, params.args.length);
|
|
@@ -21,4 +18,3 @@ class FragmentClause extends abstract_clause_1.Clause {
|
|
|
21
18
|
params.text.push(compiled.text);
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
|
-
exports.FragmentClause = FragmentClause;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.IdentifierClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class IdentifierClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class IdentifierClause extends Clause {
|
|
6
3
|
constructor(value) {
|
|
7
4
|
super();
|
|
8
5
|
this.value = value;
|
|
@@ -16,4 +13,3 @@ class IdentifierClause extends abstract_clause_1.Clause {
|
|
|
16
13
|
params.text.push(`"${this.value}"`);
|
|
17
14
|
}
|
|
18
15
|
}
|
|
19
|
-
exports.IdentifierClause = IdentifierClause;
|
package/dist/clauses/index.js
CHANGED
|
@@ -1,25 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./array.clause"), exports);
|
|
18
|
-
__exportStar(require("./empty.clause"), exports);
|
|
19
|
-
__exportStar(require("./exclude.clause"), exports);
|
|
20
|
-
__exportStar(require("./fragment.clause"), exports);
|
|
21
|
-
__exportStar(require("./iden.caluse"), exports);
|
|
22
|
-
__exportStar(require("./insert.clause"), exports);
|
|
23
|
-
__exportStar(require("./literal.clause"), exports);
|
|
24
|
-
__exportStar(require("./update.clause"), exports);
|
|
25
|
-
__exportStar(require("./where.clause"), exports);
|
|
1
|
+
export * from './array.clause';
|
|
2
|
+
export * from './empty.clause';
|
|
3
|
+
export * from './exclude.clause';
|
|
4
|
+
export * from './fragment.clause';
|
|
5
|
+
export * from './iden.caluse';
|
|
6
|
+
export * from './insert.clause';
|
|
7
|
+
export * from './literal.clause';
|
|
8
|
+
export * from './update.clause';
|
|
9
|
+
export * from './where.clause';
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.InsertClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class InsertClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class InsertClause extends Clause {
|
|
6
3
|
constructor(inserts) {
|
|
7
4
|
super();
|
|
8
5
|
this.inserts = inserts;
|
|
@@ -33,4 +30,3 @@ class InsertClause extends abstract_clause_1.Clause {
|
|
|
33
30
|
});
|
|
34
31
|
}
|
|
35
32
|
}
|
|
36
|
-
exports.InsertClause = InsertClause;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.LiteralClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class LiteralClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class LiteralClause extends Clause {
|
|
6
3
|
constructor(value) {
|
|
7
4
|
super();
|
|
8
5
|
this.value = value;
|
|
@@ -17,4 +14,3 @@ class LiteralClause extends abstract_clause_1.Clause {
|
|
|
17
14
|
params.text.push(this.value);
|
|
18
15
|
}
|
|
19
16
|
}
|
|
20
|
-
exports.LiteralClause = LiteralClause;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.UpdateClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class UpdateClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class UpdateClause extends Clause {
|
|
6
3
|
constructor(updateMap) {
|
|
7
4
|
super();
|
|
8
5
|
this.updateMap = updateMap;
|
|
@@ -22,4 +19,3 @@ class UpdateClause extends abstract_clause_1.Clause {
|
|
|
22
19
|
});
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
exports.UpdateClause = UpdateClause;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.WhereClause = void 0;
|
|
4
|
-
const abstract_clause_1 = require("./abstract.clause");
|
|
5
|
-
class WhereClause extends abstract_clause_1.Clause {
|
|
1
|
+
import { Clause } from "./abstract.clause";
|
|
2
|
+
export class WhereClause extends Clause {
|
|
6
3
|
constructor(_value) {
|
|
7
4
|
super();
|
|
8
5
|
this._value = _value;
|
|
@@ -22,4 +19,3 @@ class WhereClause extends abstract_clause_1.Clause {
|
|
|
22
19
|
});
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
exports.WhereClause = WhereClause;
|
package/dist/connection.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Branded, ColumnDescription } from "./types";
|
|
2
2
|
import { Transaction } from "./transaction";
|
|
3
|
+
import { Future } from 'fluent-future';
|
|
4
|
+
import { PostgresError } from "./error";
|
|
3
5
|
type LogLevel = "none" | "error" | "notice" | "query";
|
|
4
6
|
export type ConnectionParams = {
|
|
5
7
|
user: string;
|
|
@@ -75,6 +77,7 @@ export declare class Connection {
|
|
|
75
77
|
private _stmtCounter;
|
|
76
78
|
private _logLevel;
|
|
77
79
|
private _nextStatement;
|
|
80
|
+
private _checkOpened;
|
|
78
81
|
private constructor();
|
|
79
82
|
/**
|
|
80
83
|
* Creates a new database connection.
|
|
@@ -94,7 +97,7 @@ export declare class Connection {
|
|
|
94
97
|
* })
|
|
95
98
|
* ```
|
|
96
99
|
*/
|
|
97
|
-
static new(params: ConnectionParams):
|
|
100
|
+
static new(params: ConnectionParams): Future<Connection, PostgresError>;
|
|
98
101
|
/**
|
|
99
102
|
* Executes a query using tagged template literals.
|
|
100
103
|
*
|
|
@@ -119,7 +122,7 @@ export declare class Connection {
|
|
|
119
122
|
* const users = await conn.query<User>`SELECT * FROM users`
|
|
120
123
|
* ```
|
|
121
124
|
*/
|
|
122
|
-
query<T extends Record<string, any>>(templates: TemplateStringsArray, ...params: any[]):
|
|
125
|
+
query<T extends Record<string, any>>(templates: TemplateStringsArray, ...params: any[]): Future<T[], PostgresError>;
|
|
123
126
|
/**
|
|
124
127
|
* Starts a managed transaction on this connection.
|
|
125
128
|
*
|
|
@@ -141,7 +144,7 @@ export declare class Connection {
|
|
|
141
144
|
* })
|
|
142
145
|
* ```
|
|
143
146
|
*/
|
|
144
|
-
begin<T>(txCallback: (transaction: Transaction) => Promise<T>):
|
|
147
|
+
begin<T>(txCallback: (transaction: Transaction) => Promise<T>): Future<T, Error>;
|
|
145
148
|
/**
|
|
146
149
|
* Sends an asynchronous notification to a channel via `pg_notify`.
|
|
147
150
|
*
|
|
@@ -153,7 +156,7 @@ export declare class Connection {
|
|
|
153
156
|
* await conn.notify('events', 'hello')
|
|
154
157
|
* ```
|
|
155
158
|
*/
|
|
156
|
-
notify(channelName: string, payload?: string):
|
|
159
|
+
notify(channelName: string, payload?: string): Future<Record<string, any>[], PostgresError>;
|
|
157
160
|
/**
|
|
158
161
|
* Subscribes a callback to a channel. Sends `LISTEN` on the first subscription.
|
|
159
162
|
*
|
|
@@ -165,7 +168,7 @@ export declare class Connection {
|
|
|
165
168
|
* await conn.listen('events', data => console.log(data))
|
|
166
169
|
* ```
|
|
167
170
|
*/
|
|
168
|
-
listen(channelName: string, callback: (payload: string) => void):
|
|
171
|
+
listen(channelName: string, callback: (payload: string) => void): Future<Record<string, any>[], PostgresError>;
|
|
169
172
|
/**
|
|
170
173
|
* Unsubscribes a callback. Sends `UNLISTEN` if no callbacks remain for the channel.
|
|
171
174
|
*
|
|
@@ -177,11 +180,13 @@ export declare class Connection {
|
|
|
177
180
|
* await conn.unlisten('events', callback)
|
|
178
181
|
* ```
|
|
179
182
|
*/
|
|
180
|
-
unlisten(channelName: string, callback: (payload: string) => void):
|
|
183
|
+
unlisten(channelName: string, callback: (payload: string) => void): Future<[], PostgresError>;
|
|
181
184
|
private _createQuery;
|
|
182
185
|
private _writeQuery;
|
|
183
186
|
private _registerFlush;
|
|
184
187
|
private _flush;
|
|
188
|
+
private _registerReconnect;
|
|
189
|
+
private _resetConnectionState;
|
|
185
190
|
private _reconnect;
|
|
186
191
|
private _restoreSubscriptions;
|
|
187
192
|
private _getCurrentQuery;
|
|
@@ -192,7 +197,6 @@ export declare class Connection {
|
|
|
192
197
|
* Returns `false` if the socket is destroyed or connection is dead.
|
|
193
198
|
*/
|
|
194
199
|
get isOpened(): boolean;
|
|
195
|
-
private _destroyConnection;
|
|
196
200
|
/**
|
|
197
201
|
* Closes the connection immediately.
|
|
198
202
|
* All pending queries will be rejected with an error.
|
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|