103 lines
3.3 KiB
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);
|
|
}
|