Skip to content

Commit

Permalink
fix(typescript): getScriptSnapshot, getScriptKind should not check fi…
Browse files Browse the repository at this point in the history
…le extensions

fixes cannot generate virtual code in ts plugin for vue-vine
refs: vue-vine/vue-vine#69
  • Loading branch information
johnsoncodehk committed Mar 26, 2024
1 parent 1b7f456 commit 79e50fa
Showing 1 changed file with 22 additions and 23 deletions.
45 changes: 22 additions & 23 deletions packages/typescript/lib/node/decorateLanguageServiceHost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,11 @@ export function decorateLanguageServiceHost(
const exts = languagePlugins
.map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
.flat();
const scripts = new Map<string, {
version: string;
snapshot: ts.IScriptSnapshot | undefined;
const scripts = new Map<string, [version: string, {
snapshot: ts.IScriptSnapshot;
kind: ts.ScriptKind;
extension: string;
}>();
}]>();

const readDirectory = languageServiceHost.readDirectory?.bind(languageServiceHost);
const resolveModuleNameLiterals = languageServiceHost.resolveModuleNameLiterals?.bind(languageServiceHost);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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];
}
}

Expand Down

0 comments on commit 79e50fa

Please sign in to comment.