@formo/analytics 1.24.0 → 1.26.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.
- package/LICENSE +21 -0
- package/README.md +1 -74
- package/dist/cjs/src/FormoAnalytics.d.ts +24 -14
- package/dist/cjs/src/FormoAnalytics.js +195 -255
- package/dist/cjs/src/FormoAnalyticsProvider.js +71 -13
- package/dist/cjs/src/{lib/consent.d.ts → consent/index.d.ts} +1 -1
- package/dist/cjs/src/{lib/consent.js → consent/index.js} +1 -1
- package/dist/cjs/src/constants/base.d.ts +0 -2
- package/dist/cjs/src/constants/base.js +3 -3
- package/dist/cjs/src/constants/config.js +1 -1
- package/dist/cjs/src/{lib/event → event}/EventFactory.d.ts +1 -1
- package/dist/cjs/src/{lib/event → event}/EventFactory.js +30 -13
- package/dist/cjs/src/{lib/event → event}/EventManager.d.ts +1 -1
- package/dist/cjs/src/{lib/event → event}/EventManager.js +1 -1
- package/dist/cjs/src/event/constants.d.ts +11 -0
- package/dist/cjs/src/event/constants.js +34 -0
- package/dist/cjs/src/{lib/event → event}/type.d.ts +1 -1
- package/dist/cjs/src/{lib/event → event}/utils.d.ts +1 -1
- package/dist/cjs/src/{lib/event → event}/utils.js +1 -1
- package/dist/cjs/src/{lib/fetch.d.ts → fetch/index.d.ts} +1 -1
- package/dist/cjs/src/{lib/fetch.js → fetch/index.js} +1 -1
- package/dist/cjs/src/provider/detection.d.ts +58 -0
- package/dist/cjs/src/provider/detection.js +103 -0
- package/dist/cjs/src/provider/index.d.ts +6 -0
- package/dist/cjs/src/provider/index.js +11 -0
- package/dist/{esm/src/lib → cjs/src}/queue/EventQueue.d.ts +1 -1
- package/dist/cjs/src/{lib/queue → queue}/EventQueue.js +3 -3
- package/dist/{esm/src/lib → cjs/src}/queue/type.d.ts +1 -1
- package/dist/cjs/src/session/index.d.ts +91 -0
- package/dist/cjs/src/session/index.js +126 -0
- package/dist/cjs/src/{lib/storage → storage}/built-in/blueprint.js +1 -1
- package/dist/cjs/src/types/base.d.ts +27 -1
- package/dist/cjs/src/validators/object.js +0 -2
- package/dist/cjs/src/version.d.ts +1 -1
- package/dist/cjs/src/version.js +1 -1
- package/dist/cjs/src/wagmi/WagmiEventHandler.d.ts +69 -0
- package/dist/cjs/src/wagmi/WagmiEventHandler.js +449 -0
- package/dist/cjs/src/wagmi/index.d.ts +9 -0
- package/dist/cjs/src/wagmi/index.js +12 -0
- package/dist/cjs/src/wagmi/types.d.ts +115 -0
- package/dist/cjs/src/wagmi/types.js +10 -0
- package/dist/esm/src/FormoAnalytics.d.ts +24 -14
- package/dist/esm/src/FormoAnalytics.js +85 -145
- package/dist/esm/src/FormoAnalyticsProvider.js +68 -10
- package/dist/esm/src/{lib/consent.d.ts → consent/index.d.ts} +1 -1
- package/dist/esm/src/{lib/consent.js → consent/index.js} +1 -1
- package/dist/esm/src/constants/base.d.ts +0 -2
- package/dist/esm/src/constants/base.js +2 -2
- package/dist/esm/src/constants/config.js +1 -1
- package/dist/esm/src/{lib/event → event}/EventFactory.d.ts +1 -1
- package/dist/esm/src/{lib/event → event}/EventFactory.js +31 -14
- package/dist/esm/src/{lib/event → event}/EventManager.d.ts +1 -1
- package/dist/esm/src/{lib/event → event}/EventManager.js +1 -1
- package/dist/esm/src/event/constants.d.ts +11 -0
- package/dist/esm/src/event/constants.js +29 -0
- package/dist/esm/src/{lib/event → event}/type.d.ts +1 -1
- package/dist/esm/src/{lib/event → event}/utils.d.ts +1 -1
- package/dist/esm/src/{lib/event → event}/utils.js +1 -1
- package/dist/esm/src/{lib/fetch.d.ts → fetch/index.d.ts} +1 -1
- package/dist/esm/src/{lib/fetch.js → fetch/index.js} +1 -1
- package/dist/esm/src/provider/detection.d.ts +58 -0
- package/dist/esm/src/provider/detection.js +98 -0
- package/dist/esm/src/provider/index.d.ts +6 -0
- package/dist/esm/src/provider/index.js +5 -0
- package/dist/{cjs/src/lib → esm/src}/queue/EventQueue.d.ts +1 -1
- package/dist/esm/src/{lib/queue → queue}/EventQueue.js +3 -3
- package/dist/{cjs/src/lib → esm/src}/queue/type.d.ts +1 -1
- package/dist/esm/src/session/index.d.ts +91 -0
- package/dist/esm/src/session/index.js +123 -0
- package/dist/esm/src/{lib/storage → storage}/built-in/blueprint.js +1 -1
- package/dist/esm/src/types/base.d.ts +27 -1
- package/dist/esm/src/validators/object.js +0 -2
- package/dist/esm/src/version.d.ts +1 -1
- package/dist/esm/src/version.js +1 -1
- package/dist/esm/src/wagmi/WagmiEventHandler.d.ts +69 -0
- package/dist/esm/src/wagmi/WagmiEventHandler.js +446 -0
- package/dist/esm/src/wagmi/index.d.ts +9 -0
- package/dist/esm/src/wagmi/index.js +8 -0
- package/dist/esm/src/wagmi/types.d.ts +115 -0
- package/dist/esm/src/wagmi/types.js +9 -0
- package/dist/index.umd.min.js +1 -1
- package/package.json +19 -4
- package/dist/cjs/src/lib/event/constants.d.ts +0 -4
- package/dist/cjs/src/lib/event/constants.js +0 -8
- package/dist/cjs/src/lib/index.d.ts +0 -7
- package/dist/cjs/src/lib/index.js +0 -28
- package/dist/esm/src/lib/event/constants.d.ts +0 -4
- package/dist/esm/src/lib/event/constants.js +0 -4
- package/dist/esm/src/lib/index.d.ts +0 -7
- package/dist/esm/src/lib/index.js +0 -7
- /package/dist/cjs/src/{lib/browser → browser}/browsers.d.ts +0 -0
- /package/dist/cjs/src/{lib/browser → browser}/browsers.js +0 -0
- /package/dist/cjs/src/{lib/event → event}/index.d.ts +0 -0
- /package/dist/cjs/src/{lib/event → event}/index.js +0 -0
- /package/dist/cjs/src/{lib/event → event}/type.js +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/Logger.d.ts +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/Logger.js +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/index.d.ts +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/index.js +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/type.d.ts +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/type.js +0 -0
- /package/dist/cjs/src/{lib/queue → queue}/index.d.ts +0 -0
- /package/dist/cjs/src/{lib/queue → queue}/index.js +0 -0
- /package/dist/cjs/src/{lib/queue → queue}/type.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry1.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry1.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry2.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry2.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry3.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry3.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_has.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_has.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isObject.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isObject.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isPlaceholder.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isPlaceholder.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepRight.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepRight.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepWithKey.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepWithKey.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeWithKey.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeWithKey.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/StorageManager.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/StorageManager.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/blueprint.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/cookie.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/cookie.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/memory.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/memory.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/web.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/web.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/constant.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/constant.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/index.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/index.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/type.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/type.js +0 -0
- /package/dist/esm/src/{lib/browser → browser}/browsers.d.ts +0 -0
- /package/dist/esm/src/{lib/browser → browser}/browsers.js +0 -0
- /package/dist/esm/src/{lib/event → event}/index.d.ts +0 -0
- /package/dist/esm/src/{lib/event → event}/index.js +0 -0
- /package/dist/esm/src/{lib/event → event}/type.js +0 -0
- /package/dist/esm/src/{lib/logger → logger}/Logger.d.ts +0 -0
- /package/dist/esm/src/{lib/logger → logger}/Logger.js +0 -0
- /package/dist/esm/src/{lib/logger → logger}/index.d.ts +0 -0
- /package/dist/esm/src/{lib/logger → logger}/index.js +0 -0
- /package/dist/esm/src/{lib/logger → logger}/type.d.ts +0 -0
- /package/dist/esm/src/{lib/logger → logger}/type.js +0 -0
- /package/dist/esm/src/{lib/queue → queue}/index.d.ts +0 -0
- /package/dist/esm/src/{lib/queue → queue}/index.js +0 -0
- /package/dist/esm/src/{lib/queue → queue}/type.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry1.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry1.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry2.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry2.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry3.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry3.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_has.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_has.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_isObject.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_isObject.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_isPlaceholder.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_isPlaceholder.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepRight.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepRight.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepWithKey.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepWithKey.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeWithKey.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeWithKey.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/StorageManager.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/StorageManager.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/blueprint.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/cookie.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/cookie.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/memory.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/memory.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/web.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/web.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/constant.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/constant.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/index.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/index.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/type.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/type.js +0 -0
|
@@ -55,13 +55,20 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
55
55
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
56
56
|
};
|
|
57
57
|
import { createStore } from "mipd";
|
|
58
|
-
import { EVENTS_API_HOST, EventType, LOCAL_ANONYMOUS_ID_KEY, SESSION_CURRENT_URL_KEY, SESSION_USER_ID_KEY,
|
|
59
|
-
import { cookie,
|
|
58
|
+
import { EVENTS_API_HOST, EventType, LOCAL_ANONYMOUS_ID_KEY, SESSION_CURRENT_URL_KEY, SESSION_USER_ID_KEY, CONSENT_OPT_OUT_KEY, } from "./constants";
|
|
59
|
+
import { cookie, initStorageManager } from "./storage";
|
|
60
|
+
import { EventManager } from "./event";
|
|
61
|
+
import { EventQueue } from "./queue";
|
|
62
|
+
import { logger, Logger } from "./logger";
|
|
63
|
+
import { setConsentFlag, getConsentFlag, removeConsentFlag, } from "./consent";
|
|
64
|
+
import { detectInjectedProviderInfo, isValidProvider } from "./provider";
|
|
65
|
+
import { FormoAnalyticsSession, SESSION_WALLET_DETECTED_KEY, SESSION_WALLET_IDENTIFIED_KEY, } from "./session";
|
|
60
66
|
import { SignatureStatus, TransactionStatus, WRAPPED_REQUEST_SYMBOL, WRAPPED_REQUEST_REF_SYMBOL, } from "./types";
|
|
61
67
|
import { toChecksumAddress } from "./utils";
|
|
62
68
|
import { getValidAddress } from "./utils/address";
|
|
63
69
|
import { isLocalhost } from "./validators";
|
|
64
70
|
import { parseChainId } from "./utils/chain";
|
|
71
|
+
import { WagmiEventHandler } from "./wagmi";
|
|
65
72
|
/**
|
|
66
73
|
* Constants for provider switching reasons
|
|
67
74
|
*/
|
|
@@ -95,11 +102,18 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
95
102
|
this._processingAccountsChanged = false;
|
|
96
103
|
// Set to efficiently track seen providers for deduplication and O(1) lookup
|
|
97
104
|
this._seenProviders = new Set();
|
|
105
|
+
/**
|
|
106
|
+
* Flag indicating if Wagmi mode is enabled
|
|
107
|
+
* When true, EIP-1193 provider wrapping is skipped
|
|
108
|
+
*/
|
|
109
|
+
this.isWagmiMode = false;
|
|
98
110
|
this.currentUserId = "";
|
|
99
111
|
this.config = {
|
|
100
112
|
writeKey: writeKey,
|
|
101
113
|
};
|
|
102
114
|
this.options = options;
|
|
115
|
+
// Check if Wagmi mode is enabled
|
|
116
|
+
this.isWagmiMode = !!options.wagmi;
|
|
103
117
|
this.session = new FormoAnalyticsSession();
|
|
104
118
|
this.currentUserId =
|
|
105
119
|
cookie().get(SESSION_USER_ID_KEY) || undefined;
|
|
@@ -128,17 +142,24 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
128
142
|
if (this.hasOptedOutTracking()) {
|
|
129
143
|
logger.info("User has previously opted out of tracking");
|
|
130
144
|
}
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
provider = optProvider;
|
|
145
|
+
// Initialize Wagmi handler if Wagmi mode is enabled
|
|
146
|
+
if (this.isWagmiMode && options.wagmi) {
|
|
147
|
+
logger.info("FormoAnalytics: Initializing in Wagmi mode");
|
|
148
|
+
this.wagmiHandler = new WagmiEventHandler(this, options.wagmi.config, options.wagmi.queryClient);
|
|
136
149
|
}
|
|
137
|
-
else
|
|
138
|
-
provider
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
150
|
+
else {
|
|
151
|
+
// Handle initial provider (injected) as fallback; listeners for EIP-6963 are added later
|
|
152
|
+
var provider = undefined;
|
|
153
|
+
var optProvider = options.provider;
|
|
154
|
+
if (optProvider) {
|
|
155
|
+
provider = optProvider;
|
|
156
|
+
}
|
|
157
|
+
else if (typeof window !== "undefined" && window.ethereum) {
|
|
158
|
+
provider = window.ethereum;
|
|
159
|
+
}
|
|
160
|
+
if (provider) {
|
|
161
|
+
this.trackEIP1193Provider(provider);
|
|
162
|
+
}
|
|
142
163
|
}
|
|
143
164
|
this.trackPageHit();
|
|
144
165
|
this.trackPageHits();
|
|
@@ -153,18 +174,6 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
153
174
|
// This allows legitimate provider switching while preventing race conditions
|
|
154
175
|
return this._provider != null && this._provider !== provider;
|
|
155
176
|
};
|
|
156
|
-
/**
|
|
157
|
-
* Check if a provider is in a valid state for switching
|
|
158
|
-
* @param provider The provider to validate
|
|
159
|
-
* @returns true if the provider is in a valid state
|
|
160
|
-
*/
|
|
161
|
-
FormoAnalytics.prototype.isProviderInValidState = function (provider) {
|
|
162
|
-
// Basic validation: ensure provider exists and has required methods
|
|
163
|
-
return (provider &&
|
|
164
|
-
typeof provider.request === "function" &&
|
|
165
|
-
typeof provider.on === "function" &&
|
|
166
|
-
typeof provider.removeListener === "function");
|
|
167
|
-
};
|
|
168
177
|
FormoAnalytics.init = function (writeKey, options) {
|
|
169
178
|
return __awaiter(this, void 0, void 0, function () {
|
|
170
179
|
var analytics, _a;
|
|
@@ -173,6 +182,7 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
173
182
|
case 0:
|
|
174
183
|
initStorageManager(writeKey);
|
|
175
184
|
analytics = new FormoAnalytics(writeKey, options);
|
|
185
|
+
if (!!analytics.isWagmiMode) return [3 /*break*/, 3];
|
|
176
186
|
// Auto-detect wallet provider
|
|
177
187
|
_a = analytics;
|
|
178
188
|
return [4 /*yield*/, analytics.getProviders()];
|
|
@@ -183,7 +193,11 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
183
193
|
case 2:
|
|
184
194
|
_b.sent();
|
|
185
195
|
analytics.trackProviders(analytics._providers);
|
|
186
|
-
return [
|
|
196
|
+
return [3 /*break*/, 4];
|
|
197
|
+
case 3:
|
|
198
|
+
logger.info("FormoAnalytics: Skipping provider detection (Wagmi mode)");
|
|
199
|
+
_b.label = 4;
|
|
200
|
+
case 4: return [2 /*return*/, analytics];
|
|
187
201
|
}
|
|
188
202
|
});
|
|
189
203
|
});
|
|
@@ -223,6 +237,27 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
223
237
|
cookie().remove(SESSION_WALLET_DETECTED_KEY);
|
|
224
238
|
cookie().remove(SESSION_WALLET_IDENTIFIED_KEY);
|
|
225
239
|
};
|
|
240
|
+
/**
|
|
241
|
+
* Clean up resources and event listeners
|
|
242
|
+
* Call this when destroying the analytics instance
|
|
243
|
+
* @returns {void}
|
|
244
|
+
*/
|
|
245
|
+
FormoAnalytics.prototype.cleanup = function () {
|
|
246
|
+
logger.info("FormoAnalytics: Cleaning up resources");
|
|
247
|
+
// Clean up Wagmi handler if present
|
|
248
|
+
if (this.wagmiHandler) {
|
|
249
|
+
this.wagmiHandler.cleanup();
|
|
250
|
+
this.wagmiHandler = undefined;
|
|
251
|
+
}
|
|
252
|
+
// Clean up EIP-1193 providers if not in Wagmi mode
|
|
253
|
+
if (!this.isWagmiMode) {
|
|
254
|
+
for (var _i = 0, _a = Array.from(this._trackedProviders); _i < _a.length; _i++) {
|
|
255
|
+
var provider = _a[_i];
|
|
256
|
+
this.untrackProvider(provider);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
logger.info("FormoAnalytics: Cleanup complete");
|
|
260
|
+
};
|
|
226
261
|
/**
|
|
227
262
|
* Emits a connect wallet event.
|
|
228
263
|
* @param {ChainID} params.chainId
|
|
@@ -612,13 +647,29 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
612
647
|
/*
|
|
613
648
|
SDK tracking and event listener functions
|
|
614
649
|
*/
|
|
615
|
-
|
|
616
|
-
|
|
650
|
+
/**
|
|
651
|
+
* Track an EIP-1193 provider by wrapping its request method and adding event listeners
|
|
652
|
+
* Note: This is only used in non-Wagmi mode. When Wagmi is enabled, all tracking
|
|
653
|
+
* happens through Wagmi's connector system instead of EIP-1193/EIP-6963.
|
|
654
|
+
* @param provider The EIP-1193 provider to track
|
|
655
|
+
*/
|
|
656
|
+
FormoAnalytics.prototype.trackEIP1193Provider = function (provider) {
|
|
657
|
+
logger.info("trackEIP1193Provider", provider);
|
|
658
|
+
// Defensive check: Skip provider tracking in Wagmi mode
|
|
659
|
+
// This should never be called in Wagmi mode due to guards in init(),
|
|
660
|
+
// but we check here for safety in case of future code changes
|
|
661
|
+
if (this.isWagmiMode) {
|
|
662
|
+
logger.debug("trackEIP1193Provider: Skipping EIP-1193 provider tracking (Wagmi mode - using connector system instead)");
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
617
665
|
try {
|
|
618
|
-
|
|
666
|
+
// Validate provider exists and has required methods
|
|
667
|
+
if (!isValidProvider(provider)) {
|
|
668
|
+
logger.warn("trackEIP1193Provider: Invalid provider - missing required methods");
|
|
619
669
|
return;
|
|
670
|
+
}
|
|
620
671
|
if (this._trackedProviders.has(provider)) {
|
|
621
|
-
logger.warn("
|
|
672
|
+
logger.warn("trackEIP1193Provider: Provider already tracked");
|
|
622
673
|
return;
|
|
623
674
|
}
|
|
624
675
|
// CRITICAL: Always register accountsChanged for state management
|
|
@@ -654,7 +705,7 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
654
705
|
var eip6963ProviderDetail = providers_1[_i];
|
|
655
706
|
var provider = eip6963ProviderDetail === null || eip6963ProviderDetail === void 0 ? void 0 : eip6963ProviderDetail.provider;
|
|
656
707
|
if (provider && !this._trackedProviders.has(provider)) {
|
|
657
|
-
this.
|
|
708
|
+
this.trackEIP1193Provider(provider);
|
|
658
709
|
}
|
|
659
710
|
}
|
|
660
711
|
}
|
|
@@ -1512,60 +1563,12 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
1512
1563
|
};
|
|
1513
1564
|
}
|
|
1514
1565
|
// Fallback to injected provider detection
|
|
1515
|
-
var injectedInfo =
|
|
1566
|
+
var injectedInfo = detectInjectedProviderInfo(provider);
|
|
1516
1567
|
return {
|
|
1517
1568
|
name: injectedInfo.name,
|
|
1518
1569
|
rdns: injectedInfo.rdns,
|
|
1519
1570
|
};
|
|
1520
1571
|
};
|
|
1521
|
-
/**
|
|
1522
|
-
* Attempts to detect information about an injected provider
|
|
1523
|
-
* @param provider The injected provider to analyze
|
|
1524
|
-
* @returns Provider information with fallback values
|
|
1525
|
-
*/
|
|
1526
|
-
FormoAnalytics.prototype.detectInjectedProviderInfo = function (provider) {
|
|
1527
|
-
// Try to detect provider type from common properties
|
|
1528
|
-
var name = "Injected Provider";
|
|
1529
|
-
var rdns = "io.injected.provider";
|
|
1530
|
-
// Use WalletProviderFlags interface for type safety
|
|
1531
|
-
var flags = provider;
|
|
1532
|
-
// Check if it's MetaMask
|
|
1533
|
-
if (flags.isMetaMask) {
|
|
1534
|
-
name = "MetaMask";
|
|
1535
|
-
rdns = "io.metamask";
|
|
1536
|
-
}
|
|
1537
|
-
// Check if it's Coinbase Wallet
|
|
1538
|
-
else if (flags.isCoinbaseWallet) {
|
|
1539
|
-
name = "Coinbase Wallet";
|
|
1540
|
-
rdns = "com.coinbase.wallet";
|
|
1541
|
-
}
|
|
1542
|
-
// Check if it's WalletConnect
|
|
1543
|
-
else if (flags.isWalletConnect) {
|
|
1544
|
-
name = "WalletConnect";
|
|
1545
|
-
rdns = "com.walletconnect";
|
|
1546
|
-
}
|
|
1547
|
-
// Check if it's Trust Wallet
|
|
1548
|
-
else if (flags.isTrust) {
|
|
1549
|
-
name = "Trust Wallet";
|
|
1550
|
-
rdns = "com.trustwallet";
|
|
1551
|
-
}
|
|
1552
|
-
// Check if it's Brave Wallet
|
|
1553
|
-
else if (flags.isBraveWallet) {
|
|
1554
|
-
name = "Brave Wallet";
|
|
1555
|
-
rdns = "com.brave.wallet";
|
|
1556
|
-
}
|
|
1557
|
-
// Check if it's Phantom
|
|
1558
|
-
else if (flags.isPhantom) {
|
|
1559
|
-
name = "Phantom";
|
|
1560
|
-
rdns = "app.phantom";
|
|
1561
|
-
}
|
|
1562
|
-
return {
|
|
1563
|
-
name: name,
|
|
1564
|
-
rdns: rdns,
|
|
1565
|
-
uuid: "injected-".concat(rdns.replace(/[^a-zA-Z0-9]/g, "-")),
|
|
1566
|
-
icon: DEFAULT_PROVIDER_ICON,
|
|
1567
|
-
};
|
|
1568
|
-
};
|
|
1569
1572
|
FormoAnalytics.prototype.getProviders = function () {
|
|
1570
1573
|
return __awaiter(this, void 0, void 0, function () {
|
|
1571
1574
|
var store, providers, injected_1, injectedProviderInfo, injectedDetail, uniqueProviders, _i, uniqueProviders_1, detail;
|
|
@@ -1624,7 +1627,7 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
1624
1627
|
this._injectedProviderDetail.provider === injected_1) {
|
|
1625
1628
|
// Ensure it's tracked
|
|
1626
1629
|
if (!this._trackedProviders.has(injected_1)) {
|
|
1627
|
-
this.
|
|
1630
|
+
this.trackEIP1193Provider(injected_1);
|
|
1628
1631
|
}
|
|
1629
1632
|
// Merge with existing providers instead of overwriting
|
|
1630
1633
|
if (!this._providers.some(function (existing) { return existing.provider === injected_1; })) {
|
|
@@ -1636,9 +1639,9 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
1636
1639
|
}
|
|
1637
1640
|
// Re-check if the injected provider is already tracked just before tracking
|
|
1638
1641
|
if (!this._trackedProviders.has(injected_1)) {
|
|
1639
|
-
this.
|
|
1642
|
+
this.trackEIP1193Provider(injected_1);
|
|
1640
1643
|
}
|
|
1641
|
-
injectedProviderInfo =
|
|
1644
|
+
injectedProviderInfo = detectInjectedProviderInfo(injected_1);
|
|
1642
1645
|
injectedDetail = {
|
|
1643
1646
|
provider: injected_1,
|
|
1644
1647
|
info: injectedProviderInfo,
|
|
@@ -2040,67 +2043,4 @@ var FormoAnalytics = /** @class */ (function () {
|
|
|
2040
2043
|
return FormoAnalytics;
|
|
2041
2044
|
}());
|
|
2042
2045
|
export { FormoAnalytics };
|
|
2043
|
-
var FormoAnalyticsSession = /** @class */ (function () {
|
|
2044
|
-
function FormoAnalyticsSession() {
|
|
2045
|
-
}
|
|
2046
|
-
FormoAnalyticsSession.prototype.generateIdentificationKey = function (address, rdns) {
|
|
2047
|
-
// If rdns is missing, use address-only key as fallback for empty identifies
|
|
2048
|
-
return rdns ? "".concat(address, ":").concat(rdns) : address;
|
|
2049
|
-
};
|
|
2050
|
-
FormoAnalyticsSession.prototype.isWalletDetected = function (rdns) {
|
|
2051
|
-
var _a;
|
|
2052
|
-
var rdnses = ((_a = cookie().get(SESSION_WALLET_DETECTED_KEY)) === null || _a === void 0 ? void 0 : _a.split(",")) || [];
|
|
2053
|
-
return rdnses.includes(rdns);
|
|
2054
|
-
};
|
|
2055
|
-
FormoAnalyticsSession.prototype.markWalletDetected = function (rdns) {
|
|
2056
|
-
var _a;
|
|
2057
|
-
var rdnses = ((_a = cookie().get(SESSION_WALLET_DETECTED_KEY)) === null || _a === void 0 ? void 0 : _a.split(",")) || [];
|
|
2058
|
-
if (!rdnses.includes(rdns)) {
|
|
2059
|
-
rdnses.push(rdns);
|
|
2060
|
-
cookie().set(SESSION_WALLET_DETECTED_KEY, rdnses.join(","), {
|
|
2061
|
-
// by the end of the day
|
|
2062
|
-
expires: new Date(Date.now() + 86400 * 1000).toUTCString(),
|
|
2063
|
-
path: "/",
|
|
2064
|
-
});
|
|
2065
|
-
}
|
|
2066
|
-
};
|
|
2067
|
-
FormoAnalyticsSession.prototype.isWalletIdentified = function (address, rdns) {
|
|
2068
|
-
var identifiedKey = this.generateIdentificationKey(address, rdns);
|
|
2069
|
-
var cookieValue = cookie().get(SESSION_WALLET_IDENTIFIED_KEY);
|
|
2070
|
-
var identifiedWallets = (cookieValue === null || cookieValue === void 0 ? void 0 : cookieValue.split(",")) || [];
|
|
2071
|
-
var isIdentified = identifiedWallets.includes(identifiedKey);
|
|
2072
|
-
logger.debug("Session: Checking wallet identification", {
|
|
2073
|
-
identifiedKey: identifiedKey,
|
|
2074
|
-
isIdentified: isIdentified,
|
|
2075
|
-
hasRdns: !!rdns,
|
|
2076
|
-
});
|
|
2077
|
-
return isIdentified;
|
|
2078
|
-
};
|
|
2079
|
-
FormoAnalyticsSession.prototype.markWalletIdentified = function (address, rdns) {
|
|
2080
|
-
var _a;
|
|
2081
|
-
var identifiedKey = this.generateIdentificationKey(address, rdns);
|
|
2082
|
-
var identifiedWallets = ((_a = cookie().get(SESSION_WALLET_IDENTIFIED_KEY)) === null || _a === void 0 ? void 0 : _a.split(",")) || [];
|
|
2083
|
-
if (!identifiedWallets.includes(identifiedKey)) {
|
|
2084
|
-
identifiedWallets.push(identifiedKey);
|
|
2085
|
-
var newValue = identifiedWallets.join(",");
|
|
2086
|
-
cookie().set(SESSION_WALLET_IDENTIFIED_KEY, newValue, {
|
|
2087
|
-
// by the end of the day
|
|
2088
|
-
expires: new Date(Date.now() + 86400 * 1000).toUTCString(),
|
|
2089
|
-
path: "/",
|
|
2090
|
-
});
|
|
2091
|
-
logger.debug("Session: Marked wallet as identified", {
|
|
2092
|
-
identifiedKey: identifiedKey,
|
|
2093
|
-
hasRdns: !!rdns,
|
|
2094
|
-
});
|
|
2095
|
-
}
|
|
2096
|
-
else {
|
|
2097
|
-
logger.info("Session: Wallet already marked as identified", {
|
|
2098
|
-
identifiedKey: identifiedKey,
|
|
2099
|
-
existingWallets: identifiedWallets,
|
|
2100
|
-
hasRdns: !!rdns,
|
|
2101
|
-
});
|
|
2102
|
-
}
|
|
2103
|
-
};
|
|
2104
|
-
return FormoAnalyticsSession;
|
|
2105
|
-
}());
|
|
2106
2046
|
//# sourceMappingURL=FormoAnalytics.js.map
|
|
@@ -46,13 +46,15 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
49
|
-
import { createContext, useContext, useEffect, useRef, useState } from "react";
|
|
49
|
+
import { createContext, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
50
50
|
import { FormoAnalytics } from "./FormoAnalytics";
|
|
51
|
-
import { initStorageManager
|
|
51
|
+
import { initStorageManager } from "./storage";
|
|
52
|
+
import { logger } from "./logger";
|
|
52
53
|
var defaultContext = {
|
|
53
54
|
chain: function () { return Promise.resolve(); },
|
|
54
55
|
page: function () { return Promise.resolve(); },
|
|
55
56
|
reset: function () { },
|
|
57
|
+
cleanup: function () { },
|
|
56
58
|
detect: function () { return Promise.resolve(); },
|
|
57
59
|
connect: function () { return Promise.resolve(); },
|
|
58
60
|
disconnect: function () { return Promise.resolve(); },
|
|
@@ -82,36 +84,92 @@ export var FormoAnalyticsProvider = function (props) {
|
|
|
82
84
|
var InitializedAnalytics = function (_a) {
|
|
83
85
|
var writeKey = _a.writeKey, options = _a.options, children = _a.children;
|
|
84
86
|
var _b = useState(defaultContext), sdk = _b[0], setSdk = _b[1];
|
|
85
|
-
var
|
|
87
|
+
var sdkRef = useRef(defaultContext);
|
|
86
88
|
initStorageManager(writeKey);
|
|
89
|
+
// Create a stable key from options that ignores complex objects and functions
|
|
90
|
+
// We only care about serializable config values that would affect SDK behavior
|
|
91
|
+
var optionsKey = useMemo(function () {
|
|
92
|
+
if (!options)
|
|
93
|
+
return 'undefined';
|
|
94
|
+
// Extract only the serializable parts of options
|
|
95
|
+
var serializableOptions = {
|
|
96
|
+
tracking: options.tracking,
|
|
97
|
+
autocapture: options.autocapture,
|
|
98
|
+
apiHost: options.apiHost,
|
|
99
|
+
flushAt: options.flushAt,
|
|
100
|
+
flushInterval: options.flushInterval,
|
|
101
|
+
retryCount: options.retryCount,
|
|
102
|
+
maxQueueSize: options.maxQueueSize,
|
|
103
|
+
logger: options.logger,
|
|
104
|
+
referral: options.referral,
|
|
105
|
+
// For complex objects, just track their presence, not their content
|
|
106
|
+
hasProvider: !!options.provider,
|
|
107
|
+
hasWagmi: !!options.wagmi,
|
|
108
|
+
hasReady: !!options.ready,
|
|
109
|
+
};
|
|
110
|
+
try {
|
|
111
|
+
return JSON.stringify(serializableOptions);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
// Fallback to timestamp if serialization fails
|
|
115
|
+
logger.warn('Failed to serialize options, using timestamp', error);
|
|
116
|
+
return Date.now().toString();
|
|
117
|
+
}
|
|
118
|
+
}, [options]);
|
|
87
119
|
useEffect(function () {
|
|
120
|
+
var isCleanedUp = false;
|
|
88
121
|
var initialize = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
89
122
|
var sdkInstance, error_1;
|
|
90
123
|
return __generator(this, function (_a) {
|
|
91
124
|
switch (_a.label) {
|
|
92
125
|
case 0:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
126
|
+
// Clean up existing SDK instance before creating a new one
|
|
127
|
+
if (sdkRef.current && sdkRef.current !== defaultContext) {
|
|
128
|
+
logger.log("Cleaning up existing FormoAnalytics SDK instance before re-initialization");
|
|
129
|
+
sdkRef.current.cleanup();
|
|
130
|
+
sdkRef.current = defaultContext;
|
|
131
|
+
setSdk(defaultContext);
|
|
132
|
+
}
|
|
96
133
|
_a.label = 1;
|
|
97
134
|
case 1:
|
|
98
135
|
_a.trys.push([1, 3, , 4]);
|
|
99
136
|
return [4 /*yield*/, FormoAnalytics.init(writeKey, options)];
|
|
100
137
|
case 2:
|
|
101
138
|
sdkInstance = _a.sent();
|
|
102
|
-
|
|
103
|
-
|
|
139
|
+
// Only set SDK if the component hasn't been cleaned up during async initialization
|
|
140
|
+
if (!isCleanedUp) {
|
|
141
|
+
setSdk(sdkInstance);
|
|
142
|
+
sdkRef.current = sdkInstance;
|
|
143
|
+
logger.log("Successfully initialized FormoAnalytics SDK");
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Component was unmounted during initialization, clean up immediately
|
|
147
|
+
logger.log("Component unmounted during initialization, cleaning up SDK");
|
|
148
|
+
sdkInstance.cleanup();
|
|
149
|
+
}
|
|
104
150
|
return [3 /*break*/, 4];
|
|
105
151
|
case 3:
|
|
106
152
|
error_1 = _a.sent();
|
|
107
|
-
|
|
153
|
+
if (!isCleanedUp) {
|
|
154
|
+
logger.error("Failed to initialize FormoAnalytics SDK", error_1);
|
|
155
|
+
}
|
|
108
156
|
return [3 /*break*/, 4];
|
|
109
157
|
case 4: return [2 /*return*/];
|
|
110
158
|
}
|
|
111
159
|
});
|
|
112
160
|
}); };
|
|
113
161
|
initialize();
|
|
114
|
-
|
|
162
|
+
// Cleanup function to prevent memory leaks
|
|
163
|
+
// Using ref ensures we clean up the actual SDK instance, not the stale closure value
|
|
164
|
+
return function () {
|
|
165
|
+
isCleanedUp = true;
|
|
166
|
+
if (sdkRef.current && sdkRef.current !== defaultContext) {
|
|
167
|
+
logger.log("Cleaning up FormoAnalytics SDK instance");
|
|
168
|
+
sdkRef.current.cleanup();
|
|
169
|
+
sdkRef.current = defaultContext;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}, [writeKey, optionsKey]);
|
|
115
173
|
return (_jsx(FormoAnalyticsContext.Provider, { value: sdk, children: children }));
|
|
116
174
|
};
|
|
117
175
|
export var useFormo = function () {
|
|
@@ -32,4 +32,4 @@ export declare function getConsentFlag(projectId: string, key: string): string |
|
|
|
32
32
|
* @param key - The cookie key
|
|
33
33
|
*/
|
|
34
34
|
export declare function removeConsentFlag(projectId: string, key: string): void;
|
|
35
|
-
//# sourceMappingURL=
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
export declare const SESSION_TRAFFIC_SOURCE_KEY = "traffic-source";
|
|
2
|
-
export declare const SESSION_WALLET_DETECTED_KEY = "wallet-detected";
|
|
3
|
-
export declare const SESSION_WALLET_IDENTIFIED_KEY = "wallet-identified";
|
|
4
2
|
export declare const SESSION_CURRENT_URL_KEY = "analytics-current-url";
|
|
5
3
|
export declare const SESSION_USER_ID_KEY = "user-id";
|
|
6
4
|
export declare const LOCAL_ANONYMOUS_ID_KEY = "anonymous-id";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export var SESSION_TRAFFIC_SOURCE_KEY = "traffic-source";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
// SESSION_WALLET_DETECTED_KEY and SESSION_WALLET_IDENTIFIED_KEY
|
|
3
|
+
// are now defined in src/session/index.ts
|
|
4
4
|
export var SESSION_CURRENT_URL_KEY = "analytics-current-url";
|
|
5
5
|
export var SESSION_USER_ID_KEY = "user-id";
|
|
6
6
|
export var LOCAL_ANONYMOUS_ID_KEY = "anonymous-id";
|
|
@@ -2,7 +2,7 @@ export var EVENTS_API_ORIGIN = "https://events.formo.so";
|
|
|
2
2
|
export var EVENTS_API_HOST = "".concat(EVENTS_API_ORIGIN, "/v0/raw_events");
|
|
3
3
|
export var EVENTS_API_REQUEST_HEADER = function (writeKey) { return ({
|
|
4
4
|
"Content-Type": "application/json",
|
|
5
|
-
Authorization: "
|
|
5
|
+
Authorization: "Bearer ".concat(writeKey),
|
|
6
6
|
}); };
|
|
7
7
|
export var COUNTRY_LIST = {
|
|
8
8
|
// Africa
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Address, APIEvent, ChainID, IFormoEvent, IFormoEventContext, IFormoEventProperties, Nullable, Options, SignatureStatus, TransactionStatus } from "
|
|
1
|
+
import { Address, APIEvent, ChainID, IFormoEvent, IFormoEventContext, IFormoEventProperties, Nullable, Options, SignatureStatus, TransactionStatus } from "../types";
|
|
2
2
|
import { IEventFactory } from "./type";
|
|
3
3
|
declare class EventFactory implements IEventFactory {
|
|
4
4
|
private options?;
|
|
@@ -45,16 +45,16 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
45
45
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
|
-
import { COUNTRY_LIST, LOCAL_ANONYMOUS_ID_KEY, SESSION_TRAFFIC_SOURCE_KEY, } from "
|
|
49
|
-
import { toChecksumAddress, toSnakeCase } from "
|
|
50
|
-
import { getValidAddress } from "
|
|
51
|
-
import { getCurrentTimeFormatted } from "
|
|
52
|
-
import { isUndefined } from "
|
|
48
|
+
import { COUNTRY_LIST, LOCAL_ANONYMOUS_ID_KEY, SESSION_TRAFFIC_SOURCE_KEY, } from "../constants";
|
|
49
|
+
import { toChecksumAddress, toSnakeCase } from "../utils";
|
|
50
|
+
import { getValidAddress } from "../utils/address";
|
|
51
|
+
import { getCurrentTimeFormatted } from "../utils/timestamp";
|
|
52
|
+
import { isUndefined } from "../validators";
|
|
53
53
|
import { logger } from "../logger";
|
|
54
54
|
import mergeDeepRight from "../ramda/mergeDeepRight";
|
|
55
55
|
import { session } from "../storage";
|
|
56
|
-
import { version } from "
|
|
57
|
-
import { CHANNEL, VERSION } from "./constants";
|
|
56
|
+
import { version } from "../version";
|
|
57
|
+
import { CHANNEL, VERSION, PAGE_PROPERTIES_EXCLUDED_FIELDS } from "./constants";
|
|
58
58
|
import { generateAnonymousId } from "./utils";
|
|
59
59
|
import { detectBrowser } from "../browser/browsers";
|
|
60
60
|
var EventFactory = /** @class */ (function () {
|
|
@@ -150,7 +150,8 @@ var EventFactory = /** @class */ (function () {
|
|
|
150
150
|
* @param options API options
|
|
151
151
|
*/
|
|
152
152
|
this.getPageProperties = function (properties) {
|
|
153
|
-
|
|
153
|
+
// Create a copy to avoid mutating the original properties object
|
|
154
|
+
var pageProps = __assign({}, properties);
|
|
154
155
|
if (isUndefined(pageProps.url)) {
|
|
155
156
|
pageProps.url = new URL(globalThis.location.href).href;
|
|
156
157
|
}
|
|
@@ -160,6 +161,24 @@ var EventFactory = /** @class */ (function () {
|
|
|
160
161
|
if (isUndefined(pageProps.hash)) {
|
|
161
162
|
pageProps.hash = globalThis.location.hash;
|
|
162
163
|
}
|
|
164
|
+
// Add query string without the '?' prefix
|
|
165
|
+
if (isUndefined(pageProps.query)) {
|
|
166
|
+
pageProps.query = globalThis.location.search.slice(1);
|
|
167
|
+
}
|
|
168
|
+
// Parse query parameters and add as individual properties (don't overwrite existing)
|
|
169
|
+
// Skip fields that are already captured in context or are semantic event properties
|
|
170
|
+
try {
|
|
171
|
+
var urlObj = new URL(globalThis.location.href);
|
|
172
|
+
urlObj.searchParams.forEach(function (value, key) {
|
|
173
|
+
// Only add if the property doesn't already exist and is not excluded
|
|
174
|
+
if (isUndefined(pageProps[key]) && !PAGE_PROPERTIES_EXCLUDED_FIELDS.has(key)) {
|
|
175
|
+
pageProps[key] = value;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
logger.error("Error parsing query parameters for page properties:", error);
|
|
181
|
+
}
|
|
163
182
|
return pageProps;
|
|
164
183
|
};
|
|
165
184
|
this.options = options;
|
|
@@ -236,19 +255,17 @@ var EventFactory = /** @class */ (function () {
|
|
|
236
255
|
// Contextual fields that are automatically collected and populated by the Formo SDK
|
|
237
256
|
EventFactory.prototype.generateContext = function (context) {
|
|
238
257
|
return __awaiter(this, void 0, void 0, function () {
|
|
239
|
-
var
|
|
258
|
+
var browserName, language, timezone, location, library_version, defaultContext, mergedContext;
|
|
240
259
|
return __generator(this, function (_a) {
|
|
241
260
|
switch (_a.label) {
|
|
242
|
-
case 0:
|
|
243
|
-
path = globalThis.location.pathname;
|
|
244
|
-
return [4 /*yield*/, detectBrowser()];
|
|
261
|
+
case 0: return [4 /*yield*/, detectBrowser()];
|
|
245
262
|
case 1:
|
|
246
263
|
browserName = _a.sent();
|
|
247
264
|
language = this.getLanguage();
|
|
248
265
|
timezone = this.getTimezone();
|
|
249
266
|
location = this.getLocation();
|
|
250
267
|
library_version = this.getLibraryVersion();
|
|
251
|
-
defaultContext = __assign(__assign(__assign({ user_agent: globalThis.navigator.userAgent, locale: language, timezone: timezone, location: location }, this.getTrafficSources(globalThis.location.href)), {
|
|
268
|
+
defaultContext = __assign(__assign(__assign({ user_agent: globalThis.navigator.userAgent, locale: language, timezone: timezone, location: location }, this.getTrafficSources(globalThis.location.href)), { page_title: document.title, page_url: globalThis.location.href, library_name: "Formo Web SDK", library_version: library_version, browser: browserName }), this.getScreen());
|
|
252
269
|
mergedContext = mergeDeepRight(defaultContext, context || {});
|
|
253
270
|
return [2 /*return*/, mergedContext];
|
|
254
271
|
}
|
|
@@ -296,7 +313,7 @@ var EventFactory = /** @class */ (function () {
|
|
|
296
313
|
return __awaiter(this, void 0, void 0, function () {
|
|
297
314
|
var props, pageEvent;
|
|
298
315
|
return __generator(this, function (_a) {
|
|
299
|
-
props = properties !== null && properties !== void 0 ? properties : {};
|
|
316
|
+
props = __assign({}, (properties !== null && properties !== void 0 ? properties : {}));
|
|
300
317
|
props.category = category;
|
|
301
318
|
props.name = name;
|
|
302
319
|
props = this.getPageProperties(props);
|
|
@@ -47,7 +47,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
47
47
|
};
|
|
48
48
|
import { logger } from "../logger";
|
|
49
49
|
import { EventFactory } from "./EventFactory";
|
|
50
|
-
import { isBlockedAddress } from "
|
|
50
|
+
import { isBlockedAddress } from "../utils/address";
|
|
51
51
|
/**
|
|
52
52
|
* A service to generate valid event payloads and queue them for processing
|
|
53
53
|
*/
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const CHANNEL = "web";
|
|
2
|
+
declare const VERSION = "0";
|
|
3
|
+
/**
|
|
4
|
+
* Fields that should be excluded from page event properties parsing
|
|
5
|
+
* These are either:
|
|
6
|
+
* - Already captured in event context (UTM params, referral params)
|
|
7
|
+
* - Semantic event properties that should not be overridden by URL params
|
|
8
|
+
*/
|
|
9
|
+
declare const PAGE_PROPERTIES_EXCLUDED_FIELDS: Set<string>;
|
|
10
|
+
export { CHANNEL, VERSION, PAGE_PROPERTIES_EXCLUDED_FIELDS };
|
|
11
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
var CHANNEL = "web";
|
|
2
|
+
var VERSION = "0";
|
|
3
|
+
/**
|
|
4
|
+
* Fields that should be excluded from page event properties parsing
|
|
5
|
+
* These are either:
|
|
6
|
+
* - Already captured in event context (UTM params, referral params)
|
|
7
|
+
* - Semantic event properties that should not be overridden by URL params
|
|
8
|
+
*/
|
|
9
|
+
var PAGE_PROPERTIES_EXCLUDED_FIELDS = new Set([
|
|
10
|
+
// Context fields (already captured in event context)
|
|
11
|
+
'utm_source',
|
|
12
|
+
'utm_medium',
|
|
13
|
+
'utm_campaign',
|
|
14
|
+
'utm_term',
|
|
15
|
+
'utm_content',
|
|
16
|
+
'ref',
|
|
17
|
+
'referral',
|
|
18
|
+
'refcode',
|
|
19
|
+
'referrer',
|
|
20
|
+
// Semantic event properties (should not be overridden by URL params)
|
|
21
|
+
'category',
|
|
22
|
+
'name',
|
|
23
|
+
'url',
|
|
24
|
+
'path',
|
|
25
|
+
'hash',
|
|
26
|
+
'query',
|
|
27
|
+
]);
|
|
28
|
+
export { CHANNEL, VERSION, PAGE_PROPERTIES_EXCLUDED_FIELDS };
|
|
29
|
+
//# sourceMappingURL=constants.js.map
|