@@ -4,45 +4,76 @@ var wrapAnsi = require('wrap-ansi');
44var cliCursor = require ( './cli-cursor' ) ;
55
66
7+ function isStdStream ( stream ) {
8+ return stream === process . stdout || stream === process . stderr ;
9+ }
10+
711function main ( stream ) {
812 var prevLineCount = 0 ;
13+ var context = { stream } ;
914
10- var streamWrite = stream . write ;
11-
12- var overridenWrite = function ( ...args ) {
15+ function overriddenWrite ( ...args ) {
1316 if ( prevLineCount )
1417 render . clear ( ) ;
1518
16- return streamWrite . apply ( this , args ) ;
19+ if ( this === process . stderr )
20+ return context . stderrWrite . apply ( this , args ) ;
21+ else
22+ return context . stdoutWrite . apply ( this , args ) ;
1723 } ;
1824
25+ function overrideStdStreams ( context ) {
26+ if ( ! context . streamWrite && stream . write !== overriddenWrite )
27+ context . streamWrite = context . stream . write ;
28+
29+ if ( ! isStdStream ( stream ) )
30+ return context ;
31+
32+ if ( process . stderr . write !== overriddenWrite ) {
33+ context . stderrWrite = process . stderr . write ;
34+ process . stderr . write = overriddenWrite ;
35+ }
36+
37+ if ( process . stdout . write !== overriddenWrite ) {
38+ context . stdoutWrite = process . stdout . write ;
39+ process . stdout . write = overriddenWrite ;
40+ }
41+
42+ return context ;
43+ }
44+
45+ function restoreStdStreams ( context ) {
46+ if ( context . stderrWrite )
47+ process . stderr . write = context . stderrWrite ;
48+
49+ if ( context . stdoutWrite )
50+ process . stdout . write = context . stdoutWrite ;
51+ }
52+
1953 var render = function ( ) {
2054 cliCursor . hide ( ) ;
2155
22- if ( stream . write !== overridenWrite ) {
23- streamWrite = stream . write ;
24- stream . write = overridenWrite
25- }
56+ overrideStdStreams ( context )
2657
2758 var out = [ ] . join . call ( arguments , ' ' ) + '\n' ;
2859
2960 out = wrapAnsi ( out , process . stdout . columns || 80 , { wordWrap : false } ) ;
3061
31- streamWrite . call ( stream , ansiEscapes . eraseLines ( prevLineCount ) + out ) ;
62+ context . streamWrite . call ( stream , ansiEscapes . eraseLines ( prevLineCount ) + out ) ;
3263
3364 prevLineCount = out . split ( '\n' ) . length ;
3465 } ;
3566
3667 render . clear = function ( ) {
37- streamWrite . call ( stream , ansiEscapes . eraseLines ( prevLineCount ) ) ;
68+ context . streamWrite . call ( stream , ansiEscapes . eraseLines ( prevLineCount ) ) ;
3869
3970 prevLineCount = 0 ;
4071 } ;
4172
4273 render . done = function ( ) {
4374 prevLineCount = 0 ;
44- stream . write = streamWrite ;
4575
76+ restoreStdStreams ( context ) ;
4677 cliCursor . show ( ) ;
4778 } ;
4879
0 commit comments