@@ -7,6 +7,7 @@ import type {
77import type ParcelConfig from '../ParcelConfig' ;
88import type {
99 DevDepRequest ,
10+ DevDepRequestRef ,
1011 ParcelOptions ,
1112 InternalDevDepOptions ,
1213} from '../types' ;
@@ -34,7 +35,7 @@ export async function createDevDependency(
3435 opts : InternalDevDepOptions ,
3536 requestDevDeps : Map < string , string > ,
3637 options : ParcelOptions ,
37- ) : Promise < DevDepRequest > {
38+ ) : Promise < DevDepRequest | DevDepRequestRef > {
3839 let { specifier, resolveFrom, additionalInvalidations} = opts ;
3940 let key = `${ specifier } :${ fromProjectPathRelative ( resolveFrom ) } ` ;
4041
@@ -44,6 +45,7 @@ export async function createDevDependency(
4445 let hash = requestDevDeps . get ( key ) ;
4546 if ( hash != null ) {
4647 return {
48+ type : 'ref' ,
4749 specifier,
4850 resolveFrom,
4951 hash,
@@ -189,12 +191,17 @@ export type DevDepRequestResult = {|
189191
190192export async function runDevDepRequest < TResult : RequestResult > (
191193 api : RunAPI < TResult > ,
192- devDepRequest : DevDepRequest ,
194+ devDepRequestRef : DevDepRequest | DevDepRequestRef ,
193195) {
194196 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 ,
196202 type : requestTypes . dev_dep_request ,
197203 run : ( { api} ) => {
204+ let devDepRequest = resolveDevDepRequestRef ( devDepRequestRef ) ;
198205 for ( let filePath of nullthrows (
199206 devDepRequest . invalidateOnFileChange ,
200207 'DevDepRequest missing invalidateOnFileChange' ,
@@ -225,19 +232,43 @@ export async function runDevDepRequest<TResult: RequestResult>(
225232 } ) ;
226233}
227234
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+
228259// A cache of plugin dependency hashes that we've already sent to the main thread.
229260// Automatically cleared before each build.
230261const pluginCache = createBuildCache ( ) ;
231262
232263export function getWorkerDevDepRequests (
233- devDepRequests : Array < DevDepRequest > ,
234- ) : Array < DevDepRequest > {
264+ devDepRequests : Array < DevDepRequest | DevDepRequestRef > ,
265+ ) : Array < DevDepRequest | DevDepRequestRef > {
235266 return devDepRequests . map ( devDepRequest => {
236267 // If we've already sent a matching transformer + hash to the main thread during this build,
237268 // there's no need to repeat ourselves.
238269 let { specifier, resolveFrom, hash} = devDepRequest ;
239270 if ( hash === pluginCache . get ( specifier ) ) {
240- return { specifier, resolveFrom, hash} ;
271+ return { type : 'ref' , specifier, resolveFrom, hash} ;
241272 } else {
242273 pluginCache . set ( specifier , hash ) ;
243274 return devDepRequest ;
0 commit comments