diff --git a/packages/language-service/ivy/test/mock_host.ts b/packages/language-service/ivy/test/mock_host.ts index 34a052eacf..b28c13335a 100644 --- a/packages/language-service/ivy/test/mock_host.ts +++ b/packages/language-service/ivy/test/mock_host.ts @@ -69,6 +69,12 @@ export const host: ts.server.ServerHost = { }, }; +/** + * Constructing a project service is expensive (~2.5s on MacBook Pro), so it + * should be a singleton service shared throughout all tests. + */ +let projectService: ts.server.ProjectService; + /** * Create a ConfiguredProject and an actual program for the test project located * in packages/language-service/test/project. Project creation exercises the @@ -76,17 +82,19 @@ export const host: ts.server.ServerHost = { * and modify test files. */ export function setup() { - const projectService = new ts.server.ProjectService({ - host, - logger, - cancellationToken: ts.server.nullCancellationToken, - useSingleInferredProject: true, - useInferredProjectPerProjectRoot: true, - typingsInstaller: ts.server.nullTypingsInstaller, - }); - // Opening APP_COMPONENT forces a new ConfiguredProject to be created based - // on the tsconfig.json in the test project. - projectService.openClientFile(APP_COMPONENT); + if (!projectService) { + projectService = new ts.server.ProjectService({ + host, + logger, + cancellationToken: ts.server.nullCancellationToken, + useSingleInferredProject: true, + useInferredProjectPerProjectRoot: true, + typingsInstaller: ts.server.nullTypingsInstaller, + }); + // Opening APP_COMPONENT forces a new ConfiguredProject to be created based + // on the tsconfig.json in the test project. + projectService.openClientFile(APP_COMPONENT); + } const project = projectService.findProject(TSCONFIG); if (!project) { throw new Error(`Failed to create project for ${TSCONFIG}`);