Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More detailed not_found error #260

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/sync.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ module.exports = function resolveSync(x, options) {
if (n) return maybeRealpathSync(realpathSync, n, opts);
}

var err = new Error("Cannot find module '" + x + "' from '" + parent + "'");
var err = new Error("Cannot find module '" + x + "' from '" + parent + "'. Please verify that module installed, the package.json has 'main' field or module has index.js file");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a bit unclear what this is saying. What module should the user verify?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The one is not found

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok - why is "installed" here? obviously you can't resolve anything that's not installed.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can remove this obvious part: Please verify that the module's package.json has 'main' field or it has index.js file

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess I’m wondering why all of this isn’t obvious. Modules must be installed to be resolved, and if it doesn’t have a “main” (explicit or implicit) then there’s nothing to resolve in the first place.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As you can see on my example, it isn't obvious)
The case is: I have an installed module stretch-layout. It has neither index.js, nor main field in package.json. But it has module field in package.json (which is not even in spec yet) and it seems enough for bundler to resolve and build this module. And my point is that error "Cannot find module" is not precise enough, because there is module. But it's not prepared accurately. I think it's a bad pattern for that module, but it would be great if libraries like resolve, which are used by many other libraries, could detect error more precisely or even add support for module field, but it seems like more discussional change.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The module field is both not standard, and also never ever will be - it's something a couple bundlers use that they never should have, and that no tooling should support by default.

Indeed, that library is broken, and given that it doesn't even have a repo link, a "main", or "exports", i'd suggest avoiding it entirely.

While I agree a better error message here might be helpful, it'd be being shown to the consumer, who has no ability to fix the situation - only to perhaps file an issue. That's not going to help you in this case, because this package has no way to do so.

err.code = 'MODULE_NOT_FOUND';
throw err;

Expand Down
4 changes: 2 additions & 2 deletions test/resolver_sync.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ test('foo', function (t) {
},
{
name: 'Error',
message: "Cannot find module 'foo' from '" + path.join(dir, 'bar.js') + "'"
message: "Cannot find module 'foo' from '" + path.join(dir, 'bar.js') + "'. Please verify that module installed, the package.json has 'main' field or module has index.js file"
}
);

Expand Down Expand Up @@ -275,7 +275,7 @@ test('sync: #121 - treating an existing file as a dir when no basedir', function
st.equal(e.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve');
st.equal(
e.message,
'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'',
'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'. Please verify that module installed, the package.json has \'main\' field or module has index.js file',
'can not find nonexistent module'
);
}
Expand Down