From d46e9c883d3a9c04271759d047379bb18fe45c70 Mon Sep 17 00:00:00 2001 From: "Lyu, Wei Da" Date: Mon, 3 Feb 2025 12:57:32 +0800 Subject: [PATCH] fix: use referenced project's compiler option to get resolution mode --- .../src/plugins/typescript/module-loader.ts | 9 +++- .../test/plugins/typescript/service.test.ts | 48 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/packages/language-server/src/plugins/typescript/module-loader.ts b/packages/language-server/src/plugins/typescript/module-loader.ts index 4cbde00b8..c33ce46e6 100644 --- a/packages/language-server/src/plugins/typescript/module-loader.ts +++ b/packages/language-server/src/plugins/typescript/module-loader.ts @@ -266,7 +266,14 @@ export function createSvelteModuleLoader( redirectedReference: ts.ResolvedProjectReference | undefined, option: ts.CompilerOptions ): ts.ResolvedModuleWithFailedLookupLocations { - const mode = impliedNodeFormatResolver.resolve(name, index, containingSourceFile, option); + const mode = impliedNodeFormatResolver.resolve( + name, + index, + containingSourceFile, + // use the same compiler options as resolveModuleName + // otherwise it might not find the module because of inconsistent module resolution strategy + redirectedReference?.commandLine.options ?? option + ); const resolvedModuleWithFailedLookup = tsModule.resolveModuleName( name, containingFile, diff --git a/packages/language-server/test/plugins/typescript/service.test.ts b/packages/language-server/test/plugins/typescript/service.test.ts index 360848fad..060b094d2 100644 --- a/packages/language-server/test/plugins/typescript/service.test.ts +++ b/packages/language-server/test/plugins/typescript/service.test.ts @@ -548,6 +548,54 @@ describe('service', () => { assert.deepStrictEqual(getSemanticDiagnosticsMessages(ls, importing), []); }); + it('resolve module with source project reference redirect having different module resolution', async () => { + const dirPath = getRandomVirtualDirPath(testDir); + const { virtualSystem, lsDocumentContext, rootUris } = setup(); + + const package1 = path.join(dirPath, 'package1'); + + virtualSystem.writeFile( + path.join(package1, 'tsconfig.json'), + JSON.stringify({ + references: [{ path: '../package2' }], + files: ['index.ts'], + compilerOptions: { + moduleResolution: 'Bundler', + module: 'ESNext', + paths: { + package2: ['../package2'] + } + } + }) + ); + + const package2 = path.join(dirPath, 'package2'); + virtualSystem.writeFile( + path.join(package2, 'tsconfig.json'), + JSON.stringify({ + compilerOptions: { + composite: true, + strict: true, + moduleResolution: 'NodeNext' + }, + files: ['index.ts'] + }) + ); + + const importing = path.join(package1, 'index.ts'); + virtualSystem.writeFile(importing, 'import { hi } from "package2"; hi((a) => `${a}`);'); + + const reExport = path.join(package2, 'index.ts'); + virtualSystem.writeFile(reExport, 'export * from "./foo"'); + + const exportFile = path.join(package2, 'foo.ts'); + virtualSystem.writeFile(exportFile, 'export function hi(cb: (num: number) => string) {}'); + + const ls = await getService(importing, rootUris, lsDocumentContext); + + assert.deepStrictEqual(getSemanticDiagnosticsMessages(ls, importing), []); + }); + it('skip directory watching if directory is root', async () => { const dirPath = getRandomVirtualDirPath(path.join(testDir, 'Test')); const { virtualSystem, lsDocumentContext } = setup();