@@ -643,11 +643,13 @@ export const log = {
643643export const spinner = ( ) => {
644644 const frames = unicode ? [ '◒' , '◐' , '◓' , '◑' ] : [ '•' , 'o' , 'O' , '0' ] ;
645645 const delay = unicode ? 80 : 120 ;
646+ const isCI = process . env . CI === 'true' ;
646647
647648 let unblock : ( ) => void ;
648649 let loop : NodeJS . Timeout ;
649650 let isSpinnerActive = false ;
650651 let _message = '' ;
652+ let _prevMessage : string | undefined = undefined ;
651653
652654 const handleExit = ( code : number ) => {
653655 const msg = code > 1 ? 'Something went wrong' : 'Canceled' ;
@@ -676,44 +678,59 @@ export const spinner = () => {
676678 process . removeListener ( 'exit' , handleExit ) ;
677679 } ;
678680
681+
682+ const clearPrevMessage = ( ) => {
683+ if ( _prevMessage === undefined ) return ;
684+ if ( isCI ) process . stdout . write ( '\n' ) ;
685+ const prevLines = _prevMessage . split ( '\n' ) ;
686+ process . stdout . write ( cursor . move ( - 999 , prevLines . length - 1 ) ) ;
687+ process . stdout . write ( erase . down ( prevLines . length ) ) ;
688+ } ;
689+
690+ const parseMessage = ( msg : string ) : string => {
691+ return msg . replace ( / \. + $ / , '' ) ;
692+ } ;
693+
679694 const start = ( msg = '' ) : void => {
680695 isSpinnerActive = true ;
681696 unblock = block ( ) ;
682- _message = msg . replace ( / \. + $ / , '' ) ;
697+ _message = parseMessage ( msg ) ;
683698 process . stdout . write ( `${ color . gray ( S_BAR ) } \n` ) ;
684699 let frameIndex = 0 ;
685700 let dotsTimer = 0 ;
686701 registerHooks ( ) ;
687702 loop = setInterval ( ( ) => {
703+ if ( isCI && _message === _prevMessage ) {
704+ return ;
705+ }
706+ clearPrevMessage ( ) ;
707+ _prevMessage = _message ;
688708 const frame = color . magenta ( frames [ frameIndex ] ) ;
689- const loadingDots = '.' . repeat ( Math . floor ( dotsTimer ) ) . slice ( 0 , 3 ) ;
690- process . stdout . write ( cursor . move ( - 999 , 0 ) ) ;
691- process . stdout . write ( erase . down ( 1 ) ) ;
709+ const loadingDots = isCI ? '...' : '.' . repeat ( Math . floor ( dotsTimer ) ) . slice ( 0 , 3 ) ;
692710 process . stdout . write ( `${ frame } ${ _message } ${ loadingDots } ` ) ;
693711 frameIndex = frameIndex + 1 < frames . length ? frameIndex + 1 : 0 ;
694712 dotsTimer = dotsTimer < frames . length ? dotsTimer + 0.125 : 0 ;
695713 } , delay ) ;
696714 } ;
697715
698716 const stop = ( msg = '' , code = 0 ) : void => {
699- _message = msg ?? _message ;
700717 isSpinnerActive = false ;
701718 clearInterval ( loop ) ;
719+ clearPrevMessage ( ) ;
702720 const step =
703721 code === 0
704722 ? color . green ( S_STEP_SUBMIT )
705723 : code === 1
706724 ? color . red ( S_STEP_CANCEL )
707725 : color . red ( S_STEP_ERROR ) ;
708- process . stdout . write ( cursor . move ( - 999 , 0 ) ) ;
709- process . stdout . write ( erase . down ( 1 ) ) ;
726+ _message = parseMessage ( msg ?? _message ) ;
710727 process . stdout . write ( `${ step } ${ _message } \n` ) ;
711728 clearHooks ( ) ;
712729 unblock ( ) ;
713730 } ;
714731
715732 const message = ( msg = '' ) : void => {
716- _message = msg ?? _message ;
733+ _message = parseMessage ( msg ?? _message ) ;
717734 } ;
718735
719736 return {
0 commit comments