injectCleanArchitecture function

Future<void> injectCleanArchitecture(
  1. String projectName,
  2. String state, {
  3. Map<String, String>? colors,
})

Implementation

Future<void> injectCleanArchitecture(
  String projectName,
  String state, {
  Map<String, String>? colors,
}) async {
  final libPath = Directory(p.join(projectName, 'lib'));

  if (libPath.existsSync()) {
    libPath.deleteSync(recursive: true);
  }

  // ✅ DELETE DEFAULT FLUTTER TEST FILE (ADD HERE)
  final defaultTestFile = File(p.join(projectName, 'test', 'widget_test.dart'));

  if (defaultTestFile.existsSync()) {
    defaultTestFile.deleteSync();
  }

  final folders = [
    'core/config',
    'core/network',
    'core/services',
    'core/constants',
    'core/utils',
    'data/models',
    'data/repositories',
    'data/sources',
    'domain/entities',
    'domain/usecases',
    'presentation/pages',
    'presentation/widgets',
    'routes',
    'app', // ✅ New app layer
  ];

  for (var folder in folders) {
    Directory(p.join(projectName, 'lib', folder)).createSync(recursive: true);
  }

  await installStateManagement(projectName, state);

  // ==============================
  // app/bootstrap.dart
  // ==============================

  final bootstrapContent = state == 'riverpod'
      ? '''
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'app.dart';

Future<void> bootstrap({required String flavor}) async {

  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    ProviderScope(
      child: MyApp(flavor: flavor),
    ),
  );

}
'''
      : '''
import 'package:flutter/material.dart';
import 'app.dart';

Future<void> bootstrap({required String flavor}) async {

  WidgetsFlutterBinding.ensureInitialized();

  runApp(MyApp(flavor: flavor));

}
''';

  safeWriteFile(
      p.join(projectName, 'lib', 'app', 'bootstrap.dart'), bootstrapContent,
      projectPath: projectName);

  // ==============================
  // core/utils/responsive_size.dart
  // ==============================

  safeWriteFile(
      p.join(projectName, 'lib', 'core', 'utils', 'responsive_size.dart'),
      getCoreUtilsResponsiveSizeTemplate(projectName),
      projectPath: projectName);

  // ==============================
  // core/theme/app_colors.dart
  // ==============================

  Directory(p.join(projectName, 'lib', 'core', 'theme')).createSync(recursive: true);
  safeWriteFile(
      p.join(projectName, 'lib', 'core', 'theme', 'app_colors.dart'),
      getCoreThemeAppColorsTemplate(projectName, colors: colors),
      projectPath: projectName);

  // ==============================
  // app/app.dart
  // ==============================

  safeWriteFile(p.join(projectName, 'lib', 'app', 'app.dart'), '''
import 'package:flutter/material.dart';
import 'package:$projectName/core/utils/responsive_size.dart';

class MyApp extends StatelessWidget {
  final String flavor;

  const MyApp({super.key, required this.flavor});

  @override
  Widget build(BuildContext context) {
    Responsive.init(context);
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: Text(
            flavor.toUpperCase(),
            style: const TextStyle(fontSize: 24),
          ),
        ),
      ),
    );
  }
}
''');

  Directory(p.join(projectName, 'test')).createSync(recursive: true);

  File(p.join(projectName, 'test', 'app_test.dart')).writeAsStringSync('''
import 'package:flutter_test/flutter_test.dart';
import 'package:$projectName/app/app.dart';

void main() {
  testWidgets('App renders flavor', (tester) async {
    await tester.pumpWidget(
      const MyApp(flavor: 'dev'),
    );

    expect(find.text('DEV'), findsOneWidget);
  });
}
''');

  // ==============================
  // main_dev.dart
  // ==============================

  safeWriteFile(p.join(projectName, 'lib', 'main_dev.dart'), '''
import 'app/bootstrap.dart';

void main() {
  bootstrap(flavor: 'dev');
}
''');

  // ==============================
  // main_prod.dart
  // ==============================

  safeWriteFile(p.join(projectName, 'lib', 'main_prod.dart'), '''
import 'app/bootstrap.dart';

void main() {
  bootstrap(flavor: 'prod');
}
''');

  print('✅ Clean architecture injected (enterprise pattern).');
}