@@ -7,6 +7,7 @@ import type {
7
7
import type ParcelConfig from '../ParcelConfig' ;
8
8
import type {
9
9
DevDepRequest ,
10
+ DevDepRequestRef ,
10
11
ParcelOptions ,
11
12
InternalDevDepOptions ,
12
13
} from '../types' ;
@@ -34,7 +35,7 @@ export async function createDevDependency(
34
35
opts : InternalDevDepOptions ,
35
36
requestDevDeps : Map < string , string > ,
36
37
options : ParcelOptions ,
37
- ) : Promise < DevDepRequest > {
38
+ ) : Promise < DevDepRequest | DevDepRequestRef > {
38
39
let { specifier, resolveFrom, additionalInvalidations} = opts ;
39
40
let key = `${ specifier } :${ fromProjectPathRelative ( resolveFrom ) } ` ;
40
41
@@ -44,6 +45,7 @@ export async function createDevDependency(
44
45
let hash = requestDevDeps . get ( key ) ;
45
46
if ( hash != null ) {
46
47
return {
48
+ type : 'ref' ,
47
49
specifier,
48
50
resolveFrom,
49
51
hash,
@@ -189,12 +191,17 @@ export type DevDepRequestResult = {|
189
191
190
192
export async function runDevDepRequest < TResult : RequestResult > (
191
193
api : RunAPI < TResult > ,
192
- devDepRequest : DevDepRequest ,
194
+ devDepRequestRef : DevDepRequest | DevDepRequestRef ,
193
195
) {
194
196
await api . runRequest < null , DevDepRequestResult | void > ( {
195
- id : 'dev_dep_request:' + devDepRequest . specifier + ':' + devDepRequest . hash ,
197
+ id :
198
+ 'dev_dep_request:' +
199
+ devDepRequestRef . specifier +
200
+ ':' +
201
+ devDepRequestRef . hash ,
196
202
type : requestTypes . dev_dep_request ,
197
203
run : ( { api} ) => {
204
+ let devDepRequest = resolveDevDepRequestRef ( devDepRequestRef ) ;
198
205
for ( let filePath of nullthrows (
199
206
devDepRequest . invalidateOnFileChange ,
200
207
'DevDepRequest missing invalidateOnFileChange' ,
@@ -225,19 +232,43 @@ export async function runDevDepRequest<TResult: RequestResult>(
225
232
} ) ;
226
233
}
227
234
235
+ const devDepRequests : Map < string , DevDepRequest > = createBuildCache ( ) ;
236
+ export function resolveDevDepRequestRef (
237
+ devDepRequestRef : DevDepRequest | DevDepRequestRef ,
238
+ ) : DevDepRequest {
239
+ const devDepRequest =
240
+ devDepRequestRef . type === 'ref'
241
+ ? devDepRequests . get ( devDepRequestRef . hash )
242
+ : devDepRequestRef ;
243
+ if ( devDepRequest == null ) {
244
+ throw new Error (
245
+ `Worker send back a reference to a missing dev dep request.
246
+ This might happen due to internal in-memory build caches not being cleared
247
+ between builds or due a race condition.
248
+ This is a bug in Parcel.` ,
249
+ ) ;
250
+ }
251
+
252
+ if ( devDepRequestRef . type !== 'ref' ) {
253
+ devDepRequests . set ( devDepRequest . hash , devDepRequest ) ;
254
+ }
255
+
256
+ return devDepRequest ;
257
+ }
258
+
228
259
// A cache of plugin dependency hashes that we've already sent to the main thread.
229
260
// Automatically cleared before each build.
230
261
const pluginCache = createBuildCache ( ) ;
231
262
232
263
export function getWorkerDevDepRequests (
233
- devDepRequests : Array < DevDepRequest > ,
234
- ) : Array < DevDepRequest > {
264
+ devDepRequests : Array < DevDepRequest | DevDepRequestRef > ,
265
+ ) : Array < DevDepRequest | DevDepRequestRef > {
235
266
return devDepRequests . map ( devDepRequest => {
236
267
// If we've already sent a matching transformer + hash to the main thread during this build,
237
268
// there's no need to repeat ourselves.
238
269
let { specifier, resolveFrom, hash} = devDepRequest ;
239
270
if ( hash === pluginCache . get ( specifier ) ) {
240
- return { specifier, resolveFrom, hash} ;
271
+ return { type : 'ref' , specifier, resolveFrom, hash} ;
241
272
} else {
242
273
pluginCache . set ( specifier , hash ) ;
243
274
return devDepRequest ;
0 commit comments