diff --git a/packages/typescript-estree/src/parseSettings/createParseSettings.ts b/packages/typescript-estree/src/parseSettings/createParseSettings.ts index a30942aa0d5b..fee7dbc1cb4c 100644 --- a/packages/typescript-estree/src/parseSettings/createParseSettings.ts +++ b/packages/typescript-estree/src/parseSettings/createParseSettings.ts @@ -80,10 +80,10 @@ export function createParseSettings( errorOnTypeScriptSyntacticAndSemanticIssues: false, errorOnUnknownASTType: options.errorOnUnknownASTType === true, EXPERIMENTAL_projectService: - (options.EXPERIMENTAL_useProjectService && - process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER !== 'false') || - (process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER === 'true' && - options.EXPERIMENTAL_useProjectService !== false) + options.EXPERIMENTAL_useProjectService || + (options.project && + options.EXPERIMENTAL_useProjectService !== false && + process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER === 'true') ? (TSSERVER_PROJECT_SERVICE ??= createProjectService( options.EXPERIMENTAL_useProjectService, jsDocParsingMode, diff --git a/packages/typescript-estree/tests/lib/createParseSettings.test.ts b/packages/typescript-estree/tests/lib/createParseSettings.test.ts index 043050cdd2bc..cf3832b991f2 100644 --- a/packages/typescript-estree/tests/lib/createParseSettings.test.ts +++ b/packages/typescript-estree/tests/lib/createParseSettings.test.ts @@ -1,6 +1,56 @@ import { createParseSettings } from '../../src/parseSettings/createParseSettings'; +const projectService = { service: true }; + +jest.mock('../../src/create-program/createProjectService', () => ({ + createProjectService: (): typeof projectService => projectService, +})); + describe('createParseSettings', () => { + describe('EXPERIMENTAL_projectService', () => { + it('is created when options.EXPERIMENTAL_useProjectService is enabled', () => { + process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER = 'false'; + + const parseSettings = createParseSettings('', { + EXPERIMENTAL_useProjectService: true, + }); + + expect(parseSettings.EXPERIMENTAL_projectService).toBe(projectService); + }); + + it('is created when options.EXPERIMENTAL_useProjectService is undefined, options.project is true, and process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER is true', () => { + process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER = 'true'; + + const parseSettings = createParseSettings('', { + EXPERIMENTAL_useProjectService: undefined, + project: true, + }); + + expect(parseSettings.EXPERIMENTAL_projectService).toBe(projectService); + }); + + it('is not created when options.EXPERIMENTAL_useProjectService is undefined, options.project is falsy, and process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER is true', () => { + process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER = 'true'; + + const parseSettings = createParseSettings('', { + EXPERIMENTAL_useProjectService: undefined, + }); + + expect(parseSettings.EXPERIMENTAL_projectService).toBeUndefined(); + }); + + it('is not created when options.EXPERIMENTAL_useProjectService is false, options.project is true, and process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER is true', () => { + process.env.TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER = 'true'; + + const parseSettings = createParseSettings('', { + EXPERIMENTAL_useProjectService: false, + project: true, + }); + + expect(parseSettings.EXPERIMENTAL_projectService).toBeUndefined(); + }); + }); + describe('tsconfigMatchCache', () => { it('reuses the TSConfig match cache when called a subsequent time', () => { const parseSettings1 = createParseSettings('input.ts');