Skip to content

VSCode Plugin does not handle symlinks correctly #2364

@sirinsidiator

Description

@sirinsidiator

Describe the bug

The plugin won't initialize when the project folder contains two or more symbolic links that point to the root of the project and as a result no svelte related features like autocompletion work.

This happens for example when using svelte in a tauri project together with the cxx library.
When the project is compiled, cxx creates multiple symbolic links that point to the project root inside the target folder, as described here.

Reproduction

The issue can be reproduced with a newly created svelte project (using the default options):

npm create svelte@latest my-app
cd my-app
npm install
code .

Ensure svelte vs code plugin is on, then open e.g. Counter.svelte and try using autocompletion on "display_counter." and notice how it still works as expected.

Svelte plugin output at this point:

Initialize language server at  file:///r%3A/my-app
Initialize new ts service at  r:/my-app/jsconfig.json
Trying to load configs for r:/my-app
Loaded config at  r:\my-app\svelte.config.js
SnapshotManager File Statistics:
Project files: 22
Svelte files: 7
From node_modules: 0
Total: 22
Initialize new ts service at  
Trying to load configs for r:\my-app

Next create two symbolic link to the project root using powershell for example:

New-Item -Path test1 -ItemType SymbolicLink -Value .
New-Item -Path test2 -ItemType SymbolicLink -Value .

Afterwards restart the extension host in vscode and try autocompletion again.
It no longer works and only shows "Loading..." forever. The Svelte plugin output looks like this:

Initialize language server at  file:///r%3A/my-app
Initialize new ts service at  r:/my-app/jsconfig.json
Trying to load configs for r:/my-app

After the symbolic links are removed and the extension host is restarted, it works again.

Expected behaviour

The plugin should operate normally, regardless of any symbolic links to the project root.

System Info

  • OS: Windows 11
  • IDE: VSCode

Which package is the issue about?

Svelte for VS Code extension

Additional Information, eg. Screenshots

When only one symbolic link exists in the project, The autocompletion works, but the plugin contains some very interesting output, that may explain why it fails to load:

Initialize language server at  file:///r%3A/my-app
Initialize new ts service at  r:/my-app/jsconfig.json
Trying to load configs for r:/my-app
Loaded config at  r:\my-app\svelte.config.js
Loaded config at  r:\my-app\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
Loaded config at  r:\my-app\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\test1\svelte.config.js
SnapshotManager File Statistics:
Project files: 22
Svelte files: 7
From node_modules: 0
Total: 22
Initialize new ts service at  
Trying to load configs for r:\my-app

It seems that it looks for svelte.config.js files inside any folder it can find and runs into some infinite loop when there are multiple symbolic links.

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