From 836f8fda216ea23c5361a5785bf5d79a4fba5036 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 25 Oct 2017 16:38:19 +0100 Subject: [PATCH 1/4] Preserve module identity for symlinks --- integration_tests/__tests__/resolve.test.js | 6 +++++- integration_tests/resolve/__tests__/resolve.test.js | 6 ++++++ packages/jest-resolve/src/default_resolver.js | 6 +++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/integration_tests/__tests__/resolve.test.js b/integration_tests/__tests__/resolve.test.js index 24bc9a436ae6..f9b50c4c4508 100644 --- a/integration_tests/__tests__/resolve.test.js +++ b/integration_tests/__tests__/resolve.test.js @@ -12,5 +12,9 @@ const runJest = require('../runJest'); test('resolve platform modules', () => { const result = runJest('resolve'); - expect(result.status).toBe(0); + const didFail = result.status !== 0; + if (didFail) { + console.log(result.stderr); + } + expect(didFail).toBe(false); }); diff --git a/integration_tests/resolve/__tests__/resolve.test.js b/integration_tests/resolve/__tests__/resolve.test.js index 7e66c5d06c8e..41a840c2d56d 100644 --- a/integration_tests/resolve/__tests__/resolve.test.js +++ b/integration_tests/resolve/__tests__/resolve.test.js @@ -56,3 +56,9 @@ test('should resolve filename.json', () => { expect(testRequire('../test4')).not.toThrow(); expect(platform.extension).toBe('json'); }); + +test('should preserve identity for symlinks', () => { + expect(require('../../../packages/jest-resolve')).toBe( + require('jest-resolve') + ); +}); diff --git a/packages/jest-resolve/src/default_resolver.js b/packages/jest-resolve/src/default_resolver.js index 56c4fc539a38..30a5c5151d4c 100644 --- a/packages/jest-resolve/src/default_resolver.js +++ b/packages/jest-resolve/src/default_resolver.js @@ -25,7 +25,6 @@ export default function defaultResolver( options: ResolverOptions, ): Path { const resolve = options.browser ? browserResolve.sync : resolveSync; - return resolve(path, { basedir: options.basedir, extensions: options.extensions, @@ -94,6 +93,11 @@ function resolveSync(target: Path, options: ResolverOptions): Path { if (isDirectory(dir)) { result = resolveAsFile(name) || resolveAsDirectory(name); } + if (result) { + // Dereference symlinks to ensure we don't create a separate + // module instance depending on how it was referenced. + result = fs.realpathSync(result); + } return result; } From a1c65e981c63959c379425f518e2f52e4d861308 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 25 Oct 2017 16:52:47 +0100 Subject: [PATCH 2/4] Add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e07e38a4ac6a..33808e0697bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * `[jest-message-util]` Always remove node internals from stacktraces ([#4695](https://github.com/facebook/jest/pull/4695)) * `[jest-resolve]` changes method of determining builtin modules to include missing builtins ([#4740](https://github.com/facebook/jest/pull/4740)) * `[pretty-format]` Prevent error in pretty-format for window in jsdom test env ([#4750](https://github.com/facebook/jest/pull/4750)) +* `[jest-resolve]` Preserve module identity for symlinks ([#4761](https://github.com/facebook/jest/pull/4761)) ### Features * `[jest-environment-*]` [**BREAKING**] Add Async Test Environment APIs, dispose is now teardown ([#4506](https://github.com/facebook/jest/pull/4506)) From 8f651e7dbf79b65f5ca4027f135946a039ee9e45 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 25 Oct 2017 16:57:24 +0100 Subject: [PATCH 3/4] Remove unintentional whitespace change --- packages/jest-resolve/src/default_resolver.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/jest-resolve/src/default_resolver.js b/packages/jest-resolve/src/default_resolver.js index 30a5c5151d4c..324777bec194 100644 --- a/packages/jest-resolve/src/default_resolver.js +++ b/packages/jest-resolve/src/default_resolver.js @@ -25,6 +25,7 @@ export default function defaultResolver( options: ResolverOptions, ): Path { const resolve = options.browser ? browserResolve.sync : resolveSync; + return resolve(path, { basedir: options.basedir, extensions: options.extensions, From 50f000e241cdff7e80a3d5eed231841231ce0038 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 25 Oct 2017 18:55:40 +0100 Subject: [PATCH 4/4] Revert integration test to undebuggable state --- integration_tests/__tests__/resolve.test.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/integration_tests/__tests__/resolve.test.js b/integration_tests/__tests__/resolve.test.js index f9b50c4c4508..24bc9a436ae6 100644 --- a/integration_tests/__tests__/resolve.test.js +++ b/integration_tests/__tests__/resolve.test.js @@ -12,9 +12,5 @@ const runJest = require('../runJest'); test('resolve platform modules', () => { const result = runJest('resolve'); - const didFail = result.status !== 0; - if (didFail) { - console.log(result.stderr); - } - expect(didFail).toBe(false); + expect(result.status).toBe(0); });