@sap-ux/telemetry 0.2.0

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.
Files changed (59) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -0
  3. package/dist/base/client/azure-appinsight-client.d.ts +88 -0
  4. package/dist/base/client/azure-appinsight-client.js +195 -0
  5. package/dist/base/client/client.d.ts +24 -0
  6. package/dist/base/client/client.js +33 -0
  7. package/dist/base/client/index.d.ts +24 -0
  8. package/dist/base/client/index.js +38 -0
  9. package/dist/base/config-state.d.ts +12 -0
  10. package/dist/base/config-state.js +26 -0
  11. package/dist/base/decorator/index.d.ts +23 -0
  12. package/dist/base/decorator/index.js +41 -0
  13. package/dist/base/interceptor/config.d.ts +19 -0
  14. package/dist/base/interceptor/config.js +54 -0
  15. package/dist/base/interceptor/index.d.ts +10 -0
  16. package/dist/base/interceptor/index.js +90 -0
  17. package/dist/base/performance/api.d.ts +74 -0
  18. package/dist/base/performance/api.js +120 -0
  19. package/dist/base/performance/entries.d.ts +42 -0
  20. package/dist/base/performance/entries.js +53 -0
  21. package/dist/base/performance/types.d.ts +35 -0
  22. package/dist/base/performance/types.js +17 -0
  23. package/dist/base/types/event-header.d.ts +28 -0
  24. package/dist/base/types/event-header.js +38 -0
  25. package/dist/base/types/event-name.d.ts +6 -0
  26. package/dist/base/types/event-name.js +10 -0
  27. package/dist/base/types/index.d.ts +5 -0
  28. package/dist/base/types/index.js +21 -0
  29. package/dist/base/types/project-info.d.ts +5 -0
  30. package/dist/base/types/project-info.js +3 -0
  31. package/dist/base/types/sample-rate.d.ts +6 -0
  32. package/dist/base/types/sample-rate.js +10 -0
  33. package/dist/base/utils/azure-client-config.d.ts +9 -0
  34. package/dist/base/utils/azure-client-config.js +21 -0
  35. package/dist/base/utils/date.d.ts +2 -0
  36. package/dist/base/utils/date.js +9 -0
  37. package/dist/base/utils/index.d.ts +6 -0
  38. package/dist/base/utils/index.js +24 -0
  39. package/dist/base/utils/logger.d.ts +6 -0
  40. package/dist/base/utils/logger.js +10 -0
  41. package/dist/base/utils/param-processing.d.ts +46 -0
  42. package/dist/base/utils/param-processing.js +103 -0
  43. package/dist/base/utils/reporting.d.ts +3 -0
  44. package/dist/base/utils/reporting.js +101 -0
  45. package/dist/index.d.ts +12 -0
  46. package/dist/index.js +35 -0
  47. package/dist/tooling-telemetry/config-state.d.ts +4 -0
  48. package/dist/tooling-telemetry/config-state.js +7 -0
  49. package/dist/tooling-telemetry/data-processor.d.ts +23 -0
  50. package/dist/tooling-telemetry/data-processor.js +354 -0
  51. package/dist/tooling-telemetry/index.d.ts +5 -0
  52. package/dist/tooling-telemetry/index.js +23 -0
  53. package/dist/tooling-telemetry/telemetry-client.d.ts +65 -0
  54. package/dist/tooling-telemetry/telemetry-client.js +118 -0
  55. package/dist/tooling-telemetry/telemetry-settings.d.ts +22 -0
  56. package/dist/tooling-telemetry/telemetry-settings.js +180 -0
  57. package/dist/tooling-telemetry/types.d.ts +92 -0
  58. package/dist/tooling-telemetry/types.js +40 -0
  59. package/package.json +60 -0
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getTelemetrySetting = exports.setEnableTelemetry = exports.initTelemetrySettings = void 0;
16
+ const reporting_1 = require("../base/utils/reporting");
17
+ const store_1 = require("@sap-ux/store");
18
+ const btp_utils_1 = require("@sap-ux/btp-utils");
19
+ const os_1 = __importDefault(require("os"));
20
+ const path_1 = __importDefault(require("path"));
21
+ const fs_1 = __importDefault(require("fs"));
22
+ const data_processor_1 = require("./data-processor");
23
+ const config_state_1 = require("../base/config-state");
24
+ const config_state_2 = require("./config-state");
25
+ const deprecatedSettingPaths = {
26
+ win32: '\\AppData\\Roaming\\Code\\User\\settings.json',
27
+ darwin: '/Library/Application Support/Code/User/settings.json',
28
+ linux: '/.config/Code/User/settings.json',
29
+ theia: '/.theia/settings.json'
30
+ };
31
+ const deprecatedExtensionPropKeys = [
32
+ 'sap.ux.annotation.lsp.enableTelemetry',
33
+ 'sap.ux.applicationModeler.enableTelemetry',
34
+ 'sap.ux.help.enableTelemetry',
35
+ 'sap.ux.serviceModeler.enableTelemetry'
36
+ ];
37
+ const definePath = (paths) => {
38
+ const platform = process.platform;
39
+ let settingsPath = paths[platform];
40
+ if ((0, btp_utils_1.isAppStudio)()) {
41
+ settingsPath = paths.theia;
42
+ }
43
+ if (!settingsPath) {
44
+ // no path for unknown platform settings path
45
+ return null;
46
+ }
47
+ const homedir = os_1.default.homedir();
48
+ return path_1.default.join(homedir, settingsPath);
49
+ };
50
+ /**
51
+ * Read telemetry settings from file store.
52
+ *
53
+ * @param storeService Store service that is used for read/write telemetry settings
54
+ */
55
+ function readEnableTelemetry(storeService) {
56
+ return __awaiter(this, void 0, void 0, function* () {
57
+ let setting;
58
+ try {
59
+ setting = yield storeService.read(new store_1.TelemetrySettingKey());
60
+ }
61
+ catch (_a) {
62
+ // ignore read failure, assume file doens't exist and thus setting is undefined
63
+ }
64
+ if (!setting) {
65
+ // If no telemetry setting found in .fioritools folder,
66
+ // check telemetry setting in vscode settings for extensions
67
+ const deprecatedSettingPath = definePath(deprecatedSettingPaths);
68
+ if (!deprecatedSettingPath) {
69
+ // If no vscode setting found, default central telemetry setting to true
70
+ yield setEnableTelemetry(true);
71
+ }
72
+ else {
73
+ // If deprecated vscode setting exists, set central telemetry setting to false if any of vscode setting was false
74
+ let content;
75
+ try {
76
+ content = yield fs_1.default.promises.readFile(deprecatedSettingPath, 'utf-8');
77
+ const deprecatedSetting = JSON.parse(content);
78
+ const propValues = deprecatedExtensionPropKeys.map((propKey) => { var _a; return ((_a = deprecatedSetting[propKey]) !== null && _a !== void 0 ? _a : true); });
79
+ const deprecatedEnableTelemetrySetting = propValues.reduce((prevValue, currentValue) => prevValue && currentValue);
80
+ yield setEnableTelemetry(deprecatedEnableTelemetrySetting);
81
+ }
82
+ catch (_b) {
83
+ // ignore read failure and content is undefined
84
+ yield setEnableTelemetry(true);
85
+ }
86
+ }
87
+ }
88
+ else {
89
+ config_state_1.TelemetrySettings.telemetryEnabled = setting.enableTelemetry;
90
+ }
91
+ });
92
+ }
93
+ /**
94
+ * Watch changes to telemetry setting in the store and update runtime settings accordingly.
95
+ *
96
+ * @param storeService Store service that is used for read/write telemetry settings
97
+ */
98
+ function watchTelemetrySettingStore(storeService) {
99
+ (0, store_1.getFilesystemWatcherFor)(store_1.Entity.TelemetrySetting, () => {
100
+ storeService
101
+ .read(new store_1.TelemetrySettingKey())
102
+ .then((watchedSetting) => {
103
+ if (watchedSetting) {
104
+ config_state_1.TelemetrySettings.telemetryEnabled = watchedSetting.enableTelemetry;
105
+ }
106
+ })
107
+ .catch(() => {
108
+ // Failed to read file changes, nothing can be done here.
109
+ });
110
+ });
111
+ }
112
+ /**
113
+ * Telemetry API function to init settings.
114
+ *
115
+ * @param options Settings pass from the consumer module.
116
+ */
117
+ const initTelemetrySettings = (options) => __awaiter(void 0, void 0, void 0, function* () {
118
+ var _a;
119
+ try {
120
+ config_state_1.TelemetrySettings.azureInstrumentationKey = options.resourceId;
121
+ config_state_1.TelemetrySettings.consumerModuleName = options.consumerModule.name;
122
+ config_state_1.TelemetrySettings.consumerModuleVersion = options.consumerModule.version;
123
+ config_state_2.ToolingTelemetrySettings.internalFeature = (_a = options.internalFeature) !== null && _a !== void 0 ? _a : false;
124
+ const storeService = yield (0, store_1.getService)({
125
+ entityName: 'telemetrySetting'
126
+ });
127
+ yield readEnableTelemetry(storeService);
128
+ watchTelemetrySettingStore(storeService);
129
+ }
130
+ catch (err) {
131
+ (0, reporting_1.reportRuntimeError)(err);
132
+ }
133
+ });
134
+ exports.initTelemetrySettings = initTelemetrySettings;
135
+ /**
136
+ * Toggle on/off enable telemetry setting. This will update telemetry settings file
137
+ * and the runtime setting.
138
+ *
139
+ * @param enableTelemetry Telemetry is enabled or not
140
+ */
141
+ function setEnableTelemetry(enableTelemetry) {
142
+ return __awaiter(this, void 0, void 0, function* () {
143
+ try {
144
+ const storeService = yield (0, store_1.getService)({
145
+ entityName: 'telemetrySetting'
146
+ });
147
+ const setting = new store_1.TelemetrySetting({ enableTelemetry });
148
+ yield storeService.write(setting);
149
+ config_state_1.TelemetrySettings.telemetryEnabled = enableTelemetry;
150
+ }
151
+ catch (_a) {
152
+ // Telemetry settings could not be written
153
+ }
154
+ const commonProperties = yield (0, data_processor_1.getCommonProperties)();
155
+ (0, reporting_1.reportEnableTelemetryOnOff)(enableTelemetry, commonProperties);
156
+ });
157
+ }
158
+ exports.setEnableTelemetry = setEnableTelemetry;
159
+ /**
160
+ * Get telemetry settings.
161
+ *
162
+ * @returns Telemetry settings of context module that consumes telemetry library
163
+ */
164
+ function getTelemetrySetting() {
165
+ return __awaiter(this, void 0, void 0, function* () {
166
+ let setting;
167
+ try {
168
+ const storeService = yield (0, store_1.getService)({
169
+ entityName: 'telemetrySetting'
170
+ });
171
+ setting = yield storeService.read(new store_1.TelemetrySettingKey());
172
+ }
173
+ catch (_a) {
174
+ // ignore if settings could not be read, return undefined
175
+ }
176
+ return setting;
177
+ });
178
+ }
179
+ exports.getTelemetrySetting = getTelemetrySetting;
180
+ //# sourceMappingURL=telemetry-settings.js.map
@@ -0,0 +1,92 @@
1
+ import type { ProjectInfo } from '../base/types';
2
+ import type { AppType } from '@sap-ux/project-access/dist/types';
3
+ export type TelemetryHelperProperties = {
4
+ appPath: string;
5
+ };
6
+ /**
7
+ * Type exposed via telemetry API. The following paramters can be provided by developer who
8
+ * calls telemetry API.
9
+ *
10
+ * - resourceId: Id of cloud telemetry resource (e.g. Azure application insights resource is supported)
11
+ * - consumerModule: name and version of module that uses telemetry library
12
+ * - internalFeature: if UX tooling InternalFeature is enabled
13
+ *
14
+ */
15
+ export type ToolsSuiteTelemetryInitSettings = {
16
+ resourceId: string;
17
+ consumerModule: ProjectInfo;
18
+ internalFeature: boolean;
19
+ };
20
+ export declare enum ToolsId {
21
+ UNKNOWN = "UNKNOWN",
22
+ NO_TOOLS_ID = "NO_TOOLS_ID"
23
+ }
24
+ export declare enum ODataSource {
25
+ CAPJava = "CAPJava",
26
+ CAPNode = "CAPNode",
27
+ ABAP = "ABAP",
28
+ UNKNOWN = "UNKNOWN"
29
+ }
30
+ export declare enum DeployTarget {
31
+ CF = "CF",
32
+ ABAP = "ABAP",
33
+ UNKNOWN_DEPLOY_CONFIG = "UNKNOWN_DEPLOY_CONFIG",
34
+ NO_DEPLOY_CONFIG = "NO_DEPLOY_CONFIG"
35
+ }
36
+ export declare enum CommonProperties {
37
+ DevSpace = "cmn.devspace",
38
+ AppStudio = "cmn.appstudio",
39
+ AppStudioBackwardCompatible = "appstudio",
40
+ InternlVsExternal = "cmn.internalFeatures",
41
+ InternlVsExternalBackwardCompatible = "internalVsExternal",
42
+ TemplateType = "cmn.template",
43
+ DeployTargetType = "cmn.deployTarget",
44
+ ODataSourceType = "cmn.odataSource",
45
+ AppToolsId = "cmn.toolsId",
46
+ NodeVersion = "cmn.nodeVersion",
47
+ AppProgrammingLanguage = "cmn.appLanguage",
48
+ TemplateId = "cmn.templateId",
49
+ TemplateVersion = "cmn.templateVersion",
50
+ ApplicationType = "cmn.applicationType"
51
+ }
52
+ export type InternalFeature = 'internal' | 'external';
53
+ export interface CommonTelemetryProperties extends TelemetryProperties {
54
+ v: string;
55
+ datetime: string;
56
+ }
57
+ export interface CommonFioriProjectProperties extends TelemetryProperties {
58
+ [CommonProperties.DevSpace]: string;
59
+ [CommonProperties.AppStudio]: boolean;
60
+ [CommonProperties.AppStudioBackwardCompatible]: boolean;
61
+ [CommonProperties.InternlVsExternal]: InternalFeature;
62
+ [CommonProperties.InternlVsExternalBackwardCompatible]: InternalFeature;
63
+ [CommonProperties.TemplateType]: string;
64
+ [CommonProperties.DeployTargetType]: DeployTarget;
65
+ [CommonProperties.ODataSourceType]: ODataSource;
66
+ [CommonProperties.AppToolsId]: string;
67
+ [CommonProperties.NodeVersion]: string;
68
+ [CommonProperties.AppProgrammingLanguage]: string;
69
+ [CommonProperties.TemplateId]: string;
70
+ [CommonProperties.TemplateVersion]: string;
71
+ [CommonProperties.ApplicationType]: AppType;
72
+ }
73
+ export interface TelemetryProperties {
74
+ [key: string]: string | boolean;
75
+ }
76
+ export interface TelemetryMeasurements {
77
+ [key: string]: number;
78
+ }
79
+ export type TelemetryEvent = {
80
+ eventName: string;
81
+ properties: TelemetryProperties;
82
+ measurements: TelemetryMeasurements;
83
+ };
84
+ /**
85
+ * sourceTemplate information in Fiori app manifest.json file.
86
+ */
87
+ export interface SourceTemplate {
88
+ id?: string;
89
+ version?: string;
90
+ toolsId?: string;
91
+ }
92
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommonProperties = exports.DeployTarget = exports.ODataSource = exports.ToolsId = void 0;
4
+ var ToolsId;
5
+ (function (ToolsId) {
6
+ ToolsId["UNKNOWN"] = "UNKNOWN";
7
+ ToolsId["NO_TOOLS_ID"] = "NO_TOOLS_ID";
8
+ })(ToolsId = exports.ToolsId || (exports.ToolsId = {}));
9
+ var ODataSource;
10
+ (function (ODataSource) {
11
+ ODataSource["CAPJava"] = "CAPJava";
12
+ ODataSource["CAPNode"] = "CAPNode";
13
+ ODataSource["ABAP"] = "ABAP";
14
+ ODataSource["UNKNOWN"] = "UNKNOWN";
15
+ })(ODataSource = exports.ODataSource || (exports.ODataSource = {}));
16
+ var DeployTarget;
17
+ (function (DeployTarget) {
18
+ DeployTarget["CF"] = "CF";
19
+ DeployTarget["ABAP"] = "ABAP";
20
+ DeployTarget["UNKNOWN_DEPLOY_CONFIG"] = "UNKNOWN_DEPLOY_CONFIG";
21
+ DeployTarget["NO_DEPLOY_CONFIG"] = "NO_DEPLOY_CONFIG";
22
+ })(DeployTarget = exports.DeployTarget || (exports.DeployTarget = {}));
23
+ var CommonProperties;
24
+ (function (CommonProperties) {
25
+ CommonProperties["DevSpace"] = "cmn.devspace";
26
+ CommonProperties["AppStudio"] = "cmn.appstudio";
27
+ CommonProperties["AppStudioBackwardCompatible"] = "appstudio";
28
+ CommonProperties["InternlVsExternal"] = "cmn.internalFeatures";
29
+ CommonProperties["InternlVsExternalBackwardCompatible"] = "internalVsExternal";
30
+ CommonProperties["TemplateType"] = "cmn.template";
31
+ CommonProperties["DeployTargetType"] = "cmn.deployTarget";
32
+ CommonProperties["ODataSourceType"] = "cmn.odataSource";
33
+ CommonProperties["AppToolsId"] = "cmn.toolsId";
34
+ CommonProperties["NodeVersion"] = "cmn.nodeVersion";
35
+ CommonProperties["AppProgrammingLanguage"] = "cmn.appLanguage";
36
+ CommonProperties["TemplateId"] = "cmn.templateId";
37
+ CommonProperties["TemplateVersion"] = "cmn.templateVersion";
38
+ CommonProperties["ApplicationType"] = "cmn.applicationType";
39
+ })(CommonProperties = exports.CommonProperties || (exports.CommonProperties = {}));
40
+ //# sourceMappingURL=types.js.map
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@sap-ux/telemetry",
3
+ "version": "0.2.0",
4
+ "description": "Library for sending usage telemetry data",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/SAP/open-ux-tools.git",
8
+ "directory": "packages/telemetry"
9
+ },
10
+ "bugs": {
11
+ "url": "https://github.com/SAP/open-ux-tools/issues?q=is%3Aopen+is%3Aissue+label%3Abug+label%3Atelemetry"
12
+ },
13
+ "license": "Apache-2.0",
14
+ "private": false,
15
+ "main": "dist/index.js",
16
+ "dependencies": {
17
+ "@sap/ux-specification": "1.108.18",
18
+ "applicationinsights": "2.9.0",
19
+ "axios": "1.6.0",
20
+ "performance-now": "2.1.0",
21
+ "yaml": "2.3.3",
22
+ "@sap-ux/store": "0.4.0",
23
+ "@sap-ux/project-access": "1.16.2",
24
+ "@sap-ux/btp-utils": "0.12.1",
25
+ "@sap-ux/ui5-config": "0.21.0",
26
+ "@sap-ux/logger": "0.4.0"
27
+ },
28
+ "devDependencies": {
29
+ "jest-extended": "3.2.4",
30
+ "memfs": "3.4.13",
31
+ "ts-jest": "29.1.1",
32
+ "ts-node": "8.5.2",
33
+ "typescript": "4.9.5",
34
+ "unionfs": "4.4.0",
35
+ "dotenv": "16.3.1"
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "LICENSE",
40
+ "!dist/*.map",
41
+ "!dist/**/*.map"
42
+ ],
43
+ "engines": {
44
+ "pnpm": ">=6.26.1 < 7.0.0 || >=7.1.0",
45
+ "node": ">=18.x"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc --build",
49
+ "watch": "tsc --watch",
50
+ "clean": "rimraf --glob dist coverage *.tsbuildinfo",
51
+ "format": "prettier --write '**/*.{js,json,ts,yaml,yml}' --ignore-path ../../.prettierignore",
52
+ "lint": "eslint . --ext .ts",
53
+ "lint:fix": "eslint . --ext .ts --fix",
54
+ "test": "jest --ci --forceExit --detectOpenHandles --colors",
55
+ "test-u": "jest --ci --forceExit --detectOpenHandles --colors -u",
56
+ "link": "pnpm link --global",
57
+ "unlink": "pnpm unlink --global",
58
+ "example": "ts-node example/index.ts"
59
+ }
60
+ }