wyatt-bricks/tools/brick_generator/bin/brick_generator.dart

103 lines
3.3 KiB
Dart

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<void> main(List<String> 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<File>()
.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);
}