import 'dart:async';
import 'dart:io';
import 'package:io/io.dart' as io;
import 'package:path/path.dart' as p;
Future<void> main(List<String> args) async {
final Directory goRouterPackageRoot = File.fromUri(
Platform.script,
).parent.parent;
final Directory testTempDir = await Directory.systemTemp.createTemp();
Future<Never> cleanUpAndExit(int statusCode) async {
await testTempDir.delete(recursive: true);
exit(statusCode);
}
await _prepareTemplate(
packageRoot: goRouterPackageRoot,
testTempDir: testTempDir,
);
final int pubGetStatusCode = await _runProcess('dart', <String>[
'pub',
'get',
], workingDirectory: testTempDir.path);
if (pubGetStatusCode != 0) {
await cleanUpAndExit(pubGetStatusCode);
}
final int dartFixStatusCode = await _runProcess('dart', <String>[
'fix',
'--compare-to-golden',
], workingDirectory: testTempDir.path);
await cleanUpAndExit(dartFixStatusCode);
}
Future<void> _prepareTemplate({
required Directory packageRoot,
required Directory testTempDir,
}) async {
final testFixesSrcDir = Directory(p.join(packageRoot.path, 'test_fixes'));
await io.copyPath(testFixesSrcDir.path, testTempDir.path);
final targetPubspecFile = File(p.join(testTempDir.path, 'pubspec.yaml'));
final targetYaml =
'''
name: test_fixes
publish_to: "none"
version: 1.0.0
environment:
sdk: ">=2.18.0 <4.0.0"
flutter: ">=3.3.0"
dependencies:
flutter:
sdk: flutter
go_router:
path: ${packageRoot.path}
''';
await targetPubspecFile.writeAsString(targetYaml);
}
Future<Process> _streamOutput(Future<Process> processFuture) async {
final Process process = await processFuture;
unawaited(stdout.addStream(process.stdout));
unawaited(stderr.addStream(process.stderr));
return process;
}
Future<int> _runProcess(
String command,
List<String> arguments, {
String? workingDirectory,
}) async {
final Process process = await _streamOutput(
Process.start(command, arguments, workingDirectory: workingDirectory),
);
return process.exitCode;
}