diff --git a/doc/api/errors.md b/doc/api/errors.md index 46234039cfb03d..ca2beef2dd5fd6 100644 --- a/doc/api/errors.md +++ b/doc/api/errors.md @@ -1964,7 +1964,12 @@ an `Error` with this code will be emitted. ### MODULE_NOT_FOUND - + A module file could not be resolved while attempting a [`require()`][] or `import` operation. diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 158dda2fdc04ee..e420a10e4867a1 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -606,9 +606,16 @@ Module._resolveFilename = function(request, parent, isMain, options) { // Look up the filename first, since that's the cache key. var filename = Module._findPath(request, paths, isMain); if (!filename) { + const requireStack = []; + for (var cursor = parent; + cursor; + cursor = cursor.parent) { + requireStack.push(cursor.filename || cursor.id); + } // eslint-disable-next-line no-restricted-syntax var err = new Error(`Cannot find module '${request}'`); err.code = 'MODULE_NOT_FOUND'; + err.requireStack = requireStack; throw err; } return filename; diff --git a/lib/internal/modules/esm/default_resolve.js b/lib/internal/modules/esm/default_resolve.js index 2cf9014a672ce0..33366f0069a8f1 100644 --- a/lib/internal/modules/esm/default_resolve.js +++ b/lib/internal/modules/esm/default_resolve.js @@ -66,8 +66,11 @@ function resolve(specifier, parentURL) { parentURL || pathToFileURL(`${process.cwd()}/`).href); } catch (e) { if (typeof e.message === 'string' && - StringStartsWith(e.message, 'Cannot find module')) + StringStartsWith(e.message, 'Cannot find module')) { e.code = 'MODULE_NOT_FOUND'; + // TODO: also add e.requireStack to match behavior with CJS + // MODULE_NOT_FOUND. + } throw e; }