2
0

migrations.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import type { MigrationLiveDefinition } from '@d8d-appcontainer/types'
  2. // 动态加载迁移文件
  3. const migrations: MigrationLiveDefinition[] = [];
  4. try {
  5. // 读取并加载所有迁移文件
  6. const migrationsDir = import.meta.dirname + '/migrations';
  7. for await (const entry of Deno.readDir(migrationsDir)) {
  8. if (!entry.isFile || !entry.name.endsWith('.ts')) continue;
  9. // 匹配文件名格式:数字前缀_描述.ts
  10. const match = entry.name.match(/^(\d+)_(.+)\.ts$/);
  11. if (!match) continue;
  12. const [_, prefix, name] = match;
  13. try {
  14. const migration = await import(`${migrationsDir}/${entry.name}`);
  15. // 确保导出的迁移对象有效
  16. if (migration?.default?.name && migration?.default?.up && migration?.default?.down) {
  17. migrations.push(migration.default);
  18. console.log(`✅ Loaded migration: ${entry.name}`);
  19. } else {
  20. console.warn(`⚠️ Invalid migration format in ${entry.name}`);
  21. }
  22. } catch (err) {
  23. console.error(`❌ Failed to load migration ${entry.name}:`, err);
  24. }
  25. }
  26. // 按数字前缀排序
  27. migrations.sort((a, b) => {
  28. const aNum = parseInt(a.name.match(/^(\d+)_/)?.[1] || '0');
  29. const bNum = parseInt(b.name.match(/^(\d+)_/)?.[1] || '0');
  30. return aNum - bNum;
  31. });
  32. console.log(`🎉 Successfully loaded ${migrations.length} migrations`);
  33. } catch (err) {
  34. console.error('❌ Failed to load migrations:', err);
  35. }
  36. // 导出所有迁移
  37. export { migrations };