drizzle-multitenant 1.0.8 → 1.0.10

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/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","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} 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 * 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 * 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/**\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('--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`)\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 log(info(`Migrating ${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 results = await migrator.migrateAll({\n concurrency,\n dryRun: !!options.dryRun,\n onProgress: (tenantId, status, migrationName) => {\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 debug(`${tenantId}: Applying ${migrationName}`);\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 // 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 { 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 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(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/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"]}