diff --git a/packages/language-server/src/plugins/typescript/module-loader.ts b/packages/language-server/src/plugins/typescript/module-loader.ts index 1a4133a9a..7a31fbf33 100644 --- a/packages/language-server/src/plugins/typescript/module-loader.ts +++ b/packages/language-server/src/plugins/typescript/module-loader.ts @@ -73,10 +73,16 @@ class ImpliedNodeFormatResolver { private alreadyResolved = new Map>(); resolve( + importPath: string, importIdxInFile: number, sourceFile: ts.SourceFile | undefined, compilerOptions: ts.CompilerOptions ) { + if (isSvelteFilePath(importPath)) { + // Svelte imports should use the old resolution algorithm, else they are not found + return undefined; + } + let mode = undefined; if (sourceFile) { if (!sourceFile.impliedNodeFormat && isSvelteFilePath(sourceFile.fileName)) { @@ -167,6 +173,7 @@ export function createSvelteModuleLoader( index: number ): ts.ResolvedModule | undefined { const mode = impliedNodeFormatResolver.resolve( + name, index, containingSourceFile, compilerOptions diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/expected.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/expected.json index f17503b0b..055b33e7f 100644 --- a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/expected.json +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/expected.json @@ -1,6 +1,6 @@ [ { - "range": { "start": { "line": 4, "character": 22 }, "end": { "line": 4, "character": 29 } }, + "range": { "start": { "line": 5, "character": 22 }, "end": { "line": 5, "character": 29 } }, "severity": 1, "source": "ts", "message": "Relative import paths need explicit file extensions in EcmaScript imports when '--moduleResolution' is 'node16' or 'nodenext'. Did you mean './bar.js'?", diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/expectedv2.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/expectedv2.json index f17503b0b..055b33e7f 100644 --- a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/expectedv2.json +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/expectedv2.json @@ -1,6 +1,6 @@ [ { - "range": { "start": { "line": 4, "character": 22 }, "end": { "line": 4, "character": 29 } }, + "range": { "start": { "line": 5, "character": 22 }, "end": { "line": 5, "character": 29 } }, "severity": 1, "source": "ts", "message": "Relative import paths need explicit file extensions in EcmaScript imports when '--moduleResolution' is 'node16' or 'nodenext'. Did you mean './bar.js'?", diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/input.svelte b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/input.svelte index 2b2a30987..51ce74b94 100644 --- a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/input.svelte +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/input.svelte @@ -1,8 +1,9 @@ diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/other.svelte b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/other.svelte new file mode 100644 index 000000000..2b2a30987 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/node16/other.svelte @@ -0,0 +1,8 @@ + diff --git a/packages/typescript-plugin/src/module-loader.ts b/packages/typescript-plugin/src/module-loader.ts index 0ccc69e02..0fffcff9c 100644 --- a/packages/typescript-plugin/src/module-loader.ts +++ b/packages/typescript-plugin/src/module-loader.ts @@ -121,26 +121,27 @@ export function patchModuleLoader( return cachedModule; } - const resolvedModule = resolveModuleName(fileName, containingFile, compilerOptions); + const resolvedModule = resolveSvelteModuleName( + fileName, + containingFile, + compilerOptions + ); moduleCache.set(fileName, containingFile, resolvedModule); return resolvedModule; }); } - function resolveModuleName( + function resolveSvelteModuleName( name: string, containingFile: string, compilerOptions: ts.CompilerOptions ): ts.ResolvedModule | undefined { - // If we were to do this correctly, we'd need to check the module resolution mode for - // Node16/NodeNext in order to determine whether or not someone needs to have .js file - // endings in relative import paths. But because we don't do diagnostics within Svelte - // files in this TS plugin, we can ignore this and deal with some false positive resolutions const svelteResolvedModule = typescript.resolveModuleName( name, containingFile, compilerOptions, svelteSys + // don't set mode or else .svelte imports couldn't be resolved ).resolvedModule; if ( !svelteResolvedModule ||