diff --git a/extensions/typescript/npm-shrinkwrap.json b/extensions/typescript/npm-shrinkwrap.json index eba096f1b8c..fb10619a142 100644 --- a/extensions/typescript/npm-shrinkwrap.json +++ b/extensions/typescript/npm-shrinkwrap.json @@ -13,9 +13,9 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" }, "typescript": { - "version": "2.0.7", - "from": "typescript@2.0.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.0.7.tgz" + "version": "2.0.8", + "from": "typescript@2.0.8", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.0.8.tgz" }, "vscode-extension-telemetry": { "version": "0.0.5", diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index 7e1e50e9129..d0fe2abdb8f 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -14,7 +14,7 @@ "semver": "4.3.6", "vscode-extension-telemetry": "^0.0.5", "vscode-nls": "^2.0.1", - "typescript": "2.0.7" + "typescript": "2.0.8" }, "scripts": { "postinstall": "node ./bin/postinstall", diff --git a/extensions/typescript/src/protocol.d.ts b/extensions/typescript/src/protocol.d.ts index f6cf09b5c9b..c950c75950b 100644 --- a/extensions/typescript/src/protocol.d.ts +++ b/extensions/typescript/src/protocol.d.ts @@ -1524,6 +1524,26 @@ declare namespace ts.server.protocol { spans: TextSpan[]; childItems?: NavigationTree[]; } + type TelemetryEventName = "telemetry"; + interface TelemetryEvent extends Event { + event: TelemetryEventName; + body: TelemetryEventBody; + } + interface TelemetryEventBody { + telemetryEventName: string; + payload: any; + } + type TypingsInstalledTelemetryEventName = "typingsInstalled"; + interface TypingsInstalledTelemetryEventBody extends TelemetryEventBody { + telemetryEventName: TypingsInstalledTelemetryEventName; + payload: TypingsInstalledTelemetryEventPayload; + } + interface TypingsInstalledTelemetryEventPayload { + /** + * Comma separated list of installed typing packages + */ + installedPackages: string; + } interface NavBarResponse extends Response { body?: NavigationBarItem[]; } diff --git a/extensions/typescript/src/typescriptService.ts b/extensions/typescript/src/typescriptService.ts index 4a5442e957f..da4e09ae680 100644 --- a/extensions/typescript/src/typescriptService.ts +++ b/extensions/typescript/src/typescriptService.ts @@ -49,6 +49,10 @@ export class API { public has206Features(): boolean { return semver.gte(this._version, '2.0.6'); } + + public has208Features(): boolean { + return semver.gte(this._version, '2.0.8'); + } } export interface ITypescriptServiceClient { diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 20f07aee919..aa828d0c3d5 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -405,6 +405,9 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient args.push('--disableAutomaticTypingAcquisition'); } } + if (this.apiVersion.has208Features()) { + args.push('--enableTelemetry'); + } electron.fork(modulePath, args, options, (err: any, childProcess: cp.ChildProcess) => { if (err) { this.lastError = err; @@ -648,6 +651,25 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.host.semanticDiagnosticsReceived(event as Proto.DiagnosticEvent); } else if (event.event === 'configFileDiag') { this.host.configFileDiagnosticsReceived(event as Proto.ConfigFileDiagnosticEvent); + } else if (event.event === 'telemetry') { + let telemetryData = (event as Proto.TelemetryEvent).body; + let properties: Map = Object.create(null); + switch (telemetryData.telemetryEventName) { + case 'typingsInstalled': + properties['installedPackages'] = (telemetryData.payload as Proto.TypingsInstalledTelemetryEventPayload).installedPackages; + break; + default: + let payload = telemetryData.payload; + if (payload) { + Object.keys(payload).forEach((key) => { + if (payload.hasOwnProperty(key) && is.string(payload[key])) { + properties[key] = payload[key]; + } + }); + } + break; + } + this.logTelemetry(telemetryData.telemetryEventName, properties); } } else { throw new Error('Unknown message type ' + message.type + ' recevied');