@formo/analytics 0.1.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 (91) hide show
  1. package/README.md +141 -0
  2. package/dist/cjs/src/FormoAnalytics.d.ts +30 -0
  3. package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -0
  4. package/dist/cjs/src/FormoAnalytics.js +297 -0
  5. package/dist/cjs/src/FormoAnalytics.js.map +1 -0
  6. package/dist/cjs/src/FormoAnalyticsProvider.d.ts +7 -0
  7. package/dist/cjs/src/FormoAnalyticsProvider.d.ts.map +1 -0
  8. package/dist/cjs/src/FormoAnalyticsProvider.js +45 -0
  9. package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -0
  10. package/dist/cjs/src/constants/config.d.ts +430 -0
  11. package/dist/cjs/src/constants/config.d.ts.map +1 -0
  12. package/dist/cjs/src/constants/config.js +433 -0
  13. package/dist/cjs/src/constants/config.js.map +1 -0
  14. package/dist/cjs/src/constants/index.d.ts +2 -0
  15. package/dist/cjs/src/constants/index.d.ts.map +1 -0
  16. package/dist/cjs/src/constants/index.js +18 -0
  17. package/dist/cjs/src/constants/index.js.map +1 -0
  18. package/dist/cjs/src/index.d.ts +4 -0
  19. package/dist/cjs/src/index.d.ts.map +1 -0
  20. package/dist/cjs/src/index.js +20 -0
  21. package/dist/cjs/src/index.js.map +1 -0
  22. package/dist/cjs/src/types/base.d.ts +8 -0
  23. package/dist/cjs/src/types/base.d.ts.map +1 -0
  24. package/dist/cjs/src/types/base.js +3 -0
  25. package/dist/cjs/src/types/base.js.map +1 -0
  26. package/dist/cjs/src/types/index.d.ts +2 -0
  27. package/dist/cjs/src/types/index.d.ts.map +1 -0
  28. package/dist/cjs/src/types/index.js +18 -0
  29. package/dist/cjs/src/types/index.js.map +1 -0
  30. package/dist/cjs/src/utils/index.d.ts +2 -0
  31. package/dist/cjs/src/utils/index.d.ts.map +1 -0
  32. package/dist/cjs/src/utils/index.js +18 -0
  33. package/dist/cjs/src/utils/index.js.map +1 -0
  34. package/dist/cjs/src/utils/isNotEmptyObject.d.ts +2 -0
  35. package/dist/cjs/src/utils/isNotEmptyObject.d.ts.map +1 -0
  36. package/dist/cjs/src/utils/isNotEmptyObject.js +10 -0
  37. package/dist/cjs/src/utils/isNotEmptyObject.js.map +1 -0
  38. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  39. package/dist/esm/src/FormoAnalytics.d.ts +30 -0
  40. package/dist/esm/src/FormoAnalytics.d.ts.map +1 -0
  41. package/dist/esm/src/FormoAnalytics.js +291 -0
  42. package/dist/esm/src/FormoAnalytics.js.map +1 -0
  43. package/dist/esm/src/FormoAnalyticsProvider.d.ts +7 -0
  44. package/dist/esm/src/FormoAnalyticsProvider.d.ts.map +1 -0
  45. package/dist/esm/src/FormoAnalyticsProvider.js +40 -0
  46. package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -0
  47. package/dist/esm/src/constants/config.d.ts +430 -0
  48. package/dist/esm/src/constants/config.d.ts.map +1 -0
  49. package/dist/esm/src/constants/config.js +430 -0
  50. package/dist/esm/src/constants/config.js.map +1 -0
  51. package/dist/esm/src/constants/index.d.ts +2 -0
  52. package/dist/esm/src/constants/index.d.ts.map +1 -0
  53. package/dist/esm/src/constants/index.js +2 -0
  54. package/dist/esm/src/constants/index.js.map +1 -0
  55. package/dist/esm/src/index.d.ts +4 -0
  56. package/dist/esm/src/index.d.ts.map +1 -0
  57. package/dist/esm/src/index.js +4 -0
  58. package/dist/esm/src/index.js.map +1 -0
  59. package/dist/esm/src/types/base.d.ts +8 -0
  60. package/dist/esm/src/types/base.d.ts.map +1 -0
  61. package/dist/esm/src/types/base.js +2 -0
  62. package/dist/esm/src/types/base.js.map +1 -0
  63. package/dist/esm/src/types/index.d.ts +2 -0
  64. package/dist/esm/src/types/index.d.ts.map +1 -0
  65. package/dist/esm/src/types/index.js +2 -0
  66. package/dist/esm/src/types/index.js.map +1 -0
  67. package/dist/esm/src/utils/index.d.ts +2 -0
  68. package/dist/esm/src/utils/index.d.ts.map +1 -0
  69. package/dist/esm/src/utils/index.js +2 -0
  70. package/dist/esm/src/utils/index.js.map +1 -0
  71. package/dist/esm/src/utils/isNotEmptyObject.d.ts +2 -0
  72. package/dist/esm/src/utils/isNotEmptyObject.d.ts.map +1 -0
  73. package/dist/esm/src/utils/isNotEmptyObject.js +6 -0
  74. package/dist/esm/src/utils/isNotEmptyObject.js.map +1 -0
  75. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  76. package/dist/index.umd.min.js +3 -0
  77. package/dist/index.umd.min.js.LICENSE.txt +19 -0
  78. package/dist/index.umd.min.js.map +1 -0
  79. package/package.json +89 -0
  80. package/src/FormoAnalytics.ts +264 -0
  81. package/src/FormoAnalyticsProvider.tsx +54 -0
  82. package/src/constants/config.ts +429 -0
  83. package/src/constants/index.ts +1 -0
  84. package/src/global.d.ts +8 -0
  85. package/src/index.ts +3 -0
  86. package/src/types/base.ts +6 -0
  87. package/src/types/index.ts +1 -0
  88. package/src/utils/index.ts +1 -0
  89. package/src/utils/isNotEmptyObject.ts +5 -0
  90. package/tsconfig.json +28 -0
  91. package/webpack.config.ts +23 -0
package/README.md ADDED
@@ -0,0 +1,141 @@
1
+ # Installation Guide
2
+
3
+ ## Option 1 - tracking code
4
+
5
+ ---
6
+
7
+ Add the following to your `index.html`:
8
+
9
+ ```html
10
+ <script>
11
+ const script = document.createElement('script');
12
+ const apiKey = 'YOUR_API_KEY';
13
+ const projectId = 'YOUR_PROJECT_ID';
14
+
15
+ script.src = 'https://unpkg.com/@formo/analytics';
16
+ script.onload = function () {
17
+ FormoAnalytics.init(apiKey, projectId).then((sdkInstance) => window.formo = sdkInstance);
18
+ };
19
+ document.head.appendChild(script);
20
+ </script>
21
+ ```
22
+
23
+ ## Option 2 - using npm package
24
+
25
+ ---
26
+
27
+ 1. Install the npm package:
28
+
29
+ ```
30
+ yarn add @formo/analytics
31
+ ```
32
+
33
+ or
34
+
35
+ ```
36
+ npm install @formo/analytics --save
37
+ ```
38
+
39
+ 2. Set up the `FormoAnalyticsProvider` in your application:
40
+
41
+ ```jsx
42
+ // FormoAnalyticsProvider.tsx
43
+
44
+ 'use client';
45
+
46
+ import { FormoAnalytics, FormoAnalyticsProvider } from '@formo/analytics';
47
+ import React, { FC, useEffect } from 'react';
48
+
49
+ type FormoAnalyticsProviderProps = {
50
+ apiKey: string;
51
+ projectId: string;
52
+ children: React.ReactNode;
53
+ };
54
+
55
+ // The provider component
56
+ export const AnalyticsProvider: FC<FormoAnalyticsProviderProps> = ({
57
+ apiKey,
58
+ projectId,
59
+ children,
60
+ }) => {
61
+ // Initialize the FormoAnalytics SDK inside useEffect
62
+ useEffect(() => {
63
+ const initialize = async () => {
64
+ try {
65
+ await FormoAnalytics.init(apiKey, projectId);
66
+ console.log('FormoAnalytics SDK initialized');
67
+ } catch (error) {
68
+ console.error('Failed to initialize FormoAnalytics SDK', error);
69
+ }
70
+ };
71
+
72
+ initialize();
73
+ }, [apiKey]);
74
+
75
+ return (
76
+ <FormoAnalyticsProvider apiKey={apiKey} projectId={projectId}>
77
+ {children}
78
+ </FormoAnalyticsProvider>
79
+ );
80
+ };
81
+
82
+ export default AnalyticsProvider;
83
+ ```
84
+
85
+ 1. Integrating the Provider in Your Layout
86
+ Wrap your application with the `AnalyticsProvider` in your main layout file:
87
+
88
+ ```jsx
89
+ import { FormoAnalyticsProvider } from './FormoAnalyticsProvider';
90
+
91
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
92
+ return (
93
+ <html lang="en">
94
+ <body>
95
+ <FormoAnalyticsProvider
96
+ apiKey="YOUR_API_KEY"
97
+ projectId="formo"
98
+ >
99
+ Your Page Content
100
+ </FormoAnalyticsProvider>
101
+ </body>
102
+ </html>
103
+ );
104
+ }
105
+ ```
106
+
107
+ 3. Using the SDK
108
+ Once the SDK is initialized, you can use its methods to track events and user interactions. Here’s how to do that:
109
+
110
+ ```jsx
111
+ import { useFormoAnalytics } from '@formo/analytics';
112
+ import React, { useEffect } from 'react';
113
+
114
+ const YourComponent = () => {
115
+ const analytics = useFormoAnalytics();
116
+
117
+ useEffect(() => {
118
+ const initialize = async () => {
119
+ try {
120
+ console.log('Tracking page hit...');
121
+ analytics.page(); // Track the page view
122
+ analytics.track('custom_event', { key: 'value' }); // Track a custom event
123
+ } catch (error) {
124
+ console.error('Failed to track page hit', error);
125
+ }
126
+ };
127
+
128
+ initialize();
129
+ }, [analytics]);
130
+
131
+ return <div>Your Component Content</div>;
132
+ };
133
+ ```
134
+
135
+ # Development notes
136
+
137
+ To run a local version of the script:
138
+
139
+ 1. Run `yarn build-cjs && yarn build-esm && yarn webpack --mode=production` or `npm run build` at the root level to build the script.
140
+ 2. To authorize device, login into npmjs using `npm login` or `npm adduser`
141
+ 3. Run `yarn publish` or `npm run publish` to publish new versions of the package.
@@ -0,0 +1,30 @@
1
+ interface IFormoAnalytics {
2
+ init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
3
+ identify(userData: any): void;
4
+ page(): void;
5
+ track(eventName: string, eventData: any): void;
6
+ }
7
+ export declare class FormoAnalytics implements IFormoAnalytics {
8
+ readonly apiKey: string;
9
+ projectId: string;
10
+ private config;
11
+ private sessionIdKey;
12
+ private timezoneToCountry;
13
+ private constructor();
14
+ static init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
15
+ private identifyUser;
16
+ private getSessionId;
17
+ private setSessionCookie;
18
+ private generateSessionId;
19
+ private getCookieValue;
20
+ private trackEvent;
21
+ private maskSensitiveData;
22
+ private trackPageHit;
23
+ private buildApiUrl;
24
+ init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
25
+ identify(userData: any): void;
26
+ page(): void;
27
+ track(eventName: string, eventData: any): void;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=FormoAnalytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACjE,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC;CAChD;AACD,qBAAa,cAAe,YAAW,eAAe;aAMlC,MAAM,EAAE,MAAM;IACvB,SAAS,EAAE,MAAM;IAN1B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,iBAAiB,CAAwC;IAEjE,OAAO;WASM,IAAI,CACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAU1B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,cAAc;YAUR,UAAU;IAuDxB,OAAO,CAAC,iBAAiB;IAkEzB,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,WAAW;IAiBnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAMhE,QAAQ,CAAC,QAAQ,EAAE,GAAG;IAItB,IAAI;IAIJ,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;CAGxC"}
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.FormoAnalytics = void 0;
54
+ var axios_1 = __importDefault(require("axios"));
55
+ var constants_1 = require("./constants");
56
+ var utils_1 = require("./utils");
57
+ var FormoAnalytics = /** @class */ (function () {
58
+ function FormoAnalytics(apiKey, projectId) {
59
+ this.apiKey = apiKey;
60
+ this.projectId = projectId;
61
+ this.sessionIdKey = constants_1.SESSION_STORAGE_ID_KEY;
62
+ this.timezoneToCountry = constants_1.COUNTRY_LIST;
63
+ this.config = {
64
+ token: this.apiKey,
65
+ };
66
+ this.trackPageHit();
67
+ }
68
+ FormoAnalytics.init = function (apiKey, projectId) {
69
+ return __awaiter(this, void 0, void 0, function () {
70
+ var config, instance;
71
+ return __generator(this, function (_a) {
72
+ config = {
73
+ token: apiKey,
74
+ };
75
+ instance = new FormoAnalytics(apiKey, projectId);
76
+ instance.config = config;
77
+ return [2 /*return*/, instance];
78
+ });
79
+ });
80
+ };
81
+ FormoAnalytics.prototype.identifyUser = function (userData) {
82
+ this.trackEvent('identify', userData);
83
+ };
84
+ FormoAnalytics.prototype.getSessionId = function () {
85
+ var existingSessionId = this.getCookieValue(this.sessionIdKey);
86
+ if (existingSessionId) {
87
+ return existingSessionId;
88
+ }
89
+ var newSessionId = this.generateSessionId();
90
+ return newSessionId;
91
+ };
92
+ // Function to set the session cookie
93
+ FormoAnalytics.prototype.setSessionCookie = function (domain) {
94
+ var sessionId = this.getSessionId();
95
+ var cookieValue = "".concat(this.sessionIdKey, "=").concat(sessionId, "; Max-Age=1800; path=/; secure");
96
+ if (domain) {
97
+ cookieValue += "; domain=".concat(domain);
98
+ }
99
+ document.cookie = cookieValue;
100
+ };
101
+ // Function to generate a new session ID
102
+ FormoAnalytics.prototype.generateSessionId = function () {
103
+ return crypto.randomUUID();
104
+ };
105
+ // Function to get a cookie value by name
106
+ FormoAnalytics.prototype.getCookieValue = function (name) {
107
+ var cookies = document.cookie.split(';').reduce(function (acc, cookie) {
108
+ var _a = cookie.split('='), key = _a[0], value = _a[1];
109
+ acc[key.trim()] = value;
110
+ return acc;
111
+ }, {});
112
+ return cookies[name];
113
+ };
114
+ // Function to send tracking data
115
+ FormoAnalytics.prototype.trackEvent = function (action, payload) {
116
+ return __awaiter(this, void 0, void 0, function () {
117
+ var maxRetries, attempt, apiUrl, requestData, sendRequest;
118
+ var _this = this;
119
+ return __generator(this, function (_a) {
120
+ switch (_a.label) {
121
+ case 0:
122
+ maxRetries = 3;
123
+ attempt = 0;
124
+ this.setSessionCookie(this.config.domain);
125
+ apiUrl = this.buildApiUrl();
126
+ requestData = {
127
+ project_id: this.projectId,
128
+ address: '',
129
+ session_id: this.getSessionId(),
130
+ timestamp: new Date().toISOString(),
131
+ action: action,
132
+ version: '1',
133
+ payload: (0, utils_1.isNotEmpty)(payload) ? this.maskSensitiveData(payload) : payload,
134
+ };
135
+ console.log('Request data:', JSON.stringify(requestData));
136
+ sendRequest = function () { return __awaiter(_this, void 0, void 0, function () {
137
+ var response, error_1, retryDelay;
138
+ return __generator(this, function (_a) {
139
+ switch (_a.label) {
140
+ case 0:
141
+ _a.trys.push([0, 2, , 3]);
142
+ return [4 /*yield*/, axios_1.default.post(apiUrl, JSON.stringify(requestData), {
143
+ headers: {
144
+ 'Content-Type': 'application/json',
145
+ },
146
+ })];
147
+ case 1:
148
+ response = _a.sent();
149
+ if (response.status >= 200 && response.status < 300) {
150
+ console.log('Event sent successfully:', action);
151
+ }
152
+ else {
153
+ throw new Error("Failed with status: ".concat(response.status));
154
+ }
155
+ return [3 /*break*/, 3];
156
+ case 2:
157
+ error_1 = _a.sent();
158
+ attempt++;
159
+ if (attempt <= maxRetries) {
160
+ retryDelay = Math.pow(2, attempt) * 1000;
161
+ console.error("Attempt ".concat(attempt, ": Retrying event \"").concat(action, "\" in ").concat(retryDelay / 1000, " seconds..."));
162
+ setTimeout(sendRequest, retryDelay);
163
+ }
164
+ else {
165
+ console.error("Event \"".concat(action, "\" failed after ").concat(maxRetries, " attempts. Error: ").concat(error_1));
166
+ }
167
+ return [3 /*break*/, 3];
168
+ case 3: return [2 /*return*/];
169
+ }
170
+ });
171
+ }); };
172
+ // Start the initial request
173
+ return [4 /*yield*/, sendRequest()];
174
+ case 1:
175
+ // Start the initial request
176
+ _a.sent();
177
+ return [2 /*return*/];
178
+ }
179
+ });
180
+ });
181
+ };
182
+ // Function to mask sensitive data in the payload
183
+ FormoAnalytics.prototype.maskSensitiveData = function (data) {
184
+ // Check if data is null or undefined
185
+ if (data === null || data === undefined) {
186
+ console.warn('Data is null or undefined, returning null');
187
+ return null;
188
+ }
189
+ // Check if data is a string; if so, parse it to an object
190
+ if (typeof data === 'string') {
191
+ var parsedData = void 0;
192
+ try {
193
+ parsedData = JSON.parse(data);
194
+ }
195
+ catch (error) {
196
+ console.error('Failed to parse JSON:', error);
197
+ return null; // Return null if parsing fails
198
+ }
199
+ var sensitiveFields = [
200
+ 'username',
201
+ 'user',
202
+ 'user_id',
203
+ 'password',
204
+ 'email',
205
+ 'phone',
206
+ ];
207
+ // Create a new object to store masked data
208
+ var maskedData_1 = __assign({}, parsedData);
209
+ // Mask sensitive fields
210
+ sensitiveFields.forEach(function (field) {
211
+ if (field in maskedData_1) {
212
+ maskedData_1[field] = '********'; // Replace value with masked string
213
+ }
214
+ });
215
+ return maskedData_1; // Return the new object with masked fields
216
+ }
217
+ else if (typeof data === 'object') {
218
+ // If data is already an object, handle masking directly
219
+ var sensitiveFields = [
220
+ 'username',
221
+ 'user',
222
+ 'user_id',
223
+ 'password',
224
+ 'email',
225
+ 'phone',
226
+ ];
227
+ var maskedData_2 = __assign({}, data);
228
+ // Mask sensitive fields
229
+ sensitiveFields.forEach(function (field) {
230
+ if (field in maskedData_2) {
231
+ maskedData_2[field] = '********'; // Replace value with masked string
232
+ }
233
+ });
234
+ return maskedData_2; // Return the new object with masked fields
235
+ }
236
+ return data;
237
+ };
238
+ // Function to track page hits
239
+ FormoAnalytics.prototype.trackPageHit = function () {
240
+ var _this = this;
241
+ if (window.__nightmare || window.navigator.webdriver || window.Cypress)
242
+ return;
243
+ var location;
244
+ var language;
245
+ try {
246
+ var timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
247
+ location = this.timezoneToCountry[timezone];
248
+ language =
249
+ navigator.languages && navigator.languages.length
250
+ ? navigator.languages[0]
251
+ : navigator.language || 'en';
252
+ }
253
+ catch (error) {
254
+ console.error('Error resolving timezone or language:', error);
255
+ }
256
+ setTimeout(function () {
257
+ _this.trackEvent('page_hit', {
258
+ 'user-agent': window.navigator.userAgent,
259
+ locale: language,
260
+ location: location,
261
+ referrer: document.referrer,
262
+ pathname: window.location.pathname,
263
+ href: window.location.href,
264
+ });
265
+ }, 300);
266
+ };
267
+ // Function to build the API URL
268
+ FormoAnalytics.prototype.buildApiUrl = function () {
269
+ var _a = this.config, host = _a.host, proxy = _a.proxy, token = _a.token, _b = _a.dataSource, dataSource = _b === void 0 ? 'analytics_events' : _b;
270
+ if (token) {
271
+ if (proxy) {
272
+ return "".concat(proxy, "/api/tracking");
273
+ }
274
+ if (host) {
275
+ return "".concat(host.replace(/\/+$/, ''), "/v0/events?name=").concat(dataSource, "&token=").concat(token);
276
+ }
277
+ return "".concat(constants_1.EVENTS_API, "?name=").concat(dataSource, "&token=").concat(token);
278
+ }
279
+ return 'Error: No token provided';
280
+ };
281
+ FormoAnalytics.prototype.init = function (apiKey, projectId) {
282
+ var instance = new FormoAnalytics(apiKey, projectId);
283
+ return Promise.resolve(instance);
284
+ };
285
+ FormoAnalytics.prototype.identify = function (userData) {
286
+ this.identifyUser(userData);
287
+ };
288
+ FormoAnalytics.prototype.page = function () {
289
+ this.trackPageHit();
290
+ };
291
+ FormoAnalytics.prototype.track = function (eventName, eventData) {
292
+ this.trackEvent(eventName, eventData);
293
+ };
294
+ return FormoAnalytics;
295
+ }());
296
+ exports.FormoAnalytics = FormoAnalytics;
297
+ //# sourceMappingURL=FormoAnalytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormoAnalytics.js","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { FormoAnalytics } from './FormoAnalytics';
3
+ import { FormoAnalyticsProviderProps } from './types';
4
+ export declare const FormoAnalyticsContext: React.Context<FormoAnalytics | undefined>;
5
+ export declare const FormoAnalyticsProvider: ({ apiKey, projectId, disabled, children, }: FormoAnalyticsProviderProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const useFormoAnalytics: () => FormoAnalytics;
7
+ //# sourceMappingURL=FormoAnalyticsProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormoAnalyticsProvider.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalyticsProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAEtD,eAAO,MAAM,qBAAqB,2CAEjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,+CAKhC,2BAA2B,4CAsB7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,sBAU7B,CAAC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.useFormoAnalytics = exports.FormoAnalyticsProvider = exports.FormoAnalyticsContext = void 0;
15
+ var jsx_runtime_1 = require("react/jsx-runtime");
16
+ var react_1 = require("react");
17
+ var FormoAnalytics_1 = require("./FormoAnalytics");
18
+ exports.FormoAnalyticsContext = (0, react_1.createContext)(undefined);
19
+ var FormoAnalyticsProvider = function (_a) {
20
+ var apiKey = _a.apiKey, projectId = _a.projectId, disabled = _a.disabled, children = _a.children;
21
+ var _b = (0, react_1.useState)(), sdk = _b[0], setSdk = _b[1];
22
+ var initializedStartedRef = (0, react_1.useRef)(false);
23
+ (0, react_1.useEffect)(function () {
24
+ if (!apiKey) {
25
+ throw new Error('FormoAnalyticsProvider: No API key provided');
26
+ }
27
+ if (disabled)
28
+ return;
29
+ if (initializedStartedRef.current)
30
+ return;
31
+ initializedStartedRef.current = true;
32
+ FormoAnalytics_1.FormoAnalytics.init(apiKey, projectId).then(function (sdkInstance) { return setSdk(sdkInstance); });
33
+ }, [apiKey, disabled]);
34
+ return ((0, jsx_runtime_1.jsx)(exports.FormoAnalyticsContext.Provider, __assign({ value: sdk }, { children: children })));
35
+ };
36
+ exports.FormoAnalyticsProvider = FormoAnalyticsProvider;
37
+ var useFormoAnalytics = function () {
38
+ var context = (0, react_1.useContext)(exports.FormoAnalyticsContext);
39
+ if (!context) {
40
+ throw new Error('useFormoAnalytics must be used within a FormoAnalyticsProvider');
41
+ }
42
+ return context;
43
+ };
44
+ exports.useFormoAnalytics = useFormoAnalytics;
45
+ //# sourceMappingURL=FormoAnalyticsProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormoAnalyticsProvider.js","sourceRoot":"","sources":["../../../src/FormoAnalyticsProvider.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+BAMe;AACf,mDAAkD;AAGrC,QAAA,qBAAqB,GAAG,IAAA,qBAAa,EAChD,SAAS,CACV,CAAC;AAEK,IAAM,sBAAsB,GAAG,UAAC,EAKT;QAJ5B,MAAM,YAAA,EACN,SAAS,eAAA,EACT,QAAQ,cAAA,EACR,QAAQ,cAAA;IAEF,IAAA,KAAgB,IAAA,gBAAQ,GAA8B,EAArD,GAAG,QAAA,EAAE,MAAM,QAA0C,CAAC;IAC7D,IAAM,qBAAqB,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IAE5C,IAAA,iBAAS,EAAC;QACR,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAChE;QAED,IAAI,QAAQ;YAAE,OAAO;QAErB,IAAI,qBAAqB,CAAC,OAAO;YAAE,OAAO;QAC1C,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QAErC,+BAAc,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,UAAC,WAAW,IAAK,OAAA,MAAM,CAAC,WAAW,CAAC,EAAnB,CAAmB,CAAC,CAAC;IACpF,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,OAAO,CACL,uBAAC,6BAAqB,CAAC,QAAQ,aAAC,KAAK,EAAE,GAAG,gBACvC,QAAQ,IACsB,CAClC,CAAC;AACJ,CAAC,CAAC;AA3BW,QAAA,sBAAsB,0BA2BjC;AAEK,IAAM,iBAAiB,GAAG;IAC/B,IAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,6BAAqB,CAAC,CAAC;IAElD,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;KACH;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAVW,QAAA,iBAAiB,qBAU5B"}