Open
Description
Self-service
- I'd be willing to implement a fix
Describe the bug
The yarnpkg.org protocols page talks about self reference support. "Tip: Yarn 2 implements support for self-references ...". I tried it on a simple project (no babel, typescript, etc) and it unfortunately does not work.
This feature seems scarcely documented. My suspicion is that this feature only works with workspaces or with yarn PnP, but this requirement is not mentioned anywhere, so I presumed this behavior is unintended
Error message:
node:internal/errors:490
ErrorCaptureStackTrace(err);
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'somename' imported from /code/somedir/second.js
at new NodeError (node:internal/errors:399:5)
at packageResolve (node:internal/modules/esm/resolve:783:9)
at moduleResolve (node:internal/modules/esm/resolve:832:20)
at defaultResolve (node:internal/modules/esm/resolve:1069:11)
at DefaultModuleLoader.resolve (node:internal/modules/esm/loader:305:12)
at DefaultModuleLoader.getModuleJob (node:internal/modules/esm/loader:156:32)
at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:76:33)
at link (node:internal/modules/esm/module_job:75:36) {
code: 'ERR_MODULE_NOT_FOUND'
}
Node.js v20.2.0
To reproduce
const fs = require('fs')
fs.writeFileSync('.yarnrc.yml', 'nodeLinker: node-modules \r\n')
await packageJson({ name: 'somename', "type": "module",
dependencies: {
"fastify": "^4.17.0",
},
})
await yarn('install')
expect(fs.existsSync('node_modules/somename')).toBe(true)
non-sherlock steps to reproduce:
- create new project:
yarn init
- edit package.json, adding "type": "module" and set the "name" property. It can look something like this:
{
"name": "somename",
"packageManager": "[email protected]",
"type": "module",
}
- create a directory "somedir":
mkdir somedir
- create a file "first.js" inside the directory somedir, and create a simple function and export it as ES Module:
function someFunc() {
console.log("test")
return "test"
}
export default someFunc;
- create file second.js. import first.js as ES Module and invoke the function:
import someFunc from 'somename/first.js';
someFunc();
run second.js: node somedir/second.js
you will get the error above.
using --preseve-symlinks does not work either.
Environment
System:
OS: Linux 6.3 Gentoo Linux
CPU: (8) x64 AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx
Binaries:
Node: 20.2.0 - /tmp/xfs-77868d5e/node
Yarn: 3.5.1 - /tmp/xfs-77868d5e/yarn
npm: 9.6.6 - /usr/bin/npm
Additional context
No response