{"version":3,"sources":["../src/drizzle-where.ts","../src/types/error.ts","../src/adapter.ts","../src/index.ts"],"names":["getColumns","and","or","not","eq","ne","gt","lt","gte","lte","like","ilike","inArray","notInArray","isNull","isNotNull","between","notBetween","desc","asc","result"],"mappings":"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","file":"index.cjs","sourcesContent":["// Translates WhereClause objects into Drizzle SQL conditions.\n// Used internally by the adapter's CRUD methods when a TableResolver is available.\n\nimport {\n  eq,\n  ne,\n  gt,\n  lt,\n  gte,\n  lte,\n  like,\n  ilike,\n  inArray,\n  notInArray,\n  isNull,\n  isNotNull,\n  between,\n  notBetween,\n  and,\n  or,\n  not,\n  type SQL,\n} from \"drizzle-orm\";\nimport { getColumns } from \"drizzle-orm\";\n\nimport type { WhereClause, WhereCondition } from \"./types\";\n\n// Build a Drizzle SQL condition from a WhereClause and a Drizzle table object.\n// Returns undefined if the where clause is empty.\nexport function buildDrizzleWhere(\n  table: Record<string, unknown>,\n  where: WhereClause\n): SQL | undefined {\n  const columns = getColumns(table as never);\n  return processWhereClause(columns, where);\n}\n\nfunction processWhereClause(\n  columns: Record<string, unknown>,\n  where: WhereClause\n): SQL | undefined {\n  const parts: SQL[] = [];\n\n  if (where.and?.length) {\n    const andParts = where.and\n      .map(item => {\n        if (isWhereCondition(item)) {\n          return buildCondition(columns, item);\n        }\n        return processWhereClause(columns, item);\n      })\n      .filter((p): p is SQL => p !== undefined);\n\n    if (andParts.length) {\n      parts.push(and(...andParts)!);\n    }\n  }\n\n  if (where.or?.length) {\n    const orParts = where.or\n      .map(item => {\n        if (isWhereCondition(item)) {\n          return buildCondition(columns, item);\n        }\n        return processWhereClause(columns, item);\n      })\n      .filter((p): p is SQL => p !== undefined);\n\n    if (orParts.length) {\n      parts.push(or(...orParts)!);\n    }\n  }\n\n  if (where.not) {\n    const notItem = where.not;\n    const notCondition = isWhereCondition(notItem)\n      ? buildCondition(columns, notItem)\n      : processWhereClause(columns, notItem);\n\n    if (notCondition) {\n      parts.push(not(notCondition));\n    }\n  }\n\n  if (parts.length === 0) return undefined;\n  if (parts.length === 1) return parts[0];\n  return and(...parts);\n}\n\nfunction isWhereCondition(\n  item: WhereCondition | WhereClause\n): item is WhereCondition {\n  return \"column\" in item && \"op\" in item;\n}\n\nfunction buildCondition(\n  columns: Record<string, unknown>,\n  cond: WhereCondition\n): SQL {\n  const column = columns[cond.column];\n  if (!column) {\n    throw new Error(\n      `Column \"${cond.column}\" not found in table. Available: ${Object.keys(columns).join(\", \")}`\n    );\n  }\n\n  const col = column as never;\n\n  switch (cond.op) {\n    case \"=\":\n      return eq(col, cond.value);\n    case \"!=\":\n      return ne(col, cond.value);\n    case \">\":\n      return gt(col, cond.value);\n    case \"<\":\n      return lt(col, cond.value);\n    case \">=\":\n      return gte(col, cond.value);\n    case \"<=\":\n      return lte(col, cond.value);\n    case \"LIKE\":\n      return like(col, cond.value as string);\n    case \"ILIKE\":\n      return ilike(col, cond.value as string);\n    case \"IN\":\n      return inArray(col, cond.value as unknown[]);\n    case \"NOT IN\":\n      return notInArray(col, cond.value as unknown[]);\n    case \"IS NULL\":\n      return isNull(col);\n    case \"IS NOT NULL\":\n      return isNotNull(col);\n    case \"BETWEEN\":\n      return between(col, cond.value, cond.valueTo);\n    case \"NOT BETWEEN\":\n      return notBetween(col, cond.value, cond.valueTo);\n    case \"CONTAINS\":\n      // JSON contains - fall back to LIKE for basic support\n      return like(col, `%${String(cond.value)}%`);\n    default:\n      throw new Error(`Unsupported operator: ${cond.op}`);\n  }\n}\n","/**\n * Database error type definitions.\n *\n * @packageDocumentation\n */\n\n/**\n * Database error classification.\n *\n * @remarks\n * Categorizes database errors for consistent error handling across adapters.\n * Each adapter translates database-specific error codes to these kinds.\n *\n * @public\n */\nexport type DatabaseErrorKind =\n  | \"connection\" // Connection/network errors\n  | \"query\" // Syntax or execution errors\n  | \"constraint\" // Generic constraint violation\n  | \"unique_violation\" // Unique constraint violation\n  | \"foreign_key_violation\" // Foreign key constraint violation\n  | \"check_violation\" // Check constraint violation\n  | \"not_null_violation\" // NOT NULL constraint violation\n  | \"deadlock\" // Transaction deadlock\n  | \"timeout\" // Query or connection timeout\n  | \"serialization_failure\" // Serializable transaction conflict\n  | \"unsupported_version\" // F17: DB version below minimum or unparseable at connect\n  | \"unknown\"; // Unclassified error\n\n/**\n * Enhanced database error interface.\n *\n * @remarks\n * Extends the standard Error interface with database-specific context.\n * Adapters should throw errors implementing this interface for consistent\n * error handling.\n *\n * @example\n * ```typescript\n * try {\n *   await adapter.insert('users', { email: 'duplicate@example.com' });\n * } catch (error) {\n *   if (isDatabaseError(error) && error.kind === 'unique_violation') {\n *     console.log(`Duplicate ${error.column} in ${error.table}`);\n *   }\n * }\n * ```\n *\n * @public\n */\nexport interface DatabaseError extends Error {\n  /** Error classification */\n  kind: DatabaseErrorKind;\n\n  /** Database-specific error code (e.g., \"23505\" for PostgreSQL unique violation) */\n  code?: string;\n\n  /** Constraint name that was violated (if applicable) */\n  constraint?: string;\n\n  /** Table name involved in the error */\n  table?: string;\n\n  /** Column name involved in the error */\n  column?: string;\n\n  /** Detailed error description from the database */\n  detail?: string;\n\n  /** Hint for resolving the error */\n  hint?: string;\n\n  /** Original error from the database driver */\n  cause?: Error;\n}\n\n/**\n * Type guard for DatabaseError.\n *\n * @remarks\n * Checks if an error is a DatabaseError with proper typing.\n *\n * @param error - Error to check\n * @returns True if error is a DatabaseError\n *\n * @public\n */\nexport function isDatabaseError(error: unknown): error is DatabaseError {\n  return (\n    typeof error === \"object\" &&\n    error !== null &&\n    \"kind\" in error &&\n    typeof (error as DatabaseError).kind === \"string\"\n  );\n}\n\n/**\n * Database error constructor options.\n *\n * @public\n */\nexport interface DatabaseErrorOptions {\n  /** Error classification */\n  kind: DatabaseErrorKind;\n\n  /** Error message */\n  message: string;\n\n  /** Database-specific error code */\n  code?: string;\n\n  /** Constraint name */\n  constraint?: string;\n\n  /** Table name */\n  table?: string;\n\n  /** Column name */\n  column?: string;\n\n  /** Detailed description */\n  detail?: string;\n\n  /** Resolution hint */\n  hint?: string;\n\n  /** Original error */\n  cause?: Error;\n}\n\n/**\n * Create a DatabaseError instance.\n *\n * @remarks\n * Helper function to create properly structured DatabaseError objects.\n *\n * @param options - Error options\n * @returns DatabaseError instance\n *\n * @public\n */\nexport function createDatabaseError(\n  options: DatabaseErrorOptions\n): DatabaseError {\n  const error = new Error(options.message) as DatabaseError;\n  error.name = \"DatabaseError\";\n  error.kind = options.kind;\n\n  if (options.code !== undefined) error.code = options.code;\n  if (options.constraint !== undefined) error.constraint = options.constraint;\n  if (options.table !== undefined) error.table = options.table;\n  if (options.column !== undefined) error.column = options.column;\n  if (options.detail !== undefined) error.detail = options.detail;\n  if (options.hint !== undefined) error.hint = options.hint;\n  if (options.cause !== undefined) error.cause = options.cause;\n\n  return error;\n}\n","/**\n * Base database adapter abstract class.\n *\n * @remarks\n * This abstract class provides the foundation for all dialect-specific database adapters\n * (PostgreSQL, MySQL, SQLite). It defines required abstract methods that must be implemented\n * by subclasses, while providing default implementations for CRUD operations and query building.\n *\n * Dialect adapters can override any default method to provide optimized implementations.\n *\n * @packageDocumentation\n */\n\nimport { asc, desc, getColumns } from \"drizzle-orm\";\nimport type { AnyRelations } from \"drizzle-orm\";\n\nimport { buildDrizzleWhere } from \"./drizzle-where\";\nimport type {\n  SupportedDialect,\n  SqlParam,\n  WhereClause,\n  OrderBySpec,\n  SelectOptions,\n  InsertOptions,\n  UpdateOptions,\n  DeleteOptions,\n  UpsertOptions,\n  TransactionContext,\n  TransactionOptions,\n  DatabaseCapabilities,\n  PoolStats,\n  DatabaseError,\n  DatabaseErrorKind,\n  Migration,\n  MigrationResult,\n  TableDefinition,\n  CreateTableOptions,\n  DropTableOptions,\n  AlterTableOptions,\n  AlterTableOperation,\n  TableResolver,\n} from \"./types\";\nimport { createDatabaseError, isDatabaseError } from \"./types\";\n\n/**\n * Abstract base class for database adapters.\n *\n * @remarks\n * All dialect-specific adapters must extend this class and implement the abstract methods.\n * Default implementations are provided for CRUD operations, which can be overridden for\n * optimization or dialect-specific behavior.\n *\n * ## Required Implementations\n *\n * Subclasses must implement:\n * - `dialect` - Database dialect identifier\n * - `connect()` - Establish database connection\n * - `disconnect()` - Close database connection\n * - `executeQuery()` - Execute raw SQL query\n * - `transaction()` - Execute operations within a transaction\n * - `getCapabilities()` - Report database feature support\n *\n * ## Optional Overrides\n *\n * Subclasses can override default CRUD methods for optimization:\n * - `select()`, `selectOne()` - Custom query optimization\n * - `insert()`, `insertMany()` - Bulk insert optimization\n * - `update()`, `delete()` - Custom update/delete logic\n * - `upsert()` - Dialect-specific upsert syntax\n *\n * @example\n * ```typescript\n * export class PostgresAdapter extends DrizzleAdapter {\n *   readonly dialect = 'postgresql' as const;\n *\n *   async connect() {\n *     this.pool = new Pool({ connectionString: this.config.url });\n *     // ... connection logic\n *   }\n *\n *   async executeQuery<T>(sql: string, params?: SqlParam[]) {\n *     const result = await this.pool.query(sql, params);\n *     return result.rows as T[];\n *   }\n *\n *   // ... other required methods\n * }\n * ```\n *\n * @public\n */\n/**\n * Rows affected by a write, normalised across the driver shapes Drizzle returns.\n *\n * mysql2 resolves to `[ResultSetHeader, FieldPacket[]]`, so treating any array\n * as a row list reports the tuple length — a constant 2 whether the statement\n * matched nothing, one row, or many. Callers that branch on the count (a\n * conditional claim, a retention loop) silently get the wrong answer on MySQL,\n * so the header is read first. node-postgres reports `rowCount` and\n * better-sqlite3 reports `changes`; a plain array is a RETURNING row list, whose\n * length is the count.\n */\nfunction affectedRowCount(result: unknown): number {\n  if (Array.isArray(result)) {\n    const header = result[0] as { affectedRows?: unknown } | undefined;\n    if (header && typeof header.affectedRows === \"number\") {\n      return header.affectedRows;\n    }\n    return result.length;\n  }\n  const record = result as Record<string, unknown> | null | undefined;\n  const rowCount = record?.rowCount;\n  if (typeof rowCount === \"number\") return rowCount;\n  const changes = record?.changes;\n  if (typeof changes === \"number\") return changes;\n  return 0;\n}\n\nexport abstract class DrizzleAdapter {\n  // ============================================================\n  // Abstract Methods (MUST be implemented by subclasses)\n  // ============================================================\n\n  /**\n   * Database dialect identifier.\n   *\n   * @remarks\n   * Must be set by subclass to identify the database type.\n   */\n  abstract readonly dialect: SupportedDialect;\n\n  /**\n   * Establish connection to the database.\n   *\n   * @remarks\n   * This method should be idempotent - calling it multiple times\n   * should not create multiple connections.\n   *\n   * @throws {DatabaseError} If connection fails\n   */\n  abstract connect(): Promise<void>;\n\n  /**\n   * Close database connection and release resources.\n   *\n   * @remarks\n   * This method should be idempotent - calling it multiple times\n   * should be safe.\n   */\n  abstract disconnect(): Promise<void>;\n\n  /**\n   * Execute a raw SQL query.\n   *\n   * @param sql - SQL query to execute\n   * @param params - Query parameters\n   * @returns Array of result rows\n   *\n   * @throws {DatabaseError} If query execution fails\n   */\n  abstract executeQuery<T = unknown>(\n    sql: string,\n    params?: SqlParam[]\n  ): Promise<T[]>;\n\n  /**\n   * Execute operations within a database transaction.\n   *\n   * @remarks\n   * The transaction is automatically committed on success or rolled back on error.\n   * Supports nested transactions via savepoints on databases that support them.\n   *\n   * @param callback - Function to execute within transaction\n   * @param options - Transaction options\n   * @returns Result from the callback\n   *\n   * @throws {DatabaseError} If transaction fails\n   */\n  abstract transaction<T>(\n    callback: (ctx: TransactionContext) => Promise<T>,\n    options?: TransactionOptions\n  ): Promise<T>;\n\n  /**\n   * Get database capabilities.\n   *\n   * @remarks\n   * Returns static capability flags for this adapter's dialect.\n   * Used by services to conditionally enable features or implement fallbacks.\n   *\n   * @returns Database capability flags\n   */\n  abstract getCapabilities(): DatabaseCapabilities;\n\n  /**\n   * Get the raw Drizzle ORM instance for direct queries.\n   *\n   * @remarks\n   * This method provides escape hatch access to the raw Drizzle instance.\n   * Use this when you need to run complex queries that the adapter API\n   * doesn't support, or for legacy code migration.\n   *\n   * **Note:** Prefer using adapter methods when possible as they provide:\n   * - Database-agnostic API\n   * - Consistent error handling\n   * - Proper connection pooling\n   *\n   * @param relations - Optional drizzle v1 relations config (defineRelations\n   *   output) that enables the typed relational query API on the instance\n   * @returns Raw Drizzle ORM database instance\n   *\n   * @example\n   * ```typescript\n   * // For legacy code that needs direct Drizzle access\n   * const db = adapter.getDrizzle(myRelations); // defineRelations output\n   * const result = await db.insert(users).values({ ... }).returning();\n   * ```\n   */\n  abstract getDrizzle<T = unknown>(relations?: AnyRelations): T;\n\n  // ============================================================\n  // Drizzle Query API Support\n  // ============================================================\n\n  /**\n   * Table resolver for looking up Drizzle table objects by name.\n   * When set, CRUD methods use Drizzle's query API instead of raw SQL.\n   * Set via setTableResolver() after boot-time schema loading.\n   */\n  protected tableResolver: TableResolver | null = null;\n\n  /**\n   * Set the table resolver for Drizzle query API support.\n   * When a resolver is set, CRUD methods (select, insert, update, delete, upsert)\n   * will use Drizzle's query API (db.select().from(), etc.) instead of raw SQL\n   * string building. Falls back to raw SQL if the resolver doesn't have the table.\n   *\n   * @param resolver - TableResolver implementation (e.g. SchemaRegistry)\n   */\n  setTableResolver(resolver: TableResolver): void {\n    this.tableResolver = resolver;\n  }\n\n  /**\n   * Get a Drizzle table object by name from the resolver.\n   * Returns null if no resolver is set or table is not found.\n   */\n  protected getTableObject(tableName: string): unknown {\n    return this.tableResolver?.getTable(tableName) ?? null;\n  }\n\n  /**\n   * Map data keys from SQL column names (snake_case) to Drizzle JS property names (camelCase).\n   * Drizzle schemas define columns as e.g. `createdAt: timestamp(\"created_at\")` — the JS\n   * property is `createdAt` but the SQL column is `created_at`. Services pass snake_case keys\n   * because they match the DB column names. This method maps them to the JS names Drizzle expects.\n   */\n  protected mapDataToColumnNames(\n    tableObj: unknown,\n    data: Record<string, unknown>\n  ): Record<string, unknown> {\n    if (!tableObj || typeof tableObj !== \"object\") return data;\n\n    // Build maps: SQL column name -> JS property name, and JS name -> column metadata\n    const sqlToJs = new Map<string, string>();\n    const jsonColumns = new Set<string>();\n\n    for (const [jsName, colDef] of Object.entries(\n      tableObj as Record<string, unknown>\n    )) {\n      if (\n        !colDef ||\n        typeof colDef !== \"object\" ||\n        !(\"name\" in colDef) ||\n        typeof colDef.name !== \"string\"\n      )\n        continue;\n      const sqlName = (colDef as { name: string }).name;\n      sqlToJs.set(sqlName, jsName);\n\n      // Detect JSON/JSONB columns — Drizzle auto-serializes objects for these,\n      // so pre-stringified values must be parsed to avoid double-encoding.\n      const dataType = (colDef as { dataType?: string }).dataType;\n      const columnType = (colDef as { columnType?: string }).columnType;\n      // Detect JSON/JSONB columns — Drizzle auto-serializes objects for these,\n      // so pre-stringified values must be parsed to avoid double-encoding.\n      // IMPORTANT: For SQLite, only match text columns declared with { mode: \"json\" }\n      // (columnType \"SQLiteTextJson\", dataType \"json\"). Plain SQLiteText columns\n      // (dataType \"string\") store pre-serialized strings and must NOT be re-parsed,\n      // otherwise better-sqlite3 receives objects it cannot bind.\n      if (\n        dataType === \"json\" ||\n        columnType === \"PgJsonb\" ||\n        columnType === \"PgJson\" ||\n        columnType === \"MySqlJson\" ||\n        columnType === \"SQLiteTextJson\" // SQLite JSON-mode text columns only\n      ) {\n        jsonColumns.add(jsName);\n      }\n    }\n\n    // If no mappings found, return data as-is\n    if (sqlToJs.size === 0) return data;\n\n    const mapped: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(data)) {\n      const jsKey = sqlToJs.get(key) ?? key;\n      // Parse pre-stringified JSON for JSON/JSONB columns to avoid double-encoding\n      if (jsonColumns.has(jsKey) && typeof value === \"string\") {\n        try {\n          mapped[jsKey] = JSON.parse(value);\n        } catch {\n          mapped[jsKey] = value;\n        }\n      } else {\n        mapped[jsKey] = value;\n      }\n    }\n    return mapped;\n  }\n\n  /**\n   * Map data keys from Drizzle JS property names to SQL column names for the\n   * raw-SQL transaction insert path. The transaction context builds INSERT\n   * statements from Object.keys(data) used directly as column identifiers, so a\n   * table whose Drizzle property names differ from its SQL column names\n   * (camelCase core tables like nextly_versions) needs its keys translated\n   * first. For tables whose property names already equal their column names\n   * (the dynamic dc_/single_/comp_ tables) every lookup is identity, so\n   * existing callers are unaffected.\n   */\n  protected mapKeysToSqlColumns(\n    tableObj: unknown,\n    data: Record<string, unknown>\n  ): Record<string, unknown> {\n    if (!tableObj || typeof tableObj !== \"object\") return data;\n\n    const jsToSql = new Map<string, string>();\n    for (const [jsName, colDef] of Object.entries(\n      tableObj as Record<string, unknown>\n    )) {\n      if (\n        colDef &&\n        typeof colDef === \"object\" &&\n        \"name\" in colDef &&\n        typeof (colDef as { name?: unknown }).name === \"string\"\n      ) {\n        jsToSql.set(jsName, (colDef as { name: string }).name);\n      }\n    }\n    if (jsToSql.size === 0) return data;\n\n    const out: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(data)) {\n      out[jsToSql.get(key) ?? key] = value;\n    }\n    return out;\n  }\n\n  /**\n   * Map a list of column identifiers (Drizzle property names) to their SQL\n   * column names, for the raw-SQL transaction insert paths that build a\n   * RETURNING clause from `options.returning`. Same identity behavior as\n   * `mapKeysToSqlColumns`: names that are already SQL columns (the dynamic\n   * dc_/single_/comp_ tables) pass through unchanged.\n   */\n  protected mapColumnNamesToSql(tableObj: unknown, names: string[]): string[] {\n    if (!tableObj || typeof tableObj !== \"object\") return names;\n\n    const jsToSql = new Map<string, string>();\n    for (const [jsName, colDef] of Object.entries(\n      tableObj as Record<string, unknown>\n    )) {\n      if (\n        colDef &&\n        typeof colDef === \"object\" &&\n        \"name\" in colDef &&\n        typeof (colDef as { name?: unknown }).name === \"string\"\n      ) {\n        jsToSql.set(jsName, (colDef as { name: string }).name);\n      }\n    }\n    if (jsToSql.size === 0) return names;\n\n    return names.map(n => jsToSql.get(n) ?? n);\n  }\n\n  /**\n   * Remap a raw-SQL result row's KEYS from SQL column names to Drizzle property\n   * names, so the raw-SQL transaction insert paths return the same key casing\n   * as the non-transactional (Drizzle) insert. Keys only - values are left\n   * untouched, so this does not change how JSON/date columns are decoded. For\n   * tables whose property names already equal their SQL columns (the dynamic\n   * dc_/single_/comp_ tables) every lookup is identity, so existing callers see\n   * no change.\n   */\n  protected mapRowKeysToJs<T = unknown>(tableObj: unknown, row: T): T {\n    if (\n      !tableObj ||\n      typeof tableObj !== \"object\" ||\n      !row ||\n      typeof row !== \"object\"\n    ) {\n      return row;\n    }\n\n    const sqlToJs = new Map<string, string>();\n    for (const [jsName, colDef] of Object.entries(\n      tableObj as Record<string, unknown>\n    )) {\n      if (\n        colDef &&\n        typeof colDef === \"object\" &&\n        \"name\" in colDef &&\n        typeof (colDef as { name?: unknown }).name === \"string\"\n      ) {\n        sqlToJs.set((colDef as { name: string }).name, jsName);\n      }\n    }\n    if (sqlToJs.size === 0) return row;\n\n    const out: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(row as Record<string, unknown>)) {\n      out[sqlToJs.get(key) ?? key] = value;\n    }\n    return out as T;\n  }\n\n  /**\n   * Build a Drizzle column projection object (`{ propertyName: column }`) from a\n   * requested column list, used by `select` (columns) and `insert` (returning).\n   * A requested name resolves against either the Drizzle property name\n   * (camelCase) or the SQL column name (snake_case); the projection is keyed by\n   * the property name so the row shape matches a full select. Returns undefined\n   * for `\"*\"` or when nothing resolves, so callers fall back to all columns.\n   */\n  protected buildColumnProjection(\n    tableObj: unknown,\n    names: string[] | \"*\" | undefined\n  ): Record<string, unknown> | undefined {\n    if (\n      names == null ||\n      names === \"*\" ||\n      !tableObj ||\n      typeof tableObj !== \"object\"\n    ) {\n      return undefined;\n    }\n    const cols = getColumns(tableObj as never);\n    const byAnyName: Record<string, { jsName: string; col: unknown }> = {};\n    for (const [jsName, col] of Object.entries(cols)) {\n      byAnyName[jsName] = { jsName, col };\n      const sqlName = (col as { name?: unknown })?.name;\n      if (typeof sqlName === \"string\") byAnyName[sqlName] = { jsName, col };\n    }\n    const projection: Record<string, unknown> = {};\n    for (const name of names) {\n      const hit = byAnyName[name];\n      if (hit) projection[hit.jsName] = hit.col;\n    }\n    return Object.keys(projection).length ? projection : undefined;\n  }\n\n  // ============================================================\n  // Connection Status (Default implementations, can override)\n  // ============================================================\n\n  /**\n   * Check if the adapter is currently connected.\n   *\n   * @remarks\n   * Default implementation returns false. Subclasses should override\n   * to provide accurate connection status.\n   *\n   * @returns True if connected, false otherwise\n   */\n  isConnected(): boolean {\n    return false;\n  }\n\n  /**\n   * Get connection pool statistics.\n   *\n   * @remarks\n   * Returns null by default. Subclasses with connection pooling\n   * should override to provide pool statistics.\n   *\n   * @returns Pool statistics or null if not applicable\n   */\n  getPoolStats(): PoolStats | null {\n    return null;\n  }\n\n  // ============================================================\n  // Timeout Utilities\n  // ============================================================\n\n  /**\n   * Default query timeout in milliseconds.\n   *\n   * @remarks\n   * This value is used by executeWithTimeout() when no explicit timeout\n   * is provided. Subclasses should set this from their config.\n   *\n   * @default 15000 (15 seconds)\n   *\n   * @protected\n   */\n  protected defaultQueryTimeoutMs: number = 15000;\n\n  /**\n   * Execute an async operation with a timeout.\n   *\n   * @remarks\n   * Wraps an async operation with a timeout that aborts if the operation\n   * exceeds the specified duration. Uses Promise.race for clean timeout\n   * handling without memory leaks.\n   *\n   * When the timeout is reached, a DatabaseError with kind 'timeout' is thrown.\n   * Note that this does NOT cancel the underlying database query - it only\n   * prevents the calling code from waiting indefinitely. For true query\n   * cancellation, use database-level statement timeouts (PostgreSQL) or\n   * similar mechanisms.\n   *\n   * @param operation - Async operation to execute\n   * @param timeoutMs - Timeout in milliseconds (defaults to defaultQueryTimeoutMs)\n   * @returns Result of the operation\n   *\n   * @throws {DatabaseError} With kind 'timeout' if operation exceeds timeout\n   *\n   * @example\n   * ```typescript\n   * // Use default timeout\n   * const result = await adapter.executeWithTimeout(\n   *   () => adapter.select('users', { limit: 1000 })\n   * );\n   *\n   * // Use custom timeout for specific operation\n   * const result = await adapter.executeWithTimeout(\n   *   () => adapter.select('large_table'),\n   *   60000 // 60 seconds for large queries\n   * );\n   * ```\n   *\n   * @public\n   */\n  async executeWithTimeout<T>(\n    operation: () => Promise<T>,\n    timeoutMs?: number\n  ): Promise<T> {\n    const timeout = timeoutMs ?? this.defaultQueryTimeoutMs;\n\n    // If timeout is 0 or negative, execute without timeout\n    if (timeout <= 0) {\n      return operation();\n    }\n\n    // Create a timeout promise that rejects after the specified duration\n    let timeoutId: ReturnType<typeof setTimeout> | undefined;\n    const timeoutPromise = new Promise<never>((_, reject) => {\n      timeoutId = setTimeout(() => {\n        reject(\n          this.createDatabaseError(\n            \"timeout\",\n            `Query execution timed out after ${timeout}ms`\n          )\n        );\n      }, timeout);\n    });\n\n    try {\n      // Race between the operation and the timeout\n      const result = await Promise.race([operation(), timeoutPromise]);\n      return result;\n    } finally {\n      // Always clear the timeout to prevent memory leaks\n      if (timeoutId !== undefined) {\n        clearTimeout(timeoutId);\n      }\n    }\n  }\n\n  /**\n   * Set the default query timeout.\n   *\n   * @remarks\n   * This method allows runtime configuration of the default timeout.\n   * Subclasses should call this in their constructor or connect() method\n   * based on their configuration.\n   *\n   * @param timeoutMs - Timeout in milliseconds (0 to disable)\n   *\n   * @protected\n   */\n  protected setDefaultQueryTimeout(timeoutMs: number): void {\n    this.defaultQueryTimeoutMs = timeoutMs;\n  }\n\n  /**\n   * Get the current default query timeout.\n   *\n   * @returns Current default timeout in milliseconds\n   *\n   * @public\n   */\n  getDefaultQueryTimeout(): number {\n    return this.defaultQueryTimeoutMs;\n  }\n\n  // ============================================================\n  // CRUD Operations (Default implementations, can override)\n  // ============================================================\n\n  /**\n   * Select multiple records from a table.\n   *\n   * @remarks\n   * Default implementation builds a SELECT query and executes it.\n   * Subclasses can override for optimization or dialect-specific features.\n   *\n   * @param table - Table name\n   * @param options - Select options (filtering, sorting, pagination)\n   * @returns Array of matching records\n   *\n   * @throws {DatabaseError} If query fails\n   *\n   * @example\n   * ```typescript\n   * const users = await adapter.select('users', {\n   *   where: { and: [{ column: 'role', op: '=', value: 'admin' }] },\n   *   orderBy: [{ column: 'created_at', direction: 'desc' }],\n   *   limit: 10\n   * });\n   * ```\n   */\n  async select<T = unknown>(\n    table: string,\n    options?: SelectOptions,\n    executor?: unknown\n  ): Promise<T[]> {\n    // Drizzle query API path: use when table resolver has a Drizzle table object\n    const tableObj = this.getTableObject(table);\n    if (tableObj) {\n      try {\n        // Run on the transaction's executor when one is supplied, otherwise the\n        // pooled instance. Without this, a read inside a transaction would use\n        // the pool and miss rows written earlier in the same uncommitted tx.\n        // getDrizzle() returns unknown - explicit any generic for dialect-specific Drizzle API\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const db = executor ?? this.getDrizzle<any>();\n        // Honor the columns projection when provided: select only the requested\n        // columns instead of every column, so callers can avoid transferring\n        // large columns (e.g. JSON snapshots) they do not need. Falls back to a\n        // full select when no columns are requested or none resolve.\n        const projection = options?.columns?.length\n          ? this.buildColumnProjection(tableObj, options.columns)\n          : undefined;\n        let query = projection\n          ? db.select(projection).from(tableObj)\n          : db.select().from(tableObj);\n\n        if (options?.where) {\n          const whereCondition = buildDrizzleWhere(\n            tableObj as never,\n            options.where\n          );\n          if (whereCondition) {\n            query = query.where(whereCondition);\n          }\n        }\n\n        if (options?.orderBy?.length) {\n          const columns = getColumns(tableObj as never);\n          const orderClauses = options.orderBy\n            .map((o: OrderBySpec) => {\n              const col = columns[o.column];\n              if (!col) return undefined;\n              return o.direction === \"desc\" ? desc(col) : asc(col);\n            })\n            .filter(Boolean);\n          if (orderClauses.length) {\n            query = query.orderBy(...orderClauses);\n          }\n        }\n\n        if (options?.limit !== undefined) {\n          query = query.limit(options.limit);\n        }\n\n        if (options?.offset !== undefined) {\n          query = query.offset(options.offset);\n        }\n\n        // A lock request is only meaningful inside a transaction, on EVERY\n        // dialect. On the row-locking dialects the pooled connection autocommits\n        // the SELECT, releasing the lock the instant it returns; on SQLite the\n        // lock IS the transaction (BEGIN IMMEDIATE serializes writers), so a\n        // pooled call takes no lock at all. Either way a `forUpdate` without a\n        // transaction executor is silent false safety and reopens the TOCTOU\n        // window it was meant to close, so fail fast regardless of dialect.\n        if (options?.forUpdate && !executor) {\n          throw this.createDatabaseError(\n            \"query\",\n            \"forUpdate requires a transaction executor: a lock request on the pooled connection takes no durable lock and cannot prevent a concurrent write.\",\n            undefined\n          );\n        }\n\n        // Row-lock the selected rows for the rest of the transaction and read the\n        // latest committed values (not the transaction's snapshot). SQLite has no\n        // FOR UPDATE and needs none (BEGIN IMMEDIATE serializes its writers), so\n        // it is skipped there.\n        if (options?.forUpdate && this.dialect !== \"sqlite\") {\n          query = query.for(\"update\");\n        }\n\n        return (await query) as T[];\n      } catch (error) {\n        throw this.handleQueryError(error, \"select\", table);\n      }\n    }\n\n    // Table not found in schema registry - cannot use Drizzle query API\n    throw this.createDatabaseError(\n      \"query\",\n      `Table \"${table}\" not found in schema registry. Ensure setTableResolver() has been called during boot.`,\n      undefined\n    );\n  }\n\n  /**\n   * Select a single record from a table.\n   *\n   * @remarks\n   * Default implementation uses `select()` with limit 1 and returns first result.\n   * Returns null if no matching record is found.\n   *\n   * @param table - Table name\n   * @param options - Select options\n   * @returns First matching record or null\n   *\n   * @throws {DatabaseError} If query fails\n   *\n   * @example\n   * ```typescript\n   * const user = await adapter.selectOne('users', {\n   *   where: { and: [{ column: 'email', op: '=', value: 'user@example.com' }] }\n   * });\n   * ```\n   */\n  async selectOne<T = unknown>(\n    table: string,\n    options?: SelectOptions,\n    executor?: unknown\n  ): Promise<T | null> {\n    const results = await this.select<T>(\n      table,\n      { ...options, limit: 1 },\n      executor\n    );\n    return results.length > 0 ? results[0] : null;\n  }\n\n  /**\n   * Insert a single record into a table.\n   *\n   * @remarks\n   * Default implementation handles databases with and without RETURNING support.\n   * For databases without RETURNING (MySQL), performs INSERT followed by SELECT.\n   *\n   * @param table - Table name\n   * @param data - Record data to insert\n   * @param options - Insert options\n   * @returns Inserted record (with RETURNING columns if specified)\n   *\n   * @throws {DatabaseError} If insert fails\n   *\n   * @example\n   * ```typescript\n   * const user = await adapter.insert('users', {\n   *   email: 'user@example.com',\n   *   name: 'John Doe'\n   * }, { returning: ['id', 'email', 'created_at'] });\n   * ```\n   */\n  async insert<T = unknown>(\n    table: string,\n    data: Record<string, unknown>,\n    options?: InsertOptions\n  ): Promise<T> {\n    // Drizzle query API path\n    const tableObj = this.getTableObject(table);\n    if (tableObj) {\n      try {\n        // Map snake_case keys to Drizzle JS property names\n        const mappedData = this.mapDataToColumnNames(tableObj, data);\n        // getDrizzle() returns unknown - explicit any generic for dialect-specific Drizzle API\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const db = this.getDrizzle<any>();\n        const caps = this.getCapabilities();\n\n        const returning = options?.returning;\n        // An empty array means \"no columns back\": skip RETURNING entirely and,\n        // on MySQL, skip the select-back reread. Useful for callers that ignore\n        // the insert result and don't want a large row (e.g. a JSON snapshot)\n        // materialized. `\"*\"` returns all; a specific list is projected.\n        const wantsReturning =\n          returning != null &&\n          !(Array.isArray(returning) && returning.length === 0);\n\n        if (caps.supportsReturning && wantsReturning) {\n          const projection = this.buildColumnProjection(tableObj, returning);\n          const insertQuery = db.insert(tableObj).values(mappedData);\n          const result = await (projection\n            ? insertQuery.returning(projection)\n            : insertQuery.returning());\n          return (Array.isArray(result) ? result[0] : result) as T;\n        }\n\n        const result = await db.insert(tableObj).values(mappedData);\n\n        // For databases without RETURNING (MySQL): select back the inserted\n        // record, projecting only the requested columns so unrequested ones\n        // (a large JSON snapshot) are not read and decoded.\n        if (\n          !caps.supportsReturning &&\n          wantsReturning &&\n          data.id !== undefined\n        ) {\n          return (await this.selectOne<T>(table, {\n            columns: returning === \"*\" ? undefined : returning,\n            where: {\n              and: [{ column: \"id\", op: \"=\", value: data.id as SqlParam }],\n            },\n          })) as T;\n        }\n\n        return (Array.isArray(result) ? result[0] : result) as T;\n      } catch (error) {\n        throw this.handleQueryError(error, \"insert\", table);\n      }\n    }\n\n    throw this.createDatabaseError(\n      \"query\",\n      `Table \"${table}\" not found in schema registry. Ensure setTableResolver() has been called during boot.`,\n      undefined\n    );\n  }\n\n  /**\n   * Insert multiple records into a table.\n   *\n   * @remarks\n   * Default implementation performs individual inserts in sequence.\n   * Subclasses can override for bulk insert optimization (e.g., COPY in PostgreSQL).\n   *\n   * @param table - Table name\n   * @param data - Array of records to insert\n   * @param options - Insert options\n   * @returns Inserted records (with RETURNING columns if specified)\n   *\n   * @throws {DatabaseError} If insert fails\n   *\n   * @example\n   * ```typescript\n   * const users = await adapter.insertMany('users', [\n   *   { email: 'user1@example.com', name: 'User 1' },\n   *   { email: 'user2@example.com', name: 'User 2' }\n   * ], { returning: ['id'] });\n   * ```\n   */\n  async insertMany<T = unknown>(\n    table: string,\n    data: Record<string, unknown>[],\n    options?: InsertOptions\n  ): Promise<T[]> {\n    if (data.length === 0) {\n      return [];\n    }\n\n    // Default implementation: insert one by one\n    // Subclasses can override for bulk optimization\n    const results: T[] = [];\n    for (const record of data) {\n      const result = await this.insert<T>(table, record, options);\n      results.push(result);\n    }\n    return results;\n  }\n\n  /**\n   * Update records in a table.\n   *\n   * @remarks\n   * Default implementation builds an UPDATE query with WHERE clause.\n   * Returns updated records if RETURNING is supported and requested.\n   *\n   * @param table - Table name\n   * @param data - Data to update\n   * @param where - Conditions for records to update\n   * @param options - Update options\n   * @returns Updated records (with RETURNING columns if specified)\n   *\n   * @throws {DatabaseError} If update fails\n   *\n   * @example\n   * ```typescript\n   * const updated = await adapter.update('users',\n   *   { status: 'active' },\n   *   { and: [{ column: 'id', op: '=', value: userId }] },\n   *   { returning: ['id', 'status', 'updated_at'] }\n   * );\n   * ```\n   */\n  async update<T = unknown>(\n    table: string,\n    data: Record<string, unknown>,\n    where: WhereClause,\n    options?: UpdateOptions,\n    executor?: unknown\n  ): Promise<T[]> {\n    // Drizzle query API path\n    const tableObj = this.getTableObject(table);\n    if (tableObj) {\n      try {\n        // Transaction executor when supplied, otherwise the pooled instance.\n        // getDrizzle() returns unknown - explicit any generic for dialect-specific Drizzle API\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const db = executor ?? this.getDrizzle<any>();\n        const caps = this.getCapabilities();\n        // Map snake_case keys to Drizzle JS property names\n        const mappedData = this.mapDataToColumnNames(tableObj, data);\n        let query = db.update(tableObj).set(mappedData);\n\n        const whereCondition = buildDrizzleWhere(tableObj as never, where);\n        if (whereCondition) {\n          query = query.where(whereCondition);\n        }\n\n        if (caps.supportsReturning && options?.returning) {\n          return (await query.returning()) as T[];\n        }\n\n        await query;\n\n        // For databases without RETURNING: select back the updated records on\n        // the same executor so a transactional update reads its own writes.\n        if (!caps.supportsReturning && options?.returning) {\n          return await this.select<T>(table, { where }, executor);\n        }\n\n        return [] as T[];\n      } catch (error) {\n        throw this.handleQueryError(error, \"update\", table);\n      }\n    }\n\n    throw this.createDatabaseError(\n      \"query\",\n      `Table \"${table}\" not found in schema registry. Ensure setTableResolver() has been called during boot.`,\n      undefined\n    );\n  }\n\n  /**\n   * Delete records from a table.\n   *\n   * @remarks\n   * Default implementation builds a DELETE query with WHERE clause.\n   * Returns the number of deleted records.\n   *\n   * @param table - Table name\n   * @param where - Conditions for records to delete\n   * @param options - Delete options\n   * @returns Number of deleted records\n   *\n   * @throws {DatabaseError} If delete fails\n   *\n   * @example\n   * ```typescript\n   * const count = await adapter.delete('users', {\n   *   and: [{ column: 'status', op: '=', value: 'inactive' }]\n   * });\n   * console.log(`Deleted ${count} users`);\n   * ```\n   */\n  async delete(\n    table: string,\n    where: WhereClause,\n    _options?: DeleteOptions,\n    executor?: unknown\n  ): Promise<number> {\n    // Drizzle query API path\n    const tableObj = this.getTableObject(table);\n    if (tableObj) {\n      try {\n        // Transaction executor when supplied, otherwise the pooled instance.\n        // getDrizzle() returns unknown - explicit any generic for dialect-specific Drizzle API\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const db = executor ?? this.getDrizzle<any>();\n        let query = db.delete(tableObj);\n\n        const whereCondition = buildDrizzleWhere(tableObj as never, where);\n        if (whereCondition) {\n          query = query.where(whereCondition);\n        }\n\n        const result = await query;\n        return affectedRowCount(result);\n      } catch (error) {\n        throw this.handleQueryError(error, \"delete\", table);\n      }\n    }\n\n    throw this.createDatabaseError(\n      \"query\",\n      `Table \"${table}\" not found in schema registry. Ensure setTableResolver() has been called during boot.`,\n      undefined\n    );\n  }\n\n  /**\n   * Upsert (INSERT or UPDATE) a record.\n   *\n   * @remarks\n   * Default implementation uses dialect-specific ON CONFLICT syntax.\n   * PostgreSQL/SQLite: ON CONFLICT ... DO UPDATE\n   * MySQL: ON DUPLICATE KEY UPDATE\n   *\n   * @param table - Table name\n   * @param data - Record data\n   * @param options - Upsert options (must specify conflict columns)\n   * @returns Upserted record (with RETURNING columns if specified)\n   *\n   * @throws {DatabaseError} If upsert fails\n   *\n   * @example\n   * ```typescript\n   * const user = await adapter.upsert('users', {\n   *   email: 'user@example.com',\n   *   name: 'Updated Name'\n   * }, {\n   *   conflictColumns: ['email'],\n   *   updateColumns: ['name'],\n   *   returning: ['id', 'email', 'name']\n   * });\n   * ```\n   */\n  async upsert<T = unknown>(\n    table: string,\n    data: Record<string, unknown>,\n    options: UpsertOptions,\n    executor?: unknown\n  ): Promise<T> {\n    // Drizzle query API path\n    const tableObj = this.getTableObject(table);\n    if (tableObj) {\n      try {\n        // Transaction executor when supplied, otherwise the pooled instance.\n        // getDrizzle() returns unknown - explicit any generic for dialect-specific Drizzle API\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const db = executor ?? this.getDrizzle<any>();\n        const caps = this.getCapabilities();\n        const columns = getColumns(tableObj as never);\n\n        // Build conflict target columns\n        const conflictTarget = options.conflictColumns\n          .map(col => columns[col])\n          .filter(Boolean);\n\n        // Build update set (exclude conflict columns from update data)\n        const conflictSet = new Set(options.conflictColumns);\n        const updateData: Record<string, unknown> = {};\n        const updateColumns = options.updateColumns ?? Object.keys(data);\n        for (const key of updateColumns) {\n          if (!conflictSet.has(key) && key in data) {\n            updateData[key] = data[key];\n          }\n        }\n\n        let query;\n        if (caps.supportsOnConflict) {\n          // PostgreSQL/SQLite: ON CONFLICT DO UPDATE\n          query = db.insert(tableObj).values(data).onConflictDoUpdate({\n            target: conflictTarget,\n            set: updateData,\n          });\n        } else {\n          // MySQL: fallback to insert, catch duplicate key, then update\n          // This is handled by the MySQL adapter override\n          query = db.insert(tableObj).values(data);\n        }\n\n        if (caps.supportsReturning) {\n          const result = await query.returning();\n          return (Array.isArray(result) ? result[0] : result) as T;\n        }\n\n        await query;\n\n        // For databases without RETURNING: select back using conflict columns\n        // on the same executor so a transactional upsert reads its own write.\n        if (\n          options.conflictColumns.length &&\n          data[options.conflictColumns[0]] !== undefined\n        ) {\n          return (await this.selectOne<T>(\n            table,\n            {\n              where: {\n                and: [\n                  {\n                    column: options.conflictColumns[0],\n                    op: \"=\",\n                    value: data[options.conflictColumns[0]] as SqlParam,\n                  },\n                ],\n              },\n            },\n            executor\n          )) as T;\n        }\n\n        return data as T;\n      } catch (error) {\n        throw this.handleQueryError(error, \"upsert\", table);\n      }\n    }\n\n    throw this.createDatabaseError(\n      \"query\",\n      `Table \"${table}\" not found in schema registry. Ensure setTableResolver() has been called during boot.`,\n      undefined\n    );\n  }\n\n  // ============================================================\n  // Migration Support (Default implementations, can override)\n  // ============================================================\n\n  /**\n   * Run pending migrations.\n   *\n   * @remarks\n   * Default implementation is a placeholder. Subclasses should implement\n   * migration tracking and execution logic.\n   *\n   * @param migrations - Array of migrations to run\n   * @returns Migration result with applied and pending migrations\n   *\n   * @throws {DatabaseError} If migration fails\n   */\n  // Base implementation throws synchronously; dialect adapters override with async logic.\n  // eslint-disable-next-line @typescript-eslint/require-await\n  async migrate(_migrations: Migration[]): Promise<MigrationResult> {\n    // Base implementation: migrate() requires dialect-specific migrator import.\n    // Dialect adapters (PostgresAdapter, MySqlAdapter, SqliteAdapter) should\n    // override this with their specific drizzle-orm migrator.\n    throw this.createDatabaseError(\n      \"query\",\n      \"migrate() must be implemented by dialect-specific adapter. \" +\n        \"Use PostgresAdapter, MySqlAdapter, or SqliteAdapter.\",\n      undefined\n    );\n  }\n\n  /**\n   * Rollback the last migration.\n   *\n   * @remarks\n   * Default implementation is a placeholder. Subclasses should implement\n   * migration rollback logic.\n   *\n   * @returns Migration result after rollback\n   *\n   * @throws {DatabaseError} If rollback fails\n   */\n  // Base implementation throws synchronously; dialect adapters override with async logic.\n  // eslint-disable-next-line @typescript-eslint/require-await\n  async rollback(): Promise<MigrationResult> {\n    // Base implementation: rollback requires dialect-specific handling.\n    // Dialect adapters should override this.\n    throw this.createDatabaseError(\n      \"query\",\n      \"rollback() must be implemented by dialect-specific adapter. \" +\n        \"Use PostgresAdapter, MySqlAdapter, or SqliteAdapter.\",\n      undefined\n    );\n  }\n\n  /**\n   * Get migration status.\n   *\n   * @remarks\n   * Default implementation is a placeholder. Subclasses should implement\n   * migration status checking.\n   *\n   * @returns Current migration status\n   *\n   * @throws {DatabaseError} If status check fails\n   */\n  async getMigrationStatus(): Promise<MigrationResult> {\n    // Query the drizzle migrations tracking table for applied migrations\n    try {\n      const rows = await this.executeQuery<{\n        id: number;\n        hash: string;\n        created_at: number;\n      }>(`SELECT * FROM \"__drizzle_migrations\" ORDER BY created_at ASC`);\n\n      const applied = rows.map(r => ({\n        id: String(r.id),\n        name: r.hash,\n        appliedAt: new Date(r.created_at),\n        checksum: r.hash,\n      }));\n      return {\n        applied,\n        pending: [],\n        current: applied.length > 0 ? applied[applied.length - 1].id : null,\n      };\n    } catch {\n      // Table may not exist yet if no migrations have been applied\n      return { applied: [], pending: [], current: null };\n    }\n  }\n\n  // ============================================================\n  // Schema Operations (Default implementations, can override)\n  // ============================================================\n\n  /**\n   * Create a new table.\n   *\n   * @remarks\n   * Default implementation is a placeholder. Subclasses should implement\n   * table creation logic.\n   *\n   * @param definition - Table definition\n   * @param options - Creation options\n   *\n   * @throws {DatabaseError} If table creation fails\n   */\n  async createTable(\n    definition: TableDefinition,\n    options?: CreateTableOptions\n  ): Promise<void> {\n    // Build CREATE TABLE SQL from the TableDefinition\n    const columnDefs = definition.columns.map(col => {\n      let colSql = `${this.escapeIdentifier(col.name)} ${col.type.toUpperCase()}`;\n      if (col.primaryKey) colSql += \" PRIMARY KEY\";\n      if (col.nullable === false) colSql += \" NOT NULL\";\n      if (col.unique) colSql += \" UNIQUE\";\n      if (col.default !== undefined) {\n        colSql += ` DEFAULT ${renderDefaultValue(col.default, col.name)}`;\n      }\n      return colSql;\n    });\n\n    const ifNotExists = options?.ifNotExists !== false ? \"IF NOT EXISTS \" : \"\";\n    const query = `CREATE TABLE ${ifNotExists}${this.escapeIdentifier(definition.name)} (\\n  ${columnDefs.join(\",\\n  \")}\\n)`;\n\n    try {\n      await this.executeQuery(query);\n    } catch (error) {\n      throw this.handleQueryError(error, \"createTable\", definition.name);\n    }\n  }\n\n  /**\n   * Drop a table.\n   *\n   * @remarks\n   * Default implementation is a placeholder. Subclasses should implement\n   * table dropping logic.\n   *\n   * @param tableName - Name of table to drop\n   * @param options - Drop options\n   *\n   * @throws {DatabaseError} If table drop fails\n   */\n  async dropTable(\n    tableName: string,\n    options?: DropTableOptions\n  ): Promise<void> {\n    const ifExists = options?.ifExists !== false ? \"IF EXISTS \" : \"\";\n    const cascade = options?.cascade ? \" CASCADE\" : \"\";\n    const query = `DROP TABLE ${ifExists}${this.escapeIdentifier(tableName)}${cascade}`;\n\n    try {\n      await this.executeQuery(query);\n    } catch (error) {\n      throw this.handleQueryError(error, \"dropTable\", tableName);\n    }\n  }\n\n  /**\n   * Alter an existing table.\n   *\n   * @remarks\n   * Default implementation is a placeholder. Subclasses should implement\n   * table alteration logic.\n   *\n   * @param tableName - Name of table to alter\n   * @param operations - Alteration operations\n   * @param options - Alter options\n   *\n   * @throws {DatabaseError} If table alteration fails\n   */\n  async alterTable(\n    tableName: string,\n    operations: AlterTableOperation[],\n    _options?: AlterTableOptions\n  ): Promise<void> {\n    const quotedTable = this.escapeIdentifier(tableName);\n\n    for (const op of operations) {\n      let query: string;\n\n      switch (op.kind) {\n        case \"add_column\": {\n          let colDef = `${this.escapeIdentifier(op.column.name)} ${op.column.type.toUpperCase()}`;\n          if (op.column.nullable === false) colDef += \" NOT NULL\";\n          if (op.column.unique) colDef += \" UNIQUE\";\n          if (op.column.default !== undefined) {\n            const defaultVal =\n              typeof op.column.default === \"object\" &&\n              op.column.default !== null &&\n              \"sql\" in op.column.default\n                ? op.column.default.sql\n                : typeof op.column.default === \"string\"\n                  ? `'${op.column.default}'`\n                  : String(op.column.default);\n            colDef += ` DEFAULT ${defaultVal}`;\n          }\n          query = `ALTER TABLE ${quotedTable} ADD COLUMN ${colDef}`;\n          break;\n        }\n        case \"drop_column\": {\n          const cascade = op.cascade ? \" CASCADE\" : \"\";\n          query = `ALTER TABLE ${quotedTable} DROP COLUMN ${this.escapeIdentifier(op.columnName)}${cascade}`;\n          break;\n        }\n        case \"rename_column\":\n          query = `ALTER TABLE ${quotedTable} RENAME COLUMN ${this.escapeIdentifier(op.from)} TO ${this.escapeIdentifier(op.to)}`;\n          break;\n        case \"modify_column\": {\n          // ALTER COLUMN ... TYPE is PostgreSQL syntax; MySQL uses MODIFY COLUMN\n          // Dialect adapters can override for specific syntax\n          query = `ALTER TABLE ${quotedTable} ALTER COLUMN ${this.escapeIdentifier(op.column.name)} TYPE ${op.column.type.toUpperCase()}`;\n          break;\n        }\n        case \"add_constraint\":\n          {\n            // Constraint SQL depends on the constraint type\n            const constraintCols = op.constraint.columns ?? [];\n            const colList = constraintCols\n              .map(c => this.escapeIdentifier(c))\n              .join(\", \");\n            if (op.constraint.type === \"check\" && op.constraint.expression) {\n              query = `ALTER TABLE ${quotedTable} ADD CONSTRAINT ${this.escapeIdentifier(op.constraint.name)} CHECK (${op.constraint.expression})`;\n            } else {\n              query = `ALTER TABLE ${quotedTable} ADD CONSTRAINT ${this.escapeIdentifier(op.constraint.name)} ${op.constraint.type.toUpperCase()} (${colList})`;\n            }\n            break;\n          }\n          break;\n        case \"drop_constraint\": {\n          const cascadeConstraint = op.cascade ? \" CASCADE\" : \"\";\n          query = `ALTER TABLE ${quotedTable} DROP CONSTRAINT ${this.escapeIdentifier(op.constraintName)}${cascadeConstraint}`;\n          break;\n        }\n        default:\n          throw this.createDatabaseError(\n            \"query\",\n            `Unsupported alter table operation: ${(op as { kind: string }).kind}`,\n            undefined\n          );\n      }\n\n      try {\n        await this.executeQuery(query);\n      } catch (error) {\n        throw this.handleQueryError(error, \"alterTable\", tableName);\n      }\n    }\n  }\n\n  /**\n   * Check if a table exists in the database.\n   *\n   * @remarks\n   * Uses dialect-specific information schema queries to check table existence.\n   * This is useful for development mode auto-sync to determine whether to\n   * CREATE or DROP/CREATE tables.\n   *\n   * @param tableName - Name of table to check\n   * @param schema - Optional schema name (defaults to 'public' for PostgreSQL)\n   * @returns True if table exists, false otherwise\n   *\n   * @throws {DatabaseError} If query fails\n   *\n   * @example\n   * ```typescript\n   * const exists = await adapter.tableExists('users');\n   * if (exists) {\n   *   await adapter.dropTable('users');\n   * }\n   * await adapter.createTable(userTableDef);\n   * ```\n   */\n  async tableExists(tableName: string, schema?: string): Promise<boolean> {\n    try {\n      let sql: string;\n      const params: SqlParam[] = [];\n\n      switch (this.dialect) {\n        case \"postgresql\":\n          sql = `\n            SELECT EXISTS (\n              SELECT FROM information_schema.tables\n              WHERE table_schema = $1\n              AND table_name = $2\n            ) as exists\n          `;\n          params.push(schema ?? \"public\", tableName);\n          break;\n\n        case \"mysql\":\n          sql = `\n            SELECT COUNT(*) as count\n            FROM information_schema.tables\n            WHERE table_schema = DATABASE()\n            AND table_name = ?\n          `;\n          params.push(tableName);\n          break;\n\n        case \"sqlite\":\n          sql = `\n            SELECT COUNT(*) as count\n            FROM sqlite_master\n            WHERE type = 'table'\n            AND name = ?\n          `;\n          params.push(tableName);\n          break;\n\n        default:\n          throw this.createDatabaseError(\n            \"query\",\n            `tableExists not implemented for dialect: ${String(this.dialect)}`,\n            undefined\n          );\n      }\n\n      const results = await this.executeQuery<Record<string, unknown>>(\n        sql,\n        params\n      );\n\n      if (results.length === 0) {\n        return false;\n      }\n\n      const row = results[0];\n\n      // PostgreSQL returns { exists: true/false }\n      if (\"exists\" in row) {\n        return row.exists === true || row.exists === \"t\" || row.exists === 1;\n      }\n\n      // MySQL/SQLite return { count: number }\n      if (\"count\" in row) {\n        return Number(row.count) > 0;\n      }\n\n      return false;\n    } catch (error) {\n      throw this.handleQueryError(error, \"tableExists\", tableName);\n    }\n  }\n\n  /**\n   * Get list of all tables in the database.\n   *\n   * @remarks\n   * Uses dialect-specific information schema queries to list tables.\n   * Useful for detecting orphaned tables or validating schema state.\n   *\n   * @param schema - Optional schema name (defaults to 'public' for PostgreSQL)\n   * @returns Array of table names\n   *\n   * @throws {DatabaseError} If query fails\n   */\n  async listTables(schema?: string): Promise<string[]> {\n    try {\n      let sql: string;\n      const params: SqlParam[] = [];\n\n      switch (this.dialect) {\n        case \"postgresql\":\n          sql = `\n            SELECT table_name\n            FROM information_schema.tables\n            WHERE table_schema = $1\n            AND table_type = 'BASE TABLE'\n            ORDER BY table_name\n          `;\n          params.push(schema ?? \"public\");\n          break;\n\n        case \"mysql\":\n          // The alias matters: MySQL 8's information_schema returns the\n          // column key as uppercase TABLE_NAME without it, so `row.table_name`\n          // was undefined and every caller mapping the rows crashed.\n          sql = `\n            SELECT table_name AS table_name\n            FROM information_schema.tables\n            WHERE table_schema = DATABASE()\n            AND table_type = 'BASE TABLE'\n            ORDER BY table_name\n          `;\n          break;\n\n        case \"sqlite\":\n          sql = `\n            SELECT name as table_name\n            FROM sqlite_master\n            WHERE type = 'table'\n            AND name NOT LIKE 'sqlite_%'\n            ORDER BY name\n          `;\n          break;\n\n        default:\n          throw this.createDatabaseError(\n            \"query\",\n            `listTables not implemented for dialect: ${String(this.dialect)}`,\n            undefined\n          );\n      }\n\n      const results = await this.executeQuery<{ table_name: string }>(\n        sql,\n        params\n      );\n\n      return results.map(row => row.table_name);\n    } catch (error) {\n      throw this.handleQueryError(error, \"listTables\", \"\");\n    }\n  }\n\n  // ============================================================\n  // Protected Utilities\n  // ============================================================\n\n  // Old raw SQL query builders (buildSelectQuery, buildInsertQuery, buildUpdateQuery,\n  // buildDeleteQuery, buildUpsertQuery, buildWhereClause, buildPlaceholder,\n  // buildPlaceholders) have been removed. CRUD methods now use Drizzle query API\n  // via the TableResolver set during boot. See drizzle-where.ts for where clause\n  // translation.\n\n  // NOTE: The following content up to escapeIdentifier has been removed.\n  // If you're looking for the old query builder methods, see git history\n  // (commit before \"refactor: remove dead SQL builder code\").\n\n  /**\n   * Escape a table or column identifier.\n   *\n   * @remarks\n   * Default uses double quotes (SQL standard).\n   * MySQL adapter should override to use backticks.\n   *\n   * @param identifier - Identifier to escape\n   * @returns Escaped identifier\n   *\n   * @protected\n   */\n  protected escapeIdentifier(identifier: string): string {\n    // SQL standard: double quotes\n    // MySQL uses backticks, override in MySqlAdapter\n    return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n  }\n\n  /**\n   * Create a DatabaseError with proper error kind classification.\n   *\n   * @remarks\n   * Protected helper for subclasses to create consistent errors.\n   * Subclasses can override to add dialect-specific error classification.\n   *\n   * @param kind - Error kind\n   * @param message - Error message\n   * @param cause - Original error\n   * @returns DatabaseError instance\n   *\n   * @protected\n   */\n  protected createDatabaseError(\n    kind: DatabaseErrorKind,\n    message: string,\n    cause?: Error\n  ): DatabaseError {\n    return createDatabaseError({\n      kind,\n      message,\n      cause,\n    });\n  }\n\n  /**\n   * Handle query errors and convert to DatabaseError.\n   *\n   * @remarks\n   * Protected helper for consistent error handling across CRUD operations.\n   * Subclasses can override to add dialect-specific error classification.\n   *\n   * @param error - Original error\n   * @param operation - Operation that failed\n   * @param table - Table name\n   * @returns DatabaseError instance\n   *\n   * @protected\n   */\n  protected handleQueryError(\n    error: unknown,\n    operation: string,\n    table: string\n  ): DatabaseError {\n    if (isDatabaseError(error)) {\n      return error;\n    }\n\n    const errorMessage = error instanceof Error ? error.message : String(error);\n\n    return this.createDatabaseError(\n      \"query\",\n      `${operation} operation failed on table '${table}': ${errorMessage}`,\n      error instanceof Error ? error : undefined\n    );\n  }\n}\n\n/**\n * Render a `ColumnDefinition.default` as a SQL fragment\n * for embedding in a `DEFAULT` clause. DDL is not protected by Drizzle's\n * prepared statements — these expressions are concatenated into raw SQL —\n * so we treat the default as untrusted input even though it currently\n * flows from server-side schema definitions: an admin-defined dynamic\n * collection would otherwise turn into RCE-on-DB instead of just CMS\n * admin.\n *\n * Rules:\n *\n *   - **null / number / boolean** → rendered as a SQL literal.\n *   - **string** → quoted; embedded `'` doubled; `;`, `\\`, control\n *     characters, and null bytes rejected so they can't break out of\n *     the surrounding quote pair into adjacent DDL.\n *   - **`{ sql: \"…\" }`** → only the explicit allowlist of named\n *     functions below is honored (case-insensitive). Anything else is\n *     a hard error: the previous code embedded the raw `sql` string\n *     verbatim, which is the SQL injection primitive the audit flagged.\n */\nconst ALLOWED_DEFAULT_SQL_EXPRESSIONS = new Set([\n  \"current_timestamp\",\n  \"now()\",\n  \"gen_random_uuid()\",\n  \"uuid_generate_v4()\",\n  \"current_date\",\n  \"current_time\",\n]);\n\nfunction renderDefaultValue(value: unknown, columnName: string): string {\n  if (value === null) return \"NULL\";\n  if (typeof value === \"number\") {\n    if (!Number.isFinite(value)) {\n      throw new Error(\n        `DEFAULT for column \"${columnName}\" must be a finite number (got ${value}).`\n      );\n    }\n    return String(value);\n  }\n  if (typeof value === \"boolean\") {\n    return value ? \"TRUE\" : \"FALSE\";\n  }\n  if (typeof value === \"string\") {\n    if (/[;\\\\\\n\\r\\0]/.test(value)) {\n      throw new Error(\n        `DEFAULT string for column \"${columnName}\" contains characters that are not allowed in DDL (no semicolons, backslashes, control chars, or null bytes).`\n      );\n    }\n    return `'${value.replace(/'/g, \"''\")}'`;\n  }\n  if (typeof value === \"object\" && value !== null && \"sql\" in value) {\n    const raw = value.sql;\n    if (typeof raw !== \"string\") {\n      throw new Error(\n        `DEFAULT for column \"${columnName}\" has a { sql } expression that is not a string.`\n      );\n    }\n    const normalized = raw.trim().toLowerCase();\n    if (!ALLOWED_DEFAULT_SQL_EXPRESSIONS.has(normalized)) {\n      throw new Error(\n        `DEFAULT for column \"${columnName}\" uses a SQL expression \"${raw}\" that is not on the allowlist. Allowed: ${[...ALLOWED_DEFAULT_SQL_EXPRESSIONS].join(\", \")}.`\n      );\n    }\n    return raw.trim();\n  }\n  throw new Error(\n    `DEFAULT for column \"${columnName}\" has an unsupported type (${typeof value}).`\n  );\n}\n","/**\n * @nextly/adapter-drizzle\n *\n * Shared Drizzle ORM adapter logic for Nextly database adapters.\n * This package provides the base adapter class and utilities used by\n * dialect-specific adapters (PostgreSQL, MySQL, SQLite).\n *\n * @remarks\n * This is the main entry point that exports only the core adapter class.\n * Specialized utilities are available via subpath exports for optimal tree-shaking.\n *\n * ## Subpath Exports\n *\n * **Types:**\n * ```typescript\n * import type {\n *   DatabaseCapabilities,\n *   TransactionContext,\n *   WhereClause,\n *   SelectOptions,\n * } from '@nextly/adapter-drizzle/types';\n * ```\n *\n * **Query Builder:**\n * ```typescript\n * import { QueryBuilder } from '@nextly/adapter-drizzle/query-builder';\n * ```\n *\n * **Migrations:**\n * ```typescript\n * import {\n *   calculateChecksum,\n *   sortMigrations,\n *   migrationHelpers,\n * } from '@nextly/adapter-drizzle/migrations';\n * ```\n *\n * **Schema Utilities:**\n * ```typescript\n * import { schemaUtils } from '@nextly/adapter-drizzle/schema';\n * ```\n *\n * @packageDocumentation\n */\n\n/**\n * Package version\n * @public\n */\nexport const version = \"0.1.0\";\n\n// ============================================================\n// Core Adapter Export\n// ============================================================\n\n/**\n * Base database adapter abstract class.\n *\n * @remarks\n * All dialect-specific adapters extend this class. It provides:\n * - Abstract methods that must be implemented (connect, disconnect, executeQuery, transaction)\n * - Default CRUD implementations that can be overridden for optimization\n * - Protected query builders for dialect-specific SQL generation\n * - Error handling and database capability reporting\n *\n * ## Required Abstract Methods\n * - `dialect` - Database dialect identifier\n * - `connect()` - Establish database connection\n * - `disconnect()` - Close database connection\n * - `executeQuery()` - Execute raw SQL query\n * - `transaction()` - Execute work within a transaction\n * - `getCapabilities()` - Report database features\n *\n * ## Default CRUD Methods (Overridable)\n * - `select()`, `selectOne()` - Query records\n * - `insert()`, `insertMany()` - Insert records\n * - `update()` - Update records\n * - `delete()` - Delete records\n * - `upsert()` - Insert or update records\n *\n * @example\n * Basic adapter implementation:\n * ```typescript\n * import { DrizzleAdapter } from '@nextly/adapter-drizzle';\n * import type {\n *   DatabaseCapabilities,\n *   SqlParam,\n *   TransactionContext,\n * } from '@nextly/adapter-drizzle/types';\n *\n * export class PostgresAdapter extends DrizzleAdapter {\n *   readonly dialect = 'postgresql' as const;\n *\n *   async connect(): Promise<void> {\n *     // Connect to PostgreSQL\n *   }\n *\n *   async disconnect(): Promise<void> {\n *     // Close connection\n *   }\n *\n *   async executeQuery<T>(sql: string, params?: SqlParam[]): Promise<T[]> {\n *     // Execute query\n *   }\n *\n *   async transaction<T>(\n *     work: (tx: TransactionContext) => Promise<T>\n *   ): Promise<T> {\n *     // Transaction logic\n *   }\n *\n *   getCapabilities(): DatabaseCapabilities {\n *     return {\n *       dialect: 'postgresql',\n *       supportsJsonb: true,\n *       supportsReturning: true,\n *       // ... other capabilities\n *     };\n *   }\n * }\n * ```\n *\n * @public\n */\nexport { DrizzleAdapter } from \"./adapter\";\nexport type { TableResolver } from \"./types/core\";\n\n// Why no F17 re-exports here: the main index follows a strict tree-shaking\n// policy (only DrizzleAdapter + version are exported). F17's\n// checkDialectVersion / NEXTLY_MIN_DB_VERSIONS / UnsupportedDialectVersionError\n// live behind the dedicated subpath @nextlyhq/adapter-drizzle/version-check.\n"]}