generate method

Future<int> generate(
  1. List<SupabaseTableInfo> currentTables
)

Generates Dart migration files based on schema changes. Returns the highest migration version number generated.

Implementation

Future<int> generate(List<SupabaseTableInfo> currentTables) async {
  if (!config.generateSqliteMigrations) {
    _logger.info('SQLite migration generation is disabled. Skipping.');
    return schemaVersionManager
        .currentSchemaVersion; // Return current known version
  }

  await schemaVersionManager.loadPreviousSchemas();
  final previousVersion = schemaVersionManager.currentSchemaVersion;
  final List<SupabaseTableInfo>? previousTables =
      schemaVersionManager.previousSchemaStates[previousVersion];

  int latestVersionGenerated = previousVersion;

  if (previousVersion == 1 || previousTables == null) {
    _logger.info('No previous schema found. Generating initial schema...');
    final sqlStatements = _generateInitialSchemaSql(currentTables); // Changed
    await _writeDartMigrationFile(1, sqlStatements); // Changed
    await schemaVersionManager.saveSchemaVersion(
      1,
      currentTables,
    ); // Save state
    latestVersionGenerated = 1;
    _logger.info('Initial schema generated as migration_v0001.dart.');
  } else {
    _logger.info('Comparing current schema with version $previousVersion...');
    final diff = _diffSchemas(previousTables, currentTables);

    if (!diff.hasChanges) {
      _logger.info('No schema changes detected.');
      return previousVersion; // No new version generated
    }

    final nextVersion = previousVersion + 1;
    _logger.info(
      'Schema changes detected. Generating migration for version $nextVersion...',
    );
    final sqlStatements = _generateMigrationSql(nextVersion, diff); // Changed
    await _writeDartMigrationFile(nextVersion, sqlStatements); // Changed
    await schemaVersionManager.saveSchemaVersion(
      nextVersion,
      currentTables,
    ); // Save state
    latestVersionGenerated = nextVersion;
    _logger.info(
      'Migration file generated as migration_v${nextVersion.toString().padLeft(4, '0')}.dart.',
    );
    _logUnsupportedChanges(diff);
  }
  return latestVersionGenerated;
}