@akylas/nativescript-cli 8.8.2 → 8.8.4
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.
- package/lib/android-tools-info.js +9 -20
- package/lib/base-package-manager.js +47 -64
- package/lib/bun-package-manager.js +65 -88
- package/lib/color.js +2 -2
- package/lib/commands/add-platform.js +14 -30
- package/lib/commands/apple-login.js +18 -29
- package/lib/commands/appstore-list.js +34 -45
- package/lib/commands/appstore-upload.js +55 -68
- package/lib/commands/build.js +57 -86
- package/lib/commands/clean.js +161 -176
- package/lib/commands/command-base.js +14 -27
- package/lib/commands/config.js +51 -70
- package/lib/commands/create-project.js +210 -229
- package/lib/commands/debug.js +66 -88
- package/lib/commands/deploy.js +28 -44
- package/lib/commands/embedding/embed.js +33 -52
- package/lib/commands/extensibility/install-extension.js +5 -16
- package/lib/commands/extensibility/list-extensions.js +13 -24
- package/lib/commands/extensibility/uninstall-extension.js +4 -15
- package/lib/commands/fonts.js +30 -41
- package/lib/commands/generate-assets.js +13 -28
- package/lib/commands/generate-help.js +2 -13
- package/lib/commands/generate.js +17 -26
- package/lib/commands/info.js +2 -13
- package/lib/commands/install.js +34 -49
- package/lib/commands/list-platforms.js +14 -25
- package/lib/commands/migrate.js +15 -26
- package/lib/commands/native-add.js +23 -46
- package/lib/commands/platform-clean.js +19 -32
- package/lib/commands/plugin/add-plugin.js +12 -25
- package/lib/commands/plugin/build-plugin.js +34 -39
- package/lib/commands/plugin/create-plugin.js +110 -133
- package/lib/commands/plugin/list-plugins.js +22 -33
- package/lib/commands/plugin/remove-plugin.js +20 -33
- package/lib/commands/plugin/update-plugin.js +20 -33
- package/lib/commands/post-install.js +20 -33
- package/lib/commands/prepare.js +19 -35
- package/lib/commands/preview.js +49 -62
- package/lib/commands/remove-platform.js +7 -18
- package/lib/commands/resources/resources-update.js +13 -26
- package/lib/commands/run.js +55 -76
- package/lib/commands/start.js +6 -19
- package/lib/commands/test-init.js +123 -134
- package/lib/commands/test.js +66 -89
- package/lib/commands/typings.js +126 -142
- package/lib/commands/update-platform.js +22 -35
- package/lib/commands/update.js +30 -43
- package/lib/common/child-process.js +53 -72
- package/lib/common/codeGeneration/code-entity.js +1 -1
- package/lib/common/codeGeneration/code-printer.js +1 -1
- package/lib/common/command-params.js +7 -18
- package/lib/common/commands/analytics.js +27 -40
- package/lib/common/commands/autocompletion.js +39 -56
- package/lib/common/commands/device/device-log-stream.js +12 -23
- package/lib/common/commands/device/get-file.js +22 -33
- package/lib/common/commands/device/list-applications.js +12 -23
- package/lib/common/commands/device/list-devices.js +72 -87
- package/lib/common/commands/device/list-files.js +23 -34
- package/lib/common/commands/device/put-file.js +22 -33
- package/lib/common/commands/device/run-application.js +12 -25
- package/lib/common/commands/device/stop-application.js +11 -22
- package/lib/common/commands/device/uninstall-application.js +6 -17
- package/lib/common/commands/generate-messages.js +17 -28
- package/lib/common/commands/help.js +20 -33
- package/lib/common/commands/package-manager-get.js +6 -17
- package/lib/common/commands/package-manager-set.js +9 -20
- package/lib/common/commands/post-install.js +2 -13
- package/lib/common/commands/preuninstall.js +23 -38
- package/lib/common/commands/proxy/proxy-base.js +8 -19
- package/lib/common/commands/proxy/proxy-clear.js +4 -15
- package/lib/common/commands/proxy/proxy-get.js +3 -14
- package/lib/common/commands/proxy/proxy-set.js +87 -100
- package/lib/common/constants.js +11 -11
- package/lib/common/decorators.js +10 -22
- package/lib/common/dispatchers.js +79 -96
- package/lib/common/errors.js +89 -104
- package/lib/common/file-system.js +106 -127
- package/lib/common/header.js +1 -2
- package/lib/common/helpers.js +149 -178
- package/lib/common/host-info.js +37 -50
- package/lib/common/http-client.js +93 -108
- package/lib/common/logger/appenders/cli-appender.js +1 -2
- package/lib/common/logger/appenders/emit-appender.js +1 -2
- package/lib/common/logger/layouts/cli-layout.js +1 -2
- package/lib/common/logger/logger.js +1 -1
- package/lib/common/mobile/android/android-application-manager.js +121 -142
- package/lib/common/mobile/android/android-debug-bridge-result-handler.js +1 -1
- package/lib/common/mobile/android/android-debug-bridge.js +87 -112
- package/lib/common/mobile/android/android-device-file-system.js +98 -131
- package/lib/common/mobile/android/android-device-hash-service.js +50 -75
- package/lib/common/mobile/android/android-device.js +74 -91
- package/lib/common/mobile/android/android-emulator-services.js +105 -130
- package/lib/common/mobile/android/android-log-filter.js +1 -1
- package/lib/common/mobile/android/android-virtual-device-service.js +76 -97
- package/lib/common/mobile/android/device-android-debug-bridge.js +13 -29
- package/lib/common/mobile/android/genymotion/genymotion-service.js +91 -118
- package/lib/common/mobile/android/genymotion/virtualbox-service.js +64 -81
- package/lib/common/mobile/android/logcat-helper.js +108 -127
- package/lib/common/mobile/application-manager-base.js +84 -107
- package/lib/common/mobile/device-log-provider-base.js +7 -18
- package/lib/common/mobile/ios/device/ios-application-manager.js +79 -108
- package/lib/common/mobile/ios/device/ios-device-file-system.js +78 -105
- package/lib/common/mobile/ios/device/ios-device-operations.js +105 -142
- package/lib/common/mobile/ios/device/ios-device.js +20 -36
- package/lib/common/mobile/ios/ios-device-base.js +58 -81
- package/lib/common/mobile/ios/simulator/ios-emulator-services.js +63 -92
- package/lib/common/mobile/ios/simulator/ios-sim-resolver.js +1 -1
- package/lib/common/mobile/ios/simulator/ios-simulator-application-manager.js +60 -89
- package/lib/common/mobile/ios/simulator/ios-simulator-device.js +27 -43
- package/lib/common/mobile/ios/simulator/ios-simulator-file-system.js +37 -62
- package/lib/common/mobile/ios/simulator/ios-simulator-log-provider.js +24 -35
- package/lib/common/mobile/mobile-core/android-device-discovery.js +43 -62
- package/lib/common/mobile/mobile-core/android-emulator-discovery.js +21 -32
- package/lib/common/mobile/mobile-core/android-process-service.js +143 -182
- package/lib/common/mobile/mobile-core/device-discovery.js +2 -13
- package/lib/common/mobile/mobile-core/devices-service.js +385 -436
- package/lib/common/mobile/mobile-core/ios-device-discovery.js +24 -35
- package/lib/common/mobile/mobile-core/ios-simulator-discovery.js +47 -62
- package/lib/common/mobile/mobile-helper.js +15 -26
- package/lib/common/mobile/wp8/wp8-emulator-services.js +25 -52
- package/lib/common/opener.js +2 -2
- package/lib/common/plist-parser.js +3 -3
- package/lib/common/prompter.js +90 -105
- package/lib/common/queue.js +9 -20
- package/lib/common/services/auto-completion-service.js +39 -52
- package/lib/common/services/cancellation.js +17 -28
- package/lib/common/services/commands-service.js +146 -169
- package/lib/common/services/help-service.js +132 -157
- package/lib/common/services/hooks-service.js +93 -108
- package/lib/common/services/ios-notification-service.js +21 -34
- package/lib/common/services/json-file-settings-service.js +52 -71
- package/lib/common/services/lock-service.js +35 -52
- package/lib/common/services/message-contract-generator.js +35 -46
- package/lib/common/services/micro-templating-service.js +4 -15
- package/lib/common/services/net-service.js +90 -107
- package/lib/common/services/project-files-manager.js +10 -23
- package/lib/common/services/proxy-service.js +13 -24
- package/lib/common/services/qr.js +13 -24
- package/lib/common/services/settings-service.js +1 -1
- package/lib/common/services/xcode-select-service.js +20 -35
- package/lib/common/utils.js +2 -2
- package/lib/common/validators/project-name-validator.js +1 -1
- package/lib/common/validators/validation-result.js +1 -1
- package/lib/common/verify-node-version.js +2 -3
- package/lib/common/yok.js +23 -36
- package/lib/config.js +7 -58
- package/lib/constants.js +24 -24
- package/lib/controllers/build-controller.js +82 -99
- package/lib/controllers/debug-controller.js +107 -128
- package/lib/controllers/deploy-controller.js +17 -22
- package/lib/controllers/migrate-controller.js +722 -795
- package/lib/controllers/platform-controller.js +72 -87
- package/lib/controllers/prepare-controller.js +266 -299
- package/lib/controllers/run-controller.js +392 -406
- package/lib/controllers/update-controller-base.js +16 -29
- package/lib/controllers/update-controller.js +94 -119
- package/lib/data/prepare-data.js +4 -1
- package/lib/definitions/ios-debugger-port-service.d.ts +1 -1
- package/lib/definitions/livesync.d.ts +1 -1
- package/lib/detached-processes/cleanup-js-subprocess.js +3 -12
- package/lib/detached-processes/cleanup-process.js +16 -25
- package/lib/device-path-provider.js +23 -34
- package/lib/device-sockets/ios/app-debug-socket-proxy-factory.js +149 -164
- package/lib/device-sockets/ios/notification.js +1 -1
- package/lib/device-sockets/ios/socket-request-executor.js +24 -39
- package/lib/helpers/android-bundle-validator-helper.js +1 -1
- package/lib/helpers/deploy-command-helper.js +45 -49
- package/lib/helpers/key-command-helper.js +4 -13
- package/lib/helpers/livesync-command-helper.js +137 -152
- package/lib/helpers/network-connectivity-validator.js +6 -17
- package/lib/helpers/options-track-helper.js +6 -17
- package/lib/helpers/platform-command-helper.js +99 -120
- package/lib/key-commands/index.js +161 -211
- package/lib/nativescript-cli.js +5 -14
- package/lib/node-package-manager.js +81 -104
- package/lib/options.js +3 -12
- package/lib/package-installation-manager.js +130 -165
- package/lib/package-manager.js +63 -86
- package/lib/platform-command-param.js +4 -15
- package/lib/pnpm-package-manager.js +59 -78
- package/lib/project-data.js +1 -1
- package/lib/providers/project-files-provider.js +1 -1
- package/lib/services/analytics/analytics-broker-process.js +13 -22
- package/lib/services/analytics/analytics-broker.js +17 -30
- package/lib/services/analytics/analytics-service.js +161 -198
- package/lib/services/analytics/google-analytics-provider.js +41 -56
- package/lib/services/analytics-settings-service.js +15 -32
- package/lib/services/android/android-bundle-tool-service.js +43 -60
- package/lib/services/android/gradle-build-args-service.js +9 -20
- package/lib/services/android/gradle-build-service.js +34 -47
- package/lib/services/android/gradle-command-service.js +22 -35
- package/lib/services/android-device-debug-service.js +90 -117
- package/lib/services/android-plugin-build-service.js +230 -256
- package/lib/services/android-project-service.js +163 -199
- package/lib/services/android-resources-migration-service.js +51 -64
- package/lib/services/apple-portal/apple-portal-application-service.js +46 -63
- package/lib/services/apple-portal/apple-portal-session-service.js +171 -188
- package/lib/services/assets-generation/assets-generation-service.js +98 -115
- package/lib/services/build-artifacts-service.js +9 -20
- package/lib/services/build-info-file-service.js +20 -35
- package/lib/services/cleanup-service.js +47 -76
- package/lib/services/cocoapods-service.js +115 -136
- package/lib/services/device/device-install-app-service.js +73 -90
- package/lib/services/doctor-service.js +99 -118
- package/lib/services/extensibility-service.js +81 -100
- package/lib/services/files-hash-service.js +26 -43
- package/lib/services/hmr-status-service.js +1 -1
- package/lib/services/initialize-service.js +37 -50
- package/lib/services/ios/export-options-plist-service.js +38 -51
- package/lib/services/ios/ios-signing-service.js +161 -180
- package/lib/services/ios/spm-service.js +40 -53
- package/lib/services/ios/xcodebuild-args-service.js +77 -94
- package/lib/services/ios/xcodebuild-command-service.js +14 -25
- package/lib/services/ios/xcodebuild-service.js +50 -69
- package/lib/services/ios-debugger-port-service.js +23 -36
- package/lib/services/ios-device-debug-service.js +75 -102
- package/lib/services/ios-entitlements-service.js +31 -42
- package/lib/services/ios-extensions-service.js +18 -29
- package/lib/services/ios-project-service.js +405 -460
- package/lib/services/ios-provision-service.js +108 -129
- package/lib/services/ios-watch-app-service.js +21 -32
- package/lib/services/ip-service.js +38 -53
- package/lib/services/itmstransporter-service.js +129 -152
- package/lib/services/livesync/android-device-livesync-service-base.js +31 -48
- package/lib/services/livesync/android-device-livesync-service.js +120 -149
- package/lib/services/livesync/android-device-livesync-sockets-service.js +121 -152
- package/lib/services/livesync/android-livesync-service.js +14 -35
- package/lib/services/livesync/android-livesync-tool.js +89 -112
- package/lib/services/livesync/device-livesync-service-base.js +15 -28
- package/lib/services/livesync/ios-device-livesync-service.js +114 -143
- package/lib/services/livesync/ios-livesync-service.js +42 -58
- package/lib/services/livesync/platform-livesync-service-base.js +94 -119
- package/lib/services/log-parser-service.js +1 -1
- package/lib/services/log-source-map-service.js +30 -41
- package/lib/services/marking-mode-service.js +15 -28
- package/lib/services/npm-config-service.js +1 -1
- package/lib/services/pacote-service.js +49 -64
- package/lib/services/performance-service.js +1 -1
- package/lib/services/platform/add-platform-service.js +50 -71
- package/lib/services/platform/platform-validation-service.js +22 -33
- package/lib/services/platform/prepare-native-platform-service.js +49 -62
- package/lib/services/platform-environment-requirements.js +26 -37
- package/lib/services/plugins-service.js +122 -147
- package/lib/services/project-backup-service.js +1 -1
- package/lib/services/project-changes-service.js +124 -141
- package/lib/services/project-cleanup-service.js +64 -77
- package/lib/services/project-config-service.js +71 -80
- package/lib/services/project-data-service.js +101 -118
- package/lib/services/project-name-service.js +28 -43
- package/lib/services/project-service.js +84 -103
- package/lib/services/project-templates-service.js +52 -67
- package/lib/services/start-service.js +41 -59
- package/lib/services/temp-service.js +8 -21
- package/lib/services/terminal-spinner-service.js +13 -24
- package/lib/services/test-execution-service.js +59 -72
- package/lib/services/test-initialization-service.js +2 -2
- package/lib/services/timeline-profiler-service.js +1 -1
- package/lib/services/versions-service.js +119 -138
- package/lib/services/webpack/webpack-compiler-service.js +211 -231
- package/lib/services/xcconfig-service.js +8 -19
- package/lib/sys-info.js +45 -62
- package/lib/tools/node-modules/node-modules-builder.js +16 -27
- package/lib/yarn-package-manager.js +59 -78
- package/lib/yarn2-package-manager.js +60 -79
- package/package.json +56 -54
- package/vendor/aab-tool/bundletool.jar +0 -0
- package/lib/common/resources/platform-tools/android/darwin/NOTICE.txt +0 -3407
- package/lib/common/resources/platform-tools/android/darwin/adb +0 -0
- package/lib/common/resources/platform-tools/android/linux/NOTICE.txt +0 -4451
- package/lib/common/resources/platform-tools/android/linux/adb +0 -0
- package/lib/common/resources/platform-tools/android/win32/AdbWinApi.dll +0 -0
- package/lib/common/resources/platform-tools/android/win32/AdbWinUsbApi.dll +0 -0
- package/lib/common/resources/platform-tools/android/win32/NOTICE.txt +0 -4451
- package/lib/common/resources/platform-tools/android/win32/adb.exe +0 -0
- package/lib/common/resources/platform-tools/android/win32/fastboot.exe +0 -0
|
@@ -5,15 +5,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
9
|
exports.AnalyticsService = void 0;
|
|
19
10
|
const path = require("path");
|
|
@@ -40,41 +31,35 @@ class AnalyticsService {
|
|
|
40
31
|
setShouldDispose(shouldDispose) {
|
|
41
32
|
this.shouldDisposeInstance = shouldDispose;
|
|
42
33
|
}
|
|
43
|
-
checkConsent() {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
const isErrorReportingUnset = yield this.isNotConfirmed(this.$staticConfig.ERROR_REPORT_SETTING_NAME);
|
|
58
|
-
const isUsageReportingConfirmed = !(yield this.isNotConfirmed(this.$staticConfig.TRACK_FEATURE_USAGE_SETTING_NAME));
|
|
59
|
-
if (isErrorReportingUnset && isUsageReportingConfirmed) {
|
|
60
|
-
yield this.setStatus(this.$staticConfig.ERROR_REPORT_SETTING_NAME, trackFeatureUsage);
|
|
61
|
-
}
|
|
34
|
+
async checkConsent() {
|
|
35
|
+
if (await this.$analyticsSettingsService.canDoRequest()) {
|
|
36
|
+
const initialTrackFeatureUsageStatus = await this.getStatus(this.$staticConfig.TRACK_FEATURE_USAGE_SETTING_NAME);
|
|
37
|
+
let trackFeatureUsage = initialTrackFeatureUsageStatus === "enabled";
|
|
38
|
+
if ((await this.isNotConfirmed(this.$staticConfig.TRACK_FEATURE_USAGE_SETTING_NAME)) &&
|
|
39
|
+
(0, helpers_1.isInteractive)()) {
|
|
40
|
+
const message = `Do you want to help us improve ${this.$analyticsSettingsService.getClientName()} by automatically sending anonymous usage statistics? We will not use this information to identify or contact you.`;
|
|
41
|
+
trackFeatureUsage = await this.$prompter.confirm(message, () => false);
|
|
42
|
+
await this.setStatus(this.$staticConfig.TRACK_FEATURE_USAGE_SETTING_NAME, trackFeatureUsage);
|
|
43
|
+
await this.trackAcceptFeatureUsage({
|
|
44
|
+
acceptTrackFeatureUsage: trackFeatureUsage,
|
|
45
|
+
});
|
|
62
46
|
}
|
|
63
|
-
|
|
47
|
+
const isErrorReportingUnset = await this.isNotConfirmed(this.$staticConfig.ERROR_REPORT_SETTING_NAME);
|
|
48
|
+
const isUsageReportingConfirmed = !(await this.isNotConfirmed(this.$staticConfig.TRACK_FEATURE_USAGE_SETTING_NAME));
|
|
49
|
+
if (isErrorReportingUnset && isUsageReportingConfirmed) {
|
|
50
|
+
await this.setStatus(this.$staticConfig.ERROR_REPORT_SETTING_NAME, trackFeatureUsage);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
64
53
|
}
|
|
65
|
-
setStatus(settingName, enabled) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
yield this.$userSettingsService.saveSetting(settingName, enabled.toString());
|
|
71
|
-
});
|
|
54
|
+
async setStatus(settingName, enabled) {
|
|
55
|
+
this.analyticsStatuses[settingName] = enabled
|
|
56
|
+
? "enabled"
|
|
57
|
+
: "disabled";
|
|
58
|
+
await this.$userSettingsService.saveSetting(settingName, enabled.toString());
|
|
72
59
|
}
|
|
73
|
-
isEnabled(settingName) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return analyticsStatus === "enabled";
|
|
77
|
-
});
|
|
60
|
+
async isEnabled(settingName) {
|
|
61
|
+
const analyticsStatus = await this.getStatus(settingName);
|
|
62
|
+
return analyticsStatus === "enabled";
|
|
78
63
|
}
|
|
79
64
|
getStatusMessage(settingName, jsonFormat, readableSettingName) {
|
|
80
65
|
if (jsonFormat) {
|
|
@@ -82,86 +67,78 @@ class AnalyticsService {
|
|
|
82
67
|
}
|
|
83
68
|
return this.getHumanReadableStatusMessage(settingName, readableSettingName);
|
|
84
69
|
}
|
|
85
|
-
trackAcceptFeatureUsage(settings) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
yield this.forcefullyTrackInGoogleAnalytics(googleAnalyticsEventData);
|
|
94
|
-
});
|
|
70
|
+
async trackAcceptFeatureUsage(settings) {
|
|
71
|
+
const acceptTracking = !!(settings && settings.acceptTrackFeatureUsage);
|
|
72
|
+
const googleAnalyticsEventData = {
|
|
73
|
+
googleAnalyticsDataType: "event",
|
|
74
|
+
action: "Accept Tracking",
|
|
75
|
+
label: acceptTracking.toString(),
|
|
76
|
+
};
|
|
77
|
+
await this.forcefullyTrackInGoogleAnalytics(googleAnalyticsEventData);
|
|
95
78
|
}
|
|
96
|
-
trackInGoogleAnalytics(gaSettings) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
});
|
|
79
|
+
async trackInGoogleAnalytics(gaSettings) {
|
|
80
|
+
await this.initAnalyticsStatuses();
|
|
81
|
+
if (!this.$staticConfig.disableAnalytics &&
|
|
82
|
+
this.analyticsStatuses[this.$staticConfig.TRACK_FEATURE_USAGE_SETTING_NAME] === "enabled") {
|
|
83
|
+
return this.forcefullyTrackInGoogleAnalytics(gaSettings);
|
|
84
|
+
}
|
|
104
85
|
}
|
|
105
|
-
trackEventActionInGoogleAnalytics(data) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
yield this.trackInGoogleAnalytics(googleAnalyticsEventData);
|
|
139
|
-
});
|
|
86
|
+
async trackEventActionInGoogleAnalytics(data) {
|
|
87
|
+
const device = data.device;
|
|
88
|
+
const platform = device ? device.deviceInfo.platform : data.platform;
|
|
89
|
+
const normalizedPlatform = platform
|
|
90
|
+
? this.$mobileHelper.normalizePlatformName(platform)
|
|
91
|
+
: platform;
|
|
92
|
+
const isForDevice = device ? !device.isEmulator : data.isForDevice;
|
|
93
|
+
let label = "";
|
|
94
|
+
label = this.addDataToLabel(label, normalizedPlatform);
|
|
95
|
+
if (isForDevice !== null && isForDevice !== undefined) {
|
|
96
|
+
const deviceType = isForDevice
|
|
97
|
+
? constants_1.DeviceTypes.Device
|
|
98
|
+
: this.$mobileHelper.isAndroidPlatform(platform)
|
|
99
|
+
? constants_1.DeviceTypes.Emulator
|
|
100
|
+
: constants_1.DeviceTypes.Simulator;
|
|
101
|
+
label = this.addDataToLabel(label, deviceType);
|
|
102
|
+
}
|
|
103
|
+
if (device) {
|
|
104
|
+
label = this.addDataToLabel(label, device.deviceInfo.version);
|
|
105
|
+
}
|
|
106
|
+
if (data.additionalData) {
|
|
107
|
+
label = this.addDataToLabel(label, data.additionalData);
|
|
108
|
+
}
|
|
109
|
+
const customDimensions = {};
|
|
110
|
+
this.setProjectRelatedCustomDimensions(customDimensions, data.projectDir);
|
|
111
|
+
const googleAnalyticsEventData = {
|
|
112
|
+
googleAnalyticsDataType: "event",
|
|
113
|
+
action: data.action,
|
|
114
|
+
label,
|
|
115
|
+
customDimensions,
|
|
116
|
+
value: data.value,
|
|
117
|
+
};
|
|
118
|
+
await this.trackInGoogleAnalytics(googleAnalyticsEventData);
|
|
140
119
|
}
|
|
141
|
-
finishTracking() {
|
|
142
|
-
return
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
if (data === "ProcessFinishedTasks") {
|
|
148
|
-
this.brokerProcess.removeListener("message", handler);
|
|
149
|
-
clearTimeout(timer);
|
|
150
|
-
resolve();
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
timer = setTimeout(() => {
|
|
120
|
+
async finishTracking() {
|
|
121
|
+
return new Promise((resolve, reject) => {
|
|
122
|
+
if (this.brokerProcess && this.brokerProcess.connected) {
|
|
123
|
+
let timer;
|
|
124
|
+
const handler = (data) => {
|
|
125
|
+
if (data === "ProcessFinishedTasks") {
|
|
154
126
|
this.brokerProcess.removeListener("message", handler);
|
|
127
|
+
clearTimeout(timer);
|
|
155
128
|
resolve();
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
this.brokerProcess.
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
timer = setTimeout(() => {
|
|
132
|
+
this.brokerProcess.removeListener("message", handler);
|
|
162
133
|
resolve();
|
|
163
|
-
}
|
|
164
|
-
|
|
134
|
+
}, 3000);
|
|
135
|
+
this.brokerProcess.on("message", handler);
|
|
136
|
+
const msg = { type: "FinishTracking" };
|
|
137
|
+
this.brokerProcess.send(msg, (err) => this.$logger.trace(`Error while sending ${JSON.stringify(msg)}`));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
resolve();
|
|
141
|
+
}
|
|
165
142
|
});
|
|
166
143
|
}
|
|
167
144
|
forcefullyTrackInGoogleAnalytics(gaSettings) {
|
|
@@ -248,103 +225,89 @@ class AnalyticsService {
|
|
|
248
225
|
}
|
|
249
226
|
return brokerProcessArgs;
|
|
250
227
|
}
|
|
251
|
-
sendInfoForTracking(trackingInfo, settingName) {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
}
|
|
258
|
-
});
|
|
228
|
+
async sendInfoForTracking(trackingInfo, settingName) {
|
|
229
|
+
await this.initAnalyticsStatuses();
|
|
230
|
+
if (!this.$staticConfig.disableAnalytics &&
|
|
231
|
+
this.analyticsStatuses[settingName] === "enabled") {
|
|
232
|
+
return this.sendMessageToBroker(trackingInfo);
|
|
233
|
+
}
|
|
259
234
|
}
|
|
260
|
-
sendMessageToBroker(message) {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
broker.send(message, (error) => resolve());
|
|
274
|
-
}
|
|
275
|
-
catch (err) {
|
|
276
|
-
this.$logger.trace("Error while trying to send message to broker:", err);
|
|
277
|
-
resolve();
|
|
278
|
-
}
|
|
235
|
+
async sendMessageToBroker(message) {
|
|
236
|
+
let broker;
|
|
237
|
+
try {
|
|
238
|
+
broker = await this.getAnalyticsBroker();
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
this.$logger.trace("Unable to get broker instance due to error: ", err);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
return new Promise((resolve, reject) => {
|
|
245
|
+
if (broker && broker.connected) {
|
|
246
|
+
try {
|
|
247
|
+
broker.send(message, (error) => resolve());
|
|
279
248
|
}
|
|
280
|
-
|
|
281
|
-
this.$logger.trace("
|
|
249
|
+
catch (err) {
|
|
250
|
+
this.$logger.trace("Error while trying to send message to broker:", err);
|
|
282
251
|
resolve();
|
|
283
252
|
}
|
|
284
|
-
}
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
this.$logger.trace("Broker not found or not connected.");
|
|
256
|
+
resolve();
|
|
257
|
+
}
|
|
285
258
|
});
|
|
286
259
|
}
|
|
287
|
-
initAnalyticsStatuses() {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
yield this.getStatus(settingName);
|
|
297
|
-
}
|
|
298
|
-
this.$logger.trace("Analytics statuses: ", this.analyticsStatuses);
|
|
260
|
+
async initAnalyticsStatuses() {
|
|
261
|
+
if (await this.$analyticsSettingsService.canDoRequest()) {
|
|
262
|
+
this.$logger.trace("Initializing analytics statuses.");
|
|
263
|
+
const settingsNames = [
|
|
264
|
+
this.$staticConfig.TRACK_FEATURE_USAGE_SETTING_NAME,
|
|
265
|
+
this.$staticConfig.ERROR_REPORT_SETTING_NAME,
|
|
266
|
+
];
|
|
267
|
+
for (const settingName of settingsNames) {
|
|
268
|
+
await this.getStatus(settingName);
|
|
299
269
|
}
|
|
300
|
-
|
|
270
|
+
this.$logger.trace("Analytics statuses: ", this.analyticsStatuses);
|
|
271
|
+
}
|
|
301
272
|
}
|
|
302
|
-
getStatus(settingName) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
this.analyticsStatuses[settingName] = "enabled";
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
this.analyticsStatuses[settingName] = "disabled";
|
|
313
|
-
}
|
|
273
|
+
async getStatus(settingName) {
|
|
274
|
+
if (!_.has(this.analyticsStatuses, settingName)) {
|
|
275
|
+
const settingValue = await this.$userSettingsService.getSettingValue(settingName);
|
|
276
|
+
if (settingValue) {
|
|
277
|
+
const isEnabled = (0, helpers_1.toBoolean)(settingValue);
|
|
278
|
+
if (isEnabled) {
|
|
279
|
+
this.analyticsStatuses[settingName] = "enabled";
|
|
314
280
|
}
|
|
315
281
|
else {
|
|
316
|
-
this.analyticsStatuses[settingName] = "
|
|
282
|
+
this.analyticsStatuses[settingName] = "disabled";
|
|
317
283
|
}
|
|
318
284
|
}
|
|
319
|
-
return this.analyticsStatuses[settingName];
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
isNotConfirmed(settingName) {
|
|
323
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
324
|
-
const analyticsStatus = yield this.getStatus(settingName);
|
|
325
|
-
return analyticsStatus === "not confirmed";
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
getHumanReadableStatusMessage(settingName, readableSettingName) {
|
|
329
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
330
|
-
let status = null;
|
|
331
|
-
if (yield this.isNotConfirmed(settingName)) {
|
|
332
|
-
status = "disabled until confirmed";
|
|
333
|
-
}
|
|
334
285
|
else {
|
|
335
|
-
|
|
286
|
+
this.analyticsStatuses[settingName] = "not confirmed";
|
|
336
287
|
}
|
|
337
|
-
|
|
338
|
-
|
|
288
|
+
}
|
|
289
|
+
return this.analyticsStatuses[settingName];
|
|
339
290
|
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
291
|
+
async isNotConfirmed(settingName) {
|
|
292
|
+
const analyticsStatus = await this.getStatus(settingName);
|
|
293
|
+
return analyticsStatus === "not confirmed";
|
|
294
|
+
}
|
|
295
|
+
async getHumanReadableStatusMessage(settingName, readableSettingName) {
|
|
296
|
+
let status = null;
|
|
297
|
+
if (await this.isNotConfirmed(settingName)) {
|
|
298
|
+
status = "disabled until confirmed";
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
status = await this.getStatus(settingName);
|
|
302
|
+
}
|
|
303
|
+
return `${readableSettingName} is ${status}.`;
|
|
304
|
+
}
|
|
305
|
+
async getJsonStatusMessage(settingName) {
|
|
306
|
+
const status = await this.getStatus(settingName);
|
|
307
|
+
const enabled = status === "not confirmed"
|
|
308
|
+
? null
|
|
309
|
+
: status === "enabled";
|
|
310
|
+
return JSON.stringify({ enabled });
|
|
348
311
|
}
|
|
349
312
|
trackException(exception, message) {
|
|
350
313
|
const data = {
|
|
@@ -355,6 +318,7 @@ class AnalyticsService {
|
|
|
355
318
|
return this.sendInfoForTracking(data, this.$staticConfig.ERROR_REPORT_SETTING_NAME);
|
|
356
319
|
}
|
|
357
320
|
}
|
|
321
|
+
exports.AnalyticsService = AnalyticsService;
|
|
358
322
|
AnalyticsService.ANALYTICS_BROKER_START_TIMEOUT = 10 * 1000;
|
|
359
323
|
__decorate([
|
|
360
324
|
(0, decorators_1.cache)()
|
|
@@ -362,5 +326,4 @@ __decorate([
|
|
|
362
326
|
__decorate([
|
|
363
327
|
(0, decorators_1.cache)()
|
|
364
328
|
], AnalyticsService.prototype, "initAnalyticsStatuses", null);
|
|
365
|
-
exports.AnalyticsService = AnalyticsService;
|
|
366
329
|
yok_1.injector.register("analyticsService", AnalyticsService);
|
|
@@ -5,15 +5,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
9
|
exports.GoogleAnalyticsProvider = void 0;
|
|
19
10
|
const uuid_1 = require("uuid");
|
|
@@ -31,20 +22,18 @@ class GoogleAnalyticsProvider {
|
|
|
31
22
|
this.$config = $config;
|
|
32
23
|
this.analyticsLoggingService = analyticsLoggingService;
|
|
33
24
|
}
|
|
34
|
-
trackHit(trackInfo) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
});
|
|
25
|
+
async trackHit(trackInfo) {
|
|
26
|
+
const sessionId = (0, uuid_1.v4)();
|
|
27
|
+
try {
|
|
28
|
+
await this.track(this.$config.GA_TRACKING_ID, trackInfo, sessionId);
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
this.analyticsLoggingService.logData({
|
|
32
|
+
type: "Error",
|
|
33
|
+
message: `Unable to track information ${JSON.stringify(trackInfo)}. Error is: ${e}`,
|
|
34
|
+
});
|
|
35
|
+
this.$logger.trace("Analytics exception: ", e);
|
|
36
|
+
}
|
|
48
37
|
}
|
|
49
38
|
getVisitor(gaTrackingId, proxy) {
|
|
50
39
|
this.analyticsLoggingService.logData({
|
|
@@ -66,40 +55,36 @@ class GoogleAnalyticsProvider {
|
|
|
66
55
|
});
|
|
67
56
|
return visitor;
|
|
68
57
|
}
|
|
69
|
-
track(gaTrackingId, trackInfo, sessionId) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
});
|
|
58
|
+
async track(gaTrackingId, trackInfo, sessionId) {
|
|
59
|
+
const proxySettings = await this.$proxyService.getCache();
|
|
60
|
+
const proxy = proxySettings && proxySettings.proxy;
|
|
61
|
+
const visitor = this.getVisitor(gaTrackingId, proxy);
|
|
62
|
+
await this.setCustomDimensions(visitor, trackInfo.customDimensions, sessionId);
|
|
63
|
+
switch (trackInfo.googleAnalyticsDataType) {
|
|
64
|
+
case "pageview":
|
|
65
|
+
await this.trackPageView(visitor, trackInfo);
|
|
66
|
+
break;
|
|
67
|
+
case "event":
|
|
68
|
+
await this.trackEvent(visitor, trackInfo);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
84
71
|
}
|
|
85
|
-
setCustomDimensions(visitor, customDimensions, sessionId) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
message: `Setting custom dimension ${key} to value ${value}`,
|
|
100
|
-
});
|
|
101
|
-
visitor.set(key, value);
|
|
72
|
+
async setCustomDimensions(visitor, customDimensions, sessionId) {
|
|
73
|
+
const defaultValues = {
|
|
74
|
+
["cd1"]: this.$staticConfig.version,
|
|
75
|
+
["cd6"]: process.version,
|
|
76
|
+
["cd3"]: this.clientId,
|
|
77
|
+
["cd2"]: null,
|
|
78
|
+
["cd9"]: null,
|
|
79
|
+
["cd4"]: sessionId,
|
|
80
|
+
["cd5"]: "Unknown",
|
|
81
|
+
};
|
|
82
|
+
customDimensions = _.merge(defaultValues, customDimensions);
|
|
83
|
+
_.each(customDimensions, (value, key) => {
|
|
84
|
+
this.analyticsLoggingService.logData({
|
|
85
|
+
message: `Setting custom dimension ${key} to value ${value}`,
|
|
102
86
|
});
|
|
87
|
+
visitor.set(key, value);
|
|
103
88
|
});
|
|
104
89
|
}
|
|
105
90
|
trackEvent(visitor, trackInfo) {
|
|
@@ -145,8 +130,8 @@ class GoogleAnalyticsProvider {
|
|
|
145
130
|
});
|
|
146
131
|
}
|
|
147
132
|
}
|
|
133
|
+
exports.GoogleAnalyticsProvider = GoogleAnalyticsProvider;
|
|
148
134
|
__decorate([
|
|
149
135
|
(0, decorators_1.cache)()
|
|
150
136
|
], GoogleAnalyticsProvider.prototype, "getVisitor", null);
|
|
151
|
-
exports.GoogleAnalyticsProvider = GoogleAnalyticsProvider;
|
|
152
137
|
yok_1.injector.register("googleAnalyticsProvider", GoogleAnalyticsProvider);
|
|
@@ -5,15 +5,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
9
|
const helpers_1 = require("../common/helpers");
|
|
19
10
|
const decorators_1 = require("../common/decorators");
|
|
@@ -28,10 +19,8 @@ class AnalyticsSettingsService {
|
|
|
28
19
|
this.$osInfo = $osInfo;
|
|
29
20
|
this.$logger = $logger;
|
|
30
21
|
}
|
|
31
|
-
canDoRequest() {
|
|
32
|
-
return
|
|
33
|
-
return true;
|
|
34
|
-
});
|
|
22
|
+
async canDoRequest() {
|
|
23
|
+
return true;
|
|
35
24
|
}
|
|
36
25
|
getUserId() {
|
|
37
26
|
return this.getSettingValueOrDefault("USER_ID");
|
|
@@ -42,16 +31,12 @@ class AnalyticsSettingsService {
|
|
|
42
31
|
getClientName() {
|
|
43
32
|
return "" + color_1.color.cyan.bold(this.$staticConfig.CLIENT_NAME_ALIAS);
|
|
44
33
|
}
|
|
45
|
-
getUserSessionsCount(projectName) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return sessionsCountForProject || 0;
|
|
49
|
-
});
|
|
34
|
+
async getUserSessionsCount(projectName) {
|
|
35
|
+
const sessionsCountForProject = await this.$userSettingsService.getSettingValue(this.getSessionsProjectKey(projectName));
|
|
36
|
+
return sessionsCountForProject || 0;
|
|
50
37
|
}
|
|
51
|
-
setUserSessionsCount(count, projectName) {
|
|
52
|
-
return
|
|
53
|
-
return this.$userSettingsService.saveSetting(this.getSessionsProjectKey(projectName), count);
|
|
54
|
-
});
|
|
38
|
+
async setUserSessionsCount(count, projectName) {
|
|
39
|
+
return this.$userSettingsService.saveSetting(this.getSessionsProjectKey(projectName), count);
|
|
55
40
|
}
|
|
56
41
|
getUserAgentString(identifier) {
|
|
57
42
|
let osString = "";
|
|
@@ -82,16 +67,14 @@ class AnalyticsSettingsService {
|
|
|
82
67
|
getSessionsProjectKey(projectName) {
|
|
83
68
|
return `${AnalyticsSettingsService.SESSIONS_STARTED_KEY_PREFIX}${projectName}`;
|
|
84
69
|
}
|
|
85
|
-
getSettingValueOrDefault(settingName) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
return guid;
|
|
94
|
-
});
|
|
70
|
+
async getSettingValueOrDefault(settingName) {
|
|
71
|
+
let guid = await this.$userSettingsService.getSettingValue(settingName);
|
|
72
|
+
if (!guid) {
|
|
73
|
+
guid = (0, helpers_1.createGUID)(false);
|
|
74
|
+
this.$logger.trace(`Setting new ${settingName}: ${guid}.`);
|
|
75
|
+
await this.$userSettingsService.saveSetting(settingName, guid);
|
|
76
|
+
}
|
|
77
|
+
return guid;
|
|
95
78
|
}
|
|
96
79
|
}
|
|
97
80
|
AnalyticsSettingsService.SESSIONS_STARTED_KEY_PREFIX = "SESSIONS_STARTED_";
|