diff --git a/packages/metro-file-map/src/lib/TreeFS.js b/packages/metro-file-map/src/lib/TreeFS.js index bb0dd649fa..819d59bcc9 100644 --- a/packages/metro-file-map/src/lib/TreeFS.js +++ b/packages/metro-file-map/src/lib/TreeFS.js @@ -559,13 +559,13 @@ export default class TreeFS implements MutableFileSystem { typeof literalSymlinkTarget === 'string', 'Expected symlink target to be populated.', ); - if (path.isAbsolute(literalSymlinkTarget)) { - normalSymlinkTarget = path.relative(this.#rootDir, literalSymlinkTarget); - } else { - normalSymlinkTarget = path.normalize( - path.join(path.dirname(canonicalPathOfSymlink), literalSymlinkTarget), - ); - } + const absoluteSymlinkTarget = path.resolve( + this.#rootDir, + canonicalPathOfSymlink, + '..', // Symlink target is relative to its containing directory. + literalSymlinkTarget, // May be absolute, in which case the above are ignored + ); + normalSymlinkTarget = path.relative(this.#rootDir, absoluteSymlinkTarget); this.#cachedNormalSymlinkTargets.set(symlinkNode, normalSymlinkTarget); return normalSymlinkTarget; } diff --git a/packages/metro-file-map/src/lib/__tests__/TreeFS-test.js b/packages/metro-file-map/src/lib/__tests__/TreeFS-test.js index dad4e0948b..c611d2bc7a 100644 --- a/packages/metro-file-map/src/lib/__tests__/TreeFS-test.js +++ b/packages/metro-file-map/src/lib/__tests__/TreeFS-test.js @@ -37,7 +37,7 @@ describe.each([['win32'], ['posix']])('TreeFS on %s', platform => { [p('foo/link-to-another.js'), ['', 0, 0, 0, '', '', p('another.js')]], [p('../outside/external.js'), ['', 0, 0, 0, '', '', 0]], [p('bar.js'), ['bar', 234, 0, 0, '', '', 0]], - [p('link-to-foo'), ['', 456, 0, 0, '', '', p('././abnormal/../foo')]], + [p('link-to-foo'), ['', 456, 0, 0, '', '', p('./../project/foo')]], [p('abs-link-out'), ['', 456, 0, 0, '', '', p('/outside/./baz/..')]], [p('root'), ['', 0, 0, 0, '', '', '..']], [p('link-to-nowhere'), ['', 123, 0, 0, '', '', p('./nowhere')]],