execute method

  1. @override
Future<int> execute(
  1. List<String> arguments
)
override

Implementation

@override
Future<int> execute(List<String> arguments) async {
  if (arguments.isNotEmpty) {
    Console.error('make:auth does not accept arguments.');
    return ExitCode.usage;
  }

  const fileName = 'create_personal_access_tokens_table.dart';
  final file = File(
    '${workingDirectory.path}/lib/database/migrations/$fileName',
  );
  if (file.existsSync()) {
    Console.error('The personal access tokens migration already exists.');
    return ExitCode.failure;
  }

  await file.create(recursive: true);
  await file.writeAsString(authMigrationContent);
  final migrate = File(
    '${workingDirectory.path}/lib/database/migrations/migrate.dart',
  );
  if (!migrate.existsSync()) {
    Console.warn(
      'migrate.dart was not found; register the migration manually.',
    );
    return ExitCode.success;
  }

  var source = await migrate.readAsString();
  final imports = RegExp(r'import .+;').allMatches(source).toList();
  if (imports.isEmpty) {
    Console.warn('No import block was found in migrate.dart.');
    return ExitCode.success;
  }
  source = source.replaceFirst(
    imports.last.group(0)!,
    "${imports.last.group(0)}\nimport '$fileName';",
  );

  final registry = RegExp(
    r'migrationRegister\s*\(\s*\[\s*([\s\S]*?)\s*\]\s*\)',
    multiLine: true,
  );
  final match = registry.firstMatch(source);
  if (match == null) {
    Console.warn('migrationRegister([...]) was not found in migrate.dart.');
    await migrate.writeAsString(source);
    return ExitCode.success;
  }

  final existing = (match.group(1) ?? '').trim().replaceFirst(
    RegExp(r',\s*$'),
    '',
  );
  final entries = [
    if (existing.isNotEmpty) existing,
    'CreatePersonalAccessTokensTable()',
  ].join(',\n      ');
  source = source.replaceFirst(
    registry,
    'migrationRegister([\n      $entries,\n    ])',
  );
  await migrate.writeAsString(source);
  Console.success('Authentication migration created');
  return ExitCode.success;
}