Skip to content

Circular symlinks in .output/server/node_modules for packages with mutual dependencies #33

@3kh0

Description

@3kh0

Environment

  • nf3: latest (via nitro)
  • Nitro: latest (via nuxt)
  • Nuxt: 4.4.2
  • Package Manager: bun 1.3.9
  • OS: Linux (GitHub Actions runner)

Reproduction

  1. Clone https://github.com/hackclub/aegis
  2. Go to the package.json and edit the build script to just nuxt build
  3. Try to run the build on GitHub actions or use the provided Dockerfile

Describe the bug

When building a Nuxt app that depends on vue and @vue/server-renderer (which have mutual peer dependencies), nf3's hoisting logic creates circular symlinks in .output/server/node_modules, resulting in an ELOOP: too many symbolic links encountered error on some build systems (this appears to happen on my Coolify server and GitHub Actions

The symlink chain looks like:

.output/server/node_modules/@vue/server-renderer/node_modules/vue
  → .nf3/vue@X.Y.Z

.output/server/node_modules/vue/node_modules/@vue/server-renderer
  → .nf3/@vue/server-renderer@X.Y.Z

Since vue at the top level is itself symlinked to .nf3/vue@X.Y.Z, any tool that follows symlinks (like Vercel's deployment scanner or scandir) enters an infinite loop:

@vue/server-renderer → vue → @vue/server-renderer → vue → ...

Note that I used Claude Opus to help describe the error, as this is largely unknown territory for me.

Additional context

No response

Logs

[success] [@nuxt/fonts] Fonts downloaded and cached.
[success] [nitro] Generated public .output/public
[info] [nitro] Building Nuxt Nitro server (preset: `node-server`, compatibility date: `2025-07-15`)
[success] [nitro] Nuxt Nitro server built
[Error: ELOOP: too many symbolic links encountered, scandir '/home/runner/work/aegis/aegis/.output/server/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules'] {
  errno: -40,
  code: 'ELOOP',
  syscall: 'scandir',
  path: '/home/runner/work/aegis/aegis/.output/server/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules/vue/node_modules/@vue/server-renderer/node_modules'
} 

error: script "build" exited with code 1
Error: Process completed with exit code 1.

Context: https://github.com/hackclub/aegis/actions/runs/23695583158/job/69030241137?pr=8

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions