in server/src/session.ts [105:165]
private createProjectService(options: SessionOptions): ts.server.ProjectService {
const projSvc = new ts.server.ProjectService({
host: options.host,
logger: options.logger,
cancellationToken: ts.server.nullCancellationToken,
useSingleInferredProject: true,
useInferredProjectPerProjectRoot: true,
typingsInstaller: ts.server.nullTypingsInstaller,
// Not supressing diagnostic events can cause a type error to be thrown when the
// language server session gets an event for a file that is outside the project
// managed by the project service, and for which a program does not exist in the
// corresponding project's language service.
// See https://github.com/angular/vscode-ng-language-service/issues/693
suppressDiagnosticEvents: true,
eventHandler: (e) => this.handleProjectServiceEvent(e),
globalPlugins: [options.ngPlugin],
pluginProbeLocations: [options.resolvedNgLsPath],
// do not resolve plugins from the directory where tsconfig.json is located
allowLocalPluginLoads: false,
session: undefined,
});
projSvc.setHostConfiguration({
formatOptions: projSvc.getHostFormatCodeOptions(),
extraFileExtensions: [
{
// TODO: in View Engine getExternalFiles() returns a list of external
// templates (HTML files). This configuration is no longer needed in
// Ivy because Ivy returns the typecheck files.
extension: '.html',
isMixedContent: false,
scriptKind: ts.ScriptKind.Unknown,
},
],
preferences: {
// We don't want the AutoImportProvider projects to be created. See
// https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/#smarter-auto-imports
includePackageJsonAutoImports: 'off',
},
watchOptions: {
// Used as watch options when not specified by user's `tsconfig`.
watchFile: ts.WatchFileKind.UseFsEvents,
watchDirectory: ts.WatchDirectoryKind.UseFsEvents,
fallbackPolling: ts.PollingWatchKind.DynamicPriority,
}
});
const pluginConfig: PluginConfig = {
angularOnly: true,
};
if (options.host.isG3) {
options.ivy = true;
pluginConfig.forceStrictTemplates = true;
}
projSvc.configurePlugin({
pluginName: options.ngPlugin,
configuration: pluginConfig,
});
return projSvc;
}