alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
888 lines • 34.7 kB
TypeScript
import { Static, TObject } from "alepha";
import { DatabaseProvider, EntityPrimitive, FromSchema, ModelBuilder, SQLLike, SequencePrimitive } from "alepha/orm";
import { BuildExtraConfigColumns } from "drizzle-orm";
import * as pg from "drizzle-orm/pg-core";
import { PgDatabase, PgSchema, PgTableExtraConfigValue } from "drizzle-orm/pg-core";
import { PostgresJsDatabase } from "drizzle-orm/postgres-js";
import postgres from "postgres";
import { BunSQLDatabase } from "drizzle-orm/bun-sql";
import { PgliteDatabase } from "drizzle-orm/pglite";
//#region ../../src/orm/postgres/services/PostgresModelBuilder.d.ts
declare class PostgresModelBuilder extends ModelBuilder {
protected schemas: Map<string, PgSchema<string>>;
/**
* Create a primary key column with UUID v7
*/
protected getPrimaryKeyUUID(key: string): import("drizzle-orm").HasDefault<pg.PgUUIDBuilderInitial<string>>;
protected getPgSchema(name: string): any;
buildTable(entity: EntityPrimitive<any>, options: {
tables: Map<string, unknown>;
enums: Map<string, unknown>;
schemas: Map<string, unknown>;
schema: string;
}): void;
buildSequence(sequence: SequencePrimitive, options: {
sequences: Map<string, unknown>;
schema: string;
}): void;
/**
* Get PostgreSQL-specific config builder for the table.
*/
protected getTableConfig(entity: EntityPrimitive, tables: Map<string, unknown>): ((self: BuildExtraConfigColumns<string, any, "pg">) => PgTableExtraConfigValue[]) | undefined;
schemaToPgColumns: <T extends TObject>(tableName: string, schema: T, nsp: PgSchema, enums: Map<string, unknown>, tables: Map<string, unknown>) => FromSchema<T>;
mapFieldToColumn: (tableName: string, fieldName: string, value: any, nsp: PgSchema, enums: Map<string, any>) => any;
/**
* Map a string to a PG column.
*
* @param key The key of the field.
* @param value The value of the field.
*/
mapStringToColumn: (key: string, value: any) => pg.PgCustomColumnBuilder<{
name: string;
dataType: 'custom';
columnType: 'PgCustomColumn';
data: Buffer<ArrayBufferLike>;
driverParam: unknown;
enumValues: undefined;
}> | pg.PgDateStringBuilderInitial<string> | pg.PgTextBuilderInitial<string, [string, ...string[]]> | pg.PgTimestampStringBuilderInitial<string> | pg.PgUUIDBuilderInitial<string>;
}
//#endregion
//#region ../../src/orm/postgres/providers/PostgresProvider.d.ts
/**
* Abstract base class for PostgreSQL database providers.
*
* Provides shared logic for Node.js and Bun PostgreSQL providers:
* - Environment variable handling (DATABASE_URL, POSTGRES_SCHEMA)
* - Schema name resolution (with test schema generation)
* - SQL execution with error wrapping
* - Lifecycle hooks (start with migration lock, stop with test cleanup)
*
* Subclasses must implement `connect()`, `close()`, and `executeMigrations()`.
*/
declare abstract class PostgresProvider extends DatabaseProvider {
protected readonly env: {
DATABASE_URL?: string | undefined;
DATABASE_SYNC?: boolean | undefined;
};
protected readonly pgEnv: {
POSTGRES_SCHEMA?: string | undefined;
POOL_MAX?: number | undefined;
POOL_IDLE_TIMEOUT?: number | undefined;
POOL_CONNECT_TIMEOUT?: number | undefined;
};
protected readonly builder: PostgresModelBuilder;
readonly dialect = "postgresql";
get name(): string;
/**
* In testing mode, the schema name will be generated and deleted after the test.
*/
protected schemaForTesting: string | undefined;
get url(): string;
/**
* Execute a SQL statement.
*/
execute(statement: SQLLike): Promise<Array<Record<string, unknown>>>;
/**
* Get Postgres schema used by this provider.
*/
get schema(): string;
abstract get db(): PgDatabase<any>;
/**
* Establish the database connection.
*/
abstract connect(): Promise<void>;
/**
* Close the database connection.
*/
abstract close(): Promise<void>;
protected readonly onStart: import("alepha").HookPrimitive<"start">;
protected readonly onStop: import("alepha").HookPrimitive<"stop">;
protected migrateLock: import("alepha").PipelinePrimitiveFn<() => Promise<void>>;
protected generateTestSchema(): Promise<void>;
/**
* Drop the current test schema if applicable.
*/
protected dropTestSchema(): Promise<void>;
/**
* Remove stale test schemas older than 1 hour.
*
* Parses the embedded epoch from schema names (format: test_alepha_{epoch}_{random8})
* and drops any that exceed the TTL. This handles schemas left behind by crashed tests,
* killed processes, or failed startups where stop() never fired.
*
* Uses a PG advisory lock so only one concurrent test process performs the cleanup.
*/
protected cleanupStaleTestSchemas(): Promise<void>;
/**
* Parse the age in milliseconds from a test schema name.
* Format: test_alepha_{epoch_seconds}_{random8}
* Returns undefined if the name doesn't match the expected format.
*/
protected parseTestSchemaAge(name: string, now: number): number | undefined;
}
//#endregion
//#region ../../src/orm/postgres/providers/BunPostgresProvider.d.ts
/**
* Bun PostgreSQL provider using Drizzle ORM with Bun's native SQL client.
*
* This provider uses Bun's built-in SQL class for PostgreSQL connections,
* which provides excellent performance on the Bun runtime.
*
* @example
* ```ts
* // Set DATABASE_URL environment variable
* // DATABASE_URL=postgres://user:password@localhost:5432/database
*
* // Or configure programmatically
* alepha.with({
* provide: DatabaseProvider,
* use: BunPostgresProvider,
* });
* ```
*/
declare class BunPostgresProvider extends PostgresProvider {
protected client?: Bun.SQL;
protected bunDb?: BunSQLDatabase;
/**
* Get the Drizzle Postgres database instance.
*/
get db(): PgDatabase<any>;
protected executeMigrations(migrationsFolder: string): Promise<void>;
connect(): Promise<void>;
close(): Promise<void>;
}
//#endregion
//#region ../../src/orm/postgres/providers/CloudflareHyperdriveProvider.d.ts
/**
* Cloudflare Hyperdrive PostgreSQL provider using Drizzle ORM.
*
* Connects to an external PostgreSQL database through Cloudflare Hyperdrive,
* which provides connection pooling and caching at the edge.
*
* Creates a fresh connection per request, since Cloudflare Workers
* cannot reuse I/O objects across request contexts.
*
* URL format: hyperdrive://BINDING_NAME
*/
declare class CloudflareHyperdriveProvider extends DatabaseProvider {
protected readonly builder: PostgresModelBuilder;
protected readonly env: {
DATABASE_URL: string;
POSTGRES_SCHEMA?: string | undefined;
};
get schema(): string;
protected postgresFn?: any;
protected drizzleFn?: any;
protected bindingName?: string;
get name(): string;
get driver(): string;
readonly dialect = "postgresql";
get url(): string;
/**
* Get a fresh Drizzle instance per request.
*
* Reads the current Hyperdrive binding from `cloudflare.env`
* and creates a new postgres client each time, avoiding the
* "Cannot perform I/O on behalf of a different request" error.
*/
get db(): PgDatabase<any>;
execute(query: SQLLike): Promise<Array<Record<string, unknown>>>;
protected readonly onStart: import("alepha").HookPrimitive<"start">;
protected executeMigrations(migrationsFolder: string): Promise<void>;
}
//#endregion
//#region ../../src/orm/postgres/providers/NodePostgresProvider.d.ts
declare class NodePostgresProvider extends PostgresProvider {
static readonly SSL_MODES: readonly ["require", "allow", "prefer", "verify-full"];
protected client?: postgres.Sql;
protected pg?: PostgresJsDatabase;
/**
* Get the Drizzle Postgres database instance.
*/
get db(): PostgresJsDatabase;
protected executeMigrations(migrationsFolder: string): Promise<void>;
connect(): Promise<void>;
close(): Promise<void>;
/**
* Map the DATABASE_URL to postgres client options.
*/
protected getClientOptions(): postgres.Options<any>;
protected ssl(url: URL): "require" | "allow" | "prefer" | "verify-full" | undefined;
}
//#endregion
//#region ../../../../node_modules/@electric-sql/pglite/dist/pglite-CpaPhfpC.d.ts
type MessageName = 'parseComplete' | 'bindComplete' | 'closeComplete' | 'noData' | 'portalSuspended' | 'replicationStart' | 'emptyQuery' | 'copyDone' | 'copyData' | 'rowDescription' | 'parameterDescription' | 'parameterStatus' | 'backendKeyData' | 'notification' | 'readyForQuery' | 'commandComplete' | 'dataRow' | 'copyInResponse' | 'copyOutResponse' | 'authenticationOk' | 'authenticationMD5Password' | 'authenticationCleartextPassword' | 'authenticationSASL' | 'authenticationSASLContinue' | 'authenticationSASLFinal' | 'error' | 'notice';
type BackendMessage = {
name: MessageName;
length: number;
};
interface NoticeOrError {
message: string | undefined;
severity: string | undefined;
code: string | undefined;
detail: string | undefined;
hint: string | undefined;
position: string | undefined;
internalPosition: string | undefined;
internalQuery: string | undefined;
where: string | undefined;
schema: string | undefined;
table: string | undefined;
column: string | undefined;
dataType: string | undefined;
constraint: string | undefined;
file: string | undefined;
line: string | undefined;
routine: string | undefined;
}
declare class NoticeMessage implements BackendMessage, NoticeOrError {
readonly length: number;
readonly message: string | undefined;
constructor(length: number, message: string | undefined);
readonly name = "notice";
severity: string | undefined;
code: string | undefined;
detail: string | undefined;
hint: string | undefined;
position: string | undefined;
internalPosition: string | undefined;
internalQuery: string | undefined;
where: string | undefined;
schema: string | undefined;
table: string | undefined;
column: string | undefined;
dataType: string | undefined;
constraint: string | undefined;
file: string | undefined;
line: string | undefined;
routine: string | undefined;
}
type IDBFS = Emscripten.FileSystemType & {
quit: () => void;
dbs: Record<string, IDBDatabase>;
};
type FS = typeof FS & {
filesystems: {
MEMFS: Emscripten.FileSystemType;
NODEFS: Emscripten.FileSystemType;
IDBFS: IDBFS;
};
quit: () => void;
};
interface PostgresMod extends Omit<EmscriptenModule, 'preInit' | 'preRun' | 'postRun'> {
preInit: Array<{
(mod: PostgresMod): void;
}>;
preRun: Array<{
(mod: PostgresMod): void;
}>;
postRun: Array<{
(mod: PostgresMod): void;
}>;
thisProgram: string;
stdin: (() => number | null) | null;
FS: FS;
wasmMemory: WebAssembly.Memory;
PROXYFS: Emscripten.FileSystemType;
WASM_PREFIX: string;
pg_extensions: Record<string, Promise<Blob | null>>;
UTF8ToString: (ptr: number, maxBytesToRead?: number) => string;
stringToUTF8OnStack: (s: string) => number;
_pgl_set_system_fn: (system_fn: number) => void;
_pgl_set_popen_fn: (popen_fn: number) => void;
_pgl_set_pclose_fn: (pclose_fn: number) => void;
_pgl_set_rw_cbs: (read_cb: number, write_cb: number) => void;
_pgl_set_pipe_fn: (pipe_fn: number) => number;
_pgl_freopen: (filepath: number, mode: number, stream: number) => number;
_pgl_pq_flush: () => void;
_fopen: (path: number, mode: number) => number;
_fclose: (stream: number) => number;
_fflush: (stream: number) => void;
_pgl_proc_exit: (code: number) => number;
addFunction: (cb: (ptr: any, length: number) => void, signature: string) => number;
removeFunction: (f: number) => void;
callMain: (args?: string[]) => number;
_PostgresMainLoopOnce: () => void;
_PostgresMainLongJmp: () => void;
_PostgresSendReadyForQueryIfNecessary: () => void;
_ProcessStartupPacket: (Port: number, ssl_done: boolean, gss_done: boolean) => number;
_IsTransactionBlock: () => number;
_pgl_setPGliteActive: (newValue: number) => number;
_pgl_startPGlite: () => void;
_pgl_getMyProcPort: () => number;
_pgl_sendConnData: () => void;
ENV: any;
PGLITE_ENV: any;
_emscripten_force_exit: (status: number) => void;
_pgl_run_atexit_funcs: () => void;
_pq_buffer_remaining_data: () => number;
}
type DumpTarCompressionOptions = 'none' | 'gzip' | 'auto';
/**
* Filesystem interface.
* All virtual filesystems that are compatible with PGlite must implement
* this interface.
*/
interface Filesystem {
/**
* Initiate the filesystem and return the options to pass to the emscripten module.
*/
init(pg: PGlite, emscriptenOptions: Partial<PostgresMod>): Promise<{
emscriptenOpts: Partial<PostgresMod>;
}>;
/**
* Sync the filesystem to any underlying storage.
*/
syncToFs(relaxedDurability?: boolean): Promise<void>;
/**
* Sync the filesystem from any underlying storage.
*/
initialSyncFs(): Promise<void>;
/**
* Dump the PGDATA dir from the filesystem to a gzipped tarball.
*/
dumpTar(dbname: string, compression?: DumpTarCompressionOptions): Promise<File | Blob>;
/**
* Close the filesystem.
*/
closeFs(): Promise<void>;
}
type DebugLevel = 0 | 1 | 2 | 3 | 4 | 5;
type RowMode = 'array' | 'object';
interface ParserOptions {
[pgType: number]: (value: string) => any;
}
interface SerializerOptions {
[pgType: number]: (value: any) => string;
}
interface QueryOptions {
rowMode?: RowMode;
parsers?: ParserOptions;
serializers?: SerializerOptions;
blob?: Blob | File;
onNotice?: (notice: NoticeMessage) => void;
paramTypes?: number[];
}
interface ExecProtocolOptions {
syncToFs?: boolean;
throwOnError?: boolean;
onNotice?: (notice: NoticeMessage) => void;
}
interface ExecProtocolOptionsStream {
syncToFs?: boolean;
onRawData: (data: Uint8Array) => void;
}
interface ExtensionSetupResult<TNamespace = any> {
emscriptenOpts?: any;
namespaceObj?: TNamespace;
bundlePath?: URL;
sharedPreloadLibraries?: string[];
init?: () => Promise<void>;
close?: () => Promise<void>;
}
type ExtensionSetup<TNamespace = any> = (pg: PGliteInterface, emscriptenOpts: any, clientOnly?: boolean) => Promise<ExtensionSetupResult<TNamespace>>;
interface Extension<TNamespace = any> {
name: string;
setup: ExtensionSetup<TNamespace>;
}
type ExtensionNamespace<T> = T extends Extension<infer TNamespace> ? TNamespace : any;
type Extensions = {
[namespace: string]: Extension | URL;
};
type InitializedExtensions<TExtensions extends Extensions = Extensions> = { [K in keyof TExtensions]: ExtensionNamespace<TExtensions[K]>; };
interface ExecProtocolResult {
messages: BackendMessage[];
data: Uint8Array;
}
interface PGliteOptions<TExtensions extends Extensions = Extensions> {
noInitDb?: boolean;
dataDir?: string;
username?: string;
database?: string;
fs?: Filesystem;
debug?: DebugLevel;
relaxedDurability?: boolean;
extensions?: TExtensions;
loadDataDir?: Blob | File;
icuDataDir?: Blob | File;
initialMemory?: number;
pgliteWasmModule?: WebAssembly.Module;
initdbWasmModule?: WebAssembly.Module;
fsBundle?: Blob | File;
parsers?: ParserOptions;
serializers?: SerializerOptions;
startParams?: string[];
initDbStartParams?: string[];
postgresqlconf?: string[] | string;
}
type PGliteInterface<T extends Extensions = Extensions> = InitializedExtensions<T> & {
readonly waitReady: Promise<void>;
readonly debug: DebugLevel;
readonly ready: boolean;
readonly closed: boolean;
close(): Promise<void>;
query<T>(query: string, params?: any[], options?: QueryOptions): Promise<Results<T>>;
sql<T>(sqlStrings: TemplateStringsArray, ...params: any[]): Promise<Results<T>>;
exec(query: string, options?: QueryOptions): Promise<Array<Results>>;
describeQuery(query: string): Promise<DescribeQueryResult>;
transaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T>;
execProtocolRaw(message: Uint8Array, options?: ExecProtocolOptions): Promise<Uint8Array>;
execProtocolRawStream(message: Uint8Array, options?: ExecProtocolOptionsStream): Promise<void>;
execProtocol(message: Uint8Array, options?: ExecProtocolOptions): Promise<ExecProtocolResult>;
runExclusive<T>(fn: () => Promise<T>): Promise<T>;
listen(channel: string, callback: (payload: string) => void, tx?: Transaction): Promise<(tx?: Transaction) => Promise<void>>;
unlisten(channel: string, callback?: (payload: string) => void, tx?: Transaction): Promise<void>;
onNotification(callback: (channel: string, payload: string) => void): () => void;
offNotification(callback: (channel: string, payload: string) => void): void;
dumpDataDir(compression?: DumpTarCompressionOptions): Promise<File | Blob>;
refreshArrayTypes(): Promise<void>;
};
type PGliteInterfaceExtensions<E> = E extends Extensions ? { [K in keyof E]: E[K] extends Extension ? Awaited<ReturnType<E[K]['setup']>>['namespaceObj'] extends (infer N) ? N extends undefined | null | void ? never : N : never : never; } : Record<string, never>;
type Row<T = {
[key: string]: any;
}> = T;
type Results<T = {
[key: string]: any;
}> = {
rows: Row<T>[];
affectedRows?: number;
fields: {
name: string;
dataTypeID: number;
}[];
blob?: Blob;
};
interface Transaction {
query<T>(query: string, params?: any[], options?: QueryOptions): Promise<Results<T>>;
sql<T>(sqlStrings: TemplateStringsArray, ...params: any[]): Promise<Results<T>>;
exec(query: string, options?: QueryOptions): Promise<Array<Results>>;
rollback(): Promise<void>;
listen(channel: string, callback: (payload: string) => void): Promise<(tx?: Transaction) => Promise<void>>;
get closed(): boolean;
}
type DescribeQueryResult = {
queryParams: {
dataTypeID: number;
serializer: Serializer;
}[];
resultFields: {
name: string;
dataTypeID: number;
parser: Parser;
}[];
};
type Parser = (x: string, typeId?: number) => any;
type Serializer = (x: any) => string;
declare abstract class BasePGlite implements Pick<PGliteInterface, 'query' | 'sql' | 'exec' | 'transaction'> {
#private;
serializers: Record<number | string, Serializer>;
parsers: Record<number | string, Parser>;
abstract debug: DebugLevel;
/**
* Execute a postgres wire protocol message
* @param message The postgres wire protocol message to execute
* @returns The result of the query
*/
abstract execProtocol(message: Uint8Array, { syncToFs, onNotice }: ExecProtocolOptions): Promise<ExecProtocolResult>;
/**
* Execute a postgres wire protocol message
* @param message The postgres wire protocol message to execute
* @returns The parsed results of the query
*/
abstract execProtocolStream(message: Uint8Array, { syncToFs, onNotice }: ExecProtocolOptions): Promise<BackendMessage[]>;
/**
* Execute a postgres wire protocol message directly without wrapping the response.
* Only use if `execProtocol()` doesn't suite your needs.
*
* **Warning:** This bypasses PGlite's protocol wrappers that manage error/notice messages,
* transactions, and notification listeners. Only use if you need to bypass these wrappers and
* don't intend to use the above features.
*
* @param message The postgres wire protocol message to execute
* @returns The direct message data response produced by Postgres
*/
abstract execProtocolRaw(message: Uint8Array, { syncToFs }: ExecProtocolOptions): Promise<Uint8Array>;
/**
* Execute a postgres wire protocol message directly without wrapping the response.
* Only use if `execProtocol()` doesn't suite your needs.
*
* **Warning:** This bypasses PGlite's protocol wrappers that manage error/notice messages,
* transactions, and notification listeners. Only use if you need to bypass these wrappers and
* don't intend to use the above features.
*
* @param message The postgres wire protocol message to execute
* @param options.onRawData Callback to receive streaming data
*/
abstract execProtocolRawStream(message: Uint8Array, { syncToFs, onRawData }: ExecProtocolOptionsStream): Promise<void>;
/**
* Sync the database to the filesystem
* @returns Promise that resolves when the database is synced to the filesystem
*/
abstract syncToFs(): Promise<void>;
/**
* Handle a file attached to the current query
* @param file The file to handle
*/
abstract _handleBlob(blob?: File | Blob): Promise<void>;
/**
* Get the written file
*/
abstract _getWrittenBlob(): Promise<File | Blob | undefined>;
/**
* Cleanup the current file
*/
abstract _cleanupBlob(): Promise<void>;
abstract _checkReady(): Promise<void>;
abstract _runExclusiveQuery<T>(fn: () => Promise<T>): Promise<T>;
abstract _runExclusiveTransaction<T>(fn: () => Promise<T>): Promise<T>;
/**
* Listen for notifications on a channel
*/
abstract listen(channel: string, callback: (payload: string) => void, tx?: Transaction): Promise<(tx?: Transaction) => Promise<void>>;
/**
* Initialize the array types
* The oid if the type of an element and the typarray is the oid of the type of the
* array.
* We extract these from the database then create the serializers/parsers for
* each type.
* This should be called at the end of #init() in the implementing class.
*/
_initArrayTypes({ force }?: {
force?: boolean | undefined;
}): Promise<void>;
/**
* Re-syncs the array types from the database
* This is useful if you add a new type to the database and want to use it, otherwise pglite won't recognize it.
*/
refreshArrayTypes(): Promise<void>;
/**
* Execute a single SQL statement
* This uses the "Extended Query" postgres wire protocol message.
* @param query The query to execute
* @param params Optional parameters for the query
* @returns The result of the query
*/
query<T>(query: string, params?: any[], options?: QueryOptions): Promise<Results<T>>;
/**
* Execute a single SQL statement like with {@link PGlite.query}, but with a
* templated statement where template values will be treated as parameters.
*
* You can use helpers from `/template` to further format the query with
* identifiers, raw SQL, and nested statements.
*
* This uses the "Extended Query" postgres wire protocol message.
*
* @param query The query to execute with parameters as template values
* @returns The result of the query
*
* @example
* ```ts
* const results = await db.sql`SELECT * FROM ${identifier`foo`} WHERE id = ${id}`
* ```
*/
sql<T>(sqlStrings: TemplateStringsArray, ...params: any[]): Promise<Results<T>>;
/**
* Execute a SQL query, this can have multiple statements.
* This uses the "Simple Query" postgres wire protocol message.
* @param query The query to execute
* @returns The result of the query
*/
exec(query: string, options?: QueryOptions): Promise<Array<Results>>;
/**
* Describe a query
* @param query The query to describe
* @returns A description of the result types for the query
*/
describeQuery(query: string, options?: QueryOptions): Promise<DescribeQueryResult>;
/**
* Execute a transaction
* @param callback A callback function that takes a transaction object
* @returns The result of the transaction
*/
transaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T>;
/**
* Run a function exclusively, no other transactions or queries will be allowed
* while the function is running.
* This is useful when working with the execProtocol methods as they are not blocked,
* and do not block the locks used by transactions and queries.
* @param fn The function to run
* @returns The result of the function
*/
runExclusive<T>(fn: () => Promise<T>): Promise<T>;
}
declare class PGlite extends BasePGlite implements PGliteInterface, AsyncDisposable {
#private;
fs?: Filesystem;
protected mod?: PostgresMod;
private readonly POSTGRES_MAIN_LONGJMP;
get ENV(): any;
readonly dataDir?: string;
readonly waitReady: Promise<void>;
readonly debug: DebugLevel;
static readonly paths: {
readonly PG_ROOT: "/pglite";
readonly PGDATA: string;
readonly ICU_DATA_PATH: string;
readonly INITDB_EXE_PATH: string;
readonly POSTGRES_EXE_PATH: string;
};
static readonly DEFAULT_RECV_BUF_SIZE: number;
static readonly MAX_BUFFER_SIZE: number;
externalCommandStreamFd: number | null;
static readonly defaultStartParams: string[];
/**
* Create a new PGlite instance
* @param dataDir The directory to store the database files
* Prefix with idb:// to use indexeddb filesystem in the browser
* Use memory:// to use in-memory filesystem
* @param options PGlite options
*/
constructor(dataDir?: string, options?: PGliteOptions);
/**
* Create a new PGlite instance
* @param options PGlite options including the data directory
*/
constructor(options?: PGliteOptions);
/**
* Create a new PGlite instance with extensions on the Typescript interface
* (The main constructor does enable extensions, however due to the limitations
* of Typescript, the extensions are not available on the instance interface)
* @param options PGlite options including the data directory
* @returns A promise that resolves to the PGlite instance when it's ready.
*/
static create<O extends PGliteOptions>(options?: O): Promise<PGlite & PGliteInterfaceExtensions<O['extensions']>>;
/**
* Create a new PGlite instance with extensions on the Typescript interface
* (The main constructor does enable extensions, however due to the limitations
* of Typescript, the extensions are not available on the instance interface)
* @param dataDir The directory to store the database files
* Prefix with idb:// to use indexeddb filesystem in the browser
* Use memory:// to use in-memory filesystem
* @param options PGlite options
* @returns A promise that resolves to the PGlite instance when it's ready.
*/
static create<O extends PGliteOptions>(dataDir?: string, options?: O): Promise<PGlite & PGliteInterfaceExtensions<O['extensions']>>;
handleExternalCmd(cmd: string, mode: string): number;
/**
* The Postgres Emscripten Module
*/
get Module(): PostgresMod;
/**
* The ready state of the database
*/
get ready(): boolean;
/**
* The closed state of the database
*/
get closed(): boolean;
/**
* Close the database
* @returns A promise that resolves when the database is closed
*/
close(): Promise<void>;
/**
* Close the database when the object exits scope
* Stage 3 ECMAScript Explicit Resource Management
* https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management
*/
[Symbol.asyncDispose](): Promise<void>;
/**
* Handle a file attached to the current query
* @param file The file to handle
*/
_handleBlob(blob?: File | Blob): Promise<void>;
/**
* Cleanup the current file
*/
_cleanupBlob(): Promise<void>;
/**
* Get the written blob from the current query
* @returns The written blob
*/
_getWrittenBlob(): Promise<Blob | undefined>;
/**
* Wait for the database to be ready
*/
_checkReady(): Promise<void>;
/**
* Execute a postgres wire protocol synchronously
* @param message The postgres wire protocol message to execute
* @returns The direct message data response produced by Postgres
*/
execProtocolRawSync(message: Uint8Array): Uint8Array;
/**
* Execute a postgres wire protocol message directly without wrapping the response.
* Only use if `execProtocol()` doesn't suite your needs.
*
* **Warning:** This bypasses PGlite's protocol wrappers that manage error/notice messages,
* transactions, and notification listeners. Only use if you need to bypass these wrappers and
* don't intend to use the above features.
*
* @param message The postgres wire protocol message to execute
* @returns The direct message data response produced by Postgres
*/
execProtocolRaw(message: Uint8Array, { syncToFs }?: ExecProtocolOptions): Promise<Uint8Array>;
/**
* Execute a postgres wire protocol message directly without wrapping the response.
* Only use if `execProtocol()` doesn't suite your needs.
*
* **Warning:** This bypasses PGlite's protocol wrappers that manage error/notice messages,
* transactions, and notification listeners. Only use if you need to bypass these wrappers and
* don't intend to use the above features.
*
* @param message The postgres wire protocol message to execute
* @param options.onRawData Callback to receive results as streaming data
*/
execProtocolRawStream(message: Uint8Array, { syncToFs, onRawData }: ExecProtocolOptionsStream): Promise<void>;
/**
* Execute a postgres wire protocol message
* @param message The postgres wire protocol message to execute
* @returns The result of the query
*/
execProtocol(message: Uint8Array, { syncToFs, throwOnError, onNotice }?: ExecProtocolOptions): Promise<ExecProtocolResult>;
/**
* Execute a postgres wire protocol message
* @param message The postgres wire protocol message to execute
* @returns The parsed results of the query
*/
execProtocolStream(message: Uint8Array, { syncToFs, throwOnError, onNotice }?: ExecProtocolOptions): Promise<BackendMessage[]>;
/**
* Check if the database is in a transaction
* @returns True if the database is in a transaction, false otherwise
*/
isInTransaction(): boolean;
/**
* Perform any sync operations implemented by the filesystem, this is
* run after every query to ensure that the filesystem is synced.
*/
syncToFs(): Promise<void>;
/**
* Listen for a notification
* @param channel The channel to listen on
* @param callback The callback to call when a notification is received
*/
listen(channel: string, callback: (payload: string) => void, tx?: Transaction): Promise<(tx?: Transaction) => Promise<void>>;
/**
* Stop listening for a notification
* @param channel The channel to stop listening on
* @param callback The callback to remove
*/
unlisten(channel: string, callback?: (payload: string) => void, tx?: Transaction): Promise<void>;
/**
* Listen to notifications
* @param callback The callback to call when a notification is received
*/
onNotification(callback: (channel: string, payload: string) => void): () => void;
/**
* Stop listening to notifications
* @param callback The callback to remove
*/
offNotification(callback: (channel: string, payload: string) => void): void;
/**
* Dump the PGDATA dir from the filesystem to a gzipped tarball.
* @param compression The compression options to use - 'gzip', 'auto', 'none'
* @returns The tarball as a File object where available, and fallback to a Blob
*/
dumpDataDir(compression?: DumpTarCompressionOptions): Promise<File | Blob>;
/**
* Run a function in a mutex that's exclusive to queries
* @param fn The query to run
* @returns The result of the query
*/
_runExclusiveQuery<T>(fn: () => Promise<T>): Promise<T>;
/**
* Run a function in a mutex that's exclusive to transactions
* @param fn The function to run
* @returns The result of the function
*/
_runExclusiveTransaction<T>(fn: () => Promise<T>): Promise<T>;
clone(): Promise<PGliteInterface>;
_runExclusiveListen<T>(fn: () => Promise<T>): Promise<T>;
callMain(args: string[]): number;
copyToFS(filePath: string, data: Uint8Array, mode?: number): void;
}
//#endregion
//#region ../../src/orm/postgres/providers/PglitePostgresProvider.d.ts
interface PgLiteModule {
PGlite: typeof PGlite;
}
declare class PglitePostgresProvider extends DatabaseProvider {
static importPglite(): PgLiteModule | undefined;
get schema(): string;
protected readonly env: {
DATABASE_URL?: string | undefined;
DATABASE_SYNC?: boolean | undefined;
};
protected readonly pgEnv: {
POSTGRES_SCHEMA?: string | undefined;
POOL_MAX?: number | undefined;
POOL_IDLE_TIMEOUT?: number | undefined;
POOL_CONNECT_TIMEOUT?: number | undefined;
};
protected readonly builder: PostgresModelBuilder;
protected client?: PGlite;
protected pglite?: PgliteDatabase;
get name(): string;
get driver(): string;
readonly dialect = "postgresql";
get supportsTransactions(): boolean;
get url(): string;
get db(): PgliteDatabase;
execute(statement: SQLLike): Promise<Array<Record<string, unknown>>>;
protected readonly onStart: import("alepha").HookPrimitive<"start">;
protected readonly onStop: import("alepha").HookPrimitive<"stop">;
protected executeMigrations(migrationsFolder: string): Promise<void>;
}
//#endregion
//#region ../../src/orm/postgres/schemas/postgresEnvSchema.d.ts
/**
* PostgreSQL-specific environment schema.
*
* Additional env vars for PostgreSQL providers on top of `databaseEnvSchema`.
*/
declare const postgresEnvSchema: import("zod").ZodObject<{
POSTGRES_SCHEMA: import("zod").ZodOptional<import("zod").ZodString>;
POOL_MAX: import("zod").ZodOptional<import("zod").ZodInt>;
POOL_IDLE_TIMEOUT: import("zod").ZodOptional<import("zod").ZodInt>;
POOL_CONNECT_TIMEOUT: import("zod").ZodOptional<import("zod").ZodInt>;
}, import("zod/v4/core").$strip>;
declare module "alepha" {
interface Env extends Partial<Static<typeof postgresEnvSchema>> {}
}
//#endregion
//#region ../../src/orm/postgres/types/byte.d.ts
/**
* Postgres bytea type.
*/
declare const byte: {
(): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
name: "";
dataType: 'custom';
columnType: 'PgCustomColumn';
data: Buffer<ArrayBufferLike>;
driverParam: unknown;
enumValues: undefined;
}>;
<TConfig extends Record<string, any> & unknown>(fieldConfig?: TConfig | undefined): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
name: "";
dataType: 'custom';
columnType: 'PgCustomColumn';
data: Buffer<ArrayBufferLike>;
driverParam: unknown;
enumValues: undefined;
}>;
<TName extends string>(dbName: TName, fieldConfig?: unknown): import("drizzle-orm/pg-core").PgCustomColumnBuilder<{
name: TName;
dataType: 'custom';
columnType: 'PgCustomColumn';
data: Buffer<ArrayBufferLike>;
driverParam: unknown;
enumValues: undefined;
}>;
};
//#endregion
//#region ../../src/orm/postgres/index.d.ts
declare const AlephaOrmPostgres: import("alepha").Service<import("alepha").Module>;
//#endregion
export { AlephaOrmPostgres, BunPostgresProvider, CloudflareHyperdriveProvider, NodePostgresProvider, PgLiteModule, PglitePostgresProvider, PostgresModelBuilder, PostgresProvider, byte, postgresEnvSchema };
//# sourceMappingURL=index.d.ts.map