run method

  1. @override
Future<void> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<void> run() async {
  final headless = _headless;

  final projectDir = findNitroProjectRoot();
  if (projectDir == null) {
    if (headless) {
      stderr.writeln('[nitro:error] No Nitro project found in . or its subdirectories (must have nitro dependency in pubspec.yaml).');
    } else {
      stderr.writeln('❌ No Nitro project found in . or its subdirectories (must have nitro dependency in pubspec.yaml).');
    }
    exit(1);
  }

  // Change working directory so that doctor checks (File('ios'), etc) work correctly.
  final originalCwd = Directory.current;
  Directory.current = projectDir;

  if (projectDir.path != originalCwd.path) {
    if (headless) {
      stdout.writeln('[nitro] project: ${projectDir.path}');
    } else {
      stdout.writeln('  \x1B[90m📂 Found project in: ${projectDir.path}\x1B[0m');
    }
  }

  final result = performChecks(root: projectDir);

  if (headless) {
    _printHeadless(result);
  } else {
    await runApp(
      DoctorView(
        pluginName: result.pluginName,
        sections: result.sections,
        errors: result.errors,
        warnings: result.warnings,
        errorMessage: result.errorMessage,
      ),
    );

    // Print persistent one-liner after TUI exits
    if (result.errorMessage == null) {
      if (result.errors == 0 && result.warnings == 0) {
        stdout.writeln('  \x1B[1;32m✨ ${result.pluginName} — all checks passed\x1B[0m');
      } else if (result.errors > 0) {
        stdout.writeln(
          '  \x1B[1;31m✘  ${result.pluginName} — ${result.errors} error(s)'
          '${result.warnings > 0 ? ", ${result.warnings} warning(s)" : ""}\x1B[0m',
        );
      } else {
        stdout.writeln('  \x1B[1;33m⚠  ${result.pluginName} — ${result.warnings} warning(s)\x1B[0m');
      }
      stdout.writeln('');
    }
  }

  exit(result.errors > 0 ? 1 : 0);
}