Skip to content

Infinite recursion in getOrCreateFolderTestItemΒ #600

@eirikur-nc

Description

@eirikur-nc

Describe the bug

Under certain conditions, the Vitest extension crashes on startup with the error

[Error RangeError] Maximum call stack size exceeded

The stack trace shows that the recursion occurs within TestTree.getOrCreateFolderTestItem

By manually modifying the local distribution of the extension to log out the file path, I see the following

[INFO 11:18:17 AM] [API] /Users/eirikurtorfason/projects/spine/libs/typescript/react/ui/src/Button
[INFO 11:18:17 AM] [API] /Users/eirikurtorfason/projects/spine/libs/typescript/react/ui/src
[INFO 11:18:17 AM] [API] /Users/eirikurtorfason/projects/spine/libs/typescript/react/ui
[INFO 11:18:17 AM] [API] /Users/eirikurtorfason/projects/spine/libs/typescript/react
[INFO 11:18:17 AM] [API] /Users/eirikurtorfason/projects/spine/libs/typescript
[INFO 11:18:17 AM] [API] /Users/eirikurtorfason/projects/spine/libs
[INFO 11:18:17 AM] [API] /Users/eirikurtorfason/projects/spine
[INFO 11:18:17 AM] [API] /Users/eirikurtorfason/projects
[INFO 11:18:17 AM] [API] /Users/eirikurtorfason
[INFO 11:18:17 AM] [API] /Users
[INFO 11:18:17 AM] [API] /
[INFO 11:18:17 AM] [API] /
[INFO 11:18:17 AM] [API] /
[INFO 11:18:17 AM] [API] /
[INFO 11:18:17 AM] [API] /
...repeated until the stack is exhausted

The problematic line is likely this one

const parentItem = this.getOrCreateFolderTestItem(api, dirname(file))

It would appear that there's an assumption that a cached result will be hit during a reverse traversal through the directory path. When that precondition is not met, an infinite recursion occurs.

Reproduction

Here's a GitHub repo that can be used to reproduce the error
https://github.com/eirikur-nc/vitest-explorer-bug-repro

It contains a multi-root workspace file and a vitest.workspace.ts file.
I can add one project to vitest.workspace.ts

export default ['apps/web']

As soon as I add the second one the error occurs

export default ['apps/web', 'libs/utils']

My VS code workspace has a folder definition for the former project. The second project does not. It's located under a symlinked root folder.

{
  "folders": [
    {
      "name": "<root>",
      "path": ".root-symlink"
    },
    {
      "name": "apps/web",
      "path": "apps/web"
    },

Output

[INFO 10:58:15 PM] [v1.20.3] Vitest extension is activated because Vitest is installed or there is a Vite/Vitest config file in the workspace.
[INFO 10:58:15 PM] [API] Resolving workspace configs: vitest.workspace.ts
[INFO 10:58:15 PM] [API] Running Vitest v3.2.3 (.root-symlink/vitest.workspace.ts) with "/Users/eirikurtorfason/.local/state/fnm_multishells/41974_1749766660214/bin/node /Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/worker.js"
[INFO 10:58:15 PM] [Worker]  DEPRECATED  The workspace file is deprecated and will be removed in the next major. Please, use the `projects` field in the root config file instead.
[INFO 10:58:15 PM] [API] Resolving configs: src/vitest.config.ts
[INFO 10:58:15 PM] [API] Ignoring config src/vitest.config.ts because there is a workspace config in the parent folder
[Error 10:58:16 PM] [Error RangeError] Maximum call stack size exceeded
RangeError: Maximum call stack size exceeded
	at String.replace (<anonymous>)
	at Bt (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:7:36244)
	at B (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:7:37965)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4376)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)
	at Fr.getOrCreateFolderTestItem (/Users/eirikurtorfason/.vscode/extensions/vitest.explorer-1.20.3/dist/extension.js:17:4348)

Extension Version

1.20.3

Vitest Version

3.2.3

Validations

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions