@teambit/ts-server 0.0.77 → 0.0.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -130,6 +130,7 @@ export declare class ProcessBasedTsServer {
130
130
  private readonly deferreds;
131
131
  private logger;
132
132
  private cancellationPipeName;
133
+ private killedIntentionally;
133
134
  constructor(options: TspClientOptions, tsServerArgs?: TsServerArgs);
134
135
  restart(): Promise<void>;
135
136
  start(): Promise<void>;
@@ -139,6 +140,7 @@ export declare class ProcessBasedTsServer {
139
140
  notify(command: CommandTypes.Change, args: ts.server.protocol.ChangeRequestArgs): Promise<void>;
140
141
  request<K extends keyof TypeScriptRequestTypes>(command: K, args: TypeScriptRequestTypes[K][0], token?: CancellationToken): Promise<TypeScriptRequestTypes[K][1]>;
141
142
  kill(): void;
143
+ private rejectAllPendingRequests;
142
144
  private log;
143
145
  protected sendMessage(command: string, notification: boolean, args?: any): void;
144
146
  protected processMessage(untrimmedMessageString: string, resolve?: () => void, reject?: (err: any) => void): void;
@@ -69,6 +69,7 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
69
69
  class ProcessBasedTsServer {
70
70
  seq = 0;
71
71
  deferreds = {};
72
+ killedIntentionally = false;
72
73
  constructor(options, tsServerArgs = {}) {
73
74
  this.options = options;
74
75
  this.tsServerArgs = tsServerArgs;
@@ -84,6 +85,7 @@ class ProcessBasedTsServer {
84
85
  reject(new Error('server already started'));
85
86
  return;
86
87
  }
88
+ this.killedIntentionally = false;
87
89
  const {
88
90
  tsserverPath
89
91
  } = this.options;
@@ -123,6 +125,16 @@ class ProcessBasedTsServer {
123
125
  this.kill();
124
126
  reject(new Error('TSServer was killed'));
125
127
  });
128
+ this.tsServerProcess.on('exit', (code, signal) => {
129
+ if (this.killedIntentionally) return;
130
+ const msg = `TSServer process exited unexpectedly (code: ${code}, signal: ${signal})`;
131
+ this.logger.error(msg);
132
+ reject(new Error(msg));
133
+ this.rejectAllPendingRequests(msg);
134
+ this.tsServerProcess = null;
135
+ this.readlineInterface?.close();
136
+ this.readlineInterface = null;
137
+ });
126
138
  this.readlineInterface.on('line', line => {
127
139
  this.processMessage(line, resolve, reject);
128
140
  });
@@ -172,12 +184,22 @@ class ProcessBasedTsServer {
172
184
  }
173
185
  }
174
186
  kill() {
187
+ this.killedIntentionally = true;
175
188
  this.tsServerProcess?.kill();
176
189
  this.tsServerProcess?.stdin?.destroy();
177
190
  this.readlineInterface?.close();
178
191
  this.tsServerProcess = null;
179
192
  this.readlineInterface = null;
180
193
  }
194
+ rejectAllPendingRequests(reason) {
195
+ const error = new Error(reason);
196
+ for (const deferred of Object.values(this.deferreds)) {
197
+ deferred.reject(error);
198
+ }
199
+ for (const seq of Object.keys(this.deferreds)) {
200
+ delete this.deferreds[seq];
201
+ }
202
+ }
181
203
  log(msg, obj = {}) {
182
204
  msg = `[tsserver] ${msg}`;
183
205
  if (this.options.logToConsole) {
@@ -1 +1 @@
1
- {"version":3,"names":["fs","data","_interopRequireWildcard","require","path","cp","readline","decoder","_tempy","_interopRequireDefault","_utils","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ProcessBasedTsServer","seq","deferreds","constructor","options","tsServerArgs","logger","restart","kill","start","Promise","resolve","reject","tsServerProcess","Error","tsserverPath","logFile","logVerbosity","maxTsServerMemory","globalPlugins","pluginProbeLocations","args","push","length","join","cancellationPipeName","tempy","file","name","info","tsserverPathIsModule","extname","silent","execArgv","fork","spawn","readlineInterface","createInterface","stdout","stdin","undefined","process","on","line","processMessage","dec","StringDecoder","stderr","addListener","stringMsg","write","error","notify","command","ensureServerIsRunning","sendMessage","request","token","deferred","Deferred","promise","onCancelled","onCancellationRequested","dispose","requestCancellationPipeName","writeFile","err","then","unlink","result","destroy","close","log","msg","obj","logToConsole","console","JSON","stringify","trace","notification","type","arguments","serializedRequest","untrimmedMessageString","messageString","trim","startsWith","message","parse","isEvent","isResponse","resolveResponse","request_seq","success","isRequestCompletedEvent","body","onEvent","event","exports"],"sources":["process-based-tsserver.ts"],"sourcesContent":["/**\n * part of this file was copied over from https://github.com/typescript-language-server/typescript-language-server/blob/master/src/tsp-client.ts\n */\n\n/*\n * Copyright (C) 2017, 2018 TypeFox and others.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as cp from 'child_process';\nimport * as readline from 'readline';\nimport type { Logger } from '@teambit/logger';\nimport type { Readable, Writable } from 'stream';\nimport * as decoder from 'string_decoder';\nimport type ts from 'typescript/lib/tsserverlibrary';\nimport tempy from 'tempy';\nimport type { CancellationToken } from 'vscode-jsonrpc';\nimport type { CommandTypes } from './tsp-command-types';\nimport { Deferred } from './utils';\n\nexport interface TspClientOptions {\n logger: Logger;\n tsserverPath: string;\n logToConsole?: boolean;\n onEvent?: (event: ts.server.protocol.Event) => void;\n}\n\nexport interface TsServerArgs {\n logFile?: string;\n logVerbosity?: string;\n maxTsServerMemory?: number;\n globalPlugins?: string[];\n pluginProbeLocations?: string[];\n}\n\nexport interface StandardTsServerRequests {\n [CommandTypes.ApplyCodeActionCommand]: [\n ts.server.protocol.ApplyCodeActionCommandRequestArgs,\n ts.server.protocol.ApplyCodeActionCommandResponse,\n ];\n [CommandTypes.CompletionDetails]: [\n ts.server.protocol.CompletionDetailsRequestArgs,\n ts.server.protocol.CompletionDetailsResponse,\n ];\n [CommandTypes.CompletionInfo]: [ts.server.protocol.CompletionsRequestArgs, ts.server.protocol.CompletionInfoResponse];\n [CommandTypes.Configure]: [ts.server.protocol.ConfigureRequestArguments, ts.server.protocol.ConfigureResponse];\n [CommandTypes.Definition]: [ts.server.protocol.FileLocationRequestArgs, ts.server.protocol.DefinitionResponse];\n [CommandTypes.DefinitionAndBoundSpan]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.DefinitionInfoAndBoundSpanResponse,\n ];\n [CommandTypes.DocCommentTemplate]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.DocCommandTemplateResponse,\n ];\n [CommandTypes.DocumentHighlights]: [\n ts.server.protocol.DocumentHighlightsRequestArgs,\n ts.server.protocol.DocumentHighlightsResponse,\n ];\n [CommandTypes.Format]: [ts.server.protocol.FormatRequestArgs, ts.server.protocol.FormatResponse];\n [CommandTypes.Formatonkey]: [ts.server.protocol.FormatOnKeyRequestArgs, ts.server.protocol.FormatResponse];\n [CommandTypes.GetApplicableRefactors]: [\n ts.server.protocol.GetApplicableRefactorsRequestArgs,\n ts.server.protocol.GetApplicableRefactorsResponse,\n ];\n [CommandTypes.GetCodeFixes]: [ts.server.protocol.CodeFixRequestArgs, ts.server.protocol.CodeFixResponse];\n [CommandTypes.GetCombinedCodeFix]: [\n ts.server.protocol.GetCombinedCodeFixRequestArgs,\n ts.server.protocol.GetCombinedCodeFixResponse,\n ];\n [CommandTypes.GetEditsForFileRename]: [\n ts.server.protocol.GetEditsForFileRenameRequestArgs,\n ts.server.protocol.GetEditsForFileRenameResponse,\n ];\n [CommandTypes.GetEditsForRefactor]: [\n ts.server.protocol.GetEditsForRefactorRequestArgs,\n ts.server.protocol.GetEditsForRefactorResponse,\n ];\n [CommandTypes.GetOutliningSpans]: [ts.server.protocol.FileRequestArgs, ts.server.protocol.OutliningSpansResponse];\n [CommandTypes.GetSupportedCodeFixes]: [null, ts.server.protocol.GetSupportedCodeFixesResponse];\n [CommandTypes.Implementation]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.ImplementationResponse,\n ];\n [CommandTypes.JsxClosingTag]: [ts.server.protocol.JsxClosingTagRequestArgs, ts.server.protocol.JsxClosingTagResponse];\n [CommandTypes.Navto]: [ts.server.protocol.NavtoRequestArgs, ts.server.protocol.NavtoResponse];\n [CommandTypes.NavTree]: [ts.server.protocol.FileRequestArgs, ts.server.protocol.NavTreeResponse];\n [CommandTypes.OrganizeImports]: [\n ts.server.protocol.OrganizeImportsRequestArgs,\n ts.server.protocol.OrganizeImportsResponse,\n ];\n [CommandTypes.PrepareCallHierarchy]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.PrepareCallHierarchyResponse,\n ];\n [CommandTypes.ProvideCallHierarchyIncomingCalls]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.ProvideCallHierarchyIncomingCallsResponse,\n ];\n [CommandTypes.ProvideCallHierarchyOutgoingCalls]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.ProvideCallHierarchyOutgoingCallsResponse,\n ];\n [CommandTypes.ProjectInfo]: [ts.server.protocol.ProjectInfoRequestArgs, ts.server.protocol.ProjectInfoResponse];\n [CommandTypes.ProvideInlayHints]: [ts.server.protocol.InlayHintsRequestArgs, ts.server.protocol.InlayHintsResponse];\n [CommandTypes.Quickinfo]: [ts.server.protocol.FileLocationRequestArgs, ts.server.protocol.QuickInfoResponse];\n [CommandTypes.References]: [ts.server.protocol.FileLocationRequestArgs, ts.server.protocol.ReferencesResponse];\n [CommandTypes.Rename]: [ts.server.protocol.RenameRequestArgs, ts.server.protocol.RenameResponse];\n [CommandTypes.SelectionRange]: [\n ts.server.protocol.SelectionRangeRequestArgs,\n ts.server.protocol.SelectionRangeResponse,\n ];\n [CommandTypes.SignatureHelp]: [ts.server.protocol.SignatureHelpRequestArgs, ts.server.protocol.SignatureHelpResponse];\n [CommandTypes.TypeDefinition]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.TypeDefinitionResponse,\n ];\n [CommandTypes.UpdateOpen]: [ts.server.protocol.UpdateOpenRequestArgs, ts.server.protocol.Response];\n}\n\nexport interface NoResponseTsServerRequests {\n [CommandTypes.Change]: [ts.server.protocol.ChangeRequestArgs, null];\n [CommandTypes.Close]: [ts.server.protocol.FileRequestArgs, null];\n [CommandTypes.CompilerOptionsForInferredProjects]: [\n ts.server.protocol.SetCompilerOptionsForInferredProjectsArgs,\n ts.server.protocol.SetCompilerOptionsForInferredProjectsResponse,\n ];\n [CommandTypes.Configure]: [ts.server.protocol.ConfigureRequestArguments, ts.server.protocol.ConfigureResponse];\n [CommandTypes.ConfigurePlugin]: [\n ts.server.protocol.ConfigurePluginRequestArguments,\n ts.server.protocol.ConfigurePluginResponse,\n ];\n [CommandTypes.Open]: [ts.server.protocol.OpenRequestArgs, null];\n}\n\nexport interface AsyncTsServerRequests {\n [CommandTypes.Geterr]: [ts.server.protocol.GeterrRequestArgs, ts.server.protocol.Response];\n [CommandTypes.GeterrForProject]: [ts.server.protocol.GeterrForProjectRequestArgs, ts.server.protocol.Response];\n}\n\nexport type TypeScriptRequestTypes = StandardTsServerRequests & NoResponseTsServerRequests & AsyncTsServerRequests;\n\nexport class ProcessBasedTsServer {\n private readlineInterface: readline.ReadLine | null;\n private tsServerProcess: cp.ChildProcess | null;\n private seq = 0;\n\n private readonly deferreds: {\n [seq: number]: Deferred<any>;\n } = {};\n\n private logger: Logger;\n private cancellationPipeName: string | undefined;\n\n constructor(\n private options: TspClientOptions,\n private tsServerArgs: TsServerArgs = {}\n ) {\n this.logger = options.logger;\n }\n\n async restart() {\n this.kill();\n await this.start();\n }\n\n start() {\n return new Promise<void>((resolve, reject) => {\n if (this.tsServerProcess) {\n reject(new Error('server already started'));\n return;\n }\n\n const { tsserverPath } = this.options;\n const { logFile, logVerbosity, maxTsServerMemory, globalPlugins, pluginProbeLocations } = this.tsServerArgs;\n const args: string[] = [];\n if (logFile) {\n args.push('--logFile', logFile);\n }\n if (logVerbosity) {\n args.push('--logVerbosity', logVerbosity);\n }\n if (globalPlugins && globalPlugins.length) {\n args.push('--globalPlugins', globalPlugins.join(','));\n }\n if (pluginProbeLocations && pluginProbeLocations.length) {\n args.push('--pluginProbeLocations', pluginProbeLocations.join(','));\n }\n this.cancellationPipeName = tempy.file({ name: 'tscancellation' });\n args.push('--cancellationPipeName', `${this.cancellationPipeName}*`);\n this.logger.info(`Starting tsserver : '${tsserverPath} ${args.join(' ')}'`);\n const tsserverPathIsModule = path.extname(tsserverPath) === '.js';\n const options = {\n silent: true,\n execArgv: maxTsServerMemory ? [`--max-old-space-size=${maxTsServerMemory}`] : [],\n };\n this.tsServerProcess = tsserverPathIsModule ? cp.fork(tsserverPath, args, options) : cp.spawn(tsserverPath, args);\n\n this.readlineInterface = readline.createInterface(\n this.tsServerProcess.stdout as Readable,\n this.tsServerProcess.stdin as Writable,\n undefined\n );\n process.on('exit', () => {\n this.kill();\n reject(new Error('TSServer was killed'));\n });\n\n this.readlineInterface.on('line', (line) => {\n this.processMessage(line, resolve, reject);\n });\n\n const dec = new decoder.StringDecoder('utf-8');\n this.tsServerProcess.stderr?.addListener('data', (data) => {\n const stringMsg = typeof data === 'string' ? data : dec.write(data);\n this.logger.error(stringMsg);\n reject(new Error(stringMsg));\n });\n });\n }\n\n async notify(command: CommandTypes.Open, args: ts.server.protocol.OpenRequestArgs): Promise<void>;\n async notify(command: CommandTypes.Close, args: ts.server.protocol.FileRequestArgs): Promise<void>;\n async notify(command: CommandTypes.Saveto, args: ts.server.protocol.SavetoRequestArgs): Promise<void>;\n async notify(command: CommandTypes.Change, args: ts.server.protocol.ChangeRequestArgs): Promise<void>;\n async notify(command: string, args: any): Promise<void> {\n await this.ensureServerIsRunning();\n this.sendMessage(command, true, args);\n }\n\n async request<K extends keyof TypeScriptRequestTypes>(\n command: K,\n args: TypeScriptRequestTypes[K][0],\n token?: CancellationToken\n ): Promise<TypeScriptRequestTypes[K][1]> {\n await this.ensureServerIsRunning();\n this.sendMessage(command, false, args);\n const seq = this.seq;\n const deferred = new Deferred<TypeScriptRequestTypes[K][1]>();\n this.deferreds[seq] = deferred;\n const request = deferred.promise;\n\n let onCancelled;\n if (token) {\n onCancelled = token.onCancellationRequested(() => {\n onCancelled.dispose();\n if (this.cancellationPipeName) {\n const requestCancellationPipeName = `${this.cancellationPipeName}${seq}`;\n fs.writeFile(requestCancellationPipeName, '', (err) => {\n if (!err) {\n // eslint-disable-next-line\n request.then(() =>\n fs.unlink(requestCancellationPipeName, () => {\n /* no-op */\n })\n );\n }\n });\n }\n });\n }\n\n try {\n const result = await request;\n onCancelled?.dispose();\n return result;\n } catch (error) {\n this.logger.error(`Error in request: ${error}`);\n throw error;\n }\n }\n\n kill() {\n this.tsServerProcess?.kill();\n this.tsServerProcess?.stdin?.destroy();\n this.readlineInterface?.close();\n this.tsServerProcess = null;\n this.readlineInterface = null;\n }\n\n private log(msg: string, obj: Record<string, any> = {}) {\n msg = `[tsserver] ${msg}`;\n if (this.options.logToConsole) {\n this.logger.console(`${msg} ${JSON.stringify(obj, undefined, 4)}`);\n } else {\n this.logger.trace(msg, obj);\n }\n }\n\n protected sendMessage(command: string, notification: boolean, args?: any): void {\n this.seq += 1;\n const request: ts.server.protocol.Request = {\n command,\n seq: this.seq,\n type: 'request',\n };\n if (args) {\n request.arguments = args;\n }\n const serializedRequest = `${JSON.stringify(request)}\\n`;\n this.tsServerProcess?.stdin?.write(serializedRequest);\n this.log(notification ? 'notify' : 'request', request);\n }\n\n protected processMessage(untrimmedMessageString: string, resolve?: () => void, reject?: (err) => void): void {\n const messageString = untrimmedMessageString.trim();\n if (!messageString || messageString.startsWith('Content-Length:')) {\n return;\n }\n let message: ts.server.protocol.Message;\n\n try {\n message = JSON.parse(messageString);\n } catch {\n // If the message isn't valid JSON, it's not a valid tsserver message. Reject the promise.\n reject?.(new Error(`Received invalid message from TSServer: ${untrimmedMessageString}`));\n return;\n }\n\n this.log('processMessage', message);\n\n if (this.isEvent(message)) {\n resolve?.();\n }\n\n if (this.isResponse(message)) {\n this.resolveResponse(message, message.request_seq, message.success);\n } else if (this.isEvent(message)) {\n if (this.isRequestCompletedEvent(message)) {\n this.resolveResponse(message, message.body.request_seq, true);\n } else if (this.options.onEvent) {\n this.options.onEvent(message);\n }\n }\n }\n\n private resolveResponse(message: ts.server.protocol.Message, request_seq: number, success: boolean) {\n const deferred = this.deferreds[request_seq];\n this.log('request completed', { request_seq, success });\n if (deferred) {\n if (success) {\n this.deferreds[request_seq].resolve(message);\n } else {\n this.deferreds[request_seq].reject(message);\n }\n delete this.deferreds[request_seq];\n }\n }\n\n private isEvent(message: ts.server.protocol.Message): message is ts.server.protocol.Event {\n return message.type === 'event';\n }\n\n private isResponse(message: ts.server.protocol.Message): message is ts.server.protocol.Response {\n return message.type === 'response';\n }\n\n private isRequestCompletedEvent(\n message: ts.server.protocol.Message\n ): message is ts.server.protocol.RequestCompletedEvent {\n return this.isEvent(message) && message.event === 'requestCompleted';\n }\n\n private async ensureServerIsRunning() {\n if (!this.tsServerProcess) {\n await this.restart();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["fs","data","_interopRequireWildcard","require","path","cp","readline","decoder","_tempy","_interopRequireDefault","_utils","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ProcessBasedTsServer","seq","deferreds","killedIntentionally","constructor","options","tsServerArgs","logger","restart","kill","start","Promise","resolve","reject","tsServerProcess","Error","tsserverPath","logFile","logVerbosity","maxTsServerMemory","globalPlugins","pluginProbeLocations","args","push","length","join","cancellationPipeName","tempy","file","name","info","tsserverPathIsModule","extname","silent","execArgv","fork","spawn","readlineInterface","createInterface","stdout","stdin","undefined","process","on","code","signal","msg","error","rejectAllPendingRequests","close","line","processMessage","dec","StringDecoder","stderr","addListener","stringMsg","write","notify","command","ensureServerIsRunning","sendMessage","request","token","deferred","Deferred","promise","onCancelled","onCancellationRequested","dispose","requestCancellationPipeName","writeFile","err","then","unlink","result","destroy","reason","values","keys","log","obj","logToConsole","console","JSON","stringify","trace","notification","type","arguments","serializedRequest","untrimmedMessageString","messageString","trim","startsWith","message","parse","isEvent","isResponse","resolveResponse","request_seq","success","isRequestCompletedEvent","body","onEvent","event","exports"],"sources":["process-based-tsserver.ts"],"sourcesContent":["/**\n * part of this file was copied over from https://github.com/typescript-language-server/typescript-language-server/blob/master/src/tsp-client.ts\n */\n\n/*\n * Copyright (C) 2017, 2018 TypeFox and others.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as cp from 'child_process';\nimport * as readline from 'readline';\nimport type { Logger } from '@teambit/logger';\nimport type { Readable, Writable } from 'stream';\nimport * as decoder from 'string_decoder';\nimport type ts from 'typescript/lib/tsserverlibrary';\nimport tempy from 'tempy';\nimport type { CancellationToken } from 'vscode-jsonrpc';\nimport type { CommandTypes } from './tsp-command-types';\nimport { Deferred } from './utils';\n\nexport interface TspClientOptions {\n logger: Logger;\n tsserverPath: string;\n logToConsole?: boolean;\n onEvent?: (event: ts.server.protocol.Event) => void;\n}\n\nexport interface TsServerArgs {\n logFile?: string;\n logVerbosity?: string;\n maxTsServerMemory?: number;\n globalPlugins?: string[];\n pluginProbeLocations?: string[];\n}\n\nexport interface StandardTsServerRequests {\n [CommandTypes.ApplyCodeActionCommand]: [\n ts.server.protocol.ApplyCodeActionCommandRequestArgs,\n ts.server.protocol.ApplyCodeActionCommandResponse,\n ];\n [CommandTypes.CompletionDetails]: [\n ts.server.protocol.CompletionDetailsRequestArgs,\n ts.server.protocol.CompletionDetailsResponse,\n ];\n [CommandTypes.CompletionInfo]: [ts.server.protocol.CompletionsRequestArgs, ts.server.protocol.CompletionInfoResponse];\n [CommandTypes.Configure]: [ts.server.protocol.ConfigureRequestArguments, ts.server.protocol.ConfigureResponse];\n [CommandTypes.Definition]: [ts.server.protocol.FileLocationRequestArgs, ts.server.protocol.DefinitionResponse];\n [CommandTypes.DefinitionAndBoundSpan]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.DefinitionInfoAndBoundSpanResponse,\n ];\n [CommandTypes.DocCommentTemplate]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.DocCommandTemplateResponse,\n ];\n [CommandTypes.DocumentHighlights]: [\n ts.server.protocol.DocumentHighlightsRequestArgs,\n ts.server.protocol.DocumentHighlightsResponse,\n ];\n [CommandTypes.Format]: [ts.server.protocol.FormatRequestArgs, ts.server.protocol.FormatResponse];\n [CommandTypes.Formatonkey]: [ts.server.protocol.FormatOnKeyRequestArgs, ts.server.protocol.FormatResponse];\n [CommandTypes.GetApplicableRefactors]: [\n ts.server.protocol.GetApplicableRefactorsRequestArgs,\n ts.server.protocol.GetApplicableRefactorsResponse,\n ];\n [CommandTypes.GetCodeFixes]: [ts.server.protocol.CodeFixRequestArgs, ts.server.protocol.CodeFixResponse];\n [CommandTypes.GetCombinedCodeFix]: [\n ts.server.protocol.GetCombinedCodeFixRequestArgs,\n ts.server.protocol.GetCombinedCodeFixResponse,\n ];\n [CommandTypes.GetEditsForFileRename]: [\n ts.server.protocol.GetEditsForFileRenameRequestArgs,\n ts.server.protocol.GetEditsForFileRenameResponse,\n ];\n [CommandTypes.GetEditsForRefactor]: [\n ts.server.protocol.GetEditsForRefactorRequestArgs,\n ts.server.protocol.GetEditsForRefactorResponse,\n ];\n [CommandTypes.GetOutliningSpans]: [ts.server.protocol.FileRequestArgs, ts.server.protocol.OutliningSpansResponse];\n [CommandTypes.GetSupportedCodeFixes]: [null, ts.server.protocol.GetSupportedCodeFixesResponse];\n [CommandTypes.Implementation]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.ImplementationResponse,\n ];\n [CommandTypes.JsxClosingTag]: [ts.server.protocol.JsxClosingTagRequestArgs, ts.server.protocol.JsxClosingTagResponse];\n [CommandTypes.Navto]: [ts.server.protocol.NavtoRequestArgs, ts.server.protocol.NavtoResponse];\n [CommandTypes.NavTree]: [ts.server.protocol.FileRequestArgs, ts.server.protocol.NavTreeResponse];\n [CommandTypes.OrganizeImports]: [\n ts.server.protocol.OrganizeImportsRequestArgs,\n ts.server.protocol.OrganizeImportsResponse,\n ];\n [CommandTypes.PrepareCallHierarchy]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.PrepareCallHierarchyResponse,\n ];\n [CommandTypes.ProvideCallHierarchyIncomingCalls]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.ProvideCallHierarchyIncomingCallsResponse,\n ];\n [CommandTypes.ProvideCallHierarchyOutgoingCalls]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.ProvideCallHierarchyOutgoingCallsResponse,\n ];\n [CommandTypes.ProjectInfo]: [ts.server.protocol.ProjectInfoRequestArgs, ts.server.protocol.ProjectInfoResponse];\n [CommandTypes.ProvideInlayHints]: [ts.server.protocol.InlayHintsRequestArgs, ts.server.protocol.InlayHintsResponse];\n [CommandTypes.Quickinfo]: [ts.server.protocol.FileLocationRequestArgs, ts.server.protocol.QuickInfoResponse];\n [CommandTypes.References]: [ts.server.protocol.FileLocationRequestArgs, ts.server.protocol.ReferencesResponse];\n [CommandTypes.Rename]: [ts.server.protocol.RenameRequestArgs, ts.server.protocol.RenameResponse];\n [CommandTypes.SelectionRange]: [\n ts.server.protocol.SelectionRangeRequestArgs,\n ts.server.protocol.SelectionRangeResponse,\n ];\n [CommandTypes.SignatureHelp]: [ts.server.protocol.SignatureHelpRequestArgs, ts.server.protocol.SignatureHelpResponse];\n [CommandTypes.TypeDefinition]: [\n ts.server.protocol.FileLocationRequestArgs,\n ts.server.protocol.TypeDefinitionResponse,\n ];\n [CommandTypes.UpdateOpen]: [ts.server.protocol.UpdateOpenRequestArgs, ts.server.protocol.Response];\n}\n\nexport interface NoResponseTsServerRequests {\n [CommandTypes.Change]: [ts.server.protocol.ChangeRequestArgs, null];\n [CommandTypes.Close]: [ts.server.protocol.FileRequestArgs, null];\n [CommandTypes.CompilerOptionsForInferredProjects]: [\n ts.server.protocol.SetCompilerOptionsForInferredProjectsArgs,\n ts.server.protocol.SetCompilerOptionsForInferredProjectsResponse,\n ];\n [CommandTypes.Configure]: [ts.server.protocol.ConfigureRequestArguments, ts.server.protocol.ConfigureResponse];\n [CommandTypes.ConfigurePlugin]: [\n ts.server.protocol.ConfigurePluginRequestArguments,\n ts.server.protocol.ConfigurePluginResponse,\n ];\n [CommandTypes.Open]: [ts.server.protocol.OpenRequestArgs, null];\n}\n\nexport interface AsyncTsServerRequests {\n [CommandTypes.Geterr]: [ts.server.protocol.GeterrRequestArgs, ts.server.protocol.Response];\n [CommandTypes.GeterrForProject]: [ts.server.protocol.GeterrForProjectRequestArgs, ts.server.protocol.Response];\n}\n\nexport type TypeScriptRequestTypes = StandardTsServerRequests & NoResponseTsServerRequests & AsyncTsServerRequests;\n\nexport class ProcessBasedTsServer {\n private readlineInterface: readline.ReadLine | null;\n private tsServerProcess: cp.ChildProcess | null;\n private seq = 0;\n\n private readonly deferreds: {\n [seq: number]: Deferred<any>;\n } = {};\n\n private logger: Logger;\n private cancellationPipeName: string | undefined;\n private killedIntentionally = false;\n\n constructor(\n private options: TspClientOptions,\n private tsServerArgs: TsServerArgs = {}\n ) {\n this.logger = options.logger;\n }\n\n async restart() {\n this.kill();\n await this.start();\n }\n\n start() {\n return new Promise<void>((resolve, reject) => {\n if (this.tsServerProcess) {\n reject(new Error('server already started'));\n return;\n }\n this.killedIntentionally = false;\n\n const { tsserverPath } = this.options;\n const { logFile, logVerbosity, maxTsServerMemory, globalPlugins, pluginProbeLocations } = this.tsServerArgs;\n const args: string[] = [];\n if (logFile) {\n args.push('--logFile', logFile);\n }\n if (logVerbosity) {\n args.push('--logVerbosity', logVerbosity);\n }\n if (globalPlugins && globalPlugins.length) {\n args.push('--globalPlugins', globalPlugins.join(','));\n }\n if (pluginProbeLocations && pluginProbeLocations.length) {\n args.push('--pluginProbeLocations', pluginProbeLocations.join(','));\n }\n this.cancellationPipeName = tempy.file({ name: 'tscancellation' });\n args.push('--cancellationPipeName', `${this.cancellationPipeName}*`);\n this.logger.info(`Starting tsserver : '${tsserverPath} ${args.join(' ')}'`);\n const tsserverPathIsModule = path.extname(tsserverPath) === '.js';\n const options = {\n silent: true,\n execArgv: maxTsServerMemory ? [`--max-old-space-size=${maxTsServerMemory}`] : [],\n };\n this.tsServerProcess = tsserverPathIsModule ? cp.fork(tsserverPath, args, options) : cp.spawn(tsserverPath, args);\n\n this.readlineInterface = readline.createInterface(\n this.tsServerProcess.stdout as Readable,\n this.tsServerProcess.stdin as Writable,\n undefined\n );\n process.on('exit', () => {\n this.kill();\n reject(new Error('TSServer was killed'));\n });\n\n this.tsServerProcess.on('exit', (code, signal) => {\n if (this.killedIntentionally) return;\n const msg = `TSServer process exited unexpectedly (code: ${code}, signal: ${signal})`;\n this.logger.error(msg);\n reject(new Error(msg));\n this.rejectAllPendingRequests(msg);\n this.tsServerProcess = null;\n this.readlineInterface?.close();\n this.readlineInterface = null;\n });\n\n this.readlineInterface.on('line', (line) => {\n this.processMessage(line, resolve, reject);\n });\n\n const dec = new decoder.StringDecoder('utf-8');\n this.tsServerProcess.stderr?.addListener('data', (data) => {\n const stringMsg = typeof data === 'string' ? data : dec.write(data);\n this.logger.error(stringMsg);\n reject(new Error(stringMsg));\n });\n });\n }\n\n async notify(command: CommandTypes.Open, args: ts.server.protocol.OpenRequestArgs): Promise<void>;\n async notify(command: CommandTypes.Close, args: ts.server.protocol.FileRequestArgs): Promise<void>;\n async notify(command: CommandTypes.Saveto, args: ts.server.protocol.SavetoRequestArgs): Promise<void>;\n async notify(command: CommandTypes.Change, args: ts.server.protocol.ChangeRequestArgs): Promise<void>;\n async notify(command: string, args: any): Promise<void> {\n await this.ensureServerIsRunning();\n this.sendMessage(command, true, args);\n }\n\n async request<K extends keyof TypeScriptRequestTypes>(\n command: K,\n args: TypeScriptRequestTypes[K][0],\n token?: CancellationToken\n ): Promise<TypeScriptRequestTypes[K][1]> {\n await this.ensureServerIsRunning();\n this.sendMessage(command, false, args);\n const seq = this.seq;\n const deferred = new Deferred<TypeScriptRequestTypes[K][1]>();\n this.deferreds[seq] = deferred;\n const request = deferred.promise;\n\n let onCancelled;\n if (token) {\n onCancelled = token.onCancellationRequested(() => {\n onCancelled.dispose();\n if (this.cancellationPipeName) {\n const requestCancellationPipeName = `${this.cancellationPipeName}${seq}`;\n fs.writeFile(requestCancellationPipeName, '', (err) => {\n if (!err) {\n // eslint-disable-next-line\n request.then(() =>\n fs.unlink(requestCancellationPipeName, () => {\n /* no-op */\n })\n );\n }\n });\n }\n });\n }\n\n try {\n const result = await request;\n onCancelled?.dispose();\n return result;\n } catch (error) {\n this.logger.error(`Error in request: ${error}`);\n throw error;\n }\n }\n\n kill() {\n this.killedIntentionally = true;\n this.tsServerProcess?.kill();\n this.tsServerProcess?.stdin?.destroy();\n this.readlineInterface?.close();\n this.tsServerProcess = null;\n this.readlineInterface = null;\n }\n\n private rejectAllPendingRequests(reason: string) {\n const error = new Error(reason);\n for (const deferred of Object.values(this.deferreds)) {\n deferred.reject(error);\n }\n for (const seq of Object.keys(this.deferreds)) {\n delete this.deferreds[seq];\n }\n }\n\n private log(msg: string, obj: Record<string, any> = {}) {\n msg = `[tsserver] ${msg}`;\n if (this.options.logToConsole) {\n this.logger.console(`${msg} ${JSON.stringify(obj, undefined, 4)}`);\n } else {\n this.logger.trace(msg, obj);\n }\n }\n\n protected sendMessage(command: string, notification: boolean, args?: any): void {\n this.seq += 1;\n const request: ts.server.protocol.Request = {\n command,\n seq: this.seq,\n type: 'request',\n };\n if (args) {\n request.arguments = args;\n }\n const serializedRequest = `${JSON.stringify(request)}\\n`;\n this.tsServerProcess?.stdin?.write(serializedRequest);\n this.log(notification ? 'notify' : 'request', request);\n }\n\n protected processMessage(untrimmedMessageString: string, resolve?: () => void, reject?: (err) => void): void {\n const messageString = untrimmedMessageString.trim();\n if (!messageString || messageString.startsWith('Content-Length:')) {\n return;\n }\n let message: ts.server.protocol.Message;\n\n try {\n message = JSON.parse(messageString);\n } catch {\n // If the message isn't valid JSON, it's not a valid tsserver message. Reject the promise.\n reject?.(new Error(`Received invalid message from TSServer: ${untrimmedMessageString}`));\n return;\n }\n\n this.log('processMessage', message);\n\n if (this.isEvent(message)) {\n resolve?.();\n }\n\n if (this.isResponse(message)) {\n this.resolveResponse(message, message.request_seq, message.success);\n } else if (this.isEvent(message)) {\n if (this.isRequestCompletedEvent(message)) {\n this.resolveResponse(message, message.body.request_seq, true);\n } else if (this.options.onEvent) {\n this.options.onEvent(message);\n }\n }\n }\n\n private resolveResponse(message: ts.server.protocol.Message, request_seq: number, success: boolean) {\n const deferred = this.deferreds[request_seq];\n this.log('request completed', { request_seq, success });\n if (deferred) {\n if (success) {\n this.deferreds[request_seq].resolve(message);\n } else {\n this.deferreds[request_seq].reject(message);\n }\n delete this.deferreds[request_seq];\n }\n }\n\n private isEvent(message: ts.server.protocol.Message): message is ts.server.protocol.Event {\n return message.type === 'event';\n }\n\n private isResponse(message: ts.server.protocol.Message): message is ts.server.protocol.Response {\n return message.type === 'response';\n }\n\n private isRequestCompletedEvent(\n message: ts.server.protocol.Message\n ): message is ts.server.protocol.RequestCompletedEvent {\n return this.isEvent(message) && message.event === 'requestCompleted';\n }\n\n private async ensureServerIsRunning() {\n if (!this.tsServerProcess) {\n await this.restart();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,6 +9,12 @@ export type TsserverClientOpts = {
9
9
  checkTypes?: CheckTypes;
10
10
  printTypeErrors?: boolean;
11
11
  aggregateDiagnosticData?: boolean;
12
+ /**
13
+ * if false, files passed to the constructor are NOT opened during init().
14
+ * useful when the caller wants to control opening (e.g. batched open/close in `getDiagnostic`).
15
+ * default: true (backward compatible).
16
+ */
17
+ openFilesOnInit?: boolean;
12
18
  };
13
19
  export type DiagnosticData = {
14
20
  file: string;
@@ -30,6 +36,7 @@ export declare class TsserverClient {
30
36
  private tsServer;
31
37
  lastDiagnostics: ts.server.protocol.DiagnosticEventBody[];
32
38
  private serverRunning;
39
+ private filesPreOpenedOnInit;
33
40
  diagnosticData: DiagnosticData[];
34
41
  constructor(
35
42
  /**
@@ -66,9 +73,19 @@ export declare class TsserverClient {
66
73
  * were found or not.
67
74
  *
68
75
  * @param files files to check
69
- * @param batchSize if provided, files will be processed in batches to avoid overwhelming tsserver
76
+ * @param batchSize if provided, files will be processed in batches. when files were not pre-opened
77
+ * via init(), each batch is opened, checked, then closed — keeping tsserver memory
78
+ * bounded by the batch size to avoid OOM in large workspaces.
70
79
  */
71
80
  getDiagnostic(files?: string[], batchSize?: number): Promise<any>;
81
+ /**
82
+ * open multiple files in a single round-trip. useful when batching to bound tsserver memory.
83
+ */
84
+ openFiles(files: string[]): Promise<void>;
85
+ /**
86
+ * close multiple files in a single round-trip.
87
+ */
88
+ closeFiles(files: string[]): Promise<void>;
72
89
  /**
73
90
  * avoid using this method, it takes longer than `getDiagnostic()` and shows errors from paths outside the project
74
91
  */
@@ -71,6 +71,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
71
71
  class TsserverClient {
72
72
  lastDiagnostics = [];
73
73
  serverRunning = false;
74
+ filesPreOpenedOnInit = false;
74
75
  diagnosticData = [];
75
76
  constructor(
76
77
  /**
@@ -106,16 +107,14 @@ class TsserverClient {
106
107
  }).catch(err => {
107
108
  this.logger.error('TsserverClient.init failed', err);
108
109
  });
109
- if (this.files.length) {
110
- const openPromises = this.files.map(file => this.open(file));
111
- await Promise.all(openPromises.map(promise => promise.catch(error => error)));
112
- const failedFiles = openPromises.filter(promise => promise instanceof Error);
113
- if (failedFiles.length > 0) {
114
- this.logger.error('TsserverClient.init failed to open files:', failedFiles);
115
- }
110
+ const shouldOpenFiles = this.options.openFilesOnInit !== false;
111
+ if (this.files.length && shouldOpenFiles) {
112
+ const openResults = await Promise.all(this.files.map(file => this.open(file).catch(error => error)));
113
+ const failedFiles = openResults.filter(result => result instanceof Error);
116
114
  if (failedFiles.length > 0) {
117
115
  this.logger.error('TsserverClient.init failed to open files:', failedFiles);
118
116
  }
117
+ this.filesPreOpenedOnInit = true;
119
118
  this.checkTypesIfNeeded();
120
119
  }
121
120
  this.logger.debug('TsserverClient.init completed');
@@ -177,7 +176,9 @@ class TsserverClient {
177
176
  * were found or not.
178
177
  *
179
178
  * @param files files to check
180
- * @param batchSize if provided, files will be processed in batches to avoid overwhelming tsserver
179
+ * @param batchSize if provided, files will be processed in batches. when files were not pre-opened
180
+ * via init(), each batch is opened, checked, then closed — keeping tsserver memory
181
+ * bounded by the batch size to avoid OOM in large workspaces.
181
182
  */
182
183
  async getDiagnostic(files = this.files, batchSize) {
183
184
  this.lastDiagnostics = [];
@@ -187,17 +188,55 @@ class TsserverClient {
187
188
  files
188
189
  });
189
190
  }
190
-
191
- // Process files in batches
192
- for (let i = 0; i < files.length; i += batchSize) {
193
- const batch = files.slice(i, i + batchSize);
194
- await this.tsServer?.request(_tspCommandTypes().CommandTypes.Geterr, {
195
- delay: 0,
196
- files: batch
197
- });
191
+ const filesArePreOpened = this.filesPreOpenedOnInit && files.every(f => this.files.includes(f));
192
+ const total = files.length;
193
+ try {
194
+ for (let i = 0; i < files.length; i += batchSize) {
195
+ const batch = files.slice(i, i + batchSize);
196
+ const upTo = Math.min(i + batchSize, total);
197
+ this.logger.setStatusLine(`type-checking files ${i + 1}-${upTo} of ${total}`);
198
+ if (!filesArePreOpened) {
199
+ await this.openFiles(batch);
200
+ }
201
+ try {
202
+ await this.tsServer?.request(_tspCommandTypes().CommandTypes.Geterr, {
203
+ delay: 0,
204
+ files: batch
205
+ });
206
+ } finally {
207
+ if (!filesArePreOpened) {
208
+ await this.closeFiles(batch).catch(err => this.logger.error('failed to close batch', err));
209
+ }
210
+ }
211
+ }
212
+ } finally {
213
+ this.logger.clearStatusLine();
198
214
  }
199
215
  }
200
216
 
217
+ /**
218
+ * open multiple files in a single round-trip. useful when batching to bound tsserver memory.
219
+ */
220
+ async openFiles(files) {
221
+ if (!files.length) return;
222
+ await this.tsServer?.request(_tspCommandTypes().CommandTypes.UpdateOpen, {
223
+ openFiles: files.map(file => ({
224
+ file,
225
+ projectRootPath: this.projectPath
226
+ }))
227
+ });
228
+ }
229
+
230
+ /**
231
+ * close multiple files in a single round-trip.
232
+ */
233
+ async closeFiles(files) {
234
+ if (!files.length) return;
235
+ await this.tsServer?.request(_tspCommandTypes().CommandTypes.UpdateOpen, {
236
+ closedFiles: files
237
+ });
238
+ }
239
+
201
240
  /**
202
241
  * avoid using this method, it takes longer than `getDiagnostic()` and shows errors from paths outside the project
203
242
  */
@@ -1 +1 @@
1
- {"version":3,"names":["_fsExtra","data","_interopRequireDefault","require","_path","_watcher","_commandExists","_modulesResolver","_processBasedTsserver","_tspCommandTypes","_utils","_formatDiagnostics","e","__esModule","default","TsserverClient","lastDiagnostics","serverRunning","diagnosticData","constructor","projectPath","logger","options","files","init","tsServer","ProcessBasedTsServer","tsserverPath","findTsserverPath","logToConsole","verbose","onEvent","onTsserverEvent","bind","start","then","catch","err","error","length","openPromises","map","file","open","Promise","all","promise","failedFiles","filter","Error","checkTypesIfNeeded","debug","shouldCheckTypes","Date","now","getDiagnostic","end","msg","consoleFailure","consoleSuccess","console","Boolean","checkTypes","onFileChange","changed","CheckTypes","ChangedFile","undefined","killTsServer","kill","isServerRunning","batchSize","request","CommandTypes","Geterr","delay","i","batch","slice","getDiagnosticAllProject","requestedByFile","GeterrForProject","getQuickInfo","position","absFile","convertFileToAbsoluteIfNeeded","openIfNeeded","Quickinfo","line","offset","character","getTypeDefinition","TypeDefinition","getDefinition","response","Definition","success","warn","getReferences","References","getSignatureHelp","SignatureHelp","configure","configureArgs","Configure","includes","push","notify","Open","projectRootPath","close","Close","openFile","Change","endLine","endOffset","insertString","content","fs","readFile","event","EventName","semanticDiag","syntaxDiag","publishDiagnostic","filepath","path","isAbsolute","join","message","body","diagnostics","printTypeErrors","aggregateDiagnosticData","relative","forEach","diag","formatted","formatDiagnostic","diagnostic","tsServerPath","bundled","findPathToModule","__dirname","commandExists","sync","getTsserverExecutable","exports"],"sources":["ts-server-client.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport type { Logger } from '@teambit/logger';\nimport path from 'path';\nimport type ts from 'typescript/lib/tsserverlibrary';\nimport { CheckTypes } from '@teambit/watcher';\nimport type { Position } from 'vscode-languageserver-types';\nimport commandExists from 'command-exists';\nimport { findPathToModule } from './modules-resolver';\nimport { ProcessBasedTsServer } from './process-based-tsserver';\nimport { CommandTypes, EventName } from './tsp-command-types';\nimport { getTsserverExecutable } from './utils';\nimport type { Diagnostic } from './format-diagnostics';\nimport { formatDiagnostic } from './format-diagnostics';\n\nexport type TsserverClientOpts = {\n verbose?: boolean; // print tsserver events to the console.\n tsServerPath?: string; // if not provided, it'll use findTsserverPath() strategies.\n checkTypes?: CheckTypes; // whether errors/warnings are monitored and printed to the console.\n printTypeErrors?: boolean; // whether print typescript errors to the console.\n aggregateDiagnosticData?: boolean; // whether to aggregate diagnostic data instead of printing them to the console.\n};\n\nexport type DiagnosticData = {\n file: string;\n diagnostic: Diagnostic;\n formatted: string;\n};\n\nexport class TsserverClient {\n private tsServer: ProcessBasedTsServer | null;\n public lastDiagnostics: ts.server.protocol.DiagnosticEventBody[] = [];\n private serverRunning = false;\n public diagnosticData: DiagnosticData[] = [];\n constructor(\n /**\n * absolute root path of the project.\n */\n private projectPath: string,\n private logger: Logger,\n private options: TsserverClientOpts = {},\n /**\n * provide files if you want to check types on init. (options.checkTypes should be enabled).\n * paths should be absolute.\n */\n private files: string[] = []\n ) {}\n\n /**\n * start the ts-server and keep its process alive.\n * this methods returns pretty fast. if checkTypes is enabled, it runs the process in the background and\n * doesn't wait for it.\n */\n async init(): Promise<void> {\n try {\n this.tsServer = new ProcessBasedTsServer({\n logger: this.logger,\n tsserverPath: this.findTsserverPath(),\n logToConsole: this.options.verbose,\n onEvent: this.onTsserverEvent.bind(this),\n });\n\n this.tsServer\n .start()\n .then(() => {\n this.serverRunning = true;\n })\n .catch((err) => {\n this.logger.error('TsserverClient.init failed', err);\n });\n\n if (this.files.length) {\n const openPromises = this.files.map((file) => this.open(file));\n await Promise.all(openPromises.map((promise) => promise.catch((error) => error)));\n const failedFiles = openPromises.filter((promise) => promise instanceof Error);\n if (failedFiles.length > 0) {\n this.logger.error('TsserverClient.init failed to open files:', failedFiles);\n }\n if (failedFiles.length > 0) {\n this.logger.error('TsserverClient.init failed to open files:', failedFiles);\n }\n this.checkTypesIfNeeded();\n }\n this.logger.debug('TsserverClient.init completed');\n } catch (err) {\n this.logger.error('TsserverClient.init failed', err);\n }\n }\n\n private checkTypesIfNeeded(files = this.files) {\n if (!this.shouldCheckTypes()) {\n return;\n }\n const start = Date.now();\n this.getDiagnostic(files)\n .then(() => {\n const end = Date.now() - start;\n const msg = `completed type checking (${end / 1000} sec)`;\n if (this.lastDiagnostics.length) {\n this.logger.consoleFailure(`${msg}. found errors in ${this.lastDiagnostics.length} files.`);\n } else {\n this.logger.consoleSuccess(`${msg}. no errors were found.`);\n }\n })\n .catch((err) => {\n const msg = `failed getting the type errors from ts-server`;\n this.logger.console(msg);\n this.logger.error(msg, err);\n });\n }\n\n private shouldCheckTypes() {\n // this also covers this.options.checkTypes !== CheckTypes.None.\n return Boolean(this.options.checkTypes);\n }\n\n /**\n * if `bit watch` or `bit start` are running in the background, this method is triggered.\n */\n async onFileChange(file: string) {\n await this.changed(file);\n const files = this.options.checkTypes === CheckTypes.ChangedFile ? [file] : undefined;\n this.checkTypesIfNeeded(files);\n }\n\n killTsServer() {\n if (this.tsServer && this.serverRunning) {\n this.tsServer.kill();\n this.tsServer = null;\n this.serverRunning = false;\n }\n }\n\n isServerRunning() {\n return this.serverRunning;\n }\n\n /**\n * get diagnostic of all files opened in the project.\n * there is little to no value of getting diagnostic for a specific file, as\n * changing a type in one file may cause errors in different files.\n *\n * the errors/diagnostic info are sent as events, see this.onTsserverEvent() for more info.\n *\n * the return value here just shows whether the request was succeeded, it doesn't have any info about whether errors\n * were found or not.\n *\n * @param files files to check\n * @param batchSize if provided, files will be processed in batches to avoid overwhelming tsserver\n */\n async getDiagnostic(files = this.files, batchSize?: number): Promise<any> {\n this.lastDiagnostics = [];\n\n if (!batchSize || files.length <= batchSize) {\n return this.tsServer?.request(CommandTypes.Geterr, { delay: 0, files });\n }\n\n // Process files in batches\n for (let i = 0; i < files.length; i += batchSize) {\n const batch = files.slice(i, i + batchSize);\n await this.tsServer?.request(CommandTypes.Geterr, { delay: 0, files: batch });\n }\n }\n\n /**\n * avoid using this method, it takes longer than `getDiagnostic()` and shows errors from paths outside the project\n */\n async getDiagnosticAllProject(requestedByFile: string): Promise<any> {\n return this.tsServer?.request(CommandTypes.GeterrForProject, { file: requestedByFile, delay: 0 });\n }\n\n /**\n * @param file can be absolute or relative to this.projectRoot.\n */\n async getQuickInfo(file: string, position: Position): Promise<ts.server.protocol.QuickInfoResponse | undefined> {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n return this.tsServer?.request(CommandTypes.Quickinfo, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n }\n\n /**\n * @param file can be absolute or relative to this.projectRoot.\n */\n async getTypeDefinition(\n file: string,\n position: Position\n ): Promise<ts.server.protocol.TypeDefinitionResponse | undefined> {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n return this.tsServer?.request(CommandTypes.TypeDefinition, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n }\n\n async getDefinition(file: string, position: Position) {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n const response = await this.tsServer?.request(CommandTypes.Definition, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n\n if (!response?.success) {\n // TODO: we need a function to handle responses properly here for all.\n this.logger.warn(`For file ${absFile} tsserver failed to request definition info`);\n return response;\n }\n\n return response;\n }\n\n /**\n * @param file can be absolute or relative to this.projectRoot.\n */\n async getReferences(file: string, position: Position): Promise<ts.server.protocol.ReferencesResponse | undefined> {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n return this.tsServer?.request(CommandTypes.References, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n }\n\n /**\n * @param file can be absolute or relative to this.projectRoot.\n */\n async getSignatureHelp(\n file: string,\n position: Position\n ): Promise<ts.server.protocol.SignatureHelpResponse | undefined> {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n\n return this.tsServer?.request(CommandTypes.SignatureHelp, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n }\n\n private async configure(\n configureArgs: ts.server.protocol.ConfigureRequestArguments = {}\n ): Promise<ts.server.protocol.ConfigureResponse | undefined> {\n return this.tsServer?.request(CommandTypes.Configure, configureArgs);\n }\n\n /**\n * ask tsserver to open a file if it was not opened before.\n * @param file absolute path of the file\n */\n async openIfNeeded(file: string) {\n if (this.files.includes(file)) {\n return;\n }\n await this.open(file);\n this.files.push(file);\n }\n\n private async open(file: string) {\n return this.tsServer?.notify(CommandTypes.Open, {\n file,\n projectRootPath: this.projectPath,\n });\n }\n\n async close(file: string) {\n await this.tsServer?.notify(CommandTypes.Close, {\n file,\n });\n this.files = this.files.filter((openFile) => openFile !== file);\n }\n\n /**\n * since Bit is not an IDE, it doesn't have the information such as the exact line/offset of the changes.\n * as a workaround, to tell tsserver what was changed, we pretend that the entire file was cleared and new text was\n * added. this is the only way I could find to tell tsserver about the change. otherwise, tsserver keep assuming that\n * the file content remained the same. (closing/re-opening the file doesn't help).\n */\n async changed(file: string) {\n // tell tsserver that all content was removed\n await this.tsServer?.notify(CommandTypes.Change, {\n file,\n line: 1,\n offset: 1,\n endLine: 99999,\n endOffset: 1,\n insertString: '',\n });\n\n const content = await fs.readFile(file, 'utf-8');\n\n // tell tsserver that all file content was added\n await this.tsServer?.notify(CommandTypes.Change, {\n file,\n line: 1,\n offset: 1,\n endLine: 1,\n endOffset: 1,\n insertString: content,\n });\n }\n\n protected onTsserverEvent(event: ts.server.protocol.Event): void {\n switch (event.event) {\n case EventName.semanticDiag:\n case EventName.syntaxDiag:\n this.publishDiagnostic(event as ts.server.protocol.DiagnosticEvent);\n break;\n default:\n this.logger.debug(`ignored TsServer event: ${event.event}`);\n }\n }\n\n private convertFileToAbsoluteIfNeeded(filepath: string): string {\n if (path.isAbsolute(filepath)) {\n return filepath;\n }\n return path.join(this.projectPath, filepath);\n }\n\n private publishDiagnostic(message: ts.server.protocol.DiagnosticEvent) {\n if (!message.body?.diagnostics.length || (!this.options.printTypeErrors && !this.options.aggregateDiagnosticData)) {\n return;\n }\n this.lastDiagnostics.push(message.body);\n const file = path.relative(this.projectPath, message.body.file);\n message.body.diagnostics.forEach((diag) => {\n const formatted = formatDiagnostic(diag, file);\n if (this.options.printTypeErrors) {\n this.logger.console(formatted);\n }\n if (this.options.aggregateDiagnosticData) {\n this.diagnosticData.push({\n file,\n diagnostic: diag,\n formatted,\n });\n }\n });\n }\n\n /**\n * copied over from https://github.com/typescript-language-server/typescript-language-server/blob/master/src/lsp-server.ts\n */\n private findTsserverPath(): string {\n if (this.options.tsServerPath) {\n return this.options.tsServerPath;\n }\n\n const tsServerPath = path.join('typescript', 'lib', 'tsserver.js');\n\n /**\n * (1) find it in the bit directory\n */\n const bundled = findPathToModule(__dirname, tsServerPath);\n\n if (bundled) {\n return bundled;\n }\n\n // (2) use globally installed tsserver\n if (commandExists.sync(getTsserverExecutable())) {\n return getTsserverExecutable();\n }\n\n throw new Error(`Couldn't find '${getTsserverExecutable()}' executable or 'tsserver.js' module`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_fsExtra","data","_interopRequireDefault","require","_path","_watcher","_commandExists","_modulesResolver","_processBasedTsserver","_tspCommandTypes","_utils","_formatDiagnostics","e","__esModule","default","TsserverClient","lastDiagnostics","serverRunning","filesPreOpenedOnInit","diagnosticData","constructor","projectPath","logger","options","files","init","tsServer","ProcessBasedTsServer","tsserverPath","findTsserverPath","logToConsole","verbose","onEvent","onTsserverEvent","bind","start","then","catch","err","error","shouldOpenFiles","openFilesOnInit","length","openResults","Promise","all","map","file","open","failedFiles","filter","result","Error","checkTypesIfNeeded","debug","shouldCheckTypes","Date","now","getDiagnostic","end","msg","consoleFailure","consoleSuccess","console","Boolean","checkTypes","onFileChange","changed","CheckTypes","ChangedFile","undefined","killTsServer","kill","isServerRunning","batchSize","request","CommandTypes","Geterr","delay","filesArePreOpened","every","f","includes","total","i","batch","slice","upTo","Math","min","setStatusLine","openFiles","closeFiles","clearStatusLine","UpdateOpen","projectRootPath","closedFiles","getDiagnosticAllProject","requestedByFile","GeterrForProject","getQuickInfo","position","absFile","convertFileToAbsoluteIfNeeded","openIfNeeded","Quickinfo","line","offset","character","getTypeDefinition","TypeDefinition","getDefinition","response","Definition","success","warn","getReferences","References","getSignatureHelp","SignatureHelp","configure","configureArgs","Configure","push","notify","Open","close","Close","openFile","Change","endLine","endOffset","insertString","content","fs","readFile","event","EventName","semanticDiag","syntaxDiag","publishDiagnostic","filepath","path","isAbsolute","join","message","body","diagnostics","printTypeErrors","aggregateDiagnosticData","relative","forEach","diag","formatted","formatDiagnostic","diagnostic","tsServerPath","bundled","findPathToModule","__dirname","commandExists","sync","getTsserverExecutable","exports"],"sources":["ts-server-client.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport type { Logger } from '@teambit/logger';\nimport path from 'path';\nimport type ts from 'typescript/lib/tsserverlibrary';\nimport { CheckTypes } from '@teambit/watcher';\nimport type { Position } from 'vscode-languageserver-types';\nimport commandExists from 'command-exists';\nimport { findPathToModule } from './modules-resolver';\nimport { ProcessBasedTsServer } from './process-based-tsserver';\nimport { CommandTypes, EventName } from './tsp-command-types';\nimport { getTsserverExecutable } from './utils';\nimport type { Diagnostic } from './format-diagnostics';\nimport { formatDiagnostic } from './format-diagnostics';\n\nexport type TsserverClientOpts = {\n verbose?: boolean; // print tsserver events to the console.\n tsServerPath?: string; // if not provided, it'll use findTsserverPath() strategies.\n checkTypes?: CheckTypes; // whether errors/warnings are monitored and printed to the console.\n printTypeErrors?: boolean; // whether print typescript errors to the console.\n aggregateDiagnosticData?: boolean; // whether to aggregate diagnostic data instead of printing them to the console.\n /**\n * if false, files passed to the constructor are NOT opened during init().\n * useful when the caller wants to control opening (e.g. batched open/close in `getDiagnostic`).\n * default: true (backward compatible).\n */\n openFilesOnInit?: boolean;\n};\n\nexport type DiagnosticData = {\n file: string;\n diagnostic: Diagnostic;\n formatted: string;\n};\n\nexport class TsserverClient {\n private tsServer: ProcessBasedTsServer | null;\n public lastDiagnostics: ts.server.protocol.DiagnosticEventBody[] = [];\n private serverRunning = false;\n private filesPreOpenedOnInit = false;\n public diagnosticData: DiagnosticData[] = [];\n constructor(\n /**\n * absolute root path of the project.\n */\n private projectPath: string,\n private logger: Logger,\n private options: TsserverClientOpts = {},\n /**\n * provide files if you want to check types on init. (options.checkTypes should be enabled).\n * paths should be absolute.\n */\n private files: string[] = []\n ) {}\n\n /**\n * start the ts-server and keep its process alive.\n * this methods returns pretty fast. if checkTypes is enabled, it runs the process in the background and\n * doesn't wait for it.\n */\n async init(): Promise<void> {\n try {\n this.tsServer = new ProcessBasedTsServer({\n logger: this.logger,\n tsserverPath: this.findTsserverPath(),\n logToConsole: this.options.verbose,\n onEvent: this.onTsserverEvent.bind(this),\n });\n\n this.tsServer\n .start()\n .then(() => {\n this.serverRunning = true;\n })\n .catch((err) => {\n this.logger.error('TsserverClient.init failed', err);\n });\n\n const shouldOpenFiles = this.options.openFilesOnInit !== false;\n if (this.files.length && shouldOpenFiles) {\n const openResults = await Promise.all(\n this.files.map((file) => this.open(file).catch((error: unknown) => error))\n );\n const failedFiles = openResults.filter((result) => result instanceof Error);\n if (failedFiles.length > 0) {\n this.logger.error('TsserverClient.init failed to open files:', failedFiles);\n }\n this.filesPreOpenedOnInit = true;\n this.checkTypesIfNeeded();\n }\n this.logger.debug('TsserverClient.init completed');\n } catch (err) {\n this.logger.error('TsserverClient.init failed', err);\n }\n }\n\n private checkTypesIfNeeded(files = this.files) {\n if (!this.shouldCheckTypes()) {\n return;\n }\n const start = Date.now();\n this.getDiagnostic(files)\n .then(() => {\n const end = Date.now() - start;\n const msg = `completed type checking (${end / 1000} sec)`;\n if (this.lastDiagnostics.length) {\n this.logger.consoleFailure(`${msg}. found errors in ${this.lastDiagnostics.length} files.`);\n } else {\n this.logger.consoleSuccess(`${msg}. no errors were found.`);\n }\n })\n .catch((err) => {\n const msg = `failed getting the type errors from ts-server`;\n this.logger.console(msg);\n this.logger.error(msg, err);\n });\n }\n\n private shouldCheckTypes() {\n // this also covers this.options.checkTypes !== CheckTypes.None.\n return Boolean(this.options.checkTypes);\n }\n\n /**\n * if `bit watch` or `bit start` are running in the background, this method is triggered.\n */\n async onFileChange(file: string) {\n await this.changed(file);\n const files = this.options.checkTypes === CheckTypes.ChangedFile ? [file] : undefined;\n this.checkTypesIfNeeded(files);\n }\n\n killTsServer() {\n if (this.tsServer && this.serverRunning) {\n this.tsServer.kill();\n this.tsServer = null;\n this.serverRunning = false;\n }\n }\n\n isServerRunning() {\n return this.serverRunning;\n }\n\n /**\n * get diagnostic of all files opened in the project.\n * there is little to no value of getting diagnostic for a specific file, as\n * changing a type in one file may cause errors in different files.\n *\n * the errors/diagnostic info are sent as events, see this.onTsserverEvent() for more info.\n *\n * the return value here just shows whether the request was succeeded, it doesn't have any info about whether errors\n * were found or not.\n *\n * @param files files to check\n * @param batchSize if provided, files will be processed in batches. when files were not pre-opened\n * via init(), each batch is opened, checked, then closed — keeping tsserver memory\n * bounded by the batch size to avoid OOM in large workspaces.\n */\n async getDiagnostic(files = this.files, batchSize?: number): Promise<any> {\n this.lastDiagnostics = [];\n\n if (!batchSize || files.length <= batchSize) {\n return this.tsServer?.request(CommandTypes.Geterr, { delay: 0, files });\n }\n\n const filesArePreOpened = this.filesPreOpenedOnInit && files.every((f) => this.files.includes(f));\n const total = files.length;\n try {\n for (let i = 0; i < files.length; i += batchSize) {\n const batch = files.slice(i, i + batchSize);\n const upTo = Math.min(i + batchSize, total);\n this.logger.setStatusLine(`type-checking files ${i + 1}-${upTo} of ${total}`);\n if (!filesArePreOpened) {\n await this.openFiles(batch);\n }\n try {\n await this.tsServer?.request(CommandTypes.Geterr, { delay: 0, files: batch });\n } finally {\n if (!filesArePreOpened) {\n await this.closeFiles(batch).catch((err) => this.logger.error('failed to close batch', err));\n }\n }\n }\n } finally {\n this.logger.clearStatusLine();\n }\n }\n\n /**\n * open multiple files in a single round-trip. useful when batching to bound tsserver memory.\n */\n async openFiles(files: string[]): Promise<void> {\n if (!files.length) return;\n await this.tsServer?.request(CommandTypes.UpdateOpen, {\n openFiles: files.map((file) => ({ file, projectRootPath: this.projectPath })),\n });\n }\n\n /**\n * close multiple files in a single round-trip.\n */\n async closeFiles(files: string[]): Promise<void> {\n if (!files.length) return;\n await this.tsServer?.request(CommandTypes.UpdateOpen, {\n closedFiles: files,\n });\n }\n\n /**\n * avoid using this method, it takes longer than `getDiagnostic()` and shows errors from paths outside the project\n */\n async getDiagnosticAllProject(requestedByFile: string): Promise<any> {\n return this.tsServer?.request(CommandTypes.GeterrForProject, { file: requestedByFile, delay: 0 });\n }\n\n /**\n * @param file can be absolute or relative to this.projectRoot.\n */\n async getQuickInfo(file: string, position: Position): Promise<ts.server.protocol.QuickInfoResponse | undefined> {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n return this.tsServer?.request(CommandTypes.Quickinfo, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n }\n\n /**\n * @param file can be absolute or relative to this.projectRoot.\n */\n async getTypeDefinition(\n file: string,\n position: Position\n ): Promise<ts.server.protocol.TypeDefinitionResponse | undefined> {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n return this.tsServer?.request(CommandTypes.TypeDefinition, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n }\n\n async getDefinition(file: string, position: Position) {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n const response = await this.tsServer?.request(CommandTypes.Definition, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n\n if (!response?.success) {\n // TODO: we need a function to handle responses properly here for all.\n this.logger.warn(`For file ${absFile} tsserver failed to request definition info`);\n return response;\n }\n\n return response;\n }\n\n /**\n * @param file can be absolute or relative to this.projectRoot.\n */\n async getReferences(file: string, position: Position): Promise<ts.server.protocol.ReferencesResponse | undefined> {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n return this.tsServer?.request(CommandTypes.References, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n }\n\n /**\n * @param file can be absolute or relative to this.projectRoot.\n */\n async getSignatureHelp(\n file: string,\n position: Position\n ): Promise<ts.server.protocol.SignatureHelpResponse | undefined> {\n const absFile = this.convertFileToAbsoluteIfNeeded(file);\n await this.openIfNeeded(absFile);\n\n return this.tsServer?.request(CommandTypes.SignatureHelp, {\n file: absFile,\n line: position.line,\n offset: position.character,\n });\n }\n\n private async configure(\n configureArgs: ts.server.protocol.ConfigureRequestArguments = {}\n ): Promise<ts.server.protocol.ConfigureResponse | undefined> {\n return this.tsServer?.request(CommandTypes.Configure, configureArgs);\n }\n\n /**\n * ask tsserver to open a file if it was not opened before.\n * @param file absolute path of the file\n */\n async openIfNeeded(file: string) {\n if (this.files.includes(file)) {\n return;\n }\n await this.open(file);\n this.files.push(file);\n }\n\n private async open(file: string) {\n return this.tsServer?.notify(CommandTypes.Open, {\n file,\n projectRootPath: this.projectPath,\n });\n }\n\n async close(file: string) {\n await this.tsServer?.notify(CommandTypes.Close, {\n file,\n });\n this.files = this.files.filter((openFile) => openFile !== file);\n }\n\n /**\n * since Bit is not an IDE, it doesn't have the information such as the exact line/offset of the changes.\n * as a workaround, to tell tsserver what was changed, we pretend that the entire file was cleared and new text was\n * added. this is the only way I could find to tell tsserver about the change. otherwise, tsserver keep assuming that\n * the file content remained the same. (closing/re-opening the file doesn't help).\n */\n async changed(file: string) {\n // tell tsserver that all content was removed\n await this.tsServer?.notify(CommandTypes.Change, {\n file,\n line: 1,\n offset: 1,\n endLine: 99999,\n endOffset: 1,\n insertString: '',\n });\n\n const content = await fs.readFile(file, 'utf-8');\n\n // tell tsserver that all file content was added\n await this.tsServer?.notify(CommandTypes.Change, {\n file,\n line: 1,\n offset: 1,\n endLine: 1,\n endOffset: 1,\n insertString: content,\n });\n }\n\n protected onTsserverEvent(event: ts.server.protocol.Event): void {\n switch (event.event) {\n case EventName.semanticDiag:\n case EventName.syntaxDiag:\n this.publishDiagnostic(event as ts.server.protocol.DiagnosticEvent);\n break;\n default:\n this.logger.debug(`ignored TsServer event: ${event.event}`);\n }\n }\n\n private convertFileToAbsoluteIfNeeded(filepath: string): string {\n if (path.isAbsolute(filepath)) {\n return filepath;\n }\n return path.join(this.projectPath, filepath);\n }\n\n private publishDiagnostic(message: ts.server.protocol.DiagnosticEvent) {\n if (!message.body?.diagnostics.length || (!this.options.printTypeErrors && !this.options.aggregateDiagnosticData)) {\n return;\n }\n this.lastDiagnostics.push(message.body);\n const file = path.relative(this.projectPath, message.body.file);\n message.body.diagnostics.forEach((diag) => {\n const formatted = formatDiagnostic(diag, file);\n if (this.options.printTypeErrors) {\n this.logger.console(formatted);\n }\n if (this.options.aggregateDiagnosticData) {\n this.diagnosticData.push({\n file,\n diagnostic: diag,\n formatted,\n });\n }\n });\n }\n\n /**\n * copied over from https://github.com/typescript-language-server/typescript-language-server/blob/master/src/lsp-server.ts\n */\n private findTsserverPath(): string {\n if (this.options.tsServerPath) {\n return this.options.tsServerPath;\n }\n\n const tsServerPath = path.join('typescript', 'lib', 'tsserver.js');\n\n /**\n * (1) find it in the bit directory\n */\n const bundled = findPathToModule(__dirname, tsServerPath);\n\n if (bundled) {\n return bundled;\n }\n\n // (2) use globally installed tsserver\n if (commandExists.sync(getTsserverExecutable())) {\n return getTsserverExecutable();\n }\n\n throw new Error(`Couldn't find '${getTsserverExecutable()}' executable or 'tsserver.js' module`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/ts-server",
3
- "version": "0.0.77",
3
+ "version": "0.0.79",
4
4
  "homepage": "https://bit.cloud/teambit/typescript/ts-server",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.typescript",
8
8
  "name": "ts-server",
9
- "version": "0.0.77"
9
+ "version": "0.0.79"
10
10
  },
11
11
  "dependencies": {
12
12
  "typescript": "5.9.2",
@@ -155,6 +155,7 @@ export class ProcessBasedTsServer {
155
155
 
156
156
  private logger: Logger;
157
157
  private cancellationPipeName: string | undefined;
158
+ private killedIntentionally = false;
158
159
 
159
160
  constructor(
160
161
  private options: TspClientOptions,
@@ -174,6 +175,7 @@ export class ProcessBasedTsServer {
174
175
  reject(new Error('server already started'));
175
176
  return;
176
177
  }
178
+ this.killedIntentionally = false;
177
179
 
178
180
  const { tsserverPath } = this.options;
179
181
  const { logFile, logVerbosity, maxTsServerMemory, globalPlugins, pluginProbeLocations } = this.tsServerArgs;
@@ -210,6 +212,17 @@ export class ProcessBasedTsServer {
210
212
  reject(new Error('TSServer was killed'));
211
213
  });
212
214
 
215
+ this.tsServerProcess.on('exit', (code, signal) => {
216
+ if (this.killedIntentionally) return;
217
+ const msg = `TSServer process exited unexpectedly (code: ${code}, signal: ${signal})`;
218
+ this.logger.error(msg);
219
+ reject(new Error(msg));
220
+ this.rejectAllPendingRequests(msg);
221
+ this.tsServerProcess = null;
222
+ this.readlineInterface?.close();
223
+ this.readlineInterface = null;
224
+ });
225
+
213
226
  this.readlineInterface.on('line', (line) => {
214
227
  this.processMessage(line, resolve, reject);
215
228
  });
@@ -275,6 +288,7 @@ export class ProcessBasedTsServer {
275
288
  }
276
289
 
277
290
  kill() {
291
+ this.killedIntentionally = true;
278
292
  this.tsServerProcess?.kill();
279
293
  this.tsServerProcess?.stdin?.destroy();
280
294
  this.readlineInterface?.close();
@@ -282,6 +296,16 @@ export class ProcessBasedTsServer {
282
296
  this.readlineInterface = null;
283
297
  }
284
298
 
299
+ private rejectAllPendingRequests(reason: string) {
300
+ const error = new Error(reason);
301
+ for (const deferred of Object.values(this.deferreds)) {
302
+ deferred.reject(error);
303
+ }
304
+ for (const seq of Object.keys(this.deferreds)) {
305
+ delete this.deferreds[seq];
306
+ }
307
+ }
308
+
285
309
  private log(msg: string, obj: Record<string, any> = {}) {
286
310
  msg = `[tsserver] ${msg}`;
287
311
  if (this.options.logToConsole) {
@@ -18,6 +18,12 @@ export type TsserverClientOpts = {
18
18
  checkTypes?: CheckTypes; // whether errors/warnings are monitored and printed to the console.
19
19
  printTypeErrors?: boolean; // whether print typescript errors to the console.
20
20
  aggregateDiagnosticData?: boolean; // whether to aggregate diagnostic data instead of printing them to the console.
21
+ /**
22
+ * if false, files passed to the constructor are NOT opened during init().
23
+ * useful when the caller wants to control opening (e.g. batched open/close in `getDiagnostic`).
24
+ * default: true (backward compatible).
25
+ */
26
+ openFilesOnInit?: boolean;
21
27
  };
22
28
 
23
29
  export type DiagnosticData = {
@@ -30,6 +36,7 @@ export class TsserverClient {
30
36
  private tsServer: ProcessBasedTsServer | null;
31
37
  public lastDiagnostics: ts.server.protocol.DiagnosticEventBody[] = [];
32
38
  private serverRunning = false;
39
+ private filesPreOpenedOnInit = false;
33
40
  public diagnosticData: DiagnosticData[] = [];
34
41
  constructor(
35
42
  /**
@@ -68,16 +75,16 @@ export class TsserverClient {
68
75
  this.logger.error('TsserverClient.init failed', err);
69
76
  });
70
77
 
71
- if (this.files.length) {
72
- const openPromises = this.files.map((file) => this.open(file));
73
- await Promise.all(openPromises.map((promise) => promise.catch((error) => error)));
74
- const failedFiles = openPromises.filter((promise) => promise instanceof Error);
75
- if (failedFiles.length > 0) {
76
- this.logger.error('TsserverClient.init failed to open files:', failedFiles);
77
- }
78
+ const shouldOpenFiles = this.options.openFilesOnInit !== false;
79
+ if (this.files.length && shouldOpenFiles) {
80
+ const openResults = await Promise.all(
81
+ this.files.map((file) => this.open(file).catch((error: unknown) => error))
82
+ );
83
+ const failedFiles = openResults.filter((result) => result instanceof Error);
78
84
  if (failedFiles.length > 0) {
79
85
  this.logger.error('TsserverClient.init failed to open files:', failedFiles);
80
86
  }
87
+ this.filesPreOpenedOnInit = true;
81
88
  this.checkTypesIfNeeded();
82
89
  }
83
90
  this.logger.debug('TsserverClient.init completed');
@@ -145,7 +152,9 @@ export class TsserverClient {
145
152
  * were found or not.
146
153
  *
147
154
  * @param files files to check
148
- * @param batchSize if provided, files will be processed in batches to avoid overwhelming tsserver
155
+ * @param batchSize if provided, files will be processed in batches. when files were not pre-opened
156
+ * via init(), each batch is opened, checked, then closed — keeping tsserver memory
157
+ * bounded by the batch size to avoid OOM in large workspaces.
149
158
  */
150
159
  async getDiagnostic(files = this.files, batchSize?: number): Promise<any> {
151
160
  this.lastDiagnostics = [];
@@ -154,13 +163,49 @@ export class TsserverClient {
154
163
  return this.tsServer?.request(CommandTypes.Geterr, { delay: 0, files });
155
164
  }
156
165
 
157
- // Process files in batches
158
- for (let i = 0; i < files.length; i += batchSize) {
159
- const batch = files.slice(i, i + batchSize);
160
- await this.tsServer?.request(CommandTypes.Geterr, { delay: 0, files: batch });
166
+ const filesArePreOpened = this.filesPreOpenedOnInit && files.every((f) => this.files.includes(f));
167
+ const total = files.length;
168
+ try {
169
+ for (let i = 0; i < files.length; i += batchSize) {
170
+ const batch = files.slice(i, i + batchSize);
171
+ const upTo = Math.min(i + batchSize, total);
172
+ this.logger.setStatusLine(`type-checking files ${i + 1}-${upTo} of ${total}`);
173
+ if (!filesArePreOpened) {
174
+ await this.openFiles(batch);
175
+ }
176
+ try {
177
+ await this.tsServer?.request(CommandTypes.Geterr, { delay: 0, files: batch });
178
+ } finally {
179
+ if (!filesArePreOpened) {
180
+ await this.closeFiles(batch).catch((err) => this.logger.error('failed to close batch', err));
181
+ }
182
+ }
183
+ }
184
+ } finally {
185
+ this.logger.clearStatusLine();
161
186
  }
162
187
  }
163
188
 
189
+ /**
190
+ * open multiple files in a single round-trip. useful when batching to bound tsserver memory.
191
+ */
192
+ async openFiles(files: string[]): Promise<void> {
193
+ if (!files.length) return;
194
+ await this.tsServer?.request(CommandTypes.UpdateOpen, {
195
+ openFiles: files.map((file) => ({ file, projectRootPath: this.projectPath })),
196
+ });
197
+ }
198
+
199
+ /**
200
+ * close multiple files in a single round-trip.
201
+ */
202
+ async closeFiles(files: string[]): Promise<void> {
203
+ if (!files.length) return;
204
+ await this.tsServer?.request(CommandTypes.UpdateOpen, {
205
+ closedFiles: files,
206
+ });
207
+ }
208
+
164
209
  /**
165
210
  * avoid using this method, it takes longer than `getDiagnostic()` and shows errors from paths outside the project
166
211
  */