diff --git a/CHANGELOG.md b/CHANGELOG.md index b8e80c85e0f3..40b77bf6a16c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ ## master +### Fixes + +* `[jest-resolve]` Add condition to avoid infinite loop when node module package main is ".". + ([#5344)](https://github.com/facebook/jest/pull/5344) + ### Features * `[jest-cli]` `--changedSince`: allow selectively running tests for code changed since arbitrary revisions. diff --git a/integration-tests/__tests__/resolve-node-module.test.js b/integration-tests/__tests__/resolve-node-module.test.js new file mode 100644 index 000000000000..bccde99d538a --- /dev/null +++ b/integration-tests/__tests__/resolve-node-module.test.js @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ +'use strict'; + +const runJest = require('../runJest'); + +test('resolve node module', () => { + const result = runJest('resolve-node-module'); + expect(result.status).toBe(0); +}); diff --git a/integration-tests/resolve-node-module/__mocks__/mock-jsx-module/index.jsx b/integration-tests/resolve-node-module/__mocks__/mock-jsx-module/index.jsx new file mode 100644 index 000000000000..dfca40e809c1 --- /dev/null +++ b/integration-tests/resolve-node-module/__mocks__/mock-jsx-module/index.jsx @@ -0,0 +1,8 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +module.exports = 'test jsx'; diff --git a/integration-tests/resolve-node-module/__mocks__/mock-jsx-module/package.json b/integration-tests/resolve-node-module/__mocks__/mock-jsx-module/package.json new file mode 100644 index 000000000000..14403b253601 --- /dev/null +++ b/integration-tests/resolve-node-module/__mocks__/mock-jsx-module/package.json @@ -0,0 +1,4 @@ +{ + "name": "mock-jsx-module", + "main": "." +} diff --git a/integration-tests/resolve-node-module/__mocks__/mock-module/index.js b/integration-tests/resolve-node-module/__mocks__/mock-module/index.js new file mode 100644 index 000000000000..acc83d1123dc --- /dev/null +++ b/integration-tests/resolve-node-module/__mocks__/mock-module/index.js @@ -0,0 +1,8 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +module.exports = 'test'; diff --git a/integration-tests/resolve-node-module/__mocks__/mock-module/package.json b/integration-tests/resolve-node-module/__mocks__/mock-module/package.json new file mode 100644 index 000000000000..d9bf69878606 --- /dev/null +++ b/integration-tests/resolve-node-module/__mocks__/mock-module/package.json @@ -0,0 +1,4 @@ +{ + "name": "mock-module", + "main": "." +} diff --git a/integration-tests/resolve-node-module/__tests__/resolve-node-module.test.js b/integration-tests/resolve-node-module/__tests__/resolve-node-module.test.js new file mode 100644 index 000000000000..b008272f042a --- /dev/null +++ b/integration-tests/resolve-node-module/__tests__/resolve-node-module.test.js @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +jest.mock('mock-module'); +jest.mock('mock-jsx-module'); + +it('should resolve entry as index.js when package main is "."', () => { + const mockModule = require('mock-module'); + expect(mockModule).toEqual('test'); +}); + +it('should resolve entry as index with other configured module file extention when package main is "."', () => { + const mockJsxModule = require('mock-jsx-module'); + expect(mockJsxModule).toEqual('test jsx'); +}); diff --git a/integration-tests/resolve-node-module/package.json b/integration-tests/resolve-node-module/package.json new file mode 100644 index 000000000000..0a586922137e --- /dev/null +++ b/integration-tests/resolve-node-module/package.json @@ -0,0 +1,6 @@ +{ + "jest": { + "moduleFileExtensions": ["js", "json", "jsx"], + "testEnvironment": "node" + } +} diff --git a/packages/jest-resolve/src/default_resolver.js b/packages/jest-resolve/src/default_resolver.js index 324777bec194..beffc1a19ef5 100644 --- a/packages/jest-resolve/src/default_resolver.js +++ b/packages/jest-resolve/src/default_resolver.js @@ -129,7 +129,7 @@ function resolveSync(target: Path, options: ResolverOptions): Path { pkgmain = JSON.parse(body).main; } catch (e) {} - if (pkgmain) { + if (pkgmain && pkgmain !== '.') { const resolveTarget = path.resolve(name, pkgmain); const result = tryResolve(resolveTarget); if (result) {