diff --git a/packages/typescript/lib/node/decorateLanguageServiceHost.ts b/packages/typescript/lib/node/decorateLanguageServiceHost.ts index a131ec5b..30f1c90f 100644 --- a/packages/typescript/lib/node/decorateLanguageServiceHost.ts +++ b/packages/typescript/lib/node/decorateLanguageServiceHost.ts @@ -14,12 +14,11 @@ export function decorateLanguageServiceHost( const exts = languagePlugins .map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? []) .flat(); - const scripts = new Map(); + }]>(); const readDirectory = languageServiceHost.readDirectory?.bind(languageServiceHost); const resolveModuleNameLiterals = languageServiceHost.resolveModuleNameLiterals?.bind(languageServiceHost); @@ -88,32 +87,28 @@ export function decorateLanguageServiceHost( } languageServiceHost.getScriptSnapshot = fileName => { - if (exts.some(ext => fileName.endsWith(ext))) { - updateScript(fileName); - return scripts.get(fileName)?.snapshot; + const virtualScript = updateVirtualScript(fileName); + if (virtualScript) { + return virtualScript.snapshot; } return getScriptSnapshot(fileName); }; if (getScriptKind) { languageServiceHost.getScriptKind = fileName => { - if (exts.some(ext => fileName.endsWith(ext))) { - updateScript(fileName); - const script = scripts.get(fileName); - if (script) { - return script.kind; - } - return ts.ScriptKind.Deferred; + const virtualScript = updateVirtualScript(fileName); + if (virtualScript) { + return virtualScript.kind; } return getScriptKind(fileName); }; } - function updateScript(fileName: string) { + function updateVirtualScript(fileName: string) { const version = languageServiceHost.getScriptVersion(fileName); - if (version !== scripts.get(fileName)?.version) { + if (version !== scripts.get(fileName)?.[0]) { let extension = '.ts'; let snapshotSnapshot: ts.IScriptSnapshot | undefined; @@ -144,15 +139,19 @@ export function decorateLanguageServiceHost( virtualFiles.delete(fileName); } - scripts.set(fileName, { - version, - extension, - snapshot: snapshotSnapshot, - kind: scriptKind, - }); + if (snapshotSnapshot) { + scripts.set(fileName, [ + version, + { + extension, + snapshot: snapshotSnapshot, + kind: scriptKind, + } + ]); + } } - return scripts.get(fileName); + return scripts.get(fileName)?.[1]; } }