import 'dart:io'; import 'package:brick_generator/shell.dart'; import 'package:path/path.dart' as path; // Constants final _apps = 'apps'; final _bricks = 'bricks'; final _staticDir = path.join('tools', 'brick_generator', 'assets'); Future main(List arguments) async { final _appName = arguments[0]; final _projectSnakeName = arguments[1]; final _projectParamName = arguments[2]; final _projectTitleName = arguments[3]; final _orgName = arguments[4]; final _sourcePath = path.join(_apps, _appName); final _targetPath = path.join(_bricks, _appName, '__brick__'); final _androidPath = path.join(_targetPath, 'android'); final _androidKotlinPath = path.join(_androidPath, 'app', 'src', 'main', 'kotlin'); final _orgPath = path.join(_androidKotlinPath, 'com'); // Remove Previously Generated Files final targetDir = Directory(_targetPath); if (targetDir.existsSync()) { await targetDir.delete(recursive: true); } // Copy Project Files await Shell.cp(_sourcePath, _targetPath); // Delete Android's Organization Folder Hierarchy Directory(_orgPath).deleteSync(recursive: true); // Convert Values to Variables await Future.wait( Directory(_targetPath) .listSync(recursive: true) .whereType() .map((_) async { var file = _; try { if (path.extension(file.path) == '.dart') { final contents = await file.readAsString(); file = await file.writeAsString(contents); } final contents = await file.readAsString(); file = await file.writeAsString( contents .replaceAll( _projectSnakeName, '{{#snakeCase}}{{project_name}}{{/snakeCase}}', ) .replaceAll( _projectParamName, '{{#paramCase}}{{project_name}}{{/paramCase}}', ) .replaceAll('A new Flutter project.', '{{{description}}}') .replaceAll( _projectTitleName, '{{#titleCase}}{{project_name}}{{/titleCase}}', ) .replaceAll( _orgName, path.isWithin(_androidPath, file.path) ? '{{#dotCase}}{{org_name}}{{/dotCase}}.{{#snakeCase}}{{project_name}}{{/snakeCase}}' : '{{#dotCase}}{{org_name}}{{/dotCase}}.{{#paramCase}}{{project_name}}{{/paramCase}}', ), ); final fileSegments = file.path.split('/').sublist(2); if (fileSegments.contains(_projectSnakeName)) { final newPathSegment = fileSegments.join('/').replaceAll( _projectSnakeName, '{{#snakeCase}}{{project_name}}{{/snakeCase}}', ); final newPath = path.join(_targetPath, newPathSegment); File(newPath).createSync(recursive: true); file.renameSync(newPath); Directory(file.parent.path).deleteSync(recursive: true); } } catch (_) {} }), ); final mainActivityKt = File( path.join( _androidKotlinPath, '{{#pathCase}}{{org_name}}{{/pathCase}}', 'MainActivity.kt', ), ); await Shell.mkdir(mainActivityKt.parent.path); await Shell.cp(path.join(_staticDir, 'MainActivity.kt'), mainActivityKt.path); }