execute method
Implementation
@override
void execute(List<String> arguments) {
if (arguments.isEmpty) {
print(' What should the seeder be named?');
stdout.write('\x1B[1m > \x1B[0m');
arguments.add(stdin.readLineSync()!);
}
RegExp alphaRegex = RegExp(r'^[A-Za-z][A-Za-z_]*$');
if (!alphaRegex.hasMatch(arguments[0])) {
print(
' \x1B[41m\x1B[37m ERROR \x1B[0m Seeder must contain only letters a-z and optional _',
);
exit(0);
}
// Check for factory flag
String? factoryName;
bool hasFactory = false;
for (int i = 0; i < arguments.length; i++) {
if (arguments[i] == '--factory' && i + 1 < arguments.length) {
factoryName = arguments[i + 1];
hasFactory = true;
break;
}
}
List fileName = arguments[0].toLowerCase().split(RegExp(r'[/]'));
String seederName = fileName[fileName.length - 1];
String secondPath = "";
if (fileName.length > 1) {
fileName.remove(fileName[fileName.length - 1]);
secondPath = fileName.join("/");
secondPath = secondPath.endsWith("/") ? secondPath : "$secondPath/";
}
String controllerPath =
'${Directory.current.path}/lib/database/seeders/$secondPath${seederName.snakeCase}.dart';
File newFile = File(controllerPath);
if (newFile.existsSync()) {
print(' \x1B[41m\x1B[37m ERROR \x1B[0m Seeder already exists.');
exit(0);
}
newFile.createSync(recursive: true);
String str;
if (hasFactory && factoryName != null) {
// Create factory file first
String factoryPath =
'${Directory.current.path}/lib/database/factory/${factoryName.snakeCase}.dart';
File factoryFile = File(factoryPath);
if (!factoryFile.existsSync()) {
factoryFile.createSync(recursive: true);
String factoryContent = factoryStub.replaceAll(
'factoryName',
factoryName.pascalCase,
);
factoryFile.writeAsString(factoryContent);
print(
' \x1B[44m\x1B[37m INFO \x1B[0m Factory [$factoryPath] created successfully.',
);
}
// Create seeder with factory
str = seederWithFactoryStubs
.replaceAll('seederName', seederName.pascalCase)
.replaceAll('factoryName', factoryName.pascalCase)
.replaceAll('factoryFileName', factoryName.snakeCase);
} else {
str = seederStubs.replaceAll('seederName', seederName.pascalCase);
}
newFile.writeAsString(str);
///Register new seeder file into main database seeder file
File databaseSeederFile = File(
'${Directory.current.path}/lib/database/seeders/database_seeder.dart',
);
if (!databaseSeederFile.existsSync()) {
databaseSeederFile.createSync(recursive: true);
} else {
seedersFileContents = databaseSeederFile.readAsStringSync();
}
final importRegExp = RegExp(r'import .+;');
final seederRegisterRegex = RegExp(
r'seeders:\s*\[\s*([\s\S]*?)\s*\]',
multiLine: true,
);
// Find import statement and append new import
var importMatch = importRegExp.allMatches(seedersFileContents);
if (importMatch.isNotEmpty) {
seedersFileContents = seedersFileContents.replaceFirst(
importMatch.last.group(0).toString(),
"${importMatch.last.group(0)}\nimport '${seederName.snakeCase}.dart';",
);
}
// Find seeders array and replace with modified version
Match? seederRegisterMatch = seederRegisterRegex.firstMatch(
seedersFileContents,
);
if (seederRegisterMatch != null) {
String existingSeeders = seederRegisterMatch.group(1)?.trim() ?? '';
String newSeeders;
if (existingSeeders.isEmpty) {
newSeeders = '${seederName.pascalCase}()';
} else {
// Remove trailing comma if exists
existingSeeders = existingSeeders.replaceAll(RegExp(r',\s*$'), '');
newSeeders = '$existingSeeders,\n ${seederName.pascalCase}()';
}
seedersFileContents = seedersFileContents.replaceAll(
seederRegisterRegex,
'seeders: [\n $newSeeders,\n ]',
);
}
databaseSeederFile.writeAsStringSync(seedersFileContents);
print(
' \x1B[44m\x1B[37m INFO \x1B[0m Seeder [$controllerPath] created successfully.',
);
}