1
- import { bootstrap } from "../bootstrap"
2
- import { store } from "../redux"
3
1
import { syncStaticDir } from "../utils/get-static-dir"
4
2
import report from "gatsby-cli/lib/reporter"
5
3
import chalk from "chalk"
@@ -19,7 +17,7 @@ import {
19
17
userPassesFeedbackRequestHeuristic ,
20
18
showFeedbackRequest ,
21
19
} from "../utils/feedback"
22
-
20
+ import { startRedirectListener } from "../bootstrap/redirects-writer"
23
21
import { markWebpackStatusAsPending } from "../utils/webpack-status"
24
22
25
23
import { IProgram } from "./types"
@@ -29,9 +27,29 @@ import {
29
27
runPageQueries ,
30
28
startWebpackServer ,
31
29
writeOutRequires ,
30
+ IBuildContext ,
31
+ initialize ,
32
+ postBootstrap ,
33
+ extractQueries ,
34
+ rebuildSchemaWithSitePage ,
35
+ writeOutRedirects ,
32
36
} from "../services"
33
37
import { boundActionCreators } from "../redux/actions"
34
38
import { ProgramStatus } from "../redux/types"
39
+ import {
40
+ MachineConfig ,
41
+ AnyEventObject ,
42
+ assign ,
43
+ Machine ,
44
+ DoneEventObject ,
45
+ interpret ,
46
+ } from "xstate"
47
+ import { DataLayerResult , dataLayerMachine } from "../state-machines/data-layer"
48
+ import { IDataLayerContext } from "../state-machines/data-layer/types"
49
+ import { globalTracer } from "opentracing"
50
+ import reporter from "gatsby-cli/lib/reporter"
51
+
52
+ const tracer = globalTracer ( )
35
53
36
54
// const isInteractive = process.stdout.isTTY
37
55
@@ -67,6 +85,8 @@ process.on(`message`, msg => {
67
85
} )
68
86
69
87
module . exports = async ( program : IProgram ) : Promise < void > => {
88
+ const bootstrapSpan = tracer . startSpan ( `bootstrap` )
89
+
70
90
// We want to prompt the feedback request when users quit develop
71
91
// assuming they pass the heuristic check to know they are a user
72
92
// we want to request feedback from, and we're not annoying them.
@@ -108,34 +128,114 @@ module.exports = async (program: IProgram): Promise<void> => {
108
128
throw e
109
129
}
110
130
111
- // Start bootstrap process.
112
- const { gatsbyNodeGraphQLFunction, workerPool } = await bootstrap ( { program } )
113
-
114
- // Start the createPages hot reloader.
115
- bootstrapPageHotReloader ( gatsbyNodeGraphQLFunction )
116
-
117
- // Start the schema hot reloader.
118
- bootstrapSchemaHotReloader ( )
131
+ const app = express ( )
119
132
120
- const { queryIds } = await calculateDirtyQueries ( { store } )
133
+ const developConfig : MachineConfig < IBuildContext , any , AnyEventObject > = {
134
+ id : `build` ,
135
+ initial : `initializing` ,
136
+ states : {
137
+ initializing : {
138
+ invoke : {
139
+ src : `initialize` ,
140
+ onDone : {
141
+ target : `initializingDataLayer` ,
142
+ actions : `assignStoreAndWorkerPool` ,
143
+ } ,
144
+ } ,
145
+ } ,
146
+ initializingDataLayer : {
147
+ invoke : {
148
+ src : `initializeDataLayer` ,
149
+ data : ( { parentSpan, store } : IBuildContext ) : IDataLayerContext => {
150
+ return { parentSpan, store, firstRun : true }
151
+ } ,
152
+ onDone : {
153
+ actions : `assignDataLayer` ,
154
+ target : `doingEverythingElse` ,
155
+ } ,
156
+ } ,
157
+ } ,
158
+ doingEverythingElse : {
159
+ invoke : {
160
+ src : async ( {
161
+ gatsbyNodeGraphQLFunction,
162
+ graphqlRunner,
163
+ workerPool,
164
+ store,
165
+ app,
166
+ } ) : Promise < void > => {
167
+ // All the stuff that's not in the state machine yet
168
+
169
+ // These were previously in `bootstrap()` but are now
170
+ // in part of the state machine that hasn't been added yet
171
+ await rebuildSchemaWithSitePage ( { parentSpan : bootstrapSpan } )
172
+
173
+ await extractQueries ( { parentSpan : bootstrapSpan } )
174
+ await writeOutRedirects ( { parentSpan : bootstrapSpan } )
175
+
176
+ startRedirectListener ( )
177
+ bootstrapSpan . finish ( )
178
+ await postBootstrap ( { parentSpan : bootstrapSpan } )
179
+
180
+ // These are the parts that weren't in bootstrap
181
+
182
+ // Start the createPages hot reloader.
183
+ bootstrapPageHotReloader ( gatsbyNodeGraphQLFunction )
184
+
185
+ // Start the schema hot reloader.
186
+ bootstrapSchemaHotReloader ( )
187
+
188
+ const { queryIds } = await calculateDirtyQueries ( { store } )
189
+
190
+ await runStaticQueries ( { queryIds, store, program, graphqlRunner } )
191
+ await runPageQueries ( { queryIds, store, program, graphqlRunner } )
192
+ await writeOutRequires ( { store } )
193
+ boundActionCreators . setProgramStatus (
194
+ ProgramStatus . BOOTSTRAP_QUERY_RUNNING_FINISHED
195
+ )
196
+
197
+ await db . saveState ( )
198
+
199
+ await waitUntilAllJobsComplete ( )
200
+ requiresWriter . startListener ( )
201
+ db . startAutosave ( )
202
+ queryUtil . startListeningToDevelopQueue ( {
203
+ graphqlTracing : program . graphqlTracing ,
204
+ } )
205
+ queryWatcher . startWatchDeletePage ( )
206
+
207
+ await startWebpackServer ( { program, app, workerPool } )
208
+ } ,
209
+ } ,
210
+ } ,
211
+ } ,
212
+ }
121
213
122
- await runStaticQueries ( { queryIds, store, program } )
123
- await runPageQueries ( { queryIds, store, program } )
124
- await writeOutRequires ( { store } )
125
- boundActionCreators . setProgramStatus (
126
- ProgramStatus . BOOTSTRAP_QUERY_RUNNING_FINISHED
214
+ const service = interpret (
215
+ // eslint-disable-next-line new-cap
216
+ Machine ( developConfig , {
217
+ services : {
218
+ initializeDataLayer : dataLayerMachine ,
219
+ initialize,
220
+ } ,
221
+ actions : {
222
+ assignStoreAndWorkerPool : assign < IBuildContext , DoneEventObject > (
223
+ ( _context , event ) => {
224
+ const { store, workerPool } = event . data
225
+ return {
226
+ store,
227
+ workerPool,
228
+ }
229
+ }
230
+ ) ,
231
+ assignDataLayer : assign < IBuildContext , DoneEventObject > (
232
+ ( _ , { data } ) : DataLayerResult => data
233
+ ) ,
234
+ } ,
235
+ } ) . withContext ( { program, parentSpan : bootstrapSpan , app } )
127
236
)
128
-
129
- await db . saveState ( )
130
-
131
- await waitUntilAllJobsComplete ( )
132
- requiresWriter . startListener ( )
133
- db . startAutosave ( )
134
- queryUtil . startListeningToDevelopQueue ( {
135
- graphqlTracing : program . graphqlTracing ,
237
+ service . onTransition ( state => {
238
+ reporter . verbose ( `transition to ${ JSON . stringify ( state . value ) } ` )
136
239
} )
137
- queryWatcher . startWatchDeletePage ( )
138
- const app = express ( )
139
-
140
- await startWebpackServer ( { program, app, workerPool } )
240
+ service . start ( )
141
241
}
0 commit comments