Skip to content

Commit

Permalink
try strategy approach splitting 2.4 and above and 2.3 and below behav…
Browse files Browse the repository at this point in the history
…iour
  • Loading branch information
johnnyreilly committed Oct 18, 2017
1 parent e576c92 commit a2b613a
Showing 1 changed file with 43 additions and 29 deletions.
72 changes: 43 additions & 29 deletions src/servicesHost.ts
@@ -1,11 +1,12 @@
import * as typescript from 'typescript';
import * as path from 'path';
import * as semver from 'semver';

import * as constants from './constants';
import * as logger from './logger';
import { makeResolver } from './resolver';
import { appendSuffixesIfMatch, readFile } from './utils';
import {
import {
ModuleResolutionHost,
ResolvedModule,
ResolveSync,
Expand All @@ -28,8 +29,8 @@ export function makeServicesHost(

const newLine =
compilerOptions.newLine === constants.CarriageReturnLineFeedCode ? constants.CarriageReturnLineFeed :
compilerOptions.newLine === constants.LineFeedCode ? constants.LineFeed :
constants.EOL;
compilerOptions.newLine === constants.LineFeedCode ? constants.LineFeed :
constants.EOL;

// make a (sync) resolver that follows webpack's rules
const resolveSync = makeResolver(loader.options);
Expand All @@ -47,6 +48,10 @@ export function makeServicesHost(
readFile: readFileWithFallback
};

const resolutionStrategy = (compiler!.version && semver.gte(compiler!.version, '2.4.0'))
? resolutionStrategyTS24AndAbove
: resolutionStrategyTS23AndBelow;

const servicesHost: typescript.LanguageServiceHost = {
getProjectVersion: () => `${instance.version}`,

Expand Down Expand Up @@ -84,8 +89,8 @@ export function makeServicesHost(
*/
directoryExists: compiler.sys ? compiler.sys.directoryExists : undefined,

useCaseSensitiveFileNames: compiler.sys
? () => compiler.sys.useCaseSensitiveFileNames
useCaseSensitiveFileNames: compiler.sys
? () => compiler.sys.useCaseSensitiveFileNames
: undefined,

// The following three methods are necessary for @types resolution from TS 2.4.1 onwards see: https://github.com/Microsoft/TypeScript/issues/16772
Expand All @@ -109,8 +114,8 @@ export function makeServicesHost(
resolveModuleNames: (moduleNames: string[], containingFile: string) =>
resolveModuleNames(
resolveSync, moduleResolutionHost, appendTsSuffixTo, appendTsxSuffixTo, scriptRegex, instance,
moduleNames, containingFile),
moduleNames, containingFile, resolutionStrategy),

getCustomTransformers: () => instance.transformers
};

Expand All @@ -125,12 +130,13 @@ function resolveModuleNames(
scriptRegex: RegExp,
instance: TSInstance,
moduleNames: string[],
containingFile: string
containingFile: string,
resolutionStrategy: ResolutionStrategy
) {
const resolvedModules = moduleNames.map(moduleName =>
resolveModuleName(resolveSync, moduleResolutionHost, appendTsSuffixTo, appendTsxSuffixTo, scriptRegex, instance,
moduleName, containingFile));
moduleName, containingFile, resolutionStrategy));

populateDependencyGraphs(resolvedModules, instance, containingFile);

return resolvedModules;
Expand All @@ -140,10 +146,12 @@ function isJsImplementationOfTypings(
resolvedModule: ResolvedModule,
tsResolution: ResolvedModule
) {
return resolvedModule.resolvedFileName.endsWith('js') &&
/node_modules(\\|\/).*\.d\.ts$/.test(tsResolution.resolvedFileName);
return resolvedModule.resolvedFileName.endsWith('js') &&
/node_modules(\\|\/).*\.d\.ts$/.test(tsResolution.resolvedFileName);
}

type ResolutionStrategy = (resolutionResult: ResolvedModule | undefined, tsResolutionResult: ResolvedModule) => ResolvedModule;

function resolveModuleName(
resolveSync: ResolveSync,
moduleResolutionHost: ModuleResolutionHost,
Expand All @@ -153,7 +161,9 @@ function resolveModuleName(
instance: TSInstance,

moduleName: string,
containingFile: string
containingFile: string,

resolutionStrategy: ResolutionStrategy
) {
const { compiler, compilerOptions } = instance;

Expand Down Expand Up @@ -184,28 +194,32 @@ function resolveModuleName(
isExternalLibraryImport: tsResolution.resolvedModule.isExternalLibraryImport
};

// Old strategy
if (resolutionResult!) {
if (resolutionResult!.resolvedFileName === tsResolutionResult.resolvedFileName ||
isJsImplementationOfTypings(resolutionResult!, tsResolutionResult)) {
resolutionResult!.isExternalLibraryImport = tsResolutionResult.isExternalLibraryImport;
}
} else {
resolutionResult = tsResolutionResult;
}
return resolutionStrategy(resolutionResult!, tsResolutionResult);
}
return resolutionResult!;
}

/* New strategy
if (resolutionResult! === undefined ||
resolutionResult!.resolvedFileName === tsResolutionResult.resolvedFileName ||
isJsImplementationOfTypings(resolutionResult!, tsResolutionResult)
) {
resolutionResult = tsResolutionResult;
function resolutionStrategyTS23AndBelow(resolutionResult: ResolvedModule | undefined, tsResolutionResult: ResolvedModule): ResolvedModule {
if (resolutionResult! !== undefined) {
if (resolutionResult!.resolvedFileName === tsResolutionResult.resolvedFileName ||
isJsImplementationOfTypings(resolutionResult!, tsResolutionResult)) {
resolutionResult!.isExternalLibraryImport = tsResolutionResult.isExternalLibraryImport;
}
*/
} else {
return tsResolutionResult;
}
return resolutionResult!;
}

function resolutionStrategyTS24AndAbove(resolutionResult: ResolvedModule | undefined, tsResolutionResult: ResolvedModule): ResolvedModule {
return (resolutionResult! === undefined ||
resolutionResult!.resolvedFileName === tsResolutionResult.resolvedFileName ||
isJsImplementationOfTypings(resolutionResult!, tsResolutionResult)
)
? tsResolutionResult
: resolutionResult!;
}

function populateDependencyGraphs(
resolvedModules: ResolvedModule[],
instance: TSInstance,
Expand Down

0 comments on commit a2b613a

Please sign in to comment.