diff --git a/lib/internal/modules/esm/default_resolve.js b/lib/internal/modules/esm/default_resolve.js index 00461e7df1f684..60516535e9ad03 100644 --- a/lib/internal/modules/esm/default_resolve.js +++ b/lib/internal/modules/esm/default_resolve.js @@ -69,7 +69,9 @@ function resolve(specifier, parentURL) { throw e; } - if (!preserveSymlinks) { + const isMain = parentURL === undefined; + + if (!preserveSymlinks || isMain) { const real = realpathSync(getPathFromURL(url), { [internalFS.realpathCacheKey]: realpathCache }); @@ -83,7 +85,6 @@ function resolve(specifier, parentURL) { let format = extensionFormatMap[ext]; if (!format) { - const isMain = parentURL === undefined; if (isMain) format = 'cjs'; else diff --git a/test/es-module/test-esm-symlink-main.js b/test/es-module/test-esm-symlink-main.js new file mode 100644 index 00000000000000..f7631ef2e5bdca --- /dev/null +++ b/test/es-module/test-esm-symlink-main.js @@ -0,0 +1,25 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const path = require('path'); +const { spawn } = require('child_process'); +const tmpdir = require('../common/tmpdir'); +const fs = require('fs'); +tmpdir.refresh(); + +const realPath = path.resolve(__dirname, '../fixtures/es-modules/symlink.mjs'); +const symlinkPath = path.resolve(tmpdir.path, 'symlink.js'); + +try { + fs.symlinkSync(realPath, symlinkPath); +} catch (err) { + if (err.code !== 'EPERM') throw err; + common.skip('insufficient privileges for symlinks'); +} + +spawn(process.execPath, + ['--experimental-modules', '--preserve-symlinks', symlinkPath], + { stdio: 'inherit' }).on('exit', (code) => { + assert.strictEqual(code, 0); +}); diff --git a/test/fixtures/es-modules/symlink.mjs b/test/fixtures/es-modules/symlink.mjs new file mode 100644 index 00000000000000..8ce1299d1616bf --- /dev/null +++ b/test/fixtures/es-modules/symlink.mjs @@ -0,0 +1 @@ +export var symlinked = true;