@lara-node/db 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["dbQuery","mongoCollection","mongoCollection","dbQuery","mongoCollection","parseArgs","promptConfirm","run","parseArgs","mongoCollection","run"],"sources":["../src/DB.ts","../src/EloquentBuilder.ts","../src/relationships.ts","../src/Traits/traits.ts","../src/Model.ts","../src/Observers/Observer.ts","../src/Traits/built-ins.ts","../src/Database/Schema.ts","../src/Database/MigrationRunner.ts","../src/Database/SeederRunner.ts","../src/Database/MigrateFresh.ts","../src/Database/index.ts","../src/DatabaseServiceProvider.ts"],"sourcesContent":["/*\n|--------------------------------------------------------------------------\n| DB Facade - Laravel-style Database Facade\n|--------------------------------------------------------------------------\n|\n| This module provides a Laravel-like DB facade for database operations\n| including transactions, raw queries, table queries, and more.\n|\n*/\n\nimport { PoolConnection, Pool } from \"mysql2/promise\";\nimport { getPool, getDbType, query as dbQuery, getMongoDb } from \"./connection.js\";\nimport { ClientSession, Db, Collection as MongoCollection, Document } from \"mongodb\";\nimport { emitQueryEvent, createMongoQueryProxy } from \"./QueryInstrumentation.js\";\n\n// ============================================================================\n// TRANSACTION INTERFACES\n// ============================================================================\n\n/**\n * Base transaction interface with common methods\n */\nexport interface ITransaction {\n commit(): Promise<void>;\n rollback(): Promise<void>;\n isActive(): boolean;\n}\n\n/**\n * MySQL Transaction interface\n */\nexport interface IMysqlTransaction extends ITransaction {\n query<T = any>(sql: string, bindings?: any[]): Promise<T[]>;\n select<T = any>(sql: string, bindings?: any[]): Promise<T[]>;\n insert(sql: string, bindings?: any[]): Promise<number>;\n update(sql: string, bindings?: any[]): Promise<number>;\n delete(sql: string, bindings?: any[]): Promise<number>;\n statement(sql: string, bindings?: any[]): Promise<boolean>;\n getConnection(): PoolConnection;\n release(): void;\n}\n\n/**\n * MongoDB Transaction interface\n */\nexport interface IMongoTransaction extends ITransaction {\n collection<T extends Document = Document>(name: string): MongoCollection<T>;\n getSession(): ClientSession;\n endSession(): void;\n}\n\n// ============================================================================\n// TRANSACTION CLASSES\n// ============================================================================\n\n/**\n * Transaction class for managing MySQL database transactions\n */\nexport class Transaction implements IMysqlTransaction {\n private connection: PoolConnection;\n private committed = false;\n private rolledBack = false;\n\n constructor(connection: PoolConnection) {\n this.connection = connection;\n }\n\n async query<T = any>(sql: string, bindings: any[] = []): Promise<T[]> {\n const [rows] = await this.connection.query(sql, bindings);\n return rows as T[];\n }\n\n async select<T = any>(sql: string, bindings: any[] = []): Promise<T[]> {\n return this.query<T>(sql, bindings);\n }\n\n async insert(sql: string, bindings: any[] = []): Promise<number> {\n const [result] = await this.connection.query(sql, bindings);\n return (result as any).insertId;\n }\n\n async update(sql: string, bindings: any[] = []): Promise<number> {\n const [result] = await this.connection.query(sql, bindings);\n return (result as any).affectedRows;\n }\n\n async delete(sql: string, bindings: any[] = []): Promise<number> {\n const [result] = await this.connection.query(sql, bindings);\n return (result as any).affectedRows;\n }\n\n async statement(sql: string, bindings: any[] = []): Promise<boolean> {\n await this.connection.query(sql, bindings);\n return true;\n }\n\n getConnection(): PoolConnection {\n return this.connection;\n }\n\n async commit(): Promise<void> {\n if (this.committed || this.rolledBack) {\n throw new Error(\"Transaction already completed\");\n }\n await this.connection.commit();\n this.committed = true;\n }\n\n async rollback(): Promise<void> {\n if (this.committed || this.rolledBack) {\n return;\n }\n await this.connection.rollback();\n this.rolledBack = true;\n }\n\n isActive(): boolean {\n return !this.committed && !this.rolledBack;\n }\n\n release(): void {\n this.connection.release();\n }\n}\n\n/**\n * MongoDB Transaction class\n */\nexport class MongoTransaction implements IMongoTransaction {\n private session: ClientSession;\n private db: Db;\n private committed = false;\n private rolledBack = false;\n\n constructor(session: ClientSession, db: Db) {\n this.session = session;\n this.db = db;\n }\n\n collection<T extends Document = Document>(name: string): MongoCollection<T> {\n return this.db.collection<T>(name);\n }\n\n getSession(): ClientSession {\n return this.session;\n }\n\n async commit(): Promise<void> {\n if (this.committed || this.rolledBack) {\n throw new Error(\"Transaction already completed\");\n }\n await this.session.commitTransaction();\n this.committed = true;\n }\n\n async rollback(): Promise<void> {\n if (this.committed || this.rolledBack) {\n return;\n }\n await this.session.abortTransaction();\n this.rolledBack = true;\n }\n\n isActive(): boolean {\n return !this.committed && !this.rolledBack;\n }\n\n endSession(): void {\n this.session.endSession();\n }\n}\n\n// ============================================================================\n// TYPE DEFINITIONS\n// ============================================================================\n\n/**\n * Unified Transaction type\n */\nexport type UnifiedTransaction = Transaction | MongoTransaction;\n\n/**\n * Transaction callback types\n */\nexport type TransactionCallback<T> = (trx: Transaction) => Promise<T>;\nexport type MysqlTransactionCallback<T> = (trx: IMysqlTransaction) => Promise<T>;\nexport type MongoTransactionCallback<T> = (trx: IMongoTransaction) => Promise<T>;\nexport type UnifiedTransactionCallback<T> = (trx: UnifiedTransaction) => Promise<T>;\n\n/**\n * Query binding types\n */\nexport type QueryBindings = any[] | Record<string, any>;\n\n/**\n * Query result interface\n */\nexport interface QueryResult<T = any> {\n rows: T[];\n affectedRows?: number;\n insertId?: number;\n changedRows?: number;\n}\n\n/**\n * Raw query result\n */\nexport interface RawQueryResult {\n [key: string]: any;\n}\n\n// ============================================================================\n// DB FACADE CLASS\n// ============================================================================\n\n/**\n * DB Facade - Main entry point for database operations\n * Automatically handles both MySQL and MongoDB based on configuration\n *\n * Supports Laravel-style transactions where Model operations automatically\n * use the active transaction:\n *\n * @example\n * await DB.beginTransaction();\n * try {\n * await User.create({ name: 'John' }); // Uses the transaction\n * await user.save(); // Uses the transaction\n * await DB.commit();\n * } catch (e) {\n * await DB.rollback();\n * }\n */\nexport class DB {\n private static currentMysqlTransaction: Transaction | null = null;\n private static currentMongoTransaction: MongoTransaction | null = null;\n private static transactionLevel = 0;\n\n // ==========================================================================\n // QUERY EXECUTION METHODS\n // ==========================================================================\n\n /**\n * Execute a query using the current transaction if one exists, otherwise use the pool.\n * Emits a `db:query` event via the application EventDispatcher so Telescope and\n * other listeners can observe all database activity without modifying call sites.\n */\n static async executeQuery<T = any>(sql: string, params: any[] = []): Promise<T[]> {\n if (getDbType() === \"mongodb\") {\n throw new Error(\"executeQuery() is not supported for MongoDB\");\n }\n\n const start = process.hrtime.bigint();\n let rows: T[];\n let queryError: Error | undefined;\n\n try {\n if (this.currentMysqlTransaction) {\n rows = await this.currentMysqlTransaction.query<T>(sql, params);\n } else {\n rows = await dbQuery<T>(sql, params);\n }\n } catch (err) {\n queryError = err as Error;\n throw err;\n } finally {\n try {\n const durationMs = Number((process.hrtime.bigint() - start) / 1_000_000n);\n emitQueryEvent({\n sql,\n bindings: params,\n duration: durationMs,\n rows: rows! ? rows!.length : 0,\n error: queryError?.message,\n connection: process.env.DB_CONNECTION || \"mysql\",\n });\n } catch {\n /* never break the query path */\n }\n }\n\n return rows!;\n }\n\n /**\n * Execute a raw SQL query (MySQL only)\n */\n static async query<T = any>(sql: string, bindings: any[] = []): Promise<T[]> {\n if (getDbType() === \"mongodb\") {\n throw new Error(\n \"DB.query() is not supported for MongoDB. Use DB.collection() methods instead.\",\n );\n }\n return this.executeQuery<T>(sql, bindings);\n }\n\n /**\n * Execute a raw SELECT query (MySQL only)\n */\n static async select<T = any>(sql: string, bindings: any[] = []): Promise<T[]> {\n return this.query<T>(sql, bindings);\n }\n\n /**\n * Execute a raw INSERT query (MySQL only)\n */\n static async insert(sql: string, bindings: any[] = []): Promise<number> {\n if (getDbType() === \"mongodb\") {\n throw new Error(\n \"DB.insert() is not supported for MongoDB. Use DB.collection().insertOne() instead.\",\n );\n }\n if (this.currentMysqlTransaction) {\n return this.currentMysqlTransaction.insert(sql, bindings);\n }\n const result = await dbQuery<any>(sql, bindings);\n return (result as any).insertId || 0;\n }\n\n /**\n * Execute a raw UPDATE query (MySQL only)\n */\n static async update(sql: string, bindings: any[] = []): Promise<number> {\n if (getDbType() === \"mongodb\") {\n throw new Error(\n \"DB.update() is not supported for MongoDB. Use DB.collection().updateOne() instead.\",\n );\n }\n if (this.currentMysqlTransaction) {\n return this.currentMysqlTransaction.update(sql, bindings);\n }\n const result = await dbQuery<any>(sql, bindings);\n return (result as any).affectedRows || 0;\n }\n\n /**\n * Execute a raw DELETE query (MySQL only)\n */\n static async delete(sql: string, bindings: any[] = []): Promise<number> {\n if (getDbType() === \"mongodb\") {\n throw new Error(\n \"DB.delete() is not supported for MongoDB. Use DB.collection().deleteOne() instead.\",\n );\n }\n if (this.currentMysqlTransaction) {\n return this.currentMysqlTransaction.delete(sql, bindings);\n }\n const result = await dbQuery<any>(sql, bindings);\n return (result as any).affectedRows || 0;\n }\n\n /**\n * Execute a statement (for DDL or other non-returning queries) - MySQL only\n */\n static async statement(sql: string, bindings: any[] = []): Promise<boolean> {\n if (getDbType() === \"mongodb\") {\n throw new Error(\"DB.statement() is not supported for MongoDB.\");\n }\n if (this.currentMysqlTransaction) {\n return this.currentMysqlTransaction.statement(sql, bindings);\n }\n await dbQuery(sql, bindings);\n return true;\n }\n\n /**\n * Execute an unprepared query (without parameter binding) - MySQL only\n */\n static async unprepared(sql: string): Promise<boolean> {\n if (getDbType() === \"mongodb\") {\n throw new Error(\"DB.unprepared() is not supported for MongoDB.\");\n }\n await dbQuery(sql);\n return true;\n }\n\n // ==========================================================================\n // TABLE/COLLECTION ACCESS\n // ==========================================================================\n\n /**\n * Start a query on a table - returns EloquentBuilder for the table\n * Note: For raw table queries without a Model, use DB.query() with raw SQL\n */\n static table(name: string): {\n where: (column: string, operatorOrValue: any, value?: any) => any;\n insert: (data: Record<string, any>) => Promise<number>;\n update: (data: Record<string, any>) => Promise<number>;\n delete: () => Promise<number>;\n get: () => Promise<any[]>;\n first: () => Promise<any>;\n count: () => Promise<number>;\n } {\n if (getDbType() === \"mongodb\") {\n throw new Error(\"DB.table() is not supported for MongoDB. Use DB.collection() instead.\");\n }\n\n // Return a simple query builder interface for raw table operations\n const tableName = name;\n let whereClauses: { column: string; operator: string; value: any }[] = [];\n\n const buildWhere = () => {\n if (whereClauses.length === 0) return { sql: \"\", params: [] };\n const parts = whereClauses.map((w, i) => {\n const prefix = i === 0 ? \" WHERE \" : \" AND \";\n return `${prefix}${w.column} ${w.operator} ?`;\n });\n return { sql: parts.join(\"\"), params: whereClauses.map((w) => w.value) };\n };\n\n return {\n where(column: string, operatorOrValue: any, value?: any) {\n const operator = value !== undefined ? operatorOrValue : \"=\";\n const val = value !== undefined ? value : operatorOrValue;\n whereClauses.push({ column, operator, value: val });\n return this;\n },\n async insert(data: Record<string, any>): Promise<number> {\n const columns = Object.keys(data);\n const values = Object.values(data);\n const placeholders = columns.map(() => \"?\").join(\", \");\n const sql = `INSERT INTO ${tableName} (${columns.join(\", \")}) VALUES (${placeholders})`;\n return DB.insert(sql, values);\n },\n async update(data: Record<string, any>): Promise<number> {\n const columns = Object.keys(data);\n const values = Object.values(data);\n const setClause = columns.map((c) => `${c} = ?`).join(\", \");\n const where = buildWhere();\n const sql = `UPDATE ${tableName} SET ${setClause}${where.sql}`;\n return DB.update(sql, [...values, ...where.params]);\n },\n async delete(): Promise<number> {\n const where = buildWhere();\n const sql = `DELETE FROM ${tableName}${where.sql}`;\n return DB.delete(sql, where.params);\n },\n async get(): Promise<any[]> {\n const where = buildWhere();\n const sql = `SELECT * FROM ${tableName}${where.sql}`;\n return DB.query(sql, where.params);\n },\n async first(): Promise<any> {\n const where = buildWhere();\n const sql = `SELECT * FROM ${tableName}${where.sql} LIMIT 1`;\n const results = await DB.query(sql, where.params);\n return results[0] || null;\n },\n async count(): Promise<number> {\n const where = buildWhere();\n const sql = `SELECT COUNT(*) as count FROM ${tableName}${where.sql}`;\n const results = await DB.query<{ count: number }>(sql, where.params);\n return Number(results[0]?.count || 0);\n },\n };\n }\n\n /**\n * Get a MongoDB collection (MongoDB only).\n * The returned collection is transparently proxied so every operation\n * (find, insertOne, updateMany, aggregate, …) emits a `db:query` event\n * that Telescope's QueryWatcher captures.\n */\n static collection<T extends Document = Document>(name: string): MongoCollection<T> {\n if (getDbType() !== \"mongodb\") {\n throw new Error(\"DB.collection() is only supported for MongoDB. Use DB.table() instead.\");\n }\n const db = getMongoDb();\n return DB.instrumentMongoCollection<T>(name, db.collection<T>(name));\n }\n\n /**\n /** Delegates to the shared QueryInstrumentation proxy (same logic as db.config.ts:collection). */\n private static instrumentMongoCollection<T extends Document>(\n collectionName: string,\n col: MongoCollection<T>,\n ): MongoCollection<T> {\n return createMongoQueryProxy(collectionName, col);\n }\n\n /**\n * Get the current MongoDB session options for use in queries\n * Returns an object with { session } if in a transaction, or empty object\n * This allows MongoDB operations to automatically use the transaction\n *\n * @example\n * const collection = DB.collection('users');\n * await collection.insertOne({ name: 'John' }, DB.getSessionOptions());\n */\n static getSessionOptions(): { session?: ClientSession } {\n if (this.currentMongoTransaction) {\n return { session: this.currentMongoTransaction.getSession() };\n }\n return {};\n }\n\n /**\n * Execute a MongoDB operation with the current transaction session if available\n * This is the main method that Models should use for MongoDB operations\n *\n * @example\n * await DB.withSession(async (sessionOpts) => {\n * await collection.insertOne({ name: 'John' }, sessionOpts);\n * });\n */\n static async withSession<T>(\n callback: (sessionOptions: { session?: ClientSession }) => Promise<T>,\n ): Promise<T> {\n return callback(this.getSessionOptions());\n }\n\n // ==========================================================================\n // TRANSACTION METHODS\n // ==========================================================================\n\n /**\n * Begin a database transaction (auto-detects database type)\n */\n static async beginTransaction(): Promise<UnifiedTransaction> {\n const dbType = getDbType();\n\n if (dbType === \"mysql\") {\n const pool = getPool();\n const connection = await pool.getConnection();\n await connection.beginTransaction();\n\n const transaction = new Transaction(connection);\n this.currentMysqlTransaction = transaction;\n this.transactionLevel++;\n\n return transaction;\n } else {\n const db = getMongoDb();\n const client = db.client;\n const session = client.startSession();\n session.startTransaction();\n\n const transaction = new MongoTransaction(session, db);\n this.currentMongoTransaction = transaction;\n this.transactionLevel++;\n\n return transaction;\n }\n }\n\n /**\n * Alias for beginTransaction\n */\n static async begin(): Promise<UnifiedTransaction> {\n return this.beginTransaction();\n }\n\n /**\n * Commit the current transaction\n */\n static async commit(): Promise<void> {\n const dbType = getDbType();\n\n if (dbType === \"mysql\") {\n if (!this.currentMysqlTransaction) {\n throw new Error(\"No active MySQL transaction to commit\");\n }\n await this.currentMysqlTransaction.commit();\n this.currentMysqlTransaction.release();\n this.currentMysqlTransaction = null;\n this.transactionLevel--;\n } else {\n if (!this.currentMongoTransaction) {\n throw new Error(\"No active MongoDB transaction to commit\");\n }\n await this.currentMongoTransaction.commit();\n this.currentMongoTransaction.endSession();\n this.currentMongoTransaction = null;\n this.transactionLevel--;\n }\n }\n\n /**\n * Rollback the current transaction\n */\n static async rollback(): Promise<void> {\n const dbType = getDbType();\n\n if (dbType === \"mysql\") {\n if (!this.currentMysqlTransaction) {\n throw new Error(\"No active MySQL transaction to rollback\");\n }\n await this.currentMysqlTransaction.rollback();\n this.currentMysqlTransaction.release();\n this.currentMysqlTransaction = null;\n this.transactionLevel--;\n } else {\n if (!this.currentMongoTransaction) {\n throw new Error(\"No active MongoDB transaction to rollback\");\n }\n await this.currentMongoTransaction.rollback();\n this.currentMongoTransaction.endSession();\n this.currentMongoTransaction = null;\n this.transactionLevel--;\n }\n }\n\n /**\n * Execute a callback within a transaction (auto-detects database type)\n * Automatically commits on success, rolls back on error\n *\n * @example\n * // Models automatically use the active transaction\n * await DB.transaction(async () => {\n * await User.create({ name: 'John' });\n * await Invoice.create({ user_id: 1, amount: 100 });\n * });\n */\n static async transaction<T>(\n callback: UnifiedTransactionCallback<T> | (() => Promise<T>),\n ): Promise<T> {\n const trx = await this.beginTransaction();\n\n try {\n const result = await callback(trx);\n await this.commit();\n return result;\n } catch (error) {\n await this.rollback();\n throw error;\n }\n }\n\n /**\n * Execute a callback within a MySQL transaction (type-safe)\n */\n static async mysqlTransaction<T>(callback: MysqlTransactionCallback<T>): Promise<T> {\n if (getDbType() !== \"mysql\") {\n throw new Error(\"mysqlTransaction() is only supported for MySQL\");\n }\n\n const trx = (await this.beginTransaction()) as Transaction;\n\n try {\n const result = await callback(trx);\n await this.commit();\n return result;\n } catch (error) {\n await this.rollback();\n throw error;\n }\n }\n\n /**\n * Execute a callback within a MongoDB transaction (type-safe)\n */\n static async mongoTransaction<T>(callback: MongoTransactionCallback<T>): Promise<T> {\n if (getDbType() !== \"mongodb\") {\n throw new Error(\"mongoTransaction() is only supported for MongoDB\");\n }\n\n const trx = (await this.beginTransaction()) as MongoTransaction;\n\n try {\n const result = await callback(trx);\n await this.commit();\n return result;\n } catch (error) {\n await this.rollback();\n throw error;\n }\n }\n\n // ==========================================================================\n // TRANSACTION STATE HELPERS\n // ==========================================================================\n\n /**\n * Get the current transaction level\n */\n static getTransactionLevel(): number {\n return this.transactionLevel;\n }\n\n /**\n * Check if currently in a transaction\n */\n static inTransaction(): boolean {\n return this.currentMysqlTransaction !== null || this.currentMongoTransaction !== null;\n }\n\n /**\n * Get the current active transaction (if any)\n */\n static getCurrentTransaction(): UnifiedTransaction | null {\n if (getDbType() === \"mysql\") {\n return this.currentMysqlTransaction;\n }\n return this.currentMongoTransaction;\n }\n\n /**\n * Get the current MySQL transaction (type-safe)\n */\n static getMysqlTransaction(): Transaction | null {\n return this.currentMysqlTransaction;\n }\n\n /**\n * Get the current MongoDB transaction (type-safe)\n */\n static getMongoTransaction(): MongoTransaction | null {\n return this.currentMongoTransaction;\n }\n\n /**\n * Get the current MySQL connection (from transaction or null)\n */\n static getActiveConnection(): PoolConnection | null {\n if (this.currentMysqlTransaction) {\n return this.currentMysqlTransaction.getConnection();\n }\n return null;\n }\n\n /**\n * Get the current MongoDB session (from transaction or null)\n */\n static getActiveSession(): ClientSession | null {\n if (this.currentMongoTransaction) {\n return this.currentMongoTransaction.getSession();\n }\n return null;\n }\n\n // ==========================================================================\n // TYPE GUARDS\n // ==========================================================================\n\n /**\n * Check if a value is a MySQL Transaction\n */\n static isTransaction(trx: any): trx is Transaction {\n return trx instanceof Transaction;\n }\n\n /**\n * Check if a value is a MongoDB Transaction\n */\n static isMongoTransaction(trx: any): trx is MongoTransaction {\n return trx instanceof MongoTransaction;\n }\n\n // ==========================================================================\n // DATABASE TYPE HELPERS\n // ==========================================================================\n\n /**\n * Get the database type (mysql or mongodb)\n */\n static getType(): \"mysql\" | \"mongodb\" {\n return getDbType();\n }\n\n /**\n * Check if using MySQL\n */\n static isMysql(): boolean {\n return getDbType() === \"mysql\";\n }\n\n /**\n * Check if using MongoDB\n */\n static isMongo(): boolean {\n return getDbType() === \"mongodb\";\n }\n\n /**\n * Get the underlying connection pool (MySQL only)\n */\n static getPool(): Pool {\n if (getDbType() !== \"mysql\") {\n throw new Error(\"getPool() is only supported for MySQL\");\n }\n return getPool();\n }\n\n /**\n * Get the MongoDB database instance\n */\n static getMongoDb(): Db {\n if (getDbType() !== \"mongodb\") {\n throw new Error(\"getMongoDb() is only supported for MongoDB\");\n }\n return getMongoDb();\n }\n\n // ==========================================================================\n // UTILITY METHODS\n // ==========================================================================\n\n /**\n * Create a raw expression (to use raw SQL in queries)\n */\n static raw(value: string): { __raw: true; value: string } {\n return { __raw: true, value };\n }\n\n /**\n * Escape a value for safe use in queries (MySQL only)\n */\n static escape(value: any): string {\n if (value === null) return \"NULL\";\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n if (typeof value === \"string\") {\n return `'${value.replace(/'/g, \"''\")}'`;\n }\n return String(value);\n }\n\n /**\n * Quote a table or column name (MySQL only)\n */\n static quoteName(name: string): string {\n return `\\`${name.replace(/`/g, \"``\")}\\``;\n }\n\n /**\n * Listen for query events (placeholder for query logging)\n */\n static listen(_callback: (query: { sql: string; bindings: any[]; time: number }) => void): void {\n console.warn(\"DB.listen() is not yet implemented. Query logging coming soon.\");\n }\n}\n\n// Default export\nexport default DB;\n","// EloquentBuilder.ts\nimport { Model } from \"./Model.js\";\nimport { WhereClause, QueryResult, JoinClause, EagerLoadOptions } from \"./types.js\";\nimport { getDbType, collection as mongoCollection } from \"./connection.js\";\nimport DB from \"./DB.js\";\nimport { ObjectId } from \"mongodb\";\n\nexport class EloquentBuilder<T extends Model> {\n private model: typeof Model;\n private withRelations: Map<string, EagerLoadOptions> = new Map();\n private nestedRelations: Map<string, Set<string>> = new Map();\n // New: store full path options and a tree for arbitrary depth\n private relationPathOptions: Map<string, EagerLoadOptions> = new Map();\n private relationTree: Record<string, any> = {};\n private whereClauses: WhereClause[] = [];\n private havingClauses: WhereClause[] = [];\n private joinClauses: JoinClause[] = [];\n private limitValue?: number;\n private offsetValue?: number;\n private orderByColumn?: string;\n private orderByDirection: \"asc\" | \"desc\" = \"asc\";\n private groupByColumns: string[] = [];\n private hasConditions: {\n relation: string;\n operator?: string;\n count?: number;\n callback?: (query: EloquentBuilder<any>) => void;\n boolean?: \"and\" | \"or\";\n }[] = [];\n private selectedColumns?: string[];\n private distinctValue: boolean = false;\n // Soft delete scope flags\n private includeTrashed: boolean = false; // when true, do not auto add deleted_at IS NULL\n private appliedSoftDeleteFilter: boolean = false; // ensure we only append once\n private onlyTrashedFlag: boolean = false; // new: query only soft-deleted rows\n // Used to qualify bare column names when generating SQL (helps avoid ambiguity)\n private columnQualifier?: string;\n\n // Add scope-related properties\n private appliedScopes: Set<string> = new Set();\n private removedScopes: Set<string> = new Set();\n\n constructor(model: typeof Model) {\n this.model = model;\n }\n\n /**\n * Execute a SQL query using the active transaction if available\n * This ensures all EloquentBuilder queries are transaction-aware\n */\n private async runQuery<R = any>(sql: string, params: any[] = []): Promise<R[]> {\n return DB.executeQuery<R>(sql, params);\n }\n\n /**\n * Get MongoDB session options for transaction support\n * Returns { session } if in a transaction, or empty object\n */\n private getMongoSessionOptions(): { session?: any } {\n return DB.getSessionOptions();\n }\n\n public getRelationTree(): Record<string, any> {\n return this.relationTree;\n }\n\n // Chain to include soft deleted rows\n public withTrashed(): this {\n this.includeTrashed = true;\n this.onlyTrashedFlag = false; // reset\n return this;\n }\n\n /**\n * Apply a named scope\n */\n public namedScope(name: string, ...args: any[]): this {\n const modelClass = this.model as typeof Model;\n\n // Check if scope exists in local scopes\n if (modelClass.localScopes && modelClass.localScopes[name]) {\n modelClass.localScopes[name](this, ...args);\n this.appliedScopes.add(name);\n } else {\n // Try scope method naming convention\n const scopeMethodName = `scope${name.charAt(0).toUpperCase() + name.slice(1)}`;\n if ((modelClass as any)[scopeMethodName]) {\n (modelClass as any)[scopeMethodName](this, ...args);\n this.appliedScopes.add(name);\n }\n }\n\n return this;\n }\n\n /**\n * Alias for namedScope\n */\n public scope(name: string, ...args: any[]): this {\n return this.namedScope(name, ...args);\n }\n\n /**\n * Apply multiple scopes\n */\n public scopes(scopes: { [name: string]: any[] }): this {\n Object.entries(scopes).forEach(([name, args]) => {\n this.namedScope(name, ...args);\n });\n return this;\n }\n\n /**\n * Get applied scopes\n */\n public getAppliedScopes(): string[] {\n return Array.from(this.appliedScopes);\n }\n\n /**\n * Check if a scope has been applied\n */\n public hasScope(name: string): boolean {\n return this.appliedScopes.has(name);\n }\n\n /**\n * Remove a scope\n */\n public withoutScope(name: string): this {\n this.removedScopes.add(name);\n // Note: Actually removing already applied conditions is complex\n // This just prevents re-application\n return this;\n }\n\n // Alias for possible misspelling\n public withThrashed(): this {\n return this.withTrashed();\n }\n\n // Chain to enforce exclusion of trashed (explicit call optional since default)\n public withoutTrashed(): this {\n this.includeTrashed = false;\n this.onlyTrashedFlag = false; // reset\n return this;\n }\n\n // Alias for possible misspelling\n public withoutThrashed(): this {\n return this.withoutTrashed();\n }\n\n public onlyTrashed(): this {\n // remove any previously added deleted_at conditions so we can set our own\n this.whereClauses = this.whereClauses.filter((w) => w.column !== \"deleted_at\");\n this.includeTrashed = true; // prevent auto-injection of deleted_at = null\n this.onlyTrashedFlag = true;\n // add condition to select only soft deleted rows\n this.whereClauses.push({ column: \"deleted_at\", operator: \"!=\", value: null, boolean: \"and\" });\n return this;\n }\n\n // Alias for possible misspelling\n public onlyThrashed(): this {\n return this.onlyTrashed();\n }\n\n with(relations: string | string[] | Record<string, any>): this {\n const addPathToTree = (path: string) => {\n const segments = path.split(\".\");\n let cursor = this.relationTree;\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n if (!cursor[seg]) cursor[seg] = {};\n cursor = cursor[seg];\n }\n };\n const ensureTopLevel = (top: string, options: EagerLoadOptions) => {\n if (!this.withRelations.has(top)) {\n this.withRelations.set(top, options);\n }\n };\n const registerNestedPairs = (segments: string[]) => {\n for (let i = 0; i < segments.length - 1; i++) {\n const parent = segments[i];\n const child = segments[i + 1];\n if (!this.nestedRelations.has(parent)) this.nestedRelations.set(parent, new Set());\n this.nestedRelations.get(parent)!.add(child);\n }\n };\n const addRel = (rel: string, options: EagerLoadOptions = {}) => {\n this.relationPathOptions.set(rel, options);\n addPathToTree(rel);\n const segments = rel.split(\".\");\n ensureTopLevel(segments[0], {}); // Always load top-most\n if (segments.length > 1) {\n registerNestedPairs(segments);\n } else {\n // top-level specific options\n if (!this.withRelations.has(rel)) this.withRelations.set(rel, options);\n }\n };\n\n if (typeof relations === \"string\") {\n addRel(relations, {});\n } else if (Array.isArray(relations)) {\n relations.forEach((r) => addRel(r, {}));\n } else if (relations && typeof relations === \"object\") {\n Object.entries(relations).forEach(([key, val]) => {\n const options: EagerLoadOptions = {};\n if (typeof val === \"function\") {\n options.constraints = val as (b: EloquentBuilder<any>) => void;\n } else if (Array.isArray(val)) {\n options.columns = val as string[];\n } else if (val && typeof val === \"object\") {\n Object.assign(options, val as EagerLoadOptions);\n }\n addRel(key, options);\n });\n }\n return this;\n }\n\n select(columns: string[] | string): this {\n if (typeof columns === \"string\") {\n this.selectedColumns = [columns];\n } else {\n this.selectedColumns = columns;\n }\n return this;\n }\n\n addSelect(columns: string[] | string): this {\n if (!this.selectedColumns) {\n this.selectedColumns = [\"*\"];\n }\n if (typeof columns === \"string\") {\n this.selectedColumns.push(columns);\n } else {\n this.selectedColumns.push(...columns);\n }\n return this;\n }\n\n distinct(): this {\n this.distinctValue = true;\n return this;\n }\n\n where(\n column: string | ((builder: EloquentBuilder<T>) => void),\n operator?: any,\n value?: any,\n ): this {\n if (typeof column === \"function\") {\n // Nested where\n const nestedBuilder = new EloquentBuilder<T>(this.model as any);\n column(nestedBuilder);\n const nestedWhere = nestedBuilder.getWhereClauses();\n if (nestedWhere.length > 0) {\n this.whereClauses.push({\n column: \"\",\n operator: \"nested\",\n value: nestedWhere,\n boolean: \"and\",\n });\n }\n // Transfer hasConditions from nested builder to parent\n // (hasConditions can't be scoped inside nested WHERE groups, so they're promoted to parent level)\n if ((nestedBuilder as any).hasConditions && (nestedBuilder as any).hasConditions.length) {\n this.hasConditions.push(...(nestedBuilder as any).hasConditions);\n }\n return this;\n }\n\n if (value === undefined) {\n value = operator;\n operator = \"=\";\n }\n\n this.whereClauses.push({\n column,\n operator,\n value,\n boolean: \"and\",\n });\n\n return this;\n }\n\n orWhere(\n column: string | ((builder: EloquentBuilder<T>) => void),\n operator?: any,\n value?: any,\n ): this {\n if (typeof column === \"function\") {\n const nestedBuilder = new EloquentBuilder<T>(this.model as any);\n column(nestedBuilder);\n const nestedWhere = nestedBuilder.getWhereClauses();\n if (nestedWhere.length > 0) {\n this.whereClauses.push({\n column: \"\",\n operator: \"nested\",\n value: nestedWhere,\n boolean: \"or\",\n });\n }\n // Transfer hasConditions from nested builder to parent\n if ((nestedBuilder as any).hasConditions && (nestedBuilder as any).hasConditions.length) {\n this.hasConditions.push(...(nestedBuilder as any).hasConditions);\n }\n return this;\n }\n\n if (value === undefined) {\n value = operator;\n operator = \"=\";\n }\n\n this.whereClauses.push({\n column,\n operator,\n value,\n boolean: \"or\",\n });\n\n return this;\n }\n\n whereIn(column: string, values: any[]): this {\n this.whereClauses.push({ column, operator: \"IN\", value: values, boolean: \"and\" });\n return this;\n }\n\n whereNotIn(column: string, values: any[]): this {\n this.whereClauses.push({ column, operator: \"NOT IN\", value: values, boolean: \"and\" });\n return this;\n }\n\n whereNull(column: string): this {\n this.whereClauses.push({ column, operator: \"=\", value: null, boolean: \"and\" });\n return this;\n }\n\n whereNotNull(column: string): this {\n this.whereClauses.push({ column, operator: \"!=\", value: null, boolean: \"and\" });\n return this;\n }\n\n whereBetween(column: string, range: [any, any]): this {\n this.whereClauses.push({\n column,\n operator: \"BETWEEN\",\n value: range,\n boolean: \"and\",\n });\n return this;\n }\n\n whereNotBetween(column: string, range: [any, any]): this {\n this.whereClauses.push({\n column,\n operator: \"NOT BETWEEN\",\n value: range,\n boolean: \"and\",\n });\n return this;\n }\n\n whereHas(\n relation: string,\n callback?: (query: EloquentBuilder<any>) => void,\n operator: string = \">=\",\n count: number = 1,\n ): this {\n this.hasConditions.push({ relation, operator, count, callback, boolean: \"and\" });\n return this;\n }\n\n orWhereHas(\n relation: string,\n callback?: (query: EloquentBuilder<any>) => void,\n operator: string = \">=\",\n count: number = 1,\n ): this {\n this.hasConditions.push({ relation, operator, count, callback, boolean: \"or\" });\n return this;\n }\n\n whereDoesntHave(relation: string, callback?: (query: EloquentBuilder<any>) => void): this {\n this.hasConditions.push({ relation, operator: \"=\", count: 0, callback, boolean: \"and\" });\n return this;\n }\n\n join(\n table: string,\n first: string,\n operator: string,\n second: string,\n type: \"inner\" | \"left\" | \"right\" | \"cross\" = \"inner\",\n ): this {\n this.joinClauses.push({ table, first, operator, second, type });\n return this;\n }\n\n leftJoin(table: string, first: string, operator: string, second: string): this {\n return this.join(table, first, operator, second, \"left\");\n }\n\n groupBy(columns: string | string[]): this {\n if (typeof columns === \"string\") {\n this.groupByColumns.push(columns);\n } else {\n this.groupByColumns.push(...columns);\n }\n return this;\n }\n\n having(column: string, operator: string, value: any): this {\n this.havingClauses.push({\n column,\n operator,\n value,\n boolean: \"and\",\n });\n return this;\n }\n\n limit(limit: number): this {\n this.limitValue = limit;\n return this;\n }\n\n offset(offset: number): this {\n this.offsetValue = offset;\n return this;\n }\n\n orderBy(column: string, direction: \"asc\" | \"desc\" = \"asc\"): this {\n this.orderByColumn = column;\n this.orderByDirection = direction;\n return this;\n }\n\n latest(column: string = \"created_at\"): this {\n return this.orderBy(column, \"desc\");\n }\n\n oldest(column: string = \"created_at\"): this {\n return this.orderBy(column, \"asc\");\n }\n\n rightJoin(table: string, first: string, operator: string, second: string): this {\n return this.join(table, first, operator, second, \"right\");\n }\n\n crossJoin(table: string): this {\n this.joinClauses.push({ table, first: \"\", operator: \"\", second: \"\", type: \"cross\" });\n return this;\n }\n\n // ─── Convenience OR-where helpers ────────────────────────────────────────────\n\n orWhereNull(column: string): this {\n this.whereClauses.push({ column, operator: \"=\", value: null, boolean: \"or\" });\n return this;\n }\n\n orWhereNotNull(column: string): this {\n this.whereClauses.push({ column, operator: \"!=\", value: null, boolean: \"or\" });\n return this;\n }\n\n orWhereIn(column: string, values: any[]): this {\n this.whereClauses.push({ column, operator: \"IN\", value: values, boolean: \"or\" });\n return this;\n }\n\n orWhereNotIn(column: string, values: any[]): this {\n this.whereClauses.push({ column, operator: \"NOT IN\", value: values, boolean: \"or\" });\n return this;\n }\n\n orWhereBetween(column: string, range: [any, any]): this {\n this.whereClauses.push({ column, operator: \"BETWEEN\", value: range, boolean: \"or\" });\n return this;\n }\n\n orWhereNotBetween(column: string, range: [any, any]): this {\n this.whereClauses.push({ column, operator: \"NOT BETWEEN\", value: range, boolean: \"or\" });\n return this;\n }\n\n // ─── LIKE helpers ─────────────────────────────────────────────────────────────\n\n whereLike(column: string, value: string): this {\n this.whereClauses.push({ column, operator: \"LIKE\", value, boolean: \"and\" });\n return this;\n }\n\n whereNotLike(column: string, value: string): this {\n this.whereClauses.push({ column, operator: \"NOT LIKE\", value, boolean: \"and\" });\n return this;\n }\n\n orWhereLike(column: string, value: string): this {\n this.whereClauses.push({ column, operator: \"LIKE\", value, boolean: \"or\" });\n return this;\n }\n\n orWhereNotLike(column: string, value: string): this {\n this.whereClauses.push({ column, operator: \"NOT LIKE\", value, boolean: \"or\" });\n return this;\n }\n\n // ─── Raw SQL ──────────────────────────────────────────────────────────────────\n\n whereRaw(sql: string, bindings: any[] = []): this {\n this.whereClauses.push({ column: sql, operator: \"raw\", value: bindings, boolean: \"and\" });\n return this;\n }\n\n orWhereRaw(sql: string, bindings: any[] = []): this {\n this.whereClauses.push({ column: sql, operator: \"raw\", value: bindings, boolean: \"or\" });\n return this;\n }\n\n // ─── Conditional helpers ─────────────────────────────────────────────────────\n\n /** Apply callback only when condition is truthy. */\n when<V = boolean>(\n condition: V,\n callback: (builder: this, value: NonNullable<V>) => void,\n elseCallback?: (builder: this) => void,\n ): this {\n if (condition) {\n callback(this, condition as any);\n } else if (elseCallback) {\n elseCallback(this);\n }\n return this;\n }\n\n /** Apply callback only when condition is falsy (inverse of when). */\n unless<V = boolean>(condition: V, callback: (builder: this) => void): this {\n if (!condition) callback(this);\n return this;\n }\n\n /** Inspect the builder without interrupting the chain. */\n tap(callback: (builder: this) => void): this {\n callback(this);\n return this;\n }\n\n // ─── Clone ────────────────────────────────────────────────────────────────────\n\n /** Return a deep copy of this builder so mutations don't affect the original. */\n clone(): EloquentBuilder<T> {\n const copy = new EloquentBuilder<T>(this.model);\n (copy as any).withRelations = new Map(this.withRelations);\n (copy as any).nestedRelations = new Map(this.nestedRelations);\n (copy as any).relationPathOptions = new Map(this.relationPathOptions);\n (copy as any).relationTree = JSON.parse(JSON.stringify(this.relationTree));\n (copy as any).whereClauses = this.whereClauses.map((w) => ({ ...w }));\n (copy as any).havingClauses = this.havingClauses.map((h) => ({ ...h }));\n (copy as any).joinClauses = this.joinClauses.map((j) => ({ ...j }));\n (copy as any).limitValue = this.limitValue;\n (copy as any).offsetValue = this.offsetValue;\n (copy as any).orderByColumn = this.orderByColumn;\n (copy as any).orderByDirection = this.orderByDirection;\n (copy as any).groupByColumns = [...this.groupByColumns];\n (copy as any).hasConditions = this.hasConditions.map((h) => ({ ...h }));\n (copy as any).selectedColumns = this.selectedColumns ? [...this.selectedColumns] : undefined;\n (copy as any).distinctValue = this.distinctValue;\n (copy as any).includeTrashed = this.includeTrashed;\n (copy as any).appliedSoftDeleteFilter = this.appliedSoftDeleteFilter;\n (copy as any).onlyTrashedFlag = this.onlyTrashedFlag;\n (copy as any).columnQualifier = this.columnQualifier;\n (copy as any).appliedScopes = new Set(this.appliedScopes);\n (copy as any).removedScopes = new Set(this.removedScopes);\n return copy;\n }\n\n // ─── Retrieval helpers ────────────────────────────────────────────────────────\n\n /** Shorthand for .where(column, op?, value).first() */\n async firstWhere(\n column: string | ((builder: EloquentBuilder<T>) => void),\n operator?: any,\n value?: any,\n ): Promise<T | null> {\n return this.where(column, operator, value).first();\n }\n\n /** Retrieve a single column value from the first matching row. */\n async value(column: string): Promise<any> {\n const row = await this.select(column).first();\n return row ? (row as any).getAttribute(column) : null;\n }\n\n /**\n * Return the only record matching the query.\n * Throws if zero or more than one records are found.\n */\n async sole(): Promise<T> {\n const results = await this.limit(2).get();\n if (results.length === 0) {\n throw new Error(`${(this.model as any).name || \"Model\"} not found`);\n }\n if (results.length > 1) {\n throw new Error(`Multiple ${(this.model as any).name || \"Model\"} records found`);\n }\n return results[0];\n }\n\n /** Pluck a single column into an array, optionally keyed by another column. */\n async pluck(column: string, key?: string): Promise<any[] | Record<string, any>> {\n const cols = key ? [column, key] : [column];\n const rows = await this.select(cols).get();\n if (key) {\n const result: Record<string, any> = {};\n rows.forEach((r) => {\n const k = (r as any).getAttribute(key);\n result[k] = (r as any).getAttribute(column);\n });\n return result;\n }\n return rows.map((r) => (r as any).getAttribute(column));\n }\n\n /**\n * Process matching records in chunks to avoid loading everything into memory.\n * Callback receives a page of records; return false to stop early.\n */\n async chunk(\n size: number,\n callback: (rows: T[], page: number) => boolean | void | Promise<boolean | void>,\n ): Promise<void> {\n let page = 1;\n while (true) {\n const rows = await this.clone()\n .limit(size)\n .offset((page - 1) * size)\n .get();\n if (!rows.length) break;\n const result = await callback(rows, page);\n if (result === false || rows.length < size) break;\n page++;\n }\n }\n\n /**\n * Like chunk() but advances via the primary key for stability on live tables.\n */\n async chunkById(\n size: number,\n callback: (rows: T[], page: number) => boolean | void | Promise<boolean | void>,\n column?: string,\n ): Promise<void> {\n const pk = column || (this.model as any).primaryKey || \"id\";\n let lastId: any = null;\n let page = 1;\n while (true) {\n const q = this.clone().orderBy(pk, \"asc\").limit(size);\n if (lastId !== null) q.where(pk, \">\", lastId);\n const rows = await q.get();\n if (!rows.length) break;\n const result = await callback(rows, page);\n lastId = (rows[rows.length - 1] as any).getAttribute(pk);\n if (result === false || rows.length < size) break;\n page++;\n }\n }\n\n /** Async generator that yields results one at a time without holding all in memory. */\n async *cursor(): AsyncGenerator<T> {\n const rows = await this.get();\n for (const row of rows) {\n yield row;\n }\n }\n\n // ─── Debug / inspection ───────────────────────────────────────────────────────\n\n /** Return the SQL string (with ? placeholders) without executing the query. */\n toSql(): string {\n if (getDbType() === \"mongodb\") return \"[MongoDB – use toMongo() for filter object]\";\n const tableName = (this.model as typeof Model).getTable();\n const copy = this.clone();\n const prev = (copy as any).columnQualifier;\n (copy as any).columnQualifier = tableName;\n const where = (copy as any).buildWhereClause();\n (copy as any).columnQualifier = prev;\n\n const select = (copy as any).distinctValue ? \"SELECT DISTINCT\" : \"SELECT\";\n const columns =\n (copy as any).selectedColumns && (copy as any).selectedColumns.length\n ? (copy as any).selectedColumns.join(\",\")\n : \"*\";\n const parts: string[] = [`${select} ${columns} FROM ${tableName}`];\n\n (copy as any).joinClauses.forEach((join: any) => {\n if (join.type === \"cross\") {\n parts.push(`CROSS JOIN ${join.table}`);\n } else {\n parts.push(\n `${join.type.toUpperCase()} JOIN ${join.table} ON ${join.first} ${join.operator} ${join.second}`,\n );\n }\n });\n\n if (where.sql) parts.push(where.sql);\n if ((copy as any).groupByColumns.length)\n parts.push(`GROUP BY ${(copy as any).groupByColumns.join(\", \")}`);\n if ((copy as any).orderByColumn)\n parts.push(\n `ORDER BY ${(copy as any).orderByColumn} ${(copy as any).orderByDirection.toUpperCase()}`,\n );\n if ((copy as any).limitValue !== undefined) parts.push(`LIMIT ${(copy as any).limitValue}`);\n if ((copy as any).offsetValue !== undefined) parts.push(`OFFSET ${(copy as any).offsetValue}`);\n return parts.join(\" \");\n }\n\n /**\n * Return the MongoDB query descriptor without executing — the Mongo equivalent of toSql().\n *\n * Returns:\n * collection — collection name derived from the model's table\n * filter — MongoDB filter document (the full $and/$or object)\n * sort — e.g. { created_at: -1 } (only present when orderBy is set)\n * limit — cursor limit (only present when limit() was called)\n * skip — cursor skip offset (only present when offset() was called)\n * projection — { col: 1 } map (only present when select() was called)\n */\n toMongo(): {\n collection: string;\n filter: Record<string, any>;\n sort?: Record<string, 1 | -1>;\n limit?: number;\n skip?: number;\n projection?: Record<string, 1>;\n } {\n const copy = this.clone();\n const collectionName = (this.model as typeof Model).getTable();\n const filter: Record<string, any> = (copy as any).buildMongoFilter();\n\n const result: ReturnType<EloquentBuilder<T>[\"toMongo\"]> = {\n collection: collectionName,\n filter,\n };\n\n if ((copy as any).orderByColumn) {\n const dir: 1 | -1 = (copy as any).orderByDirection === \"desc\" ? -1 : 1;\n result.sort = { [(copy as any).orderByColumn]: dir };\n }\n if ((copy as any).limitValue !== undefined) {\n result.limit = (copy as any).limitValue;\n }\n if ((copy as any).offsetValue !== undefined) {\n result.skip = (copy as any).offsetValue;\n }\n const cols: string[] | undefined = (copy as any).selectedColumns;\n if (cols && cols.length && cols[0] !== \"*\") {\n result.projection = Object.fromEntries(\n cols.map((k) => [(copy as any).normalizeField(k), 1]),\n ) as Record<string, 1>;\n }\n\n return result;\n }\n\n async get(): Promise<T[]> {\n const data = await this.executeQuery();\n\n const models = data.map((item) => {\n const instance = new (this.model as any)();\n instance.hydrate(item);\n return instance as T;\n });\n\n if (this.withRelations.size > 0) {\n // Load top-level relations first\n await this.loadRelationships(models);\n // Recursively load nested relations using relationTree (covers any depth)\n await this.loadRelationTree(models, this.relationTree, \"\");\n }\n\n // Return the actual Model instances, NOT their JSON representation\n return models;\n }\n\n async toArray(): Promise<any[]> {\n const models = await this.get();\n // Convert to JSON with proper nested relationship handling\n return models.map((m) => {\n if (typeof (m as any).toJSON === \"function\") {\n // Pass the relation tree to toJSON for proper nested serialization\n return (m as any).toJSON({\n relationTree: this.relationTree,\n maxDepth: 10, // You can make this configurable\n });\n }\n return m;\n });\n }\n\n async first(): Promise<T | null> {\n const results = await this.limit(1).get();\n return results[0] || null;\n }\n\n async firstOrFail(): Promise<T> {\n const row = await this.first();\n if (!row) throw new Error(`${(this.model as any).name || \"Model\"} not found`);\n return row;\n }\n\n async paginate(perPage: number = 15, page: number = 1): Promise<QueryResult<T>> {\n // Coerce to safe positive integers\n const pp = Number.isFinite(Number(perPage)) ? Math.max(1, Math.floor(Number(perPage))) : 15;\n const pg = Number.isFinite(Number(page)) ? Math.max(1, Math.floor(Number(page))) : 1;\n const offset = (pg - 1) * pp;\n\n // Get total count BEFORE applying limit/offset\n const total = await this.getCount();\n\n // Now apply limit and offset for this page\n const data = await this.limit(pp).offset(offset).get();\n\n return {\n data,\n pagination: {\n currentPage: pg,\n perPage: pp,\n total,\n lastPage: Math.max(1, Math.ceil(total / pp)),\n },\n };\n }\n\n async count(column: string = \"*\"): Promise<number> {\n const result = await this.aggregate(\"count\", column);\n return parseInt(result, 10);\n }\n\n async max(column: string): Promise<number> {\n return parseFloat(await this.aggregate(\"max\", column));\n }\n\n async min(column: string): Promise<number> {\n return parseFloat(await this.aggregate(\"min\", column));\n }\n\n async avg(column: string): Promise<number> {\n return parseFloat(await this.aggregate(\"avg\", column));\n }\n\n async sum(column: string): Promise<number> {\n return parseFloat(await this.aggregate(\"sum\", column));\n }\n\n async exists(): Promise<boolean> {\n return (await this.count()) > 0;\n }\n\n async doesntExist(): Promise<boolean> {\n return !(await this.exists());\n }\n\n async find(id: number | string): Promise<T | null> {\n const pk = (this.model as any).primaryKey || \"id\";\n return this.where(pk, id).first();\n }\n\n async findOrFail(id: number | string): Promise<T> {\n const found = await this.find(id);\n if (!found) throw new Error(`${(this.model as any).name || \"Model\"} not found`);\n return found as T;\n }\n\n async all(): Promise<T[]> {\n return this.get();\n }\n\n async create(attributes: Record<string, any>): Promise<T> {\n const instance = new (this.model as any)(attributes) as T;\n await (instance as any).save();\n return instance;\n }\n\n async createMany(rows: Array<Record<string, any>>): Promise<T[]> {\n const created: T[] = [];\n for (const r of rows) {\n created.push(await this.create(r));\n }\n return created;\n }\n\n /**\n * Find a model matching the current query conditions or create a new one, then update with values\n * @param values - The values to update or create the model with\n * @param createAttributes - Additional attributes to use when creating a new record\n * @returns The model instance (existing or newly created)\n */\n async updateOrCreate(\n values: Record<string, any> = {},\n createAttributes: Record<string, any> = {},\n ): Promise<T> {\n // Try to find existing record with current query conditions\n const existing = await this.first();\n\n if (existing) {\n // Update existing record with values\n await existing.update(values);\n return existing;\n } else {\n // Create new record with merged values and create attributes\n const mergedAttributes = { ...values, ...createAttributes };\n return this.create(mergedAttributes);\n }\n }\n\n /**\n * Alias for updateOrCreate method\n * @param values - The values to update or create the model with\n * @param createAttributes - Additional attributes to use when creating a new record\n * @returns The model instance (existing or newly created)\n */\n async createOrUpdate(\n values: Record<string, any> = {},\n createAttributes: Record<string, any> = {},\n ): Promise<T> {\n return this.updateOrCreate(values, createAttributes);\n }\n\n async update(values: Partial<Record<string, any>>): Promise<number> {\n if (getDbType() === \"mongodb\") {\n return this.updateMongo(values);\n }\n const tableName = (this.model as typeof Model).getTable();\n const keys = Object.keys(values || {});\n if (!keys.length) return 0;\n\n const setSql = keys.map((k) => `${k} = ?`).join(\", \");\n const where = this.buildWhereClause();\n const sql = `UPDATE ${tableName} SET ${setSql}${where.sql}`;\n const params = [...keys.map((k) => (values as any)[k]), ...where.params];\n\n const result: any = await this.runQuery<any>(sql, params);\n return result && result.affectedRows ? Number(result.affectedRows) : 0;\n }\n\n async increment(column: string, amount: number = 1): Promise<number> {\n if (getDbType() === \"mongodb\") return this.updateMongo({ [column]: { $inc: amount } } as any);\n const tableName = (this.model as typeof Model).getTable();\n const where = this.buildWhereClause();\n const sql = `UPDATE ${tableName} SET ${column} = ${column} + ?${where.sql}`;\n const params = [amount, ...where.params];\n const result: any = await this.runQuery<any>(sql, params);\n return result && result.affectedRows ? Number(result.affectedRows) : 0;\n }\n\n async decrement(column: string, amount: number = 1): Promise<number> {\n if (getDbType() === \"mongodb\") return this.updateMongo({ [column]: { $dec: amount } } as any); // treat as custom\n const tableName = (this.model as typeof Model).getTable();\n const where = this.buildWhereClause();\n const sql = `UPDATE ${tableName} SET ${column} = ${column} - ?${where.sql}`;\n const params = [amount, ...where.params];\n const result: any = await this.runQuery<any>(sql, params);\n return result && result.affectedRows ? Number(result.affectedRows) : 0;\n }\n\n async delete(): Promise<number> {\n if (getDbType() === \"mongodb\") return this.deleteMongo();\n const tableName = (this.model as typeof Model).getTable();\n const where = this.buildWhereClause();\n const supportsSoft = Boolean((this.model as any).softDeletes);\n\n if (supportsSoft) {\n const now = new Date();\n const sql = `UPDATE ${tableName} SET deleted_at = ?${where.sql}`;\n const params = [now, ...where.params];\n const result: any = await this.runQuery<any>(sql, params);\n return result && result.affectedRows ? Number(result.affectedRows) : 0;\n }\n\n const sql = `DELETE FROM ${tableName}${where.sql}`;\n const result: any = await this.runQuery<any>(sql, where.params);\n return result && result.affectedRows ? Number(result.affectedRows) : 0;\n }\n\n async insert(rows: Array<Record<string, any>>): Promise<number> {\n if (getDbType() === \"mongodb\") return this.insertMongoMany(rows);\n if (!rows || !rows.length) return 0;\n const tableName = (this.model as typeof Model).getTable();\n const cols = Array.from(new Set(rows.flatMap((r) => Object.keys(r))));\n const placeholdersRow = `(${cols.map(() => \"?\").join(\",\")})`;\n const placeholders = new Array(rows.length).fill(placeholdersRow).join(\",\");\n const sql = `INSERT INTO ${tableName} (${cols.join(\",\")}) VALUES ${placeholders}`;\n const params: any[] = [];\n rows.forEach((r) => cols.forEach((c) => params.push(r[c])));\n const result: any = await this.runQuery<any>(sql, params);\n return result && result.affectedRows ? Number(result.affectedRows) : 0;\n }\n\n async insertGetId(row: Record<string, any>): Promise<number> {\n if (getDbType() === \"mongodb\") {\n const c = mongoCollection((this.model as typeof Model).getTable());\n const doc = { ...row } as any;\n if (\"id\" in doc && doc.id && !doc._id) {\n try {\n doc._id = new ObjectId(String(doc.id));\n } catch {\n doc._id = doc.id;\n }\n delete doc.id;\n }\n const res = await c.insertOne(doc, this.getMongoSessionOptions());\n // return fake numeric id length for compatibility; Model.save will set id properly\n return res.insertedId as any as number;\n }\n const tableName = (this.model as typeof Model).getTable();\n const cols = Object.keys(row);\n const placeholders = `(${cols.map(() => \"?\").join(\",\")})`;\n const sql = `INSERT INTO ${tableName} (${cols.join(\",\")}) VALUES ${placeholders}`;\n const params = cols.map((c) => row[c]);\n const result: any = await this.runQuery<any>(sql, params);\n return result.insertId;\n }\n\n // Chained relationship methods\n has(relation: string, operator: string = \">=\", count: number = 1): this {\n return this.whereHas(relation, undefined, operator, count);\n }\n\n doesntHave(relation: string): this {\n return this.whereDoesntHave(relation);\n }\n\n withCount(relations: string | string[]): this {\n const rels = Array.isArray(relations) ? relations : [relations];\n rels.forEach((relation) => {\n this.selectedColumns = this.selectedColumns || [\"*\"];\n this.selectedColumns.push(`${relation}_count`);\n });\n return this;\n }\n\n // Private methods\n private async aggregate(functionName: string, column: string): Promise<string> {\n if (getDbType() === \"mongodb\") {\n return this.aggregateMongo(functionName, column);\n }\n const tableName = (this.model as typeof Model).getTable();\n const prev = this.columnQualifier;\n this.columnQualifier = tableName; // qualify unqualified columns\n\n // Handle DISTINCT for aggregate functions (e.g., COUNT(DISTINCT column))\n const fn = functionName.toUpperCase();\n const aggExpr =\n this.distinctValue && column !== \"*\" ? `${fn}(DISTINCT ${column})` : `${fn}(${column})`;\n\n // Build the query parts similar to executeQuery\n const parts: string[] = [`SELECT ${aggExpr} as agg FROM ${tableName}`];\n const params: any[] = [];\n\n // Add joins\n this.joinClauses.forEach((join) => {\n parts.push(\n `${join.type.toUpperCase()} JOIN ${join.table} ON ${join.first} ${join.operator} ${join.second}`,\n );\n });\n\n // Add where clause\n const where = this.buildWhereClause();\n this.columnQualifier = prev;\n if (where.sql) {\n parts.push(where.sql);\n params.push(...where.params);\n }\n\n // Add has conditions (whereHas / whereDoesntHave)\n const hasSql = this.buildHasConditionsSQL(tableName);\n if (hasSql.sql) {\n if (!where.sql) {\n parts.push(\"WHERE 1=1\");\n }\n parts.push(hasSql.sql);\n params.push(...hasSql.params);\n }\n\n // Add group by (if set, aggregate will be per-group; this returns the first one)\n if (this.groupByColumns.length > 0) {\n parts.push(`GROUP BY ${this.groupByColumns.join(\", \")}`);\n }\n\n // Add having\n if (this.havingClauses.length > 0) {\n const havingParts = this.havingClauses.map((h) => `${h.column} ${h.operator} ?`);\n parts.push(`HAVING ${havingParts.join(\" AND \")}`);\n params.push(...this.havingClauses.map((h) => h.value));\n }\n\n const sql = parts.join(\" \");\n const rows = await this.runQuery<any>(sql, params);\n return rows[0]?.agg || \"0\";\n }\n\n private buildWhereClause(): { sql: string; params: any[] } {\n // Inject soft delete constraint automatically (SQL) if model supports it and not including trashed and not querying only trashed\n if (\n !this.appliedSoftDeleteFilter &&\n (this.model as any).softDeletes &&\n !this.includeTrashed &&\n !this.onlyTrashedFlag &&\n !this.whereClauses.some((w) => w.column === \"deleted_at\")\n ) {\n // If user has mixed AND/OR conditions, wrap them in a nested group so the\n // soft-delete constraint applies to the whole result set rather than only\n // binding to the last OR branch (SQL AND has higher precedence than OR).\n const hasOrClauses = this.whereClauses.some((w) => (w.boolean || \"and\") === \"or\");\n if (hasOrClauses && this.whereClauses.length > 0) {\n const existing = this.whereClauses.splice(0);\n this.whereClauses.push({\n column: \"deleted_at\",\n operator: \"=\",\n value: null,\n boolean: \"and\",\n });\n this.whereClauses.push({ column: \"\", operator: \"nested\", value: existing, boolean: \"and\" });\n } else {\n this.whereClauses.push({\n column: \"deleted_at\",\n operator: \"=\",\n value: null,\n boolean: \"and\",\n });\n }\n this.appliedSoftDeleteFilter = true;\n }\n if (!this.whereClauses.length) return { sql: \"\", params: [] };\n const parts: string[] = [];\n const params: any[] = [];\n\n const qualify = (name: string): string => {\n const n = (name || \"\").trim();\n if (!n) return n;\n if (n.includes(\".\")) return n;\n if (this.columnQualifier) return `${this.columnQualifier}.${n}`;\n return n;\n };\n\n this.whereClauses.forEach((w, idx) => {\n const boolOp = idx === 0 ? \"\" : (w.boolean || \"and\").toUpperCase() + \" \";\n const op = (w.operator || \"=\").toLowerCase();\n\n if (op === \"nested\" && Array.isArray(w.value)) {\n const nested = this.buildNestedWhere(w.value as any);\n if (nested.sql) {\n parts.push(`${boolOp}(${nested.sql})`);\n params.push(...nested.params);\n }\n return;\n }\n\n if (op === \"raw\") {\n parts.push(`${boolOp}${w.column}`);\n if (Array.isArray(w.value)) params.push(...w.value);\n return;\n }\n\n const col = qualify(w.column);\n\n if (Array.isArray(w.value) && (op === \"in\" || op === \"not in\")) {\n const placeholders = w.value.map(() => \"?\").join(\", \");\n const kw = op === \"in\" ? \"IN\" : \"NOT IN\";\n parts.push(`${boolOp}${col} ${kw} (${placeholders})`);\n params.push(...w.value);\n } else if (Array.isArray(w.value) && (op === \"between\" || op === \"not between\")) {\n const kw = op === \"between\" ? \"BETWEEN\" : \"NOT BETWEEN\";\n parts.push(`${boolOp}${col} ${kw} ? AND ?`);\n params.push(w.value[0], w.value[1]);\n } else if (w.value === null) {\n const sqlOp =\n op === \"=\"\n ? \"IS\"\n : op === \"!=\" || op === \"<>\"\n ? \"IS NOT\"\n : (w.operator || \"=\").toUpperCase();\n parts.push(`${boolOp}${col} ${sqlOp} NULL`);\n } else {\n parts.push(`${boolOp}${col} ${(w.operator || \"=\").toUpperCase()} ?`);\n params.push(w.value);\n }\n });\n\n const sql = \" WHERE \" + parts.join(\" \").trim();\n return { sql, params };\n }\n\n private buildNestedWhere(clauses: WhereClause[]): { sql: string; params: any[] } {\n const parts: string[] = [];\n const params: any[] = [];\n\n const qualify = (name: string): string => {\n const n = (name || \"\").trim();\n if (!n) return n;\n if (n.includes(\".\")) return n;\n if (this.columnQualifier) return `${this.columnQualifier}.${n}`;\n return n;\n };\n\n clauses.forEach((w, idx) => {\n const boolOp = idx === 0 ? \"\" : (w.boolean || \"and\").toUpperCase() + \" \";\n if ((w.operator || \"\").toLowerCase() === \"nested\" && Array.isArray(w.value)) {\n const nested = this.buildNestedWhere(w.value as any);\n if (nested.sql) {\n parts.push(`${boolOp}(${nested.sql})`);\n params.push(...nested.params);\n }\n } else if ((w.operator || \"\").toLowerCase() === \"raw\") {\n parts.push(`${boolOp}${w.column}`);\n if (Array.isArray(w.value)) params.push(...w.value);\n } else if (Array.isArray(w.value) && (w.operator || \"\").toLowerCase() === \"in\") {\n const placeholders = w.value.map(() => \"?\").join(\", \");\n parts.push(`${boolOp}${qualify(w.column)} IN (${placeholders})`);\n params.push(...w.value);\n } else if (w.value === null) {\n const op = (w.operator || \"=\").toLowerCase();\n const sqlOp = op === \"=\" ? \"IS\" : op === \"!=\" || op === \"<>\" ? \"IS NOT\" : op.toUpperCase();\n parts.push(`${boolOp}${qualify(w.column)} ${sqlOp} NULL`);\n } else {\n parts.push(`${boolOp}${qualify(w.column)} ${(w.operator || \"=\").toUpperCase()} ?`);\n params.push(w.value);\n }\n });\n\n return { sql: parts.join(\" \").trim(), params };\n }\n\n private getWhereClauses(): WhereClause[] {\n return this.whereClauses;\n }\n\n private buildHasConditionsSQL(\n baseTable: string,\n forBuilder?: EloquentBuilder<any>,\n ): { sql: string; params: any[] } {\n const builder = forBuilder || this;\n if (!builder.hasConditions.length) return { sql: \"\", params: [] };\n const instance = new (builder.model as any)();\n const clauses: string[] = [];\n const clauseBooleans: string[] = [];\n const params: any[] = [];\n // Use the primaryKey from the model that owns the baseTable context\n const parentModel = forBuilder ? forBuilder.model : this.model;\n const parentPK = (parentModel as any).primaryKey || \"id\";\n\n builder.hasConditions.forEach((cond) => {\n const relMeta = (instance as any).getRelationship(cond.relation);\n if (!relMeta) return; // skip silently\n const relatedModel = relMeta.model as typeof Model;\n const relatedTable = (relatedModel as any).getTable();\n const relatedPK = (relatedModel as any).primaryKey || \"id\";\n const operator = cond.operator || \">=\";\n const count = cond.count ?? 1;\n\n let constraintsSql = \"\";\n const constraintParams: any[] = [];\n\n const softDeleteFragment = (relatedModel as any).softDeletes ? \" AND deleted_at IS NULL\" : \"\";\n\n let subquery = \"\";\n if (\n relMeta.type === \"hasOne\" ||\n relMeta.type === \"hasMany\" ||\n relMeta.type === \"morphOne\" ||\n relMeta.type === \"morphMany\"\n ) {\n const foreignKey = relMeta.foreignKey || `${baseTable}_id`;\n if (cond.callback) {\n const cb = new EloquentBuilder(relatedModel) as any;\n cb.columnQualifier = relatedTable;\n cond.callback(cb);\n const where = cb.buildWhereClause();\n if (where.sql) {\n constraintsSql += where.sql.replace(/^\\s*WHERE\\s*/i, \" AND \");\n constraintParams.push(...where.params);\n }\n // nested whereHas inside callback\n const nestedHas = this.buildHasConditionsSQL(relatedTable, cb);\n if (nestedHas.sql) {\n constraintsSql += \" \" + nestedHas.sql;\n constraintParams.push(...nestedHas.params);\n }\n }\n subquery = `SELECT COUNT(*) FROM ${relatedTable} WHERE ${foreignKey} = ${baseTable}.${parentPK}${softDeleteFragment}${constraintsSql}`;\n } else if (relMeta.type === \"belongsTo\") {\n const foreignKey = relMeta.foreignKey || `${cond.relation}_id`; // on parent\n const ownerKey = relMeta.ownerKey || relatedPK;\n if (cond.callback) {\n const cb = new EloquentBuilder(relatedModel) as any;\n cb.columnQualifier = relatedTable;\n cond.callback(cb);\n const where = cb.buildWhereClause();\n if (where.sql) {\n constraintsSql += where.sql.replace(/^\\s*WHERE\\s*/i, \" AND \");\n constraintParams.push(...where.params);\n }\n const nestedHas = this.buildHasConditionsSQL(relatedTable, cb);\n if (nestedHas.sql) {\n constraintsSql += \" \" + nestedHas.sql;\n constraintParams.push(...nestedHas.params);\n }\n }\n subquery = `SELECT COUNT(*) FROM ${relatedTable} WHERE ${relatedTable}.${ownerKey} = ${baseTable}.${foreignKey}${softDeleteFragment}${constraintsSql}`;\n } else if (relMeta.type === \"belongsToMany\") {\n const pivot = relMeta.table;\n const foreignPivotKey = relMeta.foreignKey || `${baseTable}_id`;\n const relatedPivotKey = relMeta.relatedKey || `${relatedTable}_id`;\n if (cond.callback) {\n const cb = new EloquentBuilder(relatedModel) as any;\n // Qualify related table with alias 'r'\n cb.columnQualifier = \"r\";\n cond.callback(cb);\n const where = cb.buildWhereClause();\n if (where.sql) {\n constraintsSql += where.sql.replace(/^\\s*WHERE\\s*/i, \" AND \");\n constraintParams.push(...where.params);\n }\n const nestedHas = this.buildHasConditionsSQL(\"r\", cb);\n if (nestedHas.sql) {\n constraintsSql += \" \" + nestedHas.sql;\n constraintParams.push(...nestedHas.params);\n }\n }\n subquery = `SELECT COUNT(*) FROM ${pivot} p JOIN ${relatedTable} r ON r.${relatedPK} = p.${relatedPivotKey} WHERE p.${foreignPivotKey} = ${baseTable}.${parentPK}${(relatedModel as any).softDeletes ? \" AND r.deleted_at IS NULL\" : \"\"}${constraintsSql}`;\n } else {\n return; // unsupported\n }\n clauses.push(`((${subquery}) ${operator} ?)`);\n clauseBooleans.push(cond.boolean || \"and\");\n // Ensure params align with placeholders: subquery constraints first, then comparator value\n params.push(...constraintParams, count);\n });\n\n if (!clauses.length) return { sql: \"\", params: [] };\n return {\n sql: clauses.map((c, i) => `${clauseBooleans[i].toUpperCase()} ${c}`).join(\" \"),\n params,\n };\n }\n\n private async applyHasConditionsMongo(docs: any[], originalWhereFilter?: any): Promise<any[]> {\n if (!this.hasConditions.length || !docs.length) return docs;\n const instance = new (this.model as any)();\n const parentPK = (this.model as any).primaryKey || \"id\";\n\n const kept: any[] = [];\n for (const doc of docs) {\n let finalResult: boolean;\n let isFirst: boolean;\n if (originalWhereFilter && Object.keys(originalWhereFilter).length > 0) {\n // Doc was fetched with broadened filter. Check if it matches original where.\n finalResult = this.docMatchesMongoFilter(doc, originalWhereFilter);\n isFirst = false; // where result is the \"first condition\"\n } else {\n finalResult = true;\n isFirst = true;\n }\n for (const cond of this.hasConditions) {\n const relMeta = (instance as any).getRelationship(cond.relation);\n if (!relMeta) {\n if (isFirst) {\n finalResult = false;\n isFirst = false;\n } else if ((cond.boolean || \"and\") === \"or\") {\n finalResult = finalResult || false;\n } else {\n finalResult = finalResult && false;\n }\n continue;\n }\n const relatedModel = relMeta.model as typeof Model;\n const relatedTable = (relatedModel as any).getTable();\n const relatedPK = (relatedModel as any).primaryKey || \"id\";\n const operator = cond.operator || \">=\";\n const expected = cond.count ?? 1;\n\n let actual = 0;\n\n // Helper: apply nested has on related docs collection\n const applyNestedHasForRelatedDocs = async (\n docsArr: any[],\n cb?: EloquentBuilder<any>,\n parentRelatedModel?: typeof Model, // NEW: pass the correct model for this level\n ): Promise<number> => {\n if (!cb || !cb.hasConditions || cb.hasConditions.length === 0) return docsArr.length;\n // Use passed model or default to relatedModel from outer scope\n const currentLevelModel = parentRelatedModel || relatedModel;\n const currentLevelTable = (currentLevelModel as any).getTable();\n const currentLevelPK = (currentLevelModel as any).primaryKey || \"id\";\n const filtered: any[] = [];\n for (const rd of docsArr) {\n let okAll = true;\n for (const nestedCond of cb.hasConditions) {\n // Get relationship from the correct model at this nesting level\n const relMeta2 = (new (currentLevelModel as any)() as any).getRelationship(\n nestedCond.relation,\n );\n if (!relMeta2) {\n okAll = false;\n break;\n }\n const nestedModel = relMeta2.model as typeof Model;\n const nestedTable = (nestedModel as any).getTable();\n const nestedPK = (nestedModel as any).primaryKey || \"id\";\n const op = nestedCond.operator || \">=\";\n const exp = nestedCond.count ?? 1;\n let innerActual = 0;\n if (\n relMeta2.type === \"hasOne\" ||\n relMeta2.type === \"hasMany\" ||\n relMeta2.type === \"morphOne\" ||\n relMeta2.type === \"morphMany\"\n ) {\n const fk = relMeta2.foreignKey || `${currentLevelTable}_id`;\n const c2 = mongoCollection(nestedTable);\n const nestedBuilder = nestedCond.callback ? new EloquentBuilder(nestedModel) : null;\n if (nestedBuilder && nestedCond.callback) nestedCond.callback(nestedBuilder as any);\n const baseFilter2: any = { [fk]: rd[currentLevelPK] };\n if ((nestedModel as any).softDeletes) baseFilter2.deleted_at = null;\n if (nestedBuilder) {\n const extra2 = (nestedBuilder as any).buildMongoFilter();\n const filters2 = Object.keys(extra2).length\n ? { $and: [baseFilter2, extra2] }\n : baseFilter2;\n // Fetch docs and recursively apply nested has conditions\n if (\n (nestedBuilder as any).hasConditions &&\n (nestedBuilder as any).hasConditions.length\n ) {\n const nestedDocs = await c2.find(filters2 as any).toArray();\n innerActual = await applyNestedHasForRelatedDocs(\n nestedDocs,\n nestedBuilder,\n nestedModel,\n );\n } else {\n innerActual = await c2.countDocuments(filters2 as any);\n }\n } else {\n innerActual = await c2.countDocuments(baseFilter2 as any);\n }\n } else if (relMeta2.type === \"belongsTo\") {\n const fk2 = relMeta2.foreignKey || `${nestedCond.relation}_id`;\n const ownerKey2 = relMeta2.ownerKey || nestedPK;\n const fkVal2 = rd[fk2];\n if (fkVal2 === undefined || fkVal2 === null) innerActual = 0;\n else {\n const c2 = mongoCollection(nestedTable);\n // Normalize field name (id -> _id) for MongoDB and coerce ID value\n const normalizedOwnerKey2 = ownerKey2 === \"id\" ? \"_id\" : ownerKey2;\n const coercedFkVal2 =\n normalizedOwnerKey2 === \"_id\" ? this.coerceId(fkVal2) : fkVal2;\n const baseFilter2: any = { [normalizedOwnerKey2]: coercedFkVal2 };\n if ((nestedModel as any).softDeletes) baseFilter2.deleted_at = null;\n if (nestedCond.callback) {\n const nestedBuilder = new EloquentBuilder(nestedModel);\n nestedCond.callback(nestedBuilder as any);\n const extra2 = (nestedBuilder as any).buildMongoFilter();\n const filters2 = Object.keys(extra2).length\n ? { $and: [baseFilter2, extra2] }\n : baseFilter2;\n // Fetch docs and recursively apply nested has conditions\n if (\n (nestedBuilder as any).hasConditions &&\n (nestedBuilder as any).hasConditions.length\n ) {\n const nestedDocs = await c2.find(filters2 as any).toArray();\n innerActual = await applyNestedHasForRelatedDocs(\n nestedDocs,\n nestedBuilder,\n nestedModel,\n );\n } else {\n innerActual = await c2.countDocuments(filters2 as any);\n }\n } else innerActual = await c2.countDocuments(baseFilter2 as any);\n }\n } else if (relMeta2.type === \"belongsToMany\") {\n const pivot2 = relMeta2.table;\n const foreignPivotKey2 = relMeta2.foreignKey || `${currentLevelTable}_id`;\n const relatedPivotKey2 = relMeta2.relatedKey || `${nestedTable}_id`;\n const pc2 = mongoCollection(pivot2);\n const pivots2 = await pc2\n .find({ [foreignPivotKey2]: rd[currentLevelPK] })\n .toArray();\n if (!pivots2.length) innerActual = 0;\n else {\n const relatedIds2 = Array.from(new Set(pivots2.map((p) => p[relatedPivotKey2])));\n if (!relatedIds2.length) innerActual = 0;\n else {\n const rc2 = mongoCollection(nestedTable);\n let filter2: any = { [nestedPK]: { $in: relatedIds2 } };\n if ((nestedModel as any).softDeletes) filter2.deleted_at = null;\n if (nestedCond.callback) {\n const nestedBuilder = new EloquentBuilder(nestedModel);\n nestedCond.callback(nestedBuilder as any);\n const extra2 = (nestedBuilder as any).buildMongoFilter();\n if (Object.keys(extra2).length) filter2 = { $and: [filter2, extra2] };\n // Recursively apply nested has conditions\n if (\n (nestedBuilder as any).hasConditions &&\n (nestedBuilder as any).hasConditions.length\n ) {\n const nestedDocs = await rc2.find(filter2 as any).toArray();\n innerActual = await applyNestedHasForRelatedDocs(\n nestedDocs,\n nestedBuilder,\n nestedModel,\n );\n } else {\n innerActual = await rc2.countDocuments(filter2 as any);\n }\n } else {\n innerActual = await rc2.countDocuments(filter2 as any);\n }\n }\n }\n } else {\n okAll = false;\n break;\n }\n\n let okInner = false;\n switch (op) {\n case \">\":\n okInner = innerActual > exp;\n break;\n case \">=\":\n okInner = innerActual >= exp;\n break;\n case \"<\":\n okInner = innerActual < exp;\n break;\n case \"<=\":\n okInner = innerActual <= exp;\n break;\n case \"=\":\n case \"==\":\n okInner = innerActual === exp;\n break;\n case \"!=\":\n case \"<>\":\n okInner = innerActual !== exp;\n break;\n default:\n okInner = innerActual >= exp;\n break;\n }\n if (!okInner) {\n okAll = false;\n break;\n }\n }\n if (okAll) filtered.push(rd);\n }\n return filtered.length;\n };\n\n if (\n relMeta.type === \"hasOne\" ||\n relMeta.type === \"hasMany\" ||\n relMeta.type === \"morphOne\" ||\n relMeta.type === \"morphMany\"\n ) {\n const foreignKey = relMeta.foreignKey || `${(this.model as any).getTable()}_id`;\n const c = mongoCollection(relatedTable);\n const constraintBuilder = cond.callback ? new EloquentBuilder(relatedModel) : null;\n if (constraintBuilder && cond.callback) cond.callback(constraintBuilder as any);\n // Coerce the parent PK value so *_id foreign keys match stored ObjectIds\n const baseFilter: any = { [foreignKey]: this.coerceForField(foreignKey, doc[parentPK]) };\n if ((relatedModel as any).softDeletes) baseFilter.deleted_at = null;\n if (constraintBuilder) {\n const extra = (constraintBuilder as any).buildMongoFilter();\n const filters = Object.keys(extra).length ? { $and: [baseFilter, extra] } : baseFilter;\n if (constraintBuilder.hasConditions && constraintBuilder.hasConditions.length) {\n const arr = await c.find(filters as any).toArray();\n actual = await applyNestedHasForRelatedDocs(arr, constraintBuilder as any);\n } else {\n actual = await c.countDocuments(filters as any);\n }\n } else {\n actual = await c.countDocuments(baseFilter as any);\n }\n } else if (relMeta.type === \"belongsTo\") {\n const foreignKey = relMeta.foreignKey || `${cond.relation}_id`;\n const ownerKey = relMeta.ownerKey || relatedPK;\n const fkVal = doc[foreignKey];\n if (fkVal === undefined || fkVal === null) actual = 0;\n else {\n const c = mongoCollection(relatedTable);\n // Normalize field name (id -> _id) for MongoDB and coerce ID value\n const normalizedOwnerKey = ownerKey === \"id\" ? \"_id\" : ownerKey;\n const coercedFkVal = normalizedOwnerKey === \"_id\" ? this.coerceId(fkVal) : fkVal;\n const baseFilter: any = { [normalizedOwnerKey]: coercedFkVal };\n if ((relatedModel as any).softDeletes) baseFilter.deleted_at = null;\n if (cond.callback) {\n const constraintBuilder = new EloquentBuilder(relatedModel);\n cond.callback(constraintBuilder as any);\n const extra = (constraintBuilder as any).buildMongoFilter();\n const filters = Object.keys(extra).length\n ? { $and: [baseFilter, extra] }\n : baseFilter;\n if (constraintBuilder.hasConditions && constraintBuilder.hasConditions.length) {\n const arr = await c.find(filters as any).toArray();\n actual = await applyNestedHasForRelatedDocs(arr, constraintBuilder as any);\n } else {\n actual = await c.countDocuments(filters as any);\n }\n } else actual = await c.countDocuments(baseFilter as any);\n }\n } else if (relMeta.type === \"belongsToMany\") {\n const pivot = relMeta.table;\n const foreignPivotKey = relMeta.foreignKey || `${(this.model as any).getTable()}_id`;\n const relatedPivotKey = relMeta.relatedKey || `${relatedTable}_id`;\n const pc = mongoCollection(pivot);\n const pivots = await pc.find({ [foreignPivotKey]: doc[parentPK] }).toArray();\n if (!pivots.length) actual = 0;\n else {\n const relatedIds = Array.from(new Set(pivots.map((p) => p[relatedPivotKey])));\n if (!relatedIds.length) actual = 0;\n else {\n const rc = mongoCollection(relatedTable);\n let filter: any = { [relatedPK]: { $in: relatedIds } };\n if ((relatedModel as any).softDeletes) filter.deleted_at = null;\n if (cond.callback) {\n const constraintBuilder = new EloquentBuilder(relatedModel);\n cond.callback(constraintBuilder as any);\n const extra = (constraintBuilder as any).buildMongoFilter();\n if (Object.keys(extra).length) filter = { $and: [filter, extra] };\n if (constraintBuilder.hasConditions && constraintBuilder.hasConditions.length) {\n const arr = await rc.find(filter as any).toArray();\n actual = await applyNestedHasForRelatedDocs(arr, constraintBuilder as any);\n } else {\n actual = await rc.countDocuments(filter as any);\n }\n } else {\n actual = await rc.countDocuments(filter as any);\n }\n }\n }\n }\n\n let ok = false;\n switch (operator) {\n case \">\":\n ok = actual > expected;\n break;\n case \">=\":\n ok = actual >= expected;\n break;\n case \"<\":\n ok = actual < expected;\n break;\n case \"<=\":\n ok = actual <= expected;\n break;\n case \"=\":\n case \"==\":\n ok = actual === expected;\n break;\n case \"!=\":\n case \"<>\":\n ok = actual !== expected;\n break;\n default:\n ok = actual >= expected;\n break;\n }\n if (isFirst) {\n finalResult = ok;\n isFirst = false;\n } else if ((cond.boolean || \"and\") === \"or\") {\n finalResult = finalResult || ok;\n } else {\n finalResult = finalResult && ok;\n }\n }\n if (finalResult) kept.push(doc);\n }\n return kept;\n }\n\n private async executeQuery(): Promise<any[]> {\n if (getDbType() === \"mongodb\") return this.executeQueryMongo();\n const tableName = (this.model as typeof Model).getTable();\n const select = this.distinctValue ? \"SELECT DISTINCT\" : \"SELECT\";\n const columns =\n this.selectedColumns && this.selectedColumns.length ? this.selectedColumns.join(\",\") : \"*\";\n const base = `${select} ${columns} FROM ${tableName}`;\n\n const parts: string[] = [base];\n const params: any[] = [];\n\n // Add joins\n this.joinClauses.forEach((join) => {\n if (join.type === \"cross\") {\n parts.push(`CROSS JOIN ${join.table}`);\n } else {\n parts.push(\n `${join.type.toUpperCase()} JOIN ${join.table} ON ${join.first} ${join.operator} ${join.second}`,\n );\n }\n });\n\n // Add where clause (qualify with base table to avoid ambiguity)\n const prev = this.columnQualifier;\n this.columnQualifier = tableName;\n const where = this.buildWhereClause();\n this.columnQualifier = prev;\n if (where.sql) {\n parts.push(where.sql);\n params.push(...where.params);\n }\n\n // Note: Scopes are applied through where clauses already added\n // so no changes needed here\n\n // Add has conditions (translated to subqueries)\n const hasSql = this.buildHasConditionsSQL(tableName);\n if (hasSql.sql) {\n if (!where.sql) {\n // need a WHERE prefix\n parts.push(\"WHERE 1=1\");\n }\n parts.push(hasSql.sql);\n params.push(...hasSql.params);\n }\n\n // Add group by\n if (this.groupByColumns.length > 0) {\n parts.push(`GROUP BY ${this.groupByColumns.join(\", \")}`);\n }\n\n // Add having\n if (this.havingClauses.length > 0) {\n const havingParts = this.havingClauses.map((h) => `${h.column} ${h.operator} ?`);\n parts.push(`HAVING ${havingParts.join(\" AND \")}`);\n params.push(...this.havingClauses.map((h) => h.value));\n }\n\n // Add order by\n if (this.orderByColumn) {\n parts.push(`ORDER BY ${this.orderByColumn} ${this.orderByDirection.toUpperCase()}`);\n }\n\n // Add limit and offset\n if (this.limitValue !== undefined) parts.push(`LIMIT ${this.limitValue}`);\n if (this.offsetValue !== undefined) parts.push(`OFFSET ${this.offsetValue}`);\n\n const sql = parts.join(\" \");\n const rows = await this.runQuery<any>(sql, params);\n return rows;\n }\n\n private async getCount(): Promise<number> {\n if (getDbType() === \"mongodb\") return this.countMongo();\n const tableName = (this.model as typeof Model).getTable();\n const prev = this.columnQualifier;\n this.columnQualifier = tableName;\n const where = this.buildWhereClause();\n this.columnQualifier = prev;\n const hasSql = this.buildHasConditionsSQL(tableName);\n const parts: string[] = [`SELECT COUNT(*) as count FROM ${tableName}`];\n const params: any[] = [];\n if (where.sql) {\n parts.push(where.sql);\n params.push(...where.params);\n }\n if (hasSql.sql) {\n if (!where.sql) parts.push(\"WHERE 1=1\");\n parts.push(hasSql.sql);\n params.push(...hasSql.params);\n }\n const sql = parts.join(\" \").trim();\n const rows = await this.runQuery<any>(sql, params);\n const countRow = rows[0] as any;\n return countRow ? Number(countRow.count) : 0;\n }\n\n private async loadRelationships(models: T[]): Promise<void> {\n for (const [relation, options] of this.withRelations) {\n await this.loadRelationship(models, relation, options);\n }\n }\n\n // Replace old single-level nested loader with recursive tree loader\n private async loadRelationTree(\n currentModels: any[],\n tree: Record<string, any>,\n parentPath: string,\n ): Promise<void> {\n if (!currentModels.length) return;\n for (const relName of Object.keys(tree)) {\n const currentPath = parentPath ? `${parentPath}.${relName}` : relName;\n const options = this.relationPathOptions.get(currentPath) || {};\n // Determine if relation is top-level or deeper\n if (parentPath === \"\") {\n // Already loaded top-level in loadRelationships; skip duplicate load unless options provided that weren't applied\n if (options.constraints || options.columns) {\n // Re-load with constraints if user passed options specifically for full path\n await this.loadRelationship(currentModels, relName, options);\n }\n } else {\n // Need to load relation on nested model instances\n // Build a temporary builder for nested model type\n const sampleModel = currentModels.find(\n (m) => typeof m?.getRelationship === \"function\" && m.getRelationship(relName),\n );\n if (!sampleModel) continue;\n const tmpBuilder = new EloquentBuilder(sampleModel.constructor as typeof Model);\n await tmpBuilder.loadRelationship(currentModels as any, relName, options);\n }\n // Gather child instances to recurse\n const childContainer: any[] = [];\n currentModels.forEach((m) => {\n const loaded = (m as any).relationshipsLoaded?.[relName];\n if (!loaded) return;\n if (Array.isArray(loaded)) childContainer.push(...loaded);\n else childContainer.push(loaded);\n });\n // Recurse into subtree\n const subtree = tree[relName];\n if (subtree && Object.keys(subtree).length > 0 && childContainer.length > 0) {\n await this.loadRelationTree(childContainer, subtree, currentPath);\n }\n }\n }\n\n private setRelation(model: T, name: string, value: any) {\n (model as any).relationshipsLoaded = (model as any).relationshipsLoaded || {};\n (model as any).relationshipsLoaded[name] = value;\n }\n\n // Make loadRelationship public so nested loader can instantiate a new builder and reuse logic\n public async loadRelationship(\n models: T[],\n relation: string,\n options: EagerLoadOptions = {},\n ): Promise<void> {\n if (!models.length) return;\n const sampleModel = models[0];\n const rel = (sampleModel as any).getRelationship(relation);\n if (!rel) {\n console.warn(\n `Relationship \"${relation}\" not found for model ${(sampleModel as any).constructor?.name || \"Unknown\"}`,\n );\n return;\n }\n const relatedModel = rel.model as typeof Model;\n const relatedTable = (relatedModel as typeof Model).getTable();\n const relatedPK = (relatedModel as any).primaryKey as string;\n\n if (rel.type === \"hasOne\") {\n if (getDbType() === \"mongodb\")\n await this.loadHasOneMongo(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n else\n await this.loadHasOne(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n } else if (rel.type === \"hasMany\") {\n if (getDbType() === \"mongodb\")\n await this.loadHasManyMongo(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n else\n await this.loadHasMany(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n } else if (rel.type === \"belongsTo\") {\n if (getDbType() === \"mongodb\")\n await this.loadBelongsToMongo(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n else\n await this.loadBelongsTo(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n } else if (rel.type === \"belongsToMany\") {\n if (getDbType() === \"mongodb\")\n await this.loadBelongsToManyMongo(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n else\n await this.loadBelongsToMany(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n } else if (rel.type === \"morphOne\" || rel.type === \"morphMany\") {\n if (getDbType() === \"mongodb\")\n await this.loadMorphRelationsMongo(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n else\n await this.loadMorphRelations(\n models,\n relation,\n rel,\n relatedModel,\n relatedTable,\n relatedPK,\n options,\n );\n }\n }\n\n private async loadHasOne(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n const localKey = rel.localKey || (this.model as any).primaryKey || \"id\";\n const foreignKey = rel.foreignKey || `${(this.model as typeof Model).getTable()}_id`;\n const localIds = Array.from(\n new Set(\n models.map((m) => (m as any).getAttribute(localKey)).filter((v: any) => v !== undefined),\n ),\n );\n\n if (!localIds.length) return;\n\n const placeholders = localIds.map(() => \"?\").join(\",\");\n let sql = `SELECT * FROM ${relatedTable} WHERE ${foreignKey} IN (${placeholders})`;\n // Soft delete constraint when related model supports it and not overriding\n if ((relatedModel as any).softDeletes && !options.constraints) {\n sql += \" AND deleted_at IS NULL\";\n }\n const params: any[] = [...localIds];\n\n // Apply constraints if provided\n if (options.constraints) {\n const constraintBuilder = new EloquentBuilder(relatedModel);\n options.constraints(constraintBuilder);\n const constraintWhere = constraintBuilder.buildWhereClause();\n if (constraintWhere.sql) {\n sql += constraintWhere.sql.replace(\"WHERE\", \"AND\");\n params.push(...constraintWhere.params);\n }\n }\n\n const rows = await this.runQuery<any>(sql, params);\n const byFK = new Map<any, any>();\n rows.forEach((r) => byFK.set(r[foreignKey], r));\n\n models.forEach((m) => {\n const key = (m as any).getAttribute(localKey);\n const row = byFK.get(key) || null;\n if (row) {\n const inst = new (relatedModel as any)();\n inst.hydrate(row);\n this.setRelation(m, relation, inst);\n } else {\n this.setRelation(m, relation, null);\n }\n });\n }\n\n private async loadHasMany(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n const localKey = rel.localKey || (this.model as any).primaryKey || \"id\";\n const foreignKey = rel.foreignKey || `${(this.model as typeof Model).getTable()}_id`;\n const localIds = Array.from(\n new Set(\n models.map((m) => (m as any).getAttribute(localKey)).filter((v: any) => v !== undefined),\n ),\n );\n\n if (!localIds.length) {\n models.forEach((m) => this.setRelation(m, relation, []));\n return;\n }\n\n const placeholders = localIds.map(() => \"?\").join(\",\");\n let sql = `SELECT * FROM ${relatedTable} WHERE ${foreignKey} IN (${placeholders})`;\n if ((relatedModel as any).softDeletes && !options.constraints) {\n sql += \" AND deleted_at IS NULL\";\n }\n const params: any[] = [...localIds];\n\n // Apply constraints if provided\n if (options.constraints) {\n const constraintBuilder = new EloquentBuilder(relatedModel);\n options.constraints(constraintBuilder);\n const constraintWhere = constraintBuilder.buildWhereClause();\n if (constraintWhere.sql) {\n sql += constraintWhere.sql.replace(\"WHERE\", \"AND\");\n params.push(...constraintWhere.params);\n }\n }\n\n const rows = await this.runQuery<any>(sql, params);\n const grouped = new Map<any, any>();\n rows.forEach((r) => {\n const k = r[foreignKey];\n if (!grouped.has(k)) grouped.set(k, []);\n grouped.get(k)!.push(r);\n });\n\n models.forEach((m) => {\n const key = (m as any).getAttribute(localKey);\n const list = (grouped.get(key) || []).map((row: any) => {\n const inst = new (relatedModel as any)();\n inst.hydrate(row);\n return inst;\n });\n this.setRelation(m, relation, list);\n });\n }\n\n private async loadBelongsTo(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n const foreignKey = rel.foreignKey || `${relation}_id`;\n const ownerKey = rel.ownerKey || relatedPK || \"id\";\n const foreignIds = Array.from(\n new Set(\n models\n .map((m) => (m as any).getAttribute(foreignKey))\n .filter((v: any) => v !== undefined && v !== null),\n ),\n );\n\n if (!foreignIds.length) {\n models.forEach((m) => this.setRelation(m, relation, null));\n return;\n }\n\n const placeholders = foreignIds.map(() => \"?\").join(\",\");\n let sql = `SELECT * FROM ${relatedTable} WHERE ${ownerKey} IN (${placeholders})`;\n if ((relatedModel as any).softDeletes && !options.constraints) {\n sql += \" AND deleted_at IS NULL\";\n }\n const params: any[] = [...foreignIds];\n\n // Apply constraints if provided\n if (options.constraints) {\n const constraintBuilder = new EloquentBuilder(relatedModel);\n options.constraints(constraintBuilder);\n const constraintWhere = constraintBuilder.buildWhereClause();\n if (constraintWhere.sql) {\n sql += constraintWhere.sql.replace(\"WHERE\", \"AND\");\n params.push(...constraintWhere.params);\n }\n }\n\n const rows = await this.runQuery<any>(sql, params);\n const byOwner = new Map<any, any>();\n rows.forEach((r) => byOwner.set(r[ownerKey], r));\n\n models.forEach((m) => {\n const fk = (m as any).getAttribute(foreignKey);\n const row = byOwner.get(fk) || null;\n if (row) {\n const inst = new (relatedModel as any)();\n inst.hydrate(row);\n this.setRelation(m, relation, inst);\n } else {\n this.setRelation(m, relation, null);\n }\n });\n }\n\n private async loadBelongsToMany(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n // Ensure traits (e.g. SoftDeletes, global scopes) are booted on related + pivot models\n if (typeof (relatedModel as any).ensureBooted === \"function\") {\n (relatedModel as any).ensureBooted();\n }\n const pivotModel: typeof Model | undefined = rel.pivotModel;\n if (pivotModel && typeof (pivotModel as any).ensureBooted === \"function\") {\n (pivotModel as any).ensureBooted();\n }\n\n // SQL implementation (no Mongo calls). Mongo handled separately in loadBelongsToManyMongo.\n const pivotTable = rel.table;\n const parentPK = (this.model as any).primaryKey || \"id\";\n const foreignPivotKey = rel.foreignKey || `${(this.model as any).getTable()}_id`;\n const relatedPivotKey = rel.relatedKey || `${relatedTable}_id`;\n const parentIds = Array.from(\n new Set(\n models\n .map((m) => (m as any).getAttribute(parentPK))\n .filter((v: any) => v !== undefined && v !== null),\n ),\n );\n if (!parentIds.length) {\n models.forEach((m) => this.setRelation(m, relation, []));\n return;\n }\n\n const parentPlaceholders = parentIds.map(() => \"?\").join(\",\");\n let pivotSql = `SELECT ${foreignPivotKey} AS parent_id, ${relatedPivotKey} AS related_id FROM ${pivotTable} WHERE ${foreignPivotKey} IN (${parentPlaceholders})`;\n const pivotParams: any[] = [...parentIds];\n\n // Apply pivot model filters (soft deletes + global scopes) when a pivot model class was provided\n if (pivotModel) {\n // Soft deletes on pivot\n if ((pivotModel as any).softDeletes) {\n pivotSql += \" AND deleted_at IS NULL\";\n }\n // Global scopes on pivot model\n const globalScopes = (pivotModel as any).globalScopes as\n | Record<string, (b: EloquentBuilder<any>) => void>\n | undefined;\n if (globalScopes && Object.keys(globalScopes).length) {\n const pivotBuilder = new EloquentBuilder(pivotModel);\n Object.values(globalScopes).forEach((scope) => scope(pivotBuilder));\n const scopeWhere = (pivotBuilder as any).buildWhereClause() as {\n sql: string;\n params: any[];\n };\n if (scopeWhere.sql) {\n pivotSql += scopeWhere.sql.replace(/^\\s*WHERE\\s*/i, \" AND \");\n pivotParams.push(...scopeWhere.params);\n }\n }\n }\n\n // Apply constraints to related rows after pivot fetch (not to pivot query itself)\n const pivotRows = await this.runQuery<any>(pivotSql, pivotParams);\n if (!pivotRows.length) {\n models.forEach((m) => this.setRelation(m, relation, []));\n return;\n }\n\n const relatedIds = Array.from(new Set(pivotRows.map((r: any) => r.related_id)));\n const relatedPlaceholders = relatedIds.map(() => \"?\").join(\",\");\n let relatedSql = `SELECT * FROM ${relatedTable} WHERE ${relatedPK} IN (${relatedPlaceholders})`;\n if ((relatedModel as any).softDeletes && !options.constraints) {\n relatedSql += \" AND deleted_at IS NULL\";\n }\n const relatedParams: any[] = [...relatedIds];\n\n // Constraints: use builder to build WHERE on related table\n if (options.constraints) {\n const constraintBuilder = new EloquentBuilder(relatedModel);\n options.constraints(constraintBuilder);\n const constraintWhere = (constraintBuilder as any).buildWhereClause();\n if (constraintWhere.sql) {\n // constraintWhere.sql already starts with ' WHERE', so replace with AND for existing WHERE\n relatedSql += constraintWhere.sql.replace(\"WHERE\", \"AND\");\n relatedParams.push(...constraintWhere.params);\n }\n }\n\n const relatedRows = await this.runQuery<any>(relatedSql, relatedParams);\n const relatedMap = new Map<any, any>();\n relatedRows.forEach((r) => relatedMap.set(r[relatedPK], r));\n\n const grouped = new Map<any, any[]>();\n pivotRows.forEach((p) => {\n const relRow = relatedMap.get(p.related_id);\n if (!grouped.has(p.parent_id)) grouped.set(p.parent_id, []);\n if (relRow) {\n const inst = new (relatedModel as any)();\n inst.hydrate(relRow);\n grouped.get(p.parent_id)!.push(inst);\n }\n });\n\n models.forEach((m) => {\n const pid = (m as any).getAttribute(parentPK);\n const list = grouped.get(pid) || [];\n this.setRelation(m, relation, list);\n });\n }\n\n private async loadBelongsToManyMongo(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n // Ensure traits (e.g. SoftDeletes) are booted on related + pivot models\n if (typeof (relatedModel as any).ensureBooted === \"function\") {\n (relatedModel as any).ensureBooted();\n }\n const pivotModel: typeof Model | undefined = rel.pivotModel;\n if (pivotModel && typeof (pivotModel as any).ensureBooted === \"function\") {\n (pivotModel as any).ensureBooted();\n }\n\n const pivotTable = rel.table;\n const parentPK = (this.model as any).primaryKey || \"id\";\n const foreignPivotKey = rel.foreignKey || `${(this.model as any).getTable()}_id`;\n const relatedPivotKey = rel.relatedKey || `${relatedTable}_id`;\n const parentRaw = models\n .map((m) => (m as any).getAttribute(parentPK))\n .filter((v: any) => v !== undefined && v !== null);\n if (!parentRaw.length) {\n models.forEach((m) => this.setRelation(m, relation, []));\n return;\n }\n const parentMatch =\n parentPK === \"id\"\n ? Array.from(new Set(parentRaw.flatMap((v) => this.expandIdForms(v))))\n : Array.from(new Set(parentRaw));\n const pc = mongoCollection(pivotTable);\n\n // Build pivot filter — start with parent match then layer on pivot model filters\n const pivotFilter: any = { [foreignPivotKey]: { $in: parentMatch } };\n if (pivotModel) {\n // Soft deletes on pivot\n if ((pivotModel as any).softDeletes) {\n pivotFilter.deleted_at = null;\n }\n // Global scopes on pivot model (Mongo)\n const globalScopes = (pivotModel as any).globalScopes as\n | Record<string, (b: EloquentBuilder<any>) => void>\n | undefined;\n if (globalScopes && Object.keys(globalScopes).length) {\n const pivotBuilder = new EloquentBuilder(pivotModel);\n Object.values(globalScopes).forEach((scope) => scope(pivotBuilder));\n const scopeFilter = (pivotBuilder as any).buildMongoFilter() as Record<string, any>;\n if (scopeFilter && Object.keys(scopeFilter).length) {\n Object.assign(pivotFilter, scopeFilter);\n }\n }\n }\n\n const pivots = await pc.find(pivotFilter).toArray();\n if (!pivots.length) {\n models.forEach((m) => this.setRelation(m, relation, []));\n return;\n }\n // Gather related ids, allow string/number forms\n const relatedTokens = Array.from(new Set(pivots.map((p: any) => String(p[relatedPivotKey]))));\n const rc = mongoCollection(relatedTable);\n let rows: any[] = [];\n if (relatedPK === \"id\") {\n const oidList: ObjectId[] = [];\n const shortTokens: string[] = [];\n relatedTokens.forEach((s) => {\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n try {\n oidList.push(new ObjectId(s));\n } catch {}\n }\n if (/^[0-9a-fA-F]{1,8}$/.test(s)) {\n shortTokens.push(s);\n }\n });\n const or: any[] = [];\n if (oidList.length) or.push({ _id: { $in: oidList } });\n if (shortTokens.length) {\n const tokenSet = Array.from(new Set(shortTokens));\n const prefixExprs = tokenSet.map((t) => ({\n $expr: { $eq: [{ $substrBytes: [{ $toString: \"$_id\" }, 0, t.length] }, t] },\n }));\n or.push(...prefixExprs);\n }\n rows = await rc.find(or.length ? { $or: or } : {}).toArray();\n } else {\n rows = await rc.find({ [relatedPK]: { $in: relatedTokens } as any }).toArray();\n }\n const rmap = new Map<any, any>();\n rows.forEach((r) => {\n if (r && r._id && !(\"id\" in r)) r.id = String(r._id);\n const idStr = String(r._id);\n const token = idStr.slice(0, 8);\n rmap.set(idStr, r);\n rmap.set(token, r);\n });\n const grouped = new Map<any, any[]>();\n pivots.forEach((p: any) => {\n const pidVal = p[foreignPivotKey];\n const pidStr = String(pidVal);\n const ridStr = String(p[relatedPivotKey]);\n const relRow = rmap.get(ridStr) || rmap.get(String(ridStr));\n if (relRow) {\n if (!grouped.has(pidVal)) grouped.set(pidVal, []);\n grouped.get(pidVal)!.push(relRow);\n // also index by string form of parent id for lookup flexibility\n if (!grouped.has(pidStr)) grouped.set(pidStr, []);\n grouped.get(pidStr)!.push(relRow);\n }\n });\n models.forEach((m) => {\n const pid = (m as any).getAttribute(parentPK);\n const forms = parentPK === \"id\" ? this.expandIdForms(pid) : [pid];\n const seen = new Set<string>();\n const collected: any[] = [];\n forms.forEach((f) => {\n const fStr = String(f);\n const arr = grouped.get(f) || grouped.get(fStr) || [];\n for (const r of arr) {\n const sid = r._id ? String(r._id) : JSON.stringify(r);\n if (!seen.has(sid)) {\n seen.add(sid);\n collected.push(r);\n }\n }\n });\n const list = collected.map((row) => {\n const inst = new (relatedModel as any)();\n inst.hydrate(row);\n return inst;\n });\n this.setRelation(m, relation, list);\n });\n }\n\n private async loadMorphRelations(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n // Implementation for morph relationships\n // This is a simplified version - you can expand this based on your needs\n const morphType = rel.morphName || (this.model as typeof Model).getTable();\n const foreignKey = rel.foreignKey || `${morphType}_id`;\n const morphTypeKey = rel.morphType || `${morphType}_type`;\n\n const localIds = Array.from(\n new Set(models.map((m) => (m as any).getAttribute(\"id\")).filter((v: any) => v !== undefined)),\n );\n\n if (!localIds.length) {\n models.forEach((m) => this.setRelation(m, relation, rel.type === \"morphOne\" ? null : []));\n return;\n }\n\n const placeholders = localIds.map(() => \"?\").join(\",\");\n let sql = `SELECT * FROM ${relatedTable} WHERE ${foreignKey} IN (${placeholders}) AND ${morphTypeKey} = ?`;\n if ((relatedModel as any).softDeletes && !options.constraints) {\n sql += \" AND deleted_at IS NULL\";\n }\n const params: any[] = [...localIds, morphType];\n\n if (options.constraints) {\n const constraintBuilder = new EloquentBuilder(relatedModel);\n options.constraints(constraintBuilder);\n const constraintWhere = constraintBuilder.buildWhereClause();\n if (constraintWhere.sql) {\n sql += constraintWhere.sql.replace(\"WHERE\", \"AND\");\n params.push(...constraintWhere.params);\n }\n }\n\n const rows = await this.runQuery<any>(sql, params);\n\n if (rel.type === \"morphOne\") {\n const byFK = new Map<any, any>();\n rows.forEach((r) => byFK.set(r[foreignKey], r));\n\n models.forEach((m) => {\n const key = (m as any).getAttribute(\"id\");\n const row = byFK.get(key) || null;\n if (row) {\n const inst = new (relatedModel as any)();\n inst.hydrate(row);\n this.setRelation(m, relation, inst);\n } else {\n this.setRelation(m, relation, null);\n }\n });\n } else {\n // morphMany\n const grouped = new Map<any, any[]>();\n rows.forEach((r) => {\n const k = r[foreignKey];\n if (r && r._id && !(\"id\" in r)) r.id = String(r._id);\n if (!grouped.has(k)) grouped.set(k, []);\n grouped.get(k)!.push(r);\n const ks = String(k);\n if (!grouped.has(ks)) grouped.set(ks, []);\n grouped.get(ks)!.push(r);\n });\n models.forEach((m) => {\n const key = (m as any).getAttribute(\"id\");\n const keys = this.expandIdForms(key).map((v) => String(v));\n const acc: any[] = [];\n keys.forEach((k) => {\n const arr = grouped.get(k) || [];\n if (arr.length) acc.push(...arr);\n });\n const uniq = Array.from(\n new Set(acc.map((x) => (x._id ? String(x._id) : JSON.stringify(x)))),\n ).map((id) => acc.find((x) => (x._id ? String(x._id) : JSON.stringify(x)) === id));\n const list = uniq.map((row) => {\n const inst = new (relatedModel as any)();\n inst.hydrate(row!);\n return inst;\n });\n this.setRelation(m, relation, list);\n });\n }\n }\n\n // ------- Mongo helpers -------\n private normalizeField(field: string): string {\n const pk = (this.model as any).primaryKey || \"id\";\n if (field === pk && pk === \"id\") return \"_id\";\n return field;\n }\n\n private coerceId(val: any) {\n if (val === null || val === undefined) return val;\n try {\n return new ObjectId(String(val));\n } catch {\n return val;\n }\n }\n\n // NEW: detect *_id like fields (including primary id)\n private isIdLikeField(field: string): boolean {\n const f = this.normalizeField(field);\n return f === \"_id\" || /_id$/i.test(f);\n }\n\n // NEW: coerce values to ObjectId when targeting *_id fields\n private coerceForField(field: string, val: any): any {\n if (val === null || val === undefined) return val;\n if (!this.isIdLikeField(field)) return val;\n if (val instanceof ObjectId) return val;\n const s = String(val);\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n try {\n return new ObjectId(s);\n } catch {\n return val;\n }\n }\n return val;\n }\n\n // Expand possible stored forms for an id-like value used in non-_id fields\n // e.g., '69199330e91394e0bc375674' -> ['69199330e91394e0bc375674', ObjectId(...), '69199330', 69199330]\n private expandIdForms(val: any): any[] {\n const out: any[] = [];\n const s = String(val);\n // original\n out.push(val);\n // string\n out.push(s);\n // numeric if digits\n if (/^\\d+$/.test(s)) {\n const n = Number(s);\n if (!Number.isNaN(n)) out.push(n);\n }\n // objectId\n try {\n out.push(new ObjectId(s));\n } catch {\n /*noop*/\n }\n // first8 from 24-hex\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n const first8 = s.slice(0, 8);\n out.push(first8);\n const n2 = Number(first8);\n if (!Number.isNaN(n2)) out.push(n2);\n }\n return Array.from(new Set(out));\n }\n\n /**\n * Check if a document matches a MongoDB filter object in memory.\n * Used for OR hasConditions where we need to verify if a doc matched the original where filter.\n */\n private docMatchesMongoFilter(doc: any, filter: any): boolean {\n if (!filter || Object.keys(filter).length === 0) return true;\n\n for (const [key, condition] of Object.entries(filter)) {\n if (key === \"$and\") {\n if (!(condition as any[]).every((f: any) => this.docMatchesMongoFilter(doc, f)))\n return false;\n continue;\n }\n if (key === \"$or\") {\n if (!(condition as any[]).some((f: any) => this.docMatchesMongoFilter(doc, f)))\n return false;\n continue;\n }\n\n const docValue = doc[key];\n\n if (condition === null) {\n if (docValue !== null && docValue !== undefined) return false;\n continue;\n }\n\n if (typeof condition === \"object\" && condition !== null && !Array.isArray(condition)) {\n // Handle MongoDB operators\n for (const [op, val] of Object.entries(condition as Record<string, any>)) {\n switch (op) {\n case \"$in\":\n if (!Array.isArray(val) || !val.some((v: any) => String(v) === String(docValue)))\n return false;\n break;\n case \"$nin\":\n if (Array.isArray(val) && val.some((v: any) => String(v) === String(docValue)))\n return false;\n break;\n case \"$ne\":\n if (String(docValue) === String(val)) return false;\n break;\n case \"$gt\":\n if (!(docValue > val)) return false;\n break;\n case \"$gte\":\n if (!(docValue >= val)) return false;\n break;\n case \"$lt\":\n if (!(docValue < val)) return false;\n break;\n case \"$lte\":\n if (!(docValue <= val)) return false;\n break;\n case \"$regex\": {\n const flags = (condition as any).$options || \"\";\n if (!new RegExp(val as string, flags).test(String(docValue))) return false;\n break;\n }\n default:\n break;\n }\n }\n continue;\n }\n\n // Simple equality\n if (String(docValue) !== String(condition)) return false;\n }\n\n return true;\n }\n\n private buildMongoFilter(): any {\n // Inject soft delete filter (Mongo) if supported and not including trashed and not onlyTrashed\n if (\n !this.appliedSoftDeleteFilter &&\n (this.model as any).softDeletes &&\n !this.includeTrashed &&\n !this.onlyTrashedFlag &&\n !this.whereClauses.some((w) => w.column === \"deleted_at\")\n ) {\n this.whereClauses.push({ column: \"deleted_at\", operator: \"=\", value: null, boolean: \"and\" });\n this.appliedSoftDeleteFilter = true;\n }\n if (!this.whereClauses.length) return {};\n const andParts: any[] = [];\n const orParts: any[] = [];\n\n const toFilter = (w: WhereClause): any => {\n const op = (w.operator || \"=\").toLowerCase();\n const col = this.normalizeField(w.column);\n if (op === \"nested\" && Array.isArray(w.value)) {\n const nestedClauses = w.value as WhereClause[];\n const nestedBuilder = new EloquentBuilder<T>(this.model as any);\n (nestedBuilder as any).whereClauses = nestedClauses;\n const nestedFilter = nestedBuilder.buildMongoFilter();\n // If nested filter is empty, skip it\n if (!nestedFilter || Object.keys(nestedFilter).length === 0) return {};\n // Return the nested filter as-is (it will be part of AND by default since boolean defaults to 'and')\n return nestedFilter;\n }\n if (Array.isArray(w.value) && (op === \"in\" || op === \"not in\")) {\n const arr = w.value.map((v) =>\n this.isIdLikeField(w.column)\n ? this.coerceForField(w.column, v)\n : col === \"_id\"\n ? this.coerceId(v)\n : v,\n );\n return { [col]: op === \"in\" ? { $in: arr } : { $nin: arr } };\n }\n if (Array.isArray(w.value) && (op === \"between\" || op === \"not between\")) {\n const [a, b] = w.value;\n if (op === \"between\") return { [col]: { $gte: a, $lte: b } };\n return { $or: [{ [col]: { $lt: a } }, { [col]: { $gt: b } }] };\n }\n if (w.value === null) {\n if (op === \"=\") return { [col]: null };\n if (op === \"!=\" || op === \"<>\") return { [col]: { $ne: null } };\n }\n // simple ops\n let v = this.isIdLikeField(w.column)\n ? this.coerceForField(w.column, w.value)\n : col === \"_id\"\n ? this.coerceId(w.value)\n : w.value;\n switch (op) {\n case \"=\":\n return { [col]: v };\n case \"!=\":\n case \"<>\":\n return { [col]: { $ne: v } };\n case \">\":\n return { [col]: { $gt: v } };\n case \">=\":\n return { [col]: { $gte: v } };\n case \"<\":\n return { [col]: { $lt: v } };\n case \"<=\":\n return { [col]: { $lte: v } };\n case \"like\":\n return { [col]: { $regex: String(v).replace(/%/g, \".*\"), $options: \"i\" } };\n default:\n return { [col]: v };\n }\n };\n\n for (let i = 0; i < this.whereClauses.length; i++) {\n const w = this.whereClauses[i];\n const f = toFilter(w);\n if (!f || Object.keys(f).length === 0) continue;\n\n // Special handling: if this is a whereNull with an OR following, group them together\n // This handles the pattern: whereNull(col).orWhere(col, op, val)\n if (\n w.operator === \"=\" &&\n w.value === null &&\n i + 1 < this.whereClauses.length &&\n this.whereClauses[i + 1].column === w.column &&\n this.whereClauses[i + 1].boolean === \"or\"\n ) {\n // This whereNull is part of an OR group, so add it to orParts\n orParts.push(f);\n } else if ((w.boolean || \"and\") === \"or\") {\n orParts.push(f);\n } else {\n andParts.push(f);\n }\n }\n\n // Combine AND and OR parts correctly\n if (orParts.length && andParts.length) {\n // AND takes precedence: (AND conditions) AND (OR conditions)\n return { $and: [...andParts, { $or: orParts }] };\n }\n if (orParts.length) return { $or: orParts };\n if (andParts.length) return andParts.length === 1 ? andParts[0] : { $and: andParts };\n return {};\n }\n\n private async executeQueryMongo(): Promise<any[]> {\n const tableName = (this.model as typeof Model).getTable();\n const c = mongoCollection(tableName);\n let filter = this.buildMongoFilter();\n const sessionOpts = this.getMongoSessionOptions();\n const proj =\n this.selectedColumns && this.selectedColumns.length && this.selectedColumns[0] !== \"*\"\n ? Object.fromEntries(this.selectedColumns.map((k) => [this.normalizeField(k), 1]))\n : undefined;\n const findOpts: any = { ...sessionOpts };\n if (proj) findOpts.projection = proj;\n\n // When OR hasConditions exist alongside where clauses, broaden the fetch\n // so documents matching the OR has condition are also included.\n const hasOrConditions = this.hasConditions.some((cond) => (cond.boolean || \"and\") === \"or\");\n let originalWhereFilter: any = null;\n if (hasOrConditions && this.whereClauses.length > 0) {\n originalWhereFilter = filter;\n const orBranches: any[] = [];\n if (Object.keys(filter).length > 0) {\n orBranches.push(filter);\n }\n const instance = new (this.model as any)();\n for (const cond of this.hasConditions) {\n if ((cond.boolean || \"and\") !== \"or\") continue;\n const relMeta = (instance as any).getRelationship(cond.relation);\n if (!relMeta) continue;\n const relatedModel = relMeta.model as typeof Model;\n const relatedTable = (relatedModel as any).getTable();\n\n // Build constraint filter from the has condition's callback\n let relFilter: any = {};\n if (cond.callback) {\n const relBuilder = new EloquentBuilder(relatedModel);\n cond.callback(relBuilder as any);\n relFilter = (relBuilder as any).buildMongoFilter();\n }\n\n if (relMeta.type === \"belongsTo\") {\n // Foreign key is on this model (e.g. unit_id), pointing to related model's PK\n const foreignKey = relMeta.foreignKey || `${cond.relation}_id`;\n const rc = mongoCollection(relatedTable);\n const matchingDocs = await rc.find(relFilter, sessionOpts).project({ _id: 1 }).toArray();\n const matchingIds = matchingDocs.map((d: any) => d._id);\n if (matchingIds.length) {\n orBranches.push({ [this.normalizeField(foreignKey)]: { $in: matchingIds } });\n }\n } else if (relMeta.type === \"hasOne\" || relMeta.type === \"hasMany\") {\n // Foreign key is on the related model, pointing to this model's PK\n const foreignKey = relMeta.foreignKey || `${tableName}_id`;\n const parentPK = (this.model as any).primaryKey || \"id\";\n const rc = mongoCollection(relatedTable);\n const matchingDocs = await rc\n .find(relFilter, sessionOpts)\n .project({ [foreignKey]: 1 })\n .toArray();\n const parentIds = matchingDocs.map((d: any) => d[foreignKey]).filter(Boolean);\n if (parentIds.length) {\n orBranches.push({ [this.normalizeField(parentPK)]: { $in: parentIds } });\n }\n }\n // belongsToMany, morphOne, morphMany would need additional handling\n }\n\n if (orBranches.length > 1) {\n filter = { $or: orBranches };\n } else if (orBranches.length === 1) {\n filter = orBranches[0];\n }\n }\n\n let cursor = c.find(filter, findOpts);\n if (this.orderByColumn) {\n cursor = cursor.sort({\n [this.normalizeField(this.orderByColumn)]: this.orderByDirection === \"asc\" ? 1 : -1,\n });\n }\n // IMPORTANT: Apply limit and offset AFTER whereHas filtering, not before\n // So we don't apply them here yet if there are hasConditions\n if (this.offsetValue !== undefined && !this.hasConditions.length)\n cursor = cursor.skip(this.offsetValue);\n if (this.limitValue !== undefined && !this.hasConditions.length)\n cursor = cursor.limit(this.limitValue);\n let docs = await cursor.toArray();\n docs = docs.map((d) => {\n if (d && d._id && !(\"id\" in d)) d.id = String(d._id);\n return d;\n });\n // Post-filter by whereHas/whereDoesntHave conditions for Mongo\n if (this.hasConditions.length) {\n docs = await this.applyHasConditionsMongo(docs, originalWhereFilter);\n // NOW apply limit and offset after whereHas filtering\n if (this.offsetValue !== undefined) {\n docs = docs.slice(this.offsetValue);\n }\n if (this.limitValue !== undefined) {\n docs = docs.slice(0, this.limitValue);\n }\n }\n return docs;\n }\n\n private async updateMongo(values: Partial<Record<string, any>>): Promise<number> {\n const tableName = (this.model as typeof Model).getTable();\n const c = mongoCollection(tableName);\n const filter = this.buildMongoFilter();\n const sessionOpts = this.getMongoSessionOptions();\n let updateDoc: any;\n if (\n Object.values(values).some(\n (v) => v && typeof v === \"object\" && (\"$inc\" in (v as any) || \"$dec\" in (v as any)),\n )\n ) {\n // support increment-like doc\n updateDoc = {};\n for (const [k, v] of Object.entries(values)) {\n if (v && typeof v === \"object\" && (v as any).$inc !== undefined) {\n updateDoc.$inc = updateDoc.$inc || {};\n (updateDoc.$inc as any)[this.normalizeField(k)] = (v as any).$inc;\n } else if (v && typeof v === \"object\" && (v as any).$dec !== undefined) {\n updateDoc.$inc = updateDoc.$inc || {};\n (updateDoc.$inc as any)[this.normalizeField(k)] = -(v as any).$dec;\n } else {\n updateDoc.$set = updateDoc.$set || {};\n (updateDoc.$set as any)[this.normalizeField(k)] = this.coerceForField(k, v as any);\n }\n }\n } else {\n updateDoc = {\n $set: Object.fromEntries(\n Object.entries(values).map(([k, v]) => [\n this.normalizeField(k),\n this.coerceForField(k, v),\n ]),\n ),\n };\n }\n const res = await c.updateMany(filter, updateDoc, sessionOpts);\n return Number(res.modifiedCount || 0);\n }\n\n private async deleteMongo(): Promise<number> {\n const tableName = (this.model as typeof Model).getTable();\n const c = mongoCollection(tableName);\n const filter = this.buildMongoFilter();\n const sessionOpts = this.getMongoSessionOptions();\n const supportsSoft = Boolean((this.model as any).softDeletes);\n if (supportsSoft) {\n const res = await c.updateMany(filter, { $set: { deleted_at: new Date() } }, sessionOpts);\n return Number(res.modifiedCount || 0);\n }\n const res = await c.deleteMany(filter, sessionOpts);\n return Number(res.deletedCount || 0);\n }\n\n private async insertMongoMany(rows: Array<Record<string, any>>): Promise<number> {\n const tableName = (this.model as typeof Model).getTable();\n const c = mongoCollection(tableName);\n const docs = rows.map((r) => {\n const d: any = { ...r };\n if (\"id\" in d && d.id && !d._id) {\n try {\n d._id = new ObjectId(String(d.id));\n } catch {\n d._id = d.id;\n }\n delete d.id;\n }\n // normalize any *_id fields to ObjectId when possible\n Object.keys(d).forEach((k) => {\n if (/_id$/i.test(k) && d[k] !== undefined && d[k] !== null) {\n const v = d[k];\n if (!(v instanceof ObjectId)) {\n const s = String(v);\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n try {\n d[k] = new ObjectId(s);\n } catch {\n /* ignore */\n }\n }\n }\n }\n });\n return d;\n });\n const res = await c.insertMany(docs, this.getMongoSessionOptions());\n return Object.keys(res.insertedIds || {}).length;\n }\n\n private async countMongo(): Promise<number> {\n const tableName = (this.model as typeof Model).getTable();\n const c = mongoCollection(tableName);\n let filter = this.buildMongoFilter();\n const sessionOpts = this.getMongoSessionOptions();\n if (!this.hasConditions.length) {\n return await c.countDocuments(filter, sessionOpts);\n }\n // When OR hasConditions exist alongside where clauses, broaden the fetch\n const hasOrConditions = this.hasConditions.some((cond) => (cond.boolean || \"and\") === \"or\");\n let originalWhereFilter: any = null;\n if (hasOrConditions && this.whereClauses.length > 0) {\n originalWhereFilter = filter;\n const orBranches: any[] = [];\n if (Object.keys(filter).length > 0) {\n orBranches.push(filter);\n }\n const instance = new (this.model as any)();\n for (const cond of this.hasConditions) {\n if ((cond.boolean || \"and\") !== \"or\") continue;\n const relMeta = (instance as any).getRelationship(cond.relation);\n if (!relMeta) continue;\n const relatedModel = relMeta.model as typeof Model;\n const relatedTable = (relatedModel as any).getTable();\n\n let relFilter: any = {};\n if (cond.callback) {\n const relBuilder = new EloquentBuilder(relatedModel);\n cond.callback(relBuilder as any);\n relFilter = (relBuilder as any).buildMongoFilter();\n }\n\n if (relMeta.type === \"belongsTo\") {\n const foreignKey = relMeta.foreignKey || `${cond.relation}_id`;\n const rc = mongoCollection(relatedTable);\n const matchingDocs = await rc.find(relFilter, sessionOpts).project({ _id: 1 }).toArray();\n const matchingIds = matchingDocs.map((d: any) => d._id);\n if (matchingIds.length) {\n orBranches.push({ [this.normalizeField(foreignKey)]: { $in: matchingIds } });\n }\n } else if (relMeta.type === \"hasOne\" || relMeta.type === \"hasMany\") {\n const foreignKey = relMeta.foreignKey || `${tableName}_id`;\n const parentPK = (this.model as any).primaryKey || \"id\";\n const rc = mongoCollection(relatedTable);\n const matchingDocs = await rc\n .find(relFilter, sessionOpts)\n .project({ [foreignKey]: 1 })\n .toArray();\n const parentIds = matchingDocs.map((d: any) => d[foreignKey]).filter(Boolean);\n if (parentIds.length) {\n orBranches.push({ [this.normalizeField(parentPK)]: { $in: parentIds } });\n }\n }\n }\n\n if (orBranches.length > 1) {\n filter = { $or: orBranches };\n } else if (orBranches.length === 1) {\n filter = orBranches[0];\n }\n }\n // When whereHas/whereDoesntHave exist, fetch ALL fields (not just _id) so we can access foreign keys\n let docs = await c.find(filter, sessionOpts).toArray();\n docs = docs.map((d) => {\n if (d && d._id && !(\"id\" in d)) d.id = String(d._id);\n return d;\n });\n const kept = await this.applyHasConditionsMongo(docs, originalWhereFilter);\n return kept.length;\n }\n\n private async aggregateMongo(fn: string, column: string): Promise<string> {\n const tableName = (this.model as typeof Model).getTable();\n const c = mongoCollection(tableName);\n const filter = this.buildMongoFilter();\n const sessionOpts = this.getMongoSessionOptions();\n const field = this.normalizeField(column);\n const key = fn.toLowerCase();\n\n // Handle hasConditions (whereHas/whereDoesntHave) - requires in-memory filtering\n if (this.hasConditions.length) {\n // When OR hasConditions exist alongside where clauses, broaden the fetch\n const hasOrConditions = this.hasConditions.some((cond) => (cond.boolean || \"and\") === \"or\");\n let fetchFilter: any = filter;\n let originalWhereFilter: any = null;\n if (hasOrConditions && this.whereClauses.length > 0) {\n originalWhereFilter = filter;\n const orBranches: any[] = [];\n if (Object.keys(filter).length > 0) {\n orBranches.push(filter);\n }\n const instance = new (this.model as any)();\n for (const cond of this.hasConditions) {\n if ((cond.boolean || \"and\") !== \"or\") continue;\n const relMeta = (instance as any).getRelationship(cond.relation);\n if (!relMeta) continue;\n const relatedModel = relMeta.model as typeof Model;\n const relatedTable = (relatedModel as any).getTable();\n\n let relFilter: any = {};\n if (cond.callback) {\n const relBuilder = new EloquentBuilder(relatedModel);\n cond.callback(relBuilder as any);\n relFilter = (relBuilder as any).buildMongoFilter();\n }\n\n if (relMeta.type === \"belongsTo\") {\n const foreignKey = relMeta.foreignKey || `${cond.relation}_id`;\n const rc = mongoCollection(relatedTable);\n const matchingDocs = await rc\n .find(relFilter, sessionOpts)\n .project({ _id: 1 })\n .toArray();\n const matchingIds = matchingDocs.map((d: any) => d._id);\n if (matchingIds.length) {\n orBranches.push({ [this.normalizeField(foreignKey)]: { $in: matchingIds } });\n }\n } else if (relMeta.type === \"hasOne\" || relMeta.type === \"hasMany\") {\n const foreignKey = relMeta.foreignKey || `${tableName}_id`;\n const parentPK = (this.model as any).primaryKey || \"id\";\n const rc = mongoCollection(relatedTable);\n const matchingDocs = await rc\n .find(relFilter, sessionOpts)\n .project({ [foreignKey]: 1 })\n .toArray();\n const parentIds = matchingDocs.map((d: any) => d[foreignKey]).filter(Boolean);\n if (parentIds.length) {\n orBranches.push({ [this.normalizeField(parentPK)]: { $in: parentIds } });\n }\n }\n }\n\n if (orBranches.length > 1) {\n fetchFilter = { $or: orBranches };\n } else if (orBranches.length === 1) {\n fetchFilter = orBranches[0];\n }\n }\n\n // When whereHas/whereDoesntHave exist, fetch ALL fields so we can access foreign keys\n let cursor = c.find(fetchFilter, sessionOpts);\n\n // Apply sorting if specified (for consistent results)\n if (this.orderByColumn) {\n cursor = cursor.sort({\n [this.normalizeField(this.orderByColumn)]: this.orderByDirection === \"asc\" ? 1 : -1,\n });\n }\n\n let docs = await cursor.toArray();\n docs = docs.map((d) => {\n if (d && d._id && !(\"id\" in d)) d.id = String(d._id);\n return d;\n });\n\n // Apply whereHas/whereDoesntHave filtering\n const kept = await this.applyHasConditionsMongo(docs, originalWhereFilter);\n\n // Handle distinct\n let values: any[];\n if (this.distinctValue && column !== \"*\") {\n const uniqueVals = new Set(kept.map((d: any) => d[field]));\n values = Array.from(uniqueVals).map((v) => (typeof v === \"number\" ? v : Number(v) || 0));\n } else {\n values = kept.map((d: any) => Number(d[field]) || 0);\n }\n\n if (key === \"count\") {\n return String(this.distinctValue && column !== \"*\" ? values.length : kept.length);\n }\n\n // Calculate aggregate manually from filtered docs\n if (!values.length) return \"0\";\n switch (key) {\n case \"sum\":\n return String(values.reduce((a, b) => a + b, 0));\n case \"avg\":\n return String(values.reduce((a, b) => a + b, 0) / values.length);\n case \"max\":\n return String(Math.max(...values));\n case \"min\":\n return String(Math.min(...values));\n default:\n return \"0\";\n }\n }\n\n // No hasConditions - use native aggregation pipeline\n const pipeline: any[] = [{ $match: filter }];\n\n // Handle groupBy columns\n if (this.groupByColumns.length > 0) {\n const groupId: any = {};\n this.groupByColumns.forEach((col) => {\n const normalizedCol = this.normalizeField(col);\n groupId[normalizedCol] = `$${normalizedCol}`;\n });\n\n const aggOp: any = {\n count: { $sum: 1 },\n sum: { $sum: `$${field}` },\n avg: { $avg: `$${field}` },\n max: { $max: `$${field}` },\n min: { $min: `$${field}` },\n };\n\n pipeline.push({ $group: { _id: groupId, agg: aggOp[key] || { $sum: 1 } } });\n\n // Handle having clauses\n if (this.havingClauses.length > 0) {\n const havingMatch: any = {};\n this.havingClauses.forEach((h) => {\n const col = h.column === \"agg\" ? \"agg\" : this.normalizeField(h.column);\n const op = (h.operator || \"=\").toLowerCase();\n switch (op) {\n case \"=\":\n havingMatch[col] = h.value;\n break;\n case \">\":\n havingMatch[col] = { $gt: h.value };\n break;\n case \">=\":\n havingMatch[col] = { $gte: h.value };\n break;\n case \"<\":\n havingMatch[col] = { $lt: h.value };\n break;\n case \"<=\":\n havingMatch[col] = { $lte: h.value };\n break;\n case \"!=\":\n case \"<>\":\n havingMatch[col] = { $ne: h.value };\n break;\n }\n });\n if (Object.keys(havingMatch).length > 0) {\n pipeline.push({ $match: havingMatch });\n }\n }\n\n // Return first group result\n const res = await c.aggregate(pipeline, sessionOpts).toArray();\n return String(res[0]?.agg ?? 0);\n }\n\n // Simple aggregation without groupBy\n const map: any = {\n count: { $sum: 1 },\n sum: { $sum: `$${field}` },\n avg: { $avg: `$${field}` },\n max: { $max: `$${field}` },\n min: { $min: `$${field}` },\n };\n\n // Handle count with distinctValue\n if (key === \"count\") {\n if (this.distinctValue && column !== \"*\") {\n // Count distinct values\n pipeline.push({ $group: { _id: `$${field}` } });\n pipeline.push({ $count: \"agg\" });\n const res = await c.aggregate(pipeline, sessionOpts).toArray();\n return String(res[0]?.agg ?? 0);\n }\n return String(await c.countDocuments(filter, sessionOpts));\n }\n\n pipeline.push({ $group: { _id: null, agg: map[key] } });\n const res = await c.aggregate(pipeline, sessionOpts).toArray();\n return String(res[0]?.agg ?? 0);\n }\n\n // Mongo relation loaders\n private async loadHasOneMongo(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n const localKey = rel.localKey || (this.model as any).primaryKey || \"id\";\n const foreignKey = rel.foreignKey || `${(this.model as typeof Model).getTable()}_id`;\n const localsRaw = models\n .map((m) => (m as any).getAttribute(localKey))\n .filter((v: any) => v !== undefined && v !== null);\n if (!localsRaw.length) return;\n let matchVals: any[] = Array.from(new Set(localsRaw));\n // If comparing id to non-_id foreign key, expand forms to handle first8/number cases\n if (localKey === \"id\") {\n matchVals = Array.from(new Set(localsRaw.flatMap((v) => this.expandIdForms(v))));\n }\n const c = mongoCollection(relatedTable);\n const rows = await c.find({ [foreignKey]: { $in: matchVals } }).toArray();\n const byFK = new Map<any, any>();\n rows.forEach((r) => {\n if (r && r._id && !(\"id\" in r)) r.id = String(r._id);\n byFK.set(r[foreignKey], r);\n });\n // Also map stringified values for robustness\n rows.forEach((r) => {\n byFK.set(String(r[foreignKey]), r);\n });\n models.forEach((m) => {\n const key = (m as any).getAttribute(localKey);\n const candidates = this.expandIdForms(key)\n .map((v) => byFK.get(v) || byFK.get(String(v)))\n .filter(Boolean);\n const row = candidates[0] || null;\n if (row) {\n const inst = new (relatedModel as any)();\n inst.hydrate(row);\n this.setRelation(m, relation, inst);\n } else this.setRelation(m, relation, null);\n });\n }\n\n private async loadHasManyMongo(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n const localKey = rel.localKey || (this.model as any).primaryKey || \"id\";\n const foreignKey = rel.foreignKey || `${(this.model as typeof Model).getTable()}_id`;\n const localsRaw = models\n .map((m) => (m as any).getAttribute(localKey))\n .filter((v: any) => v !== undefined && v !== null);\n if (!localsRaw.length) {\n models.forEach((m) => this.setRelation(m, relation, []));\n return;\n }\n let matchVals: any[] = Array.from(new Set(localsRaw));\n if (localKey === \"id\")\n matchVals = Array.from(new Set(localsRaw.flatMap((v) => this.expandIdForms(v))));\n const c = mongoCollection(relatedTable);\n const rows = await c.find({ [foreignKey]: { $in: matchVals } }).toArray();\n const grouped = new Map<any, any>();\n rows.forEach((r) => {\n if (r && r._id && !(\"id\" in r)) r.id = String(r._id);\n const k = r[foreignKey];\n if (!grouped.has(k)) grouped.set(k, []);\n grouped.get(k)!.push(r);\n // also index by string key\n const ks = String(k);\n if (!grouped.has(ks)) grouped.set(ks, []);\n grouped.get(ks)!.push(r);\n });\n models.forEach((m) => {\n const key = (m as any).getAttribute(localKey);\n const keys = this.expandIdForms(key).map((v) => String(v));\n const acc: any[] = [];\n keys.forEach((k) => {\n const arr = grouped.get(k) || grouped.get(key) || [];\n if (arr.length) acc.push(...arr);\n });\n const uniq = Array.from(\n new Set(acc.map((x) => (x._id ? String(x._id) : JSON.stringify(x)))),\n ).map((id) => acc.find((x) => (x._id ? String(x._id) : JSON.stringify(x)) === id));\n const list = uniq.map((row) => {\n const inst = new (relatedModel as any)();\n inst.hydrate(row!);\n return inst;\n });\n this.setRelation(m, relation, list);\n });\n }\n\n private async loadBelongsToMongo(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n const foreignKey = rel.foreignKey || `${relation}_id`;\n const ownerKey = rel.ownerKey || relatedPK || \"id\";\n const foreignIdsRaw = models\n .map((m) => (m as any).getAttribute(foreignKey))\n .filter((v: any) => v !== undefined && v !== null);\n if (!foreignIdsRaw.length) {\n models.forEach((m) => this.setRelation(m, relation, null));\n return;\n }\n const c = mongoCollection(relatedTable);\n let rows: any[] = [];\n if (ownerKey === \"id\") {\n // Separate clearly valid ObjectIds and short ids (first8 digits stored)\n const asStrings = foreignIdsRaw.map((v: any) => String(v));\n const oidList: ObjectId[] = [];\n const shortTokens: string[] = [];\n asStrings.forEach((s) => {\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n try {\n oidList.push(new ObjectId(s));\n } catch {}\n }\n // accept any token length up to 8 for prefix match\n if (/^[0-9a-fA-F]{1,8}$/.test(s)) {\n shortTokens.push(s);\n }\n });\n const or: any[] = [];\n if (oidList.length) or.push({ _id: { $in: oidList } });\n if (shortTokens.length) {\n const tokenSet = Array.from(new Set(shortTokens));\n const prefixExprs = tokenSet.map((t) => ({\n $expr: { $eq: [{ $substrBytes: [{ $toString: \"$_id\" }, 0, t.length] }, t] },\n }));\n or.push(...prefixExprs);\n }\n rows = await c.find(or.length ? { $or: or } : {}).toArray();\n } else {\n const ids = Array.from(new Set(foreignIdsRaw));\n rows = await c.find({ [ownerKey]: { $in: ids } as any }).toArray();\n }\n const map = new Map<any, any>();\n rows.forEach((r) => {\n if (r && r._id && !(\"id\" in r)) r.id = String(r._id);\n map.set(String(r._id), r);\n });\n // also map by first8 token to support numeric/digit matching\n rows.forEach((r) => {\n const token = String(r._id).slice(0, 8);\n map.set(token, r);\n });\n models.forEach((m) => {\n const fk = (m as any).getAttribute(foreignKey);\n const candidates = this.expandIdForms(fk)\n .map((v) => map.get(String(v)))\n .filter(Boolean);\n const row = candidates[0] || null;\n if (row) {\n const inst = new (relatedModel as any)();\n inst.hydrate(row);\n this.setRelation(m, relation, inst);\n } else this.setRelation(m, relation, null);\n });\n }\n\n private async loadBelongsToManyMongo_(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n const pivotTable = rel.table;\n const parentPK = (this.model as any).primaryKey || \"id\";\n const foreignPivotKey = rel.foreignKey || `${(this.model as any).getTable()}_id`;\n const relatedPivotKey = rel.relatedKey || `${relatedTable}_id`;\n const parentRaw = models\n .map((m) => (m as any).getAttribute(parentPK))\n .filter((v: any) => v !== undefined && v !== null);\n if (!parentRaw.length) {\n models.forEach((m) => this.setRelation(m, relation, []));\n return;\n }\n const parentMatch =\n parentPK === \"id\"\n ? Array.from(new Set(parentRaw.flatMap((v) => this.expandIdForms(v))))\n : Array.from(new Set(parentRaw));\n const pc = mongoCollection(pivotTable);\n const pivots = await pc.find({ [foreignPivotKey]: { $in: parentMatch } }).toArray();\n if (!pivots.length) {\n models.forEach((m) => this.setRelation(m, relation, []));\n return;\n }\n // Gather related ids, allow string/number forms\n const relatedTokens = Array.from(new Set(pivots.map((p: any) => String(p[relatedPivotKey]))));\n const rc = mongoCollection(relatedTable);\n let rows: any[] = [];\n if (relatedPK === \"id\") {\n const oidList: ObjectId[] = [];\n const shortTokens: string[] = [];\n relatedTokens.forEach((s) => {\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n try {\n oidList.push(new ObjectId(s));\n } catch {}\n }\n if (/^[0-9a-fA-F]{1,8}$/.test(s)) {\n shortTokens.push(s);\n }\n });\n const or: any[] = [];\n if (oidList.length) or.push({ _id: { $in: oidList } });\n if (shortTokens.length) {\n const tokenSet = Array.from(new Set(shortTokens));\n const prefixExprs = tokenSet.map((t) => ({\n $expr: { $eq: [{ $substrBytes: [{ $toString: \"$_id\" }, 0, t.length] }, t] },\n }));\n or.push(...prefixExprs);\n }\n rows = await rc.find(or.length ? { $or: or } : {}).toArray();\n } else {\n rows = await rc.find({ [relatedPK]: { $in: relatedTokens } as any }).toArray();\n }\n const rmap = new Map<any, any>();\n rows.forEach((r) => {\n if (r && r._id && !(\"id\" in r)) r.id = String(r._id);\n const idStr = String(r._id);\n const token = idStr.slice(0, 8);\n rmap.set(idStr, r);\n rmap.set(token, r);\n });\n const grouped = new Map<any, any[]>();\n pivots.forEach((p: any) => {\n const pidVal = p[foreignPivotKey];\n const pidStr = String(pidVal);\n const ridStr = String(p[relatedPivotKey]);\n const relRow = rmap.get(ridStr) || rmap.get(String(ridStr));\n if (relRow) {\n if (!grouped.has(pidVal)) grouped.set(pidVal, []);\n grouped.get(pidVal)!.push(relRow);\n // also index by string form of parent id for lookup flexibility\n if (!grouped.has(pidStr)) grouped.set(pidStr, []);\n grouped.get(pidStr)!.push(relRow);\n }\n });\n models.forEach((m) => {\n const pid = (m as any).getAttribute(parentPK);\n const forms = parentPK === \"id\" ? this.expandIdForms(pid) : [pid];\n const seen = new Set<string>();\n const collected: any[] = [];\n forms.forEach((f) => {\n const fStr = String(f);\n const arr = grouped.get(f) || grouped.get(fStr) || [];\n for (const r of arr) {\n const sid = r._id ? String(r._id) : JSON.stringify(r);\n if (!seen.has(sid)) {\n seen.add(sid);\n collected.push(r);\n }\n }\n });\n const list = collected.map((row) => {\n const inst = new (relatedModel as any)();\n inst.hydrate(row);\n return inst;\n });\n this.setRelation(m, relation, list);\n });\n }\n\n private async loadMorphRelationsMongo(\n models: T[],\n relation: string,\n rel: any,\n relatedModel: typeof Model,\n relatedTable: string,\n relatedPK: string,\n options: EagerLoadOptions,\n ): Promise<void> {\n const morphType = rel.morphName || (this.model as typeof Model).getTable();\n const foreignKey = rel.foreignKey || `${morphType}_id`;\n const morphTypeKey = rel.morphType || `${morphType}_type`;\n const localsRaw = models\n .map((m) => (m as any).getAttribute(\"id\"))\n .filter((v: any) => v !== undefined);\n if (!localsRaw.length) {\n models.forEach((m) => this.setRelation(m, relation, rel.type === \"morphOne\" ? null : []));\n return;\n }\n const matchVals = Array.from(new Set(localsRaw.flatMap((v) => this.expandIdForms(v))));\n const c = mongoCollection(relatedTable);\n const rows = await c\n .find({ [foreignKey]: { $in: matchVals }, [morphTypeKey]: morphType } as any)\n .toArray();\n if (rel.type === \"morphOne\") {\n const byFK = new Map<any, any>();\n rows.forEach((r) => {\n if (r && r._id && !(\"id\" in r)) r.id = String(r._id);\n byFK.set(r[foreignKey], r);\n byFK.set(String(r[foreignKey]), r);\n });\n models.forEach((m) => {\n const key = (m as any).getAttribute(\"id\");\n const cand = this.expandIdForms(key);\n const row = cand.map((v) => byFK.get(v) || byFK.get(String(v))).find(Boolean) || null;\n if (row) {\n const inst = new (relatedModel as any)();\n inst.hydrate(row);\n this.setRelation(m, relation, inst);\n } else this.setRelation(m, relation, null);\n });\n } else {\n const grouped = new Map<any, any>();\n rows.forEach((r) => {\n const k = r[foreignKey];\n if (r && r._id && !(\"id\" in r)) r.id = String(r._id);\n if (!grouped.has(k)) grouped.set(k, []);\n grouped.get(k)!.push(r);\n const ks = String(k);\n if (!grouped.has(ks)) grouped.set(ks, []);\n grouped.get(ks)!.push(r);\n });\n models.forEach((m) => {\n const key = (m as any).getAttribute(\"id\");\n const keys = this.expandIdForms(key).map((v) => String(v));\n const acc: any[] = [];\n keys.forEach((k) => {\n const arr = grouped.get(k) || [];\n if (arr.length) acc.push(...arr);\n });\n const uniq = Array.from(\n new Set(acc.map((x) => (x._id ? String(x._id) : JSON.stringify(x)))),\n ).map((id) => acc.find((x) => (x._id ? String(x._id) : JSON.stringify(x)) === id));\n const list = uniq.map((row) => {\n const inst = new (relatedModel as any)();\n inst.hydrate(row!);\n return inst;\n });\n this.setRelation(m, relation, list);\n });\n }\n }\n}\n","// relationships.ts\nimport { Model } from \"./Model.js\";\nimport { EloquentBuilder } from \"./EloquentBuilder.js\";\nimport { collection as mongoCollection, getDbType, query as dbQuery } from \"./connection.js\";\nimport { ObjectId } from \"mongodb\";\n\n// Helper: coerce 24-hex strings to ObjectId when writing *_id fields in Mongo\nconst toObjectIdIfHex = (v: any) => {\n if (v === null || v === undefined) return v;\n if (v instanceof ObjectId) return v;\n const s = String(v);\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n try {\n return new ObjectId(s);\n } catch {\n /*noop*/\n }\n }\n return v;\n};\nconst coerceFK = (field: string, value: any) =>\n /_id$/i.test(field) ? toObjectIdIfHex(value) : value;\n\nexport abstract class Relation<T extends Model> {\n protected builder: EloquentBuilder<T>;\n protected parent: Model;\n protected related: typeof Model;\n\n constructor(related: typeof Model, parent: Model) {\n this.related = related;\n this.parent = parent;\n this.builder = new EloquentBuilder<T>(related as any);\n }\n\n abstract getResults(): Promise<T | T[] | null>;\n\n // ─── Promise / thenable protocol ─────────────────────────────────────────────\n // Allows `await user.profile()` to automatically resolve via getResults(),\n // eliminating the need to always call .getResults() or .first() explicitly.\n\n then<TResult1 = T | T[] | null, TResult2 = never>(\n onfulfilled?: ((value: T | T[] | null) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return (this.getResults() as Promise<any>).then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null,\n ): Promise<T | T[] | null | TResult> {\n return (this.getResults() as Promise<any>).catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T | T[] | null> {\n return (this.getResults() as Promise<any>).finally(onfinally);\n }\n\n // ─── FK application hook ─────────────────────────────────────────────────────\n // Subclasses override this to apply their FK WHERE clause to the builder.\n // It must be idempotent (guard with a flag — see HasOne/HasMany/BelongsTo).\n // Returns false when the parent has no key, signalling the caller should\n // return an empty result rather than an unbounded query.\n protected applyConstraints(): boolean {\n return true;\n }\n\n // ─── Builder-returning methods ────────────────────────────────────────────────\n\n /**\n * Return the underlying EloquentBuilder with the FK constraint pre-applied.\n * Use this to chain additional builder methods before executing:\n * user.posts().query().where('published', 1).orderBy('created_at').get()\n */\n query(): EloquentBuilder<T> {\n this.applyConstraints();\n return this.builder;\n }\n\n // ─── Execution shortcuts ──────────────────────────────────────────────────────\n\n /**\n * Execute the relation query and return all matching model instances.\n * await user.posts().get()\n * await user.posts().where('published', 1).get()\n */\n async get(): Promise<T[]> {\n this.applyConstraints();\n return this.builder.get();\n }\n\n async first(): Promise<T | null> {\n this.applyConstraints();\n return this.builder.first();\n }\n\n async firstOrFail(): Promise<T> {\n this.applyConstraints();\n return this.builder.firstOrFail();\n }\n\n async paginate(perPage: number = 15, page: number = 1) {\n this.applyConstraints();\n return this.builder.paginate(perPage, page);\n }\n\n async pluck(column: string, key?: string): Promise<any[] | Record<string, any>> {\n this.applyConstraints();\n return this.builder.pluck(column, key);\n }\n\n async value(column: string): Promise<any> {\n this.applyConstraints();\n return this.builder.value(column);\n }\n\n async sole(): Promise<T> {\n this.applyConstraints();\n return this.builder.sole();\n }\n\n async count(): Promise<number> {\n this.applyConstraints();\n return this.builder.count();\n }\n\n async exists(): Promise<boolean> {\n this.applyConstraints();\n return this.builder.exists();\n }\n\n async doesntExist(): Promise<boolean> {\n this.applyConstraints();\n return this.builder.doesntExist();\n }\n\n // ─── Fluent filter passthrough ────────────────────────────────────────────────\n\n where(column: string, operator?: any, value?: any): this {\n this.applyConstraints();\n this.builder.where(column, operator, value);\n return this;\n }\n\n orWhere(column: string, operator?: any, value?: any): this {\n this.applyConstraints();\n this.builder.orWhere(column, operator, value);\n return this;\n }\n\n whereIn(column: string, values: any[]): this {\n this.applyConstraints();\n this.builder.whereIn(column, values);\n return this;\n }\n\n whereNotIn(column: string, values: any[]): this {\n this.applyConstraints();\n this.builder.whereNotIn(column, values);\n return this;\n }\n\n whereNull(column: string): this {\n this.applyConstraints();\n this.builder.whereNull(column);\n return this;\n }\n\n whereNotNull(column: string): this {\n this.applyConstraints();\n this.builder.whereNotNull(column);\n return this;\n }\n\n orderBy(column: string, direction: \"asc\" | \"desc\" = \"asc\"): this {\n this.applyConstraints();\n this.builder.orderBy(column, direction);\n return this;\n }\n\n latest(column: string = \"created_at\"): this {\n this.applyConstraints();\n this.builder.latest(column);\n return this;\n }\n\n oldest(column: string = \"created_at\"): this {\n this.applyConstraints();\n this.builder.oldest(column);\n return this;\n }\n\n limit(limit: number): this {\n this.applyConstraints();\n this.builder.limit(limit);\n return this;\n }\n\n offset(offset: number): this {\n this.applyConstraints();\n this.builder.offset(offset);\n return this;\n }\n\n with(relations: string | string[] | Record<string, any>): this {\n this.applyConstraints();\n this.builder.with(relations);\n return this;\n }\n\n select(columns: string[] | string): this {\n this.applyConstraints();\n this.builder.select(columns);\n return this;\n }\n\n getQuery(): EloquentBuilder<T> {\n this.applyConstraints();\n return this.builder;\n }\n}\n\nexport class HasOne<T extends Model> extends Relation<T> {\n private defaultAttributes?: Record<string, any> | true;\n private fkApplied = false;\n\n constructor(\n protected relatedModel: typeof Model,\n protected foreignKey: string,\n protected localKey: string = \"id\",\n parent: Model,\n ) {\n super(relatedModel, parent);\n }\n\n /**\n * Apply the FK constraint exactly once; subsequent calls are no-ops.\n * This prevents duplicate WHERE clauses when getResults()/first() are\n * called more than once on the same relation instance.\n */\n protected applyFk(): boolean {\n if (this.fkApplied) return true;\n const localValue = (this.parent as any).getAttribute(this.localKey);\n if (localValue === undefined || localValue === null) return false;\n this.builder.where(this.foreignKey, localValue);\n this.fkApplied = true;\n return true;\n }\n\n protected applyConstraints(): boolean {\n return this.applyFk();\n }\n\n async getResults(): Promise<T | null> {\n if (!this.applyFk()) return this.resolveDefault();\n const result = await this.builder.first();\n return result ?? this.resolveDefault();\n }\n\n async first(): Promise<T | null> {\n if (!this.applyFk()) return this.resolveDefault();\n const result = await this.builder.first();\n return result ?? this.resolveDefault();\n }\n\n /**\n * Provide a default model when the relation returns null.\n * Pass `true` for an empty instance, or a plain object for pre-filled attributes.\n *\n * @example user.profile().withDefault({ gender: 'unknown' })\n */\n withDefault(attributes: Record<string, any> | true = true): this {\n this.defaultAttributes = attributes;\n return this;\n }\n\n private resolveDefault(): T | null {\n if (!this.defaultAttributes) return null;\n const instance = new (this.relatedModel as any)() as T;\n if (typeof this.defaultAttributes === \"object\") {\n Object.entries(this.defaultAttributes).forEach(([k, v]) =>\n (instance as any).setAttribute(k, v),\n );\n }\n return instance;\n }\n\n // HasOne specific methods\n async create(attributes: Record<string, any>): Promise<T> {\n const foreignValue = (this.parent as any).getAttribute(this.localKey);\n attributes[this.foreignKey] = foreignValue;\n\n const instance = new (this.relatedModel as any)(attributes) as T;\n await (instance as any).save();\n return instance;\n }\n\n async update(attributes: Record<string, any>): Promise<number> {\n const localValue = (this.parent as any).getAttribute(this.localKey);\n if (localValue === undefined || localValue === null) return 0;\n\n return await this.builder.where(this.foreignKey, localValue).update(attributes);\n }\n\n async save(model: T): Promise<T> {\n const localValue = (this.parent as any).getAttribute(this.localKey);\n (model as any).setAttribute(this.foreignKey, localValue);\n await (model as any).save();\n return model;\n }\n\n // Association management\n async associate(model: T | null): Promise<void> {\n const localValue = (this.parent as any).getAttribute(this.localKey);\n\n if (model === null) {\n // Dissociate\n await this.builder.where(this.foreignKey, localValue).update({ [this.foreignKey]: null });\n } else {\n const foreignValue = (model as any).getAttribute(\n (this.relatedModel as any).primaryKey || \"id\",\n );\n if (!foreignValue) {\n await (model as any).save();\n }\n (model as any).setAttribute(this.foreignKey, localValue);\n await (model as any).save();\n }\n }\n\n async dissociate(): Promise<void> {\n return this.associate(null);\n }\n}\n\nexport class HasMany<T extends Model> extends Relation<T> {\n private fkApplied = false;\n\n constructor(\n protected relatedModel: typeof Model,\n protected foreignKey: string,\n protected localKey: string = \"id\",\n parent: Model,\n ) {\n super(relatedModel, parent);\n }\n\n protected applyFk(): boolean {\n if (this.fkApplied) return true;\n const localValue = (this.parent as any).getAttribute(this.localKey);\n if (localValue === undefined || localValue === null) return false;\n this.builder.where(this.foreignKey, localValue);\n this.fkApplied = true;\n return true;\n }\n\n protected applyConstraints(): boolean {\n return this.applyFk();\n }\n\n async getResults(): Promise<T[]> {\n if (!this.applyFk()) return [];\n return await this.builder.get();\n }\n\n async first(): Promise<T | null> {\n if (!this.applyFk()) return null;\n return await this.builder.first();\n }\n\n // HasMany specific methods\n async create(attributes: Record<string, any>): Promise<T> {\n const foreignValue = (this.parent as any).getAttribute(this.localKey);\n attributes[this.foreignKey] = foreignValue;\n\n const instance = new (this.relatedModel as any)(attributes) as T;\n await (instance as any).save();\n return instance;\n }\n\n async createMany(rows: Array<Record<string, any>>): Promise<T[]> {\n const foreignValue = (this.parent as any).getAttribute(this.localKey);\n const instances: T[] = [];\n\n for (const row of rows) {\n row[this.foreignKey] = foreignValue;\n const instance = new (this.relatedModel as any)(row) as T;\n await (instance as any).save();\n instances.push(instance);\n }\n\n return instances;\n }\n\n async save(model: T): Promise<T> {\n const foreignValue = (this.parent as any).getAttribute(this.localKey);\n (model as any).setAttribute(this.foreignKey, foreignValue);\n await (model as any).save();\n return model;\n }\n\n // Collection management\n async attach(model: T | number | string): Promise<void> {\n const dbType = getDbType();\n let relatedId: number | string;\n\n if (typeof model === \"number\" || typeof model === \"string\") {\n relatedId = model;\n } else {\n relatedId = (model as any).getAttribute((this.relatedModel as any).primaryKey || \"id\");\n if (!relatedId) {\n await (model as any).save();\n relatedId = (model as any).getAttribute((this.relatedModel as any).primaryKey || \"id\");\n }\n }\n\n const foreignValue = (this.parent as any).getAttribute(this.localKey);\n if (dbType === \"mongodb\") {\n const c = mongoCollection((this.relatedModel as typeof Model).getTable());\n const pk = (this.relatedModel as any).primaryKey || \"id\";\n let filter: any;\n if (pk === \"id\") {\n const s = String(relatedId);\n try {\n filter = { _id: new ObjectId(s) };\n } catch {\n filter = { _id: s };\n }\n } else {\n filter = { [pk]: relatedId } as any;\n }\n const fkValue = coerceFK(this.foreignKey, foreignValue);\n await c.updateOne(filter, { $set: { [this.foreignKey]: fkValue } });\n return;\n }\n await dbQuery(\n `UPDATE ${(this.relatedModel as typeof Model).getTable()} SET ${this.foreignKey} = ? WHERE ${(this.relatedModel as any).primaryKey || \"id\"} = ?`,\n [foreignValue, relatedId],\n );\n }\n\n async detach(model?: T | number | string): Promise<number> {\n const foreignValue = (this.parent as any).getAttribute(this.localKey);\n const dbType = getDbType();\n\n if (model === undefined) {\n // Detach all\n if (dbType === \"mongodb\") {\n const c = mongoCollection((this.relatedModel as typeof Model).getTable());\n const res = await c.updateMany(\n { [this.foreignKey]: coerceFK(this.foreignKey, foreignValue) } as any,\n { $set: { [this.foreignKey]: null } },\n );\n return Number(res.modifiedCount || 0);\n }\n return await this.builder\n .where(this.foreignKey, foreignValue)\n .update({ [this.foreignKey]: null });\n }\n\n let relatedId: number | string;\n\n if (typeof model === \"number\" || typeof model === \"string\") {\n relatedId = model;\n } else {\n relatedId = (model as any).getAttribute((this.relatedModel as any).primaryKey || \"id\");\n }\n\n if (dbType === \"mongodb\") {\n const c = mongoCollection((this.relatedModel as typeof Model).getTable());\n const pk = (this.relatedModel as any).primaryKey || \"id\";\n let filter: any;\n if (pk === \"id\") {\n const s = String(relatedId);\n try {\n filter = {\n _id: new ObjectId(s),\n [this.foreignKey]: coerceFK(this.foreignKey, foreignValue),\n };\n } catch {\n filter = { _id: s, [this.foreignKey]: coerceFK(this.foreignKey, foreignValue) };\n }\n } else {\n filter = {\n [pk]: relatedId,\n [this.foreignKey]: coerceFK(this.foreignKey, foreignValue),\n } as any;\n }\n const res = await c.updateOne(filter, { $set: { [this.foreignKey]: null } });\n return Number(res.modifiedCount || 0);\n }\n return await dbQuery(\n `UPDATE ${(this.relatedModel as typeof Model).getTable()} SET ${this.foreignKey} = NULL WHERE ${(this.relatedModel as any).primaryKey || \"id\"} = ? AND ${this.foreignKey} = ?`,\n [relatedId, foreignValue],\n ).then((result: any) => result.affectedRows || 0);\n }\n\n async sync(\n models: (T | number | string)[],\n detaching: boolean = true,\n ): Promise<{ attached: any[]; detached: any[]; updated: any[] }> {\n const foreignValue = (this.parent as any).getAttribute(this.localKey);\n const current = await this.getResults();\n const currentIds = new Set(\n current.map((item) =>\n (item as any).getAttribute((this.relatedModel as any).primaryKey || \"id\"),\n ),\n );\n\n const newIds = new Set();\n const modelsToSync: T[] = [];\n\n // Process new models/ids\n for (const model of models) {\n let relatedId: number | string;\n let modelInstance: T;\n\n if (typeof model === \"number\" || typeof model === \"string\") {\n relatedId = model;\n modelInstance = (await (this.relatedModel as any).find(relatedId)) as T;\n if (!modelInstance) continue;\n } else {\n modelInstance = model;\n relatedId = (model as any).getAttribute((this.relatedModel as any).primaryKey || \"id\");\n if (!relatedId) {\n await (model as any).save();\n relatedId = (model as any).getAttribute((this.relatedModel as any).primaryKey || \"id\");\n }\n }\n\n newIds.add(relatedId);\n modelsToSync.push(modelInstance);\n }\n\n const attached: any[] = [];\n const detached: any[] = [];\n const updated: any[] = [];\n\n // Detach removed models\n if (detaching) {\n for (const currentId of currentIds) {\n if (!newIds.has(currentId)) {\n await this.detach(currentId);\n detached.push(currentId);\n }\n }\n }\n\n // Attach/update new models\n for (const model of modelsToSync) {\n const relatedId = (model as any).getAttribute((this.relatedModel as any).primaryKey || \"id\");\n\n if (currentIds.has(relatedId)) {\n // Update existing\n await (model as any).save();\n updated.push(relatedId);\n } else {\n // Attach new\n await this.attach(model);\n attached.push(relatedId);\n }\n }\n\n return { attached, detached, updated };\n }\n}\n\nexport class BelongsTo<T extends Model> extends Relation<T> {\n private defaultAttributes?: Record<string, any> | true;\n private fkApplied = false;\n\n constructor(\n private relatedModel: typeof Model,\n private foreignKey: string,\n private ownerKey: string = \"id\",\n parent: Model,\n ) {\n super(relatedModel, parent);\n }\n\n protected applyFk(): boolean {\n if (this.fkApplied) return true;\n const foreignValue = (this.parent as any).getAttribute(this.foreignKey);\n if (foreignValue === undefined || foreignValue === null) return false;\n this.builder.where(this.ownerKey, foreignValue);\n this.fkApplied = true;\n return true;\n }\n\n protected applyConstraints(): boolean {\n return this.applyFk();\n }\n\n async getResults(): Promise<T | null> {\n if (!this.applyFk()) return this.resolveDefault();\n const result = await this.builder.first();\n return result ?? this.resolveDefault();\n }\n\n async first(): Promise<T | null> {\n if (!this.applyFk()) return this.resolveDefault();\n const result = await this.builder.first();\n return result ?? this.resolveDefault();\n }\n\n withDefault(attributes: Record<string, any> | true = true): this {\n this.defaultAttributes = attributes;\n return this;\n }\n\n private resolveDefault(): T | null {\n if (!this.defaultAttributes) return null;\n const instance = new (this.relatedModel as any)() as T;\n if (typeof this.defaultAttributes === \"object\") {\n Object.entries(this.defaultAttributes).forEach(([k, v]) =>\n (instance as any).setAttribute(k, v),\n );\n }\n return instance;\n }\n\n // BelongsTo specific methods\n async associate(model: T | number | string | null): Promise<void> {\n if (model === null) {\n // Dissociate\n (this.parent as any).setAttribute(this.foreignKey, null);\n await (this.parent as any).save();\n return;\n }\n\n let relatedId: number | string;\n\n if (typeof model === \"number\" || typeof model === \"string\") {\n relatedId = model;\n } else {\n relatedId = (model as any).getAttribute(this.ownerKey);\n if (!relatedId) {\n await (model as any).save();\n relatedId = (model as any).getAttribute(this.ownerKey);\n }\n }\n\n (this.parent as any).setAttribute(this.foreignKey, relatedId);\n await (this.parent as any).save();\n }\n\n async dissociate(): Promise<void> {\n return this.associate(null);\n }\n\n // Update the related model\n async update(attributes: Record<string, any>): Promise<number> {\n const related = await this.getResults();\n if (!related) return 0;\n\n return await (related as any).update(attributes).then(() => 1);\n }\n}\n\nexport class BelongsToMany<T extends Model> extends Relation<T> {\n private pivotColumns: string[] = [];\n private pivotWheres: Array<{ column: string; operator: string; value: any }> = [];\n\n constructor(\n private relatedModel: typeof Model,\n private pivotTable: string,\n private foreignPivotKey: string,\n private relatedPivotKey: string,\n private parentPrimaryKey: string = \"id\",\n private relatedPrimaryKey: string = \"id\",\n parent: Model,\n public pivotModel?: typeof Model,\n ) {\n super(relatedModel, parent);\n // Ensure pivot model traits are booted so softDeletes flag is set\n if (pivotModel && typeof (pivotModel as any).ensureBooted === \"function\") {\n (pivotModel as any).ensureBooted();\n }\n }\n\n /** Returns true when the pivot model has the SoftDeletes trait applied */\n private get pivotSoftDeletes(): boolean {\n return !!(this.pivotModel && (this.pivotModel as any).softDeletes);\n }\n\n /**\n * Build the extra WHERE conditions from the pivot model's soft deletes + global scopes (SQL).\n * Returns { sql, params } where sql is a fragment like ' AND deleted_at IS NULL AND ...'\n */\n private buildPivotModelFiltersSQL(): { sql: string; params: any[] } {\n if (!this.pivotModel) return { sql: \"\", params: [] };\n let sql = \"\";\n const params: any[] = [];\n if (this.pivotSoftDeletes) {\n sql += \" AND deleted_at IS NULL\";\n }\n const globalScopes = (this.pivotModel as any).globalScopes as\n | Record<string, (b: EloquentBuilder<any>) => void>\n | undefined;\n if (globalScopes && Object.keys(globalScopes).length) {\n const b = new EloquentBuilder(this.pivotModel!);\n Object.values(globalScopes).forEach((scope) => scope(b));\n const w = (b as any).buildWhereClause() as { sql: string; params: any[] };\n if (w.sql) {\n sql += w.sql.replace(/^\\s*WHERE\\s*/i, \" AND \");\n params.push(...w.params);\n }\n }\n return { sql, params };\n }\n\n /**\n * Build the extra filter conditions from the pivot model's soft deletes + global scopes (MongoDB).\n */\n private buildPivotModelFiltersMongo(): Record<string, any> {\n if (!this.pivotModel) return {};\n const filter: Record<string, any> = {};\n if (this.pivotSoftDeletes) {\n filter.deleted_at = null;\n }\n const globalScopes = (this.pivotModel as any).globalScopes as\n | Record<string, (b: EloquentBuilder<any>) => void>\n | undefined;\n if (globalScopes && Object.keys(globalScopes).length) {\n const b = new EloquentBuilder(this.pivotModel!);\n Object.values(globalScopes).forEach((scope) => scope(b));\n const scopeFilter = (b as any).buildMongoFilter() as Record<string, any>;\n if (scopeFilter && Object.keys(scopeFilter).length) {\n Object.assign(filter, scopeFilter);\n }\n }\n return filter;\n }\n\n async getResults(): Promise<T[]> {\n const parentId = (this.parent as any).getAttribute(this.parentPrimaryKey);\n if (parentId === undefined || parentId === null) return [];\n\n if (getDbType() === \"mongodb\") {\n const pc = mongoCollection(this.pivotTable);\n const pidStr = String(parentId);\n const pidNum = parseInt(pidStr, 10);\n const parentMatch: any[] = isNaN(pidNum) ? [pidStr] : [pidStr, pidNum];\n const pivotFilter: any = { [this.foreignPivotKey]: { $in: parentMatch } };\n // Apply pivot model filters (soft deletes + global scopes)\n Object.assign(pivotFilter, this.buildPivotModelFiltersMongo());\n this.pivotWheres.forEach((w) => {\n const op = (w.operator || \"=\").toLowerCase();\n const m =\n op === \"!=\" || op === \"<>\"\n ? \"$ne\"\n : op === \"in\"\n ? \"$in\"\n : op === \"not in\"\n ? \"$nin\"\n : \"$eq\";\n Object.assign(pivotFilter, { [w.column]: { [m]: w.value } });\n });\n const pivots = await pc.find(pivotFilter).toArray();\n if (!pivots.length) return [];\n const relatedIds = pivots.map((r: any) => String(r[this.relatedPivotKey]));\n const rc = mongoCollection((this.relatedModel as typeof Model).getTable());\n const useObjectId = this.relatedPrimaryKey === \"id\";\n const filter: any = useObjectId\n ? {\n _id: {\n $in: relatedIds.map((v: any) => {\n try {\n return new ObjectId(String(v));\n } catch {\n return v;\n }\n }),\n },\n }\n : { [this.relatedPrimaryKey]: { $in: relatedIds } };\n const docs = await rc.find(filter).toArray();\n // map _id to id for ORM\n docs.forEach((d) => {\n if (d && d._id && !(\"id\" in d)) d.id = String(d._id);\n });\n const pivotMap = new Map(pivots.map((r: any) => [String(r[this.relatedPivotKey]), r]));\n return docs.map((row) => {\n const instance = new (this.relatedModel as any)(row) as T;\n const key = String((row as any)[this.relatedPrimaryKey]);\n const pivotData = pivotMap.get(key);\n if (pivotData) (instance as any).pivot = this.createPivot(pivotData);\n return instance;\n });\n }\n\n // Get related IDs from pivot with additional pivot conditions\n let pivotSql = `SELECT ${this.relatedPivotKey} AS related_id`;\n\n // Add pivot columns if specified\n if (this.pivotColumns.length > 0) {\n pivotSql += `, ${this.pivotColumns.join(\", \")}`;\n }\n\n pivotSql += ` FROM ${this.pivotTable} WHERE ${this.foreignPivotKey} = ?`;\n // Apply pivot model filters (soft deletes + global scopes)\n const pivotModelFilters = this.buildPivotModelFiltersSQL();\n if (pivotModelFilters.sql) {\n pivotSql += pivotModelFilters.sql;\n }\n const pivotParams: any[] = [parentId, ...pivotModelFilters.params];\n\n // Add pivot where conditions\n this.pivotWheres.forEach((where) => {\n pivotSql += ` AND ${where.column} ${where.operator} ?`;\n pivotParams.push(where.value);\n });\n\n const pivotRows = await dbQuery<any>(pivotSql, pivotParams);\n const relatedIds = pivotRows.map((r: any) => r.related_id);\n\n if (!relatedIds.length) return [];\n\n const placeholders = relatedIds.map(() => \"?\").join(\",\");\n const rows = await dbQuery<any>(\n `SELECT * FROM ${(this.relatedModel as typeof Model).getTable()} WHERE ${this.relatedPrimaryKey} IN (${placeholders})`,\n relatedIds,\n );\n\n // Attach pivot data to related models\n const pivotMap = new Map(pivotRows.map((r: any) => [r.related_id, r]));\n\n return rows.map((row) => {\n const instance = new (this.relatedModel as any)(row) as T;\n const pivotData = pivotMap.get(row[this.relatedPrimaryKey]);\n if (pivotData) {\n (instance as any).pivot = this.createPivot(pivotData);\n }\n return instance;\n });\n }\n\n async get(): Promise<T[]> {\n return this.getResults();\n }\n\n // Pivot management methods\n withPivot(...columns: string[]): this {\n this.pivotColumns.push(...columns);\n return this;\n }\n\n wherePivot(column: string, operator: any, value?: any): this {\n if (value === undefined) {\n value = operator;\n operator = \"=\";\n }\n\n this.pivotWheres.push({ column, operator, value });\n return this;\n }\n\n async attach(\n relatedId: number | string | Record<string, any> | (number | string | Record<string, any>)[],\n extra: Record<string, any> = {},\n ): Promise<void> {\n const parentId = (this.parent as any).getAttribute(this.parentPrimaryKey);\n if (parentId === undefined || parentId === null) return;\n\n const attachments = Array.isArray(relatedId) ? relatedId : [relatedId];\n const isMongo = getDbType() === \"mongodb\";\n\n for (const attachment of attachments) {\n let actualRelatedId: number | string;\n let pivotData: Record<string, any> = { ...extra };\n\n if (typeof attachment === \"number\" || typeof attachment === \"string\") {\n actualRelatedId = attachment;\n } else {\n actualRelatedId = attachment[this.relatedPrimaryKey];\n pivotData = { ...attachment, ...extra };\n delete pivotData[this.relatedPrimaryKey];\n }\n\n if (isMongo) {\n const pc = mongoCollection(this.pivotTable);\n const pid = coerceFK(this.foreignPivotKey, parentId);\n const rid = coerceFK(this.relatedPivotKey, actualRelatedId);\n await pc.updateOne(\n { [this.foreignPivotKey]: pid, [this.relatedPivotKey]: rid } as any,\n { $set: { ...pivotData, [this.foreignPivotKey]: pid, [this.relatedPivotKey]: rid } },\n { upsert: true },\n );\n continue;\n }\n\n const columns = [this.foreignPivotKey, this.relatedPivotKey, ...Object.keys(pivotData)];\n const placeholders = columns.map(() => \"?\").join(\",\");\n const values = [parentId, actualRelatedId, ...Object.values(pivotData)];\n\n if (Object.keys(pivotData).length === 0) {\n // simple insert for two-column pivot without extra data — ignore duplicates\n await dbQuery(\n `INSERT IGNORE INTO ${this.pivotTable} (${columns.join(\",\")}) VALUES (${placeholders})`,\n values,\n );\n } else {\n // upsert with provided pivot data\n const updateClause = Object.keys(pivotData)\n .map((k) => `${k} = ?`)\n .join(\", \");\n await dbQuery(\n `INSERT INTO ${this.pivotTable} (${columns.join(\",\")}) VALUES (${placeholders}) ON DUPLICATE KEY UPDATE ${updateClause}`,\n [...values, ...Object.values(pivotData)],\n );\n }\n }\n }\n\n async detach(relatedIds?: (number | string)[]): Promise<number> {\n const parentId = (this.parent as any).getAttribute(this.parentPrimaryKey);\n if (parentId === undefined || parentId === null) return 0;\n const isMongo = getDbType() === \"mongodb\";\n\n if (isMongo) {\n const pc = mongoCollection(this.pivotTable);\n const parentForms: any[] = (() => {\n const s = String(parentId);\n const list: any[] = [coerceFK(this.foreignPivotKey, parentId), s];\n const n = parseInt(s, 10);\n if (!isNaN(n)) list.push(n);\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n try {\n list.push(new ObjectId(s));\n } catch {}\n }\n return Array.from(new Set(list.map((x) => (x instanceof ObjectId ? x : String(x))))).map(\n (x) => (typeof x === \"string\" && /^[0-9a-fA-F]{24}$/.test(x) ? new ObjectId(x) : x),\n );\n })();\n if (relatedIds && relatedIds.length > 0) {\n const relForms = Array.from(\n new Set(\n relatedIds.flatMap((id) => {\n const s = String(id);\n const arr: any[] = [coerceFK(this.relatedPivotKey, id), s];\n const n = parseInt(s, 10);\n if (!isNaN(n)) arr.push(n);\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n try {\n arr.push(new ObjectId(s));\n } catch {}\n }\n return arr;\n }),\n ),\n );\n const res = await pc.deleteMany({\n [this.foreignPivotKey]: { $in: parentForms },\n [this.relatedPivotKey]: { $in: relForms },\n } as any);\n return Number(res.deletedCount || 0);\n }\n const res = await pc.deleteMany({ [this.foreignPivotKey]: { $in: parentForms } } as any);\n return Number(res.deletedCount || 0);\n }\n\n let sql = `DELETE FROM ${this.pivotTable} WHERE ${this.foreignPivotKey} = ?`;\n const params: any[] = [parentId];\n\n if (relatedIds && relatedIds.length > 0) {\n const placeholders = relatedIds.map(() => \"?\").join(\",\");\n sql += ` AND ${this.relatedPivotKey} IN (${placeholders})`;\n params.push(...relatedIds);\n }\n\n const result: any = await dbQuery(sql, params);\n return result.affectedRows || 0;\n }\n\n async sync(\n relatedIds: (number | string | Record<string, any>)[],\n detaching: boolean = true,\n ): Promise<{ attached: any[]; detached: any[]; updated: any[] }> {\n const parentId = (this.parent as any).getAttribute(this.parentPrimaryKey);\n if (parentId === undefined || parentId === null) {\n return { attached: [], detached: [], updated: [] };\n }\n\n const isMongo = getDbType() === \"mongodb\";\n\n // Get current related IDs\n let currentIdsSet = new Set<any>();\n if (isMongo) {\n const pc = mongoCollection(this.pivotTable);\n const pidVal = coerceFK(this.foreignPivotKey, parentId);\n const rows = await pc\n .find({ [this.foreignPivotKey]: pidVal } as any)\n .project({ [this.relatedPivotKey]: 1, _id: 0 })\n .toArray();\n currentIdsSet = new Set(rows.map((r: any) => String(r[this.relatedPivotKey])));\n } else {\n const currentPivotRows = await dbQuery<any>(\n `SELECT ${this.relatedPivotKey} FROM ${this.pivotTable} WHERE ${this.foreignPivotKey} = ?`,\n [parentId],\n );\n currentIdsSet = new Set(currentPivotRows.map((r: any) => r[this.relatedPivotKey]));\n }\n\n const newIds = new Set<any>();\n const attached: any[] = [];\n const detached: any[] = [];\n const updated: any[] = [];\n\n for (const related of relatedIds) {\n let actualId: any;\n let extraData: Record<string, any> = {};\n\n if (typeof related === \"number\" || typeof related === \"string\") {\n actualId = related;\n } else {\n actualId = related[this.relatedPrimaryKey];\n extraData = { ...related };\n delete extraData[this.relatedPrimaryKey];\n }\n\n newIds.add(String(actualId));\n\n if (currentIdsSet.has(String(actualId))) {\n if (Object.keys(extraData).length > 0) {\n if (isMongo) {\n const pidVal = coerceFK(this.foreignPivotKey, parentId);\n const ridVal = coerceFK(this.relatedPivotKey, actualId);\n await mongoCollection(this.pivotTable).updateOne(\n { [this.foreignPivotKey]: pidVal, [this.relatedPivotKey]: ridVal } as any,\n { $set: extraData },\n );\n } else {\n const setSql = Object.keys(extraData)\n .map((k) => `${k} = ?`)\n .join(\", \");\n await dbQuery(\n `UPDATE ${this.pivotTable} SET ${setSql} WHERE ${this.foreignPivotKey} = ? AND ${this.relatedPivotKey} = ?`,\n [...Object.values(extraData), parentId, actualId],\n );\n }\n updated.push(actualId);\n }\n } else {\n await this.attach({ [this.relatedPrimaryKey]: actualId, ...extraData } as any);\n attached.push(actualId);\n }\n }\n\n if (detaching) {\n for (const currentId of currentIdsSet) {\n if (!newIds.has(String(currentId))) {\n await this.detach([currentId]);\n detached.push(currentId);\n }\n }\n }\n\n return { attached, detached, updated };\n }\n\n async toggle(relatedIds: (number | string)[]): Promise<{ attached: any[]; detached: any[] }> {\n const parentId = (this.parent as any).getAttribute(this.parentPrimaryKey);\n if (parentId === undefined || parentId === null) {\n return { attached: [], detached: [] };\n }\n const isMongo = getDbType() === \"mongodb\";\n\n // Check which IDs are currently attached\n const toCheck = relatedIds;\n let currentRows: any[] = [];\n if (isMongo) {\n const pc = mongoCollection(this.pivotTable);\n const pidVal = coerceFK(this.foreignPivotKey, parentId);\n const relList = Array.from(\n new Set(\n toCheck.flatMap((id) => {\n const s = String(id);\n const arr: any[] = [coerceFK(this.relatedPivotKey, id), s];\n const n = parseInt(s, 10);\n if (!isNaN(n)) arr.push(n);\n if (/^[0-9a-fA-F]{24}$/.test(s)) {\n try {\n arr.push(new ObjectId(s));\n } catch {}\n }\n return arr;\n }),\n ),\n );\n currentRows = await pc\n .find({ [this.foreignPivotKey]: pidVal, [this.relatedPivotKey]: { $in: relList } } as any)\n .project({ [this.relatedPivotKey]: 1, _id: 0 })\n .toArray();\n } else {\n const placeholders = relatedIds.map(() => \"?\").join(\",\");\n currentRows = await dbQuery<any>(\n `SELECT ${this.relatedPivotKey} FROM ${this.pivotTable} \n WHERE ${this.foreignPivotKey} = ? AND ${this.relatedPivotKey} IN (${placeholders})`,\n [parentId, ...relatedIds],\n );\n }\n\n const currentIds = new Set(currentRows.map((r: any) => String(r[this.relatedPivotKey])));\n\n const toAttach = relatedIds.filter((id) => !currentIds.has(String(id)));\n const toDetach = relatedIds.filter((id) => currentIds.has(String(id)));\n\n if (toAttach.length > 0) {\n await this.attach(toAttach);\n }\n\n if (toDetach.length > 0) {\n await this.detach(toDetach);\n }\n\n return {\n attached: toAttach,\n detached: toDetach,\n };\n }\n\n async updateExistingPivot(\n relatedId: number | string,\n attributes: Record<string, any>,\n ): Promise<number> {\n const parentId = (this.parent as any).getAttribute(this.parentPrimaryKey);\n if (parentId === undefined || parentId === null) return 0;\n const isMongo = getDbType() === \"mongodb\";\n\n if (isMongo) {\n const pidStr = String(parentId);\n const ridStr = String(relatedId);\n const res = await mongoCollection(this.pivotTable).updateOne(\n { [this.foreignPivotKey]: pidStr, [this.relatedPivotKey]: ridStr } as any,\n { $set: attributes },\n );\n return Number(res.modifiedCount || 0);\n }\n\n const setSql = Object.keys(attributes)\n .map((k) => `${k} = ?`)\n .join(\", \");\n const result: any = await dbQuery(\n `UPDATE ${this.pivotTable} SET ${setSql} WHERE ${this.foreignPivotKey} = ? AND ${this.relatedPivotKey} = ?`,\n [...Object.values(attributes), parentId, relatedId],\n );\n\n return result.affectedRows || 0;\n }\n\n private createPivot(pivotData: Record<string, any>): Pivot {\n return new Pivot(pivotData, this.pivotTable, this.foreignPivotKey, this.relatedPivotKey);\n }\n}\n\n// Pivot model for many-to-many relationships\nexport class Pivot {\n public exists: boolean = true;\n\n constructor(\n private attributes: Record<string, any>,\n private pivotTable: string,\n private foreignPivotKey: string,\n private relatedPivotKey: string,\n ) {}\n\n getAttribute<T = any>(key: string): T {\n return this.attributes[key];\n }\n\n setAttribute(key: string, value: any): void {\n this.attributes[key] = value;\n }\n\n toJSON(): any {\n return { ...this.attributes };\n }\n\n async save(): Promise<boolean> {\n const foreignValue = this.attributes[this.foreignPivotKey];\n const relatedValue = this.attributes[this.relatedPivotKey];\n\n if (!foreignValue || !relatedValue) return false;\n\n const updateData = { ...this.attributes };\n delete updateData[this.foreignPivotKey];\n delete updateData[this.relatedPivotKey];\n\n if (getDbType() === \"mongodb\") {\n const res = await mongoCollection(this.pivotTable).updateOne(\n { [this.foreignPivotKey]: foreignValue, [this.relatedPivotKey]: relatedValue } as any,\n { $set: updateData },\n );\n return Number(res.modifiedCount || 0) > 0;\n }\n\n const setSql = Object.keys(updateData)\n .map((k) => `${k} = ?`)\n .join(\", \");\n const values = [...Object.values(updateData), foreignValue, relatedValue];\n\n const result: any = await dbQuery(\n `UPDATE ${this.pivotTable} SET ${setSql} WHERE ${this.foreignPivotKey} = ? AND ${this.relatedPivotKey} = ?`,\n values,\n );\n\n return result.affectedRows > 0;\n }\n\n async delete(): Promise<boolean> {\n const foreignValue = this.attributes[this.foreignPivotKey];\n const relatedValue = this.attributes[this.relatedPivotKey];\n\n if (!foreignValue || !relatedValue) return false;\n\n if (getDbType() === \"mongodb\") {\n const res = await mongoCollection(this.pivotTable).deleteOne({\n [this.foreignPivotKey]: foreignValue,\n [this.relatedPivotKey]: relatedValue,\n } as any);\n if (Number(res.deletedCount || 0) > 0) {\n this.exists = false;\n return true;\n }\n return false;\n }\n\n const result: any = await dbQuery(\n `DELETE FROM ${this.pivotTable} WHERE ${this.foreignPivotKey} = ? AND ${this.relatedPivotKey} = ?`,\n [foreignValue, relatedValue],\n );\n\n if (result.affectedRows > 0) {\n this.exists = false;\n return true;\n }\n\n return false;\n }\n}\n\n// ─── Through relationships ────────────────────────────────────────────────────\n\n/**\n * HasOneThrough — reach a distant model through an intermediate one.\n *\n * Example: User hasOneThrough(Insurance, Policy, 'user_id', 'policy_id', 'id', 'id')\n * users → policies (via policies.user_id) → insurances (via insurances.policy_id)\n */\nexport class HasOneThrough<T extends Model> extends Relation<T> {\n constructor(\n protected relatedModel: typeof Model,\n protected throughModel: typeof Model,\n protected firstKey: string,\n protected secondKey: string,\n protected localKey: string = \"id\",\n protected secondLocalKey: string = \"id\",\n parent: Model,\n ) {\n super(relatedModel, parent);\n }\n\n async getResults(): Promise<T | null> {\n const localValue = (this.parent as any).getAttribute(this.localKey);\n if (localValue === undefined || localValue === null) return null;\n\n if (getDbType() === \"mongodb\") {\n const tc = mongoCollection((this.throughModel as typeof Model).getTable());\n const throughDoc = await tc.findOne({ [this.firstKey]: localValue } as any);\n if (!throughDoc) return null;\n const secondValue = throughDoc[this.secondLocalKey];\n const rc = mongoCollection((this.relatedModel as typeof Model).getTable());\n const doc = await rc.findOne({ [this.secondKey]: secondValue } as any);\n if (!doc) return null;\n if (doc._id && !(\"id\" in doc)) doc.id = String(doc._id);\n const inst = new (this.relatedModel as any)() as T;\n inst.hydrate(doc);\n return inst;\n }\n\n const throughTable = (this.throughModel as typeof Model).getTable();\n const relatedTable = (this.relatedModel as typeof Model).getTable();\n const rows = await dbQuery<any>(\n `SELECT ${relatedTable}.* FROM ${relatedTable}\n INNER JOIN ${throughTable} ON ${throughTable}.${this.secondLocalKey} = ${relatedTable}.${this.secondKey}\n WHERE ${throughTable}.${this.firstKey} = ? LIMIT 1`,\n [localValue],\n );\n if (!rows.length) return null;\n const inst = new (this.relatedModel as any)() as T;\n inst.hydrate(rows[0]);\n return inst;\n }\n\n async get(): Promise<T[]> {\n const result = await this.getResults();\n return result ? [result] : [];\n }\n\n async first(): Promise<T | null> {\n return this.getResults();\n }\n}\n\n/**\n * HasManyThrough — reach many distant models through an intermediate one.\n *\n * Example: Country hasManyThrough(Post, User, 'country_id', 'user_id', 'id', 'id')\n * countries → users (via users.country_id) → posts (via posts.user_id)\n */\nexport class HasManyThrough<T extends Model> extends Relation<T> {\n constructor(\n protected relatedModel: typeof Model,\n protected throughModel: typeof Model,\n protected firstKey: string,\n protected secondKey: string,\n protected localKey: string = \"id\",\n protected secondLocalKey: string = \"id\",\n parent: Model,\n ) {\n super(relatedModel, parent);\n }\n\n async getResults(): Promise<T[]> {\n const localValue = (this.parent as any).getAttribute(this.localKey);\n if (localValue === undefined || localValue === null) return [];\n\n if (getDbType() === \"mongodb\") {\n const tc = mongoCollection((this.throughModel as typeof Model).getTable());\n const throughDocs = await tc.find({ [this.firstKey]: localValue } as any).toArray();\n if (!throughDocs.length) return [];\n const secondValues = throughDocs.map((d: any) => d[this.secondLocalKey]);\n const rc = mongoCollection((this.relatedModel as typeof Model).getTable());\n const docs = await rc.find({ [this.secondKey]: { $in: secondValues } } as any).toArray();\n return docs.map((doc: any) => {\n if (doc._id && !(\"id\" in doc)) doc.id = String(doc._id);\n const inst = new (this.relatedModel as any)() as T;\n inst.hydrate(doc);\n return inst;\n });\n }\n\n const throughTable = (this.throughModel as typeof Model).getTable();\n const relatedTable = (this.relatedModel as typeof Model).getTable();\n\n const whereClauses = (this.builder as any).whereClauses as any[];\n let extraSql = \"\";\n const extraParams: any[] = [];\n if (whereClauses.length) {\n extraSql = whereClauses\n .map((w: any) => ` AND ${relatedTable}.${w.column} ${w.operator} ?`)\n .join(\"\");\n extraParams.push(...whereClauses.map((w: any) => w.value));\n }\n\n const softDelete = (this.relatedModel as any).softDeletes\n ? ` AND ${relatedTable}.deleted_at IS NULL`\n : \"\";\n\n const rows = await dbQuery<any>(\n `SELECT ${relatedTable}.* FROM ${relatedTable}\n INNER JOIN ${throughTable} ON ${throughTable}.${this.secondLocalKey} = ${relatedTable}.${this.secondKey}\n WHERE ${throughTable}.${this.firstKey} = ?${softDelete}${extraSql}`,\n [localValue, ...extraParams],\n );\n return rows.map((row: any) => {\n const inst = new (this.relatedModel as any)() as T;\n inst.hydrate(row);\n return inst;\n });\n }\n\n async get(): Promise<T[]> {\n return this.getResults();\n }\n\n async first(): Promise<T | null> {\n const all = await this.getResults();\n return all[0] || null;\n }\n}\n\n// Morph relationships\nexport class MorphOne<T extends Model> extends HasOne<T> {\n private morphType: string;\n\n constructor(\n relatedModel: typeof Model,\n morphType: string,\n foreignKey: string,\n localKey: string = \"id\",\n parent: Model,\n ) {\n super(relatedModel, foreignKey, localKey, parent);\n this.morphType = morphType;\n }\n\n async getResults(): Promise<T | null> {\n const localValue = (this.parent as any).getAttribute(this.localKey);\n if (localValue === undefined || localValue === null) return null;\n\n this.builder\n .where(this.foreignKey, localValue)\n .where(`${this.morphType}_type`, this.parent.constructor.name);\n\n return await this.builder.first();\n }\n\n async create(attributes: Record<string, any>): Promise<T> {\n attributes[this.foreignKey] = (this.parent as any).getAttribute(this.localKey);\n attributes[`${this.morphType}_type`] = this.parent.constructor.name;\n\n const instance = new (this.relatedModel as any)(attributes) as T;\n await (instance as any).save();\n return instance;\n }\n}\n\nexport class MorphMany<T extends Model> extends HasMany<T> {\n private morphType: string;\n\n constructor(\n relatedModel: typeof Model,\n morphType: string,\n foreignKey: string,\n localKey: string = \"id\",\n parent: Model,\n ) {\n super(relatedModel, foreignKey, localKey, parent);\n this.morphType = morphType;\n }\n\n async getResults(): Promise<T[]> {\n const localValue = (this.parent as any).getAttribute(this.localKey);\n if (localValue === undefined || localValue === null) return [];\n\n this.builder\n .where(this.foreignKey, localValue)\n .where(`${this.morphType}_type`, this.parent.constructor.name);\n\n return await this.builder.get();\n }\n\n async create(attributes: Record<string, any>): Promise<T> {\n const foreignValue = (this.parent as any).getAttribute(this.localKey);\n attributes[this.foreignKey] = foreignValue;\n attributes[`${this.morphType}_type`] = this.parent.constructor.name;\n\n const instance = new (this.relatedModel as any)(attributes) as T;\n await (instance as any).save();\n return instance;\n }\n}\n\nexport class MorphTo<T extends Model> extends Relation<T> {\n private morphType: string;\n private morphId: string;\n\n constructor(\n morphType: string,\n morphId: string,\n parent: Model,\n private morphMap?: Record<string, typeof Model>,\n ) {\n super(Model, parent); // Base model, will be overridden\n this.morphType = morphType;\n this.morphId = morphId;\n }\n\n async getResults(): Promise<T | null> {\n const type = (this.parent as any).getAttribute(this.morphType);\n const id = (this.parent as any).getAttribute(this.morphId);\n\n if (!type || !id) return null;\n\n // Resolve the actual model class from morph map or type\n let modelClass: typeof Model = this.morphMap?.[type] || Model;\n\n // Try to find the model by convention if not in morph map\n if (modelClass === Model) {\n // You might want to implement a naming convention here\n // For example: convert \"User\" to user model class\n }\n\n this.related = modelClass;\n this.builder = new EloquentBuilder<T>(modelClass as any);\n\n this.builder.where((modelClass as any).primaryKey || \"id\", id);\n return await this.builder.first();\n }\n}\n","// traits.ts - New file for trait system\n// traits.ts - Enhanced with class-based trait support\nimport { Model } from \"../Model.js\";\nimport { EloquentBuilder } from \"../EloquentBuilder.js\";\n\nexport interface TraitMethods {\n [methodName: string]: Function;\n}\n\nexport interface ScopeMethod<T extends Model> {\n (builder: EloquentBuilder<T>, ...args: any[]): void;\n}\n\nexport interface Trait {\n methods?: TraitMethods;\n boot?: (model: typeof Model) => void;\n scope?: { [name: string]: ScopeMethod<any> };\n macros?: { [name: string]: Function };\n}\n\n// Class-based trait interface\nexport interface ClassBasedTrait {\n new (): any;\n boot?(model: typeof Model): void;\n // __scopes?: Record<string, Function>;\n // __macros?: Record<string, Function>;\n}\n\n// Global trait registry\nconst traitRegistry = new Map<string, Trait>();\nconst classTraitRegistry = new Map<Function, Trait>();\n\n/**\n * Register a trait globally by name\n */\nexport function registerTrait(name: string, trait: Trait): void {\n traitRegistry.set(name, trait);\n}\n\n/**\n * Register a class-based trait\n */\nexport function registerClassTrait(traitClass: ClassBasedTrait, trait: Trait): void {\n classTraitRegistry.set(traitClass, trait);\n}\n\n/**\n * Get a trait by name\n */\nexport function getTrait(name: string): Trait | undefined {\n return traitRegistry.get(name);\n}\n\n/**\n * Get a trait by class\n */\nexport function getTraitByClass(traitClass: Function): Trait | undefined {\n return classTraitRegistry.get(traitClass);\n}\n\n/**\n * Convert a trait class to a Trait configuration\n */\nfunction convertTraitClassToConfig(traitClass: ClassBasedTrait): Trait {\n const traitConfig: Trait = {};\n const instance = new traitClass();\n\n // Collect instance methods\n const methods: TraitMethods = {};\n const prototype = Object.getPrototypeOf(instance);\n\n // Get all methods from the trait class\n const getAllMethods = (obj: any): string[] => {\n const methods: string[] = [];\n while (obj && obj !== Object.prototype) {\n methods.push(...Object.getOwnPropertyNames(obj));\n obj = Object.getPrototypeOf(obj);\n }\n return methods.filter((method) => method !== \"constructor\");\n };\n\n const methodNames = getAllMethods(prototype);\n methodNames.forEach((methodName) => {\n if (typeof instance[methodName] === \"function\") {\n // Use the unbound prototype method so that when it is mixed into a model's\n // prototype and called on a model instance, `this` refers to the model (not\n // the trait instance). A pre-bound function cannot be re-bound, which would\n // cause `this` to be the trait instance rather than the model.\n methods[methodName] = traitClass.prototype[methodName];\n }\n });\n\n if (Object.keys(methods).length > 0) {\n traitConfig.methods = methods;\n }\n\n // Check for static methods (scopes/macros)\n const staticProperties = Object.getOwnPropertyNames(traitClass);\n const scopeMethods: { [name: string]: ScopeMethod<any> } = {};\n const macros: { [name: string]: Function } = {};\n\n staticProperties.forEach((prop) => {\n if (prop === \"length\" || prop === \"name\" || prop === \"prototype\") return;\n\n const value = (traitClass as any)[prop];\n if (typeof value === \"function\") {\n // Check if it's a scope method (starts with 'scope')\n if (prop.startsWith(\"scope\") && prop.length > 5) {\n const scopeName = prop.charAt(5).toLowerCase() + prop.slice(6);\n scopeMethods[scopeName] = value;\n } else {\n // Treat as macro\n macros[prop] = value;\n }\n }\n });\n\n if (Object.keys(scopeMethods).length > 0) {\n traitConfig.scope = scopeMethods;\n }\n\n if (Object.keys(macros).length > 0) {\n traitConfig.macros = macros;\n }\n\n // Check for boot method\n if (typeof (traitClass as any).boot === \"function\") {\n traitConfig.boot = (traitClass as any).boot;\n }\n\n // Also check for boot method on instance\n if (typeof instance.boot === \"function\") {\n const originalBoot = traitConfig.boot;\n traitConfig.boot = (model: typeof Model) => {\n if (originalBoot) originalBoot(model);\n instance.boot(model);\n };\n }\n\n return traitConfig;\n}\n\n/**\n * Apply traits to a model class (supports both string names and classes)\n */\nexport function applyTraits(\n modelClass: typeof Model,\n traitNamesOrClasses: Array<string | ClassBasedTrait>,\n): void {\n for (const traitRef of traitNamesOrClasses) {\n let trait: Trait | undefined;\n\n if (typeof traitRef === \"string\") {\n // String trait name\n trait = traitRegistry.get(traitRef);\n if (!trait) {\n throw new Error(`Trait \"${traitRef}\" not found`);\n }\n } else {\n // Class-based trait\n trait = getTraitByClass(traitRef);\n if (!trait) {\n // Convert class to trait configuration\n trait = convertTraitClassToConfig(traitRef);\n registerClassTrait(traitRef, trait);\n }\n }\n\n // Apply methods\n if (trait.methods) {\n Object.entries(trait.methods).forEach(([methodName, method]) => {\n if (!(methodName in modelClass.prototype)) {\n modelClass.prototype[methodName] = method;\n } else {\n // Avoid overriding existing methods\n //console.warn(`Trait method \"${methodName}\" skipped: already exists on model.`);\n }\n });\n }\n\n // Apply scopes\n if (trait.scope) {\n Object.entries(trait.scope).forEach(([scopeName, scopeMethod]) => {\n const staticMethodName = `scope${scopeName.charAt(0).toUpperCase() + scopeName.slice(1)}`;\n if (!(staticMethodName in modelClass)) {\n (modelClass as any)[staticMethodName] = scopeMethod;\n } else {\n // console.warn(`Trait scope \"${staticMethodName}\" skipped: already exists on model.`);\n }\n });\n }\n\n // Apply macros\n if (trait.macros) {\n Object.entries(trait.macros).forEach(([macroName, macro]) => {\n if (!(macroName in modelClass)) {\n (modelClass as any)[macroName] = macro;\n } else {\n //console.warn(`Trait macro \"${macroName}\" skipped: already exists on model.`);\n }\n if (!(macroName in EloquentBuilder.prototype)) {\n (EloquentBuilder.prototype as any)[macroName] = macro;\n }\n });\n }\n\n if (trait.boot) {\n trait.boot(modelClass);\n }\n }\n}\n\n/**\n * Define a scope trait\n */\nexport function scope(name: string, callback: ScopeMethod<any>): void {\n const scopeMethodName = `scope${name.charAt(0).toUpperCase() + name.slice(1)}`;\n const traitName = `Scopes${name.charAt(0).toUpperCase() + name.slice(1)}`;\n\n if (!traitRegistry.has(traitName)) {\n registerTrait(traitName, {\n scope: {\n [name]: callback,\n },\n });\n }\n}\n\n/**\n * Define a macro trait\n */\nexport function macro(name: string, callback: Function): void {\n const traitName = `Macros${name.charAt(0).toUpperCase() + name.slice(1)}`;\n\n if (!traitRegistry.has(traitName)) {\n registerTrait(traitName, {\n macros: {\n [name]: callback,\n },\n });\n }\n}\n\n/**\n * Decorator for class-based traits\n */\nexport function trait(name?: string): ClassDecorator {\n return function (constructor: Function): void {\n const traitConfig = convertTraitClassToConfig(constructor as ClassBasedTrait);\n if (name) {\n registerTrait(name, traitConfig);\n }\n registerClassTrait(constructor as ClassBasedTrait, traitConfig);\n };\n}\n\n/**\n * Decorator for marking methods as scopes\n * Usage:\n * @scopeMethod()\n * static scopeFindBySlug(builder: EloquentBuilder<any>, slug: string) { ... }\n */\nexport function scopeMethod(): MethodDecorator {\n return function (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ): void {\n if (typeof propertyKey === \"string\") {\n if (propertyKey.startsWith(\"scope\") && propertyKey.length > 5) {\n const scopeName = propertyKey.charAt(5).toLowerCase() + propertyKey.slice(6);\n const ctor = (target as any).constructor as Function & {\n __scopes?: Record<string, Function>;\n };\n ctor.__scopes = ctor.__scopes || {};\n ctor.__scopes[scopeName] = descriptor.value as Function;\n }\n }\n };\n}\n\n/**\n * Decorator for marking methods as macros\n * Usage:\n * @macroMethod()\n * static cached(callback: Function, key: string, ttl: number) { ... }\n */\nexport function macroMethod(): MethodDecorator {\n return function (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ): void {\n if (typeof propertyKey === \"string\") {\n const ctor = (target as any).constructor as Function & {\n __macros?: Record<string, Function>;\n };\n ctor.__macros = ctor.__macros || {};\n ctor.__macros[propertyKey] = descriptor.value as Function;\n }\n };\n}\n\n/**\n * Alternative: Function-based decorators without TypeScript decorator metadata\n * These work with older TypeScript versions or when decorator metadata is disabled\n */\n\n/**\n * Function to mark a method as a scope (alternative to decorator)\n */\nexport function markAsScope(\n target: any,\n propertyKey: string,\n descriptor?: PropertyDescriptor,\n): void {\n if (propertyKey.startsWith(\"scope\") && propertyKey.length > 5) {\n const scopeName = propertyKey.charAt(5).toLowerCase() + propertyKey.slice(6);\n const ctor = target.constructor as Function & { __scopes?: Record<string, Function> };\n ctor.__scopes = ctor.__scopes || {};\n ctor.__scopes[scopeName] = (descriptor?.value ?? target[propertyKey]) as Function;\n }\n}\n\n/**\n * Function to mark a method as a macro (alternative to decorator)\n */\nexport function markAsMacro(\n target: any,\n propertyKey: string,\n descriptor?: PropertyDescriptor,\n): void {\n const ctor = target.constructor as Function & { __macros?: Record<string, Function> };\n ctor.__macros = ctor.__macros || {};\n ctor.__macros[propertyKey] = (descriptor?.value ?? target[propertyKey]) as Function;\n}\n\n/**\n * Common traits similar to Laravel\n */\n\n// SoftDeletes trait\nregisterTrait(\"SoftDeletes\", {\n methods: {\n /**\n * Force delete the model (bypass soft delete)\n */\n async forceDelete(this: Model): Promise<boolean> {\n return this.delete(true);\n },\n\n /**\n * Restore a soft-deleted model\n */\n async restore(this: Model): Promise<boolean> {\n return (this as any).restore();\n },\n\n /**\n * Determine if the model has been soft-deleted\n */\n trashed(this: Model): boolean {\n return !!(this as any).deleted_at;\n },\n\n /**\n * Determine if the model is not soft-deleted\n */\n isNotTrashed(this: Model): boolean {\n return !(this as any).deleted_at;\n },\n },\n\n boot: (modelClass: typeof Model) => {\n // Add soft delete flags\n (modelClass as any).softDeletes = true;\n },\n});\n\n// HasApiTokens trait (similar to Laravel Sanctum)\nregisterTrait(\"HasApiTokens\", {\n methods: {\n /**\n * Create a new token for the user\n */\n async createToken(this: Model, name: string, abilities: string[] = [\"*\"]): Promise<any> {\n // Implementation would depend on your token system\n console.log(`Creating token \"${name}\" with abilities:`, abilities);\n return { token: \"generated-token\" };\n },\n\n /**\n * Get current access token\n */\n currentAccessToken(this: Model): any {\n return null;\n },\n\n /**\n * Get all tokens\n */\n async tokens(this: Model): Promise<any[]> {\n return [];\n },\n\n /**\n * Revoke all tokens\n */\n async revokeAllTokens(this: Model): Promise<void> {\n console.log(\"All tokens revoked\");\n },\n },\n});\n\n// Notifiable trait (similar to Laravel Notifications)\nregisterTrait(\"Notifiable\", {\n methods: {\n /**\n * Send notification\n */\n async notify(this: Model, notification: any): Promise<void> {\n console.log(\"Notification sent:\", notification);\n },\n\n /**\n * Route notifications for the mail channel\n */\n routeNotificationForMail(this: Model): string {\n return (this as any).email;\n },\n\n /**\n * Get notification preferences\n */\n notificationPreferences(this: Model): any {\n return {};\n },\n },\n});\n\n// HasEvents trait (for model events)\nregisterTrait(\"HasEvents\", {\n boot: (modelClass: typeof Model) => {\n // Initialize event listeners map on the specific model class.\n // If the class inherits the base Model.eventListeners object (shared), clone it\n // so that each model class has its own listener arrays.\n const baseMap = (Model as any).eventListeners as any;\n const current = (modelClass as any).eventListeners;\n if (!current || current === baseMap) {\n (modelClass as any).eventListeners = {\n creating: [],\n created: [],\n updating: [],\n updated: [],\n saving: [],\n saved: [],\n deleting: [],\n deleted: [],\n restoring: [],\n restored: [],\n retrieved: [],\n } as any;\n }\n\n // Add event methods (class-level helpers)\n (modelClass as any).addEventListener = function (event: string, callback: Function): void {\n // Ensure the target (this) has its own eventListeners map\n if (!(this as any).eventListeners || (this as any).eventListeners === baseMap) {\n (this as any).eventListeners = { ...((modelClass as any).eventListeners || {}) } as any;\n }\n if (!(this as any).eventListeners[event]) {\n (this as any).eventListeners[event] = [];\n }\n (this as any).eventListeners[event].push(callback);\n };\n\n (modelClass as any).dispatchEvent = function (event: string, model: Model): void {\n const listeners = (this as any).eventListeners?.[event] || [];\n listeners.forEach((listener: Function) => listener(model));\n };\n\n // Compatibility: expose `on` as a chainable alias for `addEventListener` so traits\n // that call `modelClass.on('event', ...)` won't throw if `on` is missing.\n if (!(modelClass as any).on) {\n (modelClass as any).on = function (event: string, callback: Function) {\n // Use addEventListener on the class/ prototype\n if (typeof (this as any).addEventListener === \"function\") {\n (this as any).addEventListener(event, callback);\n } else if (typeof (modelClass as any).addEventListener === \"function\") {\n (modelClass as any).addEventListener(event, callback);\n }\n return this;\n };\n }\n },\n});\n","// Model.ts\nimport { ModelAttributes, RelationshipConfig, Casts } from \"./types.js\";\nimport { EloquentBuilder } from \"./EloquentBuilder.js\";\nimport {\n HasOne,\n HasMany,\n BelongsTo,\n BelongsToMany,\n HasOneThrough,\n HasManyThrough,\n} from \"./relationships.js\";\nimport { getDbType, collection as mongoCollection } from \"./connection.js\";\nimport DB from \"./DB.js\";\nimport util from \"util\";\nimport { ObjectId } from \"mongodb\";\nimport { AccessorDescriptor, ModelEvents, MutatorDescriptor, ToJSONOptions } from \"./interfaces.js\";\nimport { applyTraits, ClassBasedTrait, ScopeMethod } from \"./Traits/traits.js\";\nimport type { AttachTraits } from \"./Traits/helper.js\";\nimport { Observer } from \"./Observers/Observer.js\";\n\ntype ObserverConstructor<T extends object> = new () => Observer<T>;\n// Type guard for class-based traits\nfunction isClassBasedTrait(traitRef: any): traitRef is ClassBasedTrait {\n return (\n typeof traitRef === \"function\" &&\n traitRef.prototype &&\n traitRef.prototype.constructor === traitRef\n );\n}\n\n// Decorator for marking trait usage\nexport function use<Traits extends readonly any[]>(\n ...traitClasses: Traits\n): <MClass extends new (...args: any) => Model>(ctor: MClass) => AttachTraits<MClass, Traits>;\nexport function use(...traitClasses: any[]): any {\n return function (constructor: Function) {\n const modelClass = constructor as typeof Model;\n\n // Ensure each subclass has its OWN traits array (not the inherited base one).\n // Using hasOwnProperty prevents accidentally mutating the shared Model.traits\n // array which would cause all subclasses to inherit every other model's traits.\n if (!Object.prototype.hasOwnProperty.call(modelClass, \"traits\")) {\n modelClass.traits = [];\n }\n\n // Add trait classes to the model\n traitClasses.forEach((traitClass: any) => {\n // Convert class to string identifier for storage\n const traitIdentifier = (traitClass as any).name || String(traitClass);\n if (!modelClass.traits.includes(traitIdentifier)) {\n modelClass.traits.push(traitIdentifier);\n }\n\n // Store the class reference for later application\n if (!Object.prototype.hasOwnProperty.call(modelClass, \"__traitClasses\")) {\n (modelClass as any).__traitClasses = [];\n }\n (modelClass as any).__traitClasses.push(traitClass as any);\n });\n } as any;\n}\n\n// Helper to automatically detect and apply traits from class properties\nfunction autoDetectTraits(modelClass: typeof Model): void {\n // Check for static 'use' property (Laravel style)\n if ((modelClass as any)._use && Array.isArray((modelClass as any)._use)) {\n (modelClass as any)._use.forEach((traitClass: ClassBasedTrait) => {\n if (!modelClass.traits.includes(traitClass.name)) {\n modelClass.traits.push(traitClass.name);\n }\n if (!(modelClass as any).__traitClasses) {\n (modelClass as any).__traitClasses = [];\n }\n (modelClass as any).__traitClasses.push(traitClass);\n });\n }\n\n // Also check instance properties that might be traits\n const instanceProperties = Object.getOwnPropertyNames(modelClass.prototype);\n instanceProperties.forEach((prop) => {\n if (prop === \"constructor\") return;\n const descriptor = Object.getOwnPropertyDescriptor(modelClass.prototype, prop);\n if (descriptor && descriptor.value && isClassBasedTrait(descriptor.value)) {\n const traitClass = descriptor.value;\n if (!modelClass.traits.includes(traitClass.name)) {\n modelClass.traits.push(traitClass.name);\n }\n if (!(modelClass as any).__traitClasses) {\n (modelClass as any).__traitClasses = [];\n }\n (modelClass as any).__traitClasses.push(traitClass);\n }\n });\n}\nexport abstract class Model {\n [key: string]: any;\n\n static table: string = \"\";\n static primaryKey: string = \"id\";\n static fillable: string[] = [];\n static guarded: string[] = [];\n static hidden: string[] = [];\n static appends: string[] = []; // New: Appended attributes field\n static casts: Casts = {};\n static timestamps: boolean = true;\n static softDeletes: boolean = false;\n static relationships: { [key: string]: RelationshipConfig } = {};\n static autoIncrement: boolean = true;\n private static observers: any[] = [];\n\n // Trait and scope properties\n static traits: string[] = [];\n static localScopes: { [name: string]: ScopeMethod<any> } = {};\n static globalScopes: { [name: string]: (builder: EloquentBuilder<any>) => void } = {};\n static withoutGlobalScopes: string[] = [];\n static eventListeners: {\n [K in keyof ModelEvents]: ((model: Model) => boolean | void | Promise<boolean | void>)[];\n } = {\n creating: [],\n created: [],\n updating: [],\n updated: [],\n saving: [],\n saved: [],\n deleting: [],\n deleted: [],\n restoring: [],\n restored: [],\n retrieved: [],\n };\n\n // Laravel-style trait usage\n static _use?: ClassBasedTrait[] = [];\n\n // New static properties for accessors/mutators\n private static _accessors: Map<string, AccessorDescriptor> = new Map();\n private static _mutators: Map<string, MutatorDescriptor> = new Map();\n\n // Private trait storage\n static __traitClasses: ClassBasedTrait[] = [];\n\n id?: number | string;\n created_at?: Date;\n updated_at?: Date;\n deleted_at?: Date | null;\n\n protected attributes: ModelAttributes = {};\n protected original: ModelAttributes = {};\n protected relationshipsLoaded: { [key: string]: any } = {};\n protected __exists: boolean = false;\n protected __isGettingAttribute: boolean = false;\n protected __attributeCache: Map<string, any> = new Map();\n\n constructor(attributes: ModelAttributes = {}) {\n // Apply traits to instance\n this.applyTraitsToInstance();\n this.fill(attributes);\n this.original = { ...this.attributes };\n // Collect all method names defined directly on the Model base prototype\n // so we can bind them to `target` (preserving access to this.constructor etc.)\n // while subclass-defined methods (e.g. isThirdParty, scopes) get bound to\n // `receiver` (the proxy) so that `this.someAttribute` resolves correctly.\n const modelBaseProto = Model.prototype;\n\n const proxy = new Proxy(this, {\n get: (target: any, prop: PropertyKey, receiver: any) => {\n if (typeof prop === \"string\") {\n // Always return the real constructor so static property access works\n if (prop === \"constructor\") {\n return target.constructor;\n }\n\n // Check if it's an appended attribute\n const staticClass = target.constructor as typeof Model;\n const isAppended = staticClass.appends.includes(prop);\n\n // Loaded relationships take priority over same-named instance methods so that\n // user.profile returns the eager-loaded UserProfile, not the profile() method.\n if (prop in target.relationshipsLoaded) {\n return target.relationshipsLoaded[prop];\n }\n\n if (prop in target.attributes) {\n return target.attributes[prop];\n }\n\n // Handle accessors first (only if it's an appended attribute or direct property access)\n const hasAccessor =\n target.hasAccessor?.(prop) ||\n typeof target[`get${prop[0].toUpperCase() + prop.slice(1)}Attribute`] === \"function\";\n\n if (hasAccessor) {\n return target.getAttributeWithAccessor(prop, isAppended);\n }\n\n if (prop in target && typeof target[prop] === \"function\") {\n // Internal Model methods: bind to target so `this.constructor` stays intact.\n // Subclass-overridden / user-defined methods: bind to receiver (proxy)\n // so attribute access like `this.type_of_cover` works through the proxy.\n const isModelBaseMethod = prop in modelBaseProto;\n return target[prop].bind(isModelBaseMethod ? target : receiver);\n }\n\n if (prop in target) {\n const val = target[prop];\n return typeof val === \"function\" ? val.bind(target) : val;\n }\n return undefined;\n }\n return (target as any)[prop];\n },\n set: (target: any, prop: PropertyKey, value: any, receiver: any) => {\n if (typeof prop === \"string\") {\n const internalProps = new Set([\n \"attributes\",\n \"original\",\n \"relationshipsLoaded\",\n \"__isGettingAttribute\",\n \"__attributeCache\",\n \"__proxy\",\n \"__exists\",\n ]);\n if (internalProps.has(prop)) {\n (target as any)[prop] = value;\n return true;\n }\n\n // Handle mutators\n if (target.setAttributeWithMutator(prop, value)) {\n return true;\n }\n\n target.setAttribute(prop, value);\n return true;\n }\n (target as any)[prop] = value;\n return true;\n },\n });\n\n (this as any).__proxy = proxy;\n return proxy;\n }\n\n static getFillables() {\n return this.fillable;\n }\n /**\n * Apply traits to instance (after static traits have been applied)\n */\n private applyTraitsToInstance(): void {\n const staticClass = this.constructor as typeof Model;\n\n // Initialize static properties with OWN copies so subclasses never share\n // the base Model arrays/maps (which would cause cross-model trait leakage).\n if (!Object.prototype.hasOwnProperty.call(staticClass, \"traits\")) staticClass.traits = [];\n if (!Object.prototype.hasOwnProperty.call(staticClass, \"localScopes\"))\n staticClass.localScopes = {};\n if (!Object.prototype.hasOwnProperty.call(staticClass, \"globalScopes\"))\n staticClass.globalScopes = {};\n if (!Object.prototype.hasOwnProperty.call(staticClass, \"withoutGlobalScopes\"))\n staticClass.withoutGlobalScopes = [];\n if (!Object.prototype.hasOwnProperty.call(staticClass, \"eventListeners\")) {\n staticClass.eventListeners = {\n creating: [],\n created: [],\n updating: [],\n updated: [],\n saving: [],\n saved: [],\n deleting: [],\n deleted: [],\n restoring: [],\n restored: [],\n retrieved: [],\n };\n }\n\n // Auto-detect traits from static properties\n autoDetectTraits(staticClass);\n\n // Apply traits to the class (once per class)\n if ((staticClass as any).__traitsApplied !== true) {\n // Combine string trait names and class-based traits\n const allTraits: Array<string | ClassBasedTrait> = [...staticClass.traits];\n if ((staticClass as any).__traitClasses) {\n allTraits.push(...(staticClass as any).__traitClasses);\n }\n\n try {\n applyTraits(staticClass, allTraits);\n } catch (e) {\n console.warn(`Failed to apply traits for ${staticClass.name}:`, e);\n }\n (staticClass as any).__traitsApplied = true;\n }\n }\n\n // ====================\n // SCOPE METHODS (Similar to Laravel)\n // ====================\n\n /**\n * Add a local scope to the model\n */\n static addLocalScope(name: string, scope: ScopeMethod<any>): void {\n this.localScopes[name] = scope;\n }\n\n /**\n * Add a global scope to the model\n */\n static addGlobalScope(name: string, scope: (builder: EloquentBuilder<any>) => void): void {\n this.globalScopes[name] = scope;\n }\n\n /**\n * Remove a global scope\n */\n static removeGlobalScope(name: string): void {\n delete this.globalScopes[name];\n }\n\n /**\n * Get all global scopes\n */\n static getGlobalScopes(): { [name: string]: (builder: EloquentBuilder<any>) => void } {\n return this.globalScopes;\n }\n\n /**\n * Apply scopes to a query builder\n */\n static applyScopes(builder: EloquentBuilder<any>): EloquentBuilder<any> {\n // Apply global scopes (except those in withoutGlobalScopes)\n Object.entries(this.globalScopes).forEach(([name, scope]) => {\n if (!this.withoutGlobalScopes.includes(name)) {\n scope(builder);\n }\n });\n return builder;\n }\n\n /**\n * Register a scope method (similar to Laravel's scope naming convention)\n */\n static registerScopeMethod(name: string, scope: ScopeMethod<any>): void {\n const methodName = `scope${name.charAt(0).toUpperCase() + name.slice(1)}`;\n (this as any)[methodName] = scope;\n this.localScopes[name] = scope;\n }\n\n /**\n * Query with a local scope\n */\n static scope<T extends typeof Model>(\n this: T,\n name: string,\n ...args: any[]\n ): EloquentBuilder<InstanceType<T>> {\n const builder = this.query();\n\n // Apply global scopes first\n this.applyScopes(builder);\n\n // Apply local scope if exists\n if (this.localScopes[name]) {\n this.localScopes[name](builder, ...args);\n } else {\n // Try to find scope method with naming convention\n const scopeMethodName = `scope${name.charAt(0).toUpperCase() + name.slice(1)}`;\n if ((this as any)[scopeMethodName]) {\n (this as any)[scopeMethodName](builder, ...args);\n }\n }\n\n return builder;\n }\n\n /**\n * Query without global scopes\n */\n static withoutGlobalScope<T extends typeof Model>(\n this: T,\n ...scopes: string[]\n ): EloquentBuilder<InstanceType<T>> {\n const builder = this.query();\n\n // Mark scopes to be excluded\n this.withoutGlobalScopes.push(...scopes);\n\n // Apply only global scopes that are not excluded\n Object.entries(this.globalScopes).forEach(([name, scope]) => {\n if (!this.withoutGlobalScopes.includes(name)) {\n scope(builder);\n }\n });\n\n return builder;\n }\n\n /**\n * Query without any global scopes\n */\n static withoutGlobalScopes_<T extends typeof Model>(this: T): EloquentBuilder<InstanceType<T>> {\n const builder = this.query();\n // Don't apply any global scopes\n return builder;\n }\n\n // ====================\n // EVENT METHODS (Similar to Laravel)\n // ====================\n\n /**\n * Register an event listener\n */\n addEventListener(\n event: keyof ModelEvents,\n callback: (model: Model) => boolean | void | Promise<boolean | void>,\n ): void {\n if (!this.eventListeners[event]) {\n this.eventListeners[event] = [];\n }\n this.eventListeners[event].push(callback);\n }\n\n /**\n * Static method to register an event listener (chainable alternative to addEventListener)\n * @param event The event name to listen to\n * @param callback The callback function to execute when the event is triggered\n * @returns The Model class for chaining\n */\n static on(\n event: keyof ModelEvents,\n callback: (model: Model) => boolean | void | Promise<boolean | void>,\n ): typeof Model {\n // Ensure each subclass gets its own static eventListeners map instead of\n // sharing the base Model.eventListeners object. This prevents listeners\n // registered for one model from being called when another model fires an event.\n // If the class doesn't yet have its own eventListeners or it's still the\n // same object as the base Model, create a fresh map for this class.\n if (\n !(this as any).eventListeners ||\n (this as any).eventListeners === (Model as any).eventListeners\n ) {\n (this as any).eventListeners = {\n creating: [],\n created: [],\n updating: [],\n updated: [],\n saving: [],\n saved: [],\n deleting: [],\n deleted: [],\n restoring: [],\n restored: [],\n retrieved: [],\n } as any;\n }\n\n // Ensure the prototype has an eventListeners map (some code sets static/event maps instead)\n if (!this.prototype.eventListeners) {\n // Use the class-specific static eventListeners on the prototype so instance\n // methods can access the same collection.\n this.prototype.eventListeners = (this as any).eventListeners;\n }\n\n if (!this.prototype.eventListeners[event]) {\n this.prototype.eventListeners[event] = [];\n }\n this.prototype.eventListeners[event].push(callback);\n return this;\n }\n\n static observe<T extends Model>(observer: ObserverConstructor<T>) {\n const instance = new observer();\n\n const events: (keyof ModelEvents)[] = [\n \"creating\",\n \"created\",\n \"updating\",\n \"updated\",\n \"saving\",\n \"saved\",\n \"deleting\",\n \"deleted\",\n \"restoring\",\n \"restored\",\n \"retrieved\",\n ];\n\n for (const event of events) {\n const handler = (instance as any)[event];\n\n if (typeof handler === \"function\") {\n (this as any).on(event, (model: T) => handler.call(instance, model));\n }\n }\n\n return this;\n }\n\n /**\n * Dispatch an event\n */\n static async dispatchEvent(event: keyof ModelEvents, model: Model): Promise<void> {\n const listeners = this.eventListeners[event] || [];\n const proxyModel = (model as any).__proxy ?? model;\n for (const listener of listeners) {\n await listener(proxyModel);\n }\n }\n\n /**\n * Fire model events (similar to Laravel's fireModelEvent)\n */\n static async fireModelEvent(\n event: keyof ModelEvents,\n model: Model,\n halt: boolean = false,\n ): Promise<boolean> {\n const listeners = this.eventListeners[event] || [];\n // Pass the proxy to observers so property access like model.cover_id works.\n // Base methods are bound to the raw target, so `this` in those contexts is\n // the unwrapped instance — __proxy is the Proxy returned from the constructor.\n const proxyModel = (model as any).__proxy ?? model;\n\n for (const listener of listeners) {\n const result = await listener(proxyModel);\n\n if (halt === true && result === false) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Boot the model (similar to Laravel's boot method)\n */\n static boot(): void {\n // Apply traits\n // applyTraits(this, this.traits);\n //\n // // Call bootTraits if exists\n // if ((this as any).bootTraits) {\n // (this as any).bootTraits();\n // }\n }\n\n // ====================\n // TRAIT METHODS\n // ====================\n\n /**\n * Ensure traits and static containers are initialized once per subclass.\n * This runs automatically on first static call (e.g., query/ scope).\n */\n static ensureBooted(): void {\n this.boot();\n const self = this as typeof Model & {\n __traitsApplied?: boolean;\n __traitClasses?: ClassBasedTrait[];\n };\n\n // Initialize static containers with OWN copies (hasOwnProperty) to prevent\n // subclasses from sharing the base Model arrays/maps.\n if (!Object.prototype.hasOwnProperty.call(self, \"traits\")) self.traits = [];\n if (!Object.prototype.hasOwnProperty.call(self, \"localScopes\")) self.localScopes = {} as any;\n if (!Object.prototype.hasOwnProperty.call(self, \"globalScopes\")) self.globalScopes = {} as any;\n if (!Object.prototype.hasOwnProperty.call(self, \"withoutGlobalScopes\"))\n self.withoutGlobalScopes = [] as any;\n if (!Object.prototype.hasOwnProperty.call(self, \"eventListeners\")) {\n self.eventListeners = {\n creating: [],\n created: [],\n updating: [],\n updated: [],\n saving: [],\n saved: [],\n deleting: [],\n deleted: [],\n restoring: [],\n restored: [],\n retrieved: [],\n } as any;\n }\n\n // Auto-detect traits\n autoDetectTraits(self);\n\n if (self.__traitsApplied === true) return;\n\n // Combine string trait names and class-based traits\n const allTraits: Array<string | ClassBasedTrait> = [...self.traits];\n if (self.__traitClasses) {\n allTraits.push(...self.__traitClasses);\n }\n\n try {\n applyTraits(self, allTraits);\n } catch (e) {\n console.warn(`Failed to apply traits for ${self.name}:`, e);\n }\n self.__traitsApplied = true;\n }\n\n /**\n * Check if model uses a trait\n */\n static usesTrait(traitName: string): boolean {\n return this.traits.includes(traitName);\n }\n\n /**\n * Add traits to the model\n */\n static addTraits(...traitNames: string[]): void {\n this.traits = [...new Set([...this.traits, ...traitNames])];\n // Re-apply traits\n applyTraits(this, this.traits);\n }\n\n /**\n * Boot all traits (similar to Laravel's bootTraits)\n */\n static bootTraits(): void {\n const staticClass = this as typeof Model;\n\n // Get trait methods that start with 'boot'\n const traitMethods = Object.getOwnPropertyNames(staticClass.prototype).filter(\n (method) => method.startsWith(\"boot\") && method !== \"bootTraits\",\n );\n\n traitMethods.forEach((method) => {\n (staticClass.prototype as any)[method].call(staticClass);\n });\n }\n\n // ====================\n // MACRO METHODS (Similar to Laravel's macroable)\n // ====================\n\n /**\n * Add a macro to the model class\n */\n static macro(name: string, macro: Function): void {\n (this as any)[name] = macro;\n }\n\n /**\n * Check if a macro exists\n */\n static hasMacro(name: string): boolean {\n return !!(this as any)[name];\n }\n\n /**\n * Mixin traits/macros from another class\n */\n static mixin(traitClass: any): void {\n const methods = Object.getOwnPropertyNames(traitClass.prototype);\n\n methods.forEach((method) => {\n if (method !== \"constructor\") {\n this.prototype[method] = traitClass.prototype[method];\n }\n });\n\n // Also mix static methods\n const staticMethods = Object.getOwnPropertyNames(traitClass);\n staticMethods.forEach((method) => {\n if (method !== \"length\" && method !== \"name\" && method !== \"prototype\") {\n (this as any)[method] = traitClass[method];\n }\n });\n }\n\n // Helper to convert snake_case to StudlyCase method segment\n private static toStudlyCase(key: string): string {\n return key\n .split(\"_\")\n .filter(Boolean)\n .map((seg) => seg.charAt(0).toUpperCase() + seg.slice(1))\n .join(\"\");\n }\n\n // Build accessor/mutator method name for a given key\n private static buildMethodName(prefix: \"get\" | \"set\", key: string, suffix: \"Attribute\"): string {\n const studly = this.toStudlyCase(key);\n return `${prefix}${studly}${suffix}`;\n }\n\n // ====================\n // CORE ATTRIBUTE ACCESS METHODS\n // ====================\n\n /**\n * Get raw attribute value (bypasses accessors)\n */\n getRawAttribute(key: string): any {\n return this.attributes[key];\n }\n\n /**\n * Set raw attribute value (bypasses mutators)\n */\n setRawAttribute(key: string, value: any): void {\n this.attributes[key] = value;\n this.__attributeCache.delete(key);\n }\n\n /**\n * Get property with support for direct field access\n */\n getProperty(prop: string): any {\n // First check if it's a direct property\n if (prop in this && ![\"attributes\", \"original\", \"relationshipsLoaded\"].includes(prop)) {\n return this[prop];\n }\n\n // Check attributes\n if (prop in this.attributes) {\n return this.attributes[prop];\n }\n\n // Check relationships\n if (prop in this.relationshipsLoaded) {\n return this.relationshipsLoaded[prop];\n }\n\n return undefined;\n }\n\n // ====================\n // ACCESSOR METHODS\n // ====================\n\n /**\n * Get an attribute with accessor support (sync/async)\n * @param key Attribute name\n * @param onlyAppended If true, only return value if it's in appends array\n */\n async getAttributeAsync<T = any>(key: string, onlyAppended: boolean = false): Promise<T> {\n // Check if we should only return appended attributes\n if (onlyAppended) {\n const staticClass = this.constructor as typeof Model;\n if (!staticClass.appends.includes(key)) {\n return undefined as T;\n }\n }\n\n // Check cache first\n if (this.__attributeCache.has(key)) {\n return this.__attributeCache.get(key);\n }\n\n // Check for accessor\n const staticClass = this.constructor as typeof Model;\n const accessorKey = (staticClass as any).buildMethodName(\"get\", key, \"Attribute\");\n const accessorDescriptor = staticClass._accessors.get(key);\n\n let value: any = undefined;\n\n // Check attributes first\n if (key in this.attributes) {\n value = this.attributes[key];\n } else if (this.relationshipsLoaded[key]) {\n value = this.relationshipsLoaded[key];\n }\n\n // Apply accessor if exists\n if (accessorDescriptor) {\n if (accessorDescriptor.async) {\n value = await accessorDescriptor.async(value, this);\n } else if (accessorDescriptor.sync) {\n value = accessorDescriptor.sync(value, this);\n }\n }\n // Fallback to instance method\n else if (typeof (this as any)[accessorKey] === \"function\") {\n const result = (this as any)[accessorKey](value);\n if (result instanceof Promise) {\n value = await result;\n } else {\n value = result;\n }\n }\n\n // Cache the result\n if (value !== undefined) {\n this.__attributeCache.set(key, value);\n }\n\n return value as T;\n }\n\n /**\n * Get an attribute with accessor support (sync)\n * @param key Attribute name\n * @param onlyAppended If true, only return value if it's in appends array\n */\n getAttribute<T = any>(key: string, onlyAppended: boolean = false): T {\n // Check if we should only return appended attributes\n if (onlyAppended) {\n const staticClass = this.constructor as typeof Model;\n if (!staticClass.appends.includes(key)) {\n return undefined as T;\n }\n }\n\n // Prevent infinite recursion\n if (this.__isGettingAttribute) {\n return this.attributes[key];\n }\n\n // Check cache first\n if (this.__attributeCache.has(key)) {\n return this.__attributeCache.get(key);\n }\n\n this.__isGettingAttribute = true;\n\n try {\n // Check for accessor\n const staticClass = this.constructor as typeof Model;\n const accessorKey = (staticClass as any).buildMethodName(\"get\", key, \"Attribute\");\n const accessorDescriptor = staticClass._accessors.get(key);\n\n let value: any = undefined;\n\n // Check attributes first\n if (key in this.attributes) {\n value = this.attributes[key];\n } else if (this.relationshipsLoaded[key]) {\n value = this.relationshipsLoaded[key];\n }\n\n // Apply accessor if exists\n if (accessorDescriptor) {\n if (accessorDescriptor.sync) {\n value = accessorDescriptor.sync(value, this);\n }\n // Note: async accessors not called in sync context\n }\n // Fallback to instance method\n else if (typeof (this as any)[accessorKey] === \"function\") {\n value = (this as any)[accessorKey](value);\n // If it returns a Promise in sync context, warn and return undefined\n if (value instanceof Promise) {\n console.warn(\n `Accessor ${accessorKey} returned a Promise in sync context. Use getAttributeAsync() instead.`,\n );\n return undefined as T;\n }\n }\n\n // Cache the result\n if (value !== undefined) {\n this.__attributeCache.set(key, value);\n }\n\n return value as T;\n } finally {\n this.__isGettingAttribute = false;\n }\n }\n\n /**\n * Create a context for accessors that allows direct field access\n */\n private createAccessorContext(): any {\n // Return a proxy that allows direct field access\n return new Proxy(this, {\n get: (target: any, prop: PropertyKey, receiver: any) => {\n if (typeof prop === \"string\") {\n // Special handling for 'this' keyword\n if (prop === \"this\") {\n return target;\n }\n\n // Check for direct attribute access\n if (prop in target.attributes) {\n return target.attributes[prop];\n }\n\n // Check for relationship access\n if (prop in target.relationshipsLoaded) {\n return target.relationshipsLoaded[prop];\n }\n\n // Check for methods\n if (prop in target && typeof target[prop] === \"function\") {\n return target[prop].bind(target);\n }\n\n // Check for other properties\n if (prop in target) {\n const val = target[prop];\n return typeof val === \"function\" ? val.bind(target) : val;\n }\n }\n\n return Reflect.get(target, prop, receiver);\n },\n\n set: (target: any, prop: PropertyKey, value: any, receiver: any) => {\n // Prevent modification of attributes from within accessors\n if (typeof prop === \"string\" && prop in target.attributes) {\n throw new Error(`Cannot modify attribute '${prop}' from within an accessor`);\n }\n return Reflect.set(target, prop, value, receiver);\n },\n });\n }\n\n /**\n * Get attribute with accessor for proxy/getter\n */\n private getAttributeWithAccessor<T = any>(\n key: string,\n isAppended: boolean = false,\n ): T | undefined {\n const staticClass = this.constructor as typeof Model;\n const accessorKey = `get${key.charAt(0).toUpperCase() + key.slice(1)}Attribute`;\n const accessorDescriptor = staticClass._accessors.get(key);\n\n // Only handle accessors if they're appended or if we're accessing directly\n const shouldHandle =\n isAppended || accessorDescriptor?.sync || typeof (this as any)[accessorKey] === \"function\";\n\n if (shouldHandle) {\n return this.getAttribute(key, isAppended);\n }\n\n return undefined;\n }\n /**\n * Set attribute with mutator support\n */\n setAttributeWithMutator(key: string, value: any): boolean {\n const staticClass = this.constructor as typeof Model;\n const mutatorKey = `set${key.charAt(0).toUpperCase() + key.slice(1)}Attribute`;\n const mutatorDescriptor = staticClass._mutators.get(key);\n\n let processedValue = value;\n\n // Apply mutator if exists\n if (mutatorDescriptor) {\n if (mutatorDescriptor.sync) {\n const mutatorThis = this.createAccessorContext();\n processedValue = mutatorDescriptor.sync(value, mutatorThis);\n }\n }\n // Fallback to instance method\n else if (typeof (this as any)[mutatorKey] === \"function\") {\n const mutatorThis = this.createAccessorContext();\n processedValue = (this as any)[mutatorKey].call(mutatorThis, value);\n } else {\n // No mutator found\n return false;\n }\n\n // Clear cache for this attribute\n this.__attributeCache.delete(key);\n\n // Set the processed value\n this.setAttribute(key, processedValue);\n return true;\n }\n /**\n * Get all appended attributes with their values\n */\n async getAppendedAttributesAsync(): Promise<ModelAttributes> {\n const staticClass = this.constructor as typeof Model;\n const result: ModelAttributes = {};\n\n for (const key of staticClass.appends) {\n const value = await this.getAttributeAsync(key);\n if (value !== undefined) {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n /**\n * Get all appended attributes with their values (sync)\n */\n getAppendedAttributes(): ModelAttributes {\n const staticClass = this.constructor as typeof Model;\n const result: ModelAttributes = {};\n\n for (const key of staticClass.appends) {\n const value = this.getAttribute(key);\n if (value !== undefined) {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n // ====================\n // STATIC REGISTRATION METHODS\n // ====================\n\n /**\n * Register a synchronous accessor\n */\n static registerAccessor(key: string, fn: (value: any, instance: Model) => any): void {\n const descriptor = this._accessors.get(key) || { name: key };\n descriptor.sync = fn;\n this._accessors.set(key, descriptor);\n }\n\n /**\n * Register an asynchronous accessor\n */\n static registerAsyncAccessor(\n key: string,\n fn: (value: any, instance: Model) => Promise<any>,\n ): void {\n const descriptor = this._accessors.get(key) || { name: key };\n descriptor.async = fn;\n this._accessors.set(key, descriptor);\n }\n\n /**\n * Register a synchronous mutator\n */\n static registerMutator(key: string, fn: (value: any, instance: Model) => any): void {\n const descriptor = this._mutators.get(key) || { name: key };\n descriptor.sync = fn;\n this._mutators.set(key, descriptor);\n }\n\n /**\n * Register an asynchronous mutator\n */\n static registerAsyncMutator(\n key: string,\n fn: (value: any, instance: Model) => Promise<any>,\n ): void {\n const descriptor = this._mutators.get(key) || { name: key };\n descriptor.async = fn;\n this._mutators.set(key, descriptor);\n }\n\n /**\n * Add attributes to appends array\n */\n static addAppends(...attributes: string[]): void {\n this.appends = [...new Set([...this.appends, ...attributes])];\n }\n\n // ====================\n // HELPER METHODS FOR ACCESSORS\n // ====================\n\n /**\n * Get a field value (alias for this.field_name in accessors)\n */\n getField(fieldName: string): any {\n return this.attributes[fieldName];\n }\n\n /**\n * Get relationship count (for use in accessors)\n */\n async getRelationshipCount(relationshipName: string): Promise<number> {\n if (this.relationshipsLoaded[relationshipName]) {\n return Array.isArray(this.relationshipsLoaded[relationshipName])\n ? this.relationshipsLoaded[relationshipName].length\n : 1;\n }\n\n // Load relationship if not loaded\n const relation = this.getRelationship(relationshipName);\n if (!relation) return 0;\n\n switch (relation.type) {\n case \"hasOne\":\n case \"belongsTo\":\n const single = await this[relationshipName]?.().first();\n return single ? 1 : 0;\n\n case \"hasMany\":\n case \"belongsToMany\":\n const many = await this[relationshipName]?.().get();\n return Array.isArray(many) ? many.length : 0;\n\n default:\n return 0;\n }\n }\n\n /**\n * Get relationship query (for use in accessors)\n */\n getRelationshipQuery(relationshipName: string): any {\n const relation = this.getRelationship(relationshipName);\n if (!relation) return null;\n\n return this[relationshipName]?.();\n }\n\n // ====================\n // UPDATED toJSON METHOD\n // ====================\n\n async toJSONAsync(options: ToJSONOptions = {}): Promise<any> {\n const {\n maxDepth = 10,\n currentDepth = 0,\n visited = new WeakSet(),\n include = [],\n exclude = [],\n withRelations = true,\n relationTree = {},\n includeMetadata = false,\n withAccessors = true,\n onlyAppended = false,\n } = options;\n\n if (visited.has(this)) {\n return \"[Circular]\";\n }\n visited.add(this);\n\n if (currentDepth >= maxDepth) {\n return \"[Max Depth Reached]\";\n }\n\n const obj: any = {};\n\n if (onlyAppended) {\n // Only include appended attributes\n const staticClass = this.constructor as typeof Model;\n const appendedAttrs = await this.getAppendedAttributesAsync();\n\n for (const [key, value] of Object.entries(appendedAttrs)) {\n if (exclude.includes(key)) continue;\n obj[key] = value;\n }\n\n return obj;\n }\n\n // Build relationTree from include dot-paths and separate attribute includes\n const knownRelations = new Set<string>([\n ...Object.keys(this.relationshipsLoaded || {}),\n ...Object.keys(this.getAllRelationships() || {}),\n ]);\n const computedTree: Record<string, any> = { ...(relationTree || {}) };\n const directRelations = new Set<string>();\n const includeAttr: string[] = [];\n (include || []).forEach((path) => {\n if (!path) return;\n if (path.includes(\".\")) {\n const segments = path.split(\".\");\n const head = segments.shift() as string;\n directRelations.add(head);\n let cursor = (computedTree[head] = computedTree[head] || {});\n while (segments.length) {\n const seg = segments.shift() as string;\n cursor[seg] = cursor[seg] || {};\n cursor = cursor[seg];\n }\n } else {\n if (knownRelations.has(path)) {\n directRelations.add(path);\n } else {\n includeAttr.push(path);\n }\n }\n });\n\n // Get base attributes (filtered by hidden)\n const baseAttributes = this.attributesToArray;\n\n // Apply attribute filters\n const filteredAttributes: ModelAttributes = {};\n Object.keys(baseAttributes).forEach((key) => {\n if ((includeAttr.length === 0 || includeAttr.includes(key)) && !exclude.includes(key)) {\n filteredAttributes[key] = baseAttributes[key];\n }\n });\n\n // Add regular attributes\n for (const [key, value] of Object.entries(filteredAttributes)) {\n if (\n value &&\n typeof value === \"object\" &&\n (value._bsontype === \"ObjectId\" || value._bsontype === \"ObjectID\") &&\n (typeof (value as any)?.toHexString === \"function\" ||\n typeof (value as any)?.toString === \"function\")\n ) {\n obj[key] = value.toString();\n } else {\n obj[key] = value;\n }\n }\n\n // Add appended attributes if withAccessors is true\n if (withAccessors) {\n const staticClass = this.constructor as typeof Model;\n for (const key of staticClass.appends) {\n if (exclude.includes(key)) continue;\n if (includeAttr.length > 0 && !includeAttr.includes(key) && !directRelations.has(key))\n continue;\n\n obj[key] = await this.getAttributeAsync(key);\n }\n }\n\n if (withRelations && Object.keys(this.relationshipsLoaded).length > 0) {\n await this.serializeRelationshipsAsync(obj, {\n maxDepth,\n currentDepth: currentDepth + 1,\n visited,\n include: Array.from(directRelations),\n exclude,\n withRelations,\n relationTree: computedTree,\n withAccessors,\n onlyAppended: false,\n });\n }\n\n if (withRelations) {\n const allRelations = this.getAllRelationships();\n for (const relName of Object.keys(allRelations)) {\n if (obj[relName] !== undefined) continue;\n\n if (directRelations.size > 0 || Object.keys(computedTree).length > 0) {\n const allowed = directRelations.has(relName) || computedTree[relName] !== undefined;\n if (!allowed) continue;\n }\n if (exclude.length > 0 && exclude.includes(relName)) continue;\n\n const relType = allRelations[relName].type;\n obj[relName] =\n relType === \"hasOne\" || relType === \"belongsTo\" || relType === \"morphOne\" ? null : [];\n }\n }\n\n if (includeMetadata) {\n this.addMetadata(obj);\n }\n\n return obj;\n }\n\n toJSON(options: ToJSONOptions & { relationTree?: Record<string, any> } = {}): any {\n const {\n maxDepth = 10,\n currentDepth = 0,\n visited = new WeakSet(),\n include = [],\n exclude = [],\n withRelations = true,\n relationTree = {},\n includeMetadata = false,\n withAccessors = true,\n onlyAppended = false,\n } = options;\n\n if (visited.has(this)) {\n return \"[Circular]\";\n }\n visited.add(this);\n\n if (currentDepth >= maxDepth) {\n return \"[Max Depth Reached]\";\n }\n\n const obj: any = {};\n\n if (onlyAppended) {\n // Only include appended attributes\n const staticClass = this.constructor as typeof Model;\n const appendedAttrs = this.getAppendedAttributes();\n\n for (const [key, value] of Object.entries(appendedAttrs)) {\n if (exclude.includes(key)) continue;\n obj[key] = value;\n }\n\n return obj;\n }\n\n // Build relationTree from include dot-paths and separate attribute includes\n const knownRelations = new Set<string>([\n ...Object.keys(this.relationshipsLoaded || {}),\n ...Object.keys(this.getAllRelationships() || {}),\n ]);\n const computedTree: Record<string, any> = { ...(relationTree || {}) };\n const directRelations = new Set<string>();\n const includeAttr: string[] = [];\n (include || []).forEach((path) => {\n if (!path) return;\n if (path.includes(\".\")) {\n const segments = path.split(\".\");\n const head = segments.shift() as string;\n directRelations.add(head);\n let cursor = (computedTree[head] = computedTree[head] || {});\n while (segments.length) {\n const seg = segments.shift() as string;\n cursor[seg] = cursor[seg] || {};\n cursor = cursor[seg];\n }\n } else {\n if (knownRelations.has(path)) {\n directRelations.add(path);\n } else {\n includeAttr.push(path);\n }\n }\n });\n\n // Get base attributes (filtered by hidden)\n const baseAttributes = this.attributesToArray;\n\n // Apply attribute filters\n const filteredAttributes: ModelAttributes = {};\n Object.keys(baseAttributes).forEach((key) => {\n if ((includeAttr.length === 0 || includeAttr.includes(key)) && !exclude.includes(key)) {\n filteredAttributes[key] = baseAttributes[key];\n }\n });\n\n // Add regular attributes\n for (const [key, value] of Object.entries(filteredAttributes)) {\n if (\n value &&\n typeof value === \"object\" &&\n (value._bsontype === \"ObjectId\" || value._bsontype === \"ObjectID\") &&\n (typeof (value as any)?.toHexString === \"function\" ||\n typeof (value as any)?.toString === \"function\")\n ) {\n obj[key] = value.toString();\n } else {\n obj[key] = value;\n }\n }\n\n // Add appended attributes if withAccessors is true\n if (withAccessors) {\n const staticClass = this.constructor as typeof Model;\n for (const key of staticClass.appends) {\n if (exclude.includes(key)) continue;\n if (includeAttr.length > 0 && !includeAttr.includes(key) && !directRelations.has(key))\n continue;\n\n obj[key] = this.getAttribute(key);\n }\n }\n\n if (withRelations && Object.keys(this.relationshipsLoaded).length > 0) {\n this.serializeRelationships(obj, {\n maxDepth,\n currentDepth: currentDepth + 1,\n visited,\n include: Array.from(directRelations),\n exclude,\n withRelations,\n relationTree: computedTree,\n withAccessors,\n onlyAppended: false,\n });\n }\n\n if (withRelations) {\n const allRelations = this.getAllRelationships();\n Object.keys(allRelations).forEach((relName) => {\n if (obj[relName] !== undefined) return;\n\n if (directRelations.size > 0 || Object.keys(computedTree).length > 0) {\n const allowed = directRelations.has(relName) || computedTree[relName] !== undefined;\n if (!allowed) return;\n }\n if (exclude.length > 0 && exclude.includes(relName)) return;\n\n const relType = allRelations[relName].type;\n obj[relName] =\n relType === \"hasOne\" || relType === \"belongsTo\" || relType === \"morphOne\" ? null : [];\n });\n }\n\n if (includeMetadata) {\n this.addMetadata(obj);\n }\n\n return obj;\n }\n\n /**\n * Get attributes for array conversion (excludes hidden fields)\n */\n get attributesToArray(): ModelAttributes {\n const staticClass = this.constructor as typeof Model;\n const result: ModelAttributes = {};\n Object.keys(this.attributes).forEach((key) => {\n if (!staticClass.hidden.includes(key)) {\n result[key] = this.attributes[key];\n }\n });\n return result;\n }\n\n /**\n * Get all attributes including appended ones\n */\n getAttributesWithAppends(): ModelAttributes {\n const base = this.attributesToArray;\n const appended = this.getAppendedAttributes();\n return { ...base, ...appended };\n }\n\n /**\n * Get all attributes including appended ones (async)\n */\n async getAttributesWithAppendsAsync(): Promise<ModelAttributes> {\n const base = this.attributesToArray;\n const appended = await this.getAppendedAttributesAsync();\n return { ...base, ...appended };\n }\n\n private async serializeRelationshipsAsync(\n obj: any,\n options: ToJSONOptions & { relationTree?: Record<string, any> },\n ): Promise<void> {\n const directSet = new Set<string>(options.include || []);\n\n for (const rel of Object.keys(this.relationshipsLoaded)) {\n if (options.exclude?.includes(rel)) continue;\n\n const hasFilter =\n (options.include && options.include.length > 0) ||\n (options.relationTree && Object.keys(options.relationTree).length > 0);\n if (\n hasFilter &&\n !directSet.has(rel) &&\n !(options.relationTree && options.relationTree[rel] !== undefined)\n ) {\n continue;\n }\n\n const val = this.relationshipsLoaded[rel];\n const nestedTree = (options.relationTree && options.relationTree[rel]) || {};\n\n if (Array.isArray(val)) {\n obj[rel] = [];\n for (const v of val) {\n if (!v || typeof v.toJSONAsync !== \"function\") {\n obj[rel].push(v);\n continue;\n }\n const relationOptions = this.getRelationSerializationOptions(rel, options);\n relationOptions.relationTree = nestedTree;\n relationOptions.include = Object.keys(nestedTree || {});\n relationOptions.currentDepth = (options.currentDepth || 0) + 1;\n const json = await v.toJSONAsync(relationOptions);\n if (json !== undefined) {\n obj[rel].push(json);\n }\n }\n } else if (val && typeof val.toJSONAsync === \"function\") {\n const relationOptions = this.getRelationSerializationOptions(rel, options);\n relationOptions.relationTree = nestedTree;\n relationOptions.include = Object.keys(nestedTree || {});\n relationOptions.currentDepth = (options.currentDepth || 0) + 1;\n obj[rel] = await val.toJSONAsync(relationOptions);\n } else if (val !== undefined && val !== null) {\n obj[rel] = val;\n }\n }\n }\n\n private serializeRelationships(\n obj: any,\n options: ToJSONOptions & { relationTree?: Record<string, any> },\n ): void {\n const directSet = new Set<string>(options.include || []);\n\n Object.keys(this.relationshipsLoaded).forEach((rel) => {\n if (options.exclude?.includes(rel)) return;\n\n const hasFilter =\n (options.include && options.include.length > 0) ||\n (options.relationTree && Object.keys(options.relationTree).length > 0);\n if (\n hasFilter &&\n !directSet.has(rel) &&\n !(options.relationTree && options.relationTree[rel] !== undefined)\n ) {\n return;\n }\n\n const val = this.relationshipsLoaded[rel];\n const nestedTree = (options.relationTree && options.relationTree[rel]) || {};\n\n if (Array.isArray(val)) {\n obj[rel] = val\n .map((v) => {\n if (!v || typeof v.toJSON !== \"function\") return v;\n const relationOptions = this.getRelationSerializationOptions(rel, options);\n relationOptions.relationTree = nestedTree;\n relationOptions.include = Object.keys(nestedTree || {});\n relationOptions.currentDepth = (options.currentDepth || 0) + 1;\n return v.toJSON(relationOptions);\n })\n .filter((v) => v !== undefined);\n } else if (val && typeof val.toJSON === \"function\") {\n const relationOptions = this.getRelationSerializationOptions(rel, options);\n relationOptions.relationTree = nestedTree;\n relationOptions.include = Object.keys(nestedTree || {});\n relationOptions.currentDepth = (options.currentDepth || 0) + 1;\n obj[rel] = val.toJSON(relationOptions);\n } else if (val !== undefined && val !== null) {\n obj[rel] = val;\n }\n });\n }\n\n // Clear attribute cache when attributes change\n setAttribute(key: string, value: any): void {\n const staticClass = this.constructor as typeof Model;\n if (staticClass.casts[key]) {\n value = this.castAttribute(key, value);\n }\n this.attributes[key] = value;\n this.__attributeCache.delete(key); // Clear cache for this attribute\n }\n\n // Clear entire cache when hydrating\n hydrate(attributes: ModelAttributes): this {\n Object.keys(attributes).forEach((key) => {\n this.setAttribute(key, attributes[key]);\n });\n\n // Ensure every fillable key is present (null if not in DB result),\n // so direct property access like model.cover_id never returns undefined.\n const staticClass = this.constructor as typeof Model;\n staticClass.fillable.forEach((key) => {\n if (!(key in this.attributes)) {\n this.attributes[key] = null;\n }\n });\n\n this.original = { ...this.attributes };\n this.__exists = true;\n this.__attributeCache.clear();\n return this;\n }\n\n fill(attributes: ModelAttributes): this {\n const staticClass = this.constructor as typeof Model;\n Object.keys(attributes).forEach((key) => {\n if (staticClass.fillable.length === 0 || staticClass.fillable.includes(key)) {\n if (!staticClass.guarded.includes(key)) {\n this.setAttribute(key, attributes[key]);\n }\n }\n });\n return this;\n }\n // Add this getter to access the table name\n // protected get table(): string {\n // return (this.constructor as typeof Model).getTable();\n // }\n getAttributes(): ModelAttributes {\n return { ...this.attributes };\n }\n\n getOriginal(key?: string): any {\n if (key) {\n return this.original[key];\n }\n return { ...this.original };\n }\n\n isDirty(key?: string): boolean {\n if (key) {\n return this.attributes[key] !== this.original[key];\n }\n return JSON.stringify(this.attributes) !== JSON.stringify(this.original);\n }\n\n getDirty(): ModelAttributes {\n const dirty: ModelAttributes = {};\n Object.keys(this.attributes).forEach((key) => {\n if (this.attributes[key] !== this.original[key]) {\n dirty[key] = this.attributes[key];\n }\n });\n return dirty;\n }\n\n syncOriginal(): this {\n this.original = { ...this.attributes };\n return this;\n }\n\n /**\n * Get relationship configuration for a given relation name\n * Supports both static relationships and instance method relationships\n */\n protected getRelationship(relation: string): RelationshipConfig | null {\n const staticClass = this.constructor as typeof Model;\n\n // First check static relationships\n if (staticClass.relationships && staticClass.relationships[relation]) {\n return staticClass.relationships[relation];\n }\n\n // Then check if there's an instance method for this relationship\n if (typeof (this as any)[relation] === \"function\") {\n try {\n const relationInstance = (this as any)[relation]();\n return this.convertRelationToConfig(relationInstance, relation);\n } catch (error) {\n console.warn(`Failed to get relationship \"${relation}\" from instance method:`, error);\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Convert a relation instance to a RelationshipConfig\n */\n private convertRelationToConfig(\n relationInstance: any,\n relationName: string,\n ): RelationshipConfig | null {\n if (relationInstance instanceof HasOne) {\n return {\n type: \"hasOne\",\n model: (relationInstance as any).relatedModel,\n foreignKey: (relationInstance as any).foreignKey,\n localKey: (relationInstance as any).localKey,\n };\n } else if (relationInstance instanceof HasMany) {\n return {\n type: \"hasMany\",\n model: (relationInstance as any).relatedModel,\n foreignKey: (relationInstance as any).foreignKey,\n localKey: (relationInstance as any).localKey,\n };\n } else if (relationInstance instanceof BelongsTo) {\n return {\n type: \"belongsTo\",\n model: (relationInstance as any).relatedModel,\n foreignKey: (relationInstance as any).foreignKey,\n ownerKey: (relationInstance as any).ownerKey,\n };\n } else if (relationInstance instanceof BelongsToMany) {\n return {\n type: \"belongsToMany\",\n model: (relationInstance as any).relatedModel,\n table: (relationInstance as any).pivotTable,\n foreignKey: (relationInstance as any).foreignPivotKey,\n relatedKey: (relationInstance as any).relatedPivotKey,\n pivotModel: (relationInstance as any).pivotModel,\n };\n }\n\n return null;\n }\n\n /**\n * Get all defined relationships (both static and instance)\n */\n protected getAllRelationships(): { [key: string]: RelationshipConfig } {\n const staticClass = this.constructor as typeof Model;\n const allRelations: { [key: string]: RelationshipConfig } = {};\n\n // Add static relationships\n if (staticClass.relationships) {\n Object.assign(allRelations, staticClass.relationships);\n }\n\n // Add instance method relationships\n const instanceMethods = Object.getOwnPropertyNames(Object.getPrototypeOf(this)).filter(\n (prop) => typeof (this as any)[prop] === \"function\" && prop !== \"constructor\",\n );\n\n for (const methodName of instanceMethods) {\n // Skip if already defined in static relationships\n if (allRelations[methodName]) continue;\n\n try {\n const relationInstance = (this as any)[methodName]();\n const config = this.convertRelationToConfig(relationInstance, methodName);\n if (config) {\n allRelations[methodName] = config;\n }\n } catch (error) {\n // Ignore methods that don't return valid relationship instances\n }\n }\n\n return allRelations;\n }\n\n // Update the toJSON method to use getAllRelationships for fallback\n\n // Update the getRelationSerializationOptions to use getRelationship\n private getRelationSerializationOptions(\n relationName: string,\n parentOptions: ToJSONOptions,\n ): ToJSONOptions {\n const relationConfig = this.getRelationship(relationName);\n\n // Default options - continue with same settings but increment depth\n const baseOptions: ToJSONOptions = {\n maxDepth: parentOptions.maxDepth,\n currentDepth: parentOptions.currentDepth,\n visited: parentOptions.visited,\n withRelations: parentOptions.withRelations,\n includeMetadata: parentOptions.includeMetadata,\n };\n\n // Check if there are relationship-specific serialization rules\n if (relationConfig && (relationConfig as any).serialization) {\n const serializationConfig = (relationConfig as any).serialization;\n\n if (serializationConfig.include) {\n baseOptions.include = serializationConfig.include;\n }\n\n if (serializationConfig.exclude) {\n baseOptions.exclude = serializationConfig.exclude;\n }\n\n if (serializationConfig.maxDepth !== undefined) {\n baseOptions.maxDepth = serializationConfig.maxDepth;\n }\n\n if (serializationConfig.withRelations !== undefined) {\n baseOptions.withRelations = serializationConfig.withRelations;\n }\n }\n\n return baseOptions;\n }\n\n private applyAttributeFilters(obj: any, include: string[], exclude: string[]): void {\n if (include.length > 0) {\n // Only include specified attributes\n Object.keys(obj).forEach((key) => {\n if (!include.includes(key)) {\n delete obj[key];\n }\n });\n } else if (exclude.length > 0) {\n // Exclude specified attributes\n exclude.forEach((key) => {\n delete obj[key];\n });\n }\n }\n\n private addMetadata(obj: any): void {\n const staticClass = this.constructor as typeof Model;\n\n obj.$metadata = {\n model: staticClass.name,\n table: staticClass.getTable(),\n primaryKey: staticClass.primaryKey,\n timestamps: staticClass.timestamps,\n softDeletes: staticClass.softDeletes,\n loadedRelations: Object.keys(this.relationshipsLoaded),\n isDirty: this.isDirty(),\n exists: this.getAttribute(staticClass.primaryKey) !== undefined,\n };\n }\n\n public setLoadedRelation(name: string, value: any): void {\n this.relationshipsLoaded[name] = value;\n }\n\n public unsetRelation(name: string): void {\n delete this.relationshipsLoaded[name];\n }\n\n public relationLoaded(name: string): boolean {\n return name in this.relationshipsLoaded;\n }\n\n // Enhanced relationship methods with proper typing for IDE resolution\n hasOne<T extends Model>(\n this: any,\n model: new () => T,\n foreignKey?: string,\n localKey?: string,\n ): HasOne<T> {\n const table = (model as unknown as typeof Model).getTable();\n const singularTable = table.endsWith(\"s\") ? table.slice(0, -1) : table;\n const fk = foreignKey || `${singularTable}_id`;\n // localKey is a column on THIS (parent) model, so default to the parent's PK\n const lk = localKey || (this.constructor as typeof Model).primaryKey || \"id\";\n return new HasOne(model as unknown as typeof Model, fk, lk, this);\n }\n\n hasMany<T extends Model>(\n this: any,\n model: new () => T,\n foreignKey?: string,\n localKey?: string,\n ): HasMany<T> {\n const table = (model as unknown as typeof Model).getTable();\n const singularTable = table.endsWith(\"s\") ? table.slice(0, -1) : table;\n const fk = foreignKey || `${singularTable}_id`;\n // localKey is a column on THIS (parent) model, so default to the parent's PK\n const lk = localKey || (this.constructor as typeof Model).primaryKey || \"id\";\n return new HasMany(model as unknown as typeof Model, fk, lk, this);\n }\n\n /**\n * Define a has-one-through relationship.\n *\n * @param model The distant (target) model\n * @param through The intermediate model\n * @param firstKey FK on the intermediate table pointing to the parent (default: parent_table_id)\n * @param secondKey FK on the target table pointing to the intermediate (default: through_table_id)\n * @param localKey PK on the parent (default: id)\n * @param secondLocalKey PK on the intermediate (default: id)\n */\n hasOneThrough<T extends Model>(\n this: any,\n model: new () => T,\n through: new () => Model,\n firstKey?: string,\n secondKey?: string,\n localKey?: string,\n secondLocalKey?: string,\n ): HasOneThrough<T> {\n const parentTable = (this.constructor as typeof Model).getTable();\n const throughTable = (through as unknown as typeof Model).getTable();\n const fk1 = firstKey || `${parentTable}_id`;\n const fk2 = secondKey || `${throughTable}_id`;\n const lk = localKey || (this.constructor as typeof Model).primaryKey || \"id\";\n const lk2 = secondLocalKey || (through as unknown as typeof Model).primaryKey || \"id\";\n return new HasOneThrough(\n model as unknown as typeof Model,\n through as unknown as typeof Model,\n fk1,\n fk2,\n lk,\n lk2,\n this,\n );\n }\n\n /**\n * Define a has-many-through relationship.\n *\n * @param model The distant (target) model\n * @param through The intermediate model\n * @param firstKey FK on the intermediate table pointing to the parent\n * @param secondKey FK on the target table pointing to the intermediate\n * @param localKey PK on the parent (default: id)\n * @param secondLocalKey PK on the intermediate (default: id)\n */\n hasManyThrough<T extends Model>(\n this: any,\n model: new () => T,\n through: new () => Model,\n firstKey?: string,\n secondKey?: string,\n localKey?: string,\n secondLocalKey?: string,\n ): HasManyThrough<T> {\n const parentTable = (this.constructor as typeof Model).getTable();\n const throughTable = (through as unknown as typeof Model).getTable();\n const fk1 = firstKey || `${parentTable}_id`;\n const fk2 = secondKey || `${throughTable}_id`;\n const lk = localKey || (this.constructor as typeof Model).primaryKey || \"id\";\n const lk2 = secondLocalKey || (through as unknown as typeof Model).primaryKey || \"id\";\n return new HasManyThrough(\n model as unknown as typeof Model,\n through as unknown as typeof Model,\n fk1,\n fk2,\n lk,\n lk2,\n this,\n );\n }\n\n belongsTo<T extends Model>(\n this: any,\n model: new () => T,\n foreignKey?: string,\n ownerKey?: string,\n ): BelongsTo<T> {\n const relatedTable = (model as unknown as typeof Model).getTable();\n const fk = foreignKey || `${relatedTable}_id`;\n const ok = ownerKey || (model as unknown as typeof Model).primaryKey || \"id\";\n return new BelongsTo(model as unknown as typeof Model, fk, ok, this);\n }\n\n belongsToMany<T extends Model>(\n this: any,\n model: new () => T,\n table?: string | (new (...args: any[]) => Model) | typeof Model,\n foreignPivotKey?: string,\n relatedPivotKey?: string,\n ): BelongsToMany<T> {\n const parentTable = (this.constructor as typeof Model).getTable();\n const relatedTable = (model as unknown as typeof Model).getTable();\n\n // Detect if `table` is a pivot Model class (has static getTable) or a plain string\n let pivotTable: string;\n let pivotModel: typeof Model | undefined;\n if (table && typeof table === \"function\" && typeof (table as any).getTable === \"function\") {\n pivotModel = table as unknown as typeof Model;\n // Ensure pivot model traits (e.g. SoftDeletes) are booted so flags are set\n if (typeof (pivotModel as any).ensureBooted === \"function\") {\n (pivotModel as any).ensureBooted();\n }\n pivotTable = (pivotModel as typeof Model).getTable();\n } else {\n pivotTable = (table as string | undefined) || [parentTable, relatedTable].sort().join(\"_\");\n }\n\n const foreignKey = foreignPivotKey || `${parentTable}_id`;\n const relatedKey = relatedPivotKey || `${relatedTable}_id`;\n const parentPrimaryKey = (this.constructor as any).primaryKey || \"id\";\n const relatedPrimaryKey = (model as unknown as typeof Model).primaryKey || \"id\";\n return new BelongsToMany(\n model as unknown as typeof Model,\n pivotTable,\n foreignKey,\n relatedKey,\n parentPrimaryKey,\n relatedPrimaryKey,\n this,\n pivotModel,\n );\n }\n\n morphOne<T extends Model>(this: any, model: new () => T, name: string): HasOne<T> {\n const morphType = `${name}_type`;\n const morphId = `${name}_id`;\n return this.hasOne(model, morphId).where(morphType, this.constructor.name);\n }\n\n morphMany<T extends Model>(this: any, model: new () => T, name: string): HasMany<T> {\n const morphType = `${name}_type`;\n const morphId = `${name}_id`;\n return this.hasMany(model, morphId).where(morphType, this.constructor.name);\n }\n\n morphTo<T extends Model = Model>(this: any, name: string): BelongsTo<T> {\n const morphType = `${name}_type`;\n const morphId = `${name}_id`;\n const type = this.getAttribute(morphType);\n const id = this.getAttribute(morphId);\n\n if (!type || !id) {\n return new BelongsTo(Model as unknown as typeof Model, morphId, id, this) as BelongsTo<T>;\n }\n\n // You would need to maintain a mapping of model names to constructors\n const modelConstructor = (this.constructor as any).morphMap?.[type] || Model;\n return this.belongsTo(modelConstructor, morphId);\n }\n\n // Update the save method to include events\n async save(options: { force?: boolean } = {}): Promise<this> {\n const staticClass = this.constructor as typeof Model & {\n table: string;\n primaryKey: string;\n timestamps?: boolean;\n autoIncrement?: boolean;\n };\n\n // Fire saving event\n const savingResult = await staticClass.fireModelEvent(\"saving\", this, true);\n if (savingResult === false) {\n return ((this as any).__proxy ?? this) as this;\n }\n\n // Fire creating/updating events\n if (!this.__exists) {\n const creatingResult = await staticClass.fireModelEvent(\"creating\", this, true);\n if (creatingResult === false) {\n return ((this as any).__proxy ?? this) as this;\n }\n } else {\n const updatingResult = await staticClass.fireModelEvent(\"updating\", this, true);\n if (updatingResult === false) {\n return ((this as any).__proxy ?? this) as this;\n }\n }\n\n // Original save logic here...\n const table = staticClass.getTable();\n const primaryKey = staticClass.primaryKey || \"id\";\n const now = new Date();\n\n if ((staticClass as any).timestamps) {\n if (!this.getAttribute(\"created_at\")) {\n this.setAttribute(\"created_at\", now);\n }\n this.setAttribute(\"updated_at\", now);\n }\n\n // For new records, ensure all fillable fields are present (null if not set)\n // so the DB document is fully shaped and observers/hydrate see consistent keys.\n if (!this.__exists) {\n staticClass.fillable.forEach((key) => {\n if (!(key in this.attributes)) {\n this.attributes[key] = null;\n }\n });\n }\n\n const attrs = { ...this.attributes } as any;\n const id = attrs[primaryKey];\n const exists = this.__exists;\n const isMongo = getDbType() === \"mongodb\";\n\n const doInsert =\n !exists || options.force || (id === undefined && (staticClass as any).autoIncrement);\n\n if (isMongo) {\n const c = mongoCollection(table);\n const normalizeForeignIds = (obj: Record<string, any>) => {\n Object.keys(obj).forEach((k) => {\n if (!k || !k.endsWith(\"_id\")) return;\n const v = obj[k];\n if (v === undefined || v === null) return;\n try {\n if (v instanceof ObjectId) {\n obj[k] = v;\n return;\n }\n const str = String(v);\n if (/^[0-9a-fA-F]{24}$/.test(str)) {\n obj[k] = new ObjectId(str);\n } else {\n obj[k] = str;\n }\n } catch {\n obj[k] = String(v);\n }\n });\n };\n\n // Get session options for transaction support\n const sessionOpts = DB.getSessionOptions();\n\n if (doInsert) {\n const doc: any = { ...attrs };\n if (primaryKey === \"id\") {\n if (doc.id) {\n try {\n doc._id = new ObjectId(String(doc.id));\n } catch {\n doc._id = doc.id;\n }\n delete doc.id;\n }\n }\n normalizeForeignIds(doc);\n const res = await c.insertOne(doc, sessionOpts);\n if (primaryKey === \"id\") this.setAttribute(\"id\", String(res.insertedId));\n this.__exists = true;\n\n // Fire created event\n await staticClass.fireModelEvent(\"created\", this);\n } else {\n const dirty = this.getDirty();\n const setDoc: any = {};\n Object.keys(dirty).forEach((k) => {\n if (k === primaryKey && primaryKey === \"id\") return;\n setDoc[k] = dirty[k];\n });\n if (Object.keys(setDoc).length) {\n normalizeForeignIds(setDoc);\n const filter: any =\n primaryKey === \"id\" ? { _id: new ObjectId(String(id)) } : { [primaryKey]: id };\n await c.updateOne(filter, { $set: setDoc }, sessionOpts);\n\n // Fire updated event\n await staticClass.fireModelEvent(\"updated\", this);\n }\n }\n this.original = { ...this.attributes };\n\n // Fire saved event\n await staticClass.fireModelEvent(\"saved\", this);\n\n return ((this as any).__proxy ?? this) as this;\n }\n\n // SQL implementation with events\n const normalizeSqlParam = (val: any) => {\n if (val === undefined) return undefined as any;\n if (val === null) return null as any;\n if (val instanceof Date || Buffer.isBuffer(val)) return val;\n try {\n const maybeObjId =\n (val as any)?._bsontype === \"ObjectID\" ||\n (val as any)?._bsontype === \"ObjectId\" ||\n (typeof ObjectId !== \"undefined\" && val instanceof ObjectId);\n if (maybeObjId) return String(val);\n } catch {}\n const t = typeof val;\n if (t === \"object\") {\n try {\n return JSON.stringify(val);\n } catch {\n return String(val);\n }\n }\n return val;\n };\n\n if (doInsert) {\n const insertCols = Object.keys(attrs).filter(\n (k) => attrs[k] !== undefined && (k !== primaryKey || !(staticClass as any).autoIncrement),\n );\n const placeholders = insertCols.map(() => \"?\").join(\",\");\n const sql = `INSERT INTO ${table} (${insertCols.join(\",\")}) VALUES (${placeholders})`;\n const params = insertCols.map((c) => normalizeSqlParam(attrs[c]));\n const result: any = await DB.executeQuery<any>(sql, params);\n if ((staticClass as any).autoIncrement && result && result.insertId !== undefined) {\n this.setAttribute(primaryKey, result.insertId);\n }\n this.__exists = true;\n\n // Fire created event\n await staticClass.fireModelEvent(\"created\", this);\n } else {\n const dirty = this.getDirty();\n const setCols = Object.keys(dirty).filter((k) => k !== primaryKey);\n if (setCols.length) {\n const setSql = setCols.map((c) => `${c} = ?`).join(\", \");\n const sql = `UPDATE ${table} SET ${setSql} WHERE ${primaryKey} = ?`;\n const params = [...setCols.map((c) => normalizeSqlParam(dirty[c])), id];\n await DB.executeQuery<any>(sql, params);\n\n // Fire updated event\n await staticClass.fireModelEvent(\"updated\", this);\n }\n }\n\n this.original = { ...this.attributes };\n\n // Fire saved event\n await staticClass.fireModelEvent(\"saved\", this);\n\n return ((this as any).__proxy ?? this) as this;\n }\n\n // Update delete method to include events\n async delete(force: boolean = false): Promise<boolean> {\n const staticClass = this.constructor as typeof Model & {\n table: string;\n primaryKey: string;\n softDeletes?: boolean;\n };\n\n // Fire deleting event\n const deletingResult = await staticClass.fireModelEvent(\"deleting\", this, true);\n if (deletingResult === false) {\n return false;\n }\n\n const table = staticClass.getTable();\n const primaryKey = staticClass.primaryKey || \"id\";\n const id = this.getAttribute(primaryKey);\n if (id === undefined || id === null) return false;\n\n let result = false;\n\n if (getDbType() === \"mongodb\") {\n const c = mongoCollection(table);\n const sessionOpts = DB.getSessionOptions();\n if ((staticClass as any).softDeletes && !force) {\n await c.updateOne(\n primaryKey === \"id\" ? { _id: new ObjectId(String(id)) } : { [primaryKey]: id },\n { $set: { deleted_at: new Date() } },\n sessionOpts,\n );\n this.setAttribute(\"deleted_at\", new Date());\n result = true;\n } else {\n await c.deleteOne(\n primaryKey === \"id\" ? { _id: new ObjectId(String(id)) } : { [primaryKey]: id },\n sessionOpts,\n );\n result = true;\n }\n } else {\n if ((staticClass as any).softDeletes && !force) {\n const now = new Date();\n this.setAttribute(\"deleted_at\", now);\n const sql = `UPDATE ${table} SET deleted_at = ? WHERE ${primaryKey} = ?`;\n await DB.executeQuery<any>(sql, [now, id]);\n result = true;\n } else {\n const sql = `DELETE FROM ${table} WHERE ${primaryKey} = ?`;\n await DB.executeQuery<any>(sql, [id]);\n result = true;\n }\n }\n\n if (result) {\n // Fire deleted event\n await staticClass.fireModelEvent(\"deleted\", this);\n }\n\n return result;\n }\n\n // Update restore method to include events\n async restore(): Promise<boolean> {\n const staticClass = this.constructor as typeof Model & {\n table: string;\n primaryKey: string;\n softDeletes?: boolean;\n };\n if (!(staticClass as any).softDeletes) return false;\n\n // Fire restoring event\n const restoringResult = await staticClass.fireModelEvent(\"restoring\", this, true);\n if (restoringResult === false) {\n return false;\n }\n\n const table = staticClass.getTable();\n const primaryKey = staticClass.primaryKey || \"id\";\n const id = this.getAttribute(primaryKey);\n if (id === undefined || id === null) return false;\n\n this.setAttribute(\"deleted_at\", null);\n\n let result = false;\n\n if (getDbType() === \"mongodb\") {\n const c = mongoCollection(table);\n const sessionOpts = DB.getSessionOptions();\n await c.updateOne(\n primaryKey === \"id\" ? { _id: new ObjectId(String(id)) } : { [primaryKey]: id },\n { $set: { deleted_at: null } },\n sessionOpts,\n );\n result = true;\n } else {\n const sql = `UPDATE ${table} SET deleted_at = NULL WHERE ${primaryKey} = ?`;\n await DB.executeQuery<any>(sql, [id]);\n result = true;\n }\n\n if (result) {\n // Fire restored event\n await staticClass.fireModelEvent(\"restored\", this);\n }\n\n return result;\n }\n\n async update(attributes: ModelAttributes): Promise<this> {\n this.fill(attributes);\n return this.save();\n }\n\n async delete_(force: boolean = false): Promise<boolean> {\n const staticClass = this.constructor as typeof Model & {\n table: string;\n primaryKey: string;\n softDeletes?: boolean;\n };\n const table = staticClass.getTable();\n const primaryKey = staticClass.primaryKey || \"id\";\n const id = this.getAttribute(primaryKey);\n if (id === undefined || id === null) return false;\n\n if (getDbType() === \"mongodb\") {\n const c = mongoCollection(table);\n const sessionOpts = DB.getSessionOptions();\n if ((staticClass as any).softDeletes && !force) {\n await c.updateOne(\n primaryKey === \"id\" ? { _id: new ObjectId(String(id)) } : { [primaryKey]: id },\n { $set: { deleted_at: new Date() } },\n sessionOpts,\n );\n this.setAttribute(\"deleted_at\", new Date());\n return true;\n } else {\n await c.deleteOne(\n primaryKey === \"id\" ? { _id: new ObjectId(String(id)) } : { [primaryKey]: id },\n sessionOpts,\n );\n return true;\n }\n }\n\n if ((staticClass as any).softDeletes && !force) {\n const now = new Date();\n this.setAttribute(\"deleted_at\", now);\n const sql = `UPDATE ${table} SET deleted_at = ? WHERE ${primaryKey} = ?`;\n await DB.executeQuery<any>(sql, [now, id]);\n return true;\n } else {\n const sql = `DELETE FROM ${table} WHERE ${primaryKey} = ?`;\n await DB.executeQuery<any>(sql, [id]);\n return true;\n }\n }\n\n async restore_(): Promise<boolean> {\n const staticClass = this.constructor as typeof Model & {\n table: string;\n primaryKey: string;\n softDeletes?: boolean;\n };\n if (!(staticClass as any).softDeletes) return false;\n\n const table = staticClass.getTable();\n const primaryKey = staticClass.primaryKey || \"id\";\n const id = this.getAttribute(primaryKey);\n if (id === undefined || id === null) return false;\n\n this.setAttribute(\"deleted_at\", null);\n\n if (getDbType() === \"mongodb\") {\n const c = mongoCollection(table);\n const sessionOpts = DB.getSessionOptions();\n await c.updateOne(\n primaryKey === \"id\" ? { _id: new ObjectId(String(id)) } : { [primaryKey]: id },\n { $set: { deleted_at: null } },\n sessionOpts,\n );\n return true;\n }\n\n const sql = `UPDATE ${table} SET deleted_at = NULL WHERE ${primaryKey} = ?`;\n await DB.executeQuery<any>(sql, [id]);\n return true;\n }\n\n async forceDelete(): Promise<boolean> {\n return this.delete(true);\n }\n\n async refresh(): Promise<this> {\n const staticClass = this.constructor as typeof Model;\n const primaryKey = staticClass.primaryKey || \"id\";\n const id = this.getAttribute(primaryKey);\n\n if (id === undefined || id === null) return this;\n\n const fresh = await (staticClass as any).find(id);\n if (fresh) {\n this.attributes = { ...(fresh as any).attributes };\n this.original = { ...this.attributes };\n }\n\n return this;\n }\n\n replicate(except: string[] = []): this {\n const staticClass = this.constructor as typeof Model;\n const replicated = new (staticClass as any)();\n const attributes = { ...this.attributes };\n\n // Remove primary key and excluded attributes\n delete attributes[staticClass.primaryKey || \"id\"];\n except.forEach((attr) => delete attributes[attr]);\n\n replicated.fill(attributes);\n return replicated;\n }\n\n // Static methods\n static async create<M extends typeof Model>(\n this: M,\n attributes: ModelAttributes,\n ): Promise<InstanceType<M>> {\n const instance = new (this as any)(attributes) as InstanceType<M>;\n await (instance as any).save();\n return instance;\n }\n\n static async createMany<M extends typeof Model>(\n this: M,\n rows: Array<ModelAttributes>,\n ): Promise<InstanceType<M>[]> {\n const created: InstanceType<M>[] = [];\n for (const row of rows) {\n created.push(await this.create(row));\n }\n return created;\n }\n\n /**\n * Find a model matching the attributes or create a new one, then update with values\n * @param attributes - The attributes to find the model by\n * @param values - The values to update or create the model with\n * @returns The model instance (existing or newly created)\n */\n static async updateOrCreate<M extends typeof Model>(\n this: M,\n attributes: ModelAttributes,\n values: ModelAttributes = {},\n ): Promise<InstanceType<M>> {\n // Find existing record matching the attributes\n const query = this.query<M>();\n Object.entries(attributes).forEach(([key, value]) => {\n query.where(key, value);\n });\n\n const existing = await query.first();\n\n if (existing) {\n // Update existing record with values\n await existing.update(values);\n return existing;\n } else {\n // Create new record with merged attributes and values\n const mergedAttributes = { ...attributes, ...values };\n return this.create(mergedAttributes);\n }\n }\n\n /**\n * Alias for updateOrCreate method\n * @param attributes - The attributes to find the model by\n * @param values - The values to update or create the model with\n * @returns The model instance (existing or newly created)\n */\n static async createOrUpdate<M extends typeof Model>(\n this: M,\n attributes: ModelAttributes,\n values: ModelAttributes = {},\n ): Promise<InstanceType<M>> {\n return this.updateOrCreate(attributes, values);\n }\n\n static query_<M extends typeof Model>(this: M): EloquentBuilder<InstanceType<M>> {\n return new EloquentBuilder<InstanceType<M>>(this as any);\n }\n\n static query<M extends typeof Model>(this: M): EloquentBuilder<InstanceType<M>> {\n // Ensure the model is booted (traits/scopes/macros applied) on first use\n this.ensureBooted();\n const builder = new EloquentBuilder<InstanceType<M>>(this as any);\n\n // Apply global scopes\n return this.applyScopes(builder);\n }\n\n static with<M extends typeof Model>(\n this: M,\n relationships: string[],\n ): EloquentBuilder<InstanceType<M>> {\n return this.query<M>().with(relationships) as EloquentBuilder<InstanceType<M>>;\n }\n\n static withTrashed<M extends typeof Model>(this: M): EloquentBuilder<InstanceType<M>> {\n return this.query<M>().withTrashed();\n }\n\n // Alias accommodating typo 'withThrashed'\n static withThrashed<M extends typeof Model>(this: M): EloquentBuilder<InstanceType<M>> {\n return this.withTrashed<M>();\n }\n\n static withoutTrashed<M extends typeof Model>(this: M): EloquentBuilder<InstanceType<M>> {\n return this.query<M>().withoutTrashed();\n }\n\n // Alias accommodating typo 'withoutThrashed'\n static withoutThrashed<M extends typeof Model>(this: M): EloquentBuilder<InstanceType<M>> {\n return this.withoutTrashed<M>();\n }\n\n static onlyTrashed<M extends typeof Model>(this: M): EloquentBuilder<InstanceType<M>> {\n return this.query<M>().onlyTrashed();\n }\n\n static onlyThrashed<M extends typeof Model>(this: M): EloquentBuilder<InstanceType<M>> {\n return this.onlyTrashed<M>();\n }\n\n static where<M extends typeof Model>(\n this: M,\n column: string,\n operator: any,\n value?: any,\n ): EloquentBuilder<InstanceType<M>> {\n return this.query<M>().where(column, operator, value) as EloquentBuilder<InstanceType<M>>;\n }\n\n static find<M extends typeof Model>(\n this: M,\n id: number | string,\n ): Promise<InstanceType<M> | null> {\n return this.query<M>()\n .where((this as any).primaryKey, id)\n .first() as Promise<InstanceType<M> | null>;\n }\n\n static async findOrFail<M extends typeof Model>(\n this: M,\n id: number | string,\n ): Promise<InstanceType<M>> {\n const found = await this.find(id);\n if (!found) throw new Error(`${(this as any).name || \"Model\"} not found`);\n return found as InstanceType<M>;\n }\n\n static all<M extends typeof Model>(this: M): Promise<InstanceType<M>[]> {\n return this.query<M>().get() as Promise<InstanceType<M>[]>;\n }\n\n static first<M extends typeof Model>(this: M): Promise<InstanceType<M> | null> {\n return this.query<M>().first() as Promise<InstanceType<M> | null>;\n }\n\n // Static table name resolution\n static getTable(): string {\n // If table name is explicitly set, use it\n if (this.table && this.table !== \"\") {\n return this.table;\n }\n\n // Generate table name from class name\n let tableName = this.name;\n\n // Convert PascalCase to snake_case\n tableName = tableName\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .replace(/^_/, \"\");\n\n // Pluralize\n tableName = this.pluralize(tableName);\n\n return tableName;\n }\n\n // Utility methods\n private castAttribute(key: string, value: any): any {\n if (value === null || value === undefined) return null;\n const staticClass = this.constructor as typeof Model;\n const castType = staticClass.casts[key];\n if (typeof castType === \"function\") {\n return castType(value);\n }\n switch (castType) {\n case \"int\":\n case \"integer\":\n return parseInt(value, 10);\n case \"real\":\n case \"float\":\n case \"double\":\n return parseFloat(value);\n case \"string\":\n return String(value);\n case \"bool\":\n case \"boolean\":\n return Boolean(value);\n case \"object\":\n case \"array\":\n return JSON.parse(value);\n case \"json\":\n return typeof value === \"string\" ? JSON.parse(value) : value;\n case \"date\":\n case \"datetime\":\n return new Date(value);\n case \"timestamp\":\n return new Date(value).getTime();\n case \"collection\":\n return new Map(Object.entries(value));\n default:\n return value;\n }\n }\n\n protected getPrimaryKey(): string {\n return (this.constructor as typeof Model).primaryKey;\n }\n\n // Static pluralization method\n private static pluralize(word: string): string {\n // Comprehensive irregular plurals\n const irregularPlurals: Record<string, string> = {\n // Common irregulars\n person: \"people\",\n man: \"men\",\n woman: \"women\",\n child: \"children\",\n foot: \"feet\",\n tooth: \"teeth\",\n goose: \"geese\",\n mouse: \"mice\",\n louse: \"lice\",\n ox: \"oxen\",\n die: \"dice\",\n penny: \"pence\",\n\n // Latin/Greek plurals\n appendix: \"appendices\",\n index: \"indices\",\n matrix: \"matrices\",\n vertex: \"vertices\",\n crisis: \"crises\",\n analysis: \"analyses\",\n thesis: \"theses\",\n criterion: \"criteria\",\n phenomenon: \"phenomena\",\n datum: \"data\",\n medium: \"media\",\n bacterium: \"bacteria\",\n curriculum: \"curricula\",\n stimulus: \"stimuli\",\n alumnus: \"alumni\",\n focus: \"foci\",\n nucleus: \"nuclei\",\n syllabus: \"syllabi\",\n fungus: \"fungi\",\n cactus: \"cacti\",\n\n // Unchanging plurals\n sheep: \"sheep\",\n deer: \"deer\",\n fish: \"fish\",\n species: \"species\",\n aircraft: \"aircraft\",\n series: \"series\",\n means: \"means\",\n };\n\n // Uncountable nouns (stay the same)\n const uncountable = new Set([\n \"equipment\",\n \"information\",\n \"rice\",\n \"money\",\n \"species\",\n \"series\",\n \"fish\",\n \"sheep\",\n \"deer\",\n \"aircraft\",\n \"news\",\n \"education\",\n ]);\n\n const lowerWord = word.toLowerCase();\n\n // Check for uncountable nouns\n if (uncountable.has(lowerWord)) {\n return word;\n }\n\n // Check for irregular plurals\n if (irregularPlurals[lowerWord]) {\n // Preserve case\n if (word === word.toUpperCase()) {\n return irregularPlurals[lowerWord].toUpperCase();\n } else if (word[0] === word[0].toUpperCase()) {\n return (\n irregularPlurals[lowerWord].charAt(0).toUpperCase() + irregularPlurals[lowerWord].slice(1)\n );\n }\n return irregularPlurals[lowerWord];\n }\n\n // Pluralization rules in order of specificity\n const pluralRules = [\n // Words ending in -is (Greek origin)\n [/^(.*)is$/i, \"$1es\"],\n // Words ending in -us (Latin origin)\n [/^(.*)us$/i, \"$1i\"],\n // Words ending in -on (Greek origin)\n [/^(.*)on$/i, \"$1a\"],\n // Words ending in -s, -x, -z, -ch, -sh\n [/^(.*)(s|sh?|ch|z|x)$/i, \"$1$2es\"],\n // Words ending in -f or -fe\n [/^(.*[aeiou]?)f$/i, \"$1ves\"],\n [/^(.*)fe$/i, \"$1ves\"],\n // Words ending in -y\n [/^(.*[^aeiou])y$/i, \"$1ies\"],\n // Words ending in -o\n [/^(.*[^aeiou])o$/i, \"$1oes\"],\n // Default rule\n [/^(.*)$/i, \"$1s\"],\n ];\n\n // Apply rules\n for (const [rule, replacement] of pluralRules) {\n if ((rule as RegExp).test(word)) {\n const plural = word.replace(rule as RegExp, replacement as string);\n\n // Special case: don't pluralize if it's already plural-looking\n if (this.looksPlural(plural)) {\n return plural;\n }\n break;\n }\n }\n\n // Fallback\n return word + \"s\";\n }\n\n private static looksPlural(word: string): boolean {\n const pluralEndings = [\"s\", \"es\", \"ies\", \"ves\", \"i\", \"a\", \"en\"];\n return pluralEndings.some((ending) => word.toLowerCase().endsWith(ending));\n }\n\n [util.inspect.custom](depth: number, options: any) {\n // Return fully expanded JSON representation for console.log/dir\n return this.toJSON();\n }\n\n public async load(relations: string[] | string): Promise<this> {\n const staticClass = this.constructor as typeof Model;\n\n // Normalize relations and short-circuit\n const names = Array.isArray(relations) ? relations : [relations];\n if (names.length === 0) return this;\n\n // Determine primary key and value from the model class/instance\n const pk = (staticClass as any).primaryKey || \"id\";\n const pkValue = this.getAttribute(pk);\n if (pkValue === undefined || pkValue === null) return this;\n\n const fresh = await staticClass.query().with(names).where(pk, pkValue).first();\n\n if (fresh) {\n // Hydrate only attributes from the fresh instance\n this.hydrate(fresh.getAttributes());\n\n // Copy loaded relationships into this instance (preserve separation from attributes)\n Object.keys((fresh as any).relationshipsLoaded || {}).forEach((rel) => {\n this.setLoadedRelation(rel, (fresh as any).relationshipsLoaded[rel]);\n });\n }\n\n return this;\n }\n\n public async loadMissing(relations: string[] | string): Promise<this> {\n const names = Array.isArray(relations) ? relations : [relations];\n const toLoad = names.filter((n) => !this.relationLoaded(n));\n return this.load(toLoad);\n }\n\n /**\n * Structured changes report comparing current attributes to original snapshot\n */\n public changes(): {\n before: ModelAttributes;\n after: ModelAttributes;\n keys: string[];\n count: number;\n } {\n const before = this.getOriginal();\n const after = this.getAttributes();\n const keys: string[] = [];\n Object.keys(after).forEach((k) => {\n if (after[k] !== before[k]) keys.push(k);\n });\n return { before, after, keys, count: keys.length };\n }\n\n static use<T1 extends ClassBasedTrait>(\n this: typeof Model,\n trait1: T1,\n ): AugmentedModel<typeof Model, [T1]>;\n static use<T1 extends ClassBasedTrait, T2 extends ClassBasedTrait>(\n this: typeof Model,\n trait1: T1,\n trait2: T2,\n ): AugmentedModel<typeof Model, [T1, T2]>;\n static use<T1 extends ClassBasedTrait, T2 extends ClassBasedTrait, T3 extends ClassBasedTrait>(\n this: typeof Model,\n trait1: T1,\n trait2: T2,\n trait3: T3,\n ): AugmentedModel<typeof Model, [T1, T2, T3]>;\n static use<\n T1 extends ClassBasedTrait,\n T2 extends ClassBasedTrait,\n T3 extends ClassBasedTrait,\n T4 extends ClassBasedTrait,\n >(\n this: typeof Model,\n trait1: T1,\n trait2: T2,\n trait3: T3,\n trait4: T4,\n ): AugmentedModel<typeof Model, [T1, T2, T3, T4]>;\n static use<\n T1 extends ClassBasedTrait,\n T2 extends ClassBasedTrait,\n T3 extends ClassBasedTrait,\n T4 extends ClassBasedTrait,\n T5 extends ClassBasedTrait,\n >(\n this: typeof Model,\n trait1: T1,\n trait2: T2,\n trait3: T3,\n trait4: T4,\n trait5: T5,\n ): AugmentedModel<typeof Model, [T1, T2, T3, T4, T5]>;\n static use(this: typeof Model, ...traits: ClassBasedTrait[]): any {\n applyTraits(this as any, traits);\n return this as any;\n }\n}\n\n// Helper types for augmenting Model with trait instance and static members\ntype TraitInstance<T extends ClassBasedTrait> = Omit<InstanceType<T>, \"constructor\">;\ntype TraitStatics<T extends ClassBasedTrait> = Omit<T, \"prototype\">;\n\ntype MergeInstances<Traits extends readonly ClassBasedTrait[]> = Traits extends [\n infer A,\n ...infer Rest,\n]\n ? A extends ClassBasedTrait\n ? Rest extends readonly ClassBasedTrait[]\n ? TraitInstance<A> & MergeInstances<Rest>\n : TraitInstance<A>\n : {}\n : {};\n\ntype MergeStatics<Traits extends readonly ClassBasedTrait[]> = Traits extends [\n infer A,\n ...infer Rest,\n]\n ? A extends ClassBasedTrait\n ? Rest extends readonly ClassBasedTrait[]\n ? TraitStatics<A> & MergeStatics<Rest>\n : TraitStatics<A>\n : {}\n : {};\n\ntype AugmentedModel<C extends typeof Model, Traits extends readonly ClassBasedTrait[]> = {\n new (...args: ConstructorParameters<C>): InstanceType<C> & MergeInstances<Traits>;\n} & C &\n MergeStatics<Traits>;\n","export abstract class Observer<T extends object> {\n creating?(model: T): void | Promise<void>;\n created?(model: T): void | Promise<void>;\n\n updating?(model: T): void | Promise<void>;\n updated?(model: T): void | Promise<void>;\n\n saving?(model: T): void | Promise<void>;\n saved?(model: T): void | Promise<void>;\n\n deleting?(model: T): void | Promise<void>;\n deleted?(model: T): void | Promise<void>;\n\n restoring?(model: T): void | Promise<void>;\n restored?(model: T): void | Promise<void>;\n\n retrieved?(model: T): void | Promise<void>;\n}\n","// example-traits.ts - Example trait classes\nimport { trait, scopeMethod, macroMethod } from \"./traits.js\";\nimport { Model } from \"../Model.js\";\nimport { EloquentBuilder } from \"../EloquentBuilder.js\";\n\n/**\n * SoftDeletes trait as a class (Laravel style)\n * Usage: use SoftDeletes;\n */\n@trait(\"SoftDeletes\")\nexport class SoftDeletes {\n /**\n * Determine if the model has been soft-deleted\n */\n trashed(): boolean {\n const model = this as any as Model;\n return !!(model as any).deleted_at;\n }\n\n /**\n * Determine if the model is not soft-deleted\n */\n isNotTrashed(): boolean {\n return !this.trashed();\n }\n\n /**\n * Force delete the model (bypass soft delete)\n */\n async forceDelete(): Promise<boolean> {\n const model = this as any as Model;\n return model.delete(true);\n }\n\n /**\n * Restore a soft-deleted model\n */\n async restore(): Promise<boolean> {\n const model = this as any as Model;\n return (model as any).restore();\n }\n\n /**\n * Boot method for the trait\n */\n static boot(modelClass: typeof Model): void {\n // Add soft delete flags\n (modelClass as any).softDeletes = true;\n }\n}\n\n/**\n * Timestamps trait (auto-manages created_at and updated_at)\n * Usage: use Timestamps;\n */\n@trait(\"Timestamps\")\nexport class Timestamps {\n /**\n * Touch the model's timestamps\n */\n async touch(): Promise<void> {\n const model = this as any as Model;\n const staticClass = model.constructor as typeof Model;\n\n if (!(staticClass as any).timestamps) return;\n\n model.setAttribute(\"updated_at\", new Date());\n await model.save();\n }\n\n /**\n * Disable timestamps for the current operation\n */\n withoutTimestamps(callback: Function): any {\n const model = this as any as Model;\n const staticClass = model.constructor as typeof Model;\n const original = (staticClass as any).timestamps;\n (staticClass as any).timestamps = false;\n\n try {\n return callback();\n } finally {\n (staticClass as any).timestamps = original;\n }\n }\n\n static boot(modelClass: typeof Model): void {\n modelClass.timestamps = true;\n }\n}\n\n/**\n * Sluggable trait for generating slugs\n * Usage: use Sluggable;\n */\n@trait(\"Sluggable\")\nexport class Sluggable {\n /**\n * Generate a slug from a given string\n */\n generateSlug(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/--+/g, \"-\")\n .trim();\n }\n\n /**\n * Set slug from attribute\n */\n setSlugFrom(sourceField: string = \"name\"): void {\n const model = this as any as Model;\n const source = model.getAttribute(sourceField);\n if (source) {\n model.setAttribute(\"slug\", this.generateSlug(source));\n }\n }\n\n /**\n * Scope: Find by slug\n */\n @scopeMethod()\n static scopeFindBySlug(builder: EloquentBuilder<any>, slug: string) {\n return builder.where(\"slug\", slug);\n }\n\n static boot(modelClass: typeof Model): void {\n // Use the suggested property on Model\n // Adjust if your Model exposes a different API.\n const registerEvent = (eventName: string, handler: Function) => {\n // Ensure static eventListeners map exists on the class and is not the shared base map\n const baseMap = (Model as any).eventListeners as any;\n const current = (modelClass as any).eventListeners;\n\n if (!current || current === baseMap) {\n // Create a fresh per-class map of empty arrays so we don't accidentally\n // push into the shared base map that other models also reference.\n (modelClass as any).eventListeners = {\n creating: [],\n created: [],\n updating: [],\n updated: [],\n saving: [],\n saved: [],\n deleting: [],\n deleted: [],\n restoring: [],\n restored: [],\n retrieved: [],\n } as any;\n }\n\n // Fallback: if eventListeners exists but the specific array is missing, create it\n if (!(modelClass as any).eventListeners[eventName]) {\n (modelClass as any).eventListeners[eventName] = [];\n }\n\n // Push handler directly to the static listeners map\n (modelClass as any).eventListeners[eventName].push(handler as any);\n };\n\n registerEvent(\"saving\", (model: Model) => {\n const m: any = model as any;\n const isDirtyName = typeof m.isDirty === \"function\" ? m.isDirty(\"name\") : true;\n const slugVal = typeof m.getAttribute === \"function\" ? m.getAttribute(\"slug\") : m.slug;\n if (isDirtyName && !slugVal) {\n if (typeof m.setSlugFrom === \"function\") {\n m.setSlugFrom(\"name\");\n } else if (m.name) {\n m.slug = String(m.name)\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n }\n }\n return true;\n });\n }\n}\n\n/**\n * Sortable trait for ordering\n * Usage: use Sortable;\n */\n@trait(\"Sortable\")\nexport class Sortable {\n /**\n * Reorder models\n */\n @macroMethod()\n static async reorder(ids: number[]): Promise<void> {\n const self = this as any;\n for (let i = 0; i < ids.length; i++) {\n await self\n .query()\n .where(\"id\", ids[i])\n .update({ order: i + 1 });\n }\n }\n\n @macroMethod()\n static latest(this: typeof Model) {\n return this.query().orderBy(\"created_at\", \"desc\");\n }\n @macroMethod()\n static oldest(this: typeof Model) {\n return this.query().orderBy(\"created_at\", \"asc\");\n }\n\n /**\n * Move model up in order\n */\n async moveUp(): Promise<void> {\n const model = this as any as Model;\n const m: any = model as any;\n const currentOrder: number =\n typeof m.getAttribute === \"function\" ? m.getAttribute(\"order\") : m.order;\n if (typeof currentOrder !== \"number\") return;\n if (currentOrder > 1) {\n const self = m.constructor as typeof Model as any;\n const itemAbove = await self\n .query()\n .where(\"order\", currentOrder - 1)\n .first();\n\n if (itemAbove) {\n await m.update({ order: currentOrder - 1 });\n await (itemAbove as any).update({ order: currentOrder });\n }\n }\n }\n\n /**\n * Move model down in order\n */\n async moveDown(): Promise<void> {\n const model = this as any as Model;\n const m: any = model as any;\n const currentOrder: number =\n typeof m.getAttribute === \"function\" ? m.getAttribute(\"order\") : m.order;\n if (typeof currentOrder !== \"number\") return;\n const self = m.constructor as typeof Model as any;\n const maxOrder = await self.query().max(\"order\");\n\n if (typeof maxOrder === \"number\" && currentOrder < maxOrder) {\n const itemBelow = await self\n .query()\n .where(\"order\", currentOrder + 1)\n .first();\n\n if (itemBelow) {\n await m.update({ order: currentOrder + 1 });\n await (itemBelow as any).update({ order: currentOrder });\n }\n }\n }\n\n /**\n * Scope: Order by order column\n */\n @scopeMethod()\n static scopeOrdered(builder: EloquentBuilder<any>, direction: \"asc\" | \"desc\" = \"asc\") {\n return builder.orderBy(\"order\", direction);\n }\n}\n\n/**\n * Searchable trait for full-text search\n * Usage: use Searchable;\n */\n@trait(\"Searchable\")\nexport class Searchable {\n /**\n * Scope: Search in specified fields\n */\n @scopeMethod()\n static scopeSearch(\n builder: EloquentBuilder<any>,\n query: string,\n fields: string[] = [\"name\", \"description\"],\n ) {\n if (query) {\n fields.forEach((field, index) => {\n if (index === 0) {\n builder.where(field, \"LIKE\", `%${query}%`);\n } else {\n builder.orWhere(field, \"LIKE\", `%${query}%`);\n }\n });\n }\n return builder;\n }\n\n /**\n * Scope: Advanced search with filters\n */\n @scopeMethod()\n static scopeAdvancedSearch(builder: EloquentBuilder<any>, params: any) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null && value !== \"\") {\n if (Array.isArray(value)) {\n builder.whereIn(key, value);\n } else {\n builder.where(key, value);\n }\n }\n });\n return builder;\n }\n}\n\n/**\n * Cacheable trait for caching queries\n * Usage: use Cacheable;\n */\n@trait(\"Cacheable\")\nexport class Cacheable {\n /**\n * Cache a query result\n */\n @macroMethod()\n static cached(callback: Function, key: string, ttl: number = 3600): any {\n // Implementation depends on your cache system\n console.log(`Caching query with key: ${key}, TTL: ${ttl}s`);\n return callback();\n }\n\n /**\n * Clear model cache\n */\n @macroMethod()\n static clearCache(): void {\n console.log(\"Clearing model cache\");\n }\n\n /**\n * Get with cache\n */\n @macroMethod()\n static getCached(id: number): any {\n const self = this as any;\n const cacheKey = `${self.name}:${id}`;\n return self.cached(\n () => self.find(id),\n cacheKey,\n 300, // 5 minutes\n );\n }\n}\n","// Simple Laravel-like Schema builder for migrations\n// Usage:\n// const schema = new Schema();\n// const sql = schema.createTable('users', table => {\n// table.increments('id');\n// table.string('name', 191).notNullable();\n// table.string('email', 191).notNullable().unique();\n// table.string('password', 255).notNullable();\n// table.timestamps();\n// table.softDeletes();\n// });\n// // sql is a CREATE TABLE ... statement\n\nimport { getDbType, getMongoDb } from \"../connection.js\";\n\n// Common interface to support both SQL and Mongo schema builders\nexport interface MigrationSchema {\n createTable(name: string, callback: (table: TableBuilder) => void): any;\n alterTable(name: string, callback: (table: TableBuilder) => void): any;\n dropTable(name: string): any;\n dropTableIfExists(name: string): any;\n rename(from: string, to: string): any;\n hasTable(name: string): Promise<boolean>;\n hasColumn(table: string, column: string): Promise<boolean>;\n hasColumns(table: string, columns: string[]): Promise<boolean>;\n getColumnType(table: string, column: string): Promise<string | null>;\n getColumnListing(table: string): Promise<string[]>;\n dropColumns(table: string, columns: string[]): any;\n renameColumn(table: string, from: string, to: string): any;\n}\n\nexport type QueryFn = (sql: string, params?: any[]) => Promise<any>;\n\nexport interface Migration {\n up(schema: MigrationSchema, query?: QueryFn): Promise<any>;\n down(schema: MigrationSchema, query?: QueryFn): Promise<any>;\n}\n\ntype DefaultValue = string | number | boolean | null | RawExpression;\n\n// Raw expression for default values like CURRENT_TIMESTAMP\nexport class RawExpression {\n constructor(public value: string) {}\n toString() {\n return this.value;\n }\n}\n\n// Helper to create raw expressions\nexport function raw(value: string): RawExpression {\n return new RawExpression(value);\n}\n\nexport class Column {\n name: string;\n type: string;\n length?: number;\n enumValues?: string[];\n nullableFlag = false;\n defaultValue?: DefaultValue;\n unsignedFlag = false;\n uniqueFlag = false;\n primaryFlag = false;\n autoIncrementFlag = false;\n commentText?: string;\n decimalPlaces?: number;\n // Additional Laravel properties\n afterColumn?: string;\n firstFlag = false;\n virtualAsExpr?: string;\n storedAsExpr?: string;\n useCurrent__ = false;\n useCurrentOnUpdate__ = false;\n charset__?: string;\n collation?: string;\n invisibleFlag = false;\n generatedAs__?: string;\n alwaysAs?: string;\n\n constructor(name: string, type: string, length?: number, decimalPlaces = 2) {\n this.name = name;\n this.type = type;\n this.length = length;\n this.decimalPlaces = decimalPlaces;\n }\n\n // set enum values for ENUM columns\n enum(values: string[]) {\n this.enumValues = values.slice();\n this.type = \"ENUM\";\n return this;\n }\n\n nullable() {\n this.nullableFlag = true;\n return this;\n }\n notNullable() {\n this.nullableFlag = false;\n return this;\n }\n default(val: DefaultValue) {\n this.defaultValue = val;\n return this;\n }\n unsigned() {\n this.unsignedFlag = true;\n return this;\n }\n unique() {\n this.uniqueFlag = true;\n return this;\n }\n primary() {\n this.primaryFlag = true;\n return this;\n }\n increments() {\n this.autoIncrementFlag = true;\n this.primaryFlag = true;\n return this;\n }\n comment(text: string) {\n this.commentText = text;\n return this;\n }\n\n // Laravel: Place column after another column\n after(column: string) {\n this.afterColumn = column;\n return this;\n }\n\n // Laravel: Place column first in the table\n first() {\n this.firstFlag = true;\n return this;\n }\n\n // Laravel: Set CURRENT_TIMESTAMP as default\n useCurrent() {\n this.useCurrent__ = true;\n return this;\n }\n\n // Laravel: Use CURRENT_TIMESTAMP on update\n useCurrentOnUpdate() {\n this.useCurrentOnUpdate__ = true;\n return this;\n }\n\n // Laravel: Set charset for column\n charset(charset: string) {\n this.charset__ = charset;\n return this;\n }\n\n // Laravel: Set collation for column\n collate(collation: string) {\n this.collation = collation;\n return this;\n }\n\n // Laravel: Make column invisible (MySQL 8.0.23+)\n invisible() {\n this.invisibleFlag = true;\n return this;\n }\n\n // Laravel: Create virtual generated column\n virtualAs(expression: string) {\n this.virtualAsExpr = expression;\n return this;\n }\n\n // Laravel: Create stored generated column\n storedAs(expression: string) {\n this.storedAsExpr = expression;\n return this;\n }\n\n // Laravel: Create generated column (alias for storedAs)\n generatedAs(expression: string) {\n this.generatedAs__ = expression;\n return this;\n }\n\n // Laravel: Always store generated column\n always() {\n this.alwaysAs = this.generatedAs__;\n return this;\n }\n\n // Laravel: Mark column as auto-incrementing starting from value\n from(startingValue: number) {\n // This is typically used with AUTO_INCREMENT in MySQL\n // The actual starting value would be set via ALTER TABLE\n return this;\n }\n\n // Laravel: Index the column\n index(name?: string) {\n // This is typically handled at table level\n return this;\n }\n\n // toSQL optionally omits the column name when `omitName` is true\n toSQL(omitName = false): string {\n let sqlType = this.type;\n if (this.enumValues && this.enumValues.length) {\n const vals = this.enumValues.map((v) => `'${escapeSingle(v)}'`).join(\",\");\n sqlType = `ENUM(${vals})`;\n } else if (\n this.length !== undefined &&\n (this.type.toLowerCase() === \"varchar\" || this.type.toLowerCase() === \"char\")\n ) {\n sqlType += `(${this.length})`;\n } else if (this.length !== undefined && this.type.toLowerCase() === \"int\") {\n sqlType += `(${this.length})`;\n } else if (this.length !== undefined && this.type.toLowerCase() === \"decimal\") {\n sqlType += `(${this.length},${this.decimalPlaces})`;\n } else if (this.length !== undefined && this.type.toLowerCase() === \"float\") {\n sqlType += `(${this.length},${this.decimalPlaces})`;\n } else if (this.length !== undefined && this.type.toLowerCase() === \"double\") {\n sqlType += `(${this.length},${this.decimalPlaces})`;\n }\n\n if (this.unsignedFlag) sqlType += \" UNSIGNED\";\n\n // Character set and collation\n if (this.charset__) sqlType += ` CHARACTER SET ${this.charset__}`;\n if (this.collation) sqlType += ` COLLATE ${this.collation}`;\n\n const namePart = omitName ? \"\" : `\\`${this.name}\\` `;\n let parts = [`${namePart}${sqlType}`.trim()];\n\n // Generated columns\n if (this.virtualAsExpr) {\n parts.push(`GENERATED ALWAYS AS (${this.virtualAsExpr}) VIRTUAL`);\n } else if (this.storedAsExpr) {\n parts.push(`GENERATED ALWAYS AS (${this.storedAsExpr}) STORED`);\n } else if (this.generatedAs__) {\n parts.push(`GENERATED ALWAYS AS (${this.generatedAs__}) STORED`);\n }\n\n if (this.autoIncrementFlag) parts.push(\"AUTO_INCREMENT\");\n\n if (this.primaryFlag && !this.autoIncrementFlag) parts.push(\"PRIMARY KEY\");\n\n if (!this.nullableFlag) parts.push(\"NOT NULL\");\n else parts.push(\"NULL\");\n\n if (this.defaultValue !== undefined) {\n parts.push(\"DEFAULT \" + formatDefault(this.defaultValue));\n } else if (this.useCurrent__) {\n parts.push(\"DEFAULT CURRENT_TIMESTAMP\");\n }\n\n if (this.useCurrentOnUpdate__) {\n parts.push(\"ON UPDATE CURRENT_TIMESTAMP\");\n }\n\n if (this.invisibleFlag) parts.push(\"INVISIBLE\");\n\n if (this.commentText) parts.push(`COMMENT '${escapeSingle(this.commentText)}'`);\n\n // Position modifiers (for ALTER TABLE)\n if (this.firstFlag) parts.push(\"FIRST\");\n else if (this.afterColumn) parts.push(`AFTER \\`${this.afterColumn}\\``);\n\n return parts.join(\" \");\n }\n}\n\nfunction escapeSingle(s: string) {\n return s.replace(/'/g, \"''\");\n}\n\nfunction formatDefault(v: DefaultValue) {\n if (v === null) return \"NULL\";\n if (v instanceof RawExpression) return v.value;\n if (typeof v === \"number\") return String(v);\n if (typeof v === \"boolean\") return v ? \"1\" : \"0\";\n // assume string\n return `'${escapeSingle(String(v))}'`;\n}\n\nexport class TableBuilder {\n name: string;\n columns: Column[] = [];\n primaryKeys: string[] = [];\n uniques: string[] = [];\n engine: string = \"InnoDB\";\n charset: string = \"utf8mb4\";\n\n // index & foreign key support\n indexes: { columns: string[]; name?: string; unique?: boolean }[] = [];\n foreignKeys: {\n columns: string[];\n refTable: string;\n refColumns: string[];\n name?: string;\n onDelete?: string;\n onUpdate?: string;\n }[] = [];\n // track dropped indexes/foreign keys in alter mode\n dropIndexes: string[] = [];\n dropForeignKeys: string[] = [];\n // index of last added foreign key (for chaining .onDelete/.onUpdate)\n lastForeignKeyIndex: number | null = null;\n // pending foreign being built by fluent .foreign().references().inTable() chain\n pendingForeign?: {\n columns: string[];\n refTable?: string;\n refColumns?: string[];\n name?: string;\n onDelete?: string;\n onUpdate?: string;\n };\n\n // alter-mode specific\n drops: string[] = [];\n changes: { oldName: string; col: Column }[] = [];\n renames: { from: string; to: string }[] = [];\n\n mode: \"create\" | \"alter\" = \"create\";\n\n constructor(name: string, mode: \"create\" | \"alter\" = \"create\") {\n this.name = name;\n this.mode = mode;\n }\n\n column(type: string, name: string, length?: number) {\n const col = new Column(name, type, length);\n this.columns.push(col);\n return col;\n }\n\n // fluent foreign key builder: table.foreign('col').references('id').inTable('users').onDelete('CASCADE')\n foreign(columns: string[] | string) {\n const cols = Array.isArray(columns) ? columns : [columns];\n this.pendingForeign = { columns: cols };\n return this;\n }\n\n references(refColumns: string[] | string) {\n if (!this.pendingForeign) this.pendingForeign = { columns: [] };\n this.pendingForeign.refColumns = Array.isArray(refColumns) ? refColumns : [refColumns];\n return this;\n }\n\n inTable(tableName: string, opts: { name?: string } = {}) {\n if (!this.pendingForeign) this.pendingForeign = { columns: [] };\n this.pendingForeign.refTable = tableName;\n if (opts.name) this.pendingForeign.name = opts.name;\n // finalize pending foreign into foreignKeys list\n const pf = this.pendingForeign;\n const idx =\n this.foreignKeys.push({\n columns: pf.columns,\n refTable: pf.refTable || \"\",\n refColumns: pf.refColumns || [\"id\"],\n name: pf.name,\n onDelete: pf.onDelete,\n onUpdate: pf.onUpdate,\n }) - 1;\n this.lastForeignKeyIndex = idx;\n // clear pending\n delete this.pendingForeign;\n return this;\n }\n\n // enum helper\n enum(name: string, values: string[]) {\n const c = this.column(\"ENUM\", name);\n c.enum(values);\n return c;\n }\n\n // Laravel: SET column type\n set(name: string, values: string[]) {\n const c = this.column(\"SET\", name);\n c.enumValues = values.slice();\n return c;\n }\n\n // ==================== Primary Key Types ====================\n\n increments(name = \"id\") {\n const c = this.column(\"INT\", name);\n c.increments();\n c.unsigned();\n this.primary(name);\n return c;\n }\n\n // Laravel: Big auto-incrementing ID (BIGINT UNSIGNED)\n bigIncrements(name = \"id\") {\n const c = this.column(\"BIGINT\", name);\n c.increments();\n c.unsigned();\n this.primary(name);\n return c;\n }\n\n // Laravel: Medium auto-incrementing ID (MEDIUMINT UNSIGNED)\n mediumIncrements(name = \"id\") {\n const c = this.column(\"MEDIUMINT\", name);\n c.increments();\n c.unsigned();\n this.primary(name);\n return c;\n }\n\n // Laravel: Small auto-incrementing ID (SMALLINT UNSIGNED)\n smallIncrements(name = \"id\") {\n const c = this.column(\"SMALLINT\", name);\n c.increments();\n c.unsigned();\n this.primary(name);\n return c;\n }\n\n // Laravel: Tiny auto-incrementing ID (TINYINT UNSIGNED)\n tinyIncrements(name = \"id\") {\n const c = this.column(\"TINYINT\", name);\n c.increments();\n c.unsigned();\n this.primary(name);\n return c;\n }\n\n // Laravel: UUID primary key\n uuid(name = \"id\") {\n return this.column(\"CHAR\", name, 36);\n }\n\n // Laravel: ULID primary key\n ulid(name = \"id\") {\n return this.column(\"CHAR\", name, 26);\n }\n\n // Laravel: Auto-incrementing UUID-like ID\n id(name = \"id\") {\n return this.bigIncrements(name);\n }\n\n // Laravel: foreignId - BIGINT UNSIGNED for foreign keys\n foreignId(name: string) {\n const c = this.column(\"BIGINT\", name);\n c.unsigned();\n return c;\n }\n\n // Laravel: foreignUuid - CHAR(36) for UUID foreign keys\n foreignUuid(name: string) {\n return this.uuid(name);\n }\n\n // Laravel: foreignUlid - CHAR(26) for ULID foreign keys\n foreignUlid(name: string) {\n return this.ulid(name);\n }\n\n // ==================== Integer Types ====================\n\n integer(name: string, length?: number) {\n return this.column(\"INT\", name, length);\n }\n\n // Laravel: Unsigned integer\n unsignedInteger(name: string) {\n const c = this.column(\"INT\", name);\n c.unsigned();\n return c;\n }\n\n tinyInteger(name: string) {\n return this.column(\"TINYINT\", name);\n }\n\n // Laravel: Unsigned tiny integer\n unsignedTinyInteger(name: string) {\n const c = this.column(\"TINYINT\", name);\n c.unsigned();\n return c;\n }\n\n // Laravel: Small integer\n smallInteger(name: string) {\n return this.column(\"SMALLINT\", name);\n }\n\n // Laravel: Unsigned small integer\n unsignedSmallInteger(name: string) {\n const c = this.column(\"SMALLINT\", name);\n c.unsigned();\n return c;\n }\n\n // Laravel: Medium integer\n mediumInteger(name: string) {\n return this.column(\"MEDIUMINT\", name);\n }\n\n // Laravel: Unsigned medium integer\n unsignedMediumInteger(name: string) {\n const c = this.column(\"MEDIUMINT\", name);\n c.unsigned();\n return c;\n }\n\n // Laravel: Big integer\n bigInteger(name: string) {\n return this.column(\"BIGINT\", name);\n }\n\n // Laravel: Unsigned big integer\n unsignedBigInteger(name: string) {\n const c = this.column(\"BIGINT\", name);\n c.unsigned();\n return c;\n }\n\n boolean(name: string) {\n return this.column(\"TINYINT\", name, 1);\n }\n\n // ==================== String Types ====================\n\n string(name: string, length = 255) {\n return this.column(\"VARCHAR\", name, length);\n }\n\n char(name: string, length = 255) {\n return this.column(\"CHAR\", name, length);\n }\n\n text(name: string) {\n return this.column(\"TEXT\", name);\n }\n\n // Laravel: Tiny text\n tinyText(name: string) {\n return this.column(\"TINYTEXT\", name);\n }\n\n // Laravel: Medium text\n mediumText(name: string) {\n return this.column(\"MEDIUMTEXT\", name);\n }\n\n longText(name: string) {\n return this.column(\"LONGTEXT\", name);\n }\n\n // ==================== Numeric Types ====================\n\n decimal(name: string, precision: number = 8, scale: number = 2) {\n const c = this.column(\"DECIMAL\", name, precision);\n c.decimalPlaces = scale;\n return c;\n }\n\n // Laravel: Unsigned decimal\n unsignedDecimal(name: string, precision: number = 8, scale: number = 2) {\n const c = this.decimal(name, precision, scale);\n c.unsigned();\n return c;\n }\n\n // Laravel: Float column\n float(name: string, precision: number = 8, scale: number = 2) {\n const c = this.column(\"FLOAT\", name, precision);\n c.decimalPlaces = scale;\n return c;\n }\n\n // Laravel: Unsigned float\n unsignedFloat(name: string, precision: number = 8, scale: number = 2) {\n const c = this.float(name, precision, scale);\n c.unsigned();\n return c;\n }\n\n // Laravel: Double column\n double(name: string, precision?: number, scale?: number) {\n const c = this.column(\"DOUBLE\", name, precision);\n if (scale !== undefined) c.decimalPlaces = scale;\n return c;\n }\n\n // Laravel: Unsigned double\n unsignedDouble(name: string, precision?: number, scale?: number) {\n const c = this.double(name, precision, scale);\n c.unsigned();\n return c;\n }\n\n // ==================== Date/Time Types ====================\n\n datetime(name: string, precision?: number) {\n const type = precision !== undefined ? `DATETIME(${precision})` : \"DATETIME\";\n return this.column(type, name);\n }\n\n // Laravel: Date column\n date(name: string) {\n return this.column(\"DATE\", name);\n }\n\n // Laravel: Time column\n time(name: string, precision?: number) {\n const type = precision !== undefined ? `TIME(${precision})` : \"TIME\";\n return this.column(type, name);\n }\n\n timestamp(name: string, precision?: number) {\n const type = precision !== undefined ? `TIMESTAMP(${precision})` : \"TIMESTAMP\";\n const c = this.column(type, name);\n c.nullable();\n return c;\n }\n\n // Laravel: Timestamp with timezone (alias for timestamp in MySQL)\n timestampTz(name: string, precision?: number) {\n return this.timestamp(name, precision);\n }\n\n // Laravel: Datetime with timezone (alias for datetime in MySQL)\n datetimeTz(name: string, precision?: number) {\n return this.datetime(name, precision);\n }\n\n // Laravel: Time with timezone (alias for time in MySQL)\n timeTz(name: string, precision?: number) {\n return this.time(name, precision);\n }\n\n // Laravel: Year column\n year(name: string) {\n return this.column(\"YEAR\", name);\n }\n\n timestamps(precision?: number) {\n this.timestamp(\"created_at\", precision).nullable();\n this.timestamp(\"updated_at\", precision).nullable();\n return this;\n }\n\n // Laravel: Timestamps with timezone\n timestampsTz(precision?: number) {\n return this.timestamps(precision);\n }\n\n // Laravel: Nullable timestamps\n nullableTimestamps(precision?: number) {\n return this.timestamps(precision);\n }\n\n softDeletes(column = \"deleted_at\", precision?: number) {\n this.timestamp(column, precision).nullable();\n return this;\n }\n\n // Laravel: Soft deletes with timezone\n softDeletesTz(column = \"deleted_at\", precision?: number) {\n return this.softDeletes(column, precision);\n }\n\n // ==================== Binary Types ====================\n\n // Laravel: Binary column\n binary(name: string, length?: number) {\n if (length) {\n return this.column(\"VARBINARY\", name, length);\n }\n return this.column(\"BLOB\", name);\n }\n\n // ==================== JSON Types ====================\n\n // JSON column helper (length accepted for API compatibility but ignored in SQL)\n json(name: string) {\n return this.column(\"JSON\", name);\n }\n\n // Laravel: JSONB column (alias for JSON in MySQL)\n jsonb(name: string) {\n return this.json(name);\n }\n\n // ==================== Geometry Types ====================\n\n // Laravel: Geometry column\n geometry(name: string) {\n return this.column(\"GEOMETRY\", name);\n }\n\n // Laravel: Point column\n point(name: string) {\n return this.column(\"POINT\", name);\n }\n\n // Laravel: Line string column\n lineString(name: string) {\n return this.column(\"LINESTRING\", name);\n }\n\n // Laravel: Polygon column\n polygon(name: string) {\n return this.column(\"POLYGON\", name);\n }\n\n // Laravel: Geometry collection\n geometryCollection(name: string) {\n return this.column(\"GEOMETRYCOLLECTION\", name);\n }\n\n // Laravel: Multi-point column\n multiPoint(name: string) {\n return this.column(\"MULTIPOINT\", name);\n }\n\n // Laravel: Multi-line string column\n multiLineString(name: string) {\n return this.column(\"MULTILINESTRING\", name);\n }\n\n // Laravel: Multi-polygon column\n multiPolygon(name: string) {\n return this.column(\"MULTIPOLYGON\", name);\n }\n\n // ==================== Special Types ====================\n\n // Laravel: IP address column (VARCHAR for compatibility)\n ipAddress(name = \"ip_address\") {\n return this.string(name, 45);\n }\n\n // Laravel: MAC address column\n macAddress(name = \"mac_address\") {\n return this.string(name, 17);\n }\n\n // Laravel: Remember token column\n rememberToken() {\n return this.string(\"remember_token\", 100).nullable();\n }\n\n // Laravel: Morphs columns (type + id for polymorphic relations)\n morphs(name: string, indexName?: string) {\n this.string(`${name}_type`);\n this.unsignedBigInteger(`${name}_id`);\n this.index([`${name}_type`, `${name}_id`], indexName);\n return this;\n }\n\n // Laravel: Nullable morphs\n nullableMorphs(name: string, indexName?: string) {\n this.string(`${name}_type`).nullable();\n this.unsignedBigInteger(`${name}_id`).nullable();\n this.index([`${name}_type`, `${name}_id`], indexName);\n return this;\n }\n\n // Laravel: UUID morphs\n uuidMorphs(name: string, indexName?: string) {\n this.string(`${name}_type`);\n this.uuid(`${name}_id`);\n this.index([`${name}_type`, `${name}_id`], indexName);\n return this;\n }\n\n // Laravel: Nullable UUID morphs\n nullableUuidMorphs(name: string, indexName?: string) {\n this.string(`${name}_type`).nullable();\n this.uuid(`${name}_id`).nullable();\n this.index([`${name}_type`, `${name}_id`], indexName);\n return this;\n }\n\n // Laravel: ULID morphs\n ulidMorphs(name: string, indexName?: string) {\n this.string(`${name}_type`);\n this.ulid(`${name}_id`);\n this.index([`${name}_type`, `${name}_id`], indexName);\n return this;\n }\n\n // Laravel: Nullable ULID morphs\n nullableUlidMorphs(name: string, indexName?: string) {\n this.string(`${name}_type`).nullable();\n this.ulid(`${name}_id`).nullable();\n this.index([`${name}_type`, `${name}_id`], indexName);\n return this;\n }\n\n unique(name: string) {\n this.uniques.push(name);\n return this;\n }\n primary(name: string) {\n this.primaryKeys.push(name);\n return this;\n }\n\n // index helpers\n index(columns: string[] | string, name?: string) {\n const cols = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({ columns: cols, name, unique: false });\n return this;\n }\n\n uniqueIndex(columns: string[] | string, name?: string) {\n const cols = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({ columns: cols, name, unique: true });\n return this;\n }\n\n // drop an index in alter mode\n dropIndex(name: string) {\n this.dropIndexes.push(name);\n return this;\n }\n\n // drop a foreign key constraint by name in alter mode\n dropForeignKey(name: string) {\n this.dropForeignKeys.push(name);\n return this;\n }\n\n // foreign key helper: columns (single or array), referenced table and referenced columns\n foreignKey(\n columns: string[] | string,\n refTable: string,\n refColumns: string[] | string,\n opts: { name?: string; onDelete?: string; onUpdate?: string } = {},\n ) {\n const cols = Array.isArray(columns) ? columns : [columns];\n const refs = Array.isArray(refColumns) ? refColumns : [refColumns];\n const idx =\n this.foreignKeys.push({\n columns: cols,\n refTable,\n refColumns: refs,\n name: opts.name,\n onDelete: opts.onDelete,\n onUpdate: opts.onUpdate,\n }) - 1;\n this.lastForeignKeyIndex = idx;\n return this;\n }\n\n // chainable helpers to set onDelete/onUpdate for the most recently added or currently pending foreign key\n onDelete(action: string) {\n if (this.pendingForeign) {\n this.pendingForeign.onDelete = action;\n } else if (this.lastForeignKeyIndex !== null) {\n this.foreignKeys[this.lastForeignKeyIndex].onDelete = action;\n }\n return this;\n }\n onUpdate(action: string) {\n if (this.pendingForeign) {\n this.pendingForeign.onUpdate = action;\n } else if (this.lastForeignKeyIndex !== null) {\n this.foreignKeys[this.lastForeignKeyIndex].onUpdate = action;\n }\n return this;\n }\n\n // alter-mode helpers\n dropColumn(name: string) {\n this.drops.push(name);\n return this;\n }\n renameColumn(from: string, to: string) {\n this.renames.push({ from, to });\n return this;\n }\n // change column: provide old name and a callback that defines the new column\n changeColumn(oldName: string, cb: (col: Column) => Column) {\n // create a temporary column using the oldName as placeholder; callback can change name\n const tmp = new Column(oldName, \"VARCHAR\");\n const newCol = cb(tmp) || tmp;\n this.changes.push({ oldName, col: newCol });\n return this;\n }\n\n toSQL(): string {\n const colSql = this.columns.map((c) => c.toSQL());\n\n const pk = this.primaryKeys.length\n ? `, PRIMARY KEY (${this.primaryKeys.map((n) => `\\`${n}\\``).join(\", \")})`\n : \"\";\n const uqs = this.uniques.map((n) => `, UNIQUE KEY (\\`${n}\\`)`).join(\"\");\n\n // index and foreign key SQL for create mode\n const idxSqlCreate = this.indexes\n .map((ix) => {\n const name =\n ix.name || `${this.name}_${ix.columns.join(\"_\")}${ix.unique ? \"_uniq\" : \"_idx\"}`;\n const cols = ix.columns.map((c) => `\\`${c}\\``).join(\", \");\n return ix.unique ? `, UNIQUE KEY \\`${name}\\` (${cols})` : `, KEY \\`${name}\\` (${cols})`;\n })\n .join(\"\");\n\n const fkSqlCreate = this.foreignKeys\n .map((fk) => {\n const name = fk.name || `${this.name}_${fk.columns.join(\"_\")}_fk`;\n const cols = fk.columns.map((c) => `\\`${c}\\``).join(\", \");\n const refs = fk.refColumns.map((c) => `\\`${c}\\``).join(\", \");\n const onDelete = fk.onDelete ? ` ON DELETE ${fk.onDelete}` : \"\";\n const onUpdate = fk.onUpdate ? ` ON UPDATE ${fk.onUpdate}` : \"\";\n return `, CONSTRAINT \\`${name}\\` FOREIGN KEY (${cols}) REFERENCES \\`${fk.refTable}\\` (${refs})${onDelete}${onUpdate}`;\n })\n .join(\"\");\n\n if (this.mode === \"create\") {\n return `CREATE TABLE IF NOT EXISTS \\`${this.name}\\` (\\n ${colSql.join(\",\\n \")}${pk}${uqs}${idxSqlCreate}${fkSqlCreate}\\n) ENGINE=${this.engine} DEFAULT CHARSET=${this.charset};`;\n }\n\n // alter mode: produce one or more ALTER TABLE statements\n const parts: string[] = [];\n // additions\n for (const c of this.columns) {\n parts.push(`ALTER TABLE \\`${this.name}\\` ADD COLUMN ${c.toSQL()};`);\n }\n // indexes in alter mode\n for (const ix of this.indexes) {\n const name = ix.name || `${this.name}_${ix.columns.join(\"_\")}${ix.unique ? \"_uniq\" : \"_idx\"}`;\n const cols = ix.columns.map((c) => `\\`${c}\\``).join(\", \");\n parts.push(\n ix.unique\n ? `ALTER TABLE \\`${this.name}\\` ADD UNIQUE \\`${name}\\` (${cols});`\n : `ALTER TABLE \\`${this.name}\\` ADD INDEX \\`${name}\\` (${cols});`,\n );\n }\n\n // drop indexes in alter mode\n for (const idxName of this.dropIndexes) {\n parts.push(`ALTER TABLE \\`${this.name}\\` DROP INDEX \\`${idxName}\\`;`);\n }\n\n // foreign keys in alter mode\n for (const fk of this.foreignKeys) {\n const name = fk.name || `${this.name}_${fk.columns.join(\"_\")}_fk`;\n const cols = fk.columns.map((c) => `\\`${c}\\``).join(\", \");\n const refs = fk.refColumns.map((c) => `\\`${c}\\``).join(\", \");\n const onDelete = fk.onDelete ? ` ON DELETE ${fk.onDelete}` : \"\";\n const onUpdate = fk.onUpdate ? ` ON UPDATE ${fk.onUpdate}` : \"\";\n parts.push(\n `ALTER TABLE \\`${this.name}\\` ADD CONSTRAINT \\`${name}\\` FOREIGN KEY (${cols}) REFERENCES \\`${fk.refTable}\\` (${refs})${onDelete}${onUpdate};`,\n );\n }\n\n // drop foreign keys (by constraint name)\n for (const fkName of this.dropForeignKeys) {\n parts.push(`ALTER TABLE \\`${this.name}\\` DROP FOREIGN KEY \\`${fkName}\\`;`);\n }\n\n // drops\n for (const d of this.drops) {\n parts.push(`ALTER TABLE \\`${this.name}\\` DROP COLUMN \\`${d}\\`;`);\n }\n // renames\n for (const r of this.renames) {\n // MySQL 8 supports RENAME COLUMN\n parts.push(`ALTER TABLE \\`${this.name}\\` RENAME COLUMN \\`${r.from}\\` TO \\`${r.to}\\`;`);\n }\n // changes\n for (const ch of this.changes) {\n // CHANGE old_name `<new definition including new name and type>`\n parts.push(`ALTER TABLE \\`${this.name}\\` CHANGE \\`${ch.oldName}\\` ${ch.col.toSQL()};`);\n }\n\n return parts.join(\"\\n\");\n }\n}\n\nexport default class Schema implements MigrationSchema {\n private queryFn?: (sql: string, params?: any[]) => Promise<any>;\n\n constructor(queryFn?: (sql: string, params?: any[]) => Promise<any>) {\n this.queryFn = queryFn;\n }\n\n createTable(name: string, callback: (table: TableBuilder) => void) {\n const tb = new TableBuilder(name, \"create\");\n callback(tb);\n return tb.toSQL();\n }\n\n alterTable(name: string, callback: (table: TableBuilder) => void) {\n const tb = new TableBuilder(name, \"alter\");\n callback(tb);\n return tb.toSQL();\n }\n\n dropTable(name: string) {\n return `DROP TABLE IF EXISTS \\`${name}\\`;`;\n }\n\n dropTableIfExists(name: string) {\n return `DROP TABLE IF EXISTS \\`${name}\\`;`;\n }\n\n rename(from: string, to: string) {\n return `RENAME TABLE \\`${from}\\` TO \\`${to}\\`;`;\n }\n\n async hasTable(name: string): Promise<boolean> {\n if (!this.queryFn) return false;\n const rows: any[] = await this.queryFn(\n `SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?`,\n [name],\n );\n return rows && rows.length > 0;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n if (!this.queryFn) return false;\n const rows: any[] = await this.queryFn(\n `SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,\n [table, column],\n );\n return rows && rows.length > 0;\n }\n\n async hasColumns(table: string, columns: string[]): Promise<boolean> {\n for (const col of columns) {\n if (!(await this.hasColumn(table, col))) return false;\n }\n return true;\n }\n\n async getColumnType(table: string, column: string): Promise<string | null> {\n if (!this.queryFn) return null;\n const rows: any[] = await this.queryFn(\n `SELECT DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,\n [table, column],\n );\n return rows && rows[0] ? rows[0].DATA_TYPE : null;\n }\n\n async getColumnListing(table: string): Promise<string[]> {\n if (!this.queryFn) return [];\n const rows: any[] = await this.queryFn(\n `SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? ORDER BY ORDINAL_POSITION`,\n [table],\n );\n return rows ? rows.map((r: any) => r.COLUMN_NAME) : [];\n }\n\n dropColumns(table: string, columns: string[]) {\n const drops = columns.map((c) => `DROP COLUMN \\`${c}\\``).join(\", \");\n return `ALTER TABLE \\`${table}\\` ${drops};`;\n }\n\n renameColumn(table: string, from: string, to: string) {\n return `ALTER TABLE \\`${table}\\` RENAME COLUMN \\`${from}\\` TO \\`${to}\\`;`;\n }\n\n // Laravel: Create database\n createDatabase(name: string) {\n return `CREATE DATABASE IF NOT EXISTS \\`${name}\\`;`;\n }\n\n // Laravel: Drop database\n dropDatabaseIfExists(name: string) {\n return `DROP DATABASE IF EXISTS \\`${name}\\`;`;\n }\n\n // Laravel: Enable foreign key constraints\n enableForeignKeyConstraints() {\n return `SET FOREIGN_KEY_CHECKS = 1;`;\n }\n\n // Laravel: Disable foreign key constraints\n disableForeignKeyConstraints() {\n return `SET FOREIGN_KEY_CHECKS = 0;`;\n }\n\n // Laravel: Get all table names\n async getAllTables(): Promise<string[]> {\n if (!this.queryFn) return [];\n const rows: any[] = await this.queryFn(\n `SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_TYPE = 'BASE TABLE'`,\n );\n return rows ? rows.map((r: any) => r.TABLE_NAME) : [];\n }\n\n // Laravel: Get all view names\n async getAllViews(): Promise<string[]> {\n if (!this.queryFn) return [];\n const rows: any[] = await this.queryFn(\n `SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_TYPE = 'VIEW'`,\n );\n return rows ? rows.map((r: any) => r.TABLE_NAME) : [];\n }\n}\n\n// MongoSchema: records operations and applies them using MongoDB\nexport class MongoSchema implements MigrationSchema {\n private ops: Array<{\n type: \"create\" | \"alter\" | \"drop\" | \"rename\";\n table: string;\n tb?: TableBuilder;\n newName?: string;\n }> = [];\n\n createTable(name: string, callback: (table: TableBuilder) => void) {\n const tb = new TableBuilder(name, \"create\");\n callback(tb);\n this.ops.push({ type: \"create\", table: name, tb });\n return undefined as any; // runner will call apply()\n }\n\n alterTable(name: string, callback: (table: TableBuilder) => void) {\n const tb = new TableBuilder(name, \"alter\");\n callback(tb);\n this.ops.push({ type: \"alter\", table: name, tb });\n return undefined as any;\n }\n\n dropTable(name: string) {\n this.ops.push({ type: \"drop\", table: name });\n return undefined as any;\n }\n\n dropTableIfExists(name: string) {\n return this.dropTable(name);\n }\n\n rename(from: string, to: string) {\n this.ops.push({ type: \"rename\", table: from, newName: to });\n return undefined as any;\n }\n\n async hasTable(name: string): Promise<boolean> {\n if (getDbType() !== \"mongodb\") return false;\n const db = getMongoDb();\n return await db.listCollections({ name }).hasNext();\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n // In MongoDB, columns are dynamic - we check if any document has the field\n if (getDbType() !== \"mongodb\") return false;\n const db = getMongoDb();\n const doc = await db.collection(table).findOne({ [column]: { $exists: true } });\n return !!doc;\n }\n\n async hasColumns(table: string, columns: string[]): Promise<boolean> {\n for (const col of columns) {\n if (!(await this.hasColumn(table, col))) return false;\n }\n return true;\n }\n\n async getColumnType(table: string, column: string): Promise<string | null> {\n // MongoDB is schemaless - return null or infer from first document\n if (getDbType() !== \"mongodb\") return null;\n const db = getMongoDb();\n const doc = await db.collection(table).findOne({ [column]: { $exists: true } });\n if (!doc || doc[column] === undefined) return null;\n return typeof doc[column];\n }\n\n async getColumnListing(table: string): Promise<string[]> {\n // Get all unique field names from the collection (limited sample)\n if (getDbType() !== \"mongodb\") return [];\n const db = getMongoDb();\n const docs = await db.collection(table).find({}).limit(100).toArray();\n const fields = new Set<string>();\n for (const doc of docs) {\n Object.keys(doc).forEach((k) => fields.add(k));\n }\n return Array.from(fields);\n }\n\n dropColumns(table: string, columns: string[]) {\n // Queue an unset operation for apply()\n const tb = new TableBuilder(table, \"alter\");\n columns.forEach((c) => tb.dropColumn(c));\n this.ops.push({ type: \"alter\", table, tb });\n return undefined as any;\n }\n\n renameColumn(table: string, from: string, to: string) {\n const tb = new TableBuilder(table, \"alter\");\n tb.renameColumn(from, to);\n this.ops.push({ type: \"alter\", table, tb });\n return undefined as any;\n }\n\n async apply(): Promise<void> {\n if (getDbType() !== \"mongodb\") return;\n const db = getMongoDb();\n for (const op of this.ops) {\n if (op.type === \"create\" && op.tb) {\n // create collection if not exists\n const exists = await db.listCollections({ name: op.table }).hasNext();\n if (!exists) {\n await db.createCollection(op.table);\n }\n // indexes\n const c = db.collection(op.table);\n // primary key: nothing to do; Mongo always has _id\n // unique indexes\n for (const uq of op.tb.uniques || []) {\n try {\n await c.createIndex({ [uq]: 1 }, { unique: true, name: `${op.table}_${uq}_uniq` });\n } catch (_) {}\n }\n // other indexes\n for (const ix of op.tb.indexes || []) {\n const name =\n ix.name || `${op.table}_${ix.columns.join(\"_\")}${ix.unique ? \"_uniq\" : \"_idx\"}`;\n const spec: any = {};\n ix.columns.forEach((col) => (spec[col] = 1));\n try {\n await c.createIndex(spec, { unique: Boolean(ix.unique), name });\n } catch (_) {}\n }\n } else if (op.type === \"alter\" && op.tb) {\n const c = db.collection(op.table);\n // add indexes\n for (const ix of op.tb.indexes || []) {\n const name =\n ix.name || `${op.table}_${ix.columns.join(\"_\")}${ix.unique ? \"_uniq\" : \"_idx\"}`;\n const spec: any = {};\n ix.columns.forEach((col) => (spec[col] = 1));\n try {\n await c.createIndex(spec, { unique: Boolean(ix.unique), name });\n } catch (_) {}\n }\n // drop indexes\n for (const dropName of op.tb.dropIndexes || []) {\n try {\n await c.dropIndex(dropName);\n } catch (_) {}\n }\n // drop columns (unset fields)\n if (op.tb.drops && op.tb.drops.length) {\n const unset: any = {};\n op.tb.drops.forEach((d) => (unset[d] = \"\"));\n try {\n await c.updateMany({}, { $unset: unset });\n } catch (_) {}\n }\n // rename columns\n if (op.tb.renames && op.tb.renames.length) {\n for (const r of op.tb.renames) {\n try {\n await c.updateMany({}, { $rename: { [r.from]: r.to } });\n } catch (_) {}\n }\n }\n } else if (op.type === \"drop\") {\n try {\n await db.collection(op.table).drop();\n } catch (_) {}\n } else if (op.type === \"rename\" && op.newName) {\n try {\n await db.collection(op.table).rename(op.newName);\n } catch (_) {}\n }\n }\n // clear ops after applying\n this.ops = [];\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport crypto from \"crypto\";\nimport readline from \"readline\";\nimport os from \"os\";\nimport { query, initDatabase, getDbType, getMongoDb } from \"../connection.js\";\nimport Schema, { MongoSchema } from \"./Schema.js\";\n\n// helper to resolve CommonJS/ESModule default exports from required migration files\nfunction resolveMigrationModule(mod: any) {\n if (!mod) return mod;\n // if it's an object with default property, prefer that (handle esModule wrappers)\n if (mod && typeof mod === \"object\" && \"default\" in mod && mod.default)\n return resolveMigrationModule(mod.default);\n // prefer direct object that exposes up/down methods\n if (\n mod &&\n typeof mod === \"object\" &&\n (typeof mod.up === \"function\" || typeof mod.down === \"function\")\n )\n return mod;\n // if it's a function, it may be a class constructor with prototype methods - try instantiate\n if (typeof mod === \"function\") {\n // detect likely class by checking prototype methods\n try {\n const proto = mod.prototype || {};\n if (typeof proto.up === \"function\" || typeof proto.down === \"function\") {\n try {\n const inst = new (mod as any)();\n if (inst && (typeof inst.up === \"function\" || typeof inst.down === \"function\"))\n return inst;\n } catch (e) {\n // instantiation failed; fallthrough to returning original function\n }\n }\n } catch (e) {}\n return mod;\n }\n return mod;\n}\n\nasync function ensureMigrationsTable() {\n if (getDbType() === \"mongodb\") {\n const db = getMongoDb();\n // ensure migrations collection exists and unique index on name\n const exists = await db.listCollections({ name: \"migrations\" }).hasNext();\n if (!exists) await db.createCollection(\"migrations\");\n const mig = db.collection(\"migrations\");\n try {\n await mig.createIndex({ name: 1 }, { unique: true });\n } catch (e) {}\n const lockExists = await db.listCollections({ name: \"migration_locks\" }).hasNext();\n if (!lockExists) await db.createCollection(\"migration_locks\");\n // ensure a unique index on lock_name for safe lock acquisition without relying on _id type\n try {\n await db\n .collection(\"migration_locks\")\n .createIndex({ lock_name: 1 }, { unique: true, name: \"lock_name_unique\" });\n } catch (e) {}\n return;\n }\n const sql = `CREATE TABLE IF NOT EXISTS \\`migrations\\` (\n id INT AUTO_INCREMENT PRIMARY KEY,\n name VARCHAR(255) NOT NULL UNIQUE,\n checksum VARCHAR(128) DEFAULT NULL,\n batch INT NOT NULL,\n migrated_at DATETIME NOT NULL,\n ran_by VARCHAR(255) DEFAULT NULL,\n ran_host VARCHAR(255) DEFAULT NULL,\n ran_pid INT DEFAULT NULL\n ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`;\n await query(sql);\n\n // migration_locks table for auditing lock ownership\n const lockSql = `CREATE TABLE IF NOT EXISTS \\`migration_locks\\` (\n lock_name VARCHAR(255) PRIMARY KEY,\n owner VARCHAR(255) DEFAULT NULL,\n owner_pid INT DEFAULT NULL,\n acquired_at DATETIME DEFAULT NULL,\n released_at DATETIME DEFAULT NULL\n ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`;\n await query(lockSql);\n}\n\nasync function acquireLock(lockName: string, timeoutSec = 10, retries = 5, backoffMs = 1000) {\n if (getDbType() === \"mongodb\") {\n const db = getMongoDb();\n const coll = db.collection(\"migration_locks\");\n let attempt = 0;\n while (true) {\n attempt++;\n try {\n await coll.insertOne({\n lock_name: lockName,\n owner: process.env.USER || os.userInfo().username || null,\n owner_pid: process.pid,\n acquired_at: new Date(),\n released_at: null,\n });\n return; // acquired\n } catch (e: any) {\n if (e && e.code === 11000) {\n if (attempt >= (retries || 1)) break;\n const wait = backoffMs * Math.pow(2, attempt - 1);\n await new Promise((res) => setTimeout(res, wait));\n continue;\n }\n throw e;\n }\n }\n throw new Error(`Could not acquire migration lock '${lockName}' after ${retries} attempts`);\n }\n let attempt = 0;\n while (true) {\n attempt++;\n console.log(\n `Attempting to acquire migration lock '${lockName}' (timeout ${timeoutSec}s) attempt ${attempt}/${retries}`,\n );\n const rows: any[] = await query(\"SELECT GET_LOCK(?, ?) as got\", [lockName, timeoutSec]);\n const got = rows && rows[0] && (rows[0].got === 1 || rows[0].got === \"1\");\n if (got) {\n console.log(`Acquired migration lock '${lockName}'`);\n // insert/update lock audit\n try {\n const owner = process.env.USER || os.userInfo().username || null;\n const pid = process.pid;\n await query(\n \"INSERT INTO `migration_locks` (lock_name, owner, owner_pid, acquired_at, released_at) VALUES (?, ?, ?, NOW(), NULL) ON DUPLICATE KEY UPDATE owner = ?, owner_pid = ?, acquired_at = NOW(), released_at = NULL\",\n [lockName, owner, pid, owner, pid],\n );\n } catch (e) {\n console.warn(\"Failed to record lock acquisition:\", e);\n }\n return;\n }\n if (attempt >= retries) break;\n const wait = backoffMs * Math.pow(2, attempt - 1);\n console.log(`Lock not acquired, retrying after ${wait}ms`);\n await new Promise((res) => setTimeout(res, wait));\n }\n throw new Error(`Could not acquire migration lock '${lockName}' after ${retries} attempts`);\n}\n\nasync function releaseLock(lockName: string) {\n if (getDbType() === \"mongodb\") {\n const db = getMongoDb();\n try {\n await db.collection(\"migration_locks\").deleteOne({ lock_name: lockName });\n } catch {}\n return;\n }\n try {\n const rows: any[] = await query(\"SELECT RELEASE_LOCK(?) as released\", [lockName]);\n const released = rows && rows[0] && (rows[0].released === 1 || rows[0].released === \"1\");\n console.log(`Released migration lock '${lockName}' (released=${released})`);\n try {\n await query(\"UPDATE `migration_locks` SET released_at = NOW() WHERE lock_name = ?\", [\n lockName,\n ]);\n } catch (e) {\n /* ignore */\n }\n } catch (e) {\n // ignore\n }\n}\n\nfunction checksumOf(content: string) {\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction parseArgs(argv: string[]) {\n const out: any = {\n command: \"up\",\n lockName: \"rentivo_migrations_lock\",\n lockTimeout: 10,\n lockRetries: undefined,\n lockBackoffMs: undefined,\n forceConfirm: false,\n force: false,\n step: 1,\n };\n for (let i = 2; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"down\" || a === \"rollback\") out.command = \"down\";\n else if (a === \"up\" || a === \"migrate\") out.command = \"up\";\n else if (a.startsWith(\"--step=\")) out.step = parseInt(a.split(\"=\")[1], 10) || 1;\n else if (a.startsWith(\"--lock-name=\")) out.lockName = a.split(\"=\")[1];\n else if (a.startsWith(\"--lock-timeout=\")) out.lockTimeout = parseInt(a.split(\"=\")[1], 10) || 10;\n else if (a.startsWith(\"--lock-retries=\"))\n out.lockRetries = parseInt(a.split(\"=\")[1], 10) || undefined;\n else if (a.startsWith(\"--lock-backoff-ms=\"))\n out.lockBackoffMs = parseInt(a.split(\"=\")[1], 10) || undefined;\n else if (a === \"--force-confirm\") out.forceConfirm = true;\n else if (a === \"--force\") out.force = true;\n }\n return out;\n}\n\nasync function promptConfirm(question: string) {\n if (!process.stdin.isTTY) return false;\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const ans: string = await new Promise((res) =>\n rl.question(question + \" \", (a) => {\n rl.close();\n res(a);\n }),\n );\n return /^y(es)?$/i.test(ans.trim());\n}\n\nasync function getAppliedMigrations() {\n if (getDbType() === \"mongodb\") {\n const db = getMongoDb();\n const rows = await db\n .collection(\"migrations\")\n .find({}, { projection: { _id: 0 } })\n .sort({ migrated_at: 1 })\n .toArray();\n const map: Record<string, any> = {};\n for (const r of rows) map[r.name] = r;\n return { rows, map };\n }\n const rows: any[] = await query(\n \"SELECT name, checksum, batch, migrated_at, ran_by, ran_host FROM `migrations` ORDER BY id\",\n );\n const map: Record<string, any> = {};\n for (const r of rows) map[r.name] = r;\n return { rows, map };\n}\n\nasync function getCurrentMaxBatch() {\n if (getDbType() === \"mongodb\") {\n const db = getMongoDb();\n const row = await db\n .collection(\"migrations\")\n .aggregate([{ $group: { _id: null, maxBatch: { $max: \"$batch\" } } }])\n .toArray();\n return (row && row[0] && row[0].maxBatch) || 0;\n }\n const rows: any[] = await query(\"SELECT MAX(batch) as maxBatch FROM `migrations`\");\n return (rows && rows[0] && rows[0].maxBatch) || 0;\n}\n\nasync function runSql(sql: string) {\n if (getDbType() === \"mongodb\") return; // noop\n // rely on mysql2 pool with multipleStatements enabled\n await query(sql);\n}\n\nasync function run(inputArgs?: {\n command?: \"up\" | \"down\";\n step?: number;\n force?: boolean;\n forceConfirm?: boolean;\n lockName?: string;\n lockTimeout?: number;\n lockRetries?: number;\n lockBackoffMs?: number;\n}) {\n await initDatabase();\n\n // Ensure migrations tables/collections exist BEFORE attempting to acquire a lock.\n await ensureMigrationsTable();\n\n // Use input args if provided, otherwise parse from process.argv\n // Merge inputArgs with defaults from parseArgs to ensure all fields are present\n const parsedFromArgv = parseArgs(process.argv);\n const args = inputArgs ? { ...parsedFromArgv, ...inputArgs } : parsedFromArgv;\n\n // checksum policy comes from env var MIGRATION_CHECKSUM_POLICY (strict|warn|ignore)\n const checksumPolicy = (process.env.MIGRATION_CHECKSUM_POLICY || \"strict\").toLowerCase();\n\n // lock config: env vars can set defaults, CLI overrides available\n const lockName = args.lockName || process.env.MIGRATION_LOCK_NAME || \"rentivo_migrations_lock\";\n const lockTimeout =\n args.lockTimeout || parseInt(process.env.MIGRATION_LOCK_TIMEOUT || \"10\", 10) || 10;\n const lockRetries =\n args.lockRetries || parseInt(process.env.MIGRATION_LOCK_RETRIES || \"5\", 10) || 5;\n const lockBackoffMs =\n args.lockBackoffMs || parseInt(process.env.MIGRATION_LOCK_BACKOFF_MS || \"1000\", 10) || 1000;\n\n await acquireLock(lockName, lockTimeout, lockRetries, lockBackoffMs);\n\n try {\n await ensureMigrationsTable();\n\n const dir = path.resolve(process.cwd(), \"src/database/migrations\");\n // prefer .ts/.js migrations; SQL migrations are deprecated and ignored\n const allFiles = fs.readdirSync(dir).filter((f) => f.endsWith(\".js\") || f.endsWith(\".ts\"));\n const bases = new Map<string, string>();\n // prioritize ts, then js\n for (const ext of [\".ts\", \".js\"]) {\n for (const f of allFiles.filter((x) => x.endsWith(ext))) {\n const base = f.replace(/\\.(ts|js|sql)$/i, \"\");\n if (!bases.has(base)) bases.set(base, f);\n }\n }\n const files = Array.from(bases.values()).sort();\n // detect and warn about remaining .sql files so maintainers can remove them\n const legacySql = fs.readdirSync(dir).filter((f) => f.endsWith(\".sql\"));\n if (legacySql.length)\n console.warn(\"Found legacy .sql migrations (ignored):\", legacySql.join(\", \"));\n\n if (args.command === \"up\") {\n const { map } = await getAppliedMigrations();\n const maxBatch = await getCurrentMaxBatch();\n const newBatch = (maxBatch || 0) + 1;\n\n // pre-scan for checksum mismatches to allow single confirmation\n const mismatches: string[] = [];\n for (const f of files) {\n const full = path.join(dir, f);\n if (!map[f]) continue;\n let content = \"\";\n try {\n content = fs.readFileSync(full, \"utf8\");\n } catch (e) {\n content = \"\";\n }\n const ch = checksumOf(content);\n if (map[f].checksum && map[f].checksum !== ch) mismatches.push(f);\n }\n\n if (mismatches.length) {\n if (args.force) {\n console.warn(\n \"Checksum mismatches detected but --force provided — proceeding for all mismatches:\",\n mismatches.join(\", \"),\n );\n } else if (args.forceConfirm) {\n const ok = await promptConfirm(\n `Checksum mismatches detected for applied migrations: ${mismatches.join(\", \")}. Proceed and ignore all mismatches? (y/N)`,\n );\n if (!ok) throw new Error(\"User aborted due to checksum mismatches\");\n console.warn(\"User confirmed proceeding despite checksum mismatches\");\n } else if (checksumPolicy === \"ignore\") {\n console.warn(\n \"Checksum mismatches detected but MIGRATION_CHECKSUM_POLICY=ignore — proceeding. Files:\",\n mismatches.join(\", \"),\n );\n } else if (checksumPolicy === \"warn\") {\n console.warn(\n \"Checksum mismatches detected (policy=warn). These migrations will be skipped:\",\n mismatches.join(\", \"),\n );\n } else {\n throw new Error(\n `Checksum mismatches detected for applied migrations: ${mismatches.join(\", \")}. Aborting (set MIGRATION_CHECKSUM_POLICY or use --force/--force-confirm).`,\n );\n }\n }\n\n for (const f of files) {\n const full = path.join(dir, f);\n\n // compute checksum of current file\n let content = \"\";\n try {\n content = fs.readFileSync(full, \"utf8\");\n } catch (e) {\n content = \"\";\n }\n const ch = checksumOf(content);\n\n if (map[f]) {\n // checksum changed since applied → obey checksum policy (already handled in pre-scan)\n if (map[f].checksum && map[f].checksum !== ch) {\n if (args.force || args.forceConfirm || checksumPolicy === \"ignore\") {\n console.warn(`Proceeding despite checksum mismatch for ${f}`);\n } else if (checksumPolicy === \"warn\") {\n console.log(\"Skipping already applied migration\", f);\n continue;\n } else {\n throw new Error(\n `Checksum mismatch for already-applied migration ${f}. File was changed after applying. Aborting.`,\n );\n }\n }\n console.log(\"Skipping already applied migration\", f);\n continue;\n }\n\n console.log(\"Applying migration\", f);\n if (f.endsWith(\".js\") || f.endsWith(\".ts\")) {\n const rawMod = await import(pathToFileURL(path.join(dir, f)).href);\n const mod = resolveMigrationModule(rawMod);\n if (mod && typeof mod.up === \"function\") {\n if (getDbType() === \"mongodb\") {\n const schema = new MongoSchema();\n await mod.up(schema, undefined);\n await schema.apply();\n const ranBy = process.env.USER || os.userInfo().username || null;\n const ranHost = os.hostname();\n const pid = process.pid;\n await getMongoDb().collection(\"migrations\").insertOne({\n name: f,\n checksum: ch,\n batch: newBatch,\n migrated_at: new Date(),\n ran_by: ranBy,\n ran_host: ranHost,\n ran_pid: pid,\n });\n } else {\n const schema = new Schema();\n const res = await mod.up(schema, query);\n if (typeof res === \"string\") await runSql(res);\n const ranBy = process.env.USER || os.userInfo().username || null;\n const ranHost = os.hostname();\n const pid = process.pid;\n await query(\n \"INSERT INTO `migrations` (name, checksum, batch, migrated_at, ran_by, ran_host, ran_pid) VALUES (?, ?, ?, NOW(), ?, ?, ?)\",\n [f, ch, newBatch, ranBy, ranHost, pid],\n );\n }\n } else {\n throw new Error(`Migration ${f} does not export an up(schema, query) function`);\n }\n } else {\n // should not happen due to initial filter; safeguard log\n console.warn(\"Ignoring unsupported migration file type:\", f);\n }\n }\n\n console.log(\"Migrations applied (batch\", newBatch + \")\");\n return;\n }\n\n // down / rollback (unchanged logic below)\n if (args.command === \"down\") {\n const step = args.step || 1;\n if (getDbType() === \"mongodb\") {\n const db = getMongoDb();\n const batches = await db.collection(\"migrations\").distinct(\"batch\");\n const sortedDesc = (batches as number[])\n .filter((x: any) => x != null)\n .sort((a, b) => b - a)\n .slice(0, step);\n if (!sortedDesc.length) {\n console.log(\"No migrations to rollback\");\n return;\n }\n const rows = await db\n .collection(\"migrations\")\n .find({ batch: { $in: sortedDesc } })\n .sort({ migrated_at: -1 })\n .toArray();\n if (!rows.length) {\n console.log(\"No migrations found for requested batches\");\n return;\n }\n const dir2 = path.resolve(process.cwd(), \"src/database/migrations\");\n for (const r of rows) {\n const f = r.name as string;\n const full = path.join(dir2, f);\n console.log(\"Reverting migration\", f);\n if (fs.existsSync(full) && (f.endsWith(\".js\") || f.endsWith(\".ts\"))) {\n const rawMod = await import(pathToFileURL(full).href);\n const mod = resolveMigrationModule(rawMod);\n if (mod && typeof mod.down === \"function\") {\n const schema = new MongoSchema();\n await mod.down(schema, undefined);\n await schema.apply();\n await db.collection(\"migrations\").deleteOne({ name: f });\n continue;\n } else {\n throw new Error(\n `Migration ${f} does not export a down(schema, query) function; rollback aborted`,\n );\n }\n }\n throw new Error(\n `Cannot rollback migration ${f}: SQL migrations are deprecated. Provide a JS/TS migration with down(schema, query).`,\n );\n }\n console.log(\"Rollback complete for batches\", sortedDesc.join(\",\"));\n return;\n }\n // MySQL path\n const batchesRows: any[] = await query(\n \"SELECT DISTINCT batch FROM `migrations` ORDER BY batch DESC\",\n );\n if (!batchesRows.length) {\n console.log(\"No migrations to rollback\");\n return;\n }\n const batches = batchesRows.map((r) => r.batch).slice(0, step);\n if (!batches.length) {\n console.log(\"No batches to rollback\");\n return;\n }\n\n // get migrations in those batches ordered by id desc\n const placeholders = batches.map(() => \"?\").join(\",\");\n const rows: any[] = await query(\n `SELECT id, name, checksum, batch FROM \\`migrations\\` WHERE batch IN (${placeholders}) ORDER BY id DESC`,\n batches,\n );\n if (!rows.length) {\n console.log(\"No migrations found for requested batches\");\n return;\n }\n\n // rollback in reverse order (last applied first)\n for (const r of rows) {\n const f = r.name;\n const full = path.join(dir, f);\n console.log(\"Reverting migration\", f);\n if (fs.existsSync(full) && (f.endsWith(\".js\") || f.endsWith(\".ts\"))) {\n const rawMod = await import(pathToFileURL(full).href);\n const mod = resolveMigrationModule(rawMod);\n if (mod && typeof mod.down === \"function\") {\n const schema = new Schema();\n const res = await mod.down(schema, query);\n if (typeof res === \"string\") await runSql(res);\n await query(\"DELETE FROM `migrations` WHERE name = ?\", [f]);\n continue;\n } else {\n throw new Error(\n `Migration ${f} does not export a down(schema, query) function; rollback aborted`,\n );\n }\n }\n\n // SQL migrations are deprecated and ignored; expect a JS/TS migration with down() implemented\n throw new Error(\n `Cannot rollback migration ${f}: SQL migrations are deprecated. Provide a JS/TS migration with down(schema, query).`,\n );\n }\n\n console.log(\"Rollback complete for batches\", batches.join(\",\"));\n return;\n }\n } finally {\n try {\n await releaseLock(lockName);\n } catch (e) {\n /* ignore */\n }\n }\n}\n\n// Export run function for programmatic use\nexport { run };\n","import fs from \"fs\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport {\n initDatabase,\n query,\n getDbType,\n getMongoDb,\n collection as mongoCollection,\n} from \"../connection.js\";\n\nexport interface SeederOptions {\n class?: string;\n force?: boolean;\n}\n\nfunction parseArgs(argv: string[]): SeederOptions {\n const out: SeederOptions = { class: undefined, force: false };\n for (let i = 2; i < argv.length; i++) {\n const a = argv[i];\n if (a.startsWith(\"--class=\")) out.class = a.split(\"=\")[1];\n else if (a === \"--class\" && argv[i + 1]) {\n out.class = argv[i + 1];\n i++;\n } else if (a === \"--force\" || a === \"-f\") out.force = true;\n }\n return out;\n}\n\ntype SqlSeederCtx = { type: \"mysql\"; query: typeof query };\ntype MongoSeederCtx = { type: \"mongodb\"; db: any; collection: (name: string) => any };\ntype SeederCtx = SqlSeederCtx | MongoSeederCtx;\n\nfunction makeSeederContext(): SeederCtx {\n const t = getDbType();\n if (t === \"mongodb\") {\n const db = getMongoDb();\n return { type: \"mongodb\", db, collection: (name: string) => mongoCollection(name) };\n }\n return { type: \"mysql\", query };\n}\n\nasync function loadAndRunSeeder(filePath: string) {\n const mod = await import(pathToFileURL(filePath).href);\n const fn = mod && (mod.seed || mod.default || mod.run || mod);\n if (typeof fn === \"function\") {\n const wantsArg = fn.length >= 1;\n let arg: any = undefined;\n if (wantsArg) {\n const t = getDbType();\n if (t === \"mysql\") arg = query;\n else arg = makeSeederContext();\n }\n const res = wantsArg ? fn(arg) : fn();\n if (res && typeof res.then === \"function\") await res;\n return true;\n }\n return false;\n}\n\nexport async function run(inputOptions?: SeederOptions) {\n await initDatabase();\n\n const parsedArgs = parseArgs(process.argv);\n const opts: SeederOptions = inputOptions ? { ...parsedArgs, ...inputOptions } : parsedArgs;\n\n const seederClass = opts.class;\n const dir = path.resolve(process.cwd(), \"src/database/seeders\");\n\n if (!fs.existsSync(dir)) {\n console.warn(\"No seeders directory found:\", dir);\n return;\n }\n\n const files = fs\n .readdirSync(dir)\n .filter((f) => f.endsWith(\".ts\") || f.endsWith(\".js\"))\n .sort();\n\n if (seederClass) {\n const targetBase = seederClass.replace(/Seeder$/i, \"\");\n const match = files.find(\n (f) =>\n f.replace(/\\.(ts|js)$/i, \"\").toLowerCase() === seederClass.toLowerCase() ||\n f.replace(/\\.(ts|js)$/i, \"\").toLowerCase() === targetBase.toLowerCase() + \"seeder\",\n );\n if (!match) throw new Error(`Seeder class ${seederClass} not found in ${dir}`);\n const full = path.join(dir, match);\n console.log(`Running seeder: ${match}`);\n const ok = await loadAndRunSeeder(full);\n if (!ok) console.warn(\"Seeder did not export a callable function:\", full);\n return;\n }\n\n const dbSeederFile = files.find(\n (f) => f.replace(/\\.(ts|js)$/i, \"\").toLowerCase() === \"databaseseeder\",\n );\n if (dbSeederFile) {\n const full = path.join(dir, dbSeederFile);\n console.log(\"Running DatabaseSeeder...\");\n await loadAndRunSeeder(full);\n return;\n }\n\n console.log(`Running all ${files.length} seeders...`);\n for (const f of files) {\n const full = path.join(dir, f);\n console.log(\"Running seeder\", f);\n try {\n const ok = await loadAndRunSeeder(full);\n if (!ok) console.warn(\"Seeder did not export a callable function:\", f);\n } catch (e) {\n console.error(\"Seeder failed\", f, e);\n throw e;\n }\n }\n\n console.log(\"All seeders completed successfully.\");\n}\n\nexport async function runWithOptions(options: SeederOptions): Promise<void> {\n return run(options);\n}\n","import readline from \"readline\";\nimport { initDatabase, query, getDbType, getMongoDb } from \"../connection.js\";\nimport path from \"path\";\n\ninterface MigrateFreshOptions {\n force?: boolean;\n seed?: boolean;\n seederClass?: string;\n}\n\nfunction parseArgs(argv: string[]): MigrateFreshOptions {\n const out: MigrateFreshOptions = { force: false, seed: false, seederClass: undefined };\n for (let i = 2; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--force\" || a === \"-f\") out.force = true;\n else if (a === \"--seed\" || a === \"-s\") out.seed = true;\n else if (a.startsWith(\"--seeder=\")) out.seederClass = a.split(\"=\")[1];\n else if (a.startsWith(\"--class=\")) out.seederClass = a.split(\"=\")[1];\n }\n return out;\n}\n\nasync function promptConfirm(question: string) {\n if (!process.stdin.isTTY) return false;\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const ans: string = await new Promise((res) =>\n rl.question(question + \" \", (a) => {\n rl.close();\n res(a);\n }),\n );\n return /^y(es)?$/i.test(ans.trim());\n}\n\nasync function runSeedersHelper(seederClass?: string): Promise<void> {\n const mod = (await import(\"./SeederRunner.js\")) as any;\n if (typeof mod.runWithOptions === \"function\") {\n await mod.runWithOptions({ class: seederClass });\n } else if (typeof mod.run === \"function\") {\n await mod.run();\n } else {\n console.warn(\"Seeder runner not available\");\n }\n}\n\nexport async function run(inputArgs?: MigrateFreshOptions) {\n await initDatabase();\n\n const parsedArgs = parseArgs(process.argv);\n const args: MigrateFreshOptions = inputArgs ? { ...parsedArgs, ...inputArgs } : parsedArgs;\n\n if (getDbType() === \"mongodb\") {\n const db = getMongoDb();\n const dbName = db.databaseName;\n\n if (!args.force) {\n const ok = await promptConfirm(\n `This will DROP ALL COLLECTIONS in database '${dbName}'. Are you sure? (y/N)`,\n );\n if (!ok) {\n console.log(\"Aborted.\");\n process.exit(0);\n }\n } else {\n console.log(\"Force flag provided; proceeding without confirmation\");\n }\n\n const collections = await db.collections();\n for (const c of collections) {\n try {\n await c.drop();\n } catch {\n /* ignore */\n }\n }\n\n console.log(\"Running migrations...\");\n const { run: runMigrations } = (await import(\"./MigrationRunner.js\")) as any;\n await runMigrations();\n\n if (args.seed) {\n console.log(\"Running seeders...\");\n await runSeedersHelper(args.seederClass);\n }\n\n console.log(\"migrate:fresh complete\");\n return;\n }\n\n // MySQL path\n const dbNameRows: any = await query(\"SELECT DATABASE() as db\");\n const dbName = dbNameRows && dbNameRows[0] && dbNameRows[0].db;\n\n if (!args.force) {\n const ok = await promptConfirm(\n `This will DROP ALL TABLES in database '${dbName}'. Are you sure? (y/N)`,\n );\n if (!ok) {\n console.log(\"Aborted.\");\n process.exit(0);\n }\n } else {\n console.log(\"Force flag provided; proceeding without confirmation\");\n }\n\n const lockName = process.env.MIGRATION_LOCK_NAME || \"lara_node_migrations_lock\";\n try {\n const lrows: any = await query(\"SELECT GET_LOCK(?, 10) as got\", [lockName]);\n const got = lrows && lrows[0] && (lrows[0].got === 1 || lrows[0].got === \"1\");\n if (!got) throw new Error(`Could not acquire lock ${lockName}`);\n } catch (e) {\n console.error(\"Failed to acquire lock before migrate:fresh\", e);\n process.exit(1);\n }\n\n try {\n console.log(\"Collecting tables to drop...\");\n try {\n await query(\"SET FOREIGN_KEY_CHECKS = 0\");\n } catch (_) {}\n\n const rows: any[] = await query(\n \"SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type='BASE TABLE'\",\n );\n const names = rows.map((r) => r.table_name).filter(Boolean);\n if (!names.length) console.log(\"No tables found in database.\");\n else {\n console.log(\"Dropping tables:\", names.join(\", \"));\n for (const n of names) {\n try {\n await query(`DROP TABLE IF EXISTS \\`${n}\\``);\n } catch (e) {\n console.warn(\"Failed to drop table\", n, e);\n }\n }\n }\n\n try {\n await query(\"SET FOREIGN_KEY_CHECKS = 1\");\n } catch (_) {}\n try {\n await query(\"SELECT RELEASE_LOCK(?)\", [lockName]);\n } catch (_) {}\n\n console.log(\"Running migrations...\");\n const { run: runMigrations } = (await import(\"./MigrationRunner.js\")) as any;\n await runMigrations();\n\n if (args.seed) {\n console.log(\"Running seeders...\");\n await runSeedersHelper(args.seederClass);\n }\n\n console.log(\"migrate:fresh complete\");\n } finally {\n try {\n await query(\"SELECT RELEASE_LOCK(?)\", [lockName]);\n } catch (_) {}\n try {\n await query(\"SET FOREIGN_KEY_CHECKS = 1\");\n } catch (_) {}\n }\n}\n","export {\n default as Schema,\n MongoSchema,\n Column,\n TableBuilder,\n RawExpression,\n raw,\n} from \"./Schema.js\";\nexport type { MigrationSchema, Migration } from \"./Schema.js\";\nexport { run as runMigrations } from \"./MigrationRunner.js\";\nexport { run as runSeeders } from \"./SeederRunner.js\";\nexport type { SeederOptions } from \"./SeederRunner.js\";\nexport { run as migrateFresh } from \"./MigrateFresh.js\";\nimport { query, initDatabase, getDbType, getMongoDb } from \"../connection.js\";\nexport { query, initDatabase, getDbType, getMongoDb };\n\nexport interface MigrationOptions {\n step?: number;\n force?: boolean;\n forceConfirm?: boolean;\n command?: \"up\" | \"down\";\n}\n\nexport async function rollbackMigrations(options: { step?: number } = {}): Promise<void> {\n const { run } = await import(\"./MigrationRunner.js\");\n await run({ command: \"down\", step: options.step || 1 } as any);\n}\n\nexport async function makeMigration(\n name: string,\n options?: { table?: string; alter?: boolean },\n): Promise<void> {\n const args = [\"\", \"\", name];\n if (options?.table) args.push(`--table=${options.table}`);\n if (options?.alter) args.push(\"--alter\");\n process.argv = args;\n await import(\"./MakeMigration.js\");\n}\n","import { ServiceProvider } from \"@lara-node/core\";\nimport { initDatabase, query, getDbType } from \"./connection.js\";\n\nexport class DatabaseServiceProvider extends ServiceProvider {\n register(): void {\n this.container.singleton(\"db\", () => ({ query, getDbType }));\n this.container.alias(\"db\", \"database\");\n }\n\n async boot(): Promise<void> {\n const skip = (process.env.SKIP_DB ?? \"\").toLowerCase();\n if (skip === \"1\" || skip === \"true\") {\n console.warn(\"[DB] SKIP_DB set — skipping database initialization\");\n return;\n }\n try {\n await initDatabase();\n console.log(`[DB] Connected (driver=${getDbType()})`);\n } catch (err: any) {\n console.error(\"[DB] Initialization failed:\", err.message);\n throw err;\n }\n }\n}\n"],"mappings":"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"}