From ea43e91e05412b4c0950fb482b71dee39d414b85 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 20 Nov 2022 16:54:09 +0000 Subject: [PATCH 1/5] =?UTF-8?q?test:=20=F0=9F=94=84=20moduleResolver:=20mo?= =?UTF-8?q?ve=20to=20a=20separate=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/lib/parse-moduleResolver.test.ts | 142 ++++++++++++++++++ .../typescript-estree/tests/lib/parse.test.ts | 90 ----------- 2 files changed, 142 insertions(+), 90 deletions(-) create mode 100644 packages/typescript-estree/tests/lib/parse-moduleResolver.test.ts diff --git a/packages/typescript-estree/tests/lib/parse-moduleResolver.test.ts b/packages/typescript-estree/tests/lib/parse-moduleResolver.test.ts new file mode 100644 index 000000000000..c697f712516b --- /dev/null +++ b/packages/typescript-estree/tests/lib/parse-moduleResolver.test.ts @@ -0,0 +1,142 @@ +import { join, resolve } from 'path'; + +import * as parser from '../../src'; +import type * as astConverterModule from '../../src/ast-converter'; +import type * as sharedParserUtilsModule from '../../src/create-program/shared'; +import type { TSESTreeOptions } from '../../src/parser-options'; + +const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); + +// we can't spy on the exports of an ES module - so we instead have to mock the entire module +jest.mock('../../src/ast-converter', () => { + const astConverterActual = jest.requireActual( + '../../src/ast-converter', + ); + + return { + ...astConverterActual, + __esModule: true, + astConverter: jest.fn(astConverterActual.astConverter), + }; +}); +jest.mock('../../src/create-program/shared', () => { + const sharedActual = jest.requireActual( + '../../src/create-program/shared', + ); + + return { + ...sharedActual, + __esModule: true, + createDefaultCompilerOptionsFromExtra: jest.fn( + sharedActual.createDefaultCompilerOptionsFromExtra, + ), + }; +}); + +// Tests in CI by default run with lowercase program file names, +// resulting in path.relative results starting with many "../"s +jest.mock('typescript', () => { + const ts = jest.requireActual('typescript'); + return { + ...ts, + sys: { + ...ts.sys, + useCaseSensitiveFileNames: true, + }, + }; +}); + +beforeEach(() => { + jest.clearAllMocks(); +}); +describe('parseAndGenerateServices', () => { + describe('moduleResolver', () => { + beforeEach(() => { + parser.clearCaches(); + }); + + const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); + const code = ` + import { something } from '__PLACEHOLDER__'; + + something(); + `; + const config: TSESTreeOptions = { + comment: true, + tokens: true, + range: true, + loc: true, + project: './tsconfig.json', + tsconfigRootDir: PROJECT_DIR, + filePath: resolve(PROJECT_DIR, 'file.ts'), + }; + const withDefaultProgramConfig: TSESTreeOptions = { + ...config, + project: './tsconfig.defaultProgram.json', + createDefaultProgram: true, + }; + + describe('when file is in the project', () => { + it('returns error if __PLACEHOLDER__ can not be resolved', () => { + expect( + parser + .parseAndGenerateServices(code, config) + .services.program.getSemanticDiagnostics(), + ).toHaveProperty( + [0, 'messageText'], + "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", + ); + }); + + it('throws error if moduleResolver can not be found', () => { + expect(() => + parser.parseAndGenerateServices(code, { + ...config, + moduleResolver: resolve( + PROJECT_DIR, + './this_moduleResolver_does_not_exist.js', + ), + }), + ).toThrowErrorMatchingInlineSnapshot(` + "Could not find the provided parserOptions.moduleResolver. + Hint: use an absolute path if you are not in control over where the ESLint instance runs." + `); + }); + + it('resolves __PLACEHOLDER__ correctly', () => { + expect( + parser + .parseAndGenerateServices(code, { + ...config, + moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), + }) + .services.program.getSemanticDiagnostics(), + ).toHaveLength(0); + }); + }); + + describe('when file is not in the project and createDefaultProgram=true', () => { + it('returns error because __PLACEHOLDER__ can not be resolved', () => { + expect( + parser + .parseAndGenerateServices(code, withDefaultProgramConfig) + .services.program.getSemanticDiagnostics(), + ).toHaveProperty( + [0, 'messageText'], + "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", + ); + }); + + it('resolves __PLACEHOLDER__ correctly', () => { + expect( + parser + .parseAndGenerateServices(code, { + ...withDefaultProgramConfig, + moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), + }) + .services.program.getSemanticDiagnostics(), + ).toHaveLength(0); + }); + }); + }); +}); diff --git a/packages/typescript-estree/tests/lib/parse.test.ts b/packages/typescript-estree/tests/lib/parse.test.ts index dab87e38ab6c..049aca049470 100644 --- a/packages/typescript-estree/tests/lib/parse.test.ts +++ b/packages/typescript-estree/tests/lib/parse.test.ts @@ -752,94 +752,4 @@ describe('parseAndGenerateServices', () => { expect(testParse('includeme', ignore)).not.toThrow(); }); }); - - describe('moduleResolver', () => { - beforeEach(() => { - parser.clearCaches(); - }); - - const PROJECT_DIR = resolve(FIXTURES_DIR, '../moduleResolver'); - const code = ` - import { something } from '__PLACEHOLDER__'; - - something(); - `; - const config: TSESTreeOptions = { - comment: true, - tokens: true, - range: true, - loc: true, - project: './tsconfig.json', - tsconfigRootDir: PROJECT_DIR, - filePath: resolve(PROJECT_DIR, 'file.ts'), - }; - const withDefaultProgramConfig: TSESTreeOptions = { - ...config, - project: './tsconfig.defaultProgram.json', - createDefaultProgram: true, - }; - - describe('when file is in the project', () => { - it('returns error if __PLACEHOLDER__ can not be resolved', () => { - expect( - parser - .parseAndGenerateServices(code, config) - .services.program.getSemanticDiagnostics(), - ).toHaveProperty( - [0, 'messageText'], - "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", - ); - }); - - it('throws error if moduleResolver can not be found', () => { - expect(() => - parser.parseAndGenerateServices(code, { - ...config, - moduleResolver: resolve( - PROJECT_DIR, - './this_moduleResolver_does_not_exist.js', - ), - }), - ).toThrowErrorMatchingInlineSnapshot(` - "Could not find the provided parserOptions.moduleResolver. - Hint: use an absolute path if you are not in control over where the ESLint instance runs." - `); - }); - - it('resolves __PLACEHOLDER__ correctly', () => { - expect( - parser - .parseAndGenerateServices(code, { - ...config, - moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), - }) - .services.program.getSemanticDiagnostics(), - ).toHaveLength(0); - }); - }); - - describe('when file is not in the project and createDefaultProgram=true', () => { - it('returns error because __PLACEHOLDER__ can not be resolved', () => { - expect( - parser - .parseAndGenerateServices(code, withDefaultProgramConfig) - .services.program.getSemanticDiagnostics(), - ).toHaveProperty( - [0, 'messageText'], - "Cannot find module '__PLACEHOLDER__' or its corresponding type declarations.", - ); - }); - - it('resolves __PLACEHOLDER__ correctly', () => { - expect( - parser - .parseAndGenerateServices(code, { - ...withDefaultProgramConfig, - moduleResolver: resolve(PROJECT_DIR, './moduleResolver.js'), - }) - .services.program.getSemanticDiagnostics(), - ).toHaveLength(0); - }); - }); - }); }); From 65ccfe422412a13d781193ab80cf2ee6932f5437 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 20 Nov 2022 16:56:10 +0000 Subject: [PATCH 2/5] =?UTF-8?q?test:=20=F0=9F=94=84=20projectFolderIgnoreL?= =?UTF-8?q?ist:=20move=20to=20separate=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/parse-projectFolderIgnoreList.test.ts | 94 +++++++++++++++++++ .../typescript-estree/tests/lib/parse.test.ts | 41 -------- 2 files changed, 94 insertions(+), 41 deletions(-) create mode 100644 packages/typescript-estree/tests/lib/parse-projectFolderIgnoreList.test.ts diff --git a/packages/typescript-estree/tests/lib/parse-projectFolderIgnoreList.test.ts b/packages/typescript-estree/tests/lib/parse-projectFolderIgnoreList.test.ts new file mode 100644 index 000000000000..3082a302edf2 --- /dev/null +++ b/packages/typescript-estree/tests/lib/parse-projectFolderIgnoreList.test.ts @@ -0,0 +1,94 @@ +import { join, resolve } from 'path'; + +import * as parser from '../../src'; +import type * as astConverterModule from '../../src/ast-converter'; +import type * as sharedParserUtilsModule from '../../src/create-program/shared'; +import type { TSESTreeOptions } from '../../src/parser-options'; + +const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); + +// we can't spy on the exports of an ES module - so we instead have to mock the entire module +jest.mock('../../src/ast-converter', () => { + const astConverterActual = jest.requireActual( + '../../src/ast-converter', + ); + + return { + ...astConverterActual, + __esModule: true, + astConverter: jest.fn(astConverterActual.astConverter), + }; +}); +jest.mock('../../src/create-program/shared', () => { + const sharedActual = jest.requireActual( + '../../src/create-program/shared', + ); + + return { + ...sharedActual, + __esModule: true, + createDefaultCompilerOptionsFromExtra: jest.fn( + sharedActual.createDefaultCompilerOptionsFromExtra, + ), + }; +}); + +// Tests in CI by default run with lowercase program file names, +// resulting in path.relative results starting with many "../"s +jest.mock('typescript', () => { + const ts = jest.requireActual('typescript'); + return { + ...ts, + sys: { + ...ts.sys, + useCaseSensitiveFileNames: true, + }, + }; +}); + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('parseWithNodeMaps()', () => { + describe('projectFolderIgnoreList', () => { + beforeEach(() => { + parser.clearCaches(); + }); + + const PROJECT_DIR = resolve(FIXTURES_DIR, '../projectFolderIgnoreList'); + const code = 'var a = true'; + const config: TSESTreeOptions = { + comment: true, + tokens: true, + range: true, + loc: true, + tsconfigRootDir: PROJECT_DIR, + project: './**/tsconfig.json', + }; + + const testParse = + ( + filePath: 'ignoreme' | 'includeme', + projectFolderIgnoreList?: TSESTreeOptions['projectFolderIgnoreList'], + ) => + (): void => { + parser.parseAndGenerateServices(code, { + ...config, + projectFolderIgnoreList, + filePath: join(PROJECT_DIR, filePath, './file.ts'), + }); + }; + + it('ignores nothing when given nothing', () => { + expect(testParse('ignoreme')).not.toThrow(); + expect(testParse('includeme')).not.toThrow(); + }); + + it('ignores a folder when given a string glob', () => { + const ignore = ['**/ignoreme/**']; + expect(testParse('ignoreme', ignore)).toThrow(); + expect(testParse('includeme', ignore)).not.toThrow(); + }); + }); +}); diff --git a/packages/typescript-estree/tests/lib/parse.test.ts b/packages/typescript-estree/tests/lib/parse.test.ts index 049aca049470..c31f6716db89 100644 --- a/packages/typescript-estree/tests/lib/parse.test.ts +++ b/packages/typescript-estree/tests/lib/parse.test.ts @@ -711,45 +711,4 @@ describe('parseAndGenerateServices', () => { ); }); }); - - describe('projectFolderIgnoreList', () => { - beforeEach(() => { - parser.clearCaches(); - }); - - const PROJECT_DIR = resolve(FIXTURES_DIR, '../projectFolderIgnoreList'); - const code = 'var a = true'; - const config: TSESTreeOptions = { - comment: true, - tokens: true, - range: true, - loc: true, - tsconfigRootDir: PROJECT_DIR, - project: './**/tsconfig.json', - }; - - const testParse = - ( - filePath: 'ignoreme' | 'includeme', - projectFolderIgnoreList?: TSESTreeOptions['projectFolderIgnoreList'], - ) => - (): void => { - parser.parseAndGenerateServices(code, { - ...config, - projectFolderIgnoreList, - filePath: join(PROJECT_DIR, filePath, './file.ts'), - }); - }; - - it('ignores nothing when given nothing', () => { - expect(testParse('ignoreme')).not.toThrow(); - expect(testParse('includeme')).not.toThrow(); - }); - - it('ignores a folder when given a string glob', () => { - const ignore = ['**/ignoreme/**']; - expect(testParse('ignoreme', ignore)).toThrow(); - expect(testParse('includeme', ignore)).not.toThrow(); - }); - }); }); From de556a432f72b8e8369fd2c6eca3f66b803dc21b Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 20 Nov 2022 16:59:22 +0000 Subject: [PATCH 3/5] =?UTF-8?q?test:=20=F0=9F=94=84=20invalid=20project=20?= =?UTF-8?q?error=20messages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit move describe to a separate file --- .../parse-invalidProjectErrorMessage.test.ts | 88 +++++++++++++++++++ .../typescript-estree/tests/lib/parse.test.ts | 27 ------ 2 files changed, 88 insertions(+), 27 deletions(-) create mode 100644 packages/typescript-estree/tests/lib/parse-invalidProjectErrorMessage.test.ts diff --git a/packages/typescript-estree/tests/lib/parse-invalidProjectErrorMessage.test.ts b/packages/typescript-estree/tests/lib/parse-invalidProjectErrorMessage.test.ts new file mode 100644 index 000000000000..5181adda1aa5 --- /dev/null +++ b/packages/typescript-estree/tests/lib/parse-invalidProjectErrorMessage.test.ts @@ -0,0 +1,88 @@ +import { join, resolve } from 'path'; + +import * as parser from '../../src'; +import type * as astConverterModule from '../../src/ast-converter'; +import type * as sharedParserUtilsModule from '../../src/create-program/shared'; +import type { TSESTreeOptions } from '../../src/parser-options'; + +const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); + +// we can't spy on the exports of an ES module - so we instead have to mock the entire module +jest.mock('../../src/ast-converter', () => { + const astConverterActual = jest.requireActual( + '../../src/ast-converter', + ); + + return { + ...astConverterActual, + __esModule: true, + astConverter: jest.fn(astConverterActual.astConverter), + }; +}); +jest.mock('../../src/create-program/shared', () => { + const sharedActual = jest.requireActual( + '../../src/create-program/shared', + ); + + return { + ...sharedActual, + __esModule: true, + createDefaultCompilerOptionsFromExtra: jest.fn( + sharedActual.createDefaultCompilerOptionsFromExtra, + ), + }; +}); + +// Tests in CI by default run with lowercase program file names, +// resulting in path.relative results starting with many "../"s +jest.mock('typescript', () => { + const ts = jest.requireActual('typescript'); + return { + ...ts, + sys: { + ...ts.sys, + useCaseSensitiveFileNames: true, + }, + }; +}); + +/** + * Aligns paths between environments, node for windows uses `\`, for linux and mac uses `/` + */ +function alignErrorPath(error: Error): never { + error.message = error.message.replace(/\\(?!["])/gm, '/'); + throw error; +} + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('parseAndGenerateServices', () => { + describe('invalid project error messages', () => { + it('throws when non of multiple projects include the file', () => { + const PROJECT_DIR = resolve(FIXTURES_DIR, '../invalidFileErrors'); + const code = 'var a = true'; + const config: TSESTreeOptions = { + comment: true, + tokens: true, + range: true, + loc: true, + tsconfigRootDir: PROJECT_DIR, + project: ['./**/tsconfig.json', './**/tsconfig.extra.json'], + }; + const testParse = (filePath: string) => (): void => { + try { + parser.parseAndGenerateServices(code, { + ...config, + filePath: join(PROJECT_DIR, filePath), + }); + } catch (error) { + throw alignErrorPath(error as Error); + } + }; + + expect(testParse('ts/notIncluded0j1.ts')).toThrowErrorMatchingSnapshot(); + }); + }); +}); diff --git a/packages/typescript-estree/tests/lib/parse.test.ts b/packages/typescript-estree/tests/lib/parse.test.ts index c31f6716db89..2a686801571c 100644 --- a/packages/typescript-estree/tests/lib/parse.test.ts +++ b/packages/typescript-estree/tests/lib/parse.test.ts @@ -631,33 +631,6 @@ describe('parseAndGenerateServices', () => { }); }); - describe('invalid project error messages', () => { - it('throws when non of multiple projects include the file', () => { - const PROJECT_DIR = resolve(FIXTURES_DIR, '../invalidFileErrors'); - const code = 'var a = true'; - const config: TSESTreeOptions = { - comment: true, - tokens: true, - range: true, - loc: true, - tsconfigRootDir: PROJECT_DIR, - project: ['./**/tsconfig.json', './**/tsconfig.extra.json'], - }; - const testParse = (filePath: string) => (): void => { - try { - parser.parseAndGenerateServices(code, { - ...config, - filePath: join(PROJECT_DIR, filePath), - }); - } catch (error) { - throw alignErrorPath(error as Error); - } - }; - - expect(testParse('ts/notIncluded0j1.ts')).toThrowErrorMatchingSnapshot(); - }); - }); - describe('debug options', () => { const debugEnable = jest.fn(); beforeEach(() => { From ff9d3a04d8deb9025bd309449cbcaa576329af77 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 20 Nov 2022 17:01:24 +0000 Subject: [PATCH 4/5] =?UTF-8?q?test:=20=F0=9F=94=84=20preserveNodeMaps:=20?= =?UTF-8?q?move=20to=20a=20separate=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/lib/parse-preserveNodeMaps.test.ts | 191 ++++++++++++++++++ .../typescript-estree/tests/lib/parse.test.ts | 138 ------------- 2 files changed, 191 insertions(+), 138 deletions(-) create mode 100644 packages/typescript-estree/tests/lib/parse-preserveNodeMaps.test.ts diff --git a/packages/typescript-estree/tests/lib/parse-preserveNodeMaps.test.ts b/packages/typescript-estree/tests/lib/parse-preserveNodeMaps.test.ts new file mode 100644 index 000000000000..ff41814f8ba0 --- /dev/null +++ b/packages/typescript-estree/tests/lib/parse-preserveNodeMaps.test.ts @@ -0,0 +1,191 @@ +import { join } from 'path'; + +import * as parser from '../../src'; +import type * as astConverterModule from '../../src/ast-converter'; +import type * as sharedParserUtilsModule from '../../src/create-program/shared'; +import type { TSESTreeOptions } from '../../src/parser-options'; + +const FIXTURES_DIR = join(__dirname, '../fixtures/simpleProject'); + +// we can't spy on the exports of an ES module - so we instead have to mock the entire module +jest.mock('../../src/ast-converter', () => { + const astConverterActual = jest.requireActual( + '../../src/ast-converter', + ); + + return { + ...astConverterActual, + __esModule: true, + astConverter: jest.fn(astConverterActual.astConverter), + }; +}); +jest.mock('../../src/create-program/shared', () => { + const sharedActual = jest.requireActual( + '../../src/create-program/shared', + ); + + return { + ...sharedActual, + __esModule: true, + createDefaultCompilerOptionsFromExtra: jest.fn( + sharedActual.createDefaultCompilerOptionsFromExtra, + ), + }; +}); + +// Tests in CI by default run with lowercase program file names, +// resulting in path.relative results starting with many "../"s +jest.mock('typescript', () => { + const ts = jest.requireActual('typescript'); + return { + ...ts, + sys: { + ...ts.sys, + useCaseSensitiveFileNames: true, + }, + }; +}); + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('parseAndGenerateServices', () => { + describe('preserveNodeMaps', () => { + const code = 'var a = true'; + const baseConfig: TSESTreeOptions = { + comment: true, + tokens: true, + range: true, + loc: true, + filePath: 'file.ts', + }; + const projectConfig: TSESTreeOptions = { + ...baseConfig, + tsconfigRootDir: FIXTURES_DIR, + project: './tsconfig.json', + }; + + it('should not impact the use of parse()', () => { + const resultWithNoOptionSet = parser.parse(code, baseConfig); + const resultWithOptionSetToTrue = parser.parse(code, { + ...baseConfig, + preserveNodeMaps: true, + }); + const resultWithOptionSetToFalse = parser.parse(code, { + ...baseConfig, + preserveNodeMaps: false, + }); + const resultWithOptionSetExplicitlyToUndefined = parser.parse(code, { + ...baseConfig, + preserveNodeMaps: undefined, + }); + + expect(resultWithNoOptionSet).toMatchObject(resultWithOptionSetToTrue); + expect(resultWithNoOptionSet).toMatchObject(resultWithOptionSetToFalse); + expect(resultWithNoOptionSet).toMatchObject( + resultWithOptionSetExplicitlyToUndefined, + ); + }); + + it('should not impact the use of parseWithNodeMaps()', () => { + const resultWithNoOptionSet = parser.parseWithNodeMaps(code, baseConfig); + const resultWithOptionSetToTrue = parser.parseWithNodeMaps(code, { + ...baseConfig, + preserveNodeMaps: true, + }); + const resultWithOptionSetToFalse = parser.parseWithNodeMaps(code, { + ...baseConfig, + preserveNodeMaps: false, + }); + const resultWithOptionSetExplicitlyToUndefined = parser.parseWithNodeMaps( + code, + { + ...baseConfig, + preserveNodeMaps: undefined, + }, + ); + + expect(resultWithNoOptionSet).toMatchObject(resultWithOptionSetToTrue); + expect(resultWithNoOptionSet).toMatchObject(resultWithOptionSetToFalse); + expect(resultWithNoOptionSet).toMatchObject( + resultWithOptionSetExplicitlyToUndefined, + ); + }); + + it('should preserve node maps by default for parseAndGenerateServices()', () => { + const noOptionSet = parser.parseAndGenerateServices(code, baseConfig); + + expect(noOptionSet.services.esTreeNodeToTSNodeMap).toEqual( + expect.any(WeakMap), + ); + expect(noOptionSet.services.tsNodeToESTreeNodeMap).toEqual( + expect.any(WeakMap), + ); + + const withProjectNoOptionSet = parser.parseAndGenerateServices( + code, + projectConfig, + ); + + expect(withProjectNoOptionSet.services.esTreeNodeToTSNodeMap).toEqual( + expect.any(WeakMap), + ); + expect(withProjectNoOptionSet.services.tsNodeToESTreeNodeMap).toEqual( + expect.any(WeakMap), + ); + }); + + function checkNodeMaps(setting: boolean): void { + it('without project', () => { + const parseResult = parser.parseAndGenerateServices(code, { + ...baseConfig, + preserveNodeMaps: setting, + }); + + expect(parseResult.services.esTreeNodeToTSNodeMap).toBeDefined(); + expect(parseResult.services.tsNodeToESTreeNodeMap).toBeDefined(); + expect( + parseResult.services.esTreeNodeToTSNodeMap.has( + parseResult.ast.body[0], + ), + ).toBe(setting); + expect( + parseResult.services.tsNodeToESTreeNodeMap.has( + parseResult.services.program.getSourceFile('estree.ts'), + ), + ).toBe(setting); + }); + + it('with project', () => { + const parseResult = parser.parseAndGenerateServices(code, { + ...projectConfig, + preserveNodeMaps: setting, + }); + + expect(parseResult.services.esTreeNodeToTSNodeMap).toBeDefined(); + expect(parseResult.services.tsNodeToESTreeNodeMap).toBeDefined(); + expect( + parseResult.services.esTreeNodeToTSNodeMap.has( + parseResult.ast.body[0], + ), + ).toBe(setting); + expect( + parseResult.services.tsNodeToESTreeNodeMap.has( + parseResult.services.program.getSourceFile( + join(FIXTURES_DIR, 'file.ts'), + ), + ), + ).toBe(setting); + }); + } + + describe('should preserve node maps for parseAndGenerateServices() when option is `true`, regardless of `project` config', () => { + checkNodeMaps(true); + }); + + describe('should not preserve node maps for parseAndGenerateServices() when option is `false`, regardless of `project` config', () => { + checkNodeMaps(false); + }); + }); +}); diff --git a/packages/typescript-estree/tests/lib/parse.test.ts b/packages/typescript-estree/tests/lib/parse.test.ts index 2a686801571c..3fe71976a1a4 100644 --- a/packages/typescript-estree/tests/lib/parse.test.ts +++ b/packages/typescript-estree/tests/lib/parse.test.ts @@ -229,144 +229,6 @@ describe('parseAndGenerateServices', () => { }); }); - describe('preserveNodeMaps', () => { - const code = 'var a = true'; - const baseConfig: TSESTreeOptions = { - comment: true, - tokens: true, - range: true, - loc: true, - filePath: 'file.ts', - }; - const projectConfig: TSESTreeOptions = { - ...baseConfig, - tsconfigRootDir: FIXTURES_DIR, - project: './tsconfig.json', - }; - - it('should not impact the use of parse()', () => { - const resultWithNoOptionSet = parser.parse(code, baseConfig); - const resultWithOptionSetToTrue = parser.parse(code, { - ...baseConfig, - preserveNodeMaps: true, - }); - const resultWithOptionSetToFalse = parser.parse(code, { - ...baseConfig, - preserveNodeMaps: false, - }); - const resultWithOptionSetExplicitlyToUndefined = parser.parse(code, { - ...baseConfig, - preserveNodeMaps: undefined, - }); - - expect(resultWithNoOptionSet).toMatchObject(resultWithOptionSetToTrue); - expect(resultWithNoOptionSet).toMatchObject(resultWithOptionSetToFalse); - expect(resultWithNoOptionSet).toMatchObject( - resultWithOptionSetExplicitlyToUndefined, - ); - }); - - it('should not impact the use of parseWithNodeMaps()', () => { - const resultWithNoOptionSet = parser.parseWithNodeMaps(code, baseConfig); - const resultWithOptionSetToTrue = parser.parseWithNodeMaps(code, { - ...baseConfig, - preserveNodeMaps: true, - }); - const resultWithOptionSetToFalse = parser.parseWithNodeMaps(code, { - ...baseConfig, - preserveNodeMaps: false, - }); - const resultWithOptionSetExplicitlyToUndefined = parser.parseWithNodeMaps( - code, - { - ...baseConfig, - preserveNodeMaps: undefined, - }, - ); - - expect(resultWithNoOptionSet).toMatchObject(resultWithOptionSetToTrue); - expect(resultWithNoOptionSet).toMatchObject(resultWithOptionSetToFalse); - expect(resultWithNoOptionSet).toMatchObject( - resultWithOptionSetExplicitlyToUndefined, - ); - }); - - it('should preserve node maps by default for parseAndGenerateServices()', () => { - const noOptionSet = parser.parseAndGenerateServices(code, baseConfig); - - expect(noOptionSet.services.esTreeNodeToTSNodeMap).toEqual( - expect.any(WeakMap), - ); - expect(noOptionSet.services.tsNodeToESTreeNodeMap).toEqual( - expect.any(WeakMap), - ); - - const withProjectNoOptionSet = parser.parseAndGenerateServices( - code, - projectConfig, - ); - - expect(withProjectNoOptionSet.services.esTreeNodeToTSNodeMap).toEqual( - expect.any(WeakMap), - ); - expect(withProjectNoOptionSet.services.tsNodeToESTreeNodeMap).toEqual( - expect.any(WeakMap), - ); - }); - - function checkNodeMaps(setting: boolean): void { - it('without project', () => { - const parseResult = parser.parseAndGenerateServices(code, { - ...baseConfig, - preserveNodeMaps: setting, - }); - - expect(parseResult.services.esTreeNodeToTSNodeMap).toBeDefined(); - expect(parseResult.services.tsNodeToESTreeNodeMap).toBeDefined(); - expect( - parseResult.services.esTreeNodeToTSNodeMap.has( - parseResult.ast.body[0], - ), - ).toBe(setting); - expect( - parseResult.services.tsNodeToESTreeNodeMap.has( - parseResult.services.program.getSourceFile('estree.ts'), - ), - ).toBe(setting); - }); - - it('with project', () => { - const parseResult = parser.parseAndGenerateServices(code, { - ...projectConfig, - preserveNodeMaps: setting, - }); - - expect(parseResult.services.esTreeNodeToTSNodeMap).toBeDefined(); - expect(parseResult.services.tsNodeToESTreeNodeMap).toBeDefined(); - expect( - parseResult.services.esTreeNodeToTSNodeMap.has( - parseResult.ast.body[0], - ), - ).toBe(setting); - expect( - parseResult.services.tsNodeToESTreeNodeMap.has( - parseResult.services.program.getSourceFile( - join(FIXTURES_DIR, 'file.ts'), - ), - ), - ).toBe(setting); - }); - } - - describe('should preserve node maps for parseAndGenerateServices() when option is `true`, regardless of `project` config', () => { - checkNodeMaps(true); - }); - - describe('should not preserve node maps for parseAndGenerateServices() when option is `false`, regardless of `project` config', () => { - checkNodeMaps(false); - }); - }); - describe('isolated parsing', () => { const config: TSESTreeOptions = { comment: true, From 4f4bf685d9f5834619bd8571ab0f011cb7468722 Mon Sep 17 00:00:00 2001 From: Alexey Berezin Date: Sun, 20 Nov 2022 17:05:12 +0000 Subject: [PATCH 5/5] =?UTF-8?q?test:=20=F0=9F=94=84=20update=20snapshots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parse-invalidProjectErrorMessage.test.ts.snap | 12 ++++++++++++ .../tests/lib/__snapshots__/parse.test.ts.snap | 11 ----------- 2 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 packages/typescript-estree/tests/lib/__snapshots__/parse-invalidProjectErrorMessage.test.ts.snap diff --git a/packages/typescript-estree/tests/lib/__snapshots__/parse-invalidProjectErrorMessage.test.ts.snap b/packages/typescript-estree/tests/lib/__snapshots__/parse-invalidProjectErrorMessage.test.ts.snap new file mode 100644 index 000000000000..b7990cb5fc8d --- /dev/null +++ b/packages/typescript-estree/tests/lib/__snapshots__/parse-invalidProjectErrorMessage.test.ts.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`parseAndGenerateServices invalid project error messages throws when non of multiple projects include the file 1`] = ` +"ESLint was configured to run on \`/ts/notIncluded0j1.ts\` using \`parserOptions.project\`: +- /tsconfig.json +- /tsconfig.extra.json +However, none of those TSConfigs include this file. Either: +- Change ESLint's list of included files to not include this file +- Change one of those TSConfigs to include this file +- Create a new TSConfig that includes this file and include it in your parserOptions.project +See the TypeScript ESLint docs for more info: https://typescript-eslint.io/docs/linting/troubleshooting##i-get-errors-telling-me-eslint-was-configured-to-run--however-that-tsconfig-does-not--none-of-those-tsconfigs-include-this-file" +`; diff --git a/packages/typescript-estree/tests/lib/__snapshots__/parse.test.ts.snap b/packages/typescript-estree/tests/lib/__snapshots__/parse.test.ts.snap index 81341b5e35f2..1e5f185f669b 100644 --- a/packages/typescript-estree/tests/lib/__snapshots__/parse.test.ts.snap +++ b/packages/typescript-estree/tests/lib/__snapshots__/parse.test.ts.snap @@ -71,17 +71,6 @@ However, that TSConfig does not include this file. Either: See the TypeScript ESLint docs for more info: https://typescript-eslint.io/docs/linting/troubleshooting##i-get-errors-telling-me-eslint-was-configured-to-run--however-that-tsconfig-does-not--none-of-those-tsconfigs-include-this-file" `; -exports[`parseAndGenerateServices invalid project error messages throws when non of multiple projects include the file 1`] = ` -"ESLint was configured to run on \`/ts/notIncluded0j1.ts\` using \`parserOptions.project\`: -- /tsconfig.json -- /tsconfig.extra.json -However, none of those TSConfigs include this file. Either: -- Change ESLint's list of included files to not include this file -- Change one of those TSConfigs to include this file -- Create a new TSConfig that includes this file and include it in your parserOptions.project -See the TypeScript ESLint docs for more info: https://typescript-eslint.io/docs/linting/troubleshooting##i-get-errors-telling-me-eslint-was-configured-to-run--however-that-tsconfig-does-not--none-of-those-tsconfigs-include-this-file" -`; - exports[`parseAndGenerateServices isolated parsing should parse .js file - with JSX content - parserOptions.jsx = false 1`] = ` { "ast": {