Skip to content

Commit

Permalink
Merge pull request #715 from sheetalkamat/builderApiFixes
Browse files Browse the repository at this point in the history
Fixes to support builder api for compiling https://github.com/johnnyreilly/typescript-ts-loader-watch-api-illustration correctly
  • Loading branch information
johnnyreilly committed Jan 23, 2018
2 parents 6444fa4 + fdacf55 commit 21f4065
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/index.ts
Expand Up @@ -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;
}
}

Expand Down
32 changes: 19 additions & 13 deletions src/instances.ts
Expand Up @@ -22,6 +22,18 @@ import {

const instances = <TSInstances> {};

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
Expand All @@ -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] };
}

Expand Down Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down
6 changes: 1 addition & 5 deletions src/servicesHost.ts
Expand Up @@ -179,7 +179,7 @@ export function makeWatchHost(
useCaseSensitiveFileNames: () => compiler.sys.useCaseSensitiveFileNames,
getNewLine: () => newLine,
getCurrentDirectory,
getDefaultLibFileName,
getDefaultLibFileName: options => compiler.getDefaultLibFilePath(options),

fileExists,
readFile: readFileWithCachingText,
Expand Down Expand Up @@ -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));
}
Expand Down

0 comments on commit 21f4065

Please sign in to comment.