From 186999097a6a115f7859816c006c6d5c235a7017 Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Mon, 13 Mar 2023 11:55:15 +1030 Subject: [PATCH] feat: remove moduleResolver API --- docs/architecture/Parser.mdx | 20 -------- docs/architecture/TypeScript-ESTree.mdx | 22 --------- packages/types/src/parser-options.ts | 1 - .../create-program/createDefaultProgram.ts | 11 +---- .../getWatchProgramsForProjects.ts | 7 --- .../src/create-program/shared.ts | 19 -------- .../src/parseSettings/createParseSettings.ts | 1 - .../src/parseSettings/index.ts | 5 -- .../typescript-estree/src/parser-options.ts | 16 ------- ...duleResolver.default-program-error.test.ts | 32 ------------- ...leResolver.default-program-success.test.ts | 34 -------------- ...e.moduleResolver.placeholder-error.test.ts | 42 ----------------- ...moduleResolver.placeholder-success.test.ts | 27 ----------- .../typescript-estree/tools/test-utils.ts | 46 +------------------ .../website/src/components/linter/config.ts | 1 - 15 files changed, 2 insertions(+), 282 deletions(-) delete mode 100644 packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts delete mode 100644 packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts delete mode 100644 packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts delete mode 100644 packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts diff --git a/docs/architecture/Parser.mdx b/docs/architecture/Parser.mdx index dfe51357cc5..39dccbb15be 100644 --- a/docs/architecture/Parser.mdx +++ b/docs/architecture/Parser.mdx @@ -43,7 +43,6 @@ interface ParserOptions { jsxFragmentName?: string | null; jsxPragma?: string | null; lib?: string[]; - moduleResolver?: string; program?: import('typescript').Program; project?: string | string[] | true; projectFolderIgnoreList?: string[]; @@ -150,25 +149,6 @@ Specifies the TypeScript `lib`s that are available. This is used by the scope an If you provide `parserOptions.project`, you do not need to set this, as it will automatically detected from the compiler. -### `moduleResolver` - -> Default `undefined`. - -This option allows you to provide a custom module resolution. The value should point to a JS file that default exports (`export default`, or `module.exports =`, or `export =`) a file with the following interface: - -```ts -interface ModuleResolver { - version: 1; - resolveModuleNames( - moduleNames: string[], - containingFile: string, - reusedNames: string[] | undefined, - redirectedReference: ts.ResolvedProjectReference | undefined, - options: ts.CompilerOptions, - ): (ts.ResolvedModule | undefined)[]; -} -``` - ### `program` > Default `undefined`. diff --git a/docs/architecture/TypeScript-ESTree.mdx b/docs/architecture/TypeScript-ESTree.mdx index 8138f111ca0..98afc46b27d 100644 --- a/docs/architecture/TypeScript-ESTree.mdx +++ b/docs/architecture/TypeScript-ESTree.mdx @@ -241,11 +241,6 @@ interface ParseAndGenerateServicesOptions extends ParseOptions { */ glob?: number | 'Infinity'; }; - - /** - * Path to a file exporting a custom `ModuleResolver`. - */ - moduleResolver?: string; } interface ParserServices { @@ -290,23 +285,6 @@ const { ast, services } = parseAndGenerateServices(code, { }); ``` -##### `ModuleResolver` - -The `moduleResolver` option allows you to specify the path to a module with a custom module resolver implementation. The module is expected to adhere to the following interface: - -```ts -interface ModuleResolver { - version: 1; - resolveModuleNames( - moduleNames: string[], - containingFile: string, - reusedNames: string[] | undefined, - redirectedReference: ts.ResolvedProjectReference | undefined, - options: ts.CompilerOptions, - ): (ts.ResolvedModule | undefined)[]; -} -``` - #### `parseWithNodeMaps(code, options)` Parses the given string of code with the options provided and returns both the ESTree-compatible AST as well as the node maps. diff --git a/packages/types/src/parser-options.ts b/packages/types/src/parser-options.ts index e04fd6f2534..815ad440913 100644 --- a/packages/types/src/parser-options.ts +++ b/packages/types/src/parser-options.ts @@ -59,7 +59,6 @@ interface ParserOptions { tokens?: boolean; tsconfigRootDir?: string; warnOnUnsupportedTypeScriptVersion?: boolean; - moduleResolver?: string; cacheLifetime?: { glob?: CacheDurationSeconds; }; diff --git a/packages/typescript-estree/src/create-program/createDefaultProgram.ts b/packages/typescript-estree/src/create-program/createDefaultProgram.ts index 9ea0fabfd0d..9ad68838e55 100644 --- a/packages/typescript-estree/src/create-program/createDefaultProgram.ts +++ b/packages/typescript-estree/src/create-program/createDefaultProgram.ts @@ -4,10 +4,7 @@ import * as ts from 'typescript'; import type { ParseSettings } from '../parseSettings'; import type { ASTAndDefiniteProgram } from './shared'; -import { - createDefaultCompilerOptionsFromExtra, - getModuleResolver, -} from './shared'; +import { createDefaultCompilerOptionsFromExtra } from './shared'; const log = debug('typescript-eslint:typescript-estree:createDefaultProgram'); @@ -47,12 +44,6 @@ function createDefaultProgram( /* setParentNodes */ true, ); - if (parseSettings.moduleResolver) { - compilerHost.resolveModuleNames = getModuleResolver( - parseSettings.moduleResolver, - ).resolveModuleNames; - } - const oldReadFile = compilerHost.readFile; compilerHost.readFile = (fileName: string): string | undefined => path.normalize(fileName) === path.normalize(parseSettings.filePath) diff --git a/packages/typescript-estree/src/create-program/getWatchProgramsForProjects.ts b/packages/typescript-estree/src/create-program/getWatchProgramsForProjects.ts index 395f0dfbc95..d56313e489d 100644 --- a/packages/typescript-estree/src/create-program/getWatchProgramsForProjects.ts +++ b/packages/typescript-estree/src/create-program/getWatchProgramsForProjects.ts @@ -10,7 +10,6 @@ import { createDefaultCompilerOptionsFromExtra, createHash, getCanonicalFileName, - getModuleResolver, } from './shared'; import type { WatchCompilerHostOfConfigFile } from './WatchCompilerHostOfConfigFile'; @@ -268,12 +267,6 @@ function createWatchProgram( /*reportWatchStatus*/ () => {}, ) as WatchCompilerHostOfConfigFile; - if (parseSettings.moduleResolver) { - watchCompilerHost.resolveModuleNames = getModuleResolver( - parseSettings.moduleResolver, - ).resolveModuleNames; - } - // ensure readFile reads the code being linted instead of the copy on disk const oldReadFile = watchCompilerHost.readFile; watchCompilerHost.readFile = (filePathIn, encoding): string | undefined => { diff --git a/packages/typescript-estree/src/create-program/shared.ts b/packages/typescript-estree/src/create-program/shared.ts index 5d0e256d7df..7fa97afa849 100644 --- a/packages/typescript-estree/src/create-program/shared.ts +++ b/packages/typescript-estree/src/create-program/shared.ts @@ -2,7 +2,6 @@ import path from 'path'; import type { Program } from 'typescript'; import * as ts from 'typescript'; -import type { ModuleResolver } from '../parser-options'; import type { ParseSettings } from '../parseSettings'; interface ASTAndNoProgram { @@ -112,23 +111,6 @@ function getAstFromProgram( return ast && { ast, program: currentProgram }; } -function getModuleResolver(moduleResolverPath: string): ModuleResolver { - let moduleResolver: ModuleResolver; - - try { - moduleResolver = require(moduleResolverPath) as ModuleResolver; - } catch (error) { - const errorLines = [ - 'Could not find the provided parserOptions.moduleResolver.', - 'Hint: use an absolute path if you are not in control over where the ESLint instance runs.', - ]; - - throw new Error(errorLines.join('\n')); - } - - return moduleResolver; -} - /** * Hash content for compare content. * @param content hashed contend @@ -154,5 +136,4 @@ export { ensureAbsolutePath, getCanonicalFileName, getAstFromProgram, - getModuleResolver, }; diff --git a/packages/typescript-estree/src/parseSettings/createParseSettings.ts b/packages/typescript-estree/src/parseSettings/createParseSettings.ts index 067f161425e..de25a789fa9 100644 --- a/packages/typescript-estree/src/parseSettings/createParseSettings.ts +++ b/packages/typescript-estree/src/parseSettings/createParseSettings.ts @@ -68,7 +68,6 @@ export function createParseSettings( : options.loggerFn === false ? (): void => {} : console.log, // eslint-disable-line no-console - moduleResolver: options.moduleResolver ?? '', preserveNodeMaps: options.preserveNodeMaps !== false, programs: Array.isArray(options.programs) ? options.programs : null, projects: [], diff --git a/packages/typescript-estree/src/parseSettings/index.ts b/packages/typescript-estree/src/parseSettings/index.ts index b97050b5fdf..76f4853b084 100644 --- a/packages/typescript-estree/src/parseSettings/index.ts +++ b/packages/typescript-estree/src/parseSettings/index.ts @@ -93,11 +93,6 @@ export interface MutableParseSettings { */ log: (message: string) => void; - /** - * Path for a module resolver to use for the compiler host's `resolveModuleNames`. - */ - moduleResolver: string; - /** * Whether two-way AST node maps are preserved during the AST conversion process. */ diff --git a/packages/typescript-estree/src/parser-options.ts b/packages/typescript-estree/src/parser-options.ts index 8b244f242dd..213084a4d89 100644 --- a/packages/typescript-estree/src/parser-options.ts +++ b/packages/typescript-estree/src/parser-options.ts @@ -188,11 +188,6 @@ interface ParseAndGenerateServicesOptions extends ParseOptions { */ glob?: CacheDurationSeconds; }; - - /** - * Path to a file exporting a custom `ModuleResolver`. - */ - moduleResolver?: string; } export type TSESTreeOptions = ParseAndGenerateServicesOptions; @@ -228,14 +223,3 @@ export interface ParserServicesWithoutTypeInformation export type ParserServices = | ParserServicesWithTypeInformation | ParserServicesWithoutTypeInformation; - -export interface ModuleResolver { - version: 1; - resolveModuleNames( - moduleNames: string[], - containingFile: string, - reusedNames: string[] | undefined, - redirectedReference: ts.ResolvedProjectReference | undefined, - options: ts.CompilerOptions, - ): (ts.ResolvedModule | undefined)[]; -} diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts deleted file mode 100644 index 628897b6606..00000000000 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-error.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import * as parser from '../../src'; -import type { TSESTreeOptions } from '../../src/parser-options'; -import { createAndPrepareParseConfig } from '../../tools/test-utils'; - -beforeEach(() => { - jest.clearAllMocks(); -}); - -describe('parseAndGenerateServices', () => { - describe('moduleResolver', () => { - const { code, config } = createAndPrepareParseConfig(); - - const withDefaultProgramConfig: TSESTreeOptions = { - ...config, - project: './tsconfig.defaultProgram.json', - DEPRECATED__createDefaultProgram: true, - }; - - 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.", - ); - }); - }); - }); -}); diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts deleted file mode 100644 index 341170a2442..00000000000 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.default-program-success.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { resolve } from 'path'; - -import * as parser from '../../src'; -import type { TSESTreeOptions } from '../../src/parser-options'; -import { createAndPrepareParseConfig } from '../../tools/test-utils'; - -beforeEach(() => { - jest.clearAllMocks(); -}); - -describe('parseAndGenerateServices', () => { - describe('moduleResolver', () => { - const { code, config, projectDirectory } = createAndPrepareParseConfig(); - - const withDefaultProgramConfig: TSESTreeOptions = { - ...config, - project: './tsconfig.defaultProgram.json', - DEPRECATED__createDefaultProgram: true, - }; - - describe('when file is not in the project and createDefaultProgram=true', () => { - it('resolves __PLACEHOLDER__ correctly', () => { - expect( - parser - .parseAndGenerateServices(code, { - ...withDefaultProgramConfig, - moduleResolver: resolve(projectDirectory, './moduleResolver.js'), - }) - .services.program!.getSemanticDiagnostics(), - ).toHaveLength(0); - }); - }); - }); -}); diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts deleted file mode 100644 index 8b9bc0959ad..00000000000 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-error.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { resolve } from 'path'; - -import * as parser from '../../src'; -import { createAndPrepareParseConfig } from '../../tools/test-utils'; - -beforeEach(() => { - jest.clearAllMocks(); -}); - -describe('parseAndGenerateServices', () => { - describe('moduleResolver', () => { - const { code, config, projectDirectory } = createAndPrepareParseConfig(); - - 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( - projectDirectory, - './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." - `); - }); - }); - }); -}); diff --git a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts b/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts deleted file mode 100644 index 633e2ed67b0..00000000000 --- a/packages/typescript-estree/tests/lib/parse.moduleResolver.placeholder-success.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { resolve } from 'path'; - -import * as parser from '../../src'; -import { createAndPrepareParseConfig } from '../../tools/test-utils'; - -beforeEach(() => { - jest.clearAllMocks(); -}); - -describe('parseAndGenerateServices', () => { - describe('moduleResolver', () => { - const { code, config, projectDirectory } = createAndPrepareParseConfig(); - - describe('when file is in the project', () => { - it('resolves __PLACEHOLDER__ correctly', () => { - expect( - parser - .parseAndGenerateServices(code, { - ...config, - moduleResolver: resolve(projectDirectory, './moduleResolver.js'), - }) - .services.program!.getSemanticDiagnostics(), - ).toHaveLength(0); - }); - }); - }); -}); diff --git a/packages/typescript-estree/tools/test-utils.ts b/packages/typescript-estree/tools/test-utils.ts index aef5601ebe2..281e396eff4 100644 --- a/packages/typescript-estree/tools/test-utils.ts +++ b/packages/typescript-estree/tools/test-utils.ts @@ -1,15 +1,9 @@ -import { join, resolve } from 'path'; - import type { ParseAndGenerateServicesResult, TSESTree, TSESTreeOptions, } from '../src'; -import { - clearCaches, - parse as parserParse, - parseAndGenerateServices, -} from '../src'; +import { parse as parserParse, parseAndGenerateServices } from '../src'; export function parseCodeAndGenerateServices( code: string, @@ -159,41 +153,3 @@ export function omitDeep( return visit(root as UnknownObject, null); } - -interface CreateAndPrepareParseConfig { - code: string; - config: TSESTreeOptions; - projectDirectory: string; -} - -const FIXTURES_DIR = join(__dirname, '../tests/fixtures/simpleProject'); - -export function createAndPrepareParseConfig(): CreateAndPrepareParseConfig { - beforeEach(() => { - clearCaches(); - }); - - const projectDirectory = resolve(FIXTURES_DIR, '../moduleResolver'); - - const code = ` - import { something } from '__PLACEHOLDER__'; - - something(); - `; - - const config: TSESTreeOptions = { - comment: true, - filePath: resolve(projectDirectory, 'file.ts'), - loc: true, - project: './tsconfig.json', - range: true, - tokens: true, - tsconfigRootDir: projectDirectory, - }; - - return { - code, - config, - projectDirectory, - }; -} diff --git a/packages/website/src/components/linter/config.ts b/packages/website/src/components/linter/config.ts index c92ff39298a..7bfaeefe4cd 100644 --- a/packages/website/src/components/linter/config.ts +++ b/packages/website/src/components/linter/config.ts @@ -16,7 +16,6 @@ export const parseSettings: ParseSettings = { jsx: false, loc: true, log: console.log, - moduleResolver: '', preserveNodeMaps: true, programs: null, projects: [],