@db-bridge/core 1.0.0 → 1.1.3

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,"sources":["../../src/cli/config.ts","../../src/migrations/MigrationLoader.ts","../../src/schema/dialects/MySQLDialect.ts","../../src/schema/dialects/PostgreSQLDialect.ts","../../src/migrations/MigrationLock.ts","../../src/schema/ColumnBuilder.ts","../../src/schema/TableBuilder.ts","../../src/schema/SchemaBuilder.ts","../../src/migrations/FileMigrationRunner.ts","../../src/cli/utils.ts","../../src/cli/commands/fresh.ts","../../src/cli/commands/latest.ts","../../src/cli/commands/make.ts","../../src/seeds/SeederLoader.ts","../../src/cli/commands/make-seeder.ts","../../src/cli/commands/reset.ts","../../src/cli/commands/rollback.ts","../../src/seeds/SeederRunner.ts","../../src/cli/commands/seed.ts","../../src/cli/commands/status.ts","../../src/cli/commands/validate.ts","../../src/cli/index.ts"],"names":["error","pathToFileURL","resolve","createHash","existsSync","readdir","basename","mkdir","writeFile"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * CLI Configuration\n * Load and validate db-bridge.config.ts\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nexport interface DBBridgeConfig {\n /** Database connection settings */\n connection: {\n dialect: 'mysql' | 'postgresql';\n host: string;\n port: number;\n user: string;\n password: string;\n database: string;\n ssl?: boolean | object;\n };\n\n /** Migration settings */\n migrations?: {\n /** Directory containing migration files */\n directory?: string;\n /** Migration table name */\n tableName?: string;\n /** Lock table name */\n lockTableName?: string;\n };\n\n /** Seed settings */\n seeds?: {\n /** Directory containing seed files */\n directory?: string;\n };\n}\n\n/**\n * Define configuration helper\n */\nexport function defineConfig(config: DBBridgeConfig): DBBridgeConfig {\n return config;\n}\n\n/**\n * Default config file names to search for\n */\nconst CONFIG_FILES = [\n 'db-bridge.config.ts',\n 'db-bridge.config.js',\n 'db-bridge.config.mjs',\n 'dbbridge.config.ts',\n 'dbbridge.config.js',\n];\n\n/**\n * Load configuration from file\n */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<DBBridgeConfig> {\n // Try to find config file\n let configPath: string | null = null;\n\n for (const filename of CONFIG_FILES) {\n const fullPath = resolve(cwd, filename);\n if (existsSync(fullPath)) {\n configPath = fullPath;\n break;\n }\n }\n\n if (!configPath) {\n throw new Error(`Configuration file not found. Create one of: ${CONFIG_FILES.join(', ')}`);\n }\n\n try {\n const fileUrl = pathToFileURL(configPath).href;\n const module = await import(fileUrl);\n const config = module.default || module;\n\n validateConfig(config);\n return applyDefaults(config);\n } catch (error) {\n if ((error as Error).message.includes('Configuration file not found')) {\n throw error;\n }\n throw new Error(`Failed to load config from ${configPath}: ${(error as Error).message}`);\n }\n}\n\n/**\n * Validate configuration\n */\nfunction validateConfig(config: unknown): asserts config is DBBridgeConfig {\n if (!config || typeof config !== 'object') {\n throw new Error('Configuration must be an object');\n }\n\n const cfg = config as Record<string, unknown>;\n const connection = cfg['connection'];\n\n if (!connection || typeof connection !== 'object') {\n throw new Error('Configuration must have a \"connection\" object');\n }\n\n const conn = connection as Record<string, unknown>;\n const dialect = conn['dialect'];\n const host = conn['host'];\n const database = conn['database'];\n\n if (!['mysql', 'postgresql'].includes(dialect as string)) {\n throw new Error('connection.dialect must be \"mysql\" or \"postgresql\"');\n }\n\n if (!host || typeof host !== 'string') {\n throw new Error('connection.host is required');\n }\n\n if (!database || typeof database !== 'string') {\n throw new Error('connection.database is required');\n }\n}\n\n/**\n * Apply default values\n */\nfunction applyDefaults(config: DBBridgeConfig): DBBridgeConfig {\n const defaultPort = config.connection.dialect === 'mysql' ? 3306 : 5432;\n\n return {\n ...config,\n connection: {\n ...config.connection,\n port: config.connection.port ?? defaultPort,\n user: config.connection.user ?? 'root',\n password: config.connection.password ?? '',\n },\n migrations: {\n directory: './src/migrations',\n tableName: 'db_migrations',\n lockTableName: 'db_migrations_lock',\n ...config.migrations,\n },\n seeds: {\n directory: './src/seeds',\n ...config.seeds,\n },\n };\n}\n","/**\n * Migration Loader\n * Loads migration files from a directory\n */\n\nimport { createHash } from 'node:crypto';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { join, basename, extname } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { Migration, MigrationFile } from './types';\n\n/**\n * Migration filename pattern\n * Format: YYYYMMDDHHMMSS_description.ts\n * Example: 20250118120000_create_users_table.ts\n */\nconst MIGRATION_PATTERN = /^(\\d{14})_(.+)\\.(ts|js|mjs)$/;\n\nexport class MigrationLoader {\n private directory: string;\n private extensions: string[];\n\n constructor(directory: string, extensions: string[] = ['.ts', '.js', '.mjs']) {\n this.directory = directory;\n this.extensions = extensions;\n }\n\n /**\n * Scan directory for migration files\n */\n async scanDirectory(): Promise<MigrationFile[]> {\n const files: MigrationFile[] = [];\n\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- directory is user-configured\n const entries = await readdir(this.directory, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile()) {\n continue;\n }\n\n const ext = extname(entry.name);\n if (!this.extensions.includes(ext)) {\n continue;\n }\n\n const match = entry.name.match(MIGRATION_PATTERN);\n if (!match) {\n continue;\n }\n\n const [, timestamp, description] = match;\n files.push({\n name: basename(entry.name, ext),\n path: join(this.directory, entry.name),\n timestamp: timestamp!,\n description: description!.replaceAll('_', ' '),\n });\n }\n\n // Sort by timestamp\n files.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n\n return files;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`Migration directory not found: ${this.directory}`);\n }\n throw error;\n }\n }\n\n /**\n * Load a single migration file\n */\n async loadMigration(file: MigrationFile): Promise<Migration> {\n try {\n // Convert path to file URL for ESM import\n const fileUrl = pathToFileURL(file.path).href;\n const module = await import(fileUrl);\n\n // Support both default export and named exports\n const migration = module.default || module;\n\n // Validate migration structure\n if (typeof migration.up !== 'function') {\n throw new TypeError(`Migration ${file.name} is missing 'up' function`);\n }\n if (typeof migration.down !== 'function') {\n throw new TypeError(`Migration ${file.name} is missing 'down' function`);\n }\n\n return {\n name: file.name,\n up: migration.up,\n down: migration.down,\n transactional: migration.transactional ?? true,\n phase: migration.phase,\n };\n } catch (error) {\n throw new Error(`Failed to load migration ${file.name}: ${(error as Error).message}`);\n }\n }\n\n /**\n * Load all migrations from directory\n */\n async loadAll(): Promise<Migration[]> {\n const files = await this.scanDirectory();\n const migrations: Migration[] = [];\n\n for (const file of files) {\n const migration = await this.loadMigration(file);\n migrations.push(migration);\n }\n\n return migrations;\n }\n\n /**\n * Get migration files (metadata only, without loading)\n */\n async getMigrationFiles(): Promise<MigrationFile[]> {\n return this.scanDirectory();\n }\n\n /**\n * Calculate checksum for a migration file\n */\n async calculateChecksum(file: MigrationFile): Promise<string> {\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- path from scanned directory\n const content = await readFile(file.path, 'utf8');\n // Normalize line endings and trim whitespace for consistent checksums\n const normalized = content.replaceAll('\\r\\n', '\\n').trim();\n return createHash('sha256').update(normalized).digest('hex').slice(0, 16);\n }\n\n /**\n * Calculate checksums for all migration files\n */\n async calculateAllChecksums(): Promise<Map<string, string>> {\n const files = await this.scanDirectory();\n const checksums = new Map<string, string>();\n\n for (const file of files) {\n const checksum = await this.calculateChecksum(file);\n checksums.set(file.name, checksum);\n }\n\n return checksums;\n }\n\n /**\n * Generate a new migration filename\n */\n static generateFilename(description: string): string {\n const now = new Date();\n const timestamp = [\n now.getFullYear(),\n String(now.getMonth() + 1).padStart(2, '0'),\n String(now.getDate()).padStart(2, '0'),\n String(now.getHours()).padStart(2, '0'),\n String(now.getMinutes()).padStart(2, '0'),\n String(now.getSeconds()).padStart(2, '0'),\n ].join('');\n\n const sanitizedDescription = description\n .toLowerCase()\n .replaceAll(/[^\\da-z]+/g, '_')\n .replaceAll(/^_+|_+$/g, '');\n\n return `${timestamp}_${sanitizedDescription}.ts`;\n }\n\n /**\n * Get migration template content\n */\n static getMigrationTemplate(name: string): string {\n return `/**\n * Migration: ${name}\n * Created at: ${new Date().toISOString()}\n */\n\nimport type { SchemaBuilder } from '@db-bridge/core';\n\nexport default {\n name: '${name}',\n\n async up(schema: SchemaBuilder): Promise<void> {\n // Write your migration here\n // Example:\n // await schema.createTable('users', (table) => {\n // table.increments('id');\n // table.string('email', 255).unique().notNull();\n // table.timestamps();\n // });\n },\n\n async down(schema: SchemaBuilder): Promise<void> {\n // Reverse the migration\n // Example:\n // await schema.dropTableIfExists('users');\n },\n};\n`;\n }\n}\n","/**\n * MySQL Dialect\n * SQL generation for MySQL database\n */\n\nimport type {\n AlterTableDefinition,\n ColumnDefinition,\n ForeignKeyDefinition,\n IndexDefinition,\n SchemaDialect,\n TableDefinition,\n} from '../types';\n\nexport class MySQLDialect implements SchemaDialect {\n readonly dialect = 'mysql' as const;\n\n /**\n * Quote an identifier (table/column name)\n */\n quoteIdentifier(name: string): string {\n return `\\`${name.replaceAll('`', '``')}\\``;\n }\n\n /**\n * Quote a value for SQL\n */\n quoteValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n if (typeof value === 'boolean') {\n return value ? '1' : '0';\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'string') {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n return `'${String(value).replaceAll(\"'\", \"''\")}'`;\n }\n\n /**\n * Generate CREATE TABLE statement\n */\n createTable(definition: TableDefinition): string {\n const parts: string[] = [];\n\n // Columns\n for (const column of definition.columns) {\n parts.push(this.columnToSQL(column));\n }\n\n // Primary key (if composite or not defined in column)\n if (definition.primaryKey && definition.primaryKey.length > 0) {\n const pkColumns = definition.primaryKey.map((c) => this.quoteIdentifier(c)).join(', ');\n parts.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n // Indexes\n for (const index of definition.indexes) {\n parts.push(this.indexToSQL(index));\n }\n\n // Foreign keys\n for (const fk of definition.foreignKeys) {\n parts.push(this.foreignKeyToSQL(fk));\n }\n\n let sql = `CREATE TABLE ${this.quoteIdentifier(definition.name)} (\\n ${parts.join(',\\n ')}\\n)`;\n\n // Table options\n const options: string[] = [];\n if (definition.engine) {\n options.push(`ENGINE=${definition.engine}`);\n } else {\n options.push('ENGINE=InnoDB');\n }\n if (definition.charset) {\n options.push(`DEFAULT CHARSET=${definition.charset}`);\n } else {\n options.push('DEFAULT CHARSET=utf8mb4');\n }\n if (definition.collation) {\n options.push(`COLLATE=${definition.collation}`);\n }\n if (definition.comment) {\n options.push(`COMMENT=${this.quoteValue(definition.comment)}`);\n }\n\n if (options.length > 0) {\n sql += ` ${options.join(' ')}`;\n }\n\n return sql;\n }\n\n /**\n * Generate DROP TABLE statement\n */\n dropTable(tableName: string): string {\n return `DROP TABLE ${this.quoteIdentifier(tableName)}`;\n }\n\n /**\n * Generate DROP TABLE IF EXISTS statement\n */\n dropTableIfExists(tableName: string): string {\n return `DROP TABLE IF EXISTS ${this.quoteIdentifier(tableName)}`;\n }\n\n /**\n * Generate RENAME TABLE statement\n */\n renameTable(from: string, to: string): string {\n return `RENAME TABLE ${this.quoteIdentifier(from)} TO ${this.quoteIdentifier(to)}`;\n }\n\n /**\n * Generate ALTER TABLE statements\n */\n alterTable(definition: AlterTableDefinition): string[] {\n const statements: string[] = [];\n const tableName = this.quoteIdentifier(definition.tableName);\n\n for (const op of definition.operations) {\n switch (op.type) {\n case 'addColumn': {\n statements.push(`ALTER TABLE ${tableName} ADD COLUMN ${this.columnToSQL(op.column)}`);\n break;\n }\n\n case 'dropColumn': {\n statements.push(`ALTER TABLE ${tableName} DROP COLUMN ${this.quoteIdentifier(op.name)}`);\n break;\n }\n\n case 'renameColumn': {\n statements.push(\n `ALTER TABLE ${tableName} RENAME COLUMN ${this.quoteIdentifier(op.from)} TO ${this.quoteIdentifier(op.to)}`,\n );\n break;\n }\n\n case 'modifyColumn': {\n statements.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${this.columnToSQL(op.column)}`);\n break;\n }\n\n case 'addIndex': {\n statements.push(`ALTER TABLE ${tableName} ADD ${this.indexToSQL(op.index)}`);\n break;\n }\n\n case 'dropIndex': {\n statements.push(`ALTER TABLE ${tableName} DROP INDEX ${this.quoteIdentifier(op.name)}`);\n break;\n }\n\n case 'addForeignKey': {\n statements.push(`ALTER TABLE ${tableName} ADD ${this.foreignKeyToSQL(op.foreignKey)}`);\n break;\n }\n\n case 'dropForeignKey': {\n statements.push(\n `ALTER TABLE ${tableName} DROP FOREIGN KEY ${this.quoteIdentifier(op.name)}`,\n );\n break;\n }\n\n case 'addPrimary': {\n const pkCols = op.columns.map((c) => this.quoteIdentifier(c)).join(', ');\n statements.push(`ALTER TABLE ${tableName} ADD PRIMARY KEY (${pkCols})`);\n break;\n }\n\n case 'dropPrimary': {\n statements.push(`ALTER TABLE ${tableName} DROP PRIMARY KEY`);\n break;\n }\n }\n }\n\n return statements;\n }\n\n /**\n * Generate query to check if table exists\n */\n hasTable(tableName: string): string {\n return `SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ${this.quoteValue(tableName)} LIMIT 1`;\n }\n\n /**\n * Generate query to check if column exists\n */\n hasColumn(tableName: string, columnName: string): string {\n return `SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ${this.quoteValue(tableName)} AND column_name = ${this.quoteValue(columnName)} LIMIT 1`;\n }\n\n /**\n * Convert column definition to SQL\n */\n private columnToSQL(column: ColumnDefinition): string {\n const parts: string[] = [this.quoteIdentifier(column.name)];\n\n // Type\n parts.push(this.columnTypeToSQL(column));\n\n // Unsigned\n if (column.unsigned) {\n parts.push('UNSIGNED');\n }\n\n // Nullable\n if (column.nullable) {\n parts.push('NULL');\n } else {\n parts.push('NOT NULL');\n }\n\n // Default value\n if (column.defaultRaw) {\n parts.push(`DEFAULT ${column.defaultRaw}`);\n } else if (column.defaultValue !== undefined) {\n parts.push(`DEFAULT ${this.quoteValue(column.defaultValue)}`);\n }\n\n // Auto increment\n if (column.autoIncrement) {\n parts.push('AUTO_INCREMENT');\n }\n\n // Primary key (inline)\n if (column.primary && !column.autoIncrement) {\n parts.push('PRIMARY KEY');\n } else if (column.primary && column.autoIncrement) {\n parts.push('PRIMARY KEY');\n }\n\n // Unique (inline)\n if (column.unique && !column.primary) {\n parts.push('UNIQUE');\n }\n\n // Comment\n if (column.comment) {\n parts.push(`COMMENT ${this.quoteValue(column.comment)}`);\n }\n\n // Position\n if (column.first) {\n parts.push('FIRST');\n } else if (column.after) {\n parts.push(`AFTER ${this.quoteIdentifier(column.after)}`);\n }\n\n return parts.join(' ');\n }\n\n /**\n * Convert column type to MySQL type\n */\n private columnTypeToSQL(column: ColumnDefinition): string {\n switch (column.type) {\n case 'increments': {\n return 'INT UNSIGNED AUTO_INCREMENT';\n }\n case 'bigIncrements': {\n return 'BIGINT UNSIGNED AUTO_INCREMENT';\n }\n case 'integer': {\n return 'INT';\n }\n case 'bigInteger': {\n return 'BIGINT';\n }\n case 'smallInteger': {\n return 'SMALLINT';\n }\n case 'tinyInteger': {\n return 'TINYINT';\n }\n case 'float': {\n return 'FLOAT';\n }\n case 'double': {\n return 'DOUBLE';\n }\n case 'decimal': {\n const precision = column.precision ?? 10;\n const scale = column.scale ?? 2;\n return `DECIMAL(${precision},${scale})`;\n }\n case 'string': {\n return `VARCHAR(${column.length ?? 255})`;\n }\n case 'text': {\n return 'TEXT';\n }\n case 'mediumText': {\n return 'MEDIUMTEXT';\n }\n case 'longText': {\n return 'LONGTEXT';\n }\n case 'boolean': {\n return 'TINYINT(1)';\n }\n case 'date': {\n return 'DATE';\n }\n case 'datetime': {\n return 'DATETIME';\n }\n case 'timestamp': {\n return 'TIMESTAMP';\n }\n case 'time': {\n return 'TIME';\n }\n case 'json':\n case 'jsonb': {\n return 'JSON';\n }\n case 'uuid': {\n return 'CHAR(36)';\n }\n case 'binary': {\n return 'BLOB';\n }\n case 'enum': {\n if (column.enumValues && column.enumValues.length > 0) {\n const values = column.enumValues.map((v) => this.quoteValue(v)).join(', ');\n return `ENUM(${values})`;\n }\n return 'VARCHAR(255)';\n }\n default: {\n return 'VARCHAR(255)';\n }\n }\n }\n\n /**\n * Convert index definition to SQL\n */\n private indexToSQL(index: IndexDefinition): string {\n const columns = index.columns.map((c) => this.quoteIdentifier(c)).join(', ');\n const name = index.name ? this.quoteIdentifier(index.name) : '';\n\n if (index.type === 'fulltext') {\n return `FULLTEXT INDEX ${name} (${columns})`;\n }\n\n if (index.unique) {\n return `UNIQUE INDEX ${name} (${columns})`;\n }\n\n return `INDEX ${name} (${columns})`;\n }\n\n /**\n * Convert foreign key definition to SQL\n */\n private foreignKeyToSQL(fk: ForeignKeyDefinition): string {\n const parts: string[] = ['CONSTRAINT'];\n\n if (fk.name) {\n parts.push(this.quoteIdentifier(fk.name));\n }\n\n parts.push(`FOREIGN KEY (${this.quoteIdentifier(fk.column)})`);\n parts.push(\n `REFERENCES ${this.quoteIdentifier(fk.table)} (${this.quoteIdentifier(fk.referenceColumn)})`,\n );\n\n if (fk.onDelete) {\n parts.push(`ON DELETE ${fk.onDelete}`);\n }\n\n if (fk.onUpdate) {\n parts.push(`ON UPDATE ${fk.onUpdate}`);\n }\n\n return parts.join(' ');\n }\n}\n","/**\n * PostgreSQL Dialect\n * SQL generation for PostgreSQL database\n */\n\nimport type {\n AlterTableDefinition,\n ColumnDefinition,\n ForeignKeyDefinition,\n IndexDefinition,\n SchemaDialect,\n TableDefinition,\n} from '../types';\n\nexport class PostgreSQLDialect implements SchemaDialect {\n readonly dialect = 'postgresql' as const;\n\n /**\n * Quote an identifier (table/column name)\n */\n quoteIdentifier(name: string): string {\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n }\n\n /**\n * Quote a value for SQL\n */\n quoteValue(value: unknown): string {\n if (value === null || value === undefined) {\n return 'NULL';\n }\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'string') {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n return `'${String(value).replaceAll(\"'\", \"''\")}'`;\n }\n\n /**\n * Generate CREATE TABLE statement\n */\n createTable(definition: TableDefinition): string {\n const parts: string[] = [];\n\n // Columns\n for (const column of definition.columns) {\n parts.push(this.columnToSQL(column));\n }\n\n // Primary key (if composite or not defined in column)\n if (definition.primaryKey && definition.primaryKey.length > 0) {\n const pkColumns = definition.primaryKey.map((c) => this.quoteIdentifier(c)).join(', ');\n parts.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n // Foreign keys (inline in CREATE TABLE)\n for (const fk of definition.foreignKeys) {\n parts.push(this.foreignKeyToSQL(fk));\n }\n\n const sql = `CREATE TABLE ${this.quoteIdentifier(definition.name)} (\\n ${parts.join(',\\n ')}\\n)`;\n\n // Table comment (separate statement in PostgreSQL)\n const statements = [sql];\n if (definition.comment) {\n statements.push(\n `COMMENT ON TABLE ${this.quoteIdentifier(definition.name)} IS ${this.quoteValue(definition.comment)}`,\n );\n }\n\n // Note: Indexes are created separately in PostgreSQL\n // This is handled by the SchemaBuilder\n\n return statements.join(';\\n');\n }\n\n /**\n * Generate DROP TABLE statement\n */\n dropTable(tableName: string): string {\n return `DROP TABLE ${this.quoteIdentifier(tableName)}`;\n }\n\n /**\n * Generate DROP TABLE IF EXISTS statement\n */\n dropTableIfExists(tableName: string): string {\n return `DROP TABLE IF EXISTS ${this.quoteIdentifier(tableName)}`;\n }\n\n /**\n * Generate ALTER TABLE ... RENAME statement\n */\n renameTable(from: string, to: string): string {\n return `ALTER TABLE ${this.quoteIdentifier(from)} RENAME TO ${this.quoteIdentifier(to)}`;\n }\n\n /**\n * Generate ALTER TABLE statements\n */\n alterTable(definition: AlterTableDefinition): string[] {\n const statements: string[] = [];\n const tableName = this.quoteIdentifier(definition.tableName);\n\n for (const op of definition.operations) {\n switch (op.type) {\n case 'addColumn': {\n statements.push(`ALTER TABLE ${tableName} ADD COLUMN ${this.columnToSQL(op.column)}`);\n break;\n }\n\n case 'dropColumn': {\n statements.push(`ALTER TABLE ${tableName} DROP COLUMN ${this.quoteIdentifier(op.name)}`);\n break;\n }\n\n case 'renameColumn': {\n statements.push(\n `ALTER TABLE ${tableName} RENAME COLUMN ${this.quoteIdentifier(op.from)} TO ${this.quoteIdentifier(op.to)}`,\n );\n break;\n }\n\n case 'modifyColumn': {\n // PostgreSQL requires separate ALTER statements for each modification\n const col = op.column;\n\n // Change type\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} TYPE ${this.columnTypeToSQL(col)}`,\n );\n\n // Change nullable\n if (col.nullable) {\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} DROP NOT NULL`,\n );\n } else {\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} SET NOT NULL`,\n );\n }\n\n // Change default\n if (col.defaultRaw) {\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} SET DEFAULT ${col.defaultRaw}`,\n );\n } else if (col.defaultValue !== undefined) {\n statements.push(\n `ALTER TABLE ${tableName} ALTER COLUMN ${this.quoteIdentifier(col.name)} SET DEFAULT ${this.quoteValue(col.defaultValue)}`,\n );\n }\n break;\n }\n\n case 'addIndex': {\n statements.push(this.createIndex(definition.tableName, op.index));\n break;\n }\n\n case 'dropIndex': {\n statements.push(`DROP INDEX ${this.quoteIdentifier(op.name)}`);\n break;\n }\n\n case 'addForeignKey': {\n statements.push(`ALTER TABLE ${tableName} ADD ${this.foreignKeyToSQL(op.foreignKey)}`);\n break;\n }\n\n case 'dropForeignKey': {\n statements.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT ${this.quoteIdentifier(op.name)}`,\n );\n break;\n }\n\n case 'addPrimary': {\n const pkCols = op.columns.map((c) => this.quoteIdentifier(c)).join(', ');\n statements.push(`ALTER TABLE ${tableName} ADD PRIMARY KEY (${pkCols})`);\n break;\n }\n\n case 'dropPrimary': {\n // PostgreSQL requires knowing the constraint name\n statements.push(\n `ALTER TABLE ${tableName} DROP CONSTRAINT ${this.quoteIdentifier(`${definition.tableName}_pkey`)}`,\n );\n break;\n }\n }\n }\n\n return statements;\n }\n\n /**\n * Generate query to check if table exists\n */\n hasTable(tableName: string): string {\n return `SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = ${this.quoteValue(tableName)} LIMIT 1`;\n }\n\n /**\n * Generate query to check if column exists\n */\n hasColumn(tableName: string, columnName: string): string {\n return `SELECT 1 FROM information_schema.columns WHERE table_schema = 'public' AND table_name = ${this.quoteValue(tableName)} AND column_name = ${this.quoteValue(columnName)} LIMIT 1`;\n }\n\n /**\n * Create index statement\n */\n createIndex(tableName: string, index: IndexDefinition): string {\n const columns = index.columns.map((c) => this.quoteIdentifier(c)).join(', ');\n const indexName = index.name || `idx_${tableName}_${index.columns.join('_')}`;\n const unique = index.unique ? 'UNIQUE ' : '';\n\n return `CREATE ${unique}INDEX ${this.quoteIdentifier(indexName)} ON ${this.quoteIdentifier(tableName)} (${columns})`;\n }\n\n /**\n * Convert column definition to SQL\n */\n private columnToSQL(column: ColumnDefinition): string {\n const parts: string[] = [this.quoteIdentifier(column.name)];\n\n // Type\n parts.push(this.columnTypeToSQL(column));\n\n // Nullable\n if (!column.nullable) {\n parts.push('NOT NULL');\n }\n\n // Default value\n if (column.defaultRaw) {\n parts.push(`DEFAULT ${column.defaultRaw}`);\n } else if (column.defaultValue !== undefined) {\n parts.push(`DEFAULT ${this.quoteValue(column.defaultValue)}`);\n }\n\n // Primary key (inline)\n if (column.primary && column.type !== 'increments' && column.type !== 'bigIncrements') {\n parts.push('PRIMARY KEY');\n }\n\n // Unique (inline)\n if (column.unique && !column.primary) {\n parts.push('UNIQUE');\n }\n\n return parts.join(' ');\n }\n\n /**\n * Convert column type to PostgreSQL type\n */\n private columnTypeToSQL(column: ColumnDefinition): string {\n switch (column.type) {\n case 'increments': {\n return 'SERIAL PRIMARY KEY';\n }\n case 'bigIncrements': {\n return 'BIGSERIAL PRIMARY KEY';\n }\n case 'integer': {\n return 'INTEGER';\n }\n case 'bigInteger': {\n return 'BIGINT';\n }\n case 'smallInteger': {\n return 'SMALLINT';\n }\n case 'tinyInteger': {\n return 'SMALLINT';\n } // PostgreSQL doesn't have TINYINT\n case 'float': {\n return 'REAL';\n }\n case 'double': {\n return 'DOUBLE PRECISION';\n }\n case 'decimal': {\n const precision = column.precision ?? 10;\n const scale = column.scale ?? 2;\n return `NUMERIC(${precision},${scale})`;\n }\n case 'string': {\n return `VARCHAR(${column.length ?? 255})`;\n }\n case 'text':\n case 'mediumText':\n case 'longText': {\n return 'TEXT';\n }\n case 'boolean': {\n return 'BOOLEAN';\n }\n case 'date': {\n return 'DATE';\n }\n case 'datetime':\n case 'timestamp': {\n return 'TIMESTAMP';\n }\n case 'time': {\n return 'TIME';\n }\n case 'json': {\n return 'JSON';\n }\n case 'jsonb': {\n return 'JSONB';\n }\n case 'uuid': {\n return 'UUID';\n }\n case 'binary': {\n return 'BYTEA';\n }\n case 'enum': {\n // PostgreSQL uses VARCHAR with CHECK constraint for enums\n // or custom ENUM types (more complex)\n if (column.enumValues && column.enumValues.length > 0) {\n const values = column.enumValues.map((v) => this.quoteValue(v)).join(', ');\n return `VARCHAR(255) CHECK (${this.quoteIdentifier(column.name)} IN (${values}))`;\n }\n return 'VARCHAR(255)';\n }\n default: {\n return 'VARCHAR(255)';\n }\n }\n }\n\n /**\n * Convert foreign key definition to SQL\n */\n private foreignKeyToSQL(fk: ForeignKeyDefinition): string {\n const parts: string[] = ['CONSTRAINT'];\n\n if (fk.name) {\n parts.push(this.quoteIdentifier(fk.name));\n } else {\n parts.push(this.quoteIdentifier(`fk_${fk.column}_${fk.table}`));\n }\n\n parts.push(`FOREIGN KEY (${this.quoteIdentifier(fk.column)})`);\n parts.push(\n `REFERENCES ${this.quoteIdentifier(fk.table)} (${this.quoteIdentifier(fk.referenceColumn)})`,\n );\n\n if (fk.onDelete) {\n parts.push(`ON DELETE ${fk.onDelete}`);\n }\n\n if (fk.onUpdate) {\n parts.push(`ON UPDATE ${fk.onUpdate}`);\n }\n\n return parts.join(' ');\n }\n}\n","/**\n * Migration Lock\n * Prevents concurrent migration execution\n */\n\nimport { hostname } from 'node:os';\n\nimport { MySQLDialect } from '../schema/dialects/MySQLDialect';\nimport { PostgreSQLDialect } from '../schema/dialects/PostgreSQLDialect';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { SchemaDialect } from '../schema/types';\n\nexport interface MigrationLockOptions {\n tableName?: string;\n timeout?: number;\n dialect: 'mysql' | 'postgresql';\n}\n\nexport class MigrationLock {\n private adapter: DatabaseAdapter;\n private tableName: string;\n private timeout: number;\n private dialect: SchemaDialect;\n private lockId: string;\n private isLocked: boolean = false;\n\n constructor(adapter: DatabaseAdapter, options: MigrationLockOptions) {\n this.adapter = adapter;\n this.tableName = options.tableName ?? 'db_migrations_lock';\n this.timeout = options.timeout ?? 60000; // 60 seconds\n this.lockId = `${hostname()}_${process.pid}_${Date.now()}`;\n\n this.dialect = options.dialect === 'mysql' ? new MySQLDialect() : new PostgreSQLDialect();\n }\n\n /**\n * Initialize the lock table\n */\n async initialize(): Promise<void> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n\n if (this.dialect.dialect === 'mysql') {\n await this.adapter.execute(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id INT PRIMARY KEY,\n is_locked TINYINT NOT NULL DEFAULT 0,\n locked_at TIMESTAMP NULL,\n locked_by VARCHAR(255) NULL\n ) ENGINE=InnoDB\n `);\n } else {\n await this.adapter.execute(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id INT PRIMARY KEY,\n is_locked BOOLEAN NOT NULL DEFAULT FALSE,\n locked_at TIMESTAMP NULL,\n locked_by VARCHAR(255) NULL\n )\n `);\n }\n\n // Insert initial row if not exists\n const checkSql =\n this.dialect.dialect === 'mysql'\n ? `SELECT 1 FROM ${tableName} WHERE id = 1`\n : `SELECT 1 FROM ${tableName} WHERE id = 1`;\n\n const result = await this.adapter.query(checkSql);\n\n if (result.rows.length === 0) {\n if (this.dialect.dialect === 'mysql') {\n await this.adapter.execute(`INSERT INTO ${tableName} (id, is_locked) VALUES (1, 0)`);\n } else {\n await this.adapter.execute(`INSERT INTO ${tableName} (id, is_locked) VALUES (1, FALSE)`);\n }\n }\n }\n\n /**\n * Acquire the migration lock\n */\n async acquire(): Promise<boolean> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n const startTime = Date.now();\n\n while (Date.now() - startTime < this.timeout) {\n try {\n // Try to acquire lock with atomic update\n if (this.dialect.dialect === 'mysql') {\n const result = await this.adapter.execute(\n `\n UPDATE ${tableName}\n SET is_locked = 1,\n locked_at = NOW(),\n locked_by = ?\n WHERE id = 1 AND is_locked = 0\n `,\n [this.lockId],\n );\n\n if ((result.affectedRows ?? 0) > 0) {\n this.isLocked = true;\n return true;\n }\n } else {\n const result = await this.adapter.execute(\n `\n UPDATE ${tableName}\n SET is_locked = TRUE,\n locked_at = NOW(),\n locked_by = $1\n WHERE id = 1 AND is_locked = FALSE\n RETURNING id\n `,\n [this.lockId],\n );\n\n if (result.rows.length > 0) {\n this.isLocked = true;\n return true;\n }\n }\n\n // Check if lock is stale (held for more than timeout)\n const staleResult = await this.adapter.query<{\n locked_at: Date;\n locked_by: string;\n }>(`SELECT locked_at, locked_by FROM ${tableName} WHERE id = 1`);\n\n if (staleResult.rows.length > 0) {\n const lockedAt = staleResult.rows[0]!.locked_at;\n if (lockedAt && Date.now() - new Date(lockedAt).getTime() > this.timeout) {\n // Force release stale lock\n console.warn(\n `Releasing stale migration lock held by ${staleResult.rows[0]!.locked_by}`,\n );\n await this.forceRelease();\n continue;\n }\n }\n\n // Wait before retrying\n await this.sleep(1000);\n } catch (error) {\n console.error('Error acquiring migration lock:', error);\n throw error;\n }\n }\n\n return false;\n }\n\n /**\n * Release the migration lock\n */\n async release(): Promise<void> {\n if (!this.isLocked) {\n return;\n }\n\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n\n try {\n if (this.dialect.dialect === 'mysql') {\n await this.adapter.execute(\n `\n UPDATE ${tableName}\n SET is_locked = 0,\n locked_at = NULL,\n locked_by = NULL\n WHERE id = 1 AND locked_by = ?\n `,\n [this.lockId],\n );\n } else {\n await this.adapter.execute(\n `\n UPDATE ${tableName}\n SET is_locked = FALSE,\n locked_at = NULL,\n locked_by = NULL\n WHERE id = 1 AND locked_by = $1\n `,\n [this.lockId],\n );\n }\n\n this.isLocked = false;\n } catch (error) {\n console.error('Error releasing migration lock:', error);\n throw error;\n }\n }\n\n /**\n * Force release the lock (for stale locks)\n */\n async forceRelease(): Promise<void> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n\n if (this.dialect.dialect === 'mysql') {\n await this.adapter.execute(`\n UPDATE ${tableName}\n SET is_locked = 0,\n locked_at = NULL,\n locked_by = NULL\n WHERE id = 1\n `);\n } else {\n await this.adapter.execute(`\n UPDATE ${tableName}\n SET is_locked = FALSE,\n locked_at = NULL,\n locked_by = NULL\n WHERE id = 1\n `);\n }\n\n this.isLocked = false;\n }\n\n /**\n * Check if lock is currently held\n */\n async isHeld(): Promise<boolean> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n const result = await this.adapter.query<{ is_locked: number | boolean }>(\n `SELECT is_locked FROM ${tableName} WHERE id = 1`,\n );\n\n if (result.rows.length === 0) {\n return false;\n }\n\n const isLocked = result.rows[0]!.is_locked;\n return isLocked === 1 || isLocked === true;\n }\n\n /**\n * Get lock info\n */\n async getLockInfo(): Promise<{\n isLocked: boolean;\n lockedAt: Date | null;\n lockedBy: string | null;\n }> {\n const tableName = this.dialect.quoteIdentifier(this.tableName);\n const result = await this.adapter.query<{\n is_locked: number | boolean;\n locked_at: Date | null;\n locked_by: string | null;\n }>(`SELECT is_locked, locked_at, locked_by FROM ${tableName} WHERE id = 1`);\n\n if (result.rows.length === 0) {\n return { isLocked: false, lockedAt: null, lockedBy: null };\n }\n\n const row = result.rows[0]!;\n return {\n isLocked: row.is_locked === 1 || row.is_locked === true,\n lockedAt: row.locked_at,\n lockedBy: row.locked_by,\n };\n }\n\n /**\n * Execute a function with lock\n */\n async withLock<T>(fn: () => Promise<T>): Promise<T> {\n const acquired = await this.acquire();\n if (!acquired) {\n throw new Error(\n `Could not acquire migration lock within ${this.timeout}ms. Another migration may be running.`,\n );\n }\n\n try {\n return await fn();\n } finally {\n await this.release();\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * Column Builder\n * Fluent API for defining table columns\n */\n\nimport type { ColumnDefinition, ColumnType, ForeignKeyAction, ForeignKeyDefinition } from './types';\n\nexport class ColumnBuilder {\n private definition: ColumnDefinition;\n\n constructor(name: string, type: ColumnType) {\n this.definition = {\n name,\n type,\n nullable: type !== 'increments' && type !== 'bigIncrements',\n unsigned: false,\n autoIncrement: type === 'increments' || type === 'bigIncrements',\n primary: type === 'increments' || type === 'bigIncrements',\n unique: false,\n index: false,\n first: false,\n };\n }\n\n /**\n * Set column length (for string types)\n */\n length(length: number): this {\n this.definition.length = length;\n return this;\n }\n\n /**\n * Set precision and scale (for decimal types)\n */\n precision(precision: number, scale?: number): this {\n this.definition.precision = precision;\n this.definition.scale = scale;\n return this;\n }\n\n /**\n * Mark column as nullable\n */\n nullable(): this {\n this.definition.nullable = true;\n return this;\n }\n\n /**\n * Mark column as not nullable\n */\n notNull(): this {\n this.definition.nullable = false;\n return this;\n }\n\n /**\n * Alias for notNull()\n */\n notNullable(): this {\n return this.notNull();\n }\n\n /**\n * Set default value\n */\n default(value: unknown): this {\n this.definition.defaultValue = value;\n return this;\n }\n\n /**\n * Set default value as raw SQL\n */\n defaultRaw(sql: string): this {\n this.definition.defaultRaw = sql;\n return this;\n }\n\n /**\n * Set default to current timestamp\n */\n defaultNow(): this {\n this.definition.defaultRaw = 'CURRENT_TIMESTAMP';\n return this;\n }\n\n /**\n * Mark column as unsigned (MySQL)\n */\n unsigned(): this {\n this.definition.unsigned = true;\n return this;\n }\n\n /**\n * Mark column as auto increment\n */\n autoIncrement(): this {\n this.definition.autoIncrement = true;\n return this;\n }\n\n /**\n * Mark column as primary key\n */\n primary(): this {\n this.definition.primary = true;\n return this;\n }\n\n /**\n * Mark column as unique\n */\n unique(): this {\n this.definition.unique = true;\n return this;\n }\n\n /**\n * Add index to column\n */\n index(): this {\n this.definition.index = true;\n return this;\n }\n\n /**\n * Add comment to column\n */\n comment(comment: string): this {\n this.definition.comment = comment;\n return this;\n }\n\n /**\n * Position column after another column (MySQL)\n */\n after(columnName: string): this {\n this.definition.after = columnName;\n return this;\n }\n\n /**\n * Position column first (MySQL)\n */\n first(): this {\n this.definition.first = true;\n return this;\n }\n\n /**\n * Set enum values\n */\n values(values: string[]): this {\n this.definition.enumValues = values;\n return this;\n }\n\n /**\n * Add foreign key reference\n */\n references(column: string): ForeignKeyBuilder {\n const fkBuilder = new ForeignKeyBuilder(this, column);\n return fkBuilder;\n }\n\n /**\n * Set foreign key definition (internal)\n */\n setForeignKey(fk: ForeignKeyDefinition): void {\n this.definition.references = fk;\n }\n\n /**\n * Get the column definition\n */\n getDefinition(): ColumnDefinition {\n return { ...this.definition };\n }\n}\n\n/**\n * Foreign Key Builder\n * Fluent API for defining foreign key constraints\n */\nexport class ForeignKeyBuilder {\n private columnBuilder: ColumnBuilder;\n private fkDefinition: Partial<ForeignKeyDefinition>;\n\n constructor(columnBuilder: ColumnBuilder, referenceColumn: string) {\n this.columnBuilder = columnBuilder;\n this.fkDefinition = {\n column: columnBuilder.getDefinition().name,\n referenceColumn,\n };\n }\n\n /**\n * Set the referenced table\n */\n on(tableName: string): this {\n this.fkDefinition.table = tableName;\n this.applyToColumn();\n return this;\n }\n\n /**\n * Alias for on()\n */\n inTable(tableName: string): this {\n return this.on(tableName);\n }\n\n /**\n * Set ON DELETE action\n */\n onDelete(action: ForeignKeyAction): this {\n this.fkDefinition.onDelete = action;\n this.applyToColumn();\n return this;\n }\n\n /**\n * Set ON UPDATE action\n */\n onUpdate(action: ForeignKeyAction): this {\n this.fkDefinition.onUpdate = action;\n this.applyToColumn();\n return this;\n }\n\n /**\n * Set constraint name\n */\n name(name: string): this {\n this.fkDefinition.name = name;\n this.applyToColumn();\n return this;\n }\n\n /**\n * Apply the foreign key definition to the column\n */\n private applyToColumn(): void {\n if (this.fkDefinition.table && this.fkDefinition.referenceColumn) {\n this.columnBuilder.setForeignKey(this.fkDefinition as ForeignKeyDefinition);\n }\n }\n\n /**\n * Get the column builder for chaining\n */\n getColumnBuilder(): ColumnBuilder {\n return this.columnBuilder;\n }\n}\n","/**\n * Table Builder\n * Fluent API for defining table structure\n */\n\nimport { ColumnBuilder } from './ColumnBuilder';\n\nimport type {\n ColumnDefinition,\n ForeignKeyDefinition,\n IndexDefinition,\n TableDefinition,\n ForeignKeyAction,\n} from './types';\n\nexport class TableBuilder {\n private tableName: string;\n private columns: ColumnDefinition[] = [];\n private indexes: IndexDefinition[] = [];\n private foreignKeys: ForeignKeyDefinition[] = [];\n private primaryKeyColumns?: string[];\n private tableEngine?: string;\n private tableCharset?: string;\n private tableCollation?: string;\n private tableComment?: string;\n\n constructor(tableName: string) {\n this.tableName = tableName;\n }\n\n // ============================================\n // Column Types\n // ============================================\n\n /**\n * Auto-incrementing integer primary key\n */\n increments(name: string = 'id'): ColumnBuilder {\n return this.addColumn(name, 'increments');\n }\n\n /**\n * Auto-incrementing big integer primary key\n */\n bigIncrements(name: string = 'id'): ColumnBuilder {\n return this.addColumn(name, 'bigIncrements');\n }\n\n /**\n * Integer column\n */\n integer(name: string): ColumnBuilder {\n return this.addColumn(name, 'integer');\n }\n\n /**\n * Big integer column\n */\n bigInteger(name: string): ColumnBuilder {\n return this.addColumn(name, 'bigInteger');\n }\n\n /**\n * Small integer column\n */\n smallInteger(name: string): ColumnBuilder {\n return this.addColumn(name, 'smallInteger');\n }\n\n /**\n * Tiny integer column\n */\n tinyInteger(name: string): ColumnBuilder {\n return this.addColumn(name, 'tinyInteger');\n }\n\n /**\n * Float column\n */\n float(name: string): ColumnBuilder {\n return this.addColumn(name, 'float');\n }\n\n /**\n * Double column\n */\n double(name: string): ColumnBuilder {\n return this.addColumn(name, 'double');\n }\n\n /**\n * Decimal column\n */\n decimal(name: string, precision: number = 10, scale: number = 2): ColumnBuilder {\n return this.addColumn(name, 'decimal').precision(precision, scale);\n }\n\n /**\n * String (VARCHAR) column\n */\n string(name: string, length: number = 255): ColumnBuilder {\n return this.addColumn(name, 'string').length(length);\n }\n\n /**\n * Text column\n */\n text(name: string): ColumnBuilder {\n return this.addColumn(name, 'text');\n }\n\n /**\n * Medium text column\n */\n mediumText(name: string): ColumnBuilder {\n return this.addColumn(name, 'mediumText');\n }\n\n /**\n * Long text column\n */\n longText(name: string): ColumnBuilder {\n return this.addColumn(name, 'longText');\n }\n\n /**\n * Boolean column\n */\n boolean(name: string): ColumnBuilder {\n return this.addColumn(name, 'boolean');\n }\n\n /**\n * Date column\n */\n date(name: string): ColumnBuilder {\n return this.addColumn(name, 'date');\n }\n\n /**\n * Datetime column\n */\n datetime(name: string): ColumnBuilder {\n return this.addColumn(name, 'datetime');\n }\n\n /**\n * Timestamp column\n */\n timestamp(name: string): ColumnBuilder {\n return this.addColumn(name, 'timestamp');\n }\n\n /**\n * Time column\n */\n time(name: string): ColumnBuilder {\n return this.addColumn(name, 'time');\n }\n\n /**\n * JSON column\n */\n json(name: string): ColumnBuilder {\n return this.addColumn(name, 'json');\n }\n\n /**\n * JSONB column (PostgreSQL)\n */\n jsonb(name: string): ColumnBuilder {\n return this.addColumn(name, 'jsonb');\n }\n\n /**\n * UUID column\n */\n uuid(name: string): ColumnBuilder {\n return this.addColumn(name, 'uuid');\n }\n\n /**\n * Binary column\n */\n binary(name: string): ColumnBuilder {\n return this.addColumn(name, 'binary');\n }\n\n /**\n * Enum column\n */\n enum(name: string, values: string[]): ColumnBuilder {\n return this.addColumn(name, 'enum').values(values);\n }\n\n // ============================================\n // Shortcut Methods\n // ============================================\n\n /**\n * Add created_at and updated_at timestamp columns\n */\n timestamps(): void {\n this.timestamp('created_at').notNull().defaultNow();\n this.timestamp('updated_at').notNull().defaultNow();\n }\n\n /**\n * Add deleted_at timestamp column for soft deletes\n */\n softDeletes(): ColumnBuilder {\n return this.timestamp('deleted_at').nullable();\n }\n\n /**\n * Add foreign id column with foreign key\n */\n foreignId(name: string): ColumnBuilder {\n // Extract table name from column name (e.g., user_id -> users)\n const tableName = `${name.replace(/_id$/, '')}s`;\n const column = this.integer(name).unsigned().notNull();\n // Add foreign key separately\n this.foreign(name).references('id').on(tableName);\n return column;\n }\n\n /**\n * Add UUID primary key column\n */\n uuidPrimary(name: string = 'id'): ColumnBuilder {\n return this.uuid(name).primary().notNull();\n }\n\n // ============================================\n // Indexes\n // ============================================\n\n /**\n * Add an index\n */\n index(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({\n name: name || `idx_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: false,\n });\n return this;\n }\n\n /**\n * Add a unique index\n */\n unique(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({\n name: name || `uniq_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: true,\n });\n return this;\n }\n\n /**\n * Add a fulltext index (MySQL)\n */\n fulltext(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.indexes.push({\n name: name || `ft_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: false,\n type: 'fulltext',\n });\n return this;\n }\n\n /**\n * Set primary key columns\n */\n primary(columns: string | string[]): this {\n this.primaryKeyColumns = Array.isArray(columns) ? columns : [columns];\n return this;\n }\n\n // ============================================\n // Foreign Keys\n // ============================================\n\n /**\n * Add a foreign key constraint\n */\n foreign(column: string): ForeignKeyChain {\n return new ForeignKeyChain(this, column);\n }\n\n /**\n * Add foreign key (internal)\n */\n addForeignKey(fk: ForeignKeyDefinition): void {\n this.foreignKeys.push(fk);\n }\n\n // ============================================\n // Table Options\n // ============================================\n\n /**\n * Set table engine (MySQL)\n */\n engine(engine: string): this {\n this.tableEngine = engine;\n return this;\n }\n\n /**\n * Set table charset (MySQL)\n */\n charset(charset: string): this {\n this.tableCharset = charset;\n return this;\n }\n\n /**\n * Set table collation (MySQL)\n */\n collation(collation: string): this {\n this.tableCollation = collation;\n return this;\n }\n\n /**\n * Set table comment\n */\n comment(comment: string): this {\n this.tableComment = comment;\n return this;\n }\n\n // ============================================\n // Internal Methods\n // ============================================\n\n /**\n * Add a column and return its builder\n */\n private addColumn(name: string, type: ColumnDefinition['type']): ColumnBuilder {\n const builder = new ColumnBuilder(name, type);\n // Store reference to add definition later\n this.columns.push(builder.getDefinition());\n // Return builder for chaining, but we need to update the stored definition\n const index = this.columns.length - 1;\n const proxy = new Proxy(builder, {\n get: (target, prop, receiver) => {\n const result = Reflect.get(target, prop, receiver);\n if (typeof result === 'function') {\n return (...args: unknown[]) => {\n const returnValue = result.apply(target, args);\n // Update stored definition after each method call\n this.columns[index] = target.getDefinition();\n return returnValue === target ? proxy : returnValue;\n };\n }\n return result;\n },\n });\n return proxy;\n }\n\n /**\n * Get the table definition\n */\n getDefinition(): TableDefinition {\n return {\n name: this.tableName,\n columns: [...this.columns],\n indexes: [...this.indexes],\n foreignKeys: [...this.foreignKeys],\n primaryKey: this.primaryKeyColumns,\n engine: this.tableEngine,\n charset: this.tableCharset,\n collation: this.tableCollation,\n comment: this.tableComment,\n };\n }\n}\n\n/**\n * Foreign Key Chain Builder\n */\nexport class ForeignKeyChain {\n private tableBuilder: TableBuilder;\n private fkDefinition: Partial<ForeignKeyDefinition>;\n\n constructor(tableBuilder: TableBuilder, column: string) {\n this.tableBuilder = tableBuilder;\n this.fkDefinition = { column };\n }\n\n /**\n * Set the referenced column\n */\n references(column: string): this {\n this.fkDefinition.referenceColumn = column;\n return this;\n }\n\n /**\n * Set the referenced table\n */\n on(tableName: string): this {\n this.fkDefinition.table = tableName;\n this.apply();\n return this;\n }\n\n /**\n * Alias for on()\n */\n inTable(tableName: string): this {\n return this.on(tableName);\n }\n\n /**\n * Set ON DELETE action\n */\n onDelete(action: ForeignKeyAction): this {\n this.fkDefinition.onDelete = action;\n this.apply();\n return this;\n }\n\n /**\n * Set ON UPDATE action\n */\n onUpdate(action: ForeignKeyAction): this {\n this.fkDefinition.onUpdate = action;\n this.apply();\n return this;\n }\n\n /**\n * Set constraint name\n */\n name(name: string): this {\n this.fkDefinition.name = name;\n this.apply();\n return this;\n }\n\n /**\n * Apply the foreign key to the table\n */\n private apply(): void {\n if (this.fkDefinition.column && this.fkDefinition.table && this.fkDefinition.referenceColumn) {\n // Generate default name if not set\n if (!this.fkDefinition.name) {\n this.fkDefinition.name = `fk_${this.fkDefinition.column}_${this.fkDefinition.table}`;\n }\n this.tableBuilder.addForeignKey(this.fkDefinition as ForeignKeyDefinition);\n }\n }\n}\n","/**\n * Schema Builder\n * Main API for database schema operations\n */\n\nimport { MySQLDialect } from './dialects/MySQLDialect';\nimport { PostgreSQLDialect } from './dialects/PostgreSQLDialect';\nimport { TableBuilder } from './TableBuilder';\n\nimport type {\n AlterOperation,\n AlterTableDefinition,\n ColumnDefinition,\n Dialect,\n SchemaDialect,\n ForeignKeyDefinition,\n} from './types';\nimport type { DatabaseAdapter } from '../interfaces';\n\nexport interface SchemaBuilderOptions {\n dialect: Dialect;\n adapter?: DatabaseAdapter;\n}\n\nexport class SchemaBuilder {\n private dialectInstance: SchemaDialect;\n private adapter?: DatabaseAdapter;\n\n constructor(options: SchemaBuilderOptions) {\n this.adapter = options.adapter;\n\n switch (options.dialect) {\n case 'mysql': {\n this.dialectInstance = new MySQLDialect();\n break;\n }\n case 'postgresql': {\n this.dialectInstance = new PostgreSQLDialect();\n break;\n }\n default: {\n throw new Error(`Unsupported dialect: ${options.dialect}`);\n }\n }\n }\n\n /**\n * Get the dialect instance\n */\n get dialect(): SchemaDialect {\n return this.dialectInstance;\n }\n\n /**\n * Create a new table\n */\n async createTable(tableName: string, callback: (table: TableBuilder) => void): Promise<void> {\n const builder = new TableBuilder(tableName);\n callback(builder);\n\n const definition = builder.getDefinition();\n const sql = this.dialectInstance.createTable(definition);\n\n await this.execute(sql);\n\n // Create indexes separately for PostgreSQL\n if (this.dialectInstance.dialect === 'postgresql' && definition.indexes.length > 0) {\n const pgDialect = this.dialectInstance as PostgreSQLDialect;\n for (const index of definition.indexes) {\n const indexSql = pgDialect.createIndex(tableName, index);\n await this.execute(indexSql);\n }\n }\n }\n\n /**\n * Create a table if it doesn't exist\n */\n async createTableIfNotExists(\n tableName: string,\n callback: (table: TableBuilder) => void,\n ): Promise<void> {\n const exists = await this.hasTable(tableName);\n if (!exists) {\n await this.createTable(tableName, callback);\n }\n }\n\n /**\n * Drop a table\n */\n async dropTable(tableName: string): Promise<void> {\n const sql = this.dialectInstance.dropTable(tableName);\n await this.execute(sql);\n }\n\n /**\n * Drop a table if it exists\n */\n async dropTableIfExists(tableName: string): Promise<void> {\n const sql = this.dialectInstance.dropTableIfExists(tableName);\n await this.execute(sql);\n }\n\n /**\n * Rename a table\n */\n async renameTable(from: string, to: string): Promise<void> {\n const sql = this.dialectInstance.renameTable(from, to);\n await this.execute(sql);\n }\n\n /**\n * Check if a table exists\n */\n async hasTable(tableName: string): Promise<boolean> {\n const sql = this.dialectInstance.hasTable(tableName);\n const result = await this.query(sql);\n return result.length > 0;\n }\n\n /**\n * Check if a column exists in a table\n */\n async hasColumn(tableName: string, columnName: string): Promise<boolean> {\n const sql = this.dialectInstance.hasColumn(tableName, columnName);\n const result = await this.query(sql);\n return result.length > 0;\n }\n\n /**\n * Alter a table\n */\n async alterTable(tableName: string, callback: (table: AlterTableBuilder) => void): Promise<void> {\n const builder = new AlterTableBuilder(tableName);\n callback(builder);\n\n const definition = builder.getDefinition();\n const statements = this.dialectInstance.alterTable(definition);\n\n for (const sql of statements) {\n await this.execute(sql);\n }\n }\n\n /**\n * Execute raw SQL\n */\n async raw(sql: string, params?: unknown[]): Promise<void> {\n await this.execute(sql, params);\n }\n\n /**\n * Execute SQL statement\n */\n private async execute(sql: string, params?: unknown[]): Promise<void> {\n if (this.adapter) {\n // Cast params to the expected type\n await this.adapter.execute(sql, params as import('../types').QueryParams);\n } else {\n // If no adapter, just log the SQL (useful for dry-run)\n // eslint-disable-next-line no-console\n console.log('SQL:', sql);\n if (params && params.length > 0) {\n // eslint-disable-next-line no-console\n console.log('Params:', params);\n }\n }\n }\n\n /**\n * Execute SQL query\n */\n private async query(sql: string): Promise<unknown[]> {\n if (this.adapter) {\n const result = await this.adapter.query(sql);\n return result.rows;\n }\n return [];\n }\n\n /**\n * Generate SQL without executing (for preview/dry-run)\n */\n generateCreateTableSQL(tableName: string, callback: (table: TableBuilder) => void): string {\n const builder = new TableBuilder(tableName);\n callback(builder);\n return this.dialectInstance.createTable(builder.getDefinition());\n }\n\n /**\n * Generate ALTER TABLE SQL without executing\n */\n generateAlterTableSQL(tableName: string, callback: (table: AlterTableBuilder) => void): string[] {\n const builder = new AlterTableBuilder(tableName);\n callback(builder);\n return this.dialectInstance.alterTable(builder.getDefinition());\n }\n}\n\n/**\n * Alter Table Builder\n * Builder for ALTER TABLE operations\n */\nexport class AlterTableBuilder {\n private tableName: string;\n private operations: AlterOperation[] = [];\n\n constructor(tableName: string) {\n this.tableName = tableName;\n }\n\n /**\n * Add a new column\n */\n addColumn(\n name: string,\n type: ColumnDefinition['type'],\n options?: Partial<Omit<ColumnDefinition, 'name' | 'type'>>,\n ): this {\n this.operations.push({\n type: 'addColumn',\n column: {\n name,\n type,\n nullable: true,\n unsigned: false,\n autoIncrement: false,\n primary: false,\n unique: false,\n index: false,\n first: false,\n ...options,\n },\n });\n return this;\n }\n\n /**\n * Drop a column\n */\n dropColumn(name: string): this {\n this.operations.push({ type: 'dropColumn', name });\n return this;\n }\n\n /**\n * Rename a column\n */\n renameColumn(from: string, to: string): this {\n this.operations.push({ type: 'renameColumn', from, to });\n return this;\n }\n\n /**\n * Modify a column\n */\n modifyColumn(\n name: string,\n type: ColumnDefinition['type'],\n options?: Partial<Omit<ColumnDefinition, 'name' | 'type'>>,\n ): this {\n this.operations.push({\n type: 'modifyColumn',\n column: {\n name,\n type,\n nullable: true,\n unsigned: false,\n autoIncrement: false,\n primary: false,\n unique: false,\n index: false,\n first: false,\n ...options,\n },\n });\n return this;\n }\n\n /**\n * Add an index\n */\n addIndex(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.operations.push({\n type: 'addIndex',\n index: {\n name: name || `idx_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: false,\n },\n });\n return this;\n }\n\n /**\n * Add a unique index\n */\n addUnique(columns: string | string[], name?: string): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.operations.push({\n type: 'addIndex',\n index: {\n name: name || `uniq_${this.tableName}_${columnArray.join('_')}`,\n columns: columnArray,\n unique: true,\n },\n });\n return this;\n }\n\n /**\n * Drop an index\n */\n dropIndex(name: string): this {\n this.operations.push({ type: 'dropIndex', name });\n return this;\n }\n\n /**\n * Add a foreign key\n */\n addForeign(column: string): AlterForeignKeyBuilder {\n return new AlterForeignKeyBuilder(this, column);\n }\n\n /**\n * Add foreign key (internal)\n */\n addForeignKeyOperation(fk: ForeignKeyDefinition): void {\n this.operations.push({ type: 'addForeignKey', foreignKey: fk });\n }\n\n /**\n * Drop a foreign key\n */\n dropForeign(name: string): this {\n this.operations.push({ type: 'dropForeignKey', name });\n return this;\n }\n\n /**\n * Add primary key\n */\n addPrimary(columns: string | string[]): this {\n const columnArray = Array.isArray(columns) ? columns : [columns];\n this.operations.push({ type: 'addPrimary', columns: columnArray });\n return this;\n }\n\n /**\n * Drop primary key\n */\n dropPrimary(): this {\n this.operations.push({ type: 'dropPrimary' });\n return this;\n }\n\n /**\n * Get the alter table definition\n */\n getDefinition(): AlterTableDefinition {\n return {\n tableName: this.tableName,\n operations: [...this.operations],\n };\n }\n}\n\n/**\n * Alter Foreign Key Builder\n */\nclass AlterForeignKeyBuilder {\n private builder: AlterTableBuilder;\n private fkDefinition: Partial<ForeignKeyDefinition>;\n\n constructor(builder: AlterTableBuilder, column: string) {\n this.builder = builder;\n this.fkDefinition = { column };\n }\n\n references(column: string): this {\n this.fkDefinition.referenceColumn = column;\n return this;\n }\n\n on(tableName: string): this {\n this.fkDefinition.table = tableName;\n this.apply();\n return this;\n }\n\n onDelete(action: ForeignKeyDefinition['onDelete']): this {\n this.fkDefinition.onDelete = action;\n this.apply();\n return this;\n }\n\n onUpdate(action: ForeignKeyDefinition['onUpdate']): this {\n this.fkDefinition.onUpdate = action;\n this.apply();\n return this;\n }\n\n name(name: string): this {\n this.fkDefinition.name = name;\n this.apply();\n return this;\n }\n\n private apply(): void {\n if (this.fkDefinition.column && this.fkDefinition.table && this.fkDefinition.referenceColumn) {\n if (!this.fkDefinition.name) {\n this.fkDefinition.name = `fk_${this.fkDefinition.column}_${this.fkDefinition.table}`;\n }\n this.builder.addForeignKeyOperation(this.fkDefinition as ForeignKeyDefinition);\n }\n }\n}\n","/**\n * File Migration Runner\n * Enhanced migration runner with file-based loading, batch tracking, and locks\n */\n\nimport { createHash } from 'node:crypto';\n\nimport { MigrationLoader } from './MigrationLoader';\nimport { MigrationLock } from './MigrationLock';\nimport { SchemaBuilder } from '../schema';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { Logger } from '../types';\nimport type {\n Migration,\n MigrationConfig,\n MigrationRecord,\n MigrationStatus,\n BatchInfo,\n} from './types';\n\nexport interface FileMigrationRunnerOptions extends MigrationConfig {\n logger?: Logger;\n dryRun?: boolean;\n}\n\nexport class FileMigrationRunner {\n private adapter: DatabaseAdapter;\n private loader: MigrationLoader;\n private lock: MigrationLock;\n private schema: SchemaBuilder;\n private options: Required<Omit<FileMigrationRunnerOptions, 'logger'>> & {\n logger: Logger;\n };\n\n constructor(adapter: DatabaseAdapter, options: FileMigrationRunnerOptions) {\n this.adapter = adapter;\n this.options = {\n directory: options.directory,\n tableName: options.tableName ?? 'db_migrations',\n lockTableName: options.lockTableName ?? 'db_migrations_lock',\n lockTimeout: options.lockTimeout ?? 60000,\n validateChecksums: options.validateChecksums ?? true,\n dialect: options.dialect,\n logger: options.logger ?? console,\n dryRun: options.dryRun ?? false,\n };\n\n this.loader = new MigrationLoader(options.directory);\n this.lock = new MigrationLock(adapter, {\n tableName: this.options.lockTableName,\n timeout: this.options.lockTimeout,\n dialect: options.dialect,\n });\n this.schema = new SchemaBuilder({\n dialect: options.dialect,\n adapter,\n });\n }\n\n /**\n * Initialize migration tables\n */\n async initialize(): Promise<void> {\n if (this.options.dryRun) {\n this.options.logger.info('DRY RUN: Would create migration tables');\n return;\n }\n\n // Create migrations table\n const tableName = this.options.tableName;\n const hasTable = await this.schema.hasTable(tableName);\n\n if (!hasTable) {\n await this.schema.createTable(tableName, (table) => {\n table.increments('id');\n table.string('name', 255).notNull().unique();\n table.integer('batch').notNull();\n table.timestamp('executed_at').notNull().defaultNow();\n table.integer('execution_time_ms').notNull();\n table.string('checksum', 64).notNull();\n table.index('batch');\n table.index('executed_at');\n });\n this.options.logger.info(`Created migrations table: ${tableName}`);\n }\n\n // Initialize lock table\n await this.lock.initialize();\n }\n\n /**\n * Run all pending migrations\n */\n async latest(): Promise<string[]> {\n // Initialize lock table before trying to acquire lock\n await this.lock.initialize();\n\n return this.lock.withLock(async () => {\n await this.initialize();\n\n const pending = await this.getPendingMigrations();\n if (pending.length === 0) {\n this.options.logger.info('No pending migrations');\n return [];\n }\n\n const batch = await this.getNextBatch();\n const executed: string[] = [];\n\n this.options.logger.info(`Running ${pending.length} migrations (batch ${batch})`);\n\n for (const migration of pending) {\n await this.runMigration(migration, 'up', batch);\n executed.push(migration.name);\n }\n\n return executed;\n });\n }\n\n /**\n * Rollback the last batch of migrations\n */\n async rollback(steps: number = 1): Promise<string[]> {\n await this.lock.initialize();\n\n return this.lock.withLock(async () => {\n await this.initialize();\n\n const batches = await this.getLastBatches(steps);\n if (batches.length === 0) {\n this.options.logger.info('No migrations to rollback');\n return [];\n }\n\n const rolledBack: string[] = [];\n\n for (const batch of batches) {\n this.options.logger.info(`Rolling back batch ${batch.batch}`);\n\n // Rollback in reverse order\n const migrations = await this.loadMigrationsByName(\n batch.migrations.map((m) => m.name).reverse(),\n );\n\n for (const migration of migrations) {\n await this.runMigration(migration, 'down', batch.batch);\n rolledBack.push(migration.name);\n }\n }\n\n return rolledBack;\n });\n }\n\n /**\n * Reset all migrations\n */\n async reset(): Promise<string[]> {\n await this.lock.initialize();\n\n return this.lock.withLock(async () => {\n await this.initialize();\n\n const executed = await this.getExecutedMigrations();\n if (executed.length === 0) {\n this.options.logger.info('No migrations to reset');\n return [];\n }\n\n const rolledBack: string[] = [];\n\n // Rollback all in reverse order\n const migrations = await this.loadMigrationsByName(executed.map((m) => m.name).reverse());\n\n for (const migration of migrations) {\n const record = executed.find((e) => e.name === migration.name)!;\n await this.runMigration(migration, 'down', record.batch);\n rolledBack.push(migration.name);\n }\n\n return rolledBack;\n });\n }\n\n /**\n * Reset and re-run all migrations\n */\n async fresh(): Promise<string[]> {\n await this.reset();\n return this.latest();\n }\n\n /**\n * Get migration status\n */\n async status(): Promise<MigrationStatus[]> {\n await this.initialize();\n\n const allMigrations = await this.loader.getMigrationFiles();\n const executed = await this.getExecutedMigrations();\n const executedMap = new Map(executed.map((e) => [e.name, e]));\n\n return allMigrations.map((file) => {\n const record = executedMap.get(file.name);\n return {\n name: file.name,\n batch: record?.batch ?? null,\n executedAt: record?.executed_at ?? null,\n pending: !record,\n };\n });\n }\n\n /**\n * Validate migrations\n */\n async validate(): Promise<{ valid: boolean; errors: string[] }> {\n const errors: string[] = [];\n\n try {\n const migrations = await this.loader.loadAll();\n const executed = await this.getExecutedMigrations();\n\n // Check for missing migrations in codebase\n for (const record of executed) {\n const migration = migrations.find((m) => m.name === record.name);\n if (!migration) {\n errors.push(`Migration '${record.name}' exists in database but not in codebase`);\n continue;\n }\n\n // Validate checksum\n if (this.options.validateChecksums) {\n const checksum = this.calculateChecksum(migration);\n if (checksum !== record.checksum) {\n errors.push(\n `Checksum mismatch for migration '${record.name}'. The migration may have been modified.`,\n );\n }\n }\n }\n } catch (error) {\n errors.push(`Validation error: ${(error as Error).message}`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Get pending migrations\n */\n async getPendingMigrations(): Promise<Migration[]> {\n const allMigrations = await this.loader.loadAll();\n const executed = await this.getExecutedMigrations();\n const executedNames = new Set(executed.map((e) => e.name));\n\n return allMigrations.filter((m) => !executedNames.has(m.name));\n }\n\n /**\n * Get executed migrations from database\n */\n private async getExecutedMigrations(): Promise<MigrationRecord[]> {\n const result = await this.adapter.query<MigrationRecord>(\n `SELECT * FROM ${this.options.tableName} ORDER BY id ASC`,\n );\n return result.rows;\n }\n\n /**\n * Get the next batch number\n */\n private async getNextBatch(): Promise<number> {\n const result = await this.adapter.query<{ max_batch: number | null }>(\n `SELECT MAX(batch) as max_batch FROM ${this.options.tableName}`,\n );\n return (result.rows[0]?.max_batch ?? 0) + 1;\n }\n\n /**\n * Get the last N batches\n */\n private async getLastBatches(count: number): Promise<BatchInfo[]> {\n const result = await this.adapter.query<MigrationRecord>(\n `SELECT * FROM ${this.options.tableName} ORDER BY batch DESC, id DESC`,\n );\n\n const batches = new Map<number, MigrationRecord[]>();\n for (const record of result.rows) {\n if (!batches.has(record.batch)) {\n batches.set(record.batch, []);\n }\n batches.get(record.batch)!.push(record);\n }\n\n const batchNumbers = Array.from(batches.keys()).slice(0, count);\n return batchNumbers.map((batch) => ({\n batch,\n migrations: batches.get(batch)!,\n }));\n }\n\n /**\n * Load migrations by name\n */\n private async loadMigrationsByName(names: string[]): Promise<Migration[]> {\n const allMigrations = await this.loader.loadAll();\n const migrationMap = new Map(allMigrations.map((m) => [m.name, m]));\n\n return names\n .map((name) => migrationMap.get(name))\n .filter((m): m is Migration => m !== undefined);\n }\n\n /**\n * Run a single migration\n */\n private async runMigration(\n migration: Migration,\n direction: 'up' | 'down',\n batch: number,\n ): Promise<void> {\n const startTime = Date.now();\n const action = direction === 'up' ? 'Running' : 'Rolling back';\n\n this.options.logger.info(`${action}: ${migration.name}`);\n\n if (this.options.dryRun) {\n this.options.logger.info(`DRY RUN: Would ${direction} ${migration.name}`);\n return;\n }\n\n const transaction = migration.transactional ? await this.adapter.beginTransaction() : null;\n\n try {\n // Create schema builder with transaction if applicable\n const schema = new SchemaBuilder({\n dialect: this.options.dialect,\n adapter: this.adapter,\n });\n\n // Run migration\n await migration[direction](schema);\n\n const executionTime = Date.now() - startTime;\n\n // Update migration record\n if (direction === 'up') {\n const checksum = this.calculateChecksum(migration);\n await this.adapter.execute(\n `INSERT INTO ${this.options.tableName}\n (name, batch, executed_at, execution_time_ms, checksum)\n VALUES (?, ?, NOW(), ?, ?)`,\n [migration.name, batch, executionTime, checksum],\n );\n } else {\n await this.adapter.execute(`DELETE FROM ${this.options.tableName} WHERE name = ?`, [\n migration.name,\n ]);\n }\n\n if (transaction) {\n await transaction.commit();\n }\n\n this.options.logger.info(\n `${direction === 'up' ? 'Completed' : 'Rolled back'}: ${migration.name} (${executionTime}ms)`,\n );\n } catch (error) {\n if (transaction) {\n await transaction.rollback();\n }\n throw new Error(\n `Failed to ${direction} migration '${migration.name}': ${(error as Error).message}`,\n );\n }\n }\n\n /**\n * Calculate migration checksum\n */\n private calculateChecksum(migration: Migration): string {\n const content = `${migration.name}:${migration.up.toString()}:${migration.down.toString()}`;\n return createHash('sha256').update(content).digest('hex');\n }\n}\n","/**\n * CLI Utilities\n * Helper functions for CLI commands\n */\n\nimport { resolve } from 'node:path';\n\nimport { loadConfig, type DBBridgeConfig } from './config';\nimport { FileMigrationRunner } from '../migrations/FileMigrationRunner';\n\nimport type { DatabaseAdapter } from '../interfaces';\n\n/**\n * Create adapter from config\n * Dynamically imports the appropriate adapter package\n */\nexport async function createAdapterFromConfig(config: DBBridgeConfig): Promise<DatabaseAdapter> {\n const { dialect, host, port, user, password, database, ssl } = config.connection;\n\n if (dialect === 'mysql') {\n try {\n const { MySQLAdapter } = await import('@db-bridge/mysql');\n const adapter = new MySQLAdapter() as DatabaseAdapter;\n await adapter.connect({\n host,\n port,\n user,\n password,\n database,\n });\n return adapter;\n } catch (error) {\n if ((error as Error).message.includes('Cannot find module')) {\n throw new Error(\n 'MySQL adapter not found. Install it with: npm install @db-bridge/mysql mysql2',\n );\n }\n throw error;\n }\n }\n\n if (dialect === 'postgresql') {\n try {\n const { PostgreSQLAdapter } = await import('@db-bridge/postgresql');\n const adapter = new PostgreSQLAdapter() as DatabaseAdapter;\n await adapter.connect({\n host,\n port,\n user,\n password,\n database,\n ssl: ssl as boolean | undefined,\n });\n return adapter;\n } catch (error) {\n if ((error as Error).message.includes('Cannot find module')) {\n throw new Error(\n 'PostgreSQL adapter not found. Install it with: npm install @db-bridge/postgresql pg',\n );\n }\n throw error;\n }\n }\n\n throw new Error(`Unsupported dialect: ${dialect}`);\n}\n\n/**\n * Create migration runner from config\n */\nexport async function createRunnerFromConfig(\n options: { dryRun?: boolean } = {},\n): Promise<{ runner: FileMigrationRunner; adapter: DatabaseAdapter; config: DBBridgeConfig }> {\n const config = await loadConfig();\n const adapter = await createAdapterFromConfig(config);\n\n const runner = new FileMigrationRunner(adapter, {\n directory: resolve(process.cwd(), config.migrations?.directory || './src/migrations'),\n tableName: config.migrations?.tableName,\n lockTableName: config.migrations?.lockTableName,\n dialect: config.connection.dialect,\n dryRun: options.dryRun,\n });\n\n return { runner, adapter, config };\n}\n\n/**\n * Format table for console output\n */\nexport function formatTable(headers: string[], rows: string[][]): string {\n // Calculate column widths\n const widths = headers.map((h, i) => {\n const maxRow = Math.max(...rows.map((r) => (r[i] || '').length));\n return Math.max(h.length, maxRow);\n });\n\n // Create separator\n const separator = '─'.repeat(widths.reduce((a, b) => a + b + 3, 1));\n\n // Format header\n const headerRow = headers.map((h, i) => h.padEnd(widths[i]!)).join(' │ ');\n\n // Format rows\n const dataRows = rows\n .map((row) => row.map((cell, i) => (cell || '').padEnd(widths[i]!)).join(' │ '))\n .join('\\n');\n\n return `┌${separator}┐\\n│ ${headerRow} │\\n├${separator}┤\\n${\n dataRows\n ? dataRows\n .split('\\n')\n .map((r) => `│ ${r} │`)\n .join('\\n')\n : `│${' '.repeat(separator.length)}│`\n }\\n└${separator}┘`;\n}\n\n/**\n * Print success message\n */\nexport function success(message: string): void {\n console.log(`✓ ${message}`);\n}\n\n/**\n * Print error message\n */\nexport function error(message: string): void {\n console.error(`✗ ${message}`);\n}\n\n/**\n * Print info message\n */\nexport function info(message: string): void {\n console.log(`ℹ ${message}`);\n}\n\n/**\n * Print warning message\n */\nexport function warn(message: string): void {\n console.warn(`⚠ ${message}`);\n}\n","/**\n * migrate:fresh Command\n * Drop all tables and re-run migrations\n */\n\nimport { createRunnerFromConfig, success, info, error, warn } from '../utils';\n\nexport interface FreshOptions {\n dryRun?: boolean;\n}\n\nexport async function freshCommand(options: FreshOptions = {}): Promise<void> {\n let adapter;\n\n try {\n if (options.dryRun) {\n info('DRY RUN MODE - No changes will be made');\n } else {\n warn('This will reset ALL migrations and re-run them!');\n }\n\n const { runner, adapter: a } = await createRunnerFromConfig(options);\n adapter = a;\n\n console.log('');\n info('Resetting all migrations...');\n\n const executed = await runner.fresh();\n\n if (executed.length === 0) {\n info('No migrations to run');\n } else {\n console.log('');\n success(`Fresh migration complete - ran ${executed.length} migration(s):`);\n for (const name of executed) {\n console.log(` - ${name}`);\n }\n }\n } catch (error_) {\n error((error_ as Error).message);\n process.exit(1);\n } finally {\n if (adapter) {\n await adapter.disconnect();\n }\n }\n}\n","/**\n * migrate:latest Command\n * Run all pending migrations\n */\n\nimport { createRunnerFromConfig, success, info, error } from '../utils';\n\nexport interface LatestOptions {\n dryRun?: boolean;\n}\n\nexport async function latestCommand(options: LatestOptions = {}): Promise<void> {\n let adapter;\n\n try {\n if (options.dryRun) {\n info('DRY RUN MODE - No changes will be made');\n }\n\n const { runner, adapter: a } = await createRunnerFromConfig(options);\n adapter = a;\n\n const executed = await runner.latest();\n\n if (executed.length === 0) {\n info('Nothing to migrate');\n } else {\n console.log('');\n success(`Ran ${executed.length} migration(s):`);\n for (const name of executed) {\n console.log(` - ${name}`);\n }\n }\n } catch (error_) {\n error((error_ as Error).message);\n process.exit(1);\n } finally {\n if (adapter) {\n await adapter.disconnect();\n }\n }\n}\n","/**\n * migrate:make Command\n * Create a new migration file\n */\n\nimport { existsSync } from 'node:fs';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\n\nimport { MigrationLoader } from '../../migrations/MigrationLoader';\nimport { loadConfig } from '../config';\nimport { success, error } from '../utils';\n\nexport async function makeCommand(name: string): Promise<void> {\n try {\n // Load config to get migrations directory\n const config = await loadConfig();\n const directory = resolve(process.cwd(), config.migrations?.directory || './src/migrations');\n\n // Ensure directory exists\n if (!existsSync(directory)) {\n await mkdir(directory, { recursive: true });\n console.log(`Created migrations directory: ${directory}`);\n }\n\n // Generate filename and content\n const filename = MigrationLoader.generateFilename(name);\n const filepath = resolve(directory, filename);\n const migrationName = filename.replace(/\\.(ts|js|mjs)$/, '');\n const content = MigrationLoader.getMigrationTemplate(migrationName);\n\n // Check if file already exists\n if (existsSync(filepath)) {\n error(`Migration file already exists: ${filepath}`);\n process.exit(1);\n }\n\n // Write file\n await writeFile(filepath, content, 'utf8');\n success(`Created migration: ${filename}`);\n console.log(` Path: ${filepath}`);\n } catch (error_) {\n error((error_ as Error).message);\n process.exit(1);\n }\n}\n","/**\n * Seeder Loader\n * Load seeder files from directory\n */\n\nimport { readdir } from 'node:fs/promises';\nimport { resolve, basename } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { Seeder, SeederFile } from './types';\n\nexport class SeederLoader {\n constructor(private readonly directory: string) {}\n\n /**\n * Load all seeder files from directory\n */\n async loadAll(): Promise<SeederFile[]> {\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- directory is user-configured\n const files = await readdir(this.directory);\n\n const seederFiles = files\n .filter((f) => /\\.(ts|js|mjs)$/.test(f) && !f.endsWith('.d.ts'))\n .sort() // Alphabetical order\n .map((f) => ({\n name: this.getSeederName(f),\n path: resolve(this.directory, f),\n }));\n\n return seederFiles;\n }\n\n /**\n * Load a specific seeder by path\n */\n async load(seederPath: string): Promise<Seeder> {\n const fileUrl = pathToFileURL(seederPath).href;\n const module = await import(fileUrl);\n const seeder = module.default || module;\n\n if (!seeder || typeof seeder.run !== 'function') {\n throw new Error(`Invalid seeder: ${seederPath} - must export a run() function`);\n }\n\n return seeder;\n }\n\n /**\n * Get seeder name from filename\n */\n private getSeederName(filename: string): string {\n return basename(filename).replace(/\\.(ts|js|mjs)$/, '');\n }\n\n /**\n * Generate a new seeder filename\n */\n static generateFilename(name: string): string {\n // Convert to snake_case\n const snakeName = name\n .replaceAll(/([a-z])([A-Z])/g, '$1_$2')\n .replaceAll(/[\\s-]+/g, '_')\n .toLowerCase();\n\n return `${snakeName}_seeder.ts`;\n }\n\n /**\n * Get seeder template\n */\n static getSeederTemplate(name: string): string {\n const className = name\n .split('_')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n\n return `/**\n * ${className} Seeder\n */\n\nimport type { Seeder, DatabaseAdapter } from '@db-bridge/core';\n\nexport default {\n async run(adapter: DatabaseAdapter): Promise<void> {\n // Insert seed data\n // await adapter.execute(\\`\n // INSERT INTO users (name, email) VALUES\n // ('John Doe', 'john@example.com'),\n // ('Jane Doe', 'jane@example.com')\n // \\`);\n },\n} satisfies Seeder;\n`;\n }\n}\n","/**\n * make:seeder Command\n * Create a new seeder file\n */\n\nimport { existsSync } from 'node:fs';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\n\nimport { SeederLoader } from '../../seeds/SeederLoader';\nimport { loadConfig } from '../config';\nimport { success, error } from '../utils';\n\nexport async function makeSeederCommand(name: string): Promise<void> {\n try {\n // Load config to get seeds directory\n const config = await loadConfig();\n const directory = resolve(process.cwd(), config.seeds?.directory || './src/seeds');\n\n // Ensure directory exists\n if (!existsSync(directory)) {\n await mkdir(directory, { recursive: true });\n console.log(`Created seeds directory: ${directory}`);\n }\n\n // Generate filename and content\n const filename = SeederLoader.generateFilename(name);\n const filepath = resolve(directory, filename);\n const seederName = filename.replace(/\\.(ts|js|mjs)$/, '');\n const content = SeederLoader.getSeederTemplate(seederName);\n\n // Check if file already exists\n if (existsSync(filepath)) {\n error(`Seeder file already exists: ${filepath}`);\n process.exit(1);\n }\n\n // Write file\n await writeFile(filepath, content, 'utf8');\n success(`Created seeder: ${filename}`);\n console.log(` Path: ${filepath}`);\n } catch (error_) {\n error((error_ as Error).message);\n process.exit(1);\n }\n}\n","/**\n * migrate:reset Command\n * Rollback all migrations\n */\n\nimport { createRunnerFromConfig, success, info, error, warn } from '../utils';\n\nexport interface ResetOptions {\n dryRun?: boolean;\n}\n\nexport async function resetCommand(options: ResetOptions = {}): Promise<void> {\n let adapter;\n\n try {\n if (options.dryRun) {\n info('DRY RUN MODE - No changes will be made');\n } else {\n warn('This will rollback ALL migrations!');\n }\n\n const { runner, adapter: a } = await createRunnerFromConfig(options);\n adapter = a;\n\n const rolledBack = await runner.reset();\n\n if (rolledBack.length === 0) {\n info('Nothing to reset');\n } else {\n console.log('');\n success(`Reset ${rolledBack.length} migration(s):`);\n for (const name of rolledBack) {\n console.log(` - ${name}`);\n }\n }\n } catch (error_) {\n error((error_ as Error).message);\n process.exit(1);\n } finally {\n if (adapter) {\n await adapter.disconnect();\n }\n }\n}\n","/**\n * migrate:rollback Command\n * Rollback the last batch of migrations\n */\n\nimport { createRunnerFromConfig, success, info, error } from '../utils';\n\nexport interface RollbackOptions {\n dryRun?: boolean;\n step?: number;\n}\n\nexport async function rollbackCommand(options: RollbackOptions = {}): Promise<void> {\n let adapter;\n\n try {\n if (options.dryRun) {\n info('DRY RUN MODE - No changes will be made');\n }\n\n const { runner, adapter: a } = await createRunnerFromConfig(options);\n adapter = a;\n\n const step = options.step ?? 1;\n const rolledBack = await runner.rollback(step);\n\n if (rolledBack.length === 0) {\n info('Nothing to rollback');\n } else {\n console.log('');\n success(`Rolled back ${rolledBack.length} migration(s):`);\n for (const name of rolledBack) {\n console.log(` - ${name}`);\n }\n }\n } catch (error_) {\n error((error_ as Error).message);\n process.exit(1);\n } finally {\n if (adapter) {\n await adapter.disconnect();\n }\n }\n}\n","/**\n * Seeder Runner\n * Execute seeders\n */\n\nimport { SeederLoader } from './SeederLoader';\n\nimport type { DatabaseAdapter } from '../interfaces';\nimport type { SeederRunnerOptions, SeederFile } from './types';\n\nexport interface SeederResult {\n name: string;\n success: boolean;\n error?: string;\n duration: number;\n}\n\nexport class SeederRunner {\n private readonly loader: SeederLoader;\n private readonly options: SeederRunnerOptions;\n\n constructor(\n private readonly adapter: DatabaseAdapter,\n options: SeederRunnerOptions,\n ) {\n this.options = options;\n this.loader = new SeederLoader(options.directory);\n }\n\n /**\n * Run all seeders (or filtered by options)\n */\n async run(): Promise<SeederResult[]> {\n const files = await this.loader.loadAll();\n const filteredFiles = this.filterSeeders(files);\n const results: SeederResult[] = [];\n\n for (const file of filteredFiles) {\n const startTime = Date.now();\n\n try {\n const seeder = await this.loader.load(file.path);\n await seeder.run(this.adapter);\n\n results.push({\n name: file.name,\n success: true,\n duration: Date.now() - startTime,\n });\n } catch (error) {\n results.push({\n name: file.name,\n success: false,\n error: (error as Error).message,\n duration: Date.now() - startTime,\n });\n\n // Stop on first error\n break;\n }\n }\n\n return results;\n }\n\n /**\n * Run a specific seeder by name\n */\n async runSeeder(name: string): Promise<SeederResult> {\n const files = await this.loader.loadAll();\n const file = files.find((f) => f.name === name || f.name === `${name}_seeder`);\n\n if (!file) {\n return {\n name,\n success: false,\n error: `Seeder not found: ${name}`,\n duration: 0,\n };\n }\n\n const startTime = Date.now();\n\n try {\n const seeder = await this.loader.load(file.path);\n await seeder.run(this.adapter);\n\n return {\n name: file.name,\n success: true,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n name: file.name,\n success: false,\n error: (error as Error).message,\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Filter seeders based on options\n */\n private filterSeeders(files: SeederFile[]): SeederFile[] {\n let filtered = files;\n\n // Filter by 'only' option\n if (this.options.only && this.options.only.length > 0) {\n filtered = filtered.filter((f) =>\n this.options.only!.some((name) => f.name === name || f.name === `${name}_seeder`),\n );\n }\n\n // Filter by 'except' option\n if (this.options.except && this.options.except.length > 0) {\n filtered = filtered.filter(\n (f) => !this.options.except!.some((name) => f.name === name || f.name === `${name}_seeder`),\n );\n }\n\n return filtered;\n }\n\n /**\n * List all available seeders\n */\n async list(): Promise<SeederFile[]> {\n return this.loader.loadAll();\n }\n}\n","/**\n * db:seed Command\n * Run database seeders\n */\n\nimport { resolve } from 'node:path';\n\nimport { SeederRunner } from '../../seeds/SeederRunner';\nimport { loadConfig } from '../config';\nimport { createAdapterFromConfig, success, error, info } from '../utils';\n\nexport interface SeedOptions {\n /** Specific seeder to run */\n class?: string;\n}\n\nexport async function seedCommand(options: SeedOptions = {}): Promise<void> {\n let adapter;\n\n try {\n const config = await loadConfig();\n adapter = await createAdapterFromConfig(config);\n\n const directory = resolve(process.cwd(), config.seeds?.directory || './src/seeds');\n\n const runner = new SeederRunner(adapter, { directory });\n\n if (options.class) {\n // Run specific seeder\n info(`Running seeder: ${options.class}`);\n const result = await runner.runSeeder(options.class);\n\n if (result.success) {\n success(`Seeder completed: ${result.name} (${result.duration}ms)`);\n } else {\n error(`Seeder failed: ${result.error}`);\n process.exit(1);\n }\n } else {\n // Run all seeders\n info('Running all seeders...');\n console.log('');\n\n const results = await runner.run();\n\n if (results.length === 0) {\n info('No seeders found');\n return;\n }\n\n let hasErrors = false;\n for (const result of results) {\n if (result.success) {\n success(`${result.name} (${result.duration}ms)`);\n } else {\n error(`${result.name}: ${result.error}`);\n hasErrors = true;\n }\n }\n\n console.log('');\n if (hasErrors) {\n error('Seeding completed with errors');\n process.exit(1);\n } else {\n success(`Seeding complete - ran ${results.length} seeder(s)`);\n }\n }\n } catch (error_) {\n error((error_ as Error).message);\n process.exit(1);\n } finally {\n if (adapter) {\n await adapter.disconnect();\n }\n }\n}\n","/**\n * migrate:status Command\n * Show migration status\n */\n\nimport { createRunnerFromConfig, formatTable, error } from '../utils';\n\nexport async function statusCommand(): Promise<void> {\n let adapter;\n\n try {\n const { runner, adapter: a } = await createRunnerFromConfig();\n adapter = a;\n\n const status = await runner.status();\n\n if (status.length === 0) {\n console.log('No migrations found');\n return;\n }\n\n // Prepare table data\n const headers = ['Migration', 'Batch', 'Status', 'Executed At'];\n const rows = status.map((s) => [\n s.name,\n s.batch?.toString() || '-',\n s.pending ? 'Pending' : 'Executed',\n s.executedAt ? new Date(s.executedAt).toLocaleString() : '-',\n ]);\n\n console.log('');\n console.log('Migration Status:');\n console.log('');\n console.log(formatTable(headers, rows));\n console.log('');\n\n const pendingCount = status.filter((s) => s.pending).length;\n const executedCount = status.filter((s) => !s.pending).length;\n\n console.log(\n `Total: ${status.length} migrations (${executedCount} executed, ${pendingCount} pending)`,\n );\n } catch (error_) {\n error((error_ as Error).message);\n process.exit(1);\n } finally {\n if (adapter) {\n await adapter.disconnect();\n }\n }\n}\n","/**\n * migrate:validate Command\n * Validate migration checksums and integrity\n */\n\nimport { createRunnerFromConfig, success, error, info, warn } from '../utils';\n\nexport async function validateCommand(): Promise<void> {\n let adapter;\n\n try {\n info('Validating migrations...');\n console.log('');\n\n const { runner, adapter: a } = await createRunnerFromConfig();\n adapter = a;\n\n const result = await runner.validate();\n\n if (result.valid) {\n success('All migrations are valid');\n } else {\n warn('Migration validation failed:');\n console.log('');\n for (const err of result.errors) {\n error(` ${err}`);\n }\n console.log('');\n process.exit(1);\n }\n } catch (error_) {\n error((error_ as Error).message);\n process.exit(1);\n } finally {\n if (adapter) {\n await adapter.disconnect();\n }\n }\n}\n","#!/usr/bin/env node\n/**\n * db-bridge CLI\n * Command-line interface for database migrations and seeding\n */\n\nimport { parseArgs } from 'node:util';\n\nimport { freshCommand } from './commands/fresh';\nimport { latestCommand } from './commands/latest';\nimport { makeCommand } from './commands/make';\nimport { makeSeederCommand } from './commands/make-seeder';\nimport { resetCommand } from './commands/reset';\nimport { rollbackCommand } from './commands/rollback';\nimport { seedCommand } from './commands/seed';\nimport { statusCommand } from './commands/status';\nimport { validateCommand } from './commands/validate';\n\nconst VERSION = '1.0.0';\n\nconst HELP = `\ndb-bridge - Database Migration & Seeding CLI\n\nUsage:\n db-bridge <command> [options]\n\nMigration Commands:\n migrate:make <name> Create a new migration file\n migrate:latest Run all pending migrations\n migrate:rollback Rollback the last batch of migrations\n migrate:status Show migration status\n migrate:reset Rollback all migrations\n migrate:fresh Drop all tables and re-run migrations\n migrate:validate Validate migration checksums\n\nSeed Commands:\n make:seeder <name> Create a new seeder file\n db:seed Run database seeders\n db:seed --class=<name> Run a specific seeder\n\nOptions:\n --help, -h Show this help message\n --version, -v Show version number\n --dry-run Show what would be done without executing\n --step=<n> Number of batches to rollback (for rollback command)\n --class=<name> Specific seeder class to run (for db:seed)\n\nExamples:\n db-bridge migrate:make create_users_table\n db-bridge migrate:latest\n db-bridge migrate:rollback --step=2\n db-bridge make:seeder users\n db-bridge db:seed\n db-bridge db:seed --class=users\n`;\n\ninterface CLIOptions {\n help?: boolean;\n version?: boolean;\n dryRun?: boolean;\n step?: number;\n class?: string;\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n // Parse options\n let options: CLIOptions = {};\n let command = '';\n let commandArgs: string[] = [];\n\n try {\n const { values, positionals } = parseArgs({\n args,\n options: {\n help: { type: 'boolean', short: 'h' },\n version: { type: 'boolean', short: 'v' },\n 'dry-run': { type: 'boolean' },\n step: { type: 'string' },\n class: { type: 'string' },\n },\n allowPositionals: true,\n });\n\n options = {\n help: values.help,\n version: values.version,\n dryRun: values['dry-run'],\n step: values.step ? parseInt(values.step, 10) : undefined,\n class: values.class,\n };\n\n command = positionals[0] || '';\n commandArgs = positionals.slice(1);\n } catch {\n // If parsing fails, try simple parsing\n command = args[0] || '';\n commandArgs = args.slice(1).filter((a) => !a.startsWith('-'));\n options.help = args.includes('--help') || args.includes('-h');\n options.version = args.includes('--version') || args.includes('-v');\n options.dryRun = args.includes('--dry-run');\n\n const stepArg = args.find((a) => a.startsWith('--step='));\n if (stepArg) {\n options.step = parseInt(stepArg.split('=')[1] || '1', 10);\n }\n\n const classArg = args.find((a) => a.startsWith('--class='));\n if (classArg) {\n options.class = classArg.split('=')[1];\n }\n }\n\n // Handle help and version\n if (options.help || command === 'help') {\n console.log(HELP);\n process.exit(0);\n }\n\n if (options.version) {\n console.log(`db-bridge v${VERSION}`);\n process.exit(0);\n }\n\n // No command provided\n if (!command) {\n console.log(HELP);\n process.exit(0);\n }\n\n // Execute command\n try {\n switch (command) {\n case 'migrate:make': {\n if (!commandArgs[0]) {\n console.error('Error: Migration name is required');\n console.log('Usage: db-bridge migrate:make <name>');\n process.exit(1);\n }\n await makeCommand(commandArgs[0]);\n break;\n }\n\n case 'migrate:latest': {\n await latestCommand({ dryRun: options.dryRun });\n break;\n }\n\n case 'migrate:rollback': {\n await rollbackCommand({ dryRun: options.dryRun, step: options.step });\n break;\n }\n\n case 'migrate:status': {\n await statusCommand();\n break;\n }\n\n case 'migrate:reset': {\n await resetCommand({ dryRun: options.dryRun });\n break;\n }\n\n case 'migrate:fresh': {\n await freshCommand({ dryRun: options.dryRun });\n break;\n }\n\n case 'migrate:validate': {\n await validateCommand();\n break;\n }\n\n case 'make:seeder': {\n if (!commandArgs[0]) {\n console.error('Error: Seeder name is required');\n console.log('Usage: db-bridge make:seeder <name>');\n process.exit(1);\n }\n await makeSeederCommand(commandArgs[0]);\n break;\n }\n\n case 'db:seed': {\n await seedCommand({ class: options.class });\n break;\n }\n\n default: {\n console.error(`Unknown command: ${command}`);\n console.log('Run \"db-bridge --help\" for usage information.');\n process.exit(1);\n }\n }\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n"]}