init function

Future<void> init(
  1. String projectName,
  2. List<String> dependencies
)

Implementation

Future<void> init(String projectName, List<String> dependencies) async {
  print('🎉 Initializing project: $projectName');

  final createResult = await Process.run('flutter', ['create', projectName]);
  stdout.write(createResult.stdout);
  stderr.write(createResult.stderr);

  if (createResult.exitCode != 0) {
    print('❌ Failed to create project: $projectName');

    return;
  }

  // Dependencies
  final allDependencies = {
    'dio',
    'google_fonts',
    'flutter_dotenv',
    'flutter_secure_storage',
    'go_router',
    ...dependencies.map((dep) => dep.split(':').first.trim())
  };

  final pubAdd = await Process.run(
    'flutter',
    ['pub', 'add', ...allDependencies],
    workingDirectory: projectName,
  );
  stdout.write(pubAdd.stdout);
  stderr.write(pubAdd.stderr);

  print('📦 Installed dependencies: ${allDependencies.join(', ')}');


  print('📦 Added dependencies: ${dependencies.join(', ')}');

  final libPath = p.join(projectName, 'lib');
  final folders = [
    'config/routes',
    'config/theme',
    'config/env',
    'config/storage',
    'core/error',
    'core/datasources/local',
    'core/datasources/remote',
    'core/entities',
    'core/models',
    'core/utils/constants',
    'core/usecases',
    'features',
  ];

  for (final folder in folders) {
    final dir = Directory(p.join(libPath, folder));
    if (!dir.existsSync()) {
      dir.createSync(recursive: true);
    }
  }
  print('📁 Created required directories in lib');

  final mainFile = File(p.join(libPath, 'main.dart'));
  mainFile.writeAsStringSync(mainTemplate(projectName));

  final testFile = File(p.join(projectName, 'test', 'widget_test.dart'));
  testFile.writeAsStringSync(testTemplate(projectName));

  print('✅ Updated main.dart with clean architecture entry');

  // AppTheme
  final themeFile = File(p.join(libPath, 'config/theme/app_theme.dart'));
  final primaryColor =
      StringUtils.prompt(
        '🎨 Enter primary color hex (default: 0xFF2196F3):',
      )?.trim();
  final colorValue =
      primaryColor?.isNotEmpty == true ? primaryColor : '0xFF2196F3';

  themeFile.writeAsStringSync(
    themeTemplate().replaceAll('{{primaryColor}}', colorValue!),
  );
  print('🎨 Created app_theme.dart with primary color $colorValue');

  final appName = "{{projectName}}";

  // env file
  final envFile = File(p.join(projectName, '.env'));
  envFile.writeAsStringSync(envTemplate());

  // config/env/env.config.dart
  final envConfigFile = File(p.join(libPath, 'config/env/env.config.dart'));
  envConfigFile.writeAsStringSync(envConfigTemplate());

  // config/routes/app_routes.dart
  final routesFile = File(p.join(libPath, 'config/routes/app_routes.dart'));
  routesFile.writeAsStringSync(appRoutesTemplate());

  // config/storage/local_storage.dart
  final storageFile = File(
    p.join(libPath, 'config/storage/local_storage.dart'),
  );
  storageFile.writeAsStringSync(localStorageTemplate());

  // config/routes/navigate.dart
  final navigateFile = File(p.join(libPath, 'config/routes/navigate.dart'));
  navigateFile.writeAsStringSync(navigateTempalate());

  // core/utils/constants/api_endpoints.dart
  final apiEndpointsFile = File(
    p.join(libPath, 'core/utils/constants/api_endpoints.dart'),
  );
  apiEndpointsFile.writeAsStringSync(
    apiEndPointTemplate().replaceAll(appName, projectName),
  );

  // core/datasources/remote/api_client.dart
  final apiClientFile = File(
    p.join(libPath, 'core/datasources/remote/api_client.dart'),
  );
  apiClientFile.writeAsStringSync(
    apiClientTemplate().replaceAll(appName, projectName),
  );

  // core/entities/api_entity.dart
  final apiEntityFile = File(p.join(libPath, 'core/entities/api_entity.dart'));
  apiEntityFile.writeAsStringSync(apiEntityTemplate());

  // core/models/api_model.dart
  final apiModelFile = File(p.join(libPath, 'core/models/api_model.dart'));
  apiModelFile.writeAsStringSync(
    apiResponseTemplate().replaceAll(appName, projectName),
  );

  // core/datasources/local/user_token.dart
  final userTokenFile = File(
    p.join(libPath, 'core/datasources/local/user_token.dart'),
  );
  userTokenFile.writeAsStringSync(
    tokenStorageTemplate().replaceAll(appName, projectName),
  );

  print(
    '🎉 Project "$projectName" initialized successfully with Clean Architecture!',
  );
  return;
}