From f1dc432943249dead3f19ac285fa02764c959f85 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 17 Jul 2019 14:02:00 +0200 Subject: [PATCH] fix: improve error on module not found --- CHANGELOG.md | 1 + .../moduleNameMapper.test.ts.snap | 2 + .../requireMissingExt.test.ts.snap | 32 +++++++++++++ .../resolveNoFileExtensions.test.ts.snap | 1 + e2e/__tests__/requireMissingExt.test.ts | 24 ++++++++++ e2e/require-missing-ext/package.json | 11 +++++ e2e/require-missing-ext/test.js | 14 ++++++ e2e/require-missing-ext/yarn.lock | 46 +++++++++++++++++++ packages/jest-environment-node/src/index.ts | 3 ++ packages/jest-runner/src/runTest.ts | 3 ++ 10 files changed, 137 insertions(+) create mode 100644 e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap create mode 100644 e2e/__tests__/requireMissingExt.test.ts create mode 100644 e2e/require-missing-ext/package.json create mode 100644 e2e/require-missing-ext/test.js create mode 100644 e2e/require-missing-ext/yarn.lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 457da1fd06b0..a4a5306f988e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### Fixes - `[jest-leak-detector]` Wait properly for GC runs due to changes in Node 14.7 ([#10366](https://github.com/facebook/jest/pull/10366)) +- `[jest-resolve]` Improve error on module not found deep in the `require` stack ([#8704](https://github.com/facebook/jest/pull/8704) - `[jest-worker]` Downgrade minimum node version to 10.13 ([#10352](https://github.com/facebook/jest/pull/10352)) ### Chore & Maintenance diff --git a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap index 699e8d38612f..31d4251492a8 100644 --- a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap +++ b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap @@ -43,6 +43,7 @@ FAIL __tests__/index.js at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:552:17) at Object.require (index.js:10:1) + at Object.require (__tests__/index.js:10:20) `; exports[`moduleNameMapper wrong configuration 1`] = ` @@ -72,4 +73,5 @@ FAIL __tests__/index.js at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:552:17) at Object.require (index.js:10:1) + at Object.require (__tests__/index.js:10:20) `; diff --git a/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap b/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap new file mode 100644 index 000000000000..61bea856c8c4 --- /dev/null +++ b/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap @@ -0,0 +1,32 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`shows a proper error from deep requires 1`] = ` +FAIL ./test.js + ● Test suite failed to run + + Cannot find module '../package' from 'node_modules/discord.js/src/index.js' + + Require stack: + node_modules/discord.js/src/index.js + test.js + + + However, Jest was able to find: + '../package.json' + + You might want to include a file extension in your import, or update your 'moduleFileExtensions', which is currently ['js']. + + See https://jestjs.io/docs/en/configuration#modulefileextensions-arraystring + + 8 | 'use strict'; + 9 | + > 10 | require('discord.js'); + | ^ + 11 | + 12 | test('dummy', () => { + 13 | expect(1).toBe(1); + + at Resolver.resolveModule (../../packages/jest-resolve/build/index.js:299:11) + at Object. (node_modules/discord.js/src/index.js:21:12) + at Object.require (test.js:10:1) +`; diff --git a/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap b/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap index 05fe96e8e68e..bccb83eefda7 100644 --- a/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap +++ b/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap @@ -39,4 +39,5 @@ FAIL __tests__/test.js at Resolver.resolveModule (../../packages/jest-resolve/build/index.js:307:11) at Object.require (index.js:8:18) + at Object.require (__tests__/test.js:8:11) `; diff --git a/e2e/__tests__/requireMissingExt.test.ts b/e2e/__tests__/requireMissingExt.test.ts new file mode 100644 index 000000000000..a3eb2c264767 --- /dev/null +++ b/e2e/__tests__/requireMissingExt.test.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. 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. + */ + +import path from 'path'; +import wrap from 'jest-snapshot-serializer-raw'; +import {extractSummary, run} from '../Utils'; +import runJest from '../runJest'; + +const dir = path.resolve(__dirname, '../require-missing-ext'); + +beforeEach(() => { + run('yarn', dir); +}); + +test('shows a proper error from deep requires', () => { + const {stderr} = runJest(dir); + const {rest} = extractSummary(stderr); + + expect(wrap(rest)).toMatchSnapshot(); +}); diff --git a/e2e/require-missing-ext/package.json b/e2e/require-missing-ext/package.json new file mode 100644 index 000000000000..9a156e8c5f0a --- /dev/null +++ b/e2e/require-missing-ext/package.json @@ -0,0 +1,11 @@ +{ + "jest": { + "moduleFileExtensions": [ + "js" + ], + "testEnvironment": "node" + }, + "dependencies": { + "discord.js": "11.5.1" + } +} diff --git a/e2e/require-missing-ext/test.js b/e2e/require-missing-ext/test.js new file mode 100644 index 000000000000..55370ccafe8f --- /dev/null +++ b/e2e/require-missing-ext/test.js @@ -0,0 +1,14 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. 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'; + +require('discord.js'); + +test('dummy', () => { + expect(1).toBe(1); +}); diff --git a/e2e/require-missing-ext/yarn.lock b/e2e/require-missing-ext/yarn.lock new file mode 100644 index 000000000000..6db023090213 --- /dev/null +++ b/e2e/require-missing-ext/yarn.lock @@ -0,0 +1,46 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +discord.js@11.5.1: + version "11.5.1" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-11.5.1.tgz#910fb9f6410328581093e044cafb661783a4d9e8" + integrity sha512-tGhV5xaZXE3Z+4uXJb3hYM6gQ1NmnSxp9PClcsSAYFVRzH6AJH74040mO3afPDMWEAlj8XsoPXXTJHTxesqcGw== + dependencies: + long "^4.0.0" + prism-media "^0.0.3" + snekfetch "^3.6.4" + tweetnacl "^1.0.0" + ws "^6.0.0" + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +prism-media@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-0.0.3.tgz#8842d4fae804f099d3b48a9a38e3c2bab6f4855b" + integrity sha512-c9KkNifSMU/iXT8FFTaBwBMr+rdVcN+H/uNv1o+CuFeTThNZNTOrQ+RgXA1yL/DeLk098duAeRPP3QNPNbhxYQ== + +snekfetch@^3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/snekfetch/-/snekfetch-3.6.4.tgz#d13e80a616d892f3d38daae4289f4d258a645120" + integrity sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw== + +tweetnacl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.1.tgz#2594d42da73cd036bd0d2a54683dd35a6b55ca17" + integrity sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A== + +ws@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" diff --git a/packages/jest-environment-node/src/index.ts b/packages/jest-environment-node/src/index.ts index 51a803cc5e9b..25d3ef232b60 100644 --- a/packages/jest-environment-node/src/index.ts +++ b/packages/jest-environment-node/src/index.ts @@ -60,6 +60,9 @@ class NodeEnvironment implements JestEnvironment { global.queueMicrotask = queueMicrotask; } installCommonGlobals(global, config.globals); + // Node's error-message stack size is limited at 10, but it's pretty useful + // to see more than that when a test fails. + global.Error.stackTraceLimit = 100; this.moduleMocker = new ModuleMocker(global); const timerIdToRef = (id: number) => ({ diff --git a/packages/jest-runner/src/runTest.ts b/packages/jest-runner/src/runTest.ts index dedd560cc12c..33cd7905fe50 100644 --- a/packages/jest-runner/src/runTest.ts +++ b/packages/jest-runner/src/runTest.ts @@ -232,6 +232,9 @@ async function runTestInternal( globalConfig.coverageProvider === 'v8' && typeof environment.getVmContext === 'function'; + // Node's error-message stack size is limited at 10, but it's pretty useful + // to see more than that when a test fails. + Error.stackTraceLimit = 100; try { await environment.setup();