@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 CHANGED
@@ -1,88 +1,96 @@
1
1
  # @vibeorm/adapter-pg
2
2
 
3
- `node-postgres` adapter for VibeORM. Use VibeORM with the `pg` driver on Bun or Node.js.
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
- ## Installation
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
- const db = VibeClient({
18
- adapter: pgAdapter({ connectionString: "postgres://user:pass@localhost:5432/mydb" }),
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
- ### Using an existing pool
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: "postgres://..." });
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
- ```ts
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
- ### Statement timeout
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
- Set a default timeout for all queries. Any query exceeding this duration is cancelled by PostgreSQL (SQLSTATE `57014`), surfaced as a `VibeTransientError` with code `STATEMENT_TIMEOUT`.
50
+ ## Runtime support
59
51
 
60
- ```ts
61
- const adapter = pgAdapter({
62
- connectionString: "postgres://...",
63
- statementTimeout: 30000, // 30 seconds
64
- });
65
- ```
52
+ | Runtime | Supported |
53
+ |---|---|
54
+ | Bun ≥ 1.2 | yes |
55
+ | Node (with `pg` installed) | yes |
66
56
 
67
- Passed as `statement_timeout` in the pg Pool config, so every connection inherits it automatically with zero per-query overhead.
57
+ `pg` is a pure-JavaScript driver, so nothing native has to build. Peer range: `pg >= 8`.
68
58
 
69
- Transaction-level `timeout` (via `db.$transaction(fn, { timeout })`) overrides this default for that transaction using `SET LOCAL statement_timeout`.
59
+ ## Capabilities
70
60
 
71
- > **Note:** `statementTimeout` and `connectionTimeout` are only available when creating a new pool. When you pass an existing `pool`, you manage these settings yourself via your pool config.
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
- ### Connection timeout
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
- Limit how long pool checkout (acquiring a connection) can take:
65
+ ## Parameter serialization: two paths
76
66
 
77
- ```ts
78
- const adapter = pgAdapter({
79
- connectionString: "postgres://...",
80
- connectionTimeout: 5000, // 5 seconds
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
- Mapped to pg Pool's `connectionTimeoutMillis` option. Throws when the pool is exhausted and no connection becomes available within the limit.
88
+ A `VibeError` raised deeper inside the ORM passes through unchanged.
85
89
 
86
- ## License
90
+ ## Links
87
91
 
88
- [MIT](../../LICENSE)
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
@@ -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"}
@@ -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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"}