From 22b13b97203df66b28049e83059c45a74a5b5f37 Mon Sep 17 00:00:00 2001
From: Nate Anderson <nate.anderson@vasion.com>
Date: Thu, 6 Feb 2025 17:36:53 -0700
Subject: [PATCH] touchups on the scripts

---
 backend/pubspec.yaml                  |  4 +-
 backend/scripts/run_build_runner.dart | 68 ++++++++++++++++++---------
 backend/scripts/test_runner.dart      | 39 +++++++++++----
 frontend/pubspec.lock                 |  8 ----
 4 files changed, 79 insertions(+), 40 deletions(-)

diff --git a/backend/pubspec.yaml b/backend/pubspec.yaml
index ec2d7f4..feb38ed 100644
--- a/backend/pubspec.yaml
+++ b/backend/pubspec.yaml
@@ -28,8 +28,8 @@ dev_dependencies:
   very_good_analysis: ^5.1.0
 
 scripts:
-  run_build: dart scripts/run_build_runner.dart
-  run_watch: dart scripts/run_build_runner.dart --watch
+  runner_build: dart scripts/run_build_runner.dart
+  runner_watch: dart scripts/run_build_runner.dart --watch
   build: dart_frog build
   dev: dart_frog dev
   e2e: dart scripts/test_runner.dart
diff --git a/backend/scripts/run_build_runner.dart b/backend/scripts/run_build_runner.dart
index 432c82c..f59abb6 100644
--- a/backend/scripts/run_build_runner.dart
+++ b/backend/scripts/run_build_runner.dart
@@ -54,20 +54,23 @@ void main(List<String> args) async {
 Future<void> runBuildRunner(String packagePath, {required bool watch}) async {
   final package = packagePath.split('/').last;
   print('📦 Starting build_runner for $package...');
-  Future<(Process, bool)> buildRunnerFunc() => watch ? _runBuildRunnerWatch(packagePath) : _runBuildRunner(packagePath);
+  Future<(Process, bool, String)> buildRunnerFunc() =>
+      watch ? _runBuildRunnerWatch(packagePath) : _runBuildRunner(packagePath);
   const maxAttempts = 5;
 
   Future<void> attemptRecover(Object? e, int i) async {
     try {
-      print('\n⚠️  Error in $package:\n$e\nAttempting recovery (${i + 1} / $maxAttempts)...\n');
+      print('\n⚠️  Error in $package:\n$e🤞 Attempting recovery (${i + 1} / $maxAttempts)...');
 
       print('   Waiting 10 seconds before retry...');
-      await Future<void>.delayed(const Duration(seconds: 1));
+      await Future<void>.delayed(const Duration(seconds: 10));
 
       // Recovery attempt
-      print('   Running pub get...');
+      final cmd = package == 'frontend' ? 'flutter' : 'dart';
+      print('📥 Running $cmd pub get...');
+
       await Process.run(
-        package == 'frontend' ? 'flutter' : 'dart',
+        cmd,
         ['pub', 'get'],
         workingDirectory: packagePath,
       );
@@ -82,11 +85,11 @@ Future<void> runBuildRunner(String packagePath, {required bool watch}) async {
   Object? err;
   for (var i = 0; i < maxAttempts; i++) {
     try {
-      final (process, needsRestart) = await buildRunnerFunc();
+      final (process, needsRestart, errLogs) = await buildRunnerFunc();
       final removed = runnerWatchProcesses.remove(process.pid);
       assert(removed != null, true);
       if (needsRestart) {
-        await attemptRecover(process.stderr, i);
+        await attemptRecover(errLogs, i);
       } else {
         return;
       }
@@ -98,12 +101,21 @@ Future<void> runBuildRunner(String packagePath, {required bool watch}) async {
   exitRunners();
 }
 
-Future<(Process, bool)> _runBuildRunner(String package) async {
-  final process = await Process.start(
-    'dart',
-    ['run', 'build_runner', 'build', '--delete-conflicting-outputs'],
-    workingDirectory: package,
-  );
+Future<(Process, bool, String)> _runBuildRunner(String package) async {
+  late final Process process;
+  if (package == 'frontend') {
+    process = await Process.start(
+      'flutter',
+      ['pub', 'run', 'build_runner', 'build', '--delete-conflicting-outputs'],
+      workingDirectory: package,
+    );
+  } else {
+    process = await Process.start(
+      'dart',
+      ['run', 'build_runner', 'build', '--delete-conflicting-outputs'],
+      workingDirectory: package,
+    );
+  }
 
   runnerWatchProcesses.addAll({process.pid: process});
 
@@ -123,7 +135,7 @@ Future<(Process, bool)> _runBuildRunner(String package) async {
         .join('\n');
 
     print('Build runner failed for $package:\n$relevantErrors');
-    return (process, true);
+    return (process, true, '');
   }
 
   // Print success with minimal output
@@ -131,16 +143,26 @@ Future<(Process, bool)> _runBuildRunner(String package) async {
       outputLines.where((line) => line.contains('Succeeded') || line.contains('Generated')).join('\n').trim();
 
   print('   ${successMessage.isEmpty ? "Completed successfully" : successMessage}');
-  return (process, false);
+  return (process, false, '');
 }
 
-Future<(Process, bool)> _runBuildRunnerWatch(String packagePath) async {
+Future<(Process, bool, String)> _runBuildRunnerWatch(String packagePath) async {
   final package = packagePath.split('/').last;
-  final process = await Process.start(
-    'dart',
-    ['run', 'build_runner', 'watch', '--delete-conflicting-outputs'],
-    workingDirectory: packagePath,
-  );
+  late final Process process;
+  if (package == 'frontend') {
+    process = await Process.start(
+      'flutter',
+      ['pub', 'run', 'build_runner', 'watch', '--delete-conflicting-outputs'],
+      workingDirectory: packagePath,
+    );
+  } else {
+    process = await Process.start(
+      'dart',
+      ['run', 'build_runner', 'watch', '--delete-conflicting-outputs'],
+      workingDirectory: packagePath,
+    );
+  }
+  final logs = <String>[];
 
   runnerWatchProcesses.addAll({process.pid: process});
 
@@ -153,6 +175,7 @@ Future<(Process, bool)> _runBuildRunnerWatch(String packagePath) async {
       print('🚩 [${package.toUpperCase()}] - ${line.trim()}');
       restart = true;
     }
+    logs.add(line);
   });
 
   process.stderr.transform(const SystemEncoding().decoder).listen((line) {
@@ -160,13 +183,14 @@ Future<(Process, bool)> _runBuildRunnerWatch(String packagePath) async {
       print('🎯 [${package.toUpperCase()}] - ${line.trim()}');
       restart = true;
     }
+    logs.add(line);
   });
 
   final code = await process.exitCode;
   if (!restart) {
     restart = code != 0;
   }
-  return (process, restart);
+  return (process, restart, logs.join('\n'));
 }
 
 void exitRunners() {
diff --git a/backend/scripts/test_runner.dart b/backend/scripts/test_runner.dart
index 09f2497..81ac548 100644
--- a/backend/scripts/test_runner.dart
+++ b/backend/scripts/test_runner.dart
@@ -9,24 +9,45 @@ void main() async {
 
   final backendPath = '$projectRootPath/backend';
   // Start the server
-  print('Starting Dart Frog server...');
+  print('🐸 Building Dart Frog server...');
   final build = await Process.start(
     'dart_frog',
     ['build'],
     workingDirectory: backendPath,
-    mode: ProcessStartMode.inheritStdio,
   );
 
-  List<String> serverLogs = [];
+  if (await build.exitCode != 0) {
+    stdout.writeln('💀 Failed to build backend:');
+
+    for (final element in [build.stdout, build.stderr]) {
+      element
+        ..transform(const SystemEncoding().decoder)
+        ..listen((line) => stdout.write(line));
+    }
+    stdout.writeln();
+    exit(1);
+  }
+
+  final serverLogs = <String>[];
   final server = await Process.start('dart', ['build/bin/server.dart'], workingDirectory: backendPath);
-  server.stdout.transform(const SystemEncoding().decoder).listen((line) => serverLogs.add(line));
-  server.stderr.transform(const SystemEncoding().decoder).listen((line) => serverLogs.add(line));
+  server.stdout.transform(const SystemEncoding().decoder).listen(serverLogs.add);
+  server.stderr.transform(const SystemEncoding().decoder).listen(serverLogs.add);
+  unawaited(
+    server.exitCode.then((code) async {
+      if (code != 0) {
+        stdout
+          ..writeln('💀 Failed to run backend:\n')
+          ..write(serverLogs.join('\n'));
+        exit(1);
+      }
+    }),
+  );
 
   // Wait for server to be ready
-  print('Waiting for server to be ready...');
+  print('⏲️ Waiting for server to be ready...');
   await _waitForServer();
 
-  print('Running tests...');
+  print('🤞 Running tests...');
   try {
     // Run the tests
     final testResult = await Process.run('dart', ['test', '$backendPath/test_e2e/tests/']);
@@ -39,12 +60,14 @@ void main() async {
     if (testResult.exitCode != 0) {
       final sub = serverLogs.length > 10 ? serverLogs.length - 10 : 0;
       stdout.write("Server logs:\n${serverLogs.sublist(sub).join('\n')}");
+    } else {
+      stdout.writeln("💨 Passed like a light breeze 😮‍💨");
     }
 
     // Exit with the same code as the test process
     exit(testResult.exitCode);
   } catch (e) {
-    print('Error running tests: $e');
+    print('💩 Error running tests 💩: $e');
     build.kill();
     server.kill();
 
diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock
index ab1692c..18d0ab9 100644
--- a/frontend/pubspec.lock
+++ b/frontend/pubspec.lock
@@ -320,14 +320,6 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "4.3.0"
-  http:
-    dependency: transitive
-    description:
-      name: http
-      sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
-      url: "https://pub.dev"
-    source: hosted
-    version: "1.3.0"
   http_multi_server:
     dependency: transitive
     description: