createNewFeature function
Implementation
Future<void> createNewFeature(String featureName) async {
String destinationPath = 'lib/features/$featureName';
String currentFilePath = Platform.script.toFilePath();
List<String> pathSegments = currentFilePath.split(Platform.pathSeparator);
if (pathSegments.length > 2) {
pathSegments.removeRange(pathSegments.length - 5, pathSegments.length);
}
String packageName = 'jt_flutter_cli';
String version = getPackageVersion(packageName);
String dependencyName = '$packageName-$version';
String pubCachePath = Platform.environment['PUB_CACHE'] ??
'${Platform.environment['HOME']}/.pub-cache';
String dependencyPath =
path.join(pubCachePath, 'hosted', 'pub.dev', dependencyName);
if (!Directory(dependencyPath).existsSync()) {
print('Dependency $dependencyName not found in .pub-cache directory');
return;
}
String dependencyLibPath = path.join(dependencyPath, 'lib');
if (!Directory(dependencyLibPath).existsSync()) {
print('Dependency $dependencyName does not contain a lib folder');
return;
}
String sourceFolderPath = '$dependencyLibPath/create_feature/basic_structure';
grantPermissions(sourceFolderPath);
if (!Directory(sourceFolderPath).existsSync()) {
print('Error: $sourceFolderPath folder does not exist');
return;
}
Directory destinationDirectory = Directory(destinationPath);
if (destinationDirectory.existsSync()) {
print(
'Error: Destination feature directory already exists. Please choose a different feature name');
return;
}
try {
await copyFolder(sourceFolderPath, destinationPath);
processFiles(destinationPath, '/*', '', false);
processFiles(destinationPath, '*/', '', false);
renameFilesWithSubstring(destinationPath, 'basic_structure', featureName);
processFiles(destinationPath, 'BasicStructure', featureName, true);
processFiles(
destinationPath, 'basic_structure', featureName.toLowerCase(), false);
String? name = getPubspecInfo('name');
if (name != null) {
processFiles(destinationPath, 'flutter_clean_architecture', name, false);
}
final nameOfFeature = featureName.toLowerCase();
String pascalCase = toPascalCase(nameOfFeature);
final filePath = 'lib/core/di/';
final repoImport =
"import 'package:${name ?? ''}/features/$nameOfFeature/domain/repositories/${nameOfFeature}_repo.dart';";
final diGetterImports = [repoImport];
final diGetterStatements = ["${pascalCase}Repo get${pascalCase}Repo();"];
addImportAndChangesInFile(
'$filePath/di_getter.dart', diGetterImports, diGetterStatements);
final mockDiGetterImports = [
"import 'package:${name ?? ''}/features/$nameOfFeature/data/repository/mock_${nameOfFeature}_repo_impl.dart';",
repoImport
];
final mockDiGetterStatements = [
"${pascalCase}Repo get${pascalCase}Repo() => Mock${pascalCase}RepoImpl(sl(), sl());"
];
addImportAndChangesInFile('$filePath/mock_di_getter.dart',
mockDiGetterImports, mockDiGetterStatements);
final prodDiGetterImports = [
"import 'package:${name ?? ''}/features/$nameOfFeature/data/repository/${nameOfFeature}_repo_impl.dart';",
repoImport
];
final prodDiGetterStatements = [
"${pascalCase}Repo get${pascalCase}Repo() => ${pascalCase}RepoImpl(sl(), sl());"
];
addImportAndChangesInFile('$filePath/prod_di_getter.dart',
prodDiGetterImports, prodDiGetterStatements);
final injectionContainerImports = [
"import 'package:${name ?? ''}/features/$nameOfFeature/data/data_source/${nameOfFeature}_data_source.dart';",
"import 'package:${name ?? ''}/features/$nameOfFeature/data/data_source/${nameOfFeature}_data_source_impl.dart';"
];
final injectionContainerStatements = [
"sl.registerLazySingleton<${pascalCase}DataSource>("
"() => ${pascalCase}DataSourceImpl(remoteDataSource: sl()),"
");"
];
addImportAndChangesInFile('$filePath/injection_container.dart',
injectionContainerImports, injectionContainerStatements);
print('Feature $featureName created');
} catch (e) {
print('Error copying folder: $e');
}
}