Skip to content

[Bug?]: Self Reference Symlinks Are not Created #5466

Open
@nezartarbin

Description

@nezartarbin

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingreproducibleThis issue can be successfully reproduced

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions