Skip to content

Commit 51408f0

Browse files
committed
Allow plugins to override lshost.resolveModuleName
The implementation is ugly and probably still a little bit wrong.
1 parent 7def921 commit 51408f0

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/server/lsHost.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace ts.server {
1111

1212
private filesWithChangedSetOfUnresolvedImports: Path[];
1313

14-
private readonly resolveModuleName: typeof resolveModuleName;
14+
private resolveModuleName: typeof resolveModuleName;
1515
readonly trace: (s: string) => void;
1616
readonly realpath?: (path: string) => string;
1717

@@ -46,6 +46,11 @@ namespace ts.server {
4646
}
4747
}
4848

49+
public overrideResolveModuleName(plugin: PluginResolveModules) {
50+
const prevResolveModuleName = this.resolveModuleName;
51+
this.resolveModuleName = plugin(prevResolveModuleName);
52+
}
53+
4954
public startRecordingFilesWithChangedResolutions() {
5055
this.filesWithChangedSetOfUnresolvedImports = [];
5156
}
@@ -237,4 +242,4 @@ namespace ts.server {
237242
this.compilationSettings = opt;
238243
}
239244
}
240-
}
245+
}

src/server/project.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ namespace ts.server {
102102
export interface PluginModule {
103103
create(createInfo: PluginCreateInfo): LanguageService;
104104
getExternalFiles?(proj: Project): string[];
105+
resolveModules?(createInfo: PluginCreateInfo): PluginResolveModules;
105106
changeSourceFiles?(createInfo: PluginCreateInfo): PluginSourceFileChange;
106107
}
107108

@@ -110,6 +111,12 @@ namespace ts.server {
110111
updateLanguageServiceSourceFile(sourceFile: SourceFile, scriptSnapshot: IScriptSnapshot, version: string, textChangeRange: TextChangeRange, aggressiveChecks?: boolean, cheat?: string): SourceFile,
111112
};
112113

114+
export type ModuleResolver = (moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache) => ResolvedModuleWithFailedLookupLocations;
115+
116+
export type PluginResolveModules = {
117+
(plugin: ModuleResolver): ModuleResolver;
118+
}
119+
113120
export interface PluginModuleFactory {
114121
(mod: { typescript: typeof ts }): PluginModule;
115122
}
@@ -915,6 +922,9 @@ namespace ts.server {
915922
ts.createLanguageServiceSourceFile = chg.createLanguageServiceSourceFile;
916923
ts.updateLanguageServiceSourceFile = chg.updateLanguageServiceSourceFile;
917924
}
925+
if (pluginModule.resolveModules) {
926+
this.lsHost.overrideResolveModuleName(pluginModule.resolveModules(info));
927+
}
918928
this.plugins.push(pluginModule);
919929
}
920930
catch (e) {

0 commit comments

Comments
 (0)