@event-driven-io/dumbo 0.13.0-beta.42 → 0.13.0-beta.43
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/cloudflare.cjs +2193 -86
- package/dist/cloudflare.cjs.map +1 -1
- package/dist/cloudflare.d.cts +1106 -3
- package/dist/cloudflare.d.ts +1106 -3
- package/dist/cloudflare.js +2082 -3
- package/dist/cloudflare.js.map +1 -1
- package/dist/index.cjs +2505 -160
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1676 -2
- package/dist/index.d.ts +1676 -2
- package/dist/index.js +2321 -4
- package/dist/index.js.map +1 -1
- package/dist/pg.cjs +2051 -58
- package/dist/pg.cjs.map +1 -1
- package/dist/pg.d.cts +1040 -2
- package/dist/pg.d.ts +1040 -2
- package/dist/pg.js +1968 -3
- package/dist/pg.js.map +1 -1
- package/dist/postgresql.cjs +1845 -25
- package/dist/postgresql.cjs.map +1 -0
- package/dist/postgresql.d.cts +1034 -3
- package/dist/postgresql.d.ts +1034 -3
- package/dist/postgresql.js +1795 -3
- package/dist/postgresql.js.map +1 -0
- package/dist/sqlite.cjs +2124 -30
- package/dist/sqlite.cjs.map +1 -0
- package/dist/sqlite.d.cts +1107 -3
- package/dist/sqlite.d.ts +1107 -3
- package/dist/sqlite.js +2069 -3
- package/dist/sqlite.js.map +1 -0
- package/dist/sqlite3.cjs +2412 -61
- package/dist/sqlite3.cjs.map +1 -1
- package/dist/sqlite3.d.cts +1106 -4
- package/dist/sqlite3.d.ts +1106 -4
- package/dist/sqlite3.js +2326 -3
- package/dist/sqlite3.js.map +1 -1
- package/package.json +1 -1
- package/dist/core-BPSzA-lq.cjs +0 -3259
- package/dist/core-BPSzA-lq.cjs.map +0 -1
- package/dist/core-BuSVyamf.cjs +0 -480
- package/dist/core-BuSVyamf.cjs.map +0 -1
- package/dist/core-C3xoqqDs.js +0 -403
- package/dist/core-C3xoqqDs.js.map +0 -1
- package/dist/core-CHw8vO17.js +0 -456
- package/dist/core-CHw8vO17.js.map +0 -1
- package/dist/core-CUGYxOEQ.cjs +0 -599
- package/dist/core-CUGYxOEQ.cjs.map +0 -1
- package/dist/core-IV7or0Mj.js +0 -2278
- package/dist/core-IV7or0Mj.js.map +0 -1
- package/dist/index-BJC_v03L.d.ts +0 -192
- package/dist/index-CfH0u2y_.d.cts +0 -1682
- package/dist/index-DP9b7v4e.d.cts +0 -192
- package/dist/index-QWEAqtHF.d.ts +0 -1682
- package/dist/index-qxECrBHo.d.ts +0 -75
- package/dist/index-tS9lpLPz.d.cts +0 -75
- package/dist/postgreSQLMetadata-CCsCJ-eH.cjs +0 -118
- package/dist/postgreSQLMetadata-CCsCJ-eH.cjs.map +0 -1
- package/dist/postgreSQLMetadata-bCBDGz1f.js +0 -65
- package/dist/postgreSQLMetadata-bCBDGz1f.js.map +0 -1
- package/dist/sqliteMetadata-Cc7Z03lm.cjs +0 -46
- package/dist/sqliteMetadata-Cc7Z03lm.cjs.map +0 -1
- package/dist/sqliteMetadata-CvvEc1-v.js +0 -29
- package/dist/sqliteMetadata-CvvEc1-v.js.map +0 -1
package/dist/cloudflare.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare.cjs","names":["sqliteFormatter","BatchCommandNoChangesError","UniqueConstraintError","ForeignKeyViolationError","NotNullViolationError","CheckViolationError","IntegrityConstraintViolationError","LockNotAvailableError","DeadlockError","ConnectionError","InsufficientResourcesError","SystemError","DataError","InvalidOperationError","SerializationError","DumboError","sqliteFormatter","transactionNestingCounter","sqlExecutor","sqliteAmbientClientConnection","createSingletonConnectionPool","JSONSerializer","sqliteFormatter","DefaultSQLiteMigratorOptions","sqliteMetadata"],"sources":["../src/storage/sqlite/d1/connections/d1Client.ts","../src/storage/sqlite/d1/errors/errorMapper.ts","../src/storage/sqlite/d1/execute/d1SqlExecutor.ts","../src/storage/sqlite/d1/transactions/d1Transaction.ts","../src/storage/sqlite/d1/connections/d1Connection.ts","../src/storage/sqlite/d1/pool/d1ConnectionPool.ts","../src/storage/sqlite/d1/index.ts"],"sourcesContent":["import type {\n D1Database,\n D1DatabaseSession,\n D1SessionBookmark,\n D1SessionConstraint,\n} from '@cloudflare/workers-types';\nimport {\n BatchCommandNoChangesError,\n type BatchSQLCommandOptions,\n type JSONSerializer,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n type SQLCommandOptions,\n type SQLQueryOptions,\n} from '../../../../core';\nimport { sqliteFormatter, type SQLiteClient } from '../../core';\n\nexport type D1DatabaseOrSession = D1Database | D1DatabaseSession;\n\nexport type D1ClientOptions = {\n database: D1Database;\n session?: D1DatabaseSession | undefined;\n serializer: JSONSerializer;\n};\n\nexport type D1SessionOptions = {\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n constraintOrBookmark?: D1SessionBookmark | D1SessionConstraint;\n};\n\nexport type D1Client = SQLiteClient & {\n database: D1Database;\n session?: D1DatabaseSession | undefined;\n\n withSession: (constraintOrBookmark?: D1SessionOptions) => Promise<D1Client>;\n};\n\nexport const d1Client = (options: D1ClientOptions): D1Client => {\n const { database, session, serializer } = options;\n\n const execute = session ?? database;\n\n return {\n database,\n session: session,\n connect: () => Promise.resolve(),\n close: () => Promise.resolve(),\n withSession: async (constraintOrBookmark?: D1SessionOptions) => {\n const newSession = constraintOrBookmark\n ? database.withSession(constraintOrBookmark as string)\n : database.withSession();\n\n return Promise.resolve(\n d1Client({\n database,\n session: newSession,\n serializer,\n }),\n );\n },\n\n query: async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n _options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>> => {\n const { query, params } = sqliteFormatter.format(sql, { serializer });\n const stmt = execute.prepare(query);\n const bound = params?.length ? stmt.bind(...params) : stmt;\n const { results } = await bound.all<Result>();\n return { rowCount: results?.length ?? 0, rows: results ?? [] };\n },\n\n batchQuery: async <Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n _options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]> => {\n const statements = sqls.map((sql) => {\n const { query, params } = sqliteFormatter.format(sql, { serializer });\n const stmt = execute.prepare(query);\n return params?.length ? stmt.bind(...params) : stmt;\n });\n const results = await execute.batch<Result>(statements);\n return results.map((result) => ({\n rowCount: result.results?.length ?? 0,\n rows: result.results ?? [],\n }));\n },\n\n command: async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n _options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>> => {\n const { query, params } = sqliteFormatter.format(sql, { serializer });\n const stmt = execute.prepare(query);\n const bound = params?.length ? stmt.bind(...params) : stmt;\n const result = await bound.run<Result>();\n return {\n rowCount: result.meta?.changes ?? 0,\n rows: result.results ?? [],\n };\n },\n\n batchCommand: async <Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: BatchSQLCommandOptions,\n ): Promise<QueryResult<Result>[]> => {\n const statements = sqls.map((sql) => {\n const { query, params } = sqliteFormatter.format(sql, { serializer });\n const stmt = execute.prepare(query);\n return params?.length ? stmt.bind(...params) : stmt;\n });\n const batchResults = await execute.batch<Result>(statements);\n\n return batchResults.map((result, i) => {\n const qr: QueryResult<Result> = {\n rowCount: result.meta?.changes ?? 0,\n rows: result.results ?? [],\n };\n\n if (options?.assertChanges && (qr.rowCount ?? 0) === 0) {\n throw new BatchCommandNoChangesError(i);\n }\n\n return qr;\n });\n },\n };\n};\n","import {\n CheckViolationError,\n ConnectionError,\n DataError,\n DeadlockError,\n DumboError,\n ForeignKeyViolationError,\n InsufficientResourcesError,\n IntegrityConstraintViolationError,\n InvalidOperationError,\n LockNotAvailableError,\n NotNullViolationError,\n SerializationError,\n SystemError,\n UniqueConstraintError,\n} from '../../../../core/errors';\n\nconst getErrorMessage = (error: unknown): string | undefined =>\n error instanceof Error ? error.message : undefined;\n\nconst asError = (error: unknown): Error | undefined =>\n error instanceof Error ? error : undefined;\n\n/**\n * Determines the constraint subtype from the error message.\n *\n * D1 embeds the SQLite constraint detail in the message string, e.g.:\n * \"D1_ERROR: UNIQUE constraint failed: users.email\"\n * \"D1_ERROR: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed\"\n */\nconst mapConstraintError = (\n message: string | undefined,\n innerError: Error | undefined,\n): DumboError => {\n const upperMessage = message?.toUpperCase() ?? '';\n\n if (upperMessage.includes('UNIQUE') || upperMessage.includes('PRIMARY KEY'))\n return new UniqueConstraintError(message, innerError);\n\n if (upperMessage.includes('FOREIGN KEY'))\n return new ForeignKeyViolationError(message, innerError);\n\n if (upperMessage.includes('NOT NULL'))\n return new NotNullViolationError(message, innerError);\n\n if (upperMessage.includes('CHECK'))\n return new CheckViolationError(message, innerError);\n\n return new IntegrityConstraintViolationError(message, innerError);\n};\n\nconst isConstraintMessage = (upper: string): boolean =>\n upper.includes('CONSTRAINT') ||\n upper.includes('UNIQUE') ||\n upper.includes('PRIMARY KEY') ||\n upper.includes('FOREIGN KEY') ||\n upper.includes('NOT NULL');\n\n/** Extracts the first `SQLITE_<CODE>` token from a message string. */\nconst SQLITE_CODE_RE = /SQLITE_([A-Z]+)/;\n\nconst extractEmbeddedSqliteCode = (message: string): string | undefined => {\n const match = SQLITE_CODE_RE.exec(message);\n return match ? `SQLITE_${match[1]}` : undefined;\n};\n\n/**\n * Maps a `SQLITE_*` code found in the D1 message to a DumboError.\n *\n * D1 sometimes forwards raw SQLite result codes from the C++ layer, e.g.:\n * \"D1_ERROR: SQLITE_BUSY: database is locked\"\n * \"SQLITE_READONLY: attempt to write a readonly database\"\n *\n * See https://www.sqlite.org/rescode.html for the full code list.\n */\nconst mapEmbeddedSqliteCode = (\n code: string,\n message: string | undefined,\n innerError: Error | undefined,\n): DumboError | undefined => {\n switch (code) {\n case 'SQLITE_CONSTRAINT':\n return mapConstraintError(message, innerError);\n case 'SQLITE_BUSY':\n return new LockNotAvailableError(message, innerError);\n case 'SQLITE_LOCKED':\n return new DeadlockError(message, innerError);\n case 'SQLITE_PROTOCOL':\n return new LockNotAvailableError(message, innerError);\n case 'SQLITE_CANTOPEN':\n return new ConnectionError(message, innerError);\n case 'SQLITE_NOTADB':\n return new ConnectionError(message, innerError);\n case 'SQLITE_NOMEM':\n return new InsufficientResourcesError(message, innerError);\n case 'SQLITE_FULL':\n return new InsufficientResourcesError(message, innerError);\n case 'SQLITE_IOERR':\n return new SystemError(message, innerError);\n case 'SQLITE_CORRUPT':\n return new SystemError(message, innerError);\n case 'SQLITE_INTERNAL':\n return new SystemError(message, innerError);\n case 'SQLITE_NOLFS':\n return new SystemError(message, innerError);\n case 'SQLITE_TOOBIG':\n return new DataError(message, innerError);\n case 'SQLITE_MISMATCH':\n return new DataError(message, innerError);\n case 'SQLITE_RANGE':\n return new DataError(message, innerError);\n case 'SQLITE_ERROR':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_READONLY':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_MISUSE':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_AUTH':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_PERM':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_SCHEMA':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_ABORT':\n return new SerializationError(message, innerError);\n case 'SQLITE_INTERRUPT':\n return new SerializationError(message, innerError);\n }\n return undefined;\n};\n\n/**\n * Maps a Cloudflare D1 error to a typed DumboError.\n *\n * Unlike node-sqlite3, D1 throws **plain `Error` objects** with no `code`\n * property. All error information is embedded in `error.message`, using\n * well-known prefixes from the `workerd` runtime:\n *\n * | Prefix | Meaning |\n * |-----------------------|----------------------------------------------|\n * | `D1_ERROR:` | General D1 / SQLite error |\n * | `D1_EXEC_ERROR:` | Error during `.exec()` batch |\n * | `D1_TYPE_ERROR:` | Type mismatch (e.g. `undefined` vs `null`) |\n * | `D1_COLUMN_NOTFOUND` | Referenced column does not exist |\n * | `D1_DUMP_ERROR:` | Error during database dump |\n * | `D1_SESSION_ERROR:` | Session bookmark / constraint error |\n *\n * D1 also surfaces platform-level messages (no prefix) for transient errors:\n * - \"Network connection lost.\"\n * - \"D1 DB is overloaded. Too many requests queued.\"\n * - \"Memory limit would be exceeded by this operation.\"\n * - \"Cannot resolve D1 DB due to transient issue on remote node.\"\n * - \"D1 DB reset because its code was updated.\"\n *\n * Reference:\n * - https://developers.cloudflare.com/d1/platform/client-api/\n * - https://github.com/cloudflare/workerd (src/cloudflare/internal/d1-api.ts)\n *\n * Falls back to a generic DumboError (500) if the error is not a recognized D1 error.\n */\nexport const mapD1Error = (error: unknown): DumboError => {\n if (DumboError.isInstanceOf<DumboError>(error)) return error;\n\n const message = getErrorMessage(error);\n if (!message)\n return new DumboError({\n errorCode: 500,\n message: error instanceof Error ? error.message : String(error),\n innerError: asError(error),\n });\n\n const innerError = asError(error);\n const upper = message.toUpperCase();\n\n // D1-specific prefixes are checked first because some (e.g. D1_SESSION_ERROR)\n // contain constraint keywords in their message but have different semantics.\n if (upper.startsWith('D1_TYPE_ERROR'))\n return new DataError(message, innerError);\n\n if (upper.startsWith('D1_COLUMN_NOTFOUND'))\n return new DataError(message, innerError);\n\n if (upper.startsWith('D1_DUMP_ERROR'))\n return new SystemError(message, innerError);\n\n if (upper.startsWith('D1_SESSION_ERROR'))\n return new ConnectionError(message, innerError);\n\n if (isConstraintMessage(upper)) {\n return mapConstraintError(message, innerError);\n }\n\n if (\n upper.includes('NETWORK CONNECTION LOST') ||\n upper.includes('CANNOT RESOLVE D1 DB DUE TO TRANSIENT ISSUE') ||\n upper.includes('D1 DB RESET BECAUSE')\n )\n return new ConnectionError(message, innerError);\n\n if (\n upper.includes('D1 DB IS OVERLOADED') ||\n upper.includes('TOO MANY REQUESTS') ||\n upper.includes('MEMORY LIMIT WOULD BE EXCEEDED')\n )\n return new InsufficientResourcesError(message, innerError);\n\n if (upper.startsWith('D1_ERROR') || upper.startsWith('D1_EXEC_ERROR')) {\n const embeddedCode = extractEmbeddedSqliteCode(message);\n if (embeddedCode) {\n const mapped = mapEmbeddedSqliteCode(embeddedCode, message, innerError);\n if (mapped) return mapped;\n }\n\n return new InvalidOperationError(message, innerError);\n }\n\n const embeddedCode = extractEmbeddedSqliteCode(message);\n if (embeddedCode) {\n const mapped = mapEmbeddedSqliteCode(embeddedCode, message, innerError);\n if (mapped) return mapped;\n }\n\n return new DumboError({\n errorCode: 500,\n message,\n innerError,\n });\n};\n","import type {\n BatchSQLCommandOptions,\n DbSQLExecutor,\n QueryResult,\n QueryResultRow,\n SQL,\n SQLCommandOptions,\n SQLQueryOptions,\n} from '../../../../core';\nimport { tracer } from '../../../../core';\nimport { sqliteFormatter } from '../../core';\nimport type { D1Client, D1DriverType } from '../connections';\nimport { mapD1Error } from '../errors/errorMapper';\n\nexport const d1SQLExecutor = (): DbSQLExecutor<D1DriverType, D1Client> => ({\n driverType: 'SQLite:d1',\n formatter: sqliteFormatter,\n\n query: async <Result extends QueryResultRow>(\n client: D1Client,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>> => {\n try {\n return await client.query<Result>(sql, options);\n } catch (error) {\n tracer.error('db:sql:query:execute:error', { error });\n throw mapD1Error(error);\n }\n },\n\n batchQuery: async <Result extends QueryResultRow>(\n client: D1Client,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n return await client.batchQuery<Result>(sqls, options);\n } catch (error) {\n tracer.error('db:sql:batch_query:execute:error', { error });\n throw mapD1Error(error);\n }\n },\n\n command: async <Result extends QueryResultRow>(\n client: D1Client,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>> => {\n try {\n return await client.command<Result>(sql, options);\n } catch (error) {\n tracer.error('db:sql:command:execute:error', { error });\n throw mapD1Error(error);\n }\n },\n\n batchCommand: async <Result extends QueryResultRow>(\n client: D1Client,\n sqls: SQL[],\n options?: BatchSQLCommandOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n return await client.batchCommand<Result>(sqls, options);\n } catch (error) {\n tracer.error('db:sql:batch_command:execute:error', { error });\n throw mapD1Error(error);\n }\n },\n});\n","import type { JSONSerializer } from '../../../../core';\nimport {\n sqlExecutor,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n} from '../../../../core';\nimport { transactionNestingCounter } from '../../core';\nimport {\n D1DriverType,\n type D1Client,\n type D1Connection,\n type D1SessionOptions,\n} from '../connections';\nimport { d1SQLExecutor } from '../execute';\n\nexport type D1Transaction = DatabaseTransaction<\n D1Connection,\n D1TransactionOptions\n>;\n\nexport type D1TransactionOptions = DatabaseTransactionOptions & {\n d1Session?: D1SessionOptions;\n mode?: D1TransactionMode;\n};\n\nexport type D1TransactionMode = 'session_based' | 'strict';\n\nexport class D1TransactionNotSupportedError extends Error {\n constructor() {\n super(\n 'D1 does not support SQL transactions (BEGIN/COMMIT/ROLLBACK/SAVEPOINT). ' +\n 'Use { mode: \"session_based\" } to opt-in to session+batch semantics, or use ' +\n 'connection.execute.batchCommand() for atomic multi-statement execution.',\n );\n this.name = 'D1TransactionNotSupportedError';\n }\n}\n\nexport const d1Transaction =\n (\n connection: () => D1Connection,\n serializer: JSONSerializer,\n defaultOptions?: D1TransactionOptions,\n ) =>\n (\n getClient: Promise<D1Client>,\n options?: {\n close: (client: D1Client, error?: unknown) => Promise<void>;\n } & D1TransactionOptions,\n ): D1Transaction => {\n const transactionCounter = transactionNestingCounter();\n\n const allowNestedTransactions =\n options?.allowNestedTransactions ??\n defaultOptions?.allowNestedTransactions;\n\n const mode = options?.mode ?? defaultOptions?.mode;\n\n let client: D1Client | null = null;\n let sessionClient: D1Client | null = null;\n\n const getDatabaseClient = async () => {\n if (client) return Promise.resolve(client);\n\n client = await getClient;\n return client;\n };\n\n return {\n connection: connection(),\n driverType: D1DriverType,\n begin: async function () {\n if (mode !== 'session_based') {\n throw new D1TransactionNotSupportedError();\n }\n\n const client = await getDatabaseClient();\n\n if (allowNestedTransactions) {\n if (transactionCounter.level >= 1) {\n transactionCounter.increment();\n return;\n }\n\n transactionCounter.increment();\n }\n\n sessionClient = await client.withSession(options?.d1Session);\n },\n commit: async function () {\n const client = await getDatabaseClient();\n\n if (allowNestedTransactions && transactionCounter.level > 1) {\n transactionCounter.decrement();\n return;\n }\n\n try {\n if (allowNestedTransactions) transactionCounter.reset();\n sessionClient = null;\n } finally {\n if (options?.close) await options?.close(client);\n }\n },\n rollback: async function (error?: unknown) {\n const client = await getDatabaseClient();\n\n if (allowNestedTransactions && transactionCounter.level > 1) {\n transactionCounter.decrement();\n return;\n }\n\n try {\n sessionClient = null;\n } finally {\n if (options?.close) await options?.close(client, error);\n }\n },\n execute: sqlExecutor(d1SQLExecutor(), {\n connect: () => {\n if (!sessionClient) {\n throw new Error(\n 'Transaction has not been started. Call begin() first.',\n );\n }\n return Promise.resolve(sessionClient);\n },\n }),\n _transactionOptions: options ?? {},\n };\n };\n","import type { Connection } from '../../../../core';\nimport {\n sqliteAmbientClientConnection,\n type SQLiteConnectionOptions,\n type SQLiteDriverType,\n} from '../../core';\nimport { mapD1Error } from '../errors/errorMapper';\nimport { d1Transaction, type D1Transaction } from '../transactions';\nimport {\n d1Client,\n type D1Client,\n type D1ClientOptions,\n type D1SessionOptions,\n} from './d1Client';\n\nexport type D1DriverType = SQLiteDriverType<'d1'>;\nexport const D1DriverType: D1DriverType = 'SQLite:d1';\n\nexport type D1Connection = Connection<\n D1Connection,\n D1DriverType,\n D1Client,\n D1Transaction\n> & {\n d1Session: (constraintOrBookmark?: D1SessionOptions) => Promise<D1Connection>;\n withD1Session: <Result = never>(\n handle: (connection: D1Connection) => Promise<Result>,\n options?: D1SessionOptions,\n ) => Promise<Result>;\n};\n\nexport type D1ConnectionOptions = SQLiteConnectionOptions<D1Connection> & {\n client?: D1Client;\n connection?: D1Connection;\n transaction?: D1Transaction;\n} & D1ClientOptions;\n\nexport const d1Connection = (options: D1ConnectionOptions) => {\n const connection = options.connection ??\n options.transaction?.connection ?? {\n ...sqliteAmbientClientConnection<D1Connection>({\n driverType: D1DriverType,\n client: options.client ?? d1Client(options),\n initTransaction: (connection) =>\n d1Transaction(\n connection,\n options.serializer,\n options.transactionOptions,\n ),\n serializer: options.serializer,\n errorMapper: mapD1Error,\n }),\n };\n\n connection.d1Session = async (\n constraintOrBookmark?: D1SessionOptions,\n ): Promise<D1Connection> => {\n const client = await connection.open();\n\n const sessionClient = await client.withSession(constraintOrBookmark);\n\n return d1Connection({\n ...options,\n client: sessionClient,\n });\n };\n\n connection.withD1Session = async <Result = never>(\n handle: (connection: D1Connection) => Promise<Result>,\n options?: D1SessionOptions,\n ): Promise<Result> => {\n const sessionConnection = await connection.d1Session(options);\n\n try {\n return await handle(sessionConnection);\n } finally {\n await sessionConnection.close();\n }\n };\n\n return connection;\n};\n","import type { D1ConnectionOptions } from '..';\nimport {\n createSingletonConnectionPool,\n JSONSerializer,\n type ConnectionPool,\n type JSONSerializationOptions,\n} from '../../../../core';\nimport {\n d1Connection,\n D1DriverType,\n type D1Connection,\n} from '../connections/d1Connection';\n\nexport type D1PoolOptions = Omit<D1ConnectionOptions, 'serializer'> &\n JSONSerializationOptions;\n\nexport type D1ConnectionPool = ConnectionPool<D1Connection>;\n\nexport const d1Pool = (options: D1PoolOptions): D1ConnectionPool =>\n createSingletonConnectionPool<D1Connection>({\n driverType: D1DriverType,\n getConnection: () =>\n d1Connection({\n ...options,\n serializer: JSONSerializer.from(options),\n }),\n });\n","export * from './connections';\nimport type { D1Database } from '@cloudflare/workers-types';\nimport type { D1ConnectionPool } from '../../../cloudflare';\nimport {\n dumboDatabaseDriverRegistry,\n type DumboConnectionOptions,\n type DumboDatabaseDriver,\n} from '../../../core';\nimport {\n DefaultSQLiteMigratorOptions,\n sqliteFormatter,\n sqliteMetadata,\n} from '../core';\nimport { D1DriverType, type D1Connection } from './connections';\nimport { d1Pool, type D1PoolOptions } from './pool';\n\nexport type D1DumboOptions = D1PoolOptions;\n\nexport const d1DumboDriver: DumboDatabaseDriver<\n D1Connection,\n D1DumboOptions,\n D1ConnectionPool\n> = {\n driverType: D1DriverType,\n createPool: (options) => d1Pool(options),\n sqlFormatter: sqliteFormatter,\n defaultMigratorOptions: DefaultSQLiteMigratorOptions,\n canHandle: (options) => {\n return options.driverType === D1DriverType && 'database' in options;\n },\n databaseMetadata: sqliteMetadata,\n};\n\nexport const useD1DumboDriver = () => {\n dumboDatabaseDriverRegistry.register(D1DriverType, d1DumboDriver);\n};\n\nexport type D1DumboConnectionOptions = DumboConnectionOptions<\n typeof d1DumboDriver\n> & { database: D1Database };\n\nuseD1DumboDriver();\n\nexport * from './connections';\nexport * from './errors';\nexport * from './execute';\nexport * from './formatter';\nexport * from './pool';\nexport * from './transactions';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cloudflare.cjs","names":["dumboDatabaseMetadataRegistry","ansiSqlReservedWordsMap","chalk","getErrorMessage","asError","mapConstraintError","exhaustiveCheck"],"sources":["../src/core/errors/index.ts","../src/core/execute/execute.ts","../src/core/connections/transaction.ts","../src/core/connections/connection.ts","../src/core/connections/pool.ts","../src/core/drivers/databaseDriver.ts","../src/core/query/selectors.ts","../src/core/schema/schemaComponent.ts","../src/core/schema/components/columnSchemaComponent.ts","../src/core/schema/components/indexSchemaComponent.ts","../src/core/schema/components/tableSchemaComponent.ts","../src/core/schema/components/databaseSchemaSchemaComponent.ts","../src/core/schema/components/databaseSchemaComponent.ts","../src/core/schema/databaseMetadata/databaseMetadata.ts","../src/core/schema/dumboSchema/dumboSchema.ts","../src/core/serializer/json/index.ts","../src/core/sql/parametrizedSQL/parametrizedSQL.ts","../src/core/sql/tokens/sqlToken.ts","../src/core/sql/tokens/columnTokens.ts","../src/core/sql/processors/sqlProcessor.ts","../src/core/sql/processors/defaultProcessors.ts","../src/core/sql/processors/sqlProcessorRegistry.ts","../src/core/sql/processors/columnProcessors.ts","../src/core/sql/processors/index.ts","../src/core/sql/tokenizedSQL/tokenizedSQL.ts","../src/core/sql/sql.ts","../src/core/sql/valueMappers/reservedSqlWords.ts","../src/core/sql/valueMappers/sqlValueMapper.ts","../src/core/sql/formatters/sqlFormatter.ts","../src/core/tracing/printing/color.ts","../src/core/tracing/printing/pretty.ts","../src/core/tracing/index.ts","../src/core/schema/sqlMigration.ts","../src/core/schema/migrators/schemaComponentMigrator.ts","../src/core/schema/migrators/migrator.ts","../src/storage/sqlite/core/errors/errorMapper.ts","../src/storage/sqlite/core/sql/processors/columProcessors.ts","../src/storage/sqlite/core/sql/formatter/index.ts","../src/storage/sqlite/core/execute/execute.ts","../src/storage/sqlite/core/transactions/index.ts","../src/storage/sqlite/core/connections/connectionString.ts","../src/storage/sqlite/core/connections/index.ts","../src/storage/sqlite/core/pool/pool.ts","../src/storage/sqlite/core/schema/migrations.ts","../src/storage/sqlite/core/schema/schema.ts","../src/storage/sqlite/core/schema/sqliteMetadata.ts","../src/storage/sqlite/core/sql/json.ts","../src/storage/sqlite/core/index.ts","../src/storage/sqlite/d1/connections/d1Client.ts","../src/storage/sqlite/d1/errors/errorMapper.ts","../src/storage/sqlite/d1/execute/d1SqlExecutor.ts","../src/storage/sqlite/d1/transactions/d1Transaction.ts","../src/storage/sqlite/d1/connections/d1Connection.ts","../src/storage/sqlite/d1/pool/d1ConnectionPool.ts","../src/storage/sqlite/d1/index.ts"],"sourcesContent":["const isNumber = (val: unknown): val is number =>\n typeof val === 'number' && val === val;\n\nconst isString = (val: unknown): val is string => typeof val === 'string';\n\nexport class DumboError extends Error {\n static readonly ErrorCode: number = 500;\n static readonly ErrorType: string = 'DumboError';\n\n public errorCode: number;\n public errorType: string;\n public innerError: Error | undefined;\n\n constructor(\n options?:\n | {\n errorCode: number;\n errorType?: string;\n message?: string | undefined;\n innerError?: Error | undefined;\n }\n | string\n | number,\n ) {\n const errorCode =\n options && typeof options === 'object' && 'errorCode' in options\n ? options.errorCode\n : isNumber(options)\n ? options\n : DumboError.ErrorCode;\n const errorType =\n options && typeof options === 'object' && 'errorType' in options\n ? (options.errorType ?? DumboError.ErrorType)\n : DumboError.ErrorType;\n const message =\n options && typeof options === 'object' && 'message' in options\n ? options.message\n : isString(options)\n ? options\n : `Error with status code '${errorCode}' ocurred during DumboError processing`;\n const innerError =\n options && typeof options === 'object' && 'innerError' in options\n ? options.innerError\n : undefined;\n\n super(message, { cause: innerError });\n this.errorCode = errorCode;\n this.errorType = errorType;\n this.innerError = innerError;\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, DumboError.prototype);\n }\n\n public static isInstanceOf<ErrorType extends DumboError = DumboError>(\n error: unknown,\n options?: { errorCode?: number; errorType?: string },\n ): error is ErrorType {\n if (\n typeof error !== 'object' ||\n error === null ||\n !('errorCode' in error) ||\n !isNumber(error.errorCode) ||\n !('errorType' in error) ||\n !isString(error.errorType)\n )\n return false;\n\n if (!options) return true;\n\n if (\n options.errorCode !== undefined &&\n error.errorCode !== options.errorCode\n )\n return false;\n if (\n options.errorType !== undefined &&\n error.errorType !== options.errorType\n )\n return false;\n\n return true;\n }\n}\n\nexport class ConcurrencyError extends DumboError {\n static readonly ErrorCode: number = 412;\n static readonly ErrorType: string = 'ConcurrencyError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: ConcurrencyError.ErrorCode,\n errorType: ConcurrencyError.ErrorType,\n message: message ?? `Expected document state does not match current one!`,\n innerError,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ConcurrencyError.prototype);\n }\n}\n\nexport class TransientDatabaseError extends DumboError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'TransientDatabaseError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: TransientDatabaseError.ErrorCode,\n errorType: TransientDatabaseError.ErrorType,\n message:\n message ??\n `A transient error occurred during database operation. Retrying the operation might succeed.`,\n innerError,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, TransientDatabaseError.prototype);\n }\n}\n\nexport class ConnectionError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'ConnectionError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ?? `A connection error occurred during database operation.`,\n innerError,\n );\n this.errorType = ConnectionError.ErrorType;\n\n Object.setPrototypeOf(this, ConnectionError.prototype);\n }\n}\n\nexport class SerializationError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'SerializationError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ??\n `A serialization failure occurred. The transaction can be retried.`,\n innerError,\n );\n this.errorType = SerializationError.ErrorType;\n\n Object.setPrototypeOf(this, SerializationError.prototype);\n }\n}\n\nexport class DeadlockError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'DeadlockError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ?? `A deadlock was detected. The transaction can be retried.`,\n innerError,\n );\n this.errorType = DeadlockError.ErrorType;\n\n Object.setPrototypeOf(this, DeadlockError.prototype);\n }\n}\n\nexport class LockNotAvailableError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'LockNotAvailableError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `The requested lock is not available.`, innerError);\n this.errorType = LockNotAvailableError.ErrorType;\n\n Object.setPrototypeOf(this, LockNotAvailableError.prototype);\n }\n}\n\nexport class InsufficientResourcesError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'InsufficientResourcesError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ??\n `Insufficient resources to complete the database operation (e.g. disk full, out of memory, too many connections).`,\n innerError,\n );\n this.errorType = InsufficientResourcesError.ErrorType;\n\n Object.setPrototypeOf(this, InsufficientResourcesError.prototype);\n }\n}\n\nexport class SystemError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'SystemError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ?? `A system-level error occurred (e.g. I/O error).`,\n innerError,\n );\n this.errorType = SystemError.ErrorType;\n\n Object.setPrototypeOf(this, SystemError.prototype);\n }\n}\n\nexport class AdminShutdownError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'AdminShutdownError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ?? `The database server is shutting down or restarting.`,\n innerError,\n );\n this.errorType = AdminShutdownError.ErrorType;\n\n Object.setPrototypeOf(this, AdminShutdownError.prototype);\n }\n}\n\nexport class QueryCanceledError extends TransientDatabaseError {\n static readonly ErrorCode: number = 503;\n static readonly ErrorType: string = 'QueryCanceledError';\n\n constructor(message?: string, innerError?: Error) {\n super(\n message ??\n `The query was canceled, e.g. due to statement timeout or user request.`,\n innerError,\n );\n this.errorType = QueryCanceledError.ErrorType;\n\n Object.setPrototypeOf(this, QueryCanceledError.prototype);\n }\n}\n\nexport class IntegrityConstraintViolationError extends DumboError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'IntegrityConstraintViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: IntegrityConstraintViolationError.ErrorCode,\n errorType: IntegrityConstraintViolationError.ErrorType,\n message: message ?? `An integrity constraint violation occurred!`,\n innerError,\n });\n\n Object.setPrototypeOf(this, IntegrityConstraintViolationError.prototype);\n }\n}\n\nexport class UniqueConstraintError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'UniqueConstraintError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `Unique constraint violation occurred!`, innerError);\n this.errorType = UniqueConstraintError.ErrorType;\n\n Object.setPrototypeOf(this, UniqueConstraintError.prototype);\n }\n}\n\nexport class ForeignKeyViolationError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'ForeignKeyViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `Foreign key constraint violation occurred!`, innerError);\n this.errorType = ForeignKeyViolationError.ErrorType;\n\n Object.setPrototypeOf(this, ForeignKeyViolationError.prototype);\n }\n}\n\nexport class NotNullViolationError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'NotNullViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `NOT NULL constraint violation occurred!`, innerError);\n this.errorType = NotNullViolationError.ErrorType;\n\n Object.setPrototypeOf(this, NotNullViolationError.prototype);\n }\n}\n\nexport class CheckViolationError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'CheckViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `CHECK constraint violation occurred!`, innerError);\n this.errorType = CheckViolationError.ErrorType;\n\n Object.setPrototypeOf(this, CheckViolationError.prototype);\n }\n}\n\nexport class ExclusionViolationError extends IntegrityConstraintViolationError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'ExclusionViolationError';\n\n constructor(message?: string, innerError?: Error) {\n super(message ?? `Exclusion constraint violation occurred!`, innerError);\n this.errorType = ExclusionViolationError.ErrorType;\n\n Object.setPrototypeOf(this, ExclusionViolationError.prototype);\n }\n}\n\nexport class DataError extends DumboError {\n static readonly ErrorCode: number = 400;\n static readonly ErrorType: string = 'DataError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: DataError.ErrorCode,\n errorType: DataError.ErrorType,\n message:\n message ?? `A data error occurred (e.g. invalid value, type mismatch).`,\n innerError,\n });\n\n Object.setPrototypeOf(this, DataError.prototype);\n }\n}\n\nexport class InvalidOperationError extends DumboError {\n static readonly ErrorCode: number = 400;\n static readonly ErrorType: string = 'InvalidOperationError';\n\n constructor(message?: string, innerError?: Error) {\n super({\n errorCode: InvalidOperationError.ErrorCode,\n errorType: InvalidOperationError.ErrorType,\n message:\n message ??\n `Invalid operation (e.g. syntax error, insufficient privileges, undefined table).`,\n innerError,\n });\n\n Object.setPrototypeOf(this, InvalidOperationError.prototype);\n }\n}\n","import type { Connection } from '../connections';\nimport type { DatabaseDriverType } from '../drivers';\nimport { DumboError } from '../errors';\nimport type { QueryResult, QueryResultRow } from '../query';\nimport type { JSONDeserializeOptions, JSONSerializer } from '../serializer';\nimport type { SQL, SQLFormatter } from '../sql';\n\nexport const mapColumnToJSON = (\n column: string,\n serializer: JSONSerializer,\n options?: JSONDeserializeOptions,\n) => ({\n [column]: (value: unknown) => {\n if (typeof value === 'string') {\n try {\n return serializer.deserialize(value, options);\n } catch {\n // ignore\n }\n }\n\n return value;\n },\n});\n\nexport const mapColumnToBigint = (column: string) => ({\n [column]: (value: unknown) => {\n if (typeof value === 'number' || typeof value === 'string') {\n return BigInt(value);\n }\n\n return value;\n },\n});\n\nexport const mapColumnToDate = (column: string) => ({\n [column]: (value: unknown) => {\n if (typeof value === 'number' || typeof value === 'string') {\n return new Date(value);\n }\n\n return value;\n },\n});\n\nexport const mapSQLQueryResult = <T>(\n result: T,\n mapping: SQLQueryResultColumnMapping,\n) => {\n if (typeof result !== 'object' || result === null) return result;\n\n const mappedResult: Record<string, unknown> = {\n ...(result as Record<string, unknown>),\n };\n\n for (const column of Object.keys(mapping)) {\n if (column in mappedResult) {\n mappedResult[column] = mapping[column]!(mappedResult[column]);\n }\n }\n\n return mappedResult as T;\n};\n\nexport type SQLQueryResultColumnMapping = {\n [column: string]: (value: unknown) => unknown;\n};\n\nexport type SQLQueryOptions = {\n timeoutMs?: number | undefined;\n mapping?: SQLQueryResultColumnMapping;\n};\n\nexport type SQLCommandOptions = {\n timeoutMs?: number | undefined;\n mapping?: SQLQueryResultColumnMapping;\n};\n\nexport type BatchSQLCommandOptions = SQLCommandOptions & {\n assertChanges?: boolean;\n};\n\nexport class BatchCommandNoChangesError extends DumboError {\n static readonly ErrorCode: number = 409;\n static readonly ErrorType: string = 'BatchCommandNoChangesError';\n\n readonly statementIndex: number;\n\n constructor(statementIndex: number) {\n super({\n errorCode: BatchCommandNoChangesError.ErrorCode,\n errorType: BatchCommandNoChangesError.ErrorType,\n message: `Batch command at index ${statementIndex} affected no rows`,\n });\n this.name = 'BatchCommandNoChangesError';\n this.statementIndex = statementIndex;\n\n Object.setPrototypeOf(this, BatchCommandNoChangesError.prototype);\n }\n}\n\nexport type DbSQLExecutorOptions = {\n serializer: JSONSerializer;\n};\n\nexport interface DbSQLExecutor<\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n DbClient = unknown,\n> {\n driverType: DriverType;\n query<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n client: DbClient,\n sqls: SQL[],\n options?: BatchSQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n formatter: SQLFormatter;\n}\n\nexport interface SQLExecutor {\n query<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>>;\n batchQuery<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]>;\n command<Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>>;\n batchCommand<Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: BatchSQLCommandOptions,\n ): Promise<QueryResult<Result>[]>;\n}\n\nexport interface WithSQLExecutor {\n execute: SQLExecutor;\n}\n\nexport const sqlExecutor = <\n DbClient = unknown,\n DbExecutor extends DbSQLExecutor = DbSQLExecutor,\n>(\n sqlExecutor: DbExecutor,\n // TODO: In the longer term we should have different options for query and command\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.query(client, sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchQuery(client, sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.command(client, sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInNewDbClient(\n (client) => sqlExecutor.batchCommand(client, sqls, commandOptions),\n options,\n ),\n});\n\nexport const sqlExecutorInNewConnection = <\n ConnectionType extends Connection,\n>(options: {\n driverType: ConnectionType['driverType'];\n connection: () => Promise<ConnectionType>;\n}): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInNewConnection(\n (connection) => connection.execute.query(sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInNewConnection(\n (connection) => connection.execute.batchQuery(sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInNewConnection(\n (connection) => connection.execute.command(sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInNewConnection(\n (connection) => connection.execute.batchCommand(sqls, commandOptions),\n options,\n ),\n});\n\nexport const sqlExecutorInAmbientConnection = <\n ConnectionType extends Connection,\n>(options: {\n driverType: ConnectionType['driverType'];\n connection: () => Promise<ConnectionType>;\n}): SQLExecutor => ({\n query: (sql, queryOptions) =>\n executeInAmbientConnection(\n (connection) => connection.execute.query(sql, queryOptions),\n options,\n ),\n batchQuery: (sqls, queryOptions) =>\n executeInAmbientConnection(\n (connection) => connection.execute.batchQuery(sqls, queryOptions),\n options,\n ),\n command: (sql, commandOptions) =>\n executeInAmbientConnection(\n (connection) => connection.execute.command(sql, commandOptions),\n options,\n ),\n batchCommand: (sqls, commandOptions) =>\n executeInAmbientConnection(\n (connection) => connection.execute.batchCommand(sqls, commandOptions),\n options,\n ),\n});\n\nexport const executeInNewDbClient = async <\n DbClient = unknown,\n Result = unknown,\n>(\n handle: (client: DbClient) => Promise<Result>,\n options: {\n connect: () => Promise<DbClient>;\n close?: (client: DbClient, error?: unknown) => Promise<void>;\n },\n): Promise<Result> => {\n const { connect, close } = options;\n const client = await connect();\n try {\n return await handle(client);\n } catch (error) {\n if (close) await close(client, error);\n\n throw error;\n }\n};\n\nexport const executeInNewConnection = async <\n ConnectionType extends Connection,\n Result,\n>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options: {\n connection: () => Promise<ConnectionType>;\n },\n) => {\n const connection = await options.connection();\n\n try {\n return await handle(connection);\n } finally {\n await connection.close();\n }\n};\n\nexport const executeInAmbientConnection = async <\n ConnectionType extends Connection,\n Result,\n>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options: {\n connection: () => Promise<ConnectionType>;\n },\n) => {\n const connection = await options.connection();\n\n try {\n return await handle(connection);\n } finally {\n // Do not close the connection in ambient connection context\n }\n};\n","import type { WithSQLExecutor } from '../execute';\nimport type {\n AnyConnection,\n InferDbClientFromConnection,\n InferTransactionFromConnection,\n InferTransactionOptionsFromConnection,\n} from './connection';\n\nexport interface DatabaseTransaction<\n ConnectionType extends AnyConnection = AnyConnection,\n TransactionOptionsType extends DatabaseTransactionOptions =\n DatabaseTransactionOptions,\n> extends WithSQLExecutor {\n driverType: ConnectionType['driverType'];\n connection: ConnectionType;\n begin: () => Promise<void>;\n commit: () => Promise<void>;\n rollback: (error?: unknown) => Promise<void>;\n _transactionOptions: TransactionOptionsType;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyDatabaseTransaction = DatabaseTransaction<any, any>;\n\nexport type DatabaseTransactionOptions = {\n allowNestedTransactions?: boolean;\n readonly?: boolean;\n};\n\nexport type InferTransactionOptionsFromTransaction<\n C extends AnyDatabaseTransaction,\n> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n C extends DatabaseTransaction<any, infer TO> ? TO : never;\n\nexport interface WithDatabaseTransactionFactory<\n ConnectionType extends AnyConnection = AnyConnection,\n> {\n transaction: (\n options?: InferTransactionOptionsFromConnection<ConnectionType>,\n ) => InferTransactionFromConnection<ConnectionType>;\n\n withTransaction: <Result = never>(\n handle: (\n transaction: InferTransactionFromConnection<ConnectionType>,\n ) => Promise<TransactionResult<Result> | Result>,\n options?: InferTransactionOptionsFromConnection<ConnectionType>,\n ) => Promise<Result>;\n}\n\nexport type TransactionResult<Result> = { success: boolean; result: Result };\n\nconst toTransactionResult = <Result>(\n transactionResult: TransactionResult<Result> | Result,\n): TransactionResult<Result> =>\n transactionResult !== undefined &&\n transactionResult !== null &&\n typeof transactionResult === 'object' &&\n 'success' in transactionResult\n ? transactionResult\n : { success: true, result: transactionResult };\n\nexport const executeInTransaction = async <\n DatabaseTransactionType extends AnyDatabaseTransaction =\n AnyDatabaseTransaction,\n Result = void,\n>(\n transaction: DatabaseTransactionType,\n handle: (\n transaction: DatabaseTransactionType,\n ) => Promise<TransactionResult<Result> | Result>,\n): Promise<Result> => {\n await transaction.begin();\n\n try {\n const { success, result } = toTransactionResult(await handle(transaction));\n\n if (success) await transaction.commit();\n else await transaction.rollback();\n\n return result;\n } catch (e) {\n await transaction.rollback();\n throw e;\n }\n};\n\nexport const transactionFactoryWithDbClient = <\n ConnectionType extends AnyConnection = AnyConnection,\n>(\n connect: () => Promise<InferDbClientFromConnection<ConnectionType>>,\n initTransaction: (\n client: Promise<InferDbClientFromConnection<ConnectionType>>,\n options?: InferTransactionOptionsFromConnection<ConnectionType> & {\n close: (\n client: InferDbClientFromConnection<ConnectionType>,\n error?: unknown,\n ) => Promise<void>;\n },\n ) => InferTransactionFromConnection<ConnectionType>,\n): WithDatabaseTransactionFactory<ConnectionType> => {\n let currentTransaction:\n InferTransactionFromConnection<ConnectionType> | undefined = undefined;\n\n const getOrInitCurrentTransaction = (\n options?: InferTransactionOptionsFromConnection<ConnectionType>,\n ) =>\n currentTransaction ??\n (currentTransaction = initTransaction(connect(), {\n close: () => {\n currentTransaction = undefined;\n return Promise.resolve();\n },\n ...(options ??\n ({} as InferTransactionOptionsFromConnection<ConnectionType>)),\n }));\n\n return {\n transaction: getOrInitCurrentTransaction,\n withTransaction: (handle, options) =>\n executeInTransaction(getOrInitCurrentTransaction(options), handle),\n };\n};\n\nconst wrapInConnectionClosure = async <\n ConnectionType extends AnyConnection = AnyConnection,\n Result = unknown,\n>(\n connection: ConnectionType,\n handle: () => Promise<Result>,\n) => {\n try {\n return await handle();\n } finally {\n await connection.close();\n }\n};\n\nexport const transactionFactoryWithNewConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n>(\n connect: () => ConnectionType,\n): WithDatabaseTransactionFactory<ConnectionType> => ({\n transaction: (options) => {\n const connection = connect();\n const transaction = connection.transaction(\n options,\n ) as InferTransactionFromConnection<ConnectionType>;\n\n return {\n ...transaction,\n commit: () =>\n wrapInConnectionClosure(connection, () => transaction.commit()),\n rollback: () =>\n wrapInConnectionClosure(connection, () => transaction.rollback()),\n };\n },\n withTransaction: (handle, options) => {\n const connection = connect();\n const withTx =\n connection.withTransaction as WithDatabaseTransactionFactory<ConnectionType>['withTransaction'];\n return wrapInConnectionClosure(connection, () => withTx(handle, options));\n },\n});\n\nexport const transactionFactoryWithAmbientConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n>(\n connect: () => ConnectionType,\n): WithDatabaseTransactionFactory<ConnectionType> => ({\n transaction: (options) => {\n const connection = connect();\n const transaction = connection.transaction(options);\n\n return {\n ...transaction,\n commit: () => transaction.commit(),\n rollback: () => transaction.rollback(),\n } as InferTransactionFromConnection<ConnectionType>;\n },\n withTransaction: (handle, options) => {\n const connection = connect();\n const withTx =\n connection.withTransaction as WithDatabaseTransactionFactory<ConnectionType>['withTransaction'];\n return withTx(handle, options);\n },\n});\n\nexport const transactionFactoryWithAsyncAmbientConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n>(\n driverType: ConnectionType['driverType'],\n connect: () => Promise<ConnectionType>,\n close?: (connection: ConnectionType) => void | Promise<void>,\n): WithDatabaseTransactionFactory<ConnectionType> => {\n close ??= () => Promise.resolve();\n return {\n transaction: (options) => {\n let conn: ConnectionType | null = null;\n let innerTx: DatabaseTransaction<ConnectionType> | null = null;\n let connectingPromise: Promise<void> | null = null;\n\n const ensureConnection = async () => {\n if (conn) return innerTx!;\n\n if (!connectingPromise) {\n connectingPromise = (async () => {\n conn = await connect();\n innerTx = conn.transaction(options);\n })();\n }\n\n await connectingPromise;\n return innerTx!;\n };\n\n const tx: DatabaseTransaction<ConnectionType> = {\n driverType,\n get connection() {\n if (!conn) {\n throw new Error('Transaction not started - call begin() first');\n }\n return conn;\n },\n execute: {\n query: async (sql, queryOptions) => {\n const tx = await ensureConnection();\n return tx.execute.query(sql, queryOptions);\n },\n batchQuery: async (sqls, queryOptions) => {\n const tx = await ensureConnection();\n return tx.execute.batchQuery(sqls, queryOptions);\n },\n command: async (sql, commandOptions) => {\n const tx = await ensureConnection();\n return tx.execute.command(sql, commandOptions);\n },\n batchCommand: async (sqls, commandOptions) => {\n const tx = await ensureConnection();\n return tx.execute.batchCommand(sqls, commandOptions);\n },\n },\n begin: async () => {\n const tx = await ensureConnection();\n return tx.begin();\n },\n commit: async () => {\n if (!innerTx) {\n throw new Error('Transaction not started');\n }\n try {\n return await innerTx.commit();\n } finally {\n if (conn) await close(conn);\n }\n },\n rollback: async (error?: unknown) => {\n if (!innerTx) {\n if (conn) await close(conn);\n return;\n }\n try {\n return await innerTx.rollback(error);\n } finally {\n if (conn) await close(conn);\n }\n },\n _transactionOptions: undefined as unknown as DatabaseTransactionOptions,\n };\n\n return tx as InferTransactionFromConnection<ConnectionType>;\n },\n withTransaction: async (handle, options) => {\n const conn = await connect();\n try {\n const withTx =\n conn.withTransaction as WithDatabaseTransactionFactory<ConnectionType>['withTransaction'];\n return await withTx(handle, options);\n } finally {\n await close(conn);\n }\n },\n };\n};\n","import type { DatabaseDriverType } from '../drivers';\nimport {\n sqlExecutor,\n type DbSQLExecutor,\n type DbSQLExecutorOptions,\n type WithSQLExecutor,\n} from '../execute';\nimport type { JSONSerializer } from '../serializer';\nimport {\n transactionFactoryWithDbClient,\n type AnyDatabaseTransaction,\n type DatabaseTransaction,\n type InferTransactionOptionsFromTransaction,\n type WithDatabaseTransactionFactory,\n} from './transaction';\n\nexport interface Connection<\n Self extends AnyConnection = AnyConnection,\n DriverType extends DatabaseDriverType = DatabaseDriverType,\n DbClient = unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TransactionType extends DatabaseTransaction<Self, any> = DatabaseTransaction<\n Self,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n >,\n>\n extends WithSQLExecutor, WithDatabaseTransactionFactory<Self> {\n driverType: DriverType;\n open: () => Promise<DbClient>;\n close: () => Promise<void>;\n _transactionType: TransactionType;\n}\n\nexport type AnyConnection = Connection<\n AnyConnection,\n DatabaseDriverType,\n unknown,\n AnyDatabaseTransaction\n>;\n\nexport type InferDriverTypeFromConnection<C extends AnyConnection> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n C extends Connection<any, infer DT, any, any> ? DT : never;\n\nexport type InferDbClientFromConnection<C extends AnyConnection> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n C extends Connection<any, any, infer DC, any> ? DC : never;\n\nexport type InferTransactionFromConnection<C extends AnyConnection> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n C extends Connection<any, any, any, infer DT> ? DT : never;\n\nexport type InferTransactionOptionsFromConnection<C extends AnyConnection> =\n InferTransactionOptionsFromTransaction<InferTransactionFromConnection<C>>;\n\nexport type ConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n> = {\n driverType?: ConnectionType['driverType'];\n transactionOptions?: InferTransactionOptionsFromConnection<ConnectionType>;\n};\n\nexport type ConnectionFactory<\n ConnectionType extends AnyConnection = AnyConnection,\n> = (options: ConnectionOptions<ConnectionType>) => ConnectionType;\n\nexport type WithConnectionOptions = {\n readonly?: boolean;\n};\n\nexport interface WithConnectionFactory<\n ConnectionType extends AnyConnection = AnyConnection,\n> {\n connection: (options?: WithConnectionOptions) => Promise<ConnectionType>;\n\n withConnection: <Result = unknown>(\n handle: (connection: ConnectionType) => Promise<Result>,\n options?: WithConnectionOptions,\n ) => Promise<Result>;\n}\n\nexport type InitTransaction<\n ConnectionType extends AnyConnection = AnyConnection,\n> = (connection: () => ConnectionType) => (\n client: Promise<InferDbClientFromConnection<ConnectionType>>,\n options?: InferTransactionOptionsFromConnection<ConnectionType> & {\n close: (\n client: InferDbClientFromConnection<ConnectionType>,\n error?: unknown,\n ) => Promise<void>;\n },\n) => InferTransactionFromConnection<ConnectionType>;\n\nexport type CreateConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n> = {\n driverType: InferDriverTypeFromConnection<ConnectionType>;\n connect: () => Promise<InferDbClientFromConnection<ConnectionType>>;\n close: (client: InferDbClientFromConnection<ConnectionType>) => Promise<void>;\n initTransaction: InitTransaction<ConnectionType>;\n serializer: JSONSerializer;\n executor: (options: DbSQLExecutorOptions) => Executor;\n};\n\nexport type CreateAmbientConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n> = {\n driverType: InferDriverTypeFromConnection<ConnectionType>;\n client: InferDbClientFromConnection<ConnectionType>;\n serializer: JSONSerializer;\n initTransaction: InitTransaction<ConnectionType>;\n executor: (options: DbSQLExecutorOptions) => Executor;\n};\n\nexport const createAmbientConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n>(\n options: CreateAmbientConnectionOptions<ConnectionType, Executor>,\n): ConnectionType => {\n const { driverType, client, executor, initTransaction, serializer } = options;\n\n const clientPromise = Promise.resolve(client);\n const closePromise = Promise.resolve();\n const open = () => clientPromise;\n const close = () => closePromise;\n\n const connection: Connection<\n ConnectionType,\n InferDriverTypeFromConnection<ConnectionType>,\n InferDbClientFromConnection<ConnectionType>,\n InferTransactionFromConnection<ConnectionType>\n > = {\n driverType,\n open,\n close,\n ...transactionFactoryWithDbClient<ConnectionType>(\n open,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor({ serializer }), { connect: open }),\n _transactionType:\n undefined as unknown as InferTransactionFromConnection<ConnectionType>,\n };\n\n const typedConnection = connection as unknown as ConnectionType;\n\n return typedConnection;\n};\n\nexport type CreateSingletonConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n> = {\n driverType: InferDriverTypeFromConnection<ConnectionType>;\n connect: () => Promise<InferDbClientFromConnection<ConnectionType>>;\n close: (client: InferDbClientFromConnection<ConnectionType>) => Promise<void>;\n initTransaction: InitTransaction<ConnectionType>;\n serializer: JSONSerializer;\n executor: (options: DbSQLExecutorOptions) => Executor;\n};\n\nexport const createSingletonConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n>(\n options: CreateSingletonConnectionOptions<ConnectionType, Executor>,\n): ConnectionType => {\n const { driverType, connect, close, initTransaction, executor, serializer } =\n options;\n\n let client: InferDbClientFromConnection<ConnectionType> | null = null;\n let connectPromise: Promise<\n InferDbClientFromConnection<ConnectionType>\n > | null = null;\n\n const getClient = async () => {\n if (client) return client;\n if (!connectPromise) {\n connectPromise = connect().then((c) => {\n client = c;\n return c;\n });\n }\n return connectPromise;\n };\n\n const connection: Connection<\n ConnectionType,\n InferDriverTypeFromConnection<ConnectionType>,\n InferDbClientFromConnection<ConnectionType>,\n InferTransactionFromConnection<ConnectionType>\n > = {\n driverType,\n open: getClient,\n close: () => (client ? close(client) : Promise.resolve()),\n ...transactionFactoryWithDbClient<ConnectionType>(\n getClient,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor({ serializer }), { connect: getClient }),\n _transactionType:\n undefined as unknown as InferTransactionFromConnection<ConnectionType>,\n };\n\n const typedConnection = connection as unknown as ConnectionType;\n\n return typedConnection;\n};\n\nexport type CreateTransientConnectionOptions<\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n> = {\n driverType: InferDriverTypeFromConnection<ConnectionType>;\n open: () => Promise<InferDbClientFromConnection<ConnectionType>>;\n close: () => Promise<void>;\n initTransaction: InitTransaction<ConnectionType>;\n serializer: JSONSerializer;\n executor: (options: DbSQLExecutorOptions) => Executor;\n};\n\nexport const createTransientConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n>(\n options: CreateTransientConnectionOptions<ConnectionType, Executor>,\n): ConnectionType => {\n const { driverType, open, close, initTransaction, executor, serializer } =\n options;\n\n const connection: Connection<\n ConnectionType,\n InferDriverTypeFromConnection<ConnectionType>,\n InferDbClientFromConnection<ConnectionType>,\n InferTransactionFromConnection<ConnectionType>\n > = {\n driverType,\n open,\n close,\n ...transactionFactoryWithDbClient<ConnectionType>(\n open,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor({ serializer }), { connect: open }),\n _transactionType:\n undefined as unknown as InferTransactionFromConnection<ConnectionType>,\n };\n\n const typedConnection = connection as unknown as ConnectionType;\n\n return typedConnection;\n};\n\nexport const createConnection = <\n ConnectionType extends AnyConnection = AnyConnection,\n Executor extends DbSQLExecutor = DbSQLExecutor,\n>(\n options: CreateConnectionOptions<ConnectionType, Executor>,\n): ConnectionType => {\n const { driverType, connect, close, initTransaction, executor, serializer } =\n options;\n\n let client: InferDbClientFromConnection<ConnectionType> | null = null;\n let connectPromise: Promise<\n InferDbClientFromConnection<ConnectionType>\n > | null = null;\n\n const getClient = async () => {\n if (client) return client;\n if (!connectPromise) {\n connectPromise = connect().then((c) => {\n client = c;\n return c;\n });\n }\n return connectPromise;\n };\n\n const connection: Connection<\n ConnectionType,\n InferDriverTypeFromConnection<ConnectionType>,\n InferDbClientFromConnection<ConnectionType>,\n DatabaseTransaction<ConnectionType>\n > = {\n driverType,\n open: getClient,\n close: () => (client ? close(client) : Promise.resolve()),\n ...transactionFactoryWithDbClient<ConnectionType>(\n getClient,\n initTransaction(() => typedConnection),\n ),\n execute: sqlExecutor(executor({ serializer }), { connect: getClient }),\n _transactionType:\n undefined as unknown as InferTransactionFromConnection<ConnectionType>,\n };\n\n const typedConnection = connection as unknown as ConnectionType;\n\n return typedConnection;\n};\n","import {\n executeInAmbientConnection,\n executeInNewConnection,\n sqlExecutorInAmbientConnection,\n sqlExecutorInNewConnection,\n type WithSQLExecutor,\n} from '../execute';\nimport { guardBoundedAccess } from '../taskProcessing';\nimport type {\n AnyConnection,\n InferDbClientFromConnection,\n InferTransactionFromConnection,\n WithConnectionFactory,\n WithConnectionOptions,\n} from './connection';\nimport {\n transactionFactoryWithAsyncAmbientConnection,\n transactionFactoryWithNewConnection,\n type WithDatabaseTransactionFactory,\n} from './transaction';\n\nexport interface ConnectionPool<\n ConnectionType extends AnyConnection = AnyConnection,\n>\n extends\n WithSQLExecutor,\n WithConnectionFactory<ConnectionType>,\n WithDatabaseTransactionFactory<ConnectionType> {\n driverType: ConnectionType['driverType'];\n close: () => Promise<void>;\n}\n\nconst wrapPooledConnection = <ConnectionType extends AnyConnection>(\n conn: ConnectionType,\n onClose: () => Promise<void>,\n): ConnectionType => ({ ...conn, close: onClose });\n\nexport type ConnectionPoolFactory<\n ConnectionPoolType extends ConnectionPool = ConnectionPool,\n ConnectionPoolOptions = unknown,\n> = (options: ConnectionPoolOptions) => ConnectionPoolType;\n\nexport type AmbientConnectionPoolOptions<ConnectionType extends AnyConnection> =\n {\n driverType: ConnectionType['driverType'];\n connection: ConnectionType;\n };\n\nexport const createAmbientConnectionPool = <\n ConnectionType extends AnyConnection,\n>(\n options: AmbientConnectionPoolOptions<ConnectionType>,\n): ConnectionPool<ConnectionType> => {\n const { driverType, connection } = options;\n\n return createConnectionPool<ConnectionType>({\n driverType,\n getConnection: () => connection,\n execute: connection.execute,\n transaction: (options) =>\n connection.transaction(\n options,\n ) as InferTransactionFromConnection<ConnectionType>,\n withConnection: (handle, _options?) => handle(connection),\n withTransaction: (handle, options) => {\n const withTx =\n connection.withTransaction as WithDatabaseTransactionFactory<ConnectionType>['withTransaction'];\n return withTx(handle, options);\n },\n });\n};\n\nexport type SingletonConnectionPoolOptions<\n ConnectionType extends AnyConnection,\n> = {\n driverType: ConnectionType['driverType'];\n getConnection: () => ConnectionType | Promise<ConnectionType>;\n closeConnection?: (connection: ConnectionType) => void | Promise<void>;\n connectionOptions?: never;\n};\n\nexport const createSingletonConnectionPool = <\n ConnectionType extends AnyConnection,\n>(\n options: SingletonConnectionPoolOptions<ConnectionType>,\n): ConnectionPool<ConnectionType> => {\n const { driverType, getConnection } = options;\n\n let connectionPromise: Promise<ConnectionType> | null = null;\n\n const getExistingOrNewConnection = () => {\n if (!connectionPromise) {\n connectionPromise ??= Promise.resolve(getConnection());\n }\n return connectionPromise;\n };\n\n const result: ConnectionPool<ConnectionType> = {\n driverType,\n connection: () =>\n getExistingOrNewConnection().then((conn) =>\n wrapPooledConnection(conn, () => Promise.resolve()),\n ),\n execute: sqlExecutorInAmbientConnection({\n driverType,\n connection: getExistingOrNewConnection,\n }),\n withConnection: <Result>(\n handle: (connection: ConnectionType) => Promise<Result>,\n _options?: WithConnectionOptions,\n ) =>\n executeInAmbientConnection<ConnectionType, Result>(handle, {\n connection: getExistingOrNewConnection,\n }),\n ...transactionFactoryWithAsyncAmbientConnection(\n options.driverType,\n getExistingOrNewConnection,\n options.closeConnection,\n ),\n close: async () => {\n if (!connectionPromise) return;\n const connection = await connectionPromise;\n await connection.close();\n },\n };\n\n return result;\n};\n\nexport type CreateBoundedConnectionPoolOptions<\n ConnectionType extends AnyConnection,\n> = {\n driverType: ConnectionType['driverType'];\n getConnection: () => ConnectionType | Promise<ConnectionType>;\n maxConnections: number;\n};\n\nexport const createBoundedConnectionPool = <\n ConnectionType extends AnyConnection,\n>(\n options: CreateBoundedConnectionPoolOptions<ConnectionType>,\n): ConnectionPool<ConnectionType> => {\n const { driverType, maxConnections } = options;\n\n const guardMaxConnections = guardBoundedAccess(options.getConnection, {\n maxResources: maxConnections,\n reuseResources: true,\n });\n\n let closed = false;\n\n const executeWithPooling = async <Result>(\n operation: (conn: ConnectionType) => Promise<Result>,\n ): Promise<Result> => {\n const conn = await guardMaxConnections.acquire();\n try {\n return await operation(conn);\n } finally {\n guardMaxConnections.release(conn);\n }\n };\n\n return {\n driverType,\n connection: async () => {\n const conn = await guardMaxConnections.acquire();\n return wrapPooledConnection(conn, () =>\n Promise.resolve(guardMaxConnections.release(conn)),\n );\n },\n execute: {\n query: (sql, opts) =>\n executeWithPooling((c) => c.execute.query(sql, opts)),\n batchQuery: (sqls, opts) =>\n executeWithPooling((c) => c.execute.batchQuery(sqls, opts)),\n command: (sql, opts) =>\n executeWithPooling((c) => c.execute.command(sql, opts)),\n batchCommand: (sqls, opts) =>\n executeWithPooling((c) => c.execute.batchCommand(sqls, opts)),\n },\n withConnection: executeWithPooling,\n ...transactionFactoryWithAsyncAmbientConnection(\n driverType,\n guardMaxConnections.acquire,\n guardMaxConnections.release,\n ),\n close: async () => {\n if (closed) return;\n closed = true;\n\n await guardMaxConnections.stop({ force: true });\n },\n };\n};\n\nexport type SingletonClientConnectionPoolOptions<\n ConnectionType extends AnyConnection,\n> = {\n driverType: ConnectionType['driverType'];\n dbClient: InferDbClientFromConnection<ConnectionType>;\n connectionFactory: (options: {\n dbClient: InferDbClientFromConnection<ConnectionType>;\n }) => ConnectionType;\n};\n\nexport const createSingletonClientConnectionPool = <\n ConnectionType extends AnyConnection,\n>(\n options: SingletonClientConnectionPoolOptions<ConnectionType>,\n): ConnectionPool<ConnectionType> => {\n const { driverType, dbClient } = options;\n\n return createSingletonConnectionPool({\n getConnection: () => options.connectionFactory({ dbClient }),\n driverType,\n });\n};\n\nexport type CreateAlwaysNewConnectionPoolOptions<\n ConnectionType extends AnyConnection,\n ConnectionOptions extends Record<string, unknown> | undefined = undefined,\n> = ConnectionOptions extends undefined\n ? {\n driverType: ConnectionType['driverType'];\n getConnection: () => ConnectionType;\n connectionOptions?: never;\n }\n : {\n driverType: ConnectionType['driverType'];\n getConnection: (options: ConnectionOptions) => ConnectionType;\n connectionOptions: ConnectionOptions;\n };\n\nexport const createAlwaysNewConnectionPool = <\n ConnectionType extends AnyConnection,\n ConnectionOptions extends Record<string, unknown> | undefined = undefined,\n>(\n options: CreateAlwaysNewConnectionPoolOptions<\n ConnectionType,\n ConnectionOptions\n >,\n): ConnectionPool<ConnectionType> => {\n const { driverType, getConnection, connectionOptions } = options;\n\n return createConnectionPool({\n driverType,\n getConnection: () =>\n connectionOptions ? getConnection(connectionOptions) : getConnection(),\n });\n};\n\nexport type CreateConnectionPoolOptions<ConnectionType extends AnyConnection> =\n Pick<ConnectionPool<ConnectionType>, 'driverType'> &\n Partial<ConnectionPool<ConnectionType>> & {\n getConnection: () => ConnectionType;\n };\n\nexport const createConnectionPool = <ConnectionType extends AnyConnection>(\n pool: CreateConnectionPoolOptions<ConnectionType>,\n): ConnectionPool<ConnectionType> => {\n const { driverType, getConnection } = pool;\n\n const connection =\n 'connection' in pool\n ? pool.connection\n : () => Promise.resolve(getConnection());\n\n const withConnection =\n 'withConnection' in pool\n ? pool.withConnection\n : <Result>(\n handle: (connection: ConnectionType) => Promise<Result>,\n _options?: WithConnectionOptions,\n ) =>\n executeInNewConnection<ConnectionType, Result>(handle, {\n connection,\n });\n\n const close = 'close' in pool ? pool.close : () => Promise.resolve();\n\n const execute =\n 'execute' in pool\n ? pool.execute\n : sqlExecutorInNewConnection({\n driverType,\n connection,\n });\n\n const transaction =\n 'transaction' in pool && 'withTransaction' in pool\n ? {\n transaction: pool.transaction,\n withTransaction: pool.withTransaction,\n }\n : transactionFactoryWithNewConnection(getConnection);\n\n const result: ConnectionPool<ConnectionType> = {\n driverType,\n connection,\n withConnection,\n close,\n execute,\n ...transaction,\n };\n\n return result;\n};\n","import type { DatabaseDriverType } from '.';\nimport type { Dumbo, DumboConnectionOptions } from '..';\nimport type { AnyConnection } from '../connections';\nimport type { MigratorOptions } from '../schema';\nimport type { DatabaseMetadata } from '../schema/databaseMetadata/databaseMetadata';\nimport type { SQLFormatter } from '../sql';\n\nexport interface DumboDatabaseDriver<\n ConnectionType extends AnyConnection = AnyConnection,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint, @typescript-eslint/no-unused-vars\n DriverOptions extends unknown = unknown,\n DumboType extends Dumbo<ConnectionType['driverType'], ConnectionType> = Dumbo<\n ConnectionType['driverType'],\n ConnectionType\n >,\n> {\n readonly driverType: ConnectionType['driverType'];\n readonly sqlFormatter: SQLFormatter;\n readonly defaultMigratorOptions: MigratorOptions;\n readonly databaseMetadata: DatabaseMetadata;\n\n createPool(options: DumboConnectionOptions<this>): DumboType;\n\n canHandle(options: DumboConnectionOptions<this>): boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyDumboDatabaseDriver = DumboDatabaseDriver<AnyConnection, any>;\n\nexport type ExtractDumboDatabaseDriverOptions<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends DumboDatabaseDriver<any, infer O, any> ? O : never;\n\nexport type ExtractDumboTypeFromDriver<DatabaseDriver> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseDriver extends DumboDatabaseDriver<any, any, infer D> ? D : never;\n\nexport const canHandleDriverWithConnectionString =\n <\n DatabaseDriver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n ConnectionOptions extends DumboConnectionOptions<DatabaseDriver> =\n DumboConnectionOptions<DatabaseDriver>,\n >(\n driver: DatabaseDriver['driverType'],\n tryParseConnectionString: (connectionString: string) => string | null,\n ) =>\n (options: ConnectionOptions): boolean => {\n if ('driverType' in options) return options.driverType === driver;\n\n if (\n 'connectionString' in options &&\n typeof options.connectionString === 'string'\n )\n return tryParseConnectionString(options.connectionString) !== null;\n\n return false;\n };\n\nexport const DumboDatabaseDriverRegistry = () => {\n const drivers = new Map<\n DatabaseDriverType,\n DumboDatabaseDriver | (() => Promise<DumboDatabaseDriver>)\n >();\n\n const register = <Driver extends AnyDumboDatabaseDriver>(\n driverType: Driver['driverType'],\n plugin: Driver | (() => Promise<Driver>),\n ): void => {\n const entry = drivers.get(driverType);\n if (\n entry &&\n (typeof entry !== 'function' || typeof plugin === 'function')\n ) {\n return;\n }\n drivers.set(driverType, plugin);\n };\n\n const getDriver = <\n Driver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n ConnectionOptions extends DumboConnectionOptions<Driver> =\n DumboConnectionOptions<Driver>,\n >(\n options: ConnectionOptions,\n ) =>\n options.driverType\n ? drivers.get(options.driverType)\n : [...drivers.values()].find(\n (d) => typeof d !== 'function' && d.canHandle(options),\n );\n\n const tryResolve = async <\n Driver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n ConnectionOptions extends DumboConnectionOptions<Driver> =\n DumboConnectionOptions<Driver>,\n >(\n options: ConnectionOptions,\n ): Promise<Driver | null> => {\n const driver = getDriver(options);\n\n if (!driver) return null;\n\n if (typeof driver !== 'function') return driver as Driver;\n\n const plugin = await driver();\n\n register(plugin.driverType, plugin);\n return plugin as Driver;\n };\n\n const tryGet = <\n Driver extends AnyDumboDatabaseDriver = AnyDumboDatabaseDriver,\n ConnectionOptions extends DumboConnectionOptions<Driver> =\n DumboConnectionOptions<Driver>,\n >(\n options: ConnectionOptions,\n ): Driver | null => {\n const driver = getDriver(options);\n\n return driver && typeof driver !== 'function' ? (driver as Driver) : null;\n };\n\n const has = (driverType: DatabaseDriverType): boolean =>\n drivers.has(driverType);\n\n return {\n register,\n tryResolve,\n tryGet,\n has,\n get databaseDriverTypes(): DatabaseDriverType[] {\n return Array.from(drivers.keys());\n },\n };\n};\n\ndeclare global {\n var dumboDatabaseDriverRegistry: ReturnType<\n typeof DumboDatabaseDriverRegistry\n >;\n}\n\nexport const dumboDatabaseDriverRegistry =\n (globalThis.dumboDatabaseDriverRegistry =\n globalThis.dumboDatabaseDriverRegistry ?? DumboDatabaseDriverRegistry());\n","import type { QueryResult, QueryResultRow } from './query';\n\nexport const firstOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const first = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n return result.rows[0]!;\n};\n\nexport const singleOrNull = async <\n Result extends QueryResultRow = QueryResultRow,\n>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result | null> => {\n const result = await getResult;\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows.length > 0 ? (result.rows[0] ?? null) : null;\n};\n\nexport const single = async <Result extends QueryResultRow = QueryResultRow>(\n getResult: Promise<QueryResult<Result>>,\n): Promise<Result> => {\n const result = await getResult;\n\n if (result.rows.length === 0)\n throw new Error(\"Query didn't return any result\");\n\n if (result.rows.length > 1) throw new Error('Query had more than one result');\n\n return result.rows[0]!;\n};\n\nexport type CountSQLQueryResult = { count: number };\n\nexport const count = async (\n getResult: Promise<QueryResult<CountSQLQueryResult>>,\n): Promise<number> => {\n const result = await single(getResult);\n\n return Number(result.count);\n};\n\nexport type ExistsSQLQueryResult = { exists: boolean | 1 | 0 };\n\nexport const exists = async (\n getResult: Promise<QueryResult<ExistsSQLQueryResult>>,\n): Promise<boolean> => {\n const result = await single(getResult);\n\n return result.exists === true || result.exists === 1;\n};\n","import type { SQLMigration } from './sqlMigration';\n\nexport type SchemaComponent<\n ComponentKey extends string = string,\n AdditionalData extends\n | Exclude<\n Record<string, unknown>,\n | 'schemaComponentKey'\n | 'components'\n | 'migrations'\n | 'addComponent'\n | 'addMigration'\n >\n | undefined = undefined,\n> = {\n schemaComponentKey: ComponentKey;\n components: ReadonlyMap<string, SchemaComponent>;\n migrations: ReadonlyArray<SQLMigration>;\n\n addComponent: <\n SchemaComponentType extends SchemaComponent<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n > = SchemaComponent<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >,\n >(\n component: SchemaComponentType,\n ) => SchemaComponentType;\n addMigration: (migration: SQLMigration) => void;\n} & Exclude<\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n AdditionalData extends undefined ? {} : AdditionalData,\n | 'schemaComponentKey'\n | 'components'\n | 'migrations'\n | 'addComponent'\n | 'addMigration'\n>;\n\nexport type ExtractAdditionalData<T> =\n T extends SchemaComponent<infer _ComponentType, infer Data> ? Data : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnySchemaComponent = SchemaComponent<string, Record<string, any>>;\n\nexport type AnySchemaComponentOfType<ComponentType extends string = string> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SchemaComponent<ComponentType, any>;\n\nexport type SchemaComponentOptions<\n AdditionalOptions extends Record<string, unknown> = Record<string, unknown>,\n> = {\n migrations?: ReadonlyArray<SQLMigration>;\n components?: ReadonlyArray<SchemaComponent>;\n} & Omit<AdditionalOptions, 'migrations' | 'components'>;\n\nexport type SchemaComponentType<Kind extends string = string> = `sc:${Kind}`;\n\nexport type DumboSchemaComponentType<Kind extends string = string> =\n SchemaComponentType<`dumbo:${Kind}`>;\n\nexport const schemaComponent = <const ComponentKey extends string = string>(\n key: ComponentKey,\n options: SchemaComponentOptions,\n): SchemaComponent<ComponentKey> => {\n const componentsMap = new Map<string, AnySchemaComponent>(\n options.components?.map((comp) => [comp.schemaComponentKey, comp]),\n );\n\n const migrations: SQLMigration[] = [...(options.migrations ?? [])];\n\n return {\n schemaComponentKey: key,\n components: componentsMap,\n get migrations(): SQLMigration[] {\n return [\n ...migrations,\n ...Array.from(componentsMap.values()).flatMap((c) => c.migrations),\n ];\n },\n addComponent: <\n SchemaComponentType extends AnySchemaComponent = AnySchemaComponent,\n >(\n component: SchemaComponentType,\n ): SchemaComponentType => {\n componentsMap.set(component.schemaComponentKey, component);\n migrations.push(...component.migrations);\n return component;\n },\n addMigration: (migration: SQLMigration) => {\n migrations.push(migration);\n },\n };\n};\n\nexport const isSchemaComponentOfType = <\n SchemaComponentOfType extends AnySchemaComponent = AnySchemaComponent,\n>(\n component: AnySchemaComponent,\n prefix: string,\n): component is SchemaComponentOfType =>\n component.schemaComponentKey.startsWith(prefix);\n\nexport const filterSchemaComponentsOfType = <T extends AnySchemaComponent>(\n components: ReadonlyMap<string, AnySchemaComponent>,\n prefix: string,\n): ReadonlyMap<string, T> => mapSchemaComponentsOfType<T>(components, prefix);\n\nexport const mapSchemaComponentsOfType = <T extends AnySchemaComponent>(\n components: ReadonlyMap<string, AnySchemaComponent>,\n prefix: string,\n keyMapper?: (component: T) => string,\n): ReadonlyMap<string, T> =>\n new Map(\n Array.from(components.entries())\n .filter(([urn]) => urn.startsWith(prefix))\n .map(([urn, component]) => [\n keyMapper ? keyMapper(component as T) : urn,\n component as T,\n ]),\n );\n\nexport const findSchemaComponentsOfType = <T extends AnySchemaComponent>(\n root: AnySchemaComponent,\n prefix: string,\n): T[] => {\n const results: T[] = [];\n\n const traverse = (component: AnySchemaComponent) => {\n if (component.schemaComponentKey.startsWith(prefix)) {\n results.push(component as T);\n }\n for (const child of component.components.values()) {\n traverse(child);\n }\n };\n\n traverse(root);\n\n return results;\n};\n","import type { AnyColumnTypeToken, SQLColumnToken } from '../../sql';\nimport {\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\n\nexport type ColumnURNType = 'sc:dumbo:column';\nexport type ColumnURN<ColumnName extends string = string> =\n `${ColumnURNType}:${ColumnName}`;\n\nexport const ColumnURNType: ColumnURNType = 'sc:dumbo:column';\nexport const ColumnURN = <ColumnName extends string = string>({\n name,\n}: {\n name: ColumnName;\n}): ColumnURN<ColumnName> => `${ColumnURNType}:${name}`;\n\nexport type ColumnSchemaComponent<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n ColumnName extends string = string,\n> = SchemaComponent<\n ColumnURN<ColumnName>,\n Readonly<{\n columnName: ColumnName;\n }>\n> &\n SQLColumnToken<ColumnType>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyColumnSchemaComponent = ColumnSchemaComponent<any>;\n\nexport type ColumnSchemaComponentOptions<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n> = Omit<SQLColumnToken<ColumnType>, 'name' | 'sqlTokenType'> &\n SchemaComponentOptions;\n\nexport const columnSchemaComponent = <\n const ColumnType extends AnyColumnTypeToken | string =\n AnyColumnTypeToken | string,\n const TOptions extends ColumnSchemaComponentOptions<ColumnType> =\n ColumnSchemaComponentOptions<ColumnType>,\n const ColumnName extends string = string,\n>(\n params: {\n columnName: ColumnName;\n } & TOptions,\n): ColumnSchemaComponent<ColumnType, ColumnName> &\n (TOptions extends { notNull: true } | { primaryKey: true }\n ? { notNull: true }\n : { notNull?: false }) => {\n const {\n columnName,\n type,\n notNull,\n unique,\n primaryKey,\n default: defaultValue,\n ...schemaOptions\n } = params;\n\n const sc = schemaComponent(ColumnURN({ name: columnName }), schemaOptions);\n\n const result: Record<string, unknown> = {\n ...sc,\n columnName,\n notNull,\n unique,\n primaryKey,\n defaultValue,\n sqlTokenType: 'SQL_COLUMN',\n name: columnName,\n type,\n };\n\n return result as ColumnSchemaComponent<ColumnType, ColumnName> &\n (TOptions extends { notNull: true } | { primaryKey: true }\n ? { notNull: true }\n : { notNull?: false });\n};\n","import {\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\nimport type { ColumnSchemaComponent } from './columnSchemaComponent';\n\nexport type IndexURNType = 'sc:dumbo:index';\nexport type IndexURN = `${IndexURNType}:${string}`;\n\nexport type IndexSchemaComponent = SchemaComponent<\n IndexURN,\n Readonly<{\n indexName: string;\n columnNames: ReadonlyArray<string>;\n isUnique: boolean;\n addColumn: (column: string | ColumnSchemaComponent) => void;\n }>\n>;\n\nexport const IndexURNType: IndexURNType = 'sc:dumbo:index';\nexport const IndexURN = ({ name }: { name: string }): IndexURN =>\n `${IndexURNType}:${name}`;\n\nexport const indexSchemaComponent = ({\n indexName,\n columnNames,\n isUnique,\n ...migrationsOrComponents\n}: {\n indexName: string;\n columnNames: string[];\n isUnique: boolean;\n} & SchemaComponentOptions): IndexSchemaComponent => {\n const sc = schemaComponent(IndexURN({ name: indexName }), {\n migrations: migrationsOrComponents.migrations ?? [],\n components: [...(migrationsOrComponents.components ?? [])],\n });\n\n return {\n ...sc,\n indexName,\n get columnNames() {\n return columnNames;\n },\n addColumn: (column: string | ColumnSchemaComponent) =>\n columnNames.push(typeof column === 'string' ? column : column.columnName),\n isUnique,\n };\n};\n","import {\n mapSchemaComponentsOfType,\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\nimport {\n ColumnURNType,\n type AnyColumnSchemaComponent,\n} from './columnSchemaComponent';\nimport {\n IndexURNType,\n type IndexSchemaComponent,\n} from './indexSchemaComponent';\nimport type { TableRelationships } from './relationships/relationshipTypes';\nimport type { TableColumnNames } from './tableTypesInference';\n\nexport type TableURNType = 'sc:dumbo:table';\nexport type TableURN = `${TableURNType}:${string}`;\n\nexport const TableURNType: TableURNType = 'sc:dumbo:table';\nexport const TableURN = ({ name }: { name: string }): TableURN =>\n `${TableURNType}:${name}`;\n\nexport type TableColumns = Record<string, AnyColumnSchemaComponent>;\n\nexport type TableSchemaComponent<\n Columns extends TableColumns = TableColumns,\n TableName extends string = string,\n Relationships extends TableRelationships<keyof Columns & string> =\n {} & TableRelationships<keyof Columns & string>,\n> = SchemaComponent<\n TableURN,\n Readonly<{\n tableName: TableName;\n columns: ReadonlyMap<string, AnyColumnSchemaComponent> & Columns;\n primaryKey: TableColumnNames<\n TableSchemaComponent<Columns, TableName, Relationships>\n >[];\n relationships: Relationships;\n indexes: ReadonlyMap<string, IndexSchemaComponent>;\n addColumn: (column: AnyColumnSchemaComponent) => AnyColumnSchemaComponent;\n addIndex: (index: IndexSchemaComponent) => IndexSchemaComponent;\n }>\n>;\n\nexport type InferTableSchemaComponentTypes<T extends AnyTableSchemaComponent> =\n T extends TableSchemaComponent<\n infer Columns,\n infer TableName,\n infer Relationships\n >\n ? [Columns, TableName, Relationships]\n : never;\n\nexport type InferTableSchemaComponentColumns<\n T extends AnyTableSchemaComponent,\n> = InferTableSchemaComponentTypes<T>[0];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyTableSchemaComponent = TableSchemaComponent<any, any, any>;\n\nexport const tableSchemaComponent = <\n const Columns extends TableColumns = TableColumns,\n const TableName extends string = string,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n const Relationships extends TableRelationships<keyof Columns & string> = {},\n>({\n tableName,\n columns,\n primaryKey,\n relationships,\n ...migrationsOrComponents\n}: {\n tableName: TableName;\n columns?: Columns;\n primaryKey?: TableColumnNames<\n TableSchemaComponent<Columns, TableName, Relationships>\n >[];\n relationships?: Relationships;\n} & SchemaComponentOptions): TableSchemaComponent<\n Columns,\n TableName,\n Relationships\n> & {\n relationships: Relationships;\n} => {\n columns ??= {} as Columns;\n relationships ??= {} as Relationships;\n\n const base = schemaComponent(TableURN({ name: tableName }), {\n migrations: migrationsOrComponents.migrations ?? [],\n components: [\n ...(migrationsOrComponents.components ?? []),\n ...Object.values(columns),\n ],\n });\n\n return {\n ...base,\n tableName,\n primaryKey: primaryKey ?? [],\n relationships,\n get columns() {\n const columnsMap = mapSchemaComponentsOfType<AnyColumnSchemaComponent>(\n base.components,\n ColumnURNType,\n (c) => c.columnName,\n );\n\n return Object.assign(columnsMap, columns);\n },\n get indexes() {\n return mapSchemaComponentsOfType<IndexSchemaComponent>(\n base.components,\n IndexURNType,\n (c) => c.indexName,\n );\n },\n addColumn: (column: AnyColumnSchemaComponent) => base.addComponent(column),\n addIndex: (index: IndexSchemaComponent) => base.addComponent(index),\n };\n};\n","import {\n mapSchemaComponentsOfType,\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\nimport {\n TableURNType,\n tableSchemaComponent,\n type AnyTableSchemaComponent,\n type TableSchemaComponent,\n} from './tableSchemaComponent';\n\nexport type DatabaseSchemaURNType = 'sc:dumbo:database_schema';\nexport type DatabaseSchemaURN<SchemaName extends string = string> =\n `${DatabaseSchemaURNType}:${SchemaName}`;\n\nexport const DatabaseSchemaURNType: DatabaseSchemaURNType =\n 'sc:dumbo:database_schema';\nexport const DatabaseSchemaURN = <SchemaName extends string = string>({\n name,\n}: {\n name: SchemaName;\n}): DatabaseSchemaURN<SchemaName> => `${DatabaseSchemaURNType}:${name}`;\n\nexport type DatabaseSchemaTables<\n Tables extends AnyTableSchemaComponent = AnyTableSchemaComponent,\n> = Record<string, Tables>;\n\nexport type DatabaseSchemaSchemaComponent<\n Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n SchemaName extends string = string,\n> = SchemaComponent<\n DatabaseSchemaURN<SchemaName>,\n Readonly<{\n schemaName: SchemaName;\n tables: ReadonlyMap<string, TableSchemaComponent> & Tables;\n addTable: (table: string | TableSchemaComponent) => TableSchemaComponent;\n }>\n>;\n\nexport type AnyDatabaseSchemaSchemaComponent =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseSchemaSchemaComponent<any, any>;\n\nexport const databaseSchemaSchemaComponent = <\n const Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n const SchemaName extends string = string,\n>({\n schemaName,\n tables,\n ...migrationsOrComponents\n}: {\n schemaName: SchemaName;\n tables?: Tables;\n} & SchemaComponentOptions): DatabaseSchemaSchemaComponent<\n Tables,\n SchemaName\n> => {\n const base = schemaComponent(DatabaseSchemaURN({ name: schemaName }), {\n migrations: migrationsOrComponents.migrations ?? [],\n components: [\n ...(migrationsOrComponents.components ?? []),\n ...Object.values(tables ?? {}),\n ],\n });\n\n return {\n ...base,\n schemaName,\n get tables() {\n const tablesMap = mapSchemaComponentsOfType<TableSchemaComponent>(\n base.components,\n TableURNType,\n (c) => c.tableName,\n );\n\n return Object.assign(tablesMap, tables);\n },\n addTable: (table: string | TableSchemaComponent) =>\n base.addComponent(\n typeof table === 'string'\n ? tableSchemaComponent({ tableName: table })\n : table,\n ),\n };\n};\n","import {\n mapSchemaComponentsOfType,\n schemaComponent,\n type SchemaComponent,\n type SchemaComponentOptions,\n} from '../schemaComponent';\nimport {\n DatabaseSchemaURNType,\n databaseSchemaSchemaComponent,\n type AnyDatabaseSchemaSchemaComponent,\n type DatabaseSchemaSchemaComponent,\n} from './databaseSchemaSchemaComponent';\n\nexport type DatabaseURNType = 'sc:dumbo:database';\nexport type DatabaseURN = `${DatabaseURNType}:${string}`;\n\nexport const DatabaseURNType: DatabaseURNType = 'sc:dumbo:database';\nexport const DatabaseURN = ({ name }: { name: string }): DatabaseURN =>\n `${DatabaseURNType}:${name}`;\n\nexport type DatabaseSchemas<\n Schemas extends AnyDatabaseSchemaSchemaComponent =\n AnyDatabaseSchemaSchemaComponent,\n> = Record<string, Schemas>;\n\nexport type DatabaseSchemaComponent<\n Schemas extends DatabaseSchemas = DatabaseSchemas,\n> = SchemaComponent<\n DatabaseURN,\n Readonly<{\n databaseName: string;\n schemas: ReadonlyMap<string, DatabaseSchemaSchemaComponent> & Schemas;\n addSchema: (\n schema: string | DatabaseSchemaSchemaComponent,\n ) => DatabaseSchemaSchemaComponent;\n }>\n>;\n\nexport type AnyDatabaseSchemaComponent =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DatabaseSchemaComponent<any>;\n\nexport const databaseSchemaComponent = <\n Schemas extends DatabaseSchemas = DatabaseSchemas,\n>({\n databaseName,\n schemas,\n ...migrationsOrComponents\n}: {\n databaseName: string;\n schemas?: Schemas;\n} & SchemaComponentOptions): DatabaseSchemaComponent<Schemas> => {\n schemas ??= {} as Schemas;\n\n const base = schemaComponent(DatabaseURN({ name: databaseName }), {\n migrations: migrationsOrComponents.migrations ?? [],\n components: [\n ...(migrationsOrComponents.components ?? []),\n ...Object.values(schemas),\n ],\n });\n\n return {\n ...base,\n databaseName,\n get schemas() {\n const schemasMap =\n mapSchemaComponentsOfType<DatabaseSchemaSchemaComponent>(\n base.components,\n DatabaseSchemaURNType,\n (c) => c.schemaName,\n );\n\n return Object.assign(schemasMap, schemas);\n },\n addSchema: (schema: string | DatabaseSchemaSchemaComponent) =>\n base.addComponent(\n typeof schema === 'string'\n ? databaseSchemaSchemaComponent({ schemaName: schema })\n : schema,\n ),\n };\n};\n","import {\n fromDatabaseDriverType,\n type DatabaseDriverType,\n type DatabaseType,\n} from '../../drivers';\nimport type { SQLExecutor } from '../../execute';\n\nexport interface DatabaseCapabilities<\n SupportsMultipleDatabases extends boolean,\n SupportsSchemas extends boolean,\n SupportsFunctions extends boolean,\n> {\n readonly supportsMultipleDatabases: SupportsMultipleDatabases;\n readonly supportsSchemas: SupportsSchemas;\n readonly supportsFunctions: SupportsFunctions;\n}\n\nexport type DatabaseMetadata<\n SupportsMultipleDatabases extends boolean = boolean,\n SupportsSchemas extends boolean = boolean,\n SupportsFunctions extends boolean = boolean,\n> = {\n readonly databaseType: DatabaseType;\n readonly capabilities: DatabaseCapabilities<\n SupportsMultipleDatabases,\n SupportsSchemas,\n SupportsFunctions\n >;\n readonly tableExists: (\n pool: SQLExecutor,\n tableName: string,\n ) => Promise<boolean>;\n} & (SupportsMultipleDatabases extends true\n ? {\n readonly defaultDatabaseName: string;\n readonly parseDatabaseName: (\n connectionString?: string,\n ) => string | undefined;\n }\n : {\n readonly defaultDatabaseName?: never;\n readonly parseDatabaseName?: never;\n }) &\n (SupportsFunctions extends true\n ? {\n readonly functionExists: (\n pool: SQLExecutor,\n functionName: string,\n ) => Promise<boolean>;\n }\n : {\n readonly functionExists?: (\n pool: SQLExecutor,\n functionName: string,\n ) => Promise<boolean>;\n });\n\nexport const DumboDatabaseMetadataRegistry = () => {\n const infos = new Map<\n DatabaseType,\n DatabaseMetadata | (() => Promise<DatabaseMetadata>)\n >();\n\n const register = (\n databaseType: DatabaseType,\n info: DatabaseMetadata | (() => Promise<DatabaseMetadata>),\n ): void => {\n const entry = infos.get(databaseType);\n if (entry && (typeof entry !== 'function' || typeof info === 'function')) {\n return;\n }\n infos.set(databaseType, info);\n };\n\n const tryResolve = async (\n databaseType: DatabaseType,\n ): Promise<DatabaseMetadata | null> => {\n const entry = infos.get(databaseType);\n\n if (!entry) return null;\n\n if (typeof entry !== 'function') return entry;\n\n const resolved = await entry();\n register(databaseType, resolved);\n return resolved;\n };\n\n const tryGet = (databaseType: DatabaseType): DatabaseMetadata | null => {\n const entry = infos.get(databaseType);\n return entry && typeof entry !== 'function' ? entry : null;\n };\n\n const has = (databaseType: DatabaseType): boolean => infos.has(databaseType);\n\n return {\n register,\n tryResolve,\n tryGet,\n has,\n get databaseTypes(): DatabaseType[] {\n return Array.from(infos.keys());\n },\n };\n};\n\ndeclare global {\n var dumboDatabaseMetadataRegistry: ReturnType<\n typeof DumboDatabaseMetadataRegistry\n >;\n}\n\nexport const dumboDatabaseMetadataRegistry =\n (globalThis.dumboDatabaseMetadataRegistry =\n globalThis.dumboDatabaseMetadataRegistry ??\n DumboDatabaseMetadataRegistry());\n\nexport const getDatabaseMetadata = (\n driverType: DatabaseDriverType,\n): DatabaseMetadata | null => {\n const { databaseType } = fromDatabaseDriverType(driverType);\n return dumboDatabaseMetadataRegistry.tryGet(databaseType);\n};\n\nexport const resolveDatabaseMetadata = async (\n driverType: DatabaseDriverType,\n driverOverride?: DatabaseMetadata,\n): Promise<DatabaseMetadata | null> => {\n if (driverOverride) return driverOverride;\n const { databaseType } = fromDatabaseDriverType(driverType);\n return dumboDatabaseMetadataRegistry.tryResolve(databaseType);\n};\n\nexport const getDefaultDatabase = (\n driverType: DatabaseDriverType,\n): string | undefined => {\n const metadata = getDatabaseMetadata(driverType);\n return metadata?.defaultDatabaseName;\n};\n\nexport const getDefaultDatabaseAsync = async (\n driverType: DatabaseDriverType,\n): Promise<string | undefined> => {\n const metadata = await resolveDatabaseMetadata(driverType);\n return metadata?.defaultDatabaseName;\n};\n","import type { AnyColumnTypeToken, SQLColumnToken } from '../../sql';\nimport type { ValidateDatabaseSchemas } from '../components';\nimport {\n type AnyDatabaseSchemaSchemaComponent,\n columnSchemaComponent,\n type ColumnSchemaComponentOptions,\n databaseSchemaComponent,\n type DatabaseSchemaComponent,\n type DatabaseSchemas,\n databaseSchemaSchemaComponent,\n type DatabaseSchemaSchemaComponent,\n type DatabaseSchemaTables,\n indexSchemaComponent,\n type IndexSchemaComponent,\n type TableColumnNames,\n type TableColumns,\n type TableRelationships,\n tableSchemaComponent,\n type TableSchemaComponent,\n} from '../components';\nimport {\n type AnySchemaComponent,\n isSchemaComponentOfType,\n type SchemaComponentOptions,\n} from '../schemaComponent';\n\nconst DEFAULT_DATABASE_NAME = '__default_database__';\nconst DEFAULT_DATABASE_SCHEMA_NAME = '__default_database_schema__';\n\nconst dumboColumn = <\n const ColumnType extends AnyColumnTypeToken | string =\n AnyColumnTypeToken | string,\n const TOptions extends SchemaComponentOptions &\n Omit<SQLColumnToken<ColumnType>, 'name' | 'type' | 'sqlTokenType'> = Omit<\n ColumnSchemaComponentOptions<ColumnType>,\n 'type'\n >,\n const ColumnName extends string = string,\n>(\n name: ColumnName,\n type: ColumnType,\n options?: TOptions,\n) =>\n columnSchemaComponent<\n ColumnType,\n TOptions & { type: ColumnType },\n ColumnName\n >({\n columnName: name,\n type,\n ...options,\n } as { columnName: ColumnName } & TOptions & { type: ColumnType });\n\nconst dumboIndex = (\n name: string,\n columnNames: string[],\n options?: { unique?: boolean } & SchemaComponentOptions,\n): IndexSchemaComponent =>\n indexSchemaComponent({\n indexName: name,\n columnNames,\n isUnique: options?.unique ?? false,\n ...options,\n });\n\nconst dumboTable = <\n const Columns extends TableColumns = TableColumns,\n const TableName extends string = string,\n const Relationships extends TableRelationships<keyof Columns & string> =\n TableRelationships<keyof Columns & string>,\n>(\n name: TableName,\n definition: {\n columns?: Columns;\n primaryKey?: TableColumnNames<\n TableSchemaComponent<Columns, TableName, Relationships>\n >[];\n relationships?: Relationships;\n indexes?: Record<string, IndexSchemaComponent>;\n } & SchemaComponentOptions,\n): TableSchemaComponent<Columns, TableName, Relationships> => {\n const { columns, indexes, primaryKey, relationships, ...options } =\n definition;\n\n const components = [...(indexes ? Object.values(indexes) : [])];\n\n return tableSchemaComponent({\n tableName: name,\n columns: columns ?? ({} as Columns),\n primaryKey: primaryKey ?? [],\n ...(relationships !== undefined ? { relationships } : {}),\n components,\n ...options,\n });\n};\n\nfunction dumboDatabaseSchema<\n const Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n>(\n tables: Tables,\n): DatabaseSchemaSchemaComponent<Tables, typeof DEFAULT_DATABASE_SCHEMA_NAME>;\nfunction dumboDatabaseSchema<\n const Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n const SchemaName extends string = string,\n>(\n schemaName: SchemaName,\n tables: Tables,\n options?: SchemaComponentOptions,\n): DatabaseSchemaSchemaComponent<Tables, SchemaName>;\nfunction dumboDatabaseSchema<\n const Tables extends DatabaseSchemaTables = DatabaseSchemaTables,\n const SchemaName extends string = string,\n>(\n nameOrTables: SchemaName | Tables,\n tables?: Tables,\n options?: SchemaComponentOptions,\n): DatabaseSchemaSchemaComponent<Tables, SchemaName> {\n const schemaName =\n typeof nameOrTables === 'string'\n ? nameOrTables\n : (DEFAULT_DATABASE_SCHEMA_NAME as SchemaName);\n const tablesMap =\n (typeof nameOrTables === 'string' ? tables : nameOrTables) ??\n ({} as Tables);\n return databaseSchemaSchemaComponent({\n schemaName,\n tables: tablesMap,\n ...options,\n });\n}\n\ndumboDatabaseSchema.from = (\n schemaName: string | undefined,\n tableNames: string[],\n): DatabaseSchemaSchemaComponent => {\n const tables = tableNames.reduce(\n (acc, tableName) => {\n acc[tableName] = dumboTable(tableName, {});\n return acc;\n },\n {} as Record<string, TableSchemaComponent>,\n );\n\n return schemaName\n ? dumboDatabaseSchema(schemaName, tables)\n : dumboDatabaseSchema(tables);\n};\n\ntype ValidatedDatabaseSchemaComponent<\n Schemas extends DatabaseSchemas = DatabaseSchemas,\n> =\n ValidateDatabaseSchemas<Schemas> extends {\n valid: true;\n }\n ? DatabaseSchemaComponent<Schemas>\n : ValidateDatabaseSchemas<Schemas> extends {\n valid: false;\n error: infer E;\n }\n ? { valid: false; error: E }\n : DatabaseSchemaComponent<Schemas>;\n\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n schemas: Schemas,\n): ValidatedDatabaseSchemaComponent<Schemas>;\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n schema: DatabaseSchemaSchemaComponent,\n): ValidatedDatabaseSchemaComponent<Schemas>;\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n databaseName: string,\n schemas: Schemas,\n options?: SchemaComponentOptions,\n): ValidatedDatabaseSchemaComponent<Schemas>;\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n databaseName: string,\n schema: AnyDatabaseSchemaSchemaComponent,\n options?: SchemaComponentOptions,\n): ValidatedDatabaseSchemaComponent<Schemas>;\nfunction dumboDatabase<Schemas extends DatabaseSchemas = DatabaseSchemas>(\n nameOrSchemas: string | DatabaseSchemaSchemaComponent | Schemas,\n schemasOrOptions?:\n DatabaseSchemaSchemaComponent | Schemas | SchemaComponentOptions,\n options?: SchemaComponentOptions,\n): ValidatedDatabaseSchemaComponent<Schemas> {\n const databaseName =\n typeof nameOrSchemas === 'string' ? nameOrSchemas : DEFAULT_DATABASE_NAME;\n\n const schemasOrSchema =\n typeof nameOrSchemas === 'string'\n ? (schemasOrOptions ?? {})\n : nameOrSchemas;\n const schemaMap: Record<string, DatabaseSchemaSchemaComponent> =\n 'schemaComponentKey' in schemasOrSchema &&\n isSchemaComponentOfType<DatabaseSchemaSchemaComponent>(\n schemasOrSchema as AnySchemaComponent,\n 'sc:dumbo:database_schema',\n )\n ? {\n [DEFAULT_DATABASE_SCHEMA_NAME]:\n schemasOrSchema as DatabaseSchemaSchemaComponent,\n }\n : (schemasOrSchema as Record<string, DatabaseSchemaSchemaComponent>);\n\n const dbOptions: typeof options =\n typeof nameOrSchemas === 'string'\n ? options\n : (schemasOrOptions as typeof options);\n\n return databaseSchemaComponent({\n databaseName,\n schemas: schemaMap as Schemas,\n ...dbOptions,\n });\n}\n\ndumboDatabase.from = <Schemas extends DatabaseSchemas = DatabaseSchemas>(\n databaseName: string | undefined,\n schemaNames: string[],\n): ValidatedDatabaseSchemaComponent<Schemas> => {\n const schemas = schemaNames.reduce(\n (acc, schemaName) => {\n acc[schemaName] = dumboDatabaseSchema(\n schemaName,\n {} as DatabaseSchemaTables,\n );\n return acc;\n },\n {} as Record<string, DatabaseSchemaSchemaComponent>,\n ) as Schemas;\n\n return databaseName\n ? dumboDatabase(databaseName, schemas)\n : dumboDatabase(schemas);\n};\n\ndumboDatabase.defaultName = DEFAULT_DATABASE_NAME;\ndumboDatabaseSchema.defaultName = DEFAULT_DATABASE_SCHEMA_NAME;\n\nexport const dumboSchema = {\n database: dumboDatabase,\n schema: dumboDatabaseSchema,\n table: dumboTable,\n column: dumboColumn,\n index: dumboIndex,\n};\n","import type { SerializationCodec, Serializer } from '..';\n\ninterface JSONSerializer<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends Serializer<string, SerializeOptions, DeserializeOptions> {\n serialize<T>(object: T, options?: SerializeOptions): string;\n deserialize<T>(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONSerializerOptions = {\n parseDates?: boolean;\n parseBigInts?: boolean;\n failOnBigIntSerialization?: boolean;\n useDefaultDateSerialization?: boolean;\n};\n\ntype JSONSerializeOptions = {\n replacer?: JSONReplacer;\n} & JSONSerializerOptions;\n\ntype JSONDeserializeOptions = {\n reviver?: JSONReviver;\n} & JSONSerializerOptions;\n\ninterface JSONCodec<\n T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> extends SerializationCodec<T, string, SerializeOptions, DeserializeOptions> {\n encode(object: T, options?: SerializeOptions): string;\n decode(payload: string, options?: DeserializeOptions): T;\n}\n\ntype JSONCodecSerializationOptions<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> =\n | {\n serializer?: JSONSerializer<SerializeOptions, DeserializeOptions>;\n serializerOptions?: never;\n }\n | {\n serializer?: never;\n serializerOptions?: JSONSerializerOptions;\n };\n\ntype JSONSerializationOptions<\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> = {\n serialization?:\n | {\n serializer?: JSONSerializer<SerializeOptions, DeserializeOptions>;\n options?: JSONSerializeOptions | JSONDeserializeOptions;\n }\n | undefined;\n};\n\ntype JSONCodecOptions<\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n> = JSONCodecSerializationOptions<SerializeOptions, DeserializeOptions> & {\n upcast?: (document: Payload) => T;\n downcast?: (document: T) => Payload;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JSONReplacer = (this: any, key: string, value: any) => any;\n\ntype JSONReviver = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: any,\n key: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n context: JSONReviverContext,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) => any;\n\n// See more in: https://tc39.es/proposal-json-parse-with-source/\nexport type JSONReviverContext = {\n source: string;\n};\n\nconst bigIntReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return typeof value === 'bigint' ? value.toString() : value;\n};\n\nconst dateReplacer: JSONReplacer = (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value instanceof Date ? value.toISOString() : value;\n};\n\nconst isFirstLetterNumeric = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return c >= 48 && c <= 57;\n};\n\nconst isFirstLetterNumericOrMinus = (str: string): boolean => {\n const c = str.charCodeAt(0);\n return (c >= 48 && c <= 57) || c === 45;\n};\n\nconst bigIntReviver: JSONReviver = (_key, value, context) => {\n if (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n !Number.isSafeInteger(value)\n ) {\n try {\n return BigInt(context?.source ?? value.toString());\n } catch {\n return value;\n }\n }\n if (typeof value === 'string' && value.length > 15) {\n if (isFirstLetterNumericOrMinus(value)) {\n const num = Number(value);\n if (Number.isFinite(num) && !Number.isSafeInteger(num)) {\n try {\n return BigInt(value);\n } catch {\n // not a valid bigint string\n }\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst dateReviver: JSONReviver = (_key, value) => {\n if (\n typeof value === 'string' &&\n value.length === 24 &&\n isFirstLetterNumeric(value) &&\n value[10] === 'T' &&\n value[23] === 'Z'\n ) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n};\n\nconst composeJSONReplacers = (\n ...replacers: (JSONReplacer | undefined)[]\n): JSONReplacer | undefined => {\n const filteredReplacers = replacers.filter((r) => r !== undefined);\n\n if (filteredReplacers.length === 0) return undefined;\n\n return (key, value) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredReplacers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, replacer) => replacer(key, accValue),\n value,\n );\n};\n\nconst composeJSONRevivers = (\n ...revivers: (JSONReviver | undefined)[]\n): JSONReviver | undefined => {\n const filteredRevivers = revivers.filter((r) => r !== undefined);\n\n if (filteredRevivers.length === 0) return undefined;\n\n return (key, value, context) =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n filteredRevivers.reduce(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (accValue, reviver) => reviver(key, accValue, context),\n value,\n );\n};\n\nconst JSONReplacer = (opts?: JSONSerializeOptions) =>\n composeJSONReplacers(\n opts?.replacer,\n opts?.failOnBigIntSerialization !== true ? JSONReplacers.bigInt : undefined,\n opts?.useDefaultDateSerialization !== true ? JSONReplacers.date : undefined,\n );\n\nconst JSONReviver = (opts?: JSONDeserializeOptions) =>\n composeJSONRevivers(\n opts?.reviver,\n opts?.parseBigInts === true ? JSONRevivers.bigInt : undefined,\n opts?.parseDates === true ? JSONRevivers.date : undefined,\n );\n\nconst JSONReplacers = {\n bigInt: bigIntReplacer,\n date: dateReplacer,\n};\n\nconst JSONRevivers = {\n bigInt: bigIntReviver,\n date: dateReviver,\n};\n\ntype ClassicJsonReviver =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this: any, key: string, value: any) => any;\n\nconst jsonSerializer = (\n options?: JSONSerializerOptions &\n JSONDeserializeOptions &\n JSONSerializeOptions,\n): JSONSerializer => {\n const defaultReplacer = JSONReplacer(options);\n const defaultReviver = JSONReviver(options);\n\n return {\n serialize: <T>(\n object: T,\n serializerOptions?: JSONSerializeOptions,\n ): string =>\n JSON.stringify(\n object,\n serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer,\n ),\n deserialize: <T>(\n payload: string,\n deserializerOptions?: JSONDeserializeOptions,\n ): T =>\n JSON.parse(\n payload,\n (deserializerOptions\n ? JSONReviver(deserializerOptions)\n : defaultReviver) as ClassicJsonReviver,\n ) as T,\n };\n};\n\nconst JSONSerializer: JSONSerializer & {\n from: <\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n >(\n options?: JSONSerializationOptions<SerializeOptions, DeserializeOptions>,\n ) => JSONSerializer<SerializeOptions, DeserializeOptions>;\n} = Object.assign(jsonSerializer(), {\n from: <\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n >(\n options?: JSONSerializationOptions<SerializeOptions, DeserializeOptions>,\n ) =>\n options?.serialization?.serializer ??\n (options?.serialization?.options\n ? jsonSerializer(options?.serialization?.options)\n : JSONSerializer),\n});\n\nconst JSONCodec = <\n T,\n Payload = T,\n SerializeOptions extends JSONSerializeOptions = JSONSerializeOptions,\n DeserializeOptions extends JSONDeserializeOptions = JSONDeserializeOptions,\n>(\n options: JSONCodecOptions<T, Payload, SerializeOptions, DeserializeOptions>,\n): JSONCodec<T, SerializeOptions, DeserializeOptions> => {\n const serializer =\n 'serializer' in options\n ? options.serializer\n : jsonSerializer(\n 'serializerOptions' in options\n ? options.serializerOptions\n : undefined,\n );\n\n const upcast = options.upcast ?? ((doc: Payload) => doc as unknown as T);\n const downcast = options.downcast ?? ((doc: T) => doc as unknown as Payload);\n\n return {\n decode: (payload: string, decodeOptions?: DeserializeOptions) => {\n const deserialized = decodeOptions\n ? serializer.deserialize<Payload>(payload, decodeOptions)\n : serializer.deserialize<Payload>(payload);\n return upcast(deserialized);\n },\n encode: (object: T, encodeOptions?: SerializeOptions) => {\n const downcasted = downcast(object);\n return encodeOptions\n ? serializer.serialize(downcasted, encodeOptions)\n : serializer.serialize(downcasted);\n },\n };\n};\n\nexport {\n composeJSONReplacers,\n composeJSONRevivers,\n JSONCodec,\n JSONReplacer,\n JSONReplacers,\n JSONReviver,\n JSONRevivers,\n JSONSerializer,\n jsonSerializer,\n type JSONCodecOptions,\n type JSONDeserializeOptions,\n type JSONSerializationOptions,\n type JSONSerializeOptions,\n type JSONSerializerOptions,\n};\n","export interface ParametrizedSQL {\n query: string;\n params: unknown[];\n}\n\nexport interface ParametrizedSQLBuilder {\n addSQL: (str: string) => ParametrizedSQLBuilder;\n addParam(value: unknown): ParametrizedSQLBuilder;\n addParams(values: unknown[]): ParametrizedSQLBuilder;\n build: () => ParametrizedSQL;\n}\n\nexport const ParametrizedSQLBuilder = ({\n mapParamPlaceholder,\n}: {\n mapParamPlaceholder: (index: number, value: unknown) => string;\n}): ParametrizedSQLBuilder => {\n const sql: string[] = [];\n const params: unknown[] = [];\n\n return {\n addSQL(str: string): ParametrizedSQLBuilder {\n sql.push(str);\n return this;\n },\n addParam(value: unknown): ParametrizedSQLBuilder {\n sql.push(mapParamPlaceholder(params.length, value));\n params.push(value);\n return this;\n },\n addParams(values: unknown[]): ParametrizedSQLBuilder {\n const placeholders = values.map((value, i) =>\n mapParamPlaceholder(params.length + i, value),\n );\n this.addSQL(`${placeholders.join(', ')}`);\n params.push(...values);\n return this;\n },\n build(): ParametrizedSQL {\n return {\n query: sql.join(''),\n params,\n };\n },\n };\n};\n","export type SQLToken<\n TSymbol extends string = string,\n TProps extends Omit<Record<string, unknown>, 'sqlTokenType'> | undefined =\n Omit<Record<string, unknown>, 'sqlTokenType'> | undefined,\n> = {\n sqlTokenType: TSymbol;\n} & (TProps extends undefined ? void : Omit<TProps, 'sqlTokenType'>);\n\nexport type ExtractSQLTokenType<T> = T extends (...args: never[]) => infer R\n ? R extends SQLToken\n ? R\n : never\n : T extends SQLToken\n ? T\n : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnySQLToken = SQLToken<string, any>;\n\nexport const SQLToken = <\n SQLTokenType extends AnySQLToken,\n TInput = keyof Omit<SQLTokenType, 'sqlTokenType'> extends never\n ? void\n : Omit<SQLTokenType, 'sqlTokenType'>,\n>(\n sqlTokenType: SQLTokenType['sqlTokenType'],\n map?: (input: TInput) => Omit<SQLTokenType, 'sqlTokenType'>,\n) => {\n const factory = (input: TInput): SQLTokenType => {\n let props: Omit<SQLTokenType, 'sqlTokenType'>;\n\n if (map !== undefined) {\n props = map(input);\n } else if (input === undefined || input === null) {\n props = {} as Omit<SQLTokenType, 'sqlTokenType'>;\n } else if (typeof input === 'object' && !Array.isArray(input)) {\n // If input is already an object (but not array), spread it\n props = input as Omit<SQLTokenType, 'sqlTokenType'>;\n } else {\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Cannot create SQLToken of type ${sqlTokenType} with input: ${input}`,\n );\n }\n\n return {\n sqlTokenType: sqlTokenType,\n [sqlTokenType]: true,\n ...props,\n } as unknown as SQLTokenType;\n };\n\n const check = (token: unknown): token is SQLTokenType =>\n SQLToken.check(token) && token.sqlTokenType === sqlTokenType;\n\n return { from: factory, check: check, type: sqlTokenType };\n};\n\nSQLToken.check = <SQLTokenType extends AnySQLToken>(\n token: unknown,\n): token is SQLTokenType =>\n token !== null && typeof token === 'object' && 'sqlTokenType' in token;\n\nexport type SQLIdentifier = SQLToken<'SQL_IDENTIFIER', { value: string }>;\nexport const SQLIdentifier = SQLToken<SQLIdentifier, string>(\n 'SQL_IDENTIFIER',\n (value) => ({\n value,\n }),\n);\n\nexport type SQLPlain = SQLToken<'SQL_RAW', { value: string }>;\nexport const SQLPlain = SQLToken<SQLPlain, string>('SQL_RAW', (value) => ({\n value,\n}));\n\nexport type SQLLiteral = SQLToken<'SQL_LITERAL', { value: unknown }>;\nexport const SQLLiteral = SQLToken<SQLLiteral, unknown>(\n 'SQL_LITERAL',\n (value) => ({\n value,\n }),\n);\n\nexport type SQLArrayMode = 'params' | 'native';\n\nexport type SQLArray = SQLToken<\n 'SQL_ARRAY',\n { value: unknown[]; mode?: SQLArrayMode }\n>;\n\nexport const SQLArray = SQLToken<\n SQLArray,\n unknown[] | { value: unknown[]; mode?: SQLArrayMode }\n>('SQL_ARRAY', (input) => {\n if (Array.isArray(input)) {\n return { value: input };\n }\n return input.mode !== undefined\n ? { value: input.value, mode: input.mode }\n : { value: input.value };\n});\n\nexport type SQLIn = SQLToken<\n 'SQL_IN',\n { column: SQLIdentifier; values: SQLArray; mode?: SQLArrayMode }\n>;\n\nexport const SQLIn = SQLToken<\n SQLIn,\n { column: string; values: unknown[]; mode?: SQLArrayMode }\n>('SQL_IN', ({ column, values, mode }) =>\n mode !== undefined\n ? {\n column: SQLIdentifier.from(column),\n values: SQLArray.from(values),\n mode,\n }\n : {\n column: SQLIdentifier.from(column),\n values: SQLArray.from(values),\n },\n);\n\nexport type SQLDefaultTokens = SQLIdentifier | SQLPlain | SQLLiteral | SQLArray;\nexport type SQLDefaultTokensTypes = SQLDefaultTokens['sqlTokenType'];\n","import { SQLToken } from './sqlToken';\n\nexport type JSONValueType =\n Record<string, unknown> | Array<unknown> | string | number | boolean | null;\n\nexport type JSONValueTypeName =\n | 'value_type:json:object'\n | 'value_type:json:array'\n | 'value_type:json:string'\n | 'value_type:json:number'\n | 'value_type:json:boolean'\n | 'value_type:json:null';\n\nexport type JavaScriptValueType =\n | Record<string, unknown>\n | Array<unknown>\n | string\n | number\n | boolean\n | null\n | undefined\n | Date\n | bigint;\n\nexport type JavaScriptValueTypeName =\n | 'value_type:js:object'\n | 'value_type:js:array'\n | 'value_type:js:string'\n | 'value_type:js:number'\n | 'value_type:js:boolean'\n | 'value_type:js:null'\n | 'value_type:js:undefined'\n | 'value_type:js:date'\n | 'value_type:js:bigint';\n\nexport type JavaScriptValueTypeToNameMap = {\n [\n K in JavaScriptValueType as K extends Record<string, unknown>\n ? 'value_type:js:object'\n : K extends Array<unknown>\n ? 'value_type:js:array'\n : K extends string\n ? 'value_type:js:string'\n : K extends number\n ? 'value_type:js:number'\n : K extends boolean\n ? 'value_type:js:boolean'\n : K extends null\n ? 'value_type:js:null'\n : K extends undefined\n ? 'value_type:js:undefined'\n : K extends Date\n ? 'value_type:js:date'\n : K extends bigint\n ? 'value_type:js:bigint'\n : never\n ]: K;\n};\n\n// TODO: Use URNs for sqltoken\nexport type ColumnTypeToken<\n JSValueTypeName extends JavaScriptValueTypeName = JavaScriptValueTypeName,\n ColumnTypeName extends string = string,\n TProps extends Omit<Record<string, unknown>, 'sqlTokenType'> | undefined =\n Omit<Record<string, unknown>, 'sqlTokenType'> | undefined,\n ValueType = undefined,\n> = SQLToken<`SQL_COLUMN_${ColumnTypeName}`, TProps> & {\n __brand: ValueType extends undefined\n ? JavaScriptValueTypeToNameMap[JSValueTypeName]\n : ValueType;\n jsTypeName: JSValueTypeName;\n};\n\nexport const ColumnTypeToken = <\n SQLTokenType extends AnyColumnTypeToken,\n TInput = keyof Omit<\n SQLTokenType,\n 'sqlTokenType' | '__brand' | 'jsTypeName'\n > extends never\n ? void\n : Omit<SQLTokenType, 'sqlTokenType' | '__brand' | 'jsTypeName'>,\n>(\n sqlTokenType: SQLTokenType['sqlTokenType'],\n jsTypeName: SQLTokenType['jsTypeName'],\n map?: (\n input: TInput,\n ) => Omit<SQLTokenType, 'sqlTokenType' | '__brand' | 'jsTypeName'>,\n) => {\n const factory = (input: TInput): SQLTokenType => {\n let props: Omit<SQLTokenType, 'sqlTokenType' | '__brand' | 'jsTypeName'>;\n\n if (map !== undefined) {\n props = map(input);\n } else if (input === undefined || input === null) {\n props = {} as Omit<\n SQLTokenType,\n 'sqlTokenType' | '__brand' | 'jsTypeName'\n >;\n } else if (typeof input === 'object' && !Array.isArray(input)) {\n // If input is already an object (but not array), spread it\n props = input as Omit<\n SQLTokenType,\n 'sqlTokenType' | '__brand' | 'jsTypeName'\n >;\n } else {\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Cannot create SQLToken of type ${sqlTokenType} with input: ${input}`,\n );\n }\n\n return {\n sqlTokenType: sqlTokenType,\n [sqlTokenType]: true,\n jsTypeName,\n ...props,\n } as unknown as SQLTokenType;\n };\n\n const check = (token: unknown): token is SQLTokenType =>\n SQLToken.check(token) && token.sqlTokenType === sqlTokenType;\n\n return { from: factory, check: check, type: sqlTokenType };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyColumnTypeToken = ColumnTypeToken<any, string, any>;\n\nexport type SerialToken = ColumnTypeToken<'value_type:js:number', 'SERIAL'>;\nexport const SerialToken = ColumnTypeToken<SerialToken>(\n 'SQL_COLUMN_SERIAL',\n 'value_type:js:number',\n);\n\nexport type BigSerialToken = ColumnTypeToken<\n 'value_type:js:bigint',\n 'BIGSERIAL'\n>;\nexport const BigSerialToken = ColumnTypeToken<BigSerialToken>(\n 'SQL_COLUMN_BIGSERIAL',\n 'value_type:js:bigint',\n);\n\nexport type IntegerToken = ColumnTypeToken<'value_type:js:number', 'INTEGER'>;\nexport const IntegerToken = ColumnTypeToken<IntegerToken>(\n 'SQL_COLUMN_INTEGER',\n 'value_type:js:number',\n);\n\nexport type BigIntegerToken = ColumnTypeToken<'value_type:js:bigint', 'BIGINT'>;\nexport const BigIntegerToken = ColumnTypeToken<BigIntegerToken>(\n 'SQL_COLUMN_BIGINT',\n 'value_type:js:bigint',\n);\n\nexport type JSONBToken<\n ValueType extends Record<string, unknown> = Record<string, unknown>,\n> = ColumnTypeToken<'value_type:js:object', 'JSONB', undefined, ValueType>;\n\nexport const JSONBToken = {\n type: 'SQL_COLUMN_JSONB',\n from: <\n ValueType extends Record<string, unknown> = Record<string, unknown>,\n >(): JSONBToken<ValueType> => {\n return {\n sqlTokenType: 'SQL_COLUMN_JSONB',\n ['SQL_COLUMN_JSONB']: true,\n } as unknown as JSONBToken<ValueType>;\n },\n check: <ValueType extends Record<string, unknown> = Record<string, unknown>>(\n token: unknown,\n ): token is JSONBToken<ValueType> =>\n SQLToken.check(token) && token.sqlTokenType === 'SQL_COLUMN_JSONB',\n};\n\nexport type TimestampToken = ColumnTypeToken<'value_type:js:date', 'TIMESTAMP'>;\nexport const TimestampToken = ColumnTypeToken<TimestampToken>(\n 'SQL_COLUMN_TIMESTAMP',\n 'value_type:js:date',\n);\n\nexport type TimestamptzToken = ColumnTypeToken<\n 'value_type:js:date',\n 'TIMESTAMPTZ'\n>;\nexport const TimestamptzToken = ColumnTypeToken<TimestamptzToken>(\n 'SQL_COLUMN_TIMESTAMPTZ',\n 'value_type:js:date',\n);\n\nexport type VarcharToken = ColumnTypeToken<\n 'value_type:js:string',\n 'VARCHAR',\n { length: number | 'max' }\n>;\nexport const VarcharToken = ColumnTypeToken<VarcharToken, number | 'max'>(\n 'SQL_COLUMN_VARCHAR',\n 'value_type:js:string',\n (length?: number | 'max') =>\n ({\n length: length ?? 'max',\n jsTypeName: 'value_type:js:string',\n }) as Omit<VarcharToken, 'sqlTokenType'>,\n);\n\nexport type NotNullableSQLColumnTokenProps<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n> =\n | {\n name: string;\n type: ColumnType;\n notNull: true;\n unique?: boolean;\n primaryKey?: boolean;\n default?: ColumnType | SQLToken;\n }\n | {\n name: string;\n type: ColumnType;\n notNull?: false;\n unique?: boolean;\n primaryKey: never;\n default?: ColumnType | SQLToken;\n };\n\nexport type NullableSQLColumnTokenProps<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n> = {\n name: string;\n type: ColumnType;\n notNull?: false;\n unique?: boolean;\n primaryKey?: false;\n default?: ColumnType | SQLToken;\n};\n\nexport type SQLColumnToken<\n ColumnType extends AnyColumnTypeToken | string = AnyColumnTypeToken | string,\n> = SQLToken<\n 'SQL_COLUMN',\n | NotNullableSQLColumnTokenProps<ColumnType>\n | NullableSQLColumnTokenProps<ColumnType>\n>;\n\nexport type AutoIncrementSQLColumnToken = ColumnTypeToken<\n 'value_type:js:bigint',\n 'AUTO_INCREMENT',\n {\n primaryKey: boolean;\n bigint?: boolean;\n },\n bigint\n>;\nexport const AutoIncrementSQLColumnToken =\n ColumnTypeToken<AutoIncrementSQLColumnToken>(\n 'SQL_COLUMN_AUTO_INCREMENT',\n 'value_type:js:bigint',\n );\n\nexport const SQLColumnTypeTokens = {\n AutoIncrement: AutoIncrementSQLColumnToken,\n BigInteger: BigIntegerToken,\n BigSerial: BigSerialToken,\n Integer: IntegerToken,\n JSONB: JSONBToken,\n Serial: SerialToken,\n Timestamp: TimestampToken,\n Timestamptz: TimestamptzToken,\n Varchar: VarcharToken,\n};\n\nexport type SQLColumnTypeTokens = {\n AutoIncrement: AutoIncrementSQLColumnToken;\n BigInteger: BigIntegerToken;\n BigSerial: BigSerialToken;\n Integer: IntegerToken;\n JSONB: JSONBToken;\n Serial: SerialToken;\n Timestamp: TimestampToken;\n Timestamptz: TimestamptzToken;\n Varchar: VarcharToken;\n};\n\nexport const SQLColumnTypeTokensFactory = {\n AutoIncrement: AutoIncrementSQLColumnToken.from,\n BigInteger: BigIntegerToken.from(),\n BigSerial: BigSerialToken.from(),\n Integer: IntegerToken.from(),\n JSONB: JSONBToken.from,\n Serial: SerialToken.from(),\n Timestamp: TimestampToken.from(),\n Timestamptz: TimestamptzToken.from(),\n Varchar: VarcharToken.from,\n};\n\nexport type DefaultSQLColumnToken =\n | AutoIncrementSQLColumnToken\n | SerialToken\n | BigSerialToken\n | IntegerToken\n | JSONBToken\n | BigIntegerToken\n | TimestampToken\n | TimestamptzToken\n | VarcharToken;\n\nexport const SQLColumnToken = SQLToken<SQLColumnToken>('SQL_COLUMN');\n","import type { JSONSerializer } from '../../serializer';\nimport type { ParametrizedSQLBuilder } from '../parametrizedSQL';\nimport type { AnySQLToken } from '../tokens';\nimport type { SQLValueMapper } from '../valueMappers';\nimport type { SQLProcessorsReadonlyRegistry } from './sqlProcessorRegistry';\n\nexport type SQLProcessorContext = {\n mapper: SQLValueMapper;\n builder: ParametrizedSQLBuilder;\n processorsRegistry: SQLProcessorsReadonlyRegistry;\n serializer: JSONSerializer;\n};\n\nexport type SQLProcessor<Token extends AnySQLToken = AnySQLToken> = {\n canHandle: Token['sqlTokenType'];\n handle: (value: Token, context: SQLProcessorContext) => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnySQLProcessor = SQLProcessor<any>;\n\nexport type SQLProcessorOptions<Token extends AnySQLToken = AnySQLToken> = {\n canHandle: Token['sqlTokenType'];\n handle: (value: Token, context: SQLProcessorContext) => void;\n};\n\nexport const SQLProcessor = <Token extends AnySQLToken = AnySQLToken>(\n options: SQLProcessorOptions<Token>,\n): SQLProcessor<Token> => options;\n","import type { SQLIdentifier, SQLIn, SQLLiteral } from '../tokens';\nimport { SQLArray } from '../tokens';\nimport { SQLProcessor, type SQLProcessorContext } from './sqlProcessor';\n\nexport const ExpandArrayProcessor: SQLProcessor<SQLArray> = SQLProcessor({\n canHandle: 'SQL_ARRAY',\n handle: (\n token: SQLArray,\n { builder, serializer, mapper }: SQLProcessorContext,\n ) => {\n if (token.value.length === 0) {\n throw new Error(\n \"Empty arrays are not supported. If you're using it with SELECT IN statement Use SQL.in(column, array) helper instead.\",\n );\n }\n builder.addParams(mapper.mapValue(token.value, serializer) as unknown[]);\n },\n});\n\nexport const ExpandSQLInProcessor: SQLProcessor<SQLIn> = SQLProcessor({\n canHandle: 'SQL_IN',\n handle: (token: SQLIn, context: SQLProcessorContext) => {\n const { builder, mapper, processorsRegistry, serializer } = context;\n const { values: inValues, column } = token;\n\n if (inValues.value.length === 0) {\n builder.addParam(mapper.mapValue(false, serializer));\n return;\n }\n\n builder.addSQL(mapper.mapValue(column.value, serializer) as string);\n builder.addSQL(` IN (`);\n\n const arrayProcessor = processorsRegistry.get(SQLArray.type);\n\n if (!arrayProcessor) {\n throw new Error(\n 'No sql processor registered for an array. Cannot expand IN statement',\n );\n }\n\n arrayProcessor.handle(inValues, {\n builder,\n mapper,\n processorsRegistry,\n serializer: serializer,\n });\n builder.addSQL(`)`);\n },\n});\n\nexport const FormatIdentifierProcessor: SQLProcessor<SQLIdentifier> =\n SQLProcessor({\n canHandle: 'SQL_IDENTIFIER',\n handle: (\n token: SQLIdentifier,\n { builder, mapper, serializer }: SQLProcessorContext,\n ) => {\n // TODO: use MapIdentifier from mapper\n builder.addSQL(mapper.mapValue(token, serializer) as string);\n },\n });\n\nexport const MapLiteralProcessor: SQLProcessor<SQLLiteral> = SQLProcessor({\n canHandle: 'SQL_LITERAL',\n handle: (\n token: SQLLiteral,\n { builder, mapper, serializer }: SQLProcessorContext,\n ) => builder.addParam(mapper.mapValue(token.value, serializer)),\n});\n","import type { AnySQLToken } from '../tokens';\nimport type { AnySQLProcessor, SQLProcessor } from './sqlProcessor';\n\nexport interface SQLProcessorsReadonlyRegistry {\n get<Token extends AnySQLToken = AnySQLToken>(\n tokenType: Token['sqlTokenType'],\n ): SQLProcessor<Token> | null;\n all(): ReadonlyMap<string, AnySQLProcessor>;\n}\n\nexport interface SQLProcessorsRegistry extends SQLProcessorsReadonlyRegistry {\n register(...processor: AnySQLProcessor[]): SQLProcessorsRegistry;\n register(processor: Record<string, AnySQLProcessor>): SQLProcessorsRegistry;\n}\n\nexport const SQLProcessorsRegistry = (options?: {\n from: SQLProcessorsRegistry;\n}): SQLProcessorsRegistry => {\n const processors = options\n ? new Map<string, AnySQLProcessor>(options.from.all())\n : new Map<string, AnySQLProcessor>();\n\n function register(...processor: AnySQLProcessor[]): SQLProcessorsRegistry;\n function register(\n processor: Record<string, AnySQLProcessor>,\n ): SQLProcessorsRegistry;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function register(...args: any[]): SQLProcessorsRegistry {\n if (\n args.length === 1 &&\n typeof args[0] === 'object' &&\n !Array.isArray(args[0])\n ) {\n Object.entries(args[0] as Record<string, AnySQLProcessor>).forEach(\n ([_, processor]) => {\n processors.set(processor.canHandle as string, processor);\n },\n );\n } else {\n args.forEach((p: AnySQLProcessor) =>\n processors.set(p.canHandle as string, p),\n );\n }\n return registry;\n }\n\n const registry = {\n register,\n get: <Token extends AnySQLToken = AnySQLToken>(\n tokenType: string,\n ): SQLProcessor<Token> | null => {\n return processors.get(tokenType) ?? null;\n },\n all: (): ReadonlyMap<string, AnySQLProcessor> => processors,\n };\n return registry;\n};\n","import type { BigIntegerToken, DefaultSQLColumnToken } from '../tokens';\nimport type {\n AutoIncrementSQLColumnToken,\n SQLColumnTypeTokens,\n} from '../tokens';\nimport { SQLProcessor, type SQLProcessorContext } from './sqlProcessor';\n\nexport type DefaultSQLColumnProcessors = {\n [key in keyof SQLColumnTypeTokens]: SQLProcessor<SQLColumnTypeTokens[key]>;\n};\n\nexport const mapDefaultSQLColumnProcessors = (\n mapColumnType: (\n token: DefaultSQLColumnToken,\n context: SQLProcessorContext,\n ) => void,\n): DefaultSQLColumnProcessors => ({\n AutoIncrement: SQLProcessor<AutoIncrementSQLColumnToken>({\n canHandle: 'SQL_COLUMN_AUTO_INCREMENT',\n handle: (token: AutoIncrementSQLColumnToken, context) => {\n mapColumnType(token, context);\n },\n }),\n BigInteger: SQLProcessor({\n canHandle: 'SQL_COLUMN_BIGINT',\n handle: (token: BigIntegerToken, context: SQLProcessorContext) =>\n mapColumnType(token, context),\n }),\n BigSerial: SQLProcessor({\n canHandle: 'SQL_COLUMN_BIGSERIAL',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Serial: SQLProcessor({\n canHandle: 'SQL_COLUMN_SERIAL',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Integer: SQLProcessor({\n canHandle: 'SQL_COLUMN_INTEGER',\n handle: (token, context) => mapColumnType(token, context),\n }),\n JSONB: SQLProcessor({\n canHandle: 'SQL_COLUMN_JSONB',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Timestamp: SQLProcessor({\n canHandle: 'SQL_COLUMN_TIMESTAMP',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Timestamptz: SQLProcessor({\n canHandle: 'SQL_COLUMN_TIMESTAMPTZ',\n handle: (token, context) => mapColumnType(token, context),\n }),\n Varchar: SQLProcessor({\n canHandle: 'SQL_COLUMN_VARCHAR',\n handle: (token, context) => mapColumnType(token, context),\n }),\n});\n","import {\n ExpandArrayProcessor,\n ExpandSQLInProcessor,\n FormatIdentifierProcessor,\n MapLiteralProcessor,\n} from './defaultProcessors';\nimport { SQLProcessorsRegistry } from './sqlProcessorRegistry';\n\nexport * from './columnProcessors';\nexport * from './defaultProcessors';\nexport * from './sqlProcessor';\nexport * from './sqlProcessorRegistry';\n\ndeclare global {\n var defaultProcessorsRegistry: ReturnType<typeof SQLProcessorsRegistry>;\n}\n\nexport const defaultProcessorsRegistry = (globalThis.defaultProcessorsRegistry =\n globalThis.defaultProcessorsRegistry ??\n SQLProcessorsRegistry().register(\n FormatIdentifierProcessor,\n MapLiteralProcessor,\n ExpandArrayProcessor,\n ExpandSQLInProcessor,\n ));\n","import {\n SQLArray,\n SQLLiteral,\n SQLPlain,\n SQLToken,\n type AnySQLToken,\n} from '../tokens';\n\nexport type TokenizedSQL = Readonly<{\n __brand: 'tokenized-sql';\n sqlChunks: ReadonlyArray<string>;\n sqlTokens: ReadonlyArray<AnySQLToken>;\n}>;\n\nconst TokenizedSQLBuilder = () => {\n const sqlChunks: string[] = [];\n const sqlTokens: AnySQLToken[] = [];\n\n return {\n addSQL(str: string): void {\n sqlChunks.push(str);\n },\n addSQLs(str: ReadonlyArray<string>): void {\n sqlChunks.push(...str);\n },\n addToken(value: AnySQLToken): void {\n sqlTokens.push(value);\n },\n addTokens(vals: ReadonlyArray<AnySQLToken>): void {\n sqlTokens.push(...vals);\n },\n build(): TokenizedSQL {\n return sqlChunks.length > 0\n ? {\n __brand: 'tokenized-sql',\n sqlChunks,\n sqlTokens,\n }\n : TokenizedSQL.empty;\n },\n };\n};\n\nexport const TokenizedSQL = (\n strings: ReadonlyArray<string>,\n values: unknown[],\n): TokenizedSQL => {\n const builder = TokenizedSQLBuilder();\n\n for (let i = 0; i < strings.length; i++) {\n if (strings[i] !== '') builder.addSQL(strings[i]!);\n\n if (i >= values.length) break;\n\n const value = values[i];\n\n if (isTokenizedSQL(value)) {\n builder.addSQLs(value.sqlChunks);\n builder.addTokens(value.sqlTokens);\n } else if (SQLPlain.check(value)) {\n builder.addSQL(value.value);\n } else {\n builder.addSQL(TokenizedSQL.paramPlaceholder);\n builder.addToken(\n SQLToken.check(value)\n ? value\n : Array.isArray(value)\n ? SQLArray.from(value)\n : SQLLiteral.from(value),\n );\n }\n }\n\n return builder.build();\n};\n\nexport const isTokenizedSQL = (value: unknown): value is TokenizedSQL => {\n return (\n value !== null &&\n typeof value === 'object' &&\n '__brand' in value &&\n value.__brand === 'tokenized-sql'\n );\n};\n\nTokenizedSQL.paramPlaceholder = `__P__`;\n\nTokenizedSQL.empty = {\n __brand: 'tokenized-sql',\n sqlChunks: [''],\n sqlTokens: [],\n} satisfies TokenizedSQL;\n","import { JSONSerializer } from '../serializer';\nimport type { dumboSchema } from '../schema/dumboSchema';\nimport { columnSchemaComponent } from '../schema/components/columnSchemaComponent';\nimport type { SQLFormatter } from './formatters';\nimport { describeSQL, formatSQL, type FormatSQLOptions } from './formatters';\nimport type { ParametrizedSQL } from './parametrizedSQL';\nimport { isTokenizedSQL, TokenizedSQL } from './tokenizedSQL';\nimport {\n SQLArray,\n SQLColumnToken,\n SQLColumnTypeTokensFactory,\n SQLIdentifier,\n SQLIn,\n SQLPlain,\n type SQLArrayMode,\n} from './tokens';\n\n/** A tokenized SQL statement created with the {@link SQL} template tag. */\nexport type SQL = string & { __brand: 'sql' };\n\nexport type SQLTag = {\n /**\n * Creates a tokenized SQL statement.\n *\n * Interpolated values are treated as bound parameters by default. Use the\n * helper methods on `SQL` for SQL syntax that cannot be represented as a bound\n * parameter, such as identifiers or trusted raw fragments.\n */\n (strings: TemplateStringsArray, ...values: unknown[]): SQL;\n\n /** Empty SQL statement used when optional query fragments are absent. */\n EMPTY: SQL;\n\n /** Concatenates SQL fragments without adding a separator. */\n concat: (...sqls: SQL[]) => SQL;\n\n /**\n * Merges SQL fragments, skipping empty fragments and inserting a separator\n * between non-empty fragments.\n */\n merge: (sqls: SQL[], separator?: string) => SQL;\n\n /** Formats SQL into a parametrized query and params using the selected formatter. */\n format: (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n options?: FormatSQLOptions,\n ) => ParametrizedSQL;\n\n /** Formats SQL into a readable SQL string for diagnostics and migrations. */\n describe: (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n options?: FormatSQLOptions,\n ) => string;\n\n /** Creates a SQL `IN`/native-array token for the provided column and values. */\n in: (\n column: string,\n values: unknown[],\n options?: { mode?: SQLArrayMode },\n ) => SQLIn;\n\n /** Creates an array token that formatters can render as native or expanded params. */\n array: (values: unknown[], options?: { mode?: SQLArrayMode }) => SQLArray;\n\n /** Creates a SQL identifier token, quoting it when required by SQL rules. */\n identifier: typeof SQLIdentifier.from;\n\n /**\n * Creates a trusted raw SQL fragment.\n *\n * This does not quote, escape, or bind the value. Prefer bound parameters for\n * data values, `SQL.identifier` for identifiers, and `SQL.literal` only when\n * SQL syntax requires an inline value literal.\n */\n plain: typeof SQLPlain.from;\n\n /**\n * Creates an inline SQL value literal.\n *\n * Use this for SQL syntax positions that cannot use bound parameters. Data\n * values in ordinary queries should stay as template interpolations.\n */\n literal: (value: string) => SQLPlain;\n\n /** Type guards and helpers for SQL tokens. */\n check: {\n isSQL: (value: unknown) => value is SQL;\n isTokenizedSQL: (value: unknown) => value is TokenizedSQL;\n isEmpty: (sql: SQL) => boolean;\n isIdentifier: typeof SQLIdentifier.check;\n isPlain: typeof SQLPlain.check;\n isSQLIn: typeof SQLIn.check;\n };\n\n /** Creates a schema column token for SQL generation. */\n column: typeof SQLColumnToken.from & {\n /** Column type token factory. */\n type: typeof SQLColumnTypeTokensFactory;\n };\n\n /** Creates a schema column token using Dumbo schema metadata. */\n columnN: typeof dumboSchema.column & {\n /** Column type token factory. */\n type: typeof SQLColumnTypeTokensFactory;\n };\n};\n\nconst createSQL = (\n strings: TemplateStringsArray,\n ...values: unknown[]\n): SQL => {\n const parametrized = TokenizedSQL(strings, values);\n return parametrized as unknown as SQL;\n};\n\n/**\n * Creates SQL by interpolating values directly into the statement.\n *\n * Prefer {@link SQL} for query execution. `RawSQL` is for trusted SQL text that\n * is already safe to inline.\n */\nexport function RawSQL(\n strings: TemplateStringsArray,\n ...values: unknown[]\n): SQL {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n result += String(values[i]);\n }\n }\n\n return {\n __brand: 'tokenized-sql',\n sqlChunks: [result],\n sqlTokens: [],\n } as unknown as SQL;\n}\n\n/** Returns true when the value is a tokenized SQL statement. */\nexport const isSQL = (value: unknown): value is SQL => {\n if (value === undefined || value === null) {\n return false;\n }\n\n return isTokenizedSQL(value);\n};\n\nconst emptySQL = {\n __brand: 'tokenized-sql',\n sqlChunks: [''],\n sqlTokens: [],\n} satisfies TokenizedSQL as unknown as SQL;\n\nconst mergeSQL = (sqls: SQL[], separator: string = ' '): SQL => {\n const parametrized = sqls\n .filter((sql) => !isEmpty(sql))\n .map((sql) => sql as unknown as TokenizedSQL);\n\n const params = parametrized.flatMap((p) => p.sqlTokens);\n const sqlChunks = parametrized.flatMap((p, i) =>\n i == parametrized.length - 1 || separator === ''\n ? p.sqlChunks\n : [...p.sqlChunks, separator],\n );\n\n const merged: TokenizedSQL =\n sqlChunks.length > 0\n ? {\n __brand: 'tokenized-sql',\n sqlChunks: sqlChunks,\n sqlTokens: params,\n }\n : TokenizedSQL.empty;\n\n return merged as unknown as SQL;\n};\n\nconst concatSQL = (...sqls: SQL[]): SQL => mergeSQL(sqls, '');\n\nconst literal = (value: string): SQLPlain =>\n SQLPlain.from(`'${value.replace(/'/g, \"''\")}'`);\n\nconst isEmpty = (sql: SQL): boolean => {\n if (isTokenizedSQL(sql)) {\n const parametrized = sql as unknown as TokenizedSQL;\n return (\n parametrized.sqlChunks.every((chunk) => chunk.trim() === '') &&\n parametrized.sqlTokens.length === 0\n );\n }\n\n return false;\n};\n\nconst columnFactory: typeof SQLColumnToken.from & {\n type: typeof SQLColumnTypeTokensFactory;\n} = SQLColumnToken.from as unknown as typeof SQLColumnToken.from & {\n type: typeof SQLColumnTypeTokensFactory;\n};\ncolumnFactory.type = SQLColumnTypeTokensFactory;\n\nconst schemaColumnFactory = ((name: string, type: unknown, options?: object) =>\n columnSchemaComponent({\n columnName: name,\n type,\n ...options,\n } as never)) as typeof dumboSchema.column;\n\nexport const SQL: SQLTag = Object.assign(createSQL, {\n EMPTY: emptySQL,\n concat: concatSQL,\n merge: mergeSQL,\n format: (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n options?: FormatSQLOptions,\n ): ParametrizedSQL =>\n formatSQL(sql, formatter, options?.serializer ?? JSONSerializer, options),\n describe: (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n options?: FormatSQLOptions,\n ): string =>\n describeSQL(sql, formatter, options?.serializer ?? JSONSerializer, options),\n in: (\n column: string,\n values: unknown[],\n options?: { mode?: SQLArrayMode },\n ): SQLIn =>\n options?.mode\n ? SQLIn.from({ column, values, mode: options.mode })\n : SQLIn.from({ column, values }),\n array: (values: unknown[], options?: { mode?: SQLArrayMode }): SQLArray =>\n SQLArray.from(\n options?.mode ? { value: values, mode: options.mode } : values,\n ),\n identifier: SQLIdentifier.from,\n plain: SQLPlain.from,\n literal,\n check: {\n isSQL,\n isTokenizedSQL: (value: unknown): value is TokenizedSQL =>\n isTokenizedSQL(value),\n isEmpty,\n isIdentifier: SQLIdentifier.check,\n isPlain: SQLPlain.check,\n isSQLIn: SQLIn.check,\n },\n column: columnFactory,\n columnN: Object.assign(schemaColumnFactory, {\n type: SQLColumnTypeTokensFactory,\n }),\n});\n","export const ansiSqlReservedMap: { [key: string]: boolean } = {\n ALL: true,\n AND: true,\n ANY: true,\n ARRAY: true,\n AS: true,\n ASC: true,\n AUTHORIZATION: true,\n BETWEEN: true,\n BINARY: true,\n BOTH: true,\n CASE: true,\n CAST: true,\n CHECK: true,\n COLLATE: true,\n COLUMN: true,\n CONSTRAINT: true,\n CREATE: true,\n CROSS: true,\n CURRENT_DATE: true,\n CURRENT_TIME: true,\n CURRENT_TIMESTAMP: true,\n CURRENT_USER: true,\n DEFAULT: true,\n DEFERRABLE: true,\n DESC: true,\n DISTINCT: true,\n DO: true,\n ELSE: true,\n END: true,\n EXCEPT: true,\n FALSE: true,\n FOR: true,\n FOREIGN: true,\n FROM: true,\n FULL: true,\n GRANT: true,\n GROUP: true,\n HAVING: true,\n IN: true,\n INITIALLY: true,\n INNER: true,\n INTERSECT: true,\n INTO: true,\n IS: true,\n JOIN: true,\n LEADING: true,\n LEFT: true,\n LIKE: true,\n LOCALTIME: true,\n LOCALTIMESTAMP: true,\n NATURAL: true,\n NEW: true,\n NOT: true,\n NULL: true,\n NULLS: true,\n OLD: true,\n ON: true,\n ONLY: true,\n OPEN: true,\n OR: true,\n ORDER: true,\n OUTER: true,\n OVERLAPS: true,\n PARTITION: true,\n PLACING: true,\n PRIMARY: true,\n REFERENCES: true,\n RIGHT: true,\n SELECT: true,\n SESSION_USER: true,\n SIMILAR: true,\n SOME: true,\n TABLE: true,\n THEN: true,\n TO: true,\n TRAILING: true,\n TRUE: true,\n UNION: true,\n UNIQUE: true,\n USER: true,\n USING: true,\n WHEN: true,\n WHERE: true,\n WITH: true,\n WITHOUT: true,\n ADD: true,\n ALTER: true,\n ARE: true,\n AT: true,\n BEGIN: true,\n BY: true,\n CASCADE: true,\n CLOSE: true,\n COMMIT: true,\n CONNECT: true,\n CONTINUE: true,\n CORRESPONDING: true,\n CURSOR: true,\n DEALLOCATE: true,\n DECLARE: true,\n DELETE: true,\n DESCRIBE: true,\n DISCONNECT: true,\n DROP: true,\n ESCAPE: true,\n EXECUTE: true,\n EXISTS: true,\n FETCH: true,\n FIRST: true,\n FLOAT: true,\n GET: true,\n GLOBAL: true,\n GO: true,\n GOTO: true,\n HOUR: true,\n IMMEDIATE: true,\n INDICATOR: true,\n INPUT: true,\n INSERT: true,\n INT: true,\n INTEGER: true,\n INTERVAL: true,\n LANGUAGE: true,\n LAST: true,\n LOCAL: true,\n MATCH: true,\n MINUTE: true,\n MODULE: true,\n MONTH: true,\n NATIONAL: true,\n NEXT: true,\n NO: true,\n OF: true,\n OUTPUT: true,\n PARTIAL: true,\n PREPARE: true,\n PRESERVE: true,\n PRIOR: true,\n PRIVILEGES: true,\n PROCEDURE: true,\n PUBLIC: true,\n READ: true,\n REAL: true,\n RESTRICT: true,\n REVOKE: true,\n ROLLBACK: true,\n ROWS: true,\n SCHEMA: true,\n SCROLL: true,\n SECOND: true,\n SECTION: true,\n SET: true,\n SIZE: true,\n SMALLINT: true,\n SQL: true,\n SQLCODE: true,\n SQLERROR: true,\n SQLSTATE: true,\n TEMPORARY: true,\n TIMEZONE_HOUR: true,\n TIMEZONE_MINUTE: true,\n TRANSACTION: true,\n TRANSLATE: true,\n TRANSLATION: true,\n UNKNOWN: true,\n UPDATE: true,\n VALUE: true,\n VALUES: true,\n VARCHAR: true,\n VARYING: true,\n VIEW: true,\n WHENEVER: true,\n WORK: true,\n WRITE: true,\n YEAR: true,\n ZONE: true,\n};\n","import type { JSONSerializer } from '../../serializer';\nimport { SQL } from '../sql';\nimport { ansiSqlReservedMap as ansiSqlReservedWordsMap } from './reservedSqlWords';\n\nexport interface SQLValueMapper {\n mapValue: MapSQLParamValue;\n mapPlaceholder: (index: number, value: unknown) => string;\n mapIdentifier: (value: string) => string;\n}\n\nexport type MapSQLParamValue = (\n value: unknown,\n serializer: JSONSerializer,\n options?: MapSQLParamValueOptions,\n) => unknown;\n\nexport interface MapSQLParamValueOptions {\n mapBoolean?: (value: boolean) => unknown;\n mapArray?: (array: unknown[], mapValue: MapSQLParamValue) => unknown[];\n mapDate?: (value: Date) => unknown;\n mapObject?: (value: object) => unknown;\n mapBigInt?: (value: bigint) => unknown;\n mapValue?: MapSQLParamValue;\n mapPlaceholder?: (index: number, value: unknown) => string;\n mapIdentifier?: (value: string) => string;\n}\n\nexport const ANSISQLParamPlaceholder = '?';\nexport const ANSISQLIdentifierQuote = '\"';\n\nexport const mapANSISQLParamPlaceholder = () => ANSISQLParamPlaceholder;\n\nconst isReserved = (\n value: string,\n reserved: {\n [key: string]: boolean;\n },\n): boolean => !!reserved[value.toUpperCase()];\n\nexport const mapSQLIdentifier = (\n value: string,\n options?: {\n reservedWords: {\n [key: string]: boolean;\n };\n quote?: string;\n },\n): string => {\n if (value === undefined || value === null) {\n throw new Error('SQL identifier cannot be null or undefined');\n }\n\n const ident = value.toString().slice(0); // create copy\n const quoteSign = options?.quote ?? ANSISQLIdentifierQuote;\n\n // do not quote a valid, unquoted identifier\n if (\n /^[a-z_][a-z0-9_$]*$/.test(ident) &&\n !isReserved(ident, options?.reservedWords ?? ansiSqlReservedWordsMap)\n ) {\n return ident;\n }\n\n let quoted = quoteSign;\n for (let i = 0; i < ident.length; i++) {\n const c = ident[i];\n quoted += c === quoteSign ? c + c : c;\n }\n quoted += quoteSign;\n return quoted;\n};\n\nexport const DefaultMapSQLParamValueOptions = {\n mapPlaceholder: mapANSISQLParamPlaceholder,\n mapIdentifier: mapSQLIdentifier,\n};\n\nexport const SQLValueMapper = (\n options?: MapSQLParamValueOptions,\n): SQLValueMapper => {\n const mapSQLParamValueOptions = {\n ...DefaultMapSQLParamValueOptions,\n ...(options ?? {}),\n };\n\n const resultMapper: SQLValueMapper = {\n mapValue: (\n value: unknown,\n serializer: JSONSerializer,\n mapOptions?: MapSQLParamValueOptions,\n ) =>\n mapSQLParamValue(value, serializer, {\n ...mapSQLParamValueOptions,\n ...mapOptions,\n }),\n mapPlaceholder: mapSQLParamValueOptions.mapPlaceholder,\n mapIdentifier: mapSQLParamValueOptions.mapIdentifier,\n };\n return resultMapper;\n};\n\nexport function mapSQLParamValue(\n value: unknown,\n serializer: JSONSerializer,\n options?: MapSQLParamValueOptions,\n): unknown {\n if (value === null || value === undefined) {\n return null;\n } else if (typeof value === 'number') {\n return value;\n } else if (typeof value === 'string') {\n return value;\n } else if (Array.isArray(value)) {\n const mapValue: MapSQLParamValue = options?.mapValue ?? mapSQLParamValue;\n return options?.mapArray\n ? options.mapArray(value, mapValue)\n : value.map((item) => mapValue(item, serializer, options));\n } else if (typeof value === 'boolean') {\n return options?.mapBoolean ? options.mapBoolean(value) : value;\n } else if (typeof value === 'bigint') {\n return options?.mapBigInt ? options.mapBigInt(value) : value.toString();\n } else if (value instanceof Date) {\n return options?.mapDate ? options.mapDate(value) : value.toISOString();\n } else if (SQL.check.isIdentifier(value)) {\n return (options?.mapIdentifier ?? mapSQLIdentifier)(value.value);\n } else if (typeof value === 'object') {\n return options?.mapObject\n ? options.mapObject(value)\n : serializer.serialize(value);\n } else {\n return serializer.serialize(value);\n }\n}\n","import { JSONSerializer } from '../../serializer';\nimport {\n ParametrizedSQLBuilder,\n type ParametrizedSQL,\n} from '../parametrizedSQL';\nimport {\n defaultProcessorsRegistry,\n type SQLProcessorContext,\n type SQLProcessorsReadonlyRegistry,\n} from '../processors';\nimport { SQL } from '../sql';\nimport { isTokenizedSQL, TokenizedSQL } from '../tokenizedSQL';\nimport { SQLValueMapper, type MapSQLParamValueOptions } from '../valueMappers';\n\nexport type FormatContext = Partial<SQLProcessorContext> &\n Pick<SQLProcessorContext, 'serializer'>;\n\nexport interface SQLFormatter {\n format: (sql: SQL | SQL[], context: FormatContext) => ParametrizedSQL;\n describe: (sql: SQL | SQL[], context: FormatContext) => string;\n valueMapper: SQLValueMapper;\n}\n\nexport type FormatSQLOptions = {\n mapper?: MapSQLParamValueOptions;\n processorsRegistry?: SQLProcessorsReadonlyRegistry;\n serializer?: JSONSerializer;\n};\n\nexport type SQLFormatterOptions = Partial<Omit<SQLFormatter, 'valueMapper'>> & {\n valueMapper?: MapSQLParamValueOptions;\n processorsRegistry?: SQLProcessorsReadonlyRegistry;\n};\n\nexport const SQLFormatter = ({\n format,\n describe,\n valueMapper: valueMapperOptions,\n processorsRegistry,\n}: SQLFormatterOptions): SQLFormatter => {\n const valueMapper = SQLValueMapper(valueMapperOptions);\n const options = {\n builder: ParametrizedSQLBuilder({\n mapParamPlaceholder: valueMapper.mapPlaceholder,\n }),\n mapper: valueMapper,\n processorsRegistry: processorsRegistry ?? defaultProcessorsRegistry,\n };\n\n const resultFormatter: SQLFormatter = {\n format:\n format ??\n ((sql: SQL | SQL[], methodOptions) =>\n formatSQL(\n sql,\n resultFormatter,\n methodOptions?.serializer ?? JSONSerializer,\n {\n ...options,\n ...(methodOptions ?? {}),\n },\n )),\n describe:\n describe ??\n ((sql: SQL | SQL[], methodOptions) =>\n describeSQL(\n sql,\n resultFormatter,\n methodOptions?.serializer ?? JSONSerializer,\n {\n ...options,\n ...(methodOptions ?? {}),\n },\n )),\n valueMapper,\n };\n\n return resultFormatter;\n};\n\ndeclare global {\n var dumboSQLFormatters: Record<string, SQLFormatter>;\n}\n\nconst dumboSQLFormatters = (globalThis.dumboSQLFormatters =\n globalThis.dumboSQLFormatters ?? {});\n\nexport const registerFormatter = (\n dialect: string,\n formatter: SQLFormatter,\n): void => {\n dumboSQLFormatters[dialect] = formatter;\n};\n\nexport const getFormatter = (dialect: string): SQLFormatter => {\n const formatterKey = dialect;\n if (!dumboSQLFormatters[formatterKey]) {\n throw new Error(`No SQL formatter registered for dialect: ${dialect}`);\n }\n return dumboSQLFormatters[formatterKey];\n};\n\nexport function formatSQL(\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n serializer: JSONSerializer,\n context?: FormatSQLOptions,\n): ParametrizedSQL {\n const mapper: SQLValueMapper =\n context?.mapper == undefined\n ? formatter.valueMapper\n : {\n ...formatter.valueMapper,\n ...context.mapper,\n };\n const processorsRegistry =\n context?.processorsRegistry ?? defaultProcessorsRegistry;\n\n const merged = (Array.isArray(sql)\n ? SQL.merge(sql, '\\n')\n : sql) as unknown as TokenizedSQL;\n\n if (!isTokenizedSQL(merged)) {\n throw new Error('Expected TokenizedSQL, got string-based SQL');\n }\n\n const builder = ParametrizedSQLBuilder({\n mapParamPlaceholder: mapper.mapPlaceholder,\n });\n\n let paramIndex = 0;\n\n for (let i = 0; i < merged.sqlChunks.length; i++) {\n const sqlChunk = merged.sqlChunks[i]!;\n\n if (sqlChunk !== TokenizedSQL.paramPlaceholder) {\n builder.addSQL(sqlChunk);\n continue;\n }\n\n const token = merged.sqlTokens[paramIndex++]!;\n\n const processor = processorsRegistry.get(token.sqlTokenType);\n\n if (!processor) {\n throw new Error(\n `No SQL processor registered for token type: ${token.sqlTokenType}`,\n );\n }\n\n processor.handle(token, {\n builder,\n processorsRegistry,\n serializer,\n mapper,\n });\n }\n\n return builder.build();\n}\n\nexport const describeSQL = (\n sql: SQL | SQL[],\n formatter: SQLFormatter,\n serializer: JSONSerializer,\n options?: FormatSQLOptions,\n): string =>\n formatSQL(sql, formatter, serializer, {\n ...(options ?? {}),\n mapper: {\n mapPlaceholder: (_, value) => serializer.serialize(value),\n },\n }).query;\n","import ansis from 'ansis';\n\nlet enableColors = true;\n\nexport const color = {\n set level(value: 0 | 1) {\n enableColors = value === 1;\n },\n hex:\n (value: string) =>\n (text: string): string =>\n enableColors ? ansis.hex(value)(text) : text,\n red: (value: string): string => (enableColors ? ansis.red(value) : value),\n green: (value: string): string => (enableColors ? ansis.green(value) : value),\n blue: (value: string): string => (enableColors ? ansis.blue(value) : value),\n cyan: (value: string): string => (enableColors ? ansis.cyan(value) : value),\n yellow: (value: string): string =>\n enableColors ? ansis.yellow(value) : value,\n};\n\nexport default color;\n","import chalk from './color';\n\nconst TWO_SPACES = ' ';\n\nconst COLOR_STRING = chalk.hex('#98c379'); // Soft green for strings\nconst COLOR_KEY = chalk.hex('#61afef'); // Muted cyan for keys\nconst COLOR_NUMBER_OR_DATE = chalk.hex('#d19a66'); // Light orange for numbers\nconst COLOR_BOOLEAN = chalk.hex('#c678dd'); // Light purple for booleans\nconst COLOR_NULL_OR_UNDEFINED = chalk.hex('#c678dd'); // Light purple for null\nconst COLOR_BRACKETS = chalk.hex('#abb2bf'); // Soft white for object and array brackets\n\nconst processString = (\n str: string,\n indent: string,\n handleMultiline: boolean,\n): string => {\n if (handleMultiline && str.includes('\\n')) {\n const lines = str.split('\\n');\n const indentedLines = lines.map(\n (line) => indent + TWO_SPACES + COLOR_STRING(line),\n );\n return (\n COLOR_STRING('\"') +\n '\\n' +\n indentedLines.join('\\n') +\n '\\n' +\n indent +\n COLOR_STRING('\"')\n );\n }\n return COLOR_STRING(`\"${str}\"`);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst shouldPrint = (obj: any): boolean =>\n typeof obj !== 'function' && typeof obj !== 'symbol';\n\nconst formatJson = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any,\n indentLevel: number = 0,\n handleMultiline: boolean = false,\n): string => {\n const indent = TWO_SPACES.repeat(indentLevel);\n\n if (obj === null) return COLOR_NULL_OR_UNDEFINED('null');\n\n if (obj === undefined) return COLOR_NULL_OR_UNDEFINED('undefined');\n\n if (typeof obj === 'string')\n return processString(obj, indent, handleMultiline);\n if (typeof obj === 'number' || typeof obj === 'bigint' || obj instanceof Date)\n return COLOR_NUMBER_OR_DATE(String(obj));\n if (typeof obj === 'boolean') return COLOR_BOOLEAN(String(obj));\n\n if (obj instanceof Error) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const errorObj: Record<string, any> = {};\n\n const propNames = Object.getOwnPropertyNames(obj);\n\n propNames.forEach((key) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n errorObj[key] = (obj as any)[key];\n });\n\n return formatJson(errorObj, indentLevel, handleMultiline);\n }\n\n if (obj instanceof Promise) {\n return COLOR_STRING('Promise {pending}');\n }\n\n if (Array.isArray(obj)) {\n const arrayItems = obj.map((item) =>\n formatJson(item, indentLevel + 1, handleMultiline),\n );\n return `${COLOR_BRACKETS('[')}\\n${indent} ${arrayItems.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS(']')}`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n const entries = Object.entries(obj)\n .filter(([_, value]) => shouldPrint(value))\n .map(\n ([key, value]) =>\n `${COLOR_KEY(`\"${key}\"`)}: ${formatJson(\n value,\n indentLevel + 1,\n handleMultiline,\n )}`,\n );\n return `${COLOR_BRACKETS('{')}\\n${indent} ${entries.join(\n `,\\n${indent} `,\n )}\\n${indent}${COLOR_BRACKETS('}')}`;\n};\n\nexport const prettyJson = (\n obj: unknown,\n options?: { handleMultiline?: boolean },\n): string => formatJson(obj, 0, options?.handleMultiline);\n","import { JSONSerializer } from '../serializer';\nimport { prettyJson } from './printing';\n\nexport const tracer = () => {};\n\nexport type LogLevel = 'DISABLED' | 'INFO' | 'LOG' | 'WARN' | 'ERROR';\n\nexport const LogLevel = {\n DISABLED: 'DISABLED' as LogLevel,\n INFO: 'INFO' as LogLevel,\n LOG: 'LOG' as LogLevel,\n WARN: 'WARN' as LogLevel,\n ERROR: 'ERROR' as LogLevel,\n};\n\nexport type LogType = 'CONSOLE';\n\nexport type LogStyle = 'RAW' | 'PRETTY';\n\nexport const LogStyle = {\n RAW: 'RAW' as LogStyle,\n PRETTY: 'PRETTY' as LogStyle,\n};\n\nconst getEnvVariable = (name: string): string | undefined => {\n try {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nconst shouldLog = (logLevel: LogLevel): boolean => {\n const definedLogLevel = getEnvVariable('DUMBO_LOG_LEVEL') ?? LogLevel.ERROR;\n\n if (definedLogLevel === LogLevel.ERROR && logLevel === LogLevel.ERROR)\n return true;\n\n if (\n definedLogLevel === LogLevel.WARN &&\n [LogLevel.ERROR, LogLevel.WARN].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.LOG &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG].includes(logLevel)\n )\n return true;\n\n if (\n definedLogLevel === LogLevel.INFO &&\n [LogLevel.ERROR, LogLevel.WARN, LogLevel.LOG, LogLevel.INFO].includes(\n logLevel,\n )\n )\n return true;\n\n return false;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventRecorder = (message?: any, ...optionalParams: any[]) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TraceEventFormatter = (event: any) => string;\n\nconst nulloTraceEventRecorder: TraceEventRecorder = () => {};\n\nconst getTraceEventFormatter =\n (\n logStyle: LogStyle,\n serializer: JSONSerializer = JSONSerializer,\n ): TraceEventFormatter =>\n (event) => {\n switch (logStyle) {\n case 'RAW':\n return serializer.serialize(event);\n case 'PRETTY':\n return prettyJson(event, { handleMultiline: true });\n }\n };\n\nconst getTraceEventRecorder = (\n logLevel: LogLevel,\n logStyle: LogStyle,\n): TraceEventRecorder => {\n const format = getTraceEventFormatter(logStyle);\n switch (logLevel) {\n case 'DISABLED':\n return nulloTraceEventRecorder;\n case 'INFO':\n return (event) => console.info(format(event));\n case 'LOG':\n return (event) => console.log(format(event));\n case 'WARN':\n return (event) => console.warn(format(event));\n case 'ERROR':\n return (event) => console.error(format(event));\n }\n};\n\nconst recordTraceEvent = (\n logLevel: LogLevel,\n eventName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attributes?: Record<string, any>,\n) => {\n if (!shouldLog(LogLevel.LOG)) return;\n\n const event = {\n name: eventName,\n timestamp: new Date().getTime(),\n ...attributes,\n };\n\n const record = getTraceEventRecorder(\n logLevel,\n (getEnvVariable('DUMBO_LOG_STYLE') as LogStyle | undefined) ?? 'RAW',\n );\n\n record(event);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.info = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.INFO, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.warn = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.WARN, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.log = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.LOG, eventName, attributes);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntracer.error = (eventName: string, attributes?: Record<string, any>) =>\n recordTraceEvent(LogLevel.ERROR, eventName, attributes);\n\nexport * from './printing';\n","import type { SQL } from '../sql';\n\nexport type MigrationStyle = 'None' | 'CreateOrUpdate';\n\nexport type SQLMigration = {\n name: string;\n sqls: SQL[];\n};\n\nexport const sqlMigration = (name: string, sqls: SQL[]): SQLMigration => ({\n name,\n sqls,\n});\n\nexport type MigrationRecord = {\n id: number;\n name: string;\n application: string;\n sqlHash: string;\n timestamp: Date;\n};\n","import type { Dumbo } from '../..';\nimport type { DatabaseDriverType } from '../../drivers';\nimport { SQL } from '../../sql';\nimport { schemaComponent, type SchemaComponent } from '../schemaComponent';\nimport { sqlMigration } from '../sqlMigration';\nimport { type MigratorOptions, runSQLMigrations } from './migrator';\n\nconst { AutoIncrement, Varchar, Timestamp } = SQL.column.type;\n\nconst migrationTableSQL = SQL`\n CREATE TABLE IF NOT EXISTS dmb_migrations (\n id ${AutoIncrement({ primaryKey: true })},\n name ${Varchar(255)} NOT NULL UNIQUE,\n application ${Varchar(255)} NOT NULL DEFAULT 'default',\n sql_hash ${Varchar(64)} NOT NULL,\n timestamp ${Timestamp} NOT NULL DEFAULT CURRENT_TIMESTAMP\n );\n`;\n\nexport const migrationTableSchemaComponent = schemaComponent(\n 'dumbo:schema-component:migrations-table',\n {\n migrations: [sqlMigration('dumbo:migrationTable:001', [migrationTableSQL])],\n },\n);\n\nexport type SchemaComponentMigrator = {\n component: SchemaComponent;\n run: (options?: Partial<MigratorOptions>) => Promise<void>;\n};\n\nexport const SchemaComponentMigrator = <DriverType extends DatabaseDriverType>(\n component: SchemaComponent,\n dumbo: Dumbo<DriverType>,\n): SchemaComponentMigrator => {\n const completedMigrations: string[] = [];\n\n return {\n component,\n run: async (options) => {\n const pendingMigrations = component.migrations.filter(\n (m) =>\n !completedMigrations.includes(\n `${component.schemaComponentKey}:${m.name}`,\n ),\n );\n\n if (pendingMigrations.length === 0) return;\n\n await runSQLMigrations(dumbo, pendingMigrations, options);\n\n completedMigrations.push(\n ...pendingMigrations.map(\n (m) => `${component.schemaComponentKey}:${m.name}`,\n ),\n );\n },\n };\n};\n","import { type Dumbo, JSONSerializer } from '../..';\nimport { type DatabaseType, fromDatabaseDriverType } from '../../drivers';\nimport type { SQLExecutor } from '../../execute';\nimport {\n type DatabaseLock,\n type DatabaseLockOptions,\n NoDatabaseLock,\n} from '../../locks';\nimport { singleOrNull } from '../../query';\nimport type { SQLFormatter } from '../../sql';\nimport { SQL, getFormatter } from '../../sql';\nimport { tracer } from '../../tracing';\nimport type { SchemaComponent } from '../schemaComponent';\nimport type { SQLMigration } from '../sqlMigration';\nimport { migrationTableSchemaComponent } from './schemaComponentMigrator';\n\nexport const MIGRATIONS_LOCK_ID = 999956789;\n\ndeclare global {\n var defaultMigratorOptions: Record<DatabaseType, MigratorOptions>;\n}\n\nconst defaultMigratorOptions = (globalThis.defaultMigratorOptions =\n globalThis.defaultMigratorOptions ?? {});\n\nexport const registerDefaultMigratorOptions = (\n databaseType: DatabaseType,\n options: MigratorOptions,\n): void => {\n defaultMigratorOptions[databaseType] = options;\n};\n\nexport const getDefaultMigratorOptionsFromRegistry = (\n databaseType: DatabaseType,\n): MigratorOptions => {\n if (!defaultMigratorOptions[databaseType]) {\n throw new Error(\n `No default migrator options registered for database type: ${databaseType}`,\n );\n }\n return defaultMigratorOptions[databaseType];\n};\n\nexport type MigratorOptions = {\n schema?: {\n migrationTable?: SchemaComponent;\n };\n lock?: {\n databaseLock?: DatabaseLock;\n options?: Omit<DatabaseLockOptions, 'lockId'> &\n Partial<Pick<DatabaseLockOptions, 'lockId'>>;\n };\n dryRun?: boolean | undefined;\n ignoreMigrationHashMismatch?: boolean | undefined;\n migrationTimeoutMs?: number | undefined;\n};\n\nexport type RunSQLMigrationsResult = {\n applied: SQLMigration[];\n skipped: SQLMigration[];\n};\n\nexport const runSQLMigrations = (\n pool: Dumbo,\n migrations: ReadonlyArray<SQLMigration>,\n partialOptions?: Partial<MigratorOptions>,\n): Promise<RunSQLMigrationsResult> =>\n pool.withTransaction(async ({ execute }) => {\n const databaseType = fromDatabaseDriverType(pool.driverType).databaseType;\n const defaultOptions = getDefaultMigratorOptionsFromRegistry(databaseType);\n partialOptions ??= {};\n\n const options: MigratorOptions = {\n ...defaultOptions,\n ...partialOptions,\n schema: {\n ...defaultOptions.schema,\n ...(partialOptions?.schema ?? {}),\n },\n lock: {\n ...defaultOptions.lock,\n ...partialOptions?.lock,\n options: {\n lockId: MIGRATIONS_LOCK_ID,\n ...defaultOptions.lock?.options,\n ...partialOptions?.lock?.options,\n },\n },\n dryRun: defaultOptions.dryRun ?? partialOptions?.dryRun,\n ignoreMigrationHashMismatch:\n defaultOptions.ignoreMigrationHashMismatch ??\n partialOptions?.ignoreMigrationHashMismatch,\n migrationTimeoutMs:\n defaultOptions.migrationTimeoutMs ?? partialOptions?.migrationTimeoutMs,\n };\n\n const { databaseLock: _, ...rest } = options.lock ?? {};\n\n const databaseLock = options.lock?.databaseLock ?? NoDatabaseLock;\n\n const lockOptions: DatabaseLockOptions = {\n lockId: MIGRATIONS_LOCK_ID,\n ...rest,\n };\n\n const migrationTable =\n options.schema?.migrationTable ?? migrationTableSchemaComponent;\n\n const coreMigrations = migrationTable.migrations;\n\n const result: RunSQLMigrationsResult = { applied: [], skipped: [] };\n\n await databaseLock.withAcquire(\n execute,\n async () => {\n for (const migration of coreMigrations) {\n await execute.batchCommand(migration.sqls, {\n timeoutMs: options.migrationTimeoutMs,\n });\n }\n\n for (const migration of migrations) {\n const wasApplied = await runSQLMigration(\n databaseType,\n execute,\n migration,\n {\n ignoreMigrationHashMismatch:\n options.ignoreMigrationHashMismatch ?? false,\n migrationTimeoutMs: options.migrationTimeoutMs,\n },\n );\n if (wasApplied) {\n result.applied.push(migration);\n } else {\n result.skipped.push(migration);\n }\n }\n },\n lockOptions,\n );\n\n return { success: options.dryRun ? false : true, result };\n });\n\nconst runSQLMigration = async (\n databaseType: DatabaseType,\n execute: SQLExecutor,\n migration: SQLMigration,\n options?: {\n ignoreMigrationHashMismatch?: boolean;\n migrationTimeoutMs?: number | undefined;\n },\n): Promise<boolean> => {\n const sqls = combineMigrations(migration);\n const sqlHash = await getMigrationHash(migration, getFormatter(databaseType));\n\n try {\n const newMigration = {\n name: migration.name,\n sqlHash,\n };\n\n const checkResult = await ensureMigrationWasNotAppliedYet(\n execute,\n newMigration,\n );\n\n if (checkResult.exists === true) {\n if (checkResult.hashesMatch === true) {\n tracer.info('migration-already-applied', {\n migrationName: migration.name,\n });\n return false;\n }\n if (options?.ignoreMigrationHashMismatch !== true)\n throw new Error(\n `Migration hash mismatch for \"${migration.name}\". Aborting migration.`,\n );\n\n tracer.warn('migration-hash-mismatch', {\n migrationName: migration.name,\n expectedHash: sqlHash,\n actualHash: checkResult.hashFromDB,\n });\n\n await updateMigrationHash(execute, newMigration);\n\n return false;\n }\n\n await execute.batchCommand(sqls, {\n timeoutMs: options?.migrationTimeoutMs,\n });\n\n await recordMigration(execute, newMigration);\n return true;\n // console.log(`Migration \"${newMigration.name}\" applied successfully.`);\n } catch (error) {\n tracer.error('migration-error', {\n migationName: migration.name,\n error: error,\n });\n throw error;\n }\n};\n\nconst getMigrationHash = async (\n sqlMigration: SQLMigration,\n sqlFormatter: SQLFormatter,\n): Promise<string> => {\n const content = sqlFormatter.describe(sqlMigration.sqls, {\n serializer: JSONSerializer,\n });\n\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nexport const combineMigrations = (\n ...migration: Pick<SQLMigration, 'sqls'>[]\n): SQL[] => migration.flatMap((m) => m.sqls);\n\ntype EnsureMigrationResult =\n | { exists: false }\n | { exists: true; hashesMatch: true }\n | { exists: true; hashesMatch: false; hashFromDB: string };\n\nconst ensureMigrationWasNotAppliedYet = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<EnsureMigrationResult> => {\n const result = await singleOrNull(\n execute.query<{ sqlHash: string }>(\n SQL`SELECT sql_hash as \"sqlHash\" FROM dmb_migrations WHERE name = ${migration.name}`,\n ),\n );\n\n if (result === null) return { exists: false };\n\n const { sqlHash } = result;\n\n return {\n exists: true,\n hashesMatch: sqlHash === migration.sqlHash,\n hashFromDB: sqlHash,\n };\n};\n\nconst recordMigration = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<void> => {\n await execute.command(\n SQL`\n INSERT INTO dmb_migrations (name, sql_hash)\n VALUES (${migration.name}, ${migration.sqlHash})`,\n );\n};\n\nconst updateMigrationHash = async (\n execute: SQLExecutor,\n migration: { name: string; sqlHash: string },\n): Promise<void> => {\n await execute.command(\n SQL`\n UPDATE dmb_migrations\n SET sql_hash = ${migration.sqlHash}, timestamp = ${new Date()}\n WHERE name = ${migration.name}\n `,\n );\n};\n","import {\n CheckViolationError,\n ConnectionError,\n DataError,\n DeadlockError,\n DumboError,\n ForeignKeyViolationError,\n InsufficientResourcesError,\n IntegrityConstraintViolationError,\n InvalidOperationError,\n LockNotAvailableError,\n NotNullViolationError,\n SerializationError,\n SystemError,\n UniqueConstraintError,\n} from '../../../../core/errors';\n\n/**\n * Extracts the SQLite error code string from a `sqlite3` driver error.\n *\n * The `sqlite3` (node-sqlite3) driver sets `error.code` to a string like\n * `'SQLITE_CONSTRAINT'` and `error.errno` to the numeric result code.\n * See: https://github.com/TryGhost/node-sqlite3\n */\nconst getSqliteErrorCode = (error: unknown): string | undefined => {\n if (\n error instanceof Error &&\n 'code' in error &&\n typeof (error as Record<string, unknown>).code === 'string'\n ) {\n return (error as Record<string, unknown>).code as string;\n }\n return undefined;\n};\n\nconst getErrorMessage = (error: unknown): string | undefined =>\n error instanceof Error ? error.message : undefined;\n\nconst asError = (error: unknown): Error | undefined =>\n error instanceof Error ? error : undefined;\n\n/**\n * Maps a constraint error to a specific DumboError subtype by inspecting the\n * error message. The `sqlite3` driver only exposes the primary result code\n * `SQLITE_CONSTRAINT` — the constraint subtype (UNIQUE, FOREIGN KEY, etc.)\n * is embedded in the message string by SQLite, e.g.:\n * \"SQLITE_CONSTRAINT: UNIQUE constraint failed: users.email\"\n *\n * Reference: https://www.sqlite.org/rescode.html (extended result codes 275–3091)\n */\nconst mapConstraintError = (\n message: string | undefined,\n innerError: Error | undefined,\n): DumboError => {\n const upperMessage = message?.toUpperCase() ?? '';\n\n // SQLITE_CONSTRAINT_UNIQUE (2067) / SQLITE_CONSTRAINT_PRIMARYKEY (1555)\n if (upperMessage.includes('UNIQUE') || upperMessage.includes('PRIMARY KEY'))\n return new UniqueConstraintError(message, innerError);\n\n // SQLITE_CONSTRAINT_FOREIGNKEY (787)\n if (upperMessage.includes('FOREIGN KEY'))\n return new ForeignKeyViolationError(message, innerError);\n\n // SQLITE_CONSTRAINT_NOTNULL (1299)\n if (upperMessage.includes('NOT NULL'))\n return new NotNullViolationError(message, innerError);\n\n // SQLITE_CONSTRAINT_CHECK (275)\n if (upperMessage.includes('CHECK'))\n return new CheckViolationError(message, innerError);\n\n // SQLITE_CONSTRAINT_ROWID (2579), SQLITE_CONSTRAINT_TRIGGER (1811),\n // SQLITE_CONSTRAINT_COMMITHOOK (531), SQLITE_CONSTRAINT_PINNED (2835),\n // SQLITE_CONSTRAINT_DATATYPE (3091), etc.\n return new IntegrityConstraintViolationError(message, innerError);\n};\n\n/**\n * Maps a SQLite error (from the `sqlite3` / node-sqlite3 driver) to a typed\n * DumboError based on the SQLite result code.\n *\n * Result code reference: https://www.sqlite.org/rescode.html\n *\n * Falls back to a generic DumboError (500) if the error is not a recognized SQLite error.\n */\nexport const mapSqliteError = (error: unknown): DumboError => {\n if (DumboError.isInstanceOf<DumboError>(error)) return error;\n\n const code = getSqliteErrorCode(error);\n if (!code)\n return new DumboError({\n errorCode: 500,\n message: getErrorMessage(error),\n innerError: asError(error),\n });\n\n const message = getErrorMessage(error);\n const innerError = asError(error);\n\n switch (code) {\n // ── Constraint violations (19) ──\n // node-sqlite3 only exposes the primary code; subtype is in the message.\n case 'SQLITE_CONSTRAINT':\n return mapConstraintError(message, innerError);\n\n // ── Busy / lock contention ──\n // SQLITE_BUSY (5): conflict with a separate database connection\n case 'SQLITE_BUSY':\n return new LockNotAvailableError(message, innerError);\n\n // SQLITE_LOCKED (6): conflict within the same connection or shared cache\n case 'SQLITE_LOCKED':\n return new DeadlockError(message, innerError);\n\n // SQLITE_PROTOCOL (15): WAL locking race condition\n case 'SQLITE_PROTOCOL':\n return new LockNotAvailableError(message, innerError);\n\n // ── Connection / open errors ──\n // SQLITE_CANTOPEN (14): unable to open database file\n case 'SQLITE_CANTOPEN':\n return new ConnectionError(message, innerError);\n\n // SQLITE_NOTADB (26): file is not a database\n case 'SQLITE_NOTADB':\n return new ConnectionError(message, innerError);\n\n // ── Resource exhaustion ──\n // SQLITE_NOMEM (7): out of memory\n case 'SQLITE_NOMEM':\n return new InsufficientResourcesError(message, innerError);\n\n // SQLITE_FULL (13): disk full\n case 'SQLITE_FULL':\n return new InsufficientResourcesError(message, innerError);\n\n // ── System / I/O errors ──\n // SQLITE_IOERR (10): operating system I/O error\n case 'SQLITE_IOERR':\n return new SystemError(message, innerError);\n\n // SQLITE_CORRUPT (11): database file is corrupted\n case 'SQLITE_CORRUPT':\n return new SystemError(message, innerError);\n\n // SQLITE_INTERNAL (2): internal SQLite malfunction\n case 'SQLITE_INTERNAL':\n return new SystemError(message, innerError);\n\n // SQLITE_NOLFS (22): large file support unavailable\n case 'SQLITE_NOLFS':\n return new SystemError(message, innerError);\n\n // ── Data errors ──\n // SQLITE_TOOBIG (18): string or BLOB too large\n case 'SQLITE_TOOBIG':\n return new DataError(message, innerError);\n\n // SQLITE_MISMATCH (20): datatype mismatch\n case 'SQLITE_MISMATCH':\n return new DataError(message, innerError);\n\n // SQLITE_RANGE (25): bind parameter index out of range\n case 'SQLITE_RANGE':\n return new DataError(message, innerError);\n\n // ── Invalid operations ──\n // SQLITE_ERROR (1): generic SQL error (syntax errors, missing tables, etc.)\n case 'SQLITE_ERROR':\n return new InvalidOperationError(message, innerError);\n\n // SQLITE_READONLY (8): attempt to write to a read-only database\n case 'SQLITE_READONLY':\n return new InvalidOperationError(message, innerError);\n\n // SQLITE_MISUSE (21): API misuse\n case 'SQLITE_MISUSE':\n return new InvalidOperationError(message, innerError);\n\n // SQLITE_AUTH (23): authorization denied\n case 'SQLITE_AUTH':\n return new InvalidOperationError(message, innerError);\n\n // SQLITE_PERM (3): access permission denied\n case 'SQLITE_PERM':\n return new InvalidOperationError(message, innerError);\n\n // SQLITE_SCHEMA (17): schema changed, statement needs re-preparation\n case 'SQLITE_SCHEMA':\n return new InvalidOperationError(message, innerError);\n\n // ── Transaction / abort ──\n // SQLITE_ABORT (4): operation aborted (e.g. by rollback)\n case 'SQLITE_ABORT':\n return new SerializationError(message, innerError);\n\n // SQLITE_INTERRUPT (9): operation interrupted\n case 'SQLITE_INTERRUPT':\n return new SerializationError(message, innerError);\n }\n\n return new DumboError({\n errorCode: 500,\n message,\n innerError,\n });\n};\n","import {\n mapDefaultSQLColumnProcessors,\n type DefaultSQLColumnProcessors,\n type DefaultSQLColumnToken,\n type SQLProcessorContext,\n} from '../../../../../core';\n\nconst mapColumnType = (\n token: DefaultSQLColumnToken,\n { builder }: SQLProcessorContext,\n): void => {\n let columnSQL: string;\n const { sqlTokenType } = token;\n switch (sqlTokenType) {\n case 'SQL_COLUMN_AUTO_INCREMENT':\n columnSQL = `INTEGER ${token.primaryKey ? 'PRIMARY KEY' : ''} AUTOINCREMENT`;\n break;\n case 'SQL_COLUMN_BIGINT':\n columnSQL = 'INTEGER';\n break;\n case 'SQL_COLUMN_SERIAL':\n columnSQL = 'INTEGER';\n break;\n case 'SQL_COLUMN_INTEGER':\n columnSQL = 'INTEGER';\n break;\n case 'SQL_COLUMN_JSONB':\n columnSQL = 'BLOB';\n break;\n case 'SQL_COLUMN_BIGSERIAL':\n columnSQL = 'INTEGER';\n break;\n case 'SQL_COLUMN_TIMESTAMP':\n columnSQL = 'DATETIME';\n break;\n case 'SQL_COLUMN_TIMESTAMPTZ':\n columnSQL = 'DATETIME';\n break;\n case 'SQL_COLUMN_VARCHAR':\n columnSQL = `VARCHAR ${Number.isNaN(token.length) ? '' : `(${token.length})`}`;\n break;\n default: {\n const exhaustiveCheck: never = sqlTokenType;\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new Error(`Unknown column type: ${exhaustiveCheck}`);\n }\n }\n builder.addSQL(columnSQL);\n};\n\nexport const sqliteColumnProcessors: DefaultSQLColumnProcessors =\n mapDefaultSQLColumnProcessors(mapColumnType);\n","import {\n defaultProcessorsRegistry,\n registerFormatter,\n SQLFormatter,\n SQLProcessorsRegistry,\n} from '../../../../../core/sql';\nimport { sqliteColumnProcessors } from '../processors';\n\nconst sqliteSQLProcessorsRegistry = SQLProcessorsRegistry({\n from: defaultProcessorsRegistry,\n}).register(sqliteColumnProcessors);\n\nconst sqliteFormatter: SQLFormatter = SQLFormatter({\n processorsRegistry: sqliteSQLProcessorsRegistry,\n});\n\nregisterFormatter('SQLite', sqliteFormatter);\n\nexport { sqliteFormatter };\n","import type { SQLiteDriverType } from '..';\nimport type { JSONSerializer, SQLFormatter, SQL } from '../../../../core';\nimport {\n mapSQLQueryResult,\n tracer,\n type BatchSQLCommandOptions,\n type DbSQLExecutor,\n type QueryResult,\n type QueryResultRow,\n type SQLCommandOptions,\n type SQLQueryOptions,\n} from '../../../../core';\nimport type { DumboError } from '../../../../core/errors';\nimport type { SQLiteClient } from '../connections';\nimport { mapSqliteError } from '../errors/errorMapper';\nimport { sqliteFormatter } from '../sql/formatter';\n\nexport type SQLiteErrorMapper = (error: unknown) => DumboError;\n\nexport const sqliteExecute = async <Result = void>(\n database: SQLiteClient,\n handle: (client: SQLiteClient) => Promise<Result>,\n) => {\n try {\n return await handle(database);\n } finally {\n await database.close();\n }\n};\n\nexport type SQLiteSQLExecutor<\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n> = DbSQLExecutor<DriverType, SQLiteClient>;\n\nexport const sqliteSQLExecutor = <\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n>(\n driverType: DriverType,\n serializer: JSONSerializer,\n formatter?: SQLFormatter,\n errorMapper?: SQLiteErrorMapper,\n): SQLiteSQLExecutor<DriverType> => ({\n driverType,\n query: async <Result extends QueryResultRow = QueryResultRow>(\n client: SQLiteClient,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>> => {\n tracer.info('db:sql:query', {\n query: (formatter ?? sqliteFormatter).format(sql, { serializer }).query,\n params: (formatter ?? sqliteFormatter).format(sql, { serializer }).params,\n debugSQL: (formatter ?? sqliteFormatter).describe(sql, { serializer }),\n });\n\n try {\n let result = await client.query<Result>(sql, options);\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 return result;\n } catch (error) {\n tracer.error('db:sql:query:execute:error', { error });\n throw (errorMapper ?? mapSqliteError)(error);\n }\n },\n batchQuery: async <Result extends QueryResultRow = QueryResultRow>(\n client: SQLiteClient,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n const results = await client.batchQuery<Result>(sqls, options);\n\n if (options?.mapping) {\n return results.map((result) => ({\n ...result,\n rows: result.rows.map((row) =>\n mapSQLQueryResult(row, options.mapping!),\n ),\n }));\n }\n\n return results;\n } catch (error) {\n tracer.error('db:sql:batch_query:execute:error', { error });\n throw (errorMapper ?? mapSqliteError)(error);\n }\n },\n command: async <Result extends QueryResultRow = QueryResultRow>(\n client: SQLiteClient,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>> => {\n tracer.info('db:sql:command', {\n query: (formatter ?? sqliteFormatter).format(sql, { serializer }).query,\n params: (formatter ?? sqliteFormatter).format(sql, { serializer }).params,\n debugSQL: (formatter ?? sqliteFormatter).describe(sql, { serializer }),\n });\n\n try {\n return await client.command<Result>(sql, options);\n } catch (error) {\n tracer.error('db:sql:command:execute:error', { error });\n throw (errorMapper ?? mapSqliteError)(error);\n }\n },\n batchCommand: async <Result extends QueryResultRow = QueryResultRow>(\n client: SQLiteClient,\n sqls: SQL[],\n options?: BatchSQLCommandOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n return await client.batchCommand<Result>(sqls, options);\n } catch (error) {\n tracer.error('db:sql:batch_command:execute:error', { error });\n throw (errorMapper ?? mapSqliteError)(error);\n }\n },\n formatter: formatter ?? sqliteFormatter,\n});\n","import type {\n InferTransactionFromConnection,\n JSONSerializer,\n} from '../../../../core';\nimport {\n InvalidOperationError,\n SQL,\n sqlExecutor,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n type InferDbClientFromConnection,\n} from '../../../../core';\nimport { sqliteSQLExecutor } from '../../core/execute';\nimport {\n transactionNestingCounter,\n type AnySQLiteConnection,\n type SQLiteClientOrPoolClient,\n} from '../connections';\n\nexport type SQLiteTransaction<\n ConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n TransactionOptions extends SQLiteTransactionOptions =\n SQLiteTransactionOptions,\n> = DatabaseTransaction<ConnectionType, TransactionOptions>;\n\nexport type SQLiteTransactionMode = 'DEFERRED' | 'IMMEDIATE' | 'EXCLUSIVE';\n\nexport type SQLiteTransactionOptions = DatabaseTransactionOptions & {\n mode?: SQLiteTransactionMode;\n useSavepoints?: boolean;\n};\n\nexport const sqliteTransaction =\n <ConnectionType extends AnySQLiteConnection = AnySQLiteConnection>(\n driverType: ConnectionType['driverType'],\n connection: () => ConnectionType,\n allowNestedTransactions: boolean,\n serializer: JSONSerializer,\n defaultTransactionMode?: 'IMMEDIATE' | 'DEFERRED' | 'EXCLUSIVE',\n ) =>\n (\n getClient: Promise<InferDbClientFromConnection<ConnectionType>>,\n options?: {\n close: (\n client: InferDbClientFromConnection<ConnectionType>,\n error?: unknown,\n ) => Promise<void>;\n } & SQLiteTransactionOptions,\n ): InferTransactionFromConnection<ConnectionType> => {\n const transactionCounter = transactionNestingCounter();\n allowNestedTransactions =\n options?.allowNestedTransactions ?? allowNestedTransactions;\n\n let hasBegun = false;\n\n const transaction: DatabaseTransaction<ConnectionType> = {\n connection: connection(),\n driverType,\n begin: async function () {\n const client = (await getClient) as SQLiteClientOrPoolClient;\n\n if (allowNestedTransactions) {\n if (transactionCounter.level >= 1) {\n transactionCounter.increment();\n if (options?.useSavepoints) {\n await client.command(\n SQL`SAVEPOINT transaction${SQL.plain(transactionCounter.level.toString())}`,\n );\n }\n return;\n }\n\n transactionCounter.increment();\n } else if (hasBegun) {\n throw new InvalidOperationError(\n 'Cannot start a nested transaction: allowNestedTransactions is false. ' +\n 'Set transactionOptions: { allowNestedTransactions: true } on your pool or connection.',\n );\n }\n\n hasBegun = true;\n const mode = options?.mode ?? defaultTransactionMode ?? 'IMMEDIATE';\n await client.command(SQL`BEGIN ${SQL.plain(mode)} TRANSACTION`);\n },\n commit: async function () {\n const client = (await getClient) as SQLiteClientOrPoolClient;\n\n if (allowNestedTransactions && transactionCounter.level > 1) {\n if (options?.useSavepoints) {\n await client.command(\n SQL`RELEASE transaction${SQL.plain(transactionCounter.level.toString())}`,\n );\n }\n transactionCounter.decrement();\n return;\n }\n\n try {\n if (allowNestedTransactions) transactionCounter.reset();\n hasBegun = false;\n await client.command(SQL`COMMIT`);\n } finally {\n if (options?.close)\n await options?.close(\n client as InferDbClientFromConnection<ConnectionType>,\n );\n }\n },\n rollback: async function (error?: unknown) {\n const client = (await getClient) as SQLiteClientOrPoolClient;\n\n if (allowNestedTransactions && transactionCounter.level > 1) {\n transactionCounter.decrement();\n return;\n }\n\n try {\n hasBegun = false;\n await client.command(SQL`ROLLBACK`);\n } finally {\n if (options?.close)\n await options?.close(\n client as InferDbClientFromConnection<ConnectionType>,\n error,\n );\n }\n },\n execute: sqlExecutor(sqliteSQLExecutor(driverType, serializer), {\n connect: () => getClient,\n }),\n _transactionOptions: {\n ...options,\n allowNestedTransactions,\n },\n };\n\n return transaction as InferTransactionFromConnection<ConnectionType>;\n };\n","import type { DatabaseConnectionString } from '../../../all';\n\nexport type SQLitePragmaOptions = {\n journal_mode?: 'DELETE' | 'TRUNCATE' | 'PERSIST' | 'MEMORY' | 'WAL' | 'OFF';\n synchronous?: 'OFF' | 'NORMAL' | 'FULL' | 'EXTRA';\n cache_size?: number;\n foreign_keys?: boolean;\n temp_store?: 'DEFAULT' | 'FILE' | 'MEMORY';\n busy_timeout?: number;\n mmap_size?: number;\n};\n\nexport type SQLiteConnectionString = DatabaseConnectionString<\n 'SQLite',\n `file:${string}` | `:memory:` | `/${string}` | `./${string}`\n>;\n\nexport const SQLiteConnectionString = (\n connectionString: string,\n): SQLiteConnectionString => {\n if (\n !connectionString.startsWith('file:') &&\n connectionString !== ':memory:' &&\n !connectionString.startsWith('/') &&\n !connectionString.startsWith('./')\n ) {\n throw new Error(\n `Invalid SQLite connection string: ${connectionString}. It should start with \"file:\", \":memory:\", \"/\", or \"./\".`,\n );\n }\n return connectionString as SQLiteConnectionString;\n};\n\nexport const parsePragmasFromConnectionString = (\n connectionString: string | SQLiteConnectionString,\n): Partial<SQLitePragmaOptions> => {\n const str = String(connectionString);\n\n if (!str.startsWith('file:')) {\n return {};\n }\n\n const url = new URL(str);\n const params = url.searchParams;\n const pragmas: Partial<SQLitePragmaOptions> = {};\n\n const journalMode = params.get('journal_mode');\n if (journalMode !== null) {\n pragmas.journal_mode = journalMode as\n 'DELETE' | 'TRUNCATE' | 'PERSIST' | 'MEMORY' | 'WAL' | 'OFF';\n }\n\n const synchronous = params.get('synchronous');\n if (synchronous !== null) {\n pragmas.synchronous = synchronous as 'OFF' | 'NORMAL' | 'FULL' | 'EXTRA';\n }\n\n const cacheSize = params.get('cache_size');\n if (cacheSize !== null) {\n pragmas.cache_size = parseInt(cacheSize, 10);\n }\n\n const foreignKeys = params.get('foreign_keys');\n if (foreignKeys !== null) {\n const val = foreignKeys.toLowerCase();\n pragmas.foreign_keys = val === 'true' || val === 'on' || val === '1';\n }\n\n const tempStore = params.get('temp_store');\n if (tempStore !== null) {\n pragmas.temp_store = tempStore.toUpperCase() as\n 'DEFAULT' | 'FILE' | 'MEMORY';\n }\n\n const busyTimeout = params.get('busy_timeout');\n if (busyTimeout !== null) {\n pragmas.busy_timeout = parseInt(busyTimeout, 10);\n }\n\n const mmapSize = params.get('mmap_size');\n if (mmapSize !== null) {\n pragmas.mmap_size = parseInt(mmapSize, 10);\n }\n\n return pragmas;\n};\n","import type { SQLiteDriverType } from '..';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n createAmbientConnection,\n createConnection,\n type AnyConnection,\n type BatchSQLCommandOptions,\n type Connection,\n type ConnectionOptions,\n type DatabaseTransaction,\n type InferDbClientFromConnection,\n type InferDriverTypeFromConnection,\n type InitTransaction,\n type SQLCommandOptions,\n type SQLExecutor,\n} from '../../../../core';\nimport { mapSqliteError } from '../errors';\nimport { sqliteSQLExecutor, type SQLiteErrorMapper } from '../execute';\nimport { sqliteTransaction, type SQLiteTransactionMode } from '../transactions';\nimport {\n SQLiteConnectionString,\n type SQLitePragmaOptions,\n} from './connectionString';\n\nexport type SQLiteCommandOptions = SQLCommandOptions & {\n ignoreChangesCount?: boolean;\n};\n\nexport type BatchSQLiteCommandOptions = SQLiteCommandOptions &\n BatchSQLCommandOptions;\n\nexport type SQLiteParameters =\n object | string | bigint | number | boolean | null;\n\nexport type SQLiteClient = {\n connect: () => Promise<void>;\n close: () => Promise<void>;\n} & SQLExecutor;\n\nexport type SQLitePoolClient = {\n release: () => void;\n} & SQLExecutor;\n\nexport type SQLiteClientFactory<\n SQLiteClientType extends SQLiteClient = SQLiteClient,\n ClientOptions = SQLiteClientOptions,\n> = (options: ClientOptions) => SQLiteClientType;\n\nexport type SQLiteClientOrPoolClient = SQLitePoolClient | SQLiteClient;\n\nexport interface SQLiteError extends Error {\n errno: number;\n}\n\nexport const isSQLiteError = (error: unknown): error is SQLiteError => {\n if (error instanceof Error && 'code' in error) {\n return true;\n }\n\n return false;\n};\n\nexport type SQLiteClientConnection<\n Self extends AnyConnection = AnyConnection,\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n SQLiteClientType extends SQLiteClient = SQLiteClient,\n TransactionType extends DatabaseTransaction<Self> = DatabaseTransaction<Self>,\n> = Connection<Self, DriverType, SQLiteClientType, TransactionType>;\n\nexport type SQLitePoolClientConnection<\n Self extends AnyConnection = AnyConnection,\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n SQLitePoolClientType extends SQLitePoolClient = SQLitePoolClient,\n TransactionType extends DatabaseTransaction<Self> = DatabaseTransaction<Self>,\n> = Connection<Self, DriverType, SQLitePoolClientType, TransactionType>;\n\nexport type SQLiteConnection<\n Self extends AnyConnection = AnyConnection,\n DriverType extends SQLiteDriverType = SQLiteDriverType,\n SQLiteClientType extends SQLiteClientOrPoolClient =\n SQLiteClient | SQLitePoolClient,\n TransactionType extends DatabaseTransaction<Self> = DatabaseTransaction<Self>,\n> =\n | (SQLiteClientType extends SQLiteClient\n ? SQLiteClientConnection<\n Self,\n DriverType,\n SQLiteClientType,\n TransactionType\n >\n : never)\n | (SQLiteClientType extends SQLitePoolClient\n ? SQLitePoolClientConnection<\n Self,\n DriverType,\n SQLiteClientType,\n TransactionType\n >\n : never);\n\nexport type AnySQLiteClientConnection =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SQLiteClientConnection<any, any>;\n\nexport type AnySQLitePoolClientConnection =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SQLitePoolClientConnection<any, any, any, any>;\n\nexport type AnySQLiteConnection =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SQLiteConnection<any, any, any, any>;\n\nexport type SQLiteConnectionOptions<\n ConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = ConnectionOptions<ConnectionType> & SQLiteClientOptions;\n\nexport type SQLiteClientConnectionDefinitionOptions<\n SQLiteConnectionType extends AnySQLiteClientConnection =\n AnySQLiteClientConnection,\n ConnectionOptions = SQLiteConnectionOptions,\n> = {\n driverType: InferDriverTypeFromConnection<SQLiteConnectionType>;\n type: 'Client';\n sqliteClientFactory: SQLiteClientFactory<\n InferDbClientFromConnection<SQLiteConnectionType>,\n ConnectionOptions\n >;\n connectionOptions: SQLiteConnectionOptions<SQLiteConnectionType>;\n serializer: JSONSerializer;\n};\n\nexport type SQLitePoolConnectionDefinitionOptions<\n SQLiteConnectionType extends AnySQLitePoolClientConnection =\n AnySQLitePoolClientConnection,\n ConnectionOptions = SQLiteConnectionOptions,\n> = {\n driverType: InferDriverTypeFromConnection<SQLiteConnectionType>;\n type: 'PoolClient';\n sqliteClientFactory: SQLiteClientFactory<\n InferDbClientFromConnection<SQLiteConnectionType>,\n ConnectionOptions\n >;\n connectionOptions: SQLiteConnectionOptions<SQLiteConnectionType>;\n serializer: JSONSerializer;\n};\n\nexport type SQLiteConnectionDefinitionOptions<\n SQLiteConnectionType extends AnySQLitePoolClientConnection =\n AnySQLitePoolClientConnection,\n ClientOptions = SQLiteClientOptions,\n> =\n | SQLiteClientConnectionDefinitionOptions<SQLiteConnectionType, ClientOptions>\n | SQLitePoolConnectionDefinitionOptions<SQLiteConnectionType, ClientOptions>;\n\nexport type SQLiteConnectionFactory<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n> = (options: ConnectionOptions) => SQLiteConnectionType;\n\nexport type TransactionNestingCounter = {\n increment: () => void;\n decrement: () => void;\n reset: () => void;\n level: number;\n};\n\nexport const transactionNestingCounter = (): TransactionNestingCounter => {\n let transactionLevel = 0;\n\n return {\n reset: () => {\n transactionLevel = 0;\n },\n increment: () => {\n transactionLevel++;\n },\n decrement: () => {\n transactionLevel--;\n\n if (transactionLevel < 0) {\n throw new Error('Transaction level is out of bounds');\n }\n },\n get level() {\n return transactionLevel;\n },\n };\n};\n\nexport type SqliteAmbientClientConnectionOptions<\n SQLiteConnectionType extends AnySQLiteClientConnection =\n AnySQLiteClientConnection,\n> = {\n driverType: SQLiteConnectionType['driverType'];\n client: InferDbClientFromConnection<SQLiteConnectionType>;\n initTransaction?: InitTransaction<SQLiteConnectionType>;\n allowNestedTransactions?: boolean;\n defaultTransactionMode?: SQLiteTransactionMode;\n serializer: JSONSerializer;\n errorMapper?: SQLiteErrorMapper;\n};\n\nexport const sqliteAmbientClientConnection = <\n SQLiteConnectionType extends AnySQLiteClientConnection =\n AnySQLiteClientConnection,\n>(\n options: SqliteAmbientClientConnectionOptions<SQLiteConnectionType>,\n) => {\n const {\n client,\n driverType,\n initTransaction,\n allowNestedTransactions,\n defaultTransactionMode,\n serializer,\n errorMapper,\n } = options;\n\n return createAmbientConnection<SQLiteConnectionType>({\n driverType,\n client,\n initTransaction:\n initTransaction ??\n ((connection) =>\n sqliteTransaction(\n driverType,\n connection,\n allowNestedTransactions ?? false,\n serializer,\n defaultTransactionMode,\n )),\n executor: ({ serializer }) =>\n sqliteSQLExecutor(driverType, serializer, undefined, errorMapper),\n serializer,\n });\n};\n\nexport const sqliteClientConnection = <\n SQLiteConnectionType extends AnySQLiteClientConnection =\n AnySQLiteClientConnection,\n ClientOptions = SQLiteClientOptions,\n>(\n options: SQLiteClientConnectionDefinitionOptions<\n SQLiteConnectionType,\n ClientOptions\n >,\n): SQLiteConnectionType => {\n const { connectionOptions, sqliteClientFactory, serializer } = options;\n\n let client: InferDbClientFromConnection<SQLiteConnectionType> | null = null;\n\n const connect = async (): Promise<\n InferDbClientFromConnection<SQLiteConnectionType>\n > => {\n if (client) return Promise.resolve(client);\n\n client = sqliteClientFactory(connectionOptions as ClientOptions);\n\n if (client && 'connect' in client && typeof client.connect === 'function') {\n try {\n await client.connect();\n } catch (error) {\n throw mapSqliteError(error);\n }\n }\n\n return client;\n };\n\n return createConnection({\n driverType: options.driverType,\n connect,\n close: async () => {\n if (client && 'close' in client && typeof client.close === 'function')\n await client.close();\n else if (\n client &&\n 'release' in client &&\n typeof client.release === 'function'\n )\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n client.release();\n },\n initTransaction: (connection) =>\n sqliteTransaction(\n options.driverType,\n connection,\n connectionOptions.transactionOptions?.allowNestedTransactions ?? false,\n serializer,\n connectionOptions.defaultTransactionMode,\n ),\n executor: ({ serializer }) =>\n sqliteSQLExecutor(options.driverType, serializer),\n serializer,\n });\n};\n\nexport const sqlitePoolClientConnection = <\n SQLiteConnectionType extends AnySQLiteClientConnection =\n AnySQLiteClientConnection,\n ClientOptions = SQLiteClientOptions,\n>(\n options: SQLitePoolConnectionDefinitionOptions<\n SQLiteConnectionType,\n ClientOptions\n >,\n): SQLiteConnectionType => {\n const { connectionOptions, sqliteClientFactory, serializer } = options;\n\n let client: InferDbClientFromConnection<SQLiteConnectionType> | null = null;\n\n const connect = async (): Promise<\n InferDbClientFromConnection<SQLiteConnectionType>\n > => {\n if (client) return Promise.resolve(client);\n\n client = sqliteClientFactory(connectionOptions as ClientOptions);\n\n try {\n await client.connect();\n } catch (error) {\n throw mapSqliteError(error);\n }\n\n return client;\n };\n\n return createConnection({\n driverType: options.driverType,\n connect,\n close: () =>\n client !== null\n ? Promise.resolve((client as unknown as SQLitePoolClient).release())\n : Promise.resolve(),\n initTransaction: (connection) =>\n sqliteTransaction(\n options.driverType,\n connection,\n connectionOptions.transactionOptions?.allowNestedTransactions ?? false,\n serializer,\n connectionOptions.defaultTransactionMode,\n ),\n executor: ({ serializer }) =>\n sqliteSQLExecutor(options.driverType, serializer),\n serializer,\n });\n};\n\nexport function sqliteConnection<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ClientOptions = SQLiteClientOptions,\n>(\n options: SQLiteConnectionDefinitionOptions<\n SQLiteConnectionType,\n ClientOptions\n >,\n): SQLiteConnectionType {\n return options.type === 'Client'\n ? sqliteClientConnection(options)\n : sqlitePoolClientConnection(options);\n}\n\nexport type InMemorySQLiteDatabase = ':memory:';\nexport const InMemorySQLiteDatabase = SQLiteConnectionString(':memory:');\n\nexport type { SQLitePragmaOptions } from './connectionString';\n\nexport const DEFAULT_SQLITE_PRAGMA_OPTIONS: SQLitePragmaOptions = {\n journal_mode: 'WAL',\n synchronous: 'NORMAL',\n cache_size: -1000000,\n foreign_keys: true,\n temp_store: 'MEMORY',\n busy_timeout: 5000,\n mmap_size: 268435456,\n};\n\nexport type SQLiteClientOptions = {\n pragmaOptions?: Partial<SQLitePragmaOptions>;\n defaultTransactionMode?: SQLiteTransactionMode;\n skipDatabasePragmas?: boolean;\n readonly?: boolean;\n};\n\nexport * from './connectionString';\n","import type { SQLiteConnectionString } from '../connections/connectionString';\nimport {\n InMemorySQLiteDatabase,\n type AnySQLiteConnection,\n type SQLiteConnectionFactory,\n type SQLiteConnectionOptions,\n} from '../connections';\nimport type { JSONSerializer } from '../../../../core';\nimport {\n createAlwaysNewConnectionPool,\n createAmbientConnectionPool,\n createSingletonConnectionPool,\n type ConnectionPool,\n} from '../../../../core';\n\nexport type SQLiteFileNameOrConnectionString =\n | {\n fileName: string | SQLiteConnectionString;\n connectionString?: never;\n }\n | {\n connectionString: string | SQLiteConnectionString;\n fileName?: never;\n };\n\nexport const isInMemoryDatabase = (\n options: Record<string, unknown>,\n): boolean => {\n if ('fileName' in options) {\n return options.fileName === InMemorySQLiteDatabase;\n }\n if ('connectionString' in options) {\n return options.connectionString === InMemorySQLiteDatabase;\n }\n return false;\n};\n\nexport type SQLiteAmbientConnectionPool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = ConnectionPool<SQLiteConnectionType>;\n\ntype SQLiteAmbientConnectionPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = {\n singleton?: true;\n pooled?: false;\n sqliteConnectionFactory?: never;\n connection: SQLiteConnectionType;\n connectionOptions?: never;\n};\n\nexport const sqliteAmbientConnectionPool = <\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n>(\n options: {\n driverType: SQLiteConnectionType['driverType'];\n } & SQLiteAmbientConnectionPoolOptions<SQLiteConnectionType['driverType']>,\n): SQLiteAmbientConnectionPool<SQLiteConnectionType['driverType']> => {\n const { connection, driverType } = options;\n\n return createAmbientConnectionPool<SQLiteConnectionType>({\n driverType,\n connection: connection,\n });\n};\n\ntype SQLiteSingletonConnectionPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n> = {\n singleton: true;\n pooled?: true;\n sqliteConnectionFactory: SQLiteConnectionFactory<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n connection?: never;\n connectionOptions: ConnectionOptions;\n};\n\nexport type SQLiteSingletonConnectionPool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = ConnectionPool<SQLiteConnectionType>;\n\nexport const sqliteSingletonConnectionPool = <\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions & Record<string, unknown> =\n SQLiteConnectionOptions & Record<string, unknown>,\n>(\n options: {\n driverType: SQLiteConnectionType['driverType'];\n } & SQLiteSingletonConnectionPoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n >,\n): SQLiteSingletonConnectionPool<SQLiteConnectionType> => {\n const { driverType, sqliteConnectionFactory, connectionOptions } = options;\n\n return createSingletonConnectionPool<SQLiteConnectionType>({\n driverType,\n getConnection: () => sqliteConnectionFactory(connectionOptions),\n });\n};\n\ntype SQLiteAlwaysNewPoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n> = {\n singleton?: false;\n pooled?: true;\n sqliteConnectionFactory: SQLiteConnectionFactory<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n connection?: never;\n connectionOptions: ConnectionOptions;\n};\n\nexport type SQLiteAlwaysNewConnectionPool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> = ConnectionPool<SQLiteConnectionType>;\n\nexport const sqliteAlwaysNewConnectionPool = <\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions & Record<string, unknown> =\n SQLiteConnectionOptions & Record<string, unknown>,\n>(\n options: {\n driverType: SQLiteConnectionType['driverType'];\n } & SQLiteAlwaysNewPoolOptions<SQLiteConnectionType, ConnectionOptions>,\n): SQLiteAlwaysNewConnectionPool<SQLiteConnectionType> => {\n const { driverType, sqliteConnectionFactory, connectionOptions } = options;\n\n return createAlwaysNewConnectionPool<SQLiteConnectionType>({\n driverType,\n getConnection: () => sqliteConnectionFactory(connectionOptions),\n });\n};\n\nexport type SQLitePoolOptions<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n> = (\n | SQLiteAlwaysNewPoolOptions<SQLiteConnectionType, ConnectionOptions>\n | SQLiteSingletonConnectionPoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n >\n | SQLiteAmbientConnectionPoolOptions<SQLiteConnectionType>\n) & {\n driverType: SQLiteConnectionType['driverType'];\n serializer?: JSONSerializer;\n};\n\nexport type SQLitePool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n> =\n | SQLiteAmbientConnectionPool<SQLiteConnectionType>\n | SQLiteSingletonConnectionPool<SQLiteConnectionType>\n | SQLiteAlwaysNewConnectionPool<SQLiteConnectionType>;\n\nexport type SQLitePoolFactoryOptions<\n SQLiteConnectionType extends AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions,\n> = Omit<\n SQLitePoolOptions<SQLiteConnectionType, ConnectionOptions>,\n 'singleton'\n> & {\n singleton?: boolean;\n};\n\nexport const toSqlitePoolOptions = <\n SQLiteConnectionType extends AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions,\n>(\n options: SQLitePoolFactoryOptions<SQLiteConnectionType, ConnectionOptions>,\n): SQLitePoolOptions<SQLiteConnectionType, ConnectionOptions> => {\n const { singleton, ...rest } = options;\n const isInMemory = isInMemoryDatabase(options);\n\n if ('client' in options && options.client) {\n return { ...rest, singleton: true } as SQLitePoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n }\n\n if (isInMemory) {\n return { ...rest, singleton: true } as SQLitePoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n }\n\n if (singleton === true) {\n return { ...rest, singleton: true } as SQLitePoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n >;\n }\n\n return rest as SQLitePoolOptions<SQLiteConnectionType, ConnectionOptions>;\n};\n\nexport function sqlitePool<\n SQLiteConnectionType extends AnySQLiteConnection = AnySQLiteConnection,\n ConnectionOptions extends SQLiteConnectionOptions = SQLiteConnectionOptions,\n>(\n options: SQLitePoolOptions<SQLiteConnectionType, ConnectionOptions>,\n): SQLitePool<SQLiteConnectionType> {\n const { driverType } = options;\n\n if (\n (\n options as SQLiteAmbientConnectionPoolOptions<SQLiteConnectionType> & {\n driverType: SQLiteConnectionType['driverType'];\n }\n ).connection\n )\n return createAmbientConnectionPool<SQLiteConnectionType>({\n driverType,\n connection: (\n options as SQLiteAmbientConnectionPoolOptions<SQLiteConnectionType> & {\n driverType: SQLiteConnectionType['driverType'];\n }\n ).connection,\n });\n\n if (\n options.singleton === true &&\n (\n options as SQLiteSingletonConnectionPoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n > & { driverType: SQLiteConnectionType['driverType'] }\n ).sqliteConnectionFactory\n ) {\n return createSingletonConnectionPool({\n driverType,\n getConnection: () =>\n (\n options as SQLiteSingletonConnectionPoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n > & { driverType: SQLiteConnectionType['driverType'] }\n ).sqliteConnectionFactory(\n (\n options as SQLiteSingletonConnectionPoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n > & { driverType: SQLiteConnectionType['driverType'] }\n ).connectionOptions,\n ),\n });\n }\n\n return createAlwaysNewConnectionPool({\n driverType,\n getConnection: () =>\n (\n options as SQLiteAlwaysNewPoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n > & { driverType: SQLiteConnectionType['driverType'] }\n ).sqliteConnectionFactory(\n (\n options as SQLiteAlwaysNewPoolOptions<\n SQLiteConnectionType,\n ConnectionOptions\n > & { driverType: SQLiteConnectionType['driverType'] }\n ).connectionOptions,\n ),\n });\n}\n","import {\n registerDefaultMigratorOptions,\n type MigratorOptions,\n} from '../../../../core';\n\nexport const DefaultSQLiteMigratorOptions: MigratorOptions = {};\n\nregisterDefaultMigratorOptions('SQLite', DefaultSQLiteMigratorOptions);\n","import { exists, SQL, type SQLExecutor } from '../../../../core';\nexport * from './schema';\n\nexport const defaultSQLiteDatabase = ':memory:';\n\nconst tableExistsSQL = (tableName: string): SQL =>\n SQL`\n SELECT EXISTS (\n SELECT 1\n FROM sqlite_master\n WHERE type = 'table' AND name = ${tableName}\n ) AS \"exists\"\n `;\n\nexport const tableExists = async (\n execute: SQLExecutor,\n tableName: string,\n): Promise<boolean> => exists(execute.query(tableExistsSQL(tableName)));\n","import type { DatabaseMetadata } from '../../../../core';\nimport { tableExists } from './schema';\n\nexport const sqliteMetadata: DatabaseMetadata<false, false, false> = {\n databaseType: 'SQLite',\n capabilities: {\n supportsSchemas: false,\n supportsFunctions: false,\n supportsMultipleDatabases: false,\n },\n tableExists,\n};\n\ndumboDatabaseMetadataRegistry.register('SQLite', sqliteMetadata);\n","import { SQL } from '../../../../core';\n\nconst path = (path: string) => SQL.literal(`$.${path}`);\n\nexport const SQLiteJSON = {\n path,\n} as const;\n","import type { DatabaseDriverType } from '../../..';\n\nexport * from './connections';\nexport * from './errors';\nexport * from './execute';\nexport * from './pool';\nexport * from './schema';\nexport * from './sql';\nexport * from './transactions';\n\nexport type SQLiteDatabaseName = 'SQLite';\nexport const SQLiteDatabaseName = 'SQLite';\n\nexport type SQLiteDriverType<DriverName extends string = string> =\n DatabaseDriverType<SQLiteDatabaseName, DriverName>;\n\nexport type SQLiteDatabaseType = 'SQLite';\n","import type {\n D1Database,\n D1DatabaseSession,\n D1SessionBookmark,\n D1SessionConstraint,\n} from '@cloudflare/workers-types';\nimport {\n BatchCommandNoChangesError,\n type BatchSQLCommandOptions,\n type JSONSerializer,\n type QueryResult,\n type QueryResultRow,\n type SQL,\n type SQLCommandOptions,\n type SQLQueryOptions,\n} from '../../../../core';\nimport { sqliteFormatter, type SQLiteClient } from '../../core';\n\nexport type D1DatabaseOrSession = D1Database | D1DatabaseSession;\n\nexport type D1ClientOptions = {\n database: D1Database;\n session?: D1DatabaseSession | undefined;\n serializer: JSONSerializer;\n};\n\nexport type D1SessionOptions = {\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n constraintOrBookmark?: D1SessionBookmark | D1SessionConstraint;\n};\n\nexport type D1Client = SQLiteClient & {\n database: D1Database;\n session?: D1DatabaseSession | undefined;\n\n withSession: (constraintOrBookmark?: D1SessionOptions) => Promise<D1Client>;\n};\n\nexport const d1Client = (options: D1ClientOptions): D1Client => {\n const { database, session, serializer } = options;\n\n const execute = session ?? database;\n\n return {\n database,\n session: session,\n connect: () => Promise.resolve(),\n close: () => Promise.resolve(),\n withSession: async (constraintOrBookmark?: D1SessionOptions) => {\n const newSession = constraintOrBookmark\n ? database.withSession(constraintOrBookmark as string)\n : database.withSession();\n\n return Promise.resolve(\n d1Client({\n database,\n session: newSession,\n serializer,\n }),\n );\n },\n\n query: async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n _options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>> => {\n const { query, params } = sqliteFormatter.format(sql, { serializer });\n const stmt = execute.prepare(query);\n const bound = params?.length ? stmt.bind(...params) : stmt;\n const { results } = await bound.all<Result>();\n return { rowCount: results?.length ?? 0, rows: results ?? [] };\n },\n\n batchQuery: async <Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n _options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]> => {\n const statements = sqls.map((sql) => {\n const { query, params } = sqliteFormatter.format(sql, { serializer });\n const stmt = execute.prepare(query);\n return params?.length ? stmt.bind(...params) : stmt;\n });\n const results = await execute.batch<Result>(statements);\n return results.map((result) => ({\n rowCount: result.results?.length ?? 0,\n rows: result.results ?? [],\n }));\n },\n\n command: async <Result extends QueryResultRow = QueryResultRow>(\n sql: SQL,\n _options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>> => {\n const { query, params } = sqliteFormatter.format(sql, { serializer });\n const stmt = execute.prepare(query);\n const bound = params?.length ? stmt.bind(...params) : stmt;\n const result = await bound.run<Result>();\n return {\n rowCount: result.meta?.changes ?? 0,\n rows: result.results ?? [],\n };\n },\n\n batchCommand: async <Result extends QueryResultRow = QueryResultRow>(\n sqls: SQL[],\n options?: BatchSQLCommandOptions,\n ): Promise<QueryResult<Result>[]> => {\n const statements = sqls.map((sql) => {\n const { query, params } = sqliteFormatter.format(sql, { serializer });\n const stmt = execute.prepare(query);\n return params?.length ? stmt.bind(...params) : stmt;\n });\n const batchResults = await execute.batch<Result>(statements);\n\n return batchResults.map((result, i) => {\n const qr: QueryResult<Result> = {\n rowCount: result.meta?.changes ?? 0,\n rows: result.results ?? [],\n };\n\n if (options?.assertChanges && (qr.rowCount ?? 0) === 0) {\n throw new BatchCommandNoChangesError(i);\n }\n\n return qr;\n });\n },\n };\n};\n","import {\n CheckViolationError,\n ConnectionError,\n DataError,\n DeadlockError,\n DumboError,\n ForeignKeyViolationError,\n InsufficientResourcesError,\n IntegrityConstraintViolationError,\n InvalidOperationError,\n LockNotAvailableError,\n NotNullViolationError,\n SerializationError,\n SystemError,\n UniqueConstraintError,\n} from '../../../../core/errors';\n\nconst getErrorMessage = (error: unknown): string | undefined =>\n error instanceof Error ? error.message : undefined;\n\nconst asError = (error: unknown): Error | undefined =>\n error instanceof Error ? error : undefined;\n\n/**\n * Determines the constraint subtype from the error message.\n *\n * D1 embeds the SQLite constraint detail in the message string, e.g.:\n * \"D1_ERROR: UNIQUE constraint failed: users.email\"\n * \"D1_ERROR: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed\"\n */\nconst mapConstraintError = (\n message: string | undefined,\n innerError: Error | undefined,\n): DumboError => {\n const upperMessage = message?.toUpperCase() ?? '';\n\n if (upperMessage.includes('UNIQUE') || upperMessage.includes('PRIMARY KEY'))\n return new UniqueConstraintError(message, innerError);\n\n if (upperMessage.includes('FOREIGN KEY'))\n return new ForeignKeyViolationError(message, innerError);\n\n if (upperMessage.includes('NOT NULL'))\n return new NotNullViolationError(message, innerError);\n\n if (upperMessage.includes('CHECK'))\n return new CheckViolationError(message, innerError);\n\n return new IntegrityConstraintViolationError(message, innerError);\n};\n\nconst isConstraintMessage = (upper: string): boolean =>\n upper.includes('CONSTRAINT') ||\n upper.includes('UNIQUE') ||\n upper.includes('PRIMARY KEY') ||\n upper.includes('FOREIGN KEY') ||\n upper.includes('NOT NULL');\n\n/** Extracts the first `SQLITE_<CODE>` token from a message string. */\nconst SQLITE_CODE_RE = /SQLITE_([A-Z]+)/;\n\nconst extractEmbeddedSqliteCode = (message: string): string | undefined => {\n const match = SQLITE_CODE_RE.exec(message);\n return match ? `SQLITE_${match[1]}` : undefined;\n};\n\n/**\n * Maps a `SQLITE_*` code found in the D1 message to a DumboError.\n *\n * D1 sometimes forwards raw SQLite result codes from the C++ layer, e.g.:\n * \"D1_ERROR: SQLITE_BUSY: database is locked\"\n * \"SQLITE_READONLY: attempt to write a readonly database\"\n *\n * See https://www.sqlite.org/rescode.html for the full code list.\n */\nconst mapEmbeddedSqliteCode = (\n code: string,\n message: string | undefined,\n innerError: Error | undefined,\n): DumboError | undefined => {\n switch (code) {\n case 'SQLITE_CONSTRAINT':\n return mapConstraintError(message, innerError);\n case 'SQLITE_BUSY':\n return new LockNotAvailableError(message, innerError);\n case 'SQLITE_LOCKED':\n return new DeadlockError(message, innerError);\n case 'SQLITE_PROTOCOL':\n return new LockNotAvailableError(message, innerError);\n case 'SQLITE_CANTOPEN':\n return new ConnectionError(message, innerError);\n case 'SQLITE_NOTADB':\n return new ConnectionError(message, innerError);\n case 'SQLITE_NOMEM':\n return new InsufficientResourcesError(message, innerError);\n case 'SQLITE_FULL':\n return new InsufficientResourcesError(message, innerError);\n case 'SQLITE_IOERR':\n return new SystemError(message, innerError);\n case 'SQLITE_CORRUPT':\n return new SystemError(message, innerError);\n case 'SQLITE_INTERNAL':\n return new SystemError(message, innerError);\n case 'SQLITE_NOLFS':\n return new SystemError(message, innerError);\n case 'SQLITE_TOOBIG':\n return new DataError(message, innerError);\n case 'SQLITE_MISMATCH':\n return new DataError(message, innerError);\n case 'SQLITE_RANGE':\n return new DataError(message, innerError);\n case 'SQLITE_ERROR':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_READONLY':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_MISUSE':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_AUTH':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_PERM':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_SCHEMA':\n return new InvalidOperationError(message, innerError);\n case 'SQLITE_ABORT':\n return new SerializationError(message, innerError);\n case 'SQLITE_INTERRUPT':\n return new SerializationError(message, innerError);\n }\n return undefined;\n};\n\n/**\n * Maps a Cloudflare D1 error to a typed DumboError.\n *\n * Unlike node-sqlite3, D1 throws **plain `Error` objects** with no `code`\n * property. All error information is embedded in `error.message`, using\n * well-known prefixes from the `workerd` runtime:\n *\n * | Prefix | Meaning |\n * |-----------------------|----------------------------------------------|\n * | `D1_ERROR:` | General D1 / SQLite error |\n * | `D1_EXEC_ERROR:` | Error during `.exec()` batch |\n * | `D1_TYPE_ERROR:` | Type mismatch (e.g. `undefined` vs `null`) |\n * | `D1_COLUMN_NOTFOUND` | Referenced column does not exist |\n * | `D1_DUMP_ERROR:` | Error during database dump |\n * | `D1_SESSION_ERROR:` | Session bookmark / constraint error |\n *\n * D1 also surfaces platform-level messages (no prefix) for transient errors:\n * - \"Network connection lost.\"\n * - \"D1 DB is overloaded. Too many requests queued.\"\n * - \"Memory limit would be exceeded by this operation.\"\n * - \"Cannot resolve D1 DB due to transient issue on remote node.\"\n * - \"D1 DB reset because its code was updated.\"\n *\n * Reference:\n * - https://developers.cloudflare.com/d1/platform/client-api/\n * - https://github.com/cloudflare/workerd (src/cloudflare/internal/d1-api.ts)\n *\n * Falls back to a generic DumboError (500) if the error is not a recognized D1 error.\n */\nexport const mapD1Error = (error: unknown): DumboError => {\n if (DumboError.isInstanceOf<DumboError>(error)) return error;\n\n const message = getErrorMessage(error);\n if (!message)\n return new DumboError({\n errorCode: 500,\n message: error instanceof Error ? error.message : String(error),\n innerError: asError(error),\n });\n\n const innerError = asError(error);\n const upper = message.toUpperCase();\n\n // D1-specific prefixes are checked first because some (e.g. D1_SESSION_ERROR)\n // contain constraint keywords in their message but have different semantics.\n if (upper.startsWith('D1_TYPE_ERROR'))\n return new DataError(message, innerError);\n\n if (upper.startsWith('D1_COLUMN_NOTFOUND'))\n return new DataError(message, innerError);\n\n if (upper.startsWith('D1_DUMP_ERROR'))\n return new SystemError(message, innerError);\n\n if (upper.startsWith('D1_SESSION_ERROR'))\n return new ConnectionError(message, innerError);\n\n if (isConstraintMessage(upper)) {\n return mapConstraintError(message, innerError);\n }\n\n if (\n upper.includes('NETWORK CONNECTION LOST') ||\n upper.includes('CANNOT RESOLVE D1 DB DUE TO TRANSIENT ISSUE') ||\n upper.includes('D1 DB RESET BECAUSE')\n )\n return new ConnectionError(message, innerError);\n\n if (\n upper.includes('D1 DB IS OVERLOADED') ||\n upper.includes('TOO MANY REQUESTS') ||\n upper.includes('MEMORY LIMIT WOULD BE EXCEEDED')\n )\n return new InsufficientResourcesError(message, innerError);\n\n if (upper.startsWith('D1_ERROR') || upper.startsWith('D1_EXEC_ERROR')) {\n const embeddedCode = extractEmbeddedSqliteCode(message);\n if (embeddedCode) {\n const mapped = mapEmbeddedSqliteCode(embeddedCode, message, innerError);\n if (mapped) return mapped;\n }\n\n return new InvalidOperationError(message, innerError);\n }\n\n const embeddedCode = extractEmbeddedSqliteCode(message);\n if (embeddedCode) {\n const mapped = mapEmbeddedSqliteCode(embeddedCode, message, innerError);\n if (mapped) return mapped;\n }\n\n return new DumboError({\n errorCode: 500,\n message,\n innerError,\n });\n};\n","import type {\n BatchSQLCommandOptions,\n DbSQLExecutor,\n QueryResult,\n QueryResultRow,\n SQL,\n SQLCommandOptions,\n SQLQueryOptions,\n} from '../../../../core';\nimport { tracer } from '../../../../core';\nimport { sqliteFormatter } from '../../core';\nimport type { D1Client, D1DriverType } from '../connections';\nimport { mapD1Error } from '../errors/errorMapper';\n\nexport const d1SQLExecutor = (): DbSQLExecutor<D1DriverType, D1Client> => ({\n driverType: 'SQLite:d1',\n formatter: sqliteFormatter,\n\n query: async <Result extends QueryResultRow>(\n client: D1Client,\n sql: SQL,\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>> => {\n try {\n return await client.query<Result>(sql, options);\n } catch (error) {\n tracer.error('db:sql:query:execute:error', { error });\n throw mapD1Error(error);\n }\n },\n\n batchQuery: async <Result extends QueryResultRow>(\n client: D1Client,\n sqls: SQL[],\n options?: SQLQueryOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n return await client.batchQuery<Result>(sqls, options);\n } catch (error) {\n tracer.error('db:sql:batch_query:execute:error', { error });\n throw mapD1Error(error);\n }\n },\n\n command: async <Result extends QueryResultRow>(\n client: D1Client,\n sql: SQL,\n options?: SQLCommandOptions,\n ): Promise<QueryResult<Result>> => {\n try {\n return await client.command<Result>(sql, options);\n } catch (error) {\n tracer.error('db:sql:command:execute:error', { error });\n throw mapD1Error(error);\n }\n },\n\n batchCommand: async <Result extends QueryResultRow>(\n client: D1Client,\n sqls: SQL[],\n options?: BatchSQLCommandOptions,\n ): Promise<QueryResult<Result>[]> => {\n try {\n return await client.batchCommand<Result>(sqls, options);\n } catch (error) {\n tracer.error('db:sql:batch_command:execute:error', { error });\n throw mapD1Error(error);\n }\n },\n});\n","import type { JSONSerializer } from '../../../../core';\nimport {\n sqlExecutor,\n type DatabaseTransaction,\n type DatabaseTransactionOptions,\n} from '../../../../core';\nimport { transactionNestingCounter } from '../../core';\nimport {\n D1DriverType,\n type D1Client,\n type D1Connection,\n type D1SessionOptions,\n} from '../connections';\nimport { d1SQLExecutor } from '../execute';\n\nexport type D1Transaction = DatabaseTransaction<\n D1Connection,\n D1TransactionOptions\n>;\n\nexport type D1TransactionOptions = DatabaseTransactionOptions & {\n d1Session?: D1SessionOptions;\n mode?: D1TransactionMode;\n};\n\nexport type D1TransactionMode = 'session_based' | 'strict';\n\nexport class D1TransactionNotSupportedError extends Error {\n constructor() {\n super(\n 'D1 does not support SQL transactions (BEGIN/COMMIT/ROLLBACK/SAVEPOINT). ' +\n 'Use { mode: \"session_based\" } to opt-in to session+batch semantics, or use ' +\n 'connection.execute.batchCommand() for atomic multi-statement execution.',\n );\n this.name = 'D1TransactionNotSupportedError';\n }\n}\n\nexport const d1Transaction =\n (\n connection: () => D1Connection,\n serializer: JSONSerializer,\n defaultOptions?: D1TransactionOptions,\n ) =>\n (\n getClient: Promise<D1Client>,\n options?: {\n close: (client: D1Client, error?: unknown) => Promise<void>;\n } & D1TransactionOptions,\n ): D1Transaction => {\n const transactionCounter = transactionNestingCounter();\n\n const allowNestedTransactions =\n options?.allowNestedTransactions ??\n defaultOptions?.allowNestedTransactions;\n\n const mode = options?.mode ?? defaultOptions?.mode;\n\n let client: D1Client | null = null;\n let sessionClient: D1Client | null = null;\n\n const getDatabaseClient = async () => {\n if (client) return Promise.resolve(client);\n\n client = await getClient;\n return client;\n };\n\n return {\n connection: connection(),\n driverType: D1DriverType,\n begin: async function () {\n if (mode !== 'session_based') {\n throw new D1TransactionNotSupportedError();\n }\n\n const client = await getDatabaseClient();\n\n if (allowNestedTransactions) {\n if (transactionCounter.level >= 1) {\n transactionCounter.increment();\n return;\n }\n\n transactionCounter.increment();\n }\n\n sessionClient = await client.withSession(options?.d1Session);\n },\n commit: async function () {\n const client = await getDatabaseClient();\n\n if (allowNestedTransactions && transactionCounter.level > 1) {\n transactionCounter.decrement();\n return;\n }\n\n try {\n if (allowNestedTransactions) transactionCounter.reset();\n sessionClient = null;\n } finally {\n if (options?.close) await options?.close(client);\n }\n },\n rollback: async function (error?: unknown) {\n const client = await getDatabaseClient();\n\n if (allowNestedTransactions && transactionCounter.level > 1) {\n transactionCounter.decrement();\n return;\n }\n\n try {\n sessionClient = null;\n } finally {\n if (options?.close) await options?.close(client, error);\n }\n },\n execute: sqlExecutor(d1SQLExecutor(), {\n connect: () => {\n if (!sessionClient) {\n throw new Error(\n 'Transaction has not been started. Call begin() first.',\n );\n }\n return Promise.resolve(sessionClient);\n },\n }),\n _transactionOptions: options ?? {},\n };\n };\n","import type { Connection } from '../../../../core';\nimport {\n sqliteAmbientClientConnection,\n type SQLiteConnectionOptions,\n type SQLiteDriverType,\n} from '../../core';\nimport { mapD1Error } from '../errors/errorMapper';\nimport { d1Transaction, type D1Transaction } from '../transactions';\nimport {\n d1Client,\n type D1Client,\n type D1ClientOptions,\n type D1SessionOptions,\n} from './d1Client';\n\nexport type D1DriverType = SQLiteDriverType<'d1'>;\nexport const D1DriverType: D1DriverType = 'SQLite:d1';\n\nexport type D1Connection = Connection<\n D1Connection,\n D1DriverType,\n D1Client,\n D1Transaction\n> & {\n d1Session: (constraintOrBookmark?: D1SessionOptions) => Promise<D1Connection>;\n withD1Session: <Result = never>(\n handle: (connection: D1Connection) => Promise<Result>,\n options?: D1SessionOptions,\n ) => Promise<Result>;\n};\n\nexport type D1ConnectionOptions = SQLiteConnectionOptions<D1Connection> & {\n client?: D1Client;\n connection?: D1Connection;\n transaction?: D1Transaction;\n} & D1ClientOptions;\n\nexport const d1Connection = (options: D1ConnectionOptions) => {\n const connection = options.connection ??\n options.transaction?.connection ?? {\n ...sqliteAmbientClientConnection<D1Connection>({\n driverType: D1DriverType,\n client: options.client ?? d1Client(options),\n initTransaction: (connection) =>\n d1Transaction(\n connection,\n options.serializer,\n options.transactionOptions,\n ),\n serializer: options.serializer,\n errorMapper: mapD1Error,\n }),\n };\n\n connection.d1Session = async (\n constraintOrBookmark?: D1SessionOptions,\n ): Promise<D1Connection> => {\n const client = await connection.open();\n\n const sessionClient = await client.withSession(constraintOrBookmark);\n\n return d1Connection({\n ...options,\n client: sessionClient,\n });\n };\n\n connection.withD1Session = async <Result = never>(\n handle: (connection: D1Connection) => Promise<Result>,\n options?: D1SessionOptions,\n ): Promise<Result> => {\n const sessionConnection = await connection.d1Session(options);\n\n try {\n return await handle(sessionConnection);\n } finally {\n await sessionConnection.close();\n }\n };\n\n return connection;\n};\n","import type { D1ConnectionOptions } from '..';\nimport {\n createSingletonConnectionPool,\n JSONSerializer,\n type ConnectionPool,\n type JSONSerializationOptions,\n} from '../../../../core';\nimport {\n d1Connection,\n D1DriverType,\n type D1Connection,\n} from '../connections/d1Connection';\n\nexport type D1PoolOptions = Omit<D1ConnectionOptions, 'serializer'> &\n JSONSerializationOptions;\n\nexport type D1ConnectionPool = ConnectionPool<D1Connection>;\n\nexport const d1Pool = (options: D1PoolOptions): D1ConnectionPool =>\n createSingletonConnectionPool<D1Connection>({\n driverType: D1DriverType,\n getConnection: () =>\n d1Connection({\n ...options,\n serializer: JSONSerializer.from(options),\n }),\n });\n","export * from './connections';\nimport type { D1Database } from '@cloudflare/workers-types';\nimport type { D1ConnectionPool } from '../../../cloudflare';\nimport {\n dumboDatabaseDriverRegistry,\n type DumboConnectionOptions,\n type DumboDatabaseDriver,\n} from '../../../core';\nimport {\n DefaultSQLiteMigratorOptions,\n sqliteFormatter,\n sqliteMetadata,\n} from '../core';\nimport { D1DriverType, type D1Connection } from './connections';\nimport { d1Pool, type D1PoolOptions } from './pool';\n\nexport type D1DumboOptions = D1PoolOptions;\n\nexport const d1DumboDriver: DumboDatabaseDriver<\n D1Connection,\n D1DumboOptions,\n D1ConnectionPool\n> = {\n driverType: D1DriverType,\n createPool: (options) => d1Pool(options),\n sqlFormatter: sqliteFormatter,\n defaultMigratorOptions: DefaultSQLiteMigratorOptions,\n canHandle: (options) => {\n return options.driverType === D1DriverType && 'database' in options;\n },\n databaseMetadata: sqliteMetadata,\n};\n\nexport const useD1DumboDriver = () => {\n dumboDatabaseDriverRegistry.register(D1DriverType, d1DumboDriver);\n};\n\nexport type D1DumboConnectionOptions = DumboConnectionOptions<\n typeof d1DumboDriver\n> & { database: D1Database };\n\nuseD1DumboDriver();\n\nexport * from './connections';\nexport * from './errors';\nexport * from './execute';\nexport * from './formatter';\nexport * from './pool';\nexport * from './transactions';\n"],"mappings":"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"}
|