Skip to content

Commit 106e5ce

Browse files
coreyfarrellBethGriggs
authored andcommitted
repl: fix referrer for dynamic import
The ESM loader does not accept a directory as the referrer, it requires a path within the directory. Add `/repl` to ensure relative dynamic imports can succeed. Fixes: #19570 PR-URL: #30609 Reviewed-By: Gus Caplan <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Ben Coe <[email protected]>
1 parent a81eae6 commit 106e5ce

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

‎lib/repl.js‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,10 +324,12 @@ function REPLServer(prompt,
324324
if(code==='\n')
325325
returncb(null);
326326

327-
letpwd;
327+
letparentURL;
328328
try{
329329
const{ pathToFileURL }=require('url');
330-
pwd=pathToFileURL(process.cwd()).href;
330+
// Adding `/repl` prevents dynamic imports from loading relative
331+
// to the parent of `process.cwd()`.
332+
parentURL=pathToFileURL(path.join(process.cwd(),'repl')).href;
331333
}catch{
332334
}
333335
while(true){
@@ -342,7 +344,7 @@ function REPLServer(prompt,
342344
filename: file,
343345
displayErrors: true,
344346
importModuleDynamically: experimentalModules ? async(specifier)=>{
345-
returnasyncESM.ESMLoader.import(specifier,pwd);
347+
returnasyncESM.ESMLoader.import(specifier,parentURL);
346348
} : undefined
347349
});
348350
}catch(e){
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use strict';
2+
constcommon=require('../common');
3+
constassert=require('assert');
4+
constcp=require('child_process');
5+
constfixtures=require('../common/fixtures');
6+
7+
constargs=[
8+
'--interactive',
9+
'--experimental-repl-await',
10+
'--experimental-modules'
11+
];
12+
13+
constopts={cwd: fixtures.path('es-modules')};
14+
constchild=cp.spawn(process.execPath,args,opts);
15+
16+
letoutput='';
17+
child.stdout.setEncoding('utf8');
18+
child.stdout.on('data',(data)=>{
19+
output+=data;
20+
});
21+
22+
child.on('exit',common.mustCall(()=>{
23+
constresults=output.replace(/^>/mg,'').split('\n').slice(2);
24+
assert.deepStrictEqual(results,['[Module]{message: \'A message\'}','']);
25+
}));
26+
27+
child.stdin.write('await import(\'./message.mjs\');\n');
28+
child.stdin.write('.exit');
29+
child.stdin.end();

0 commit comments

Comments
(0)