@sap-ux/fiori-generator-shared 0.6.3 → 0.7.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.
@@ -4,4 +4,13 @@
4
4
  * @returns true if it is a cli environment, false otherwise
5
5
  */
6
6
  export declare function isCli(): boolean;
7
+ /**
8
+ * Determine if the current prompting environment is cli or a hosted extension (app studio or vscode).
9
+ *
10
+ * @returns the platform name and technical name
11
+ */
12
+ export declare function getHostEnvironment(): {
13
+ name: string;
14
+ technical: string;
15
+ };
7
16
  //# sourceMappingURL=environment.d.ts.map
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isCli = isCli;
4
+ exports.getHostEnvironment = getHostEnvironment;
5
+ const btp_utils_1 = require("@sap-ux/btp-utils");
6
+ const types_1 = require("./types");
4
7
  /**
5
8
  * Determine if the current prompting environment is cli .
6
9
  *
@@ -14,4 +17,15 @@ function isCli() {
14
17
  return false;
15
18
  }
16
19
  }
20
+ /**
21
+ * Determine if the current prompting environment is cli or a hosted extension (app studio or vscode).
22
+ *
23
+ * @returns the platform name and technical name
24
+ */
25
+ function getHostEnvironment() {
26
+ if (isCli()) {
27
+ return types_1.hostEnvironment.cli;
28
+ }
29
+ return (0, btp_utils_1.isAppStudio)() ? types_1.hostEnvironment.bas : types_1.hostEnvironment.vscode;
30
+ }
17
31
  //# sourceMappingURL=environment.js.map
package/dist/index.d.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  export * from './cap';
2
2
  export * from './environment';
3
+ export * from './logWrapper';
4
+ export * from './system-utils';
5
+ export * from './telemetry';
3
6
  export { getPackageScripts } from './getPackageScripts';
4
7
  export { getBootstrapResourceUrls, getDefaultTargetFolder } from './helpers';
5
8
  export { generateReadMe } from './read-me';
6
- export * from './system-utils';
7
- export { PackageJsonScripts, YeomanEnvironment, VSCodeInstance } from './types';
8
- export * from './logWrapper';
9
+ export { getHostEnvironment } from './environment';
10
+ export { isExtensionInstalled } from './installedCheck';
11
+ export { PackageJsonScripts, YeomanEnvironment, VSCodeInstance, hostEnvironment } from './types';
9
12
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -14,9 +14,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.generateReadMe = exports.getDefaultTargetFolder = exports.getBootstrapResourceUrls = exports.getPackageScripts = void 0;
17
+ exports.hostEnvironment = exports.isExtensionInstalled = exports.getHostEnvironment = exports.generateReadMe = exports.getDefaultTargetFolder = exports.getBootstrapResourceUrls = exports.getPackageScripts = void 0;
18
18
  __exportStar(require("./cap"), exports);
19
19
  __exportStar(require("./environment"), exports);
20
+ __exportStar(require("./logWrapper"), exports);
21
+ __exportStar(require("./system-utils"), exports);
22
+ __exportStar(require("./telemetry"), exports);
20
23
  var getPackageScripts_1 = require("./getPackageScripts");
21
24
  Object.defineProperty(exports, "getPackageScripts", { enumerable: true, get: function () { return getPackageScripts_1.getPackageScripts; } });
22
25
  var helpers_1 = require("./helpers");
@@ -24,6 +27,10 @@ Object.defineProperty(exports, "getBootstrapResourceUrls", { enumerable: true, g
24
27
  Object.defineProperty(exports, "getDefaultTargetFolder", { enumerable: true, get: function () { return helpers_1.getDefaultTargetFolder; } });
25
28
  var read_me_1 = require("./read-me");
26
29
  Object.defineProperty(exports, "generateReadMe", { enumerable: true, get: function () { return read_me_1.generateReadMe; } });
27
- __exportStar(require("./system-utils"), exports);
28
- __exportStar(require("./logWrapper"), exports);
30
+ var environment_1 = require("./environment");
31
+ Object.defineProperty(exports, "getHostEnvironment", { enumerable: true, get: function () { return environment_1.getHostEnvironment; } });
32
+ var installedCheck_1 = require("./installedCheck");
33
+ Object.defineProperty(exports, "isExtensionInstalled", { enumerable: true, get: function () { return installedCheck_1.isExtensionInstalled; } });
34
+ var types_1 = require("./types");
35
+ Object.defineProperty(exports, "hostEnvironment", { enumerable: true, get: function () { return types_1.hostEnvironment; } });
29
36
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Check for an installed extension, optionally specifying a minimum version.
3
+ * Note, this does not check for activation state of specified extension.
4
+ *
5
+ * @param vscode - vscode instance
6
+ * @param extensionId - the id of the extension to find
7
+ * @param minVersion - the minimum version of the specified extension, lower versions will not be returned. Must be a valid SemVer string.
8
+ * @returns true if the extension is installed and the version is >= minVersion (if provided), false otherwise
9
+ */
10
+ export declare function isExtensionInstalled(vscode: any, extensionId: string, minVersion?: string): boolean;
11
+ //# sourceMappingURL=installedCheck.d.ts.map
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isExtensionInstalled = isExtensionInstalled;
4
+ const semver_1 = require("semver");
5
+ /**
6
+ * Check for an installed extension, optionally specifying a minimum version.
7
+ * Note, this does not check for activation state of specified extension.
8
+ *
9
+ * @param vscode - vscode instance
10
+ * @param extensionId - the id of the extension to find
11
+ * @param minVersion - the minimum version of the specified extension, lower versions will not be returned. Must be a valid SemVer string.
12
+ * @returns true if the extension is installed and the version is >= minVersion (if provided), false otherwise
13
+ */
14
+ function isExtensionInstalled(vscode, extensionId, minVersion) {
15
+ const foundExt = vscode?.extensions?.getExtension(extensionId);
16
+ if (foundExt) {
17
+ const extVersion = (0, semver_1.coerce)(foundExt.packageJSON.version);
18
+ if (extVersion) {
19
+ // Check installed ver is >= minVersion or return true if minVersion is not specified
20
+ return !(minVersion && (0, semver_1.lt)(extVersion, minVersion));
21
+ }
22
+ }
23
+ return false;
24
+ }
25
+ //# sourceMappingURL=installedCheck.js.map
@@ -0,0 +1,3 @@
1
+ export { sendTelemetry, sendTelemetryBlocking } from './utils';
2
+ export * from './telemetryHelper';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.sendTelemetryBlocking = exports.sendTelemetry = void 0;
18
+ var utils_1 = require("./utils");
19
+ Object.defineProperty(exports, "sendTelemetry", { enumerable: true, get: function () { return utils_1.sendTelemetry; } });
20
+ Object.defineProperty(exports, "sendTelemetryBlocking", { enumerable: true, get: function () { return utils_1.sendTelemetryBlocking; } });
21
+ __exportStar(require("./telemetryHelper"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,41 @@
1
+ import { type TelemetryProperties, type ToolsSuiteTelemetryInitSettings } from '@sap-ux/telemetry';
2
+ import type { TelemetryData } from './types';
3
+ /**
4
+ * Helper class for intialising and preparing event data for telemetry.
5
+ */
6
+ export declare abstract class TelemetryHelper {
7
+ private static _telemetryData;
8
+ private static _previousEventTimestamp;
9
+ /**
10
+ * Returns the telemetry data.
11
+ *
12
+ * @returns telemetry data
13
+ */
14
+ static get telemetryData(): TelemetryData;
15
+ /**
16
+ * Load telemetry settings.
17
+ *
18
+ * @param options - tools suite telemetry init settings
19
+ */
20
+ static initTelemetrySettings(options: ToolsSuiteTelemetryInitSettings): Promise<void>;
21
+ /**
22
+ * Creates telemetry data and adds default telemetry props.
23
+ *
24
+ * @param additionalData - set additional properties to be reported by telemetry
25
+ * @param filterDups - filters duplicates by returning undefined if it's suspected to be a repeated event based on previous telemetry data & timestamp (1 second)
26
+ * @returns telemetry data
27
+ */
28
+ static createTelemetryData<T extends TelemetryProperties>(additionalData?: Partial<T>, filterDups?: boolean): TelemetryData | undefined;
29
+ /**
30
+ * Marks the start time. Example usage:
31
+ * At the start of of the writing phase of the yeoman generator.
32
+ * It should not be updated everytime calling createTelemetryData().
33
+ */
34
+ static markAppGenStartTime(): void;
35
+ /**
36
+ * Marks the end time. Example usage:
37
+ * At the end of the writing phase of yeoman generator.
38
+ */
39
+ static markAppGenEndTime(): void;
40
+ }
41
+ //# sourceMappingURL=telemetryHelper.d.ts.map
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TelemetryHelper = void 0;
7
+ const telemetry_1 = require("@sap-ux/telemetry");
8
+ const environment_1 = require("../environment");
9
+ const os_name_1 = __importDefault(require("os-name"));
10
+ const i18n_1 = require("../i18n");
11
+ /**
12
+ * Helper class for intialising and preparing event data for telemetry.
13
+ */
14
+ class TelemetryHelper {
15
+ static _telemetryData;
16
+ static _previousEventTimestamp;
17
+ /**
18
+ * Returns the telemetry data.
19
+ *
20
+ * @returns telemetry data
21
+ */
22
+ static get telemetryData() {
23
+ return this._telemetryData;
24
+ }
25
+ /**
26
+ * Load telemetry settings.
27
+ *
28
+ * @param options - tools suite telemetry init settings
29
+ */
30
+ static async initTelemetrySettings(options) {
31
+ await (0, telemetry_1.initTelemetrySettings)(options);
32
+ }
33
+ /**
34
+ * Creates telemetry data and adds default telemetry props.
35
+ *
36
+ * @param additionalData - set additional properties to be reported by telemetry
37
+ * @param filterDups - filters duplicates by returning undefined if it's suspected to be a repeated event based on previous telemetry data & timestamp (1 second)
38
+ * @returns telemetry data
39
+ */
40
+ static createTelemetryData(additionalData, filterDups = false) {
41
+ const currentTimestamp = new Date().getTime();
42
+ if (!this._previousEventTimestamp) {
43
+ filterDups = false; // can't filter duplicates if no previous event timestamp
44
+ this._previousEventTimestamp = currentTimestamp;
45
+ }
46
+ if (!this._telemetryData) {
47
+ let osVersionName = (0, i18n_1.t)('telemetry.unknownOs');
48
+ try {
49
+ osVersionName = (0, os_name_1.default)();
50
+ }
51
+ catch {
52
+ // no matched os name, possible beta or unreleased version
53
+ }
54
+ this._telemetryData = {
55
+ Platform: (0, environment_1.getHostEnvironment)().technical,
56
+ OperatingSystem: osVersionName
57
+ };
58
+ }
59
+ if (filterDups) {
60
+ const newTelemData = { ...this._telemetryData, ...additionalData };
61
+ if (Math.abs(this._previousEventTimestamp - currentTimestamp) < 1000 &&
62
+ JSON.stringify(newTelemData) === JSON.stringify(this._telemetryData)) {
63
+ return undefined;
64
+ }
65
+ }
66
+ this._previousEventTimestamp = currentTimestamp;
67
+ this._telemetryData = Object.assign(this._telemetryData, additionalData);
68
+ return this._telemetryData;
69
+ }
70
+ /**
71
+ * Marks the start time. Example usage:
72
+ * At the start of of the writing phase of the yeoman generator.
73
+ * It should not be updated everytime calling createTelemetryData().
74
+ */
75
+ static markAppGenStartTime() {
76
+ TelemetryHelper.createTelemetryData({
77
+ markName: telemetry_1.PerformanceMeasurementAPI.startMark('LOADING_TIME')
78
+ });
79
+ }
80
+ /**
81
+ * Marks the end time. Example usage:
82
+ * At the end of the writing phase of yeoman generator.
83
+ */
84
+ static markAppGenEndTime() {
85
+ if (this._telemetryData?.markName) {
86
+ telemetry_1.PerformanceMeasurementAPI.endMark(this._telemetryData.markName);
87
+ telemetry_1.PerformanceMeasurementAPI.measure(this._telemetryData.markName);
88
+ }
89
+ }
90
+ }
91
+ exports.TelemetryHelper = TelemetryHelper;
92
+ //# sourceMappingURL=telemetryHelper.js.map
@@ -0,0 +1,4 @@
1
+ export interface TelemetryData {
2
+ [key: string]: string;
3
+ }
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,20 @@
1
+ import type { TelemetryData } from './types';
2
+ /**
3
+ * Sends the telemetry event to the telemetry client.
4
+ *
5
+ * @param telemetryEventName - the event name to be reported
6
+ * @param telemetryData - the telemetry data
7
+ * @param appPath - the path of the application
8
+ * @returns - a promise that resolves when the event is sent
9
+ */
10
+ export declare function sendTelemetry(telemetryEventName: string, telemetryData: TelemetryData, appPath?: string): Promise<void>;
11
+ /**
12
+ * Sends the telemetry event to the telemetry client and blocks the execution until the event is sent.
13
+ *
14
+ * @param telemetryEventName - the event name to be reported
15
+ * @param telemetryData - the telemetry data
16
+ * @param appPath - the path of the application
17
+ * @returns - a promise that resolves when the event is sent
18
+ */
19
+ export declare function sendTelemetryBlocking(telemetryEventName: string, telemetryData: TelemetryData, appPath?: string): Promise<void>;
20
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendTelemetry = sendTelemetry;
4
+ exports.sendTelemetryBlocking = sendTelemetryBlocking;
5
+ const telemetry_1 = require("@sap-ux/telemetry");
6
+ const telemetryHelper_1 = require("./telemetryHelper");
7
+ /**
8
+ * Prepares the telemetry event to be sent to the telemetry client.
9
+ *
10
+ * @param telemetryEventName - the event name to be reported
11
+ * @param telemetryData - the telemetry data
12
+ * @returns - the telemetry event
13
+ */
14
+ function prepareTelemetryEvent(telemetryEventName, telemetryData) {
15
+ // Make sure performance measurement end is called
16
+ telemetryHelper_1.TelemetryHelper.markAppGenEndTime();
17
+ const generationTime = telemetryData.markName
18
+ ? telemetry_1.PerformanceMeasurementAPI.getMeasurementDuration(telemetryData.markName)
19
+ : undefined;
20
+ return {
21
+ eventName: telemetryEventName,
22
+ properties: telemetryData,
23
+ measurements: generationTime ? { GenerationTime: generationTime } : {}
24
+ };
25
+ }
26
+ /**
27
+ * Sends the telemetry event to the telemetry client.
28
+ *
29
+ * @param telemetryEventName - the event name to be reported
30
+ * @param telemetryData - the telemetry data
31
+ * @param appPath - the path of the application
32
+ * @returns - a promise that resolves when the event is sent
33
+ */
34
+ async function sendTelemetry(telemetryEventName, telemetryData, appPath) {
35
+ const telemetryEvent = prepareTelemetryEvent(telemetryEventName, telemetryData);
36
+ return telemetry_1.ClientFactory.getTelemetryClient().reportEvent(telemetryEvent, telemetry_1.SampleRate.NoSampling, appPath ? { appPath } : undefined);
37
+ }
38
+ /**
39
+ * Sends the telemetry event to the telemetry client and blocks the execution until the event is sent.
40
+ *
41
+ * @param telemetryEventName - the event name to be reported
42
+ * @param telemetryData - the telemetry data
43
+ * @param appPath - the path of the application
44
+ * @returns - a promise that resolves when the event is sent
45
+ */
46
+ async function sendTelemetryBlocking(telemetryEventName, telemetryData, appPath) {
47
+ const telemetryEvent = prepareTelemetryEvent(telemetryEventName, telemetryData);
48
+ return telemetry_1.ClientFactory.getTelemetryClient().reportEventBlocking(telemetryEvent, telemetry_1.SampleRate.NoSampling, appPath ? { appPath } : undefined);
49
+ }
50
+ //# sourceMappingURL=utils.js.map
@@ -8,5 +8,8 @@
8
8
  },
9
9
  "debug": {
10
10
  "loggingConfigured": "Logging has been configured at log level: {{logLevel}}"
11
+ },
12
+ "telemetry": {
13
+ "unknownOs": "Unknown"
11
14
  }
12
15
  }
package/dist/types.d.ts CHANGED
@@ -110,5 +110,23 @@ export interface PackageScriptsOptions {
110
110
  /** If true, a script for starting the app without flp will be generated. Defaults to true. */
111
111
  generateIndex?: boolean;
112
112
  }
113
+ export declare const hostEnvironment: {
114
+ vscode: {
115
+ name: string;
116
+ technical: string;
117
+ };
118
+ bas: {
119
+ name: string;
120
+ technical: string;
121
+ };
122
+ cli: {
123
+ name: string;
124
+ technical: string;
125
+ };
126
+ };
127
+ export declare enum ApiHubType {
128
+ apiHub = "API_HUB",
129
+ apiHubEnterprise = "API_HUB_ENTERPRISE"
130
+ }
113
131
  export {};
114
132
  //# sourceMappingURL=types.d.ts.map
package/dist/types.js CHANGED
@@ -1,3 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApiHubType = exports.hostEnvironment = void 0;
4
+ exports.hostEnvironment = {
5
+ vscode: {
6
+ name: 'Visual Studio Code',
7
+ technical: 'VSCode'
8
+ },
9
+ bas: {
10
+ name: 'SAP Business Application Studio',
11
+ technical: 'SBAS'
12
+ },
13
+ cli: {
14
+ name: 'CLI',
15
+ technical: 'CLI'
16
+ }
17
+ };
18
+ var ApiHubType;
19
+ (function (ApiHubType) {
20
+ ApiHubType["apiHub"] = "API_HUB";
21
+ ApiHubType["apiHubEnterprise"] = "API_HUB_ENTERPRISE";
22
+ })(ApiHubType || (exports.ApiHubType = ApiHubType = {}));
3
23
  //# sourceMappingURL=types.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sap-ux/fiori-generator-shared",
3
3
  "description": "Commonly used shared functionality and types to support the fiori generator.",
4
- "version": "0.6.3",
4
+ "version": "0.7.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/SAP/open-ux-tools.git",
@@ -22,12 +22,16 @@
22
22
  "logform": "2.4.0",
23
23
  "mem-fs": "2.1.0",
24
24
  "mem-fs-editor": "9.4.0",
25
+ "os-name": "4.0.1",
26
+ "semver": "7.5.4",
25
27
  "@sap-ux/btp-utils": "0.15.2",
26
- "@sap-ux/project-access": "1.28.1"
28
+ "@sap-ux/project-access": "1.28.2",
29
+ "@sap-ux/telemetry": "0.5.36"
27
30
  },
28
31
  "devDependencies": {
29
32
  "@types/mem-fs-editor": "7.0.1",
30
33
  "@types/mem-fs": "1.1.2",
34
+ "@types/semver": "7.5.2",
31
35
  "@types/yeoman-environment": "2.10.11"
32
36
  },
33
37
  "engines": {