diff --git a/packages/shorebird_cli/lib/src/doctor.dart b/packages/shorebird_cli/lib/src/doctor.dart index 954c7a6d..390781fe 100644 --- a/packages/shorebird_cli/lib/src/doctor.dart +++ b/packages/shorebird_cli/lib/src/doctor.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:mason_logger/mason_logger.dart'; import 'package:scoped_deps/scoped_deps.dart'; import 'package:shorebird_cli/src/logger.dart'; @@ -100,7 +102,20 @@ class Doctor { } for (final issue in unresolvedIssues) { - logger.info(' ${issue.displayMessage}'); + if (issue.displayMessage == null) { + continue; + } + + final lines = const LineSplitter().convert(issue.displayMessage!); + for (final (i, line) in lines.indexed) { + var leadingPaddingSpaceCount = 2; + if (i > 0) { + // Indent subsequent lines to align with the first line after the + // leading string and the space following it. + leadingPaddingSpaceCount += issue.severity.rawLeading.length + 1; + } + logger.info('${' ' * leadingPaddingSpaceCount}$line'); + } } allIssues.addAll(unresolvedIssues); diff --git a/packages/shorebird_cli/lib/src/validators/validators.dart b/packages/shorebird_cli/lib/src/validators/validators.dart index d009cb40..b72524da 100644 --- a/packages/shorebird_cli/lib/src/validators/validators.dart +++ b/packages/shorebird_cli/lib/src/validators/validators.dart @@ -22,12 +22,21 @@ enum ValidationIssueSeverity { /// Display helpers for printing [ValidationIssue]s. extension Display on ValidationIssueSeverity { - String get leading { + String get rawLeading { switch (this) { case ValidationIssueSeverity.error: - return red.wrap('[✗]')!; + return '[✗]'; case ValidationIssueSeverity.warning: - return yellow.wrap('[!]')!; + return '[!]'; + } + } + + String get displayLeading { + switch (this) { + case ValidationIssueSeverity.error: + return red.wrap(rawLeading)!; + case ValidationIssueSeverity.warning: + return yellow.wrap(rawLeading)!; } } } @@ -52,7 +61,7 @@ class ValidationIssue { /// A console-friendly description of this issue. String? get displayMessage { - return '${severity.leading} $message'; + return '${severity.displayLeading} $message'; } // coverage:ignore-start diff --git a/packages/shorebird_cli/test/src/doctor_test.dart b/packages/shorebird_cli/test/src/doctor_test.dart index 69e9ccfc..6bacb0ce 100644 --- a/packages/shorebird_cli/test/src/doctor_test.dart +++ b/packages/shorebird_cli/test/src/doctor_test.dart @@ -12,7 +12,9 @@ void main() { group(Doctor, () { const validationWarning = ValidationIssue( severity: ValidationIssueSeverity.warning, - message: 'warning', + message: ''' +warning +with multiple lines''', ); const validationError = ValidationIssue( severity: ValidationIssueSeverity.error, @@ -75,18 +77,10 @@ void main() { verify(validator.validate).called(1); } - verify( - () => - logger.info(any(that: stringContainsInOrder(['[!]', 'warning']))), - ).called(1); - - verify( - () => logger.info(any(that: stringContainsInOrder(['[✗]', 'error']))), - ).called(1); - - verify( - () => logger.info(any(that: contains('2 issues detected.'))), - ).called(1); + verify(() => logger.info(' ${yellow.wrap('[!]')} warning')).called(1); + verify(() => logger.info(' with multiple lines')).called(1); + verify(() => logger.info(' ${red.wrap('[✗]')} error')).called(1); + verify(() => logger.info('2 issues detected.')).called(1); }); group('when validators only yield warnings', () {