createNewFeature function

Future<void> createNewFeature(
  1. String featureName
)

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');
  }
}