privatenumber / tsx

⚡️ TypeScript Execute | The easiest way to run TypeScript in Node.js
https://tsx.is
MIT License
9.75k stars 154 forks source link

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

Open KcZer0 opened 11 months ago

KcZer0 commented 11 months ago

Acknowledgements

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:

Contributions

privatenumber commented 11 months ago

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

shigma commented 9 months ago

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

mrginglymus commented 6 months ago

~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.

KcZer0 commented 6 months ago

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.