Skip to content

Slow createProjectProgram/createWatchProgram  #2398

@vilicvane

Description

@vilicvane

Repro

{
  "parserOptions": {
    "project": "./*/**/tsconfig.json"
  }
}

I use ./*/**/tsconfig.json to ignore the root tsconfig.json so that it compares with the later configuration. Using ./**/tsconfig.json will not change the performance.

The @mufan/code-* packages below involves symlinks.

Please let me know if this is not obvious enough so I can prepare an actual repro.

debug output

$ eslint .
  typescript-eslint:typescript-estree:parser parserOptions.project matched projects: [
  './node_modules/@bcoe/v8-coverage/dist/lib/tsconfig.json',
  './node_modules/@bcoe/v8-coverage/tsconfig.json',
  './node_modules/@mufan/code-boilerplates/tsconfig.json',
  './node_modules/@mufan/code-templates/tsconfig.json',
  './node_modules/@mufan/code/tsconfig.json',
  './node_modules/@mufan/eslint-plugin/src/tsconfig.json',
  './node_modules/fastq/test/tsconfig.json',
  './node_modules/rxjs/src/tsconfig.json',
  './node_modules/tsconfig-paths/test/tsconfig.json',
  './node_modules/uri-js/tsconfig.json',
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +0ms
  typescript-eslint:typescript-estree:parser ignore list applied to parserOptions.project: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +3ms
  typescript-eslint:typescript-estree:createProjectProgram Creating project program for: /root/workspace/magicspace/packages/cli/src/program/@command.ts +0ms
  typescript-eslint:typescript-estree:createWatchProgram File did not belong to any existing programs, moving to create/update. /root/workspace/magicspace/packages/cli/src/program/@command.ts +0ms
  typescript-eslint:typescript-estree:createWatchProgram Creating watch program for /root/workspace/magicspace/packages/cli/src/program/tsconfig.json. +0ms
  typescript-eslint:typescript-estree:createWatchProgram Creating watch program for /root/workspace/magicspace/packages/core/src/library/tsconfig.json. +906ms
  typescript-eslint:typescript-estree:createWatchProgram Creating watch program for /root/workspace/magicspace/packages/utils/src/library/tsconfig.json. +632ms
  typescript-eslint:typescript-estree:createWatchProgram Creating watch program for /root/workspace/magicspace/packages/utils/src/test/tsconfig.json. +399ms
  typescript-eslint:typescript-estree:parser parserOptions.project matched projects: [
  './node_modules/@bcoe/v8-coverage/dist/lib/tsconfig.json',
  './node_modules/@bcoe/v8-coverage/tsconfig.json',
  './node_modules/@mufan/code-boilerplates/tsconfig.json',
  './node_modules/@mufan/code-templates/tsconfig.json',
  './node_modules/@mufan/code/tsconfig.json',
  './node_modules/@mufan/eslint-plugin/src/tsconfig.json',
  './node_modules/fastq/test/tsconfig.json',
  './node_modules/rxjs/src/tsconfig.json',
  './node_modules/tsconfig-paths/test/tsconfig.json',
  './node_modules/uri-js/tsconfig.json',
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +3s
  typescript-eslint:typescript-estree:parser ignore list applied to parserOptions.project: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +0ms
  typescript-eslint:typescript-estree:createProjectProgram Creating project program for: /root/workspace/magicspace/packages/cli/src/program/@space.ts +3s
  typescript-eslint:typescript-estree:createWatchProgram Found existing program for file. /root/workspace/magicspace/packages/cli/src/program/@space.ts +1s
  typescript-eslint:typescript-estree:parser parserOptions.project matched projects: [
  './node_modules/@bcoe/v8-coverage/dist/lib/tsconfig.json',
  './node_modules/@bcoe/v8-coverage/tsconfig.json',
  './node_modules/@mufan/code-boilerplates/tsconfig.json',
  './node_modules/@mufan/code-templates/tsconfig.json',
  './node_modules/@mufan/code/tsconfig.json',
  './node_modules/@mufan/eslint-plugin/src/tsconfig.json',
  './node_modules/fastq/test/tsconfig.json',
  './node_modules/rxjs/src/tsconfig.json',
  './node_modules/tsconfig-paths/test/tsconfig.json',
  './node_modules/uri-js/tsconfig.json',
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +1s
  typescript-eslint:typescript-estree:parser ignore list applied to parserOptions.project: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +0ms
  typescript-eslint:typescript-estree:createProjectProgram Creating project program for: /root/workspace/magicspace/packages/cli/src/program/@types/prompts.d.ts +1s
  typescript-eslint:typescript-estree:createWatchProgram Found existing program for file. /root/workspace/magicspace/packages/cli/src/program/@types/prompts.d.ts +1s
  typescript-eslint:typescript-estree:parser parserOptions.project matched projects: [
  './node_modules/@bcoe/v8-coverage/dist/lib/tsconfig.json',
  './node_modules/@bcoe/v8-coverage/tsconfig.json',
  './node_modules/@mufan/code-boilerplates/tsconfig.json',
  './node_modules/@mufan/code-templates/tsconfig.json',
  './node_modules/@mufan/code/tsconfig.json',
  './node_modules/@mufan/eslint-plugin/src/tsconfig.json',
  './node_modules/fastq/test/tsconfig.json',
  './node_modules/rxjs/src/tsconfig.json',
  './node_modules/tsconfig-paths/test/tsconfig.json',
  './node_modules/uri-js/tsconfig.json',
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +998ms
  typescript-eslint:typescript-estree:parser ignore list applied to parserOptions.project: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +0ms

But if I change the project pattern and ignore the node_modules before ignore list applied, then it lints a lot faster:

{
  "parserOptions": {
    "project": "./!(node_modules)/**/tsconfig.json"
  }
}
debug output

$ eslint .
  typescript-eslint:typescript-estree:parser parserOptions.project matched projects: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +0ms
  typescript-eslint:typescript-estree:parser ignore list applied to parserOptions.project: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +2ms
  typescript-eslint:typescript-estree:createProjectProgram Creating project program for: /root/workspace/magicspace/packages/cli/src/program/@command.ts +0ms
  typescript-eslint:typescript-estree:createWatchProgram File did not belong to any existing programs, moving to create/update. /root/workspace/magicspace/packages/cli/src/program/@command.ts +0ms
  typescript-eslint:typescript-estree:createWatchProgram Creating watch program for /root/workspace/magicspace/packages/cli/src/program/tsconfig.json. +0ms
  typescript-eslint:typescript-estree:createWatchProgram Creating watch program for /root/workspace/magicspace/packages/core/src/library/tsconfig.json. +843ms
  typescript-eslint:typescript-estree:createWatchProgram Creating watch program for /root/workspace/magicspace/packages/utils/src/library/tsconfig.json. +641ms
  typescript-eslint:typescript-estree:createWatchProgram Creating watch program for /root/workspace/magicspace/packages/utils/src/test/tsconfig.json. +385ms
  typescript-eslint:typescript-estree:parser parserOptions.project matched projects: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +2s
  typescript-eslint:typescript-estree:parser ignore list applied to parserOptions.project: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +1ms
  typescript-eslint:typescript-estree:createProjectProgram Creating project program for: /root/workspace/magicspace/packages/cli/src/program/@space.ts +2s
  typescript-eslint:typescript-estree:createWatchProgram Found existing program for file. /root/workspace/magicspace/packages/cli/src/program/@space.ts +307ms
  typescript-eslint:typescript-estree:parser parserOptions.project matched projects: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +87ms
  typescript-eslint:typescript-estree:parser ignore list applied to parserOptions.project: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +0ms
  typescript-eslint:typescript-estree:createProjectProgram Creating project program for: /root/workspace/magicspace/packages/cli/src/program/@types/prompts.d.ts +87ms
  typescript-eslint:typescript-estree:createWatchProgram Found existing program for file. /root/workspace/magicspace/packages/cli/src/program/@types/prompts.d.ts +87ms
  typescript-eslint:typescript-estree:parser parserOptions.project matched projects: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +20ms
  typescript-eslint:typescript-estree:parser ignore list applied to parserOptions.project: [
  './packages/cli/src/program/tsconfig.json',
  './packages/core/src/library/tsconfig.json',
  './packages/utils/src/library/tsconfig.json',
  './packages/utils/src/test/tsconfig.json'
] +0ms

Versions

package version
@typescript-eslint/typescript-estree 3.9.0
@typescript-eslint/parser 3.9.0
TypeScript 3.9.7
node 14.4.0
npm n/a

Metadata

Metadata

Assignees

Labels

breaking changeThis change will require a new major version to be releasedbugSomething isn't workingpackage: typescript-estreeIssues related to @typescript-eslint/typescript-estree

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions