From 383bbf72f38d46ce515d4a8d54cef0f291a03f38 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 17 Jun 2022 13:52:42 +0800 Subject: [PATCH 1/2] module: also enable subpath imports in REPL --- lib/internal/modules/cjs/loader.js | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 11e029b258aa9a..aef884380390e6 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -906,20 +906,19 @@ Module._resolveFilename = function(request, parent, isMain, options) { paths = Module._resolveLookupPaths(request, parent); } - if (parent?.filename) { - if (request[0] === '#') { - const pkg = readPackageScope(parent.filename) || {}; - if (pkg.data?.imports != null) { - try { - return finalizeEsmResolution( - packageImportsResolve(request, pathToFileURL(parent.filename), - cjsConditions), parent.filename, - pkg.path); - } catch (e) { - if (e.code === 'ERR_MODULE_NOT_FOUND') - throw createEsmNotFoundErr(request); - throw e; - } + if (request[0] === '#' && (parent?.filename || parent?.id === '')) { + const parentPath = parent?.filename ?? process.cwd() + path.sep; + const pkg = readPackageScope(parentPath) || {}; + if (pkg.data?.imports != null) { + try { + return finalizeEsmResolution( + packageImportsResolve(request, pathToFileURL(parentPath), + cjsConditions), parentPath, + pkg.path); + } catch (e) { + if (e.code === 'ERR_MODULE_NOT_FOUND') + throw createEsmNotFoundErr(request); + throw e; } } } From 659011886f5df61fe0b22a81553adba0de5c4c3d Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 17 Jun 2022 19:13:07 +0800 Subject: [PATCH 2/2] test: add test for repl subpath imports --- test/es-module/test-esm-repl-imports.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 test/es-module/test-esm-repl-imports.js diff --git a/test/es-module/test-esm-repl-imports.js b/test/es-module/test-esm-repl-imports.js new file mode 100644 index 00000000000000..d2b39e05fb0588 --- /dev/null +++ b/test/es-module/test-esm-repl-imports.js @@ -0,0 +1,19 @@ +'use strict'; +const { mustCall } = require('../common'); +const assert = require('assert'); +const fixtures = require('../common/fixtures'); +const { spawn } = require('child_process'); + +const child = spawn(process.execPath, [ + '--interactive', +], { + cwd: fixtures.path('es-modules', 'pkgimports'), +}); + +child.stdin.end( + 'try{require("#test");await import("#test")}catch{process.exit(-1)}' +); + +child.on('exit', mustCall((code) => { + assert.strictEqual(code, 0); +}));