drizzle-multitenant 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/migrator/table-format.ts","../../src/migrator/migrator.ts","../../src/cli/utils/spinner.ts","../../src/cli/utils/table.ts","../../src/cli/utils/config.ts","../../src/cli/utils/output.ts","../../src/cli/utils/progress.ts","../../src/cli/utils/errors.ts","../../src/cli/commands/migrate.ts","../../src/cli/commands/status.ts","../../src/cli/commands/sync.ts","../../src/cli/commands/generate.ts","../../src/cli/commands/tenant-create.ts","../../src/cli/commands/tenant-drop.ts","../../src/cli/commands/convert-format.ts","../../src/cli/commands/init.ts","../../src/cli/commands/completion.ts","../../src/cli/index.ts"],"names":["error","chalk","Command","formatDuration","resolve","existsSync","readdir","join","readFile","createHash","basename","Pool"],"mappings":"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","file":"index.js","sourcesContent":["import type { Pool } from 'pg';\n\n/**\n * Table format for tracking migrations\n * - \"name\": drizzle-multitenant native (filename-based)\n * - \"hash\": SHA-256 hash with timestamp\n * - \"drizzle-kit\": Exact drizzle-kit format (hash + bigint timestamp)\n */\nexport type TableFormat = 'name' | 'hash' | 'drizzle-kit';\n\n/**\n * Detected table format information\n */\nexport interface DetectedFormat {\n /** The detected format type */\n format: TableFormat;\n /** The table name */\n tableName: string;\n /** Column configuration */\n columns: {\n /** Column used for identifying migrations */\n identifier: 'name' | 'hash';\n /** Column used for timestamp */\n timestamp: 'applied_at' | 'created_at';\n /** Data type of timestamp column */\n timestampType: 'timestamp' | 'bigint';\n };\n}\n\n/**\n * Default format configuration for new tables\n */\nexport const DEFAULT_FORMAT: DetectedFormat = {\n format: 'name',\n tableName: '__drizzle_migrations',\n columns: {\n identifier: 'name',\n timestamp: 'applied_at',\n timestampType: 'timestamp',\n },\n};\n\n/**\n * drizzle-kit format configuration\n */\nexport const DRIZZLE_KIT_FORMAT: DetectedFormat = {\n format: 'drizzle-kit',\n tableName: '__drizzle_migrations',\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'bigint',\n },\n};\n\ninterface ColumnInfo {\n column_name: string;\n data_type: string;\n}\n\n/**\n * Detect the format of an existing migrations table\n *\n * @param pool - Database connection pool\n * @param schemaName - Schema to check\n * @param tableName - Migrations table name\n * @returns Detected format or null if table doesn't exist\n */\nexport async function detectTableFormat(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<DetectedFormat | null> {\n // Check if table exists\n const tableExists = await pool.query<{ exists: boolean }>(\n `SELECT EXISTS (\n SELECT 1 FROM information_schema.tables\n WHERE table_schema = $1 AND table_name = $2\n ) as exists`,\n [schemaName, tableName]\n );\n\n if (!tableExists.rows[0]?.exists) {\n return null;\n }\n\n // Get column information\n const columnsResult = await pool.query<ColumnInfo>(\n `SELECT column_name, data_type\n FROM information_schema.columns\n WHERE table_schema = $1 AND table_name = $2`,\n [schemaName, tableName]\n );\n\n const columnMap = new Map<string, string>(\n columnsResult.rows.map((r) => [r.column_name, r.data_type])\n );\n\n // Detect format based on columns\n if (columnMap.has('name')) {\n // drizzle-multitenant native format\n return {\n format: 'name',\n tableName,\n columns: {\n identifier: 'name',\n timestamp: columnMap.has('applied_at') ? 'applied_at' : 'created_at',\n timestampType: 'timestamp',\n },\n };\n }\n\n if (columnMap.has('hash')) {\n const createdAtType = columnMap.get('created_at');\n\n // drizzle-kit uses bigint for created_at\n if (createdAtType === 'bigint') {\n return {\n format: 'drizzle-kit',\n tableName,\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'bigint',\n },\n };\n }\n\n // Custom hash-based format with regular timestamp\n return {\n format: 'hash',\n tableName,\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'timestamp',\n },\n };\n }\n\n // Unknown format - return null to trigger error handling\n return null;\n}\n\n/**\n * Get the format configuration for a specific format type\n */\nexport function getFormatConfig(\n format: TableFormat,\n tableName: string = '__drizzle_migrations'\n): DetectedFormat {\n switch (format) {\n case 'name':\n return {\n format: 'name',\n tableName,\n columns: {\n identifier: 'name',\n timestamp: 'applied_at',\n timestampType: 'timestamp',\n },\n };\n case 'hash':\n return {\n format: 'hash',\n tableName,\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'timestamp',\n },\n };\n case 'drizzle-kit':\n return {\n format: 'drizzle-kit',\n tableName,\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'bigint',\n },\n };\n }\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join, basename } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { Pool } from 'pg';\nimport type { Config } from '../types.js';\nimport type {\n MigratorConfig,\n MigrationFile,\n MigrateOptions,\n TenantMigrationResult,\n MigrationResults,\n TenantMigrationStatus,\n AppliedMigration,\n CreateTenantOptions,\n DropTenantOptions,\n TenantSyncStatus,\n SyncStatus,\n TenantSyncResult,\n SyncResults,\n SyncOptions,\n} from './types.js';\nimport { detectTableFormat, getFormatConfig, type DetectedFormat, type TableFormat } from './table-format.js';\n\nconst DEFAULT_MIGRATIONS_TABLE = '__drizzle_migrations';\n\n/**\n * Parallel migration engine for multi-tenant applications\n */\nexport class Migrator<\n TTenantSchema extends Record<string, unknown>,\n TSharedSchema extends Record<string, unknown>,\n> {\n private readonly migrationsTable: string;\n\n constructor(\n private readonly tenantConfig: Config<TTenantSchema, TSharedSchema>,\n private readonly migratorConfig: MigratorConfig\n ) {\n this.migrationsTable = migratorConfig.migrationsTable ?? DEFAULT_MIGRATIONS_TABLE;\n }\n\n /**\n * Migrate all tenants in parallel\n */\n async migrateAll(options: MigrateOptions = {}): Promise<MigrationResults> {\n const {\n concurrency = 10,\n onProgress,\n onError,\n dryRun = false,\n } = options;\n\n const tenantIds = await this.migratorConfig.tenantDiscovery();\n const migrations = await this.loadMigrations();\n\n const results: TenantMigrationResult[] = [];\n let aborted = false;\n\n // Process tenants in batches\n for (let i = 0; i < tenantIds.length && !aborted; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n if (aborted) {\n return this.createSkippedResult(tenantId);\n }\n\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.migrateTenant(tenantId, migrations, { dryRun, onProgress });\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n const action = onError?.(tenantId, error as Error);\n if (action === 'abort') {\n aborted = true;\n }\n return this.createErrorResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n // Mark remaining tenants as skipped if aborted\n if (aborted) {\n const remaining = tenantIds.slice(results.length);\n for (const tenantId of remaining) {\n results.push(this.createSkippedResult(tenantId));\n }\n }\n\n return this.aggregateResults(results);\n }\n\n /**\n * Migrate a single tenant\n */\n async migrateTenant(\n tenantId: string,\n migrations?: MigrationFile[],\n options: { dryRun?: boolean; onProgress?: MigrateOptions['onProgress'] } = {}\n ): Promise<TenantMigrationResult> {\n const startTime = Date.now();\n const schemaName = this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n const appliedMigrations: string[] = [];\n\n const pool = await this.createPool(schemaName);\n\n try {\n await this.migratorConfig.hooks?.beforeTenant?.(tenantId);\n\n // Detect or determine the format before creating table\n const format = await this.getOrDetectFormat(pool, schemaName);\n\n // Ensure migrations table exists with correct format\n await this.ensureMigrationsTable(pool, schemaName, format);\n\n // Load migrations if not provided\n const allMigrations = migrations ?? await this.loadMigrations();\n\n // Get applied migrations using format-aware query\n const applied = await this.getAppliedMigrations(pool, schemaName, format);\n const appliedSet = new Set(applied.map((m) => m.identifier));\n\n // Filter pending migrations using format-aware comparison\n const pending = allMigrations.filter(\n (m) => !this.isMigrationApplied(m, appliedSet, format)\n );\n\n if (options.dryRun) {\n return {\n tenantId,\n schemaName,\n success: true,\n appliedMigrations: pending.map((m) => m.name),\n durationMs: Date.now() - startTime,\n format: format.format,\n };\n }\n\n // Apply pending migrations\n for (const migration of pending) {\n const migrationStart = Date.now();\n options.onProgress?.(tenantId, 'migrating', migration.name);\n\n await this.migratorConfig.hooks?.beforeMigration?.(tenantId, migration.name);\n await this.applyMigration(pool, schemaName, migration, format);\n await this.migratorConfig.hooks?.afterMigration?.(\n tenantId,\n migration.name,\n Date.now() - migrationStart\n );\n\n appliedMigrations.push(migration.name);\n }\n\n const result: TenantMigrationResult = {\n tenantId,\n schemaName,\n success: true,\n appliedMigrations,\n durationMs: Date.now() - startTime,\n format: format.format,\n };\n\n await this.migratorConfig.hooks?.afterTenant?.(tenantId, result);\n\n return result;\n } catch (error) {\n const result: TenantMigrationResult = {\n tenantId,\n schemaName,\n success: false,\n appliedMigrations,\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n\n await this.migratorConfig.hooks?.afterTenant?.(tenantId, result);\n\n return result;\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Migrate specific tenants\n */\n async migrateTenants(tenantIds: string[], options: MigrateOptions = {}): Promise<MigrationResults> {\n const migrations = await this.loadMigrations();\n const results: TenantMigrationResult[] = [];\n\n const { concurrency = 10, onProgress, onError } = options;\n\n for (let i = 0; i < tenantIds.length; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.migrateTenant(tenantId, migrations, { dryRun: options.dryRun ?? false, onProgress });\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n onError?.(tenantId, error as Error);\n return this.createErrorResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n return this.aggregateResults(results);\n }\n\n /**\n * Get migration status for all tenants\n */\n async getStatus(): Promise<TenantMigrationStatus[]> {\n const tenantIds = await this.migratorConfig.tenantDiscovery();\n const migrations = await this.loadMigrations();\n const statuses: TenantMigrationStatus[] = [];\n\n for (const tenantId of tenantIds) {\n statuses.push(await this.getTenantStatus(tenantId, migrations));\n }\n\n return statuses;\n }\n\n /**\n * Get migration status for a specific tenant\n */\n async getTenantStatus(tenantId: string, migrations?: MigrationFile[]): Promise<TenantMigrationStatus> {\n const schemaName = this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n const pool = await this.createPool(schemaName);\n\n try {\n const allMigrations = migrations ?? await this.loadMigrations();\n\n // Check if migrations table exists\n const tableExists = await this.migrationsTableExists(pool, schemaName);\n if (!tableExists) {\n return {\n tenantId,\n schemaName,\n appliedCount: 0,\n pendingCount: allMigrations.length,\n pendingMigrations: allMigrations.map((m) => m.name),\n status: allMigrations.length > 0 ? 'behind' : 'ok',\n format: null, // New tenant, no table yet\n };\n }\n\n // Detect the table format\n const format = await this.getOrDetectFormat(pool, schemaName);\n\n const applied = await this.getAppliedMigrations(pool, schemaName, format);\n const appliedSet = new Set(applied.map((m) => m.identifier));\n\n // Use format-aware comparison\n const pending = allMigrations.filter(\n (m) => !this.isMigrationApplied(m, appliedSet, format)\n );\n\n return {\n tenantId,\n schemaName,\n appliedCount: applied.length,\n pendingCount: pending.length,\n pendingMigrations: pending.map((m) => m.name),\n status: pending.length > 0 ? 'behind' : 'ok',\n format: format.format,\n };\n } catch (error) {\n return {\n tenantId,\n schemaName,\n appliedCount: 0,\n pendingCount: 0,\n pendingMigrations: [],\n status: 'error',\n error: (error as Error).message,\n format: null,\n };\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Create a new tenant schema and optionally apply migrations\n */\n async createTenant(tenantId: string, options: CreateTenantOptions = {}): Promise<void> {\n const { migrate = true } = options;\n const schemaName = this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n\n const pool = new Pool({\n connectionString: this.tenantConfig.connection.url,\n ...this.tenantConfig.connection.poolConfig,\n });\n\n try {\n // Create schema\n await pool.query(`CREATE SCHEMA IF NOT EXISTS \"${schemaName}\"`);\n\n if (migrate) {\n // Apply all migrations\n await this.migrateTenant(tenantId);\n }\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Drop a tenant schema\n */\n async dropTenant(tenantId: string, options: DropTenantOptions = {}): Promise<void> {\n const { cascade = true } = options;\n const schemaName = this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n\n const pool = new Pool({\n connectionString: this.tenantConfig.connection.url,\n ...this.tenantConfig.connection.poolConfig,\n });\n\n try {\n const cascadeSql = cascade ? 'CASCADE' : 'RESTRICT';\n await pool.query(`DROP SCHEMA IF EXISTS \"${schemaName}\" ${cascadeSql}`);\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Check if a tenant schema exists\n */\n async tenantExists(tenantId: string): Promise<boolean> {\n const schemaName = this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n\n const pool = new Pool({\n connectionString: this.tenantConfig.connection.url,\n ...this.tenantConfig.connection.poolConfig,\n });\n\n try {\n const result = await pool.query(\n `SELECT 1 FROM information_schema.schemata WHERE schema_name = $1`,\n [schemaName]\n );\n return result.rowCount !== null && result.rowCount > 0;\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Mark migrations as applied without executing SQL\n * Useful for syncing tracking state with already-applied migrations\n */\n async markAsApplied(\n tenantId: string,\n options: { onProgress?: MigrateOptions['onProgress'] } = {}\n ): Promise<TenantMigrationResult> {\n const startTime = Date.now();\n const schemaName = this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n const markedMigrations: string[] = [];\n\n const pool = await this.createPool(schemaName);\n\n try {\n await this.migratorConfig.hooks?.beforeTenant?.(tenantId);\n\n // Detect or determine the format before creating table\n const format = await this.getOrDetectFormat(pool, schemaName);\n\n // Ensure migrations table exists with correct format\n await this.ensureMigrationsTable(pool, schemaName, format);\n\n // Load all migrations\n const allMigrations = await this.loadMigrations();\n\n // Get applied migrations\n const applied = await this.getAppliedMigrations(pool, schemaName, format);\n const appliedSet = new Set(applied.map((m) => m.identifier));\n\n // Filter pending migrations\n const pending = allMigrations.filter(\n (m) => !this.isMigrationApplied(m, appliedSet, format)\n );\n\n // Mark each pending migration as applied (without executing SQL)\n for (const migration of pending) {\n const migrationStart = Date.now();\n options.onProgress?.(tenantId, 'migrating', migration.name);\n\n await this.migratorConfig.hooks?.beforeMigration?.(tenantId, migration.name);\n await this.recordMigration(pool, schemaName, migration, format);\n await this.migratorConfig.hooks?.afterMigration?.(\n tenantId,\n migration.name,\n Date.now() - migrationStart\n );\n\n markedMigrations.push(migration.name);\n }\n\n const result: TenantMigrationResult = {\n tenantId,\n schemaName,\n success: true,\n appliedMigrations: markedMigrations,\n durationMs: Date.now() - startTime,\n format: format.format,\n };\n\n await this.migratorConfig.hooks?.afterTenant?.(tenantId, result);\n\n return result;\n } catch (error) {\n const result: TenantMigrationResult = {\n tenantId,\n schemaName,\n success: false,\n appliedMigrations: markedMigrations,\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n\n await this.migratorConfig.hooks?.afterTenant?.(tenantId, result);\n\n return result;\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Mark migrations as applied for all tenants without executing SQL\n * Useful for syncing tracking state with already-applied migrations\n */\n async markAllAsApplied(options: MigrateOptions = {}): Promise<MigrationResults> {\n const {\n concurrency = 10,\n onProgress,\n onError,\n } = options;\n\n const tenantIds = await this.migratorConfig.tenantDiscovery();\n const results: TenantMigrationResult[] = [];\n let aborted = false;\n\n // Process tenants in batches\n for (let i = 0; i < tenantIds.length && !aborted; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n if (aborted) {\n return this.createSkippedResult(tenantId);\n }\n\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.markAsApplied(tenantId, { onProgress });\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n const action = onError?.(tenantId, error as Error);\n if (action === 'abort') {\n aborted = true;\n }\n return this.createErrorResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n // Mark remaining tenants as skipped if aborted\n if (aborted) {\n const remaining = tenantIds.slice(results.length);\n for (const tenantId of remaining) {\n results.push(this.createSkippedResult(tenantId));\n }\n }\n\n return this.aggregateResults(results);\n }\n\n /**\n * Get sync status for all tenants\n * Detects divergences between migrations on disk and tracking in database\n */\n async getSyncStatus(): Promise<SyncStatus> {\n const tenantIds = await this.migratorConfig.tenantDiscovery();\n const migrations = await this.loadMigrations();\n const statuses: TenantSyncStatus[] = [];\n\n for (const tenantId of tenantIds) {\n statuses.push(await this.getTenantSyncStatus(tenantId, migrations));\n }\n\n return {\n total: statuses.length,\n inSync: statuses.filter((s) => s.inSync && !s.error).length,\n outOfSync: statuses.filter((s) => !s.inSync && !s.error).length,\n error: statuses.filter((s) => !!s.error).length,\n details: statuses,\n };\n }\n\n /**\n * Get sync status for a specific tenant\n */\n async getTenantSyncStatus(tenantId: string, migrations?: MigrationFile[]): Promise<TenantSyncStatus> {\n const schemaName = this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n const pool = await this.createPool(schemaName);\n\n try {\n const allMigrations = migrations ?? await this.loadMigrations();\n const migrationNames = new Set(allMigrations.map((m) => m.name));\n const migrationHashes = new Set(allMigrations.map((m) => m.hash));\n\n // Check if migrations table exists\n const tableExists = await this.migrationsTableExists(pool, schemaName);\n if (!tableExists) {\n return {\n tenantId,\n schemaName,\n missing: allMigrations.map((m) => m.name),\n orphans: [],\n inSync: allMigrations.length === 0,\n format: null,\n };\n }\n\n // Detect the table format\n const format = await this.getOrDetectFormat(pool, schemaName);\n const applied = await this.getAppliedMigrations(pool, schemaName, format);\n\n // Find missing migrations (in disk but not in database)\n const appliedIdentifiers = new Set(applied.map((m) => m.identifier));\n const missing = allMigrations\n .filter((m) => !this.isMigrationApplied(m, appliedIdentifiers, format))\n .map((m) => m.name);\n\n // Find orphan records (in database but not in disk)\n const orphans = applied\n .filter((m) => {\n if (format.columns.identifier === 'name') {\n return !migrationNames.has(m.identifier);\n }\n // For hash-based formats, check both hash and name\n return !migrationHashes.has(m.identifier) && !migrationNames.has(m.identifier);\n })\n .map((m) => m.identifier);\n\n return {\n tenantId,\n schemaName,\n missing,\n orphans,\n inSync: missing.length === 0 && orphans.length === 0,\n format: format.format,\n };\n } catch (error) {\n return {\n tenantId,\n schemaName,\n missing: [],\n orphans: [],\n inSync: false,\n format: null,\n error: (error as Error).message,\n };\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Mark missing migrations as applied for a tenant\n */\n async markMissing(tenantId: string): Promise<TenantSyncResult> {\n const startTime = Date.now();\n const schemaName = this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n const markedMigrations: string[] = [];\n\n const pool = await this.createPool(schemaName);\n\n try {\n const syncStatus = await this.getTenantSyncStatus(tenantId);\n\n if (syncStatus.error) {\n return {\n tenantId,\n schemaName,\n success: false,\n markedMigrations: [],\n removedOrphans: [],\n error: syncStatus.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n if (syncStatus.missing.length === 0) {\n return {\n tenantId,\n schemaName,\n success: true,\n markedMigrations: [],\n removedOrphans: [],\n durationMs: Date.now() - startTime,\n };\n }\n\n const format = await this.getOrDetectFormat(pool, schemaName);\n await this.ensureMigrationsTable(pool, schemaName, format);\n\n const allMigrations = await this.loadMigrations();\n const missingSet = new Set(syncStatus.missing);\n\n for (const migration of allMigrations) {\n if (missingSet.has(migration.name)) {\n await this.recordMigration(pool, schemaName, migration, format);\n markedMigrations.push(migration.name);\n }\n }\n\n return {\n tenantId,\n schemaName,\n success: true,\n markedMigrations,\n removedOrphans: [],\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n tenantId,\n schemaName,\n success: false,\n markedMigrations,\n removedOrphans: [],\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Mark missing migrations as applied for all tenants\n */\n async markAllMissing(options: SyncOptions = {}): Promise<SyncResults> {\n const { concurrency = 10, onProgress, onError } = options;\n\n const tenantIds = await this.migratorConfig.tenantDiscovery();\n const results: TenantSyncResult[] = [];\n let aborted = false;\n\n for (let i = 0; i < tenantIds.length && !aborted; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n if (aborted) {\n return this.createSkippedSyncResult(tenantId);\n }\n\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.markMissing(tenantId);\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n const action = onError?.(tenantId, error as Error);\n if (action === 'abort') {\n aborted = true;\n }\n return this.createErrorSyncResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n return this.aggregateSyncResults(results);\n }\n\n /**\n * Remove orphan migration records for a tenant\n */\n async cleanOrphans(tenantId: string): Promise<TenantSyncResult> {\n const startTime = Date.now();\n const schemaName = this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n const removedOrphans: string[] = [];\n\n const pool = await this.createPool(schemaName);\n\n try {\n const syncStatus = await this.getTenantSyncStatus(tenantId);\n\n if (syncStatus.error) {\n return {\n tenantId,\n schemaName,\n success: false,\n markedMigrations: [],\n removedOrphans: [],\n error: syncStatus.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n if (syncStatus.orphans.length === 0) {\n return {\n tenantId,\n schemaName,\n success: true,\n markedMigrations: [],\n removedOrphans: [],\n durationMs: Date.now() - startTime,\n };\n }\n\n const format = await this.getOrDetectFormat(pool, schemaName);\n const identifierColumn = format.columns.identifier;\n\n for (const orphan of syncStatus.orphans) {\n await pool.query(\n `DELETE FROM \"${schemaName}\".\"${format.tableName}\" WHERE \"${identifierColumn}\" = $1`,\n [orphan]\n );\n removedOrphans.push(orphan);\n }\n\n return {\n tenantId,\n schemaName,\n success: true,\n markedMigrations: [],\n removedOrphans,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n tenantId,\n schemaName,\n success: false,\n markedMigrations: [],\n removedOrphans,\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Remove orphan migration records for all tenants\n */\n async cleanAllOrphans(options: SyncOptions = {}): Promise<SyncResults> {\n const { concurrency = 10, onProgress, onError } = options;\n\n const tenantIds = await this.migratorConfig.tenantDiscovery();\n const results: TenantSyncResult[] = [];\n let aborted = false;\n\n for (let i = 0; i < tenantIds.length && !aborted; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n if (aborted) {\n return this.createSkippedSyncResult(tenantId);\n }\n\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.cleanOrphans(tenantId);\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n const action = onError?.(tenantId, error as Error);\n if (action === 'abort') {\n aborted = true;\n }\n return this.createErrorSyncResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n return this.aggregateSyncResults(results);\n }\n\n /**\n * Load migration files from the migrations folder\n */\n private async loadMigrations(): Promise<MigrationFile[]> {\n const files = await readdir(this.migratorConfig.migrationsFolder);\n\n const migrations: MigrationFile[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.sql')) continue;\n\n const filePath = join(this.migratorConfig.migrationsFolder, file);\n const content = await readFile(filePath, 'utf-8');\n\n // Extract timestamp from filename (e.g., 0001_migration_name.sql)\n const match = file.match(/^(\\d+)_/);\n const timestamp = match?.[1] ? parseInt(match[1], 10) : 0;\n\n // Compute SHA-256 hash for drizzle-kit compatibility\n const hash = createHash('sha256').update(content).digest('hex');\n\n migrations.push({\n name: basename(file, '.sql'),\n path: filePath,\n sql: content,\n timestamp,\n hash,\n });\n }\n\n // Sort by timestamp\n return migrations.sort((a, b) => a.timestamp - b.timestamp);\n }\n\n /**\n * Create a pool for a specific schema\n */\n private async createPool(schemaName: string): Promise<Pool> {\n return new Pool({\n connectionString: this.tenantConfig.connection.url,\n ...this.tenantConfig.connection.poolConfig,\n options: `-c search_path=\"${schemaName}\",public`,\n });\n }\n\n /**\n * Ensure migrations table exists with the correct format\n */\n private async ensureMigrationsTable(\n pool: Pool,\n schemaName: string,\n format: DetectedFormat\n ): Promise<void> {\n const { identifier, timestamp, timestampType } = format.columns;\n\n // Build column definitions based on format\n const identifierCol = identifier === 'name'\n ? 'name VARCHAR(255) NOT NULL UNIQUE'\n : 'hash TEXT NOT NULL';\n\n const timestampCol = timestampType === 'bigint'\n ? `${timestamp} BIGINT NOT NULL`\n : `${timestamp} TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP`;\n\n await pool.query(`\n CREATE TABLE IF NOT EXISTS \"${schemaName}\".\"${format.tableName}\" (\n id SERIAL PRIMARY KEY,\n ${identifierCol},\n ${timestampCol}\n )\n `);\n }\n\n /**\n * Check if migrations table exists\n */\n private async migrationsTableExists(pool: Pool, schemaName: string): Promise<boolean> {\n const result = await pool.query(\n `SELECT 1 FROM information_schema.tables\n WHERE table_schema = $1 AND table_name = $2`,\n [schemaName, this.migrationsTable]\n );\n return result.rowCount !== null && result.rowCount > 0;\n }\n\n /**\n * Get applied migrations for a schema\n */\n private async getAppliedMigrations(\n pool: Pool,\n schemaName: string,\n format: DetectedFormat\n ): Promise<AppliedMigration[]> {\n const identifierColumn = format.columns.identifier;\n const timestampColumn = format.columns.timestamp;\n\n const result = await pool.query<{ id: number; identifier: string; applied_at: string | number }>(\n `SELECT id, \"${identifierColumn}\" as identifier, \"${timestampColumn}\" as applied_at\n FROM \"${schemaName}\".\"${format.tableName}\"\n ORDER BY id`\n );\n\n return result.rows.map((row) => {\n // Convert timestamp based on format\n const appliedAt = format.columns.timestampType === 'bigint'\n ? new Date(Number(row.applied_at))\n : new Date(row.applied_at);\n\n return {\n id: row.id,\n identifier: row.identifier,\n // Set name or hash based on format\n ...(format.columns.identifier === 'name'\n ? { name: row.identifier }\n : { hash: row.identifier }),\n appliedAt,\n };\n });\n }\n\n /**\n * Check if a migration has been applied\n */\n private isMigrationApplied(\n migration: MigrationFile,\n appliedIdentifiers: Set<string>,\n format: DetectedFormat\n ): boolean {\n if (format.columns.identifier === 'name') {\n return appliedIdentifiers.has(migration.name);\n }\n\n // Hash-based: check both hash AND name for backwards compatibility\n // This allows migration from name-based to hash-based tracking\n return appliedIdentifiers.has(migration.hash) || appliedIdentifiers.has(migration.name);\n }\n\n /**\n * Get or detect the format for a schema\n * Returns the configured format or auto-detects from existing table\n */\n private async getOrDetectFormat(\n pool: Pool,\n schemaName: string\n ): Promise<DetectedFormat> {\n const configuredFormat = this.migratorConfig.tableFormat ?? 'auto';\n\n // If not auto, return the configured format\n if (configuredFormat !== 'auto') {\n return getFormatConfig(configuredFormat, this.migrationsTable);\n }\n\n // Auto-detect from existing table\n const detected = await detectTableFormat(pool, schemaName, this.migrationsTable);\n\n if (detected) {\n return detected;\n }\n\n // No table exists, use default format\n const defaultFormat: TableFormat = this.migratorConfig.defaultFormat ?? 'name';\n return getFormatConfig(defaultFormat, this.migrationsTable);\n }\n\n /**\n * Apply a migration to a schema\n */\n private async applyMigration(\n pool: Pool,\n schemaName: string,\n migration: MigrationFile,\n format: DetectedFormat\n ): Promise<void> {\n const client = await pool.connect();\n\n try {\n await client.query('BEGIN');\n\n // Execute migration SQL\n await client.query(migration.sql);\n\n // Record migration using format-aware insert\n const { identifier, timestamp, timestampType } = format.columns;\n const identifierValue = identifier === 'name' ? migration.name : migration.hash;\n const timestampValue = timestampType === 'bigint' ? Date.now() : new Date();\n\n await client.query(\n `INSERT INTO \"${schemaName}\".\"${format.tableName}\" (\"${identifier}\", \"${timestamp}\") VALUES ($1, $2)`,\n [identifierValue, timestampValue]\n );\n\n await client.query('COMMIT');\n } catch (error) {\n await client.query('ROLLBACK');\n throw error;\n } finally {\n client.release();\n }\n }\n\n /**\n * Record a migration as applied without executing SQL\n * Used by markAsApplied to sync tracking state\n */\n private async recordMigration(\n pool: Pool,\n schemaName: string,\n migration: MigrationFile,\n format: DetectedFormat\n ): Promise<void> {\n const { identifier, timestamp, timestampType } = format.columns;\n const identifierValue = identifier === 'name' ? migration.name : migration.hash;\n const timestampValue = timestampType === 'bigint' ? Date.now() : new Date();\n\n await pool.query(\n `INSERT INTO \"${schemaName}\".\"${format.tableName}\" (\"${identifier}\", \"${timestamp}\") VALUES ($1, $2)`,\n [identifierValue, timestampValue]\n );\n }\n\n /**\n * Create a skipped result\n */\n private createSkippedResult(tenantId: string): TenantMigrationResult {\n return {\n tenantId,\n schemaName: this.tenantConfig.isolation.schemaNameTemplate(tenantId),\n success: false,\n appliedMigrations: [],\n error: 'Skipped due to abort',\n durationMs: 0,\n };\n }\n\n /**\n * Create an error result\n */\n private createErrorResult(tenantId: string, error: Error): TenantMigrationResult {\n return {\n tenantId,\n schemaName: this.tenantConfig.isolation.schemaNameTemplate(tenantId),\n success: false,\n appliedMigrations: [],\n error: error.message,\n durationMs: 0,\n };\n }\n\n /**\n * Aggregate migration results\n */\n private aggregateResults(results: TenantMigrationResult[]): MigrationResults {\n return {\n total: results.length,\n succeeded: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success && r.error !== 'Skipped due to abort').length,\n skipped: results.filter((r) => r.error === 'Skipped due to abort').length,\n details: results,\n };\n }\n\n /**\n * Create a skipped sync result\n */\n private createSkippedSyncResult(tenantId: string): TenantSyncResult {\n return {\n tenantId,\n schemaName: this.tenantConfig.isolation.schemaNameTemplate(tenantId),\n success: false,\n markedMigrations: [],\n removedOrphans: [],\n error: 'Skipped due to abort',\n durationMs: 0,\n };\n }\n\n /**\n * Create an error sync result\n */\n private createErrorSyncResult(tenantId: string, error: Error): TenantSyncResult {\n return {\n tenantId,\n schemaName: this.tenantConfig.isolation.schemaNameTemplate(tenantId),\n success: false,\n markedMigrations: [],\n removedOrphans: [],\n error: error.message,\n durationMs: 0,\n };\n }\n\n /**\n * Aggregate sync results\n */\n private aggregateSyncResults(results: TenantSyncResult[]): SyncResults {\n return {\n total: results.length,\n succeeded: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n details: results,\n };\n }\n}\n\n/**\n * Create a migrator instance\n */\nexport function createMigrator<\n TTenantSchema extends Record<string, unknown>,\n TSharedSchema extends Record<string, unknown>,\n>(\n tenantConfig: Config<TTenantSchema, TSharedSchema>,\n migratorConfig: MigratorConfig\n): Migrator<TTenantSchema, TSharedSchema> {\n return new Migrator(tenantConfig, migratorConfig);\n}\n","import ora, { type Ora } from 'ora';\n\n/**\n * Create a spinner instance\n * @deprecated Use createContextSpinner from output.ts for TTY-aware spinners\n */\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: 'cyan',\n });\n}\n","import Table from 'cli-table3';\nimport chalk from 'chalk';\nimport type { TenantMigrationStatus } from '../../migrator/types.js';\nimport type { TableFormat } from '../../migrator/table-format.js';\n\n/**\n * Get format display text\n */\nfunction getFormatText(format: TableFormat | null): string {\n if (format === null) {\n return chalk.dim('(new)');\n }\n\n switch (format) {\n case 'name':\n return chalk.blue('name');\n case 'hash':\n return chalk.magenta('hash');\n case 'drizzle-kit':\n return chalk.cyan('drizzle-kit');\n }\n}\n\n/**\n * Create a status table for tenant migrations\n */\nexport function createStatusTable(statuses: TenantMigrationStatus[]): string {\n const table = new Table({\n head: [\n chalk.cyan('Tenant'),\n chalk.cyan('Schema'),\n chalk.cyan('Format'),\n chalk.cyan('Applied'),\n chalk.cyan('Pending'),\n chalk.cyan('Status'),\n ],\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const status of statuses) {\n const statusIcon = getStatusIcon(status.status);\n const statusText = getStatusText(status.status);\n\n table.push([\n status.tenantId,\n chalk.dim(status.schemaName),\n getFormatText(status.format),\n chalk.green(status.appliedCount.toString()),\n status.pendingCount > 0\n ? chalk.yellow(status.pendingCount.toString())\n : chalk.dim('0'),\n `${statusIcon} ${statusText}`,\n ]);\n }\n\n return table.toString();\n}\n\n/**\n * Create a results table for migration execution\n */\nexport function createResultsTable(\n results: Array<{\n tenantId: string;\n schemaName: string;\n success: boolean;\n appliedMigrations: string[];\n error?: string;\n durationMs: number;\n format?: TableFormat;\n }>\n): string {\n const table = new Table({\n head: [\n chalk.cyan('Tenant'),\n chalk.cyan('Format'),\n chalk.cyan('Migrations'),\n chalk.cyan('Duration'),\n chalk.cyan('Status'),\n ],\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const result of results) {\n const statusIcon = result.success ? chalk.green('✓') : chalk.red('✗');\n const statusText = result.success\n ? chalk.green('OK')\n : chalk.red(result.error ?? 'Failed');\n\n table.push([\n result.tenantId,\n getFormatText(result.format ?? null),\n result.appliedMigrations.length.toString(),\n `${result.durationMs}ms`,\n `${statusIcon} ${statusText}`,\n ]);\n }\n\n return table.toString();\n}\n\n/**\n * Create a pending migrations summary\n */\nexport function createPendingSummary(statuses: TenantMigrationStatus[]): string {\n const pendingMap = new Map<string, number>();\n\n for (const status of statuses) {\n for (const migration of status.pendingMigrations) {\n pendingMap.set(migration, (pendingMap.get(migration) || 0) + 1);\n }\n }\n\n if (pendingMap.size === 0) {\n return chalk.green('\\nAll tenants are up to date.');\n }\n\n const lines = [chalk.yellow('\\nPending migrations:')];\n\n for (const [migration, count] of pendingMap.entries()) {\n lines.push(\n ` ${chalk.dim('-')} ${migration} ${chalk.dim(`(${count} tenant${count > 1 ? 's' : ''})`)}`\n );\n }\n\n lines.push(\n chalk.dim('\\nRun \\'drizzle-multitenant migrate --all\\' to apply pending migrations.')\n );\n\n return lines.join('\\n');\n}\n\n/**\n * Get status icon\n */\nfunction getStatusIcon(status: 'ok' | 'behind' | 'error'): string {\n switch (status) {\n case 'ok':\n return chalk.green('✓');\n case 'behind':\n return chalk.yellow('⚠');\n case 'error':\n return chalk.red('✗');\n }\n}\n\n/**\n * Get status text\n */\nfunction getStatusText(status: 'ok' | 'behind' | 'error'): string {\n switch (status) {\n case 'ok':\n return chalk.green('OK');\n case 'behind':\n return chalk.yellow('Behind');\n case 'error':\n return chalk.red('Error');\n }\n}\n","import { pathToFileURL } from 'node:url';\nimport { resolve, extname } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { Config } from '../../types.js';\n\nconst CONFIG_FILE_NAMES = [\n 'tenant.config.ts',\n 'tenant.config.js',\n 'tenant.config.mjs',\n 'drizzle-multitenant.config.ts',\n 'drizzle-multitenant.config.js',\n 'drizzle-multitenant.config.mjs',\n];\n\nexport interface LoadedConfig {\n config: Config<Record<string, unknown>, Record<string, unknown>>;\n migrationsFolder?: string;\n migrationsTable?: string;\n tenantDiscovery?: () => Promise<string[]>;\n}\n\n/**\n * Load configuration from file\n */\nexport async function loadConfig(configPath?: string): Promise<LoadedConfig> {\n const cwd = process.cwd();\n\n let configFile: string | undefined;\n\n if (configPath) {\n configFile = resolve(cwd, configPath);\n if (!existsSync(configFile)) {\n throw new Error(`Config file not found: ${configFile}`);\n }\n } else {\n // Search for config file\n for (const name of CONFIG_FILE_NAMES) {\n const path = resolve(cwd, name);\n if (existsSync(path)) {\n configFile = path;\n break;\n }\n }\n }\n\n if (!configFile) {\n throw new Error(\n 'Config file not found. Create a tenant.config.ts or use --config flag.'\n );\n }\n\n // Handle TypeScript files\n const ext = extname(configFile);\n if (ext === '.ts') {\n // Register ts-node or tsx for TypeScript support\n await registerTypeScript();\n }\n\n // Import the config\n const configUrl = pathToFileURL(configFile).href;\n const module = await import(configUrl);\n const exported = module.default ?? module;\n\n if (!exported.connection || !exported.isolation || !exported.schemas) {\n throw new Error(\n 'Invalid config file. Expected an object with connection, isolation, and schemas properties.'\n );\n }\n\n return {\n config: exported,\n migrationsFolder: exported.migrations?.tenantFolder,\n migrationsTable: exported.migrations?.migrationsTable,\n tenantDiscovery: exported.migrations?.tenantDiscovery,\n };\n}\n\n/**\n * Register TypeScript loader\n */\nasync function registerTypeScript(): Promise<void> {\n try {\n // Try tsx first (faster)\n await import('tsx/esm');\n } catch {\n try {\n // Fall back to ts-node\n await import('ts-node/esm');\n } catch {\n throw new Error(\n 'TypeScript config requires tsx or ts-node. Install with: npm install -D tsx'\n );\n }\n }\n}\n\n/**\n * Resolve migrations folder path\n */\nexport function resolveMigrationsFolder(folder?: string): string {\n const cwd = process.cwd();\n const defaultFolder = './drizzle/tenant';\n\n const resolved = resolve(cwd, folder ?? defaultFolder);\n\n if (!existsSync(resolved)) {\n throw new Error(`Migrations folder not found: ${resolved}`);\n }\n\n return resolved;\n}\n","import ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\n\n/**\n * Output context for CLI commands\n * Controls TTY detection, JSON mode, verbosity, and colors\n */\nexport interface OutputContext {\n /** Whether stdout is a TTY (interactive terminal) */\n isInteractive: boolean;\n /** Output as JSON instead of human-readable format */\n jsonMode: boolean;\n /** Show verbose/debug output */\n verbose: boolean;\n /** Only show errors (quiet mode) */\n quiet: boolean;\n /** Disable colors in output */\n noColor: boolean;\n}\n\n// Global output context - initialized with defaults\nlet globalContext: OutputContext = {\n isInteractive: process.stdout.isTTY ?? false,\n jsonMode: false,\n verbose: false,\n quiet: false,\n noColor: false,\n};\n\n/**\n * Initialize the output context from CLI options\n */\nexport function initOutputContext(options: {\n json?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n noColor?: boolean;\n}): void {\n globalContext = {\n isInteractive: process.stdout.isTTY ?? false,\n jsonMode: options.json ?? false,\n verbose: options.verbose ?? false,\n quiet: options.quiet ?? false,\n noColor: options.noColor ?? !process.stdout.isTTY,\n };\n\n // Disable chalk colors if noColor is set\n if (globalContext.noColor) {\n chalk.level = 0;\n }\n}\n\n/**\n * Get the current output context\n */\nexport function getOutputContext(): OutputContext {\n return globalContext;\n}\n\n/**\n * Check if we should show interactive elements (spinners, progress bars)\n */\nexport function shouldShowInteractive(): boolean {\n return globalContext.isInteractive && !globalContext.jsonMode && !globalContext.quiet;\n}\n\n/**\n * Check if we should show regular log output\n */\nexport function shouldShowLog(): boolean {\n return !globalContext.jsonMode && !globalContext.quiet;\n}\n\n/**\n * Check if we should show verbose/debug output\n */\nexport function shouldShowVerbose(): boolean {\n return globalContext.verbose && !globalContext.jsonMode;\n}\n\n/**\n * Create a spinner that respects output context\n * Returns a no-op spinner if not in interactive mode\n */\nexport function createContextSpinner(text: string): Ora {\n if (!shouldShowInteractive()) {\n // Return a no-op spinner\n return {\n start: () => noopSpinner,\n stop: () => noopSpinner,\n succeed: () => noopSpinner,\n fail: () => noopSpinner,\n warn: () => noopSpinner,\n info: () => noopSpinner,\n isSpinning: false,\n text: '',\n color: 'cyan',\n } as unknown as Ora;\n }\n\n return ora({\n text,\n color: 'cyan',\n });\n}\n\nconst noopSpinner = {\n start: () => noopSpinner,\n stop: () => noopSpinner,\n succeed: () => noopSpinner,\n fail: () => noopSpinner,\n warn: () => noopSpinner,\n info: () => noopSpinner,\n isSpinning: false,\n text: '',\n color: 'cyan',\n};\n\n/**\n * Log a message if not in quiet/json mode\n */\nexport function log(message: string): void {\n if (shouldShowLog()) {\n console.log(message);\n }\n}\n\n/**\n * Log a verbose/debug message\n */\nexport function debug(message: string): void {\n if (shouldShowVerbose()) {\n console.log(chalk.dim(`[debug] ${message}`));\n }\n}\n\n/**\n * Log an error message (always shown unless JSON mode)\n */\nexport function logError(message: string): void {\n if (!globalContext.jsonMode) {\n console.error(chalk.red('✗ ') + message);\n }\n}\n\n/**\n * Output JSON data (only in JSON mode)\n */\nexport function outputJson<T>(data: T): void {\n if (globalContext.jsonMode) {\n console.log(JSON.stringify(data, null, 2));\n }\n}\n\n/**\n * Format success message\n */\nexport function success(message: string): string {\n return chalk.green('✓ ') + message;\n}\n\n/**\n * Format error message\n */\nexport function error(message: string): string {\n return chalk.red('✗ ') + message;\n}\n\n/**\n * Format warning message\n */\nexport function warning(message: string): string {\n return chalk.yellow('⚠ ') + message;\n}\n\n/**\n * Format info message\n */\nexport function info(message: string): string {\n return chalk.blue('ℹ ') + message;\n}\n\n/**\n * Format dim text\n */\nexport function dim(message: string): string {\n return chalk.dim(message);\n}\n\n/**\n * Format bold text\n */\nexport function bold(message: string): string {\n return chalk.bold(message);\n}\n\n/**\n * Format cyan text\n */\nexport function cyan(message: string): string {\n return chalk.cyan(message);\n}\n\n/**\n * Format green text\n */\nexport function green(message: string): string {\n return chalk.green(message);\n}\n\n/**\n * Format red text\n */\nexport function red(message: string): string {\n return chalk.red(message);\n}\n\n/**\n * Format yellow text\n */\nexport function yellow(message: string): string {\n return chalk.yellow(message);\n}\n\n/**\n * Format magenta text\n */\nexport function magenta(message: string): string {\n return chalk.magenta(message);\n}\n","import cliProgress from 'cli-progress';\nimport chalk from 'chalk';\nimport { shouldShowInteractive, dim, green, red } from './output.js';\n\nexport interface ProgressBarOptions {\n /** Total number of items to process */\n total: number;\n /** Format string for the progress bar */\n format?: string;\n /** Show ETA (estimated time remaining) */\n showEta?: boolean;\n}\n\nexport interface ProgressBar {\n /** Start the progress bar */\n start(): void;\n /** Update progress with current item info */\n update(current: number, payload?: { tenant?: string; status?: 'success' | 'error' }): void;\n /** Increment progress by 1 */\n increment(payload?: { tenant?: string; status?: 'success' | 'error' }): void;\n /** Stop the progress bar */\n stop(): void;\n}\n\n/**\n * Create a progress bar for tenant migrations\n * Returns a no-op progress bar if not in interactive mode\n */\nexport function createProgressBar(options: ProgressBarOptions): ProgressBar {\n const { total } = options;\n\n if (!shouldShowInteractive()) {\n // Return a no-op progress bar\n return {\n start: () => {},\n update: () => {},\n increment: () => {},\n stop: () => {},\n };\n }\n\n const format =\n options.format ||\n `${chalk.cyan('Migrating')} ${chalk.cyan('{bar}')} ${chalk.yellow('{percentage}%')} | {value}/{total} | {tenant} | ${dim('{eta}s')}`;\n\n const bar = new cliProgress.SingleBar(\n {\n format,\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591',\n hideCursor: true,\n clearOnComplete: false,\n stopOnComplete: true,\n etaBuffer: 10,\n },\n cliProgress.Presets.shades_classic\n );\n\n let currentValue = 0;\n\n return {\n start() {\n bar.start(total, 0, { tenant: 'starting...', status: '' });\n },\n\n update(current: number, payload?: { tenant?: string; status?: 'success' | 'error' }) {\n currentValue = current;\n const statusIcon = payload?.status === 'success' ? green('✓') : payload?.status === 'error' ? red('✗') : '';\n bar.update(current, {\n tenant: payload?.tenant ? `${statusIcon} ${payload.tenant}` : '',\n });\n },\n\n increment(payload?: { tenant?: string; status?: 'success' | 'error' }) {\n currentValue++;\n const statusIcon = payload?.status === 'success' ? green('✓') : payload?.status === 'error' ? red('✗') : '';\n bar.update(currentValue, {\n tenant: payload?.tenant ? `${statusIcon} ${payload.tenant}` : '',\n });\n },\n\n stop() {\n bar.stop();\n },\n };\n}\n\n/**\n * Create a multi-bar for concurrent operations\n */\nexport function createMultiProgressBar(): {\n create(total: number, startValue: number, payload?: Record<string, unknown>): cliProgress.SingleBar;\n stop(): void;\n} {\n if (!shouldShowInteractive()) {\n return {\n create: () => ({\n start: () => {},\n update: () => {},\n increment: () => {},\n stop: () => {},\n } as unknown as cliProgress.SingleBar),\n stop: () => {},\n };\n }\n\n const multibar = new cliProgress.MultiBar(\n {\n clearOnComplete: false,\n hideCursor: true,\n format: `${chalk.cyan('{bar}')} | {tenant} | {status}`,\n },\n cliProgress.Presets.shades_grey\n );\n\n return {\n create(total: number, startValue: number, payload?: Record<string, unknown>) {\n return multibar.create(total, startValue, payload);\n },\n stop() {\n multibar.stop();\n },\n };\n}\n","import { error, dim, cyan, getOutputContext } from './output.js';\n\n/**\n * CLI Error with actionable suggestions\n */\nexport class CLIError extends Error {\n constructor(\n message: string,\n public readonly suggestion?: string,\n public readonly example?: string,\n public readonly docs?: string\n ) {\n super(message);\n this.name = 'CLIError';\n }\n\n /**\n * Format the error for display\n */\n format(): string {\n const lines: string[] = [error(this.message)];\n\n if (this.suggestion) {\n lines.push('');\n lines.push(dim(' Suggestion: ') + this.suggestion);\n }\n\n if (this.example) {\n lines.push('');\n lines.push(dim(' Example:'));\n lines.push(cyan(' ' + this.example));\n }\n\n if (this.docs) {\n lines.push('');\n lines.push(dim(' Docs: ') + this.docs);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format as JSON for machine-readable output\n */\n toJSON(): object {\n return {\n error: this.message,\n suggestion: this.suggestion,\n example: this.example,\n docs: this.docs,\n };\n }\n}\n\n/**\n * Common CLI errors with pre-defined suggestions\n */\nexport const CLIErrors = {\n configNotFound: (searchPaths?: string[]) =>\n new CLIError(\n 'Configuration file not found',\n 'Create a tenant.config.ts file or use --config <path>',\n `export default defineConfig({\n connection: process.env.DATABASE_URL,\n isolation: { type: 'schema', schemaNameTemplate: (id) => \\`tenant_\\${id}\\` },\n schemas: {\n tenant: { ... },\n },\n})`,\n searchPaths ? `Searched: ${searchPaths.join(', ')}` : undefined\n ),\n\n noTenantDiscovery: () =>\n new CLIError(\n 'No tenant discovery function configured',\n 'Add a tenantDiscovery function to your config migrations settings',\n `migrations: {\n tenantDiscovery: async () => {\n const tenants = await db.select().from(tenantsTable);\n return tenants.map(t => t.id);\n },\n}`\n ),\n\n noTenantSpecified: () =>\n new CLIError(\n 'No tenant specified',\n 'Use --all, --tenant <id>, or --tenants <ids> to specify which tenants to migrate',\n `npx drizzle-multitenant migrate --all\nnpx drizzle-multitenant migrate --tenant=my-tenant\nnpx drizzle-multitenant migrate --tenants=tenant-1,tenant-2`\n ),\n\n tenantNotFound: (tenantId: string) =>\n new CLIError(\n `Tenant '${tenantId}' not found`,\n 'Check if the tenant exists in your database',\n 'npx drizzle-multitenant status'\n ),\n\n migrationsFolderNotFound: (path: string) =>\n new CLIError(\n `Migrations folder not found: ${path}`,\n 'Create the migrations folder or specify a different path with --migrations-folder',\n `mkdir -p ${path}\nnpx drizzle-multitenant generate --name initial`\n ),\n\n invalidFormat: (format: string, validFormats: string[]) =>\n new CLIError(\n `Invalid format: '${format}'`,\n `Valid formats are: ${validFormats.join(', ')}`,\n `npx drizzle-multitenant convert-format --to=${validFormats[0]}`\n ),\n\n connectionFailed: (reason: string) =>\n new CLIError(\n `Database connection failed: ${reason}`,\n 'Check your DATABASE_URL and ensure the database is running',\n 'export DATABASE_URL=\"postgresql://user:pass@localhost:5432/mydb\"'\n ),\n\n migrationFailed: (tenantId: string, reason: string) =>\n new CLIError(\n `Migration failed for tenant '${tenantId}': ${reason}`,\n 'Check the migration SQL for syntax errors or constraint violations'\n ),\n};\n\n/**\n * Handle an error and exit the process\n */\nexport function handleError(err: unknown): never {\n const ctx = getOutputContext();\n\n if (ctx.jsonMode) {\n if (err instanceof CLIError) {\n console.log(JSON.stringify(err.toJSON(), null, 2));\n } else {\n console.log(JSON.stringify({ error: (err as Error).message }, null, 2));\n }\n process.exit(1);\n }\n\n if (err instanceof CLIError) {\n console.error(err.format());\n } else {\n console.error(error((err as Error).message));\n }\n\n process.exit(1);\n}\n\n/**\n * Wrap a command action with error handling\n */\nexport function withErrorHandling<T extends (...args: unknown[]) => Promise<void>>(\n fn: T\n): T {\n return (async (...args: unknown[]) => {\n try {\n await fn(...args);\n } catch (err) {\n handleError(err);\n }\n }) as T;\n}\n","import { Command } from 'commander';\nimport { checkbox } from '@inquirer/prompts';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createResultsTable,\n createSpinner,\n createProgressBar,\n CLIErrors,\n handleError,\n getOutputContext,\n log,\n debug,\n outputJson,\n success,\n error,\n info,\n warning,\n bold,\n dim,\n shouldShowInteractive,\n} from '../utils/index.js';\nimport type { MigrateJsonOutput, MigrateOptions } from '../types.js';\n\nexport const migrateCommand = new Command('migrate')\n .description('Apply pending migrations to tenant schemas')\n .option('-c, --config <path>', 'Path to config file')\n .option('-a, --all', 'Migrate all tenants')\n .option('-t, --tenant <id>', 'Migrate a specific tenant')\n .option('--tenants <ids>', 'Migrate specific tenants (comma-separated)')\n .option('--concurrency <number>', 'Number of concurrent migrations', '10')\n .option('--dry-run', 'Show what would be applied without executing')\n .option('--mark-applied', 'Mark migrations as applied without executing SQL')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant migrate --all\n $ drizzle-multitenant migrate --tenant=my-tenant\n $ drizzle-multitenant migrate --tenants=tenant-1,tenant-2\n $ drizzle-multitenant migrate --all --dry-run\n $ drizzle-multitenant migrate --all --concurrency=5\n $ drizzle-multitenant migrate --all --json\n $ drizzle-multitenant migrate --all --mark-applied\n`)\n .action(async (options: MigrateOptions) => {\n const startTime = Date.now();\n const ctx = getOutputContext();\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n debug(`Using migrations folder: ${folder}`);\n\n // Determine tenant discovery function\n let discoveryFn: () => Promise<string[]>;\n let tenantIds: string[];\n\n if (options.tenant) {\n discoveryFn = async () => [options.tenant!];\n tenantIds = [options.tenant];\n } else if (options.tenants) {\n const ids = options.tenants.split(',').map((id: string) => id.trim());\n discoveryFn = async () => ids;\n tenantIds = ids;\n } else if (options.all) {\n if (!tenantDiscovery) {\n throw CLIErrors.noTenantDiscovery();\n }\n discoveryFn = tenantDiscovery;\n spinner.text = 'Discovering tenants...';\n tenantIds = await tenantDiscovery();\n } else {\n spinner.stop();\n\n // Interactive mode: let user select tenants\n if (shouldShowInteractive() && tenantDiscovery) {\n log(info('No tenants specified. Fetching available tenants...\\n'));\n\n const availableTenants = await tenantDiscovery();\n\n if (availableTenants.length === 0) {\n log(warning('No tenants found.'));\n return;\n }\n\n const selectedTenants = await checkbox({\n message: 'Select tenants to migrate:',\n choices: availableTenants.map(id => ({ name: id, value: id })),\n pageSize: 15,\n });\n\n if (selectedTenants.length === 0) {\n log(warning('No tenants selected. Aborting.'));\n return;\n }\n\n discoveryFn = async () => selectedTenants;\n tenantIds = selectedTenants;\n } else {\n throw CLIErrors.noTenantSpecified();\n }\n }\n\n if (tenantIds.length === 0) {\n spinner.stop();\n log(warning('No tenants found.'));\n return;\n }\n\n spinner.text = `Found ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}`;\n spinner.succeed();\n\n if (options.dryRun) {\n log(info(bold('\\nDry run mode - no changes will be made\\n')));\n }\n\n if (options.markApplied) {\n log(info(bold('\\nMark-applied mode - migrations will be recorded without executing SQL\\n')));\n }\n\n const actionLabel = options.markApplied ? 'Marking' : 'Migrating';\n log(info(`${actionLabel} ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}...\\n`));\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery: discoveryFn,\n });\n\n const concurrency = parseInt(options.concurrency || '10', 10);\n\n // Use progress bar for interactive mode, simple logs otherwise\n const progressBar = createProgressBar({ total: tenantIds.length });\n progressBar.start();\n\n const migrateOptions = {\n concurrency,\n onProgress: (tenantId: string, status: string, migrationName?: string) => {\n if (status === 'completed') {\n progressBar.increment({ tenant: tenantId, status: 'success' });\n debug(`Completed: ${tenantId}`);\n } else if (status === 'failed') {\n progressBar.increment({ tenant: tenantId, status: 'error' });\n debug(`Failed: ${tenantId}`);\n } else if (status === 'migrating' && migrationName) {\n const actionVerb = options.markApplied ? 'Marking' : 'Applying';\n debug(`${tenantId}: ${actionVerb} ${migrationName}`);\n }\n },\n onError: (tenantId: string, err: Error) => {\n debug(`Error on ${tenantId}: ${err.message}`);\n return 'continue' as const;\n },\n };\n\n const results = options.markApplied\n ? await migrator.markAllAsApplied(migrateOptions)\n : await migrator.migrateAll({ ...migrateOptions, dryRun: !!options.dryRun });\n\n progressBar.stop();\n\n const totalDuration = Date.now() - startTime;\n\n // JSON output\n if (ctx.jsonMode) {\n const jsonOutput: MigrateJsonOutput = {\n results: results.details.map(r => ({\n tenantId: r.tenantId,\n schema: r.schemaName,\n success: r.success,\n appliedMigrations: r.appliedMigrations,\n durationMs: r.durationMs,\n format: r.format,\n error: r.error,\n })),\n summary: {\n total: results.total,\n succeeded: results.succeeded,\n failed: results.failed,\n skipped: results.skipped,\n durationMs: totalDuration,\n averageMs: results.total > 0 ? Math.round(totalDuration / results.total) : undefined,\n },\n };\n outputJson(jsonOutput);\n process.exit(results.failed > 0 ? 1 : 0);\n }\n\n // Human-readable output\n log('\\n' + bold('Results:'));\n log(createResultsTable(results.details));\n\n log('\\n' + bold('Summary:'));\n log(` Total: ${results.total}`);\n log(` Succeeded: ${success(results.succeeded.toString())}`);\n if (results.failed > 0) {\n log(` Failed: ${error(results.failed.toString())}`);\n }\n if (results.skipped > 0) {\n log(` Skipped: ${warning(results.skipped.toString())}`);\n }\n log(` Duration: ${dim(formatDuration(totalDuration))}`);\n if (results.total > 0) {\n log(` Average: ${dim(formatDuration(Math.round(totalDuration / results.total)) + '/tenant')}`);\n }\n\n // Show failed tenants summary\n if (results.failed > 0) {\n log('\\n' + bold('Failed tenants:'));\n for (const detail of results.details.filter(d => !d.success)) {\n log(` ${error(detail.tenantId)}: ${dim(detail.error || 'Unknown error')}`);\n }\n log('\\n' + dim('Run with --verbose to see more details.'));\n }\n\n if (results.failed > 0) {\n process.exit(1);\n }\n } catch (err) {\n spinner.fail((err as Error).message);\n handleError(err);\n }\n });\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n","import { Command } from 'commander';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n createStatusTable,\n createPendingSummary,\n CLIErrors,\n handleError,\n getOutputContext,\n log,\n debug,\n outputJson,\n bold,\n} from '../utils/index.js';\nimport type { StatusJsonOutput, StatusOptions } from '../types.js';\n\nexport const statusCommand = new Command('status')\n .description('Show migration status for all tenants')\n .option('-c, --config <path>', 'Path to config file')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant status\n $ drizzle-multitenant status --json\n $ drizzle-multitenant status --json | jq '.tenants[] | select(.pending > 0)'\n $ drizzle-multitenant status --verbose\n`)\n .action(async (options: StatusOptions) => {\n const ctx = getOutputContext();\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n if (!tenantDiscovery) {\n throw CLIErrors.noTenantDiscovery();\n }\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n debug(`Using migrations folder: ${folder}`);\n\n spinner.text = 'Discovering tenants...';\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery,\n });\n\n spinner.text = 'Fetching migration status...';\n\n const statuses = await migrator.getStatus();\n\n spinner.succeed(`Found ${statuses.length} tenant${statuses.length > 1 ? 's' : ''}`);\n\n // Calculate summary\n const summary = {\n total: statuses.length,\n upToDate: statuses.filter(s => s.status === 'ok').length,\n behind: statuses.filter(s => s.status === 'behind').length,\n error: statuses.filter(s => s.status === 'error').length,\n };\n\n debug(`Summary: ${summary.upToDate} up-to-date, ${summary.behind} behind, ${summary.error} errors`);\n\n // JSON output\n if (ctx.jsonMode) {\n const jsonOutput: StatusJsonOutput = {\n tenants: statuses.map(s => ({\n id: s.tenantId,\n schema: s.schemaName,\n format: s.format,\n applied: s.appliedCount,\n pending: s.pendingCount,\n status: s.status,\n pendingMigrations: s.pendingMigrations,\n error: s.error,\n })),\n summary,\n };\n outputJson(jsonOutput);\n return;\n }\n\n // Human-readable output\n log('\\n' + bold('Migration Status:'));\n log(createStatusTable(statuses));\n log(createPendingSummary(statuses));\n } catch (err) {\n spinner.fail((err as Error).message);\n handleError(err);\n }\n });\n","import { Command } from 'commander';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n createProgressBar,\n CLIErrors,\n handleError,\n getOutputContext,\n log,\n debug,\n outputJson,\n success,\n error,\n info,\n warning,\n bold,\n dim,\n} from '../utils/index.js';\nimport type { SyncOptions, SyncJsonOutput } from '../types.js';\n\nexport const syncCommand = new Command('sync')\n .description('Detect and fix divergences between migrations on disk and tracking in database')\n .option('-c, --config <path>', 'Path to config file')\n .option('-s, --status', 'Show sync status without making changes')\n .option('--mark-missing', 'Mark missing migrations as applied')\n .option('--clean-orphans', 'Remove orphan records from tracking table')\n .option('--concurrency <number>', 'Number of concurrent operations', '10')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant sync --status\n $ drizzle-multitenant sync --mark-missing\n $ drizzle-multitenant sync --clean-orphans\n $ drizzle-multitenant sync --mark-missing --clean-orphans\n $ drizzle-multitenant sync --status --json\n`)\n .action(async (options: SyncOptions) => {\n const startTime = Date.now();\n const ctx = getOutputContext();\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n if (!tenantDiscovery) {\n throw CLIErrors.noTenantDiscovery();\n }\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n debug(`Using migrations folder: ${folder}`);\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery,\n });\n\n // Default to status if no action specified\n const showStatus = options.status || (!options.markMissing && !options.cleanOrphans);\n\n if (showStatus) {\n spinner.text = 'Fetching sync status...';\n\n const syncStatus = await migrator.getSyncStatus();\n\n spinner.succeed(`Found ${syncStatus.total} tenant${syncStatus.total > 1 ? 's' : ''}`);\n\n // JSON output\n if (ctx.jsonMode) {\n const jsonOutput: SyncJsonOutput = {\n tenants: syncStatus.details.map(s => ({\n id: s.tenantId,\n schema: s.schemaName,\n format: s.format,\n inSync: s.inSync,\n missing: s.missing,\n orphans: s.orphans,\n error: s.error,\n })),\n summary: {\n total: syncStatus.total,\n inSync: syncStatus.inSync,\n outOfSync: syncStatus.outOfSync,\n error: syncStatus.error,\n },\n };\n outputJson(jsonOutput);\n return;\n }\n\n // Human-readable output\n log('\\n' + bold('Sync Status:'));\n log(createSyncStatusTable(syncStatus.details));\n log(createSyncSummary(syncStatus));\n return;\n }\n\n // Execute sync actions\n const concurrency = parseInt(options.concurrency || '10', 10);\n\n if (options.markMissing) {\n spinner.text = 'Marking missing migrations...';\n spinner.succeed();\n\n const tenantIds = await tenantDiscovery();\n log(info(`\\nMarking missing migrations for ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}...\\n`));\n\n const progressBar = createProgressBar({ total: tenantIds.length });\n progressBar.start();\n\n const results = await migrator.markAllMissing({\n concurrency,\n onProgress: (tenantId, status) => {\n if (status === 'completed') {\n progressBar.increment({ tenant: tenantId, status: 'success' });\n } else if (status === 'failed') {\n progressBar.increment({ tenant: tenantId, status: 'error' });\n }\n },\n onError: (tenantId, err) => {\n debug(`Error on ${tenantId}: ${err.message}`);\n return 'continue';\n },\n });\n\n progressBar.stop();\n\n const totalDuration = Date.now() - startTime;\n\n if (ctx.jsonMode) {\n outputJson({\n action: 'mark-missing',\n results: results.details.map(r => ({\n tenantId: r.tenantId,\n schema: r.schemaName,\n success: r.success,\n markedMigrations: r.markedMigrations,\n durationMs: r.durationMs,\n error: r.error,\n })),\n summary: {\n total: results.total,\n succeeded: results.succeeded,\n failed: results.failed,\n durationMs: totalDuration,\n },\n });\n process.exit(results.failed > 0 ? 1 : 0);\n }\n\n log('\\n' + bold('Results:'));\n log(createSyncResultsTable(results.details, 'mark-missing'));\n log('\\n' + bold('Summary:'));\n log(` Total: ${results.total}`);\n log(` Succeeded: ${success(results.succeeded.toString())}`);\n if (results.failed > 0) {\n log(` Failed: ${error(results.failed.toString())}`);\n }\n log(` Duration: ${dim(formatDuration(totalDuration))}`);\n }\n\n if (options.cleanOrphans) {\n if (options.markMissing) {\n log('\\n'); // Add space between operations\n }\n\n spinner.text = 'Cleaning orphan records...';\n spinner.succeed();\n\n const tenantIds = await tenantDiscovery();\n log(info(`\\nCleaning orphan records for ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}...\\n`));\n\n const progressBar = createProgressBar({ total: tenantIds.length });\n progressBar.start();\n\n const results = await migrator.cleanAllOrphans({\n concurrency,\n onProgress: (tenantId, status) => {\n if (status === 'completed') {\n progressBar.increment({ tenant: tenantId, status: 'success' });\n } else if (status === 'failed') {\n progressBar.increment({ tenant: tenantId, status: 'error' });\n }\n },\n onError: (tenantId, err) => {\n debug(`Error on ${tenantId}: ${err.message}`);\n return 'continue';\n },\n });\n\n progressBar.stop();\n\n const totalDuration = Date.now() - startTime;\n\n if (ctx.jsonMode) {\n outputJson({\n action: 'clean-orphans',\n results: results.details.map(r => ({\n tenantId: r.tenantId,\n schema: r.schemaName,\n success: r.success,\n removedOrphans: r.removedOrphans,\n durationMs: r.durationMs,\n error: r.error,\n })),\n summary: {\n total: results.total,\n succeeded: results.succeeded,\n failed: results.failed,\n durationMs: totalDuration,\n },\n });\n process.exit(results.failed > 0 ? 1 : 0);\n }\n\n log('\\n' + bold('Results:'));\n log(createSyncResultsTable(results.details, 'clean-orphans'));\n log('\\n' + bold('Summary:'));\n log(` Total: ${results.total}`);\n log(` Succeeded: ${success(results.succeeded.toString())}`);\n if (results.failed > 0) {\n log(` Failed: ${error(results.failed.toString())}`);\n }\n log(` Duration: ${dim(formatDuration(totalDuration))}`);\n }\n } catch (err) {\n spinner.fail((err as Error).message);\n handleError(err);\n }\n });\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\n/**\n * Create a table showing sync status\n */\nfunction createSyncStatusTable(details: Array<{\n tenantId: string;\n schemaName: string;\n missing: string[];\n orphans: string[];\n inSync: boolean;\n error?: string;\n}>): string {\n if (details.length === 0) {\n return ' No tenants found.\\n';\n }\n\n const lines: string[] = [];\n\n for (const detail of details) {\n if (detail.error) {\n lines.push(` ${error(detail.tenantId)}: ${dim(detail.error)}`);\n } else if (detail.inSync) {\n lines.push(` ${success(detail.tenantId)}: ${dim('In sync')}`);\n } else {\n const issues: string[] = [];\n if (detail.missing.length > 0) {\n issues.push(`${detail.missing.length} missing`);\n }\n if (detail.orphans.length > 0) {\n issues.push(`${detail.orphans.length} orphan${detail.orphans.length > 1 ? 's' : ''}`);\n }\n lines.push(` ${warning(detail.tenantId)}: ${issues.join(', ')}`);\n\n // Show details\n if (detail.missing.length > 0) {\n lines.push(` ${dim('Missing:')} ${detail.missing.slice(0, 3).join(', ')}${detail.missing.length > 3 ? `, +${detail.missing.length - 3} more` : ''}`);\n }\n if (detail.orphans.length > 0) {\n lines.push(` ${dim('Orphans:')} ${detail.orphans.slice(0, 3).join(', ')}${detail.orphans.length > 3 ? `, +${detail.orphans.length - 3} more` : ''}`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * Create a summary of sync status\n */\nfunction createSyncSummary(status: {\n total: number;\n inSync: number;\n outOfSync: number;\n error: number;\n}): string {\n const lines: string[] = [];\n\n lines.push('\\n' + bold('Summary:'));\n lines.push(` Total: ${status.total}`);\n lines.push(` In Sync: ${success(status.inSync.toString())}`);\n if (status.outOfSync > 0) {\n lines.push(` Out of Sync: ${warning(status.outOfSync.toString())}`);\n }\n if (status.error > 0) {\n lines.push(` Errors: ${error(status.error.toString())}`);\n }\n\n if (status.outOfSync > 0) {\n lines.push('\\n' + dim('Run with --mark-missing to mark missing migrations as applied.'));\n lines.push(dim('Run with --clean-orphans to remove orphan records.'));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Create a table showing sync results\n */\nfunction createSyncResultsTable(\n details: Array<{\n tenantId: string;\n success: boolean;\n markedMigrations: string[];\n removedOrphans: string[];\n error?: string;\n }>,\n action: 'mark-missing' | 'clean-orphans'\n): string {\n if (details.length === 0) {\n return ' No tenants processed.\\n';\n }\n\n const lines: string[] = [];\n\n for (const detail of details) {\n if (detail.error) {\n lines.push(` ${error(detail.tenantId)}: ${dim(detail.error)}`);\n } else if (action === 'mark-missing') {\n if (detail.markedMigrations.length > 0) {\n lines.push(` ${success(detail.tenantId)}: Marked ${detail.markedMigrations.length} migration${detail.markedMigrations.length > 1 ? 's' : ''}`);\n } else {\n lines.push(` ${dim(detail.tenantId)}: Nothing to mark`);\n }\n } else {\n if (detail.removedOrphans.length > 0) {\n lines.push(` ${success(detail.tenantId)}: Removed ${detail.removedOrphans.length} orphan${detail.removedOrphans.length > 1 ? 's' : ''}`);\n } else {\n lines.push(` ${dim(detail.tenantId)}: No orphans found`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n","import { Command } from 'commander';\nimport { writeFile, mkdir, readdir } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport {\n loadConfig,\n createSpinner,\n success,\n dim,\n} from '../utils/index.js';\n\nexport const generateCommand = new Command('generate')\n .description('Generate a new migration file')\n .requiredOption('-n, --name <name>', 'Migration name')\n .option('-c, --config <path>', 'Path to config file')\n .option('--type <type>', 'Migration type: tenant or shared', 'tenant')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .action(async (options) => {\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { migrationsFolder: configFolder } = await loadConfig(options.config);\n\n const cwd = process.cwd();\n let folder: string;\n\n if (options.migrationsFolder) {\n folder = resolve(cwd, options.migrationsFolder);\n } else if (configFolder) {\n folder = resolve(cwd, configFolder);\n } else {\n folder = resolve(cwd, options.type === 'shared' ? './drizzle/shared' : './drizzle/tenant');\n }\n\n // Ensure folder exists\n if (!existsSync(folder)) {\n await mkdir(folder, { recursive: true });\n spinner.text = `Created migrations folder: ${folder}`;\n }\n\n spinner.text = 'Generating migration...';\n\n // Get next sequence number\n const files = existsSync(folder) ? await readdir(folder) : [];\n const sqlFiles = files.filter((f) => f.endsWith('.sql'));\n\n let maxSequence = 0;\n for (const file of sqlFiles) {\n const match = file.match(/^(\\d+)_/);\n if (match?.[1]) {\n const seq = parseInt(match[1], 10);\n if (seq > maxSequence) {\n maxSequence = seq;\n }\n }\n }\n\n const nextSequence = (maxSequence + 1).toString().padStart(4, '0');\n const safeName = options.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '');\n\n const fileName = `${nextSequence}_${safeName}.sql`;\n const filePath = join(folder, fileName);\n\n // Create migration file with template\n const template = `-- Migration: ${options.name}\n-- Created at: ${new Date().toISOString()}\n-- Type: ${options.type}\n\n-- Write your SQL migration here\n\n`;\n\n await writeFile(filePath, template, 'utf-8');\n\n spinner.succeed('Migration generated');\n\n console.log('\\n' + success(`Created: ${dim(filePath)}`));\n console.log(dim('\\nEdit this file to add your migration SQL.'));\n } catch (err) {\n spinner.fail((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n success,\n warning,\n dim,\n} from '../utils/index.js';\n\nexport const tenantCreateCommand = new Command('tenant:create')\n .description('Create a new tenant schema and apply all migrations')\n .requiredOption('--id <tenantId>', 'Tenant ID')\n .option('-c, --config <path>', 'Path to config file')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .option('--no-migrate', 'Skip applying migrations after creating schema')\n .action(async (options) => {\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable } = await loadConfig(options.config);\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery: async () => [],\n });\n\n const schemaName = config.isolation.schemaNameTemplate(options.id);\n\n spinner.text = `Checking if tenant ${options.id} exists...`;\n\n const exists = await migrator.tenantExists(options.id);\n if (exists) {\n spinner.warn(`Tenant ${options.id} already exists (${schemaName})`);\n\n if (options.migrate) {\n spinner.start();\n spinner.text = 'Applying pending migrations...';\n\n const result = await migrator.migrateTenant(options.id);\n\n if (result.appliedMigrations.length > 0) {\n spinner.succeed(`Applied ${result.appliedMigrations.length} migration(s)`);\n for (const migration of result.appliedMigrations) {\n console.log(` ${dim('-')} ${migration}`);\n }\n } else {\n spinner.succeed('No pending migrations');\n }\n }\n\n return;\n }\n\n spinner.text = `Creating tenant schema ${schemaName}...`;\n\n await migrator.createTenant(options.id, {\n migrate: options.migrate,\n });\n\n spinner.succeed(`Tenant ${options.id} created`);\n\n console.log('\\n' + success('Schema created: ') + dim(schemaName));\n\n if (options.migrate) {\n console.log(success('All migrations applied'));\n } else {\n console.log(warning('Migrations skipped. Run migrate to apply.'));\n }\n\n console.log(dim('\\nYou can now use this tenant:'));\n console.log(dim(` const db = tenants.getDb('${options.id}');`));\n } catch (err) {\n spinner.fail((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n success,\n warning,\n dim,\n red,\n bold,\n} from '../utils/index.js';\n\nexport const tenantDropCommand = new Command('tenant:drop')\n .description('Drop a tenant schema (DESTRUCTIVE)')\n .requiredOption('--id <tenantId>', 'Tenant ID')\n .option('-c, --config <path>', 'Path to config file')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .option('-f, --force', 'Skip confirmation prompt')\n .option('--no-cascade', 'Use RESTRICT instead of CASCADE')\n .action(async (options) => {\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable } = await loadConfig(options.config);\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery: async () => [],\n });\n\n const schemaName = config.isolation.schemaNameTemplate(options.id);\n\n spinner.text = `Checking if tenant ${options.id} exists...`;\n\n const exists = await migrator.tenantExists(options.id);\n if (!exists) {\n spinner.warn(`Tenant ${options.id} does not exist`);\n return;\n }\n\n spinner.stop();\n\n // Confirmation prompt\n if (!options.force) {\n console.log(red(bold('\\n⚠️ WARNING: This action is DESTRUCTIVE and IRREVERSIBLE!')));\n console.log(dim(`\\nYou are about to drop schema: ${schemaName}`));\n console.log(dim('All tables and data in this schema will be permanently deleted.\\n'));\n\n const confirmed = await askConfirmation(\n `Type \"${options.id}\" to confirm deletion: `,\n options.id\n );\n\n if (!confirmed) {\n console.log('\\n' + warning('Operation cancelled.'));\n return;\n }\n }\n\n spinner.start();\n spinner.text = `Dropping tenant schema ${schemaName}...`;\n\n await migrator.dropTenant(options.id, {\n cascade: options.cascade,\n });\n\n spinner.succeed(`Tenant ${options.id} dropped`);\n\n console.log('\\n' + success('Schema deleted: ') + dim(schemaName));\n } catch (err) {\n spinner.fail((err as Error).message);\n process.exit(1);\n }\n });\n\n/**\n * Ask for confirmation\n */\nasync function askConfirmation(question: string, expected: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim() === expected);\n });\n });\n}\n","import { Command } from 'commander';\nimport { Pool } from 'pg';\nimport { createHash } from 'node:crypto';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { join, basename } from 'node:path';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n success,\n error,\n warning,\n bold,\n dim,\n} from '../utils/index.js';\nimport {\n detectTableFormat,\n type TableFormat,\n type DetectedFormat,\n} from '../../migrator/table-format.js';\n\ninterface MigrationFileInfo {\n name: string;\n hash: string;\n}\n\n/**\n * Load migration files with their hashes\n */\nasync function loadMigrationFiles(folder: string): Promise<MigrationFileInfo[]> {\n const files = await readdir(folder);\n const migrations: MigrationFileInfo[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.sql')) continue;\n\n const filePath = join(folder, file);\n const content = await readFile(filePath, 'utf-8');\n const hash = createHash('sha256').update(content).digest('hex');\n\n migrations.push({\n name: basename(file, '.sql'),\n hash,\n });\n }\n\n return migrations;\n}\n\n/**\n * Convert a single tenant's migration table format\n */\nasync function convertTenantFormat(\n pool: Pool,\n schemaName: string,\n tableName: string,\n migrations: MigrationFileInfo[],\n currentFormat: DetectedFormat,\n targetFormat: TableFormat,\n dryRun: boolean\n): Promise<{ success: boolean; message: string }> {\n // Build lookup maps\n const hashToName = new Map(migrations.map((m) => [m.hash, m.name]));\n const nameToHash = new Map(migrations.map((m) => [m.name, m.hash]));\n\n const client = await pool.connect();\n\n try {\n // Read current records\n const identifierCol = currentFormat.columns.identifier;\n const current = await client.query<{ id: number; identifier: string }>(\n `SELECT id, \"${identifierCol}\" as identifier FROM \"${schemaName}\".\"${tableName}\" ORDER BY id`\n );\n\n if (dryRun) {\n const conversions: string[] = [];\n for (const row of current.rows) {\n if (targetFormat === 'name' && currentFormat.columns.identifier === 'hash') {\n const name = hashToName.get(row.identifier);\n if (name) {\n conversions.push(` ${dim(row.identifier.slice(0, 8))}... -> ${name}`);\n } else {\n conversions.push(` ${warning(row.identifier.slice(0, 8))}... -> ${error('unknown')}`);\n }\n } else if (targetFormat !== 'name' && currentFormat.columns.identifier === 'name') {\n const hash = nameToHash.get(row.identifier);\n if (hash) {\n conversions.push(` ${row.identifier} -> ${dim(hash.slice(0, 16))}...`);\n } else {\n conversions.push(` ${row.identifier} -> ${error('unknown')}`);\n }\n }\n }\n return {\n success: true,\n message: conversions.length > 0 ? conversions.join('\\n') : ' No conversions needed',\n };\n }\n\n await client.query('BEGIN');\n\n try {\n if (targetFormat === 'name' && currentFormat.columns.identifier === 'hash') {\n // Converting from hash to name\n // Add name column\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ADD COLUMN IF NOT EXISTS name VARCHAR(255)\n `);\n\n // Populate name from hash using migration files\n let converted = 0;\n for (const row of current.rows) {\n const name = hashToName.get(row.identifier);\n if (name) {\n await client.query(\n `UPDATE \"${schemaName}\".\"${tableName}\" SET name = $1 WHERE id = $2`,\n [name, row.id]\n );\n converted++;\n }\n }\n\n // Make name NOT NULL and add unique constraint\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ALTER COLUMN name SET NOT NULL\n `);\n\n // Add unique constraint if it doesn't exist\n await client.query(`\n DO $$\n BEGIN\n IF NOT EXISTS (\n SELECT 1 FROM pg_constraint\n WHERE conname = '${tableName}_name_unique'\n ) THEN\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ADD CONSTRAINT ${tableName}_name_unique UNIQUE (name);\n END IF;\n END $$;\n `);\n\n // Rename applied_at if needed\n if (currentFormat.columns.timestamp === 'created_at') {\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n RENAME COLUMN created_at TO applied_at\n `);\n\n // Convert bigint to timestamp if needed\n if (currentFormat.columns.timestampType === 'bigint') {\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ALTER COLUMN applied_at TYPE TIMESTAMP WITH TIME ZONE\n USING to_timestamp(applied_at / 1000.0)\n `);\n }\n }\n\n await client.query('COMMIT');\n return { success: true, message: `Converted ${converted} records to name format` };\n } else if (targetFormat !== 'name' && currentFormat.columns.identifier === 'name') {\n // Converting from name to hash/drizzle-kit\n // Add hash column\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ADD COLUMN IF NOT EXISTS hash TEXT\n `);\n\n // Populate hash from name using migration files\n let converted = 0;\n for (const row of current.rows) {\n const hash = nameToHash.get(row.identifier);\n if (hash) {\n await client.query(\n `UPDATE \"${schemaName}\".\"${tableName}\" SET hash = $1 WHERE id = $2`,\n [hash, row.id]\n );\n converted++;\n }\n }\n\n // Make hash NOT NULL\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ALTER COLUMN hash SET NOT NULL\n `);\n\n // Rename applied_at to created_at if needed\n if (currentFormat.columns.timestamp === 'applied_at') {\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n RENAME COLUMN applied_at TO created_at\n `);\n\n // Convert to bigint if targeting drizzle-kit\n if (targetFormat === 'drizzle-kit') {\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ALTER COLUMN created_at TYPE BIGINT\n USING (EXTRACT(EPOCH FROM created_at) * 1000)::BIGINT\n `);\n }\n }\n\n await client.query('COMMIT');\n return { success: true, message: `Converted ${converted} records to ${targetFormat} format` };\n }\n\n await client.query('COMMIT');\n return { success: true, message: 'No conversion needed' };\n } catch (err) {\n await client.query('ROLLBACK');\n throw err;\n }\n } finally {\n client.release();\n }\n}\n\nexport const convertFormatCommand = new Command('convert-format')\n .description('Convert migration table format between name/hash/drizzle-kit')\n .requiredOption('--to <format>', 'Target format: name, hash, or drizzle-kit')\n .option('-c, --config <path>', 'Path to config file')\n .option('-t, --tenant <id>', 'Convert a specific tenant only')\n .option('--dry-run', 'Preview changes without applying')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .action(async (options) => {\n const spinner = createSpinner('Loading configuration...');\n\n try {\n // Validate target format\n const targetFormat = options.to as TableFormat;\n if (!['name', 'hash', 'drizzle-kit'].includes(targetFormat)) {\n throw new Error(`Invalid format: ${options.to}. Use: name, hash, or drizzle-kit`);\n }\n\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n const tableName = migrationsTable ?? '__drizzle_migrations';\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n spinner.text = 'Loading migration files...';\n const migrations = await loadMigrationFiles(folder);\n\n spinner.text = 'Discovering tenants...';\n\n let tenantIds: string[];\n if (options.tenant) {\n tenantIds = [options.tenant];\n } else {\n if (!tenantDiscovery) {\n throw new Error(\n 'No tenant discovery function configured. Add migrations.tenantDiscovery to your config.'\n );\n }\n tenantIds = await tenantDiscovery();\n }\n\n spinner.succeed(`Found ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}`);\n\n if (options.dryRun) {\n console.log(warning(bold('\\nDry run mode - no changes will be made\\n')));\n }\n\n console.log(bold(`\\nConverting to ${targetFormat} format:\\n`));\n\n let successCount = 0;\n let skipCount = 0;\n let failCount = 0;\n\n for (const tenantId of tenantIds) {\n const schemaName = config.isolation.schemaNameTemplate(tenantId);\n\n const pool = new Pool({\n connectionString: config.connection.url,\n ...config.connection.poolConfig,\n });\n\n try {\n // Detect current format\n const currentFormat = await detectTableFormat(pool, schemaName, tableName);\n\n if (!currentFormat) {\n console.log(`${dim(tenantId)}: ${dim('No migrations table found, skipping')}`);\n skipCount++;\n continue;\n }\n\n if (currentFormat.format === targetFormat) {\n console.log(`${dim(tenantId)}: ${dim(`Already using ${targetFormat} format`)}`);\n skipCount++;\n continue;\n }\n\n console.log(`${bold(tenantId)}: ${currentFormat.format} -> ${targetFormat}`);\n\n const result = await convertTenantFormat(\n pool,\n schemaName,\n tableName,\n migrations,\n currentFormat,\n targetFormat,\n options.dryRun\n );\n\n if (result.success) {\n if (options.dryRun) {\n console.log(result.message);\n } else {\n console.log(` ${success(result.message)}`);\n }\n successCount++;\n } else {\n console.log(` ${error(result.message)}`);\n failCount++;\n }\n } catch (err) {\n console.log(` ${error((err as Error).message)}`);\n failCount++;\n } finally {\n await pool.end();\n }\n }\n\n console.log(bold('\\nSummary:'));\n console.log(` Converted: ${success(successCount.toString())}`);\n console.log(` Skipped: ${dim(skipCount.toString())}`);\n if (failCount > 0) {\n console.log(` Failed: ${error(failCount.toString())}`);\n process.exit(1);\n }\n } catch (err) {\n spinner.fail((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { select, input, confirm } from '@inquirer/prompts';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n log,\n success,\n info,\n warning,\n bold,\n dim,\n cyan,\n handleError,\n shouldShowInteractive,\n} from '../utils/index.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize a new drizzle-multitenant configuration')\n .option('--force', 'Overwrite existing configuration')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant init\n $ drizzle-multitenant init --force\n`)\n .action(async (options: { force?: boolean }) => {\n try {\n if (!shouldShowInteractive()) {\n log(warning('Interactive mode required. Please run in a terminal.'));\n process.exit(1);\n }\n\n log(bold('\\n🚀 drizzle-multitenant Setup Wizard\\n'));\n\n // Check if config already exists\n const configFiles = [\n 'tenant.config.ts',\n 'tenant.config.js',\n 'drizzle-multitenant.config.ts',\n 'drizzle-multitenant.config.js',\n ];\n\n const existingConfig = configFiles.find(f => existsSync(join(process.cwd(), f)));\n\n if (existingConfig && !options.force) {\n log(warning(`Configuration file already exists: ${existingConfig}`));\n const overwrite = await confirm({\n message: 'Do you want to overwrite it?',\n default: false,\n });\n\n if (!overwrite) {\n log(info('Setup cancelled.'));\n return;\n }\n }\n\n // Ask for isolation type\n const isolationType = await select({\n message: 'Which isolation strategy do you want to use?',\n choices: [\n {\n name: 'Schema-based isolation (recommended)',\n value: 'schema',\n description: 'Each tenant has its own PostgreSQL schema',\n },\n {\n name: 'Row-level security (RLS)',\n value: 'rls',\n description: 'Shared tables with tenant_id column and RLS policies',\n },\n ],\n });\n\n // Ask for database URL variable\n const dbEnvVar = await input({\n message: 'Environment variable for database connection:',\n default: 'DATABASE_URL',\n });\n\n // Ask for migrations folder\n const migrationsFolder = await input({\n message: 'Migrations folder path:',\n default: './drizzle/tenant-migrations',\n });\n\n // Ask for schema name template (only for schema isolation)\n let schemaTemplate = 'tenant_${id}';\n if (isolationType === 'schema') {\n schemaTemplate = await input({\n message: 'Schema name template (use ${id} for tenant ID):',\n default: 'tenant_${id}',\n });\n }\n\n // Ask about TypeScript\n const useTypeScript = await confirm({\n message: 'Use TypeScript for configuration?',\n default: true,\n });\n\n // Generate config content\n const configContent = generateConfigContent({\n isolationType: isolationType as 'schema' | 'rls',\n dbEnvVar,\n migrationsFolder,\n schemaTemplate,\n useTypeScript,\n });\n\n // Write config file\n const configFileName = useTypeScript ? 'tenant.config.ts' : 'tenant.config.js';\n const configPath = join(process.cwd(), configFileName);\n writeFileSync(configPath, configContent);\n log(success(`Created ${configFileName}`));\n\n // Create migrations folder\n const fullMigrationsPath = join(process.cwd(), migrationsFolder);\n if (!existsSync(fullMigrationsPath)) {\n mkdirSync(fullMigrationsPath, { recursive: true });\n log(success(`Created migrations folder: ${migrationsFolder}`));\n }\n\n // Create .gitkeep in migrations folder\n const gitkeepPath = join(fullMigrationsPath, '.gitkeep');\n if (!existsSync(gitkeepPath)) {\n writeFileSync(gitkeepPath, '');\n }\n\n // Final instructions\n log('\\n' + bold('✨ Setup complete!\\n'));\n log('Next steps:\\n');\n log(dim('1. Update your schema definitions in the config file'));\n log(dim('2. Set up tenant discovery function'));\n log(dim('3. Generate your first migration:'));\n log(cyan(` npx drizzle-multitenant generate --name initial`));\n log(dim('4. Create a tenant:'));\n log(cyan(` npx drizzle-multitenant tenant:create --id my-first-tenant`));\n log(dim('5. Check status:'));\n log(cyan(` npx drizzle-multitenant status`));\n log('');\n } catch (err) {\n handleError(err);\n }\n });\n\ninterface ConfigOptions {\n isolationType: 'schema' | 'rls';\n dbEnvVar: string;\n migrationsFolder: string;\n schemaTemplate: string;\n useTypeScript: boolean;\n}\n\nfunction generateConfigContent(options: ConfigOptions): string {\n const { isolationType, dbEnvVar, migrationsFolder, schemaTemplate, useTypeScript } = options;\n\n if (useTypeScript) {\n return `import { defineConfig } from 'drizzle-multitenant';\nimport { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core';\n\n// Example tenant schema - customize this for your needs\nconst users = pgTable('users', {\n id: uuid('id').primaryKey().defaultRandom(),\n email: text('email').notNull().unique(),\n name: text('name'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\nexport default defineConfig({\n // Database connection\n connection: process.env.${dbEnvVar}!,\n\n // Isolation strategy\n isolation: {\n type: '${isolationType}',\n ${isolationType === 'schema' ? `schemaNameTemplate: (id) => \\`${schemaTemplate.replace('${id}', '${id}')}\\`,` : ''}\n },\n\n // Schema definitions\n schemas: {\n tenant: {\n users,\n // Add more tables here...\n },\n },\n\n // Migration settings\n migrations: {\n folder: '${migrationsFolder}',\n table: '__drizzle_migrations',\n\n // Tenant discovery function - customize this!\n // This should return an array of tenant IDs from your database\n tenantDiscovery: async () => {\n // Example: Query your tenants table\n // const tenants = await db.select().from(tenantsTable);\n // return tenants.map(t => t.id);\n\n // For now, return empty array - update this!\n console.warn('⚠️ tenantDiscovery not configured - returning empty array');\n return [];\n },\n },\n});\n`;\n }\n\n // JavaScript version\n return `// @ts-check\nconst { defineConfig } = require('drizzle-multitenant');\nconst { pgTable, text, timestamp, uuid } = require('drizzle-orm/pg-core');\n\n// Example tenant schema - customize this for your needs\nconst users = pgTable('users', {\n id: uuid('id').primaryKey().defaultRandom(),\n email: text('email').notNull().unique(),\n name: text('name'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\nmodule.exports = defineConfig({\n // Database connection\n connection: process.env.${dbEnvVar},\n\n // Isolation strategy\n isolation: {\n type: '${isolationType}',\n ${isolationType === 'schema' ? `schemaNameTemplate: (id) => \\`${schemaTemplate.replace('${id}', '${id}')}\\`,` : ''}\n },\n\n // Schema definitions\n schemas: {\n tenant: {\n users,\n // Add more tables here...\n },\n },\n\n // Migration settings\n migrations: {\n folder: '${migrationsFolder}',\n table: '__drizzle_migrations',\n\n // Tenant discovery function - customize this!\n tenantDiscovery: async () => {\n // Example: Query your tenants table\n // For now, return empty array - update this!\n console.warn('⚠️ tenantDiscovery not configured - returning empty array');\n return [];\n },\n },\n});\n`;\n}\n","import { Command } from 'commander';\nimport { log, info, warning } from '../utils/index.js';\n\nexport const completionCommand = new Command('completion')\n .description('Generate shell completion scripts')\n .argument('<shell>', 'Shell type: bash, zsh, or fish')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant completion bash >> ~/.bashrc\n $ drizzle-multitenant completion zsh >> ~/.zshrc\n $ drizzle-multitenant completion fish > ~/.config/fish/completions/drizzle-multitenant.fish\n\nAfter adding the completion script, restart your shell or run:\n $ source ~/.bashrc # for bash\n $ source ~/.zshrc # for zsh\n`)\n .action((shell: string) => {\n const shellLower = shell.toLowerCase();\n\n switch (shellLower) {\n case 'bash':\n console.log(generateBashCompletion());\n break;\n case 'zsh':\n console.log(generateZshCompletion());\n break;\n case 'fish':\n console.log(generateFishCompletion());\n break;\n default:\n log(warning(`Unknown shell: ${shell}`));\n log(info('Supported shells: bash, zsh, fish'));\n process.exit(1);\n }\n });\n\nfunction generateBashCompletion(): string {\n return `# drizzle-multitenant bash completion\n# Add this to ~/.bashrc or ~/.bash_completion\n\n_drizzle_multitenant() {\n local cur prev opts commands\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n\n commands=\"migrate status generate tenant:create tenant:drop convert-format init completion\"\n\n global_opts=\"--json --verbose --quiet --no-color --help --version\"\n\n migrate_opts=\"-c --config -a --all -t --tenant --tenants --concurrency --dry-run --migrations-folder\"\n status_opts=\"-c --config --migrations-folder\"\n generate_opts=\"-n --name -c --config --type --migrations-folder\"\n tenant_create_opts=\"--id -c --config --migrations-folder --no-migrate\"\n tenant_drop_opts=\"--id -c --config --migrations-folder -f --force --no-cascade\"\n convert_opts=\"--to -c --config -t --tenant --dry-run --migrations-folder\"\n\n case \"\\${COMP_WORDS[1]}\" in\n migrate)\n COMPREPLY=( \\$(compgen -W \"\\${migrate_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n status)\n COMPREPLY=( \\$(compgen -W \"\\${status_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n generate)\n COMPREPLY=( \\$(compgen -W \"\\${generate_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n tenant:create)\n COMPREPLY=( \\$(compgen -W \"\\${tenant_create_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n tenant:drop)\n COMPREPLY=( \\$(compgen -W \"\\${tenant_drop_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n convert-format)\n COMPREPLY=( \\$(compgen -W \"\\${convert_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n completion)\n COMPREPLY=( \\$(compgen -W \"bash zsh fish\" -- \\${cur}) )\n return 0\n ;;\n esac\n\n if [[ \\${cur} == -* ]] ; then\n COMPREPLY=( \\$(compgen -W \"\\${global_opts}\" -- \\${cur}) )\n return 0\n fi\n\n COMPREPLY=( \\$(compgen -W \"\\${commands}\" -- \\${cur}) )\n return 0\n}\n\ncomplete -F _drizzle_multitenant drizzle-multitenant\ncomplete -F _drizzle_multitenant npx drizzle-multitenant\n`;\n}\n\nfunction generateZshCompletion(): string {\n return `#compdef drizzle-multitenant\n# drizzle-multitenant zsh completion\n# Add this to ~/.zshrc or place in a file in your $fpath\n\n_drizzle_multitenant() {\n local -a commands\n local -a global_opts\n\n commands=(\n 'migrate:Apply pending migrations to tenant schemas'\n 'status:Show migration status for all tenants'\n 'generate:Generate a new migration file'\n 'tenant\\\\:create:Create a new tenant schema'\n 'tenant\\\\:drop:Drop a tenant schema (DESTRUCTIVE)'\n 'convert-format:Convert migration table format'\n 'init:Initialize a new configuration'\n 'completion:Generate shell completion scripts'\n )\n\n global_opts=(\n '--json[Output as JSON]'\n '(-v --verbose)'{-v,--verbose}'[Show verbose output]'\n '(-q --quiet)'{-q,--quiet}'[Only show errors]'\n '--no-color[Disable colored output]'\n '(-h --help)'{-h,--help}'[Show help]'\n '(-V --version)'{-V,--version}'[Show version]'\n )\n\n _arguments -C \\\\\n \"\\${global_opts[@]}\" \\\\\n '1: :->command' \\\\\n '*:: :->args'\n\n case \\$state in\n command)\n _describe -t commands 'command' commands\n ;;\n args)\n case \\$words[1] in\n migrate)\n _arguments \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '(-a --all)'{-a,--all}'[Migrate all tenants]' \\\\\n '(-t --tenant)'{-t,--tenant}'[Migrate specific tenant]:tenant id:' \\\\\n '--tenants[Migrate specific tenants (comma-separated)]:tenant ids:' \\\\\n '--concurrency[Number of concurrent migrations]:number:' \\\\\n '--dry-run[Show what would be applied]' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n \"\\${global_opts[@]}\"\n ;;\n status)\n _arguments \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n \"\\${global_opts[@]}\"\n ;;\n generate)\n _arguments \\\\\n '(-n --name)'{-n,--name}'[Migration name]:name:' \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '--type[Migration type]:type:(tenant shared)' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n \"\\${global_opts[@]}\"\n ;;\n tenant:create)\n _arguments \\\\\n '--id[Tenant ID]:tenant id:' \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n '--no-migrate[Skip running migrations]' \\\\\n \"\\${global_opts[@]}\"\n ;;\n tenant:drop)\n _arguments \\\\\n '--id[Tenant ID]:tenant id:' \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n '(-f --force)'{-f,--force}'[Skip confirmation]' \\\\\n '--no-cascade[Use RESTRICT instead of CASCADE]' \\\\\n \"\\${global_opts[@]}\"\n ;;\n convert-format)\n _arguments \\\\\n '--to[Target format]:format:(name hash drizzle-kit)' \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '(-t --tenant)'{-t,--tenant}'[Convert specific tenant]:tenant id:' \\\\\n '--dry-run[Show what would be converted]' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n \"\\${global_opts[@]}\"\n ;;\n completion)\n _arguments '1:shell:(bash zsh fish)'\n ;;\n esac\n ;;\n esac\n}\n\n_drizzle_multitenant \"\\$@\"\n`;\n}\n\nfunction generateFishCompletion(): string {\n return `# drizzle-multitenant fish completion\n# Save to ~/.config/fish/completions/drizzle-multitenant.fish\n\n# Disable file completion by default\ncomplete -c drizzle-multitenant -f\n\n# Commands\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"migrate\" -d \"Apply pending migrations\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"status\" -d \"Show migration status\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"generate\" -d \"Generate new migration\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"tenant:create\" -d \"Create tenant schema\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"tenant:drop\" -d \"Drop tenant schema\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"convert-format\" -d \"Convert migration format\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"init\" -d \"Initialize configuration\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"completion\" -d \"Generate completions\"\n\n# Global options\ncomplete -c drizzle-multitenant -l json -d \"Output as JSON\"\ncomplete -c drizzle-multitenant -s v -l verbose -d \"Verbose output\"\ncomplete -c drizzle-multitenant -s q -l quiet -d \"Only show errors\"\ncomplete -c drizzle-multitenant -l no-color -d \"Disable colors\"\ncomplete -c drizzle-multitenant -s h -l help -d \"Show help\"\ncomplete -c drizzle-multitenant -s V -l version -d \"Show version\"\n\n# migrate options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -s a -l all -d \"Migrate all tenants\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -s t -l tenant -r -d \"Specific tenant\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -l tenants -r -d \"Multiple tenants\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -l concurrency -r -d \"Concurrent migrations\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -l dry-run -d \"Dry run mode\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -l migrations-folder -r -d \"Migrations folder\"\n\n# status options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from status\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from status\" -l migrations-folder -r -d \"Migrations folder\"\n\n# generate options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from generate\" -s n -l name -r -d \"Migration name\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from generate\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from generate\" -l type -r -a \"tenant shared\" -d \"Migration type\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from generate\" -l migrations-folder -r -d \"Migrations folder\"\n\n# tenant:create options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:create\" -l id -r -d \"Tenant ID\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:create\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:create\" -l migrations-folder -r -d \"Migrations folder\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:create\" -l no-migrate -d \"Skip migrations\"\n\n# tenant:drop options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -l id -r -d \"Tenant ID\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -l migrations-folder -r -d \"Migrations folder\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -s f -l force -d \"Skip confirmation\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -l no-cascade -d \"Use RESTRICT\"\n\n# convert-format options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -l to -r -a \"name hash drizzle-kit\" -d \"Target format\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -s t -l tenant -r -d \"Specific tenant\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -l dry-run -d \"Dry run mode\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -l migrations-folder -r -d \"Migrations folder\"\n\n# completion options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from completion\" -a \"bash zsh fish\" -d \"Shell type\"\n`;\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport {\n migrateCommand,\n statusCommand,\n syncCommand,\n generateCommand,\n tenantCreateCommand,\n tenantDropCommand,\n convertFormatCommand,\n initCommand,\n completionCommand,\n} from './commands/index.js';\nimport { initOutputContext } from './utils/output.js';\n\nconst program = new Command();\n\nprogram\n .name('drizzle-multitenant')\n .description('Multi-tenancy toolkit for Drizzle ORM')\n .version('0.3.0')\n .option('--json', 'Output as JSON (machine-readable)')\n .option('-v, --verbose', 'Show verbose output')\n .option('-q, --quiet', 'Only show errors')\n .option('--no-color', 'Disable colored output')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n initOutputContext({\n json: opts.json,\n verbose: opts.verbose,\n quiet: opts.quiet,\n noColor: opts.color === false,\n });\n });\n\n// Customize help output with examples\nprogram.addHelpText('after', `\nExamples:\n $ drizzle-multitenant status\n $ drizzle-multitenant migrate --all\n $ drizzle-multitenant migrate --tenant=my-tenant --dry-run\n $ drizzle-multitenant generate --name add-users-table\n $ drizzle-multitenant tenant:create --id new-tenant\n $ drizzle-multitenant status --json | jq '.summary'\n\nDocumentation:\n https://github.com/your-repo/drizzle-multitenant\n`);\n\n// Register commands\nprogram.addCommand(migrateCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(syncCommand);\nprogram.addCommand(generateCommand);\nprogram.addCommand(tenantCreateCommand);\nprogram.addCommand(tenantDropCommand);\nprogram.addCommand(convertFormatCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(completionCommand);\n\n// Parse arguments\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../../src/migrator/table-format.ts","../../src/migrator/schema-manager.ts","../../src/migrator/drift/column-analyzer.ts","../../src/migrator/drift/index-analyzer.ts","../../src/migrator/drift/constraint-analyzer.ts","../../src/migrator/drift/drift-detector.ts","../../src/migrator/seed/seeder.ts","../../src/migrator/sync/sync-manager.ts","../../src/migrator/executor/migration-executor.ts","../../src/migrator/executor/batch-executor.ts","../../src/migrator/clone/ddl-generator.ts","../../src/migrator/clone/data-copier.ts","../../src/migrator/clone/cloner.ts","../../src/migrator/migrator.ts","../../src/cli/utils/spinner.ts","../../src/cli/utils/table.ts","../../src/cli/utils/config.ts","../../src/cli/utils/output.ts","../../src/cli/utils/progress.ts","../../src/cli/utils/errors.ts","../../src/cli/commands/migrate.ts","../../src/cli/commands/status.ts","../../src/cli/commands/sync.ts","../../src/cli/commands/diff.ts","../../src/cli/commands/generate.ts","../../src/cli/commands/tenant-create.ts","../../src/cli/commands/tenant-drop.ts","../../src/cli/commands/tenant-clone.ts","../../src/cli/commands/convert-format.ts","../../src/cli/commands/init.ts","../../src/cli/commands/completion.ts","../../src/cli/ui/banner.ts","../../src/cli/ui/base/menu-renderer.ts","../../src/cli/ui/screens/status-screen.ts","../../src/cli/ui/screens/migrations-screen.ts","../../src/cli/ui/screens/tenants-screen.ts","../../src/cli/ui/screens/seeding-screen.ts","../../src/cli/ui/screens/generate-screen.ts","../../src/cli/ui/menu.ts","../../src/cli/commands/interactive.ts","../../src/cli/commands/seed.ts","../../src/cli/index.ts"],"names":["DEFAULT_MIGRATIONS_TABLE","error","info","ora","chalk","Command","formatDuration","resolve","existsSync","readdir","join","askConfirmation","createInterface","readFile","createHash","basename","Pool","Table","select","checkbox","confirm","input","pathToFileURL"],"mappings":"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","file":"index.js","sourcesContent":["import type { Pool } from 'pg';\n\n/**\n * Table format for tracking migrations\n * - \"name\": drizzle-multitenant native (filename-based)\n * - \"hash\": SHA-256 hash with timestamp\n * - \"drizzle-kit\": Exact drizzle-kit format (hash + bigint timestamp)\n */\nexport type TableFormat = 'name' | 'hash' | 'drizzle-kit';\n\n/**\n * Detected table format information\n */\nexport interface DetectedFormat {\n /** The detected format type */\n format: TableFormat;\n /** The table name */\n tableName: string;\n /** Column configuration */\n columns: {\n /** Column used for identifying migrations */\n identifier: 'name' | 'hash';\n /** Column used for timestamp */\n timestamp: 'applied_at' | 'created_at';\n /** Data type of timestamp column */\n timestampType: 'timestamp' | 'bigint';\n };\n}\n\n/**\n * Default format configuration for new tables\n */\nexport const DEFAULT_FORMAT: DetectedFormat = {\n format: 'name',\n tableName: '__drizzle_migrations',\n columns: {\n identifier: 'name',\n timestamp: 'applied_at',\n timestampType: 'timestamp',\n },\n};\n\n/**\n * drizzle-kit format configuration\n */\nexport const DRIZZLE_KIT_FORMAT: DetectedFormat = {\n format: 'drizzle-kit',\n tableName: '__drizzle_migrations',\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'bigint',\n },\n};\n\ninterface ColumnInfo {\n column_name: string;\n data_type: string;\n}\n\n/**\n * Detect the format of an existing migrations table\n *\n * @param pool - Database connection pool\n * @param schemaName - Schema to check\n * @param tableName - Migrations table name\n * @returns Detected format or null if table doesn't exist\n */\nexport async function detectTableFormat(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<DetectedFormat | null> {\n // Check if table exists\n const tableExists = await pool.query<{ exists: boolean }>(\n `SELECT EXISTS (\n SELECT 1 FROM information_schema.tables\n WHERE table_schema = $1 AND table_name = $2\n ) as exists`,\n [schemaName, tableName]\n );\n\n if (!tableExists.rows[0]?.exists) {\n return null;\n }\n\n // Get column information\n const columnsResult = await pool.query<ColumnInfo>(\n `SELECT column_name, data_type\n FROM information_schema.columns\n WHERE table_schema = $1 AND table_name = $2`,\n [schemaName, tableName]\n );\n\n const columnMap = new Map<string, string>(\n columnsResult.rows.map((r) => [r.column_name, r.data_type])\n );\n\n // Detect format based on columns\n if (columnMap.has('name')) {\n // drizzle-multitenant native format\n return {\n format: 'name',\n tableName,\n columns: {\n identifier: 'name',\n timestamp: columnMap.has('applied_at') ? 'applied_at' : 'created_at',\n timestampType: 'timestamp',\n },\n };\n }\n\n if (columnMap.has('hash')) {\n const createdAtType = columnMap.get('created_at');\n\n // drizzle-kit uses bigint for created_at\n if (createdAtType === 'bigint') {\n return {\n format: 'drizzle-kit',\n tableName,\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'bigint',\n },\n };\n }\n\n // Custom hash-based format with regular timestamp\n return {\n format: 'hash',\n tableName,\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'timestamp',\n },\n };\n }\n\n // Unknown format - return null to trigger error handling\n return null;\n}\n\n/**\n * Get the format configuration for a specific format type\n */\nexport function getFormatConfig(\n format: TableFormat,\n tableName: string = '__drizzle_migrations'\n): DetectedFormat {\n switch (format) {\n case 'name':\n return {\n format: 'name',\n tableName,\n columns: {\n identifier: 'name',\n timestamp: 'applied_at',\n timestampType: 'timestamp',\n },\n };\n case 'hash':\n return {\n format: 'hash',\n tableName,\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'timestamp',\n },\n };\n case 'drizzle-kit':\n return {\n format: 'drizzle-kit',\n tableName,\n columns: {\n identifier: 'hash',\n timestamp: 'created_at',\n timestampType: 'bigint',\n },\n };\n }\n}\n","import { Pool } from 'pg';\nimport type { Config } from '../types.js';\nimport type { DetectedFormat } from './table-format.js';\n\nconst DEFAULT_MIGRATIONS_TABLE = '__drizzle_migrations';\n\n/**\n * Options for creating a tenant schema\n */\nexport interface CreateSchemaOptions {\n /** Whether to also run migrations after creating (handled by Migrator) */\n migrate?: boolean;\n}\n\n/**\n * Options for dropping a tenant schema\n */\nexport interface DropSchemaOptions {\n /** Use CASCADE to drop all objects in schema */\n cascade?: boolean;\n /** Force drop without confirmation (used by CLI) */\n force?: boolean;\n}\n\n/**\n * Manages PostgreSQL schema lifecycle for multi-tenant applications.\n *\n * Extracted from Migrator to follow Single Responsibility Principle.\n * Handles schema creation, deletion, existence checks, and migrations table management.\n *\n * @example\n * ```typescript\n * const schemaManager = new SchemaManager(config);\n *\n * // Create a new tenant schema\n * await schemaManager.createSchema('tenant-123');\n *\n * // Check if schema exists\n * const exists = await schemaManager.schemaExists('tenant-123');\n *\n * // Drop a tenant schema\n * await schemaManager.dropSchema('tenant-123', { cascade: true });\n * ```\n */\nexport class SchemaManager<\n TTenantSchema extends Record<string, unknown>,\n TSharedSchema extends Record<string, unknown>,\n> {\n private readonly migrationsTable: string;\n\n constructor(\n private readonly config: Config<TTenantSchema, TSharedSchema>,\n migrationsTable?: string\n ) {\n this.migrationsTable = migrationsTable ?? DEFAULT_MIGRATIONS_TABLE;\n }\n\n /**\n * Get the schema name for a tenant ID using the configured template\n *\n * @param tenantId - The tenant identifier\n * @returns The PostgreSQL schema name\n *\n * @example\n * ```typescript\n * const schemaName = schemaManager.getSchemaName('tenant-123');\n * // Returns: 'tenant_tenant-123' (depends on schemaNameTemplate)\n * ```\n */\n getSchemaName(tenantId: string): string {\n return this.config.isolation.schemaNameTemplate(tenantId);\n }\n\n /**\n * Create a PostgreSQL pool for a specific schema\n *\n * The pool is configured with `search_path` set to the schema,\n * allowing queries to run in tenant isolation.\n *\n * @param schemaName - The PostgreSQL schema name\n * @returns A configured Pool instance\n *\n * @example\n * ```typescript\n * const pool = await schemaManager.createPool('tenant_123');\n * try {\n * await pool.query('SELECT * FROM users'); // Queries tenant_123.users\n * } finally {\n * await pool.end();\n * }\n * ```\n */\n async createPool(schemaName: string): Promise<Pool> {\n return new Pool({\n connectionString: this.config.connection.url,\n ...this.config.connection.poolConfig,\n options: `-c search_path=\"${schemaName}\",public`,\n });\n }\n\n /**\n * Create a PostgreSQL pool without schema-specific search_path\n *\n * Used for operations that need to work across schemas or\n * before a schema exists (like creating the schema itself).\n *\n * @returns A Pool instance connected to the database\n */\n async createRootPool(): Promise<Pool> {\n return new Pool({\n connectionString: this.config.connection.url,\n ...this.config.connection.poolConfig,\n });\n }\n\n /**\n * Create a new tenant schema in the database\n *\n * @param tenantId - The tenant identifier\n * @returns Promise that resolves when schema is created\n *\n * @example\n * ```typescript\n * await schemaManager.createSchema('new-tenant');\n * ```\n */\n async createSchema(tenantId: string): Promise<void> {\n const schemaName = this.getSchemaName(tenantId);\n const pool = await this.createRootPool();\n\n try {\n await pool.query(`CREATE SCHEMA IF NOT EXISTS \"${schemaName}\"`);\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Drop a tenant schema from the database\n *\n * @param tenantId - The tenant identifier\n * @param options - Drop options (cascade, force)\n * @returns Promise that resolves when schema is dropped\n *\n * @example\n * ```typescript\n * // Drop with CASCADE (removes all objects)\n * await schemaManager.dropSchema('old-tenant', { cascade: true });\n *\n * // Drop with RESTRICT (fails if objects exist)\n * await schemaManager.dropSchema('old-tenant', { cascade: false });\n * ```\n */\n async dropSchema(tenantId: string, options: DropSchemaOptions = {}): Promise<void> {\n const { cascade = true } = options;\n const schemaName = this.getSchemaName(tenantId);\n const pool = await this.createRootPool();\n\n try {\n const cascadeSql = cascade ? 'CASCADE' : 'RESTRICT';\n await pool.query(`DROP SCHEMA IF EXISTS \"${schemaName}\" ${cascadeSql}`);\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Check if a tenant schema exists in the database\n *\n * @param tenantId - The tenant identifier\n * @returns True if schema exists, false otherwise\n *\n * @example\n * ```typescript\n * if (await schemaManager.schemaExists('tenant-123')) {\n * console.log('Tenant schema exists');\n * }\n * ```\n */\n async schemaExists(tenantId: string): Promise<boolean> {\n const schemaName = this.getSchemaName(tenantId);\n const pool = await this.createRootPool();\n\n try {\n const result = await pool.query(\n `SELECT 1 FROM information_schema.schemata WHERE schema_name = $1`,\n [schemaName]\n );\n return result.rowCount !== null && result.rowCount > 0;\n } finally {\n await pool.end();\n }\n }\n\n /**\n * List all schemas matching a pattern\n *\n * @param pattern - SQL LIKE pattern to filter schemas (optional)\n * @returns Array of schema names\n *\n * @example\n * ```typescript\n * // List all tenant schemas\n * const schemas = await schemaManager.listSchemas('tenant_%');\n * ```\n */\n async listSchemas(pattern?: string): Promise<string[]> {\n const pool = await this.createRootPool();\n\n try {\n const query = pattern\n ? `SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE $1 ORDER BY schema_name`\n : `SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog', 'information_schema', 'pg_toast') ORDER BY schema_name`;\n\n const result = await pool.query<{ schema_name: string }>(\n query,\n pattern ? [pattern] : []\n );\n\n return result.rows.map((row) => row.schema_name);\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Ensure the migrations table exists with the correct format\n *\n * Creates the migrations tracking table if it doesn't exist,\n * using the appropriate column types based on the format.\n *\n * @param pool - Database pool to use\n * @param schemaName - The schema to create the table in\n * @param format - The detected/configured table format\n *\n * @example\n * ```typescript\n * const pool = await schemaManager.createPool('tenant_123');\n * await schemaManager.ensureMigrationsTable(pool, 'tenant_123', format);\n * ```\n */\n async ensureMigrationsTable(\n pool: Pool,\n schemaName: string,\n format: DetectedFormat\n ): Promise<void> {\n const { identifier, timestamp, timestampType } = format.columns;\n\n // Build column definitions based on format\n const identifierCol = identifier === 'name'\n ? 'name VARCHAR(255) NOT NULL UNIQUE'\n : 'hash TEXT NOT NULL';\n\n const timestampCol = timestampType === 'bigint'\n ? `${timestamp} BIGINT NOT NULL`\n : `${timestamp} TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP`;\n\n await pool.query(`\n CREATE TABLE IF NOT EXISTS \"${schemaName}\".\"${format.tableName}\" (\n id SERIAL PRIMARY KEY,\n ${identifierCol},\n ${timestampCol}\n )\n `);\n }\n\n /**\n * Check if the migrations table exists in a schema\n *\n * @param pool - Database pool to use\n * @param schemaName - The schema to check\n * @returns True if migrations table exists\n *\n * @example\n * ```typescript\n * const pool = await schemaManager.createPool('tenant_123');\n * if (await schemaManager.migrationsTableExists(pool, 'tenant_123')) {\n * console.log('Migrations table exists');\n * }\n * ```\n */\n async migrationsTableExists(pool: Pool, schemaName: string): Promise<boolean> {\n const result = await pool.query(\n `SELECT 1 FROM information_schema.tables\n WHERE table_schema = $1 AND table_name = $2`,\n [schemaName, this.migrationsTable]\n );\n return result.rowCount !== null && result.rowCount > 0;\n }\n\n /**\n * Get the configured migrations table name\n *\n * @returns The migrations table name\n */\n getMigrationsTableName(): string {\n return this.migrationsTable;\n }\n}\n\n/**\n * Factory function to create a SchemaManager instance\n *\n * @param config - The tenant configuration\n * @param migrationsTable - Optional custom migrations table name\n * @returns A new SchemaManager instance\n *\n * @example\n * ```typescript\n * const schemaManager = createSchemaManager(config);\n * await schemaManager.createSchema('tenant-123');\n * ```\n */\nexport function createSchemaManager<\n TTenantSchema extends Record<string, unknown>,\n TSharedSchema extends Record<string, unknown>,\n>(\n config: Config<TTenantSchema, TSharedSchema>,\n migrationsTable?: string\n): SchemaManager<TTenantSchema, TSharedSchema> {\n return new SchemaManager(config, migrationsTable);\n}\n","/**\n * Column Analyzer\n *\n * Analyzes and compares column structures between schemas.\n * Detects missing columns, extra columns, type mismatches, nullable changes, and default value changes.\n *\n * @module drift/column-analyzer\n */\n\nimport type { Pool } from 'pg';\nimport type { ColumnInfo, ColumnDrift } from './types.js';\n\n/**\n * Introspects columns for a specific table in a schema.\n *\n * Retrieves detailed column metadata including data types, nullability,\n * defaults, and precision information.\n *\n * @param pool - Database connection pool\n * @param schemaName - PostgreSQL schema name\n * @param tableName - Table name to introspect\n * @returns Array of column information\n *\n * @example\n * ```typescript\n * const columns = await introspectColumns(pool, 'tenant_123', 'users');\n * for (const col of columns) {\n * console.log(`${col.name}: ${col.dataType} ${col.isNullable ? 'NULL' : 'NOT NULL'}`);\n * }\n * ```\n */\nexport async function introspectColumns(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<ColumnInfo[]> {\n const result = await pool.query<{\n column_name: string;\n data_type: string;\n udt_name: string;\n is_nullable: string;\n column_default: string | null;\n character_maximum_length: number | null;\n numeric_precision: number | null;\n numeric_scale: number | null;\n ordinal_position: number;\n }>(\n `SELECT\n column_name,\n data_type,\n udt_name,\n is_nullable,\n column_default,\n character_maximum_length,\n numeric_precision,\n numeric_scale,\n ordinal_position\n FROM information_schema.columns\n WHERE table_schema = $1 AND table_name = $2\n ORDER BY ordinal_position`,\n [schemaName, tableName]\n );\n\n return result.rows.map((row) => ({\n name: row.column_name,\n dataType: row.data_type,\n udtName: row.udt_name,\n isNullable: row.is_nullable === 'YES',\n columnDefault: row.column_default,\n characterMaximumLength: row.character_maximum_length,\n numericPrecision: row.numeric_precision,\n numericScale: row.numeric_scale,\n ordinalPosition: row.ordinal_position,\n }));\n}\n\n/**\n * Normalizes a default value for comparison.\n *\n * Removes type casts and schema qualifiers to enable accurate comparison\n * between schemas that may have different representations of the same default.\n *\n * @param value - The default value expression from the database\n * @returns Normalized value string or null\n *\n * @example\n * ```typescript\n * normalizeDefault(\"'123'::integer\") // Returns: '123'\n * normalizeDefault(\"CURRENT_TIMESTAMP\") // Returns: 'CURRENT_TIMESTAMP'\n * normalizeDefault(null) // Returns: null\n * ```\n */\nexport function normalizeDefault(value: string | null): string | null {\n if (value === null) return null;\n return value\n .replace(/^'(.+)'::.+$/, '$1') // '123'::integer -> 123\n .replace(/^(.+)::.+$/, '$1') // value::type -> value\n .trim();\n}\n\n/**\n * Compares columns between a reference and target schema.\n *\n * Detects the following types of drift:\n * - Missing columns: Present in reference but absent in target\n * - Extra columns: Present in target but absent in reference\n * - Type mismatches: Different data types\n * - Nullable mismatches: Different NULL/NOT NULL constraints\n * - Default mismatches: Different default values\n *\n * @param reference - Columns from the reference (expected) schema\n * @param target - Columns from the target (actual) schema\n * @returns Array of column drift details\n *\n * @example\n * ```typescript\n * const refColumns = await introspectColumns(pool, 'tenant_ref', 'users');\n * const targetColumns = await introspectColumns(pool, 'tenant_123', 'users');\n * const drifts = compareColumns(refColumns, targetColumns);\n *\n * for (const drift of drifts) {\n * console.log(`${drift.column}: ${drift.description}`);\n * }\n * ```\n */\nexport function compareColumns(\n reference: ColumnInfo[],\n target: ColumnInfo[]\n): ColumnDrift[] {\n const drifts: ColumnDrift[] = [];\n const refColMap = new Map(reference.map((c) => [c.name, c]));\n const targetColMap = new Map(target.map((c) => [c.name, c]));\n\n // Check for missing and drifted columns\n for (const refCol of reference) {\n const targetCol = targetColMap.get(refCol.name);\n\n if (!targetCol) {\n drifts.push({\n column: refCol.name,\n type: 'missing',\n expected: refCol.dataType,\n description: `Column \"${refCol.name}\" (${refCol.dataType}) is missing`,\n });\n continue;\n }\n\n // Compare data types (normalize by comparing udt_name)\n if (refCol.udtName !== targetCol.udtName) {\n drifts.push({\n column: refCol.name,\n type: 'type_mismatch',\n expected: refCol.udtName,\n actual: targetCol.udtName,\n description: `Column \"${refCol.name}\" type mismatch: expected \"${refCol.udtName}\", got \"${targetCol.udtName}\"`,\n });\n }\n\n // Compare nullable\n if (refCol.isNullable !== targetCol.isNullable) {\n drifts.push({\n column: refCol.name,\n type: 'nullable_mismatch',\n expected: refCol.isNullable,\n actual: targetCol.isNullable,\n description: `Column \"${refCol.name}\" nullable mismatch: expected ${refCol.isNullable ? 'NULL' : 'NOT NULL'}, got ${targetCol.isNullable ? 'NULL' : 'NOT NULL'}`,\n });\n }\n\n // Compare defaults (normalize by removing schema qualifiers)\n const normalizedRefDefault = normalizeDefault(refCol.columnDefault);\n const normalizedTargetDefault = normalizeDefault(targetCol.columnDefault);\n if (normalizedRefDefault !== normalizedTargetDefault) {\n drifts.push({\n column: refCol.name,\n type: 'default_mismatch',\n expected: refCol.columnDefault,\n actual: targetCol.columnDefault,\n description: `Column \"${refCol.name}\" default mismatch: expected \"${refCol.columnDefault ?? 'none'}\", got \"${targetCol.columnDefault ?? 'none'}\"`,\n });\n }\n }\n\n // Check for extra columns\n for (const targetCol of target) {\n if (!refColMap.has(targetCol.name)) {\n drifts.push({\n column: targetCol.name,\n type: 'extra',\n actual: targetCol.dataType,\n description: `Extra column \"${targetCol.name}\" (${targetCol.dataType}) not in reference`,\n });\n }\n }\n\n return drifts;\n}\n","/**\n * Index Analyzer\n *\n * Analyzes and compares index structures between schemas.\n * Detects missing indexes, extra indexes, and definition mismatches.\n *\n * @module drift/index-analyzer\n */\n\nimport type { Pool } from 'pg';\nimport type { IndexInfo, IndexDrift } from './types.js';\n\n/**\n * Introspects indexes for a specific table in a schema.\n *\n * Retrieves detailed index metadata including columns, uniqueness,\n * and full index definition.\n *\n * @param pool - Database connection pool\n * @param schemaName - PostgreSQL schema name\n * @param tableName - Table name to introspect\n * @returns Array of index information\n *\n * @example\n * ```typescript\n * const indexes = await introspectIndexes(pool, 'tenant_123', 'users');\n * for (const idx of indexes) {\n * console.log(`${idx.name}: ${idx.columns.join(', ')} ${idx.isUnique ? 'UNIQUE' : ''}`);\n * }\n * ```\n */\nexport async function introspectIndexes(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<IndexInfo[]> {\n // Get index definitions\n const indexResult = await pool.query<{\n indexname: string;\n indexdef: string;\n }>(\n `SELECT indexname, indexdef\n FROM pg_indexes\n WHERE schemaname = $1 AND tablename = $2\n ORDER BY indexname`,\n [schemaName, tableName]\n );\n\n // Get index columns and properties from pg_index\n const indexDetails = await pool.query<{\n indexname: string;\n column_name: string;\n is_unique: boolean;\n is_primary: boolean;\n }>(\n `SELECT\n i.relname as indexname,\n a.attname as column_name,\n ix.indisunique as is_unique,\n ix.indisprimary as is_primary\n FROM pg_class t\n JOIN pg_index ix ON t.oid = ix.indrelid\n JOIN pg_class i ON i.oid = ix.indexrelid\n JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)\n JOIN pg_namespace n ON n.oid = t.relnamespace\n WHERE n.nspname = $1 AND t.relname = $2\n ORDER BY i.relname, a.attnum`,\n [schemaName, tableName]\n );\n\n // Group columns by index\n const indexColumnsMap = new Map<\n string,\n { columns: string[]; isUnique: boolean; isPrimary: boolean }\n >();\n\n for (const row of indexDetails.rows) {\n const existing = indexColumnsMap.get(row.indexname);\n if (existing) {\n existing.columns.push(row.column_name);\n } else {\n indexColumnsMap.set(row.indexname, {\n columns: [row.column_name],\n isUnique: row.is_unique,\n isPrimary: row.is_primary,\n });\n }\n }\n\n return indexResult.rows.map((row) => {\n const details = indexColumnsMap.get(row.indexname);\n return {\n name: row.indexname,\n columns: details?.columns ?? [],\n isUnique: details?.isUnique ?? false,\n isPrimary: details?.isPrimary ?? false,\n definition: row.indexdef,\n };\n });\n}\n\n/**\n * Compares indexes between a reference and target schema.\n *\n * Detects the following types of drift:\n * - Missing indexes: Present in reference but absent in target\n * - Extra indexes: Present in target but absent in reference\n * - Definition mismatches: Different columns or uniqueness settings\n *\n * @param reference - Indexes from the reference (expected) schema\n * @param target - Indexes from the target (actual) schema\n * @returns Array of index drift details\n *\n * @example\n * ```typescript\n * const refIndexes = await introspectIndexes(pool, 'tenant_ref', 'users');\n * const targetIndexes = await introspectIndexes(pool, 'tenant_123', 'users');\n * const drifts = compareIndexes(refIndexes, targetIndexes);\n *\n * for (const drift of drifts) {\n * console.log(`${drift.index}: ${drift.description}`);\n * }\n * ```\n */\nexport function compareIndexes(\n reference: IndexInfo[],\n target: IndexInfo[]\n): IndexDrift[] {\n const drifts: IndexDrift[] = [];\n const refIndexMap = new Map(reference.map((i) => [i.name, i]));\n const targetIndexMap = new Map(target.map((i) => [i.name, i]));\n\n // Check for missing indexes\n for (const refIndex of reference) {\n const targetIndex = targetIndexMap.get(refIndex.name);\n\n if (!targetIndex) {\n drifts.push({\n index: refIndex.name,\n type: 'missing',\n expected: refIndex.definition,\n description: `Index \"${refIndex.name}\" is missing`,\n });\n continue;\n }\n\n // Compare columns and uniqueness\n const refCols = refIndex.columns.sort().join(',');\n const targetCols = targetIndex.columns.sort().join(',');\n if (refCols !== targetCols || refIndex.isUnique !== targetIndex.isUnique) {\n drifts.push({\n index: refIndex.name,\n type: 'definition_mismatch',\n expected: refIndex.definition,\n actual: targetIndex.definition,\n description: `Index \"${refIndex.name}\" definition differs`,\n });\n }\n }\n\n // Check for extra indexes\n for (const targetIndex of target) {\n if (!refIndexMap.has(targetIndex.name)) {\n drifts.push({\n index: targetIndex.name,\n type: 'extra',\n actual: targetIndex.definition,\n description: `Extra index \"${targetIndex.name}\" not in reference`,\n });\n }\n }\n\n return drifts;\n}\n","/**\n * Constraint Analyzer\n *\n * Analyzes and compares constraint structures between schemas.\n * Detects missing constraints, extra constraints, and definition mismatches.\n *\n * @module drift/constraint-analyzer\n */\n\nimport type { Pool } from 'pg';\nimport type { ConstraintInfo, ConstraintDrift } from './types.js';\n\n/**\n * Introspects constraints for a specific table in a schema.\n *\n * Retrieves detailed constraint metadata including type, columns,\n * foreign key references, and check expressions.\n *\n * @param pool - Database connection pool\n * @param schemaName - PostgreSQL schema name\n * @param tableName - Table name to introspect\n * @returns Array of constraint information\n *\n * @example\n * ```typescript\n * const constraints = await introspectConstraints(pool, 'tenant_123', 'orders');\n * for (const con of constraints) {\n * console.log(`${con.name}: ${con.type} on (${con.columns.join(', ')})`);\n * }\n * ```\n */\nexport async function introspectConstraints(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<ConstraintInfo[]> {\n const result = await pool.query<{\n constraint_name: string;\n constraint_type: string;\n column_name: string;\n foreign_table_schema: string | null;\n foreign_table_name: string | null;\n foreign_column_name: string | null;\n check_clause: string | null;\n }>(\n `SELECT\n tc.constraint_name,\n tc.constraint_type,\n kcu.column_name,\n ccu.table_schema as foreign_table_schema,\n ccu.table_name as foreign_table_name,\n ccu.column_name as foreign_column_name,\n cc.check_clause\n FROM information_schema.table_constraints tc\n LEFT JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n LEFT JOIN information_schema.constraint_column_usage ccu\n ON tc.constraint_name = ccu.constraint_name\n AND tc.constraint_type = 'FOREIGN KEY'\n LEFT JOIN information_schema.check_constraints cc\n ON tc.constraint_name = cc.constraint_name\n AND tc.constraint_type = 'CHECK'\n WHERE tc.table_schema = $1 AND tc.table_name = $2\n ORDER BY tc.constraint_name, kcu.ordinal_position`,\n [schemaName, tableName]\n );\n\n // Group by constraint name since multi-column constraints return multiple rows\n const constraintMap = new Map<string, ConstraintInfo>();\n\n for (const row of result.rows) {\n const existing = constraintMap.get(row.constraint_name);\n if (existing) {\n // Add column if not already present\n if (row.column_name && !existing.columns.includes(row.column_name)) {\n existing.columns.push(row.column_name);\n }\n // Add foreign column if not already present\n if (\n row.foreign_column_name &&\n existing.foreignColumns &&\n !existing.foreignColumns.includes(row.foreign_column_name)\n ) {\n existing.foreignColumns.push(row.foreign_column_name);\n }\n } else {\n const constraint: ConstraintInfo = {\n name: row.constraint_name,\n type: row.constraint_type as ConstraintInfo['type'],\n columns: row.column_name ? [row.column_name] : [],\n };\n if (row.foreign_table_name) {\n constraint.foreignTable = row.foreign_table_name;\n }\n if (row.foreign_column_name) {\n constraint.foreignColumns = [row.foreign_column_name];\n }\n if (row.check_clause) {\n constraint.checkExpression = row.check_clause;\n }\n constraintMap.set(row.constraint_name, constraint);\n }\n }\n\n return Array.from(constraintMap.values());\n}\n\n/**\n * Compares constraints between a reference and target schema.\n *\n * Detects the following types of drift:\n * - Missing constraints: Present in reference but absent in target\n * - Extra constraints: Present in target but absent in reference\n * - Definition mismatches: Different type or columns\n *\n * @param reference - Constraints from the reference (expected) schema\n * @param target - Constraints from the target (actual) schema\n * @returns Array of constraint drift details\n *\n * @example\n * ```typescript\n * const refConstraints = await introspectConstraints(pool, 'tenant_ref', 'orders');\n * const targetConstraints = await introspectConstraints(pool, 'tenant_123', 'orders');\n * const drifts = compareConstraints(refConstraints, targetConstraints);\n *\n * for (const drift of drifts) {\n * console.log(`${drift.constraint}: ${drift.description}`);\n * }\n * ```\n */\nexport function compareConstraints(\n reference: ConstraintInfo[],\n target: ConstraintInfo[]\n): ConstraintDrift[] {\n const drifts: ConstraintDrift[] = [];\n const refConstraintMap = new Map(reference.map((c) => [c.name, c]));\n const targetConstraintMap = new Map(target.map((c) => [c.name, c]));\n\n // Check for missing constraints\n for (const refConstraint of reference) {\n const targetConstraint = targetConstraintMap.get(refConstraint.name);\n\n if (!targetConstraint) {\n drifts.push({\n constraint: refConstraint.name,\n type: 'missing',\n expected: `${refConstraint.type} on (${refConstraint.columns.join(', ')})`,\n description: `Constraint \"${refConstraint.name}\" (${refConstraint.type}) is missing`,\n });\n continue;\n }\n\n // Compare constraint details\n const refCols = refConstraint.columns.sort().join(',');\n const targetCols = targetConstraint.columns.sort().join(',');\n if (refConstraint.type !== targetConstraint.type || refCols !== targetCols) {\n drifts.push({\n constraint: refConstraint.name,\n type: 'definition_mismatch',\n expected: `${refConstraint.type} on (${refConstraint.columns.join(', ')})`,\n actual: `${targetConstraint.type} on (${targetConstraint.columns.join(', ')})`,\n description: `Constraint \"${refConstraint.name}\" definition differs`,\n });\n }\n }\n\n // Check for extra constraints\n for (const targetConstraint of target) {\n if (!refConstraintMap.has(targetConstraint.name)) {\n drifts.push({\n constraint: targetConstraint.name,\n type: 'extra',\n actual: `${targetConstraint.type} on (${targetConstraint.columns.join(', ')})`,\n description: `Extra constraint \"${targetConstraint.name}\" (${targetConstraint.type}) not in reference`,\n });\n }\n }\n\n return drifts;\n}\n","/**\n * Drift Detector\n *\n * Detects schema drift between tenant databases by comparing their structures.\n * Identifies differences in tables, columns, indexes, and constraints.\n *\n * Extracted from Migrator to follow Single Responsibility Principle.\n *\n * @module drift/drift-detector\n */\n\nimport type { Pool } from 'pg';\nimport type { Config } from '../../types.js';\nimport type { SchemaManager } from '../schema-manager.js';\nimport type {\n TenantSchema,\n TableSchema,\n TenantSchemaDrift,\n SchemaDriftStatus,\n SchemaDriftOptions,\n TableDrift,\n IntrospectOptions,\n} from './types.js';\nimport { introspectColumns, compareColumns } from './column-analyzer.js';\nimport { introspectIndexes, compareIndexes } from './index-analyzer.js';\nimport { introspectConstraints, compareConstraints } from './constraint-analyzer.js';\n\nconst DEFAULT_MIGRATIONS_TABLE = '__drizzle_migrations';\n\n/**\n * Configuration options for DriftDetector\n */\nexport interface DriftDetectorConfig {\n /** Migrations table name to exclude from comparisons */\n migrationsTable?: string;\n /** Function to discover tenant IDs */\n tenantDiscovery: () => Promise<string[]>;\n}\n\n/**\n * Detects schema drift between tenant databases.\n *\n * Schema drift occurs when tenant databases have structural differences\n * that shouldn't exist if all migrations were applied consistently.\n * This class helps identify such inconsistencies by comparing schemas.\n *\n * @example\n * ```typescript\n * const detector = new DriftDetector(config, schemaManager, {\n * migrationsTable: '__drizzle_migrations',\n * tenantDiscovery: async () => ['tenant-1', 'tenant-2', 'tenant-3'],\n * });\n *\n * // Detect drift across all tenants\n * const status = await detector.detectDrift();\n * if (status.withDrift > 0) {\n * console.log('Schema drift detected!');\n * for (const tenant of status.details) {\n * if (tenant.hasDrift) {\n * console.log(`Tenant ${tenant.tenantId}:`);\n * for (const table of tenant.tables) {\n * console.log(` Table ${table.table}: ${table.status}`);\n * }\n * }\n * }\n * }\n * ```\n */\nexport class DriftDetector<\n TTenantSchema extends Record<string, unknown>,\n TSharedSchema extends Record<string, unknown>,\n> {\n private readonly migrationsTable: string;\n\n constructor(\n private readonly tenantConfig: Config<TTenantSchema, TSharedSchema>,\n private readonly schemaManager: SchemaManager<TTenantSchema, TSharedSchema>,\n private readonly driftConfig: DriftDetectorConfig\n ) {\n this.migrationsTable = driftConfig.migrationsTable ?? DEFAULT_MIGRATIONS_TABLE;\n }\n\n /**\n * Get the schema name for a tenant ID\n */\n private getSchemaName(tenantId: string): string {\n return this.tenantConfig.isolation.schemaNameTemplate(tenantId);\n }\n\n /**\n * Create a pool for a schema\n */\n private async createPool(schemaName: string): Promise<Pool> {\n return this.schemaManager.createPool(schemaName);\n }\n\n /**\n * Detect schema drift across all tenants.\n *\n * Compares each tenant's schema against a reference tenant (first tenant by default).\n * Returns a comprehensive report of all differences found.\n *\n * @param options - Detection options\n * @returns Schema drift status with details for each tenant\n *\n * @example\n * ```typescript\n * // Basic usage - compare all tenants against the first one\n * const status = await detector.detectDrift();\n *\n * // Use a specific tenant as reference\n * const status = await detector.detectDrift({\n * referenceTenant: 'golden-tenant',\n * });\n *\n * // Check specific tenants only\n * const status = await detector.detectDrift({\n * tenantIds: ['tenant-1', 'tenant-2'],\n * });\n *\n * // Skip index and constraint comparison for faster checks\n * const status = await detector.detectDrift({\n * includeIndexes: false,\n * includeConstraints: false,\n * });\n * ```\n */\n async detectDrift(options: SchemaDriftOptions = {}): Promise<SchemaDriftStatus> {\n const startTime = Date.now();\n const {\n concurrency = 10,\n includeIndexes = true,\n includeConstraints = true,\n excludeTables = [this.migrationsTable],\n onProgress,\n } = options;\n\n // Get tenant IDs to check\n const tenantIds = options.tenantIds ?? (await this.driftConfig.tenantDiscovery());\n\n if (tenantIds.length === 0) {\n return {\n referenceTenant: '',\n total: 0,\n noDrift: 0,\n withDrift: 0,\n error: 0,\n details: [],\n timestamp: new Date().toISOString(),\n durationMs: Date.now() - startTime,\n };\n }\n\n // Determine reference tenant\n const referenceTenant = options.referenceTenant ?? tenantIds[0]!;\n\n // Get reference schema\n onProgress?.(referenceTenant, 'starting');\n onProgress?.(referenceTenant, 'introspecting');\n\n const referenceSchema = await this.introspectSchema(referenceTenant, {\n includeIndexes,\n includeConstraints,\n excludeTables,\n });\n\n if (!referenceSchema) {\n return {\n referenceTenant,\n total: tenantIds.length,\n noDrift: 0,\n withDrift: 0,\n error: tenantIds.length,\n details: tenantIds.map((id) => ({\n tenantId: id,\n schemaName: this.getSchemaName(id),\n hasDrift: false,\n tables: [],\n issueCount: 0,\n error:\n id === referenceTenant\n ? 'Failed to introspect reference tenant'\n : 'Reference tenant introspection failed',\n })),\n timestamp: new Date().toISOString(),\n durationMs: Date.now() - startTime,\n };\n }\n\n onProgress?.(referenceTenant, 'completed');\n\n // Filter out reference tenant from comparison\n const tenantsToCheck = tenantIds.filter((id) => id !== referenceTenant);\n\n // Compare each tenant against reference\n const results: TenantSchemaDrift[] = [];\n\n // Add reference tenant as \"no drift\" (it's the baseline)\n results.push({\n tenantId: referenceTenant,\n schemaName: referenceSchema.schemaName,\n hasDrift: false,\n tables: [],\n issueCount: 0,\n });\n\n // Process tenants in batches\n for (let i = 0; i < tenantsToCheck.length; i += concurrency) {\n const batch = tenantsToCheck.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n try {\n onProgress?.(tenantId, 'starting');\n onProgress?.(tenantId, 'introspecting');\n\n const tenantSchema = await this.introspectSchema(tenantId, {\n includeIndexes,\n includeConstraints,\n excludeTables,\n });\n\n if (!tenantSchema) {\n onProgress?.(tenantId, 'failed');\n return {\n tenantId,\n schemaName: this.getSchemaName(tenantId),\n hasDrift: false,\n tables: [],\n issueCount: 0,\n error: 'Failed to introspect schema',\n };\n }\n\n onProgress?.(tenantId, 'comparing');\n\n const drift = this.compareSchemas(referenceSchema, tenantSchema, {\n includeIndexes,\n includeConstraints,\n });\n\n onProgress?.(tenantId, 'completed');\n\n return drift;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n return {\n tenantId,\n schemaName: this.getSchemaName(tenantId),\n hasDrift: false,\n tables: [],\n issueCount: 0,\n error: (error as Error).message,\n };\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n return {\n referenceTenant,\n total: results.length,\n noDrift: results.filter((r) => !r.hasDrift && !r.error).length,\n withDrift: results.filter((r) => r.hasDrift && !r.error).length,\n error: results.filter((r) => !!r.error).length,\n details: results,\n timestamp: new Date().toISOString(),\n durationMs: Date.now() - startTime,\n };\n }\n\n /**\n * Compare a specific tenant against a reference tenant.\n *\n * @param tenantId - Tenant to check\n * @param referenceTenantId - Tenant to use as reference\n * @param options - Introspection options\n * @returns Drift details for the tenant\n *\n * @example\n * ```typescript\n * const drift = await detector.compareTenant('tenant-123', 'golden-tenant');\n * if (drift.hasDrift) {\n * console.log(`Found ${drift.issueCount} issues`);\n * }\n * ```\n */\n async compareTenant(\n tenantId: string,\n referenceTenantId: string,\n options: IntrospectOptions = {}\n ): Promise<TenantSchemaDrift> {\n const {\n includeIndexes = true,\n includeConstraints = true,\n excludeTables = [this.migrationsTable],\n } = options;\n\n const referenceSchema = await this.introspectSchema(referenceTenantId, {\n includeIndexes,\n includeConstraints,\n excludeTables,\n });\n\n if (!referenceSchema) {\n return {\n tenantId,\n schemaName: this.getSchemaName(tenantId),\n hasDrift: false,\n tables: [],\n issueCount: 0,\n error: 'Failed to introspect reference tenant',\n };\n }\n\n const tenantSchema = await this.introspectSchema(tenantId, {\n includeIndexes,\n includeConstraints,\n excludeTables,\n });\n\n if (!tenantSchema) {\n return {\n tenantId,\n schemaName: this.getSchemaName(tenantId),\n hasDrift: false,\n tables: [],\n issueCount: 0,\n error: 'Failed to introspect tenant schema',\n };\n }\n\n return this.compareSchemas(referenceSchema, tenantSchema, {\n includeIndexes,\n includeConstraints,\n });\n }\n\n /**\n * Introspect a tenant's schema structure.\n *\n * Retrieves all tables, columns, indexes, and constraints\n * for a tenant's schema.\n *\n * @param tenantId - Tenant to introspect\n * @param options - Introspection options\n * @returns Schema structure or null if introspection fails\n *\n * @example\n * ```typescript\n * const schema = await detector.introspectSchema('tenant-123');\n * if (schema) {\n * console.log(`Found ${schema.tables.length} tables`);\n * for (const table of schema.tables) {\n * console.log(` ${table.name}: ${table.columns.length} columns`);\n * }\n * }\n * ```\n */\n async introspectSchema(\n tenantId: string,\n options: IntrospectOptions = {}\n ): Promise<TenantSchema | null> {\n const schemaName = this.getSchemaName(tenantId);\n const pool = await this.createPool(schemaName);\n\n try {\n const tables = await this.introspectTables(pool, schemaName, options);\n\n return {\n tenantId,\n schemaName,\n tables,\n introspectedAt: new Date(),\n };\n } catch {\n return null;\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Compare two schema snapshots.\n *\n * This method compares pre-introspected schema snapshots,\n * useful when you already have the schema data available.\n *\n * @param reference - Reference (expected) schema\n * @param target - Target (actual) schema\n * @param options - Comparison options\n * @returns Drift details\n *\n * @example\n * ```typescript\n * const refSchema = await detector.introspectSchema('golden-tenant');\n * const targetSchema = await detector.introspectSchema('tenant-123');\n *\n * if (refSchema && targetSchema) {\n * const drift = detector.compareSchemas(refSchema, targetSchema);\n * console.log(`Drift detected: ${drift.hasDrift}`);\n * }\n * ```\n */\n compareSchemas(\n reference: TenantSchema,\n target: TenantSchema,\n options: Pick<IntrospectOptions, 'includeIndexes' | 'includeConstraints'> = {}\n ): TenantSchemaDrift {\n const { includeIndexes = true, includeConstraints = true } = options;\n const tableDrifts: TableDrift[] = [];\n let totalIssues = 0;\n\n const refTableMap = new Map(reference.tables.map((t) => [t.name, t]));\n const targetTableMap = new Map(target.tables.map((t) => [t.name, t]));\n\n // Check for missing and drifted tables\n for (const refTable of reference.tables) {\n const targetTable = targetTableMap.get(refTable.name);\n\n if (!targetTable) {\n // Table is missing in target\n tableDrifts.push({\n table: refTable.name,\n status: 'missing',\n columns: refTable.columns.map((c) => ({\n column: c.name,\n type: 'missing',\n expected: c.dataType,\n description: `Column \"${c.name}\" (${c.dataType}) is missing`,\n })),\n indexes: [],\n constraints: [],\n });\n totalIssues += refTable.columns.length;\n continue;\n }\n\n // Compare table structure\n const columnDrifts = compareColumns(refTable.columns, targetTable.columns);\n const indexDrifts = includeIndexes\n ? compareIndexes(refTable.indexes, targetTable.indexes)\n : [];\n const constraintDrifts = includeConstraints\n ? compareConstraints(refTable.constraints, targetTable.constraints)\n : [];\n\n const issues = columnDrifts.length + indexDrifts.length + constraintDrifts.length;\n totalIssues += issues;\n\n if (issues > 0) {\n tableDrifts.push({\n table: refTable.name,\n status: 'drifted',\n columns: columnDrifts,\n indexes: indexDrifts,\n constraints: constraintDrifts,\n });\n }\n }\n\n // Check for extra tables in target\n for (const targetTable of target.tables) {\n if (!refTableMap.has(targetTable.name)) {\n tableDrifts.push({\n table: targetTable.name,\n status: 'extra',\n columns: targetTable.columns.map((c) => ({\n column: c.name,\n type: 'extra',\n actual: c.dataType,\n description: `Extra column \"${c.name}\" (${c.dataType}) not in reference`,\n })),\n indexes: [],\n constraints: [],\n });\n totalIssues += targetTable.columns.length;\n }\n }\n\n return {\n tenantId: target.tenantId,\n schemaName: target.schemaName,\n hasDrift: totalIssues > 0,\n tables: tableDrifts,\n issueCount: totalIssues,\n };\n }\n\n /**\n * Introspect all tables in a schema\n */\n private async introspectTables(\n pool: Pool,\n schemaName: string,\n options: IntrospectOptions\n ): Promise<TableSchema[]> {\n const { includeIndexes = true, includeConstraints = true, excludeTables = [] } = options;\n\n // Get all tables in schema\n const tablesResult = await pool.query<{ table_name: string }>(\n `SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = $1\n AND table_type = 'BASE TABLE'\n ORDER BY table_name`,\n [schemaName]\n );\n\n const tables: TableSchema[] = [];\n\n for (const row of tablesResult.rows) {\n if (excludeTables.includes(row.table_name)) {\n continue;\n }\n\n const columns = await introspectColumns(pool, schemaName, row.table_name);\n const indexes = includeIndexes\n ? await introspectIndexes(pool, schemaName, row.table_name)\n : [];\n const constraints = includeConstraints\n ? await introspectConstraints(pool, schemaName, row.table_name)\n : [];\n\n tables.push({\n name: row.table_name,\n columns,\n indexes,\n constraints,\n });\n }\n\n return tables;\n }\n}\n\n/**\n * Factory function to create a DriftDetector instance.\n *\n * @param config - Tenant configuration\n * @param schemaManager - Schema manager instance\n * @param driftConfig - Drift detector configuration\n * @returns A new DriftDetector instance\n *\n * @example\n * ```typescript\n * const detector = createDriftDetector(config, schemaManager, {\n * migrationsTable: '__drizzle_migrations',\n * tenantDiscovery: async () => db.select().from(tenants).then(t => t.map(x => x.id)),\n * });\n * ```\n */\nexport function createDriftDetector<\n TTenantSchema extends Record<string, unknown>,\n TSharedSchema extends Record<string, unknown>,\n>(\n config: Config<TTenantSchema, TSharedSchema>,\n schemaManager: SchemaManager<TTenantSchema, TSharedSchema>,\n driftConfig: DriftDetectorConfig\n): DriftDetector<TTenantSchema, TSharedSchema> {\n return new DriftDetector(config, schemaManager, driftConfig);\n}\n","import { drizzle } from 'drizzle-orm/node-postgres';\nimport type {\n SeedFunction,\n SeedOptions,\n TenantSeedResult,\n SeedResults,\n} from '../types.js';\nimport type { ISeeder } from '../interfaces.js';\nimport type { SeederConfig, SeederDependencies } from './types.js';\n\n/**\n * Responsible for seeding tenant databases with initial data.\n *\n * Extracted from Migrator to follow Single Responsibility Principle.\n * Handles seeding individual tenants and batch seeding operations.\n *\n * @example\n * ```typescript\n * const seeder = new Seeder(config, dependencies);\n *\n * // Seed a single tenant\n * const result = await seeder.seedTenant('tenant-123', async (db, tenantId) => {\n * await db.insert(roles).values([\n * { name: 'admin', permissions: ['*'] },\n * { name: 'user', permissions: ['read'] },\n * ]);\n * });\n *\n * // Seed all tenants\n * const results = await seeder.seedAll(seedFn, { concurrency: 10 });\n * ```\n */\nexport class Seeder<\n TTenantSchema extends Record<string, unknown> = Record<string, unknown>,\n> implements ISeeder<TTenantSchema>\n{\n constructor(\n private readonly config: SeederConfig,\n private readonly deps: SeederDependencies<TTenantSchema>\n ) {}\n\n /**\n * Seed a single tenant with initial data\n *\n * Creates a database connection for the tenant, executes the seed function,\n * and properly cleans up the connection afterward.\n *\n * @param tenantId - The tenant identifier\n * @param seedFn - Function that seeds the database\n * @returns Result of the seeding operation\n *\n * @example\n * ```typescript\n * const result = await seeder.seedTenant('tenant-123', async (db, tenantId) => {\n * await db.insert(users).values([\n * { name: 'Admin', email: `admin@${tenantId}.com` },\n * ]);\n * });\n *\n * if (result.success) {\n * console.log(`Seeded ${result.tenantId} in ${result.durationMs}ms`);\n * }\n * ```\n */\n async seedTenant(\n tenantId: string,\n seedFn: SeedFunction<TTenantSchema>\n ): Promise<TenantSeedResult> {\n const startTime = Date.now();\n const schemaName = this.deps.schemaNameTemplate(tenantId);\n\n const pool = await this.deps.createPool(schemaName);\n\n try {\n const db = drizzle(pool, {\n schema: this.deps.tenantSchema as TTenantSchema,\n });\n\n await seedFn(db as any, tenantId);\n\n return {\n tenantId,\n schemaName,\n success: true,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n tenantId,\n schemaName,\n success: false,\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Seed all tenants with initial data in parallel\n *\n * Discovers all tenants and seeds them in batches with configurable concurrency.\n * Supports progress callbacks and abort-on-error behavior.\n *\n * @param seedFn - Function that seeds each database\n * @param options - Seeding options\n * @returns Aggregate results of all seeding operations\n *\n * @example\n * ```typescript\n * const results = await seeder.seedAll(\n * async (db, tenantId) => {\n * await db.insert(settings).values({ key: 'initialized', value: 'true' });\n * },\n * {\n * concurrency: 5,\n * onProgress: (id, status) => console.log(`${id}: ${status}`),\n * }\n * );\n *\n * console.log(`Succeeded: ${results.succeeded}/${results.total}`);\n * ```\n */\n async seedAll(\n seedFn: SeedFunction<TTenantSchema>,\n options: SeedOptions = {}\n ): Promise<SeedResults> {\n const { concurrency = 10, onProgress, onError } = options;\n\n const tenantIds = await this.config.tenantDiscovery();\n const results: TenantSeedResult[] = [];\n let aborted = false;\n\n for (let i = 0; i < tenantIds.length && !aborted; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n if (aborted) {\n return this.createSkippedResult(tenantId);\n }\n\n try {\n onProgress?.(tenantId, 'starting');\n onProgress?.(tenantId, 'seeding');\n const result = await this.seedTenant(tenantId, seedFn);\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n const action = onError?.(tenantId, error as Error);\n if (action === 'abort') {\n aborted = true;\n }\n return this.createErrorResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n // Mark remaining tenants as skipped if aborted\n if (aborted) {\n const remaining = tenantIds.slice(results.length);\n for (const tenantId of remaining) {\n results.push(this.createSkippedResult(tenantId));\n }\n }\n\n return this.aggregateResults(results);\n }\n\n /**\n * Seed specific tenants with initial data\n *\n * Seeds only the specified tenants in batches with configurable concurrency.\n *\n * @param tenantIds - List of tenant IDs to seed\n * @param seedFn - Function that seeds each database\n * @param options - Seeding options\n * @returns Aggregate results of seeding operations\n *\n * @example\n * ```typescript\n * const results = await seeder.seedTenants(\n * ['tenant-1', 'tenant-2', 'tenant-3'],\n * async (db) => {\n * await db.insert(config).values({ setup: true });\n * },\n * { concurrency: 2 }\n * );\n * ```\n */\n async seedTenants(\n tenantIds: string[],\n seedFn: SeedFunction<TTenantSchema>,\n options: SeedOptions = {}\n ): Promise<SeedResults> {\n const { concurrency = 10, onProgress, onError } = options;\n\n const results: TenantSeedResult[] = [];\n\n for (let i = 0; i < tenantIds.length; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n try {\n onProgress?.(tenantId, 'starting');\n onProgress?.(tenantId, 'seeding');\n const result = await this.seedTenant(tenantId, seedFn);\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n onError?.(tenantId, error as Error);\n return this.createErrorResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n return this.aggregateResults(results);\n }\n\n /**\n * Create a skipped result for aborted seeding\n */\n private createSkippedResult(tenantId: string): TenantSeedResult {\n return {\n tenantId,\n schemaName: this.deps.schemaNameTemplate(tenantId),\n success: false,\n error: 'Skipped due to abort',\n durationMs: 0,\n };\n }\n\n /**\n * Create an error result for failed seeding\n */\n private createErrorResult(tenantId: string, error: Error): TenantSeedResult {\n return {\n tenantId,\n schemaName: this.deps.schemaNameTemplate(tenantId),\n success: false,\n error: error.message,\n durationMs: 0,\n };\n }\n\n /**\n * Aggregate individual results into a summary\n */\n private aggregateResults(results: TenantSeedResult[]): SeedResults {\n return {\n total: results.length,\n succeeded: results.filter((r) => r.success).length,\n failed: results.filter(\n (r) => !r.success && r.error !== 'Skipped due to abort'\n ).length,\n skipped: results.filter((r) => r.error === 'Skipped due to abort').length,\n details: results,\n };\n }\n}\n\n/**\n * Factory function to create a Seeder instance\n *\n * @param config - Seeder configuration\n * @param dependencies - Required dependencies\n * @returns A configured Seeder instance\n *\n * @example\n * ```typescript\n * const seeder = createSeeder(\n * { tenantDiscovery: async () => ['t1', 't2'] },\n * {\n * createPool: schemaManager.createPool.bind(schemaManager),\n * schemaNameTemplate: (id) => `tenant_${id}`,\n * tenantSchema: schema,\n * }\n * );\n * ```\n */\nexport function createSeeder<\n TTenantSchema extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: SeederConfig,\n dependencies: SeederDependencies<TTenantSchema>\n): Seeder<TTenantSchema> {\n return new Seeder(config, dependencies);\n}\n","import type { Pool } from 'pg';\nimport type {\n MigrationFile,\n TenantSyncStatus,\n SyncStatus,\n TenantSyncResult,\n SyncResults,\n SyncOptions,\n} from '../types.js';\nimport type { ISyncManager } from '../interfaces.js';\nimport type { SyncManagerConfig, SyncManagerDependencies, AppliedMigrationRecord } from './types.js';\nimport type { DetectedFormat } from '../table-format.js';\n\n/**\n * Responsible for synchronizing migration state between disk and database.\n *\n * Extracted from Migrator to follow Single Responsibility Principle.\n * Handles detection of divergences and reconciliation operations.\n *\n * @example\n * ```typescript\n * const syncManager = new SyncManager(config, dependencies);\n *\n * // Check sync status\n * const status = await syncManager.getSyncStatus();\n * if (status.outOfSync > 0) {\n * console.log(`${status.outOfSync} tenants out of sync`);\n * }\n *\n * // Mark missing migrations as applied\n * await syncManager.markAllMissing({ concurrency: 10 });\n *\n * // Clean orphan records\n * await syncManager.cleanAllOrphans({ concurrency: 10 });\n * ```\n */\nexport class SyncManager implements ISyncManager {\n constructor(\n private readonly config: SyncManagerConfig,\n private readonly deps: SyncManagerDependencies\n ) {}\n\n /**\n * Get sync status for all tenants\n *\n * Detects divergences between migrations on disk and tracking in database.\n * A tenant is \"in sync\" when all disk migrations are tracked and no orphan records exist.\n *\n * @returns Aggregate sync status for all tenants\n *\n * @example\n * ```typescript\n * const status = await syncManager.getSyncStatus();\n * console.log(`Total: ${status.total}, In sync: ${status.inSync}, Out of sync: ${status.outOfSync}`);\n *\n * for (const tenant of status.details.filter(d => !d.inSync)) {\n * console.log(`${tenant.tenantId}: missing=${tenant.missing.length}, orphans=${tenant.orphans.length}`);\n * }\n * ```\n */\n async getSyncStatus(): Promise<SyncStatus> {\n const tenantIds = await this.config.tenantDiscovery();\n const migrations = await this.deps.loadMigrations();\n const statuses: TenantSyncStatus[] = [];\n\n for (const tenantId of tenantIds) {\n statuses.push(await this.getTenantSyncStatus(tenantId, migrations));\n }\n\n return {\n total: statuses.length,\n inSync: statuses.filter((s) => s.inSync && !s.error).length,\n outOfSync: statuses.filter((s) => !s.inSync && !s.error).length,\n error: statuses.filter((s) => !!s.error).length,\n details: statuses,\n };\n }\n\n /**\n * Get sync status for a specific tenant\n *\n * Compares migrations on disk with records in the database.\n * Identifies missing migrations (on disk but not tracked) and\n * orphan records (tracked but not on disk).\n *\n * @param tenantId - The tenant identifier\n * @param migrations - Optional pre-loaded migrations (avoids reloading from disk)\n * @returns Sync status for the tenant\n *\n * @example\n * ```typescript\n * const status = await syncManager.getTenantSyncStatus('tenant-123');\n * if (status.missing.length > 0) {\n * console.log(`Missing: ${status.missing.join(', ')}`);\n * }\n * if (status.orphans.length > 0) {\n * console.log(`Orphans: ${status.orphans.join(', ')}`);\n * }\n * ```\n */\n async getTenantSyncStatus(tenantId: string, migrations?: MigrationFile[]): Promise<TenantSyncStatus> {\n const schemaName = this.deps.schemaNameTemplate(tenantId);\n const pool = await this.deps.createPool(schemaName);\n\n try {\n const allMigrations = migrations ?? await this.deps.loadMigrations();\n const migrationNames = new Set(allMigrations.map((m) => m.name));\n const migrationHashes = new Set(allMigrations.map((m) => m.hash));\n\n // Check if migrations table exists\n const tableExists = await this.deps.migrationsTableExists(pool, schemaName);\n if (!tableExists) {\n return {\n tenantId,\n schemaName,\n missing: allMigrations.map((m) => m.name),\n orphans: [],\n inSync: allMigrations.length === 0,\n format: null,\n };\n }\n\n // Detect the table format\n const format = await this.deps.getOrDetectFormat(pool, schemaName);\n const applied = await this.getAppliedMigrations(pool, schemaName, format);\n\n // Find missing migrations (in disk but not in database)\n const appliedIdentifiers = new Set(applied.map((m) => m.identifier));\n const missing = allMigrations\n .filter((m) => !this.isMigrationApplied(m, appliedIdentifiers, format))\n .map((m) => m.name);\n\n // Find orphan records (in database but not in disk)\n const orphans = applied\n .filter((m) => {\n if (format.columns.identifier === 'name') {\n return !migrationNames.has(m.identifier);\n }\n // For hash-based formats, check both hash and name\n return !migrationHashes.has(m.identifier) && !migrationNames.has(m.identifier);\n })\n .map((m) => m.identifier);\n\n return {\n tenantId,\n schemaName,\n missing,\n orphans,\n inSync: missing.length === 0 && orphans.length === 0,\n format: format.format,\n };\n } catch (error) {\n return {\n tenantId,\n schemaName,\n missing: [],\n orphans: [],\n inSync: false,\n format: null,\n error: (error as Error).message,\n };\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Mark missing migrations as applied for a tenant\n *\n * Records migrations that exist on disk but are not tracked in the database.\n * Useful for syncing tracking state with already-applied migrations.\n *\n * @param tenantId - The tenant identifier\n * @returns Result of the mark operation\n *\n * @example\n * ```typescript\n * const result = await syncManager.markMissing('tenant-123');\n * if (result.success) {\n * console.log(`Marked ${result.markedMigrations.length} migrations as applied`);\n * }\n * ```\n */\n async markMissing(tenantId: string): Promise<TenantSyncResult> {\n const startTime = Date.now();\n const schemaName = this.deps.schemaNameTemplate(tenantId);\n const markedMigrations: string[] = [];\n\n const pool = await this.deps.createPool(schemaName);\n\n try {\n const syncStatus = await this.getTenantSyncStatus(tenantId);\n\n if (syncStatus.error) {\n return {\n tenantId,\n schemaName,\n success: false,\n markedMigrations: [],\n removedOrphans: [],\n error: syncStatus.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n if (syncStatus.missing.length === 0) {\n return {\n tenantId,\n schemaName,\n success: true,\n markedMigrations: [],\n removedOrphans: [],\n durationMs: Date.now() - startTime,\n };\n }\n\n const format = await this.deps.getOrDetectFormat(pool, schemaName);\n await this.deps.ensureMigrationsTable(pool, schemaName, format);\n\n const allMigrations = await this.deps.loadMigrations();\n const missingSet = new Set(syncStatus.missing);\n\n for (const migration of allMigrations) {\n if (missingSet.has(migration.name)) {\n await this.recordMigration(pool, schemaName, migration, format);\n markedMigrations.push(migration.name);\n }\n }\n\n return {\n tenantId,\n schemaName,\n success: true,\n markedMigrations,\n removedOrphans: [],\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n tenantId,\n schemaName,\n success: false,\n markedMigrations,\n removedOrphans: [],\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Mark missing migrations as applied for all tenants\n *\n * Processes all tenants in parallel with configurable concurrency.\n * Supports progress callbacks and abort-on-error behavior.\n *\n * @param options - Sync options\n * @returns Aggregate results of all mark operations\n *\n * @example\n * ```typescript\n * const results = await syncManager.markAllMissing({\n * concurrency: 10,\n * onProgress: (id, status) => console.log(`${id}: ${status}`),\n * });\n * console.log(`Succeeded: ${results.succeeded}/${results.total}`);\n * ```\n */\n async markAllMissing(options: SyncOptions = {}): Promise<SyncResults> {\n const { concurrency = 10, onProgress, onError } = options;\n\n const tenantIds = await this.config.tenantDiscovery();\n const results: TenantSyncResult[] = [];\n let aborted = false;\n\n for (let i = 0; i < tenantIds.length && !aborted; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n if (aborted) {\n return this.createSkippedSyncResult(tenantId);\n }\n\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.markMissing(tenantId);\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n const action = onError?.(tenantId, error as Error);\n if (action === 'abort') {\n aborted = true;\n }\n return this.createErrorSyncResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n return this.aggregateSyncResults(results);\n }\n\n /**\n * Remove orphan migration records for a tenant\n *\n * Deletes records from the migrations table that don't have\n * corresponding files on disk.\n *\n * @param tenantId - The tenant identifier\n * @returns Result of the clean operation\n *\n * @example\n * ```typescript\n * const result = await syncManager.cleanOrphans('tenant-123');\n * if (result.success) {\n * console.log(`Removed ${result.removedOrphans.length} orphan records`);\n * }\n * ```\n */\n async cleanOrphans(tenantId: string): Promise<TenantSyncResult> {\n const startTime = Date.now();\n const schemaName = this.deps.schemaNameTemplate(tenantId);\n const removedOrphans: string[] = [];\n\n const pool = await this.deps.createPool(schemaName);\n\n try {\n const syncStatus = await this.getTenantSyncStatus(tenantId);\n\n if (syncStatus.error) {\n return {\n tenantId,\n schemaName,\n success: false,\n markedMigrations: [],\n removedOrphans: [],\n error: syncStatus.error,\n durationMs: Date.now() - startTime,\n };\n }\n\n if (syncStatus.orphans.length === 0) {\n return {\n tenantId,\n schemaName,\n success: true,\n markedMigrations: [],\n removedOrphans: [],\n durationMs: Date.now() - startTime,\n };\n }\n\n const format = await this.deps.getOrDetectFormat(pool, schemaName);\n const identifierColumn = format.columns.identifier;\n\n for (const orphan of syncStatus.orphans) {\n await pool.query(\n `DELETE FROM \"${schemaName}\".\"${format.tableName}\" WHERE \"${identifierColumn}\" = $1`,\n [orphan]\n );\n removedOrphans.push(orphan);\n }\n\n return {\n tenantId,\n schemaName,\n success: true,\n markedMigrations: [],\n removedOrphans,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n tenantId,\n schemaName,\n success: false,\n markedMigrations: [],\n removedOrphans,\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Remove orphan migration records for all tenants\n *\n * Processes all tenants in parallel with configurable concurrency.\n * Supports progress callbacks and abort-on-error behavior.\n *\n * @param options - Sync options\n * @returns Aggregate results of all clean operations\n *\n * @example\n * ```typescript\n * const results = await syncManager.cleanAllOrphans({\n * concurrency: 10,\n * onProgress: (id, status) => console.log(`${id}: ${status}`),\n * });\n * console.log(`Succeeded: ${results.succeeded}/${results.total}`);\n * ```\n */\n async cleanAllOrphans(options: SyncOptions = {}): Promise<SyncResults> {\n const { concurrency = 10, onProgress, onError } = options;\n\n const tenantIds = await this.config.tenantDiscovery();\n const results: TenantSyncResult[] = [];\n let aborted = false;\n\n for (let i = 0; i < tenantIds.length && !aborted; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n if (aborted) {\n return this.createSkippedSyncResult(tenantId);\n }\n\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.cleanOrphans(tenantId);\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n const action = onError?.(tenantId, error as Error);\n if (action === 'abort') {\n aborted = true;\n }\n return this.createErrorSyncResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n return this.aggregateSyncResults(results);\n }\n\n // ============================================================================\n // Private Helper Methods\n // ============================================================================\n\n /**\n * Get applied migrations for a schema\n */\n private async getAppliedMigrations(\n pool: Pool,\n schemaName: string,\n format: DetectedFormat\n ): Promise<Array<{ identifier: string; appliedAt: Date }>> {\n const identifierColumn = format.columns.identifier;\n const timestampColumn = format.columns.timestamp;\n\n const result = await pool.query<AppliedMigrationRecord>(\n `SELECT id, \"${identifierColumn}\" as identifier, \"${timestampColumn}\" as applied_at\n FROM \"${schemaName}\".\"${format.tableName}\"\n ORDER BY id`\n );\n\n return result.rows.map((row) => {\n const appliedAt = format.columns.timestampType === 'bigint'\n ? new Date(Number(row.applied_at))\n : new Date(row.applied_at);\n\n return {\n identifier: row.identifier,\n appliedAt,\n };\n });\n }\n\n /**\n * Check if a migration has been applied\n */\n private isMigrationApplied(\n migration: MigrationFile,\n appliedIdentifiers: Set<string>,\n format: DetectedFormat\n ): boolean {\n if (format.columns.identifier === 'name') {\n return appliedIdentifiers.has(migration.name);\n }\n\n // Hash-based: check both hash AND name for backwards compatibility\n return appliedIdentifiers.has(migration.hash) || appliedIdentifiers.has(migration.name);\n }\n\n /**\n * Record a migration as applied (without executing SQL)\n */\n private async recordMigration(\n pool: Pool,\n schemaName: string,\n migration: MigrationFile,\n format: DetectedFormat\n ): Promise<void> {\n const { identifier, timestamp, timestampType } = format.columns;\n const identifierValue = identifier === 'name' ? migration.name : migration.hash;\n const timestampValue = timestampType === 'bigint' ? Date.now() : new Date();\n\n await pool.query(\n `INSERT INTO \"${schemaName}\".\"${format.tableName}\" (\"${identifier}\", \"${timestamp}\") VALUES ($1, $2)`,\n [identifierValue, timestampValue]\n );\n }\n\n /**\n * Create a skipped sync result for aborted operations\n */\n private createSkippedSyncResult(tenantId: string): TenantSyncResult {\n return {\n tenantId,\n schemaName: this.deps.schemaNameTemplate(tenantId),\n success: false,\n markedMigrations: [],\n removedOrphans: [],\n error: 'Skipped due to abort',\n durationMs: 0,\n };\n }\n\n /**\n * Create an error sync result for failed operations\n */\n private createErrorSyncResult(tenantId: string, error: Error): TenantSyncResult {\n return {\n tenantId,\n schemaName: this.deps.schemaNameTemplate(tenantId),\n success: false,\n markedMigrations: [],\n removedOrphans: [],\n error: error.message,\n durationMs: 0,\n };\n }\n\n /**\n * Aggregate individual sync results into a summary\n */\n private aggregateSyncResults(results: TenantSyncResult[]): SyncResults {\n return {\n total: results.length,\n succeeded: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n details: results,\n };\n }\n}\n\n/**\n * Factory function to create a SyncManager instance\n *\n * @param config - SyncManager configuration\n * @param dependencies - Required dependencies\n * @returns A configured SyncManager instance\n *\n * @example\n * ```typescript\n * const syncManager = createSyncManager(\n * {\n * tenantDiscovery: async () => ['t1', 't2'],\n * migrationsFolder: './migrations',\n * migrationsTable: '__drizzle_migrations',\n * },\n * {\n * createPool: schemaManager.createPool.bind(schemaManager),\n * schemaNameTemplate: (id) => `tenant_${id}`,\n * migrationsTableExists: schemaManager.migrationsTableExists.bind(schemaManager),\n * ensureMigrationsTable: schemaManager.ensureMigrationsTable.bind(schemaManager),\n * getOrDetectFormat: migrator.getOrDetectFormat.bind(migrator),\n * loadMigrations: migrator.loadMigrations.bind(migrator),\n * }\n * );\n * ```\n */\nexport function createSyncManager(\n config: SyncManagerConfig,\n dependencies: SyncManagerDependencies\n): SyncManager {\n return new SyncManager(config, dependencies);\n}\n","import type { Pool } from 'pg';\nimport type {\n MigrationFile,\n TenantMigrationResult,\n TenantMigrationStatus,\n} from '../types.js';\nimport type { IMigrationExecutor } from '../interfaces.js';\nimport type {\n MigrationExecutorConfig,\n MigrationExecutorDependencies,\n MigrateTenantOptions,\n AppliedMigration,\n AppliedMigrationRecord,\n} from './types.js';\nimport type { DetectedFormat } from '../table-format.js';\n\n/**\n * Responsible for executing migrations on individual tenants.\n *\n * Extracted from Migrator to follow Single Responsibility Principle.\n * Handles single-tenant migration operations including:\n * - Executing migrations with SQL\n * - Marking migrations as applied (without SQL)\n * - Checking migration status\n * - Getting applied/pending migrations\n *\n * @example\n * ```typescript\n * const executor = new MigrationExecutor(config, dependencies);\n *\n * // Migrate a single tenant\n * const result = await executor.migrateTenant('tenant-123');\n *\n * // Mark migrations as applied without executing SQL\n * const markResult = await executor.markAsApplied('tenant-123');\n *\n * // Get tenant status\n * const status = await executor.getTenantStatus('tenant-123');\n * ```\n */\nexport class MigrationExecutor implements IMigrationExecutor {\n constructor(\n private readonly config: MigrationExecutorConfig,\n private readonly deps: MigrationExecutorDependencies\n ) {}\n\n /**\n * Migrate a single tenant\n *\n * Applies all pending migrations to the tenant's schema.\n * Creates the migrations table if it doesn't exist.\n *\n * @param tenantId - The tenant identifier\n * @param migrations - Optional pre-loaded migrations (avoids reloading from disk)\n * @param options - Migration options (dryRun, onProgress)\n * @returns Migration result with applied migrations and duration\n *\n * @example\n * ```typescript\n * const result = await executor.migrateTenant('tenant-123', undefined, {\n * dryRun: false,\n * onProgress: (id, status, name) => console.log(`${id}: ${status} ${name}`),\n * });\n *\n * if (result.success) {\n * console.log(`Applied ${result.appliedMigrations.length} migrations`);\n * }\n * ```\n */\n async migrateTenant(\n tenantId: string,\n migrations?: MigrationFile[],\n options: MigrateTenantOptions = {}\n ): Promise<TenantMigrationResult> {\n const startTime = Date.now();\n const schemaName = this.deps.schemaNameTemplate(tenantId);\n const appliedMigrations: string[] = [];\n\n const pool = await this.deps.createPool(schemaName);\n\n try {\n await this.config.hooks?.beforeTenant?.(tenantId);\n\n // Detect or determine the format before creating table\n const format = await this.deps.getOrDetectFormat(pool, schemaName);\n\n // Ensure migrations table exists with correct format\n await this.deps.ensureMigrationsTable(pool, schemaName, format);\n\n // Load migrations if not provided\n const allMigrations = migrations ?? await this.deps.loadMigrations();\n\n // Get applied migrations using format-aware query\n const applied = await this.getAppliedMigrations(pool, schemaName, format);\n const appliedSet = new Set(applied.map((m) => m.identifier));\n\n // Filter pending migrations using format-aware comparison\n const pending = allMigrations.filter(\n (m) => !this.isMigrationApplied(m, appliedSet, format)\n );\n\n if (options.dryRun) {\n return {\n tenantId,\n schemaName,\n success: true,\n appliedMigrations: pending.map((m) => m.name),\n durationMs: Date.now() - startTime,\n format: format.format,\n };\n }\n\n // Apply pending migrations\n for (const migration of pending) {\n const migrationStart = Date.now();\n options.onProgress?.(tenantId, 'migrating', migration.name);\n\n await this.config.hooks?.beforeMigration?.(tenantId, migration.name);\n await this.applyMigration(pool, schemaName, migration, format);\n await this.config.hooks?.afterMigration?.(\n tenantId,\n migration.name,\n Date.now() - migrationStart\n );\n\n appliedMigrations.push(migration.name);\n }\n\n const result: TenantMigrationResult = {\n tenantId,\n schemaName,\n success: true,\n appliedMigrations,\n durationMs: Date.now() - startTime,\n format: format.format,\n };\n\n await this.config.hooks?.afterTenant?.(tenantId, result);\n\n return result;\n } catch (error) {\n const result: TenantMigrationResult = {\n tenantId,\n schemaName,\n success: false,\n appliedMigrations,\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n\n await this.config.hooks?.afterTenant?.(tenantId, result);\n\n return result;\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Mark migrations as applied without executing SQL\n *\n * Useful for syncing tracking state with already-applied migrations\n * or when migrations were applied manually.\n *\n * @param tenantId - The tenant identifier\n * @param options - Options with progress callback\n * @returns Result with list of marked migrations\n *\n * @example\n * ```typescript\n * const result = await executor.markAsApplied('tenant-123', {\n * onProgress: (id, status, name) => console.log(`${id}: marking ${name}`),\n * });\n *\n * console.log(`Marked ${result.appliedMigrations.length} migrations`);\n * ```\n */\n async markAsApplied(\n tenantId: string,\n options: { onProgress?: MigrateTenantOptions['onProgress'] } = {}\n ): Promise<TenantMigrationResult> {\n const startTime = Date.now();\n const schemaName = this.deps.schemaNameTemplate(tenantId);\n const markedMigrations: string[] = [];\n\n const pool = await this.deps.createPool(schemaName);\n\n try {\n await this.config.hooks?.beforeTenant?.(tenantId);\n\n // Detect or determine the format before creating table\n const format = await this.deps.getOrDetectFormat(pool, schemaName);\n\n // Ensure migrations table exists with correct format\n await this.deps.ensureMigrationsTable(pool, schemaName, format);\n\n // Load all migrations\n const allMigrations = await this.deps.loadMigrations();\n\n // Get applied migrations\n const applied = await this.getAppliedMigrations(pool, schemaName, format);\n const appliedSet = new Set(applied.map((m) => m.identifier));\n\n // Filter pending migrations\n const pending = allMigrations.filter(\n (m) => !this.isMigrationApplied(m, appliedSet, format)\n );\n\n // Mark each pending migration as applied (without executing SQL)\n for (const migration of pending) {\n const migrationStart = Date.now();\n options.onProgress?.(tenantId, 'migrating', migration.name);\n\n await this.config.hooks?.beforeMigration?.(tenantId, migration.name);\n await this.recordMigration(pool, schemaName, migration, format);\n await this.config.hooks?.afterMigration?.(\n tenantId,\n migration.name,\n Date.now() - migrationStart\n );\n\n markedMigrations.push(migration.name);\n }\n\n const result: TenantMigrationResult = {\n tenantId,\n schemaName,\n success: true,\n appliedMigrations: markedMigrations,\n durationMs: Date.now() - startTime,\n format: format.format,\n };\n\n await this.config.hooks?.afterTenant?.(tenantId, result);\n\n return result;\n } catch (error) {\n const result: TenantMigrationResult = {\n tenantId,\n schemaName,\n success: false,\n appliedMigrations: markedMigrations,\n error: (error as Error).message,\n durationMs: Date.now() - startTime,\n };\n\n await this.config.hooks?.afterTenant?.(tenantId, result);\n\n return result;\n } finally {\n await pool.end();\n }\n }\n\n /**\n * Get migration status for a specific tenant\n *\n * Returns information about applied and pending migrations.\n *\n * @param tenantId - The tenant identifier\n * @param migrations - Optional pre-loaded migrations\n * @returns Migration status with counts and pending list\n *\n * @example\n * ```typescript\n * const status = await executor.getTenantStatus('tenant-123');\n * if (status.status === 'behind') {\n * console.log(`Pending: ${status.pendingMigrations.join(', ')}`);\n * }\n * ```\n */\n async getTenantStatus(tenantId: string, migrations?: MigrationFile[]): Promise<TenantMigrationStatus> {\n const schemaName = this.deps.schemaNameTemplate(tenantId);\n const pool = await this.deps.createPool(schemaName);\n\n try {\n const allMigrations = migrations ?? await this.deps.loadMigrations();\n\n // Check if migrations table exists\n const tableExists = await this.deps.migrationsTableExists(pool, schemaName);\n if (!tableExists) {\n return {\n tenantId,\n schemaName,\n appliedCount: 0,\n pendingCount: allMigrations.length,\n pendingMigrations: allMigrations.map((m) => m.name),\n status: allMigrations.length > 0 ? 'behind' : 'ok',\n format: null,\n };\n }\n\n // Detect the table format\n const format = await this.deps.getOrDetectFormat(pool, schemaName);\n\n const applied = await this.getAppliedMigrations(pool, schemaName, format);\n const appliedSet = new Set(applied.map((m) => m.identifier));\n\n // Use format-aware comparison\n const pending = allMigrations.filter(\n (m) => !this.isMigrationApplied(m, appliedSet, format)\n );\n\n return {\n tenantId,\n schemaName,\n appliedCount: applied.length,\n pendingCount: pending.length,\n pendingMigrations: pending.map((m) => m.name),\n status: pending.length > 0 ? 'behind' : 'ok',\n format: format.format,\n };\n } catch (error) {\n return {\n tenantId,\n schemaName,\n appliedCount: 0,\n pendingCount: 0,\n pendingMigrations: [],\n status: 'error',\n error: (error as Error).message,\n format: null,\n };\n } finally {\n await pool.end();\n }\n }\n\n // ============================================================================\n // IMigrationExecutor Interface Methods\n // ============================================================================\n\n /**\n * Execute a single migration on a schema\n */\n async executeMigration(\n pool: Pool,\n schemaName: string,\n migration: MigrationFile,\n format: DetectedFormat,\n options?: { markOnly?: boolean; onProgress?: (status: 'applying' | 'recording') => void }\n ): Promise<void> {\n if (options?.markOnly) {\n options.onProgress?.('recording');\n await this.recordMigration(pool, schemaName, migration, format);\n } else {\n options?.onProgress?.('applying');\n await this.applyMigration(pool, schemaName, migration, format);\n }\n }\n\n /**\n * Execute multiple migrations on a schema\n */\n async executeMigrations(\n pool: Pool,\n schemaName: string,\n migrations: MigrationFile[],\n format: DetectedFormat,\n options?: { markOnly?: boolean; onProgress?: (status: 'applying' | 'recording') => void }\n ): Promise<string[]> {\n const appliedNames: string[] = [];\n\n for (const migration of migrations) {\n await this.executeMigration(pool, schemaName, migration, format, options);\n appliedNames.push(migration.name);\n }\n\n return appliedNames;\n }\n\n /**\n * Record a migration as applied without executing SQL\n */\n async recordMigration(\n pool: Pool,\n schemaName: string,\n migration: MigrationFile,\n format: DetectedFormat\n ): Promise<void> {\n const { identifier, timestamp, timestampType } = format.columns;\n const identifierValue = identifier === 'name' ? migration.name : migration.hash;\n const timestampValue = timestampType === 'bigint' ? Date.now() : new Date();\n\n await pool.query(\n `INSERT INTO \"${schemaName}\".\"${format.tableName}\" (\"${identifier}\", \"${timestamp}\") VALUES ($1, $2)`,\n [identifierValue, timestampValue]\n );\n }\n\n /**\n * Get list of applied migrations for a tenant\n */\n async getAppliedMigrations(\n pool: Pool,\n schemaName: string,\n format: DetectedFormat\n ): Promise<AppliedMigration[]> {\n const identifierColumn = format.columns.identifier;\n const timestampColumn = format.columns.timestamp;\n\n const result = await pool.query<AppliedMigrationRecord>(\n `SELECT id, \"${identifierColumn}\" as identifier, \"${timestampColumn}\" as applied_at\n FROM \"${schemaName}\".\"${format.tableName}\"\n ORDER BY id`\n );\n\n return result.rows.map((row) => {\n // Convert timestamp based on format\n const appliedAt = format.columns.timestampType === 'bigint'\n ? new Date(Number(row.applied_at))\n : new Date(row.applied_at);\n\n return {\n identifier: row.identifier,\n // Set name or hash based on format\n ...(format.columns.identifier === 'name'\n ? { name: row.identifier }\n : { hash: row.identifier }),\n appliedAt,\n };\n });\n }\n\n /**\n * Get pending migrations (not yet applied)\n */\n async getPendingMigrations(\n pool: Pool,\n schemaName: string,\n allMigrations: MigrationFile[],\n format: DetectedFormat\n ): Promise<MigrationFile[]> {\n const applied = await this.getAppliedMigrations(pool, schemaName, format);\n const appliedSet = new Set(applied.map((m) => m.identifier));\n\n return allMigrations.filter(\n (m) => !this.isMigrationApplied(m, appliedSet, format)\n );\n }\n\n // ============================================================================\n // Private Helper Methods\n // ============================================================================\n\n /**\n * Check if a migration has been applied\n */\n private isMigrationApplied(\n migration: MigrationFile,\n appliedIdentifiers: Set<string>,\n format: DetectedFormat\n ): boolean {\n if (format.columns.identifier === 'name') {\n return appliedIdentifiers.has(migration.name);\n }\n\n // Hash-based: check both hash AND name for backwards compatibility\n // This allows migration from name-based to hash-based tracking\n return appliedIdentifiers.has(migration.hash) || appliedIdentifiers.has(migration.name);\n }\n\n /**\n * Apply a migration to a schema (execute SQL + record)\n */\n private async applyMigration(\n pool: Pool,\n schemaName: string,\n migration: MigrationFile,\n format: DetectedFormat\n ): Promise<void> {\n const client = await pool.connect();\n\n try {\n await client.query('BEGIN');\n\n // Execute migration SQL\n await client.query(migration.sql);\n\n // Record migration using format-aware insert\n const { identifier, timestamp, timestampType } = format.columns;\n const identifierValue = identifier === 'name' ? migration.name : migration.hash;\n const timestampValue = timestampType === 'bigint' ? Date.now() : new Date();\n\n await client.query(\n `INSERT INTO \"${schemaName}\".\"${format.tableName}\" (\"${identifier}\", \"${timestamp}\") VALUES ($1, $2)`,\n [identifierValue, timestampValue]\n );\n\n await client.query('COMMIT');\n } catch (error) {\n await client.query('ROLLBACK');\n throw error;\n } finally {\n client.release();\n }\n }\n}\n\n/**\n * Factory function to create a MigrationExecutor instance\n *\n * @param config - Executor configuration (hooks)\n * @param dependencies - Required dependencies\n * @returns A configured MigrationExecutor instance\n *\n * @example\n * ```typescript\n * const executor = createMigrationExecutor(\n * { hooks: { beforeTenant: async (id) => console.log(`Starting ${id}`) } },\n * {\n * createPool: schemaManager.createPool.bind(schemaManager),\n * schemaNameTemplate: (id) => `tenant_${id}`,\n * migrationsTableExists: schemaManager.migrationsTableExists.bind(schemaManager),\n * ensureMigrationsTable: schemaManager.ensureMigrationsTable.bind(schemaManager),\n * getOrDetectFormat: async (pool, schema) => getFormatConfig('name', table),\n * loadMigrations: async () => loadMigrationsFromDisk(),\n * }\n * );\n * ```\n */\nexport function createMigrationExecutor(\n config: MigrationExecutorConfig,\n dependencies: MigrationExecutorDependencies\n): MigrationExecutor {\n return new MigrationExecutor(config, dependencies);\n}\n","import type {\n MigrationFile,\n TenantMigrationResult,\n MigrationResults,\n TenantMigrationStatus,\n} from '../types.js';\nimport type { IBatchExecutor } from '../interfaces.js';\nimport type { MigrationExecutor } from './migration-executor.js';\nimport type { BatchExecutorConfig, BatchMigrateOptions } from './types.js';\n\n/**\n * Responsible for batch migration operations across multiple tenants.\n *\n * Extracted from Migrator to follow Single Responsibility Principle.\n * Handles parallel migration operations including:\n * - Migrating all tenants with configurable concurrency\n * - Migrating specific tenants\n * - Marking all migrations as applied\n * - Progress tracking and error handling\n *\n * @example\n * ```typescript\n * const batchExecutor = new BatchExecutor(config, migrationExecutor, loadMigrations);\n *\n * // Migrate all tenants with concurrency 10\n * const results = await batchExecutor.migrateAll({ concurrency: 10 });\n *\n * // Migrate specific tenants\n * const specificResults = await batchExecutor.migrateTenants(['t1', 't2'], {\n * onProgress: (id, status) => console.log(`${id}: ${status}`),\n * });\n * ```\n */\nexport class BatchExecutor implements IBatchExecutor {\n constructor(\n private readonly config: BatchExecutorConfig,\n private readonly executor: MigrationExecutor,\n private readonly loadMigrations: () => Promise<MigrationFile[]>\n ) {}\n\n /**\n * Migrate all tenants in parallel\n *\n * Processes tenants in batches with configurable concurrency.\n * Supports progress callbacks, error handling, and abort behavior.\n *\n * @param options - Migration options (concurrency, dryRun, callbacks)\n * @returns Aggregate results for all tenants\n *\n * @example\n * ```typescript\n * const results = await batchExecutor.migrateAll({\n * concurrency: 10,\n * dryRun: false,\n * onProgress: (id, status) => console.log(`${id}: ${status}`),\n * onError: (id, error) => {\n * console.error(`${id} failed: ${error.message}`);\n * return 'continue'; // or 'abort' to stop all\n * },\n * });\n *\n * console.log(`Succeeded: ${results.succeeded}/${results.total}`);\n * ```\n */\n async migrateAll(options: BatchMigrateOptions = {}): Promise<MigrationResults> {\n const {\n concurrency = 10,\n onProgress,\n onError,\n dryRun = false,\n } = options;\n\n const tenantIds = await this.config.tenantDiscovery();\n const migrations = await this.loadMigrations();\n\n const results: TenantMigrationResult[] = [];\n let aborted = false;\n\n // Process tenants in batches\n for (let i = 0; i < tenantIds.length && !aborted; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n if (aborted) {\n return this.createSkippedResult(tenantId);\n }\n\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.executor.migrateTenant(tenantId, migrations, { dryRun, onProgress });\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n const action = onError?.(tenantId, error as Error);\n if (action === 'abort') {\n aborted = true;\n }\n return this.createErrorResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n // Mark remaining tenants as skipped if aborted\n if (aborted) {\n const remaining = tenantIds.slice(results.length);\n for (const tenantId of remaining) {\n results.push(this.createSkippedResult(tenantId));\n }\n }\n\n return this.aggregateResults(results);\n }\n\n /**\n * Migrate specific tenants in parallel\n *\n * Same as migrateAll but for a subset of tenants.\n *\n * @param tenantIds - List of tenant IDs to migrate\n * @param options - Migration options\n * @returns Aggregate results for specified tenants\n *\n * @example\n * ```typescript\n * const results = await batchExecutor.migrateTenants(\n * ['tenant-1', 'tenant-2', 'tenant-3'],\n * { concurrency: 5 }\n * );\n * ```\n */\n async migrateTenants(tenantIds: string[], options: BatchMigrateOptions = {}): Promise<MigrationResults> {\n const migrations = await this.loadMigrations();\n const results: TenantMigrationResult[] = [];\n\n const { concurrency = 10, onProgress, onError, dryRun = false } = options;\n\n for (let i = 0; i < tenantIds.length; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.executor.migrateTenant(tenantId, migrations, { dryRun, onProgress });\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n onError?.(tenantId, error as Error);\n return this.createErrorResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n return this.aggregateResults(results);\n }\n\n /**\n * Mark all tenants as applied without executing SQL\n *\n * Useful for syncing tracking state with already-applied migrations.\n * Processes tenants in parallel with configurable concurrency.\n *\n * @param options - Migration options\n * @returns Aggregate results for all tenants\n *\n * @example\n * ```typescript\n * const results = await batchExecutor.markAllAsApplied({\n * concurrency: 10,\n * onProgress: (id, status) => console.log(`${id}: ${status}`),\n * });\n * ```\n */\n async markAllAsApplied(options: BatchMigrateOptions = {}): Promise<MigrationResults> {\n const {\n concurrency = 10,\n onProgress,\n onError,\n } = options;\n\n const tenantIds = await this.config.tenantDiscovery();\n const results: TenantMigrationResult[] = [];\n let aborted = false;\n\n // Process tenants in batches\n for (let i = 0; i < tenantIds.length && !aborted; i += concurrency) {\n const batch = tenantIds.slice(i, i + concurrency);\n\n const batchResults = await Promise.all(\n batch.map(async (tenantId) => {\n if (aborted) {\n return this.createSkippedResult(tenantId);\n }\n\n try {\n onProgress?.(tenantId, 'starting');\n const result = await this.executor.markAsApplied(tenantId, { onProgress });\n onProgress?.(tenantId, result.success ? 'completed' : 'failed');\n return result;\n } catch (error) {\n onProgress?.(tenantId, 'failed');\n const action = onError?.(tenantId, error as Error);\n if (action === 'abort') {\n aborted = true;\n }\n return this.createErrorResult(tenantId, error as Error);\n }\n })\n );\n\n results.push(...batchResults);\n }\n\n // Mark remaining tenants as skipped if aborted\n if (aborted) {\n const remaining = tenantIds.slice(results.length);\n for (const tenantId of remaining) {\n results.push(this.createSkippedResult(tenantId));\n }\n }\n\n return this.aggregateResults(results);\n }\n\n /**\n * Get migration status for all tenants\n *\n * Queries each tenant's migration status sequentially.\n *\n * @returns List of migration status for all tenants\n *\n * @example\n * ```typescript\n * const statuses = await batchExecutor.getStatus();\n * const behind = statuses.filter(s => s.status === 'behind');\n * console.log(`${behind.length} tenants need migrations`);\n * ```\n */\n async getStatus(): Promise<TenantMigrationStatus[]> {\n const tenantIds = await this.config.tenantDiscovery();\n const migrations = await this.loadMigrations();\n const statuses: TenantMigrationStatus[] = [];\n\n for (const tenantId of tenantIds) {\n statuses.push(await this.executor.getTenantStatus(tenantId, migrations));\n }\n\n return statuses;\n }\n\n // ============================================================================\n // Private Helper Methods\n // ============================================================================\n\n /**\n * Create a skipped result for aborted operations\n */\n private createSkippedResult(tenantId: string): TenantMigrationResult {\n return {\n tenantId,\n schemaName: '', // Schema name not available in batch context\n success: false,\n appliedMigrations: [],\n error: 'Skipped due to abort',\n durationMs: 0,\n };\n }\n\n /**\n * Create an error result for failed operations\n */\n private createErrorResult(tenantId: string, error: Error): TenantMigrationResult {\n return {\n tenantId,\n schemaName: '', // Schema name not available in batch context\n success: false,\n appliedMigrations: [],\n error: error.message,\n durationMs: 0,\n };\n }\n\n /**\n * Aggregate individual migration results into a summary\n */\n private aggregateResults(results: TenantMigrationResult[]): MigrationResults {\n return {\n total: results.length,\n succeeded: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success && r.error !== 'Skipped due to abort').length,\n skipped: results.filter((r) => r.error === 'Skipped due to abort').length,\n details: results,\n };\n }\n}\n\n/**\n * Factory function to create a BatchExecutor instance\n *\n * @param config - Batch configuration (tenantDiscovery)\n * @param executor - MigrationExecutor instance\n * @param loadMigrations - Function to load migrations from disk\n * @returns A configured BatchExecutor instance\n *\n * @example\n * ```typescript\n * const batchExecutor = createBatchExecutor(\n * { tenantDiscovery: async () => ['t1', 't2', 't3'] },\n * migrationExecutor,\n * async () => loadMigrationsFromDisk('./migrations')\n * );\n * ```\n */\nexport function createBatchExecutor(\n config: BatchExecutorConfig,\n executor: MigrationExecutor,\n loadMigrations: () => Promise<MigrationFile[]>\n): BatchExecutor {\n return new BatchExecutor(config, executor, loadMigrations);\n}\n","/**\n * DDL Generator\n *\n * Generates DDL (CREATE TABLE, indexes, constraints) from introspection.\n * Uses information_schema and pg_catalog to reconstruct structure.\n *\n * @module clone/ddl-generator\n */\n\nimport type { Pool } from 'pg';\nimport type { TableCloneInfo, ColumnInfo } from './types.js';\n\n/**\n * List all tables in a schema\n */\nexport async function listTables(\n pool: Pool,\n schemaName: string,\n excludeTables: string[] = []\n): Promise<string[]> {\n // Build placeholders for excluded tables\n const excludePlaceholders =\n excludeTables.length > 0\n ? excludeTables.map((_, i) => `$${i + 2}`).join(', ')\n : \"''::text\";\n\n const result = await pool.query<{ table_name: string }>(\n `SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = $1\n AND table_type = 'BASE TABLE'\n AND table_name NOT IN (${excludePlaceholders})\n ORDER BY table_name`,\n [schemaName, ...excludeTables]\n );\n return result.rows.map((r) => r.table_name);\n}\n\n/**\n * Get column information for a table\n */\nexport async function getColumns(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<ColumnInfo[]> {\n const result = await pool.query<{\n column_name: string;\n data_type: string;\n udt_name: string;\n is_nullable: string;\n column_default: string | null;\n character_maximum_length: number | null;\n numeric_precision: number | null;\n numeric_scale: number | null;\n }>(\n `SELECT\n column_name,\n data_type,\n udt_name,\n is_nullable,\n column_default,\n character_maximum_length,\n numeric_precision,\n numeric_scale\n FROM information_schema.columns\n WHERE table_schema = $1 AND table_name = $2\n ORDER BY ordinal_position`,\n [schemaName, tableName]\n );\n\n return result.rows.map((row) => ({\n columnName: row.column_name,\n dataType: row.data_type,\n udtName: row.udt_name,\n isNullable: row.is_nullable === 'YES',\n columnDefault: row.column_default,\n characterMaximumLength: row.character_maximum_length,\n numericPrecision: row.numeric_precision,\n numericScale: row.numeric_scale,\n }));\n}\n\n/**\n * Generate CREATE TABLE DDL for a table\n */\nexport async function generateTableDdl(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<string> {\n const columns = await getColumns(pool, schemaName, tableName);\n\n const columnDefs = columns.map((col) => {\n let type = col.udtName;\n\n // Handle special types\n if (col.dataType === 'character varying' && col.characterMaximumLength) {\n type = `varchar(${col.characterMaximumLength})`;\n } else if (col.dataType === 'character' && col.characterMaximumLength) {\n type = `char(${col.characterMaximumLength})`;\n } else if (col.dataType === 'numeric' && col.numericPrecision) {\n type = `numeric(${col.numericPrecision}${col.numericScale ? `, ${col.numericScale}` : ''})`;\n } else if (col.dataType === 'ARRAY') {\n // Array types are stored as _typename in udt_name\n type = col.udtName.replace(/^_/, '') + '[]';\n }\n\n // Build column definition\n let definition = `\"${col.columnName}\" ${type}`;\n\n if (!col.isNullable) {\n definition += ' NOT NULL';\n }\n\n if (col.columnDefault) {\n // Replace old schema reference in default values\n const defaultValue = col.columnDefault.replace(\n new RegExp(`\"?${schemaName}\"?\\\\.`, 'g'),\n ''\n );\n definition += ` DEFAULT ${defaultValue}`;\n }\n\n return definition;\n });\n\n return `CREATE TABLE IF NOT EXISTS \"${tableName}\" (\\n ${columnDefs.join(',\\n ')}\\n)`;\n}\n\n/**\n * Generate index DDLs for a table\n */\nexport async function generateIndexDdls(\n pool: Pool,\n sourceSchema: string,\n targetSchema: string,\n tableName: string\n): Promise<string[]> {\n const result = await pool.query<{ indexdef: string; indexname: string }>(\n `SELECT indexname, indexdef\n FROM pg_indexes\n WHERE schemaname = $1 AND tablename = $2\n AND indexname NOT LIKE '%_pkey'`,\n [sourceSchema, tableName]\n );\n\n return result.rows.map((row) =>\n // Replace source schema with target schema\n row.indexdef\n .replace(new RegExp(`ON \"${sourceSchema}\"\\\\.\"`, 'g'), `ON \"${targetSchema}\".\"`)\n .replace(new RegExp(`\"${sourceSchema}\"\\\\.\"`, 'g'), `\"${targetSchema}\".\"`),\n );\n}\n\n/**\n * Generate primary key DDL for a table\n */\nexport async function generatePrimaryKeyDdl(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<string | null> {\n const result = await pool.query<{\n constraint_name: string;\n column_name: string;\n }>(\n `SELECT\n tc.constraint_name,\n kcu.column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'PRIMARY KEY'\n ORDER BY kcu.ordinal_position`,\n [schemaName, tableName]\n );\n\n if (result.rows.length === 0) return null;\n\n const columns = result.rows.map((r) => `\"${r.column_name}\"`).join(', ');\n const constraintName = result.rows[0]!.constraint_name;\n\n return `ALTER TABLE \"${tableName}\" ADD CONSTRAINT \"${constraintName}\" PRIMARY KEY (${columns})`;\n}\n\n/**\n * Generate foreign key DDLs for a table\n */\nexport async function generateForeignKeyDdls(\n pool: Pool,\n sourceSchema: string,\n targetSchema: string,\n tableName: string\n): Promise<string[]> {\n const result = await pool.query<{\n constraint_name: string;\n column_name: string;\n foreign_table_name: string;\n foreign_column_name: string;\n update_rule: string;\n delete_rule: string;\n }>(\n `SELECT\n tc.constraint_name,\n kcu.column_name,\n ccu.table_name as foreign_table_name,\n ccu.column_name as foreign_column_name,\n rc.update_rule,\n rc.delete_rule\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage ccu\n ON tc.constraint_name = ccu.constraint_name\n AND tc.table_schema = ccu.table_schema\n JOIN information_schema.referential_constraints rc\n ON tc.constraint_name = rc.constraint_name\n AND tc.table_schema = rc.constraint_schema\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'FOREIGN KEY'\n ORDER BY tc.constraint_name, kcu.ordinal_position`,\n [sourceSchema, tableName]\n );\n\n // Group by constraint name\n const fkMap = new Map<\n string,\n {\n columns: string[];\n foreignTable: string;\n foreignColumns: string[];\n updateRule: string;\n deleteRule: string;\n }\n >();\n\n for (const row of result.rows) {\n const existing = fkMap.get(row.constraint_name);\n if (existing) {\n existing.columns.push(row.column_name);\n existing.foreignColumns.push(row.foreign_column_name);\n } else {\n fkMap.set(row.constraint_name, {\n columns: [row.column_name],\n foreignTable: row.foreign_table_name,\n foreignColumns: [row.foreign_column_name],\n updateRule: row.update_rule,\n deleteRule: row.delete_rule,\n });\n }\n }\n\n return Array.from(fkMap.entries()).map(([name, fk]) => {\n const columns = fk.columns.map((c) => `\"${c}\"`).join(', ');\n const foreignColumns = fk.foreignColumns.map((c) => `\"${c}\"`).join(', ');\n\n let ddl = `ALTER TABLE \"${targetSchema}\".\"${tableName}\" `;\n ddl += `ADD CONSTRAINT \"${name}\" FOREIGN KEY (${columns}) `;\n ddl += `REFERENCES \"${targetSchema}\".\"${fk.foreignTable}\" (${foreignColumns})`;\n\n if (fk.updateRule !== 'NO ACTION') {\n ddl += ` ON UPDATE ${fk.updateRule}`;\n }\n if (fk.deleteRule !== 'NO ACTION') {\n ddl += ` ON DELETE ${fk.deleteRule}`;\n }\n\n return ddl;\n });\n}\n\n/**\n * Generate unique constraint DDLs\n */\nexport async function generateUniqueDdls(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<string[]> {\n const result = await pool.query<{\n constraint_name: string;\n column_name: string;\n }>(\n `SELECT\n tc.constraint_name,\n kcu.column_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'UNIQUE'\n ORDER BY tc.constraint_name, kcu.ordinal_position`,\n [schemaName, tableName]\n );\n\n const uniqueMap = new Map<string, string[]>();\n for (const row of result.rows) {\n const existing = uniqueMap.get(row.constraint_name);\n if (existing) {\n existing.push(row.column_name);\n } else {\n uniqueMap.set(row.constraint_name, [row.column_name]);\n }\n }\n\n return Array.from(uniqueMap.entries()).map(([name, columns]) => {\n const cols = columns.map((c) => `\"${c}\"`).join(', ');\n return `ALTER TABLE \"${tableName}\" ADD CONSTRAINT \"${name}\" UNIQUE (${cols})`;\n });\n}\n\n/**\n * Generate check constraint DDLs\n */\nexport async function generateCheckDdls(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<string[]> {\n const result = await pool.query<{\n constraint_name: string;\n check_clause: string;\n }>(\n `SELECT\n tc.constraint_name,\n cc.check_clause\n FROM information_schema.table_constraints tc\n JOIN information_schema.check_constraints cc\n ON tc.constraint_name = cc.constraint_name\n AND tc.constraint_schema = cc.constraint_schema\n WHERE tc.table_schema = $1\n AND tc.table_name = $2\n AND tc.constraint_type = 'CHECK'\n AND tc.constraint_name NOT LIKE '%_not_null'`,\n [schemaName, tableName]\n );\n\n return result.rows.map(\n (row) => `ALTER TABLE \"${tableName}\" ADD CONSTRAINT \"${row.constraint_name}\" CHECK (${row.check_clause})`,\n );\n}\n\n/**\n * Get row count for a table\n */\nexport async function getRowCount(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<number> {\n const result = await pool.query<{ count: string }>(\n `SELECT count(*) FROM \"${schemaName}\".\"${tableName}\"`,\n );\n return parseInt(result.rows[0]!.count, 10);\n}\n\n/**\n * Generate complete clone information for a table\n */\nexport async function generateTableCloneInfo(\n pool: Pool,\n sourceSchema: string,\n targetSchema: string,\n tableName: string\n): Promise<TableCloneInfo> {\n const [createDdl, indexDdls, pkDdl, uniqueDdls, checkDdls, fkDdls, rowCount] = await Promise.all([\n generateTableDdl(pool, sourceSchema, tableName),\n generateIndexDdls(pool, sourceSchema, targetSchema, tableName),\n generatePrimaryKeyDdl(pool, sourceSchema, tableName),\n generateUniqueDdls(pool, sourceSchema, tableName),\n generateCheckDdls(pool, sourceSchema, tableName),\n generateForeignKeyDdls(pool, sourceSchema, targetSchema, tableName),\n getRowCount(pool, sourceSchema, tableName),\n ]);\n\n return {\n name: tableName,\n createDdl,\n indexDdls,\n constraintDdls: [\n ...(pkDdl ? [pkDdl] : []),\n ...uniqueDdls,\n ...checkDdls,\n ...fkDdls,\n ],\n rowCount,\n };\n}\n","/**\n * Data Copier\n *\n * Copies data between schemas using INSERT...SELECT.\n * Supports anonymization of sensitive columns.\n *\n * @module clone/data-copier\n */\n\nimport type { Pool } from 'pg';\nimport type { AnonymizeRules, CloneProgressCallback } from './types.js';\n\n/**\n * Get column names for a table\n */\nexport async function getTableColumns(\n pool: Pool,\n schemaName: string,\n tableName: string\n): Promise<string[]> {\n const result = await pool.query<{ column_name: string }>(\n `SELECT column_name\n FROM information_schema.columns\n WHERE table_schema = $1 AND table_name = $2\n ORDER BY ordinal_position`,\n [schemaName, tableName]\n );\n return result.rows.map((r) => r.column_name);\n}\n\n/**\n * Format anonymize value for SQL\n */\nfunction formatAnonymizeValue(value: null | string | number | boolean): string {\n if (value === null) {\n return 'NULL';\n }\n if (typeof value === 'string') {\n // Escape single quotes\n return `'${value.replace(/'/g, \"''\")}'`;\n }\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n return String(value);\n}\n\n/**\n * Copy data from one table to another\n *\n * @returns Number of rows copied\n */\nexport async function copyTableData(\n pool: Pool,\n sourceSchema: string,\n targetSchema: string,\n tableName: string,\n anonymizeRules?: AnonymizeRules\n): Promise<number> {\n const columns = await getTableColumns(pool, sourceSchema, tableName);\n\n if (columns.length === 0) {\n return 0;\n }\n\n // Build SELECT with anonymization\n const tableRules = anonymizeRules?.[tableName] ?? {};\n const selectColumns = columns.map((col) => {\n if (col in tableRules) {\n const value = tableRules[col];\n return `${formatAnonymizeValue(value)} as \"${col}\"`;\n }\n return `\"${col}\"`;\n });\n\n const insertColumns = columns.map((c) => `\"${c}\"`).join(', ');\n const selectExpr = selectColumns.join(', ');\n\n const result = await pool.query(\n `INSERT INTO \"${targetSchema}\".\"${tableName}\" (${insertColumns})\n SELECT ${selectExpr}\n FROM \"${sourceSchema}\".\"${tableName}\"`\n );\n\n return result.rowCount ?? 0;\n}\n\n/**\n * Get tables in dependency order for data copy\n *\n * Tables with foreign keys should be copied after their referenced tables.\n * This uses a topological sort based on foreign key relationships.\n */\nexport async function getTablesInDependencyOrder(\n pool: Pool,\n schemaName: string,\n tables: string[]\n): Promise<string[]> {\n // Get all foreign key relationships\n const result = await pool.query<{\n table_name: string;\n foreign_table_name: string;\n }>(\n `SELECT DISTINCT\n tc.table_name,\n ccu.table_name as foreign_table_name\n FROM information_schema.table_constraints tc\n JOIN information_schema.constraint_column_usage ccu\n ON tc.constraint_name = ccu.constraint_name\n AND tc.table_schema = ccu.table_schema\n WHERE tc.table_schema = $1\n AND tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_name != ccu.table_name`,\n [schemaName]\n );\n\n // Build dependency graph\n const dependencies = new Map<string, Set<string>>();\n const tableSet = new Set(tables);\n\n for (const table of tables) {\n dependencies.set(table, new Set());\n }\n\n for (const row of result.rows) {\n if (tableSet.has(row.table_name) && tableSet.has(row.foreign_table_name)) {\n dependencies.get(row.table_name)!.add(row.foreign_table_name);\n }\n }\n\n // Topological sort (Kahn's algorithm)\n const sorted: string[] = [];\n const inDegree = new Map<string, number>();\n const queue: string[] = [];\n\n // Calculate in-degrees\n for (const table of tables) {\n inDegree.set(table, 0);\n }\n for (const [table, deps] of dependencies) {\n for (const dep of deps) {\n inDegree.set(dep, (inDegree.get(dep) ?? 0) + 1);\n }\n }\n\n // Find nodes with no incoming edges\n for (const [table, degree] of inDegree) {\n if (degree === 0) {\n queue.push(table);\n }\n }\n\n // Process queue\n while (queue.length > 0) {\n const table = queue.shift()!;\n sorted.push(table);\n\n // Remove edges from this node\n for (const [otherTable, deps] of dependencies) {\n if (deps.has(table)) {\n deps.delete(table);\n const newDegree = (inDegree.get(otherTable) ?? 0) - 1;\n inDegree.set(otherTable, newDegree);\n if (newDegree === 0) {\n queue.push(otherTable);\n }\n }\n }\n }\n\n // If there's a cycle, just use original order for remaining tables\n const remaining = tables.filter((t) => !sorted.includes(t));\n return [...sorted, ...remaining];\n}\n\n/**\n * Copy data from all tables\n *\n * @returns Total number of rows copied\n */\nexport async function copyAllData(\n pool: Pool,\n sourceSchema: string,\n targetSchema: string,\n tables: string[],\n anonymizeRules?: AnonymizeRules,\n onProgress?: CloneProgressCallback\n): Promise<number> {\n let totalRows = 0;\n\n // Get tables in dependency order\n const orderedTables = await getTablesInDependencyOrder(pool, sourceSchema, tables);\n\n // Disable triggers temporarily for faster insert and to avoid constraint issues\n await pool.query('SET session_replication_role = replica');\n\n try {\n for (let i = 0; i < orderedTables.length; i++) {\n const table = orderedTables[i]!;\n\n onProgress?.('copying_data', {\n table,\n progress: i + 1,\n total: orderedTables.length,\n });\n\n const rows = await copyTableData(pool, sourceSchema, targetSchema, table, anonymizeRules);\n\n totalRows += rows;\n }\n } finally {\n // Re-enable triggers\n await pool.query('SET session_replication_role = DEFAULT');\n }\n\n return totalRows;\n}\n","/**\n * Cloner\n *\n * Clones a tenant to another, including structure and optionally data.\n *\n * @module clone/cloner\n */\n\nimport type { Pool } from 'pg';\nimport type {\n ClonerConfig,\n ClonerDependencies,\n CloneTenantOptions,\n CloneTenantResult,\n} from './types.js';\nimport { listTables, generateTableCloneInfo } from './ddl-generator.js';\nimport { copyAllData } from './data-copier.js';\n\nconst DEFAULT_MIGRATIONS_TABLE = '__drizzle_migrations';\n\n/**\n * Clones tenants with support for introspection + DDL\n *\n * @example\n * ```typescript\n * const cloner = createCloner(config, dependencies);\n *\n * // Schema-only clone\n * await cloner.cloneTenant('source', 'target');\n *\n * // Clone with data\n * await cloner.cloneTenant('source', 'target', { includeData: true });\n *\n * // Clone with anonymization\n * await cloner.cloneTenant('source', 'target', {\n * includeData: true,\n * anonymize: {\n * enabled: true,\n * rules: { users: { email: null, phone: null } },\n * },\n * });\n * ```\n */\nexport class Cloner {\n private readonly migrationsTable: string;\n\n constructor(\n config: ClonerConfig,\n private readonly deps: ClonerDependencies\n ) {\n this.migrationsTable = config.migrationsTable ?? DEFAULT_MIGRATIONS_TABLE;\n }\n\n /**\n * Clone a tenant to another\n *\n * @param sourceTenantId - Source tenant ID\n * @param targetTenantId - Target tenant ID\n * @param options - Clone options\n * @returns Clone result\n */\n async cloneTenant(\n sourceTenantId: string,\n targetTenantId: string,\n options: CloneTenantOptions = {}\n ): Promise<CloneTenantResult> {\n const startTime = Date.now();\n const {\n includeData = false,\n anonymize,\n excludeTables = [],\n onProgress,\n } = options;\n\n const sourceSchema = this.deps.schemaNameTemplate(sourceTenantId);\n const targetSchema = this.deps.schemaNameTemplate(targetTenantId);\n\n // Tables to exclude: migrations + custom\n const allExcludes = [this.migrationsTable, ...excludeTables];\n\n let sourcePool: Pool | null = null;\n let rootPool: Pool | null = null;\n\n try {\n onProgress?.('starting');\n\n // Check if source exists\n const sourceExists = await this.deps.schemaExists(sourceTenantId);\n if (!sourceExists) {\n return this.createErrorResult(\n sourceTenantId,\n targetTenantId,\n targetSchema,\n `Source tenant \"${sourceTenantId}\" does not exist`,\n startTime\n );\n }\n\n // Check if target already exists\n const targetExists = await this.deps.schemaExists(targetTenantId);\n if (targetExists) {\n return this.createErrorResult(\n sourceTenantId,\n targetTenantId,\n targetSchema,\n `Target tenant \"${targetTenantId}\" already exists`,\n startTime\n );\n }\n\n // Introspect source schema\n onProgress?.('introspecting');\n sourcePool = await this.deps.createPool(sourceSchema);\n\n const tables = await listTables(sourcePool, sourceSchema, allExcludes);\n\n if (tables.length === 0) {\n // Source has no tables, just create empty schema\n onProgress?.('creating_schema');\n await this.deps.createSchema(targetTenantId);\n\n onProgress?.('completed');\n return {\n sourceTenant: sourceTenantId,\n targetTenant: targetTenantId,\n targetSchema,\n success: true,\n tables: [],\n durationMs: Date.now() - startTime,\n };\n }\n\n const tableInfos = await Promise.all(\n tables.map((t) => generateTableCloneInfo(sourcePool!, sourceSchema, targetSchema, t))\n );\n\n // Close source pool after introspection\n await sourcePool.end();\n sourcePool = null;\n\n // Create target schema\n onProgress?.('creating_schema');\n await this.deps.createSchema(targetTenantId);\n\n // Execute DDLs on target\n rootPool = await this.deps.createRootPool();\n\n // Create tables\n onProgress?.('creating_tables');\n for (const info of tableInfos) {\n await rootPool.query(`SET search_path TO \"${targetSchema}\"; ${info.createDdl}`);\n }\n\n // Create PKs and Unique constraints (before FK)\n onProgress?.('creating_constraints');\n for (const info of tableInfos) {\n for (const constraint of info.constraintDdls.filter((c) => !c.includes('FOREIGN KEY'))) {\n try {\n await rootPool.query(`SET search_path TO \"${targetSchema}\"; ${constraint}`);\n } catch (error) {\n // Constraint might already exist due to table definition\n // This can happen with some PostgreSQL versions\n }\n }\n }\n\n // Create indexes\n onProgress?.('creating_indexes');\n for (const info of tableInfos) {\n for (const index of info.indexDdls) {\n try {\n await rootPool.query(index);\n } catch (error) {\n // Index might already exist\n }\n }\n }\n\n // Copy data if requested\n let rowsCopied = 0;\n if (includeData) {\n onProgress?.('copying_data');\n rowsCopied = await copyAllData(\n rootPool,\n sourceSchema,\n targetSchema,\n tables,\n anonymize?.enabled ? anonymize.rules : undefined,\n onProgress\n );\n }\n\n // Create FKs (after data)\n for (const info of tableInfos) {\n for (const fk of info.constraintDdls.filter((c) => c.includes('FOREIGN KEY'))) {\n try {\n await rootPool.query(fk);\n } catch (error) {\n // FK might fail if referencing tables outside the tenant schema\n // Log but don't fail the entire operation\n }\n }\n }\n\n onProgress?.('completed');\n\n const result: CloneTenantResult = {\n sourceTenant: sourceTenantId,\n targetTenant: targetTenantId,\n targetSchema,\n success: true,\n tables,\n durationMs: Date.now() - startTime,\n };\n\n if (includeData) {\n result.rowsCopied = rowsCopied;\n }\n\n return result;\n } catch (error) {\n options.onError?.(error as Error);\n onProgress?.('failed');\n\n return this.createErrorResult(\n sourceTenantId,\n targetTenantId,\n targetSchema,\n (error as Error).message,\n startTime\n );\n } finally {\n // Cleanup pools\n if (sourcePool) {\n await sourcePool.end().catch(() => {});\n }\n if (rootPool) {\n await rootPool.end().catch(() => {});\n }\n }\n }\n\n private createErrorResult(\n source: string,\n target: string,\n schema: string,\n error: string,\n startTime: number\n ): CloneTenantResult {\n return {\n sourceTenant: source,\n targetTenant: target,\n targetSchema: schema,\n success: false,\n error,\n tables: [],\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Factory function for Cloner\n *\n * @param config - Cloner configuration\n * @param dependencies - Cloner dependencies\n * @returns Cloner instance\n */\nexport function createCloner(config: ClonerConfig, dependencies: ClonerDependencies): Cloner {\n return new Cloner(config, dependencies);\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join, basename } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { Pool } from 'pg';\nimport type { Config } from '../types.js';\nimport type {\n MigratorConfig,\n MigrationFile,\n MigrateOptions,\n TenantMigrationResult,\n MigrationResults,\n TenantMigrationStatus,\n CreateTenantOptions,\n DropTenantOptions,\n TenantSyncStatus,\n SyncStatus,\n TenantSyncResult,\n SyncResults,\n SyncOptions,\n SeedFunction,\n SeedOptions,\n TenantSeedResult,\n SeedResults,\n // Schema drift detection types (delegated to DriftDetector)\n TenantSchema,\n TenantSchemaDrift,\n SchemaDriftStatus,\n SchemaDriftOptions,\n} from './types.js';\nimport { detectTableFormat, getFormatConfig, type DetectedFormat, type TableFormat } from './table-format.js';\nimport { SchemaManager } from './schema-manager.js';\nimport { DriftDetector } from './drift/drift-detector.js';\nimport { Seeder } from './seed/seeder.js';\nimport { SyncManager } from './sync/sync-manager.js';\nimport { MigrationExecutor } from './executor/migration-executor.js';\nimport { BatchExecutor } from './executor/batch-executor.js';\nimport { Cloner } from './clone/cloner.js';\nimport type { CloneTenantOptions, CloneTenantResult } from './clone/types.js';\n\nconst DEFAULT_MIGRATIONS_TABLE = '__drizzle_migrations';\n\n/**\n * Parallel migration engine for multi-tenant applications\n */\nexport class Migrator<\n TTenantSchema extends Record<string, unknown>,\n TSharedSchema extends Record<string, unknown>,\n> {\n private readonly migrationsTable: string;\n private readonly schemaManager: SchemaManager<TTenantSchema, TSharedSchema>;\n private readonly driftDetector: DriftDetector<TTenantSchema, TSharedSchema>;\n private readonly seeder: Seeder<TTenantSchema>;\n private readonly syncManager: SyncManager;\n private readonly migrationExecutor: MigrationExecutor;\n private readonly batchExecutor: BatchExecutor;\n private readonly cloner: Cloner;\n\n constructor(\n tenantConfig: Config<TTenantSchema, TSharedSchema>,\n private readonly migratorConfig: MigratorConfig\n ) {\n this.migrationsTable = migratorConfig.migrationsTable ?? DEFAULT_MIGRATIONS_TABLE;\n this.schemaManager = new SchemaManager(tenantConfig, this.migrationsTable);\n this.driftDetector = new DriftDetector(tenantConfig, this.schemaManager, {\n migrationsTable: this.migrationsTable,\n tenantDiscovery: migratorConfig.tenantDiscovery,\n });\n this.seeder = new Seeder(\n { tenantDiscovery: migratorConfig.tenantDiscovery },\n {\n createPool: this.schemaManager.createPool.bind(this.schemaManager),\n schemaNameTemplate: tenantConfig.isolation.schemaNameTemplate,\n tenantSchema: tenantConfig.schemas.tenant as TTenantSchema,\n }\n );\n this.syncManager = new SyncManager(\n {\n tenantDiscovery: migratorConfig.tenantDiscovery,\n migrationsFolder: migratorConfig.migrationsFolder,\n migrationsTable: this.migrationsTable,\n },\n {\n createPool: this.schemaManager.createPool.bind(this.schemaManager),\n schemaNameTemplate: tenantConfig.isolation.schemaNameTemplate,\n migrationsTableExists: this.schemaManager.migrationsTableExists.bind(this.schemaManager),\n ensureMigrationsTable: this.schemaManager.ensureMigrationsTable.bind(this.schemaManager),\n getOrDetectFormat: this.getOrDetectFormat.bind(this),\n loadMigrations: this.loadMigrations.bind(this),\n }\n );\n\n // Initialize MigrationExecutor (single tenant operations)\n this.migrationExecutor = new MigrationExecutor(\n { hooks: migratorConfig.hooks },\n {\n createPool: this.schemaManager.createPool.bind(this.schemaManager),\n schemaNameTemplate: tenantConfig.isolation.schemaNameTemplate,\n migrationsTableExists: this.schemaManager.migrationsTableExists.bind(this.schemaManager),\n ensureMigrationsTable: this.schemaManager.ensureMigrationsTable.bind(this.schemaManager),\n getOrDetectFormat: this.getOrDetectFormat.bind(this),\n loadMigrations: this.loadMigrations.bind(this),\n }\n );\n\n // Initialize BatchExecutor (multi-tenant operations)\n this.batchExecutor = new BatchExecutor(\n { tenantDiscovery: migratorConfig.tenantDiscovery },\n this.migrationExecutor,\n this.loadMigrations.bind(this)\n );\n\n // Initialize Cloner (tenant cloning operations)\n this.cloner = new Cloner(\n { migrationsTable: this.migrationsTable },\n {\n createPool: this.schemaManager.createPool.bind(this.schemaManager),\n createRootPool: this.schemaManager.createRootPool.bind(this.schemaManager),\n schemaNameTemplate: tenantConfig.isolation.schemaNameTemplate,\n schemaExists: this.schemaManager.schemaExists.bind(this.schemaManager),\n createSchema: this.schemaManager.createSchema.bind(this.schemaManager),\n }\n );\n }\n\n /**\n * Migrate all tenants in parallel\n *\n * Delegates to BatchExecutor for parallel migration operations.\n */\n async migrateAll(options: MigrateOptions = {}): Promise<MigrationResults> {\n return this.batchExecutor.migrateAll(options);\n }\n\n /**\n * Migrate a single tenant\n *\n * Delegates to MigrationExecutor for single tenant operations.\n */\n async migrateTenant(\n tenantId: string,\n migrations?: MigrationFile[],\n options: { dryRun?: boolean; onProgress?: MigrateOptions['onProgress'] } = {}\n ): Promise<TenantMigrationResult> {\n return this.migrationExecutor.migrateTenant(tenantId, migrations, options);\n }\n\n /**\n * Migrate specific tenants\n *\n * Delegates to BatchExecutor for parallel migration operations.\n */\n async migrateTenants(tenantIds: string[], options: MigrateOptions = {}): Promise<MigrationResults> {\n return this.batchExecutor.migrateTenants(tenantIds, options);\n }\n\n /**\n * Get migration status for all tenants\n *\n * Delegates to BatchExecutor for status operations.\n */\n async getStatus(): Promise<TenantMigrationStatus[]> {\n return this.batchExecutor.getStatus();\n }\n\n /**\n * Get migration status for a specific tenant\n *\n * Delegates to MigrationExecutor for single tenant operations.\n */\n async getTenantStatus(tenantId: string, migrations?: MigrationFile[]): Promise<TenantMigrationStatus> {\n return this.migrationExecutor.getTenantStatus(tenantId, migrations);\n }\n\n /**\n * Create a new tenant schema and optionally apply migrations\n */\n async createTenant(tenantId: string, options: CreateTenantOptions = {}): Promise<void> {\n const { migrate = true } = options;\n\n // Delegate schema creation to SchemaManager\n await this.schemaManager.createSchema(tenantId);\n\n if (migrate) {\n // Apply all migrations\n await this.migrateTenant(tenantId);\n }\n }\n\n /**\n * Drop a tenant schema\n */\n async dropTenant(tenantId: string, options: DropTenantOptions = {}): Promise<void> {\n // Delegate to SchemaManager\n await this.schemaManager.dropSchema(tenantId, options);\n }\n\n /**\n * Check if a tenant schema exists\n */\n async tenantExists(tenantId: string): Promise<boolean> {\n // Delegate to SchemaManager\n return this.schemaManager.schemaExists(tenantId);\n }\n\n /**\n * Clone a tenant to a new tenant\n *\n * By default, clones only schema structure. Use includeData to copy data.\n *\n * @example\n * ```typescript\n * // Schema-only clone\n * await migrator.cloneTenant('production', 'dev');\n *\n * // Clone with data\n * await migrator.cloneTenant('production', 'dev', { includeData: true });\n *\n * // Clone with anonymization\n * await migrator.cloneTenant('production', 'dev', {\n * includeData: true,\n * anonymize: {\n * enabled: true,\n * rules: {\n * users: { email: null, phone: null },\n * },\n * },\n * });\n * ```\n */\n async cloneTenant(\n sourceTenantId: string,\n targetTenantId: string,\n options: CloneTenantOptions = {}\n ): Promise<CloneTenantResult> {\n return this.cloner.cloneTenant(sourceTenantId, targetTenantId, options);\n }\n\n /**\n * Mark migrations as applied without executing SQL\n * Useful for syncing tracking state with already-applied migrations\n *\n * Delegates to MigrationExecutor for single tenant operations.\n */\n async markAsApplied(\n tenantId: string,\n options: { onProgress?: MigrateOptions['onProgress'] } = {}\n ): Promise<TenantMigrationResult> {\n return this.migrationExecutor.markAsApplied(tenantId, options);\n }\n\n /**\n * Mark migrations as applied for all tenants without executing SQL\n * Useful for syncing tracking state with already-applied migrations\n *\n * Delegates to BatchExecutor for parallel operations.\n */\n async markAllAsApplied(options: MigrateOptions = {}): Promise<MigrationResults> {\n return this.batchExecutor.markAllAsApplied(options);\n }\n\n // ============================================================================\n // Sync Methods (delegated to SyncManager)\n // ============================================================================\n\n /**\n * Get sync status for all tenants\n * Detects divergences between migrations on disk and tracking in database\n */\n async getSyncStatus(): Promise<SyncStatus> {\n return this.syncManager.getSyncStatus();\n }\n\n /**\n * Get sync status for a specific tenant\n */\n async getTenantSyncStatus(tenantId: string, migrations?: MigrationFile[]): Promise<TenantSyncStatus> {\n return this.syncManager.getTenantSyncStatus(tenantId, migrations);\n }\n\n /**\n * Mark missing migrations as applied for a tenant\n */\n async markMissing(tenantId: string): Promise<TenantSyncResult> {\n return this.syncManager.markMissing(tenantId);\n }\n\n /**\n * Mark missing migrations as applied for all tenants\n */\n async markAllMissing(options: SyncOptions = {}): Promise<SyncResults> {\n return this.syncManager.markAllMissing(options);\n }\n\n /**\n * Remove orphan migration records for a tenant\n */\n async cleanOrphans(tenantId: string): Promise<TenantSyncResult> {\n return this.syncManager.cleanOrphans(tenantId);\n }\n\n /**\n * Remove orphan migration records for all tenants\n */\n async cleanAllOrphans(options: SyncOptions = {}): Promise<SyncResults> {\n return this.syncManager.cleanAllOrphans(options);\n }\n\n // ============================================================================\n // Seeding Methods (delegated to Seeder)\n // ============================================================================\n\n /**\n * Seed a single tenant with initial data\n *\n * @example\n * ```typescript\n * const seed: SeedFunction = async (db, tenantId) => {\n * await db.insert(roles).values([\n * { name: 'admin', permissions: ['*'] },\n * { name: 'user', permissions: ['read'] },\n * ]);\n * };\n *\n * await migrator.seedTenant('tenant-123', seed);\n * ```\n */\n async seedTenant(\n tenantId: string,\n seedFn: SeedFunction<TTenantSchema>\n ): Promise<TenantSeedResult> {\n return this.seeder.seedTenant(tenantId, seedFn);\n }\n\n /**\n * Seed all tenants with initial data in parallel\n *\n * @example\n * ```typescript\n * const seed: SeedFunction = async (db, tenantId) => {\n * await db.insert(roles).values([\n * { name: 'admin', permissions: ['*'] },\n * ]);\n * };\n *\n * await migrator.seedAll(seed, { concurrency: 10 });\n * ```\n */\n async seedAll(\n seedFn: SeedFunction<TTenantSchema>,\n options: SeedOptions = {}\n ): Promise<SeedResults> {\n return this.seeder.seedAll(seedFn, options);\n }\n\n /**\n * Seed specific tenants with initial data\n */\n async seedTenants(\n tenantIds: string[],\n seedFn: SeedFunction<TTenantSchema>,\n options: SeedOptions = {}\n ): Promise<SeedResults> {\n return this.seeder.seedTenants(tenantIds, seedFn, options);\n }\n\n /**\n * Load migration files from the migrations folder\n */\n private async loadMigrations(): Promise<MigrationFile[]> {\n const files = await readdir(this.migratorConfig.migrationsFolder);\n\n const migrations: MigrationFile[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.sql')) continue;\n\n const filePath = join(this.migratorConfig.migrationsFolder, file);\n const content = await readFile(filePath, 'utf-8');\n\n // Extract timestamp from filename (e.g., 0001_migration_name.sql)\n const match = file.match(/^(\\d+)_/);\n const timestamp = match?.[1] ? parseInt(match[1], 10) : 0;\n\n // Compute SHA-256 hash for drizzle-kit compatibility\n const hash = createHash('sha256').update(content).digest('hex');\n\n migrations.push({\n name: basename(file, '.sql'),\n path: filePath,\n sql: content,\n timestamp,\n hash,\n });\n }\n\n // Sort by timestamp\n return migrations.sort((a, b) => a.timestamp - b.timestamp);\n }\n\n /**\n * Get or detect the format for a schema\n * Returns the configured format or auto-detects from existing table\n *\n * Note: This method is shared with SyncManager and MigrationExecutor via dependency injection.\n */\n private async getOrDetectFormat(\n pool: Pool,\n schemaName: string\n ): Promise<DetectedFormat> {\n const configuredFormat = this.migratorConfig.tableFormat ?? 'auto';\n\n // If not auto, return the configured format\n if (configuredFormat !== 'auto') {\n return getFormatConfig(configuredFormat, this.migrationsTable);\n }\n\n // Auto-detect from existing table\n const detected = await detectTableFormat(pool, schemaName, this.migrationsTable);\n\n if (detected) {\n return detected;\n }\n\n // No table exists, use default format\n const defaultFormat: TableFormat = this.migratorConfig.defaultFormat ?? 'name';\n return getFormatConfig(defaultFormat, this.migrationsTable);\n }\n\n // ============================================================================\n // Schema Drift Detection Methods (delegated to DriftDetector)\n // ============================================================================\n\n /**\n * Detect schema drift across all tenants\n * Compares each tenant's schema against a reference tenant (first tenant by default)\n *\n * @example\n * ```typescript\n * const drift = await migrator.getSchemaDrift();\n * if (drift.withDrift > 0) {\n * console.log('Schema drift detected!');\n * for (const tenant of drift.details) {\n * if (tenant.hasDrift) {\n * console.log(`Tenant ${tenant.tenantId} has drift:`);\n * for (const table of tenant.tables) {\n * for (const col of table.columns) {\n * console.log(` - ${table.table}.${col.column}: ${col.description}`);\n * }\n * }\n * }\n * }\n * }\n * ```\n */\n async getSchemaDrift(options: SchemaDriftOptions = {}): Promise<SchemaDriftStatus> {\n return this.driftDetector.detectDrift(options);\n }\n\n /**\n * Get schema drift for a specific tenant compared to a reference\n */\n async getTenantSchemaDrift(\n tenantId: string,\n referenceTenantId: string,\n options: Pick<SchemaDriftOptions, 'includeIndexes' | 'includeConstraints' | 'excludeTables'> = {}\n ): Promise<TenantSchemaDrift> {\n return this.driftDetector.compareTenant(tenantId, referenceTenantId, options);\n }\n\n /**\n * Introspect the schema of a tenant\n */\n async introspectTenantSchema(\n tenantId: string,\n options: { includeIndexes?: boolean; includeConstraints?: boolean; excludeTables?: string[] } = {}\n ): Promise<TenantSchema | null> {\n return this.driftDetector.introspectSchema(tenantId, options);\n }\n}\n\n/**\n * Create a migrator instance\n */\nexport function createMigrator<\n TTenantSchema extends Record<string, unknown>,\n TSharedSchema extends Record<string, unknown>,\n>(\n tenantConfig: Config<TTenantSchema, TSharedSchema>,\n migratorConfig: MigratorConfig\n): Migrator<TTenantSchema, TSharedSchema> {\n return new Migrator(tenantConfig, migratorConfig);\n}\n","import ora, { type Ora } from 'ora';\n\n/**\n * Create a spinner instance\n * @deprecated Use createContextSpinner from output.ts for TTY-aware spinners\n */\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: 'cyan',\n });\n}\n","import Table from 'cli-table3';\nimport chalk from 'chalk';\nimport type { TenantMigrationStatus } from '../../migrator/types.js';\nimport type { TableFormat } from '../../migrator/table-format.js';\n\n/**\n * Get format display text\n */\nfunction getFormatText(format: TableFormat | null): string {\n if (format === null) {\n return chalk.dim('(new)');\n }\n\n switch (format) {\n case 'name':\n return chalk.blue('name');\n case 'hash':\n return chalk.magenta('hash');\n case 'drizzle-kit':\n return chalk.cyan('drizzle-kit');\n }\n}\n\n/**\n * Create a status table for tenant migrations\n */\nexport function createStatusTable(statuses: TenantMigrationStatus[]): string {\n const table = new Table({\n head: [\n chalk.cyan('Tenant'),\n chalk.cyan('Schema'),\n chalk.cyan('Format'),\n chalk.cyan('Applied'),\n chalk.cyan('Pending'),\n chalk.cyan('Status'),\n ],\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const status of statuses) {\n const statusIcon = getStatusIcon(status.status);\n const statusText = getStatusText(status.status);\n\n table.push([\n status.tenantId,\n chalk.dim(status.schemaName),\n getFormatText(status.format),\n chalk.green(status.appliedCount.toString()),\n status.pendingCount > 0\n ? chalk.yellow(status.pendingCount.toString())\n : chalk.dim('0'),\n `${statusIcon} ${statusText}`,\n ]);\n }\n\n return table.toString();\n}\n\n/**\n * Create a results table for migration execution\n */\nexport function createResultsTable(\n results: Array<{\n tenantId: string;\n schemaName: string;\n success: boolean;\n appliedMigrations: string[];\n error?: string;\n durationMs: number;\n format?: TableFormat;\n }>\n): string {\n const table = new Table({\n head: [\n chalk.cyan('Tenant'),\n chalk.cyan('Format'),\n chalk.cyan('Migrations'),\n chalk.cyan('Duration'),\n chalk.cyan('Status'),\n ],\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const result of results) {\n const statusIcon = result.success ? chalk.green('✓') : chalk.red('✗');\n const statusText = result.success\n ? chalk.green('OK')\n : chalk.red(result.error ?? 'Failed');\n\n table.push([\n result.tenantId,\n getFormatText(result.format ?? null),\n result.appliedMigrations.length.toString(),\n `${result.durationMs}ms`,\n `${statusIcon} ${statusText}`,\n ]);\n }\n\n return table.toString();\n}\n\n/**\n * Create a pending migrations summary\n */\nexport function createPendingSummary(statuses: TenantMigrationStatus[]): string {\n const pendingMap = new Map<string, number>();\n\n for (const status of statuses) {\n for (const migration of status.pendingMigrations) {\n pendingMap.set(migration, (pendingMap.get(migration) || 0) + 1);\n }\n }\n\n if (pendingMap.size === 0) {\n return chalk.green('\\nAll tenants are up to date.');\n }\n\n const lines = [chalk.yellow('\\nPending migrations:')];\n\n for (const [migration, count] of pendingMap.entries()) {\n lines.push(\n ` ${chalk.dim('-')} ${migration} ${chalk.dim(`(${count} tenant${count > 1 ? 's' : ''})`)}`\n );\n }\n\n lines.push(\n chalk.dim('\\nRun \\'drizzle-multitenant migrate --all\\' to apply pending migrations.')\n );\n\n return lines.join('\\n');\n}\n\n/**\n * Get status icon\n */\nfunction getStatusIcon(status: 'ok' | 'behind' | 'error'): string {\n switch (status) {\n case 'ok':\n return chalk.green('✓');\n case 'behind':\n return chalk.yellow('⚠');\n case 'error':\n return chalk.red('✗');\n }\n}\n\n/**\n * Get status text\n */\nfunction getStatusText(status: 'ok' | 'behind' | 'error'): string {\n switch (status) {\n case 'ok':\n return chalk.green('OK');\n case 'behind':\n return chalk.yellow('Behind');\n case 'error':\n return chalk.red('Error');\n }\n}\n","import { pathToFileURL } from 'node:url';\nimport { resolve, extname } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { Config } from '../../types.js';\n\nconst CONFIG_FILE_NAMES = [\n 'tenant.config.ts',\n 'tenant.config.js',\n 'tenant.config.mjs',\n 'drizzle-multitenant.config.ts',\n 'drizzle-multitenant.config.js',\n 'drizzle-multitenant.config.mjs',\n];\n\nexport interface LoadedConfig {\n config: Config<Record<string, unknown>, Record<string, unknown>>;\n migrationsFolder?: string;\n migrationsTable?: string;\n tenantDiscovery?: () => Promise<string[]>;\n}\n\n/**\n * Load configuration from file\n */\nexport async function loadConfig(configPath?: string): Promise<LoadedConfig> {\n const cwd = process.cwd();\n\n let configFile: string | undefined;\n\n if (configPath) {\n configFile = resolve(cwd, configPath);\n if (!existsSync(configFile)) {\n throw new Error(`Config file not found: ${configFile}`);\n }\n } else {\n // Search for config file\n for (const name of CONFIG_FILE_NAMES) {\n const path = resolve(cwd, name);\n if (existsSync(path)) {\n configFile = path;\n break;\n }\n }\n }\n\n if (!configFile) {\n throw new Error(\n 'Config file not found. Create a tenant.config.ts or use --config flag.'\n );\n }\n\n // Handle TypeScript files\n const ext = extname(configFile);\n if (ext === '.ts') {\n // Register ts-node or tsx for TypeScript support\n await registerTypeScript();\n }\n\n // Import the config\n const configUrl = pathToFileURL(configFile).href;\n const module = await import(configUrl);\n const exported = module.default ?? module;\n\n if (!exported.connection || !exported.isolation || !exported.schemas) {\n throw new Error(\n 'Invalid config file. Expected an object with connection, isolation, and schemas properties.'\n );\n }\n\n return {\n config: exported,\n migrationsFolder: exported.migrations?.tenantFolder,\n migrationsTable: exported.migrations?.migrationsTable,\n tenantDiscovery: exported.migrations?.tenantDiscovery,\n };\n}\n\n/**\n * Register TypeScript loader\n */\nasync function registerTypeScript(): Promise<void> {\n try {\n // Try tsx first (faster)\n await import('tsx/esm');\n } catch {\n try {\n // Fall back to ts-node\n await import('ts-node/esm');\n } catch {\n throw new Error(\n 'TypeScript config requires tsx or ts-node. Install with: npm install -D tsx'\n );\n }\n }\n}\n\n/**\n * Resolve migrations folder path\n */\nexport function resolveMigrationsFolder(folder?: string): string {\n const cwd = process.cwd();\n const defaultFolder = './drizzle/tenant';\n\n const resolved = resolve(cwd, folder ?? defaultFolder);\n\n if (!existsSync(resolved)) {\n throw new Error(`Migrations folder not found: ${resolved}`);\n }\n\n return resolved;\n}\n","import ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\n\n/**\n * Output context for CLI commands\n * Controls TTY detection, JSON mode, verbosity, and colors\n */\nexport interface OutputContext {\n /** Whether stdout is a TTY (interactive terminal) */\n isInteractive: boolean;\n /** Output as JSON instead of human-readable format */\n jsonMode: boolean;\n /** Show verbose/debug output */\n verbose: boolean;\n /** Only show errors (quiet mode) */\n quiet: boolean;\n /** Disable colors in output */\n noColor: boolean;\n}\n\n// Global output context - initialized with defaults\nlet globalContext: OutputContext = {\n isInteractive: process.stdout.isTTY ?? false,\n jsonMode: false,\n verbose: false,\n quiet: false,\n noColor: false,\n};\n\n/**\n * Initialize the output context from CLI options\n */\nexport function initOutputContext(options: {\n json?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n noColor?: boolean;\n}): void {\n globalContext = {\n isInteractive: process.stdout.isTTY ?? false,\n jsonMode: options.json ?? false,\n verbose: options.verbose ?? false,\n quiet: options.quiet ?? false,\n noColor: options.noColor ?? !process.stdout.isTTY,\n };\n\n // Disable chalk colors if noColor is set\n if (globalContext.noColor) {\n chalk.level = 0;\n }\n}\n\n/**\n * Get the current output context\n */\nexport function getOutputContext(): OutputContext {\n return globalContext;\n}\n\n/**\n * Check if we should show interactive elements (spinners, progress bars)\n */\nexport function shouldShowInteractive(): boolean {\n return globalContext.isInteractive && !globalContext.jsonMode && !globalContext.quiet;\n}\n\n/**\n * Check if we should show regular log output\n */\nexport function shouldShowLog(): boolean {\n return !globalContext.jsonMode && !globalContext.quiet;\n}\n\n/**\n * Check if we should show verbose/debug output\n */\nexport function shouldShowVerbose(): boolean {\n return globalContext.verbose && !globalContext.jsonMode;\n}\n\n/**\n * Create a spinner that respects output context\n * Returns a no-op spinner if not in interactive mode\n */\nexport function createContextSpinner(text: string): Ora {\n if (!shouldShowInteractive()) {\n // Return a no-op spinner\n return {\n start: () => noopSpinner,\n stop: () => noopSpinner,\n succeed: () => noopSpinner,\n fail: () => noopSpinner,\n warn: () => noopSpinner,\n info: () => noopSpinner,\n isSpinning: false,\n text: '',\n color: 'cyan',\n } as unknown as Ora;\n }\n\n return ora({\n text,\n color: 'cyan',\n });\n}\n\nconst noopSpinner = {\n start: () => noopSpinner,\n stop: () => noopSpinner,\n succeed: () => noopSpinner,\n fail: () => noopSpinner,\n warn: () => noopSpinner,\n info: () => noopSpinner,\n isSpinning: false,\n text: '',\n color: 'cyan',\n};\n\n/**\n * Log a message if not in quiet/json mode\n */\nexport function log(message: string): void {\n if (shouldShowLog()) {\n console.log(message);\n }\n}\n\n/**\n * Log a verbose/debug message\n */\nexport function debug(message: string): void {\n if (shouldShowVerbose()) {\n console.log(chalk.dim(`[debug] ${message}`));\n }\n}\n\n/**\n * Log an error message (always shown unless JSON mode)\n */\nexport function logError(message: string): void {\n if (!globalContext.jsonMode) {\n console.error(chalk.red('✗ ') + message);\n }\n}\n\n/**\n * Output JSON data (only in JSON mode)\n */\nexport function outputJson<T>(data: T): void {\n if (globalContext.jsonMode) {\n console.log(JSON.stringify(data, null, 2));\n }\n}\n\n/**\n * Format success message\n */\nexport function success(message: string): string {\n return chalk.green('✓ ') + message;\n}\n\n/**\n * Format error message\n */\nexport function error(message: string): string {\n return chalk.red('✗ ') + message;\n}\n\n/**\n * Format warning message\n */\nexport function warning(message: string): string {\n return chalk.yellow('⚠ ') + message;\n}\n\n/**\n * Format info message\n */\nexport function info(message: string): string {\n return chalk.blue('ℹ ') + message;\n}\n\n/**\n * Format dim text\n */\nexport function dim(message: string): string {\n return chalk.dim(message);\n}\n\n/**\n * Format bold text\n */\nexport function bold(message: string): string {\n return chalk.bold(message);\n}\n\n/**\n * Format cyan text\n */\nexport function cyan(message: string): string {\n return chalk.cyan(message);\n}\n\n/**\n * Format green text\n */\nexport function green(message: string): string {\n return chalk.green(message);\n}\n\n/**\n * Format red text\n */\nexport function red(message: string): string {\n return chalk.red(message);\n}\n\n/**\n * Format yellow text\n */\nexport function yellow(message: string): string {\n return chalk.yellow(message);\n}\n\n/**\n * Format magenta text\n */\nexport function magenta(message: string): string {\n return chalk.magenta(message);\n}\n","import cliProgress from 'cli-progress';\nimport chalk from 'chalk';\nimport { shouldShowInteractive, dim, green, red } from './output.js';\n\nexport interface ProgressBarOptions {\n /** Total number of items to process */\n total: number;\n /** Format string for the progress bar */\n format?: string;\n /** Show ETA (estimated time remaining) */\n showEta?: boolean;\n}\n\nexport interface ProgressBar {\n /** Start the progress bar */\n start(): void;\n /** Update progress with current item info */\n update(current: number, payload?: { tenant?: string; status?: 'success' | 'error' }): void;\n /** Increment progress by 1 */\n increment(payload?: { tenant?: string; status?: 'success' | 'error' }): void;\n /** Stop the progress bar */\n stop(): void;\n}\n\n/**\n * Create a progress bar for tenant migrations\n * Returns a no-op progress bar if not in interactive mode\n */\nexport function createProgressBar(options: ProgressBarOptions): ProgressBar {\n const { total } = options;\n\n if (!shouldShowInteractive()) {\n // Return a no-op progress bar\n return {\n start: () => {},\n update: () => {},\n increment: () => {},\n stop: () => {},\n };\n }\n\n const format =\n options.format ||\n `${chalk.cyan('Migrating')} ${chalk.cyan('{bar}')} ${chalk.yellow('{percentage}%')} | {value}/{total} | {tenant} | ${dim('{eta}s')}`;\n\n const bar = new cliProgress.SingleBar(\n {\n format,\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591',\n hideCursor: true,\n clearOnComplete: false,\n stopOnComplete: true,\n etaBuffer: 10,\n },\n cliProgress.Presets.shades_classic\n );\n\n let currentValue = 0;\n\n return {\n start() {\n bar.start(total, 0, { tenant: 'starting...', status: '' });\n },\n\n update(current: number, payload?: { tenant?: string; status?: 'success' | 'error' }) {\n currentValue = current;\n const statusIcon = payload?.status === 'success' ? green('✓') : payload?.status === 'error' ? red('✗') : '';\n bar.update(current, {\n tenant: payload?.tenant ? `${statusIcon} ${payload.tenant}` : '',\n });\n },\n\n increment(payload?: { tenant?: string; status?: 'success' | 'error' }) {\n currentValue++;\n const statusIcon = payload?.status === 'success' ? green('✓') : payload?.status === 'error' ? red('✗') : '';\n bar.update(currentValue, {\n tenant: payload?.tenant ? `${statusIcon} ${payload.tenant}` : '',\n });\n },\n\n stop() {\n bar.stop();\n },\n };\n}\n\n/**\n * Create a multi-bar for concurrent operations\n */\nexport function createMultiProgressBar(): {\n create(total: number, startValue: number, payload?: Record<string, unknown>): cliProgress.SingleBar;\n stop(): void;\n} {\n if (!shouldShowInteractive()) {\n return {\n create: () => ({\n start: () => {},\n update: () => {},\n increment: () => {},\n stop: () => {},\n } as unknown as cliProgress.SingleBar),\n stop: () => {},\n };\n }\n\n const multibar = new cliProgress.MultiBar(\n {\n clearOnComplete: false,\n hideCursor: true,\n format: `${chalk.cyan('{bar}')} | {tenant} | {status}`,\n },\n cliProgress.Presets.shades_grey\n );\n\n return {\n create(total: number, startValue: number, payload?: Record<string, unknown>) {\n return multibar.create(total, startValue, payload);\n },\n stop() {\n multibar.stop();\n },\n };\n}\n","import { error, dim, cyan, getOutputContext } from './output.js';\n\n/**\n * CLI Error with actionable suggestions\n */\nexport class CLIError extends Error {\n constructor(\n message: string,\n public readonly suggestion?: string,\n public readonly example?: string,\n public readonly docs?: string\n ) {\n super(message);\n this.name = 'CLIError';\n }\n\n /**\n * Format the error for display\n */\n format(): string {\n const lines: string[] = [error(this.message)];\n\n if (this.suggestion) {\n lines.push('');\n lines.push(dim(' Suggestion: ') + this.suggestion);\n }\n\n if (this.example) {\n lines.push('');\n lines.push(dim(' Example:'));\n lines.push(cyan(' ' + this.example));\n }\n\n if (this.docs) {\n lines.push('');\n lines.push(dim(' Docs: ') + this.docs);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format as JSON for machine-readable output\n */\n toJSON(): object {\n return {\n error: this.message,\n suggestion: this.suggestion,\n example: this.example,\n docs: this.docs,\n };\n }\n}\n\n/**\n * Common CLI errors with pre-defined suggestions\n */\nexport const CLIErrors = {\n configNotFound: (searchPaths?: string[]) =>\n new CLIError(\n 'Configuration file not found',\n 'Create a tenant.config.ts file or use --config <path>',\n `export default defineConfig({\n connection: process.env.DATABASE_URL,\n isolation: { type: 'schema', schemaNameTemplate: (id) => \\`tenant_\\${id}\\` },\n schemas: {\n tenant: { ... },\n },\n})`,\n searchPaths ? `Searched: ${searchPaths.join(', ')}` : undefined\n ),\n\n noTenantDiscovery: () =>\n new CLIError(\n 'No tenant discovery function configured',\n 'Add a tenantDiscovery function to your config migrations settings',\n `migrations: {\n tenantDiscovery: async () => {\n const tenants = await db.select().from(tenantsTable);\n return tenants.map(t => t.id);\n },\n}`\n ),\n\n noTenantSpecified: () =>\n new CLIError(\n 'No tenant specified',\n 'Use --all, --tenant <id>, or --tenants <ids> to specify which tenants to migrate',\n `npx drizzle-multitenant migrate --all\nnpx drizzle-multitenant migrate --tenant=my-tenant\nnpx drizzle-multitenant migrate --tenants=tenant-1,tenant-2`\n ),\n\n tenantNotFound: (tenantId: string) =>\n new CLIError(\n `Tenant '${tenantId}' not found`,\n 'Check if the tenant exists in your database',\n 'npx drizzle-multitenant status'\n ),\n\n migrationsFolderNotFound: (path: string) =>\n new CLIError(\n `Migrations folder not found: ${path}`,\n 'Create the migrations folder or specify a different path with --migrations-folder',\n `mkdir -p ${path}\nnpx drizzle-multitenant generate --name initial`\n ),\n\n invalidFormat: (format: string, validFormats: string[]) =>\n new CLIError(\n `Invalid format: '${format}'`,\n `Valid formats are: ${validFormats.join(', ')}`,\n `npx drizzle-multitenant convert-format --to=${validFormats[0]}`\n ),\n\n connectionFailed: (reason: string) =>\n new CLIError(\n `Database connection failed: ${reason}`,\n 'Check your DATABASE_URL and ensure the database is running',\n 'export DATABASE_URL=\"postgresql://user:pass@localhost:5432/mydb\"'\n ),\n\n migrationFailed: (tenantId: string, reason: string) =>\n new CLIError(\n `Migration failed for tenant '${tenantId}': ${reason}`,\n 'Check the migration SQL for syntax errors or constraint violations'\n ),\n};\n\n/**\n * Handle an error and exit the process\n */\nexport function handleError(err: unknown): never {\n const ctx = getOutputContext();\n\n if (ctx.jsonMode) {\n if (err instanceof CLIError) {\n console.log(JSON.stringify(err.toJSON(), null, 2));\n } else {\n console.log(JSON.stringify({ error: (err as Error).message }, null, 2));\n }\n process.exit(1);\n }\n\n if (err instanceof CLIError) {\n console.error(err.format());\n } else {\n console.error(error((err as Error).message));\n }\n\n process.exit(1);\n}\n\n/**\n * Wrap a command action with error handling\n */\nexport function withErrorHandling<T extends (...args: unknown[]) => Promise<void>>(\n fn: T\n): T {\n return (async (...args: unknown[]) => {\n try {\n await fn(...args);\n } catch (err) {\n handleError(err);\n }\n }) as T;\n}\n","import { Command } from 'commander';\nimport { checkbox } from '@inquirer/prompts';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createResultsTable,\n createSpinner,\n createProgressBar,\n CLIErrors,\n handleError,\n getOutputContext,\n log,\n debug,\n outputJson,\n success,\n error,\n info,\n warning,\n bold,\n dim,\n shouldShowInteractive,\n} from '../utils/index.js';\nimport type { MigrateJsonOutput, MigrateOptions } from '../types.js';\n\nexport const migrateCommand = new Command('migrate')\n .description('Apply pending migrations to tenant schemas')\n .option('-c, --config <path>', 'Path to config file')\n .option('-a, --all', 'Migrate all tenants')\n .option('-t, --tenant <id>', 'Migrate a specific tenant')\n .option('--tenants <ids>', 'Migrate specific tenants (comma-separated)')\n .option('--concurrency <number>', 'Number of concurrent migrations', '10')\n .option('--dry-run', 'Show what would be applied without executing')\n .option('--mark-applied', 'Mark migrations as applied without executing SQL')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant migrate --all\n $ drizzle-multitenant migrate --tenant=my-tenant\n $ drizzle-multitenant migrate --tenants=tenant-1,tenant-2\n $ drizzle-multitenant migrate --all --dry-run\n $ drizzle-multitenant migrate --all --concurrency=5\n $ drizzle-multitenant migrate --all --json\n $ drizzle-multitenant migrate --all --mark-applied\n`)\n .action(async (options: MigrateOptions) => {\n const startTime = Date.now();\n const ctx = getOutputContext();\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n debug(`Using migrations folder: ${folder}`);\n\n // Determine tenant discovery function\n let discoveryFn: () => Promise<string[]>;\n let tenantIds: string[];\n\n if (options.tenant) {\n discoveryFn = async () => [options.tenant!];\n tenantIds = [options.tenant];\n } else if (options.tenants) {\n const ids = options.tenants.split(',').map((id: string) => id.trim());\n discoveryFn = async () => ids;\n tenantIds = ids;\n } else if (options.all) {\n if (!tenantDiscovery) {\n throw CLIErrors.noTenantDiscovery();\n }\n discoveryFn = tenantDiscovery;\n spinner.text = 'Discovering tenants...';\n tenantIds = await tenantDiscovery();\n } else {\n spinner.stop();\n\n // Interactive mode: let user select tenants\n if (shouldShowInteractive() && tenantDiscovery) {\n log(info('No tenants specified. Fetching available tenants...\\n'));\n\n const availableTenants = await tenantDiscovery();\n\n if (availableTenants.length === 0) {\n log(warning('No tenants found.'));\n return;\n }\n\n const selectedTenants = await checkbox({\n message: 'Select tenants to migrate:',\n choices: availableTenants.map(id => ({ name: id, value: id })),\n pageSize: 15,\n });\n\n if (selectedTenants.length === 0) {\n log(warning('No tenants selected. Aborting.'));\n return;\n }\n\n discoveryFn = async () => selectedTenants;\n tenantIds = selectedTenants;\n } else {\n throw CLIErrors.noTenantSpecified();\n }\n }\n\n if (tenantIds.length === 0) {\n spinner.stop();\n log(warning('No tenants found.'));\n return;\n }\n\n spinner.text = `Found ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}`;\n spinner.succeed();\n\n if (options.dryRun) {\n log(info(bold('\\nDry run mode - no changes will be made\\n')));\n }\n\n if (options.markApplied) {\n log(info(bold('\\nMark-applied mode - migrations will be recorded without executing SQL\\n')));\n }\n\n const actionLabel = options.markApplied ? 'Marking' : 'Migrating';\n log(info(`${actionLabel} ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}...\\n`));\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery: discoveryFn,\n });\n\n const concurrency = parseInt(options.concurrency || '10', 10);\n\n // Use progress bar for interactive mode, simple logs otherwise\n const progressBar = createProgressBar({ total: tenantIds.length });\n progressBar.start();\n\n const migrateOptions = {\n concurrency,\n onProgress: (tenantId: string, status: string, migrationName?: string) => {\n if (status === 'completed') {\n progressBar.increment({ tenant: tenantId, status: 'success' });\n debug(`Completed: ${tenantId}`);\n } else if (status === 'failed') {\n progressBar.increment({ tenant: tenantId, status: 'error' });\n debug(`Failed: ${tenantId}`);\n } else if (status === 'migrating' && migrationName) {\n const actionVerb = options.markApplied ? 'Marking' : 'Applying';\n debug(`${tenantId}: ${actionVerb} ${migrationName}`);\n }\n },\n onError: (tenantId: string, err: Error) => {\n debug(`Error on ${tenantId}: ${err.message}`);\n return 'continue' as const;\n },\n };\n\n const results = options.markApplied\n ? await migrator.markAllAsApplied(migrateOptions)\n : await migrator.migrateAll({ ...migrateOptions, dryRun: !!options.dryRun });\n\n progressBar.stop();\n\n const totalDuration = Date.now() - startTime;\n\n // JSON output\n if (ctx.jsonMode) {\n const jsonOutput: MigrateJsonOutput = {\n results: results.details.map(r => ({\n tenantId: r.tenantId,\n schema: r.schemaName,\n success: r.success,\n appliedMigrations: r.appliedMigrations,\n durationMs: r.durationMs,\n format: r.format,\n error: r.error,\n })),\n summary: {\n total: results.total,\n succeeded: results.succeeded,\n failed: results.failed,\n skipped: results.skipped,\n durationMs: totalDuration,\n averageMs: results.total > 0 ? Math.round(totalDuration / results.total) : undefined,\n },\n };\n outputJson(jsonOutput);\n process.exit(results.failed > 0 ? 1 : 0);\n }\n\n // Human-readable output\n log('\\n' + bold('Results:'));\n log(createResultsTable(results.details));\n\n log('\\n' + bold('Summary:'));\n log(` Total: ${results.total}`);\n log(` Succeeded: ${success(results.succeeded.toString())}`);\n if (results.failed > 0) {\n log(` Failed: ${error(results.failed.toString())}`);\n }\n if (results.skipped > 0) {\n log(` Skipped: ${warning(results.skipped.toString())}`);\n }\n log(` Duration: ${dim(formatDuration(totalDuration))}`);\n if (results.total > 0) {\n log(` Average: ${dim(formatDuration(Math.round(totalDuration / results.total)) + '/tenant')}`);\n }\n\n // Show failed tenants summary\n if (results.failed > 0) {\n log('\\n' + bold('Failed tenants:'));\n for (const detail of results.details.filter(d => !d.success)) {\n log(` ${error(detail.tenantId)}: ${dim(detail.error || 'Unknown error')}`);\n }\n log('\\n' + dim('Run with --verbose to see more details.'));\n }\n\n if (results.failed > 0) {\n process.exit(1);\n }\n } catch (err) {\n spinner.fail((err as Error).message);\n handleError(err);\n }\n });\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n","import { Command } from 'commander';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n createStatusTable,\n createPendingSummary,\n CLIErrors,\n handleError,\n getOutputContext,\n log,\n debug,\n outputJson,\n bold,\n} from '../utils/index.js';\nimport type { StatusJsonOutput, StatusOptions } from '../types.js';\n\nexport const statusCommand = new Command('status')\n .description('Show migration status for all tenants')\n .option('-c, --config <path>', 'Path to config file')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant status\n $ drizzle-multitenant status --json\n $ drizzle-multitenant status --json | jq '.tenants[] | select(.pending > 0)'\n $ drizzle-multitenant status --verbose\n`)\n .action(async (options: StatusOptions) => {\n const ctx = getOutputContext();\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n if (!tenantDiscovery) {\n throw CLIErrors.noTenantDiscovery();\n }\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n debug(`Using migrations folder: ${folder}`);\n\n spinner.text = 'Discovering tenants...';\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery,\n });\n\n spinner.text = 'Fetching migration status...';\n\n const statuses = await migrator.getStatus();\n\n spinner.succeed(`Found ${statuses.length} tenant${statuses.length > 1 ? 's' : ''}`);\n\n // Calculate summary\n const summary = {\n total: statuses.length,\n upToDate: statuses.filter(s => s.status === 'ok').length,\n behind: statuses.filter(s => s.status === 'behind').length,\n error: statuses.filter(s => s.status === 'error').length,\n };\n\n debug(`Summary: ${summary.upToDate} up-to-date, ${summary.behind} behind, ${summary.error} errors`);\n\n // JSON output\n if (ctx.jsonMode) {\n const jsonOutput: StatusJsonOutput = {\n tenants: statuses.map(s => ({\n id: s.tenantId,\n schema: s.schemaName,\n format: s.format,\n applied: s.appliedCount,\n pending: s.pendingCount,\n status: s.status,\n pendingMigrations: s.pendingMigrations,\n error: s.error,\n })),\n summary,\n };\n outputJson(jsonOutput);\n return;\n }\n\n // Human-readable output\n log('\\n' + bold('Migration Status:'));\n log(createStatusTable(statuses));\n log(createPendingSummary(statuses));\n } catch (err) {\n spinner.fail((err as Error).message);\n handleError(err);\n }\n });\n","import { Command } from 'commander';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n createProgressBar,\n CLIErrors,\n handleError,\n getOutputContext,\n log,\n debug,\n outputJson,\n success,\n error,\n info,\n warning,\n bold,\n dim,\n} from '../utils/index.js';\nimport type { SyncOptions, SyncJsonOutput } from '../types.js';\n\nexport const syncCommand = new Command('sync')\n .description('Detect and fix divergences between migrations on disk and tracking in database')\n .option('-c, --config <path>', 'Path to config file')\n .option('-s, --status', 'Show sync status without making changes')\n .option('--mark-missing', 'Mark missing migrations as applied')\n .option('--clean-orphans', 'Remove orphan records from tracking table')\n .option('--concurrency <number>', 'Number of concurrent operations', '10')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant sync --status\n $ drizzle-multitenant sync --mark-missing\n $ drizzle-multitenant sync --clean-orphans\n $ drizzle-multitenant sync --mark-missing --clean-orphans\n $ drizzle-multitenant sync --status --json\n`)\n .action(async (options: SyncOptions) => {\n const startTime = Date.now();\n const ctx = getOutputContext();\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n if (!tenantDiscovery) {\n throw CLIErrors.noTenantDiscovery();\n }\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n debug(`Using migrations folder: ${folder}`);\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery,\n });\n\n // Default to status if no action specified\n const showStatus = options.status || (!options.markMissing && !options.cleanOrphans);\n\n if (showStatus) {\n spinner.text = 'Fetching sync status...';\n\n const syncStatus = await migrator.getSyncStatus();\n\n spinner.succeed(`Found ${syncStatus.total} tenant${syncStatus.total > 1 ? 's' : ''}`);\n\n // JSON output\n if (ctx.jsonMode) {\n const jsonOutput: SyncJsonOutput = {\n tenants: syncStatus.details.map(s => ({\n id: s.tenantId,\n schema: s.schemaName,\n format: s.format,\n inSync: s.inSync,\n missing: s.missing,\n orphans: s.orphans,\n error: s.error,\n })),\n summary: {\n total: syncStatus.total,\n inSync: syncStatus.inSync,\n outOfSync: syncStatus.outOfSync,\n error: syncStatus.error,\n },\n };\n outputJson(jsonOutput);\n return;\n }\n\n // Human-readable output\n log('\\n' + bold('Sync Status:'));\n log(createSyncStatusTable(syncStatus.details));\n log(createSyncSummary(syncStatus));\n return;\n }\n\n // Execute sync actions\n const concurrency = parseInt(options.concurrency || '10', 10);\n\n if (options.markMissing) {\n spinner.text = 'Marking missing migrations...';\n spinner.succeed();\n\n const tenantIds = await tenantDiscovery();\n log(info(`\\nMarking missing migrations for ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}...\\n`));\n\n const progressBar = createProgressBar({ total: tenantIds.length });\n progressBar.start();\n\n const results = await migrator.markAllMissing({\n concurrency,\n onProgress: (tenantId, status) => {\n if (status === 'completed') {\n progressBar.increment({ tenant: tenantId, status: 'success' });\n } else if (status === 'failed') {\n progressBar.increment({ tenant: tenantId, status: 'error' });\n }\n },\n onError: (tenantId, err) => {\n debug(`Error on ${tenantId}: ${err.message}`);\n return 'continue';\n },\n });\n\n progressBar.stop();\n\n const totalDuration = Date.now() - startTime;\n\n if (ctx.jsonMode) {\n outputJson({\n action: 'mark-missing',\n results: results.details.map(r => ({\n tenantId: r.tenantId,\n schema: r.schemaName,\n success: r.success,\n markedMigrations: r.markedMigrations,\n durationMs: r.durationMs,\n error: r.error,\n })),\n summary: {\n total: results.total,\n succeeded: results.succeeded,\n failed: results.failed,\n durationMs: totalDuration,\n },\n });\n process.exit(results.failed > 0 ? 1 : 0);\n }\n\n log('\\n' + bold('Results:'));\n log(createSyncResultsTable(results.details, 'mark-missing'));\n log('\\n' + bold('Summary:'));\n log(` Total: ${results.total}`);\n log(` Succeeded: ${success(results.succeeded.toString())}`);\n if (results.failed > 0) {\n log(` Failed: ${error(results.failed.toString())}`);\n }\n log(` Duration: ${dim(formatDuration(totalDuration))}`);\n }\n\n if (options.cleanOrphans) {\n if (options.markMissing) {\n log('\\n'); // Add space between operations\n }\n\n spinner.text = 'Cleaning orphan records...';\n spinner.succeed();\n\n const tenantIds = await tenantDiscovery();\n log(info(`\\nCleaning orphan records for ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}...\\n`));\n\n const progressBar = createProgressBar({ total: tenantIds.length });\n progressBar.start();\n\n const results = await migrator.cleanAllOrphans({\n concurrency,\n onProgress: (tenantId, status) => {\n if (status === 'completed') {\n progressBar.increment({ tenant: tenantId, status: 'success' });\n } else if (status === 'failed') {\n progressBar.increment({ tenant: tenantId, status: 'error' });\n }\n },\n onError: (tenantId, err) => {\n debug(`Error on ${tenantId}: ${err.message}`);\n return 'continue';\n },\n });\n\n progressBar.stop();\n\n const totalDuration = Date.now() - startTime;\n\n if (ctx.jsonMode) {\n outputJson({\n action: 'clean-orphans',\n results: results.details.map(r => ({\n tenantId: r.tenantId,\n schema: r.schemaName,\n success: r.success,\n removedOrphans: r.removedOrphans,\n durationMs: r.durationMs,\n error: r.error,\n })),\n summary: {\n total: results.total,\n succeeded: results.succeeded,\n failed: results.failed,\n durationMs: totalDuration,\n },\n });\n process.exit(results.failed > 0 ? 1 : 0);\n }\n\n log('\\n' + bold('Results:'));\n log(createSyncResultsTable(results.details, 'clean-orphans'));\n log('\\n' + bold('Summary:'));\n log(` Total: ${results.total}`);\n log(` Succeeded: ${success(results.succeeded.toString())}`);\n if (results.failed > 0) {\n log(` Failed: ${error(results.failed.toString())}`);\n }\n log(` Duration: ${dim(formatDuration(totalDuration))}`);\n }\n } catch (err) {\n spinner.fail((err as Error).message);\n handleError(err);\n }\n });\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\n/**\n * Create a table showing sync status\n */\nfunction createSyncStatusTable(details: Array<{\n tenantId: string;\n schemaName: string;\n missing: string[];\n orphans: string[];\n inSync: boolean;\n error?: string;\n}>): string {\n if (details.length === 0) {\n return ' No tenants found.\\n';\n }\n\n const lines: string[] = [];\n\n for (const detail of details) {\n if (detail.error) {\n lines.push(` ${error(detail.tenantId)}: ${dim(detail.error)}`);\n } else if (detail.inSync) {\n lines.push(` ${success(detail.tenantId)}: ${dim('In sync')}`);\n } else {\n const issues: string[] = [];\n if (detail.missing.length > 0) {\n issues.push(`${detail.missing.length} missing`);\n }\n if (detail.orphans.length > 0) {\n issues.push(`${detail.orphans.length} orphan${detail.orphans.length > 1 ? 's' : ''}`);\n }\n lines.push(` ${warning(detail.tenantId)}: ${issues.join(', ')}`);\n\n // Show details\n if (detail.missing.length > 0) {\n lines.push(` ${dim('Missing:')} ${detail.missing.slice(0, 3).join(', ')}${detail.missing.length > 3 ? `, +${detail.missing.length - 3} more` : ''}`);\n }\n if (detail.orphans.length > 0) {\n lines.push(` ${dim('Orphans:')} ${detail.orphans.slice(0, 3).join(', ')}${detail.orphans.length > 3 ? `, +${detail.orphans.length - 3} more` : ''}`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * Create a summary of sync status\n */\nfunction createSyncSummary(status: {\n total: number;\n inSync: number;\n outOfSync: number;\n error: number;\n}): string {\n const lines: string[] = [];\n\n lines.push('\\n' + bold('Summary:'));\n lines.push(` Total: ${status.total}`);\n lines.push(` In Sync: ${success(status.inSync.toString())}`);\n if (status.outOfSync > 0) {\n lines.push(` Out of Sync: ${warning(status.outOfSync.toString())}`);\n }\n if (status.error > 0) {\n lines.push(` Errors: ${error(status.error.toString())}`);\n }\n\n if (status.outOfSync > 0) {\n lines.push('\\n' + dim('Run with --mark-missing to mark missing migrations as applied.'));\n lines.push(dim('Run with --clean-orphans to remove orphan records.'));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Create a table showing sync results\n */\nfunction createSyncResultsTable(\n details: Array<{\n tenantId: string;\n success: boolean;\n markedMigrations: string[];\n removedOrphans: string[];\n error?: string;\n }>,\n action: 'mark-missing' | 'clean-orphans'\n): string {\n if (details.length === 0) {\n return ' No tenants processed.\\n';\n }\n\n const lines: string[] = [];\n\n for (const detail of details) {\n if (detail.error) {\n lines.push(` ${error(detail.tenantId)}: ${dim(detail.error)}`);\n } else if (action === 'mark-missing') {\n if (detail.markedMigrations.length > 0) {\n lines.push(` ${success(detail.tenantId)}: Marked ${detail.markedMigrations.length} migration${detail.markedMigrations.length > 1 ? 's' : ''}`);\n } else {\n lines.push(` ${dim(detail.tenantId)}: Nothing to mark`);\n }\n } else {\n if (detail.removedOrphans.length > 0) {\n lines.push(` ${success(detail.tenantId)}: Removed ${detail.removedOrphans.length} orphan${detail.removedOrphans.length > 1 ? 's' : ''}`);\n } else {\n lines.push(` ${dim(detail.tenantId)}: No orphans found`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n","import { Command } from 'commander';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n createSpinner,\n createProgressBar,\n CLIErrors,\n handleError,\n getOutputContext,\n log,\n debug,\n outputJson,\n success,\n error,\n info,\n warning,\n bold,\n dim,\n} from '../utils/index.js';\nimport type { DiffOptions, DiffJsonOutput, DiffTenantInfo } from '../types.js';\n\nexport const diffCommand = new Command('diff')\n .description('Detect schema drift between tenant schemas')\n .option('-c, --config <path>', 'Path to config file')\n .option('-r, --reference <tenant>', 'Tenant ID to use as reference (default: first tenant)')\n .option('-t, --tenant <tenant>', 'Check only this tenant against reference')\n .option('--tenants <tenants>', 'Check only these tenants (comma-separated)')\n .option('--concurrency <number>', 'Number of concurrent operations', '10')\n .option('--no-indexes', 'Skip index comparison')\n .option('--no-constraints', 'Skip constraint comparison')\n .option('--exclude-tables <tables>', 'Tables to exclude from comparison (comma-separated)')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant diff\n $ drizzle-multitenant diff --reference=tenant-1\n $ drizzle-multitenant diff --tenant=tenant-2 --reference=tenant-1\n $ drizzle-multitenant diff --tenants=tenant-2,tenant-3\n $ drizzle-multitenant diff --no-indexes --no-constraints\n $ drizzle-multitenant diff --exclude-tables=logs,audit\n $ drizzle-multitenant diff --json\n`)\n .action(async (options: DiffOptions) => {\n const startTime = Date.now();\n const ctx = getOutputContext();\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n if (!tenantDiscovery) {\n throw CLIErrors.noTenantDiscovery();\n }\n\n debug(`Using config from: ${options.config || 'default location'}`);\n\n const migrator = createMigrator(config, {\n migrationsFolder: migrationsFolder ?? './drizzle',\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery,\n });\n\n // Parse options\n const concurrency = parseInt(options.concurrency || '10', 10);\n const includeIndexes = options.indexes !== false;\n const includeConstraints = options.constraints !== false;\n const excludeTables = options.excludeTables\n ? options.excludeTables.split(',').map((t) => t.trim())\n : [];\n\n // Determine tenant IDs to check\n let tenantIds: string[] | undefined;\n if (options.tenant) {\n tenantIds = [options.tenant];\n } else if (options.tenants) {\n tenantIds = options.tenants.split(',').map((t) => t.trim());\n }\n\n spinner.text = 'Detecting schema drift...';\n\n // Get all tenants if checking specific ones\n const allTenants = await tenantDiscovery();\n const tenantsToCheck = tenantIds ?? allTenants;\n\n if (tenantsToCheck.length === 0) {\n spinner.fail('No tenants found');\n return;\n }\n\n spinner.succeed(`Found ${allTenants.length} tenant${allTenants.length > 1 ? 's' : ''}`);\n\n // Determine reference tenant\n const referenceTenant = options.reference ?? tenantsToCheck[0];\n\n log(info(`\\nUsing \"${referenceTenant}\" as reference tenant\\n`));\n\n // Create progress bar\n const progressBar = createProgressBar({ total: tenantsToCheck.length });\n progressBar.start();\n\n const driftStatus = await migrator.getSchemaDrift({\n referenceTenant,\n tenantIds: tenantsToCheck,\n concurrency,\n includeIndexes,\n includeConstraints,\n excludeTables,\n onProgress: (tenantId, status) => {\n if (status === 'completed') {\n progressBar.increment({ tenant: tenantId, status: 'success' });\n } else if (status === 'failed') {\n progressBar.increment({ tenant: tenantId, status: 'error' });\n }\n },\n });\n\n progressBar.stop();\n\n const totalDuration = Date.now() - startTime;\n\n // JSON output\n if (ctx.jsonMode) {\n const jsonOutput: DiffJsonOutput = {\n referenceTenant: driftStatus.referenceTenant,\n tenants: driftStatus.details.map((d) => ({\n id: d.tenantId,\n schema: d.schemaName,\n hasDrift: d.hasDrift,\n issueCount: d.issueCount,\n tables: d.tables.map((t) => ({\n name: t.table,\n status: t.status,\n columns: t.columns,\n indexes: t.indexes,\n constraints: t.constraints,\n })),\n error: d.error,\n })),\n summary: {\n total: driftStatus.total,\n noDrift: driftStatus.noDrift,\n withDrift: driftStatus.withDrift,\n error: driftStatus.error,\n durationMs: totalDuration,\n },\n };\n outputJson(jsonOutput);\n process.exit(driftStatus.withDrift > 0 ? 1 : 0);\n }\n\n // Human-readable output\n log('\\n' + bold('Schema Drift Status:'));\n log(createDriftStatusTable(driftStatus.details, driftStatus.referenceTenant));\n log(createDriftSummary(driftStatus, totalDuration));\n\n // Show detailed drift information for tenants with issues\n const tenantsWithDrift = driftStatus.details.filter((d) => d.hasDrift);\n if (tenantsWithDrift.length > 0) {\n log('\\n' + bold('Drift Details:'));\n for (const tenant of tenantsWithDrift) {\n log(`\\n ${warning(tenant.tenantId)} (${tenant.schemaName}):`);\n for (const table of tenant.tables) {\n if (table.status === 'missing') {\n log(` ${error('✗')} Table \"${table.table}\" is missing`);\n } else if (table.status === 'extra') {\n log(` ${warning('+')} Table \"${table.table}\" is extra (not in reference)`);\n } else if (table.status === 'drifted') {\n log(` ${warning('~')} Table \"${table.table}\":`);\n for (const col of table.columns) {\n const icon = col.type === 'missing' ? error('✗') : col.type === 'extra' ? warning('+') : warning('~');\n log(` ${icon} ${col.description}`);\n }\n for (const idx of table.indexes) {\n const icon = idx.type === 'missing' ? error('✗') : idx.type === 'extra' ? warning('+') : warning('~');\n log(` ${icon} ${idx.description}`);\n }\n for (const con of table.constraints) {\n const icon = con.type === 'missing' ? error('✗') : con.type === 'extra' ? warning('+') : warning('~');\n log(` ${icon} ${con.description}`);\n }\n }\n }\n }\n }\n\n process.exit(driftStatus.withDrift > 0 ? 1 : 0);\n } catch (err) {\n spinner.fail((err as Error).message);\n handleError(err);\n }\n });\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\n/**\n * Create a table showing drift status\n */\nfunction createDriftStatusTable(\n details: Array<{\n tenantId: string;\n schemaName: string;\n hasDrift: boolean;\n issueCount: number;\n error?: string;\n }>,\n referenceTenant: string\n): string {\n if (details.length === 0) {\n return ' No tenants found.\\n';\n }\n\n const lines: string[] = [];\n\n for (const detail of details) {\n const isReference = detail.tenantId === referenceTenant;\n const prefix = isReference ? dim('(ref) ') : '';\n\n if (detail.error) {\n lines.push(` ${error(detail.tenantId)}: ${prefix}${dim(detail.error)}`);\n } else if (detail.hasDrift) {\n lines.push(` ${warning(detail.tenantId)}: ${prefix}${detail.issueCount} issue${detail.issueCount > 1 ? 's' : ''} detected`);\n } else {\n lines.push(` ${success(detail.tenantId)}: ${prefix}${dim('No drift')}`);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * Create a summary of drift status\n */\nfunction createDriftSummary(\n status: {\n total: number;\n noDrift: number;\n withDrift: number;\n error: number;\n },\n durationMs: number\n): string {\n const lines: string[] = [];\n\n lines.push('\\n' + bold('Summary:'));\n lines.push(` Total: ${status.total}`);\n lines.push(` No Drift: ${success(status.noDrift.toString())}`);\n if (status.withDrift > 0) {\n lines.push(` With Drift: ${warning(status.withDrift.toString())}`);\n }\n if (status.error > 0) {\n lines.push(` Errors: ${error(status.error.toString())}`);\n }\n lines.push(` Duration: ${dim(formatDuration(durationMs))}`);\n\n if (status.withDrift > 0) {\n lines.push('\\n' + dim('Run migrations to fix drift: drizzle-multitenant migrate --all'));\n }\n\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport { writeFile, mkdir, readdir } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport {\n loadConfig,\n createSpinner,\n success,\n dim,\n} from '../utils/index.js';\n\nexport const generateCommand = new Command('generate')\n .description('Generate a new migration file')\n .requiredOption('-n, --name <name>', 'Migration name')\n .option('-c, --config <path>', 'Path to config file')\n .option('--type <type>', 'Migration type: tenant or shared', 'tenant')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .action(async (options) => {\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { migrationsFolder: configFolder } = await loadConfig(options.config);\n\n const cwd = process.cwd();\n let folder: string;\n\n if (options.migrationsFolder) {\n folder = resolve(cwd, options.migrationsFolder);\n } else if (configFolder) {\n folder = resolve(cwd, configFolder);\n } else {\n folder = resolve(cwd, options.type === 'shared' ? './drizzle/shared' : './drizzle/tenant');\n }\n\n // Ensure folder exists\n if (!existsSync(folder)) {\n await mkdir(folder, { recursive: true });\n spinner.text = `Created migrations folder: ${folder}`;\n }\n\n spinner.text = 'Generating migration...';\n\n // Get next sequence number\n const files = existsSync(folder) ? await readdir(folder) : [];\n const sqlFiles = files.filter((f) => f.endsWith('.sql'));\n\n let maxSequence = 0;\n for (const file of sqlFiles) {\n const match = file.match(/^(\\d+)_/);\n if (match?.[1]) {\n const seq = parseInt(match[1], 10);\n if (seq > maxSequence) {\n maxSequence = seq;\n }\n }\n }\n\n const nextSequence = (maxSequence + 1).toString().padStart(4, '0');\n const safeName = options.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '');\n\n const fileName = `${nextSequence}_${safeName}.sql`;\n const filePath = join(folder, fileName);\n\n // Create migration file with template\n const template = `-- Migration: ${options.name}\n-- Created at: ${new Date().toISOString()}\n-- Type: ${options.type}\n\n-- Write your SQL migration here\n\n`;\n\n await writeFile(filePath, template, 'utf-8');\n\n spinner.succeed('Migration generated');\n\n console.log('\\n' + success(`Created: ${dim(filePath)}`));\n console.log(dim('\\nEdit this file to add your migration SQL.'));\n } catch (err) {\n spinner.fail((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n success,\n warning,\n dim,\n} from '../utils/index.js';\n\nexport const tenantCreateCommand = new Command('tenant:create')\n .description('Create a new tenant schema and apply all migrations')\n .requiredOption('--id <tenantId>', 'Tenant ID')\n .option('-c, --config <path>', 'Path to config file')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .option('--no-migrate', 'Skip applying migrations after creating schema')\n .action(async (options) => {\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable } = await loadConfig(options.config);\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery: async () => [],\n });\n\n const schemaName = config.isolation.schemaNameTemplate(options.id);\n\n spinner.text = `Checking if tenant ${options.id} exists...`;\n\n const exists = await migrator.tenantExists(options.id);\n if (exists) {\n spinner.warn(`Tenant ${options.id} already exists (${schemaName})`);\n\n if (options.migrate) {\n spinner.start();\n spinner.text = 'Applying pending migrations...';\n\n const result = await migrator.migrateTenant(options.id);\n\n if (result.appliedMigrations.length > 0) {\n spinner.succeed(`Applied ${result.appliedMigrations.length} migration(s)`);\n for (const migration of result.appliedMigrations) {\n console.log(` ${dim('-')} ${migration}`);\n }\n } else {\n spinner.succeed('No pending migrations');\n }\n }\n\n return;\n }\n\n spinner.text = `Creating tenant schema ${schemaName}...`;\n\n await migrator.createTenant(options.id, {\n migrate: options.migrate,\n });\n\n spinner.succeed(`Tenant ${options.id} created`);\n\n console.log('\\n' + success('Schema created: ') + dim(schemaName));\n\n if (options.migrate) {\n console.log(success('All migrations applied'));\n } else {\n console.log(warning('Migrations skipped. Run migrate to apply.'));\n }\n\n console.log(dim('\\nYou can now use this tenant:'));\n console.log(dim(` const db = tenants.getDb('${options.id}');`));\n } catch (err) {\n spinner.fail((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n success,\n warning,\n dim,\n red,\n bold,\n} from '../utils/index.js';\n\nexport const tenantDropCommand = new Command('tenant:drop')\n .description('Drop a tenant schema (DESTRUCTIVE)')\n .requiredOption('--id <tenantId>', 'Tenant ID')\n .option('-c, --config <path>', 'Path to config file')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .option('-f, --force', 'Skip confirmation prompt')\n .option('--no-cascade', 'Use RESTRICT instead of CASCADE')\n .action(async (options) => {\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable } = await loadConfig(options.config);\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery: async () => [],\n });\n\n const schemaName = config.isolation.schemaNameTemplate(options.id);\n\n spinner.text = `Checking if tenant ${options.id} exists...`;\n\n const exists = await migrator.tenantExists(options.id);\n if (!exists) {\n spinner.warn(`Tenant ${options.id} does not exist`);\n return;\n }\n\n spinner.stop();\n\n // Confirmation prompt\n if (!options.force) {\n console.log(red(bold('\\n⚠️ WARNING: This action is DESTRUCTIVE and IRREVERSIBLE!')));\n console.log(dim(`\\nYou are about to drop schema: ${schemaName}`));\n console.log(dim('All tables and data in this schema will be permanently deleted.\\n'));\n\n const confirmed = await askConfirmation(\n `Type \"${options.id}\" to confirm deletion: `,\n options.id\n );\n\n if (!confirmed) {\n console.log('\\n' + warning('Operation cancelled.'));\n return;\n }\n }\n\n spinner.start();\n spinner.text = `Dropping tenant schema ${schemaName}...`;\n\n await migrator.dropTenant(options.id, {\n cascade: options.cascade,\n });\n\n spinner.succeed(`Tenant ${options.id} dropped`);\n\n console.log('\\n' + success('Schema deleted: ') + dim(schemaName));\n } catch (err) {\n spinner.fail((err as Error).message);\n process.exit(1);\n }\n });\n\n/**\n * Ask for confirmation\n */\nasync function askConfirmation(question: string, expected: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim() === expected);\n });\n });\n}\n","import { Command } from 'commander';\nimport { createInterface } from 'node:readline';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport type { AnonymizeRules } from '../../migrator/clone/types.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n success,\n warning,\n dim,\n bold,\n red,\n} from '../utils/index.js';\n\nexport const tenantCloneCommand = new Command('tenant:clone')\n .description('Clone a tenant schema to a new tenant')\n .requiredOption('--from <tenantId>', 'Source tenant ID')\n .requiredOption('--to <tenantId>', 'Target tenant ID')\n .option('-c, --config <path>', 'Path to config file')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .option('--include-data', 'Include data in clone (default: schema only)')\n .option('--anonymize', 'Anonymize sensitive data (requires --include-data)')\n .option('--anonymize-config <path>', 'Path to anonymization config file')\n .option('-f, --force', 'Skip confirmation prompt')\n .option('--json', 'Output as JSON')\n .addHelpText(\n 'after',\n `\nExamples:\n # Clone schema only\n $ drizzle-multitenant tenant:clone --from=production --to=dev\n\n # Clone with data\n $ drizzle-multitenant tenant:clone --from=production --to=dev --include-data\n\n # Clone with data anonymization\n $ drizzle-multitenant tenant:clone --from=production --to=dev --include-data --anonymize\n\n # Clone with custom anonymization rules\n $ drizzle-multitenant tenant:clone --from=prod --to=dev --include-data --anonymize --anonymize-config=./anonymize.config.js\n`\n )\n .action(async (options) => {\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable } = await loadConfig(options.config);\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery: async () => [],\n });\n\n const sourceSchema = config.isolation.schemaNameTemplate(options.from);\n const targetSchema = config.isolation.schemaNameTemplate(options.to);\n\n spinner.text = `Checking source tenant ${options.from}...`;\n\n // Check if source exists\n const sourceExists = await migrator.tenantExists(options.from);\n if (!sourceExists) {\n spinner.fail(`Source tenant ${options.from} does not exist`);\n process.exit(1);\n }\n\n // Check if target already exists\n const targetExists = await migrator.tenantExists(options.to);\n if (targetExists) {\n spinner.fail(`Target tenant ${options.to} already exists`);\n process.exit(1);\n }\n\n spinner.stop();\n\n // Confirmation\n if (!options.force) {\n console.log('');\n console.log(bold('Clone Configuration:'));\n console.log(dim(` Source: ${options.from} (${sourceSchema})`));\n console.log(dim(` Target: ${options.to} (${targetSchema})`));\n\n if (options.includeData) {\n console.log(warning('\\n This will copy all data from source tenant.'));\n if (options.anonymize) {\n console.log(dim(' Sensitive data will be anonymized.'));\n }\n } else {\n console.log(dim('\\n Schema only (no data will be copied).'));\n }\n\n const confirmed = await askConfirmation(\n `\\nType \"${options.to}\" to confirm: `,\n options.to\n );\n\n if (!confirmed) {\n console.log('\\n' + warning('Operation cancelled.'));\n return;\n }\n }\n\n // Load anonymization rules if provided\n let anonymizeRules: AnonymizeRules | undefined;\n if (options.anonymize && options.anonymizeConfig) {\n try {\n const configPath = await import('node:path').then((m) =>\n m.resolve(process.cwd(), options.anonymizeConfig)\n );\n const configModule = await import(configPath);\n anonymizeRules = configModule.default || configModule;\n } catch (err) {\n spinner.fail(`Failed to load anonymization config: ${(err as Error).message}`);\n process.exit(1);\n }\n }\n\n spinner.start();\n spinner.text = `Cloning ${options.from} to ${options.to}...`;\n\n const result = await migrator.cloneTenant(options.from, options.to, {\n includeData: options.includeData,\n anonymize: options.anonymize\n ? {\n enabled: true,\n rules: anonymizeRules,\n }\n : undefined,\n onProgress: (status, details) => {\n switch (status) {\n case 'introspecting':\n spinner.text = 'Introspecting source schema...';\n break;\n case 'creating_schema':\n spinner.text = 'Creating target schema...';\n break;\n case 'creating_tables':\n spinner.text = 'Creating tables...';\n break;\n case 'creating_indexes':\n spinner.text = 'Creating indexes...';\n break;\n case 'creating_constraints':\n spinner.text = 'Creating constraints...';\n break;\n case 'copying_data':\n if (details?.table) {\n spinner.text = `Copying data: ${details.table} (${details.progress}/${details.total})...`;\n } else {\n spinner.text = 'Copying data...';\n }\n break;\n }\n },\n });\n\n if (options.json) {\n spinner.stop();\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (!result.success) {\n spinner.fail(result.error ?? 'Clone failed');\n process.exit(1);\n }\n\n spinner.succeed(`Tenant ${options.to} cloned successfully`);\n\n console.log('');\n console.log(success('Source: ') + dim(`${options.from} (${sourceSchema})`));\n console.log(success('Target: ') + dim(`${options.to} (${targetSchema})`));\n console.log(success('Tables: ') + dim(result.tables.length.toString()));\n\n if (options.includeData && result.rowsCopied !== undefined) {\n console.log(success('Rows copied: ') + dim(result.rowsCopied.toLocaleString()));\n if (options.anonymize) {\n console.log(success('Data anonymized: ') + dim('Yes'));\n }\n }\n\n console.log(dim(`\\nDuration: ${result.durationMs}ms`));\n console.log(dim('\\nUsage:'));\n console.log(dim(` const db = tenants.getDb('${options.to}');`));\n } catch (err) {\n spinner.fail((err as Error).message);\n process.exit(1);\n }\n });\n\nasync function askConfirmation(question: string, expected: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim() === expected);\n });\n });\n}\n","import { Command } from 'commander';\nimport { Pool } from 'pg';\nimport { createHash } from 'node:crypto';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { join, basename } from 'node:path';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n success,\n error,\n warning,\n bold,\n dim,\n} from '../utils/index.js';\nimport {\n detectTableFormat,\n type TableFormat,\n type DetectedFormat,\n} from '../../migrator/table-format.js';\n\ninterface MigrationFileInfo {\n name: string;\n hash: string;\n}\n\n/**\n * Load migration files with their hashes\n */\nasync function loadMigrationFiles(folder: string): Promise<MigrationFileInfo[]> {\n const files = await readdir(folder);\n const migrations: MigrationFileInfo[] = [];\n\n for (const file of files) {\n if (!file.endsWith('.sql')) continue;\n\n const filePath = join(folder, file);\n const content = await readFile(filePath, 'utf-8');\n const hash = createHash('sha256').update(content).digest('hex');\n\n migrations.push({\n name: basename(file, '.sql'),\n hash,\n });\n }\n\n return migrations;\n}\n\n/**\n * Convert a single tenant's migration table format\n */\nasync function convertTenantFormat(\n pool: Pool,\n schemaName: string,\n tableName: string,\n migrations: MigrationFileInfo[],\n currentFormat: DetectedFormat,\n targetFormat: TableFormat,\n dryRun: boolean\n): Promise<{ success: boolean; message: string }> {\n // Build lookup maps\n const hashToName = new Map(migrations.map((m) => [m.hash, m.name]));\n const nameToHash = new Map(migrations.map((m) => [m.name, m.hash]));\n\n const client = await pool.connect();\n\n try {\n // Read current records\n const identifierCol = currentFormat.columns.identifier;\n const current = await client.query<{ id: number; identifier: string }>(\n `SELECT id, \"${identifierCol}\" as identifier FROM \"${schemaName}\".\"${tableName}\" ORDER BY id`\n );\n\n if (dryRun) {\n const conversions: string[] = [];\n for (const row of current.rows) {\n if (targetFormat === 'name' && currentFormat.columns.identifier === 'hash') {\n const name = hashToName.get(row.identifier);\n if (name) {\n conversions.push(` ${dim(row.identifier.slice(0, 8))}... -> ${name}`);\n } else {\n conversions.push(` ${warning(row.identifier.slice(0, 8))}... -> ${error('unknown')}`);\n }\n } else if (targetFormat !== 'name' && currentFormat.columns.identifier === 'name') {\n const hash = nameToHash.get(row.identifier);\n if (hash) {\n conversions.push(` ${row.identifier} -> ${dim(hash.slice(0, 16))}...`);\n } else {\n conversions.push(` ${row.identifier} -> ${error('unknown')}`);\n }\n }\n }\n return {\n success: true,\n message: conversions.length > 0 ? conversions.join('\\n') : ' No conversions needed',\n };\n }\n\n await client.query('BEGIN');\n\n try {\n if (targetFormat === 'name' && currentFormat.columns.identifier === 'hash') {\n // Converting from hash to name\n // Add name column\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ADD COLUMN IF NOT EXISTS name VARCHAR(255)\n `);\n\n // Populate name from hash using migration files\n let converted = 0;\n for (const row of current.rows) {\n const name = hashToName.get(row.identifier);\n if (name) {\n await client.query(\n `UPDATE \"${schemaName}\".\"${tableName}\" SET name = $1 WHERE id = $2`,\n [name, row.id]\n );\n converted++;\n }\n }\n\n // Make name NOT NULL and add unique constraint\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ALTER COLUMN name SET NOT NULL\n `);\n\n // Add unique constraint if it doesn't exist\n await client.query(`\n DO $$\n BEGIN\n IF NOT EXISTS (\n SELECT 1 FROM pg_constraint\n WHERE conname = '${tableName}_name_unique'\n ) THEN\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ADD CONSTRAINT ${tableName}_name_unique UNIQUE (name);\n END IF;\n END $$;\n `);\n\n // Rename applied_at if needed\n if (currentFormat.columns.timestamp === 'created_at') {\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n RENAME COLUMN created_at TO applied_at\n `);\n\n // Convert bigint to timestamp if needed\n if (currentFormat.columns.timestampType === 'bigint') {\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ALTER COLUMN applied_at TYPE TIMESTAMP WITH TIME ZONE\n USING to_timestamp(applied_at / 1000.0)\n `);\n }\n }\n\n await client.query('COMMIT');\n return { success: true, message: `Converted ${converted} records to name format` };\n } else if (targetFormat !== 'name' && currentFormat.columns.identifier === 'name') {\n // Converting from name to hash/drizzle-kit\n // Add hash column\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ADD COLUMN IF NOT EXISTS hash TEXT\n `);\n\n // Populate hash from name using migration files\n let converted = 0;\n for (const row of current.rows) {\n const hash = nameToHash.get(row.identifier);\n if (hash) {\n await client.query(\n `UPDATE \"${schemaName}\".\"${tableName}\" SET hash = $1 WHERE id = $2`,\n [hash, row.id]\n );\n converted++;\n }\n }\n\n // Make hash NOT NULL\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ALTER COLUMN hash SET NOT NULL\n `);\n\n // Rename applied_at to created_at if needed\n if (currentFormat.columns.timestamp === 'applied_at') {\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n RENAME COLUMN applied_at TO created_at\n `);\n\n // Convert to bigint if targeting drizzle-kit\n if (targetFormat === 'drizzle-kit') {\n await client.query(`\n ALTER TABLE \"${schemaName}\".\"${tableName}\"\n ALTER COLUMN created_at TYPE BIGINT\n USING (EXTRACT(EPOCH FROM created_at) * 1000)::BIGINT\n `);\n }\n }\n\n await client.query('COMMIT');\n return { success: true, message: `Converted ${converted} records to ${targetFormat} format` };\n }\n\n await client.query('COMMIT');\n return { success: true, message: 'No conversion needed' };\n } catch (err) {\n await client.query('ROLLBACK');\n throw err;\n }\n } finally {\n client.release();\n }\n}\n\nexport const convertFormatCommand = new Command('convert-format')\n .description('Convert migration table format between name/hash/drizzle-kit')\n .requiredOption('--to <format>', 'Target format: name, hash, or drizzle-kit')\n .option('-c, --config <path>', 'Path to config file')\n .option('-t, --tenant <id>', 'Convert a specific tenant only')\n .option('--dry-run', 'Preview changes without applying')\n .option('--migrations-folder <path>', 'Path to migrations folder')\n .action(async (options) => {\n const spinner = createSpinner('Loading configuration...');\n\n try {\n // Validate target format\n const targetFormat = options.to as TableFormat;\n if (!['name', 'hash', 'drizzle-kit'].includes(targetFormat)) {\n throw new Error(`Invalid format: ${options.to}. Use: name, hash, or drizzle-kit`);\n }\n\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n const tableName = migrationsTable ?? '__drizzle_migrations';\n\n const folder = options.migrationsFolder\n ? resolveMigrationsFolder(options.migrationsFolder)\n : resolveMigrationsFolder(migrationsFolder);\n\n spinner.text = 'Loading migration files...';\n const migrations = await loadMigrationFiles(folder);\n\n spinner.text = 'Discovering tenants...';\n\n let tenantIds: string[];\n if (options.tenant) {\n tenantIds = [options.tenant];\n } else {\n if (!tenantDiscovery) {\n throw new Error(\n 'No tenant discovery function configured. Add migrations.tenantDiscovery to your config.'\n );\n }\n tenantIds = await tenantDiscovery();\n }\n\n spinner.succeed(`Found ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}`);\n\n if (options.dryRun) {\n console.log(warning(bold('\\nDry run mode - no changes will be made\\n')));\n }\n\n console.log(bold(`\\nConverting to ${targetFormat} format:\\n`));\n\n let successCount = 0;\n let skipCount = 0;\n let failCount = 0;\n\n for (const tenantId of tenantIds) {\n const schemaName = config.isolation.schemaNameTemplate(tenantId);\n\n const pool = new Pool({\n connectionString: config.connection.url,\n ...config.connection.poolConfig,\n });\n\n try {\n // Detect current format\n const currentFormat = await detectTableFormat(pool, schemaName, tableName);\n\n if (!currentFormat) {\n console.log(`${dim(tenantId)}: ${dim('No migrations table found, skipping')}`);\n skipCount++;\n continue;\n }\n\n if (currentFormat.format === targetFormat) {\n console.log(`${dim(tenantId)}: ${dim(`Already using ${targetFormat} format`)}`);\n skipCount++;\n continue;\n }\n\n console.log(`${bold(tenantId)}: ${currentFormat.format} -> ${targetFormat}`);\n\n const result = await convertTenantFormat(\n pool,\n schemaName,\n tableName,\n migrations,\n currentFormat,\n targetFormat,\n options.dryRun\n );\n\n if (result.success) {\n if (options.dryRun) {\n console.log(result.message);\n } else {\n console.log(` ${success(result.message)}`);\n }\n successCount++;\n } else {\n console.log(` ${error(result.message)}`);\n failCount++;\n }\n } catch (err) {\n console.log(` ${error((err as Error).message)}`);\n failCount++;\n } finally {\n await pool.end();\n }\n }\n\n console.log(bold('\\nSummary:'));\n console.log(` Converted: ${success(successCount.toString())}`);\n console.log(` Skipped: ${dim(skipCount.toString())}`);\n if (failCount > 0) {\n console.log(` Failed: ${error(failCount.toString())}`);\n process.exit(1);\n }\n } catch (err) {\n spinner.fail((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { select, input, confirm } from '@inquirer/prompts';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n log,\n success,\n info,\n warning,\n bold,\n dim,\n cyan,\n handleError,\n shouldShowInteractive,\n} from '../utils/index.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize a new drizzle-multitenant configuration')\n .option('--force', 'Overwrite existing configuration')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant init\n $ drizzle-multitenant init --force\n`)\n .action(async (options: { force?: boolean }) => {\n try {\n if (!shouldShowInteractive()) {\n log(warning('Interactive mode required. Please run in a terminal.'));\n process.exit(1);\n }\n\n log(bold('\\n🚀 drizzle-multitenant Setup Wizard\\n'));\n\n // Check if config already exists\n const configFiles = [\n 'tenant.config.ts',\n 'tenant.config.js',\n 'drizzle-multitenant.config.ts',\n 'drizzle-multitenant.config.js',\n ];\n\n const existingConfig = configFiles.find(f => existsSync(join(process.cwd(), f)));\n\n if (existingConfig && !options.force) {\n log(warning(`Configuration file already exists: ${existingConfig}`));\n const overwrite = await confirm({\n message: 'Do you want to overwrite it?',\n default: false,\n });\n\n if (!overwrite) {\n log(info('Setup cancelled.'));\n return;\n }\n }\n\n // Ask for isolation type\n const isolationType = await select({\n message: 'Which isolation strategy do you want to use?',\n choices: [\n {\n name: 'Schema-based isolation (recommended)',\n value: 'schema',\n description: 'Each tenant has its own PostgreSQL schema',\n },\n {\n name: 'Row-level security (RLS)',\n value: 'rls',\n description: 'Shared tables with tenant_id column and RLS policies',\n },\n ],\n });\n\n // Ask for database URL variable\n const dbEnvVar = await input({\n message: 'Environment variable for database connection:',\n default: 'DATABASE_URL',\n });\n\n // Ask for migrations folder\n const migrationsFolder = await input({\n message: 'Migrations folder path:',\n default: './drizzle/tenant-migrations',\n });\n\n // Ask for schema name template (only for schema isolation)\n let schemaTemplate = 'tenant_${id}';\n if (isolationType === 'schema') {\n schemaTemplate = await input({\n message: 'Schema name template (use ${id} for tenant ID):',\n default: 'tenant_${id}',\n });\n }\n\n // Ask about TypeScript\n const useTypeScript = await confirm({\n message: 'Use TypeScript for configuration?',\n default: true,\n });\n\n // Generate config content\n const configContent = generateConfigContent({\n isolationType: isolationType as 'schema' | 'rls',\n dbEnvVar,\n migrationsFolder,\n schemaTemplate,\n useTypeScript,\n });\n\n // Write config file\n const configFileName = useTypeScript ? 'tenant.config.ts' : 'tenant.config.js';\n const configPath = join(process.cwd(), configFileName);\n writeFileSync(configPath, configContent);\n log(success(`Created ${configFileName}`));\n\n // Create migrations folder\n const fullMigrationsPath = join(process.cwd(), migrationsFolder);\n if (!existsSync(fullMigrationsPath)) {\n mkdirSync(fullMigrationsPath, { recursive: true });\n log(success(`Created migrations folder: ${migrationsFolder}`));\n }\n\n // Create .gitkeep in migrations folder\n const gitkeepPath = join(fullMigrationsPath, '.gitkeep');\n if (!existsSync(gitkeepPath)) {\n writeFileSync(gitkeepPath, '');\n }\n\n // Final instructions\n log('\\n' + bold('✨ Setup complete!\\n'));\n log('Next steps:\\n');\n log(dim('1. Update your schema definitions in the config file'));\n log(dim('2. Set up tenant discovery function'));\n log(dim('3. Generate your first migration:'));\n log(cyan(` npx drizzle-multitenant generate --name initial`));\n log(dim('4. Create a tenant:'));\n log(cyan(` npx drizzle-multitenant tenant:create --id my-first-tenant`));\n log(dim('5. Check status:'));\n log(cyan(` npx drizzle-multitenant status`));\n log('');\n } catch (err) {\n handleError(err);\n }\n });\n\ninterface ConfigOptions {\n isolationType: 'schema' | 'rls';\n dbEnvVar: string;\n migrationsFolder: string;\n schemaTemplate: string;\n useTypeScript: boolean;\n}\n\nfunction generateConfigContent(options: ConfigOptions): string {\n const { isolationType, dbEnvVar, migrationsFolder, schemaTemplate, useTypeScript } = options;\n\n if (useTypeScript) {\n return `import { defineConfig } from 'drizzle-multitenant';\nimport { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core';\n\n// Example tenant schema - customize this for your needs\nconst users = pgTable('users', {\n id: uuid('id').primaryKey().defaultRandom(),\n email: text('email').notNull().unique(),\n name: text('name'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\nexport default defineConfig({\n // Database connection\n connection: process.env.${dbEnvVar}!,\n\n // Isolation strategy\n isolation: {\n type: '${isolationType}',\n ${isolationType === 'schema' ? `schemaNameTemplate: (id) => \\`${schemaTemplate.replace('${id}', '${id}')}\\`,` : ''}\n },\n\n // Schema definitions\n schemas: {\n tenant: {\n users,\n // Add more tables here...\n },\n },\n\n // Migration settings\n migrations: {\n folder: '${migrationsFolder}',\n table: '__drizzle_migrations',\n\n // Tenant discovery function - customize this!\n // This should return an array of tenant IDs from your database\n tenantDiscovery: async () => {\n // Example: Query your tenants table\n // const tenants = await db.select().from(tenantsTable);\n // return tenants.map(t => t.id);\n\n // For now, return empty array - update this!\n console.warn('⚠️ tenantDiscovery not configured - returning empty array');\n return [];\n },\n },\n});\n`;\n }\n\n // JavaScript version\n return `// @ts-check\nconst { defineConfig } = require('drizzle-multitenant');\nconst { pgTable, text, timestamp, uuid } = require('drizzle-orm/pg-core');\n\n// Example tenant schema - customize this for your needs\nconst users = pgTable('users', {\n id: uuid('id').primaryKey().defaultRandom(),\n email: text('email').notNull().unique(),\n name: text('name'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\nmodule.exports = defineConfig({\n // Database connection\n connection: process.env.${dbEnvVar},\n\n // Isolation strategy\n isolation: {\n type: '${isolationType}',\n ${isolationType === 'schema' ? `schemaNameTemplate: (id) => \\`${schemaTemplate.replace('${id}', '${id}')}\\`,` : ''}\n },\n\n // Schema definitions\n schemas: {\n tenant: {\n users,\n // Add more tables here...\n },\n },\n\n // Migration settings\n migrations: {\n folder: '${migrationsFolder}',\n table: '__drizzle_migrations',\n\n // Tenant discovery function - customize this!\n tenantDiscovery: async () => {\n // Example: Query your tenants table\n // For now, return empty array - update this!\n console.warn('⚠️ tenantDiscovery not configured - returning empty array');\n return [];\n },\n },\n});\n`;\n}\n","import { Command } from 'commander';\nimport { log, info, warning } from '../utils/index.js';\n\nexport const completionCommand = new Command('completion')\n .description('Generate shell completion scripts')\n .argument('<shell>', 'Shell type: bash, zsh, or fish')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant completion bash >> ~/.bashrc\n $ drizzle-multitenant completion zsh >> ~/.zshrc\n $ drizzle-multitenant completion fish > ~/.config/fish/completions/drizzle-multitenant.fish\n\nAfter adding the completion script, restart your shell or run:\n $ source ~/.bashrc # for bash\n $ source ~/.zshrc # for zsh\n`)\n .action((shell: string) => {\n const shellLower = shell.toLowerCase();\n\n switch (shellLower) {\n case 'bash':\n console.log(generateBashCompletion());\n break;\n case 'zsh':\n console.log(generateZshCompletion());\n break;\n case 'fish':\n console.log(generateFishCompletion());\n break;\n default:\n log(warning(`Unknown shell: ${shell}`));\n log(info('Supported shells: bash, zsh, fish'));\n process.exit(1);\n }\n });\n\nfunction generateBashCompletion(): string {\n return `# drizzle-multitenant bash completion\n# Add this to ~/.bashrc or ~/.bash_completion\n\n_drizzle_multitenant() {\n local cur prev opts commands\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n\n commands=\"migrate status generate tenant:create tenant:drop convert-format init completion\"\n\n global_opts=\"--json --verbose --quiet --no-color --help --version\"\n\n migrate_opts=\"-c --config -a --all -t --tenant --tenants --concurrency --dry-run --migrations-folder\"\n status_opts=\"-c --config --migrations-folder\"\n generate_opts=\"-n --name -c --config --type --migrations-folder\"\n tenant_create_opts=\"--id -c --config --migrations-folder --no-migrate\"\n tenant_drop_opts=\"--id -c --config --migrations-folder -f --force --no-cascade\"\n convert_opts=\"--to -c --config -t --tenant --dry-run --migrations-folder\"\n\n case \"\\${COMP_WORDS[1]}\" in\n migrate)\n COMPREPLY=( \\$(compgen -W \"\\${migrate_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n status)\n COMPREPLY=( \\$(compgen -W \"\\${status_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n generate)\n COMPREPLY=( \\$(compgen -W \"\\${generate_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n tenant:create)\n COMPREPLY=( \\$(compgen -W \"\\${tenant_create_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n tenant:drop)\n COMPREPLY=( \\$(compgen -W \"\\${tenant_drop_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n convert-format)\n COMPREPLY=( \\$(compgen -W \"\\${convert_opts} \\${global_opts}\" -- \\${cur}) )\n return 0\n ;;\n completion)\n COMPREPLY=( \\$(compgen -W \"bash zsh fish\" -- \\${cur}) )\n return 0\n ;;\n esac\n\n if [[ \\${cur} == -* ]] ; then\n COMPREPLY=( \\$(compgen -W \"\\${global_opts}\" -- \\${cur}) )\n return 0\n fi\n\n COMPREPLY=( \\$(compgen -W \"\\${commands}\" -- \\${cur}) )\n return 0\n}\n\ncomplete -F _drizzle_multitenant drizzle-multitenant\ncomplete -F _drizzle_multitenant npx drizzle-multitenant\n`;\n}\n\nfunction generateZshCompletion(): string {\n return `#compdef drizzle-multitenant\n# drizzle-multitenant zsh completion\n# Add this to ~/.zshrc or place in a file in your $fpath\n\n_drizzle_multitenant() {\n local -a commands\n local -a global_opts\n\n commands=(\n 'migrate:Apply pending migrations to tenant schemas'\n 'status:Show migration status for all tenants'\n 'generate:Generate a new migration file'\n 'tenant\\\\:create:Create a new tenant schema'\n 'tenant\\\\:drop:Drop a tenant schema (DESTRUCTIVE)'\n 'convert-format:Convert migration table format'\n 'init:Initialize a new configuration'\n 'completion:Generate shell completion scripts'\n )\n\n global_opts=(\n '--json[Output as JSON]'\n '(-v --verbose)'{-v,--verbose}'[Show verbose output]'\n '(-q --quiet)'{-q,--quiet}'[Only show errors]'\n '--no-color[Disable colored output]'\n '(-h --help)'{-h,--help}'[Show help]'\n '(-V --version)'{-V,--version}'[Show version]'\n )\n\n _arguments -C \\\\\n \"\\${global_opts[@]}\" \\\\\n '1: :->command' \\\\\n '*:: :->args'\n\n case \\$state in\n command)\n _describe -t commands 'command' commands\n ;;\n args)\n case \\$words[1] in\n migrate)\n _arguments \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '(-a --all)'{-a,--all}'[Migrate all tenants]' \\\\\n '(-t --tenant)'{-t,--tenant}'[Migrate specific tenant]:tenant id:' \\\\\n '--tenants[Migrate specific tenants (comma-separated)]:tenant ids:' \\\\\n '--concurrency[Number of concurrent migrations]:number:' \\\\\n '--dry-run[Show what would be applied]' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n \"\\${global_opts[@]}\"\n ;;\n status)\n _arguments \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n \"\\${global_opts[@]}\"\n ;;\n generate)\n _arguments \\\\\n '(-n --name)'{-n,--name}'[Migration name]:name:' \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '--type[Migration type]:type:(tenant shared)' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n \"\\${global_opts[@]}\"\n ;;\n tenant:create)\n _arguments \\\\\n '--id[Tenant ID]:tenant id:' \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n '--no-migrate[Skip running migrations]' \\\\\n \"\\${global_opts[@]}\"\n ;;\n tenant:drop)\n _arguments \\\\\n '--id[Tenant ID]:tenant id:' \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n '(-f --force)'{-f,--force}'[Skip confirmation]' \\\\\n '--no-cascade[Use RESTRICT instead of CASCADE]' \\\\\n \"\\${global_opts[@]}\"\n ;;\n convert-format)\n _arguments \\\\\n '--to[Target format]:format:(name hash drizzle-kit)' \\\\\n '(-c --config)'{-c,--config}'[Path to config file]:file:_files' \\\\\n '(-t --tenant)'{-t,--tenant}'[Convert specific tenant]:tenant id:' \\\\\n '--dry-run[Show what would be converted]' \\\\\n '--migrations-folder[Path to migrations folder]:folder:_directories' \\\\\n \"\\${global_opts[@]}\"\n ;;\n completion)\n _arguments '1:shell:(bash zsh fish)'\n ;;\n esac\n ;;\n esac\n}\n\n_drizzle_multitenant \"\\$@\"\n`;\n}\n\nfunction generateFishCompletion(): string {\n return `# drizzle-multitenant fish completion\n# Save to ~/.config/fish/completions/drizzle-multitenant.fish\n\n# Disable file completion by default\ncomplete -c drizzle-multitenant -f\n\n# Commands\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"migrate\" -d \"Apply pending migrations\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"status\" -d \"Show migration status\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"generate\" -d \"Generate new migration\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"tenant:create\" -d \"Create tenant schema\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"tenant:drop\" -d \"Drop tenant schema\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"convert-format\" -d \"Convert migration format\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"init\" -d \"Initialize configuration\"\ncomplete -c drizzle-multitenant -n \"__fish_use_subcommand\" -a \"completion\" -d \"Generate completions\"\n\n# Global options\ncomplete -c drizzle-multitenant -l json -d \"Output as JSON\"\ncomplete -c drizzle-multitenant -s v -l verbose -d \"Verbose output\"\ncomplete -c drizzle-multitenant -s q -l quiet -d \"Only show errors\"\ncomplete -c drizzle-multitenant -l no-color -d \"Disable colors\"\ncomplete -c drizzle-multitenant -s h -l help -d \"Show help\"\ncomplete -c drizzle-multitenant -s V -l version -d \"Show version\"\n\n# migrate options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -s a -l all -d \"Migrate all tenants\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -s t -l tenant -r -d \"Specific tenant\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -l tenants -r -d \"Multiple tenants\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -l concurrency -r -d \"Concurrent migrations\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -l dry-run -d \"Dry run mode\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from migrate\" -l migrations-folder -r -d \"Migrations folder\"\n\n# status options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from status\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from status\" -l migrations-folder -r -d \"Migrations folder\"\n\n# generate options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from generate\" -s n -l name -r -d \"Migration name\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from generate\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from generate\" -l type -r -a \"tenant shared\" -d \"Migration type\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from generate\" -l migrations-folder -r -d \"Migrations folder\"\n\n# tenant:create options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:create\" -l id -r -d \"Tenant ID\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:create\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:create\" -l migrations-folder -r -d \"Migrations folder\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:create\" -l no-migrate -d \"Skip migrations\"\n\n# tenant:drop options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -l id -r -d \"Tenant ID\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -l migrations-folder -r -d \"Migrations folder\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -s f -l force -d \"Skip confirmation\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from tenant:drop\" -l no-cascade -d \"Use RESTRICT\"\n\n# convert-format options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -l to -r -a \"name hash drizzle-kit\" -d \"Target format\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -s c -l config -r -d \"Config file\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -s t -l tenant -r -d \"Specific tenant\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -l dry-run -d \"Dry run mode\"\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from convert-format\" -l migrations-folder -r -d \"Migrations folder\"\n\n# completion options\ncomplete -c drizzle-multitenant -n \"__fish_seen_subcommand_from completion\" -a \"bash zsh fish\" -d \"Shell type\"\n`;\n}\n","import chalk from 'chalk';\n\n/**\n * CLI Banner with gradient effect\n */\nexport function showBanner(): void {\n const width = 43;\n const title = 'Drizzle Multitenant CLI';\n const subtitle = 'Multi-tenancy toolkit for Drizzle';\n\n const padTitle = Math.floor((width - title.length) / 2);\n const padSubtitle = Math.floor((width - subtitle.length) / 2);\n\n console.log('');\n console.log(chalk.cyan.bold(' ╔' + '═'.repeat(width) + '╗'));\n console.log(chalk.cyan.bold(' ║') + chalk.white.bold(' '.repeat(padTitle) + title + ' '.repeat(width - padTitle - title.length)) + chalk.cyan.bold('║'));\n console.log(chalk.cyan.bold(' ║') + chalk.dim(' '.repeat(padSubtitle) + subtitle + ' '.repeat(width - padSubtitle - subtitle.length)) + chalk.cyan.bold('║'));\n console.log(chalk.cyan.bold(' ╚' + '═'.repeat(width) + '╝'));\n console.log('');\n}\n\n/**\n * Show a section header\n */\nexport function showHeader(title: string): void {\n console.log('');\n console.log(chalk.cyan.bold(` ${title}`));\n console.log(chalk.dim(' ' + '─'.repeat(title.length + 4)));\n console.log('');\n}\n\n/**\n * Show status message with icon\n */\nexport function showStatus(\n message: string,\n type: 'success' | 'warning' | 'error' | 'info' = 'info'\n): void {\n const icons = {\n success: chalk.green('✓'),\n warning: chalk.yellow('⚠'),\n error: chalk.red('✗'),\n info: chalk.blue('ℹ'),\n };\n\n const colors = {\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n info: chalk.blue,\n };\n\n console.log(`\\n ${icons[type]} ${colors[type](message)}\\n`);\n}\n\n/**\n * Clear the screen\n */\nexport function clearScreen(): void {\n console.clear();\n}\n\n/**\n * Format tenant status for display\n */\nexport function formatTenantStatus(status: 'ok' | 'behind' | 'error'): string {\n switch (status) {\n case 'ok':\n return chalk.green('● up to date');\n case 'behind':\n return chalk.yellow('● pending');\n case 'error':\n return chalk.red('● error');\n }\n}\n\n/**\n * Format pending count for display\n */\nexport function formatPendingCount(count: number): string {\n if (count === 0) {\n return chalk.dim('0');\n }\n return chalk.yellow(`${count} pending`);\n}\n\n/**\n * Format duration in human-readable format\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n","import chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { select } from '@inquirer/prompts';\nimport type { TenantMigrationStatus, StatusSummary } from '../types.js';\n\n/**\n * Base renderer for menu screens\n * Handles common UI operations like headers, tables, and status messages\n */\nexport class MenuRenderer {\n /**\n * Clear the terminal screen\n */\n clearScreen(): void {\n console.clear();\n }\n\n /**\n * Show a section header with underline\n */\n showHeader(title: string): void {\n console.log('');\n console.log(chalk.cyan.bold(` ${title}`));\n console.log(chalk.dim(' ' + '─'.repeat(title.length + 4)));\n console.log('');\n }\n\n /**\n * Show status message with icon\n */\n showStatus(\n message: string,\n type: 'success' | 'warning' | 'error' | 'info' = 'info'\n ): void {\n const icons = {\n success: chalk.green('✓'),\n warning: chalk.yellow('⚠'),\n error: chalk.red('✗'),\n info: chalk.blue('ℹ'),\n };\n\n const colors = {\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n info: chalk.blue,\n };\n\n console.log(`\\n ${icons[type]} ${colors[type](message)}\\n`);\n }\n\n /**\n * Format tenant status for display\n */\n formatTenantStatus(status: 'ok' | 'behind' | 'error'): string {\n switch (status) {\n case 'ok':\n return chalk.green('● up to date');\n case 'behind':\n return chalk.yellow('● pending');\n case 'error':\n return chalk.red('● error');\n }\n }\n\n /**\n * Format pending count for display\n */\n formatPendingCount(count: number): string {\n if (count === 0) {\n return chalk.dim('0');\n }\n return chalk.yellow(`${count} pending`);\n }\n\n /**\n * Format duration in human-readable format\n */\n formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n }\n\n /**\n * Create a status table for tenant display\n */\n createStatusTable(statuses: TenantMigrationStatus[]): Table.Table {\n const table = new Table({\n head: [\n chalk.cyan('Tenant'),\n chalk.cyan('Schema'),\n chalk.cyan('Applied'),\n chalk.cyan('Pending'),\n chalk.cyan('Status'),\n ],\n style: { head: [], border: [] },\n });\n\n for (const status of statuses) {\n table.push([\n status.tenantId,\n chalk.dim(status.schemaName),\n chalk.green(status.appliedCount.toString()),\n this.formatPendingCount(status.pendingCount),\n this.formatTenantStatus(status.status),\n ]);\n }\n\n return table;\n }\n\n /**\n * Calculate status summary from tenant statuses\n */\n getStatusSummary(statuses: TenantMigrationStatus[]): StatusSummary {\n const upToDate = statuses.filter((s) => s.status === 'ok').length;\n const behind = statuses.filter((s) => s.status === 'behind').length;\n const error = statuses.filter((s) => s.status === 'error').length;\n const totalPending = statuses.reduce((sum, s) => sum + s.pendingCount, 0);\n\n return { upToDate, behind, error, totalPending };\n }\n\n /**\n * Show summary statistics\n */\n showSummary(statuses: TenantMigrationStatus[]): void {\n const summary = this.getStatusSummary(statuses);\n\n console.log('');\n console.log(chalk.bold(' Summary:'));\n console.log(` Total tenants: ${statuses.length}`);\n console.log(` Up to date: ${chalk.green(summary.upToDate.toString())}`);\n if (summary.behind > 0) {\n console.log(` Behind: ${chalk.yellow(summary.behind.toString())}`);\n }\n if (summary.error > 0) {\n console.log(` Errors: ${chalk.red(summary.error.toString())}`);\n }\n }\n\n /**\n * Show pending migrations grouped by migration name\n */\n showPendingMigrations(statuses: TenantMigrationStatus[]): void {\n const pendingMap = new Map<string, number>();\n for (const status of statuses) {\n for (const migration of status.pendingMigrations) {\n pendingMap.set(migration, (pendingMap.get(migration) || 0) + 1);\n }\n }\n\n if (pendingMap.size > 0) {\n console.log('');\n console.log(chalk.yellow(' Pending migrations:'));\n for (const [migration, count] of pendingMap.entries()) {\n console.log(\n ` ${chalk.dim('-')} ${migration} ${chalk.dim(`(${count} tenant${count > 1 ? 's' : ''})`)}`\n );\n }\n }\n }\n\n /**\n * Show migration results\n */\n showResults(results: { succeeded: number; failed: number; details: Array<{ tenantId: string; success: boolean; error?: string }> }, duration: number): void {\n console.log('');\n console.log(chalk.bold(' Results:'));\n console.log(` Succeeded: ${chalk.green(results.succeeded.toString())}`);\n if (results.failed > 0) {\n console.log(` Failed: ${chalk.red(results.failed.toString())}`);\n }\n console.log(` Duration: ${chalk.dim(this.formatDuration(duration))}`);\n\n if (results.failed > 0) {\n console.log('');\n console.log(chalk.red(' Failed tenants:'));\n for (const detail of results.details.filter((d) => !d.success)) {\n console.log(` ${chalk.red('✗')} ${detail.tenantId}: ${chalk.dim(detail.error || 'Unknown error')}`);\n }\n }\n }\n\n /**\n * Wait for user to press Enter to continue\n */\n async pressEnterToContinue(): Promise<void> {\n await select({\n message: 'Press Enter to continue...',\n choices: [{ name: 'Continue', value: 'continue' }],\n });\n }\n\n /**\n * Show progress for a tenant operation\n */\n showProgress(tenantId: string, status: 'completed' | 'failed' | 'migrating', migrationName?: string): void {\n if (status === 'completed') {\n console.log(chalk.green(` ✓ ${tenantId}`));\n } else if (status === 'failed') {\n console.log(chalk.red(` ✗ ${tenantId}`));\n } else if (status === 'migrating' && migrationName) {\n console.log(chalk.dim(` Applying: ${migrationName}`));\n }\n }\n\n /**\n * Show error message\n */\n showError(message: string): void {\n console.log(chalk.red(` Error: ${message}`));\n }\n}\n","import { select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { MenuRenderer } from '../base/menu-renderer.js';\nimport type { MenuContext, TenantMigrationStatus, ScreenAction } from '../types.js';\n\n/**\n * Screen for displaying migration status and tenant details\n */\nexport class StatusScreen {\n private readonly renderer: MenuRenderer;\n\n constructor(\n _ctx: MenuContext,\n renderer?: MenuRenderer\n ) {\n this.renderer = renderer || new MenuRenderer();\n }\n\n /**\n * Show the status overview screen\n */\n async show(statuses: TenantMigrationStatus[]): Promise<ScreenAction> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Migration Status');\n\n if (statuses.length === 0) {\n this.renderer.showStatus('No tenants found', 'warning');\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n\n // Create and display status table\n const table = this.renderer.createStatusTable(statuses);\n console.log(table.toString());\n\n // Show summary\n this.renderer.showSummary(statuses);\n\n // Show pending migrations\n this.renderer.showPendingMigrations(statuses);\n\n console.log('');\n\n const summary = this.renderer.getStatusSummary(statuses);\n\n const action = await select({\n message: 'What would you like to do?',\n choices: [\n { name: 'Migrate all pending', value: 'migrate', disabled: summary.totalPending === 0 },\n { name: 'View tenant details', value: 'details' },\n { name: chalk.gray('← Back to main menu'), value: 'back' },\n ],\n });\n\n if (action === 'migrate') {\n return { type: 'navigate', screen: 'migrate', params: { statuses } };\n } else if (action === 'details') {\n return this.showTenantSelection(statuses);\n }\n\n return { type: 'back' };\n }\n\n /**\n * Show tenant selection for details view\n */\n private async showTenantSelection(statuses: TenantMigrationStatus[]): Promise<ScreenAction> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Select Tenant');\n\n const choices = statuses.map((s) => ({\n name: `${this.renderer.formatTenantStatus(s.status).split(' ')[0]} ${s.tenantId} ${chalk.dim(`(${s.schemaName})`)}`,\n value: s.tenantId,\n }));\n choices.push({ name: chalk.gray('← Back'), value: 'back' });\n\n const selected = await select({\n message: 'Select a tenant to view details:',\n choices,\n });\n\n if (selected === 'back') {\n return this.show(statuses);\n }\n\n const status = statuses.find((s) => s.tenantId === selected);\n if (!status) {\n return this.show(statuses);\n }\n\n return this.showTenantDetails(status, statuses);\n }\n\n /**\n * Show detailed information for a specific tenant\n */\n async showTenantDetails(\n status: TenantMigrationStatus,\n allStatuses: TenantMigrationStatus[]\n ): Promise<ScreenAction> {\n this.renderer.clearScreen();\n this.renderer.showHeader(`Tenant: ${status.tenantId}`);\n\n console.log(chalk.bold(' Details:'));\n console.log(` Schema: ${status.schemaName}`);\n console.log(` Format: ${status.format || chalk.dim('(new)')}`);\n console.log(` Applied: ${chalk.green(status.appliedCount.toString())}`);\n console.log(` Pending: ${this.renderer.formatPendingCount(status.pendingCount)}`);\n console.log(` Status: ${this.renderer.formatTenantStatus(status.status)}`);\n\n if (status.pendingMigrations.length > 0) {\n console.log('');\n console.log(chalk.yellow(' Pending migrations:'));\n for (const migration of status.pendingMigrations) {\n console.log(` ${chalk.dim('-')} ${migration}`);\n }\n }\n\n if (status.error) {\n console.log('');\n console.log(chalk.red(` Error: ${status.error}`));\n }\n\n console.log('');\n\n const action = await select({\n message: 'What would you like to do?',\n choices: [\n {\n name: 'Migrate this tenant',\n value: 'migrate',\n disabled: status.pendingCount === 0,\n },\n { name: chalk.gray('← Back to list'), value: 'back' },\n ],\n });\n\n if (action === 'migrate') {\n return {\n type: 'navigate',\n screen: 'migrate-single',\n params: { tenantId: status.tenantId },\n };\n }\n\n return this.showTenantSelection(allStatuses);\n }\n}\n","import { checkbox, confirm } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { createMigrator } from '../../../migrator/migrator.js';\nimport { MenuRenderer } from '../base/menu-renderer.js';\nimport type { MenuContext, TenantMigrationStatus, ScreenAction } from '../types.js';\n\n/**\n * Screen for running migrations on tenants\n */\nexport class MigrationsScreen {\n private readonly renderer: MenuRenderer;\n\n constructor(\n private readonly ctx: MenuContext,\n renderer?: MenuRenderer\n ) {\n this.renderer = renderer || new MenuRenderer();\n }\n\n /**\n * Show migration selection screen\n */\n async show(statuses: TenantMigrationStatus[]): Promise<ScreenAction> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Migrate Tenants');\n\n const pendingTenants = statuses.filter((s) => s.pendingCount > 0);\n\n if (pendingTenants.length === 0) {\n this.renderer.showStatus('All tenants are up to date', 'success');\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n\n console.log(chalk.dim(` Found ${pendingTenants.length} tenant(s) with pending migrations\\n`));\n\n const selectedTenants = await checkbox({\n message: 'Select tenants to migrate:',\n choices: pendingTenants.map((s) => ({\n name: `${s.tenantId} ${chalk.yellow(`(${s.pendingCount} pending)`)}`,\n value: s.tenantId,\n checked: true,\n })),\n pageSize: 15,\n });\n\n if (selectedTenants.length === 0) {\n this.renderer.showStatus('No tenants selected', 'warning');\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n\n const confirmMigrate = await confirm({\n message: `Migrate ${selectedTenants.length} tenant(s)?`,\n default: true,\n });\n\n if (!confirmMigrate) {\n return { type: 'back' };\n }\n\n await this.runMigration(selectedTenants);\n return { type: 'refresh' };\n }\n\n /**\n * Run migrations for a single tenant\n */\n async migrateSingle(tenantId: string): Promise<ScreenAction> {\n await this.runMigration([tenantId]);\n return { type: 'refresh' };\n }\n\n /**\n * Run migrations for selected tenants\n */\n async runMigration(tenantIds: string[]): Promise<void> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Running Migrations');\n\n const migrator = createMigrator(this.ctx.config, {\n migrationsFolder: this.ctx.migrationsFolder,\n ...(this.ctx.migrationsTable && { migrationsTable: this.ctx.migrationsTable }),\n tenantDiscovery: async () => tenantIds,\n });\n\n const startTime = Date.now();\n console.log(chalk.dim(` Migrating ${tenantIds.length} tenant(s)...\\n`));\n\n const results = await migrator.migrateAll({\n concurrency: 10,\n onProgress: (_tenantId, status, migrationName) => {\n if (status === 'completed' || status === 'failed' || status === 'migrating') {\n this.renderer.showProgress(_tenantId, status, migrationName);\n }\n },\n onError: (_tenantId, error) => {\n this.renderer.showError(error.message);\n return 'continue';\n },\n });\n\n const duration = Date.now() - startTime;\n this.renderer.showResults(results, duration);\n\n console.log('');\n await this.renderer.pressEnterToContinue();\n }\n}\n","import { select, confirm, input } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { createMigrator } from '../../../migrator/migrator.js';\nimport { MenuRenderer } from '../base/menu-renderer.js';\nimport type { MenuContext, TenantMigrationStatus, ScreenAction } from '../types.js';\n\n/**\n * Screen for creating and dropping tenants\n */\nexport class TenantsScreen {\n private readonly renderer: MenuRenderer;\n\n constructor(\n private readonly ctx: MenuContext,\n renderer?: MenuRenderer\n ) {\n this.renderer = renderer || new MenuRenderer();\n }\n\n /**\n * Show create tenant screen\n */\n async showCreate(): Promise<ScreenAction> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Create Tenant');\n\n const tenantId = await input({\n message: 'Tenant ID:',\n validate: (value) => {\n if (!value.trim()) return 'Tenant ID cannot be empty';\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(value)) {\n return 'Invalid tenant ID format (use alphanumeric, dashes, underscores)';\n }\n return true;\n },\n });\n\n const schemaName = this.ctx.config.isolation.schemaNameTemplate(tenantId);\n\n console.log(chalk.dim(`\\n Schema name: ${schemaName}`));\n\n const applyMigrations = await confirm({\n message: 'Apply all migrations after creation?',\n default: true,\n });\n\n const confirmCreate = await confirm({\n message: `Create tenant \"${tenantId}\"?`,\n default: true,\n });\n\n if (!confirmCreate) {\n return { type: 'back' };\n }\n\n const spinner = ora('Creating tenant...').start();\n\n try {\n const migrator = createMigrator(this.ctx.config, {\n migrationsFolder: this.ctx.migrationsFolder,\n ...(this.ctx.migrationsTable && { migrationsTable: this.ctx.migrationsTable }),\n tenantDiscovery: async () => [],\n });\n\n // Check if tenant exists\n const exists = await migrator.tenantExists(tenantId);\n if (exists) {\n spinner.warn(`Tenant ${tenantId} already exists`);\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n\n // Create tenant\n await migrator.createTenant(tenantId, { migrate: applyMigrations });\n\n spinner.succeed(`Tenant ${tenantId} created successfully`);\n\n console.log('');\n console.log(chalk.green(' ✓ Schema created: ') + chalk.dim(schemaName));\n if (applyMigrations) {\n console.log(chalk.green(' ✓ All migrations applied'));\n }\n\n console.log(chalk.dim('\\n Usage:'));\n console.log(chalk.dim(` const db = tenants.getDb('${tenantId}');`));\n } catch (error) {\n spinner.fail('Failed to create tenant');\n console.log(chalk.red(`\\n ${(error as Error).message}`));\n }\n\n console.log('');\n await this.renderer.pressEnterToContinue();\n return { type: 'refresh' };\n }\n\n /**\n * Show drop tenant screen\n */\n async showDrop(statuses: TenantMigrationStatus[]): Promise<ScreenAction> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Drop Tenant');\n\n if (statuses.length === 0) {\n this.renderer.showStatus('No tenants found', 'warning');\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n\n const choices = statuses.map((s) => ({\n name: `${s.tenantId} ${chalk.dim(`(${s.schemaName})`)}`,\n value: s.tenantId,\n }));\n choices.push({ name: chalk.gray('← Cancel'), value: 'cancel' });\n\n const selected = await select({\n message: 'Select tenant to drop:',\n choices,\n });\n\n if (selected === 'cancel') {\n return { type: 'back' };\n }\n\n const status = statuses.find((s) => s.tenantId === selected);\n if (!status) {\n return { type: 'back' };\n }\n\n console.log('');\n console.log(chalk.red.bold(' WARNING: This action is irreversible!'));\n console.log(chalk.dim(` Schema ${status.schemaName} and all its data will be deleted.`));\n console.log('');\n\n const confirmDrop = await confirm({\n message: `Are you sure you want to drop tenant \"${selected}\"?`,\n default: false,\n });\n\n if (!confirmDrop) {\n return { type: 'back' };\n }\n\n // Double confirmation\n const confirmAgain = await input({\n message: `Type \"${selected}\" to confirm deletion:`,\n });\n\n if (confirmAgain !== selected) {\n this.renderer.showStatus('Tenant ID does not match. Operation cancelled.', 'warning');\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n\n const spinner = ora('Dropping tenant...').start();\n\n try {\n const migrator = createMigrator(this.ctx.config, {\n migrationsFolder: this.ctx.migrationsFolder,\n ...(this.ctx.migrationsTable && { migrationsTable: this.ctx.migrationsTable }),\n tenantDiscovery: async () => [],\n });\n\n await migrator.dropTenant(selected);\n\n spinner.succeed(`Tenant ${selected} dropped successfully`);\n console.log(chalk.dim(`\\n Schema ${status.schemaName} has been removed.`));\n } catch (error) {\n spinner.fail('Failed to drop tenant');\n console.log(chalk.red(`\\n ${(error as Error).message}`));\n }\n\n console.log('');\n await this.renderer.pressEnterToContinue();\n return { type: 'refresh' };\n }\n\n /**\n * Show clone tenant screen\n */\n async showClone(statuses: TenantMigrationStatus[]): Promise<ScreenAction> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Clone Tenant');\n\n if (statuses.length === 0) {\n this.renderer.showStatus('No tenants found to clone from', 'warning');\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n\n // Select source tenant\n const sourceChoices = statuses.map((s) => ({\n name: `${s.tenantId} ${chalk.dim(`(${s.schemaName})`)}`,\n value: s.tenantId,\n }));\n sourceChoices.push({ name: chalk.gray('← Cancel'), value: 'cancel' });\n\n const sourceId = await select({\n message: 'Select source tenant:',\n choices: sourceChoices,\n });\n\n if (sourceId === 'cancel') {\n return { type: 'back' };\n }\n\n // Input target tenant ID\n const existingIds = new Set(statuses.map((s) => s.tenantId));\n const targetId = await input({\n message: 'New tenant ID:',\n validate: (value) => {\n if (!value.trim()) return 'Tenant ID cannot be empty';\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(value)) {\n return 'Invalid tenant ID format (use alphanumeric, dashes, underscores)';\n }\n if (existingIds.has(value)) {\n return 'Tenant already exists';\n }\n return true;\n },\n });\n\n const targetSchema = this.ctx.config.isolation.schemaNameTemplate(targetId);\n console.log(chalk.dim(`\\n Target schema: ${targetSchema}`));\n\n // Ask about data copy\n const includeData = await confirm({\n message: 'Include data in clone?',\n default: false,\n });\n\n let anonymize = false;\n if (includeData) {\n anonymize = await confirm({\n message: 'Anonymize sensitive data?',\n default: false,\n });\n }\n\n // Confirmation\n console.log('');\n console.log(chalk.dim(' Clone configuration:'));\n console.log(chalk.dim(` Source: ${sourceId}`));\n console.log(chalk.dim(` Target: ${targetId} (${targetSchema})`));\n console.log(chalk.dim(` Data: ${includeData ? (anonymize ? 'Yes (anonymized)' : 'Yes') : 'No (schema only)'}`));\n console.log('');\n\n const confirmClone = await confirm({\n message: `Clone \"${sourceId}\" to \"${targetId}\"?`,\n default: true,\n });\n\n if (!confirmClone) {\n return { type: 'back' };\n }\n\n const spinner = ora('Cloning tenant...').start();\n\n try {\n const migrator = createMigrator(this.ctx.config, {\n migrationsFolder: this.ctx.migrationsFolder,\n ...(this.ctx.migrationsTable && { migrationsTable: this.ctx.migrationsTable }),\n tenantDiscovery: async () => [],\n });\n\n const result = await migrator.cloneTenant(sourceId, targetId, {\n includeData,\n anonymize: anonymize ? { enabled: true } : undefined,\n onProgress: (status, details) => {\n switch (status) {\n case 'introspecting':\n spinner.text = 'Introspecting source schema...';\n break;\n case 'creating_schema':\n spinner.text = 'Creating target schema...';\n break;\n case 'creating_tables':\n spinner.text = 'Creating tables...';\n break;\n case 'creating_indexes':\n spinner.text = 'Creating indexes...';\n break;\n case 'creating_constraints':\n spinner.text = 'Creating constraints...';\n break;\n case 'copying_data':\n if (details?.table) {\n spinner.text = `Copying: ${details.table} (${details.progress}/${details.total})...`;\n } else {\n spinner.text = 'Copying data...';\n }\n break;\n }\n },\n });\n\n if (!result.success) {\n spinner.fail('Clone failed');\n console.log(chalk.red(`\\n ${result.error}`));\n } else {\n spinner.succeed(`Tenant ${targetId} cloned successfully`);\n console.log('');\n console.log(chalk.green(' ✓ Tables: ') + chalk.dim(result.tables.length.toString()));\n if (includeData && result.rowsCopied !== undefined) {\n console.log(chalk.green(' ✓ Rows copied: ') + chalk.dim(result.rowsCopied.toLocaleString()));\n if (anonymize) {\n console.log(chalk.green(' ✓ Data anonymized'));\n }\n }\n console.log(chalk.dim(`\\n Duration: ${result.durationMs}ms`));\n console.log(chalk.dim('\\n Usage:'));\n console.log(chalk.dim(` const db = tenants.getDb('${targetId}');`));\n }\n } catch (error) {\n spinner.fail('Clone failed');\n console.log(chalk.red(`\\n ${(error as Error).message}`));\n }\n\n console.log('');\n await this.renderer.pressEnterToContinue();\n return { type: 'refresh' };\n }\n}\n","import { checkbox, confirm, input } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { createMigrator } from '../../../migrator/migrator.js';\nimport { MenuRenderer } from '../base/menu-renderer.js';\nimport type { MenuContext, TenantMigrationStatus, SeedFunction, ScreenAction } from '../types.js';\n\n/**\n * Screen for seeding tenant databases\n */\nexport class SeedingScreen {\n private readonly renderer: MenuRenderer;\n\n constructor(\n private readonly ctx: MenuContext,\n renderer?: MenuRenderer\n ) {\n this.renderer = renderer || new MenuRenderer();\n }\n\n /**\n * Show seed menu\n */\n async show(statuses: TenantMigrationStatus[]): Promise<ScreenAction> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Seed Tenants');\n\n if (statuses.length === 0) {\n this.renderer.showStatus('No tenants found', 'warning');\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n\n // Prompt for seed file path\n const seedFilePath = await input({\n message: 'Seed file path:',\n default: './seeds/initial.ts',\n validate: (value) => {\n if (!value.trim()) return 'Seed file path cannot be empty';\n return true;\n },\n });\n\n // Load seed file\n const seedFn = await this.loadSeedFile(seedFilePath);\n if (!seedFn) {\n return { type: 'back' };\n }\n\n console.log('');\n\n // Select tenants\n const selectedTenants = await checkbox({\n message: 'Select tenants to seed:',\n choices: statuses.map((s) => ({\n name: `${s.tenantId} ${chalk.dim(`(${s.schemaName})`)}`,\n value: s.tenantId,\n checked: true,\n })),\n pageSize: 15,\n });\n\n if (selectedTenants.length === 0) {\n this.renderer.showStatus('No tenants selected', 'warning');\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n\n const confirmSeed = await confirm({\n message: `Seed ${selectedTenants.length} tenant(s)?`,\n default: true,\n });\n\n if (!confirmSeed) {\n return { type: 'back' };\n }\n\n await this.runSeeding(selectedTenants, seedFn);\n return { type: 'back' };\n }\n\n /**\n * Load seed function from file\n */\n private async loadSeedFile(seedFilePath: string): Promise<SeedFunction | null> {\n const spinner = ora('Loading seed file...').start();\n\n try {\n const absolutePath = resolve(process.cwd(), seedFilePath);\n const seedFileUrl = pathToFileURL(absolutePath).href;\n const seedModule = await import(seedFileUrl);\n const seedFn = seedModule.seed || seedModule.default;\n\n if (typeof seedFn !== 'function') {\n spinner.fail('Seed file must export a \"seed\" function or default export');\n console.log(chalk.dim('\\n Expected format:'));\n console.log(chalk.dim(' export const seed: SeedFunction = async (db, tenantId) => { ... };'));\n await this.renderer.pressEnterToContinue();\n return null;\n }\n\n spinner.succeed('Seed file loaded');\n return seedFn;\n } catch (error) {\n spinner.fail('Failed to load seed file');\n const err = error as Error;\n if (err.message.includes('Cannot find module')) {\n console.log(chalk.red(`\\n File not found: ${seedFilePath}`));\n } else {\n console.log(chalk.red(`\\n ${err.message}`));\n }\n await this.renderer.pressEnterToContinue();\n return null;\n }\n }\n\n /**\n * Run seeding for selected tenants\n */\n private async runSeeding(tenantIds: string[], seedFn: SeedFunction): Promise<void> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Running Seed');\n\n const migrator = createMigrator(this.ctx.config, {\n migrationsFolder: this.ctx.migrationsFolder,\n ...(this.ctx.migrationsTable && { migrationsTable: this.ctx.migrationsTable }),\n tenantDiscovery: async () => tenantIds,\n });\n\n const startTime = Date.now();\n console.log(chalk.dim(` Seeding ${tenantIds.length} tenant(s)...\\n`));\n\n const results = await migrator.seedAll(seedFn as any, {\n concurrency: 10,\n onProgress: (tenantId: string, status: string) => {\n if (status === 'completed') {\n console.log(chalk.green(` ✓ ${tenantId}`));\n } else if (status === 'failed') {\n console.log(chalk.red(` ✗ ${tenantId}`));\n }\n },\n onError: (_tenantId: string, error: Error) => {\n console.log(chalk.red(` Error: ${error.message}`));\n return 'continue' as const;\n },\n });\n\n const duration = Date.now() - startTime;\n this.renderer.showResults(results, duration);\n\n console.log('');\n await this.renderer.pressEnterToContinue();\n }\n}\n","import { input } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { MenuRenderer } from '../base/menu-renderer.js';\nimport type { MenuContext, ScreenAction } from '../types.js';\n\n/**\n * Screen for generating new migrations\n */\nexport class GenerateScreen {\n private readonly renderer: MenuRenderer;\n\n constructor(\n _ctx: MenuContext,\n renderer?: MenuRenderer\n ) {\n this.renderer = renderer || new MenuRenderer();\n }\n\n /**\n * Show generate migration screen\n */\n async show(): Promise<ScreenAction> {\n this.renderer.clearScreen();\n this.renderer.showHeader('Generate Migration');\n\n const name = await input({\n message: 'Migration name:',\n validate: (value) => {\n if (!value.trim()) return 'Migration name cannot be empty';\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(value)) {\n return 'Invalid migration name format';\n }\n return true;\n },\n });\n\n console.log('');\n console.log(chalk.dim(' To generate a migration, run:'));\n console.log('');\n console.log(chalk.cyan(` npx drizzle-kit generate --name=${name}`));\n console.log('');\n console.log(chalk.dim(' Or use drizzle-multitenant generate:'));\n console.log('');\n console.log(chalk.cyan(` npx drizzle-multitenant generate --name=${name}`));\n console.log('');\n\n await this.renderer.pressEnterToContinue();\n return { type: 'back' };\n }\n}\n","import { select, Separator } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport type { TenantMigrationStatus } from '../../migrator/types.js';\nimport { showBanner } from './banner.js';\nimport { MenuRenderer } from './base/menu-renderer.js';\nimport {\n StatusScreen,\n MigrationsScreen,\n TenantsScreen,\n SeedingScreen,\n GenerateScreen,\n} from './screens/index.js';\nimport type { MenuContext, ScreenAction } from './types.js';\nimport { loadConfig, resolveMigrationsFolder } from '../utils/index.js';\n\n/**\n * Main menu orchestrator\n * Delegates to individual screens for specific functionality\n */\nexport class MainMenu {\n private readonly renderer: MenuRenderer;\n private ctx: MenuContext | null = null;\n private statuses: TenantMigrationStatus[] = [];\n\n constructor(\n private readonly configPath?: string\n ) {\n this.renderer = new MenuRenderer();\n }\n\n /**\n * Start the interactive menu\n */\n async start(): Promise<void> {\n this.renderer.clearScreen();\n showBanner();\n\n // Load configuration\n this.ctx = await this.loadMenuContext();\n if (!this.ctx) {\n await this.renderer.pressEnterToContinue();\n return;\n }\n\n // Fetch initial status\n await this.refreshStatuses();\n\n // Main loop\n await this.loop();\n }\n\n /**\n * Main menu loop\n */\n private async loop(): Promise<void> {\n while (true) {\n const action = await this.showMainMenu();\n\n if (action.type === 'exit') {\n console.log(chalk.cyan('\\n Goodbye!\\n'));\n process.exit(0);\n }\n\n if (action.type === 'refresh') {\n await this.refreshStatuses();\n }\n }\n }\n\n /**\n * Show main menu and handle selection\n */\n private async showMainMenu(): Promise<ScreenAction> {\n const summary = this.renderer.getStatusSummary(this.statuses);\n\n const choice = await select({\n message: 'drizzle-multitenant - Main Menu',\n choices: [\n {\n name: `Migration Status ${chalk.gray(`(${chalk.green(summary.upToDate)} ok, ${chalk.yellow(summary.behind)} pending)`)}`,\n value: 'status',\n },\n {\n name: `Migrate Tenants ${summary.totalPending > 0 ? chalk.yellow(`(${summary.totalPending} pending)`) : chalk.dim('(all up to date)')}`,\n value: 'migrate',\n },\n { name: 'Seed Tenants', value: 'seed' },\n new Separator(),\n { name: 'Create Tenant', value: 'create' },\n { name: 'Clone Tenant', value: 'clone' },\n { name: 'Drop Tenant', value: 'drop' },\n new Separator(),\n { name: 'Generate Migration', value: 'generate' },\n { name: 'Refresh', value: 'refresh' },\n new Separator(),\n { name: 'Exit', value: 'exit' },\n ],\n });\n\n return this.handleChoice(choice);\n }\n\n /**\n * Handle menu choice by delegating to appropriate screen\n */\n private async handleChoice(choice: string): Promise<ScreenAction> {\n if (!this.ctx) {\n return { type: 'exit' };\n }\n\n switch (choice) {\n case 'status': {\n const screen = new StatusScreen(this.ctx, this.renderer);\n const action = await screen.show(this.statuses);\n return this.handleScreenAction(action);\n }\n\n case 'migrate': {\n const screen = new MigrationsScreen(this.ctx, this.renderer);\n const action = await screen.show(this.statuses);\n return this.handleScreenAction(action);\n }\n\n case 'seed': {\n const screen = new SeedingScreen(this.ctx, this.renderer);\n const action = await screen.show(this.statuses);\n return this.handleScreenAction(action);\n }\n\n case 'create': {\n const screen = new TenantsScreen(this.ctx, this.renderer);\n const action = await screen.showCreate();\n return this.handleScreenAction(action);\n }\n\n case 'clone': {\n const screen = new TenantsScreen(this.ctx, this.renderer);\n const action = await screen.showClone(this.statuses);\n return this.handleScreenAction(action);\n }\n\n case 'drop': {\n const screen = new TenantsScreen(this.ctx, this.renderer);\n const action = await screen.showDrop(this.statuses);\n return this.handleScreenAction(action);\n }\n\n case 'generate': {\n const screen = new GenerateScreen(this.ctx, this.renderer);\n await screen.show();\n return { type: 'back' };\n }\n\n case 'refresh':\n await this.refreshStatuses();\n return { type: 'refresh' };\n\n case 'exit':\n return { type: 'exit' };\n\n default:\n return { type: 'back' };\n }\n }\n\n /**\n * Handle action returned from a screen\n */\n private async handleScreenAction(action: ScreenAction): Promise<ScreenAction> {\n if (!this.ctx) {\n return { type: 'exit' };\n }\n\n if (action.type === 'navigate') {\n switch (action.screen) {\n case 'migrate': {\n const screen = new MigrationsScreen(this.ctx, this.renderer);\n const result = await screen.show(this.statuses);\n return this.handleScreenAction(result);\n }\n\n case 'migrate-single': {\n const tenantId = action.params?.tenantId as string;\n if (tenantId) {\n const screen = new MigrationsScreen(this.ctx, this.renderer);\n const result = await screen.migrateSingle(tenantId);\n await this.refreshStatuses();\n return result;\n }\n return { type: 'back' };\n }\n\n default:\n return { type: 'back' };\n }\n }\n\n if (action.type === 'refresh') {\n await this.refreshStatuses();\n }\n\n return action;\n }\n\n /**\n * Load and validate configuration\n */\n private async loadMenuContext(): Promise<MenuContext | null> {\n const spinner = ora('Loading configuration...').start();\n\n try {\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } =\n await loadConfig(this.configPath);\n\n if (!tenantDiscovery) {\n spinner.fail('No tenant discovery function found in config');\n console.log(chalk.dim('\\nAdd migrations.tenantDiscovery to your config:'));\n console.log(chalk.dim(' migrations: {'));\n console.log(chalk.dim(\" tenantDiscovery: async () => ['tenant-1', 'tenant-2'],\"));\n console.log(chalk.dim(' }'));\n return null;\n }\n\n const folder = resolveMigrationsFolder(migrationsFolder);\n spinner.succeed('Configuration loaded');\n\n return {\n config,\n migrationsFolder: folder,\n migrationsTable,\n tenantDiscovery,\n };\n } catch (error) {\n spinner.fail('Failed to load configuration');\n console.log(chalk.red(`\\n ${(error as Error).message}`));\n return null;\n }\n }\n\n /**\n * Refresh tenant statuses\n */\n private async refreshStatuses(): Promise<void> {\n if (!this.ctx) return;\n\n const spinner = ora('Fetching tenant status...').start();\n\n try {\n const migrator = createMigrator(this.ctx.config, {\n migrationsFolder: this.ctx.migrationsFolder,\n ...(this.ctx.migrationsTable && { migrationsTable: this.ctx.migrationsTable }),\n tenantDiscovery: this.ctx.tenantDiscovery,\n });\n\n this.statuses = await migrator.getStatus();\n spinner.stop();\n } catch (error) {\n spinner.fail('Failed to fetch tenant status');\n console.log(chalk.red(`\\n ${(error as Error).message}`));\n this.statuses = [];\n }\n }\n}\n\n/**\n * Display the main menu (entry point)\n */\nexport async function mainMenu(configPath?: string): Promise<void> {\n const menu = new MainMenu(configPath);\n await menu.start();\n}\n\nexport default { mainMenu };\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { mainMenu } from '../ui/menu.js';\n\n// Handle graceful exit on SIGINT (Ctrl+C)\nprocess.on('SIGINT', () => {\n console.log(chalk.cyan('\\n\\n Goodbye!\\n'));\n process.exit(0);\n});\n\n// Handle uncaught exceptions from Inquirer prompts\nprocess.on('uncaughtException', (error) => {\n if (error.name === 'ExitPromptError') {\n console.log(chalk.cyan('\\n\\n Goodbye!\\n'));\n process.exit(0);\n }\n console.error(chalk.red('\\nUnexpected error:'), error.message);\n process.exit(1);\n});\n\nexport const interactiveCommand = new Command('interactive')\n .alias('i')\n .description('Launch interactive TUI mode')\n .option('-c, --config <path>', 'Path to config file')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant interactive\n $ drizzle-multitenant i\n $ drizzle-multitenant i --config ./tenant.config.ts\n\nInteractive mode provides a menu-driven interface to:\n - View migration status for all tenants\n - Select and migrate specific tenants\n - Create new tenants\n - Drop existing tenants\n - Generate new migrations\n`)\n .action(async (options) => {\n await mainMenu(options.config);\n });\n","import { Command } from 'commander';\nimport { checkbox } from '@inquirer/prompts';\nimport { pathToFileURL } from 'node:url';\nimport { resolve } from 'node:path';\nimport { createMigrator } from '../../migrator/migrator.js';\nimport type { SeedFunction } from '../../migrator/types.js';\nimport {\n loadConfig,\n resolveMigrationsFolder,\n createSpinner,\n createProgressBar,\n CLIErrors,\n handleError,\n getOutputContext,\n log,\n debug,\n outputJson,\n success,\n error,\n info,\n warning,\n bold,\n dim,\n shouldShowInteractive,\n} from '../utils/index.js';\n\ninterface SeedOptions {\n config?: string;\n file: string;\n all?: boolean;\n tenant?: string;\n tenants?: string;\n concurrency?: string;\n}\n\ninterface SeedJsonOutput {\n results: Array<{\n tenantId: string;\n schema: string;\n success: boolean;\n durationMs: number;\n error?: string;\n }>;\n summary: {\n total: number;\n succeeded: number;\n failed: number;\n skipped: number;\n durationMs: number;\n };\n}\n\nexport const seedCommand = new Command('seed')\n .description('Seed tenant databases with initial data')\n .requiredOption('-f, --file <path>', 'Path to seed file (TypeScript or JavaScript)')\n .option('-c, --config <path>', 'Path to config file')\n .option('-a, --all', 'Seed all tenants')\n .option('-t, --tenant <id>', 'Seed a specific tenant')\n .option('--tenants <ids>', 'Seed specific tenants (comma-separated)')\n .option('--concurrency <number>', 'Number of concurrent seed operations', '10')\n .addHelpText('after', `\nExamples:\n $ drizzle-multitenant seed --file=./seeds/initial.ts --all\n $ drizzle-multitenant seed --file=./seeds/initial.ts --tenant=my-tenant\n $ drizzle-multitenant seed --file=./seeds/initial.ts --tenants=tenant-1,tenant-2\n $ drizzle-multitenant seed --file=./seeds/initial.ts --all --concurrency=5\n\nSeed File Format:\n // seeds/initial.ts\n import { SeedFunction } from 'drizzle-multitenant';\n\n export const seed: SeedFunction = async (db, tenantId) => {\n await db.insert(roles).values([\n { name: 'admin', permissions: ['*'] },\n { name: 'user', permissions: ['read'] },\n ]);\n };\n`)\n .action(async (options: SeedOptions) => {\n const startTime = Date.now();\n const ctx = getOutputContext();\n const spinner = createSpinner('Loading configuration...');\n\n try {\n spinner.start();\n\n const { config, migrationsFolder, migrationsTable, tenantDiscovery } = await loadConfig(options.config);\n\n const folder = resolveMigrationsFolder(migrationsFolder);\n\n debug(`Using migrations folder: ${folder}`);\n\n // Load the seed file\n spinner.text = 'Loading seed file...';\n const seedFilePath = resolve(process.cwd(), options.file);\n const seedFileUrl = pathToFileURL(seedFilePath).href;\n\n let seedFn: SeedFunction;\n\n try {\n const seedModule = await import(seedFileUrl);\n seedFn = seedModule.seed || seedModule.default;\n\n if (typeof seedFn !== 'function') {\n throw new Error('Seed file must export a \"seed\" function or default export');\n }\n } catch (err) {\n spinner.fail('Failed to load seed file');\n const error = err as Error;\n if (error.message.includes('Cannot find module')) {\n log(`\\n${warning(`Seed file not found: ${seedFilePath}`)}`);\n log(dim('\\nMake sure the file exists and has the correct format:'));\n log(dim(' export const seed: SeedFunction = async (db, tenantId) => { ... };'));\n } else {\n log(`\\n${warning(error.message)}`);\n }\n process.exit(1);\n }\n\n // Determine tenant discovery function\n let discoveryFn: () => Promise<string[]>;\n let tenantIds: string[];\n\n if (options.tenant) {\n discoveryFn = async () => [options.tenant!];\n tenantIds = [options.tenant];\n } else if (options.tenants) {\n const ids = options.tenants.split(',').map((id: string) => id.trim());\n discoveryFn = async () => ids;\n tenantIds = ids;\n } else if (options.all) {\n if (!tenantDiscovery) {\n throw CLIErrors.noTenantDiscovery();\n }\n discoveryFn = tenantDiscovery;\n spinner.text = 'Discovering tenants...';\n tenantIds = await tenantDiscovery();\n } else {\n spinner.stop();\n\n // Interactive mode: let user select tenants\n if (shouldShowInteractive() && tenantDiscovery) {\n log(info('No tenants specified. Fetching available tenants...\\n'));\n\n const availableTenants = await tenantDiscovery();\n\n if (availableTenants.length === 0) {\n log(warning('No tenants found.'));\n return;\n }\n\n const selectedTenants = await checkbox({\n message: 'Select tenants to seed:',\n choices: availableTenants.map(id => ({ name: id, value: id })),\n pageSize: 15,\n });\n\n if (selectedTenants.length === 0) {\n log(warning('No tenants selected. Aborting.'));\n return;\n }\n\n discoveryFn = async () => selectedTenants;\n tenantIds = selectedTenants;\n } else {\n throw CLIErrors.noTenantSpecified();\n }\n }\n\n if (tenantIds.length === 0) {\n spinner.stop();\n log(warning('No tenants found.'));\n return;\n }\n\n spinner.text = `Found ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}`;\n spinner.succeed();\n\n log(info(`Seeding ${tenantIds.length} tenant${tenantIds.length > 1 ? 's' : ''}...\\n`));\n\n const migrator = createMigrator(config, {\n migrationsFolder: folder,\n ...(migrationsTable && { migrationsTable }),\n tenantDiscovery: discoveryFn,\n });\n\n const concurrency = parseInt(options.concurrency || '10', 10);\n\n // Use progress bar for interactive mode\n const progressBar = createProgressBar({ total: tenantIds.length });\n progressBar.start();\n\n const results = await migrator.seedAll(seedFn as any, {\n concurrency,\n onProgress: (tenantId: string, status: string) => {\n if (status === 'completed') {\n progressBar.increment({ tenant: tenantId, status: 'success' });\n debug(`Completed: ${tenantId}`);\n } else if (status === 'failed') {\n progressBar.increment({ tenant: tenantId, status: 'error' });\n debug(`Failed: ${tenantId}`);\n }\n },\n onError: (tenantId: string, err: Error) => {\n debug(`Error on ${tenantId}: ${err.message}`);\n return 'continue' as const;\n },\n });\n\n progressBar.stop();\n\n const totalDuration = Date.now() - startTime;\n\n // JSON output\n if (ctx.jsonMode) {\n const jsonOutput: SeedJsonOutput = {\n results: results.details.map(r => ({\n tenantId: r.tenantId,\n schema: r.schemaName,\n success: r.success,\n durationMs: r.durationMs,\n error: r.error,\n })),\n summary: {\n total: results.total,\n succeeded: results.succeeded,\n failed: results.failed,\n skipped: results.skipped,\n durationMs: totalDuration,\n },\n };\n outputJson(jsonOutput);\n process.exit(results.failed > 0 ? 1 : 0);\n }\n\n // Human-readable output\n log('\\n' + bold('Summary:'));\n log(` Total: ${results.total}`);\n log(` Succeeded: ${success(results.succeeded.toString())}`);\n if (results.failed > 0) {\n log(` Failed: ${error(results.failed.toString())}`);\n }\n if (results.skipped > 0) {\n log(` Skipped: ${warning(results.skipped.toString())}`);\n }\n log(` Duration: ${dim(formatDuration(totalDuration))}`);\n\n // Show failed tenants summary\n if (results.failed > 0) {\n log('\\n' + bold('Failed tenants:'));\n for (const detail of results.details.filter(d => !d.success)) {\n log(` ${error(detail.tenantId)}: ${dim(detail.error || 'Unknown error')}`);\n }\n log('\\n' + dim('Run with --verbose to see more details.'));\n }\n\n if (results.failed > 0) {\n process.exit(1);\n }\n } catch (err) {\n spinner.fail((err as Error).message);\n handleError(err);\n }\n });\n\n/**\n * Format duration in human-readable format\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n migrateCommand,\n statusCommand,\n syncCommand,\n diffCommand,\n generateCommand,\n tenantCreateCommand,\n tenantDropCommand,\n tenantCloneCommand,\n convertFormatCommand,\n initCommand,\n completionCommand,\n interactiveCommand,\n seedCommand,\n} from './commands/index.js';\nimport { initOutputContext } from './utils/output.js';\nimport { mainMenu } from './ui/menu.js';\n\n// Handle graceful exit on SIGINT (Ctrl+C)\nprocess.on('SIGINT', () => {\n console.log(chalk.cyan('\\n\\n Goodbye!\\n'));\n process.exit(0);\n});\n\n// Handle uncaught exceptions from Inquirer prompts\nprocess.on('uncaughtException', (error) => {\n if (error.name === 'ExitPromptError') {\n console.log(chalk.cyan('\\n\\n Goodbye!\\n'));\n process.exit(0);\n }\n console.error(chalk.red('\\nUnexpected error:'), error.message);\n process.exit(1);\n});\n\nconst program = new Command();\n\nprogram\n .name('drizzle-multitenant')\n .description('Multi-tenancy toolkit for Drizzle ORM')\n .version('1.1.0')\n .option('--json', 'Output as JSON (machine-readable)')\n .option('-v, --verbose', 'Show verbose output')\n .option('-q, --quiet', 'Only show errors')\n .option('--no-color', 'Disable colored output')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.opts();\n initOutputContext({\n json: opts.json,\n verbose: opts.verbose,\n quiet: opts.quiet,\n noColor: opts.color === false,\n });\n });\n\n// Customize help output with examples\nprogram.addHelpText('after', `\nExamples:\n $ drizzle-multitenant # Launch interactive mode\n $ drizzle-multitenant interactive # Launch interactive mode\n $ drizzle-multitenant status\n $ drizzle-multitenant migrate --all\n $ drizzle-multitenant migrate --tenant=my-tenant --dry-run\n $ drizzle-multitenant generate --name add-users-table\n $ drizzle-multitenant tenant:create --id new-tenant\n $ drizzle-multitenant status --json | jq '.summary'\n\nDocumentation:\n https://github.com/mateusflorez/drizzle-multitenant\n`);\n\n// Register commands\nprogram.addCommand(migrateCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(syncCommand);\nprogram.addCommand(diffCommand);\nprogram.addCommand(generateCommand);\nprogram.addCommand(tenantCreateCommand);\nprogram.addCommand(tenantDropCommand);\nprogram.addCommand(tenantCloneCommand);\nprogram.addCommand(convertFormatCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(completionCommand);\nprogram.addCommand(interactiveCommand);\nprogram.addCommand(seedCommand);\n\n// Default action: launch interactive mode when no command is specified\nprogram.action(async () => {\n await mainMenu();\n});\n\n// Parse arguments\nprogram.parse();\n"]}