@vibeorm/adapter-pg 1.3.0 → 2.0.0-alpha.10
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 +62 -54
- package/dist/errors.d.ts +36 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +686 -0
- package/dist/index.js.map +17 -0
- package/dist/params.d.ts +40 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/savepoint-gate.d.ts +86 -0
- package/dist/savepoint-gate.d.ts.map +1 -0
- package/dist/savepoints.d.ts +22 -0
- package/dist/savepoints.d.ts.map +1 -0
- package/dist/statement-cache.d.ts +50 -0
- package/dist/statement-cache.d.ts.map +1 -0
- package/dist/transaction-budget.d.ts +144 -0
- package/dist/transaction-budget.d.ts.map +1 -0
- package/dist/transaction-sql.d.ts +62 -0
- package/dist/transaction-sql.d.ts.map +1 -0
- package/package.json +36 -19
- package/src/index.ts +0 -469
package/README.md
CHANGED
|
@@ -1,88 +1,96 @@
|
|
|
1
1
|
# @vibeorm/adapter-pg
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Part of **[VibeORM](https://github.com/vibeorm/vibeorm)** — a type-safe TypeScript ORM for Bun and Node. Prisma-schema or TypeScript-DSL input, a canonical schema IR, a generated client, and a dialect-aware SQL layer over PostgreSQL, PGlite, SQLite and MySQL.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
This adapter runs VibeORM on [node-postgres](https://node-postgres.com/) (`pg`) against a PostgreSQL server. It works on both Bun and Node, and `pg` is a peer dependency you install yourself.
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
bun add @vibeorm/adapter-pg pg
|
|
8
|
+
bun add @vibeorm/adapter-pg@alpha pg
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
> **Pre-release.** `2.0.0-alpha.x`, published under the `alpha` dist-tag. `npm i vibeorm` still resolves to the stable v1 line.
|
|
12
|
+
|
|
11
13
|
## Usage
|
|
12
14
|
|
|
13
15
|
```ts
|
|
16
|
+
import { VibeClient } from "./generated/vibeorm/index.js";
|
|
14
17
|
import { pgAdapter } from "@vibeorm/adapter-pg";
|
|
15
|
-
import { VibeClient } from "./generated/vibeorm/index.ts";
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
// connectionString defaults to process.env.DATABASE_URL
|
|
20
|
+
const db = VibeClient({ adapter: pgAdapter({ connectionString: process.env.DATABASE_URL, max: 20 }) });
|
|
21
|
+
|
|
22
|
+
const users = await db.user.findMany({ where: { email: { contains: "@example.com" } }, take: 10 });
|
|
23
|
+
|
|
24
|
+
await db.$disconnect();
|
|
20
25
|
```
|
|
21
26
|
|
|
22
|
-
|
|
27
|
+
To reuse a pool you already own, pass it in. The adapter never ends a pool it did not create, so `disconnect()` is a no-op in that mode:
|
|
23
28
|
|
|
24
29
|
```ts
|
|
25
30
|
import pg from "pg";
|
|
26
|
-
import { pgAdapter } from "@vibeorm/adapter-pg";
|
|
27
31
|
|
|
28
|
-
const pool = new pg.Pool({ connectionString:
|
|
29
|
-
|
|
30
|
-
const adapter = pgAdapter({ pool });
|
|
32
|
+
const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });
|
|
33
|
+
const db = VibeClient({ adapter: pgAdapter({ pool }) });
|
|
31
34
|
```
|
|
32
35
|
|
|
33
|
-
When you pass an existing pool, the adapter will **not** call `pool.end()` on disconnect — you manage the pool lifecycle.
|
|
34
|
-
|
|
35
36
|
## Options
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
// Create a new pool
|
|
39
|
-
type PgAdapterOptions = {
|
|
40
|
-
connectionString?: string; // Connection string (defaults to DATABASE_URL env)
|
|
41
|
-
max?: number; // Pool size (default: 10)
|
|
42
|
-
statementTimeout?: number; // Default query timeout in ms (default: none)
|
|
43
|
-
connectionTimeout?: number; // Max time to acquire a connection in ms (default: none)
|
|
44
|
-
preparedStatements?: boolean; // Enable prepared statement caching (default: false)
|
|
45
|
-
stmtCacheMax?: number; // Max cached prepared statements (default: 1000)
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// Or use an existing pool (BYOP — you manage pool config)
|
|
49
|
-
type PgAdapterOptions = {
|
|
50
|
-
pool: PgPool; // Existing pg.Pool instance
|
|
51
|
-
preparedStatements?: boolean;
|
|
52
|
-
stmtCacheMax?: number;
|
|
53
|
-
};
|
|
54
|
-
```
|
|
38
|
+
`pgAdapter(options?: PgAdapterOptions)`:
|
|
55
39
|
|
|
56
|
-
|
|
40
|
+
| Option | Type | Default | Meaning |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| `connectionString` | `string` | `process.env.DATABASE_URL` | PostgreSQL connection URL |
|
|
43
|
+
| `pool` | `PgPoolLike` | — | An existing `pg.Pool` to use instead of creating one; it is never ended by the adapter |
|
|
44
|
+
| `max` | `number` | `10` | Maximum pooled connections; ignored when `pool` is given |
|
|
45
|
+
| `statementTimeout` | `number` (ms) | — | Pool-wide `statement_timeout`; a per-transaction `timeout` overrides it |
|
|
46
|
+
| `connectionTimeout` | `number` (ms) | — | Wait for a pool checkout before failing (pg's `connectionTimeoutMillis`) |
|
|
47
|
+
| `preparedStatements` | `boolean` | `false` | Send ORM-path queries as named prepared statements. Saves planning time, but PostgreSQL may fall back to a generic plan after ~5 executions — leave off unless profiling says otherwise |
|
|
48
|
+
| `stmtCacheMax` | `number` | `1000` | Maximum entries in the prepared-statement name cache (LRU) |
|
|
57
49
|
|
|
58
|
-
|
|
50
|
+
## Runtime support
|
|
59
51
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
});
|
|
65
|
-
```
|
|
52
|
+
| Runtime | Supported |
|
|
53
|
+
|---|---|
|
|
54
|
+
| Bun ≥ 1.2 | yes |
|
|
55
|
+
| Node (with `pg` installed) | yes |
|
|
66
56
|
|
|
67
|
-
|
|
57
|
+
`pg` is a pure-JavaScript driver, so nothing native has to build. Peer range: `pg >= 8`.
|
|
68
58
|
|
|
69
|
-
|
|
59
|
+
## Capabilities
|
|
70
60
|
|
|
71
|
-
|
|
61
|
+
This is a postgres-dialect adapter, so the full capability set is available: `RETURNING`, scalar array columns, native enums, `ILIKE`, `DISTINCT ON`, partial indexes, transactional DDL, `createManyAndReturn`, a real JSON column type, native `NULLS FIRST`/`NULLS LAST`, and the `"join"` relation strategy (`LEFT JOIN LATERAL` plus JSON aggregation). The generated capability table lives in [docs/dialects.md](https://github.com/vibeorm/vibeorm/blob/master/docs/dialects.md).
|
|
72
62
|
|
|
73
|
-
|
|
63
|
+
Transactions run on one checked-out client; nested `transaction()` calls become savepoints on that same client. Raw transaction control (`BEGIN` / `COMMIT` / `ROLLBACK` sent through the raw path, as `@vibeorm/migrate` does for transactional DDL) pins one client for the duration, so a raw transaction never splits across connections. Concurrent raw transactions on a single adapter are unsupported.
|
|
74
64
|
|
|
75
|
-
|
|
65
|
+
## Parameter serialization: two paths
|
|
76
66
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
67
|
+
`pg` turns a JS array into a PostgreSQL array literal natively, which is what a raw query wants but not what the ORM path can assume. The adapter therefore keeps two helpers:
|
|
68
|
+
|
|
69
|
+
- `serializeParams` (ORM path): plain objects **and** plain arrays are JSON-stringified, since at that point they can only be `json`/`jsonb` values. Scalar-list values are tagged by `formatArrayParam` with `PgArrayParam` and unwrapped, reaching the driver as the untouched array.
|
|
70
|
+
- `serializeParamsRaw` (raw path, `$queryRaw*` / `$executeRaw*` / DDL): plain JS arrays pass straight through, so `$queryRawUnsafe('… WHERE "id" = ANY($1)', [1, 2, 3])` matches rows. Binding an array *into* a `jsonb` column from a raw query means calling `JSON.stringify` yourself.
|
|
71
|
+
|
|
72
|
+
## Error mapping
|
|
73
|
+
|
|
74
|
+
Every driver failure becomes a `VibeError` with the driver error as `cause` and `meta` carrying `sqlstate` plus `constraint` / `table` / `column` when the server reported them. Table (`PG_SQLSTATE_ERROR_CODES`, frozen and mirrored by tests):
|
|
75
|
+
|
|
76
|
+
| SQLSTATE | Condition | VibeError code | `meta.reason` |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| `23505` | unique_violation | `VIBE_UNIQUE_VIOLATION` | |
|
|
79
|
+
| `23503` | foreign_key_violation | `VIBE_FK_VIOLATION` | |
|
|
80
|
+
| `23502` | not_null_violation | `VIBE_VALIDATION` | |
|
|
81
|
+
| `23514` | check_violation | `VIBE_VALIDATION` | |
|
|
82
|
+
| `22P02` | invalid_text_representation | `VIBE_VALIDATION` | |
|
|
83
|
+
| `40001` | serialization_failure | `VIBE_TRANSACTION` | |
|
|
84
|
+
| `40P01` | deadlock_detected | `VIBE_TRANSACTION` | |
|
|
85
|
+
| `57014` | query_canceled (statement_timeout) | `VIBE_TRANSACTION` | `"timeout"` |
|
|
86
|
+
| anything else, including client-side failures such as `ECONNREFUSED` | | `VIBE_ADAPTER` | |
|
|
83
87
|
|
|
84
|
-
|
|
88
|
+
A `VibeError` raised deeper inside the ORM passes through unchanged.
|
|
85
89
|
|
|
86
|
-
##
|
|
90
|
+
## Links
|
|
87
91
|
|
|
88
|
-
[
|
|
92
|
+
- [Documentation](https://github.com/vibeorm/vibeorm/tree/master/docs)
|
|
93
|
+
- [Getting started](https://github.com/vibeorm/vibeorm/blob/master/docs/getting-started.md)
|
|
94
|
+
- [Dialect capability tables](https://github.com/vibeorm/vibeorm/blob/master/docs/dialects.md)
|
|
95
|
+
- [Repository and issues](https://github.com/vibeorm/vibeorm)
|
|
96
|
+
- MIT licensed
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Driver-error mapping for node-postgres (`pg`).
|
|
3
|
+
*
|
|
4
|
+
* Constitution rule 5: a raw driver error never escapes an adapter. Every
|
|
5
|
+
* failure becomes a `VibeError` with a stable code, the driver error attached
|
|
6
|
+
* as `cause`, and the SQLSTATE (plus constraint/table/column when the server
|
|
7
|
+
* reported them) in `meta`.
|
|
8
|
+
*/
|
|
9
|
+
import { VibeError, type VibeErrorCode } from "@vibeorm/schema";
|
|
10
|
+
/**
|
|
11
|
+
* PostgreSQL SQLSTATE → stable VibeError code. Frozen and mirrored by tests;
|
|
12
|
+
* anything absent from this table maps to `VIBE_ADAPTER`.
|
|
13
|
+
*/
|
|
14
|
+
export declare const PG_SQLSTATE_ERROR_CODES: Readonly<Record<string, VibeErrorCode>>;
|
|
15
|
+
/** SQLSTATEs that additionally explain themselves through `meta.reason`. */
|
|
16
|
+
export declare const PG_SQLSTATE_REASONS: Readonly<Record<string, string>>;
|
|
17
|
+
/**
|
|
18
|
+
* Extract the SQLSTATE from a pg driver error. `pg` puts the server's SQLSTATE
|
|
19
|
+
* on `error.code`; client-side failures (`ECONNREFUSED`, `ETIMEDOUT`, …) use
|
|
20
|
+
* the same field for a non-SQLSTATE string, which this rejects.
|
|
21
|
+
*/
|
|
22
|
+
export declare function pgErrorSqlstate(params: {
|
|
23
|
+
error: unknown;
|
|
24
|
+
}): string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Map any error thrown by `pg` onto a `VibeError`.
|
|
27
|
+
*
|
|
28
|
+
* A `VibeError` passes through unchanged, so an error raised deeper inside the
|
|
29
|
+
* ORM (or by a nested adapter call) is never re-wrapped.
|
|
30
|
+
*/
|
|
31
|
+
export declare function mapPgDriverError(params: {
|
|
32
|
+
error: unknown;
|
|
33
|
+
}): VibeError;
|
|
34
|
+
/** Run a driver call, mapping anything it throws onto a `VibeError`. */
|
|
35
|
+
export declare function runMapped<T>(fn: () => Promise<T>): Promise<T>;
|
|
36
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CA2B1E,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE/D,CAAC;AAYH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAK9E;AAID;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CA0BtE;AAED,wEAAwE;AACxE,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAMnE"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vibeorm/adapter-pg — node-postgres (`pg`) adapter for VibeORM v2.
|
|
3
|
+
*
|
|
4
|
+
* Runs on Bun and Node. Owns pooling, optional named prepared statements,
|
|
5
|
+
* transactions (nested → savepoints on the same client) and driver-error
|
|
6
|
+
* mapping. Only `VibeError` ever escapes.
|
|
7
|
+
*/
|
|
8
|
+
import type { DatabaseAdapter } from "@vibeorm/runtime";
|
|
9
|
+
/** The single `pg` query form this adapter uses (config object, never overloads). */
|
|
10
|
+
export type PgQueryConfig = {
|
|
11
|
+
readonly text: string;
|
|
12
|
+
readonly values?: unknown[];
|
|
13
|
+
readonly name?: string;
|
|
14
|
+
/**
|
|
15
|
+
* QUERY-LOCAL result parsers ({@link EXACT_TYPES}). node-postgres reads this
|
|
16
|
+
* off the query config, so nothing outside VibeORM's own statements is
|
|
17
|
+
* affected — a caller's pool keeps the driver's documented behaviour.
|
|
18
|
+
*/
|
|
19
|
+
readonly types?: PgTypeParsers;
|
|
20
|
+
};
|
|
21
|
+
/** The `pg-types` surface a query config may carry. */
|
|
22
|
+
export type PgTypeParsers = {
|
|
23
|
+
getTypeParser(oid: number, format?: "text" | "binary"): (value: string) => unknown;
|
|
24
|
+
};
|
|
25
|
+
/** The parts of a `pg` result this adapter reads. */
|
|
26
|
+
export type PgQueryResultLike = {
|
|
27
|
+
readonly rows: Record<string, unknown>[];
|
|
28
|
+
readonly rowCount: number | null;
|
|
29
|
+
};
|
|
30
|
+
/** The parts of a `pg` PoolClient this adapter uses. */
|
|
31
|
+
export type PgPoolClientLike = {
|
|
32
|
+
query(config: PgQueryConfig): Promise<PgQueryResultLike>;
|
|
33
|
+
/**
|
|
34
|
+
* Hand the client back. A TRUTHY argument tells node-postgres to DESTROY it
|
|
35
|
+
* instead of pooling it — used when a rollback failed and the session state
|
|
36
|
+
* can no longer be asserted (EPIC 6). Optional so existing test doubles that
|
|
37
|
+
* declare `release(): void` still satisfy this type.
|
|
38
|
+
*/
|
|
39
|
+
release(destroy?: boolean): void;
|
|
40
|
+
/**
|
|
41
|
+
* EventEmitter surface. A real `pg.PoolClient` has it; test doubles need not,
|
|
42
|
+
* so both members are optional and the adapter feature-detects them.
|
|
43
|
+
*/
|
|
44
|
+
on?(event: "error", listener: (error: unknown) => void): void;
|
|
45
|
+
removeListener?(event: "error", listener: (error: unknown) => void): void;
|
|
46
|
+
};
|
|
47
|
+
/** The parts of a `pg` Pool this adapter uses — satisfied by a real `pg.Pool`. */
|
|
48
|
+
export type PgPoolLike = {
|
|
49
|
+
connect(): Promise<PgPoolClientLike>;
|
|
50
|
+
query(config: PgQueryConfig): Promise<PgQueryResultLike>;
|
|
51
|
+
end(): Promise<void>;
|
|
52
|
+
/** EventEmitter surface; optional for the same reason as on {@link PgPoolClientLike}. */
|
|
53
|
+
on?(event: "error", listener: (error: unknown, client: PgPoolClientLike) => void): void;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Options for {@link pgAdapter}. Either point it at a connection string (the
|
|
57
|
+
* adapter then owns the pool it creates) or hand it a pool you already own.
|
|
58
|
+
*/
|
|
59
|
+
export type PgAdapterOptions = {
|
|
60
|
+
/** PostgreSQL connection URL. Defaults to `process.env.DATABASE_URL`. */
|
|
61
|
+
readonly connectionString?: string;
|
|
62
|
+
/**
|
|
63
|
+
* An existing `pg.Pool` to use instead of creating one. The adapter never
|
|
64
|
+
* ends a pool it did not create, so `disconnect()` is a no-op in this mode.
|
|
65
|
+
*/
|
|
66
|
+
readonly pool?: PgPoolLike;
|
|
67
|
+
/** Maximum pooled connections (default 10). Ignored when `pool` is given. */
|
|
68
|
+
readonly max?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Pool-wide `statement_timeout` in milliseconds. Every connection inherits
|
|
71
|
+
* it; a per-transaction `timeout` overrides it for that transaction.
|
|
72
|
+
*/
|
|
73
|
+
readonly statementTimeout?: number;
|
|
74
|
+
/** Milliseconds to wait for a pool checkout before failing (pg's `connectionTimeoutMillis`). */
|
|
75
|
+
readonly connectionTimeout?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Send ORM-path queries as named prepared statements (default false).
|
|
78
|
+
* Named statements save planning time but let PostgreSQL fall back to a
|
|
79
|
+
* generic plan after ~5 executions, which can pick worse indexes for range
|
|
80
|
+
* filters — leave off unless profiling says otherwise.
|
|
81
|
+
*/
|
|
82
|
+
readonly preparedStatements?: boolean;
|
|
83
|
+
/** Maximum entries in the prepared-statement name cache (default 1000, LRU). */
|
|
84
|
+
readonly stmtCacheMax?: number;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Create a VibeORM adapter backed by node-postgres.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```ts
|
|
91
|
+
* const adapter = pgAdapter({ connectionString: process.env.DATABASE_URL, max: 20 });
|
|
92
|
+
* await adapter.connect();
|
|
93
|
+
* const rows = await adapter.execute({ text: 'SELECT * FROM "User" WHERE "id" = $1', values: [1] });
|
|
94
|
+
* ```
|
|
95
|
+
*
|
|
96
|
+
* @example Reusing a pool you already own
|
|
97
|
+
* ```ts
|
|
98
|
+
* import pg from "pg";
|
|
99
|
+
* const pool = new pg.Pool({ connectionString });
|
|
100
|
+
* const adapter = pgAdapter({ pool });
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export declare function pgAdapter(options?: PgAdapterOptions): DatabaseAdapter;
|
|
104
|
+
export { PG_SQLSTATE_ERROR_CODES, PG_SQLSTATE_REASONS, mapPgDriverError, pgErrorSqlstate } from "./errors.ts";
|
|
105
|
+
export { PgArrayParam, serializeParams, serializeParamsRaw } from "./params.ts";
|
|
106
|
+
export { createSavepointCounter, nextSavepointName } from "./savepoints.ts";
|
|
107
|
+
export type { SavepointCounter } from "./savepoints.ts";
|
|
108
|
+
export { createStatementNameCache } from "./statement-cache.ts";
|
|
109
|
+
export type { StatementNameCache } from "./statement-cache.ts";
|
|
110
|
+
export { ISOLATION_LEVEL_SQL, beginStatement, classifyRawTransactionControl, refuseNestedTransactionOptions, statementTimeoutStatement, } from "./transaction-sql.ts";
|
|
111
|
+
export type { RawTransactionControl } from "./transaction-sql.ts";
|
|
112
|
+
export { DEFAULT_DEADLINE_CLOCK, engineStatementBudgetMs, isTransactionDeadlineError, startTransactionBudget, transactionClosedError, transactionDeadlineError, transactionOutcomeUnknownError, validateTransactionDeadline, } from "./transaction-budget.ts";
|
|
113
|
+
export type { BudgetStage, DeadlineClock, TransactionBudget, TransactionOutcome } from "./transaction-budget.ts";
|
|
114
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|