@vibeorm/adapter-bun 2.4.0 → 3.0.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/dist/index.js.map CHANGED
@@ -1,17 +1,18 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/driver.ts", "../src/config.ts", "../src/index.ts", "../src/connection-url.ts", "../src/errors.ts", "../src/params.ts", "../src/template-cache.ts", "../src/transaction-sql.ts"],
3
+ "sources": ["../src/driver.ts", "../src/config.ts", "../src/bun-version.ts", "../src/index.ts", "../src/connection-url.ts", "../src/errors.ts", "../src/params.ts", "../src/template-cache.ts", "../src/transaction-sql.ts"],
4
4
  "sourcesContent": [
5
- "import { SQL } from \"bun\";\n\n/** Internal constructor boundary; keeps the driver double out of the public adapter API. */\nexport function createBunSql(params: { url?: string; options: Record<string, unknown> }): SQL {\n return params.url === undefined ? new SQL(params.options) : new SQL(params.url, params.options);\n}\n",
6
- "/** Migration-only driver instance; never force-close the application's pool. */\nexport const SESSION_CONNECTION: Readonly<{ max: number; closeGraceSeconds: number }> = Object.freeze({\n max: 1,\n // Bun 1.3 treats timeout: 0 as unbounded. A positive millisecond closes only\n // this private instance after the session gate has drained dispatched work.\n closeGraceSeconds: 0.001,\n});\n",
7
- "/**\n * @vibeorm/adapter-bun — bun:sql (PostgreSQL) adapter for VibeORM v2.\n *\n * Uses Bun's built-in SQL driver and its internal connection pool. Owns\n * optional prepared statements (synthetic tagged templates), transactions\n * (nested → savepoints), array-literal parameter formatting and driver-error\n * mapping. Only `VibeError` ever escapes.\n */\n\nimport { createBunSql } from \"./driver.ts\";\nimport { SESSION_CONNECTION } from \"./config.ts\";\nimport { postgresDialect, renderDiagnostic } from \"@vibeorm/sql\";\nimport type {\n AdapterBudgetSupport,\n DatabaseAdapter,\n QueryResult,\n RowChangeCount,\n StatementEffect,\n TransactionOptions,\n WireFidelity,\n} from \"@vibeorm/runtime\";\nimport {\n abortTransactionOnServerFailure,\n observeRowChanges,\n readRowChanges,\n statementRowChanges,\n markSavepointOpened,\n runPinnedSession,\n createSavepointScope,\n savepointRollbackFailedError,\n engineStatementBudgetMs,\n isTransactionDeadlineError,\n runNestedSavepoint,\n runRootScope,\n type SavepointScope,\n scopeTurn,\n startTransactionBudget,\n type TransactionBudget,\n transactionOutcomeUnknownError,\n validateTransactionDeadline,\n} from \"@vibeorm/runtime/adapter-kit\";\nimport { VibeError, type Dialect, type Provider } from \"@vibeorm/schema\";\nimport { applyStartupOptions, buildStartupOptions, type PlanCacheMode } from \"./connection-url.ts\";\nimport { mapBunDriverError, runMapped } from \"./errors.ts\";\nimport { serializeParams, serializeParamsRaw, toPgArrayLiteral } from \"./params.ts\";\nimport { bindTemplateValues, createTemplateCache } from \"./template-cache.ts\";\nimport {\n beginStatement,\n classifyRawTransactionControl,\n refuseNestedTransactionOptions,\n statementTimeoutStatement,\n} from \"./transaction-sql.ts\";\n\n// ─── Minimal bun:sql surface ──────────────────────────────────────\n\n/**\n * What bun:sql resolves a query to: the row array, with driver metadata\n * (`count`, `command`) attached as properties.\n */\ntype BunRows = Record<string, unknown>[] & { count?: number; affectedRows?: number; command?: string };\n\ntype BunResults = BunRows | BunRows[] | null;\n\n/** Anything that executes SQL through bun:sql. */\ntype BunExecutor = {\n (strings: TemplateStringsArray, ...values: unknown[]): Promise<BunResults>;\n unsafe(text: string, values?: unknown[]): Promise<BunResults>;\n};\n\n/**\n * The handle passed to `sql.begin(cb)`. Modern bun:sql exposes `savepoint(fn)`\n * for sub-transactions; `begin()` throws inside a transaction (\"use\n * savepoint() instead\"), so it is never called here. Older builds lack\n * `savepoint`, which is why it is optional and probed at runtime.\n */\ntype BunTransaction = BunExecutor & {\n savepoint?: <T>(fn: (sp: BunTransaction) => Promise<T>) => Promise<T>;\n};\n\n/** A connection checked out with `sql.reserve()` — no `savepoint`, must be released. */\ntype BunReserved = BunExecutor & { release(): void; close(): Promise<void> };\n\n/** The pool-level bun:sql client. */\ntype BunInstance = BunExecutor & {\n begin<T>(fn: (tx: BunTransaction) => Promise<T>): Promise<T>;\n reserve(): Promise<BunReserved>;\n close(options?: { timeout: number }): Promise<void>;\n};\n\n/** Any bun:sql handle the adapter can be built on top of. */\ntype BunSource = BunInstance | BunReserved | BunTransaction;\n\n/**\n * Whether a handle is the pool (can open a real transaction) or is already\n * inside one (must nest through savepoints).\n */\ntype ParentMode = \"pool\" | \"tx\";\n\n/**\n * Wrapper that marks an error as \"thrown by the user's transaction callback\",\n * so it can be rethrown untouched instead of being mapped as a driver failure\n * after bun:sql has passed it back out of `begin()` / `savepoint()`.\n */\nclass CallbackError extends Error {\n readonly inner: unknown;\n\n constructor(inner: unknown) {\n super(\"vibeorm: transaction callback failed\");\n this.name = \"CallbackError\";\n this.inner = inner;\n }\n}\n\n// ─── Options ──────────────────────────────────────────────────────\n\n/** Options for {@link bunAdapter}. */\nexport type BunAdapterOptions = {\n /** PostgreSQL connection URL. Defaults to `process.env.DATABASE_URL`, then bun's `PG*` env vars. */\n readonly url?: string;\n /** Maximum pooled connections (default 10). */\n readonly max?: number;\n /**\n * Pool-wide `statement_timeout` in milliseconds, sent as a startup parameter\n * so every connection inherits it. A per-transaction `timeout` overrides it\n * for that transaction.\n */\n readonly statementTimeout?: number;\n /**\n * Milliseconds to wait for a connection to be established. Passed to bun:sql\n * as `connectionTimeout` (which expects **seconds**; converted here).\n */\n readonly connectionTimeout?: number;\n /**\n * Execute ORM-path queries as tagged templates, creating named prepared\n * statements (default false). Saves planning time but lets PostgreSQL fall\n * back to a generic plan after ~5 executions — leave off unless profiling\n * says otherwise. bun:sql's `prepare: false` constructor option is never set\n * (it triggers a known bun:sql performance regression).\n */\n readonly preparedStatements?: boolean;\n /** Maximum entries in the synthetic template cache (default 1000, LRU). */\n readonly stmtCacheMax?: number;\n /** PostgreSQL `plan_cache_mode` for every connection (default `force_custom_plan`). */\n readonly planCacheMode?: PlanCacheMode;\n};\n\n// ─── Adapter ──────────────────────────────────────────────────────\n\nconst DIALECT: Dialect = \"postgres\";\nconst PROVIDER: Provider = \"postgresql\";\n\n/**\n * bun:sql wire (board #30, live-verified on both execute paths): timestamptz\n * → `Date`, int4/float8 → numbers. (int8 arrives as a string — BigInt\n * decoding is real work and never pruned.)\n *\n * The `json` half is NOT a constant, because bun:sql's answer changed between\n * Bun versions and this package supports a range of them: on Bun 1.3.14 the\n * tagged-template path parsed json/jsonb while `sql.unsafe` did not (board\n * #34 — declaring \"parsed\" there made the runtime prune the Json decoder and\n * leak raw strings), and on Bun 1.4.1 BOTH paths parse (leaving \"text\" makes\n * the guarded decode re-parse a stored top-level JSON string: `\"123\"` becomes\n * the number 123, `\"hello\"` throws). Either constant is wrong on one of those\n * runtimes, so the adapter OBSERVES its own driver once instead of guessing —\n * see {@link probeJsonWire}. {@link WIRE_TEXT} is the conservative claim it\n * starts from; no ORM rows are returned until the probe succeeds.\n */\n/**\n * Timing budgets this adapter genuinely enforces (EPIC 6).\n *\n * - `acquireTimeout: false` — `connectionTimeout` bounds establishment only.\n * Modern Bun supports reserve({ signal }), but implicit query/begin checkout\n * and older supported Bun versions do not provide that cancellation contract.\n * - `statementTimeout: \"all-statements\"` — a real PostgreSQL server, so\n * `statement_timeout` cancels ANY over-long statement, writes included.\n * - `transactionDeadline: \"cancel-running-statements\"` — the remaining budget\n * is handed to the SERVER before each statement, so the database itself stops\n * work that would outlive the deadline.\n */\nconst BUDGETS: AdapterBudgetSupport = Object.freeze({\n acquireTimeout: false,\n statementTimeout: \"all-statements\",\n transactionDeadline: \"cancel-running-statements\",\n} as const);\n\nconst WIRE_TEXT: WireFidelity = Object.freeze({ dateTime: \"native\", json: \"text\", numbers: \"native\" } as const);\n\n/** The same wire, for a driver observed to hand back parsed json. */\nconst WIRE_PARSED: WireFidelity = Object.freeze({ dateTime: \"native\", json: \"parsed\", numbers: \"native\" } as const);\n\n/**\n * Create a VibeORM adapter backed by bun:sql.\n *\n * @example\n * ```ts\n * const adapter = bunAdapter({ url: process.env.DATABASE_URL, max: 10 });\n * await adapter.connect();\n * const rows = await adapter.execute({ text: 'SELECT * FROM \"User\" WHERE \"id\" = $1', values: [1] });\n * ```\n */\nexport function bunAdapter(options?: BunAdapterOptions): DatabaseAdapter {\n const usePrepared = options?.preparedStatements ?? false;\n const templates = createTemplateCache({ max: options?.stmtCacheMax ?? 1000 });\n\n /**\n * The wire claim this adapter currently makes. Starts conservative and is\n * replaced at most once, by {@link probeJsonWire}'s observation. Every handle\n * this factory builds — pool, transaction, savepoint, reserved session —\n * reads this one variable, so a transaction can never disagree with its\n * parent (the contract requires transactional adapters to carry the same\n * declaration).\n */\n let activeWire: WireFidelity = WIRE_TEXT;\n let wireSettled = false;\n let wireProbe: Promise<void> | null = null;\n\n let instance: BunInstance | null = null;\n const deadlineTurns = new WeakMap<TransactionBudget, Promise<void>>();\n\n // Only deadline-bearing connections need a queue. Share it across every\n // nested facade, not one queue per handle. Probe, statement and COMMIT each\n // receive a fresh bound after preceding work finishes.\n function budgetTurn<T>(params: {\n source: BunExecutor;\n budget?: TransactionBudget;\n stage?: \"statement\" | \"commit\";\n cleanup?: boolean;\n guard?: () => void;\n body: () => Promise<T>;\n }): Promise<T> {\n const { source, budget, body, guard } = params;\n const run = async (): Promise<T> => {\n if (params.cleanup === true) return body();\n budget?.assertUsable({ stage: params.stage ?? \"statement\" });\n guard?.();\n const ms = budget === undefined ? null : engineStatementBudgetMs({ budget });\n if (ms !== null) {\n await runMapped(() => source.unsafe(statementTimeoutStatement({ timeout: ms })));\n budget?.assertUsable({ stage: params.stage ?? \"statement\" });\n guard?.();\n }\n return body();\n };\n if (budget === undefined || budget.totalMs === null) return run();\n const result = (deadlineTurns.get(budget) ?? Promise.resolve()).then(run);\n deadlineTurns.set(budget, result.then(() => undefined, () => undefined));\n return result;\n }\n\n /**\n * The reserved connection of an OPEN raw transaction — session affinity for\n * the raw path. @vibeorm/migrate wraps transactional DDL in literal `BEGIN`\n * / `COMMIT` / `ROLLBACK` sent through `executeUnsafe`; bun:sql refuses\n * transaction control through `sql.unsafe()` on a pooled instance\n * (`ERR_POSTGRES_UNSAFE_TRANSACTION`), so a pure `BEGIN` reserves one\n * connection, every raw statement until the matching `COMMIT`/`ROLLBACK`\n * rides it, and the close releases it. The ORM path (`execute`) and\n * `transaction()` stay on the pool — they never participate in a raw\n * transaction. Concurrent raw transactions on one adapter are unsupported\n * (they were driver-refused before this pinning existed).\n */\n let rawSession: BunReserved | null = null;\n\n function createSqlInstance(params: { max: number }): BunInstance {\n const sqlOptions: Record<string, unknown> = { max: params.max };\n if (options?.connectionTimeout !== undefined) {\n // bun:sql expects seconds; the VibeORM surface is milliseconds everywhere.\n sqlOptions.connectionTimeout = Math.max(1, Math.ceil(options.connectionTimeout / 1000));\n }\n\n const startupOptions = buildStartupOptions({\n planCacheMode: options?.planCacheMode ?? \"force_custom_plan\",\n statementTimeout: options?.statementTimeout,\n });\n const baseUrl = options?.url ?? process.env.DATABASE_URL;\n const url =\n baseUrl === undefined || startupOptions === undefined\n ? baseUrl\n : applyStartupOptions({ url: baseUrl, startupOptions });\n\n // Bun's constructor connection object also supports PG*-only configuration.\n if (url === undefined && startupOptions !== undefined) {\n sqlOptions.connection = { options: startupOptions };\n }\n return createBunSql({ url, options: sqlOptions }) as unknown as BunInstance;\n }\n\n function getSql(): BunInstance {\n instance ??= createSqlInstance({ max: options?.max ?? 10 });\n return instance;\n }\n\n /**\n * Ask THIS driver, once, whether it parses json on the path the ORM reads\n * rows over — the same `execute` path, prepared or unsafe as configured, so\n * the answer describes the traffic the claim is applied to.\n *\n * Runs on the handle that is already in hand (pool, transaction or reserved\n * session): a `SELECT` is harmless inside a transaction, and probing the pool\n * from inside one could deadlock an adapter configured with `max: 1`.\n * Failure refuses this operation. A later call can observe the wire again;\n * no user statement or transaction is retried.\n */\n async function probeJsonWire(source: BunExecutor): Promise<void> {\n const probe = renderDiagnostic({ dialect: postgresDialect, query: \"postgresJsonWire\" });\n const rows = finalRows({ result: await runMapped(() => usePrepared\n ? source(templates.getTemplate({ text: probe.text }).template)\n : source.unsafe(probe.text, [])) });\n const probed = rows[0]?.probe;\n if (typeof probed === \"object\" && probed !== null && \"__vibeorm\" in probed && probed.__vibeorm === 1) activeWire = WIRE_PARSED;\n else if (typeof probed === \"string\" && /^\\{\\s*\"__vibeorm\"\\s*:\\s*1\\s*\\}$/.test(probed)) activeWire = WIRE_TEXT;\n else {\n throw new VibeError({\n code: \"VIBE_ADAPTER\",\n message: \"Bun returned an unrecognized JSON wire probe result; no ORM statement was sent\",\n meta: { reason: \"json-wire-probe\" },\n });\n }\n wireSettled = true;\n }\n\n function observeResult(params: { scope?: SavepointScope; effect?: StatementEffect; result: BunResults }): void {\n if (params.scope === undefined) return;\n const result = params.result;\n const results: BunRows[] = result === null ? [[]] : Array.isArray(result[0]) ? result as BunRows[] : [result as BunRows];\n if (results.length === 0) observeRowChanges({ scope: params.scope, count: statementRowChanges({ effect: params.effect }) });\n for (const rows of results) observeRowChanges({ scope: params.scope, count: statementRowChanges({ effect: params.effect, count: rows.count ?? rows.affectedRows }) });\n }\n\n async function runExecute(params: {\n source: BunExecutor;\n text: string;\n values: unknown[];\n scope?: SavepointScope;\n effect?: StatementEffect;\n }): Promise<Record<string, unknown>[]> {\n // One extra round trip on the first ORM query of this adapter's life; a\n // single boolean test on every one after it. It must complete BEFORE the\n // first rows are handed back, because the runtime reads `wire` to build\n // that read's decode plan.\n if (!wireSettled) {\n wireProbe ??= probeJsonWire(params.source).finally(() => { wireProbe = null; });\n await wireProbe;\n }\n const values = serializeParams({ values: params.values });\n if (usePrepared) {\n // F19: a tagged template binds POSITIONALLY, one value per gap — so the\n // values follow the placeholder ORDER found in the text (`$2, $1` binds\n // backwards otherwise, and a repeated `$1` needs its value twice).\n const prepared = templates.getTemplate({ text: params.text });\n const bound = bindTemplateValues({ text: params.text, indices: prepared.indices, values });\n const result = await runMapped(() => params.source(prepared.template, ...bound));\n observeResult({ scope: params.scope, effect: params.effect, result });\n return finalRows({ result });\n }\n const result = await runMapped(() => params.source.unsafe(params.text, values));\n observeResult({ scope: params.scope, effect: params.effect, result });\n return finalRows({ result });\n }\n\n async function runExecuteUnsafe(params: {\n source: BunExecutor;\n text: string;\n values?: unknown[];\n scope?: SavepointScope;\n effect?: StatementEffect;\n }): Promise<QueryResult> {\n const values = params.values === undefined ? undefined : serializeParamsRaw({ values: params.values });\n const result = await runMapped(() => params.source.unsafe(params.text, values));\n observeResult({ scope: params.scope, effect: params.effect, result });\n const rows = finalRows({ result });\n return { rows, affectedRows: readAffectedRows({ rows }) };\n }\n\n /**\n * Build the adapter facade over any bun:sql handle. `parentMode` decides\n * whether a nested `transaction()` opens a real transaction or a savepoint;\n * `scope` is shared by reference across one top-level transaction, and the\n * savepoint gate serializes overlapping sibling savepoints (F14) on BOTH the\n * driver-managed and the manual path.\n */\n function createAdapter(params: {\n source: BunSource;\n parentMode: ParentMode;\n scope: SavepointScope;\n /** The enclosing transaction's budget; absent on the pool-level adapter. */\n budget?: TransactionBudget;\n lifetime?: { active: boolean };\n }): DatabaseAdapter {\n const { source, parentMode, scope, budget, lifetime } = params;\n\n function assertHandle(): void {\n budget?.assertUsable({ stage: \"statement\" });\n if (lifetime?.active === false) {\n throw new VibeError({\n code: \"VIBE_TRANSACTION\",\n message: \"this savepoint callback has finished; its transaction handle has expired\",\n meta: { reason: \"expired\" },\n });\n }\n if (scope.state.poisoned !== null) throw scope.state.poisoned;\n }\n\n const guardedSource: BunExecutor = Object.assign(\n (strings: TemplateStringsArray, ...values: unknown[]): Promise<BunResults> =>\n budgetTurn({ source, budget, guard: assertHandle, body: () => source(strings, ...values) }),\n { unsafe: (text: string, values?: unknown[]): Promise<BunResults> =>\n budgetTurn({ source, budget, guard: assertHandle, body: () => source.unsafe(text, values) }) },\n );\n\n /** Nested transaction: a savepoint on the connection we are already on. */\n async function transactionViaSavepoint<T>(\n fn: (txAdapter: DatabaseAdapter) => Promise<T>,\n nestedOptions?: TransactionOptions,\n ): Promise<T> {\n refuseNestedTransactionOptions({ options: nestedOptions, provider: PROVIDER });\n assertHandle();\n budget?.assertUsable({ stage: \"nested\" });\n const transactional = source as BunTransaction;\n const runChild = async (child: SavepointScope, childSource: BunTransaction): Promise<T> => {\n assertHandle();\n const childLifetime = { active: true };\n try {\n return await fn(createAdapter({ source: childSource, parentMode: \"tx\", scope: child, budget, lifetime: childLifetime }));\n } finally {\n childLifetime.active = false;\n }\n };\n\n // Modern bun:sql: the in-transaction handle drives savepoints itself —\n // the gate then owns only the LIFETIME, not the SQL. Captured before the\n // callback because narrowing does not reach into a nested closure.\n const driverSavepoint = transactional.savepoint?.bind(transactional);\n if (driverSavepoint !== undefined) {\n return runNestedSavepoint({\n scope,\n body: async (child) => {\n let callbackFailure: CallbackError | undefined;\n try {\n return await driverSavepoint(async (savepointSql) => {\n markSavepointOpened({ scope: child });\n try {\n return await runChild(child, savepointSql);\n } catch (error) {\n callbackFailure = new CallbackError(error);\n throw callbackFailure;\n }\n });\n } catch (error) {\n // Bun rethrows the identical callback marker only after successful\n // rollback. A replacement error loses that proof. Creation/release\n // errors likewise do not expose whether recovery succeeded.\n if (callbackFailure !== undefined && error === callbackFailure) throw callbackFailure.inner;\n const poisoned = callbackFailure !== undefined\n ? savepointRollbackFailedError({ cause: callbackFailure.inner, rollbackFailure: mapBunDriverError({ error }) })\n : unknownOutcome({ cause: mapBunDriverError({ error }), reason: \"savepoint-outcome-unknown\" });\n scope.state.poisoned = poisoned;\n throw poisoned;\n }\n },\n });\n }\n\n // Reserved connections (and older bun:sql) expose no savepoint helper —\n // drive SAVEPOINT / RELEASE / ROLLBACK TO by hand.\n return runNestedSavepoint({\n scope,\n execute: (statement) => budgetTurn({\n source, budget, cleanup: statement.startsWith(\"ROLLBACK TO SAVEPOINT \"),\n body: () => runMapped(() => transactional.unsafe(statement)),\n }),\n body: (child) => runChild(child, transactional),\n });\n }\n\n /** Top-level transaction on the pool. */\n async function transactionViaPool<T>(\n fn: (txAdapter: DatabaseAdapter) => Promise<T>,\n transactionOptions?: TransactionOptions,\n ): Promise<T> {\n const pool = source as BunInstance;\n\n // Refuse an unsupportable budget before any connection is taken.\n validateTransactionDeadline({\n options: transactionOptions,\n support: BUDGETS.transactionDeadline,\n provider: PROVIDER,\n });\n\n // Fast path: bun:sql drives BEGIN/COMMIT itself. A DEADLINE opts out of\n // it deliberately — the clock must start after the connection is in hand,\n // and only the reserved path below gives that seam.\n if (\n transactionOptions?.isolationLevel === undefined &&\n transactionOptions?.timeout === undefined &&\n transactionOptions?.deadline === undefined\n ) {\n // A budget with no deadline: it still closes the handle at the end, so\n // an escaped transaction client cannot run on a pooled connection.\n const budget = startTransactionBudget({ provider: PROVIDER });\n const txScope = createSavepointScope();\n let callbackFailure: CallbackError | undefined;\n try {\n const result = await pool.begin(async (txSql) => {\n const txAdapter = createAdapter({\n source: txSql,\n parentMode: \"tx\",\n scope: txScope,\n budget,\n });\n try {\n return await runRootScope({ scope: txScope, body: () => fn(txAdapter) });\n } catch (error) {\n callbackFailure = new CallbackError(error);\n throw callbackFailure;\n }\n });\n budget.close({ outcome: \"committed\" });\n return result;\n } catch (error) {\n const knownRollback = callbackFailure !== undefined && error === callbackFailure && txScope.state.poisoned === null;\n budget.close({ outcome: knownRollback ? \"rolled-back\" : \"unknown\" });\n if (callbackFailure !== undefined && error === callbackFailure) throw callbackFailure.inner;\n throw unknownOutcome({ cause: callbackFailure?.inner ?? mapBunDriverError({ error }) });\n }\n }\n\n // Options path: reserve one connection and drive the transaction by hand,\n // because bun:sql's begin() takes no isolation/timeout options.\n const timeoutText =\n transactionOptions.timeout === undefined\n ? undefined\n : statementTimeoutStatement({ timeout: transactionOptions.timeout });\n const reserved = await runMapped(() => pool.reserve());\n // The deadline clock starts HERE: the connection is reserved, so waiting\n // for it is not charged against the caller's transaction budget.\n const budget = startTransactionBudget({ options: transactionOptions, provider: PROVIDER });\n const txScope = createSavepointScope();\n let commitSent = false;\n let discard = false;\n try {\n await runMapped(() =>\n reserved.unsafe(beginStatement({ isolationLevel: transactionOptions.isolationLevel })),\n );\n if (timeoutText !== undefined) await runMapped(() => reserved.unsafe(timeoutText));\n const txAdapter = createAdapter({\n source: reserved,\n parentMode: \"tx\",\n scope: txScope,\n budget,\n });\n const result = await runRootScope({ scope: txScope, body: () => fn(txAdapter) });\n // An expired budget must never commit, however the callback ended.\n await budgetTurn({ source: reserved, budget, stage: \"commit\", body: () => {\n commitSent = true;\n return runMapped(() => reserved.unsafe(\"COMMIT\"));\n } });\n budget.close({ outcome: \"committed\" });\n return result;\n } catch (error) {\n try {\n await reserved.unsafe(\"ROLLBACK\");\n budget.close({ outcome: commitSent || txScope.state.poisoned !== null ? \"unknown\" : \"rolled-back\" });\n } catch {\n // The rollback that should have cleaned up failed: the commit state is\n // genuinely unknown. `SET LOCAL` reverts with the transaction, but\n // this session's transaction state can no longer be asserted.\n discard = true;\n budget.close({ outcome: \"unknown\" });\n if (budget.totalMs !== null && isTransactionDeadlineError(error)) {\n throw transactionOutcomeUnknownError({\n provider: PROVIDER,\n totalMs: budget.totalMs,\n cause: error,\n });\n }\n }\n if (budget.outcome === \"unknown\" && txScope.state.poisoned === null) throw unknownOutcome({ cause: error });\n throw error;\n } finally {\n if (discard) await runMapped(() => reserved.close());\n else reserved.release();\n }\n }\n\n return {\n dialect: DIALECT,\n provider: PROVIDER,\n budgets: BUDGETS,\n ...(parentMode === \"pool\" ? {} : { rowChanges: (): RowChangeCount => { assertHandle(); return readRowChanges({ scope }); } }),\n get wire(): WireFidelity {\n return activeWire;\n },\n\n async execute(execParams) {\n assertHandle();\n const turn = scopeTurn({ scope });\n if (turn !== undefined) await turn;\n assertHandle();\n const result = runExecute({ source: guardedSource, ...(parentMode === \"pool\" ? {} : { scope }), ...execParams });\n // Inside a transaction a server-reported failure aborts it (postgres):\n // record it so a callback that swallows it cannot commit nothing. The\n // pool-level handle has no transaction to abort.\n return parentMode === \"pool\"\n ? result\n : result.catch((error: unknown) => abortTransactionOnServerFailure({ scope, error }));\n },\n\n async executeUnsafe(execParams) {\n assertHandle();\n const turn = scopeTurn({ scope });\n if (turn !== undefined) await turn;\n assertHandle();\n const result = runExecuteUnsafe({ source: guardedSource, ...(parentMode === \"pool\" ? {} : { scope }), ...execParams });\n return parentMode === \"pool\"\n ? result\n : result.catch((error: unknown) => abortTransactionOnServerFailure({ scope, error }));\n },\n\n async transaction<T>(\n fn: (txAdapter: DatabaseAdapter) => Promise<T>,\n transactionOptions?: TransactionOptions,\n ): Promise<T> {\n return parentMode === \"pool\"\n ? transactionViaPool(fn, transactionOptions)\n : transactionViaSavepoint(fn, transactionOptions);\n },\n\n async connect(): Promise<void> {\n if (parentMode !== \"pool\") return;\n const reserved = await runMapped(() => (source as BunInstance).reserve());\n reserved.release();\n },\n\n async disconnect(): Promise<void> {\n if (parentMode !== \"pool\") return;\n await runMapped(() => (source as BunInstance).close());\n instance = null;\n },\n\n formatArrayParam(values: unknown[]): unknown {\n return toPgArrayLiteral(values);\n },\n };\n }\n\n /** Pool-level facade — the bun:sql client is created on first use. */\n function poolAdapter(): DatabaseAdapter {\n return createAdapter({\n source: getSql(),\n parentMode: \"pool\",\n scope: createSavepointScope(),\n });\n }\n\n return {\n dialect: DIALECT,\n provider: PROVIDER,\n budgets: BUDGETS,\n get wire(): WireFidelity {\n return activeWire;\n },\n\n async withSession({ run }) {\n // Bun 1.3 does not decrement its pool's pending counter when a reserved\n // connection closes or dies. Own a private one-connection driver instance\n // so cleanup cannot hang or force-close unrelated application work.\n const sessionPool = createSqlInstance({ max: SESSION_CONNECTION.max });\n const close = (): Promise<void> => runMapped(() => sessionPool.close({ timeout: SESSION_CONNECTION.closeGraceSeconds }));\n const reserved = await runMapped(() => sessionPool.reserve()).catch(async (cause: unknown) => {\n await close();\n throw cause;\n });\n return runPinnedSession({\n run,\n execute: async (query) => (await runExecuteUnsafe({ source: reserved, ...query })).rows,\n isLost: (error) => error instanceof VibeError && (\n typeof error.meta.sqlstate !== \"string\" || error.meta.sqlstate.startsWith(\"08\") ||\n [\"57P01\", \"57P02\", \"57P03\"].includes(error.meta.sqlstate)\n ),\n release: close,\n });\n },\n\n async execute(params) {\n return poolAdapter().execute(params);\n },\n\n async executeUnsafe(params) {\n const control = classifyRawTransactionControl({ text: params.text });\n if (rawSession !== null) {\n if (control === \"close\") {\n const session = rawSession;\n rawSession = null;\n try {\n return await runExecuteUnsafe({ source: session, ...params });\n } finally {\n session.release();\n }\n }\n // A nested raw BEGIN lands here too — postgres treats it as a warning\n // no-op on the open session, exactly like a single connection would.\n return runExecuteUnsafe({ source: rawSession, ...params });\n }\n if (control === \"open\") {\n const reserved = await runMapped(() => getSql().reserve());\n try {\n const result = await runExecuteUnsafe({ source: reserved, ...params });\n rawSession = reserved;\n return result;\n } catch (error) {\n reserved.release();\n throw error;\n }\n }\n return poolAdapter().executeUnsafe(params);\n },\n\n async transaction<T>(\n fn: (txAdapter: DatabaseAdapter) => Promise<T>,\n transactionOptions?: TransactionOptions,\n ): Promise<T> {\n return poolAdapter().transaction(fn, transactionOptions);\n },\n\n async connect(): Promise<void> {\n return poolAdapter().connect();\n },\n\n async disconnect(): Promise<void> {\n if (rawSession !== null) {\n // An abandoned raw transaction must not leak an in-transaction\n // connection; roll it back best-effort before the pool closes.\n const session = rawSession;\n rawSession = null;\n try {\n await session.unsafe(\"ROLLBACK\");\n } catch {\n /* the pool is closing; the session is going away regardless */\n }\n session.release();\n }\n if (instance === null) return;\n const closing = instance;\n instance = null;\n await runMapped(() => closing.close());\n },\n\n formatArrayParam(values: unknown[]): unknown {\n return toPgArrayLiteral(values);\n },\n };\n}\n\n/**\n * Rows affected by a bun:sql statement: the driver attaches `count` (and, on\n * some versions, `affectedRows`) to the returned array; otherwise the number of\n * returned rows is the best available answer.\n */\nfunction readAffectedRows(params: { rows: BunRows }): number {\n const { rows } = params;\n if (typeof rows.count === \"number\") return rows.count;\n if (typeof rows.affectedRows === \"number\") return rows.affectedRows;\n return rows.length;\n}\n\n/** Bun's simple protocol returns an outer array for scripts; final command wins. */\nfunction finalRows(params: { result: BunResults }): BunRows {\n const { result } = params;\n if (result === null) return [];\n return Array.isArray(result[0]) ? (result as BunRows[]).at(-1) ?? [] : result as BunRows;\n}\n\nfunction unknownOutcome(params: { cause: unknown; reason?: string }): VibeError {\n return new VibeError({\n code: \"VIBE_TRANSACTION\",\n message: \"Bun could not confirm transaction recovery or completion; the outcome is unknown. Nothing is retried automatically.\",\n meta: { reason: params.reason ?? \"transaction-outcome-unknown\", outcome: \"unknown\" },\n cause: params.cause,\n });\n}\n\n// ─── Re-exports (driver-error table, params, helpers) ─────────────\n\nexport {\n BUN_SQLSTATE_ERROR_CODES,\n BUN_SQLSTATE_REASONS,\n bunErrorSqlstate,\n mapBunDriverError,\n} from \"./errors.ts\";\nexport { serializeParams, serializeParamsRaw, toPgArrayLiteral } from \"./params.ts\";\nexport { applyStartupOptions, buildStartupOptions } from \"./connection-url.ts\";\nexport type { PlanCacheMode } from \"./connection-url.ts\";\nexport { createSavepointCounter, nextSavepointName } from \"@vibeorm/runtime/adapter-kit\";\nexport type { SavepointCounter } from \"@vibeorm/runtime/adapter-kit\";\nexport { createTemplateCache, templateChunks } from \"./template-cache.ts\";\nexport type { TemplateCache } from \"./template-cache.ts\";\nexport {\n ISOLATION_LEVEL_SQL,\n beginStatement,\n classifyRawTransactionControl,\n refuseNestedTransactionOptions,\n statementTimeoutStatement,\n} from \"./transaction-sql.ts\";\nexport type { RawTransactionControl } from \"./transaction-sql.ts\";\n// ─── EPIC 6: transaction budgets (shared, @vibeorm/runtime/adapter-kit) ───\nexport {\n DEFAULT_DEADLINE_CLOCK,\n engineStatementBudgetMs,\n isTransactionDeadlineError,\n startTransactionBudget,\n transactionClosedError,\n transactionDeadlineError,\n transactionOutcomeUnknownError,\n validateTransactionDeadline,\n} from \"@vibeorm/runtime/adapter-kit\";\nexport type { BudgetStage, DeadlineClock, TransactionBudget, TransactionOutcome } from \"@vibeorm/runtime/adapter-kit\";\n",
8
- "/**\n * Connection-URL handling for bun:sql.\n *\n * Per-connection PostgreSQL settings (`plan_cache_mode`, `statement_timeout`)\n * travel in the `options` startup parameter, which the server parses for\n * `-c key=value` pairs — so every connection in bun's internal pool inherits\n * them without a per-query round trip.\n *\n * v1 lesson (LEARNINGS.md): bun:sql forwards *unrecognised* URL parameters to\n * the server as runtime configuration, so a libpq client-side option such as\n * `connect_timeout` must never be put in the URL (PostgreSQL rejects it as an\n * unrecognised configuration parameter). Connection timeouts use bun:sql's\n * `connectionTimeout` constructor option instead.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\n\n/**\n * PostgreSQL plan-cache behaviour for the implicit prepared statements bun:sql\n * creates. `force_custom_plan` replans with the real parameter values (≈0.1 ms\n * per query) and keeps index selection optimal on range/LIKE/skewed filters —\n * `auto` lets PostgreSQL switch to a generic plan after ~5 executions.\n */\nexport type PlanCacheMode = \"auto\" | \"force_custom_plan\" | \"force_generic_plan\";\n\n/**\n * Build the `options` startup string, or `undefined` when nothing needs setting.\n *\n * @throws VibeError `VIBE_VALIDATION` when `statementTimeout` is not a\n * non-negative integer — the value ends up inside the startup string verbatim.\n */\nexport function buildStartupOptions(params: {\n planCacheMode: PlanCacheMode;\n statementTimeout?: number;\n}): string | undefined {\n const { planCacheMode, statementTimeout } = params;\n const parts: string[] = [];\n if (planCacheMode !== \"auto\") parts.push(`-c plan_cache_mode=${planCacheMode}`);\n if (statementTimeout !== undefined) {\n if (!Number.isInteger(statementTimeout) || statementTimeout < 0) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `statementTimeout must be a non-negative integer of milliseconds, received ${String(statementTimeout)}`,\n meta: { statementTimeout },\n });\n }\n parts.push(`-c statement_timeout=${statementTimeout}`);\n }\n return parts.length === 0 ? undefined : parts.join(\" \");\n}\n\n/** Merge startup settings into one `options` key; adapter settings take precedence. */\nexport function applyStartupOptions(params: { url: string; startupOptions: string }): string {\n if (!URL.canParse(params.url)) {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message: \"invalid PostgreSQL connection URL\" });\n }\n const url = new URL(params.url);\n const merged = [...url.searchParams.getAll(\"options\"), params.startupOptions].filter(Boolean).join(\" \");\n url.searchParams.set(\"options\", merged);\n url.search = url.searchParams.toString().replace(/\\+/g, \"%20\");\n return url.toString();\n}\n",
9
- "/**\n * Driver-error mapping for `bun:sql`.\n *\n * bun:sql raises `SQL.PostgresError` for server failures and for client-side\n * problems alike. Server failures carry the PostgreSQL SQLSTATE — depending on\n * the Bun version on `code` or on `errno` — while client-side failures use a\n * `ERR_POSTGRES_*` identifier in `code`. Both shapes are read here, so the\n * mapping is stable across Bun versions. Constitution rule 5: only `VibeError`\n * escapes the adapter.\n */\n\nimport { VibeError, type VibeErrorCode } from \"@vibeorm/schema\";\n\n// ─── SQLSTATE table ───────────────────────────────────────────────\n\n/**\n * PostgreSQL SQLSTATE → stable VibeError code. Frozen and mirrored by tests;\n * anything absent from this table (including every `ERR_POSTGRES_*` connection\n * or auth failure) maps to `VIBE_ADAPTER`.\n */\nexport const BUN_SQLSTATE_ERROR_CODES: Readonly<Record<string, VibeErrorCode>> = Object.freeze({\n /** exclusion_violation */\n \"23P01\": \"VIBE_EXCLUSION_VIOLATION\",\n /** unique_violation */\n \"23505\": \"VIBE_UNIQUE_VIOLATION\",\n /** foreign_key_violation */\n \"23503\": \"VIBE_FK_VIOLATION\",\n /** restrict_violation — PostgreSQL 18+ ON DELETE/UPDATE RESTRICT */\n \"23001\": \"VIBE_FK_VIOLATION\",\n /** not_null_violation */\n \"23502\": \"VIBE_VALIDATION\",\n /** check_violation */\n \"23514\": \"VIBE_VALIDATION\",\n /**\n * invalid_text_representation — a value the server cannot parse into the\n * column's type (out-of-range enum value, `\"abc\"` for an integer). Bad input,\n * so the same code sqlite reports for its enum CHECK violation.\n */\n \"22P02\": \"VIBE_VALIDATION\",\n /** Data exceptions the same bad input raises (mirrors adapter-pg): too long, out of range, bad datetime, datetime overflow. */\n \"22001\": \"VIBE_VALIDATION\",\n \"22003\": \"VIBE_VALIDATION\",\n \"22007\": \"VIBE_VALIDATION\",\n \"22008\": \"VIBE_VALIDATION\",\n /**\n * insufficient_privilege — a denied table/column privilege, and the SQLSTATE a\n * native row-level-security policy raises when its WITH CHECK refuses a write.\n * Callers identify it by this code, never by message text.\n */\n \"42501\": \"VIBE_PERMISSION_DENIED\",\n /** serialization_failure */\n \"40001\": \"VIBE_TRANSACTION\",\n /** deadlock_detected */\n \"40P01\": \"VIBE_TRANSACTION\",\n /** query_canceled — statement_timeout fired */\n \"57014\": \"VIBE_TRANSACTION\",\n /**\n * lock_not_available — a `nowait` locking read on already-locked rows, or an\n * expired `lock_timeout`. Postgres reports both with this one SQLSTATE.\n */\n \"55P03\": \"VIBE_LOCK_NOT_AVAILABLE\",\n});\n\n/** SQLSTATEs that additionally explain themselves through `meta.reason`. */\nexport const BUN_SQLSTATE_REASONS: Readonly<Record<string, string>> = Object.freeze({\n \"23P01\": \"exclusion-violation\",\n \"57014\": \"timeout\",\n \"55P03\": \"lock-not-available\",\n \"40P01\": \"deadlock\",\n \"40001\": \"serialization-failure\",\n});\n\n// ─── Reading driver errors ────────────────────────────────────────\n\n/** A PostgreSQL SQLSTATE is exactly five digits/uppercase letters (e.g. `40P01`). */\nconst SQLSTATE_PATTERN = /^[0-9A-Z]{5}$/;\n\nfunction readStringField(params: { source: Record<string, unknown>; key: string }): string | undefined {\n const value = params.source[params.key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/**\n * Extract the SQLSTATE from a bun:sql error, accepting it on either `code` or\n * `errno`. `ERR_POSTGRES_*` identifiers are not SQLSTATEs and yield `undefined`.\n */\nexport function bunErrorSqlstate(params: { error: unknown }): string | undefined {\n const { error } = params;\n if (error === null || typeof error !== \"object\") return undefined;\n const source = error as Record<string, unknown>;\n for (const key of [\"code\", \"errno\"]) {\n const value = readStringField({ source, key });\n if (value !== undefined && SQLSTATE_PATTERN.test(value)) return value;\n }\n return undefined;\n}\n\n// ─── Mapping ──────────────────────────────────────────────────────\n\n/**\n * Map any error thrown by bun:sql onto a `VibeError`.\n *\n * A `VibeError` passes through unchanged, so an error raised deeper inside the\n * ORM (or by a nested adapter call) is never re-wrapped.\n */\nexport function mapBunDriverError(params: { error: unknown }): VibeError {\n const { error } = params;\n if (error instanceof VibeError) return error;\n\n const source: Record<string, unknown> =\n error !== null && typeof error === \"object\" ? (error as Record<string, unknown>) : {};\n const sqlstate = bunErrorSqlstate({ error });\n const code: VibeErrorCode =\n (sqlstate === undefined ? undefined : BUN_SQLSTATE_ERROR_CODES[sqlstate]) ?? \"VIBE_ADAPTER\";\n\n const meta: Record<string, unknown> = {};\n if (sqlstate !== undefined) meta.sqlstate = sqlstate;\n const constraint = readStringField({ source, key: \"constraint\" });\n if (constraint !== undefined) meta.constraint = constraint;\n const table = readStringField({ source, key: \"table\" });\n if (table !== undefined) meta.table = table;\n const column = readStringField({ source, key: \"column\" });\n if (column !== undefined) meta.column = column;\n const reason = sqlstate === undefined ? undefined : BUN_SQLSTATE_REASONS[sqlstate];\n if (reason !== undefined) meta.reason = reason;\n // Keep bun's own identifier when it is not a SQLSTATE — it is the only clue\n // a connection/auth/protocol failure carries.\n const driverCode = readStringField({ source, key: \"code\" });\n if (driverCode !== undefined && driverCode !== sqlstate) meta.driverCode = driverCode;\n\n const message =\n readStringField({ source, key: \"message\" }) ??\n (typeof error === \"string\" ? error : \"unknown bun:sql driver error\");\n\n return new VibeError({ code, message, meta, cause: error });\n}\n\n/** Run a driver call, mapping anything it throws onto a `VibeError`. */\nexport async function runMapped<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n throw mapBunDriverError({ error });\n }\n}\n",
10
- "/**\n * Parameter serialization for bun:sql.\n *\n * Verified against Bun 1.3 (re-verified on 1.3.14; `tests/live.test.ts` and\n * the notes below):\n * - a plain object or array bound to a `json`/`jsonb` column is JSON-encoded by\n * bun:sql itself — encoding it here as well double-encodes it and stores a\n * JSON *string* (`jsonb_typeof` = `\"string\"`), so the ORM path must not touch it;\n * - a plain JS array bound to a scalar-list column (`text[]`, `int[]`) is NOT\n * turned into a PostgreSQL array literal by bun:sql — it arrives as `a,b` and\n * the server rejects it with `malformed array literal`. Scalar lists therefore\n * have to be pre-rendered with {@link toPgArrayLiteral}, which is exactly what\n * the adapter's `formatArrayParam` returns.\n *\n * Hence the split (LEARNINGS.md): the ORM path passes values through (scalar\n * lists already arrived as literal strings), while the raw path renders plain JS\n * arrays as array literals so `db.$queryRawUnsafe('… = ANY($1)', [1, 2, 3])`\n * matches rows.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\n\n// ─── PostgreSQL array literals ────────────────────────────────────\n\n/** Quote and escape one array element: `\"` and `\\` are the special characters. */\nfunction quoteElement(value: string): string {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n\n/**\n * Render a JS array as a PostgreSQL array literal string.\n *\n * Element handling:\n * - `null` / `undefined` → unquoted `NULL`\n * - `number` / `bigint` / `boolean` → unquoted primitive\n * - `Date` → quoted ISO-8601 (PostgreSQL cannot parse `String(date)`)\n * - `string` → quoted, with `\"` and `\\` escaped (so commas, braces and quotes\n * inside an element are safe)\n * - any other object, **including a nested array** → quoted `JSON.stringify`,\n * which is what a `Json[]` scalar list needs (PostgreSQL scalar lists are\n * one-dimensional, so a nested array is a JSON value, not a matrix)\n * - binary (`Uint8Array` / `ArrayBuffer`) → unsupported, throws\n *\n * @throws VibeError `VIBE_VALIDATION` for binary elements.\n */\nexport function toPgArrayLiteral(values: readonly unknown[]): string {\n const elements = values.map((value) => {\n if (value === null || value === undefined) return \"NULL\";\n if (typeof value === \"number\" || typeof value === \"bigint\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return quoteElement(value.toISOString());\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: \"binary values are not supported inside a postgres array literal\",\n meta: { driver: \"bun:sql\" },\n });\n }\n if (typeof value === \"string\") return quoteElement(value);\n if (typeof value === \"object\") return quoteElement(JSON.stringify(value));\n return quoteElement(String(value));\n });\n return `{${elements.join(\",\")}}`;\n}\n\n// ─── Serialization ────────────────────────────────────────────────\n\n/**\n * `Date` → UTC ISO-8601 text (`2026-03-08T19:38:08.538Z`), the same spelling\n * the array literal above uses.\n *\n * bun:sql serializes a `Date` by the parameter's RESOLVED postgres type\n * (LEARNINGS): fine for `timestamp`/`timestamptz` (UTC text), but a `date`\n * parameter gets `Date#toString()` — `Sun Mar 08 2026 23:30:00 GMT+0000\n * (Coordinated Universal Time)` — which the server rejects in every host TZ\n * (live on Bun 1.4.3: `invalid input syntax for type date` under UTC, `time\n * zone \"gmt-0400\" not recognized` under America/New_York). The ISO text\n * parses for all three, and pins the UTC wall-clock contract the codec table\n * and the other postgres adapters share. Dates the ISO form cannot spell\n * (invalid, BC, beyond year 9999) keep the driver's serializer.\n */\nexport function serializeDate(params: { value: Date }): unknown {\n const { value } = params;\n if (Number.isNaN(value.getTime())) return value;\n const year = value.getUTCFullYear();\n if (year < 1 || year > 9999) return value;\n return value.toISOString();\n}\n\n/**\n * ORM hot path: pass every value straight to bun:sql, except `Date`\n * ({@link serializeDate}).\n *\n * Scalar lists already arrived as array-literal strings from\n * `formatArrayParam`, and bun:sql JSON-encodes objects and arrays for\n * `json`/`jsonb` columns by itself — re-encoding here would store a\n * double-encoded JSON string.\n */\nexport function serializeParams(params: { values: readonly unknown[] }): unknown[] {\n return params.values.map((value) => (value instanceof Date ? serializeDate({ value }) : value));\n}\n\n/**\n * Raw path: render plain JS arrays as PostgreSQL array literals so\n * `db.$queryRawUnsafe('… WHERE \"id\" = ANY($1)', [1, 2, 3])` matches rows;\n * everything else (objects included) goes to bun:sql untouched.\n *\n * Trade-off (v1 lesson): binding a JS array **into** a `jsonb` column from a raw\n * query means calling `JSON.stringify` yourself.\n */\nexport function serializeParamsRaw(params: { values: readonly unknown[] }): unknown[] {\n return params.values.map((value) => {\n if (Array.isArray(value)) return toPgArrayLiteral(value);\n if (value instanceof Date) return serializeDate({ value });\n return value;\n });\n}\n",
11
- "/**\n * Synthetic tagged-template cache — bun:sql's prepared-statement path.\n *\n * bun:sql only creates a *named* prepared statement (one PostgreSQL keeps a\n * plan for) when the query arrives as a tagged template. Generated SQL is a\n * plain string, so with `preparedStatements: true` the adapter turns each SQL\n * text into a synthetic `TemplateStringsArray` — split at its `$1`, `$2`, …\n * placeholders — and reuses that same object identity for every execution.\n *\n * A tagged template binds its values POSITIONALLY, one per gap, so the split\n * has to keep two things a plain `text.split(/\\$\\d+/)` throws away (F19):\n *\n * - **which** placeholder each gap is. `SELECT $2, $1` has to bind\n * `values[1]` then `values[0]`, and a repeated `$1` needs its value bound at\n * every occurrence — otherwise the statement silently returns other rows, or\n * reaches the server with too few parameters and fails to parse.\n * - **where** a `$n` is not a placeholder at all: inside a string literal, a\n * quoted identifier, a line or block comment, or a dollar-quoted body. A\n * split there tears the literal apart and produces invalid SQL.\n *\n * The cache is LRU-bounded so a long-running process never grows it without\n * limit.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\n\n/** A SQL text split for bun:sql, with the placeholder index behind each gap. */\nexport type PreparedTemplate = {\n /** The synthetic template; stable by identity so bun:sql can cache its plan. */\n readonly template: TemplateStringsArray;\n /** 1-based `$n` for each gap, in TEXT order (`SELECT $2, $1` → `[2, 1]`). */\n readonly indices: readonly number[];\n};\n\n/** LRU map from SQL text to the synthetic template used to execute it. */\nexport type TemplateCache = {\n /** Template for `text`, creating one on first sight. Stable by identity. */\n getTemplate(params: { text: string }): PreparedTemplate;\n /** Number of texts currently held — diagnostics and tests. */\n size(): number;\n};\n\n// ─── Scanning ─────────────────────────────────────────────────────\n\n/** Is this character part of an unquoted SQL identifier? */\nfunction isIdentChar(char: string | undefined): boolean {\n if (char === undefined) return false;\n return /[A-Za-z0-9_]/.test(char);\n}\n\n/**\n * Index just past a quoted run starting at `start` (`'…'` or `\"…\"`). A doubled\n * quote (`''`, `\"\"`) continues the run — postgres' own escape. A backslash\n * escapes the next character ONLY in an `E'…'` string; with the default\n * `standard_conforming_strings = on` a backslash inside an ordinary literal is\n * just a backslash, and treating it as an escape would run past the literal's\n * real end.\n */\nfunction skipQuoted(text: string, start: number, quote: string): number {\n const escaping =\n quote === \"'\" && (text[start - 1] === \"e\" || text[start - 1] === \"E\") && !isIdentChar(text[start - 2]);\n let index = start + 1;\n while (index < text.length) {\n const char = text[index];\n if (escaping && char === \"\\\\\") {\n index += 2;\n continue;\n }\n if (char === quote) {\n if (text[index + 1] === quote) {\n index += 2;\n continue;\n }\n return index + 1;\n }\n index += 1;\n }\n return text.length; // unterminated — the driver reports it, not this scanner\n}\n\n/** Index just past a block comment, honouring postgres' nesting. */\nfunction skipBlockComment(text: string, start: number): number {\n let depth = 0;\n let index = start;\n while (index < text.length) {\n if (text[index] === \"/\" && text[index + 1] === \"*\") {\n depth += 1;\n index += 2;\n continue;\n }\n if (text[index] === \"*\" && text[index + 1] === \"/\") {\n depth -= 1;\n index += 2;\n if (depth === 0) return index;\n continue;\n }\n index += 1;\n }\n return text.length;\n}\n\n/**\n * Index just past a dollar-quoted body (`$$…$$`, `$tag$…$tag$`) starting at\n * `start`, or `-1` when no dollar quote opens there. `$1` never matches: a tag\n * has to start with a letter or underscore.\n */\nfunction skipDollarQuoted(text: string, start: number): number {\n const opener = /^\\$(?:[A-Za-z_][A-Za-z0-9_]*)?\\$/.exec(text.slice(start));\n if (opener === null) return -1;\n const tag = opener[0];\n const close = text.indexOf(tag, start + tag.length);\n return close === -1 ? text.length : close + tag.length;\n}\n\n/**\n * Split `text` at its real `$n` placeholders. `chunks.length` is always\n * `indices.length + 1`, which is exactly the shape a tagged template needs.\n */\nexport function scanPlaceholders(params: { text: string }): PreparedTemplate {\n const { text } = params;\n const chunks: string[] = [];\n const indices: number[] = [];\n let chunkStart = 0;\n let index = 0;\n\n while (index < text.length) {\n const char = text[index];\n if (char === \"'\" || char === '\"') {\n index = skipQuoted(text, index, char);\n continue;\n }\n if (char === \"-\" && text[index + 1] === \"-\") {\n const newline = text.indexOf(\"\\n\", index);\n index = newline === -1 ? text.length : newline + 1;\n continue;\n }\n if (char === \"/\" && text[index + 1] === \"*\") {\n index = skipBlockComment(text, index);\n continue;\n }\n if (char === \"$\") {\n const dollarEnd = skipDollarQuoted(text, index);\n if (dollarEnd !== -1) {\n index = dollarEnd;\n continue;\n }\n let digits = index + 1;\n while (digits < text.length && text[digits] !== undefined && /[0-9]/.test(text[digits] as string)) digits += 1;\n if (digits > index + 1) {\n chunks.push(text.slice(chunkStart, index));\n indices.push(Number(text.slice(index + 1, digits)));\n chunkStart = digits;\n index = digits;\n continue;\n }\n }\n index += 1;\n }\n\n chunks.push(text.slice(chunkStart));\n const template = Object.assign(chunks, { raw: chunks }) as unknown as TemplateStringsArray;\n return { template, indices };\n}\n\n/**\n * Split a SQL text on `$n` placeholders into the literal chunks around them.\n *\n * Kept for callers that only want the chunks; it is quote-, comment- and\n * dollar-quote-aware through {@link scanPlaceholders}, so `'$1'` inside a\n * string literal is NOT a split point.\n */\nexport function templateChunks(params: { text: string }): string[] {\n return [...scanPlaceholders(params).template];\n}\n\n// ─── Binding ──────────────────────────────────────────────────────\n\n/**\n * The values to hand a synthetic template, in gap order: `$n` picks\n * `values[n - 1]`, a repeated placeholder repeats its value.\n *\n * A `$n` with no matching value is REFUSED (`VIBE_VALIDATION`) rather than\n * bound to `undefined` — misbinding is exactly the failure mode F19 records.\n */\nexport function bindTemplateValues(params: {\n text: string;\n indices: readonly number[];\n values: readonly unknown[];\n}): unknown[] {\n const { text, indices, values } = params;\n return indices.map((placeholder) => {\n if (placeholder < 1 || placeholder > values.length) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `bun:sql prepared statement references $${placeholder} but only ${values.length} parameter(s) were given`,\n meta: { text, placeholder, provided: values.length },\n });\n }\n return values[placeholder - 1];\n });\n}\n\n// ─── Cache ────────────────────────────────────────────────────────\n\n/**\n * Create a template cache holding at most `max` texts (least recently used\n * evicted first).\n */\nexport function createTemplateCache(params: { max: number }): TemplateCache {\n const { max } = params;\n const templates = new Map<string, PreparedTemplate>();\n\n return {\n getTemplate(templateParams: { text: string }): PreparedTemplate {\n const { text } = templateParams;\n const existing = templates.get(text);\n if (existing !== undefined) {\n // Re-insert to mark most-recently-used.\n templates.delete(text);\n templates.set(text, existing);\n return existing;\n }\n const prepared = scanPlaceholders({ text });\n if (templates.size >= max) {\n const oldest = templates.keys().next().value;\n if (oldest !== undefined) templates.delete(oldest);\n }\n templates.set(text, prepared);\n return prepared;\n },\n\n size(): number {\n return templates.size;\n },\n };\n}\n",
12
- "/**\n * Transaction-control SQL text (postgres dialect, bun:sql flavour).\n *\n * Used by the reserved-connection path, which issues `BEGIN` itself so that\n * isolation level and statement timeout can be applied — bun:sql's\n * `sql.begin(fn)` fast path takes no such options.\n */\n\nimport type { IsolationLevel } from \"@vibeorm/runtime\";\nimport { VibeError } from \"@vibeorm/schema\";\n\n/** VibeORM isolation level → PostgreSQL isolation level keyword. */\nexport const ISOLATION_LEVEL_SQL: Readonly<Record<IsolationLevel, string>> = Object.freeze({\n ReadCommitted: \"READ COMMITTED\",\n RepeatableRead: \"REPEATABLE READ\",\n Serializable: \"SERIALIZABLE\",\n});\n\n/** `BEGIN`, with an `ISOLATION LEVEL` clause when the caller asked for one. */\nexport function beginStatement(params: { isolationLevel?: IsolationLevel }): string {\n const { isolationLevel } = params;\n return isolationLevel === undefined\n ? \"BEGIN\"\n : `BEGIN ISOLATION LEVEL ${ISOLATION_LEVEL_SQL[isolationLevel]}`;\n}\n\n/**\n * `SET LOCAL statement_timeout = <ms>` — transaction-scoped, so PostgreSQL\n * cancels an over-long statement with SQLSTATE 57014 (mapped to\n * `VIBE_TRANSACTION` with `meta.reason = \"timeout\"`).\n *\n * @throws VibeError `VIBE_VALIDATION` when the timeout is not a non-negative\n * integer — the value is interpolated into SQL, so it is never trusted blindly.\n */\nexport function statementTimeoutStatement(params: { timeout: number }): string {\n const { timeout } = params;\n if (!Number.isInteger(timeout) || timeout < 0) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `transaction timeout must be a non-negative integer of milliseconds, received ${String(timeout)}`,\n meta: { timeout },\n });\n }\n return `SET LOCAL statement_timeout = ${timeout}`;\n}\n\n// ─── Raw transaction control (session affinity) ─────────────────\n\n/** How a raw statement steers the adapter's session-affine raw transaction. */\nexport type RawTransactionControl = \"open\" | \"close\" | null;\n\nconst RAW_OPEN_PATTERN: RegExp = /^\\s*(?:begin|start\\s+transaction)\\b[^;]*;?\\s*$/i;\nconst RAW_CLOSE_PATTERN: RegExp = /^\\s*(?:commit|end|rollback|abort)(?:\\s+(?:transaction|work))?\\s*;?\\s*$/i;\n\n/**\n * Classify a raw statement as transaction control.\n *\n * @vibeorm/migrate drives transactional DDL by sending literal `BEGIN` /\n * `COMMIT` / `ROLLBACK` through its stateless `SqlExecutor` — sound only when\n * every statement in between rides the SAME connection. The adapter uses this\n * to pin one connection for the whole raw transaction (\"open\" reserves,\n * \"close\" releases). On a pooled bun:sql instance an unpinned `BEGIN` is\n * refused outright by the driver (`ERR_POSTGRES_UNSAFE_TRANSACTION`); other\n * pool drivers would only work by checkout luck.\n *\n * Deliberately strict: only PURE single-statement control text matches\n * (`BEGIN`, `BEGIN ISOLATION LEVEL …;`, `COMMIT`, `ROLLBACK WORK`, `END`,\n * `ABORT`). Compound scripts, `ROLLBACK TO SAVEPOINT`, two-phase\n * `COMMIT PREPARED` and `COMMIT AND CHAIN` (which keeps a transaction open)\n * never engage the pinning.\n */\nexport function classifyRawTransactionControl(params: { text: string }): RawTransactionControl {\n if (RAW_OPEN_PATTERN.test(params.text)) return \"open\";\n if (RAW_CLOSE_PATTERN.test(params.text)) return \"close\";\n return null;\n}\n\n// ─── Nested transaction options (the cross-adapter contract) ──────\n\n// ONE copy, shared by every adapter through the runtime's adapter-kit;\n// re-exported here so this adapter's public surface is unchanged.\nexport { refuseNestedTransactionOptions } from \"@vibeorm/runtime/adapter-kit\";\n"
5
+ "import { SQL } from \"bun\";\n\n/**\n * Internal constructor boundary; keeps the driver double out of the public\n * adapter API. Always the URL form: bun:sql's options-only form fills the\n * whole connection from the environment.\n */\nexport function createBunSql(params: { url: string; options: Record<string, unknown> }): SQL {\n return new SQL(params.url, params.options);\n}\n",
6
+ "/**\n * Oldest Bun whose bun:sql the adapter accepts. Older releases — measured on\n * 1.3.14 with every adapter fix in place — hang after `COPY … TO STDOUT`,\n * read zone-less timestamps as host-local time and turn ±infinity dates into\n * `Invalid Date`; 1.4.1, 1.4.2 and 1.4.3 pass the same probes.\n */\nexport const MINIMUM_BUN_VERSION: string = \"1.4.1\";\n\n/**\n * PostgreSQL's limit on bound parameters in one statement (the Bind message\n * carries a 16-bit count).\n */\nexport const MAX_BIND_PARAMETERS: number = 65_535;\n\n/** Migration-only driver instance; never force-close the application's pool. */\nexport const SESSION_CONNECTION: Readonly<{ max: number; closeGraceSeconds: number }> = Object.freeze({\n max: 1,\n // Bun 1.3 treats timeout: 0 as unbounded. A positive millisecond closes only\n // this private instance after the session gate has drained dispatched work.\n closeGraceSeconds: 0.001,\n});\n",
7
+ "import { VibeError } from \"@vibeorm/schema\";\nimport { MINIMUM_BUN_VERSION } from \"./config.ts\";\n\n/**\n * Refuse a Bun whose bun:sql the adapter does not support (see\n * {@link MINIMUM_BUN_VERSION}), at construction — before any statement can\n * meet one of that driver's known data bugs.\n *\n * @throws VibeError `VIBE_CONFIG`.\n */\nexport function refuseUnsupportedBun(params: { version: string }): void {\n if (Bun.semver.satisfies(params.version, `>=${MINIMUM_BUN_VERSION}`)) return;\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message:\n `@vibeorm/adapter-bun requires Bun ${MINIMUM_BUN_VERSION} or newer (running ${params.version}): older bun:sql ` +\n \"releases hang after COPY, read timestamps without a time zone in host-local time and turn infinity dates into Invalid Date. \" +\n \"Upgrade Bun, or use @vibeorm/adapter-pg.\",\n meta: { bunVersion: params.version, minimumBunVersion: MINIMUM_BUN_VERSION },\n });\n}\n",
8
+ "/**\n * @vibeorm/adapter-bun — bun:sql (PostgreSQL) adapter for VibeORM v2.\n *\n * Uses Bun's built-in SQL driver and its internal connection pool. Owns\n * optional prepared statements (synthetic tagged templates), transactions\n * (nested → savepoints), array-literal parameter formatting and driver-error\n * mapping. Only `VibeError` ever escapes.\n */\n\nimport { createBunSql } from \"./driver.ts\";\nimport { MAX_BIND_PARAMETERS, SESSION_CONNECTION } from \"./config.ts\";\nimport { refuseUnsupportedBun } from \"./bun-version.ts\";\nimport { postgresDialect, renderDiagnostic } from \"@vibeorm/sql\";\nimport type {\n AdapterBudgetSupport,\n DatabaseAdapter,\n QueryResult,\n RowChangeCount,\n StatementEffect,\n TransactionOptions,\n WireFidelity,\n} from \"@vibeorm/runtime\";\nimport {\n abortTransactionOnServerFailure,\n createDeferredControl,\n type DeferredControl,\n observeRowChanges,\n readRowChanges,\n statementRowChanges,\n createAdapterLifecycleGate,\n runPinnedSession,\n runShutdownCleanup,\n transactionLifecycleRefusal,\n createSavepointScope,\n type CommitProgress,\n engineStatementBudgetMs,\n markTransactionAborted,\n type RollbackOutcome,\n runNestedSavepoint,\n runRootScope,\n type SavepointScope,\n scopeTurn,\n settleFailedTransaction,\n startTransactionBudget,\n type TransactionBudget,\n transactionAbortedError,\n validateTransactionDeadline,\n readOnlyRequested,\n} from \"@vibeorm/runtime/adapter-kit\";\nimport { VibeError, type Dialect, type Provider } from \"@vibeorm/schema\";\nimport { applyStartupOptions, buildStartupOptions, takeConnectTimeout, type PlanCacheMode } from \"./connection-url.ts\";\nimport { mapBunDriverError, runMapped } from \"./errors.ts\";\nimport { serializeParams, serializeParamsRaw, toPgArrayLiteral } from \"./params.ts\";\nimport { bindTemplateValues, createTemplateCache } from \"./template-cache.ts\";\nimport {\n beginStatement,\n openTransactionStatement,\n classifyRawTransactionControl,\n refuseNestedTransactionOptions,\n STATEMENT_BOUND_TEXT,\n} from \"./transaction-sql.ts\";\n\n// ─── Minimal bun:sql surface ──────────────────────────────────────\n\n/**\n * What bun:sql resolves a query to: the row array, with driver metadata\n * (`count`, `command`) attached as properties.\n */\ntype BunRows = Record<string, unknown>[] & { count?: number; affectedRows?: number; command?: string };\n\ntype BunResults = BunRows | BunRows[] | null;\n\n/** Anything that executes SQL through bun:sql. */\ntype BunExecutor = {\n (strings: TemplateStringsArray, ...values: unknown[]): Promise<BunResults>;\n unsafe(text: string, values?: unknown[]): Promise<BunResults>;\n};\n\n/**\n * A connection checked out with `sql.reserve()` — must be released. Every\n * top-level transaction runs on one (round-trip EPIC 6): BEGIN, COMMIT and\n * savepoints are sent by hand, so they can ride with the next statement.\n */\ntype BunReserved = BunExecutor & { release(): void; close(): Promise<void> };\n\n/** The pool-level bun:sql client. */\ntype BunInstance = BunExecutor & {\n reserve(): Promise<BunReserved>;\n close(options?: { timeout: number }): Promise<void>;\n};\n\n/** Any bun:sql handle the adapter can be built on top of. */\ntype BunSource = BunInstance | BunReserved;\n\n/**\n * Whether a handle is the pool (can open a real transaction) or is already\n * inside one (must nest through savepoints).\n */\ntype ParentMode = \"pool\" | \"tx\";\n\n/**\n * One statement or control text for the reserved connection of a transaction\n * (round-trip EPIC 6, pipelining).\n */\ntype ReservedSend<T> = {\n /** The driver call, made on the reserved connection when its turn comes. Unmapped. */\n readonly send: (connection: BunExecutor) => Promise<T>;\n /** Sent through the extended protocol (a tagged template, or ≥1 bound value): bun:sql may pipeline it. */\n readonly extended: boolean;\n readonly effect?: StatementEffect | undefined;\n readonly stage?: \"statement\" | \"commit\";\n /** Rollback cleanup: takes no pending control, gets no bound and is never refused. */\n readonly cleanup?: boolean;\n /** Handle checks run right before sending (lifetime, poison). */\n readonly guard?: () => void;\n /**\n * Control steps ALREADY SENT right behind an awaited BEGIN (a `SAVEPOINT`\n * taken with it) whose replies this statement answers for. Never texts held\n * back: a refusal of this statement's own turn must not drop a savepoint\n * the gate already counts as opened (fix lane FX-A, RV5 MJ-1).\n */\n readonly riding?: readonly Promise<unknown>[];\n};\n\n/** Every send of ONE top-level transaction on its reserved connection goes through this. */\ntype ReservedControl = {\n /** Pending BEGIN / SAVEPOINT texts of this transaction. */\n readonly deferred: DeferredControl;\n /** Send one statement, with the pending control (and the deadline bound) ahead of it. */\n readonly dispatch: <T>(params: ReservedSend<T>) => Promise<T>;\n /** A bun:sql-shaped executor whose every call is dispatched through this control. */\n readonly executor: (params: { effect?: StatementEffect | undefined; guard: () => void }) => BunExecutor;\n};\n\nconst ignore = (): void => undefined;\n\n// ─── Options ──────────────────────────────────────────────────────\n\n/** Options for {@link bunAdapter}. */\nexport type BunAdapterOptions = {\n /**\n * PostgreSQL connection URL — required. The adapter never reads\n * `DATABASE_URL` (or any other environment variable) itself, and always\n * hands bun:sql this URL, so bun's own environment lookup (`POSTGRES_URL`,\n * `DATABASE_URL`, `PGHOST`, …) never chooses the server. A database named in\n * the URL path is pinned explicitly, because bun:sql would otherwise let\n * `PGDATABASE` replace it. Give a complete URL: bun:sql fills parts the URL\n * omits (user, database, …) from the `PG*` variables.\n */\n readonly url: string;\n /** Maximum pooled connections (default 10). */\n readonly max?: number;\n /**\n * Pool-wide `statement_timeout` in milliseconds, sent as a startup parameter\n * so every connection inherits it. A per-transaction `timeout` overrides it\n * for that transaction.\n */\n readonly statementTimeout?: number;\n /**\n * Milliseconds to wait for a connection to be established. Passed to bun:sql\n * as `connectionTimeout` (which expects **seconds**; converted here). Wins\n * over a libpq `connect_timeout` in the URL, which is otherwise honoured.\n */\n readonly connectionTimeout?: number;\n /**\n * Use bun:sql's NAMED prepared statements (default false).\n *\n * Off (the default) runs every statement as an unnamed statement with text\n * results — bun:sql's `prepare: false`, the node-postgres model: values,\n * parameter typing and DDL behaviour match `@vibeorm/adapter-pg`.\n *\n * On, bun:sql keeps one named statement per SQL text per connection,\n * pipelines, and reads results in its binary format, with these driver\n * consequences (README \"Statements and values\"): a statement whose result\n * type a later DDL change alters fails with SQLSTATE 0A000 on that\n * connection until the pool is replaced (node-postgres named statements\n * behave the same); `int4[]`/`float4[]` values with NULL elements or more\n * than one dimension are refused; a JSON text bound into a raw `::jsonb`\n * slot is stored as a JSON string. ORM-path queries also run as tagged\n * templates.\n */\n readonly preparedStatements?: boolean;\n /** Maximum entries in the synthetic template cache (default 1000, LRU). */\n readonly stmtCacheMax?: number;\n /** PostgreSQL `plan_cache_mode` for every connection (default `force_custom_plan`). */\n readonly planCacheMode?: PlanCacheMode;\n};\n\n// ─── Adapter ──────────────────────────────────────────────────────\n\nconst DIALECT: Dialect = \"postgres\";\nconst PROVIDER: Provider = \"postgresql\";\n\n/**\n * bun:sql wire (board #30, live-verified on both execute paths): timestamptz\n * → `Date`, int4/float8 → numbers. (int8 arrives as a string — BigInt\n * decoding is real work and never pruned.)\n *\n * The `json` half is NOT a constant, because bun:sql's answer changed between\n * Bun versions and this package supports a range of them: on Bun 1.3.14 the\n * tagged-template path parsed json/jsonb while `sql.unsafe` did not (board\n * #34 — declaring \"parsed\" there made the runtime prune the Json decoder and\n * leak raw strings), and on Bun 1.4.1 BOTH paths parse (leaving \"text\" makes\n * the guarded decode re-parse a stored top-level JSON string: `\"123\"` becomes\n * the number 123, `\"hello\"` throws). Either constant is wrong on one of those\n * runtimes, so the adapter OBSERVES its own driver once instead of guessing —\n * see {@link probeJsonWire}. {@link WIRE_TEXT} is the conservative claim it\n * starts from; no ORM rows are returned until the probe succeeds.\n */\n/**\n * Timing budgets this adapter genuinely enforces (EPIC 6).\n *\n * - `acquireTimeout: false` — `connectionTimeout` bounds establishment only.\n * Modern Bun supports reserve({ signal }), but implicit query/begin checkout\n * and older supported Bun versions do not provide that cancellation contract.\n * - `statementTimeout: \"all-statements\"` — a real PostgreSQL server, so\n * `statement_timeout` cancels ANY over-long statement, writes included.\n * - `transactionDeadline: \"cancel-running-statements\"` — the remaining budget\n * is handed to the SERVER before each statement, so the database itself stops\n * work that would outlive the deadline.\n */\nconst BUDGETS: AdapterBudgetSupport = Object.freeze({\n acquireTimeout: false,\n statementTimeout: \"all-statements\",\n transactionDeadline: \"cancel-running-statements\",\n accessModes: Object.freeze([\"readOnly\"] as const),\n} as const);\n\nconst WIRE_TEXT: WireFidelity = Object.freeze({ dateTime: \"native\", json: \"text\", numbers: \"native\" } as const);\n\n/** The same wire, for a driver observed to hand back parsed json. */\nconst WIRE_PARSED: WireFidelity = Object.freeze({ dateTime: \"native\", json: \"parsed\", numbers: \"native\" } as const);\n\n/**\n * A PostgreSQL server: every round trip crosses a network (a local socket\n * included), so the runtime's one-statement folds apply. The pool and\n * transaction facades carry the same declaration.\n */\nconst ROUND_TRIPS: NonNullable<DatabaseAdapter[\"roundTrips\"]> = \"network\";\n\n/**\n * The explicit URL this adapter will use. bun:sql given no URL builds its\n * whole connection from the environment, so a missing one is refused here,\n * before any driver instance exists.\n *\n * @throws VibeError `VIBE_CONFIG` (`meta.reason: \"missing-address\"`) when `url`\n * is absent or blank. The message never echoes a value.\n */\nfunction requireUrl(params: { options: BunAdapterOptions | undefined }): string {\n const url = params.options?.url;\n if (typeof url === \"string\" && url.trim() !== \"\") return url;\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message:\n \"bunAdapter needs an explicit address: pass `url` (a PostgreSQL URL). \" +\n \"The adapter does not read DATABASE_URL, POSTGRES_URL or the PG* environment variables.\",\n meta: { adapter: \"bun\", reason: \"missing-address\" },\n });\n}\n\n/**\n * Create a VibeORM adapter backed by bun:sql.\n *\n * Requires an explicit `url`; without one the factory throws `VIBE_CONFIG`\n * before any driver instance or connection exists.\n *\n * @example\n * ```ts\n * const adapter = bunAdapter({ url: \"postgresql://app:secret@db.internal:5432/app\", max: 10 });\n * await adapter.connect();\n * const rows = await adapter.execute({ text: 'SELECT * FROM \"User\" WHERE \"id\" = $1', values: [1] });\n * ```\n */\nexport function bunAdapter(options: BunAdapterOptions): DatabaseAdapter {\n refuseUnsupportedBun({ version: Bun.version });\n const usePrepared = options?.preparedStatements ?? false;\n // The address is taken once, here: an invalid `connect_timeout` is refused\n // at construction, and nothing later re-reads the options or the environment.\n const address = takeConnectTimeout({ url: requireUrl({ options }) });\n const templates = createTemplateCache({ max: options?.stmtCacheMax ?? 1000 });\n\n /**\n * The wire claim this adapter currently makes. Starts conservative and is\n * replaced at most once, by {@link probeJsonWire}'s observation. Every handle\n * this factory builds — pool, transaction, savepoint, reserved session —\n * reads this one variable, so a transaction can never disagree with its\n * parent (the contract requires transactional adapters to carry the same\n * declaration).\n */\n let activeWire: WireFidelity = WIRE_TEXT;\n let wireSettled = false;\n let wireProbe: Promise<void> | null = null;\n\n let instance: BunInstance | null = null;\n\n // ─── Reserved-connection control (round-trip EPIC 6, pipelining) ───\n\n /**\n * Control texts (BEGIN, COMMIT, SAVEPOINT, the deadline bound) as tagged\n * templates: constant texts on the EXTENDED protocol, which bun:sql\n * pipelines once they are warm on a connection. A separate cache, so ORM\n * traffic can never evict them.\n */\n const controlTemplates = createTemplateCache({ max: 64 });\n\n function controlQuery(params: { connection: BunExecutor; text: string; values?: readonly unknown[] }): Promise<BunResults> {\n return params.connection(controlTemplates.getTemplate({ text: params.text }).template, ...(params.values ?? []));\n }\n\n /**\n * The send discipline of one top-level transaction on its reserved\n * connection:\n *\n * - The opening (`BEGIN …`) and every `SAVEPOINT` wait in `deferred` and go\n * out back to back with the next statement. A transaction whose callback\n * sends nothing sends nothing.\n * - BEGIN rides only ahead of an extended READ: bun:sql syncs per query, so a\n * failed BEGIN would let a pipelined WRITE autocommit. Ahead of anything\n * else BEGIN is awaited first. A read that rode behind a BEGIN that failed\n * rejects with BEGIN's error, and every later statement is refused.\n * - Without a deadline, statements dispatched while the opening is\n * unconfirmed either ride too (extended reads, nobody queued) or wait for\n * it in call order. With a deadline, every send is one turn: [bound,\n * statement] back to back, after the previous turn finished.\n * - Burst failures: the FIRST failure of a burst is the error; a 25P02 reply\n * becomes the aborted refusal naming the failure that aborted the\n * transaction (replies arrive in order on one connection).\n */\n function createReservedControl(params: {\n reserved: BunReserved;\n budget: TransactionBudget;\n scope: SavepointScope;\n /** The deferred opening text, or `null` when the transaction was opened eagerly. */\n opening: string | null;\n }): ReservedControl {\n const { reserved, budget, scope } = params;\n const deferred = createDeferredControl({ opening: params.opening === null ? [] : [params.opening] });\n /** The deferred BEGIN failed: the server holds no transaction. */\n let openingFailure: VibeError | undefined;\n /** The BEGIN step while its reply is outstanding. */\n let openingStep: Promise<unknown> | null = null;\n /** Settles (never rejects) once BEGIN's reply is in and `openingFailure` is recorded. */\n let openingPending: Promise<void> | null = null;\n /** Started-marker of the last statement queued behind the unconfirmed opening. */\n let waitTail: Promise<void> | null = null;\n /** Deadline mode: one turn at a time. */\n let deadlineTail: Promise<void> = Promise.resolve();\n /** The latest server-reported failure, in reply order. */\n let lastFailure: VibeError | undefined;\n\n const step = <T>(query: () => Promise<T>): Promise<T> =>\n new Promise<T>((resolve) => resolve(query())).then(undefined, (error: unknown) => {\n const mapped = mapBunDriverError({ error });\n if (mapped.meta.sqlstate === \"25P02\") {\n throw transactionAbortedError({ cause: lastFailure ?? scope.state.aborted?.cause });\n }\n if (typeof mapped.meta.sqlstate === \"string\") lastFailure = mapped;\n throw mapped;\n });\n\n const trackOpening = (sent: Promise<unknown>): Promise<void> => {\n openingStep = sent;\n const settled: Promise<void> = sent\n .then(ignore, (error: unknown) => {\n openingFailure = mapBunDriverError({ error });\n })\n .then(() => {\n if (openingPending === settled) {\n openingPending = null;\n openingStep = null;\n }\n });\n openingPending = settled;\n return settled;\n };\n\n const ridesOpening = <T>(send: ReservedSend<T>): boolean => send.extended && send.effect === \"read\";\n\n const sendNow = <T>(send: ReservedSend<T>): Promise<T> => {\n const cleanup = send.cleanup === true;\n if (!cleanup) {\n if (openingFailure !== undefined) throw transactionAbortedError({ cause: openingFailure });\n budget.assertUsable({ stage: send.stage ?? \"statement\" });\n send.guard?.();\n }\n const carriesOpening = !cleanup && !deferred.opened();\n const control = cleanup ? [] : [...deferred.take()];\n if (carriesOpening && !ridesOpening(send)) {\n // BEGIN confirmed first: nothing but a read may run behind a BEGIN\n // that could fail. The statement then takes its own turn. A SAVEPOINT\n // taken with BEGIN goes out NOW, right behind it, and its reply is\n // answered by the statement's turn. Behind a failed BEGIN it fails in\n // autocommit with no effect, and the turn refuses with BEGIN's error.\n const [opening, ...rest] = control;\n const confirmed = trackOpening(step(() => controlQuery({ connection: reserved, text: opening as string })));\n const riding = rest.map((text) => {\n const sent = step(() => controlQuery({ connection: reserved, text }));\n // Reported through the statement's turn, or moot after its refusal.\n sent.catch(ignore);\n return sent;\n });\n const next: ReservedSend<T> = { ...send, riding };\n if (budget.totalMs !== null) return confirmed.then(() => sendNow(next));\n return enqueue(next);\n }\n const ms = cleanup ? null : engineStatementBudgetMs({ budget });\n const steps: Promise<unknown>[] = [...(send.riding ?? [])];\n // A read riding a BEGIN that is still unconfirmed answers with BEGIN's error.\n if (!cleanup && !carriesOpening && openingStep !== null) steps.push(openingStep);\n control.forEach((text, index) => {\n const sent = step(() => controlQuery({ connection: reserved, text }));\n if (index === 0 && carriesOpening) trackOpening(sent);\n steps.push(sent);\n });\n if (ms !== null) steps.push(step(() => controlQuery({ connection: reserved, text: STATEMENT_BOUND_TEXT, values: [String(ms)] })));\n const statement = step(() => send.send(reserved));\n steps.push(statement);\n return Promise.allSettled(steps).then((settled) => {\n const failed = settled.find((outcome): outcome is PromiseRejectedResult => outcome.status === \"rejected\");\n if (failed !== undefined) throw failed.reason;\n return statement;\n });\n };\n\n const enqueue = <T>(send: ReservedSend<T>): Promise<T> => {\n const prior = waitTail ?? openingPending ?? Promise.resolve();\n let markStarted: () => void = ignore;\n const started = new Promise<void>((resolve) => {\n markStarted = resolve;\n });\n waitTail = started;\n return prior.then(() => {\n try {\n return sendNow(send);\n } finally {\n if (waitTail === started) waitTail = null;\n markStarted();\n }\n });\n };\n\n const dispatch = <T>(send: ReservedSend<T>): Promise<T> => {\n if (budget.totalMs !== null) {\n const pending = deadlineTail.then(() => sendNow(send));\n // A failed turn must not strand the next one (or ROLLBACK).\n deadlineTail = pending.then(ignore, ignore);\n return pending;\n }\n if (openingPending !== null && (waitTail !== null || !ridesOpening(send))) return enqueue(send);\n return new Promise<T>((resolve) => resolve(sendNow(send)));\n };\n\n return {\n deferred,\n dispatch,\n executor: ({ effect, guard }) => Object.assign(\n (strings: TemplateStringsArray, ...values: unknown[]): Promise<BunResults> =>\n dispatch({ effect, guard, extended: true, send: (connection) => connection(strings, ...values) }),\n { unsafe: (text: string, values?: unknown[]): Promise<BunResults> =>\n // `unsafe(text)` / `unsafe(text, [])` may go as a simple query: never pipelined behind BEGIN.\n dispatch({ effect, guard, extended: values !== undefined && values.length > 0, send: (connection) => connection.unsafe(text, values) }) },\n ),\n };\n }\n\n /**\n * The reserved connection of an OPEN raw transaction — session affinity for\n * the raw path. @vibeorm/migrate wraps transactional DDL in literal `BEGIN`\n * / `COMMIT` / `ROLLBACK` sent through `executeUnsafe`; bun:sql refuses\n * transaction control through `sql.unsafe()` on a pooled instance\n * (`ERR_POSTGRES_UNSAFE_TRANSACTION`), so a pure `BEGIN` reserves one\n * connection, every raw statement until the matching `COMMIT`/`ROLLBACK`\n * rides it, and the close releases it. The ORM path (`execute`) and\n * `transaction()` stay on the pool — they never participate in a raw\n * transaction. Concurrent raw transactions on one adapter are unsupported\n * (they were driver-refused before this pinning existed).\n */\n let rawSession: BunReserved | null = null;\n\n function createSqlInstance(params: { max: number }): BunInstance {\n // bun:sql's own default is named statements; off, the adapter matches\n // node-postgres (see BunAdapterOptions.preparedStatements).\n const sqlOptions: Record<string, unknown> = { max: params.max, prepare: usePrepared };\n if (options?.connectionTimeout !== undefined) {\n // bun:sql expects seconds; the VibeORM surface is milliseconds everywhere.\n sqlOptions.connectionTimeout = Math.max(1, Math.ceil(options.connectionTimeout / 1000));\n } else if (address.seconds !== undefined) {\n sqlOptions.connectionTimeout = address.seconds;\n }\n\n const startupOptions = buildStartupOptions({\n planCacheMode: options?.planCacheMode ?? \"force_custom_plan\",\n statementTimeout: options?.statementTimeout,\n });\n const url = startupOptions === undefined ? address.url : applyStartupOptions({ url: address.url, startupOptions });\n\n if (URL.canParse(url)) {\n const path = new URL(url).pathname;\n // Native Bun currently lets PGDATABASE override the URL path. Pin only\n // a supplied database; omitted components retain the driver's defaults.\n if (path.length > 1) sqlOptions.database = decodeURIComponent(path.slice(1));\n }\n return createBunSql({ url, options: sqlOptions }) as unknown as BunInstance;\n }\n\n function getSql(): BunInstance {\n instance ??= createSqlInstance({ max: options?.max ?? 10 });\n return instance;\n }\n\n /**\n * Ask THIS driver, once, whether it parses json on the path the ORM reads\n * rows over — the same `execute` path, prepared or unsafe as configured, so\n * the answer describes the traffic the claim is applied to.\n *\n * Runs on the handle that is already in hand (pool, transaction or reserved\n * session): a `SELECT` is harmless inside a transaction, and probing the pool\n * from inside one could deadlock an adapter configured with `max: 1`.\n * Failure refuses this operation. A later call can observe the wire again;\n * no user statement or transaction is retried.\n */\n async function probeJsonWire(source: BunExecutor): Promise<void> {\n const probe = renderDiagnostic({ dialect: postgresDialect, query: \"postgresJsonWire\" });\n const rows = finalRows({ result: await runMapped(() => usePrepared\n ? source(templates.getTemplate({ text: probe.text }).template)\n : source.unsafe(probe.text, [])) });\n const probed = rows[0]?.probe;\n if (typeof probed === \"object\" && probed !== null && \"__vibeorm\" in probed && probed.__vibeorm === 1) activeWire = WIRE_PARSED;\n else if (typeof probed === \"string\" && /^\\{\\s*\"__vibeorm\"\\s*:\\s*1\\s*\\}$/.test(probed)) activeWire = WIRE_TEXT;\n else {\n throw new VibeError({\n code: \"VIBE_ADAPTER\",\n message: \"Bun returned an unrecognized JSON wire probe result; no ORM statement was sent\",\n meta: { reason: \"json-wire-probe\" },\n });\n }\n wireSettled = true;\n }\n\n function observeResult(params: { scope?: SavepointScope; effect?: StatementEffect; result: BunResults }): void {\n if (params.scope === undefined) return;\n const result = params.result;\n const results: BunRows[] = result === null ? [[]] : Array.isArray(result[0]) ? result as BunRows[] : [result as BunRows];\n if (results.length === 0) observeRowChanges({ scope: params.scope, count: statementRowChanges({ effect: params.effect }) });\n for (const rows of results) observeRowChanges({ scope: params.scope, count: statementRowChanges({ effect: params.effect, count: rows.count ?? rows.affectedRows, rows: rows.length, resultRows: rows }) });\n }\n\n async function runExecute(params: {\n source: BunExecutor;\n text: string;\n values: unknown[];\n scope?: SavepointScope;\n effect?: StatementEffect;\n }): Promise<Record<string, unknown>[]> {\n // One extra round trip on the first ORM query of this adapter's life; a\n // single boolean test on every one after it. It must complete BEFORE the\n // first rows are handed back, because the runtime reads `wire` to build\n // that read's decode plan.\n if (!wireSettled) {\n if (params.scope === undefined) {\n wireProbe ??= probeJsonWire(params.source).finally(() => { wireProbe = null; });\n await wireProbe;\n } else {\n // A transaction handle probes on its OWN connection and never waits\n // for the pool's probe: that probe needs a free pool connection, and\n // every one may be held by a transaction waiting here — a cold\n // adapter with all connections in transactions would hang forever.\n await probeJsonWire(params.source);\n }\n }\n const values = serializeParams({ values: params.values, namedStatements: usePrepared });\n if (usePrepared) {\n // F19: a tagged template binds POSITIONALLY, one value per gap — so the\n // values follow the placeholder ORDER found in the text (`$2, $1` binds\n // backwards otherwise, and a repeated `$1` needs its value twice).\n const prepared = templates.getTemplate({ text: params.text });\n const bound = prepared.identityOrder && prepared.indices.length === values.length\n ? values\n : bindTemplateValues({ text: params.text, indices: prepared.indices, values });\n // A placeholder repeated in the text is bound once per gap; past the\n // protocol's limit that expansion would refuse a statement whose own\n // parameter count is legal, so it runs by `$n` instead.\n const result = bound.length > MAX_BIND_PARAMETERS\n ? await runMapped(() => params.source.unsafe(params.text, values))\n : await runMapped(() => params.source(prepared.template, ...bound));\n observeResult({ scope: params.scope, effect: params.effect, result });\n return plainRows({ rows: finalRows({ result }) });\n }\n const result = await runMapped(() => params.source.unsafe(params.text, values));\n observeResult({ scope: params.scope, effect: params.effect, result });\n return plainRows({ rows: finalRows({ result }) });\n }\n\n async function runExecuteUnsafe(params: {\n source: BunExecutor;\n text: string;\n values?: unknown[];\n scope?: SavepointScope;\n effect?: StatementEffect;\n }): Promise<QueryResult> {\n const values = params.values === undefined ? undefined : serializeParamsRaw({ values: params.values, namedStatements: usePrepared });\n const result = await runMapped(() => params.source.unsafe(params.text, values));\n observeResult({ scope: params.scope, effect: params.effect, result });\n const rows = finalRows({ result });\n return { rows: plainRows({ rows }), affectedRows: readAffectedRows({ rows }) };\n }\n\n /**\n * Build the adapter facade over any bun:sql handle. `parentMode` decides\n * whether a nested `transaction()` opens a real transaction or a savepoint;\n * `scope` is shared by reference across one top-level transaction, and the\n * savepoint gate serializes overlapping sibling savepoints (F14) on BOTH the\n * driver-managed and the manual path.\n */\n function createAdapter(params: {\n source: BunSource;\n parentMode: ParentMode;\n scope: SavepointScope;\n /** The enclosing transaction's budget; absent on the pool-level adapter. */\n budget?: TransactionBudget;\n lifetime?: { active: boolean };\n /** The reserved connection's send discipline; absent on the pool-level adapter. */\n control?: ReservedControl;\n }): DatabaseAdapter {\n const { source, parentMode, scope, budget, lifetime, control } = params;\n\n function assertHandle(): void {\n budget?.assertUsable({ stage: \"statement\" });\n if (lifetime?.active === false) {\n throw new VibeError({\n code: \"VIBE_TRANSACTION\",\n message: \"this savepoint callback has finished; its transaction handle has expired\",\n meta: { reason: \"expired\" },\n });\n }\n if (scope.state.poisoned !== null) throw scope.state.poisoned;\n }\n\n /**\n * Nested transaction: a savepoint on the reserved connection, driven by\n * hand. EPIC 6: `SAVEPOINT` rides with the body's first statement; a body\n * that sent nothing sends neither its RELEASE nor its ROLLBACK TO.\n */\n async function transactionViaSavepoint<T>(\n reservedControl: ReservedControl,\n fn: (txAdapter: DatabaseAdapter) => Promise<T>,\n nestedOptions?: TransactionOptions,\n ): Promise<T> {\n refuseNestedTransactionOptions({ options: nestedOptions, provider: PROVIDER });\n assertHandle();\n budget?.assertUsable({ stage: \"nested\" });\n const savepointControl = (statement: string, cleanup: boolean): Promise<unknown> | undefined => {\n if (reservedControl.deferred.routeSavepoint({ text: statement }) !== \"send\") return undefined;\n return reservedControl.dispatch({\n extended: true,\n ...(cleanup ? { cleanup: true } : {}),\n send: (connection) => controlQuery({ connection, text: statement }),\n });\n };\n return runNestedSavepoint({\n scope,\n execute: (statement) => savepointControl(statement, false),\n cleanup: (statement: string) => savepointControl(statement, true),\n body: async (child) => {\n assertHandle();\n const childLifetime = { active: true };\n try {\n return await fn(createAdapter({ source, parentMode: \"tx\", scope: child, budget, lifetime: childLifetime, control: reservedControl }));\n } finally {\n childLifetime.active = false;\n }\n },\n });\n }\n\n /** Top-level transaction on the pool. */\n async function transactionViaPool<T>(\n fn: (txAdapter: DatabaseAdapter) => Promise<T>,\n transactionOptions?: TransactionOptions,\n ): Promise<T> {\n const pool = source as BunInstance;\n\n // Refuse an unsupportable budget before any connection is taken.\n validateTransactionDeadline({\n options: transactionOptions,\n support: BUDGETS.transactionDeadline,\n provider: PROVIDER,\n });\n\n const readOnly = readOnlyRequested({ options: transactionOptions, provider: PROVIDER });\n\n // Round-trip EPIC 6: EVERY top-level transaction reserves one connection\n // and drives control by hand, so BEGIN / SAVEPOINT / the deadline bound\n // can ride with the next statement (see createReservedControl). With a\n // `timeout` the opening stays EPIC 3's ONE eager simple-protocol message\n // (BEGIN […]; SET LOCAL statement_timeout = N), validated here, before\n // the reservation, so its errors surface before the callback runs.\n const openingOptions = { isolationLevel: transactionOptions?.isolationLevel, readOnly };\n const eagerOpen = transactionOptions?.timeout === undefined\n ? null\n : openTransactionStatement({ ...openingOptions, timeout: transactionOptions.timeout });\n const reserved = await runMapped(() => pool.reserve());\n // The deadline clock starts HERE: the connection is reserved, so waiting\n // for it is not charged against the caller's transaction budget.\n const budget = startTransactionBudget({ options: transactionOptions, provider: PROVIDER });\n const txScope = createSavepointScope();\n const control = createReservedControl({\n reserved,\n budget,\n scope: txScope,\n opening: eagerOpen === null ? beginStatement(openingOptions) : null,\n });\n /**\n * How far COMMIT got — the only input of the commit outcome (EPIC T). A\n * holder, because the `send` callback below moves it out of sight of\n * the compiler's narrowing.\n */\n const commit: { progress: CommitProgress } = { progress: \"not-sent\" };\n let discard = false;\n try {\n if (eagerOpen !== null) await runMapped(() => reserved.unsafe(eagerOpen));\n const txAdapter = createAdapter({\n source: reserved,\n parentMode: \"tx\",\n scope: txScope,\n budget,\n control,\n });\n const result = await runRootScope({ scope: txScope, body: () => fn(txAdapter) });\n // An expired budget must never commit, however the callback ended.\n budget.assertUsable({ stage: \"commit\" });\n if (!control.deferred.opened()) {\n // The callback sent nothing: no BEGIN left the client, so there is\n // nothing to commit (EPIC 6, empty transaction: 2 waits → 0).\n budget.close({ outcome: \"committed\" });\n return result;\n }\n const reply = await control.dispatch({\n extended: true,\n effect: \"write\",\n stage: \"commit\",\n send: (connection) => {\n commit.progress = \"sent\";\n return controlQuery({ connection, text: \"COMMIT\" });\n },\n });\n // An aborted transaction's COMMIT is answered with a ROLLBACK tag and\n // no error: the outcome is a certain rollback.\n if (finalRows({ result: reply }).command === \"ROLLBACK\") {\n commit.progress = \"answered\";\n throw transactionAbortedError({ cause: txScope.state.aborted?.cause });\n }\n budget.close({ outcome: \"committed\" });\n return result;\n } catch (error) {\n if (txScope.state.poisoned !== null) discard = true;\n // A failed COMMIT is an unknown outcome only when the connection was\n // lost; a server answer with a SQLSTATE (a deferred FK, a\n // serialization failure) is a definite rollback and raises that\n // precise error, as on adapter-pg (EPIC 6 decision 2, RV5 MJ-3).\n if (commit.progress === \"sent\") commit.progress = isConnectionLoss({ error }) ? \"unanswered\" : \"answered\";\n let rollback: RollbackOutcome = \"not-needed\";\n try {\n // A deferred opening that never left the client left nothing to undo.\n if (control.deferred.opened()) {\n await control.dispatch({ extended: false, cleanup: true, send: (connection) => connection.unsafe(\"ROLLBACK\") });\n rollback = \"acknowledged\";\n }\n } catch {\n // The rollback that should have cleaned up failed. `SET LOCAL` reverts\n // with the transaction, but this session's transaction state can no\n // longer be asserted, so the reserved connection is closed. The\n // commit outcome does not change: it follows from how far COMMIT got.\n discard = true;\n rollback = \"failed\";\n }\n // Only a COMMIT whose answer was lost hides the outcome from the\n // caller. A failure before COMMIT keeps its own error even when the\n // cleanup ROLLBACK failed too, like node-postgres (EPIC T: the facts\n // ride beside it, read with `transactionOutcomeOf({ error })`).\n const own = commit.progress === \"unanswered\" && txScope.state.poisoned === null\n ? unknownOutcome({ cause: error })\n : error;\n throw settleFailedTransaction({\n error: own,\n provider: PROVIDER,\n budget,\n scope: txScope,\n commit: commit.progress,\n rollback,\n connection: discard ? \"discarded\" : \"returned\",\n });\n } finally {\n if (discard) await runMapped(() => reserved.close());\n else reserved.release();\n }\n }\n\n return {\n dialect: DIALECT,\n provider: PROVIDER,\n budgets: BUDGETS,\n roundTrips: ROUND_TRIPS,\n ...(parentMode === \"pool\" ? {} : { rowChanges: (): RowChangeCount => { assertHandle(); return readRowChanges({ scope }); } }),\n get wire(): WireFidelity {\n return activeWire;\n },\n\n async execute(execParams) {\n assertHandle();\n const turn = scopeTurn({ scope });\n if (turn !== undefined) await turn;\n assertHandle();\n const executor = control === undefined ? source : control.executor({ effect: execParams.effect, guard: assertHandle });\n const result = runExecute({ source: executor, ...(parentMode === \"pool\" ? {} : { scope }), ...execParams });\n // Inside a transaction a server-reported failure aborts it (postgres):\n // record it so a callback that swallows it cannot commit nothing. The\n // pool-level handle has no transaction to abort.\n return parentMode === \"pool\"\n ? result\n : result.catch((error: unknown) => abortTransactionOnStatementFailure({ scope, error }));\n },\n\n async executeUnsafe(execParams) {\n assertHandle();\n const turn = scopeTurn({ scope });\n if (turn !== undefined) await turn;\n assertHandle();\n const executor = control === undefined ? source : control.executor({ effect: execParams.effect, guard: assertHandle });\n const result = runExecuteUnsafe({ source: executor, ...(parentMode === \"pool\" ? {} : { scope }), ...execParams });\n return parentMode === \"pool\"\n ? result\n : result.catch((error: unknown) => abortTransactionOnStatementFailure({ scope, error }));\n },\n\n async transaction<T>(\n fn: (txAdapter: DatabaseAdapter) => Promise<T>,\n transactionOptions?: TransactionOptions,\n ): Promise<T> {\n return control === undefined\n ? transactionViaPool(fn, transactionOptions)\n : transactionViaSavepoint(control, fn, transactionOptions);\n },\n\n async connect(): Promise<void> {\n if (parentMode !== \"pool\") {\n // The open transaction owns this connection; an expired handle keeps\n // its own refusal (checked first).\n assertHandle();\n throw transactionLifecycleRefusal({ method: \"connect\" });\n }\n const reserved = await runMapped(() => (source as BunInstance).reserve());\n try {\n // Round-trip EPIC 3 (A-13): settle the JSON wire probe here, on the\n // connection already in hand, so the first ORM statement does not\n // pay it. A failure rejects connect() and leaves the wire unsettled:\n // the lazy path in runExecute probes again, as after any failed probe.\n // A probe already in flight (a first query's, on the pool) settles\n // the wire by itself: never wait for it while holding this\n // reservation — on a one-connection pool that probe needs it\n // (fix lane FX-A, RV2 MJ-2).\n if (!wireSettled && wireProbe === null) {\n wireProbe = probeJsonWire(reserved).finally(() => { wireProbe = null; });\n await wireProbe;\n }\n } finally {\n reserved.release();\n }\n },\n\n async disconnect(): Promise<void> {\n if (parentMode !== \"pool\") {\n assertHandle();\n throw transactionLifecycleRefusal({ method: \"disconnect\" });\n }\n await runMapped(() => (source as BunInstance).close());\n instance = null;\n },\n\n formatArrayParam(values: unknown[]): unknown {\n return toPgArrayLiteral(values);\n },\n };\n }\n\n /** Pool-level facade — the bun:sql client is created on first use. */\n function poolAdapter(): DatabaseAdapter {\n return createAdapter({\n source: getSql(),\n parentMode: \"pool\",\n scope: createSavepointScope(),\n });\n }\n\n /**\n * Final cleanup, run ONCE by the lifecycle gate after every admitted\n * operation settled — a pending raw BEGIN has published its session, and\n * every admitted `withSession` has closed its private pool. Rolls back an\n * abandoned raw transaction, then closes the instance. A failed ROLLBACK is\n * reported as `disconnect()`'s outcome (the instance still closes, and\n * takes the session with it); the session is released either way, because\n * bun:sql does not settle its pool's pending count when a reserved\n * connection closes (see `withSession`).\n */\n function closeOwnedResources(): Promise<void> {\n return runShutdownCleanup({\n steps: [\n async (): Promise<void> => {\n if (rawSession === null) return;\n const session = rawSession;\n rawSession = null;\n await runMapped(() => session.unsafe(\"ROLLBACK\")).then(\n () => { session.release(); },\n (error: unknown) => { session.release(); throw error; },\n );\n },\n async (): Promise<void> => {\n if (instance === null) return;\n const closing = instance;\n instance = null;\n await runMapped(() => closing.close());\n },\n ],\n });\n }\n\n const lifecycle = createAdapterLifecycleGate({ driver: \"bun\", cleanup: closeOwnedResources });\n\n /** The root operations; the adapter below admits each one through {@link lifecycle}. */\n const root: Pick<Required<DatabaseAdapter>, \"withSession\" | \"execute\" | \"executeUnsafe\" | \"transaction\" | \"connect\"> = {\n async withSession({ run }) {\n // Bun 1.3 does not decrement its pool's pending counter when a reserved\n // connection closes or dies. Own a private one-connection driver instance\n // so cleanup cannot hang or force-close unrelated application work.\n const sessionPool = createSqlInstance({ max: SESSION_CONNECTION.max });\n const close = (): Promise<void> => runMapped(() => sessionPool.close({ timeout: SESSION_CONNECTION.closeGraceSeconds }));\n const reserved = await runMapped(() => sessionPool.reserve()).catch(async (cause: unknown) => {\n await close().catch((cleanupCause: unknown) => {\n if (cause instanceof VibeError) throw new VibeError({ code: cause.code, message: cause.message, meta: { ...cause.meta, cleanupCause }, cause });\n throw cause;\n });\n throw cause;\n });\n return runPinnedSession({\n run,\n execute: async (query) => (await runExecuteUnsafe({ source: reserved, ...query })).rows,\n isLost: (error) => error instanceof VibeError && isConnectionLoss({ error }),\n release: close,\n });\n },\n\n async execute(params) {\n return runExecute({ source: getSql(), ...params });\n },\n\n async executeUnsafe(params) {\n const control = classifyRawTransactionControl({ text: params.text });\n if (rawSession !== null) {\n if (control === \"close\") {\n const session = rawSession;\n rawSession = null;\n try {\n return await runExecuteUnsafe({ source: session, ...params });\n } finally {\n session.release();\n }\n }\n // A nested raw BEGIN lands here too — postgres treats it as a warning\n // no-op on the open session, exactly like a single connection would.\n return runExecuteUnsafe({ source: rawSession, ...params });\n }\n if (control === \"open\") {\n const reserved = await runMapped(() => getSql().reserve());\n try {\n const result = await runExecuteUnsafe({ source: reserved, ...params });\n rawSession = reserved;\n return result;\n } catch (error) {\n reserved.release();\n throw error;\n }\n }\n return runExecuteUnsafe({ source: getSql(), ...params });\n },\n\n async transaction<T>(\n fn: (txAdapter: DatabaseAdapter) => Promise<T>,\n transactionOptions?: TransactionOptions,\n ): Promise<T> {\n return poolAdapter().transaction(fn, transactionOptions);\n },\n\n async connect(): Promise<void> {\n return poolAdapter().connect();\n },\n };\n\n return {\n dialect: DIALECT,\n provider: PROVIDER,\n budgets: BUDGETS,\n roundTrips: ROUND_TRIPS,\n transactionOutcome: \"reported\",\n get wire(): WireFidelity {\n return activeWire;\n },\n\n withSession({ run }) {\n return lifecycle.admit({ run: () => root.withSession({ run: (executor) => lifecycle.inCallback({ run: () => run(executor) }) }) });\n },\n\n execute(params) {\n return lifecycle.admit({ run: () => root.execute(params) });\n },\n\n executeUnsafe(params) {\n return lifecycle.admit({ run: () => root.executeUnsafe(params) });\n },\n\n transaction<T>(\n fn: (txAdapter: DatabaseAdapter) => Promise<T>,\n transactionOptions?: TransactionOptions,\n ): Promise<T> {\n return lifecycle.admit({ run: () => root.transaction((txAdapter) => lifecycle.inCallback({ run: () => fn(txAdapter) }), transactionOptions) });\n },\n\n connect(): Promise<void> {\n return lifecycle.admit({ run: () => root.connect() });\n },\n\n /**\n * Terminal (EPIC A2): refuses new work at once, waits for admitted work —\n * whole transaction and session callbacks, private session pools included\n * — then closes the instance, once. Repeated calls share that completion.\n * A new adapter is the only way to connect again.\n */\n disconnect(): Promise<void> {\n return lifecycle.disconnect();\n },\n\n formatArrayParam(values: unknown[]): unknown {\n return toPgArrayLiteral(values);\n },\n };\n}\n\n/**\n * Rows affected by a bun:sql statement: the driver attaches `count` (and, on\n * some versions, `affectedRows`) to the returned array; otherwise the number of\n * returned rows is the best available answer.\n */\nfunction readAffectedRows(params: { rows: BunRows }): number {\n const { rows } = params;\n if (typeof rows.count === \"number\") return rows.count;\n if (typeof rows.affectedRows === \"number\") return rows.affectedRows;\n return rows.length;\n}\n\n/**\n * The rows as a plain `Array`, like node-postgres' `result.rows`. bun:sql\n * resolves to its own `SQLResultArray`, which carries `count`, `command`,\n * `affectedRows` and `lastInsertRowid` as own properties — a caller that\n * compares, spreads or clones a `findMany` result would otherwise see them.\n */\nfunction plainRows(params: { rows: BunRows }): Record<string, unknown>[] {\n return Array.from(params.rows);\n}\n\n/** Bun's simple protocol returns an outer array for scripts; final command wins. */\nfunction finalRows(params: { result: BunResults }): BunRows {\n const { result } = params;\n if (result === null) return [];\n return Array.isArray(result[0]) ? (result as BunRows[]).at(-1) ?? [] : result as BunRows;\n}\n\n/**\n * Whether a mapped failure means the CONNECTION is gone rather than the server\n * having answered: no SQLSTATE at all (socket-level or a driver refusal), class\n * 08 (connection exception) or an admin/crash shutdown (57P01–57P03). The same\n * rule as `@vibeorm/adapter-pg`: it pins a session as lost and decides whether\n * a failed COMMIT's outcome is unknown.\n */\nfunction isConnectionLoss(params: { error: unknown }): boolean {\n const { error } = params;\n if (!(error instanceof VibeError)) return true;\n const sqlstate = error.meta.sqlstate;\n return typeof sqlstate !== \"string\" || sqlstate.startsWith(\"08\") || [\"57P01\", \"57P02\", \"57P03\"].includes(sqlstate);\n}\n\n/**\n * A statement failure inside a transaction. A server-reported failure aborts\n * the transaction ({@link abortTransactionOnServerFailure}). bun:sql also\n * refuses a statement with more than 65,535 parameters BEFORE sending it,\n * where node-postgres sends it and the server aborts the transaction (08P01) —\n * so that refusal aborts it here too, and a callback that catches it cannot\n * commit the transaction's other writes.\n */\nfunction abortTransactionOnStatementFailure(params: { scope: SavepointScope; error: unknown }): never {\n const { scope, error } = params;\n if (error instanceof VibeError && error.meta.driverCode === \"ERR_POSTGRES_TOO_MANY_PARAMETERS\") {\n markTransactionAborted({ scope, cause: error });\n }\n return abortTransactionOnServerFailure({ scope, error });\n}\n\nfunction unknownOutcome(params: { cause: unknown; reason?: string }): VibeError {\n return new VibeError({\n code: \"VIBE_TRANSACTION\",\n message: \"Bun could not confirm transaction recovery or completion; the outcome is unknown. Nothing is retried automatically.\",\n meta: { reason: params.reason ?? \"transaction-outcome-unknown\", outcome: \"unknown\" },\n cause: params.cause,\n });\n}\n\n// ─── Re-exports (driver-error table, params, helpers) ─────────────\n\nexport {\n BUN_SQLSTATE_ERROR_CODES,\n BUN_SQLSTATE_REASONS,\n bunErrorSqlstate,\n mapBunDriverError,\n} from \"./errors.ts\";\nexport { serializeParams, serializeParamsRaw, toPgArrayLiteral } from \"./params.ts\";\nexport { applyStartupOptions, buildStartupOptions } from \"./connection-url.ts\";\nexport type { PlanCacheMode } from \"./connection-url.ts\";\nexport { createSavepointCounter, nextSavepointName } from \"@vibeorm/runtime/adapter-kit\";\nexport type { SavepointCounter } from \"@vibeorm/runtime/adapter-kit\";\nexport { createTemplateCache, templateChunks } from \"./template-cache.ts\";\nexport type { TemplateCache } from \"./template-cache.ts\";\nexport {\n ISOLATION_LEVEL_SQL,\n beginStatement,\n classifyRawTransactionControl,\n refuseNestedTransactionOptions,\n statementTimeoutStatement,\n} from \"./transaction-sql.ts\";\nexport type { RawTransactionControl } from \"./transaction-sql.ts\";\n// ─── EPIC 6: transaction budgets (shared, @vibeorm/runtime/adapter-kit) ───\nexport {\n DEFAULT_DEADLINE_CLOCK,\n engineStatementBudgetMs,\n isTransactionDeadlineError,\n startTransactionBudget,\n transactionClosedError,\n transactionDeadlineError,\n transactionOutcomeUnknownError,\n validateTransactionDeadline,\n} from \"@vibeorm/runtime/adapter-kit\";\nexport type { BudgetStage, DeadlineClock, TransactionBudget, TransactionOutcome } from \"@vibeorm/runtime/adapter-kit\";\n",
9
+ "/**\n * Connection-URL handling for bun:sql.\n *\n * Per-connection PostgreSQL settings (`plan_cache_mode`, `statement_timeout`)\n * travel in the `options` startup parameter, which the server parses for\n * `-c key=value` pairs — so every connection in bun's internal pool inherits\n * them without a per-query round trip.\n *\n * v1 lesson (LEARNINGS.md): bun:sql forwards *unrecognised* URL parameters to\n * the server as runtime configuration, so a libpq client-side option such as\n * `connect_timeout` reaches PostgreSQL, which rejects it as an unrecognised\n * configuration parameter (42704). A URL written for libpq or node-postgres\n * still works here: {@link takeConnectTimeout} removes `connect_timeout` and\n * hands its seconds to bun:sql's `connectionTimeout` constructor option.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\n\n/**\n * PostgreSQL plan-cache behaviour for the implicit prepared statements bun:sql\n * creates. `force_custom_plan` replans with the real parameter values (≈0.1 ms\n * per query) and keeps index selection optimal on range/LIKE/skewed filters —\n * `auto` lets PostgreSQL switch to a generic plan after ~5 executions.\n */\nexport type PlanCacheMode = \"auto\" | \"force_custom_plan\" | \"force_generic_plan\";\n\n/**\n * Build the `options` startup string, or `undefined` when nothing needs setting.\n *\n * @throws VibeError `VIBE_VALIDATION` when `statementTimeout` is not a\n * non-negative integer — the value ends up inside the startup string verbatim.\n */\nexport function buildStartupOptions(params: {\n planCacheMode: PlanCacheMode;\n statementTimeout?: number;\n}): string | undefined {\n const { planCacheMode, statementTimeout } = params;\n const parts: string[] = [];\n if (planCacheMode !== \"auto\") parts.push(`-c plan_cache_mode=${planCacheMode}`);\n if (statementTimeout !== undefined) {\n if (!Number.isInteger(statementTimeout) || statementTimeout < 0) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `statementTimeout must be a non-negative integer of milliseconds, received ${String(statementTimeout)}`,\n meta: { statementTimeout },\n });\n }\n parts.push(`-c statement_timeout=${statementTimeout}`);\n }\n return parts.length === 0 ? undefined : parts.join(\" \");\n}\n\n/**\n * Remove libpq's client-side `connect_timeout` (whole seconds) from a URL and\n * return its value, so the URL bun:sql forwards to the server no longer carries\n * it. `0` or a negative value means \"no limit\" in libpq and yields\n * `undefined`. A URL bun cannot parse is returned unchanged.\n *\n * @throws VibeError `VIBE_VALIDATION` when the value is not an integer.\n */\nexport function takeConnectTimeout(params: { url: string }): { url: string; seconds?: number } {\n if (!URL.canParse(params.url)) return { url: params.url };\n const url = new URL(params.url);\n const raw = url.searchParams.get(\"connect_timeout\");\n if (raw === null) return { url: params.url };\n const seconds = Number(raw.trim());\n if (raw.trim() === \"\" || !Number.isInteger(seconds)) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `connect_timeout in the connection URL must be an integer number of seconds, received \"${raw}\"`,\n meta: { connectTimeout: raw },\n });\n }\n url.searchParams.delete(\"connect_timeout\");\n url.search = url.searchParams.toString().replace(/\\+/g, \"%20\");\n return seconds > 0 ? { url: url.toString(), seconds } : { url: url.toString() };\n}\n\n/** Merge startup settings into one `options` key; adapter settings take precedence. */\nexport function applyStartupOptions(params: { url: string; startupOptions: string }): string {\n if (!URL.canParse(params.url)) {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message: \"invalid PostgreSQL connection URL\" });\n }\n const url = new URL(params.url);\n const merged = [...url.searchParams.getAll(\"options\"), params.startupOptions].filter(Boolean).join(\" \");\n url.searchParams.set(\"options\", merged);\n url.search = url.searchParams.toString().replace(/\\+/g, \"%20\");\n return url.toString();\n}\n",
10
+ "/**\n * Driver-error mapping for `bun:sql`.\n *\n * bun:sql raises `SQL.PostgresError` for server failures and for client-side\n * problems alike. Server failures carry the PostgreSQL SQLSTATE — depending on\n * the Bun version on `code` or on `errno` — while client-side failures use a\n * `ERR_POSTGRES_*` identifier in `code`. Both shapes are read here, so the\n * mapping is stable across Bun versions. Constitution rule 5: only `VibeError`\n * escapes the adapter.\n */\n\nimport { VibeError, type VibeErrorCode } from \"@vibeorm/schema\";\n\n// ─── SQLSTATE table ───────────────────────────────────────────────\n\n/**\n * PostgreSQL SQLSTATE → stable VibeError code. Frozen and mirrored by tests;\n * anything absent from this table (including every `ERR_POSTGRES_*` connection\n * or auth failure) maps to `VIBE_ADAPTER`.\n */\nexport const BUN_SQLSTATE_ERROR_CODES: Readonly<Record<string, VibeErrorCode>> = Object.freeze({\n /** exclusion_violation */\n \"23P01\": \"VIBE_EXCLUSION_VIOLATION\",\n /** unique_violation */\n \"23505\": \"VIBE_UNIQUE_VIOLATION\",\n /** foreign_key_violation */\n \"23503\": \"VIBE_FK_VIOLATION\",\n /** restrict_violation — PostgreSQL 18+ ON DELETE/UPDATE RESTRICT */\n \"23001\": \"VIBE_FK_VIOLATION\",\n /** not_null_violation */\n \"23502\": \"VIBE_VALIDATION\",\n /** check_violation */\n \"23514\": \"VIBE_VALIDATION\",\n /**\n * invalid_text_representation — a value the server cannot parse into the\n * column's type (out-of-range enum value, `\"abc\"` for an integer). Bad input,\n * so the same code sqlite reports for its enum CHECK violation.\n */\n \"22P02\": \"VIBE_VALIDATION\",\n /** Data exceptions the same bad input raises (mirrors adapter-pg): too long, out of range, bad datetime, datetime overflow. */\n \"22001\": \"VIBE_VALIDATION\",\n \"22003\": \"VIBE_VALIDATION\",\n \"22007\": \"VIBE_VALIDATION\",\n \"22008\": \"VIBE_VALIDATION\",\n /**\n * insufficient_privilege — a denied table/column privilege, and the SQLSTATE a\n * native row-level-security policy raises when its WITH CHECK refuses a write.\n * Callers identify it by this code, never by message text.\n */\n \"42501\": \"VIBE_PERMISSION_DENIED\",\n /** serialization_failure */\n \"40001\": \"VIBE_TRANSACTION\",\n /** deadlock_detected */\n \"40P01\": \"VIBE_TRANSACTION\",\n /** query_canceled — statement_timeout fired */\n \"57014\": \"VIBE_TRANSACTION\",\n /**\n * lock_not_available — a `nowait` locking read on already-locked rows, or an\n * expired `lock_timeout`. Postgres reports both with this one SQLSTATE.\n */\n \"55P03\": \"VIBE_LOCK_NOT_AVAILABLE\",\n /** read_only_sql_transaction — a write inside a READ ONLY transaction (mirrors adapter-pg). */\n \"25006\": \"VIBE_TRANSACTION\",\n});\n\n/** SQLSTATEs that additionally explain themselves through `meta.reason`. */\nexport const BUN_SQLSTATE_REASONS: Readonly<Record<string, string>> = Object.freeze({\n \"23P01\": \"exclusion-violation\",\n \"57014\": \"timeout\",\n \"55P03\": \"lock-not-available\",\n \"40P01\": \"deadlock\",\n \"40001\": \"serialization-failure\",\n \"25006\": \"read-only-transaction\",\n});\n\n// ─── Reading driver errors ────────────────────────────────────────\n\n/**\n * A PostgreSQL SQLSTATE is exactly five digits/uppercase letters (e.g. `40P01`)\n * and every one PostgreSQL defines contains a digit. Requiring one keeps a\n * five-letter socket errno (`EPIPE`, `EPERM`) from passing as a server answer:\n * a COMMIT that failed with it is a lost connection, not a definite rollback\n * (fix lane FX-A, mirrors adapter-pg).\n */\nconst SQLSTATE_PATTERN = /^(?=[A-Z]*\\d)[0-9A-Z]{5}$/;\n\nfunction readStringField(params: { source: Record<string, unknown>; key: string }): string | undefined {\n const value = params.source[params.key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/**\n * Extract the SQLSTATE from a bun:sql error, accepting it on either `code` or\n * `errno`. `ERR_POSTGRES_*` identifiers are not SQLSTATEs and yield `undefined`.\n */\nexport function bunErrorSqlstate(params: { error: unknown }): string | undefined {\n const { error } = params;\n if (error === null || typeof error !== \"object\") return undefined;\n const source = error as Record<string, unknown>;\n for (const key of [\"code\", \"errno\"]) {\n const value = readStringField({ source, key });\n if (value !== undefined && SQLSTATE_PATTERN.test(value)) return value;\n }\n return undefined;\n}\n\n// ─── Mapping ──────────────────────────────────────────────────────\n\n/**\n * Map any error thrown by bun:sql onto a `VibeError`.\n *\n * A `VibeError` passes through unchanged, so an error raised deeper inside the\n * ORM (or by a nested adapter call) is never re-wrapped.\n */\nexport function mapBunDriverError(params: { error: unknown }): VibeError {\n const { error } = params;\n if (error instanceof VibeError) return error;\n\n const source: Record<string, unknown> =\n error !== null && typeof error === \"object\" ? (error as Record<string, unknown>) : {};\n const sqlstate = bunErrorSqlstate({ error });\n const code: VibeErrorCode =\n (sqlstate === undefined ? undefined : BUN_SQLSTATE_ERROR_CODES[sqlstate]) ?? \"VIBE_ADAPTER\";\n\n const meta: Record<string, unknown> = {};\n if (sqlstate !== undefined) meta.sqlstate = sqlstate;\n const constraint = readStringField({ source, key: \"constraint\" });\n if (constraint !== undefined) meta.constraint = constraint;\n const table = readStringField({ source, key: \"table\" });\n if (table !== undefined) meta.table = table;\n const column = readStringField({ source, key: \"column\" });\n if (column !== undefined) meta.column = column;\n const reason = sqlstate === undefined ? undefined : BUN_SQLSTATE_REASONS[sqlstate];\n if (reason !== undefined) meta.reason = reason;\n // Keep bun's own identifier when it is not a SQLSTATE — it is the only clue\n // a connection/auth/protocol failure carries.\n const driverCode = readStringField({ source, key: \"code\" });\n if (driverCode !== undefined && driverCode !== sqlstate) meta.driverCode = driverCode;\n\n const message =\n readStringField({ source, key: \"message\" }) ??\n (typeof error === \"string\" ? error : \"unknown bun:sql driver error\");\n\n return new VibeError({ code, message, meta, cause: error });\n}\n\n/** Run a driver call, mapping anything it throws onto a `VibeError`. */\nexport async function runMapped<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n throw mapBunDriverError({ error });\n }\n}\n",
11
+ "/**\n * Parameter serialization for bun:sql: the values node-postgres would send.\n *\n * Live-verified on Bun 1.4.1 and 1.4.3 (`tests/node-postgres-parity.live.test.ts`):\n * - bun:sql types a JS number itself (int32 → `int4`, anything else →\n * `float8`) and lets the SERVER cast from that type, so numbers, bigints and\n * booleans go out as text and the server reads them as the slot's own type;\n * - a plain JS array bound to a scalar-list column (`text[]`, `int[]`) is NOT\n * turned into a PostgreSQL array literal by bun:sql — it arrives as `a,b` and\n * the server rejects it with `malformed array literal`. Scalar lists therefore\n * have to be pre-rendered with {@link toPgArrayLiteral}, which is exactly what\n * the adapter's `formatArrayParam` returns;\n * - with NAMED statements (`preparedStatements: true`) bun:sql learns each\n * slot's type first and JSON-encodes whatever is bound to a `json`/`jsonb`\n * slot, a string included; with unnamed statements (the default) a string is\n * sent as text and the server parses it, like node-postgres.\n *\n * Hence the split (LEARNINGS.md): the ORM path only respells scalars (scalar\n * lists already arrived as literal strings, Json values as JSON text bound\n * through `::text::jsonb`), while the raw path renders plain JS arrays as array\n * literals so `db.$queryRawUnsafe('… = ANY($1)', [1, 2, 3])` matches rows.\n */\n\nimport { Buffer } from \"node:buffer\";\nimport { VibeError } from \"@vibeorm/schema\";\n\n// ─── PostgreSQL array literals ────────────────────────────────────\n\n/** Quote and escape one array element: `\"` and `\\` are the special characters. */\nfunction quoteElement(value: string): string {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n\n/**\n * Render a JS array as a PostgreSQL array literal string.\n *\n * Element handling:\n * - `null` / `undefined` → unquoted `NULL`\n * - `number` / `bigint` / `boolean` → unquoted primitive\n * - `Date` → quoted ISO-8601 (PostgreSQL cannot parse `String(date)`)\n * - `string` → quoted, with `\"` and `\\` escaped (so commas, braces and quotes\n * inside an element are safe)\n * - any other object, **including a nested array** → quoted `JSON.stringify`,\n * which is what a `Json[]` scalar list needs (PostgreSQL scalar lists are\n * one-dimensional, so a nested array is a JSON value, not a matrix)\n * - `Uint8Array` (including `Buffer`) → quoted PostgreSQL bytea hex\n * - other binary views / `ArrayBuffer` → unsupported, throws\n *\n * @throws VibeError `VIBE_VALIDATION` for unsupported binary elements.\n */\nexport function toPgArrayLiteral(values: readonly unknown[]): string {\n const elements = values.map((value) => {\n if (value === null || value === undefined) return \"NULL\";\n if (typeof value === \"number\" || typeof value === \"bigint\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return quoteElement(value.toISOString());\n if (value instanceof Uint8Array) {\n return quoteElement(`\\\\x${Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"hex\")}`);\n }\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: \"binary values are not supported inside a postgres array literal\",\n meta: { driver: \"bun:sql\" },\n });\n }\n if (typeof value === \"string\") return quoteElement(value);\n if (typeof value === \"object\") return quoteElement(JSON.stringify(value));\n return quoteElement(String(value));\n });\n return `{${elements.join(\",\")}}`;\n}\n\n// ─── Serialization ────────────────────────────────────────────────\n\n/**\n * `Date` → UTC ISO-8601 text (`2026-03-08T19:38:08.538Z`), the same spelling\n * the array literal above uses.\n *\n * bun:sql serializes a `Date` by the parameter's RESOLVED postgres type\n * (LEARNINGS): fine for `timestamp`/`timestamptz` (UTC text), but a `date`\n * parameter gets `Date#toString()` — `Sun Mar 08 2026 23:30:00 GMT+0000\n * (Coordinated Universal Time)` — which the server rejects in every host TZ\n * (live on Bun 1.4.3: `invalid input syntax for type date` under UTC, `time\n * zone \"gmt-0400\" not recognized` under America/New_York). The ISO text\n * parses for all three, and pins the UTC wall-clock contract the codec table\n * and the other postgres adapters share. Dates the ISO form cannot spell\n * (invalid, BC, beyond year 9999) keep the driver's serializer.\n */\nexport function serializeDate(params: { value: Date }): unknown {\n const { value } = params;\n if (Number.isNaN(value.getTime())) return value;\n const year = value.getUTCFullYear();\n if (year < 1 || year > 9999) return value;\n return value.toISOString();\n}\n\n/**\n * Numbers, bigints and booleans as their text spelling — what node-postgres\n * sends (`prepareValue` → `toString()`).\n *\n * bun:sql types a JS number by its own rule (int32 → `int4`, anything else →\n * `float8`) and binds it in that type, so the SERVER casts: `0.1` into an\n * `int4` slot is silently stored as `0`, `0.30000000000000004` into `numeric`\n * becomes `0.3`, and `0.1` compared with a `real` column matches nothing,\n * because the column widens to `float8` instead of the literal narrowing to\n * `real`. Text lets the server read the literal as the slot's own type —\n * exact, or refused with SQLSTATE 22P02 exactly like node-postgres.\n */\nfunction serializeScalar(value: unknown): unknown {\n if (typeof value === \"number\" || typeof value === \"bigint\" || typeof value === \"boolean\") return String(value);\n if (value instanceof Date) return serializeDate({ value });\n return value;\n}\n\n/** A JSON document node-postgres would `JSON.stringify`: any object that is not a Date or binary. */\nfunction isJsonDocument(value: unknown): boolean {\n return typeof value === \"object\" && value !== null && !(value instanceof Date) &&\n !ArrayBuffer.isView(value) && !(value instanceof ArrayBuffer);\n}\n\n/**\n * ORM hot path, node-postgres's rules (`@vibeorm/adapter-pg` `serializeParams`):\n * scalars as text ({@link serializeScalar}), `Date` as UTC ISO text\n * ({@link serializeDate}), any other object or array as `JSON.stringify` text,\n * binary untouched.\n *\n * The runtime itself binds no objects here — scalar lists arrive as\n * array-literal strings from `formatArrayParam`, Json values as JSON text bound\n * through `::text::jsonb`, Bytes as `Uint8Array` — but a direct\n * `adapter.execute` caller binding a document gets the same result as on\n * adapter-pg. With `namedStatements` (the adapter's `preparedStatements: true`)\n * objects stay objects: bun:sql JSON-encodes them for a `json`/`jsonb` slot\n * itself, and would encode pre-stringified text a second time.\n */\nexport function serializeParams(params: { values: readonly unknown[]; namedStatements?: boolean }): unknown[] {\n const stringifyDocuments = params.namedStatements !== true;\n return params.values.map((value) => stringifyDocuments && isJsonDocument(value) ? JSON.stringify(value) : serializeScalar(value));\n}\n\n/**\n * Raw path: the node-postgres rules (`prepareValue`), so a raw statement binds\n * the same text on both postgres adapters — plain JS arrays as PostgreSQL\n * array literals (`db.$queryRawUnsafe('… WHERE \"id\" = ANY($1)', [1, 2, 3])`\n * matches rows), any other object except binary as `JSON.stringify` text,\n * scalars as text ({@link serializeScalar}). `namedStatements` keeps objects as\n * objects, for the reason given at {@link serializeParams}.\n *\n * Trade-off (v1 lesson): binding a JS array **into** a `jsonb` column from a raw\n * query means calling `JSON.stringify` yourself.\n */\nexport function serializeParamsRaw(params: { values: readonly unknown[]; namedStatements?: boolean }): unknown[] {\n const stringifyDocuments = params.namedStatements !== true;\n return params.values.map((value) => {\n if (Array.isArray(value)) return toPgArrayLiteral(value);\n return stringifyDocuments && isJsonDocument(value) ? JSON.stringify(value) : serializeScalar(value);\n });\n}\n",
12
+ "/**\n * Synthetic tagged-template cache — bun:sql's prepared-statement path.\n *\n * bun:sql only creates a *named* prepared statement (one PostgreSQL keeps a\n * plan for) when the query arrives as a tagged template. Generated SQL is a\n * plain string, so with `preparedStatements: true` the adapter turns each SQL\n * text into a synthetic `TemplateStringsArray` — split at its `$1`, `$2`, …\n * placeholders — and reuses that same object identity for every execution.\n *\n * A tagged template binds its values POSITIONALLY, one per gap, so the split\n * has to keep two things a plain `text.split(/\\$\\d+/)` throws away (F19):\n *\n * - **which** placeholder each gap is. `SELECT $2, $1` has to bind\n * `values[1]` then `values[0]`, and a repeated `$1` needs its value bound at\n * every occurrence — otherwise the statement silently returns other rows, or\n * reaches the server with too few parameters and fails to parse.\n * - **where** a `$n` is not a placeholder at all: inside a string literal, a\n * quoted identifier, a line or block comment, or a dollar-quoted body. A\n * split there tears the literal apart and produces invalid SQL.\n *\n * The cache is LRU-bounded so a long-running process never grows it without\n * limit.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\n\n/** A SQL text split for bun:sql, with the placeholder index behind each gap. */\nexport type PreparedTemplate = {\n /** The synthetic template; stable by identity so bun:sql can cache its plan. */\n readonly template: TemplateStringsArray;\n /** 1-based `$n` for each gap, in TEXT order (`SELECT $2, $1` → `[2, 1]`). */\n readonly indices: readonly number[];\n /** Every gap is $1, $2, ... exactly once, with no reordering. */\n readonly identityOrder: boolean;\n};\n\n/** LRU map from SQL text to the synthetic template used to execute it. */\nexport type TemplateCache = {\n /** Template for `text`, creating one on first sight. Stable by identity. */\n getTemplate(params: { text: string }): PreparedTemplate;\n /** Number of texts currently held — diagnostics and tests. */\n size(): number;\n};\n\n// ─── Scanning ─────────────────────────────────────────────────────\n\n/** Is this character part of an unquoted SQL identifier? */\nfunction isIdentChar(char: string | undefined): boolean {\n if (char === undefined) return false;\n return /[A-Za-z0-9_]/.test(char);\n}\n\n/**\n * Index just past a quoted run starting at `start` (`'…'` or `\"…\"`). A doubled\n * quote (`''`, `\"\"`) continues the run — postgres' own escape. A backslash\n * escapes the next character ONLY in an `E'…'` string; with the default\n * `standard_conforming_strings = on` a backslash inside an ordinary literal is\n * just a backslash, and treating it as an escape would run past the literal's\n * real end.\n */\nfunction skipQuoted(text: string, start: number, quote: string): number {\n const escaping =\n quote === \"'\" && (text[start - 1] === \"e\" || text[start - 1] === \"E\") && !isIdentChar(text[start - 2]);\n let index = start + 1;\n while (index < text.length) {\n const char = text[index];\n if (escaping && char === \"\\\\\") {\n index += 2;\n continue;\n }\n if (char === quote) {\n if (text[index + 1] === quote) {\n index += 2;\n continue;\n }\n return index + 1;\n }\n index += 1;\n }\n return text.length; // unterminated — the driver reports it, not this scanner\n}\n\n/** Index just past a block comment, honouring postgres' nesting. */\nfunction skipBlockComment(text: string, start: number): number {\n let depth = 0;\n let index = start;\n while (index < text.length) {\n if (text[index] === \"/\" && text[index + 1] === \"*\") {\n depth += 1;\n index += 2;\n continue;\n }\n if (text[index] === \"*\" && text[index + 1] === \"/\") {\n depth -= 1;\n index += 2;\n if (depth === 0) return index;\n continue;\n }\n index += 1;\n }\n return text.length;\n}\n\n/**\n * Index just past a dollar-quoted body (`$$…$$`, `$tag$…$tag$`) starting at\n * `start`, or `-1` when no dollar quote opens there. `$1` never matches: a tag\n * has to start with a letter or underscore.\n */\nfunction skipDollarQuoted(text: string, start: number): number {\n const opener = /^\\$(?:[A-Za-z_][A-Za-z0-9_]*)?\\$/.exec(text.slice(start));\n if (opener === null) return -1;\n const tag = opener[0];\n const close = text.indexOf(tag, start + tag.length);\n return close === -1 ? text.length : close + tag.length;\n}\n\n/**\n * Split `text` at its real `$n` placeholders. `chunks.length` is always\n * `indices.length + 1`, which is exactly the shape a tagged template needs.\n */\nexport function scanPlaceholders(params: { text: string }): PreparedTemplate {\n const { text } = params;\n const chunks: string[] = [];\n const indices: number[] = [];\n let chunkStart = 0;\n let index = 0;\n\n while (index < text.length) {\n const char = text[index];\n if (char === \"'\" || char === '\"') {\n index = skipQuoted(text, index, char);\n continue;\n }\n if (char === \"-\" && text[index + 1] === \"-\") {\n const newline = text.indexOf(\"\\n\", index);\n index = newline === -1 ? text.length : newline + 1;\n continue;\n }\n if (char === \"/\" && text[index + 1] === \"*\") {\n index = skipBlockComment(text, index);\n continue;\n }\n if (char === \"$\") {\n const dollarEnd = skipDollarQuoted(text, index);\n if (dollarEnd !== -1) {\n index = dollarEnd;\n continue;\n }\n let digits = index + 1;\n while (digits < text.length && text[digits] !== undefined && /[0-9]/.test(text[digits] as string)) digits += 1;\n if (digits > index + 1) {\n chunks.push(text.slice(chunkStart, index));\n indices.push(Number(text.slice(index + 1, digits)));\n chunkStart = digits;\n index = digits;\n continue;\n }\n }\n index += 1;\n }\n\n chunks.push(text.slice(chunkStart));\n const template = Object.assign(chunks, { raw: chunks }) as unknown as TemplateStringsArray;\n return { template, indices, identityOrder: indices.every((placeholder, index) => placeholder === index + 1) };\n}\n\n/**\n * Split a SQL text on `$n` placeholders into the literal chunks around them.\n *\n * Kept for callers that only want the chunks; it is quote-, comment- and\n * dollar-quote-aware through {@link scanPlaceholders}, so `'$1'` inside a\n * string literal is NOT a split point.\n */\nexport function templateChunks(params: { text: string }): string[] {\n return [...scanPlaceholders(params).template];\n}\n\n// ─── Binding ──────────────────────────────────────────────────────\n\n/**\n * The values to hand a synthetic template, in gap order: `$n` picks\n * `values[n - 1]`, a repeated placeholder repeats its value.\n *\n * A `$n` with no matching value is REFUSED (`VIBE_VALIDATION`) rather than\n * bound to `undefined` — misbinding is exactly the failure mode F19 records.\n */\nexport function bindTemplateValues(params: {\n text: string;\n indices: readonly number[];\n values: readonly unknown[];\n}): unknown[] {\n const { text, indices, values } = params;\n return indices.map((placeholder) => {\n if (placeholder < 1 || placeholder > values.length) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `bun:sql prepared statement references $${placeholder} but only ${values.length} parameter(s) were given`,\n meta: { text, placeholder, provided: values.length },\n });\n }\n return values[placeholder - 1];\n });\n}\n\n// ─── Cache ────────────────────────────────────────────────────────\n\n/**\n * Create a template cache holding at most `max` texts (least recently used\n * evicted first).\n */\nexport function createTemplateCache(params: { max: number }): TemplateCache {\n const { max } = params;\n const templates = new Map<string, PreparedTemplate>();\n\n return {\n getTemplate(templateParams: { text: string }): PreparedTemplate {\n const { text } = templateParams;\n const existing = templates.get(text);\n if (existing !== undefined) {\n // Re-insert to mark most-recently-used.\n templates.delete(text);\n templates.set(text, existing);\n return existing;\n }\n const prepared = scanPlaceholders({ text });\n if (templates.size >= max) {\n const oldest = templates.keys().next().value;\n if (oldest !== undefined) templates.delete(oldest);\n }\n templates.set(text, prepared);\n return prepared;\n },\n\n size(): number {\n return templates.size;\n },\n };\n}\n",
13
+ "/**\n * Transaction-control SQL text (postgres dialect, bun:sql flavour).\n *\n * Used by the reserved-connection path, which issues `BEGIN` itself so that\n * isolation level and statement timeout can be applied — bun:sql's\n * `sql.begin(fn)` fast path takes no such options.\n */\n\nimport type { IsolationLevel } from \"@vibeorm/runtime\";\nimport { VibeError } from \"@vibeorm/schema\";\n\n/** VibeORM isolation level → PostgreSQL isolation level keyword. */\nexport const ISOLATION_LEVEL_SQL: Readonly<Record<IsolationLevel, string>> = Object.freeze({\n ReadCommitted: \"READ COMMITTED\",\n RepeatableRead: \"REPEATABLE READ\",\n Serializable: \"SERIALIZABLE\",\n});\n\n/**\n * `BEGIN`, with an `ISOLATION LEVEL` clause and/or `READ ONLY` when the caller\n * asked for them (`BEGIN ISOLATION LEVEL SERIALIZABLE, READ ONLY`).\n */\nexport function beginStatement(params: { isolationLevel?: IsolationLevel; readOnly?: boolean }): string {\n const { isolationLevel, readOnly } = params;\n const modes: string[] = [];\n if (isolationLevel !== undefined) modes.push(`ISOLATION LEVEL ${ISOLATION_LEVEL_SQL[isolationLevel]}`);\n if (readOnly === true) modes.push(\"READ ONLY\");\n return modes.length === 0 ? \"BEGIN\" : `BEGIN ${modes.join(\", \")}`;\n}\n\n/**\n * The whole opening of a reserved-path transaction as ONE simple-protocol\n * message (round-trip EPIC 3, A-05): `BEGIN …` alone, or `BEGIN …; SET LOCAL\n * statement_timeout = N` when a timeout is requested — one wait instead of\n * two. Parameterless text from validated values; PostgreSQL stops at the first\n * failing statement and the driver rejects with that error, so the caller sees\n * BEGIN's or the SET's own error exactly as when they were two messages.\n *\n * @throws VibeError `VIBE_VALIDATION` for an invalid timeout (before anything\n * is sent).\n */\nexport function openTransactionStatement(params: {\n isolationLevel?: IsolationLevel;\n readOnly?: boolean;\n timeout?: number;\n}): string {\n const begin = beginStatement(params);\n return params.timeout === undefined ? begin : `${begin}; ${statementTimeoutStatement({ timeout: params.timeout })}`;\n}\n\n/**\n * The cancel deadline's per-statement bound (round-trip EPIC 6): a CONSTANT\n * extended-protocol text, with the milliseconds bound as a string `$1`, so\n * bun:sql keeps it prepared and pipelines it with the statement it bounds.\n * `is_local = true` makes it transaction-scoped, like `SET LOCAL`.\n */\nexport const STATEMENT_BOUND_TEXT: string = \"SELECT set_config('statement_timeout', $1, true)\";\n\n/**\n * `SET LOCAL statement_timeout = <ms>` — transaction-scoped, so PostgreSQL\n * cancels an over-long statement with SQLSTATE 57014 (mapped to\n * `VIBE_TRANSACTION` with `meta.reason = \"timeout\"`).\n *\n * @throws VibeError `VIBE_VALIDATION` when the timeout is not a non-negative\n * integer — the value is interpolated into SQL, so it is never trusted blindly.\n */\nexport function statementTimeoutStatement(params: { timeout: number }): string {\n const { timeout } = params;\n if (!Number.isInteger(timeout) || timeout < 0) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `transaction timeout must be a non-negative integer of milliseconds, received ${String(timeout)}`,\n meta: { timeout },\n });\n }\n return `SET LOCAL statement_timeout = ${timeout}`;\n}\n\n// ─── Raw transaction control (session affinity) ─────────────────\n\n/** How a raw statement steers the adapter's session-affine raw transaction. */\nexport type RawTransactionControl = \"open\" | \"close\" | null;\n\nconst RAW_OPEN_PATTERN: RegExp = /^\\s*(?:begin|start\\s+transaction)\\b[^;]*;?\\s*$/i;\nconst RAW_CLOSE_PATTERN: RegExp = /^\\s*(?:commit|end|rollback|abort)(?:\\s+(?:transaction|work))?\\s*;?\\s*$/i;\n\n/**\n * Classify a raw statement as transaction control.\n *\n * @vibeorm/migrate drives transactional DDL by sending literal `BEGIN` /\n * `COMMIT` / `ROLLBACK` through its stateless `SqlExecutor` — sound only when\n * every statement in between rides the SAME connection. The adapter uses this\n * to pin one connection for the whole raw transaction (\"open\" reserves,\n * \"close\" releases). On a pooled bun:sql instance an unpinned `BEGIN` is\n * refused outright by the driver (`ERR_POSTGRES_UNSAFE_TRANSACTION`); other\n * pool drivers would only work by checkout luck.\n *\n * Deliberately strict: only PURE single-statement control text matches\n * (`BEGIN`, `BEGIN ISOLATION LEVEL …;`, `COMMIT`, `ROLLBACK WORK`, `END`,\n * `ABORT`). Compound scripts, `ROLLBACK TO SAVEPOINT`, two-phase\n * `COMMIT PREPARED` and `COMMIT AND CHAIN` (which keeps a transaction open)\n * never engage the pinning.\n */\nexport function classifyRawTransactionControl(params: { text: string }): RawTransactionControl {\n if (RAW_OPEN_PATTERN.test(params.text)) return \"open\";\n if (RAW_CLOSE_PATTERN.test(params.text)) return \"close\";\n return null;\n}\n\n// ─── Nested transaction options (the cross-adapter contract) ──────\n\n// ONE copy, shared by every adapter through the runtime's adapter-kit;\n// re-exported here so this adapter's public surface is unchanged.\nexport { refuseNestedTransactionOptions } from \"@vibeorm/runtime/adapter-kit\";\n"
13
14
  ],
14
- "mappings": "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",
15
- "debugId": "424C29CF8963522C64756E2164756E21",
15
+ "mappings": "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",
16
+ "debugId": "ABB8B79ECB9DC73B64756E2164756E21",
16
17
  "names": []
17
18
  }