@nextlyhq/adapter-drizzle 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +9 -0
  3. package/dist/adapter-BxJVtttb.d.ts +592 -0
  4. package/dist/adapter-nvlxFkF-.d.cts +592 -0
  5. package/dist/core-CVO7WYDj.d.cts +74 -0
  6. package/dist/core-CVO7WYDj.d.ts +74 -0
  7. package/dist/error-um1d_3Uo.d.cts +105 -0
  8. package/dist/error-um1d_3Uo.d.ts +105 -0
  9. package/dist/index.cjs +1137 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.cts +57 -0
  12. package/dist/index.d.ts +57 -0
  13. package/dist/index.mjs +1134 -0
  14. package/dist/index.mjs.map +1 -0
  15. package/dist/migration-BbO5meEV.d.cts +622 -0
  16. package/dist/migration-Qe70wDOC.d.ts +622 -0
  17. package/dist/migrations.cjs +195 -0
  18. package/dist/migrations.cjs.map +1 -0
  19. package/dist/migrations.d.cts +351 -0
  20. package/dist/migrations.d.ts +351 -0
  21. package/dist/migrations.mjs +185 -0
  22. package/dist/migrations.mjs.map +1 -0
  23. package/dist/schema/index.cjs +10 -0
  24. package/dist/schema/index.cjs.map +1 -0
  25. package/dist/schema/index.d.cts +133 -0
  26. package/dist/schema/index.d.ts +133 -0
  27. package/dist/schema/index.mjs +7 -0
  28. package/dist/schema/index.mjs.map +1 -0
  29. package/dist/schema-BDn8WfSL.d.cts +200 -0
  30. package/dist/schema-BIQ0YQZ_.d.ts +200 -0
  31. package/dist/types/index.cjs +24 -0
  32. package/dist/types/index.cjs.map +1 -0
  33. package/dist/types/index.d.cts +210 -0
  34. package/dist/types/index.d.ts +210 -0
  35. package/dist/types/index.mjs +21 -0
  36. package/dist/types/index.mjs.map +1 -0
  37. package/dist/version-check.cjs +154 -0
  38. package/dist/version-check.cjs.map +1 -0
  39. package/dist/version-check.d.cts +43 -0
  40. package/dist/version-check.d.ts +43 -0
  41. package/dist/version-check.mjs +150 -0
  42. package/dist/version-check.mjs.map +1 -0
  43. package/package.json +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/drizzle-where.ts","../src/types/error.ts","../src/adapter.ts","../src/index.ts"],"names":["getTableColumns","result"],"mappings":"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","file":"index.mjs","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 { getTableColumns } 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 = getTableColumns(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, getTableColumns } 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 */\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 schema - Optional schema object for typed queries\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(mySchemas);\n * const result = await db.insert(users).values({ ... }).returning();\n * ```\n */\n abstract getDrizzle<T = unknown>(schema?: Record<string, unknown>): 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 // 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 ): 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 // 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 let query = 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 = getTableColumns(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 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 ): Promise<T | null> {\n const results = await this.select<T>(table, { ...options, limit: 1 });\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 if (caps.supportsReturning && options?.returning) {\n const result = await db\n .insert(tableObj)\n .values(mappedData)\n .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 record\n if (!caps.supportsReturning && options?.returning) {\n if (data.id !== undefined) {\n return (await this.selectOne<T>(table, {\n where: {\n and: [{ column: \"id\", op: \"=\", value: data.id as SqlParam }],\n },\n })) as T;\n }\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 ): Promise<T[]> {\n // Drizzle query API path\n const tableObj = this.getTableObject(table);\n if (tableObj) {\n try {\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 // 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\n if (!caps.supportsReturning && options?.returning) {\n return await this.select<T>(table, { where });\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 ): Promise<number> {\n // Drizzle query API path\n const tableObj = this.getTableObject(table);\n if (tableObj) {\n try {\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 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 // Drizzle returns different shapes per dialect\n return Array.isArray(result)\n ? result.length\n : (((result as Record<string, unknown>)?.rowCount as number) ??\n ((result as Record<string, unknown>)?.changes as number) ??\n 0);\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 ): Promise<T> {\n // Drizzle query API path\n const tableObj = this.getTableObject(table);\n if (tableObj) {\n try {\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 const columns = getTableColumns(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 if (\n options.conflictColumns.length &&\n data[options.conflictColumns[0]] !== undefined\n ) {\n return (await this.selectOne<T>(table, {\n where: {\n and: [\n {\n column: options.conflictColumns[0],\n op: \"=\",\n value: data[options.conflictColumns[0]] as SqlParam,\n },\n ],\n },\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 sql = `\n SELECT 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"]}