@@ -97,6 +97,23 @@ function getTranslators() {
9797 return translators ;
9898}
9999
100+ /**
101+ * Generate message about potential race condition caused by requiring a cached module that has started
102+ * async linking.
103+ * @param {string } filename Filename of the module being required.
104+ * @param {string|undefined } parentFilename Filename of the module calling require().
105+ * @returns {string } Error message.
106+ */
107+ function getRaceMessage ( filename , parentFilename ) {
108+ let raceMessage = `Cannot require() ES Module ${ filename } because it is not yet fully loaded. ` ;
109+ raceMessage += 'This may be caused by a race condition if the module is simultaneously dynamically ' ;
110+ raceMessage += 'import()-ed via Promise.all(). Try await-ing the import() sequentially in a loop instead.' ;
111+ if ( parentFilename ) {
112+ raceMessage += ` (from ${ parentFilename } )` ;
113+ }
114+ return raceMessage ;
115+ }
116+
100117/**
101118 * @type {HooksProxy }
102119 * Multiple loader instances exist for various, specific reasons (see code comments at site).
@@ -362,14 +379,8 @@ class ModuleLoader {
362379 mod [ kRequiredModuleSymbol ] = job . module ;
363380 const parentFilename = urlToFilename ( parent ?. filename ) ;
364381 // TODO(node:55782): this race may stop to happen when the ESM resolution and loading become synchronous.
365- let raceMessage = `Cannot require() ES Module ${ filename } because it is not yet fully loaded. ` ;
366- raceMessage += 'This may be caused by a race condition if the module is simultaneously dynamically ' ;
367- raceMessage += 'import()-ed via Promise.all(). Try await-ing the import() sequentially in a loop instead.' ;
368- if ( parentFilename ) {
369- raceMessage += ` (from ${ parentFilename } )` ;
370- }
371382 if ( ! job . module ) {
372- assert ( job . module , raceMessage ) ;
383+ assert . fail ( getRaceMessage ( filename , parentFilename ) ) ;
373384 }
374385 if ( job . module . async ) {
375386 throw new ERR_REQUIRE_ASYNC_MODULE ( filename , parentFilename ) ;
@@ -398,7 +409,8 @@ class ModuleLoader {
398409 throwIfPromiseRejected ( job . instantiated ) ;
399410 }
400411 if ( status !== kEvaluating ) {
401- assert . fail ( `Unexpected module status ${ status } . ` + raceMessage ) ;
412+ assert . fail ( `Unexpected module status ${ status } . ` +
413+ getRaceMessage ( filename , parentFilename ) ) ;
402414 }
403415 let message = `Cannot require() ES Module ${ filename } in a cycle.` ;
404416 if ( parentFilename ) {
0 commit comments