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

Erronous import failure message #53806

Closed
dakhnod opened this issue Jul 11, 2024 · 12 comments · Fixed by #53859
Closed

Erronous import failure message #53806

dakhnod opened this issue Jul 11, 2024 · 12 comments · Fixed by #53859
Labels
loaders Issues and PRs related to ES module loaders

Comments

@dakhnod
Copy link

dakhnod commented Jul 11, 2024

Version

v20.10.0 up to v22.4.1

Platform

Linux dakhnod 6.5.0-10043-tuxedo #47 SMP PREEMPT_DYNAMIC Tue Jun  4 14:29:55 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Subsystem

No response

What steps will reproduce the bug?

  1. run npm install is-odd
  2. delete node_modules/is-odd/index.js
  3. start node
  4. run await import("is-odd")
    -> Should yield this message:
Uncaught:
Error: Cannot find package '/app/node_modules/is-odd/package.json' imported from /app/repl
    at legacyMainResolve (node:internal/modules/esm/resolve:210:26)
    at packageResolve (node:internal/modules/esm/resolve:829:14)
    at moduleResolve (node:internal/modules/esm/resolve:915:18)
    at defaultResolve (node:internal/modules/esm/resolve:1132:11)
    at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:557:12)
    at ModuleLoader.resolve (node:internal/modules/esm/loader:526:25)
    at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:249:38)
    at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:484:36)
    at TracingChannel.tracePromise (node:diagnostics_channel:337:14) {
  code: 'ERR_MODULE_NOT_FOUND'
}

complaining about not being able to find package.json, although that file exists.
What is really missing is index.js, since we deleted it.

How often does it reproduce? Is there a required condition?

always

What is the expected behavior? Why is that the expected behavior?

It would help if node reported about the really missing index.js, not the existing package.json

What do you see instead?

Node complains about not being able to find package.json, although that one clearly exists.

Additional information

No response

@avivkeller avivkeller added the loaders Issues and PRs related to ES module loaders label Jul 11, 2024
@avivkeller
Copy link
Member

Two questions:

Does this also occur with require?
Is this REPL specific, or does it occur with files?

@dakhnod
Copy link
Author

dakhnod commented Jul 11, 2024

> const odd = require ('is-odd');
Uncaught:
Error: Cannot find module '/app/node_modules/is-odd/index.js'. Please verify that the package.json has a valid "main" entry
    at tryPackage (node:internal/modules/cjs/loader:482:19)
    at Module._findPath (node:internal/modules/cjs/loader:765:18)
    at Module._resolveFilename (node:internal/modules/cjs/loader:1205:27)
    at Module._load (node:internal/modules/cjs/loader:1045:27)
    at TracingChannel.traceSync (node:diagnostics_channel:315:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:215:24)
    at Module.require (node:internal/modules/cjs/loader:1304:12)
    at require (node:internal/modules/helpers:123:16) {
  code: 'MODULE_NOT_FOUND',
  path: '/app/node_modules/is-odd/package.json',
  requestPath: 'is-odd'
}

require works properly.

Yep, also occurs in files:

root@18f9f8c95d94:/app# node app.mjs 
node:internal/modules/esm/resolve:210
  const resolvedOption = FSLegacyMainResolve(packageJsonUrlString, packageConfig.main, baseStringified);
                         ^

Error: Cannot find package '/app/node_modules/is-odd/package.json' imported from /app/app.mjs
    at legacyMainResolve (node:internal/modules/esm/resolve:210:26)
    at packageResolve (node:internal/modules/esm/resolve:829:14)
    at moduleResolve (node:internal/modules/esm/resolve:915:18)
    at defaultResolve (node:internal/modules/esm/resolve:1132:11)
    at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:557:12)
    at ModuleLoader.resolve (node:internal/modules/esm/loader:526:25)
    at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:249:38)
    at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:484:36)
    at TracingChannel.tracePromise (node:diagnostics_channel:337:14)
    at ModuleLoader.import (node:internal/modules/esm/loader:483:21) {
  code: 'ERR_MODULE_NOT_FOUND'
}

Node.js v22.4.1

@avivkeller
Copy link
Member

I'm not able to reproduce
screen-capture.webm

@dakhnod
Copy link
Author

dakhnod commented Jul 11, 2024

you need to delete the index.js

@avivkeller
Copy link
Member

Oh, okay

@avivkeller
Copy link
Member

avivkeller commented Jul 11, 2024

+ repro-exists:

$ npm i is-odd

added 2 packages in 329ms
                                                                                                                                                                                                                               
$ rm node_modules/is-odd/index.js    
                                                                                                                                                                                                                               
$ node        
Welcome to Node.js v22.4.1.
Type ".help" for more information.
> await import('is-odd')
Uncaught:
Error: Cannot find package '/node_modules/is-odd/package.json' imported from /repl
    at legacyMainResolve (node:internal/modules/esm/resolve:210:26)
    at packageResolve (node:internal/modules/esm/resolve:829:14)
    at moduleResolve (node:internal/modules/esm/resolve:915:18)
    at defaultResolve (node:internal/modules/esm/resolve:1132:11)
    at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:557:12)
    at ModuleLoader.resolve (node:internal/modules/esm/loader:526:25)
    at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:249:38)
    at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:484:36)
    at TracingChannel.tracePromise (node:diagnostics_channel:337:14) {
  code: 'ERR_MODULE_NOT_FOUND'
}
> 

@dakhnod
Copy link
Author

dakhnod commented Jul 11, 2024

So...does this confirm my description?

@avivkeller
Copy link
Member

Yup :-)

@targos
Copy link
Member

targos commented Jul 11, 2024

@nodejs/loaders

@targos
Copy link
Member

targos commented Jul 11, 2024

Note that the message was never precisely correct in ESM.
Behavior changed between Node.js 20.4.0 and 20.5.0.

In v20.4.0, the message was:

Error [ERR_MODULE_NOT_FOUND]: Cannot find package '/XXX/node_modules/is-odd/' imported from /XXX/test.js

@marco-ippolito
Copy link
Member

marco-ippolito commented Jul 15, 2024

I believe this is an edge case that has not been covered.
This might be the commit that might have introduced it a2a8e31, released in Node v20.5.0
cc @H4ad

@H4ad
Copy link
Member

H4ad commented Jul 15, 2024

I forgot to translate correctly the path fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)).

I will try open a PR soon.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
loaders Issues and PRs related to ES module loaders
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants