@probitas-test/client-sql

Common SQL types and utilities for Probitas SQL client packages.

This package provides shared types, result classes, and errors used across all SQL-related client packages.

Features

  • Query Results: SqlQueryResult class with row iteration and metadata
  • Transactions: Common transaction interface with isolation levels
  • Error Hierarchy: SQL-specific errors (SqlError, QuerySyntaxError, ConstraintError, DeadlockError)

Installation

npm install @probitas-test/client-sql

Usage

This package is typically used as a dependency by database-specific packages. End users should import from the specific database client packages instead.

// Example of SQL error handling (requires database-specific client)
import {
  SqlQueryResult,
  SqlError,
  ConstraintError,
} from "@probitas-test/client-sql";
import type { SqlTransaction, SqlIsolationLevel } from "@probitas-test/client-sql";

// Error types are available for use with database-specific clients
const isolationLevel: SqlIsolationLevel = "read_committed";
console.log("Isolation level:", isolationLevel);

Database-Specific Packages

Installation

npm install @probitas-test/client-sql

Classes

class

#ConstraintError

class ConstraintError extends SqlError
ExtendsSqlError

Error thrown when a constraint violation occurs.

Constructor
new ConstraintError(
  message: string,
  constraint: string,
  options?: SqlErrorOptions,
)
NameDescription
constraint—
kind—
name—
Properties
  • readonlyconstraintstring
  • readonlykind"constraint"
  • readonlyname"ConstraintError"
class

#DeadlockError

class DeadlockError extends SqlError
ExtendsSqlError

Error thrown when a deadlock is detected.

Constructor
new DeadlockError(message: string, options?: SqlErrorOptions)
NameDescription
kind—
name—
Properties
  • readonlykind"deadlock"
  • readonlyname"DeadlockError"
class

#QuerySyntaxError

class QuerySyntaxError extends SqlError
ExtendsSqlError

Error thrown when a SQL query has syntax errors.

Constructor
new QuerySyntaxError(message: string, options?: SqlErrorOptions)
NameDescription
kind—
name—
Properties
  • readonlykind"query"
  • readonlyname"QuerySyntaxError"
class

#SqlConnectionError

class SqlConnectionError extends SqlError
ExtendsSqlError

Error thrown when a connection or network-level error occurs.

This includes:

  • Connection refused (server not running)
  • Authentication failure
  • Connection timeout
  • Pool exhaustion
  • TLS handshake failure
  • DNS resolution failure
Constructor
new SqlConnectionError(message: string, options?: SqlErrorOptions)
NameDescription
kind—
name—
Properties
  • readonlykind"connection"
  • readonlyname"SqlConnectionError"
class

#SqlError

class SqlError extends ClientError

Base error class for SQL-specific errors. Extends ClientError with SQL-specific properties.

Constructor
new SqlError(message: string, kind: SqlErrorKind, options?: SqlErrorOptions)
NameDescription
kind—
name—
sqlState—
Properties
  • readonlykindSqlErrorKind
  • readonlynamestring
  • readonlysqlStatestring | null

Interfaces

interface

#SqlErrorOptions

interface SqlErrorOptions extends ErrorOptions

Options for SqlError constructor.

NameDescription
sqlStateSQL State code (e.g., "23505" for unique violation)
Properties
  • readonlysqlState?string

    SQL State code (e.g., "23505" for unique violation)

interface

#SqlQueryOptions

interface SqlQueryOptions extends CommonOptions

Options for individual SQL queries.

NameDescription
throwOnErrorWhether to throw an error for query failures.
Properties
  • readonlythrowOnError?boolean

    Whether to throw an error for query failures. When false, failures are returned as SqlQueryResultError or SqlQueryResultFailure.

interface

#SqlQueryResultError

interface SqlQueryResultError<T = any> extends SqlQueryResultBase<T>

SQL query result for query errors (syntax errors, constraint violations, etc.).

Server received and processed the query, but it failed due to a SQL error.

NameDescription
errorError describing the SQL error.
lastInsertIdNo lastInsertId for failed queries.
okQuery failed.
processedServer processed the query.
rowCountZero affected rows for failed queries.
rowsEmpty rows for failed queries.
warningsNo warnings for failed queries.
Properties
  • readonlyerrorSqlError

    Error describing the SQL error.

  • readonlylastInsertIdnull

    No lastInsertId for failed queries.

  • readonlyokfalse

    Query failed.

  • readonlyprocessedtrue

    Server processed the query.

  • readonlyrowCount0

    Zero affected rows for failed queries.

  • readonlyrowsreadonly never[]

    Empty rows for failed queries.

  • readonlywarningsnull

    No warnings for failed queries.

interface

#SqlQueryResultFailure

interface SqlQueryResultFailure<T = any> extends SqlQueryResultBase<T>

SQL query result for connection failures (network errors, timeouts, etc.).

Query could not be processed by the server (connection refused, timeout, pool exhausted, authentication failure, etc.).

NameDescription
errorError describing the failure.
lastInsertIdNo lastInsertId (query didn't reach server).
okQuery failed.
processedServer did not process the query.
rowCountNo row count (query didn't reach server).
rowsNo rows (query didn't reach server).
warningsNo warnings (query didn't reach server).
Properties
  • readonlyerrorSqlFailureError

    Error describing the failure.

  • readonlylastInsertIdnull

    No lastInsertId (query didn't reach server).

  • readonlyokfalse

    Query failed.

  • readonlyprocessedfalse

    Server did not process the query.

  • readonlyrowCountnull

    No row count (query didn't reach server).

  • readonlyrowsnull

    No rows (query didn't reach server).

  • readonlywarningsnull

    No warnings (query didn't reach server).

interface

#SqlQueryResultSuccess

interface SqlQueryResultSuccess<T = any> extends SqlQueryResultBase<T>

SQL query result for successful queries.

The query was executed successfully and returned results.

NameDescription
errorNo error for successful queries.
lastInsertIdLast inserted ID (for INSERT statements).
okQuery succeeded.
processedServer processed the query.
rowCountNumber of affected rows.
rowsQuery result rows.
warningsWarning messages from the database.
Properties
  • readonlyerrornull

    No error for successful queries.

  • readonlylastInsertIdstring | bigint | null

    Last inserted ID (for INSERT statements).

  • readonlyoktrue

    Query succeeded.

  • readonlyprocessedtrue

    Server processed the query.

  • readonlyrowCountnumber

    Number of affected rows.

  • readonlyrowsreadonly T[]

    Query result rows.

  • readonlywarningsreadonly string[] | null

    Warning messages from the database.

interface

#SqlQueryResultSuccessParams

interface SqlQueryResultSuccessParams<T = any>

Parameters for creating a SqlQueryResultSuccess.

NameDescription
durationQuery execution duration in milliseconds
lastInsertIdLast inserted ID (for INSERT statements)
rowCountNumber of affected rows (for INSERT/UPDATE/DELETE)
rowsThe result rows
warningsWarning messages from the database
Properties
  • readonlydurationnumber

    Query execution duration in milliseconds

  • readonlylastInsertId?string | bigint

    Last inserted ID (for INSERT statements)

  • readonlyrowCountnumber

    Number of affected rows (for INSERT/UPDATE/DELETE)

  • readonlyrowsreadonly T[]

    The result rows

  • readonlywarnings?readonly string[]

    Warning messages from the database

interface

#SqlTransaction

interface SqlTransaction

SQL transaction interface. Implementations should provide actual database-specific transaction handling.

NameDescription
commit()Commit the transaction.
query()Execute a query within the transaction.
queryOne()Execute a query and return the first row or undefined.
rollback()Rollback the transaction.
Methods
commit(): Promise<void>

Commit the transaction.

query<T = Record<string, any>>(
  sql: string,
  params?: unknown[],
  options?: SqlQueryOptions,
): Promise<SqlQueryResult<T>>

Execute a query within the transaction.

Parameters
  • sqlstring

    SQL query string

  • params?unknown[]

    Optional query parameters

  • Optional query options

queryOne<T = Record<string, any>>(
  sql: string,
  params?: unknown[],
  options?: SqlQueryOptions,
): Promise<T | undefined>

Execute a query and return the first row or undefined.

Parameters
  • sqlstring

    SQL query string

  • params?unknown[]

    Optional query parameters

  • Optional query options

rollback(): Promise<void>

Rollback the transaction.

interface

#SqlTransactionOptions

interface SqlTransactionOptions

Options for starting a transaction.

NameDescription
isolationLevelIsolation level for the transaction
Properties

Types

type

#SqlErrorKind

type SqlErrorKind = "query" | "constraint" | "deadlock" | "connection" | "unknown"

SQL-specific error kinds.

type

#SqlFailureError

type SqlFailureError = SqlConnectionError | AbortError | TimeoutError

Error types that indicate the operation was not processed. These are errors that occur before the query reaches the SQL server.

type

#SqlIsolationLevel

type SqlIsolationLevel = "read_uncommitted" | "read_committed" | "repeatable_read" | "serializable"

Transaction isolation level.

type

#SqlOperationError

type SqlOperationError = QuerySyntaxError | ConstraintError | DeadlockError | SqlError

Error types that indicate an operation was processed by the server. These errors occur after the query reaches the SQL server.

type

#SqlQueryResult

type SqlQueryResult<T = any> = SqlQueryResultSuccess<T> | SqlQueryResultError<T> | SqlQueryResultFailure<T>

SQL query result union type representing all possible result states.

  • Success: processed: true, ok: true, error: null
  • Error: processed: true, ok: false, error: SqlError
  • Failure: processed: false, ok: false, error: SqlConnectionError
Examples

Type narrowing by ok

import { createPostgresClient } from "@probitas-test/client-sql-postgres";

await using client = await createPostgresClient({ url: "postgres://localhost/db" });
const result = await client.query("SELECT * FROM users");
if (result.ok) {
  // TypeScript knows: SqlQueryResultSuccess
  console.log(result.rows[0]);
} else {
  // TypeScript knows: SqlQueryResultError | SqlQueryResultFailure
  console.log(result.error.message);
}

Type narrowing by processed

import { createPostgresClient } from "@probitas-test/client-sql-postgres";

await using client = await createPostgresClient({ url: "postgres://localhost/db" });
const result = await client.query("SELECT * FROM users");
if (result.processed) {
  // TypeScript knows: SqlQueryResultSuccess | SqlQueryResultError
  console.log(result.rowCount);
} else {
  // TypeScript knows: SqlQueryResultFailure
  console.log(result.error.message); // Connection error
}
Search Documentation