Files
opendance-web/web-server/scripts/migrate.mjs
T

42 lines
1.6 KiB
JavaScript
Executable File

#!/usr/bin/env node
/**
* 跨环境 TypeORM migration 入口。
*
* - 生产(存在 dist/db/data-source.js):使用 typeorm CLI + 编译产物,无需 ts-node
* - 开发(无 dist):使用 typeorm-ts-node-commonjs + src/*.ts
*
* 这样 `npm run migration:run` 在本地与 Docker 容器内行为一致。
*
* 用法:
* node scripts/migrate.mjs run|revert|show|generate [额外参数]
*/
import { spawnSync } from 'node:child_process';
import { existsSync } from 'node:fs';
import { join } from 'node:path';
const command = process.argv[2];
const extra = process.argv.slice(3);
if (!command) {
console.error('用法:node scripts/migrate.mjs <run|revert|show|generate> [args]');
process.exit(2);
}
const binDir = join(process.cwd(), 'node_modules', '.bin');
const suffix = process.platform === 'win32' ? '.cmd' : '';
const hasDist = existsSync(join(process.cwd(), 'dist', 'db', 'data-source.js'));
const bin = hasDist ? `typeorm${suffix}` : `typeorm-ts-node-commonjs${suffix}`;
const dataSource = hasDist ? 'dist/db/data-source.js' : 'src/db/data-source.ts';
if (!hasDist && command !== 'generate' && !existsSync(join(process.cwd(), 'node_modules', 'ts-node'))) {
console.error('未找到编译产物 dist/,且未安装 ts-node。请先 npm run build。');
process.exit(1);
}
const args = [join(binDir, bin), '-d', dataSource, `migration:${command}`, ...extra];
console.log(`[migrate] ${bin} -d ${dataSource} migration:${command} ${extra.join(' ')}`.trim());
const result = spawnSync(args[0], args.slice(1), { stdio: 'inherit' });
process.exit(result.status ?? 1);