From 9bf0d08011d916b3a37de02e414038be6008f63c Mon Sep 17 00:00:00 2001 From: Ventsislav Georgiev Date: Fri, 20 Oct 2017 14:02:30 +0300 Subject: [PATCH 1/7] Make analytics-settings-service getClientId public --- lib/bootstrap.ts | 2 +- lib/services/analytics-settings-service.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/bootstrap.ts b/lib/bootstrap.ts index 643a0ea7d2..aa52fd1939 100644 --- a/lib/bootstrap.ts +++ b/lib/bootstrap.ts @@ -29,7 +29,7 @@ $injector.require("iOSDebugService", "./services/ios-debug-service"); $injector.require("androidDebugService", "./services/android-debug-service"); $injector.require("userSettingsService", "./services/user-settings-service"); -$injector.require("analyticsSettingsService", "./services/analytics-settings-service"); +$injector.requirePublic("analyticsSettingsService", "./services/analytics-settings-service"); $injector.require("analyticsService", "./services/analytics/analytics-service"); $injector.require("eqatecAnalyticsProvider", "./services/analytics/eqatec-analytics-provider"); $injector.require("googleAnalyticsProvider", "./services/analytics/google-analytics-provider"); diff --git a/lib/services/analytics-settings-service.ts b/lib/services/analytics-settings-service.ts index 6ca50db27e..250e4b0db0 100644 --- a/lib/services/analytics-settings-service.ts +++ b/lib/services/analytics-settings-service.ts @@ -1,4 +1,5 @@ import { createGUID } from "../common/helpers"; +import { exported } from "../common/decorators"; class AnalyticsSettingsService implements IAnalyticsSettingsService { private static SESSIONS_STARTED_KEY_PREFIX = "SESSIONS_STARTED_"; @@ -15,6 +16,7 @@ class AnalyticsSettingsService implements IAnalyticsSettingsService { return this.getSettingValueOrDefault("USER_ID"); } + @exported("analyticsSettingsService") public getClientId(): Promise { return this.getSettingValueOrDefault(this.$staticConfig.ANALYTICS_INSTALLATION_ID_SETTING_NAME); } From b016fc4377f6a486ca2fbdb96d8a785832f8a115 Mon Sep 17 00:00:00 2001 From: Ventsislav Georgiev Date: Fri, 20 Oct 2017 14:03:56 +0300 Subject: [PATCH 2/7] Allow tracking for multiple Google Analytic Projects --- lib/services/analytics/google-analytics-provider.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/services/analytics/google-analytics-provider.ts b/lib/services/analytics/google-analytics-provider.ts index 1bb8d9fe13..04122e7e95 100644 --- a/lib/services/analytics/google-analytics-provider.ts +++ b/lib/services/analytics/google-analytics-provider.ts @@ -3,7 +3,7 @@ import * as ua from "universal-analytics"; import { AnalyticsClients } from "../../common/constants"; export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { - private static GA_TRACKING_ID = "UA-111455-44"; + private static GA_TRACKING_IDs = ["UA-111455-44"]; private currentPage: string; constructor(private clientId: string, @@ -13,8 +13,14 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { } public async trackHit(trackInfo: IGoogleAnalyticsData): Promise { + _.each(GoogleAnalyticsProvider.GA_TRACKING_IDs, (gaTrackingId) => { + this.track(gaTrackingId, trackInfo); + }); + } + + private async track(gaTrackingId: string, trackInfo: IGoogleAnalyticsData): Promise { const visitor = ua({ - tid: GoogleAnalyticsProvider.GA_TRACKING_ID, + tid: gaTrackingId, cid: this.clientId, headers: { ["User-Agent"]: this.getUserAgentString() From aab6b29205ba6d6856896e7d3ca39987c686e48d Mon Sep 17 00:00:00 2001 From: Ventsislav Georgiev Date: Fri, 20 Oct 2017 14:58:19 +0300 Subject: [PATCH 3/7] Add cross client custom dimensions --- ...nalytics-cross-client-custom-dimensions.ts | 15 ++++++++ .../analytics/google-analytics-provider.ts | 38 +++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 lib/services/analytics/google-analytics-cross-client-custom-dimensions.ts diff --git a/lib/services/analytics/google-analytics-cross-client-custom-dimensions.ts b/lib/services/analytics/google-analytics-cross-client-custom-dimensions.ts new file mode 100644 index 0000000000..e2a4a2bf8e --- /dev/null +++ b/lib/services/analytics/google-analytics-cross-client-custom-dimensions.ts @@ -0,0 +1,15 @@ +const enum GoogleAnalyticsCrossClientCustomDimensions { + shellVersion = "cd1", + nodeVersion = "cd2", + npmVersion = "cd3", + tnsVersion = "cd4", + accountType = "cd5", + localBuildEnv = "cd6", + dayFromFirstRun = "cd7", + dayFromFirstLogin = "cd8", + sessionId = "cd9", + clientId = "cd10", + timestampPerHit = "cd11", + crossClientId = "cd12", + uiVersion = "cd13" +} diff --git a/lib/services/analytics/google-analytics-provider.ts b/lib/services/analytics/google-analytics-provider.ts index 04122e7e95..6f3466fe8d 100644 --- a/lib/services/analytics/google-analytics-provider.ts +++ b/lib/services/analytics/google-analytics-provider.ts @@ -3,7 +3,8 @@ import * as ua from "universal-analytics"; import { AnalyticsClients } from "../../common/constants"; export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { - private static GA_TRACKING_IDs = ["UA-111455-44"]; + private static GA_TRACKING_ID = "UA-111455-44"; + private static GA_CROSS_CLIENT_TRACKING_ID = "UA-90319637-1"; private currentPage: string; constructor(private clientId: string, @@ -13,7 +14,9 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { } public async trackHit(trackInfo: IGoogleAnalyticsData): Promise { - _.each(GoogleAnalyticsProvider.GA_TRACKING_IDs, (gaTrackingId) => { + const trackingIds = [GoogleAnalyticsProvider.GA_TRACKING_ID, GoogleAnalyticsProvider.GA_CROSS_CLIENT_TRACKING_ID]; + + _.each(trackingIds, (gaTrackingId) => { this.track(gaTrackingId, trackInfo); }); } @@ -27,7 +30,14 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { } }); - this.setCustomDimensions(visitor, trackInfo.customDimensions); + switch (gaTrackingId) { + case GoogleAnalyticsProvider.GA_CROSS_CLIENT_TRACKING_ID: + this.setCrossClientCustomDimensions(visitor); + break; + default: + this.setCustomDimensions(visitor, trackInfo.customDimensions); + break; + } switch (trackInfo.googleAnalyticsDataType) { case GoogleAnalyticsDataType.Page: @@ -56,6 +66,28 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { }); } + private setCrossClientCustomDimensions(visitor: ua.Visitor): void { + const customDimensions: IStringDictionary = { + [GoogleAnalyticsCrossClientCustomDimensions.shellVersion]: null, + [GoogleAnalyticsCrossClientCustomDimensions.nodeVersion]: process.version, + [GoogleAnalyticsCrossClientCustomDimensions.npmVersion]: null, + [GoogleAnalyticsCrossClientCustomDimensions.tnsVersion]: this.$staticConfig.version, + [GoogleAnalyticsCrossClientCustomDimensions.accountType]: null, + [GoogleAnalyticsCrossClientCustomDimensions.localBuildEnv]: null, + [GoogleAnalyticsCrossClientCustomDimensions.dayFromFirstRun]: null, + [GoogleAnalyticsCrossClientCustomDimensions.dayFromFirstLogin]: null, + [GoogleAnalyticsCrossClientCustomDimensions.sessionId]: null, + [GoogleAnalyticsCrossClientCustomDimensions.clientId]: this.clientId, + [GoogleAnalyticsCrossClientCustomDimensions.timestampPerHit]: new Date().toJSON(), + [GoogleAnalyticsCrossClientCustomDimensions.crossClientId]: this.clientId, + [GoogleAnalyticsCrossClientCustomDimensions.uiVersion]: null + }; + + _.each(customDimensions, (value, key) => { + visitor.set(key, value); + }); + } + private trackEvent(visitor: ua.Visitor, trackInfo: IGoogleAnalyticsEventData): Promise { return new Promise((resolve, reject) => { visitor.event(trackInfo.category, trackInfo.action, trackInfo.label, trackInfo.value, { p: this.currentPage }, (err: Error) => { From ba2a32e3b7027a5db7f3cec8fd854399f04dc0aa Mon Sep 17 00:00:00 2001 From: Ventsislav Georgiev Date: Fri, 20 Oct 2017 16:19:14 +0300 Subject: [PATCH 4/7] Add npmVersion and dayFromFirstRun custom dimension values --- .../analytics/google-analytics-provider.ts | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/lib/services/analytics/google-analytics-provider.ts b/lib/services/analytics/google-analytics-provider.ts index 6f3466fe8d..a85ea7a3c3 100644 --- a/lib/services/analytics/google-analytics-provider.ts +++ b/lib/services/analytics/google-analytics-provider.ts @@ -5,12 +5,15 @@ import { AnalyticsClients } from "../../common/constants"; export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { private static GA_TRACKING_ID = "UA-111455-44"; private static GA_CROSS_CLIENT_TRACKING_ID = "UA-90319637-1"; + private static FIRST_RUN_DATE = "FirstRunDate"; private currentPage: string; constructor(private clientId: string, private $staticConfig: IStaticConfig, private $hostInfo: IHostInfo, - private $osInfo: IOsInfo) { + private $osInfo: IOsInfo, + private $sysInfo: ISysInfo, + private $userSettingsService: IUserSettingsService) { } public async trackHit(trackInfo: IGoogleAnalyticsData): Promise { @@ -32,7 +35,7 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { switch (gaTrackingId) { case GoogleAnalyticsProvider.GA_CROSS_CLIENT_TRACKING_ID: - this.setCrossClientCustomDimensions(visitor); + await this.setCrossClientCustomDimensions(visitor); break; default: this.setCustomDimensions(visitor, trackInfo.customDimensions); @@ -66,15 +69,23 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { }); } - private setCrossClientCustomDimensions(visitor: ua.Visitor): void { + private async setCrossClientCustomDimensions(visitor: ua.Visitor): Promise { + let firstRunDate = (await this.$userSettingsService.getSettingValue(GoogleAnalyticsProvider.FIRST_RUN_DATE)); + + if (!firstRunDate || !_.isString(firstRunDate)) { + firstRunDate = new Date().toJSON(); + + await this.$userSettingsService.saveSetting(GoogleAnalyticsProvider.FIRST_RUN_DATE, firstRunDate); + } + const customDimensions: IStringDictionary = { [GoogleAnalyticsCrossClientCustomDimensions.shellVersion]: null, [GoogleAnalyticsCrossClientCustomDimensions.nodeVersion]: process.version, - [GoogleAnalyticsCrossClientCustomDimensions.npmVersion]: null, + [GoogleAnalyticsCrossClientCustomDimensions.npmVersion]: await this.$sysInfo.getNpmVersion(), [GoogleAnalyticsCrossClientCustomDimensions.tnsVersion]: this.$staticConfig.version, [GoogleAnalyticsCrossClientCustomDimensions.accountType]: null, [GoogleAnalyticsCrossClientCustomDimensions.localBuildEnv]: null, - [GoogleAnalyticsCrossClientCustomDimensions.dayFromFirstRun]: null, + [GoogleAnalyticsCrossClientCustomDimensions.dayFromFirstRun]: this.getDaysDiffFromToday(firstRunDate), [GoogleAnalyticsCrossClientCustomDimensions.dayFromFirstLogin]: null, [GoogleAnalyticsCrossClientCustomDimensions.sessionId]: null, [GoogleAnalyticsCrossClientCustomDimensions.clientId]: this.clientId, @@ -153,6 +164,17 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { const majorVersion = osRelease && _.first(osRelease.split(".")); return majorVersion && `10.${+majorVersion - 4}`; } + + private getDaysDiffFromToday(dateJson: string): string { + const millisecondsPerDay = 1000 * 60 * 60 * 24; + + const date1 = new Date(dateJson); + const date2 = new Date(); + const utc1 = Date.UTC(date1.getFullYear(), date1.getMonth(), date1.getDate()); + const utc2 = Date.UTC(date2.getFullYear(), date2.getMonth(), date2.getDate()); + + return Math.floor((utc2 - utc1) / millisecondsPerDay).toString(); + } } $injector.register("googleAnalyticsProvider", GoogleAnalyticsProvider); From 3a50c5278de8b07f45d24373d66358a8434728d9 Mon Sep 17 00:00:00 2001 From: Ventsislav Georgiev Date: Mon, 23 Oct 2017 10:24:49 +0300 Subject: [PATCH 5/7] Update cross client analytics google tracking id --- lib/services/analytics/google-analytics-provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/analytics/google-analytics-provider.ts b/lib/services/analytics/google-analytics-provider.ts index a85ea7a3c3..ca30bf87ed 100644 --- a/lib/services/analytics/google-analytics-provider.ts +++ b/lib/services/analytics/google-analytics-provider.ts @@ -4,7 +4,7 @@ import { AnalyticsClients } from "../../common/constants"; export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { private static GA_TRACKING_ID = "UA-111455-44"; - private static GA_CROSS_CLIENT_TRACKING_ID = "UA-90319637-1"; + private static GA_CROSS_CLIENT_TRACKING_ID = "UA-111455-51"; private static FIRST_RUN_DATE = "FirstRunDate"; private currentPage: string; From 8e3b85855f8105b3289faf5831796ff0dd52cf7a Mon Sep 17 00:00:00 2001 From: Ventsislav Georgiev Date: Tue, 24 Oct 2017 11:17:36 +0300 Subject: [PATCH 6/7] Remove unnecessary custom dimensions from the cross client project --- ...lytics-cross-client-custom-dimensions.d.ts | 6 ++ ...nalytics-cross-client-custom-dimensions.ts | 15 ----- ...> google-analytics-custom-dimensions.d.ts} | 2 +- .../analytics/google-analytics-provider.ts | 58 +++++-------------- 4 files changed, 23 insertions(+), 58 deletions(-) create mode 100644 lib/services/analytics/google-analytics-cross-client-custom-dimensions.d.ts delete mode 100644 lib/services/analytics/google-analytics-cross-client-custom-dimensions.ts rename lib/services/analytics/{google-analytics-custom-dimensions.ts => google-analytics-custom-dimensions.d.ts} (69%) diff --git a/lib/services/analytics/google-analytics-cross-client-custom-dimensions.d.ts b/lib/services/analytics/google-analytics-cross-client-custom-dimensions.d.ts new file mode 100644 index 0000000000..c58e2b54c0 --- /dev/null +++ b/lib/services/analytics/google-analytics-cross-client-custom-dimensions.d.ts @@ -0,0 +1,6 @@ +// Sync indexes with the custom dimensions of the cross client analytics project +declare const enum GoogleAnalyticsCrossClientCustomDimensions { + sessionId = "cd9", + clientId = "cd10", + crossClientId = "cd12", +} diff --git a/lib/services/analytics/google-analytics-cross-client-custom-dimensions.ts b/lib/services/analytics/google-analytics-cross-client-custom-dimensions.ts deleted file mode 100644 index e2a4a2bf8e..0000000000 --- a/lib/services/analytics/google-analytics-cross-client-custom-dimensions.ts +++ /dev/null @@ -1,15 +0,0 @@ -const enum GoogleAnalyticsCrossClientCustomDimensions { - shellVersion = "cd1", - nodeVersion = "cd2", - npmVersion = "cd3", - tnsVersion = "cd4", - accountType = "cd5", - localBuildEnv = "cd6", - dayFromFirstRun = "cd7", - dayFromFirstLogin = "cd8", - sessionId = "cd9", - clientId = "cd10", - timestampPerHit = "cd11", - crossClientId = "cd12", - uiVersion = "cd13" -} diff --git a/lib/services/analytics/google-analytics-custom-dimensions.ts b/lib/services/analytics/google-analytics-custom-dimensions.d.ts similarity index 69% rename from lib/services/analytics/google-analytics-custom-dimensions.ts rename to lib/services/analytics/google-analytics-custom-dimensions.d.ts index 9e7c1d7007..488439b814 100644 --- a/lib/services/analytics/google-analytics-custom-dimensions.ts +++ b/lib/services/analytics/google-analytics-custom-dimensions.d.ts @@ -1,4 +1,4 @@ -const enum GoogleAnalyticsCustomDimensions { +declare const enum GoogleAnalyticsCustomDimensions { cliVersion = "cd1", projectType = "cd2", clientID = "cd3", diff --git a/lib/services/analytics/google-analytics-provider.ts b/lib/services/analytics/google-analytics-provider.ts index ca30bf87ed..8f93ab4388 100644 --- a/lib/services/analytics/google-analytics-provider.ts +++ b/lib/services/analytics/google-analytics-provider.ts @@ -5,26 +5,29 @@ import { AnalyticsClients } from "../../common/constants"; export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { private static GA_TRACKING_ID = "UA-111455-44"; private static GA_CROSS_CLIENT_TRACKING_ID = "UA-111455-51"; - private static FIRST_RUN_DATE = "FirstRunDate"; private currentPage: string; constructor(private clientId: string, private $staticConfig: IStaticConfig, private $hostInfo: IHostInfo, private $osInfo: IOsInfo, - private $sysInfo: ISysInfo, - private $userSettingsService: IUserSettingsService) { + private $logger: ILogger) { } public async trackHit(trackInfo: IGoogleAnalyticsData): Promise { const trackingIds = [GoogleAnalyticsProvider.GA_TRACKING_ID, GoogleAnalyticsProvider.GA_CROSS_CLIENT_TRACKING_ID]; + const sessionId = uuid.v4(); - _.each(trackingIds, (gaTrackingId) => { - this.track(gaTrackingId, trackInfo); - }); + for (const gaTrackingId of trackingIds) { + try { + await this.track(gaTrackingId, trackInfo, sessionId); + } catch (e) { + this.$logger.trace("Analytics exception: ", e); + } + } } - private async track(gaTrackingId: string, trackInfo: IGoogleAnalyticsData): Promise { + private async track(gaTrackingId: string, trackInfo: IGoogleAnalyticsData, sessionId: string): Promise { const visitor = ua({ tid: gaTrackingId, cid: this.clientId, @@ -35,10 +38,10 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { switch (gaTrackingId) { case GoogleAnalyticsProvider.GA_CROSS_CLIENT_TRACKING_ID: - await this.setCrossClientCustomDimensions(visitor); + this.setCrossClientCustomDimensions(visitor, sessionId); break; default: - this.setCustomDimensions(visitor, trackInfo.customDimensions); + this.setCustomDimensions(visitor, trackInfo.customDimensions, sessionId); break; } @@ -52,13 +55,13 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { } } - private setCustomDimensions(visitor: ua.Visitor, customDimensions: IStringDictionary): void { + private setCustomDimensions(visitor: ua.Visitor, customDimensions: IStringDictionary, sessionId: string): void { const defaultValues: IStringDictionary = { [GoogleAnalyticsCustomDimensions.cliVersion]: this.$staticConfig.version, [GoogleAnalyticsCustomDimensions.nodeVersion]: process.version, [GoogleAnalyticsCustomDimensions.clientID]: this.clientId, [GoogleAnalyticsCustomDimensions.projectType]: null, - [GoogleAnalyticsCustomDimensions.sessionID]: uuid.v4(), + [GoogleAnalyticsCustomDimensions.sessionID]: sessionId, [GoogleAnalyticsCustomDimensions.client]: AnalyticsClients.Unknown }; @@ -69,29 +72,11 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { }); } - private async setCrossClientCustomDimensions(visitor: ua.Visitor): Promise { - let firstRunDate = (await this.$userSettingsService.getSettingValue(GoogleAnalyticsProvider.FIRST_RUN_DATE)); - - if (!firstRunDate || !_.isString(firstRunDate)) { - firstRunDate = new Date().toJSON(); - - await this.$userSettingsService.saveSetting(GoogleAnalyticsProvider.FIRST_RUN_DATE, firstRunDate); - } - + private async setCrossClientCustomDimensions(visitor: ua.Visitor, sessionId: string): Promise { const customDimensions: IStringDictionary = { - [GoogleAnalyticsCrossClientCustomDimensions.shellVersion]: null, - [GoogleAnalyticsCrossClientCustomDimensions.nodeVersion]: process.version, - [GoogleAnalyticsCrossClientCustomDimensions.npmVersion]: await this.$sysInfo.getNpmVersion(), - [GoogleAnalyticsCrossClientCustomDimensions.tnsVersion]: this.$staticConfig.version, - [GoogleAnalyticsCrossClientCustomDimensions.accountType]: null, - [GoogleAnalyticsCrossClientCustomDimensions.localBuildEnv]: null, - [GoogleAnalyticsCrossClientCustomDimensions.dayFromFirstRun]: this.getDaysDiffFromToday(firstRunDate), - [GoogleAnalyticsCrossClientCustomDimensions.dayFromFirstLogin]: null, - [GoogleAnalyticsCrossClientCustomDimensions.sessionId]: null, + [GoogleAnalyticsCrossClientCustomDimensions.sessionId]: sessionId, [GoogleAnalyticsCrossClientCustomDimensions.clientId]: this.clientId, - [GoogleAnalyticsCrossClientCustomDimensions.timestampPerHit]: new Date().toJSON(), [GoogleAnalyticsCrossClientCustomDimensions.crossClientId]: this.clientId, - [GoogleAnalyticsCrossClientCustomDimensions.uiVersion]: null }; _.each(customDimensions, (value, key) => { @@ -164,17 +149,6 @@ export class GoogleAnalyticsProvider implements IGoogleAnalyticsProvider { const majorVersion = osRelease && _.first(osRelease.split(".")); return majorVersion && `10.${+majorVersion - 4}`; } - - private getDaysDiffFromToday(dateJson: string): string { - const millisecondsPerDay = 1000 * 60 * 60 * 24; - - const date1 = new Date(dateJson); - const date2 = new Date(); - const utc1 = Date.UTC(date1.getFullYear(), date1.getMonth(), date1.getDate()); - const utc2 = Date.UTC(date2.getFullYear(), date2.getMonth(), date2.getDate()); - - return Math.floor((utc2 - utc1) / millisecondsPerDay).toString(); - } } $injector.register("googleAnalyticsProvider", GoogleAnalyticsProvider); From b7bb6b0d9eacc07b774fd2f81583f6084ec1f622 Mon Sep 17 00:00:00 2001 From: Ventsislav Georgiev Date: Tue, 24 Oct 2017 12:06:19 +0300 Subject: [PATCH 7/7] Add doc and public method test --- PublicAPI.md | 22 ++++++++++++++++++++++ test/nativescript-cli-lib.ts | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/PublicAPI.md b/PublicAPI.md index 206287aee4..70542d1b3a 100644 --- a/PublicAPI.md +++ b/PublicAPI.md @@ -35,6 +35,8 @@ const tns = require("nativescript"); * [disableDebugging](#disableDebugging) * [getLiveSyncDeviceDescriptors](#getLiveSyncDeviceDescriptors) * [events](#events) +* [analyticsSettingsService](#analyticsSettingsService) + * [getClientId](#getClientId) ## Module projectService @@ -855,6 +857,26 @@ tns.liveSyncService.on("debuggerDetached", debugInfo => { console.log(`Detached debugger for device with id ${debugInfo.deviceIdentifier}`); }); ``` +## analyticsSettingsService +Provides methods for accessing the analytics settings file data. + +### getClientId +The `getClientId` method allows retrieving the clientId used in the analytics tracking + +* Definition: +```TypeScript +/** + * Gets the clientId used for analytics tracking + * @returns {Promise} Client identifier in UUIDv4 standard. + */ +getClientId(): Promise; +``` + +* Usage: +```JavaScript +tns.analyticsSettingsService.getClientId() + .then(clientId => console.log(clientId)); +``` ## How to add a new method to Public API CLI is designed as command line tool and when it is used as a library, it does not give you access to all of the methods. This is mainly implementation detail. Most of the CLI's code is created to work in command line, not as a library, so before adding method to public API, most probably it will require some modification. diff --git a/test/nativescript-cli-lib.ts b/test/nativescript-cli-lib.ts index 10854e48f0..da541f223a 100644 --- a/test/nativescript-cli-lib.ts +++ b/test/nativescript-cli-lib.ts @@ -21,7 +21,8 @@ describe("nativescript-cli-lib", () => { npm: ["install", "uninstall", "view", "search"], extensibilityService: ["loadExtensions", "loadExtension", "getInstalledExtensions", "installExtension", "uninstallExtension"], liveSyncService: ["liveSync", "stopLiveSync", "enableDebugging", "disableDebugging", "attachDebugger"], - debugService: ["debug"] + debugService: ["debug"], + analyticsSettingsService: ["getClientId"] }; const pathToEntryPoint = path.join(__dirname, "..", "lib", "nativescript-cli-lib.js").replace(/\\/g, "\\\\");