@@ -20,6 +20,10 @@ export interface RunnerReporter {
2020 onStop ?: ( options : RunnerReporterStopOptions ) => void ;
2121}
2222
23+ export interface RunnerReporterOptions {
24+ stream ?: NodeJS . WriteStream ;
25+ }
26+
2327export class RunnerLinerTerminalReporter implements RunnerReporter {
2428 private stream : NodeJS . WriteStream ;
2529 private timer : any = null ;
@@ -28,11 +32,7 @@ export class RunnerLinerTerminalReporter implements RunnerReporter {
2832 private isRendering = false ;
2933 private runningRunners : Runner [ ] = [ ] ;
3034
31- constructor (
32- options : {
33- stream ?: NodeJS . WriteStream ;
34- } = { } ,
35- ) {
35+ constructor ( options : RunnerReporterOptions = { } ) {
3636 this . stream = options . stream ?? process . stderr ;
3737 }
3838
@@ -43,25 +43,25 @@ export class RunnerLinerTerminalReporter implements RunnerReporter {
4343 onRunnerEnd ( runner : Runner ) {
4444 this . runningRunners . splice ( this . runningRunners . indexOf ( runner ) , 1 ) ;
4545 const { status, context } = runner ;
46- if ( status === RunnerStatus . Finished ) {
47- // TODO: for error
48- const items : string [ ] = [
49- runner . isError ? chalk . red ( figures . cross ) : chalk . green ( figures . tick ) ,
50- chalk . cyan ( runner . name ) ,
51- formatTimeCost ( runner . getMetric ( TASK_MARK ) . cost ) ,
52- ] ;
53-
54- if ( context . mode === 'development' ) {
55- items . push ( chalk . red ( 'dev' ) ) ;
56- }
57-
58- // remove loading
59- this . clear ( ) ;
60- // eslint-disable-next-line no-console
61- console . log ( ` ${ items . join ( ' ' ) } ` ) ;
62- // resume loading
63- this . render ( ) ;
46+ if ( status !== RunnerStatus . Finished && status !== RunnerStatus . Error ) {
47+ return ;
6448 }
49+
50+ const items : string [ ] = [
51+ runner . isError ? chalk . red ( figures . cross ) : chalk . green ( figures . tick ) ,
52+ chalk . cyan ( runner . name ) ,
53+ formatTimeCost ( runner . getMetric ( TASK_MARK ) . cost ) ,
54+ ] ;
55+
56+ if ( context . mode === 'development' ) {
57+ items . push ( chalk . red ( 'dev' ) ) ;
58+ }
59+
60+ // remove loading
61+ this . clear ( ) ;
62+ this . stream . write ( ` ${ items . join ( ' ' ) } \n` ) ;
63+ // resume loading
64+ this . render ( ) ;
6565 }
6666
6767 onStart ( ) {
@@ -77,9 +77,8 @@ export class RunnerLinerTerminalReporter implements RunnerReporter {
7777 // 停下来之后进行最后一次更新
7878 this . clear ( ) ;
7979 this . isRendering = false ;
80- // eslint-disable-next-line no-console
81- console . log (
82- ` ${ chalk . blue ( figures . info ) } Done in ${ formatTimeCost ( options . cost ) } for ${ options . runners . length } tasks` ,
80+ this . stream . write (
81+ ` ${ chalk . blue ( figures . info ) } Done in ${ formatTimeCost ( options . cost ) } for ${ options . runners . length } tasks\n` ,
8382 ) ;
8483 }
8584
@@ -120,3 +119,48 @@ export class RunnerLinerTerminalReporter implements RunnerReporter {
120119 return ` ${ chalk . dim ( this . spinner . frames [ this . frame ] ) } ${ chalk . dim ( 'Running...' ) } ` ;
121120 }
122121}
122+
123+ export class RunnerPlainTextReporter implements RunnerReporter {
124+ private stream : NodeJS . WriteStream ;
125+
126+ constructor ( options : RunnerReporterOptions = { } ) {
127+ this . stream = options . stream ?? process . stderr ;
128+ }
129+
130+ onRunnerEnd ( runner : Runner ) {
131+ const { status, context } = runner ;
132+ if ( status !== RunnerStatus . Finished && status !== RunnerStatus . Error ) {
133+ return ;
134+ }
135+
136+ const items : string [ ] = [
137+ runner . isError ? figures . cross : figures . tick ,
138+ runner . name ,
139+ formatTimeCost ( runner . getMetric ( TASK_MARK ) . cost , false ) ,
140+ ] ;
141+
142+ if ( context . mode === 'development' ) {
143+ items . push ( 'dev' ) ;
144+ }
145+
146+ this . stream . write ( ` ${ items . join ( ' ' ) } \n` ) ;
147+ }
148+
149+ onStop ( options : RunnerReporterStopOptions ) {
150+ this . stream . write (
151+ ` ${ figures . info } Done in ${ formatTimeCost ( options . cost , false ) } for ${ options . runners . length } tasks\n` ,
152+ ) ;
153+ }
154+ }
155+
156+ export function isTerminalEnvironment ( stream : NodeJS . WriteStream = process . stderr ) {
157+ return Boolean ( stream . isTTY ) && ! process . env . CI ;
158+ }
159+
160+ export function createRunnerReporter ( options : RunnerReporterOptions = { } ) : RunnerReporter {
161+ const stream = options . stream ?? process . stderr ;
162+ if ( isTerminalEnvironment ( stream ) ) {
163+ return new RunnerLinerTerminalReporter ( { stream } ) ;
164+ }
165+ return new RunnerPlainTextReporter ( { stream } ) ;
166+ }
0 commit comments