#!/usr/bin/env node import { readFile } from 'node:fs/promises'; import path from 'node:path'; import { assertReadableFile, callSpacetimeProcedureAuto, ensureProcedureOk, parseArgs, } from './spacetime-migration-common.mjs'; try { const options = parseArgs(process.argv.slice(2)); if (!options.in) { throw new Error('必须传入 --in。'); } const inPath = path.resolve(options.in); await assertReadableFile(inPath); const migrationJson = await readFile(inPath, 'utf8'); if (!migrationJson.trim()) { throw new Error(`迁移文件为空: ${inPath}`); } const input = { migration_json: migrationJson, include_tables: options.includeTables, replace_existing: options.replaceExisting === true, dry_run: options.dryRun === true, }; const result = await callSpacetimeProcedureAuto( options, 'import_database_migration_from_file', input, ); ensureProcedureOk(result); console.log( `[spacetime:migration:import] ${options.dryRun ? 'dry-run 完成' : '导入完成'}: ${inPath}`, ); printTableStats(result.table_stats); } catch (error) { console.error( `[spacetime:migration:import] ${error instanceof Error ? error.message : String(error)}`, ); process.exit(1); } function printTableStats(tableStats) { if (!Array.isArray(tableStats) || tableStats.length === 0) { return; } const rows = tableStats.map((stat) => ({ table: stat.table_name, imported: stat.imported_row_count, skipped: stat.skipped_row_count, })); console.table(rows); }