tsx icon indicating copy to clipboard operation
tsx copied to clipboard

Yarn PnP + ESM directory import - Error: Qualified path resolution failed

Open KcZer0 opened this issue 1 year ago • 4 comments

Acknowledgements

  • [X] I searched existing issues before opening this one to avoid duplicates
  • [X] I understand this is not a place for seek help, but to report a bug
  • [X] I understand that the bug must be proven first with a minimal reproduction
  • [x] I will be polite, respectful, and considerate of people's time and effort

Minimal reproduction URL

https://codesandbox.io/p/devbox/yarn-tsx-62dstm

Version

v4.9.3 (issue opened: v4.6.2)

Node.js version

v20.10.0

Package manager

yarn v4.2.2

Operating system

Windows

Problem & Expected behavior

What Happened:

When using Yarn PnP and ESM, directory import without explicit /index[.ts] results in error:

node:internal/process/esm_loader:40
      internalBinding('errors').triggerUncaughtException(
                                ^
Error: Qualified path resolution failed: we looked for the following paths, but none could be accessed.

Source path: <project path>/src
Not found: <project path>/src

Reproducible as in the codesandbox


Expected behaviour:

Should run without explicit /index[.ts] in import path


Tried solution:

I fixed this by adding / suffix the import path so it runs loaders.ts#L143. But I don't like the extra /.

So I cloned and linked tsx locally, and found that the error.code in loaders.ts#L202 is ERR_MODULE_NOT_FOUND in Yarn, so it doesn't run the tryDirectory.

Changing tryExtensions to tryDirectory here fixes this problem. tryDirectory will also fallback to the tryExtensions` in Line 122, so it shouldn't break anything else?

I'm not sure to open PR because it might cause slight slow down due to the multiple tries in tryDirectory, or this could be just a Yarn issue.

Notes:

  • No error for Yarn PnP with commonjs
  • No error for ESM without PnP (nodeLinker: node-modules)

Contributions

  • [ ] I plan to open a pull request for this issue
  • [ ] I plan to make a financial contribution to this project

KcZer0 avatar Dec 14 '23 09:12 KcZer0

I don't use PnP, but I'd be happy to review a PR with tests if you open one.

privatenumber avatar Dec 14 '23 14:12 privatenumber

Changing tryExtensions to tryDirectory here fixes this problem.

@KcZer0 I tried your fix (applying patch to tsx), but my script exited without any output.

nodeLinker: node-modules (link):

image

nodeLinker: pnp without patch (link):

image

nodeLinker: pnp with patch (link):

image

shigma avatar Feb 03 '24 20:02 shigma

~This seems to have been fixed in 4.9.0 (or thereabouts - I went from 4.8.2 and 4.9.2 and no longer neede the patch).~

My apologies; the problematic dependency was updated to use nodenext resolution.

mrginglymus avatar May 08 '24 18:05 mrginglymus

No, It's still not fixed in v4.9.3, updated the codesandbox repro.

I was planning to make a pull request to check if yarn is used. But I think it makes more sense for yarn to add the ERR_UNSUPPORTED_DIR_IMPORT instead.

KcZer0 avatar May 09 '24 07:05 KcZer0