1import { 2 emptyArray, findArgument, hasArgument, initializeNodeSystem, initializeWebSystem, Msg, 3 StartInput, 4} from "./_namespaces/ts.server"; 5import { Debug, getNodeMajorVersion, setStackTraceLimit, sys, version } from "./_namespaces/ts"; 6export * from "./_namespaces/ts"; 7 8declare const addEventListener: any; 9declare const removeEventListener: any; 10function findArgumentStringArray(argName: string): readonly string[] { 11 const arg = findArgument(argName); 12 if (arg === undefined) { 13 return emptyArray; 14 } 15 return arg.split(",").filter(name => name !== ""); 16} 17 18 19function start({ args, logger, cancellationToken, serverMode, unknownServerMode, startSession: startServer }: StartInput, platform: string) { 20 const syntaxOnly = hasArgument("--syntaxOnly"); 21 22 logger.info(`Starting TS Server`); 23 logger.info(`Version: ${version}`); 24 logger.info(`Arguments: ${args.join(" ")}`); 25 logger.info(`Platform: ${platform} NodeVersion: ${getNodeMajorVersion()} CaseSensitive: ${sys.useCaseSensitiveFileNames}`); 26 logger.info(`ServerMode: ${serverMode} syntaxOnly: ${syntaxOnly} hasUnknownServerMode: ${unknownServerMode}`); 27 28 setStackTraceLimit(); 29 30 if (Debug.isDebugging) { 31 Debug.enableDebugInfo(); 32 } 33 34 if (sys.tryEnableSourceMapsForHost && /^development$/i.test(sys.getEnvironmentVariable("NODE_ENV"))) { 35 sys.tryEnableSourceMapsForHost(); 36 } 37 38 // Overwrites the current console messages to instead write to 39 // the log. This is so that language service plugins which use 40 // console.log don't break the message passing between tsserver 41 // and the client 42 console.log = (...args) => logger.msg(args.length === 1 ? args[0] : args.join(", "), Msg.Info); 43 console.warn = (...args) => logger.msg(args.length === 1 ? args[0] : args.join(", "), Msg.Err); 44 console.error = (...args) => logger.msg(args.length === 1 ? args[0] : args.join(", "), Msg.Err); 45 46 startServer( 47 { 48 globalPlugins: findArgumentStringArray("--globalPlugins"), 49 pluginProbeLocations: findArgumentStringArray("--pluginProbeLocations"), 50 allowLocalPluginLoads: hasArgument("--allowLocalPluginLoads"), 51 useSingleInferredProject: hasArgument("--useSingleInferredProject"), 52 useInferredProjectPerProjectRoot: hasArgument("--useInferredProjectPerProjectRoot"), 53 suppressDiagnosticEvents: hasArgument("--suppressDiagnosticEvents"), 54 noGetErrOnBackgroundUpdate: hasArgument("--noGetErrOnBackgroundUpdate"), 55 syntaxOnly, 56 serverMode 57 }, 58 logger, 59 cancellationToken 60 ); 61} 62 63setStackTraceLimit(); 64// Cannot check process var directory in webworker so has to be typeof check here 65if (typeof process !== "undefined") { 66 start(initializeNodeSystem(), require("os").platform()); 67} 68else { 69 // Get args from first message 70 const listener = (e: any) => { 71 removeEventListener("message", listener); 72 const args = e.data; 73 start(initializeWebSystem(args), "web"); 74 }; 75 addEventListener("message", listener); 76} 77