{"version":3,"sources":["../src/connection.ts","../src/query-builder.ts","../src/schema.ts","../src/driver.ts"],"names":["join","existsSync","mkdirSync","Database"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Database } from 'bun:sqlite';\nimport { join } from 'node:path';\nimport { mkdirSync, existsSync } from 'node:fs';\n\n/**\n * Options for establishing a database connection.\n *\n * @remarks\n * Configure connection behavior including file location, access mode,\n * and logging. Optimized for Bun's native SQLite implementation.\n *\n * @example\n * ```typescript\n * const options: ConnectionOptions = {\n *   filepath: './data/mydb.sqlite',\n *   readonly: false,\n *   verbose: true\n * };\n * ```\n *\n * @public\n */\nexport interface ConnectionOptions {\n  /**\n   * Path to the SQLite database file.\n   * Parent directories will be created automatically if they don't exist.\n   */\n  filepath: string;\n\n  /**\n   * Open database in read-only mode.\n   * @defaultValue false\n   */\n  readonly?: boolean;\n\n  /**\n   * Throw an error if the database file doesn't exist.\n   * @defaultValue false\n   */\n  create?: boolean;\n\n  /**\n   * Enable verbose logging (logs all SQL statements).\n   * @defaultValue false\n   */\n  verbose?: boolean;\n}\n\n/**\n * Database connection wrapper for Bun's native SQLite.\n *\n * @remarks\n * Manages a single SQLite database connection using Bun's high-performance\n * native implementation. Automatically configures WAL mode, foreign keys,\n * and optimal caching settings.\n *\n * @example\n * Basic connection:\n * ```typescript\n * import { Connection } from '@rinari/bun-sqlite';\n *\n * const conn = new Connection({\n *   filepath: './data/mydb.sqlite',\n *   verbose: true\n * });\n *\n * const result = conn.query('SELECT * FROM users').all();\n *\n * conn.close();\n * ```\n *\n * @example\n * Transaction usage:\n * ```typescript\n * const result = conn.transaction(() => {\n *   conn.query('INSERT INTO users (username) VALUES ($username)').run({ $username: 'alice' });\n *   conn.query('INSERT INTO profiles (user_id) VALUES ($uid)').run({ $uid: 1 });\n *   return conn.query('SELECT * FROM users WHERE username = $username').get({ $username: 'alice' });\n * });\n * ```\n *\n * @public\n */\nexport class Connection {\n  private db: Database;\n  private filepath: string;\n  private isOpen: boolean = false;\n  private verboseMode: boolean = false;\n\n  /**\n   * Creates a new database connection using Bun's native SQLite.\n   *\n   * @param options - Connection configuration\n   *\n   * @remarks\n   * The connection is automatically opened and optimized with:\n   * - WAL (Write-Ahead Logging) mode for better concurrency\n   * - NORMAL synchronous mode for balance of safety and speed\n   * - Foreign key constraints enabled\n   * - Memory-based temp storage for performance\n   *\n   * @example\n   * ```typescript\n   * const conn = new Connection({\n   *   filepath: './data/app.db',\n   *   verbose: false\n   * });\n   * ```\n   */\n  constructor(options: ConnectionOptions) {\n    this.filepath = options.filepath;\n    this.verboseMode = options.verbose ?? false;\n\n    const dir = join(this.filepath, '..');\n    if (!existsSync(dir)) {\n      mkdirSync(dir, { recursive: true });\n    }\n\n    this.db = new Database(this.filepath, {\n      readonly: options.readonly ?? false,\n      create: options.create ?? true,\n    });\n\n    this.db.exec('PRAGMA journal_mode = WAL');\n    this.db.exec('PRAGMA synchronous = NORMAL');\n    this.db.exec('PRAGMA temp_store = MEMORY');\n    this.db.exec('PRAGMA foreign_keys = ON');\n\n    this.isOpen = true;\n  }\n\n  /**\n   * Get the underlying Bun SQLite database instance.\n   *\n   * @throws {Error} If the connection is closed\n   *\n   * @example\n   * ```typescript\n   * const db = conn.database;\n   * db.run('VACUUM');\n   * ```\n   */\n  get database(): Database {\n    if (!this.isOpen) {\n      throw new Error('Database connection is closed');\n    }\n    return this.db;\n  }\n\n  /**\n   * Create a prepared SQL query.\n   *\n   * @param sql - SQL statement\n   * @returns Prepared query\n   *\n   * @remarks\n   * In Bun SQLite, this returns a Query object with `.all()`, `.get()`, and `.run()` methods.\n   * Queries are automatically cached by Bun for performance.\n   *\n   * @example\n   * ```typescript\n   * const query = conn.query('SELECT * FROM users WHERE age > $age');\n   * const users = query.all({ $age: 18 });\n   * ```\n   */\n  query(sql: string): ReturnType<Database['query']> {\n    if (this.verboseMode) {\n      console.log('[SQL]', sql);\n    }\n    return this.db.query(sql);\n  }\n\n  /**\n   * Prepare a SQL statement for execution (alias for query).\n   *\n   * @param sql - SQL statement\n   * @returns Prepared statement\n   *\n   * @example\n   * ```typescript\n   * const stmt = conn.prepare('SELECT * FROM users WHERE age > $age');\n   * const users = stmt.all({ $age: 18 });\n   * ```\n   */\n  prepare(sql: string): ReturnType<Database['query']> {\n    return this.query(sql);\n  }\n\n  /**\n   * Execute raw SQL without prepared statements.\n   *\n   * @param sql - SQL statement(s) to execute\n   * @returns this for method chaining\n   *\n   * @remarks\n   * Use this for DDL operations or multi-statement execution.\n   * For single queries with parameters, use {@link query}.\n   *\n   * @example\n   * ```typescript\n   * conn.exec(`\n   *   CREATE TABLE IF NOT EXISTS users (\n   *     id INTEGER PRIMARY KEY,\n   *     username TEXT UNIQUE\n   *   );\n   *   CREATE INDEX idx_username ON users(username);\n   * `);\n   * ```\n   */\n  exec(sql: string): this {\n    if (this.verboseMode) {\n      console.log('[SQL EXEC]', sql);\n    }\n    this.db.exec(sql);\n    return this;\n  }\n\n  /**\n   * Execute a transaction.\n   *\n   * @typeParam T - Transaction return type\n   * @param fn - Transaction callback\n   * @returns Transaction result\n   *\n   * @remarks\n   * All operations in the callback are executed atomically.\n   * If an error occurs, all changes are rolled back automatically.\n   * Bun's transaction implementation is highly optimized.\n   *\n   * @example\n   * ```typescript\n   * const user = conn.transaction(() => {\n   *   const info = conn.query('INSERT INTO users (username) VALUES ($name)').run({ $name: 'alice' });\n   *   conn.query('INSERT INTO profiles (user_id, bio) VALUES ($id, $bio)').run({\n   *     $id: info.lastInsertRowid,\n   *     $bio: 'Hello'\n   *   });\n   *   return conn.query('SELECT * FROM users WHERE id = $id').get({ $id: info.lastInsertRowid });\n   * });\n   * ```\n   *\n   * @example\n   * Transaction with error handling:\n   * ```typescript\n   * try {\n   *   conn.transaction(() => {\n   *     conn.query('INSERT INTO users (username) VALUES ($name)').run({ $name: 'alice' });\n   *     throw new Error('Rollback!');\n   *   });\n   * } catch (error) {\n   *   console.log('Transaction rolled back');\n   * }\n   * ```\n   */\n  transaction<T>(fn: () => T): T {\n    const trx = this.db.transaction(fn);\n    return trx();\n  }\n\n  /**\n   * Close the database connection and release resources.\n   *\n   * @remarks\n   * Always call this method when you're done using the connection\n   * to prevent resource leaks.\n   *\n   * @example\n   * ```typescript\n   * const conn = new Connection({ filepath: './data/app.db' });\n   * try {\n   *   // ... use connection\n   * } finally {\n   *   conn.close();\n   * }\n   * ```\n   */\n  close(): void {\n    if (this.isOpen) {\n      this.db.close();\n      this.isOpen = false;\n    }\n  }\n\n  /**\n   * Check if a transaction is currently active.\n   *\n   * @example\n   * ```typescript\n   * conn.transaction(() => {\n   *   console.log(conn.inTransaction); // true\n   * });\n   * console.log(conn.inTransaction); // false\n   * ```\n   */\n  get inTransaction(): boolean {\n    return this.db.inTransaction;\n  }\n\n  /**\n   * Perform a WAL checkpoint.\n   *\n   * @param mode - Checkpoint mode\n   * @returns this for method chaining\n   *\n   * @remarks\n   * WAL checkpoints transfer data from the WAL file to the main database file.\n   * - PASSIVE: Checkpoint as much as possible without blocking\n   * - FULL: Wait for all transactions and checkpoint everything\n   * - RESTART: Full checkpoint and restart the WAL\n   * - TRUNCATE: Restart and truncate the WAL file\n   *\n   * @example\n   * ```typescript\n   * conn.checkpoint('TRUNCATE');\n   * ```\n   */\n  checkpoint(mode?: 'PASSIVE' | 'FULL' | 'RESTART' | 'TRUNCATE'): this {\n    this.db.exec(`PRAGMA wal_checkpoint(${mode ?? 'PASSIVE'})`);\n    return this;\n  }\n\n  /**\n   * Optimize the database.\n   *\n   * @returns this for method chaining\n   *\n   * @remarks\n   * Updates internal statistics used by the query optimizer.\n   * Run this periodically for better query performance.\n   *\n   * @example\n   * ```typescript\n   * conn.optimize();\n   * ```\n   */\n  optimize(): this {\n    this.db.exec('PRAGMA optimize');\n    return this;\n  }\n\n  /**\n   * Compact the database file by rebuilding it.\n   *\n   * @returns this for method chaining\n   *\n   * @remarks\n   * VACUUM reclaims unused space and defragments the database.\n   * This can be slow on large databases.\n   *\n   * @example\n   * ```typescript\n   * conn.vacuum();\n   * ```\n   */\n  vacuum(): this {\n    this.db.exec('VACUUM');\n    return this;\n  }\n\n  /**\n   * Analyze the database to update optimizer statistics.\n   *\n   * @returns this for method chaining\n   *\n   * @remarks\n   * ANALYZE gathers statistics about table content to help the query planner.\n   * Run this after significant data changes.\n   *\n   * @example\n   * ```typescript\n   * conn.analyze();\n   * ```\n   */\n  analyze(): this {\n    this.db.exec('ANALYZE');\n    return this;\n  }\n\n  /**\n   * Get the filename of the database.\n   *\n   * @returns Database filename\n   *\n   * @example\n   * ```typescript\n   * console.log(conn.filename); // './data/app.db'\n   * ```\n   */\n  get filename(): string {\n    return this.db.filename;\n  }\n}\n","import type { Connection } from './connection.js';\nimport type { QueryOptions, WhereOperators } from '@rinari/types';\n\n/**\n * SQL query builder for Bun SQLite with support for advanced operators.\n *\n * @remarks\n * Builds and executes SQL queries using Bun's native SQLite with automatic\n * parameter binding, value serialization, and comprehensive where clause support.\n * Optimized for Bun's high-performance query engine.\n *\n * @example\n * Basic usage:\n * ```typescript\n * import { Connection, QueryBuilder } from '@rinari/bun-sqlite';\n *\n * const conn = new Connection({ filepath: './data/app.db' });\n * const qb = new QueryBuilder(conn);\n *\n * const users = qb.findAll('users', {\n *   where: { age: { $gte: 18 } },\n *   orderBy: [['username', 'ASC']],\n *   limit: 10\n * });\n * ```\n *\n * @public\n */\nexport class QueryBuilder {\n  /**\n   * Creates a new query builder.\n   *\n   * @param connection - Database connection instance\n   *\n   * @example\n   * ```typescript\n   * const conn = new Connection({ filepath: './data/app.db' });\n   * const qb = new QueryBuilder(conn);\n   * ```\n   */\n  constructor(private connection: Connection) {}\n\n  /**\n   * @internal\n   * Serialize a value for database storage.\n   *\n   * @param value - Value to serialize\n   * @returns Serialized value suitable for SQLite\n   *\n   * @remarks\n   * - Objects and arrays are JSON stringified\n   * - Dates are converted to ISO strings\n   * - Booleans are converted to 0/1\n   * - null/undefined becomes null\n   */\n  private serializeValue(value: any): any {\n    if (value === null || value === undefined) {\n      return null;\n    }\n    if (typeof value === 'object' && !(value instanceof Date) && !(value instanceof Uint8Array)) {\n      return JSON.stringify(value);\n    }\n    if (value instanceof Date) {\n      return value.toISOString();\n    }\n    if (typeof value === 'boolean') {\n      return value ? 1 : 0;\n    }\n    return value;\n  }\n\n  /**\n   * @internal\n   * Serialize all values in a record.\n   */\n  private serializeRecord(data: Record<string, any>): Record<string, any> {\n    const serialized: Record<string, any> = {};\n    for (const [key, value] of Object.entries(data)) {\n      serialized[key] = this.serializeValue(value);\n    }\n    return serialized;\n  }\n\n  /**\n   * @internal\n   * Build SQL WHERE clause from query conditions.\n   *\n   * @param where - Filter conditions\n   * @returns Object with SQL string and parameters array\n   */\n  private buildWhereClause(where?: Record<string, any>): { sql: string; params: any[] } {\n    if (!where || Object.keys(where).length === 0) {\n      return { sql: '', params: [] };\n    }\n\n    const conditions: string[] = [];\n    const params: any[] = [];\n\n    for (const [key, value] of Object.entries(where)) {\n      if (value === null) {\n        conditions.push(`${key} IS NULL`);\n      } else if (\n        typeof value === 'object' &&\n        !Array.isArray(value) &&\n        !(value instanceof Date) &&\n        value !== null\n      ) {\n        const condition = value as WhereOperators;\n\n        if ('$gt' in condition && condition.$gt !== undefined) {\n          conditions.push(`${key} > ?`);\n          params.push(this.serializeValue(condition.$gt));\n        }\n        if ('$gte' in condition && condition.$gte !== undefined) {\n          conditions.push(`${key} >= ?`);\n          params.push(this.serializeValue(condition.$gte));\n        }\n        if ('$lt' in condition && condition.$lt !== undefined) {\n          conditions.push(`${key} < ?`);\n          params.push(this.serializeValue(condition.$lt));\n        }\n        if ('$lte' in condition && condition.$lte !== undefined) {\n          conditions.push(`${key} <= ?`);\n          params.push(this.serializeValue(condition.$lte));\n        }\n        if ('$ne' in condition && condition.$ne !== undefined) {\n          conditions.push(`${key} != ?`);\n          params.push(this.serializeValue(condition.$ne));\n        }\n        if ('$in' in condition && Array.isArray(condition.$in)) {\n          const placeholders = condition.$in.map(() => '?').join(', ');\n          conditions.push(`${key} IN (${placeholders})`);\n          params.push(...condition.$in.map((v: any) => this.serializeValue(v)));\n        }\n        if ('$notIn' in condition && Array.isArray(condition.$notIn)) {\n          const placeholders = condition.$notIn.map(() => '?').join(', ');\n          conditions.push(`${key} NOT IN (${placeholders})`);\n          params.push(...condition.$notIn.map((v: any) => this.serializeValue(v)));\n        }\n        if ('$like' in condition && condition.$like !== undefined) {\n          conditions.push(`${key} LIKE ?`);\n          params.push(this.serializeValue(condition.$like));\n        }\n        if (\n          '$between' in condition &&\n          Array.isArray(condition.$between) &&\n          condition.$between.length === 2\n        ) {\n          conditions.push(`${key} BETWEEN ? AND ?`);\n          params.push(\n            this.serializeValue(condition.$between[0]),\n            this.serializeValue(condition.$between[1])\n          );\n        }\n      } else {\n        conditions.push(`${key} = ?`);\n        params.push(this.serializeValue(value));\n      }\n    }\n\n    return {\n      sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n      params,\n    };\n  }\n\n  /**\n   * @internal\n   * Build SQL ORDER BY clause.\n   */\n  private buildOrderBy(orderBy?: Array<[string, 'ASC' | 'DESC']>): string {\n    if (!orderBy || orderBy.length === 0) return '';\n\n    const orders = orderBy.map(([col, dir]) => `${col} ${dir}`).join(', ');\n    return ` ORDER BY ${orders}`;\n  }\n\n  /**\n   * @internal\n   * Build SQL LIMIT and OFFSET clause.\n   */\n  private buildLimit(limit?: number, offset?: number): string {\n    let sql = '';\n    if (limit !== undefined) sql += ` LIMIT ${limit}`;\n    if (offset !== undefined) sql += ` OFFSET ${offset}`;\n    return sql;\n  }\n\n  /**\n   * Find a single record matching the options.\n   *\n   * @param tableName - Table name\n   * @param options - Query options\n   * @returns Matching record or null\n   *\n   * @example\n   * ```typescript\n   * const user = qb.findOne('users', {\n   *   where: { username: 'alice' },\n   *   select: ['id', 'username', 'email']\n   * });\n   * ```\n   */\n  findOne(tableName: string, options: QueryOptions = {}): any | null {\n    const select = options.select?.join(', ') || '*';\n    const { sql: whereClause, params } = this.buildWhereClause(options.where);\n\n    const query = `SELECT ${select} FROM ${tableName}${whereClause} LIMIT 1`;\n    return this.connection.query(query).get(...params) || null;\n  }\n\n  /**\n   * Find all records matching the options.\n   *\n   * @param tableName - Table name\n   * @param options - Query options\n   * @returns Array of matching records\n   *\n   * @example\n   * ```typescript\n   * const users = qb.findAll('users', {\n   *   where: { age: { $gte: 18 }, status: 'active' },\n   *   orderBy: [['created_at', 'DESC']],\n   *   limit: 10,\n   *   offset: 0\n   * });\n   * ```\n   */\n  findAll(tableName: string, options: QueryOptions = {}): any[] {\n    const select = options.select?.join(', ') || '*';\n    const { sql: whereClause, params } = this.buildWhereClause(options.where);\n    const orderBy = this.buildOrderBy(options.orderBy);\n    const limit = this.buildLimit(options.limit, options.offset);\n\n    const query = `SELECT ${select} FROM ${tableName}${whereClause}${orderBy}${limit}`;\n    return this.connection.query(query).all(...params) as any[];\n  }\n\n  /**\n   * Count records matching the where condition.\n   *\n   * @param tableName - Table name\n   * @param options - Query options (only `where` is used)\n   * @returns Number of matching records\n   *\n   * @example\n   * ```typescript\n   * const count = qb.count('users', {\n   *   where: { status: 'active' }\n   * });\n   * ```\n   */\n  count(tableName: string, options: { where?: Record<string, any> } = {}): number {\n    const { sql: whereClause, params } = this.buildWhereClause(options.where);\n\n    const query = `SELECT COUNT(*) as count FROM ${tableName}${whereClause}`;\n    const result = this.connection.query(query).get(...params) as { count: number };\n    return result.count;\n  }\n\n  /**\n   * Insert a new record.\n   *\n   * @param tableName - Table name\n   * @param data - Record data\n   * @returns Inserted record with generated ID\n   *\n   * @example\n   * ```typescript\n   * const user = qb.insert('users', {\n   *   username: 'alice',\n   *   email: 'alice@example.com',\n   *   age: 25\n   * });\n   * console.log(user.id); // Auto-generated ID\n   * ```\n   */\n  insert(tableName: string, data: Record<string, any>): any {\n    const serialized = this.serializeRecord(data);\n    const columns = Object.keys(serialized);\n    const values = Object.values(serialized);\n    const placeholders = columns.map(() => '?').join(', ');\n\n    const query = `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`;\n    const stmt = this.connection.query(query);\n    const info = stmt.run(...values);\n\n    return (\n      this.findOne(tableName, { where: { id: info.lastInsertRowid } }) || {\n        ...data,\n        id: info.lastInsertRowid,\n      }\n    );\n  }\n\n  /**\n   * Insert multiple records in a single transaction.\n   *\n   * @param tableName - Table name\n   * @param records - Array of records to insert\n   * @returns Array of inserted records with generated IDs\n   *\n   * @example\n   * ```typescript\n   * const users = qb.bulkInsert('users', [\n   *   { username: 'alice', email: 'alice@example.com' },\n   *   { username: 'bob', email: 'bob@example.com' },\n   *   { username: 'charlie', email: 'charlie@example.com' }\n   * ]);\n   * ```\n   */\n  bulkInsert(tableName: string, records: Record<string, any>[]): any[] {\n    if (records.length === 0) return [];\n\n    const columns = Object.keys(records[0]);\n    const placeholders = columns.map(() => '?').join(', ');\n    const query = `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`;\n\n    return this.connection.transaction(() => {\n      const stmt = this.connection.query(query);\n      const results: any[] = [];\n\n      for (const record of records) {\n        const serialized = this.serializeRecord(record);\n        const values = columns.map((col) => serialized[col]);\n        const info = stmt.run(...values);\n        results.push({ ...record, id: info.lastInsertRowid });\n      }\n\n      return results;\n    });\n  }\n\n  /**\n   * Update records matching the where condition.\n   *\n   * @param tableName - Table name\n   * @param data - New values\n   * @param where - Filter conditions\n   * @returns Number of updated records\n   *\n   * @example\n   * ```typescript\n   * const updated = qb.update('users',\n   *   { status: 'inactive' },\n   *   { last_login: { $lt: '2024-01-01' } }\n   * );\n   * console.log(`${updated} users deactivated`);\n   * ```\n   */\n  update(tableName: string, data: Record<string, any>, where: Record<string, any>): number {\n    const serialized = this.serializeRecord(data);\n    const setClause = Object.keys(serialized)\n      .map((key) => `${key} = ?`)\n      .join(', ');\n    const { sql: whereClause, params: whereParams } = this.buildWhereClause(where);\n\n    const query = `UPDATE ${tableName} SET ${setClause}${whereClause}`;\n    const stmt = this.connection.query(query);\n    const info = stmt.run(...Object.values(serialized), ...whereParams);\n\n    return info.changes;\n  }\n\n  /**\n   * Perform multiple updates in a single transaction.\n   *\n   * @param tableName - Table name\n   * @param updates - Array of update operations\n   * @returns Total number of updated records\n   *\n   * @example\n   * ```typescript\n   * const updated = qb.bulkUpdate('users', [\n   *   { where: { id: 1 }, data: { status: 'active' } },\n   *   { where: { id: 2 }, data: { status: 'inactive' } },\n   *   { where: { id: 3 }, data: { status: 'banned' } }\n   * ]);\n   * ```\n   */\n  bulkUpdate(\n    tableName: string,\n    updates: Array<{ where: Record<string, any>; data: Record<string, any> }>\n  ): number {\n    return this.connection.transaction(() => {\n      let totalChanges = 0;\n      for (const { where, data } of updates) {\n        totalChanges += this.update(tableName, data, where);\n      }\n      return totalChanges;\n    });\n  }\n\n  /**\n   * Delete records matching the where condition.\n   *\n   * @param tableName - Table name\n   * @param where - Filter conditions\n   * @returns Number of deleted records\n   *\n   * @example\n   * ```typescript\n   * const deleted = qb.delete('users', {\n   *   status: 'banned',\n   *   created_at: { $lt: '2023-01-01' }\n   * });\n   * console.log(`${deleted} users deleted`);\n   * ```\n   */\n  delete(tableName: string, where: Record<string, any>): number {\n    const { sql: whereClause, params } = this.buildWhereClause(where);\n\n    const query = `DELETE FROM ${tableName}${whereClause}`;\n    const stmt = this.connection.query(query);\n    const info = stmt.run(...params);\n\n    return info.changes;\n  }\n\n  /**\n   * Perform an aggregation operation.\n   *\n   * @param tableName - Table name\n   * @param operation - Aggregation operation (SUM, AVG, MIN, MAX, COUNT)\n   * @param field - Field to aggregate\n   * @param where - Optional filter conditions\n   * @returns Aggregation result\n   *\n   * @example\n   * ```typescript\n   * const totalAge = qb.aggregate('users', 'SUM', 'age');\n   * const avgAge = qb.aggregate('users', 'AVG', 'age', { status: 'active' });\n   * const maxPrice = qb.aggregate('products', 'MAX', 'price', { category: 'electronics' });\n   * ```\n   */\n  aggregate(\n    tableName: string,\n    operation: string,\n    field: string,\n    where?: Record<string, any>\n  ): number {\n    const { sql: whereClause, params } = this.buildWhereClause(where);\n    const query = `SELECT ${operation}(${field}) as result FROM ${tableName}${whereClause}`;\n    const result = this.connection.query(query).get(...params) as { result: number };\n    return result.result || 0;\n  }\n}\n","import type { Connection } from './connection.js';\nimport type { TableSchema, ColumnDefinition, IndexOptions, DataType } from '@rinari/types';\n\n/**\n * Schema manager for creating and managing SQLite tables and indexes using Bun's native SQLite.\n *\n * @remarks\n * Handles DDL (Data Definition Language) operations including table creation,\n * index management, and schema introspection. Automatically maps Rinari\n * data types to SQLite types. Optimized for Bun's high-performance execution.\n *\n * @example\n * Basic usage:\n * ```typescript\n * import { Connection, SchemaManager } from '@rinari/bun-sqlite';\n * import { DataTypes } from '@rinari/types';\n *\n * const conn = new Connection({ filepath: './data/app.db' });\n * const schema = new SchemaManager(conn);\n *\n * schema.createTable('users', {\n *   id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },\n *   username: { type: DataTypes.TEXT, notNull: true, unique: true },\n *   email: { type: DataTypes.TEXT, notNull: true, unique: true }\n * });\n *\n * schema.createIndex('users', 'idx_email', {\n *   unique: true,\n *   columns: ['email']\n * });\n * ```\n *\n * @public\n */\nexport class SchemaManager {\n  /**\n   * Creates a new schema manager.\n   *\n   * @param connection - Database connection instance\n   *\n   * @example\n   * ```typescript\n   * const conn = new Connection({ filepath: './data/app.db' });\n   * const schema = new SchemaManager(conn);\n   * ```\n   */\n  constructor(private connection: Connection) {}\n\n  /**\n   * @internal\n   * Map Rinari data type to SQLite type with constraints.\n   *\n   * @param type - Rinari data type\n   * @param options - Column definition options\n   * @returns SQL type definition string\n   */\n  private mapTypeToSQL(type: DataType, options: ColumnDefinition): string {\n    let sql = '';\n\n    switch (type) {\n      case 'TEXT':\n      case 'STRING':\n        sql = 'TEXT';\n        break;\n      case 'INTEGER':\n      case 'NUMBER':\n        sql = 'INTEGER';\n        break;\n      case 'REAL':\n        sql = 'REAL';\n        break;\n      case 'BLOB':\n        sql = 'BLOB';\n        break;\n      case 'BOOLEAN':\n        sql = 'INTEGER';\n        break;\n      case 'DATE':\n      case 'DATETIME':\n        sql = 'TEXT';\n        break;\n      case 'JSON':\n      case 'OBJECT':\n      case 'ARRAY':\n        sql = 'TEXT';\n        break;\n      default:\n        sql = 'TEXT';\n    }\n\n    if (options.primaryKey) {\n      sql += ' PRIMARY KEY';\n      if (options.autoIncrement) {\n        sql += ' AUTOINCREMENT';\n      }\n    }\n\n    if (options.notNull && !options.primaryKey) {\n      sql += ' NOT NULL';\n    }\n\n    if (options.unique && !options.primaryKey) {\n      sql += ' UNIQUE';\n    }\n\n    if (options.default !== undefined) {\n      if (typeof options.default === 'string') {\n        sql += ` DEFAULT '${options.default.replace(/'/g, \"''\")}'`;\n      } else if (options.default === null) {\n        sql += ` DEFAULT NULL`;\n      } else if (typeof options.default === 'boolean') {\n        sql += ` DEFAULT ${options.default ? 1 : 0}`;\n      } else {\n        sql += ` DEFAULT ${options.default}`;\n      }\n    }\n\n    if (options.references) {\n      const { table, column, onDelete, onUpdate } = options.references;\n      sql += ` REFERENCES ${table}(${column})`;\n      if (onDelete) sql += ` ON DELETE ${onDelete}`;\n      if (onUpdate) sql += ` ON UPDATE ${onUpdate}`;\n    }\n\n    return sql;\n  }\n\n  /**\n   * Create a new table.\n   *\n   * @param tableName - Table name\n   * @param schema - Table schema definition\n   *\n   * @remarks\n   * Creates the table if it doesn't exist. If the table already exists, this operation is a no-op.\n   *\n   * @example\n   * Simple table:\n   * ```typescript\n   * schema.createTable('users', {\n   *   id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },\n   *   username: { type: DataTypes.TEXT, notNull: true }\n   * });\n   * ```\n   *\n   * @example\n   * Table with foreign keys:\n   * ```typescript\n   * schema.createTable('posts', {\n   *   id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },\n   *   user_id: {\n   *     type: DataTypes.INTEGER,\n   *     notNull: true,\n   *     references: {\n   *       table: 'users',\n   *       column: 'id',\n   *       onDelete: 'CASCADE'\n   *     }\n   *   },\n   *   title: { type: DataTypes.TEXT, notNull: true },\n   *   content: { type: DataTypes.TEXT }\n   * });\n   * ```\n   *\n   * @example\n   * Table with defaults:\n   * ```typescript\n   * schema.createTable('settings', {\n   *   id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },\n   *   key: { type: DataTypes.TEXT, notNull: true, unique: true },\n   *   value: { type: DataTypes.TEXT },\n   *   is_active: { type: DataTypes.BOOLEAN, default: true },\n   *   created_at: { type: DataTypes.DATETIME }\n   * });\n   * ```\n   */\n  createTable(tableName: string, schema: TableSchema): void {\n    const columns: string[] = [];\n\n    for (const [columnName, definition] of Object.entries(schema)) {\n      const columnDef = `${columnName} ${this.mapTypeToSQL(definition.type, definition)}`;\n      columns.push(columnDef);\n    }\n\n    const sql = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns.join(', ')})`;\n    this.connection.exec(sql);\n  }\n\n  /**\n   * Drop (delete) a table.\n   *\n   * @param tableName - Table name\n   *\n   * @remarks\n   * Drops the table if it exists. If the table doesn't exist, this operation is a no-op.\n   *\n   * @example\n   * ```typescript\n   * schema.dropTable('old_users');\n   * ```\n   */\n  dropTable(tableName: string): void {\n    this.connection.exec(`DROP TABLE IF EXISTS ${tableName}`);\n  }\n\n  /**\n   * Check if a table exists.\n   *\n   * @param tableName - Table name\n   * @returns True if table exists, false otherwise\n   *\n   * @example\n   * ```typescript\n   * if (schema.tableExists('users')) {\n   *   console.log('Users table exists');\n   * } else {\n   *   schema.createTable('users', userSchema);\n   * }\n   * ```\n   */\n  tableExists(tableName: string): boolean {\n    const result = this.connection\n      .query(`SELECT name FROM sqlite_master WHERE type='table' AND name=$name`)\n      .get({ $name: tableName });\n    return !!result;\n  }\n\n  /**\n   * Create an index on specified columns.\n   *\n   * @param tableName - Table name\n   * @param indexName - Index name\n   * @param options - Index options\n   *\n   * @remarks\n   * Creates the index if it doesn't exist. Indexes improve query performance\n   * on frequently searched columns.\n   *\n   * @example\n   * Simple index:\n   * ```typescript\n   * schema.createIndex('users', 'idx_email', {\n   *   columns: ['email']\n   * });\n   * ```\n   *\n   * @example\n   * Unique index:\n   * ```typescript\n   * schema.createIndex('users', 'idx_username', {\n   *   unique: true,\n   *   columns: ['username']\n   * });\n   * ```\n   *\n   * @example\n   * Composite index:\n   * ```typescript\n   * schema.createIndex('posts', 'idx_user_date', {\n   *   columns: ['user_id', 'created_at']\n   * });\n   * ```\n   *\n   * @example\n   * Partial index:\n   * ```typescript\n   * schema.createIndex('users', 'idx_active_users', {\n   *   columns: ['created_at'],\n   *   where: \"status = 'active'\"\n   * });\n   * ```\n   */\n  createIndex(tableName: string, indexName: string, options: IndexOptions): void {\n    const unique = options.unique ? 'UNIQUE' : '';\n    const columns = options.columns.join(', ');\n    const where = options.where ? ` WHERE ${options.where}` : '';\n\n    const sql = `CREATE ${unique} INDEX IF NOT EXISTS ${indexName} ON ${tableName} (${columns})${where}`;\n    this.connection.exec(sql);\n  }\n\n  /**\n   * Drop (delete) an index.\n   *\n   * @param indexName - Index name\n   *\n   * @remarks\n   * Drops the index if it exists. If the index doesn't exist, this operation is a no-op.\n   *\n   * @example\n   * ```typescript\n   * schema.dropIndex('idx_email');\n   * ```\n   */\n  dropIndex(indexName: string): void {\n    this.connection.exec(`DROP INDEX IF EXISTS ${indexName}`);\n  }\n}\n","import type {\n  SyncDriver,\n  DriverConfig,\n  DriverMetadata,\n  TableSchema,\n  QueryOptions,\n  IndexOptions,\n} from '@rinari/types';\nimport { Connection } from './connection.js';\nimport { QueryBuilder } from './query-builder.js';\nimport { SchemaManager } from './schema.js';\n\n/**\n * Synchronous Bun-native SQLite driver for Rinari ORM.\n *\n * @remarks\n * High-performance SQLite driver built on Bun's native `bun:sqlite` module with support for:\n * - 3-6x faster than better-sqlite3\n * - Multiple database files\n * - ACID transactions\n * - Advanced query operators\n * - Index management\n * - WAL mode for better concurrency\n *\n * **Requirements:** This driver requires the Bun runtime (>=1.0.0). It will not work with Node.js.\n *\n * @example\n * Basic usage:\n * ```typescript\n * import { BunSQLiteDriver } from '@rinari/bun-sqlite';\n * import { ORM } from '@rinari/orm';\n * import { DataTypes } from '@rinari/types';\n *\n * const driver = new BunSQLiteDriver({\n *   storageDir: './data',\n *   verbose: false\n * });\n *\n * const orm = new ORM({ driver });\n *\n * const User = orm.define('default', 'users', {\n *   id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },\n *   username: { type: DataTypes.TEXT, notNull: true, unique: true },\n *   email: { type: DataTypes.TEXT, notNull: true, unique: true }\n * });\n *\n * const user = User.create({\n *   username: 'alice',\n *   email: 'alice@example.com'\n * });\n * ```\n *\n * @example\n * Multi-database setup:\n * ```typescript\n * const driver = new BunSQLiteDriver({\n *   storageDir: './data'\n * });\n *\n * const orm = new ORM({ driver });\n *\n * const User = orm.define('users_db', 'users', userSchema);\n * const Product = orm.define('products_db', 'products', productSchema);\n *\n * console.log('Databases:', orm.getDatabases()); // ['users_db', 'products_db']\n * ```\n *\n * @public\n */\nexport class BunSQLiteDriver implements SyncDriver {\n  /**\n   * Driver metadata.\n   */\n  readonly metadata: DriverMetadata = {\n    name: 'bun-sqlite',\n    version: '1.0.0',\n  };\n\n  private connections: Map<string, Connection> = new Map();\n  private queryBuilders: Map<string, QueryBuilder> = new Map();\n  private schemaManagers: Map<string, SchemaManager> = new Map();\n  private config: DriverConfig;\n  private storageDir: string;\n\n  /**\n   * Creates a new Bun SQLite driver instance.\n   *\n   * @param config - Driver configuration\n   *\n   * @throws {Error} If not running in Bun runtime\n   *\n   * @remarks\n   * The driver will create database files in the specified storage directory.\n   * Each database name maps to a separate .sqlite file.\n   *\n   * @example\n   * ```typescript\n   * const driver = new BunSQLiteDriver({\n   *   storageDir: './data',\n   *   verbose: true,\n   *   readonly: false\n   * });\n   * ```\n   */\n  constructor(config: DriverConfig) {\n    if (typeof (globalThis as any).Bun === 'undefined') {\n      throw new Error(\n        '@rinari/bun-sqlite requires Bun runtime. This driver is not compatible with Node.js. Please use @rinari/sqlite for Node.js.'\n      );\n    }\n\n    this.config = config;\n    this.storageDir = config.storageDir;\n    this.connect(config);\n  }\n\n  /**\n   * Connect to the database(s).\n   *\n   * @param config - Driver configuration\n   *\n   * @remarks\n   * This method updates the configuration. Actual database connections\n   * are created lazily when they're first accessed.\n   *\n   * @example\n   * ```typescript\n   * driver.connect({\n   *   storageDir: './data',\n   *   verbose: true\n   * });\n   * ```\n   */\n  connect(config: DriverConfig): void {\n    this.config = config;\n    this.storageDir = config.storageDir;\n  }\n\n  /**\n   * @internal\n   * Initialize a connection for a specific database.\n   */\n  private initializeConnection(dbName: string, filepath: string, config: DriverConfig): void {\n    const connection = new Connection({\n      filepath,\n      readonly: config.readonly,\n      verbose: config.verbose,\n    });\n\n    this.connections.set(dbName, connection);\n    this.queryBuilders.set(dbName, new QueryBuilder(connection));\n    this.schemaManagers.set(dbName, new SchemaManager(connection));\n  }\n\n  /**\n   * @internal\n   * Get or create a connection for a database.\n   */\n  private getConnection(dbName: string): Connection {\n    let connection = this.connections.get(dbName);\n\n    if (!connection) {\n      const filepath = `${this.storageDir}/${dbName}.sqlite`;\n      this.initializeConnection(dbName, filepath, this.config);\n      connection = this.connections.get(dbName)!;\n    }\n\n    return connection;\n  }\n\n  /**\n   * @internal\n   * Get or create a query builder for a database.\n   */\n  private getQueryBuilder(dbName: string): QueryBuilder {\n    let qb = this.queryBuilders.get(dbName);\n    if (!qb) {\n      this.getConnection(dbName);\n      qb = this.queryBuilders.get(dbName);\n      if (!qb) {\n        throw new Error(`Failed to initialize query builder for database: ${dbName}`);\n      }\n    }\n    return qb;\n  }\n\n  /**\n   * @internal\n   * Get or create a schema manager for a database.\n   */\n  private getSchemaManager(dbName: string): SchemaManager {\n    let sm = this.schemaManagers.get(dbName);\n    if (!sm) {\n      this.getConnection(dbName);\n      sm = this.schemaManagers.get(dbName);\n      if (!sm) {\n        throw new Error(`Failed to initialize schema manager for database: ${dbName}`);\n      }\n    }\n    return sm;\n  }\n\n  /**\n   * Disconnect from all databases and cleanup resources.\n   *\n   * @remarks\n   * Always call this method when you're done using the driver to prevent\n   * resource leaks and ensure proper database file closure.\n   *\n   * @example\n   * ```typescript\n   * try {\n   *   // ... use driver\n   * } finally {\n   *   driver.disconnect();\n   * }\n   * ```\n   */\n  disconnect(): void {\n    for (const connection of this.connections.values()) {\n      connection.close();\n    }\n    this.connections.clear();\n    this.queryBuilders.clear();\n    this.schemaManagers.clear();\n  }\n\n  /**\n   * Create a new table in the specified database.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param schema - Table schema definition\n   *\n   * @example\n   * ```typescript\n   * driver.createTable('default', 'users', {\n   *   id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },\n   *   username: { type: DataTypes.TEXT, notNull: true, unique: true }\n   * });\n   * ```\n   */\n  createTable(dbName: string, tableName: string, schema: TableSchema): void {\n    const schemaManager = this.getSchemaManager(dbName);\n    schemaManager.createTable(tableName, schema);\n  }\n\n  /**\n   * Drop a table from the specified database.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name\n   *\n   * @example\n   * ```typescript\n   * driver.dropTable('default', 'old_users');\n   * ```\n   */\n  dropTable(dbName: string, tableName: string): void {\n    const schemaManager = this.getSchemaManager(dbName);\n    schemaManager.dropTable(tableName);\n  }\n\n  /**\n   * Check if a table exists in the specified database.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @returns True if table exists, false otherwise\n   *\n   * @example\n   * ```typescript\n   * if (driver.tableExists('default', 'users')) {\n   *   console.log('Users table exists');\n   * }\n   * ```\n   */\n  tableExists(dbName: string, tableName: string): boolean {\n    const schemaManager = this.getSchemaManager(dbName);\n    return schemaManager.tableExists(tableName);\n  }\n\n  /**\n   * Find a single record matching the query options.\n   *\n   * @typeParam T - Expected return type\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param options - Query options\n   * @returns Matching record or null\n   *\n   * @example\n   * ```typescript\n   * const user = driver.findOne<User>('default', 'users', {\n   *   where: { username: 'alice' }\n   * });\n   * ```\n   */\n  findOne<T = any>(dbName: string, tableName: string, options: QueryOptions): T | null {\n    const queryBuilder = this.getQueryBuilder(dbName);\n    return queryBuilder.findOne(tableName, options);\n  }\n\n  /**\n   * Find all records matching the query options.\n   *\n   * @typeParam T - Expected return type\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param options - Query options\n   * @returns Array of matching records\n   *\n   * @example\n   * ```typescript\n   * const users = driver.findAll<User>('default', 'users', {\n   *   where: { age: { $gte: 18 } },\n   *   orderBy: [['age', 'ASC']],\n   *   limit: 10\n   * });\n   * ```\n   */\n  findAll<T = any>(dbName: string, tableName: string, options: QueryOptions): T[] {\n    const queryBuilder = this.getQueryBuilder(dbName);\n    return queryBuilder.findAll(tableName, options);\n  }\n\n  /**\n   * Count records matching the where condition.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param where - Optional filter conditions\n   * @returns Number of matching records\n   *\n   * @example\n   * ```typescript\n   * const count = driver.count('default', 'users', { status: 'active' });\n   * ```\n   */\n  count(dbName: string, tableName: string, where?: Record<string, any>): number {\n    const queryBuilder = this.getQueryBuilder(dbName);\n    return queryBuilder.count(tableName, { where });\n  }\n\n  /**\n   * Insert a new record.\n   *\n   * @typeParam T - Expected return type\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param data - Record data\n   * @returns Inserted record with generated ID\n   *\n   * @example\n   * ```typescript\n   * const user = driver.insert<User>('default', 'users', {\n   *   username: 'alice',\n   *   email: 'alice@example.com'\n   * });\n   * ```\n   */\n  insert<T = any>(dbName: string, tableName: string, data: Record<string, any>): T {\n    const queryBuilder = this.getQueryBuilder(dbName);\n    return queryBuilder.insert(tableName, data);\n  }\n\n  /**\n   * Insert multiple records in a single transaction.\n   *\n   * @typeParam T - Expected return type\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param records - Array of records to insert\n   * @returns Array of inserted records with generated IDs\n   *\n   * @example\n   * ```typescript\n   * const users = driver.bulkInsert<User>('default', 'users', [\n   *   { username: 'alice', email: 'alice@example.com' },\n   *   { username: 'bob', email: 'bob@example.com' }\n   * ]);\n   * ```\n   */\n  bulkInsert<T = any>(dbName: string, tableName: string, records: Record<string, any>[]): T[] {\n    const queryBuilder = this.getQueryBuilder(dbName);\n    return queryBuilder.bulkInsert(tableName, records);\n  }\n\n  /**\n   * Update records matching the where condition.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param data - New values\n   * @param where - Filter conditions\n   * @returns Number of updated records\n   *\n   * @example\n   * ```typescript\n   * const updated = driver.update('default', 'users',\n   *   { status: 'inactive' },\n   *   { last_login: { $lt: '2024-01-01' } }\n   * );\n   * ```\n   */\n  update(\n    dbName: string,\n    tableName: string,\n    data: Record<string, any>,\n    where: Record<string, any>\n  ): number {\n    const queryBuilder = this.getQueryBuilder(dbName);\n    return queryBuilder.update(tableName, data, where);\n  }\n\n  /**\n   * Perform multiple updates in a single transaction.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param updates - Array of update operations\n   * @returns Total number of updated records\n   *\n   * @example\n   * ```typescript\n   * const updated = driver.bulkUpdate('default', 'users', [\n   *   { where: { id: 1 }, data: { status: 'active' } },\n   *   { where: { id: 2 }, data: { status: 'inactive' } }\n   * ]);\n   * ```\n   */\n  bulkUpdate(\n    dbName: string,\n    tableName: string,\n    updates: Array<{ where: Record<string, any>; data: Record<string, any> }>\n  ): number {\n    const queryBuilder = this.getQueryBuilder(dbName);\n    return queryBuilder.bulkUpdate(tableName, updates);\n  }\n\n  /**\n   * Delete records matching the where condition.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param where - Filter conditions\n   * @returns Number of deleted records\n   *\n   * @example\n   * ```typescript\n   * const deleted = driver.delete('default', 'users', { status: 'banned' });\n   * ```\n   */\n  delete(dbName: string, tableName: string, where: Record<string, any>): number {\n    const queryBuilder = this.getQueryBuilder(dbName);\n    return queryBuilder.delete(tableName, where);\n  }\n\n  /**\n   * Create an index on specified columns.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param indexName - Index name\n   * @param options - Index options\n   *\n   * @example\n   * ```typescript\n   * driver.createIndex('default', 'users', 'idx_email', {\n   *   unique: true,\n   *   columns: ['email']\n   * });\n   * ```\n   */\n  createIndex(dbName: string, tableName: string, indexName: string, options: IndexOptions): void {\n    const schemaManager = this.getSchemaManager(dbName);\n    schemaManager.createIndex(tableName, indexName, options);\n  }\n\n  /**\n   * Drop an index.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name (unused in SQLite)\n   * @param indexName - Index name\n   *\n   * @example\n   * ```typescript\n   * driver.dropIndex('default', 'users', 'idx_email');\n   * ```\n   */\n  dropIndex(dbName: string, tableName: string, indexName: string): void {\n    const schemaManager = this.getSchemaManager(dbName);\n    schemaManager.dropIndex(indexName);\n  }\n\n  /**\n   * Execute a transaction.\n   *\n   * @typeParam T - Transaction return type\n   * @param fn - Transaction callback\n   * @returns Transaction result\n   *\n   * @remarks\n   * All operations in the callback execute atomically.\n   * If an error occurs, all changes are rolled back.\n   *\n   * @example\n   * ```typescript\n   * const result = driver.transaction(() => {\n   *   const user = driver.insert('default', 'users', { username: 'alice' });\n   *   driver.insert('default', 'profiles', { user_id: user.id, bio: 'Hello' });\n   *   return user;\n   * });\n   * ```\n   */\n  transaction<T>(fn: () => T): T {\n    const firstConnection = this.connections.values().next().value;\n    if (!firstConnection) {\n      throw new Error('No database connection available for transaction');\n    }\n    return firstConnection.transaction(fn);\n  }\n\n  /**\n   * Perform an aggregation operation.\n   *\n   * @param dbName - Database name\n   * @param tableName - Table name\n   * @param operation - Aggregation operation (SUM, AVG, MIN, MAX, COUNT)\n   * @param field - Field to aggregate\n   * @param where - Optional filter conditions\n   * @returns Aggregation result\n   *\n   * @example\n   * ```typescript\n   * const totalAge = driver.aggregate('default', 'users', 'SUM', 'age');\n   * const avgAge = driver.aggregate('default', 'users', 'AVG', 'age', {\n   *   status: 'active'\n   * });\n   * ```\n   */\n  aggregate(\n    dbName: string,\n    tableName: string,\n    operation: string,\n    field: string,\n    where?: Record<string, any>\n  ): number {\n    const queryBuilder = this.getQueryBuilder(dbName);\n    return queryBuilder.aggregate(tableName, operation, field, where);\n  }\n\n  /**\n   * Get the connection instance for a specific database.\n   *\n   * @param dbName - Database name\n   * @returns Connection instance\n   *\n   * @remarks\n   * Use this to access lower-level database operations or Bun SQLite features.\n   *\n   * @example\n   * ```typescript\n   * const conn = driver.getConnectionForDb('default');\n   * conn.vacuum();\n   * conn.analyze();\n   * ```\n   */\n  getConnectionForDb(dbName: string): Connection {\n    return this.getConnection(dbName);\n  }\n}\n"]}