From df9a387479bdcc4b76d234025f302dd8a07be9b1 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 22 Jan 2018 16:22:18 -0800 Subject: [PATCH 1/2] Fixes to support builder api for compiling https://github.com/johnnyreilly/typescript-ts-loader-watch-api-illustration correctly --- src/index.ts | 2 +- src/instances.ts | 32 +++++++++++++++++++------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/index.ts b/src/index.ts index dafec136e..81b69072e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -201,7 +201,7 @@ function updateFileInCache(filePath: string, contents: string, instance: TSInsta file.text = contents; instance.version!++; if (instance.watchHost && fileWatcherEventKind === undefined) { - instance.watchHost.invokeFileWatcher(filePath, instance.compiler.FileWatcherEventKind.Changed); + fileWatcherEventKind = instance.compiler.FileWatcherEventKind.Changed; } } diff --git a/src/instances.ts b/src/instances.ts index e06febf9f..ada6e7807 100644 --- a/src/instances.ts +++ b/src/instances.ts @@ -22,6 +22,18 @@ import { const instances = {}; +function ensureProgram(instance: TSInstance) { + if (instance && instance.watchHost) { + if (instance.changedFilesList) { + instance.watchHost.updateRootFileNames(); + } + if (instance.watchOfFilesAndCompilerOptions) { + instance.program = instance.watchOfFilesAndCompilerOptions.getProgram().getProgram(); + } + return instance.program; + } + return undefined; +} /** * The loader is executed once for each file seen by webpack. However, we need to keep * a persistent instance of TypeScript that contains all of the files in the program @@ -35,14 +47,7 @@ export function getTypeScriptInstance( ): { instance?: TSInstance, error?: WebpackError } { if (hasOwnProperty(instances, loaderOptions.instance)) { const instance = instances[loaderOptions.instance]; - if (instance && instance.watchHost) { - if (instance.changedFilesList) { - instance.watchHost.updateRootFileNames(); - } - if (instance.watchOfFilesAndCompilerOptions) { - instance.program = instance.watchOfFilesAndCompilerOptions.getProgram().getProgram(); - } - } + ensureProgram(instance); return { instance: instances[loaderOptions.instance] }; } @@ -169,8 +174,8 @@ function successfulTypeScriptInstance( log.logInfo("Using watch api"); // If there is api available for watch, use it instead of language service - const watchHost = makeWatchHost(scriptRegex, log, loader, instance, loaderOptions.appendTsSuffixTo, loaderOptions.appendTsxSuffixTo); - instance.watchOfFilesAndCompilerOptions = compiler.createWatchProgram(watchHost); + instance.watchHost = makeWatchHost(scriptRegex, log, loader, instance, loaderOptions.appendTsSuffixTo, loaderOptions.appendTsxSuffixTo); + instance.watchOfFilesAndCompilerOptions = compiler.createWatchProgram(instance.watchHost); instance.program = instance.watchOfFilesAndCompilerOptions.getProgram().getProgram(); } else { @@ -185,12 +190,13 @@ function successfulTypeScriptInstance( } export function getEmitOutput(instance: TSInstance, filePath: string) { - if (instance.program) { + const program = ensureProgram(instance); + if (program) { const outputFiles: typescript.OutputFile[] = []; const writeFile = (fileName: string, text: string, writeByteOrderMark: boolean) => outputFiles.push({ name: fileName, writeByteOrderMark, text }); - const sourceFile = instance.program.getSourceFile(filePath); - instance.program.emit(sourceFile, writeFile, /*cancellationToken*/ undefined, /*emitOnlyDtsFiles*/ false, instance.transformers); + const sourceFile = program.getSourceFile(filePath); + program.emit(sourceFile, writeFile, /*cancellationToken*/ undefined, /*emitOnlyDtsFiles*/ false, instance.transformers); return outputFiles; } else { From fdacf552c6cfeffc71adce706456bff8c02261df Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 22 Jan 2018 16:35:35 -0800 Subject: [PATCH 2/2] Fix the lib file detection --- src/servicesHost.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/servicesHost.ts b/src/servicesHost.ts index c25a0e8cd..904267231 100644 --- a/src/servicesHost.ts +++ b/src/servicesHost.ts @@ -179,7 +179,7 @@ export function makeWatchHost( useCaseSensitiveFileNames: () => compiler.sys.useCaseSensitiveFileNames, getNewLine: () => newLine, getCurrentDirectory, - getDefaultLibFileName, + getDefaultLibFileName: options => compiler.getDefaultLibFilePath(options), fileExists, readFile: readFileWithCachingText, @@ -209,10 +209,6 @@ export function makeWatchHost( }; return watchHost; - function getDefaultLibFileName(options: typescript.CompilerOptions) { - return path.join(path.dirname(compiler.sys.getExecutingFilePath()), compiler.getDefaultLibFileName(options)); - } - function getRootFileNames() { return Object.keys(files).filter(filePath => filePath.match(scriptRegex)); }