@@ -8,7 +8,7 @@
* Create the TypeScript language service
*/
function makeServicesHost(scriptRegex, log, loader, instance, enableFileCaching, projectReferences) {
- const { compiler, compilerOptions, files, loaderOptions: { appendTsSuffixTo, appendTsxSuffixTo, resolveModuleName: customResolveModuleName } } = instance;
+ const { compiler, compilerOptions, appendTsTsxSuffixesIfRequired, files, loaderOptions: { resolveModuleName: customResolveModuleName, resolveTypeReferenceDirective: customResolveTypeReferenceDirective } } = instance;
const newLine = compilerOptions.newLine === constants.CarriageReturnLineFeedCode
? constants.CarriageReturnLineFeed
: compilerOptions.newLine === constants.LineFeedCode
@@ -28,6 +28,7 @@
const clearCache = enableFileCaching ? addCache(moduleResolutionHost) : null;
// loader.context seems to work fine on Linux / Mac regardless causes problems for @types resolution on Windows for TypeScript < 2.3
const getCurrentDirectory = () => loader.context;
+ const resolvers = makeResolvers(compiler, compilerOptions, moduleResolutionHost, customResolveTypeReferenceDirective, customResolveModuleName, resolveSync, appendTsTsxSuffixesIfRequired, scriptRegex, instance);
const servicesHost = {
getProjectVersion: () => `${instance.version}`,
getProjectReferences: () => projectReferences,
@@ -73,22 +74,34 @@
getNewLine: () => newLine,
trace: log.log,
log: log.log,
- /* Unclear if this is useful
- resolveTypeReferenceDirectives: (typeDirectiveNames: string[], containingFile: string) =>
- typeDirectiveNames.map(directive =>
- compiler.resolveTypeReferenceDirective(directive, containingFile, compilerOptions, moduleResolutionHost).resolvedTypeReferenceDirective),
- */
- resolveModuleNames: (moduleNames, containingFile) => resolveModuleNames(resolveSync, moduleResolutionHost, appendTsSuffixTo, appendTsxSuffixTo, scriptRegex, instance, moduleNames, containingFile, getResolutionStrategy, customResolveModuleName),
+ // used for (/// <reference types="...">) see https://github.com/Realytics/fork-ts-checker-webpack-plugin/pull/250#issuecomment-485061329
+ resolveTypeReferenceDirectives: resolvers.resolveTypeReferenceDirectives,
+ resolveModuleNames: resolvers.resolveModuleNames,
getCustomTransformers: () => instance.transformers
};
return { servicesHost, clearCache };
}
exports.makeServicesHost = makeServicesHost;
+function makeResolvers(compiler, compilerOptions, moduleResolutionHost, customResolveTypeReferenceDirective, customResolveModuleName, resolveSync, appendTsTsxSuffixesIfRequired, scriptRegex, instance) {
+ const resolveTypeReferenceDirective = makeResolveTypeReferenceDirective(compiler, compilerOptions, moduleResolutionHost, customResolveTypeReferenceDirective);
+ const resolveTypeReferenceDirectives = (typeDirectiveNames, containingFile, _redirectedReference) => typeDirectiveNames.map(directive => resolveTypeReferenceDirective(directive, containingFile)
+ .resolvedTypeReferenceDirective);
+ const resolveModuleName = makeResolveModuleName(compiler, compilerOptions, moduleResolutionHost, customResolveModuleName);
+ const resolveModuleNames = (moduleNames, containingFile, _reusedNames, _redirectedReference) => {
+ const resolvedModules = moduleNames.map(moduleName => resolveModule(resolveSync, resolveModuleName, appendTsTsxSuffixesIfRequired, scriptRegex, moduleName, containingFile));
+ populateDependencyGraphs(resolvedModules, instance, containingFile);
+ return resolvedModules;
+ };
+ return {
+ resolveTypeReferenceDirectives,
+ resolveModuleNames
+ };
+}
/**
* Create the TypeScript Watch host
*/
-function makeWatchHost(scriptRegex, log, loader, instance, appendTsSuffixTo, appendTsxSuffixTo, projectReferences) {
- const { compiler, compilerOptions, files, otherFiles } = instance;
+function makeWatchHost(scriptRegex, log, loader, instance, projectReferences) {
+ const { compiler, compilerOptions, appendTsTsxSuffixesIfRequired, files, otherFiles, loaderOptions: { resolveModuleName: customResolveModuleName, resolveTypeReferenceDirective: customResolveTypeReferenceDirective } } = instance;
const newLine = compilerOptions.newLine === constants.CarriageReturnLineFeedCode
? constants.CarriageReturnLineFeed
: compilerOptions.newLine === constants.LineFeedCode
@@ -107,6 +120,7 @@
const watchedFiles = {};
const watchedDirectories = {};
const watchedDirectoriesRecursive = {};
+ const resolvers = makeResolvers(compiler, compilerOptions, moduleResolutionHost, customResolveTypeReferenceDirective, customResolveModuleName, resolveSync, appendTsTsxSuffixesIfRequired, scriptRegex, instance);
const watchHost = {
rootFiles: getRootFileNames(),
options: compilerOptions,
@@ -123,7 +137,9 @@
trace: logData => log.log(logData),
watchFile,
watchDirectory,
- resolveModuleNames: (moduleNames, containingFile) => resolveModuleNames(resolveSync, moduleResolutionHost, appendTsSuffixTo, appendTsxSuffixTo, scriptRegex, instance, moduleNames, containingFile, getResolutionStrategy),
+ // used for (/// <reference types="...">) see https://github.com/Realytics/fork-ts-checker-webpack-plugin/pull/250#issuecomment-485061329
+ resolveTypeReferenceDirectives: resolvers.resolveTypeReferenceDirectives,
+ resolveModuleNames: resolvers.resolveModuleNames,
invokeFileWatcher,
invokeDirectoryWatcher,
updateRootFileNames: () => {
@@ -223,38 +239,28 @@
}
}
exports.makeWatchHost = makeWatchHost;
-function resolveModuleNames(resolveSync, moduleResolutionHost, appendTsSuffixTo, appendTsxSuffixTo, scriptRegex, instance, moduleNames, containingFile, resolutionStrategy, customResolveModuleName) {
- const resolvedModules = moduleNames.map(moduleName => resolveModuleName(resolveSync, moduleResolutionHost, appendTsSuffixTo, appendTsxSuffixTo, scriptRegex, instance, moduleName, containingFile, resolutionStrategy, customResolveModuleName));
- populateDependencyGraphs(resolvedModules, instance, containingFile);
- return resolvedModules;
+function makeResolveTypeReferenceDirective(compiler, compilerOptions, moduleResolutionHost, customResolveTypeReferenceDirective) {
+ if (customResolveTypeReferenceDirective === undefined) {
+ return (directive, containingFile) => compiler.resolveTypeReferenceDirective(directive, containingFile, compilerOptions, moduleResolutionHost);
+ }
+ return (directive, containingFile) => customResolveTypeReferenceDirective(directive, containingFile, compilerOptions, moduleResolutionHost, compiler.resolveTypeReferenceDirective);
}
function isJsImplementationOfTypings(resolvedModule, tsResolution) {
return (resolvedModule.resolvedFileName.endsWith('js') &&
/\.d\.ts$/.test(tsResolution.resolvedFileName));
}
-function applyTsResolver(compiler, moduleName, containingFile, compilerOptions, moduleResolutionHost) {
- return compiler.resolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionHost);
-}
-function resolveModuleName(resolveSync, moduleResolutionHost, appendTsSuffixTo, appendTsxSuffixTo, scriptRegex, instance, moduleName, containingFile, resolutionStrategy, customResolveModuleName) {
- const { compiler, compilerOptions } = instance;
+function resolveModule(resolveSync, resolveModuleName, appendTsTsxSuffixesIfRequired, scriptRegex, moduleName, containingFile) {
let resolutionResult;
try {
const originalFileName = resolveSync(undefined, path.normalize(path.dirname(containingFile)), moduleName);
- const resolvedFileName = appendTsSuffixTo.length > 0 || appendTsxSuffixTo.length > 0
- ? utils_1.appendSuffixesIfMatch({
- '.ts': appendTsSuffixTo,
- '.tsx': appendTsxSuffixTo
- }, originalFileName)
- : originalFileName;
+ const resolvedFileName = appendTsTsxSuffixesIfRequired(originalFileName);
if (resolvedFileName.match(scriptRegex) !== null) {
resolutionResult = { resolvedFileName, originalFileName };
}
// tslint:disable-next-line:no-empty
}
catch (e) { }
- const tsResolution = customResolveModuleName !== undefined
- ? customResolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionHost, (moduleNameFromCustomFn, containingFileFromCustomFn, compilerOptionsFromCustomFn, moduleResolutionHostFromCustomFn) => applyTsResolver(compiler, moduleNameFromCustomFn, containingFileFromCustomFn, compilerOptionsFromCustomFn, moduleResolutionHostFromCustomFn))
- : applyTsResolver(compiler, moduleName, containingFile, compilerOptions, moduleResolutionHost);
+ const tsResolution = resolveModuleName(moduleName, containingFile);
if (tsResolution.resolvedModule !== undefined) {
const resolvedFileName = path.normalize(tsResolution.resolvedModule.resolvedFileName);
const tsResolutionResult = {
@@ -262,17 +268,20 @@
resolvedFileName,
isExternalLibraryImport: tsResolution.resolvedModule.isExternalLibraryImport
};
- return resolutionStrategy(resolutionResult, tsResolutionResult);
- }
- return resolutionResult;
-}
-function getResolutionStrategy(resolutionResult, tsResolutionResult) {
return resolutionResult === undefined ||
resolutionResult.resolvedFileName ===
tsResolutionResult.resolvedFileName ||
isJsImplementationOfTypings(resolutionResult, tsResolutionResult)
? tsResolutionResult
: resolutionResult;
+ }
+ return resolutionResult;
+}
+function makeResolveModuleName(compiler, compilerOptions, moduleResolutionHost, customResolveModuleName) {
+ if (customResolveModuleName === undefined) {
+ return (moduleName, containingFile) => compiler.resolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionHost);
+ }
+ return (moduleName, containingFile) => customResolveModuleName(moduleName, containingFile, compilerOptions, moduleResolutionHost, compiler.resolveModuleName);
}
function populateDependencyGraphs(resolvedModules, instance, containingFile) {
resolvedModules = resolvedModules.filter(mod => mod !== null && mod !== undefined);