1
1
import React from "react"
2
2
import { Static , Box } from "ink"
3
- import { isCI } from "ci-info"
4
3
import chalk from "chalk"
5
- import Activity , { calcElapsedTime } from "./components/activity"
4
+ import Spinner from "./components/spinner"
5
+ import ProgressBar from "./components/progress-bar"
6
6
import { Message } from "./components/messages"
7
+ import isTTY from "../../../util/is-tty"
8
+ import calcElapsedTime from "../../../util/calc-elapsed-time"
9
+
10
+ const showProgress = isTTY
11
+
12
+ const successTextGenerator = {
13
+ spinner : activity => {
14
+ let successText = `${ activity . id } - ${ calcElapsedTime (
15
+ activity . startTime
16
+ ) } s`
17
+ if ( activity . status ) {
18
+ successText += ` — ${ activity . status } `
19
+ }
7
20
8
- const showProgress = process . stdout . isTTY && ! isCI
9
-
10
- const generateActivityFinishedText = ( name , activity ) => {
11
- let successText = `${ name } - ${ calcElapsedTime ( activity . startTime ) } s`
12
- if ( activity . status ) {
13
- successText += ` — ${ activity . status } `
14
- }
15
-
16
- return successText
21
+ return successText
22
+ } ,
23
+ progress : activity =>
24
+ `${ activity . id } — ${ activity . current } /${ activity . total } - ${ calcElapsedTime (
25
+ activity . startTime
26
+ ) } s`,
17
27
}
18
28
19
29
export default class GatsbyReporter extends React . Component {
@@ -26,44 +36,40 @@ export default class GatsbyReporter extends React.Component {
26
36
27
37
format = chalk
28
38
29
- createActivity = name => {
39
+ createActivity = ( { id, ...options } ) => {
40
+ this . setState ( state => {
41
+ return {
42
+ activities : {
43
+ ...state . activities ,
44
+ [ id ] : {
45
+ id,
46
+ ...options ,
47
+ } ,
48
+ } ,
49
+ }
50
+ } )
51
+
30
52
return {
31
- start : ( ) => {
32
- this . setState ( state => {
33
- return {
34
- activities : {
35
- ...state . activities ,
36
- [ name ] : {
37
- status : `` ,
38
- startTime : process . hrtime ( ) ,
39
- } ,
40
- } ,
41
- }
42
- } )
43
- } ,
44
- setStatus : status => {
53
+ update : newState => {
45
54
this . setState ( state => {
46
- const activity = state . activities [ name ]
47
-
48
55
return {
49
56
activities : {
50
57
...state . activities ,
51
- [ name ] : {
52
- ...activity ,
53
- status : status ,
58
+ [ id ] : {
59
+ ...state . activities [ id ] ,
60
+ ... newState ,
54
61
} ,
55
62
} ,
56
63
}
57
64
} )
58
65
} ,
59
- end : ( ) => {
60
- const activity = this . state . activities [ name ]
61
-
62
- this . success ( generateActivityFinishedText ( name , activity ) )
66
+ done : ( ) => {
67
+ const activity = this . state . activities [ id ]
68
+ this . success ( successTextGenerator [ activity . type ] ( { id, ...activity } ) )
63
69
64
70
this . setState ( state => {
65
71
const activities = { ...state . activities }
66
- delete activities [ name ]
72
+ delete activities [ id ]
67
73
68
74
return {
69
75
activities,
@@ -116,27 +122,48 @@ export default class GatsbyReporter extends React.Component {
116
122
}
117
123
118
124
render ( ) {
125
+ const { activities, messages, disableColors } = this . state
126
+
127
+ const spinners = [ ]
128
+ const progressBars = [ ]
129
+ if ( showProgress ) {
130
+ Object . keys ( activities ) . forEach ( activityName => {
131
+ const activity = activities [ activityName ]
132
+ if ( activity . type === `spinner` ) {
133
+ spinners . push ( activity )
134
+ }
135
+ if ( activity . type === `progress` && activity . startTime ) {
136
+ progressBars . push ( activity )
137
+ }
138
+ } )
139
+ }
140
+
119
141
return (
120
142
< Box flexDirection = "column" >
121
143
< Box flexDirection = "column" >
122
144
< Static >
123
- { this . state . messages . map ( ( msg , index ) => (
145
+ { messages . map ( ( msg , index ) => (
124
146
< Box textWrap = "wrap" key = { index } >
125
- < Message type = { msg . type } hideColors = { this . state . disableColors } >
147
+ < Message type = { msg . type } hideColors = { disableColors } >
126
148
{ msg . text }
127
149
</ Message >
128
150
</ Box >
129
151
) ) }
130
152
</ Static >
131
153
132
- { showProgress &&
133
- Object . keys ( this . state . activities ) . map ( activityName => (
134
- < Activity
135
- key = { activityName }
136
- name = { activityName }
137
- { ...this . state . activities [ activityName ] }
138
- />
139
- ) ) }
154
+ { spinners . map ( activity => (
155
+ < Spinner key = { activity . id } name = { activity . id } { ...activity } />
156
+ ) ) }
157
+
158
+ { progressBars . map ( activity => (
159
+ < ProgressBar
160
+ key = { activity . id }
161
+ message = { activity . id }
162
+ total = { activity . total }
163
+ current = { activity . current }
164
+ startTime = { activity . startTime }
165
+ />
166
+ ) ) }
140
167
</ Box >
141
168
</ Box >
142
169
)
0 commit comments