createMigration method

Future<MigrationVersionArtifacts?> createMigration({
  1. String? tag,
  2. required bool force,
  3. required GeneratorConfig config,
  4. bool write = true,
})

Implementation

Future<MigrationVersionArtifacts?> createMigration({
  String? tag,
  required bool force,
  required GeneratorConfig config,
  bool write = true,
}) async {
  var versions = await _artifactStore.listVersions();
  var latestVersion = versions.lastOrNull;

  var databaseDefinitionLatest = await _getSourceDatabaseDefinition(
    projectName,
    latestVersion,
  );

  var models = await ModelHelper.loadProjectYamlModelsFromDisk(
    config,
  );
  var modelDefinitions = StatefulAnalyzer(config, models, (uri, collector) {
    collector.printErrors();

    if (collector.hasSevereErrors) {
      throw GenerateMigrationDatabaseDefinitionException();
    }
  }).validateAll();

  var databaseDefinitionProject = createDatabaseDefinitionFromModels(
    modelDefinitions,
    config.name,
    config.modulesAll,
    dialect: config.databaseDialect,
  );

  var databaseDefinitions = await _loadModuleDatabaseDefinitions(
    config.modulesDependent,
    directory,
  );

  var versionName = createVersionName(tag);
  var nextMigrationVersion = DatabaseMigrationVersionModel(
    module: projectName,
    version: versionName,
  );

  var databaseDefinitionNext = _mergeDatabaseDefinitions(
    databaseDefinitionProject,
    databaseDefinitions,
    nextMigrationVersion,
  );

  var migration = generateDatabaseMigration(
    databaseSource: databaseDefinitionLatest,
    databaseTarget: databaseDefinitionNext,
  );

  var warnings = migration.warnings;
  _printWarnings(warnings);

  if (warnings.isNotEmpty && !force) {
    log.info('Migration aborted. Use --force to ignore warnings.');
    throw const MigrationAbortedException();
  }

  if (migration.isEmpty) {
    log.info(
      'No changes detected.',
    );
    return null;
  }

  var sqlGenerator = SqlGenerator.forDialect(config.databaseDialect);

  var artifacts = MigrationVersionArtifacts(
    version: versionName,
    definitionSql: sqlGenerator.generateDatabaseDefinitionSql(
      databaseDefinitionNext,
      installedModules: databaseDefinitionNext.installedModules,
    ),
    migrationSql: sqlGenerator.generateDatabaseMigrationSql(
      migration,
      databaseDefinitionNext,
      installedModules: databaseDefinitionNext.installedModules,
      removedModules: _removedModulesDiff(
        databaseDefinitionLatest.installedModules,
        databaseDefinitionNext.installedModules,
      ),
    ),
    definition: databaseDefinitionNext,
    projectDefinition: databaseDefinitionProject,
    migration: migration,
  );

  if (write) {
    await _artifactStore.writeVersion(artifacts);
    versions.add(versionName);
    await _artifactStore.writeVersionRegistry(versions);
  }

  return artifacts;
}