'use strict'; const { spawnPromisified, skip } = require('../common'); const tmpdir = require('../common/tmpdir'); // Invoke the main file via a symlink. In this case --preserve-symlinks-main // dictates that it'll resolve relative imports in the main file relative to // the symlink, and not relative to the symlink target; the file structure set // up below requires this to not crash when loading ./submodule_link.js const assert = require('node:assert'); const fs = require('node:fs'); const path = require('node:path'); const { execPath } = require('node:process'); const { describe, it } = require('node:test'); tmpdir.refresh(); const tmpDir = tmpdir.path; fs.mkdirSync(path.join(tmpDir, 'nested')); fs.mkdirSync(path.join(tmpDir, 'nested2')); const entry = path.join(tmpDir, 'nested', 'entry.js'); const entry_link_absolute_path = path.join(tmpDir, 'index.js'); const submodule = path.join(tmpDir, 'nested2', 'submodule.js'); const submodule_link_absolute_path = path.join(tmpDir, 'submodule_link.js'); fs.writeFileSync(entry, ` const assert = require('assert'); // this import only resolves with --preserve-symlinks-main set require('./submodule_link.js'); `); fs.writeFileSync(submodule, ''); try { fs.symlinkSync(entry, entry_link_absolute_path); fs.symlinkSync(submodule, submodule_link_absolute_path); } catch (err) { if (err.code !== 'EPERM') throw err; skip('insufficient privileges for symlinks'); } describe('Invoke the main file via a symlink.', { concurrency: !process.env.TEST_PARALLEL }, () => { it('should resolve relative imports in the main file', async () => { const { code } = await spawnPromisified(execPath, [ '--preserve-symlinks', '--preserve-symlinks-main', entry_link_absolute_path, ]); assert.strictEqual(code, 0); }); it('should resolve relative imports in the main file when file extension is omitted', async () => { const entry_link_absolute_path_without_ext = path.join(tmpDir, 'index'); const { code } = await spawnPromisified(execPath, [ '--preserve-symlinks', '--preserve-symlinks-main', entry_link_absolute_path_without_ext, ]); assert.strictEqual(code, 0); }); it('should resolve relative imports in the main file when filename(index.js) is omitted', async () => { const { code } = await spawnPromisified(execPath, [ '--preserve-symlinks', '--preserve-symlinks-main', tmpDir, ]); assert.strictEqual(code, 0); }); });