@event-driven-io/dumbo 0.13.0-beta.37 → 0.13.0-beta.38

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/pg.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pg.cjs","names":["pgFormatter","mapSQLQueryResult","mapPostgresError","BatchCommandNoChangesError","sqlExecutor","createConnection","createConnectionPool","createAmbientConnectionPool","JSONSerializer","parseDatabaseName","PostgreSQLConnectionString","pgFormatter","DefaultPostgreSQLMigratorOptions","canHandleDriverWithConnectionString","postgreSQLMetadata"],"sources":["../src/storage/postgresql/pg/execute/execute.ts","../src/storage/postgresql/pg/connections/transaction.ts","../src/storage/postgresql/pg/connections/connection.ts","../src/storage/postgresql/pg/serialization/index.ts","../src/storage/postgresql/pg/connections/pool.ts","../src/storage/postgresql/pg/index.ts"],"sourcesContent":["import pg from 'pg';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n BatchCommandNoChangesError,\n mapSQLQueryResult,\n tracer,\n type BatchSQLCommandOptions,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n type SQLQueryOptions,\n} from '../../../../core';\nimport { pgFormatter } from '../../core';\nimport { mapPostgresError } from '../../core/errors/errorMapper';\nimport { PgDriverType, type PgClientOrPoolClient } from '../connections';\n\nexport const isPgNativePool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isPgClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isPgPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const pgExecute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isPgNativePool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (isPgNativePool(poolOrClient) && isPgPoolClient(client))\n client.release();\n }\n};\n\nexport type PgSQLExecutor = DbSQLExecutor<PgDriverType, PgClientOrPoolClient>;\n\nexport const pgSQLExecutor = ({\n serializer,\n}: {\n serializer: JSONSerializer;\n}): PgSQLExecutor => ({\n driverType: PgDriverType,\n query: async <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sql: SQL,\n options: SQLQueryOptions | undefined,\n ) => {\n const results = await batchQuery<Result>(\n client,\n [sql],\n serializer,\n options,\n );\n return results[0]!;\n },\n batchQuery: <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n options: SQLQueryOptions | undefined,\n ) => batchQuery<Result>(client, sqls, serializer, options),\n command: async <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sql: SQL,\n options: BatchSQLCommandOptions | undefined,\n ) => {\n const results = await batchCommand<Result>(\n client,\n [sql],\n serializer,\n options,\n );\n return results[0]!;\n },\n batchCommand: <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n options: BatchSQLCommandOptions | undefined,\n ) => batchCommand<Result>(client, sqls, serializer, options),\n formatter: pgFormatter,\n});\n\nasync function batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n serializer: JSONSerializer,\n options?: SQLQueryOptions,\n): Promise<QueryResult<Result>[]> {\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = pgFormatter.format(sqls[i]!, { serializer });\n tracer.info('db:sql:query', {\n query,\n params,\n debugSQL: pgFormatter.describe(sqls[i]!, { serializer }),\n });\n try {\n let result =\n params.length > 0\n ? await client.query<Result>(query, params)\n : await client.query<Result>(query);\n\n if (options?.mapping) {\n result = {\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n };\n }\n\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n } catch (error) {\n tracer.error('db:sql:batch_query:execute:error', { error });\n throw mapPostgresError(error);\n }\n }\n\n return results;\n}\n\nasync function batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n serializer: JSONSerializer,\n options?: BatchSQLCommandOptions,\n): Promise<QueryResult<Result>[]> {\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = pgFormatter.format(sqls[i]!, { serializer });\n tracer.info('db:sql:command', {\n query,\n params,\n debugSQL: pgFormatter.describe(sqls[i]!, { serializer }),\n });\n try {\n let result =\n params.length > 0\n ? await client.query<Result>(query, params)\n : await client.query<Result>(query);\n\n if (options?.mapping) {\n result = {\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n };\n }\n\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n\n if (options?.assertChanges && (results[i]!.rowCount ?? 0) === 0) {\n throw new BatchCommandNoChangesError(i);\n }\n } catch (error) {\n tracer.error('db:sql:batch_command:execute:error', { error });\n throw mapPostgresError(error);\n }\n }\n\n return results;\n}\n","import type { JSONSerializer } from '../../../../core';\nimport {\n sqlExecutor,\n type AnyConnection,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n} from '../../../../core';\nimport { pgSQLExecutor } from '../execute';\nimport {\n PgDriverType,\n type PgConnection,\n type PgPoolOrClient,\n} from './connection';\n\nexport type PgTransaction = DatabaseTransaction<\n PgConnection,\n PgTransactionOptions\n>;\n\nexport type PgIsolationLevel =\n | 'READ UNCOMMITTED'\n | 'READ COMMITTED'\n | 'REPEATABLE READ'\n | 'SERIALIZABLE';\n\nexport type PgTransactionOptions = DatabaseTransactionOptions & {\n isolationLevel?: PgIsolationLevel;\n};\n\nexport const pgTransaction =\n <ConnectionType extends AnyConnection = AnyConnection>(\n connection: () => ConnectionType,\n serializer: JSONSerializer,\n ) =>\n <DbClient extends PgPoolOrClient = PgPoolOrClient>(\n getClient: Promise<DbClient>,\n options?: {\n close: (client: DbClient, error?: unknown) => Promise<void>;\n } & PgTransactionOptions,\n ): DatabaseTransaction<ConnectionType> => ({\n connection: connection(),\n driverType: PgDriverType,\n begin: async () => {\n const client = await getClient;\n const parts = ['BEGIN'];\n if (options?.isolationLevel) {\n parts.push(`ISOLATION LEVEL ${options.isolationLevel}`);\n }\n if (options?.readonly) {\n parts.push('READ ONLY');\n }\n await client.query(parts.join(' '));\n },\n commit: async () => {\n const client = await getClient;\n\n try {\n await client.query('COMMIT');\n } finally {\n if (options?.close) await options?.close(client);\n }\n },\n rollback: async (error?: unknown) => {\n const client = await getClient;\n try {\n await client.query('ROLLBACK');\n } finally {\n if (options?.close) await options?.close(client, error);\n }\n },\n execute: sqlExecutor(pgSQLExecutor({ serializer }), {\n connect: () => getClient,\n }),\n _transactionOptions: options ?? {},\n });\n","import pg from 'pg';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n createConnection,\n type Connection,\n type DatabaseTransaction,\n} from '../../../../core';\nimport type { PostgreSQLDriverType } from '../../core';\nimport { pgSQLExecutor } from '../execute';\nimport { pgTransaction, type PgTransactionOptions } from './transaction';\n\nexport type PgDriverType = PostgreSQLDriverType<'pg'>;\nexport const PgDriverType: PgDriverType = 'PostgreSQL:pg';\n\nexport type PgPoolClient = pg.PoolClient;\nexport type PgClient = pg.Client;\n\nexport type PgClientOrPoolClient = PgPoolClient | PgClient;\n\nexport type PgPoolOrClient = pg.Pool | PgPoolClient | PgClient;\n\nexport type PgClientConnection = Connection<\n PgClientConnection,\n PgDriverType,\n PgClient,\n DatabaseTransaction<PgClientConnection, PgTransactionOptions>\n>;\n\nexport type PgPoolClientConnection = Connection<\n PgPoolClientConnection,\n PgDriverType,\n PgPoolClient,\n DatabaseTransaction<PgPoolClientConnection, PgTransactionOptions>\n>;\n\nexport type PgConnection = PgPoolClientConnection | PgClientConnection;\n\nexport type PgPoolClientOptions = {\n type: 'PoolClient';\n connect: () => Promise<PgPoolClient>;\n close: (client: PgPoolClient) => Promise<void>;\n};\n\nexport type PgClientOptions = {\n type: 'Client';\n connect: () => Promise<PgClient>;\n close: (client: PgClient) => Promise<void>;\n};\n\nexport type PgClientConnectionOptions = PgClientOptions & {\n serializer: JSONSerializer;\n};\n\nexport type PgPoolClientConnectionOptions = PgPoolClientOptions & {\n serializer: JSONSerializer;\n};\n\nexport const pgClientConnection = (\n options: PgClientConnectionOptions,\n): PgClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n driverType: PgDriverType,\n connect,\n close,\n initTransaction: (connection) =>\n pgTransaction(connection, options.serializer),\n executor: pgSQLExecutor,\n serializer: options.serializer,\n });\n};\n\nexport const pgPoolClientConnection = (\n options: PgPoolClientConnectionOptions,\n): PgPoolClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n driverType: PgDriverType,\n connect,\n close,\n initTransaction: (connection) =>\n pgTransaction(connection, options.serializer),\n executor: pgSQLExecutor,\n serializer: options.serializer,\n });\n};\n\nexport type PgConnectionOptions =\n | PgPoolClientConnectionOptions\n | PgClientConnectionOptions;\n\nexport function pgConnection(\n options: PgPoolClientConnectionOptions,\n): PgPoolClientConnection;\nexport function pgConnection(\n options: PgClientConnectionOptions,\n): PgClientConnection;\nexport function pgConnection(\n options: PgPoolClientConnectionOptions | PgClientConnectionOptions,\n): PgPoolClientConnection | PgClientConnection {\n return options.type === 'Client'\n ? pgClientConnection(options)\n : pgPoolClientConnection(options);\n}\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nexport const checkConnection = async (\n connectionString: string,\n): Promise<ConnectionCheckResult> => {\n const client = new pg.Client({\n connectionString,\n });\n\n try {\n await client.connect();\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'ECONNREFUSED'\n ? 'ConnectionRefused'\n : code === '28P01'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n // Ensure the client is closed properly if connected\n await client.end();\n }\n};\n","import type pg from 'pg';\nimport type { JSONSerializer } from '../../../../core/serializer';\n\nexport const setPgTypeParser = (\n client: pg.Client | pg.PoolClient,\n options?: {\n parseBigInts?: boolean;\n serializer: JSONSerializer;\n },\n) => {\n // BigInt\n if (options?.parseBigInts === true)\n client.setTypeParser(20, (val) => BigInt(val));\n\n if (options?.serializer) {\n // JSONB\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n client.setTypeParser(3802, (val) => options.serializer.deserialize(val));\n\n // JSON\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n client.setTypeParser(114, (val) => options.serializer.deserialize(val));\n }\n};\n","import pg from 'pg';\nimport {\n createAmbientConnectionPool,\n createConnectionPool,\n JSONSerializer,\n tracer,\n type ConnectionPool,\n type JSONSerializationOptions,\n} from '../../../../core';\nimport { defaultPostgreSqlDatabase, parseDatabaseName } from '../../core';\nimport { setPgTypeParser } from '../serialization';\nimport {\n pgConnection,\n PgDriverType,\n type PgClientConnection,\n type PgPoolClientConnection,\n} from './connection';\n\nexport type PgNativePool = ConnectionPool<PgPoolClientConnection>;\n\nexport type PgAmbientClientPool = ConnectionPool<PgClientConnection>;\n\nexport type PgAmbientConnectionPool = ConnectionPool<\n PgPoolClientConnection | PgClientConnection\n>;\n\nexport type PgPool =\n | PgNativePool\n | PgAmbientClientPool\n | PgAmbientConnectionPool;\n\nexport const pgNativePool = (options: {\n connectionString: string;\n database?: string | undefined;\n serializer: JSONSerializer;\n}): PgNativePool => {\n const { connectionString, database } = options;\n const pool = getPgPool({ connectionString, database });\n\n const getConnection = () =>\n pgConnection({\n type: 'PoolClient',\n connect: async () => {\n const client = await pool.connect();\n\n setPgTypeParser(client, {\n parseBigInts: true,\n serializer: options.serializer,\n });\n\n return client;\n },\n close: (client) => Promise.resolve(client.release()),\n serializer: options.serializer,\n });\n\n const open = () => Promise.resolve(getConnection());\n const close = () => endPgPool({ connectionString, database });\n\n return createConnectionPool({\n driverType: PgDriverType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport const pgAmbientNativePool = (options: {\n pool: pg.Pool;\n serializer: JSONSerializer;\n}): PgNativePool => {\n const { pool } = options;\n\n return createConnectionPool({\n driverType: PgDriverType,\n getConnection: () =>\n pgConnection({\n type: 'PoolClient',\n connect: () => pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n serializer: options.serializer,\n }),\n });\n};\n\nexport const pgAmbientConnectionPool = (options: {\n connection: PgPoolClientConnection | PgClientConnection;\n}): PgAmbientConnectionPool => {\n const { connection } = options;\n\n return createAmbientConnectionPool({\n driverType: PgDriverType,\n connection,\n });\n};\n\nexport const pgClientPool = (options: {\n connectionString: string;\n database?: string | undefined;\n serializer: JSONSerializer;\n}): PgAmbientClientPool => {\n const { connectionString, database } = options;\n\n return createConnectionPool({\n driverType: PgDriverType,\n getConnection: () => {\n const connect = async () => {\n const client = new pg.Client({ connectionString, database });\n\n setPgTypeParser(client, {\n parseBigInts: true,\n serializer: options.serializer,\n });\n\n await client.connect();\n return client;\n };\n\n return pgConnection({\n type: 'Client',\n connect,\n close: (client) => client.end(),\n serializer: options.serializer,\n });\n },\n });\n};\n\nexport const pgAmbientClientPool = (options: {\n client: pg.Client;\n serializer: JSONSerializer;\n}): PgAmbientClientPool => {\n const { client } = options;\n\n const getConnection = () => {\n const connect = () => Promise.resolve(client);\n\n return pgConnection({\n type: 'Client',\n connect,\n close: () => Promise.resolve(),\n serializer: options.serializer,\n });\n };\n\n const open = () => Promise.resolve(getConnection());\n const close = () => Promise.resolve();\n\n return createConnectionPool({\n driverType: PgDriverType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport type PgPoolPooledOptions =\n | {\n connectionString: string;\n database?: string;\n pooled: true;\n pool: pg.Pool;\n }\n | {\n connectionString: string;\n database?: string;\n pool: pg.Pool;\n }\n | {\n connectionString: string;\n database?: string;\n pooled: true;\n }\n | {\n connectionString: string;\n database?: string;\n };\n\nexport type PgPoolNotPooledOptions =\n | {\n connectionString: string;\n database?: string;\n pooled: false;\n client: pg.Client;\n }\n | {\n connectionString: string;\n database?: string;\n client: pg.Client;\n }\n | {\n connectionString: string;\n database?: string;\n pooled: false;\n }\n | {\n connectionString: string;\n database?: string;\n connection: PgPoolClientConnection | PgClientConnection;\n pooled?: false;\n };\n\nexport type PgPoolOptions = (PgPoolPooledOptions | PgPoolNotPooledOptions) &\n JSONSerializationOptions;\n\nexport function pgPool(options: PgPoolPooledOptions): PgNativePool;\nexport function pgPool(options: PgPoolNotPooledOptions): PgAmbientClientPool;\nexport function pgPool(\n options: PgPoolOptions,\n): PgNativePool | PgAmbientClientPool | PgAmbientConnectionPool {\n const { connectionString, database } = options;\n\n const serializer = options.serialization?.serializer ?? JSONSerializer;\n\n if ('client' in options && options.client)\n return pgAmbientClientPool({ client: options.client, serializer });\n\n if ('connection' in options && options.connection)\n return pgAmbientConnectionPool({\n connection: options.connection,\n });\n\n if ('pooled' in options && options.pooled === false)\n return pgClientPool({ connectionString, database, serializer });\n\n if ('pool' in options && options.pool)\n return pgAmbientNativePool({ pool: options.pool, serializer });\n\n return pgNativePool({\n connectionString,\n database,\n serializer,\n });\n}\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPgPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? (parseDatabaseName(poolOptions.connectionString) ??\n defaultPostgreSqlDatabase)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPgPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? parseDatabaseName(connectionString) ?? undefined;\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n } catch (error) {\n tracer.error('connection-closing-error', { lookupKey, error });\n }\n pools.delete(lookupKey);\n};\n\nexport const endAllPgPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import {\n canHandleDriverWithConnectionString,\n type DumboDatabaseDriver,\n dumboDatabaseDriverRegistry,\n} from '../../../core';\nimport {\n DefaultPostgreSQLMigratorOptions,\n pgFormatter,\n PostgreSQLConnectionString,\n postgreSQLMetadata,\n} from '../core';\nimport {\n type PgConnection,\n PgDriverType,\n pgPool,\n type PgPool,\n type PgPoolOptions,\n} from './connections';\n\nconst tryParseConnectionString = (connectionString: string) => {\n try {\n return PostgreSQLConnectionString(connectionString);\n } catch {\n return null;\n }\n};\n\nexport const pgDumboDriver: DumboDatabaseDriver<\n PgConnection,\n PgPoolOptions,\n PgPool\n> = {\n driverType: PgDriverType,\n createPool: (options) => pgPool(options as PgPoolOptions),\n sqlFormatter: pgFormatter,\n defaultMigratorOptions: DefaultPostgreSQLMigratorOptions,\n canHandle: canHandleDriverWithConnectionString(\n PgDriverType,\n tryParseConnectionString,\n ),\n databaseMetadata: postgreSQLMetadata,\n};\n\nexport const usePgDumboDriver = () => {\n dumboDatabaseDriverRegistry.register(PgDriverType, pgDumboDriver);\n};\n\nusePgDumboDriver();\n\nexport type PgDumboOptions = PgPoolOptions;\nexport * from './connections';\nexport * from './execute';\nexport * from './serialization';\n"],"mappings":"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"}
1
+ {"version":3,"file":"pg.cjs","names":["pgFormatter","mapSQLQueryResult","mapPostgresError","BatchCommandNoChangesError","sqlExecutor","createConnection","createConnectionPool","createAmbientConnectionPool","JSONSerializer","parseDatabaseName","PostgreSQLConnectionString","pgFormatter","DefaultPostgreSQLMigratorOptions","canHandleDriverWithConnectionString","postgreSQLMetadata"],"sources":["../src/storage/postgresql/pg/execute/execute.ts","../src/storage/postgresql/pg/connections/transaction.ts","../src/storage/postgresql/pg/connections/connection.ts","../src/storage/postgresql/pg/serialization/index.ts","../src/storage/postgresql/pg/connections/pool.ts","../src/storage/postgresql/pg/index.ts"],"sourcesContent":["import pg from 'pg';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n BatchCommandNoChangesError,\n mapSQLQueryResult,\n tracer,\n type BatchSQLCommandOptions,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n type SQLQueryOptions,\n} from '../../../../core';\nimport { pgFormatter } from '../../core';\nimport { mapPostgresError } from '../../core/errors/errorMapper';\nimport { PgDriverType, type PgClientOrPoolClient } from '../connections';\n\nexport const isPgNativePool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isPgClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isPgPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const pgExecute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isPgNativePool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (isPgNativePool(poolOrClient) && isPgPoolClient(client))\n client.release();\n }\n};\n\nexport type PgSQLExecutor = DbSQLExecutor<PgDriverType, PgClientOrPoolClient>;\n\nexport const pgSQLExecutor = ({\n serializer,\n}: {\n serializer: JSONSerializer;\n}): PgSQLExecutor => ({\n driverType: PgDriverType,\n query: async <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sql: SQL,\n options: SQLQueryOptions | undefined,\n ) => {\n const results = await batchQuery<Result>(\n client,\n [sql],\n serializer,\n options,\n );\n return results[0]!;\n },\n batchQuery: <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n options: SQLQueryOptions | undefined,\n ) => batchQuery<Result>(client, sqls, serializer, options),\n command: async <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sql: SQL,\n options: BatchSQLCommandOptions | undefined,\n ) => {\n const results = await batchCommand<Result>(\n client,\n [sql],\n serializer,\n options,\n );\n return results[0]!;\n },\n batchCommand: <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n options: BatchSQLCommandOptions | undefined,\n ) => batchCommand<Result>(client, sqls, serializer, options),\n formatter: pgFormatter,\n});\n\nasync function batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n serializer: JSONSerializer,\n options?: SQLQueryOptions,\n): Promise<QueryResult<Result>[]> {\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = pgFormatter.format(sqls[i]!, { serializer });\n tracer.info('db:sql:query', {\n query,\n params,\n debugSQL: pgFormatter.describe(sqls[i]!, { serializer }),\n });\n try {\n let result =\n params.length > 0\n ? await client.query<Result>(query, params)\n : await client.query<Result>(query);\n\n if (options?.mapping) {\n result = {\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n };\n }\n\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n } catch (error) {\n tracer.error('db:sql:batch_query:execute:error', { error });\n throw mapPostgresError(error);\n }\n }\n\n return results;\n}\n\nasync function batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n serializer: JSONSerializer,\n options?: BatchSQLCommandOptions,\n): Promise<QueryResult<Result>[]> {\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = pgFormatter.format(sqls[i]!, { serializer });\n tracer.info('db:sql:command', {\n query,\n params,\n debugSQL: pgFormatter.describe(sqls[i]!, { serializer }),\n });\n try {\n let result =\n params.length > 0\n ? await client.query<Result>(query, params)\n : await client.query<Result>(query);\n\n if (options?.mapping) {\n result = {\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n };\n }\n\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n\n if (options?.assertChanges && (results[i]!.rowCount ?? 0) === 0) {\n throw new BatchCommandNoChangesError(i);\n }\n } catch (error) {\n tracer.error('db:sql:batch_command:execute:error', { error });\n throw mapPostgresError(error);\n }\n }\n\n return results;\n}\n","import type { JSONSerializer } from '../../../../core';\nimport {\n sqlExecutor,\n type AnyConnection,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n} from '../../../../core';\nimport { pgSQLExecutor } from '../execute';\nimport {\n PgDriverType,\n type PgConnection,\n type PgPoolOrClient,\n} from './connection';\n\nexport type PgTransaction = DatabaseTransaction<\n PgConnection,\n PgTransactionOptions\n>;\n\nexport type PgIsolationLevel =\n 'READ UNCOMMITTED' | 'READ COMMITTED' | 'REPEATABLE READ' | 'SERIALIZABLE';\n\nexport type PgTransactionOptions = DatabaseTransactionOptions & {\n isolationLevel?: PgIsolationLevel;\n};\n\nexport const pgTransaction =\n <ConnectionType extends AnyConnection = AnyConnection>(\n connection: () => ConnectionType,\n serializer: JSONSerializer,\n ) =>\n <DbClient extends PgPoolOrClient = PgPoolOrClient>(\n getClient: Promise<DbClient>,\n options?: {\n close: (client: DbClient, error?: unknown) => Promise<void>;\n } & PgTransactionOptions,\n ): DatabaseTransaction<ConnectionType> => ({\n connection: connection(),\n driverType: PgDriverType,\n begin: async () => {\n const client = await getClient;\n const parts = ['BEGIN'];\n if (options?.isolationLevel) {\n parts.push(`ISOLATION LEVEL ${options.isolationLevel}`);\n }\n if (options?.readonly) {\n parts.push('READ ONLY');\n }\n await client.query(parts.join(' '));\n },\n commit: async () => {\n const client = await getClient;\n\n try {\n await client.query('COMMIT');\n } finally {\n if (options?.close) await options?.close(client);\n }\n },\n rollback: async (error?: unknown) => {\n const client = await getClient;\n try {\n await client.query('ROLLBACK');\n } finally {\n if (options?.close) await options?.close(client, error);\n }\n },\n execute: sqlExecutor(pgSQLExecutor({ serializer }), {\n connect: () => getClient,\n }),\n _transactionOptions: options ?? {},\n });\n","import pg from 'pg';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n createConnection,\n type Connection,\n type DatabaseTransaction,\n} from '../../../../core';\nimport type { PostgreSQLDriverType } from '../../core';\nimport { pgSQLExecutor } from '../execute';\nimport { pgTransaction, type PgTransactionOptions } from './transaction';\n\nexport type PgDriverType = PostgreSQLDriverType<'pg'>;\nexport const PgDriverType: PgDriverType = 'PostgreSQL:pg';\n\nexport type PgPoolClient = pg.PoolClient;\nexport type PgClient = pg.Client;\n\nexport type PgClientOrPoolClient = PgPoolClient | PgClient;\n\nexport type PgPoolOrClient = pg.Pool | PgPoolClient | PgClient;\n\nexport type PgClientConnection = Connection<\n PgClientConnection,\n PgDriverType,\n PgClient,\n DatabaseTransaction<PgClientConnection, PgTransactionOptions>\n>;\n\nexport type PgPoolClientConnection = Connection<\n PgPoolClientConnection,\n PgDriverType,\n PgPoolClient,\n DatabaseTransaction<PgPoolClientConnection, PgTransactionOptions>\n>;\n\nexport type PgConnection = PgPoolClientConnection | PgClientConnection;\n\nexport type PgPoolClientOptions = {\n type: 'PoolClient';\n connect: () => Promise<PgPoolClient>;\n close: (client: PgPoolClient) => Promise<void>;\n};\n\nexport type PgClientOptions = {\n type: 'Client';\n connect: () => Promise<PgClient>;\n close: (client: PgClient) => Promise<void>;\n};\n\nexport type PgClientConnectionOptions = PgClientOptions & {\n serializer: JSONSerializer;\n};\n\nexport type PgPoolClientConnectionOptions = PgPoolClientOptions & {\n serializer: JSONSerializer;\n};\n\nexport const pgClientConnection = (\n options: PgClientConnectionOptions,\n): PgClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n driverType: PgDriverType,\n connect,\n close,\n initTransaction: (connection) =>\n pgTransaction(connection, options.serializer),\n executor: pgSQLExecutor,\n serializer: options.serializer,\n });\n};\n\nexport const pgPoolClientConnection = (\n options: PgPoolClientConnectionOptions,\n): PgPoolClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n driverType: PgDriverType,\n connect,\n close,\n initTransaction: (connection) =>\n pgTransaction(connection, options.serializer),\n executor: pgSQLExecutor,\n serializer: options.serializer,\n });\n};\n\nexport type PgConnectionOptions =\n PgPoolClientConnectionOptions | PgClientConnectionOptions;\n\nexport function pgConnection(\n options: PgPoolClientConnectionOptions,\n): PgPoolClientConnection;\nexport function pgConnection(\n options: PgClientConnectionOptions,\n): PgClientConnection;\nexport function pgConnection(\n options: PgPoolClientConnectionOptions | PgClientConnectionOptions,\n): PgPoolClientConnection | PgClientConnection {\n return options.type === 'Client'\n ? pgClientConnection(options)\n : pgPoolClientConnection(options);\n}\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nexport const checkConnection = async (\n connectionString: string,\n): Promise<ConnectionCheckResult> => {\n const client = new pg.Client({\n connectionString,\n });\n\n try {\n await client.connect();\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'ECONNREFUSED'\n ? 'ConnectionRefused'\n : code === '28P01'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n // Ensure the client is closed properly if connected\n await client.end();\n }\n};\n","import type pg from 'pg';\nimport type { JSONSerializer } from '../../../../core/serializer';\n\nexport const setPgTypeParser = (\n client: pg.Client | pg.PoolClient,\n options?: {\n parseBigInts?: boolean;\n serializer: JSONSerializer;\n },\n) => {\n // BigInt\n if (options?.parseBigInts === true)\n client.setTypeParser(20, (val) => BigInt(val));\n\n if (options?.serializer) {\n // JSONB\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n client.setTypeParser(3802, (val) => options.serializer.deserialize(val));\n\n // JSON\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n client.setTypeParser(114, (val) => options.serializer.deserialize(val));\n }\n};\n","import pg from 'pg';\nimport {\n createAmbientConnectionPool,\n createConnectionPool,\n JSONSerializer,\n tracer,\n type ConnectionPool,\n type JSONSerializationOptions,\n} from '../../../../core';\nimport { defaultPostgreSqlDatabase, parseDatabaseName } from '../../core';\nimport { setPgTypeParser } from '../serialization';\nimport {\n pgConnection,\n PgDriverType,\n type PgClientConnection,\n type PgPoolClientConnection,\n} from './connection';\n\nexport type PgNativePool = ConnectionPool<PgPoolClientConnection>;\n\nexport type PgAmbientClientPool = ConnectionPool<PgClientConnection>;\n\nexport type PgAmbientConnectionPool = ConnectionPool<\n PgPoolClientConnection | PgClientConnection\n>;\n\nexport type PgPool =\n PgNativePool | PgAmbientClientPool | PgAmbientConnectionPool;\n\nexport const pgNativePool = (options: {\n connectionString: string;\n database?: string | undefined;\n serializer: JSONSerializer;\n}): PgNativePool => {\n const { connectionString, database } = options;\n const pool = getPgPool({ connectionString, database });\n\n const getConnection = () =>\n pgConnection({\n type: 'PoolClient',\n connect: async () => {\n const client = await pool.connect();\n\n setPgTypeParser(client, {\n parseBigInts: true,\n serializer: options.serializer,\n });\n\n return client;\n },\n close: (client) => Promise.resolve(client.release()),\n serializer: options.serializer,\n });\n\n const open = () => Promise.resolve(getConnection());\n const close = () => endPgPool({ connectionString, database });\n\n return createConnectionPool({\n driverType: PgDriverType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport const pgAmbientNativePool = (options: {\n pool: pg.Pool;\n serializer: JSONSerializer;\n}): PgNativePool => {\n const { pool } = options;\n\n return createConnectionPool({\n driverType: PgDriverType,\n getConnection: () =>\n pgConnection({\n type: 'PoolClient',\n connect: () => pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n serializer: options.serializer,\n }),\n });\n};\n\nexport const pgAmbientConnectionPool = (options: {\n connection: PgPoolClientConnection | PgClientConnection;\n}): PgAmbientConnectionPool => {\n const { connection } = options;\n\n return createAmbientConnectionPool({\n driverType: PgDriverType,\n connection,\n });\n};\n\nexport const pgClientPool = (options: {\n connectionString: string;\n database?: string | undefined;\n serializer: JSONSerializer;\n}): PgAmbientClientPool => {\n const { connectionString, database } = options;\n\n return createConnectionPool({\n driverType: PgDriverType,\n getConnection: () => {\n const connect = async () => {\n const client = new pg.Client({ connectionString, database });\n\n setPgTypeParser(client, {\n parseBigInts: true,\n serializer: options.serializer,\n });\n\n await client.connect();\n return client;\n };\n\n return pgConnection({\n type: 'Client',\n connect,\n close: (client) => client.end(),\n serializer: options.serializer,\n });\n },\n });\n};\n\nexport const pgAmbientClientPool = (options: {\n client: pg.Client;\n serializer: JSONSerializer;\n}): PgAmbientClientPool => {\n const { client } = options;\n\n const getConnection = () => {\n const connect = () => Promise.resolve(client);\n\n return pgConnection({\n type: 'Client',\n connect,\n close: () => Promise.resolve(),\n serializer: options.serializer,\n });\n };\n\n const open = () => Promise.resolve(getConnection());\n const close = () => Promise.resolve();\n\n return createConnectionPool({\n driverType: PgDriverType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport type PgPoolPooledOptions =\n | {\n connectionString: string;\n database?: string;\n pooled: true;\n pool: pg.Pool;\n }\n | {\n connectionString: string;\n database?: string;\n pool: pg.Pool;\n }\n | {\n connectionString: string;\n database?: string;\n pooled: true;\n }\n | {\n connectionString: string;\n database?: string;\n };\n\nexport type PgPoolNotPooledOptions =\n | {\n connectionString: string;\n database?: string;\n pooled: false;\n client: pg.Client;\n }\n | {\n connectionString: string;\n database?: string;\n client: pg.Client;\n }\n | {\n connectionString: string;\n database?: string;\n pooled: false;\n }\n | {\n connectionString: string;\n database?: string;\n connection: PgPoolClientConnection | PgClientConnection;\n pooled?: false;\n };\n\nexport type PgPoolOptions = (PgPoolPooledOptions | PgPoolNotPooledOptions) &\n JSONSerializationOptions;\n\nexport function pgPool(options: PgPoolPooledOptions): PgNativePool;\nexport function pgPool(options: PgPoolNotPooledOptions): PgAmbientClientPool;\nexport function pgPool(\n options: PgPoolOptions,\n): PgNativePool | PgAmbientClientPool | PgAmbientConnectionPool {\n const { connectionString, database } = options;\n\n const serializer = options.serialization?.serializer ?? JSONSerializer;\n\n if ('client' in options && options.client)\n return pgAmbientClientPool({ client: options.client, serializer });\n\n if ('connection' in options && options.connection)\n return pgAmbientConnectionPool({\n connection: options.connection,\n });\n\n if ('pooled' in options && options.pooled === false)\n return pgClientPool({ connectionString, database, serializer });\n\n if ('pool' in options && options.pool)\n return pgAmbientNativePool({ pool: options.pool, serializer });\n\n return pgNativePool({\n connectionString,\n database,\n serializer,\n });\n}\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPgPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? (parseDatabaseName(poolOptions.connectionString) ??\n defaultPostgreSqlDatabase)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPgPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? parseDatabaseName(connectionString) ?? undefined;\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n } catch (error) {\n tracer.error('connection-closing-error', { lookupKey, error });\n }\n pools.delete(lookupKey);\n};\n\nexport const endAllPgPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import {\n canHandleDriverWithConnectionString,\n type DumboDatabaseDriver,\n dumboDatabaseDriverRegistry,\n} from '../../../core';\nimport {\n DefaultPostgreSQLMigratorOptions,\n pgFormatter,\n PostgreSQLConnectionString,\n postgreSQLMetadata,\n} from '../core';\nimport {\n type PgConnection,\n PgDriverType,\n pgPool,\n type PgPool,\n type PgPoolOptions,\n} from './connections';\n\nconst tryParseConnectionString = (connectionString: string) => {\n try {\n return PostgreSQLConnectionString(connectionString);\n } catch {\n return null;\n }\n};\n\nexport const pgDumboDriver: DumboDatabaseDriver<\n PgConnection,\n PgPoolOptions,\n PgPool\n> = {\n driverType: PgDriverType,\n createPool: (options) => pgPool(options as PgPoolOptions),\n sqlFormatter: pgFormatter,\n defaultMigratorOptions: DefaultPostgreSQLMigratorOptions,\n canHandle: canHandleDriverWithConnectionString(\n PgDriverType,\n tryParseConnectionString,\n ),\n databaseMetadata: postgreSQLMetadata,\n};\n\nexport const usePgDumboDriver = () => {\n dumboDatabaseDriverRegistry.register(PgDriverType, pgDumboDriver);\n};\n\nusePgDumboDriver();\n\nexport type PgDumboOptions = PgPoolOptions;\nexport * from './connections';\nexport * from './execute';\nexport * from './serialization';\n"],"mappings":"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"}
package/dist/pg.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pg.js","names":[],"sources":["../src/storage/postgresql/pg/execute/execute.ts","../src/storage/postgresql/pg/connections/transaction.ts","../src/storage/postgresql/pg/connections/connection.ts","../src/storage/postgresql/pg/serialization/index.ts","../src/storage/postgresql/pg/connections/pool.ts","../src/storage/postgresql/pg/index.ts"],"sourcesContent":["import pg from 'pg';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n BatchCommandNoChangesError,\n mapSQLQueryResult,\n tracer,\n type BatchSQLCommandOptions,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n type SQLQueryOptions,\n} from '../../../../core';\nimport { pgFormatter } from '../../core';\nimport { mapPostgresError } from '../../core/errors/errorMapper';\nimport { PgDriverType, type PgClientOrPoolClient } from '../connections';\n\nexport const isPgNativePool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isPgClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isPgPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const pgExecute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isPgNativePool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (isPgNativePool(poolOrClient) && isPgPoolClient(client))\n client.release();\n }\n};\n\nexport type PgSQLExecutor = DbSQLExecutor<PgDriverType, PgClientOrPoolClient>;\n\nexport const pgSQLExecutor = ({\n serializer,\n}: {\n serializer: JSONSerializer;\n}): PgSQLExecutor => ({\n driverType: PgDriverType,\n query: async <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sql: SQL,\n options: SQLQueryOptions | undefined,\n ) => {\n const results = await batchQuery<Result>(\n client,\n [sql],\n serializer,\n options,\n );\n return results[0]!;\n },\n batchQuery: <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n options: SQLQueryOptions | undefined,\n ) => batchQuery<Result>(client, sqls, serializer, options),\n command: async <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sql: SQL,\n options: BatchSQLCommandOptions | undefined,\n ) => {\n const results = await batchCommand<Result>(\n client,\n [sql],\n serializer,\n options,\n );\n return results[0]!;\n },\n batchCommand: <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n options: BatchSQLCommandOptions | undefined,\n ) => batchCommand<Result>(client, sqls, serializer, options),\n formatter: pgFormatter,\n});\n\nasync function batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n serializer: JSONSerializer,\n options?: SQLQueryOptions,\n): Promise<QueryResult<Result>[]> {\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = pgFormatter.format(sqls[i]!, { serializer });\n tracer.info('db:sql:query', {\n query,\n params,\n debugSQL: pgFormatter.describe(sqls[i]!, { serializer }),\n });\n try {\n let result =\n params.length > 0\n ? await client.query<Result>(query, params)\n : await client.query<Result>(query);\n\n if (options?.mapping) {\n result = {\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n };\n }\n\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n } catch (error) {\n tracer.error('db:sql:batch_query:execute:error', { error });\n throw mapPostgresError(error);\n }\n }\n\n return results;\n}\n\nasync function batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n serializer: JSONSerializer,\n options?: BatchSQLCommandOptions,\n): Promise<QueryResult<Result>[]> {\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = pgFormatter.format(sqls[i]!, { serializer });\n tracer.info('db:sql:command', {\n query,\n params,\n debugSQL: pgFormatter.describe(sqls[i]!, { serializer }),\n });\n try {\n let result =\n params.length > 0\n ? await client.query<Result>(query, params)\n : await client.query<Result>(query);\n\n if (options?.mapping) {\n result = {\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n };\n }\n\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n\n if (options?.assertChanges && (results[i]!.rowCount ?? 0) === 0) {\n throw new BatchCommandNoChangesError(i);\n }\n } catch (error) {\n tracer.error('db:sql:batch_command:execute:error', { error });\n throw mapPostgresError(error);\n }\n }\n\n return results;\n}\n","import type { JSONSerializer } from '../../../../core';\nimport {\n sqlExecutor,\n type AnyConnection,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n} from '../../../../core';\nimport { pgSQLExecutor } from '../execute';\nimport {\n PgDriverType,\n type PgConnection,\n type PgPoolOrClient,\n} from './connection';\n\nexport type PgTransaction = DatabaseTransaction<\n PgConnection,\n PgTransactionOptions\n>;\n\nexport type PgIsolationLevel =\n | 'READ UNCOMMITTED'\n | 'READ COMMITTED'\n | 'REPEATABLE READ'\n | 'SERIALIZABLE';\n\nexport type PgTransactionOptions = DatabaseTransactionOptions & {\n isolationLevel?: PgIsolationLevel;\n};\n\nexport const pgTransaction =\n <ConnectionType extends AnyConnection = AnyConnection>(\n connection: () => ConnectionType,\n serializer: JSONSerializer,\n ) =>\n <DbClient extends PgPoolOrClient = PgPoolOrClient>(\n getClient: Promise<DbClient>,\n options?: {\n close: (client: DbClient, error?: unknown) => Promise<void>;\n } & PgTransactionOptions,\n ): DatabaseTransaction<ConnectionType> => ({\n connection: connection(),\n driverType: PgDriverType,\n begin: async () => {\n const client = await getClient;\n const parts = ['BEGIN'];\n if (options?.isolationLevel) {\n parts.push(`ISOLATION LEVEL ${options.isolationLevel}`);\n }\n if (options?.readonly) {\n parts.push('READ ONLY');\n }\n await client.query(parts.join(' '));\n },\n commit: async () => {\n const client = await getClient;\n\n try {\n await client.query('COMMIT');\n } finally {\n if (options?.close) await options?.close(client);\n }\n },\n rollback: async (error?: unknown) => {\n const client = await getClient;\n try {\n await client.query('ROLLBACK');\n } finally {\n if (options?.close) await options?.close(client, error);\n }\n },\n execute: sqlExecutor(pgSQLExecutor({ serializer }), {\n connect: () => getClient,\n }),\n _transactionOptions: options ?? {},\n });\n","import pg from 'pg';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n createConnection,\n type Connection,\n type DatabaseTransaction,\n} from '../../../../core';\nimport type { PostgreSQLDriverType } from '../../core';\nimport { pgSQLExecutor } from '../execute';\nimport { pgTransaction, type PgTransactionOptions } from './transaction';\n\nexport type PgDriverType = PostgreSQLDriverType<'pg'>;\nexport const PgDriverType: PgDriverType = 'PostgreSQL:pg';\n\nexport type PgPoolClient = pg.PoolClient;\nexport type PgClient = pg.Client;\n\nexport type PgClientOrPoolClient = PgPoolClient | PgClient;\n\nexport type PgPoolOrClient = pg.Pool | PgPoolClient | PgClient;\n\nexport type PgClientConnection = Connection<\n PgClientConnection,\n PgDriverType,\n PgClient,\n DatabaseTransaction<PgClientConnection, PgTransactionOptions>\n>;\n\nexport type PgPoolClientConnection = Connection<\n PgPoolClientConnection,\n PgDriverType,\n PgPoolClient,\n DatabaseTransaction<PgPoolClientConnection, PgTransactionOptions>\n>;\n\nexport type PgConnection = PgPoolClientConnection | PgClientConnection;\n\nexport type PgPoolClientOptions = {\n type: 'PoolClient';\n connect: () => Promise<PgPoolClient>;\n close: (client: PgPoolClient) => Promise<void>;\n};\n\nexport type PgClientOptions = {\n type: 'Client';\n connect: () => Promise<PgClient>;\n close: (client: PgClient) => Promise<void>;\n};\n\nexport type PgClientConnectionOptions = PgClientOptions & {\n serializer: JSONSerializer;\n};\n\nexport type PgPoolClientConnectionOptions = PgPoolClientOptions & {\n serializer: JSONSerializer;\n};\n\nexport const pgClientConnection = (\n options: PgClientConnectionOptions,\n): PgClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n driverType: PgDriverType,\n connect,\n close,\n initTransaction: (connection) =>\n pgTransaction(connection, options.serializer),\n executor: pgSQLExecutor,\n serializer: options.serializer,\n });\n};\n\nexport const pgPoolClientConnection = (\n options: PgPoolClientConnectionOptions,\n): PgPoolClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n driverType: PgDriverType,\n connect,\n close,\n initTransaction: (connection) =>\n pgTransaction(connection, options.serializer),\n executor: pgSQLExecutor,\n serializer: options.serializer,\n });\n};\n\nexport type PgConnectionOptions =\n | PgPoolClientConnectionOptions\n | PgClientConnectionOptions;\n\nexport function pgConnection(\n options: PgPoolClientConnectionOptions,\n): PgPoolClientConnection;\nexport function pgConnection(\n options: PgClientConnectionOptions,\n): PgClientConnection;\nexport function pgConnection(\n options: PgPoolClientConnectionOptions | PgClientConnectionOptions,\n): PgPoolClientConnection | PgClientConnection {\n return options.type === 'Client'\n ? pgClientConnection(options)\n : pgPoolClientConnection(options);\n}\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nexport const checkConnection = async (\n connectionString: string,\n): Promise<ConnectionCheckResult> => {\n const client = new pg.Client({\n connectionString,\n });\n\n try {\n await client.connect();\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'ECONNREFUSED'\n ? 'ConnectionRefused'\n : code === '28P01'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n // Ensure the client is closed properly if connected\n await client.end();\n }\n};\n","import type pg from 'pg';\nimport type { JSONSerializer } from '../../../../core/serializer';\n\nexport const setPgTypeParser = (\n client: pg.Client | pg.PoolClient,\n options?: {\n parseBigInts?: boolean;\n serializer: JSONSerializer;\n },\n) => {\n // BigInt\n if (options?.parseBigInts === true)\n client.setTypeParser(20, (val) => BigInt(val));\n\n if (options?.serializer) {\n // JSONB\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n client.setTypeParser(3802, (val) => options.serializer.deserialize(val));\n\n // JSON\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n client.setTypeParser(114, (val) => options.serializer.deserialize(val));\n }\n};\n","import pg from 'pg';\nimport {\n createAmbientConnectionPool,\n createConnectionPool,\n JSONSerializer,\n tracer,\n type ConnectionPool,\n type JSONSerializationOptions,\n} from '../../../../core';\nimport { defaultPostgreSqlDatabase, parseDatabaseName } from '../../core';\nimport { setPgTypeParser } from '../serialization';\nimport {\n pgConnection,\n PgDriverType,\n type PgClientConnection,\n type PgPoolClientConnection,\n} from './connection';\n\nexport type PgNativePool = ConnectionPool<PgPoolClientConnection>;\n\nexport type PgAmbientClientPool = ConnectionPool<PgClientConnection>;\n\nexport type PgAmbientConnectionPool = ConnectionPool<\n PgPoolClientConnection | PgClientConnection\n>;\n\nexport type PgPool =\n | PgNativePool\n | PgAmbientClientPool\n | PgAmbientConnectionPool;\n\nexport const pgNativePool = (options: {\n connectionString: string;\n database?: string | undefined;\n serializer: JSONSerializer;\n}): PgNativePool => {\n const { connectionString, database } = options;\n const pool = getPgPool({ connectionString, database });\n\n const getConnection = () =>\n pgConnection({\n type: 'PoolClient',\n connect: async () => {\n const client = await pool.connect();\n\n setPgTypeParser(client, {\n parseBigInts: true,\n serializer: options.serializer,\n });\n\n return client;\n },\n close: (client) => Promise.resolve(client.release()),\n serializer: options.serializer,\n });\n\n const open = () => Promise.resolve(getConnection());\n const close = () => endPgPool({ connectionString, database });\n\n return createConnectionPool({\n driverType: PgDriverType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport const pgAmbientNativePool = (options: {\n pool: pg.Pool;\n serializer: JSONSerializer;\n}): PgNativePool => {\n const { pool } = options;\n\n return createConnectionPool({\n driverType: PgDriverType,\n getConnection: () =>\n pgConnection({\n type: 'PoolClient',\n connect: () => pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n serializer: options.serializer,\n }),\n });\n};\n\nexport const pgAmbientConnectionPool = (options: {\n connection: PgPoolClientConnection | PgClientConnection;\n}): PgAmbientConnectionPool => {\n const { connection } = options;\n\n return createAmbientConnectionPool({\n driverType: PgDriverType,\n connection,\n });\n};\n\nexport const pgClientPool = (options: {\n connectionString: string;\n database?: string | undefined;\n serializer: JSONSerializer;\n}): PgAmbientClientPool => {\n const { connectionString, database } = options;\n\n return createConnectionPool({\n driverType: PgDriverType,\n getConnection: () => {\n const connect = async () => {\n const client = new pg.Client({ connectionString, database });\n\n setPgTypeParser(client, {\n parseBigInts: true,\n serializer: options.serializer,\n });\n\n await client.connect();\n return client;\n };\n\n return pgConnection({\n type: 'Client',\n connect,\n close: (client) => client.end(),\n serializer: options.serializer,\n });\n },\n });\n};\n\nexport const pgAmbientClientPool = (options: {\n client: pg.Client;\n serializer: JSONSerializer;\n}): PgAmbientClientPool => {\n const { client } = options;\n\n const getConnection = () => {\n const connect = () => Promise.resolve(client);\n\n return pgConnection({\n type: 'Client',\n connect,\n close: () => Promise.resolve(),\n serializer: options.serializer,\n });\n };\n\n const open = () => Promise.resolve(getConnection());\n const close = () => Promise.resolve();\n\n return createConnectionPool({\n driverType: PgDriverType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport type PgPoolPooledOptions =\n | {\n connectionString: string;\n database?: string;\n pooled: true;\n pool: pg.Pool;\n }\n | {\n connectionString: string;\n database?: string;\n pool: pg.Pool;\n }\n | {\n connectionString: string;\n database?: string;\n pooled: true;\n }\n | {\n connectionString: string;\n database?: string;\n };\n\nexport type PgPoolNotPooledOptions =\n | {\n connectionString: string;\n database?: string;\n pooled: false;\n client: pg.Client;\n }\n | {\n connectionString: string;\n database?: string;\n client: pg.Client;\n }\n | {\n connectionString: string;\n database?: string;\n pooled: false;\n }\n | {\n connectionString: string;\n database?: string;\n connection: PgPoolClientConnection | PgClientConnection;\n pooled?: false;\n };\n\nexport type PgPoolOptions = (PgPoolPooledOptions | PgPoolNotPooledOptions) &\n JSONSerializationOptions;\n\nexport function pgPool(options: PgPoolPooledOptions): PgNativePool;\nexport function pgPool(options: PgPoolNotPooledOptions): PgAmbientClientPool;\nexport function pgPool(\n options: PgPoolOptions,\n): PgNativePool | PgAmbientClientPool | PgAmbientConnectionPool {\n const { connectionString, database } = options;\n\n const serializer = options.serialization?.serializer ?? JSONSerializer;\n\n if ('client' in options && options.client)\n return pgAmbientClientPool({ client: options.client, serializer });\n\n if ('connection' in options && options.connection)\n return pgAmbientConnectionPool({\n connection: options.connection,\n });\n\n if ('pooled' in options && options.pooled === false)\n return pgClientPool({ connectionString, database, serializer });\n\n if ('pool' in options && options.pool)\n return pgAmbientNativePool({ pool: options.pool, serializer });\n\n return pgNativePool({\n connectionString,\n database,\n serializer,\n });\n}\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPgPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? (parseDatabaseName(poolOptions.connectionString) ??\n defaultPostgreSqlDatabase)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPgPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? parseDatabaseName(connectionString) ?? undefined;\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n } catch (error) {\n tracer.error('connection-closing-error', { lookupKey, error });\n }\n pools.delete(lookupKey);\n};\n\nexport const endAllPgPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import {\n canHandleDriverWithConnectionString,\n type DumboDatabaseDriver,\n dumboDatabaseDriverRegistry,\n} from '../../../core';\nimport {\n DefaultPostgreSQLMigratorOptions,\n pgFormatter,\n PostgreSQLConnectionString,\n postgreSQLMetadata,\n} from '../core';\nimport {\n type PgConnection,\n PgDriverType,\n pgPool,\n type PgPool,\n type PgPoolOptions,\n} from './connections';\n\nconst tryParseConnectionString = (connectionString: string) => {\n try {\n return PostgreSQLConnectionString(connectionString);\n } catch {\n return null;\n }\n};\n\nexport const pgDumboDriver: DumboDatabaseDriver<\n PgConnection,\n PgPoolOptions,\n PgPool\n> = {\n driverType: PgDriverType,\n createPool: (options) => pgPool(options as PgPoolOptions),\n sqlFormatter: pgFormatter,\n defaultMigratorOptions: DefaultPostgreSQLMigratorOptions,\n canHandle: canHandleDriverWithConnectionString(\n PgDriverType,\n tryParseConnectionString,\n ),\n databaseMetadata: postgreSQLMetadata,\n};\n\nexport const usePgDumboDriver = () => {\n dumboDatabaseDriverRegistry.register(PgDriverType, pgDumboDriver);\n};\n\nusePgDumboDriver();\n\nexport type PgDumboOptions = PgPoolOptions;\nexport * from './connections';\nexport * from './execute';\nexport * from './serialization';\n"],"mappings":"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"}
1
+ {"version":3,"file":"pg.js","names":[],"sources":["../src/storage/postgresql/pg/execute/execute.ts","../src/storage/postgresql/pg/connections/transaction.ts","../src/storage/postgresql/pg/connections/connection.ts","../src/storage/postgresql/pg/serialization/index.ts","../src/storage/postgresql/pg/connections/pool.ts","../src/storage/postgresql/pg/index.ts"],"sourcesContent":["import pg from 'pg';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n BatchCommandNoChangesError,\n mapSQLQueryResult,\n tracer,\n type BatchSQLCommandOptions,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n type SQLQueryOptions,\n} from '../../../../core';\nimport { pgFormatter } from '../../core';\nimport { mapPostgresError } from '../../core/errors/errorMapper';\nimport { PgDriverType, type PgClientOrPoolClient } from '../connections';\n\nexport const isPgNativePool = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Pool => {\n return poolOrClient instanceof pg.Pool;\n};\n\nexport const isPgClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.Client => poolOrClient instanceof pg.Client;\n\nexport const isPgPoolClient = (\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n): poolOrClient is pg.PoolClient =>\n 'release' in poolOrClient && typeof poolOrClient.release === 'function';\n\nexport const pgExecute = async <Result = void>(\n poolOrClient: pg.Pool | pg.PoolClient | pg.Client,\n handle: (client: pg.PoolClient | pg.Client) => Promise<Result>,\n) => {\n const client = isPgNativePool(poolOrClient)\n ? await poolOrClient.connect()\n : poolOrClient;\n\n try {\n return await handle(client);\n } finally {\n // release only if client wasn't injected externally\n if (isPgNativePool(poolOrClient) && isPgPoolClient(client))\n client.release();\n }\n};\n\nexport type PgSQLExecutor = DbSQLExecutor<PgDriverType, PgClientOrPoolClient>;\n\nexport const pgSQLExecutor = ({\n serializer,\n}: {\n serializer: JSONSerializer;\n}): PgSQLExecutor => ({\n driverType: PgDriverType,\n query: async <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sql: SQL,\n options: SQLQueryOptions | undefined,\n ) => {\n const results = await batchQuery<Result>(\n client,\n [sql],\n serializer,\n options,\n );\n return results[0]!;\n },\n batchQuery: <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n options: SQLQueryOptions | undefined,\n ) => batchQuery<Result>(client, sqls, serializer, options),\n command: async <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sql: SQL,\n options: BatchSQLCommandOptions | undefined,\n ) => {\n const results = await batchCommand<Result>(\n client,\n [sql],\n serializer,\n options,\n );\n return results[0]!;\n },\n batchCommand: <Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n options: BatchSQLCommandOptions | undefined,\n ) => batchCommand<Result>(client, sqls, serializer, options),\n formatter: pgFormatter,\n});\n\nasync function batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n serializer: JSONSerializer,\n options?: SQLQueryOptions,\n): Promise<QueryResult<Result>[]> {\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = pgFormatter.format(sqls[i]!, { serializer });\n tracer.info('db:sql:query', {\n query,\n params,\n debugSQL: pgFormatter.describe(sqls[i]!, { serializer }),\n });\n try {\n let result =\n params.length > 0\n ? await client.query<Result>(query, params)\n : await client.query<Result>(query);\n\n if (options?.mapping) {\n result = {\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n };\n }\n\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n } catch (error) {\n tracer.error('db:sql:batch_query:execute:error', { error });\n throw mapPostgresError(error);\n }\n }\n\n return results;\n}\n\nasync function batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: PgClientOrPoolClient,\n sqls: SQL[],\n serializer: JSONSerializer,\n options?: BatchSQLCommandOptions,\n): Promise<QueryResult<Result>[]> {\n const results: QueryResult<Result>[] = Array<QueryResult<Result>>(\n sqls.length,\n );\n\n if (options?.timeoutMs) {\n await client.query(`SET statement_timeout = ${options.timeoutMs}`);\n }\n\n //TODO: make it smarter at some point\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = pgFormatter.format(sqls[i]!, { serializer });\n tracer.info('db:sql:command', {\n query,\n params,\n debugSQL: pgFormatter.describe(sqls[i]!, { serializer }),\n });\n try {\n let result =\n params.length > 0\n ? await client.query<Result>(query, params)\n : await client.query<Result>(query);\n\n if (options?.mapping) {\n result = {\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n };\n }\n\n results[i] = { rowCount: result.rowCount, rows: result.rows };\n\n if (options?.assertChanges && (results[i]!.rowCount ?? 0) === 0) {\n throw new BatchCommandNoChangesError(i);\n }\n } catch (error) {\n tracer.error('db:sql:batch_command:execute:error', { error });\n throw mapPostgresError(error);\n }\n }\n\n return results;\n}\n","import type { JSONSerializer } from '../../../../core';\nimport {\n sqlExecutor,\n type AnyConnection,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n} from '../../../../core';\nimport { pgSQLExecutor } from '../execute';\nimport {\n PgDriverType,\n type PgConnection,\n type PgPoolOrClient,\n} from './connection';\n\nexport type PgTransaction = DatabaseTransaction<\n PgConnection,\n PgTransactionOptions\n>;\n\nexport type PgIsolationLevel =\n 'READ UNCOMMITTED' | 'READ COMMITTED' | 'REPEATABLE READ' | 'SERIALIZABLE';\n\nexport type PgTransactionOptions = DatabaseTransactionOptions & {\n isolationLevel?: PgIsolationLevel;\n};\n\nexport const pgTransaction =\n <ConnectionType extends AnyConnection = AnyConnection>(\n connection: () => ConnectionType,\n serializer: JSONSerializer,\n ) =>\n <DbClient extends PgPoolOrClient = PgPoolOrClient>(\n getClient: Promise<DbClient>,\n options?: {\n close: (client: DbClient, error?: unknown) => Promise<void>;\n } & PgTransactionOptions,\n ): DatabaseTransaction<ConnectionType> => ({\n connection: connection(),\n driverType: PgDriverType,\n begin: async () => {\n const client = await getClient;\n const parts = ['BEGIN'];\n if (options?.isolationLevel) {\n parts.push(`ISOLATION LEVEL ${options.isolationLevel}`);\n }\n if (options?.readonly) {\n parts.push('READ ONLY');\n }\n await client.query(parts.join(' '));\n },\n commit: async () => {\n const client = await getClient;\n\n try {\n await client.query('COMMIT');\n } finally {\n if (options?.close) await options?.close(client);\n }\n },\n rollback: async (error?: unknown) => {\n const client = await getClient;\n try {\n await client.query('ROLLBACK');\n } finally {\n if (options?.close) await options?.close(client, error);\n }\n },\n execute: sqlExecutor(pgSQLExecutor({ serializer }), {\n connect: () => getClient,\n }),\n _transactionOptions: options ?? {},\n });\n","import pg from 'pg';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n createConnection,\n type Connection,\n type DatabaseTransaction,\n} from '../../../../core';\nimport type { PostgreSQLDriverType } from '../../core';\nimport { pgSQLExecutor } from '../execute';\nimport { pgTransaction, type PgTransactionOptions } from './transaction';\n\nexport type PgDriverType = PostgreSQLDriverType<'pg'>;\nexport const PgDriverType: PgDriverType = 'PostgreSQL:pg';\n\nexport type PgPoolClient = pg.PoolClient;\nexport type PgClient = pg.Client;\n\nexport type PgClientOrPoolClient = PgPoolClient | PgClient;\n\nexport type PgPoolOrClient = pg.Pool | PgPoolClient | PgClient;\n\nexport type PgClientConnection = Connection<\n PgClientConnection,\n PgDriverType,\n PgClient,\n DatabaseTransaction<PgClientConnection, PgTransactionOptions>\n>;\n\nexport type PgPoolClientConnection = Connection<\n PgPoolClientConnection,\n PgDriverType,\n PgPoolClient,\n DatabaseTransaction<PgPoolClientConnection, PgTransactionOptions>\n>;\n\nexport type PgConnection = PgPoolClientConnection | PgClientConnection;\n\nexport type PgPoolClientOptions = {\n type: 'PoolClient';\n connect: () => Promise<PgPoolClient>;\n close: (client: PgPoolClient) => Promise<void>;\n};\n\nexport type PgClientOptions = {\n type: 'Client';\n connect: () => Promise<PgClient>;\n close: (client: PgClient) => Promise<void>;\n};\n\nexport type PgClientConnectionOptions = PgClientOptions & {\n serializer: JSONSerializer;\n};\n\nexport type PgPoolClientConnectionOptions = PgPoolClientOptions & {\n serializer: JSONSerializer;\n};\n\nexport const pgClientConnection = (\n options: PgClientConnectionOptions,\n): PgClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n driverType: PgDriverType,\n connect,\n close,\n initTransaction: (connection) =>\n pgTransaction(connection, options.serializer),\n executor: pgSQLExecutor,\n serializer: options.serializer,\n });\n};\n\nexport const pgPoolClientConnection = (\n options: PgPoolClientConnectionOptions,\n): PgPoolClientConnection => {\n const { connect, close } = options;\n\n return createConnection({\n driverType: PgDriverType,\n connect,\n close,\n initTransaction: (connection) =>\n pgTransaction(connection, options.serializer),\n executor: pgSQLExecutor,\n serializer: options.serializer,\n });\n};\n\nexport type PgConnectionOptions =\n PgPoolClientConnectionOptions | PgClientConnectionOptions;\n\nexport function pgConnection(\n options: PgPoolClientConnectionOptions,\n): PgPoolClientConnection;\nexport function pgConnection(\n options: PgClientConnectionOptions,\n): PgClientConnection;\nexport function pgConnection(\n options: PgPoolClientConnectionOptions | PgClientConnectionOptions,\n): PgPoolClientConnection | PgClientConnection {\n return options.type === 'Client'\n ? pgClientConnection(options)\n : pgPoolClientConnection(options);\n}\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nexport const checkConnection = async (\n connectionString: string,\n): Promise<ConnectionCheckResult> => {\n const client = new pg.Client({\n connectionString,\n });\n\n try {\n await client.connect();\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'ECONNREFUSED'\n ? 'ConnectionRefused'\n : code === '28P01'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n // Ensure the client is closed properly if connected\n await client.end();\n }\n};\n","import type pg from 'pg';\nimport type { JSONSerializer } from '../../../../core/serializer';\n\nexport const setPgTypeParser = (\n client: pg.Client | pg.PoolClient,\n options?: {\n parseBigInts?: boolean;\n serializer: JSONSerializer;\n },\n) => {\n // BigInt\n if (options?.parseBigInts === true)\n client.setTypeParser(20, (val) => BigInt(val));\n\n if (options?.serializer) {\n // JSONB\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n client.setTypeParser(3802, (val) => options.serializer.deserialize(val));\n\n // JSON\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n client.setTypeParser(114, (val) => options.serializer.deserialize(val));\n }\n};\n","import pg from 'pg';\nimport {\n createAmbientConnectionPool,\n createConnectionPool,\n JSONSerializer,\n tracer,\n type ConnectionPool,\n type JSONSerializationOptions,\n} from '../../../../core';\nimport { defaultPostgreSqlDatabase, parseDatabaseName } from '../../core';\nimport { setPgTypeParser } from '../serialization';\nimport {\n pgConnection,\n PgDriverType,\n type PgClientConnection,\n type PgPoolClientConnection,\n} from './connection';\n\nexport type PgNativePool = ConnectionPool<PgPoolClientConnection>;\n\nexport type PgAmbientClientPool = ConnectionPool<PgClientConnection>;\n\nexport type PgAmbientConnectionPool = ConnectionPool<\n PgPoolClientConnection | PgClientConnection\n>;\n\nexport type PgPool =\n PgNativePool | PgAmbientClientPool | PgAmbientConnectionPool;\n\nexport const pgNativePool = (options: {\n connectionString: string;\n database?: string | undefined;\n serializer: JSONSerializer;\n}): PgNativePool => {\n const { connectionString, database } = options;\n const pool = getPgPool({ connectionString, database });\n\n const getConnection = () =>\n pgConnection({\n type: 'PoolClient',\n connect: async () => {\n const client = await pool.connect();\n\n setPgTypeParser(client, {\n parseBigInts: true,\n serializer: options.serializer,\n });\n\n return client;\n },\n close: (client) => Promise.resolve(client.release()),\n serializer: options.serializer,\n });\n\n const open = () => Promise.resolve(getConnection());\n const close = () => endPgPool({ connectionString, database });\n\n return createConnectionPool({\n driverType: PgDriverType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport const pgAmbientNativePool = (options: {\n pool: pg.Pool;\n serializer: JSONSerializer;\n}): PgNativePool => {\n const { pool } = options;\n\n return createConnectionPool({\n driverType: PgDriverType,\n getConnection: () =>\n pgConnection({\n type: 'PoolClient',\n connect: () => pool.connect(),\n close: (client) => Promise.resolve(client.release()),\n serializer: options.serializer,\n }),\n });\n};\n\nexport const pgAmbientConnectionPool = (options: {\n connection: PgPoolClientConnection | PgClientConnection;\n}): PgAmbientConnectionPool => {\n const { connection } = options;\n\n return createAmbientConnectionPool({\n driverType: PgDriverType,\n connection,\n });\n};\n\nexport const pgClientPool = (options: {\n connectionString: string;\n database?: string | undefined;\n serializer: JSONSerializer;\n}): PgAmbientClientPool => {\n const { connectionString, database } = options;\n\n return createConnectionPool({\n driverType: PgDriverType,\n getConnection: () => {\n const connect = async () => {\n const client = new pg.Client({ connectionString, database });\n\n setPgTypeParser(client, {\n parseBigInts: true,\n serializer: options.serializer,\n });\n\n await client.connect();\n return client;\n };\n\n return pgConnection({\n type: 'Client',\n connect,\n close: (client) => client.end(),\n serializer: options.serializer,\n });\n },\n });\n};\n\nexport const pgAmbientClientPool = (options: {\n client: pg.Client;\n serializer: JSONSerializer;\n}): PgAmbientClientPool => {\n const { client } = options;\n\n const getConnection = () => {\n const connect = () => Promise.resolve(client);\n\n return pgConnection({\n type: 'Client',\n connect,\n close: () => Promise.resolve(),\n serializer: options.serializer,\n });\n };\n\n const open = () => Promise.resolve(getConnection());\n const close = () => Promise.resolve();\n\n return createConnectionPool({\n driverType: PgDriverType,\n connection: open,\n close,\n getConnection,\n });\n};\n\nexport type PgPoolPooledOptions =\n | {\n connectionString: string;\n database?: string;\n pooled: true;\n pool: pg.Pool;\n }\n | {\n connectionString: string;\n database?: string;\n pool: pg.Pool;\n }\n | {\n connectionString: string;\n database?: string;\n pooled: true;\n }\n | {\n connectionString: string;\n database?: string;\n };\n\nexport type PgPoolNotPooledOptions =\n | {\n connectionString: string;\n database?: string;\n pooled: false;\n client: pg.Client;\n }\n | {\n connectionString: string;\n database?: string;\n client: pg.Client;\n }\n | {\n connectionString: string;\n database?: string;\n pooled: false;\n }\n | {\n connectionString: string;\n database?: string;\n connection: PgPoolClientConnection | PgClientConnection;\n pooled?: false;\n };\n\nexport type PgPoolOptions = (PgPoolPooledOptions | PgPoolNotPooledOptions) &\n JSONSerializationOptions;\n\nexport function pgPool(options: PgPoolPooledOptions): PgNativePool;\nexport function pgPool(options: PgPoolNotPooledOptions): PgAmbientClientPool;\nexport function pgPool(\n options: PgPoolOptions,\n): PgNativePool | PgAmbientClientPool | PgAmbientConnectionPool {\n const { connectionString, database } = options;\n\n const serializer = options.serialization?.serializer ?? JSONSerializer;\n\n if ('client' in options && options.client)\n return pgAmbientClientPool({ client: options.client, serializer });\n\n if ('connection' in options && options.connection)\n return pgAmbientConnectionPool({\n connection: options.connection,\n });\n\n if ('pooled' in options && options.pooled === false)\n return pgClientPool({ connectionString, database, serializer });\n\n if ('pool' in options && options.pool)\n return pgAmbientNativePool({ pool: options.pool, serializer });\n\n return pgNativePool({\n connectionString,\n database,\n serializer,\n });\n}\n\nconst pools: Map<string, pg.Pool> = new Map();\nconst usageCounter: Map<string, number> = new Map();\n\nexport const getPgPool = (\n connectionStringOrOptions: string | pg.PoolConfig,\n): pg.Pool => {\n const connectionString =\n typeof connectionStringOrOptions === 'string'\n ? connectionStringOrOptions\n : connectionStringOrOptions.connectionString!;\n\n const poolOptions =\n typeof connectionStringOrOptions === 'string'\n ? { connectionString }\n : connectionStringOrOptions;\n\n const database =\n poolOptions.database ??\n (poolOptions.connectionString\n ? (parseDatabaseName(poolOptions.connectionString) ??\n defaultPostgreSqlDatabase)\n : undefined);\n\n const lookupKey = key(connectionString, database);\n\n updatePoolUsageCounter(lookupKey, 1);\n\n return (\n pools.get(lookupKey) ??\n pools.set(lookupKey, new pg.Pool(poolOptions)).get(lookupKey)!\n );\n};\n\nexport const endPgPool = async ({\n connectionString,\n database,\n force,\n}: {\n connectionString: string;\n database?: string | undefined;\n force?: boolean;\n}): Promise<void> => {\n database = database ?? parseDatabaseName(connectionString) ?? undefined;\n const lookupKey = key(connectionString, database);\n\n const pool = pools.get(lookupKey);\n if (pool && (updatePoolUsageCounter(lookupKey, -1) <= 0 || force === true)) {\n await onEndPool(lookupKey, pool);\n }\n};\n\nexport const onEndPool = async (lookupKey: string, pool: pg.Pool) => {\n try {\n await pool.end();\n } catch (error) {\n tracer.error('connection-closing-error', { lookupKey, error });\n }\n pools.delete(lookupKey);\n};\n\nexport const endAllPgPools = () =>\n Promise.all(\n [...pools.entries()].map(([lookupKey, pool]) => onEndPool(lookupKey, pool)),\n );\n\nconst key = (connectionString: string, database: string | undefined) =>\n `${connectionString}|${database ?? defaultPostgreSqlDatabase}`;\n\nconst updatePoolUsageCounter = (lookupKey: string, by: 1 | -1): number => {\n const currentCounter = usageCounter.get(lookupKey) ?? 0;\n const newCounter = currentCounter + by;\n\n usageCounter.set(lookupKey, currentCounter + by);\n\n return newCounter;\n};\n","import {\n canHandleDriverWithConnectionString,\n type DumboDatabaseDriver,\n dumboDatabaseDriverRegistry,\n} from '../../../core';\nimport {\n DefaultPostgreSQLMigratorOptions,\n pgFormatter,\n PostgreSQLConnectionString,\n postgreSQLMetadata,\n} from '../core';\nimport {\n type PgConnection,\n PgDriverType,\n pgPool,\n type PgPool,\n type PgPoolOptions,\n} from './connections';\n\nconst tryParseConnectionString = (connectionString: string) => {\n try {\n return PostgreSQLConnectionString(connectionString);\n } catch {\n return null;\n }\n};\n\nexport const pgDumboDriver: DumboDatabaseDriver<\n PgConnection,\n PgPoolOptions,\n PgPool\n> = {\n driverType: PgDriverType,\n createPool: (options) => pgPool(options as PgPoolOptions),\n sqlFormatter: pgFormatter,\n defaultMigratorOptions: DefaultPostgreSQLMigratorOptions,\n canHandle: canHandleDriverWithConnectionString(\n PgDriverType,\n tryParseConnectionString,\n ),\n databaseMetadata: postgreSQLMetadata,\n};\n\nexport const usePgDumboDriver = () => {\n dumboDatabaseDriverRegistry.register(PgDriverType, pgDumboDriver);\n};\n\nusePgDumboDriver();\n\nexport type PgDumboOptions = PgPoolOptions;\nexport * from './connections';\nexport * from './execute';\nexport * from './serialization';\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"postgreSQLMetadata-BTz6vdwE.js","names":[],"sources":["../src/storage/postgresql/core/connections/connectionString.ts","../src/storage/postgresql/core/schema/schema.ts","../src/storage/postgresql/core/schema/postgreSQLMetadata.ts"],"sourcesContent":["import type { DatabaseConnectionString } from '../../../all';\n\nexport const defaultPostgreSQLConnectionString: PostgreSQLConnectionString =\n 'postgresql://postgres@localhost:5432/postgres' as PostgreSQLConnectionString;\n\nexport type PostgreSQLConnectionString = DatabaseConnectionString<\n 'PostgreSQL',\n `postgresql://${string}` | `postgres://${string}`\n>;\n\nexport const PostgreSQLConnectionString = (\n connectionString: string,\n): PostgreSQLConnectionString => {\n if (\n !connectionString.startsWith('postgresql://') &&\n !connectionString.startsWith('postgres://')\n ) {\n throw new Error(\n `Invalid PostgreSQL connection string: ${connectionString}. It should start with \"postgresql://\".`,\n );\n }\n return connectionString as PostgreSQLConnectionString;\n};\n\n// Stripped from https://github.com/brianc/node-postgres\n// Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)\n// MIT License\n/**\n * Parse database name from a PostgreSQL connection string\n */\nexport function parseDatabaseName(str: string): string | null {\n // Unix socket format: /path/to/socket database_name\n if (str.charAt(0) === '/') {\n const parts = str.split(' ');\n return parts[1] || null;\n }\n\n // Encode spaces if present\n if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) {\n str = encodeURI(str).replace(/%25(\\d\\d)/g, '%$1');\n }\n\n let result: URL;\n try {\n result = new URL(str, 'postgres://base');\n } catch {\n // Try with dummy host for malformed URLs\n try {\n result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base');\n } catch {\n return null;\n }\n }\n\n // Socket protocol: socket://path?db=dbname\n if (result.protocol === 'socket:') {\n return result.searchParams.get('db');\n }\n\n // Standard URL: postgres://user:pass@host:port/database\n const pathname = result.pathname.slice(1) || null;\n return pathname ? decodeURI(pathname) : null;\n}\n","import { exists, SQL, type SQLExecutor } from '../../../../core';\nexport * from './schema';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = ${tableName}\n ) AS exists;`;\n\nexport const tableExists = async (\n execute: SQLExecutor,\n tableName: string,\n): Promise<boolean> => exists(execute.query(tableExistsSQL(tableName)));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT FROM pg_proc\n WHERE\n proname = ${functionName}\n ) AS exists;`;\n\nexport const functionExists = async (\n execute: SQLExecutor,\n functionName: string,\n): Promise<boolean> => exists(execute.query(functionExistsSQL(functionName)));\n","import type { DatabaseMetadata } from '../../../../core';\nimport { parseDatabaseName } from '../connections';\nimport {\n defaultPostgreSqlDatabase,\n functionExists,\n tableExists,\n} from './schema';\n\nexport const postgreSQLMetadata: DatabaseMetadata<true, true, true> = {\n databaseType: 'PostgreSQL',\n defaultDatabaseName: defaultPostgreSqlDatabase,\n capabilities: {\n supportsSchemas: true,\n supportsFunctions: true,\n supportsMultipleDatabases: true,\n },\n tableExists,\n functionExists,\n parseDatabaseName: (connectionString?: string) =>\n (connectionString ? parseDatabaseName(connectionString) : null) ??\n defaultPostgreSqlDatabase,\n};\n\ndumboDatabaseMetadataRegistry.register('PostgreSQL', postgreSQLMetadata);\n"],"mappings":";;;AAEA,MAAa,oCACX;AAOF,MAAa,8BACX,qBAC+B;AAC/B,KACE,CAAC,iBAAiB,WAAW,gBAAgB,IAC7C,CAAC,iBAAiB,WAAW,cAAc,CAE3C,OAAM,IAAI,MACR,yCAAyC,iBAAiB,yCAC3D;AAEH,QAAO;;;;;AAST,SAAgB,kBAAkB,KAA4B;AAE5D,KAAI,IAAI,OAAO,EAAE,KAAK,IAEpB,QADc,IAAI,MAAM,IAAI,CACf,MAAM;AAIrB,KAAI,mCAAmC,KAAK,IAAI,CAC9C,OAAM,UAAU,IAAI,CAAC,QAAQ,cAAc,MAAM;CAGnD,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,KAAK,kBAAkB;SAClC;AAEN,MAAI;AACF,YAAS,IAAI,IAAI,IAAI,QAAQ,MAAM,gBAAgB,EAAE,kBAAkB;UACjE;AACN,UAAO;;;AAKX,KAAI,OAAO,aAAa,UACtB,QAAO,OAAO,aAAa,IAAI,KAAK;CAItC,MAAM,WAAW,OAAO,SAAS,MAAM,EAAE,IAAI;AAC7C,QAAO,WAAW,UAAU,SAAS,GAAG;;;;;AC1D1C,MAAa,4BAA4B;AAEzC,MAAa,kBAAkB,cAC7B,GAAG;;;wBAGmB,UAAU;;AAGlC,MAAa,cAAc,OACzB,SACA,cACqB,OAAO,QAAQ,MAAM,eAAe,UAAU,CAAC,CAAC;AAEvE,MAAa,qBAAqB,iBAChC,GAAG;;;;oBAIe,aAAa;;AAGjC,MAAa,iBAAiB,OAC5B,SACA,iBACqB,OAAO,QAAQ,MAAM,kBAAkB,aAAa,CAAC,CAAC;;;;ACpB7E,MAAa,qBAAyD;CACpE,cAAc;CACd,qBAAqB;CACrB,cAAc;EACZ,iBAAiB;EACjB,mBAAmB;EACnB,2BAA2B;EAC5B;CACD;CACA;CACA,oBAAoB,sBACjB,mBAAmB,kBAAkB,iBAAiB,GAAG;CAE7D;AAED,8BAA8B,SAAS,cAAc,mBAAmB"}
1
+ {"version":3,"file":"postgreSQLMetadata-BTz6vdwE.js","names":[],"sources":["../src/storage/postgresql/core/connections/connectionString.ts","../src/storage/postgresql/core/schema/schema.ts","../src/storage/postgresql/core/schema/postgreSQLMetadata.ts"],"sourcesContent":["import type { DatabaseConnectionString } from '../../../all';\n\nexport const defaultPostgreSQLConnectionString: PostgreSQLConnectionString =\n 'postgresql://postgres@localhost:5432/postgres' as PostgreSQLConnectionString;\n\nexport type PostgreSQLConnectionString = DatabaseConnectionString<\n 'PostgreSQL',\n `postgresql://${string}` | `postgres://${string}`\n>;\n\nexport const PostgreSQLConnectionString = (\n connectionString: string,\n): PostgreSQLConnectionString => {\n if (\n !connectionString.startsWith('postgresql://') &&\n !connectionString.startsWith('postgres://')\n ) {\n throw new Error(\n `Invalid PostgreSQL connection string: ${connectionString}. It should start with \"postgresql://\".`,\n );\n }\n return connectionString as PostgreSQLConnectionString;\n};\n\n// Stripped from https://github.com/brianc/node-postgres\n// Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)\n// MIT License\n/**\n * Parse database name from a PostgreSQL connection string\n */\nexport function parseDatabaseName(str: string): string | null {\n // Unix socket format: /path/to/socket database_name\n if (str.charAt(0) === '/') {\n const parts = str.split(' ');\n return parts[1] || null;\n }\n\n // Encode spaces if present\n if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) {\n str = encodeURI(str).replace(/%25(\\d\\d)/g, '%$1');\n }\n\n let result: URL;\n try {\n result = new URL(str, 'postgres://base');\n } catch {\n // Try with dummy host for malformed URLs\n try {\n result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base');\n } catch {\n return null;\n }\n }\n\n // Socket protocol: socket://path?db=dbname\n if (result.protocol === 'socket:') {\n return result.searchParams.get('db');\n }\n\n // Standard URL: postgres://user:pass@host:port/database\n const pathname = result.pathname.slice(1) || null;\n return pathname ? decodeURI(pathname) : null;\n}\n","import { exists, SQL, type SQLExecutor } from '../../../../core';\nexport * from './schema';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = ${tableName}\n ) AS exists;`;\n\nexport const tableExists = async (\n execute: SQLExecutor,\n tableName: string,\n): Promise<boolean> => exists(execute.query(tableExistsSQL(tableName)));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT FROM pg_proc\n WHERE\n proname = ${functionName}\n ) AS exists;`;\n\nexport const functionExists = async (\n execute: SQLExecutor,\n functionName: string,\n): Promise<boolean> => exists(execute.query(functionExistsSQL(functionName)));\n","import type { DatabaseMetadata } from '../../../../core';\nimport { parseDatabaseName } from '../connections';\nimport {\n defaultPostgreSqlDatabase,\n functionExists,\n tableExists,\n} from './schema';\n\nexport const postgreSQLMetadata: DatabaseMetadata<true, true, true> = {\n databaseType: 'PostgreSQL',\n defaultDatabaseName: defaultPostgreSqlDatabase,\n capabilities: {\n supportsSchemas: true,\n supportsFunctions: true,\n supportsMultipleDatabases: true,\n },\n tableExists,\n functionExists,\n parseDatabaseName: (connectionString?: string) =>\n (connectionString ? parseDatabaseName(connectionString) : null) ??\n defaultPostgreSqlDatabase,\n};\n\ndumboDatabaseMetadataRegistry.register('PostgreSQL', postgreSQLMetadata);\n"],"mappings":";;;AAEA,MAAa,oCACX;AAOF,MAAa,8BACX,qBAC+B;AAC/B,KACE,CAAC,iBAAiB,WAAW,gBAAgB,IAC7C,CAAC,iBAAiB,WAAW,cAAc,CAE3C,OAAM,IAAI,MACR,yCAAyC,iBAAiB,yCAC3D;AAEH,QAAO;;;;;AAST,SAAgB,kBAAkB,KAA4B;AAE5D,KAAI,IAAI,OAAO,EAAE,KAAK,IAEpB,QADc,IAAI,MAAM,IACZ,CAAC,MAAM;AAIrB,KAAI,mCAAmC,KAAK,IAAI,CAC9C,OAAM,UAAU,IAAI,CAAC,QAAQ,cAAc,MAAM;CAGnD,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,KAAK,kBAAkB;SAClC;AAEN,MAAI;AACF,YAAS,IAAI,IAAI,IAAI,QAAQ,MAAM,gBAAgB,EAAE,kBAAkB;UACjE;AACN,UAAO;;;AAKX,KAAI,OAAO,aAAa,UACtB,QAAO,OAAO,aAAa,IAAI,KAAK;CAItC,MAAM,WAAW,OAAO,SAAS,MAAM,EAAE,IAAI;AAC7C,QAAO,WAAW,UAAU,SAAS,GAAG;;;;;AC1D1C,MAAa,4BAA4B;AAEzC,MAAa,kBAAkB,cAC7B,GAAG;;;wBAGmB,UAAU;;AAGlC,MAAa,cAAc,OACzB,SACA,cACqB,OAAO,QAAQ,MAAM,eAAe,UAAU,CAAC,CAAC;AAEvE,MAAa,qBAAqB,iBAChC,GAAG;;;;oBAIe,aAAa;;AAGjC,MAAa,iBAAiB,OAC5B,SACA,iBACqB,OAAO,QAAQ,MAAM,kBAAkB,aAAa,CAAC,CAAC;;;;ACpB7E,MAAa,qBAAyD;CACpE,cAAc;CACd,qBAAqB;CACrB,cAAc;EACZ,iBAAiB;EACjB,mBAAmB;EACnB,2BAA2B;EAC5B;CACD;CACA;CACA,oBAAoB,sBACjB,mBAAmB,kBAAkB,iBAAiB,GAAG;CAE7D;AAED,8BAA8B,SAAS,cAAc,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"postgreSQLMetadata-WGXySO7a.cjs","names":["exists"],"sources":["../src/storage/postgresql/core/connections/connectionString.ts","../src/storage/postgresql/core/schema/schema.ts","../src/storage/postgresql/core/schema/postgreSQLMetadata.ts"],"sourcesContent":["import type { DatabaseConnectionString } from '../../../all';\n\nexport const defaultPostgreSQLConnectionString: PostgreSQLConnectionString =\n 'postgresql://postgres@localhost:5432/postgres' as PostgreSQLConnectionString;\n\nexport type PostgreSQLConnectionString = DatabaseConnectionString<\n 'PostgreSQL',\n `postgresql://${string}` | `postgres://${string}`\n>;\n\nexport const PostgreSQLConnectionString = (\n connectionString: string,\n): PostgreSQLConnectionString => {\n if (\n !connectionString.startsWith('postgresql://') &&\n !connectionString.startsWith('postgres://')\n ) {\n throw new Error(\n `Invalid PostgreSQL connection string: ${connectionString}. It should start with \"postgresql://\".`,\n );\n }\n return connectionString as PostgreSQLConnectionString;\n};\n\n// Stripped from https://github.com/brianc/node-postgres\n// Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)\n// MIT License\n/**\n * Parse database name from a PostgreSQL connection string\n */\nexport function parseDatabaseName(str: string): string | null {\n // Unix socket format: /path/to/socket database_name\n if (str.charAt(0) === '/') {\n const parts = str.split(' ');\n return parts[1] || null;\n }\n\n // Encode spaces if present\n if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) {\n str = encodeURI(str).replace(/%25(\\d\\d)/g, '%$1');\n }\n\n let result: URL;\n try {\n result = new URL(str, 'postgres://base');\n } catch {\n // Try with dummy host for malformed URLs\n try {\n result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base');\n } catch {\n return null;\n }\n }\n\n // Socket protocol: socket://path?db=dbname\n if (result.protocol === 'socket:') {\n return result.searchParams.get('db');\n }\n\n // Standard URL: postgres://user:pass@host:port/database\n const pathname = result.pathname.slice(1) || null;\n return pathname ? decodeURI(pathname) : null;\n}\n","import { exists, SQL, type SQLExecutor } from '../../../../core';\nexport * from './schema';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = ${tableName}\n ) AS exists;`;\n\nexport const tableExists = async (\n execute: SQLExecutor,\n tableName: string,\n): Promise<boolean> => exists(execute.query(tableExistsSQL(tableName)));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT FROM pg_proc\n WHERE\n proname = ${functionName}\n ) AS exists;`;\n\nexport const functionExists = async (\n execute: SQLExecutor,\n functionName: string,\n): Promise<boolean> => exists(execute.query(functionExistsSQL(functionName)));\n","import type { DatabaseMetadata } from '../../../../core';\nimport { parseDatabaseName } from '../connections';\nimport {\n defaultPostgreSqlDatabase,\n functionExists,\n tableExists,\n} from './schema';\n\nexport const postgreSQLMetadata: DatabaseMetadata<true, true, true> = {\n databaseType: 'PostgreSQL',\n defaultDatabaseName: defaultPostgreSqlDatabase,\n capabilities: {\n supportsSchemas: true,\n supportsFunctions: true,\n supportsMultipleDatabases: true,\n },\n tableExists,\n functionExists,\n parseDatabaseName: (connectionString?: string) =>\n (connectionString ? parseDatabaseName(connectionString) : null) ??\n defaultPostgreSqlDatabase,\n};\n\ndumboDatabaseMetadataRegistry.register('PostgreSQL', postgreSQLMetadata);\n"],"mappings":";;;AAEA,MAAa,oCACX;AAOF,MAAa,8BACX,qBAC+B;AAC/B,KACE,CAAC,iBAAiB,WAAW,gBAAgB,IAC7C,CAAC,iBAAiB,WAAW,cAAc,CAE3C,OAAM,IAAI,MACR,yCAAyC,iBAAiB,yCAC3D;AAEH,QAAO;;;;;AAST,SAAgB,kBAAkB,KAA4B;AAE5D,KAAI,IAAI,OAAO,EAAE,KAAK,IAEpB,QADc,IAAI,MAAM,IAAI,CACf,MAAM;AAIrB,KAAI,mCAAmC,KAAK,IAAI,CAC9C,OAAM,UAAU,IAAI,CAAC,QAAQ,cAAc,MAAM;CAGnD,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,KAAK,kBAAkB;SAClC;AAEN,MAAI;AACF,YAAS,IAAI,IAAI,IAAI,QAAQ,MAAM,gBAAgB,EAAE,kBAAkB;UACjE;AACN,UAAO;;;AAKX,KAAI,OAAO,aAAa,UACtB,QAAO,OAAO,aAAa,IAAI,KAAK;CAItC,MAAM,WAAW,OAAO,SAAS,MAAM,EAAE,IAAI;AAC7C,QAAO,WAAW,UAAU,SAAS,GAAG;;;;;AC1D1C,MAAa,4BAA4B;AAEzC,MAAa,kBAAkB,cAC7B,gBAAG;;;wBAGmB,UAAU;;AAGlC,MAAa,cAAc,OACzB,SACA,cACqBA,oBAAO,QAAQ,MAAM,eAAe,UAAU,CAAC,CAAC;AAEvE,MAAa,qBAAqB,iBAChC,gBAAG;;;;oBAIe,aAAa;;AAGjC,MAAa,iBAAiB,OAC5B,SACA,iBACqBA,oBAAO,QAAQ,MAAM,kBAAkB,aAAa,CAAC,CAAC;;;;ACpB7E,MAAa,qBAAyD;CACpE,cAAc;CACd,qBAAqB;CACrB,cAAc;EACZ,iBAAiB;EACjB,mBAAmB;EACnB,2BAA2B;EAC5B;CACD;CACA;CACA,oBAAoB,sBACjB,mBAAmB,kBAAkB,iBAAiB,GAAG;CAE7D;AAED,8BAA8B,SAAS,cAAc,mBAAmB"}
1
+ {"version":3,"file":"postgreSQLMetadata-WGXySO7a.cjs","names":["exists"],"sources":["../src/storage/postgresql/core/connections/connectionString.ts","../src/storage/postgresql/core/schema/schema.ts","../src/storage/postgresql/core/schema/postgreSQLMetadata.ts"],"sourcesContent":["import type { DatabaseConnectionString } from '../../../all';\n\nexport const defaultPostgreSQLConnectionString: PostgreSQLConnectionString =\n 'postgresql://postgres@localhost:5432/postgres' as PostgreSQLConnectionString;\n\nexport type PostgreSQLConnectionString = DatabaseConnectionString<\n 'PostgreSQL',\n `postgresql://${string}` | `postgres://${string}`\n>;\n\nexport const PostgreSQLConnectionString = (\n connectionString: string,\n): PostgreSQLConnectionString => {\n if (\n !connectionString.startsWith('postgresql://') &&\n !connectionString.startsWith('postgres://')\n ) {\n throw new Error(\n `Invalid PostgreSQL connection string: ${connectionString}. It should start with \"postgresql://\".`,\n );\n }\n return connectionString as PostgreSQLConnectionString;\n};\n\n// Stripped from https://github.com/brianc/node-postgres\n// Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)\n// MIT License\n/**\n * Parse database name from a PostgreSQL connection string\n */\nexport function parseDatabaseName(str: string): string | null {\n // Unix socket format: /path/to/socket database_name\n if (str.charAt(0) === '/') {\n const parts = str.split(' ');\n return parts[1] || null;\n }\n\n // Encode spaces if present\n if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) {\n str = encodeURI(str).replace(/%25(\\d\\d)/g, '%$1');\n }\n\n let result: URL;\n try {\n result = new URL(str, 'postgres://base');\n } catch {\n // Try with dummy host for malformed URLs\n try {\n result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base');\n } catch {\n return null;\n }\n }\n\n // Socket protocol: socket://path?db=dbname\n if (result.protocol === 'socket:') {\n return result.searchParams.get('db');\n }\n\n // Standard URL: postgres://user:pass@host:port/database\n const pathname = result.pathname.slice(1) || null;\n return pathname ? decodeURI(pathname) : null;\n}\n","import { exists, SQL, type SQLExecutor } from '../../../../core';\nexport * from './schema';\n\nexport const defaultPostgreSqlDatabase = 'postgres';\n\nexport const tableExistsSQL = (tableName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE tablename = ${tableName}\n ) AS exists;`;\n\nexport const tableExists = async (\n execute: SQLExecutor,\n tableName: string,\n): Promise<boolean> => exists(execute.query(tableExistsSQL(tableName)));\n\nexport const functionExistsSQL = (functionName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT FROM pg_proc\n WHERE\n proname = ${functionName}\n ) AS exists;`;\n\nexport const functionExists = async (\n execute: SQLExecutor,\n functionName: string,\n): Promise<boolean> => exists(execute.query(functionExistsSQL(functionName)));\n","import type { DatabaseMetadata } from '../../../../core';\nimport { parseDatabaseName } from '../connections';\nimport {\n defaultPostgreSqlDatabase,\n functionExists,\n tableExists,\n} from './schema';\n\nexport const postgreSQLMetadata: DatabaseMetadata<true, true, true> = {\n databaseType: 'PostgreSQL',\n defaultDatabaseName: defaultPostgreSqlDatabase,\n capabilities: {\n supportsSchemas: true,\n supportsFunctions: true,\n supportsMultipleDatabases: true,\n },\n tableExists,\n functionExists,\n parseDatabaseName: (connectionString?: string) =>\n (connectionString ? parseDatabaseName(connectionString) : null) ??\n defaultPostgreSqlDatabase,\n};\n\ndumboDatabaseMetadataRegistry.register('PostgreSQL', postgreSQLMetadata);\n"],"mappings":";;;AAEA,MAAa,oCACX;AAOF,MAAa,8BACX,qBAC+B;AAC/B,KACE,CAAC,iBAAiB,WAAW,gBAAgB,IAC7C,CAAC,iBAAiB,WAAW,cAAc,CAE3C,OAAM,IAAI,MACR,yCAAyC,iBAAiB,yCAC3D;AAEH,QAAO;;;;;AAST,SAAgB,kBAAkB,KAA4B;AAE5D,KAAI,IAAI,OAAO,EAAE,KAAK,IAEpB,QADc,IAAI,MAAM,IACZ,CAAC,MAAM;AAIrB,KAAI,mCAAmC,KAAK,IAAI,CAC9C,OAAM,UAAU,IAAI,CAAC,QAAQ,cAAc,MAAM;CAGnD,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,KAAK,kBAAkB;SAClC;AAEN,MAAI;AACF,YAAS,IAAI,IAAI,IAAI,QAAQ,MAAM,gBAAgB,EAAE,kBAAkB;UACjE;AACN,UAAO;;;AAKX,KAAI,OAAO,aAAa,UACtB,QAAO,OAAO,aAAa,IAAI,KAAK;CAItC,MAAM,WAAW,OAAO,SAAS,MAAM,EAAE,IAAI;AAC7C,QAAO,WAAW,UAAU,SAAS,GAAG;;;;;AC1D1C,MAAa,4BAA4B;AAEzC,MAAa,kBAAkB,cAC7B,gBAAG;;;wBAGmB,UAAU;;AAGlC,MAAa,cAAc,OACzB,SACA,cACqBA,oBAAO,QAAQ,MAAM,eAAe,UAAU,CAAC,CAAC;AAEvE,MAAa,qBAAqB,iBAChC,gBAAG;;;;oBAIe,aAAa;;AAGjC,MAAa,iBAAiB,OAC5B,SACA,iBACqBA,oBAAO,QAAQ,MAAM,kBAAkB,aAAa,CAAC,CAAC;;;;ACpB7E,MAAa,qBAAyD;CACpE,cAAc;CACd,qBAAqB;CACrB,cAAc;EACZ,iBAAiB;EACjB,mBAAmB;EACnB,2BAA2B;EAC5B;CACD;CACA;CACA,oBAAoB,sBACjB,mBAAmB,kBAAkB,iBAAiB,GAAG;CAE7D;AAED,8BAA8B,SAAS,cAAc,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite3.cjs","names":["parsePragmasFromConnectionString","DEFAULT_SQLITE_PRAGMA_OPTIONS","InMemorySQLiteDatabase","DEFAULT_SQLITE_PRAGMA_OPTIONS","mapSqliteError","sqliteFormatter","BatchCommandNoChangesError","sqliteConnection","createSingletonConnectionPool","TaskProcessor","AsyncLocalStorage","guardInitializedOnce","mapSqliteError","createBoundedConnectionPool","sqlitePool","toSqlitePoolOptions","JSONSerializer","isInMemoryDatabase","SQLiteConnectionString","sqliteFormatter","DefaultSQLiteMigratorOptions","canHandleDriverWithConnectionString","sqliteMetadata"],"sources":["../src/storage/sqlite/core/connections/pragmas.ts","../src/storage/sqlite/sqlite3/connections/connection.ts","../src/storage/sqlite/sqlite3/pool/singletonPool.ts","../src/storage/sqlite/sqlite3/pool/dualPool.ts","../src/storage/sqlite/sqlite3/index.ts"],"sourcesContent":["import { parsePragmasFromConnectionString } from './connectionString';\nimport {\n DEFAULT_SQLITE_PRAGMA_OPTIONS,\n type SQLitePragmaOptions,\n} from './index';\n\nexport const mergePragmaOptions = (\n connectionString: string,\n userOptions?: Partial<SQLitePragmaOptions>,\n): SQLitePragmaOptions => {\n const connectionStringPragmas =\n parsePragmasFromConnectionString(connectionString);\n\n return {\n ...DEFAULT_SQLITE_PRAGMA_OPTIONS,\n ...connectionStringPragmas,\n ...userOptions,\n };\n};\n\nexport const buildConnectionPragmaStatements = (\n pragmas: SQLitePragmaOptions,\n): Array<{ pragma: string; value: string | number }> => [\n // busy_timeout FIRST - enables waiting on locks for subsequent operations\n { pragma: 'busy_timeout', value: pragmas.busy_timeout! },\n { pragma: 'synchronous', value: pragmas.synchronous! },\n { pragma: 'cache_size', value: pragmas.cache_size! },\n { pragma: 'foreign_keys', value: pragmas.foreign_keys ? 'ON' : 'OFF' },\n { pragma: 'temp_store', value: pragmas.temp_store! },\n ...(pragmas.mmap_size !== undefined\n ? [{ pragma: 'mmap_size', value: pragmas.mmap_size }]\n : []),\n];\n\nexport const buildDatabasePragmaStatements = (\n pragmas: SQLitePragmaOptions,\n): Array<{ pragma: string; value: string | number }> => [\n { pragma: 'journal_mode', value: pragmas.journal_mode! },\n];\n","import sqlite3 from 'sqlite3';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n BatchCommandNoChangesError,\n SQL,\n type Connection,\n type QueryResult,\n type QueryResultRow,\n type SQLQueryOptions,\n} from '../../../../core';\nimport type {\n SQLiteClient,\n SQLiteClientOrPoolClient,\n SQLiteConnectionOptions,\n SQLiteDriverType,\n SQLiteFileNameOrConnectionString,\n SQLiteTransaction,\n SQLiteTransactionOptions,\n} from '../../core';\nimport {\n DEFAULT_SQLITE_PRAGMA_OPTIONS,\n InMemorySQLiteDatabase,\n sqliteConnection,\n type BatchSQLiteCommandOptions,\n type SQLiteClientOptions,\n type SQLiteCommandOptions,\n type SQLiteParameters,\n} from '../../core/connections';\nimport {\n buildConnectionPragmaStatements,\n buildDatabasePragmaStatements,\n mergePragmaOptions,\n} from '../../core/connections/pragmas';\nimport { mapSqliteError } from '../../core/errors/errorMapper';\nimport { sqliteFormatter } from '../../core/sql/formatter';\n\nexport type SQLite3DriverType = SQLiteDriverType<'sqlite3'>;\nexport const SQLite3DriverType: SQLite3DriverType = 'SQLite:sqlite3';\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nconst hasReturningClause = (sql: string): boolean => /\\bRETURNING\\b/i.test(sql);\n\nexport type SQLite3ClientOptions = SQLiteClientOptions &\n SQLiteFileNameOrConnectionString;\n\nexport type SQLite3Client = SQLiteClientOrPoolClient;\n\nexport type SQLite3ConnectionOptions = SQLiteConnectionOptions &\n ((SQLite3ClientOptions & { client?: never }) | { client: SQLite3Client });\n\nexport type SQLite3Connection<\n ClientType extends SQLiteClientOrPoolClient = SQLiteClientOrPoolClient,\n> = Connection<\n SQLite3Connection,\n SQLite3DriverType,\n ClientType,\n SQLiteTransaction<SQLite3Connection, SQLiteTransactionOptions>\n>;\n\nconst applyPragma = (\n database: sqlite3.Database,\n pragma: string,\n value: string | number,\n) => {\n return new Promise<void>((resolve, reject) => {\n database.run(`PRAGMA ${pragma} = ${value};`, (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n};\n\nconst queryPragma = (\n database: sqlite3.Database,\n pragma: string,\n): Promise<string> =>\n new Promise((resolve, reject) => {\n database.get(\n `PRAGMA ${pragma};`,\n (err: Error | null, row: { [key: string]: string } | null) => {\n if (err) reject(err);\n else resolve(row?.[pragma] ?? '');\n },\n );\n });\n\nconst applyPragmas = (\n database: sqlite3.Database,\n pragmas: Array<{ pragma: string; value: string | number }>,\n) =>\n pragmas.reduce(\n (promise, { pragma, value }) =>\n promise.then(() => applyPragma(database, pragma, value)),\n Promise.resolve(),\n );\n\nexport const sqlite3Client = (\n options: SQLite3ClientOptions & {\n serializer: JSONSerializer;\n },\n): SQLiteClient => {\n let db: sqlite3.Database;\n\n let isClosed = false;\n\n const { serializer } = options;\n\n const connectionString =\n options.fileName ?? options.connectionString ?? InMemorySQLiteDatabase;\n\n const finalPragmas = mergePragmaOptions(\n String(connectionString),\n options.pragmaOptions,\n );\n\n const connectionPragmas = buildConnectionPragmaStatements(finalPragmas);\n\n const connect: () => Promise<void> = () =>\n db\n ? Promise.resolve()\n : new Promise((resolve, reject) => {\n try {\n db = new sqlite3.Database(\n connectionString,\n sqlite3.OPEN_URI | sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE,\n (err) => {\n if (err) {\n reject(err);\n return;\n }\n\n const busyTimeout =\n finalPragmas.busy_timeout ??\n DEFAULT_SQLITE_PRAGMA_OPTIONS.busy_timeout!;\n\n db.configure('busyTimeout', busyTimeout);\n\n applyPragmas(\n db,\n connectionPragmas.filter((p) => p.pragma !== 'busy_timeout'),\n )\n .then(async () => {\n if (options.skipDatabasePragmas) return;\n\n const databasePragmas =\n buildDatabasePragmaStatements(finalPragmas);\n for (const { pragma, value } of databasePragmas) {\n const current = await queryPragma(db, pragma);\n if (\n current.toUpperCase() !== String(value).toUpperCase()\n ) {\n await applyPragma(db, pragma, value);\n }\n }\n })\n .then(() => resolve())\n .catch(reject);\n },\n );\n\n // Apply connection-level pragmas first (busy_timeout is first)\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n\n const executeQuery = <T>(\n sql: string,\n params?: SQLiteParameters[],\n ): Promise<T[]> =>\n new Promise((resolve, reject) => {\n try {\n db.all(sql, params ?? [], (err: Error | null, result: T[]) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve(result);\n });\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n\n const executeCommand = <Result extends QueryResultRow = QueryResultRow>(\n sql: string,\n params?: SQLiteParameters[],\n options?: SQLiteCommandOptions,\n ): Promise<QueryResult<Result>> =>\n new Promise((resolve, reject) => {\n try {\n if (options?.ignoreChangesCount === true) {\n db.run(\n sql,\n params ?? [],\n function (err: Error | null, rows: Result[]) {\n if (err) {\n reject(err);\n return;\n }\n resolve({\n rowCount: 0,\n rows: rows ?? [],\n });\n },\n );\n return;\n }\n\n if (hasReturningClause(sql)) {\n db.all(sql, params ?? [], (err, rows: Result[]) => {\n if (err) return reject(err);\n resolve({ rowCount: rows.length, rows });\n });\n return;\n }\n\n // OD: 2026-01-21\n // This is needed as SQLite does not return changes count properly\n // We need to query it separately with SELECT changes()\n // This may be fixed eventually in sqlite3 library as Node.js team did here:\n // https://github.com/nodejs/node/issues/57344\n // But for now, we do it manually, as a workaround\n // We also serialize it to avoid race conditions\n db.serialize(() => {\n let hasFailed = false;\n let resultRows: Result[] = [];\n\n db.all(sql, params ?? [], (err, rows: Result[]) => {\n if (err) {\n hasFailed = true;\n return reject(err);\n }\n resultRows = rows;\n });\n\n db.get(\n 'SELECT changes() as changes',\n (err, row: { changes: number } | null) => {\n // If the first query failed, we exit immediately.\n // The promise is already rejected; we don't want to touch it.\n if (hasFailed) return;\n\n if (err) return reject(err);\n\n resolve({\n rowCount: row?.changes ?? 0,\n rows: resultRows,\n });\n },\n );\n });\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n\n return {\n connect,\n close: async (): Promise<void> => {\n if (isClosed) {\n return;\n }\n isClosed = true;\n if (db) {\n try {\n await new Promise<void>((resolve, reject) => {\n db.close((err: Error | null) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n });\n } catch (error) {\n throw mapSqliteError(error);\n }\n }\n },\n query: async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n _options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>> => {\n try {\n const { query, params } = sqliteFormatter.format(sql, {\n serializer,\n });\n const result = await executeQuery<Result>(\n query,\n params as SQLiteParameters[],\n );\n return { rowCount: result.length, rows: result };\n } catch (error) {\n throw mapSqliteError(error);\n }\n },\n batchQuery: async <Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n _options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n const results: QueryResult<Result>[] = [];\n for (const sql of sqls) {\n const { query, params } = sqliteFormatter.format(sql, {\n serializer,\n });\n const result = await executeQuery<Result>(\n query,\n params as SQLiteParameters[],\n );\n results.push({ rowCount: result.length, rows: result });\n }\n return results;\n } catch (error) {\n throw mapSqliteError(error);\n }\n },\n command: async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLiteCommandOptions,\n ): Promise<QueryResult<Result>> => {\n try {\n const { query, params } = sqliteFormatter.format(sql, {\n serializer,\n });\n\n return await executeCommand<Result>(\n query,\n params as SQLiteParameters[],\n options,\n );\n } catch (error) {\n throw mapSqliteError(error);\n }\n },\n batchCommand: async <Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: BatchSQLiteCommandOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n const results: QueryResult<Result>[] = [];\n\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = sqliteFormatter.format(sqls[i]!, {\n serializer,\n });\n const result = await executeCommand<Result>(\n query,\n params as SQLiteParameters[],\n options,\n );\n results.push(result);\n\n if (options?.assertChanges && (result.rowCount ?? 0) === 0) {\n throw new BatchCommandNoChangesError(i);\n }\n }\n return results;\n } catch (error) {\n throw mapSqliteError(error);\n }\n },\n };\n};\n\nexport const checkConnection = async (\n fileName: string,\n serializer: JSONSerializer,\n): Promise<ConnectionCheckResult> => {\n const client = sqlite3Client({\n fileName,\n serializer,\n });\n\n try {\n await client.query(SQL`SELECT 1`);\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'SQLITE_CANTOPEN'\n ? 'ConnectionRefused'\n : code === 'SQLITE_AUTH'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n await client.close();\n }\n};\n\nexport const sqlite3Connection = (\n options: SQLite3ConnectionOptions & { serializer: JSONSerializer },\n) =>\n sqliteConnection<SQLite3Connection, SQLite3ConnectionOptions>({\n type: 'Client',\n driverType: SQLite3DriverType,\n sqliteClientFactory: (connectionOptions) => {\n if ('client' in connectionOptions && connectionOptions.client) {\n return connectionOptions.client;\n }\n return sqlite3Client({\n ...connectionOptions,\n serializer: options.serializer,\n });\n },\n connectionOptions: options,\n serializer: options.serializer,\n });\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createSingletonConnectionPool,\n type ConnectionPool,\n} from '../../../../core';\nimport { TaskProcessor } from '../../../../core/taskProcessing';\nimport type { AnySQLiteConnection } from '../../core';\n\nexport type SQLite3SingletonPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection,\n> = {\n driverType: SQLiteConnectionType['driverType'];\n getConnection: () => SQLiteConnectionType | Promise<SQLiteConnectionType>;\n closeConnection?: (connection: SQLiteConnectionType) => void | Promise<void>;\n maxQueueSize?: number;\n};\n\n// Creates a singleton-connection pool whose callers serialise through a\n// single-slot TaskProcessor. An AsyncLocalStorage flag lets re-entrant calls\n// (made from inside an active task on this pool) bypass the queue instead of\n// deadlocking — that's the path emmett relies on when a workflow handler\n// internally calls back through the same pool (e.g. messageStore.appendToStream).\nexport const sqlite3SingletonPool = <\n SQLiteConnectionType extends AnySQLiteConnection,\n>(\n options: SQLite3SingletonPoolOptions<SQLiteConnectionType>,\n): ConnectionPool<SQLiteConnectionType> => {\n const inner = createSingletonConnectionPool<SQLiteConnectionType>({\n driverType: options.driverType,\n getConnection: options.getConnection,\n ...(options.closeConnection\n ? { closeConnection: options.closeConnection }\n : {}),\n });\n\n const taskProcessor = new TaskProcessor({\n maxActiveTasks: 1,\n maxQueueSize: options.maxQueueSize ?? 1000,\n });\n const insideWriterTask = new AsyncLocalStorage<true>();\n\n const enqueue = <Result>(op: () => Promise<Result>): Promise<Result> => {\n if (insideWriterTask.getStore() === true) {\n return op();\n }\n return taskProcessor.enqueue(({ ack }) =>\n insideWriterTask.run(true, async () => {\n try {\n return await op();\n } finally {\n ack();\n }\n }),\n );\n };\n\n return {\n driverType: inner.driverType,\n connection: inner.connection.bind(inner),\n transaction: inner.transaction.bind(inner),\n withConnection: (handle, connectionOptions) =>\n enqueue(() => inner.withConnection(handle, connectionOptions)),\n withTransaction: (handle, transactionOptions) =>\n enqueue(() => inner.withTransaction(handle, transactionOptions)),\n execute: {\n query: (sql, queryOptions) =>\n enqueue(() => inner.execute.query(sql, queryOptions)),\n batchQuery: (sqls, queryOptions) =>\n enqueue(() => inner.execute.batchQuery(sqls, queryOptions)),\n command: (sql, commandOptions) =>\n enqueue(() => inner.execute.command(sql, commandOptions)),\n batchCommand: (sqls, commandOptions) =>\n enqueue(() => inner.execute.batchCommand(sqls, commandOptions)),\n },\n close: async () => {\n await taskProcessor.stop();\n await inner.close();\n },\n };\n};\n","import { cpus } from 'os';\nimport { createBoundedConnectionPool } from '../../../../core';\nimport { guardInitializedOnce } from '../../../../core/taskProcessing';\nimport type {\n AnySQLiteConnection,\n SQLiteConnectionFactory,\n SQLiteConnectionOptions,\n SQLitePool,\n} from '../../core';\nimport { mapSqliteError } from '../../core/errors';\nimport { sqlite3SingletonPool } from './singletonPool';\n\nexport type SQLiteDualPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions,\n> = {\n driverType: SQLiteConnectionType['driverType'];\n dual?: true;\n singleton?: false;\n pooled?: true;\n connection?: never;\n readerPoolSize?: number;\n sqliteConnectionFactory: SQLiteConnectionFactory<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n connectionOptions?: ConnectionOptions;\n};\n\nexport const sqliteDualConnectionPool = <\n SQLiteConnectionType extends AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions,\n>(\n options: SQLiteDualPoolOptions<SQLiteConnectionType, ConnectionOptions>,\n): SQLitePool<SQLiteConnectionType> => {\n const { sqliteConnectionFactory, connectionOptions } = options;\n const readerPoolSize = options.readerPoolSize ?? Math.max(4, cpus().length);\n\n let databaseInitPromise: Promise<void> | null = null;\n\n const guardSingleConnection = guardInitializedOnce(async () => {\n if (databaseInitPromise !== null) {\n return databaseInitPromise;\n }\n\n const initConnection = sqliteConnectionFactory({\n ...connectionOptions,\n skipDatabasePragmas: false,\n readonly: false,\n } as ConnectionOptions);\n\n const initPromise = initConnection.open();\n databaseInitPromise = initPromise;\n\n try {\n await initPromise;\n await initConnection.close();\n } catch (error) {\n databaseInitPromise = null;\n await initConnection.close();\n throw mapSqliteError(error);\n }\n });\n\n const ensureDatabaseInitialized = async (): Promise<void> => {\n if (databaseInitPromise !== null) {\n return databaseInitPromise;\n }\n\n return guardSingleConnection.ensureInitialized();\n };\n\n const wrappedConnectionFactory = async (\n readonly: boolean,\n connectionOptions: ConnectionOptions | undefined,\n ): Promise<SQLiteConnectionType> => {\n await ensureDatabaseInitialized();\n\n const connection = sqliteConnectionFactory({\n ...connectionOptions,\n skipDatabasePragmas: true,\n readonly,\n } as ConnectionOptions);\n\n await connection.open();\n\n return connection;\n };\n\n const writerPool = sqlite3SingletonPool<SQLiteConnectionType>({\n driverType: options.driverType,\n getConnection: () => wrappedConnectionFactory(false, connectionOptions),\n });\n\n const readerPool = createBoundedConnectionPool({\n driverType: options.driverType,\n getConnection: () => wrappedConnectionFactory(true, connectionOptions),\n maxConnections: readerPoolSize,\n });\n\n return {\n driverType: options.driverType,\n connection: (connectionOptions) =>\n connectionOptions?.readonly\n ? readerPool.connection(connectionOptions)\n : writerPool.connection(connectionOptions),\n execute: {\n query: (...args) => readerPool.execute.query(...args),\n batchQuery: (...args) => readerPool.execute.batchQuery(...args),\n command: (...args) => writerPool.execute.command(...args),\n batchCommand: (...args) => writerPool.execute.batchCommand(...args),\n },\n withConnection: (handle, connectionOptions) =>\n connectionOptions?.readonly\n ? readerPool.withConnection(handle, connectionOptions)\n : writerPool.withConnection(handle, connectionOptions),\n transaction: writerPool.transaction,\n withTransaction: writerPool.withTransaction,\n close: async () => {\n await guardSingleConnection.stop();\n await Promise.all([writerPool.close(), readerPool.close()]);\n },\n };\n};\n","export * from './connections';\nimport {\n canHandleDriverWithConnectionString,\n dumboDatabaseDriverRegistry,\n JSONSerializer,\n type DumboConnectionOptions,\n type DumboDatabaseDriver,\n} from '../../../core';\nimport {\n DefaultSQLiteMigratorOptions,\n isInMemoryDatabase,\n SQLiteConnectionString,\n sqliteFormatter,\n sqliteMetadata,\n sqlitePool,\n toSqlitePoolOptions,\n type SQLitePool,\n type SQLitePoolOptions,\n} from '../core';\nimport {\n sqlite3Connection,\n SQLite3DriverType,\n type SQLite3Connection,\n type SQLite3ConnectionOptions,\n} from './connections';\nimport { sqliteDualConnectionPool } from './pool/dualPool';\nimport { sqlite3SingletonPool } from './pool/singletonPool';\n\nexport type SQLite3DumboOptions = Omit<\n SQLitePoolOptions<SQLite3Connection, SQLite3ConnectionOptions>,\n 'driverType'\n> &\n SQLite3ConnectionOptions & { serializer?: JSONSerializer };\n\nexport type SQLite3PoolOptions = SQLite3DumboOptions;\n\nexport type Sqlite3Pool = SQLitePool<SQLite3Connection>;\n\nexport const sqlite3Pool = (\n options: SQLite3DumboOptions,\n): SQLitePool<SQLite3Connection> => {\n // Ambient: caller-managed connection. No acquisition, no serialisation.\n if ('connection' in options && options.connection) {\n return sqlitePool(\n toSqlitePoolOptions({\n ...options,\n driverType: SQLite3DriverType,\n }),\n );\n }\n\n const sqliteConnectionFactory = (opts: SQLite3ConnectionOptions) =>\n sqlite3Connection({\n ...opts,\n serializer: options.serializer ?? JSONSerializer,\n });\n\n // Singleton-shaped: in-memory DBs, an explicit client, or `singleton: true`.\n // One connection shared across callers — wrap it so concurrent callers\n // serialise through a single-slot TaskProcessor with ALS-based reentrancy.\n const isSingleton =\n isInMemoryDatabase(options) ||\n ('client' in options && Boolean(options.client)) ||\n options.singleton === true;\n\n if (isSingleton) {\n return sqlite3SingletonPool<SQLite3Connection>({\n driverType: SQLite3DriverType,\n getConnection: () => sqliteConnectionFactory(options),\n });\n }\n\n // Default: file-backed dual pool. Its writer side is serialised inside\n // sqliteDualConnectionPool via the same primitive.\n const readerPoolSize = (options as { readerPoolSize?: number })\n .readerPoolSize;\n return sqliteDualConnectionPool({\n driverType: SQLite3DriverType,\n sqliteConnectionFactory,\n connectionOptions: options,\n ...(readerPoolSize !== undefined ? { readerPoolSize } : {}),\n });\n};\n\nconst tryParseConnectionString = (connectionString: string) => {\n try {\n return SQLiteConnectionString(connectionString);\n } catch {\n return null;\n }\n};\n\nexport const sqlite3DumboDriver = {\n driverType: SQLite3DriverType,\n createPool: (options) => sqlite3Pool(options as SQLite3DumboOptions),\n sqlFormatter: sqliteFormatter,\n defaultMigratorOptions: DefaultSQLiteMigratorOptions,\n canHandle: canHandleDriverWithConnectionString(\n SQLite3DriverType,\n tryParseConnectionString,\n ),\n databaseMetadata: sqliteMetadata,\n} satisfies DumboDatabaseDriver<\n SQLite3Connection,\n SQLite3DumboOptions,\n Sqlite3Pool\n>;\n\nexport const useSqlite3DumboDriver = () => {\n dumboDatabaseDriverRegistry.register(SQLite3DriverType, sqlite3DumboDriver);\n};\n\nexport type SQLite3DumboConnectionOptions = DumboConnectionOptions<\n typeof sqlite3DumboDriver\n> & { connectionString: string | SQLiteConnectionString };\n\nuseSqlite3DumboDriver();\n\nexport * from './connections';\nexport * from './formatter';\nexport * from './transactions';\n"],"mappings":";;;;;;;;;;AAMA,MAAa,sBACX,kBACA,gBACwB;CACxB,MAAM,0BACJA,gDAAiC,iBAAiB;AAEpD,QAAO;EACL,GAAGC;EACH,GAAG;EACH,GAAG;EACJ;;AAGH,MAAa,mCACX,YACsD;CAEtD;EAAE,QAAQ;EAAgB,OAAO,QAAQ;EAAe;CACxD;EAAE,QAAQ;EAAe,OAAO,QAAQ;EAAc;CACtD;EAAE,QAAQ;EAAc,OAAO,QAAQ;EAAa;CACpD;EAAE,QAAQ;EAAgB,OAAO,QAAQ,eAAe,OAAO;EAAO;CACtE;EAAE,QAAQ;EAAc,OAAO,QAAQ;EAAa;CACpD,GAAI,QAAQ,cAAc,SACtB,CAAC;EAAE,QAAQ;EAAa,OAAO,QAAQ;EAAW,CAAC,GACnD,EAAE;CACP;AAED,MAAa,iCACX,YACsD,CACtD;CAAE,QAAQ;CAAgB,OAAO,QAAQ;CAAe,CACzD;;;;ACDD,MAAa,oBAAuC;AAWpD,MAAM,sBAAsB,QAAyB,iBAAiB,KAAK,IAAI;AAmB/E,MAAM,eACJ,UACA,QACA,UACG;AACH,QAAO,IAAI,SAAe,SAAS,WAAW;AAC5C,WAAS,IAAI,UAAU,OAAO,KAAK,MAAM,KAAK,QAAQ;AACpD,OAAI,IAAK,QAAO,IAAI;OACf,UAAS;IACd;GACF;;AAGJ,MAAM,eACJ,UACA,WAEA,IAAI,SAAS,SAAS,WAAW;AAC/B,UAAS,IACP,UAAU,OAAO,KAChB,KAAmB,QAA0C;AAC5D,MAAI,IAAK,QAAO,IAAI;MACf,SAAQ,MAAM,WAAW,GAAG;GAEpC;EACD;AAEJ,MAAM,gBACJ,UACA,YAEA,QAAQ,QACL,SAAS,EAAE,QAAQ,YAClB,QAAQ,WAAW,YAAY,UAAU,QAAQ,MAAM,CAAC,EAC1D,QAAQ,SAAS,CAClB;AAEH,MAAa,iBACX,YAGiB;CACjB,IAAI;CAEJ,IAAI,WAAW;CAEf,MAAM,EAAE,eAAe;CAEvB,MAAM,mBACJ,QAAQ,YAAY,QAAQ,oBAAoBC;CAElD,MAAM,eAAe,mBACnB,OAAO,iBAAiB,EACxB,QAAQ,cACT;CAED,MAAM,oBAAoB,gCAAgC,aAAa;CAEvE,MAAM,gBACJ,KACI,QAAQ,SAAS,GACjB,IAAI,SAAS,SAAS,WAAW;AAC/B,MAAI;AACF,QAAK,IAAI,gBAAQ,SACf,kBACA,gBAAQ,WAAW,gBAAQ,iBAAiB,gBAAQ,cACnD,QAAQ;AACP,QAAI,KAAK;AACP,YAAO,IAAI;AACX;;IAGF,MAAM,cACJ,aAAa,gBACbC,6CAA8B;AAEhC,OAAG,UAAU,eAAe,YAAY;AAExC,iBACE,IACA,kBAAkB,QAAQ,MAAM,EAAE,WAAW,eAAe,CAC7D,CACE,KAAK,YAAY;AAChB,SAAI,QAAQ,oBAAqB;KAEjC,MAAM,kBACJ,8BAA8B,aAAa;AAC7C,UAAK,MAAM,EAAE,QAAQ,WAAW,gBAE9B,MADgB,MAAM,YAAY,IAAI,OAAO,EAEnC,aAAa,KAAK,OAAO,MAAM,CAAC,aAAa,CAErD,OAAM,YAAY,IAAI,QAAQ,MAAM;MAGxC,CACD,WAAW,SAAS,CAAC,CACrB,MAAM,OAAO;KAEnB;WAGM,OAAO;AACd,UAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;GAEnE;CAER,MAAM,gBACJ,KACA,WAEA,IAAI,SAAS,SAAS,WAAW;AAC/B,MAAI;AACF,MAAG,IAAI,KAAK,UAAU,EAAE,GAAG,KAAmB,WAAgB;AAC5D,QAAI,KAAK;AACP,YAAO,IAAI;AACX;;AAGF,YAAQ,OAAO;KACf;WACK,OAAO;AACd,UAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;GAEnE;CAEJ,MAAM,kBACJ,KACA,QACA,YAEA,IAAI,SAAS,SAAS,WAAW;AAC/B,MAAI;AACF,OAAI,SAAS,uBAAuB,MAAM;AACxC,OAAG,IACD,KACA,UAAU,EAAE,EACZ,SAAU,KAAmB,MAAgB;AAC3C,SAAI,KAAK;AACP,aAAO,IAAI;AACX;;AAEF,aAAQ;MACN,UAAU;MACV,MAAM,QAAQ,EAAE;MACjB,CAAC;MAEL;AACD;;AAGF,OAAI,mBAAmB,IAAI,EAAE;AAC3B,OAAG,IAAI,KAAK,UAAU,EAAE,GAAG,KAAK,SAAmB;AACjD,SAAI,IAAK,QAAO,OAAO,IAAI;AAC3B,aAAQ;MAAE,UAAU,KAAK;MAAQ;MAAM,CAAC;MACxC;AACF;;AAUF,MAAG,gBAAgB;IACjB,IAAI,YAAY;IAChB,IAAI,aAAuB,EAAE;AAE7B,OAAG,IAAI,KAAK,UAAU,EAAE,GAAG,KAAK,SAAmB;AACjD,SAAI,KAAK;AACP,kBAAY;AACZ,aAAO,OAAO,IAAI;;AAEpB,kBAAa;MACb;AAEF,OAAG,IACD,gCACC,KAAK,QAAoC;AAGxC,SAAI,UAAW;AAEf,SAAI,IAAK,QAAO,OAAO,IAAI;AAE3B,aAAQ;MACN,UAAU,KAAK,WAAW;MAC1B,MAAM;MACP,CAAC;MAEL;KACD;WACK,OAAO;AACd,UAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;GAEnE;AAEJ,QAAO;EACL;EACA,OAAO,YAA2B;AAChC,OAAI,SACF;AAEF,cAAW;AACX,OAAI,GACF,KAAI;AACF,UAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,QAAG,OAAO,QAAsB;AAC9B,UAAI,KAAK;AACP,cAAO,IAAI;AACX;;AAEF,eAAS;OACT;MACF;YACK,OAAO;AACd,UAAMC,8BAAe,MAAM;;;EAIjC,OAAO,OACL,KACA,aACiC;AACjC,OAAI;IACF,MAAM,EAAE,OAAO,WAAWC,+BAAgB,OAAO,KAAK,EACpD,YACD,CAAC;IACF,MAAM,SAAS,MAAM,aACnB,OACA,OACD;AACD,WAAO;KAAE,UAAU,OAAO;KAAQ,MAAM;KAAQ;YACzC,OAAO;AACd,UAAMD,8BAAe,MAAM;;;EAG/B,YAAY,OACV,MACA,aACmC;AACnC,OAAI;IACF,MAAM,UAAiC,EAAE;AACzC,SAAK,MAAM,OAAO,MAAM;KACtB,MAAM,EAAE,OAAO,WAAWC,+BAAgB,OAAO,KAAK,EACpD,YACD,CAAC;KACF,MAAM,SAAS,MAAM,aACnB,OACA,OACD;AACD,aAAQ,KAAK;MAAE,UAAU,OAAO;MAAQ,MAAM;MAAQ,CAAC;;AAEzD,WAAO;YACA,OAAO;AACd,UAAMD,8BAAe,MAAM;;;EAG/B,SAAS,OACP,KACA,YACiC;AACjC,OAAI;IACF,MAAM,EAAE,OAAO,WAAWC,+BAAgB,OAAO,KAAK,EACpD,YACD,CAAC;AAEF,WAAO,MAAM,eACX,OACA,QACA,QACD;YACM,OAAO;AACd,UAAMD,8BAAe,MAAM;;;EAG/B,cAAc,OACZ,MACA,YACmC;AACnC,OAAI;IACF,MAAM,UAAiC,EAAE;AAEzC,SAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;KACpC,MAAM,EAAE,OAAO,WAAWC,+BAAgB,OAAO,KAAK,IAAK,EACzD,YACD,CAAC;KACF,MAAM,SAAS,MAAM,eACnB,OACA,QACA,QACD;AACD,aAAQ,KAAK,OAAO;AAEpB,SAAI,SAAS,kBAAkB,OAAO,YAAY,OAAO,EACvD,OAAM,IAAIC,wCAA2B,EAAE;;AAG3C,WAAO;YACA,OAAO;AACd,UAAMF,8BAAe,MAAM;;;EAGhC;;AAGH,MAAa,kBAAkB,OAC7B,UACA,eACmC;CACnC,MAAM,SAAS,cAAc;EAC3B;EACA;EACD,CAAC;AAEF,KAAI;AACF,QAAM,OAAO,MAAM,gBAAG,WAAW;AACjC,SAAO,EAAE,YAAY,MAAM;UACpB,OAAO;EACd,MAAM,OACJ,iBAAiB,SACjB,UAAU,SACV,OAAO,MAAM,SAAS,WAClB,MAAM,OACN;AAEN,SAAO;GACL,YAAY;GACZ,WACE,SAAS,oBACL,sBACA,SAAS,gBACP,mBACA;GACR;GACA;GACD;WACO;AACR,QAAM,OAAO,OAAO;;;AAIxB,MAAa,qBACX,YAEAG,gCAA8D;CAC5D,MAAM;CACN,YAAY;CACZ,sBAAsB,sBAAsB;AAC1C,MAAI,YAAY,qBAAqB,kBAAkB,OACrD,QAAO,kBAAkB;AAE3B,SAAO,cAAc;GACnB,GAAG;GACH,YAAY,QAAQ;GACrB,CAAC;;CAEJ,mBAAmB;CACnB,YAAY,QAAQ;CACrB,CAAC;;;;ACtZJ,MAAa,wBAGX,YACyC;CACzC,MAAM,QAAQC,2CAAoD;EAChE,YAAY,QAAQ;EACpB,eAAe,QAAQ;EACvB,GAAI,QAAQ,kBACR,EAAE,iBAAiB,QAAQ,iBAAiB,GAC5C,EAAE;EACP,CAAC;CAEF,MAAM,gBAAgB,IAAIC,2BAAc;EACtC,gBAAgB;EAChB,cAAc,QAAQ,gBAAgB;EACvC,CAAC;CACF,MAAM,mBAAmB,IAAIC,oCAAyB;CAEtD,MAAM,WAAmB,OAA+C;AACtE,MAAI,iBAAiB,UAAU,KAAK,KAClC,QAAO,IAAI;AAEb,SAAO,cAAc,SAAS,EAAE,UAC9B,iBAAiB,IAAI,MAAM,YAAY;AACrC,OAAI;AACF,WAAO,MAAM,IAAI;aACT;AACR,SAAK;;IAEP,CACH;;AAGH,QAAO;EACL,YAAY,MAAM;EAClB,YAAY,MAAM,WAAW,KAAK,MAAM;EACxC,aAAa,MAAM,YAAY,KAAK,MAAM;EAC1C,iBAAiB,QAAQ,sBACvB,cAAc,MAAM,eAAe,QAAQ,kBAAkB,CAAC;EAChE,kBAAkB,QAAQ,uBACxB,cAAc,MAAM,gBAAgB,QAAQ,mBAAmB,CAAC;EAClE,SAAS;GACP,QAAQ,KAAK,iBACX,cAAc,MAAM,QAAQ,MAAM,KAAK,aAAa,CAAC;GACvD,aAAa,MAAM,iBACjB,cAAc,MAAM,QAAQ,WAAW,MAAM,aAAa,CAAC;GAC7D,UAAU,KAAK,mBACb,cAAc,MAAM,QAAQ,QAAQ,KAAK,eAAe,CAAC;GAC3D,eAAe,MAAM,mBACnB,cAAc,MAAM,QAAQ,aAAa,MAAM,eAAe,CAAC;GAClE;EACD,OAAO,YAAY;AACjB,SAAM,cAAc,MAAM;AAC1B,SAAM,MAAM,OAAO;;EAEtB;;;;;ACjDH,MAAa,4BAIX,YACqC;CACrC,MAAM,EAAE,yBAAyB,sBAAsB;CACvD,MAAM,iBAAiB,QAAQ,kBAAkB,KAAK,IAAI,iBAAS,CAAC,OAAO;CAE3E,IAAI,sBAA4C;CAEhD,MAAM,wBAAwBC,kCAAqB,YAAY;AAC7D,MAAI,wBAAwB,KAC1B,QAAO;EAGT,MAAM,iBAAiB,wBAAwB;GAC7C,GAAG;GACH,qBAAqB;GACrB,UAAU;GACX,CAAsB;EAEvB,MAAM,cAAc,eAAe,MAAM;AACzC,wBAAsB;AAEtB,MAAI;AACF,SAAM;AACN,SAAM,eAAe,OAAO;WACrB,OAAO;AACd,yBAAsB;AACtB,SAAM,eAAe,OAAO;AAC5B,SAAMC,8BAAe,MAAM;;GAE7B;CAEF,MAAM,4BAA4B,YAA2B;AAC3D,MAAI,wBAAwB,KAC1B,QAAO;AAGT,SAAO,sBAAsB,mBAAmB;;CAGlD,MAAM,2BAA2B,OAC/B,UACA,sBACkC;AAClC,QAAM,2BAA2B;EAEjC,MAAM,aAAa,wBAAwB;GACzC,GAAG;GACH,qBAAqB;GACrB;GACD,CAAsB;AAEvB,QAAM,WAAW,MAAM;AAEvB,SAAO;;CAGT,MAAM,aAAa,qBAA2C;EAC5D,YAAY,QAAQ;EACpB,qBAAqB,yBAAyB,OAAO,kBAAkB;EACxE,CAAC;CAEF,MAAM,aAAaC,yCAA4B;EAC7C,YAAY,QAAQ;EACpB,qBAAqB,yBAAyB,MAAM,kBAAkB;EACtE,gBAAgB;EACjB,CAAC;AAEF,QAAO;EACL,YAAY,QAAQ;EACpB,aAAa,sBACX,mBAAmB,WACf,WAAW,WAAW,kBAAkB,GACxC,WAAW,WAAW,kBAAkB;EAC9C,SAAS;GACP,QAAQ,GAAG,SAAS,WAAW,QAAQ,MAAM,GAAG,KAAK;GACrD,aAAa,GAAG,SAAS,WAAW,QAAQ,WAAW,GAAG,KAAK;GAC/D,UAAU,GAAG,SAAS,WAAW,QAAQ,QAAQ,GAAG,KAAK;GACzD,eAAe,GAAG,SAAS,WAAW,QAAQ,aAAa,GAAG,KAAK;GACpE;EACD,iBAAiB,QAAQ,sBACvB,mBAAmB,WACf,WAAW,eAAe,QAAQ,kBAAkB,GACpD,WAAW,eAAe,QAAQ,kBAAkB;EAC1D,aAAa,WAAW;EACxB,iBAAiB,WAAW;EAC5B,OAAO,YAAY;AACjB,SAAM,sBAAsB,MAAM;AAClC,SAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,WAAW,OAAO,CAAC,CAAC;;EAE9D;;;;;ACpFH,MAAa,eACX,YACkC;AAElC,KAAI,gBAAgB,WAAW,QAAQ,WACrC,QAAOC,0BACLC,mCAAoB;EAClB,GAAG;EACH,YAAY;EACb,CAAC,CACH;CAGH,MAAM,2BAA2B,SAC/B,kBAAkB;EAChB,GAAG;EACH,YAAY,QAAQ,cAAcC;EACnC,CAAC;AAUJ,KAJEC,kCAAmB,QAAQ,IAC1B,YAAY,WAAW,QAAQ,QAAQ,OAAO,IAC/C,QAAQ,cAAc,KAGtB,QAAO,qBAAwC;EAC7C,YAAY;EACZ,qBAAqB,wBAAwB,QAAQ;EACtD,CAAC;CAKJ,MAAM,iBAAkB,QACrB;AACH,QAAO,yBAAyB;EAC9B,YAAY;EACZ;EACA,mBAAmB;EACnB,GAAI,mBAAmB,SAAY,EAAE,gBAAgB,GAAG,EAAE;EAC3D,CAAC;;AAGJ,MAAM,4BAA4B,qBAA6B;AAC7D,KAAI;AACF,SAAOC,sCAAuB,iBAAiB;SACzC;AACN,SAAO;;;AAIX,MAAa,qBAAqB;CAChC,YAAY;CACZ,aAAa,YAAY,YAAY,QAA+B;CACpE,cAAcC;CACd,wBAAwBC;CACxB,WAAWC,iDACT,mBACA,yBACD;CACD,kBAAkBC;CACnB;AAMD,MAAa,8BAA8B;AACzC,0CAA4B,SAAS,mBAAmB,mBAAmB;;AAO7E,uBAAuB"}
1
+ {"version":3,"file":"sqlite3.cjs","names":["parsePragmasFromConnectionString","DEFAULT_SQLITE_PRAGMA_OPTIONS","InMemorySQLiteDatabase","DEFAULT_SQLITE_PRAGMA_OPTIONS","mapSqliteError","sqliteFormatter","BatchCommandNoChangesError","sqliteConnection","createSingletonConnectionPool","TaskProcessor","AsyncLocalStorage","guardInitializedOnce","mapSqliteError","createBoundedConnectionPool","sqlitePool","toSqlitePoolOptions","JSONSerializer","isInMemoryDatabase","SQLiteConnectionString","sqliteFormatter","DefaultSQLiteMigratorOptions","canHandleDriverWithConnectionString","sqliteMetadata"],"sources":["../src/storage/sqlite/core/connections/pragmas.ts","../src/storage/sqlite/sqlite3/connections/connection.ts","../src/storage/sqlite/sqlite3/pool/singletonPool.ts","../src/storage/sqlite/sqlite3/pool/dualPool.ts","../src/storage/sqlite/sqlite3/index.ts"],"sourcesContent":["import { parsePragmasFromConnectionString } from './connectionString';\nimport {\n DEFAULT_SQLITE_PRAGMA_OPTIONS,\n type SQLitePragmaOptions,\n} from './index';\n\nexport const mergePragmaOptions = (\n connectionString: string,\n userOptions?: Partial<SQLitePragmaOptions>,\n): SQLitePragmaOptions => {\n const connectionStringPragmas =\n parsePragmasFromConnectionString(connectionString);\n\n return {\n ...DEFAULT_SQLITE_PRAGMA_OPTIONS,\n ...connectionStringPragmas,\n ...userOptions,\n };\n};\n\nexport const buildConnectionPragmaStatements = (\n pragmas: SQLitePragmaOptions,\n): Array<{ pragma: string; value: string | number }> => [\n // busy_timeout FIRST - enables waiting on locks for subsequent operations\n { pragma: 'busy_timeout', value: pragmas.busy_timeout! },\n { pragma: 'synchronous', value: pragmas.synchronous! },\n { pragma: 'cache_size', value: pragmas.cache_size! },\n { pragma: 'foreign_keys', value: pragmas.foreign_keys ? 'ON' : 'OFF' },\n { pragma: 'temp_store', value: pragmas.temp_store! },\n ...(pragmas.mmap_size !== undefined\n ? [{ pragma: 'mmap_size', value: pragmas.mmap_size }]\n : []),\n];\n\nexport const buildDatabasePragmaStatements = (\n pragmas: SQLitePragmaOptions,\n): Array<{ pragma: string; value: string | number }> => [\n { pragma: 'journal_mode', value: pragmas.journal_mode! },\n];\n","import sqlite3 from 'sqlite3';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n BatchCommandNoChangesError,\n SQL,\n type Connection,\n type QueryResult,\n type QueryResultRow,\n type SQLQueryOptions,\n} from '../../../../core';\nimport type {\n SQLiteClient,\n SQLiteClientOrPoolClient,\n SQLiteConnectionOptions,\n SQLiteDriverType,\n SQLiteFileNameOrConnectionString,\n SQLiteTransaction,\n SQLiteTransactionOptions,\n} from '../../core';\nimport {\n DEFAULT_SQLITE_PRAGMA_OPTIONS,\n InMemorySQLiteDatabase,\n sqliteConnection,\n type BatchSQLiteCommandOptions,\n type SQLiteClientOptions,\n type SQLiteCommandOptions,\n type SQLiteParameters,\n} from '../../core/connections';\nimport {\n buildConnectionPragmaStatements,\n buildDatabasePragmaStatements,\n mergePragmaOptions,\n} from '../../core/connections/pragmas';\nimport { mapSqliteError } from '../../core/errors/errorMapper';\nimport { sqliteFormatter } from '../../core/sql/formatter';\n\nexport type SQLite3DriverType = SQLiteDriverType<'sqlite3'>;\nexport const SQLite3DriverType: SQLite3DriverType = 'SQLite:sqlite3';\n\nexport type ConnectionCheckResult =\n | { successful: true }\n | {\n successful: false;\n code: string | undefined;\n errorType: 'ConnectionRefused' | 'Authentication' | 'Unknown';\n error: unknown;\n };\n\nconst hasReturningClause = (sql: string): boolean => /\\bRETURNING\\b/i.test(sql);\n\nexport type SQLite3ClientOptions = SQLiteClientOptions &\n SQLiteFileNameOrConnectionString;\n\nexport type SQLite3Client = SQLiteClientOrPoolClient;\n\nexport type SQLite3ConnectionOptions = SQLiteConnectionOptions &\n ((SQLite3ClientOptions & { client?: never }) | { client: SQLite3Client });\n\nexport type SQLite3Connection<\n ClientType extends SQLiteClientOrPoolClient = SQLiteClientOrPoolClient,\n> = Connection<\n SQLite3Connection,\n SQLite3DriverType,\n ClientType,\n SQLiteTransaction<SQLite3Connection, SQLiteTransactionOptions>\n>;\n\nconst applyPragma = (\n database: sqlite3.Database,\n pragma: string,\n value: string | number,\n) => {\n return new Promise<void>((resolve, reject) => {\n database.run(`PRAGMA ${pragma} = ${value};`, (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n};\n\nconst queryPragma = (\n database: sqlite3.Database,\n pragma: string,\n): Promise<string> =>\n new Promise((resolve, reject) => {\n database.get(\n `PRAGMA ${pragma};`,\n (err: Error | null, row: { [key: string]: string } | null) => {\n if (err) reject(err);\n else resolve(row?.[pragma] ?? '');\n },\n );\n });\n\nconst applyPragmas = (\n database: sqlite3.Database,\n pragmas: Array<{ pragma: string; value: string | number }>,\n) =>\n pragmas.reduce(\n (promise, { pragma, value }) =>\n promise.then(() => applyPragma(database, pragma, value)),\n Promise.resolve(),\n );\n\nexport const sqlite3Client = (\n options: SQLite3ClientOptions & {\n serializer: JSONSerializer;\n },\n): SQLiteClient => {\n let db: sqlite3.Database;\n\n let isClosed = false;\n\n const { serializer } = options;\n\n const connectionString =\n options.fileName ?? options.connectionString ?? InMemorySQLiteDatabase;\n\n const finalPragmas = mergePragmaOptions(\n String(connectionString),\n options.pragmaOptions,\n );\n\n const connectionPragmas = buildConnectionPragmaStatements(finalPragmas);\n\n const connect: () => Promise<void> = () =>\n db\n ? Promise.resolve()\n : new Promise((resolve, reject) => {\n try {\n db = new sqlite3.Database(\n connectionString,\n sqlite3.OPEN_URI | sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE,\n (err) => {\n if (err) {\n reject(err);\n return;\n }\n\n const busyTimeout =\n finalPragmas.busy_timeout ??\n DEFAULT_SQLITE_PRAGMA_OPTIONS.busy_timeout!;\n\n db.configure('busyTimeout', busyTimeout);\n\n applyPragmas(\n db,\n connectionPragmas.filter((p) => p.pragma !== 'busy_timeout'),\n )\n .then(async () => {\n if (options.skipDatabasePragmas) return;\n\n const databasePragmas =\n buildDatabasePragmaStatements(finalPragmas);\n for (const { pragma, value } of databasePragmas) {\n const current = await queryPragma(db, pragma);\n if (\n current.toUpperCase() !== String(value).toUpperCase()\n ) {\n await applyPragma(db, pragma, value);\n }\n }\n })\n .then(() => resolve())\n .catch(reject);\n },\n );\n\n // Apply connection-level pragmas first (busy_timeout is first)\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n\n const executeQuery = <T>(\n sql: string,\n params?: SQLiteParameters[],\n ): Promise<T[]> =>\n new Promise((resolve, reject) => {\n try {\n db.all(sql, params ?? [], (err: Error | null, result: T[]) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve(result);\n });\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n\n const executeCommand = <Result extends QueryResultRow = QueryResultRow>(\n sql: string,\n params?: SQLiteParameters[],\n options?: SQLiteCommandOptions,\n ): Promise<QueryResult<Result>> =>\n new Promise((resolve, reject) => {\n try {\n if (options?.ignoreChangesCount === true) {\n db.run(\n sql,\n params ?? [],\n function (err: Error | null, rows: Result[]) {\n if (err) {\n reject(err);\n return;\n }\n resolve({\n rowCount: 0,\n rows: rows ?? [],\n });\n },\n );\n return;\n }\n\n if (hasReturningClause(sql)) {\n db.all(sql, params ?? [], (err, rows: Result[]) => {\n if (err) return reject(err);\n resolve({ rowCount: rows.length, rows });\n });\n return;\n }\n\n // OD: 2026-01-21\n // This is needed as SQLite does not return changes count properly\n // We need to query it separately with SELECT changes()\n // This may be fixed eventually in sqlite3 library as Node.js team did here:\n // https://github.com/nodejs/node/issues/57344\n // But for now, we do it manually, as a workaround\n // We also serialize it to avoid race conditions\n db.serialize(() => {\n let hasFailed = false;\n let resultRows: Result[] = [];\n\n db.all(sql, params ?? [], (err, rows: Result[]) => {\n if (err) {\n hasFailed = true;\n return reject(err);\n }\n resultRows = rows;\n });\n\n db.get(\n 'SELECT changes() as changes',\n (err, row: { changes: number } | null) => {\n // If the first query failed, we exit immediately.\n // The promise is already rejected; we don't want to touch it.\n if (hasFailed) return;\n\n if (err) return reject(err);\n\n resolve({\n rowCount: row?.changes ?? 0,\n rows: resultRows,\n });\n },\n );\n });\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n\n return {\n connect,\n close: async (): Promise<void> => {\n if (isClosed) {\n return;\n }\n isClosed = true;\n if (db) {\n try {\n await new Promise<void>((resolve, reject) => {\n db.close((err: Error | null) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n });\n } catch (error) {\n throw mapSqliteError(error);\n }\n }\n },\n query: async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n _options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>> => {\n try {\n const { query, params } = sqliteFormatter.format(sql, {\n serializer,\n });\n const result = await executeQuery<Result>(\n query,\n params as SQLiteParameters[],\n );\n return { rowCount: result.length, rows: result };\n } catch (error) {\n throw mapSqliteError(error);\n }\n },\n batchQuery: async <Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n _options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n const results: QueryResult<Result>[] = [];\n for (const sql of sqls) {\n const { query, params } = sqliteFormatter.format(sql, {\n serializer,\n });\n const result = await executeQuery<Result>(\n query,\n params as SQLiteParameters[],\n );\n results.push({ rowCount: result.length, rows: result });\n }\n return results;\n } catch (error) {\n throw mapSqliteError(error);\n }\n },\n command: async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLiteCommandOptions,\n ): Promise<QueryResult<Result>> => {\n try {\n const { query, params } = sqliteFormatter.format(sql, {\n serializer,\n });\n\n return await executeCommand<Result>(\n query,\n params as SQLiteParameters[],\n options,\n );\n } catch (error) {\n throw mapSqliteError(error);\n }\n },\n batchCommand: async <Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: BatchSQLiteCommandOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n const results: QueryResult<Result>[] = [];\n\n for (let i = 0; i < sqls.length; i++) {\n const { query, params } = sqliteFormatter.format(sqls[i]!, {\n serializer,\n });\n const result = await executeCommand<Result>(\n query,\n params as SQLiteParameters[],\n options,\n );\n results.push(result);\n\n if (options?.assertChanges && (result.rowCount ?? 0) === 0) {\n throw new BatchCommandNoChangesError(i);\n }\n }\n return results;\n } catch (error) {\n throw mapSqliteError(error);\n }\n },\n };\n};\n\nexport const checkConnection = async (\n fileName: string,\n serializer: JSONSerializer,\n): Promise<ConnectionCheckResult> => {\n const client = sqlite3Client({\n fileName,\n serializer,\n });\n\n try {\n await client.query(SQL`SELECT 1`);\n return { successful: true };\n } catch (error) {\n const code =\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string'\n ? error.code\n : undefined;\n\n return {\n successful: false,\n errorType:\n code === 'SQLITE_CANTOPEN'\n ? 'ConnectionRefused'\n : code === 'SQLITE_AUTH'\n ? 'Authentication'\n : 'Unknown',\n code,\n error,\n };\n } finally {\n await client.close();\n }\n};\n\nexport const sqlite3Connection = (\n options: SQLite3ConnectionOptions & { serializer: JSONSerializer },\n) =>\n sqliteConnection<SQLite3Connection, SQLite3ConnectionOptions>({\n type: 'Client',\n driverType: SQLite3DriverType,\n sqliteClientFactory: (connectionOptions) => {\n if ('client' in connectionOptions && connectionOptions.client) {\n return connectionOptions.client;\n }\n return sqlite3Client({\n ...connectionOptions,\n serializer: options.serializer,\n });\n },\n connectionOptions: options,\n serializer: options.serializer,\n });\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createSingletonConnectionPool,\n type ConnectionPool,\n} from '../../../../core';\nimport { TaskProcessor } from '../../../../core/taskProcessing';\nimport type { AnySQLiteConnection } from '../../core';\n\nexport type SQLite3SingletonPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection,\n> = {\n driverType: SQLiteConnectionType['driverType'];\n getConnection: () => SQLiteConnectionType | Promise<SQLiteConnectionType>;\n closeConnection?: (connection: SQLiteConnectionType) => void | Promise<void>;\n maxQueueSize?: number;\n};\n\n// Creates a singleton-connection pool whose callers serialise through a\n// single-slot TaskProcessor. An AsyncLocalStorage flag lets re-entrant calls\n// (made from inside an active task on this pool) bypass the queue instead of\n// deadlocking — that's the path emmett relies on when a workflow handler\n// internally calls back through the same pool (e.g. messageStore.appendToStream).\nexport const sqlite3SingletonPool = <\n SQLiteConnectionType extends AnySQLiteConnection,\n>(\n options: SQLite3SingletonPoolOptions<SQLiteConnectionType>,\n): ConnectionPool<SQLiteConnectionType> => {\n const inner = createSingletonConnectionPool<SQLiteConnectionType>({\n driverType: options.driverType,\n getConnection: options.getConnection,\n ...(options.closeConnection\n ? { closeConnection: options.closeConnection }\n : {}),\n });\n\n const taskProcessor = new TaskProcessor({\n maxActiveTasks: 1,\n maxQueueSize: options.maxQueueSize ?? 1000,\n });\n const insideWriterTask = new AsyncLocalStorage<true>();\n\n const enqueue = <Result>(op: () => Promise<Result>): Promise<Result> => {\n if (insideWriterTask.getStore() === true) {\n return op();\n }\n return taskProcessor.enqueue(({ ack }) =>\n insideWriterTask.run(true, async () => {\n try {\n return await op();\n } finally {\n ack();\n }\n }),\n );\n };\n\n return {\n driverType: inner.driverType,\n connection: inner.connection.bind(inner),\n transaction: inner.transaction.bind(inner),\n withConnection: (handle, connectionOptions) =>\n enqueue(() => inner.withConnection(handle, connectionOptions)),\n withTransaction: (handle, transactionOptions) =>\n enqueue(() => inner.withTransaction(handle, transactionOptions)),\n execute: {\n query: (sql, queryOptions) =>\n enqueue(() => inner.execute.query(sql, queryOptions)),\n batchQuery: (sqls, queryOptions) =>\n enqueue(() => inner.execute.batchQuery(sqls, queryOptions)),\n command: (sql, commandOptions) =>\n enqueue(() => inner.execute.command(sql, commandOptions)),\n batchCommand: (sqls, commandOptions) =>\n enqueue(() => inner.execute.batchCommand(sqls, commandOptions)),\n },\n close: async () => {\n await taskProcessor.stop();\n await inner.close();\n },\n };\n};\n","import { cpus } from 'os';\nimport { createBoundedConnectionPool } from '../../../../core';\nimport { guardInitializedOnce } from '../../../../core/taskProcessing';\nimport type {\n AnySQLiteConnection,\n SQLiteConnectionFactory,\n SQLiteConnectionOptions,\n SQLitePool,\n} from '../../core';\nimport { mapSqliteError } from '../../core/errors';\nimport { sqlite3SingletonPool } from './singletonPool';\n\nexport type SQLiteDualPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions,\n> = {\n driverType: SQLiteConnectionType['driverType'];\n dual?: true;\n singleton?: false;\n pooled?: true;\n connection?: never;\n readerPoolSize?: number;\n sqliteConnectionFactory: SQLiteConnectionFactory<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n connectionOptions?: ConnectionOptions;\n};\n\nexport const sqliteDualConnectionPool = <\n SQLiteConnectionType extends AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions,\n>(\n options: SQLiteDualPoolOptions<SQLiteConnectionType, ConnectionOptions>,\n): SQLitePool<SQLiteConnectionType> => {\n const { sqliteConnectionFactory, connectionOptions } = options;\n const readerPoolSize = options.readerPoolSize ?? Math.max(4, cpus().length);\n\n let databaseInitPromise: Promise<void> | null = null;\n\n const guardSingleConnection = guardInitializedOnce(async () => {\n if (databaseInitPromise !== null) {\n return databaseInitPromise;\n }\n\n const initConnection = sqliteConnectionFactory({\n ...connectionOptions,\n skipDatabasePragmas: false,\n readonly: false,\n } as ConnectionOptions);\n\n const initPromise = initConnection.open();\n databaseInitPromise = initPromise;\n\n try {\n await initPromise;\n await initConnection.close();\n } catch (error) {\n databaseInitPromise = null;\n await initConnection.close();\n throw mapSqliteError(error);\n }\n });\n\n const ensureDatabaseInitialized = async (): Promise<void> => {\n if (databaseInitPromise !== null) {\n return databaseInitPromise;\n }\n\n return guardSingleConnection.ensureInitialized();\n };\n\n const wrappedConnectionFactory = async (\n readonly: boolean,\n connectionOptions: ConnectionOptions | undefined,\n ): Promise<SQLiteConnectionType> => {\n await ensureDatabaseInitialized();\n\n const connection = sqliteConnectionFactory({\n ...connectionOptions,\n skipDatabasePragmas: true,\n readonly,\n } as ConnectionOptions);\n\n await connection.open();\n\n return connection;\n };\n\n const writerPool = sqlite3SingletonPool<SQLiteConnectionType>({\n driverType: options.driverType,\n getConnection: () => wrappedConnectionFactory(false, connectionOptions),\n });\n\n const readerPool = createBoundedConnectionPool({\n driverType: options.driverType,\n getConnection: () => wrappedConnectionFactory(true, connectionOptions),\n maxConnections: readerPoolSize,\n });\n\n return {\n driverType: options.driverType,\n connection: (connectionOptions) =>\n connectionOptions?.readonly\n ? readerPool.connection(connectionOptions)\n : writerPool.connection(connectionOptions),\n execute: {\n query: (...args) => readerPool.execute.query(...args),\n batchQuery: (...args) => readerPool.execute.batchQuery(...args),\n command: (...args) => writerPool.execute.command(...args),\n batchCommand: (...args) => writerPool.execute.batchCommand(...args),\n },\n withConnection: (handle, connectionOptions) =>\n connectionOptions?.readonly\n ? readerPool.withConnection(handle, connectionOptions)\n : writerPool.withConnection(handle, connectionOptions),\n transaction: writerPool.transaction,\n withTransaction: writerPool.withTransaction,\n close: async () => {\n await guardSingleConnection.stop();\n await Promise.all([writerPool.close(), readerPool.close()]);\n },\n };\n};\n","export * from './connections';\nimport {\n canHandleDriverWithConnectionString,\n dumboDatabaseDriverRegistry,\n JSONSerializer,\n type DumboConnectionOptions,\n type DumboDatabaseDriver,\n} from '../../../core';\nimport {\n DefaultSQLiteMigratorOptions,\n isInMemoryDatabase,\n SQLiteConnectionString,\n sqliteFormatter,\n sqliteMetadata,\n sqlitePool,\n toSqlitePoolOptions,\n type SQLitePool,\n type SQLitePoolOptions,\n} from '../core';\nimport {\n sqlite3Connection,\n SQLite3DriverType,\n type SQLite3Connection,\n type SQLite3ConnectionOptions,\n} from './connections';\nimport { sqliteDualConnectionPool } from './pool/dualPool';\nimport { sqlite3SingletonPool } from './pool/singletonPool';\n\nexport type SQLite3DumboOptions = Omit<\n SQLitePoolOptions<SQLite3Connection, SQLite3ConnectionOptions>,\n 'driverType'\n> &\n SQLite3ConnectionOptions & { serializer?: JSONSerializer };\n\nexport type SQLite3PoolOptions = SQLite3DumboOptions;\n\nexport type Sqlite3Pool = SQLitePool<SQLite3Connection>;\n\nexport const sqlite3Pool = (\n options: SQLite3DumboOptions,\n): SQLitePool<SQLite3Connection> => {\n // Ambient: caller-managed connection. No acquisition, no serialisation.\n if ('connection' in options && options.connection) {\n return sqlitePool(\n toSqlitePoolOptions({\n ...options,\n driverType: SQLite3DriverType,\n }),\n );\n }\n\n const sqliteConnectionFactory = (opts: SQLite3ConnectionOptions) =>\n sqlite3Connection({\n ...opts,\n serializer: options.serializer ?? JSONSerializer,\n });\n\n // Singleton-shaped: in-memory DBs, an explicit client, or `singleton: true`.\n // One connection shared across callers — wrap it so concurrent callers\n // serialise through a single-slot TaskProcessor with ALS-based reentrancy.\n const isSingleton =\n isInMemoryDatabase(options) ||\n ('client' in options && Boolean(options.client)) ||\n options.singleton === true;\n\n if (isSingleton) {\n return sqlite3SingletonPool<SQLite3Connection>({\n driverType: SQLite3DriverType,\n getConnection: () => sqliteConnectionFactory(options),\n });\n }\n\n // Default: file-backed dual pool. Its writer side is serialised inside\n // sqliteDualConnectionPool via the same primitive.\n const readerPoolSize = (options as { readerPoolSize?: number })\n .readerPoolSize;\n return sqliteDualConnectionPool({\n driverType: SQLite3DriverType,\n sqliteConnectionFactory,\n connectionOptions: options,\n ...(readerPoolSize !== undefined ? { readerPoolSize } : {}),\n });\n};\n\nconst tryParseConnectionString = (connectionString: string) => {\n try {\n return SQLiteConnectionString(connectionString);\n } catch {\n return null;\n }\n};\n\nexport const sqlite3DumboDriver = {\n driverType: SQLite3DriverType,\n createPool: (options) => sqlite3Pool(options as SQLite3DumboOptions),\n sqlFormatter: sqliteFormatter,\n defaultMigratorOptions: DefaultSQLiteMigratorOptions,\n canHandle: canHandleDriverWithConnectionString(\n SQLite3DriverType,\n tryParseConnectionString,\n ),\n databaseMetadata: sqliteMetadata,\n} satisfies DumboDatabaseDriver<\n SQLite3Connection,\n SQLite3DumboOptions,\n Sqlite3Pool\n>;\n\nexport const useSqlite3DumboDriver = () => {\n dumboDatabaseDriverRegistry.register(SQLite3DriverType, sqlite3DumboDriver);\n};\n\nexport type SQLite3DumboConnectionOptions = DumboConnectionOptions<\n typeof sqlite3DumboDriver\n> & { connectionString: string | SQLiteConnectionString };\n\nuseSqlite3DumboDriver();\n\nexport * from './connections';\nexport * from './formatter';\nexport * from './transactions';\n"],"mappings":"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"}