@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.
Files changed (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -74
  3. package/dist/cjs/src/FormoAnalytics.d.ts +24 -14
  4. package/dist/cjs/src/FormoAnalytics.js +195 -255
  5. package/dist/cjs/src/FormoAnalyticsProvider.js +71 -13
  6. package/dist/cjs/src/{lib/consent.d.ts → consent/index.d.ts} +1 -1
  7. package/dist/cjs/src/{lib/consent.js → consent/index.js} +1 -1
  8. package/dist/cjs/src/constants/base.d.ts +0 -2
  9. package/dist/cjs/src/constants/base.js +3 -3
  10. package/dist/cjs/src/constants/config.js +1 -1
  11. package/dist/cjs/src/{lib/event → event}/EventFactory.d.ts +1 -1
  12. package/dist/cjs/src/{lib/event → event}/EventFactory.js +30 -13
  13. package/dist/cjs/src/{lib/event → event}/EventManager.d.ts +1 -1
  14. package/dist/cjs/src/{lib/event → event}/EventManager.js +1 -1
  15. package/dist/cjs/src/event/constants.d.ts +11 -0
  16. package/dist/cjs/src/event/constants.js +34 -0
  17. package/dist/cjs/src/{lib/event → event}/type.d.ts +1 -1
  18. package/dist/cjs/src/{lib/event → event}/utils.d.ts +1 -1
  19. package/dist/cjs/src/{lib/event → event}/utils.js +1 -1
  20. package/dist/cjs/src/{lib/fetch.d.ts → fetch/index.d.ts} +1 -1
  21. package/dist/cjs/src/{lib/fetch.js → fetch/index.js} +1 -1
  22. package/dist/cjs/src/provider/detection.d.ts +58 -0
  23. package/dist/cjs/src/provider/detection.js +103 -0
  24. package/dist/cjs/src/provider/index.d.ts +6 -0
  25. package/dist/cjs/src/provider/index.js +11 -0
  26. package/dist/{esm/src/lib → cjs/src}/queue/EventQueue.d.ts +1 -1
  27. package/dist/cjs/src/{lib/queue → queue}/EventQueue.js +3 -3
  28. package/dist/{esm/src/lib → cjs/src}/queue/type.d.ts +1 -1
  29. package/dist/cjs/src/session/index.d.ts +91 -0
  30. package/dist/cjs/src/session/index.js +126 -0
  31. package/dist/cjs/src/{lib/storage → storage}/built-in/blueprint.js +1 -1
  32. package/dist/cjs/src/types/base.d.ts +27 -1
  33. package/dist/cjs/src/validators/object.js +0 -2
  34. package/dist/cjs/src/version.d.ts +1 -1
  35. package/dist/cjs/src/version.js +1 -1
  36. package/dist/cjs/src/wagmi/WagmiEventHandler.d.ts +69 -0
  37. package/dist/cjs/src/wagmi/WagmiEventHandler.js +449 -0
  38. package/dist/cjs/src/wagmi/index.d.ts +9 -0
  39. package/dist/cjs/src/wagmi/index.js +12 -0
  40. package/dist/cjs/src/wagmi/types.d.ts +115 -0
  41. package/dist/cjs/src/wagmi/types.js +10 -0
  42. package/dist/esm/src/FormoAnalytics.d.ts +24 -14
  43. package/dist/esm/src/FormoAnalytics.js +85 -145
  44. package/dist/esm/src/FormoAnalyticsProvider.js +68 -10
  45. package/dist/esm/src/{lib/consent.d.ts → consent/index.d.ts} +1 -1
  46. package/dist/esm/src/{lib/consent.js → consent/index.js} +1 -1
  47. package/dist/esm/src/constants/base.d.ts +0 -2
  48. package/dist/esm/src/constants/base.js +2 -2
  49. package/dist/esm/src/constants/config.js +1 -1
  50. package/dist/esm/src/{lib/event → event}/EventFactory.d.ts +1 -1
  51. package/dist/esm/src/{lib/event → event}/EventFactory.js +31 -14
  52. package/dist/esm/src/{lib/event → event}/EventManager.d.ts +1 -1
  53. package/dist/esm/src/{lib/event → event}/EventManager.js +1 -1
  54. package/dist/esm/src/event/constants.d.ts +11 -0
  55. package/dist/esm/src/event/constants.js +29 -0
  56. package/dist/esm/src/{lib/event → event}/type.d.ts +1 -1
  57. package/dist/esm/src/{lib/event → event}/utils.d.ts +1 -1
  58. package/dist/esm/src/{lib/event → event}/utils.js +1 -1
  59. package/dist/esm/src/{lib/fetch.d.ts → fetch/index.d.ts} +1 -1
  60. package/dist/esm/src/{lib/fetch.js → fetch/index.js} +1 -1
  61. package/dist/esm/src/provider/detection.d.ts +58 -0
  62. package/dist/esm/src/provider/detection.js +98 -0
  63. package/dist/esm/src/provider/index.d.ts +6 -0
  64. package/dist/esm/src/provider/index.js +5 -0
  65. package/dist/{cjs/src/lib → esm/src}/queue/EventQueue.d.ts +1 -1
  66. package/dist/esm/src/{lib/queue → queue}/EventQueue.js +3 -3
  67. package/dist/{cjs/src/lib → esm/src}/queue/type.d.ts +1 -1
  68. package/dist/esm/src/session/index.d.ts +91 -0
  69. package/dist/esm/src/session/index.js +123 -0
  70. package/dist/esm/src/{lib/storage → storage}/built-in/blueprint.js +1 -1
  71. package/dist/esm/src/types/base.d.ts +27 -1
  72. package/dist/esm/src/validators/object.js +0 -2
  73. package/dist/esm/src/version.d.ts +1 -1
  74. package/dist/esm/src/version.js +1 -1
  75. package/dist/esm/src/wagmi/WagmiEventHandler.d.ts +69 -0
  76. package/dist/esm/src/wagmi/WagmiEventHandler.js +446 -0
  77. package/dist/esm/src/wagmi/index.d.ts +9 -0
  78. package/dist/esm/src/wagmi/index.js +8 -0
  79. package/dist/esm/src/wagmi/types.d.ts +115 -0
  80. package/dist/esm/src/wagmi/types.js +9 -0
  81. package/dist/index.umd.min.js +1 -1
  82. package/package.json +19 -4
  83. package/dist/cjs/src/lib/event/constants.d.ts +0 -4
  84. package/dist/cjs/src/lib/event/constants.js +0 -8
  85. package/dist/cjs/src/lib/index.d.ts +0 -7
  86. package/dist/cjs/src/lib/index.js +0 -28
  87. package/dist/esm/src/lib/event/constants.d.ts +0 -4
  88. package/dist/esm/src/lib/event/constants.js +0 -4
  89. package/dist/esm/src/lib/index.d.ts +0 -7
  90. package/dist/esm/src/lib/index.js +0 -7
  91. /package/dist/cjs/src/{lib/browser → browser}/browsers.d.ts +0 -0
  92. /package/dist/cjs/src/{lib/browser → browser}/browsers.js +0 -0
  93. /package/dist/cjs/src/{lib/event → event}/index.d.ts +0 -0
  94. /package/dist/cjs/src/{lib/event → event}/index.js +0 -0
  95. /package/dist/cjs/src/{lib/event → event}/type.js +0 -0
  96. /package/dist/cjs/src/{lib/logger → logger}/Logger.d.ts +0 -0
  97. /package/dist/cjs/src/{lib/logger → logger}/Logger.js +0 -0
  98. /package/dist/cjs/src/{lib/logger → logger}/index.d.ts +0 -0
  99. /package/dist/cjs/src/{lib/logger → logger}/index.js +0 -0
  100. /package/dist/cjs/src/{lib/logger → logger}/type.d.ts +0 -0
  101. /package/dist/cjs/src/{lib/logger → logger}/type.js +0 -0
  102. /package/dist/cjs/src/{lib/queue → queue}/index.d.ts +0 -0
  103. /package/dist/cjs/src/{lib/queue → queue}/index.js +0 -0
  104. /package/dist/cjs/src/{lib/queue → queue}/type.js +0 -0
  105. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry1.d.ts +0 -0
  106. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry1.js +0 -0
  107. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry2.d.ts +0 -0
  108. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry2.js +0 -0
  109. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry3.d.ts +0 -0
  110. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry3.js +0 -0
  111. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_has.d.ts +0 -0
  112. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_has.js +0 -0
  113. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isObject.d.ts +0 -0
  114. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isObject.js +0 -0
  115. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isPlaceholder.d.ts +0 -0
  116. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isPlaceholder.js +0 -0
  117. /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepRight.d.ts +0 -0
  118. /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepRight.js +0 -0
  119. /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepWithKey.d.ts +0 -0
  120. /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepWithKey.js +0 -0
  121. /package/dist/cjs/src/{lib/ramda → ramda}/mergeWithKey.d.ts +0 -0
  122. /package/dist/cjs/src/{lib/ramda → ramda}/mergeWithKey.js +0 -0
  123. /package/dist/cjs/src/{lib/storage → storage}/StorageManager.d.ts +0 -0
  124. /package/dist/cjs/src/{lib/storage → storage}/StorageManager.js +0 -0
  125. /package/dist/cjs/src/{lib/storage → storage}/built-in/blueprint.d.ts +0 -0
  126. /package/dist/cjs/src/{lib/storage → storage}/built-in/cookie.d.ts +0 -0
  127. /package/dist/cjs/src/{lib/storage → storage}/built-in/cookie.js +0 -0
  128. /package/dist/cjs/src/{lib/storage → storage}/built-in/memory.d.ts +0 -0
  129. /package/dist/cjs/src/{lib/storage → storage}/built-in/memory.js +0 -0
  130. /package/dist/cjs/src/{lib/storage → storage}/built-in/web.d.ts +0 -0
  131. /package/dist/cjs/src/{lib/storage → storage}/built-in/web.js +0 -0
  132. /package/dist/cjs/src/{lib/storage → storage}/constant.d.ts +0 -0
  133. /package/dist/cjs/src/{lib/storage → storage}/constant.js +0 -0
  134. /package/dist/cjs/src/{lib/storage → storage}/index.d.ts +0 -0
  135. /package/dist/cjs/src/{lib/storage → storage}/index.js +0 -0
  136. /package/dist/cjs/src/{lib/storage → storage}/type.d.ts +0 -0
  137. /package/dist/cjs/src/{lib/storage → storage}/type.js +0 -0
  138. /package/dist/esm/src/{lib/browser → browser}/browsers.d.ts +0 -0
  139. /package/dist/esm/src/{lib/browser → browser}/browsers.js +0 -0
  140. /package/dist/esm/src/{lib/event → event}/index.d.ts +0 -0
  141. /package/dist/esm/src/{lib/event → event}/index.js +0 -0
  142. /package/dist/esm/src/{lib/event → event}/type.js +0 -0
  143. /package/dist/esm/src/{lib/logger → logger}/Logger.d.ts +0 -0
  144. /package/dist/esm/src/{lib/logger → logger}/Logger.js +0 -0
  145. /package/dist/esm/src/{lib/logger → logger}/index.d.ts +0 -0
  146. /package/dist/esm/src/{lib/logger → logger}/index.js +0 -0
  147. /package/dist/esm/src/{lib/logger → logger}/type.d.ts +0 -0
  148. /package/dist/esm/src/{lib/logger → logger}/type.js +0 -0
  149. /package/dist/esm/src/{lib/queue → queue}/index.d.ts +0 -0
  150. /package/dist/esm/src/{lib/queue → queue}/index.js +0 -0
  151. /package/dist/esm/src/{lib/queue → queue}/type.js +0 -0
  152. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry1.d.ts +0 -0
  153. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry1.js +0 -0
  154. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry2.d.ts +0 -0
  155. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry2.js +0 -0
  156. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry3.d.ts +0 -0
  157. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry3.js +0 -0
  158. /package/dist/esm/src/{lib/ramda → ramda}/internal/_has.d.ts +0 -0
  159. /package/dist/esm/src/{lib/ramda → ramda}/internal/_has.js +0 -0
  160. /package/dist/esm/src/{lib/ramda → ramda}/internal/_isObject.d.ts +0 -0
  161. /package/dist/esm/src/{lib/ramda → ramda}/internal/_isObject.js +0 -0
  162. /package/dist/esm/src/{lib/ramda → ramda}/internal/_isPlaceholder.d.ts +0 -0
  163. /package/dist/esm/src/{lib/ramda → ramda}/internal/_isPlaceholder.js +0 -0
  164. /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepRight.d.ts +0 -0
  165. /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepRight.js +0 -0
  166. /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepWithKey.d.ts +0 -0
  167. /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepWithKey.js +0 -0
  168. /package/dist/esm/src/{lib/ramda → ramda}/mergeWithKey.d.ts +0 -0
  169. /package/dist/esm/src/{lib/ramda → ramda}/mergeWithKey.js +0 -0
  170. /package/dist/esm/src/{lib/storage → storage}/StorageManager.d.ts +0 -0
  171. /package/dist/esm/src/{lib/storage → storage}/StorageManager.js +0 -0
  172. /package/dist/esm/src/{lib/storage → storage}/built-in/blueprint.d.ts +0 -0
  173. /package/dist/esm/src/{lib/storage → storage}/built-in/cookie.d.ts +0 -0
  174. /package/dist/esm/src/{lib/storage → storage}/built-in/cookie.js +0 -0
  175. /package/dist/esm/src/{lib/storage → storage}/built-in/memory.d.ts +0 -0
  176. /package/dist/esm/src/{lib/storage → storage}/built-in/memory.js +0 -0
  177. /package/dist/esm/src/{lib/storage → storage}/built-in/web.d.ts +0 -0
  178. /package/dist/esm/src/{lib/storage → storage}/built-in/web.js +0 -0
  179. /package/dist/esm/src/{lib/storage → storage}/constant.d.ts +0 -0
  180. /package/dist/esm/src/{lib/storage → storage}/constant.js +0 -0
  181. /package/dist/esm/src/{lib/storage → storage}/index.d.ts +0 -0
  182. /package/dist/esm/src/{lib/storage → storage}/index.js +0 -0
  183. /package/dist/esm/src/{lib/storage → storage}/type.d.ts +0 -0
  184. /package/dist/esm/src/{lib/storage → storage}/type.js +0 -0
@@ -51,11 +51,13 @@ exports.useFormo = exports.FormoAnalyticsProvider = exports.FormoAnalyticsContex
51
51
  var jsx_runtime_1 = require("react/jsx-runtime");
52
52
  var react_1 = require("react");
53
53
  var FormoAnalytics_1 = require("./FormoAnalytics");
54
- var lib_1 = require("./lib");
54
+ var storage_1 = require("./storage");
55
+ var logger_1 = require("./logger");
55
56
  var defaultContext = {
56
57
  chain: function () { return Promise.resolve(); },
57
58
  page: function () { return Promise.resolve(); },
58
59
  reset: function () { },
60
+ cleanup: function () { },
59
61
  detect: function () { return Promise.resolve(); },
60
62
  connect: function () { return Promise.resolve(); },
61
63
  disconnect: function () { return Promise.resolve(); },
@@ -73,11 +75,11 @@ var FormoAnalyticsProvider = function (props) {
73
75
  var writeKey = props.writeKey, _a = props.disabled, disabled = _a === void 0 ? false : _a, children = props.children;
74
76
  // Keep the app running without analytics if no Write Key is provided or disabled
75
77
  if (!writeKey) {
76
- lib_1.logger.error("FormoAnalyticsProvider: No Write Key provided");
78
+ logger_1.logger.error("FormoAnalyticsProvider: No Write Key provided");
77
79
  return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children });
78
80
  }
79
81
  if (disabled) {
80
- lib_1.logger.warn("FormoAnalytics is disabled");
82
+ logger_1.logger.warn("FormoAnalytics is disabled");
81
83
  return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children });
82
84
  }
83
85
  return (0, jsx_runtime_1.jsx)(InitializedAnalytics, __assign({}, props));
@@ -86,42 +88,98 @@ exports.FormoAnalyticsProvider = FormoAnalyticsProvider;
86
88
  var InitializedAnalytics = function (_a) {
87
89
  var writeKey = _a.writeKey, options = _a.options, children = _a.children;
88
90
  var _b = (0, react_1.useState)(defaultContext), sdk = _b[0], setSdk = _b[1];
89
- var initializedStartedRef = (0, react_1.useRef)(false);
90
- (0, lib_1.initStorageManager)(writeKey);
91
+ var sdkRef = (0, react_1.useRef)(defaultContext);
92
+ (0, storage_1.initStorageManager)(writeKey);
93
+ // Create a stable key from options that ignores complex objects and functions
94
+ // We only care about serializable config values that would affect SDK behavior
95
+ var optionsKey = (0, react_1.useMemo)(function () {
96
+ if (!options)
97
+ return 'undefined';
98
+ // Extract only the serializable parts of options
99
+ var serializableOptions = {
100
+ tracking: options.tracking,
101
+ autocapture: options.autocapture,
102
+ apiHost: options.apiHost,
103
+ flushAt: options.flushAt,
104
+ flushInterval: options.flushInterval,
105
+ retryCount: options.retryCount,
106
+ maxQueueSize: options.maxQueueSize,
107
+ logger: options.logger,
108
+ referral: options.referral,
109
+ // For complex objects, just track their presence, not their content
110
+ hasProvider: !!options.provider,
111
+ hasWagmi: !!options.wagmi,
112
+ hasReady: !!options.ready,
113
+ };
114
+ try {
115
+ return JSON.stringify(serializableOptions);
116
+ }
117
+ catch (error) {
118
+ // Fallback to timestamp if serialization fails
119
+ logger_1.logger.warn('Failed to serialize options, using timestamp', error);
120
+ return Date.now().toString();
121
+ }
122
+ }, [options]);
91
123
  (0, react_1.useEffect)(function () {
124
+ var isCleanedUp = false;
92
125
  var initialize = function () { return __awaiter(void 0, void 0, void 0, function () {
93
126
  var sdkInstance, error_1;
94
127
  return __generator(this, function (_a) {
95
128
  switch (_a.label) {
96
129
  case 0:
97
- if (initializedStartedRef.current)
98
- return [2 /*return*/];
99
- initializedStartedRef.current = true;
130
+ // Clean up existing SDK instance before creating a new one
131
+ if (sdkRef.current && sdkRef.current !== defaultContext) {
132
+ logger_1.logger.log("Cleaning up existing FormoAnalytics SDK instance before re-initialization");
133
+ sdkRef.current.cleanup();
134
+ sdkRef.current = defaultContext;
135
+ setSdk(defaultContext);
136
+ }
100
137
  _a.label = 1;
101
138
  case 1:
102
139
  _a.trys.push([1, 3, , 4]);
103
140
  return [4 /*yield*/, FormoAnalytics_1.FormoAnalytics.init(writeKey, options)];
104
141
  case 2:
105
142
  sdkInstance = _a.sent();
106
- setSdk(sdkInstance);
107
- lib_1.logger.log("Successfully initialized");
143
+ // Only set SDK if the component hasn't been cleaned up during async initialization
144
+ if (!isCleanedUp) {
145
+ setSdk(sdkInstance);
146
+ sdkRef.current = sdkInstance;
147
+ logger_1.logger.log("Successfully initialized FormoAnalytics SDK");
148
+ }
149
+ else {
150
+ // Component was unmounted during initialization, clean up immediately
151
+ logger_1.logger.log("Component unmounted during initialization, cleaning up SDK");
152
+ sdkInstance.cleanup();
153
+ }
108
154
  return [3 /*break*/, 4];
109
155
  case 3:
110
156
  error_1 = _a.sent();
111
- lib_1.logger.error("Failed to initialize", error_1);
157
+ if (!isCleanedUp) {
158
+ logger_1.logger.error("Failed to initialize FormoAnalytics SDK", error_1);
159
+ }
112
160
  return [3 /*break*/, 4];
113
161
  case 4: return [2 /*return*/];
114
162
  }
115
163
  });
116
164
  }); };
117
165
  initialize();
118
- }, [writeKey, options]);
166
+ // Cleanup function to prevent memory leaks
167
+ // Using ref ensures we clean up the actual SDK instance, not the stale closure value
168
+ return function () {
169
+ isCleanedUp = true;
170
+ if (sdkRef.current && sdkRef.current !== defaultContext) {
171
+ logger_1.logger.log("Cleaning up FormoAnalytics SDK instance");
172
+ sdkRef.current.cleanup();
173
+ sdkRef.current = defaultContext;
174
+ }
175
+ };
176
+ }, [writeKey, optionsKey]);
119
177
  return ((0, jsx_runtime_1.jsx)(exports.FormoAnalyticsContext.Provider, { value: sdk, children: children }));
120
178
  };
121
179
  var useFormo = function () {
122
180
  var context = (0, react_1.useContext)(exports.FormoAnalyticsContext);
123
181
  if (!context) {
124
- lib_1.logger.warn("useFormo called without a valid context");
182
+ logger_1.logger.warn("useFormo called without a valid context");
125
183
  }
126
184
  return context; // Return undefined if SDK is not initialized, handle accordingly in consumer
127
185
  };
@@ -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=consent.d.ts.map
35
+ //# sourceMappingURL=index.d.ts.map
@@ -99,4 +99,4 @@ function deleteCookieDirectly(cookieName) {
99
99
  }
100
100
  }
101
101
  }
102
- //# sourceMappingURL=consent.js.map
102
+ //# sourceMappingURL=index.js.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,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BLOCKED_ADDRESSES = exports.DEAD_ADDRESS = exports.ZERO_ADDRESS = exports.DEFAULT_PROVIDER_ICON = exports.CONSENT_OPT_OUT_KEY = exports.LOCAL_ANONYMOUS_ID_KEY = exports.SESSION_USER_ID_KEY = exports.SESSION_CURRENT_URL_KEY = exports.SESSION_WALLET_IDENTIFIED_KEY = exports.SESSION_WALLET_DETECTED_KEY = exports.SESSION_TRAFFIC_SOURCE_KEY = void 0;
3
+ exports.BLOCKED_ADDRESSES = exports.DEAD_ADDRESS = exports.ZERO_ADDRESS = exports.DEFAULT_PROVIDER_ICON = exports.CONSENT_OPT_OUT_KEY = exports.LOCAL_ANONYMOUS_ID_KEY = exports.SESSION_USER_ID_KEY = exports.SESSION_CURRENT_URL_KEY = exports.SESSION_TRAFFIC_SOURCE_KEY = void 0;
4
4
  exports.SESSION_TRAFFIC_SOURCE_KEY = "traffic-source";
5
- exports.SESSION_WALLET_DETECTED_KEY = "wallet-detected";
6
- exports.SESSION_WALLET_IDENTIFIED_KEY = "wallet-identified";
5
+ // SESSION_WALLET_DETECTED_KEY and SESSION_WALLET_IDENTIFIED_KEY
6
+ // are now defined in src/session/index.ts
7
7
  exports.SESSION_CURRENT_URL_KEY = "analytics-current-url";
8
8
  exports.SESSION_USER_ID_KEY = "user-id";
9
9
  exports.LOCAL_ANONYMOUS_ID_KEY = "anonymous-id";
@@ -5,7 +5,7 @@ exports.EVENTS_API_ORIGIN = "https://events.formo.so";
5
5
  exports.EVENTS_API_HOST = "".concat(exports.EVENTS_API_ORIGIN, "/v0/raw_events");
6
6
  var EVENTS_API_REQUEST_HEADER = function (writeKey) { return ({
7
7
  "Content-Type": "application/json",
8
- Authorization: "Basic ".concat(writeKey),
8
+ Authorization: "Bearer ".concat(writeKey),
9
9
  }); };
10
10
  exports.EVENTS_API_REQUEST_HEADER = EVENTS_API_REQUEST_HEADER;
11
11
  exports.COUNTRY_LIST = {
@@ -1,4 +1,4 @@
1
- import { Address, APIEvent, ChainID, IFormoEvent, IFormoEventContext, IFormoEventProperties, Nullable, Options, SignatureStatus, TransactionStatus } from "../../types";
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?;
@@ -51,15 +51,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
51
51
  };
52
52
  Object.defineProperty(exports, "__esModule", { value: true });
53
53
  exports.EventFactory = void 0;
54
- var constants_1 = require("../../constants");
55
- var utils_1 = require("../../utils");
56
- var address_1 = require("../../utils/address");
57
- var timestamp_1 = require("../../utils/timestamp");
58
- var validators_1 = require("../../validators");
54
+ var constants_1 = require("../constants");
55
+ var utils_1 = require("../utils");
56
+ var address_1 = require("../utils/address");
57
+ var timestamp_1 = require("../utils/timestamp");
58
+ var validators_1 = require("../validators");
59
59
  var logger_1 = require("../logger");
60
60
  var mergeDeepRight_1 = __importDefault(require("../ramda/mergeDeepRight"));
61
61
  var storage_1 = require("../storage");
62
- var version_1 = require("../../version");
62
+ var version_1 = require("../version");
63
63
  var constants_2 = require("./constants");
64
64
  var utils_2 = require("./utils");
65
65
  var browsers_1 = require("../browser/browsers");
@@ -156,7 +156,8 @@ var EventFactory = /** @class */ (function () {
156
156
  * @param options API options
157
157
  */
158
158
  this.getPageProperties = function (properties) {
159
- var pageProps = properties;
159
+ // Create a copy to avoid mutating the original properties object
160
+ var pageProps = __assign({}, properties);
160
161
  if ((0, validators_1.isUndefined)(pageProps.url)) {
161
162
  pageProps.url = new URL(globalThis.location.href).href;
162
163
  }
@@ -166,6 +167,24 @@ var EventFactory = /** @class */ (function () {
166
167
  if ((0, validators_1.isUndefined)(pageProps.hash)) {
167
168
  pageProps.hash = globalThis.location.hash;
168
169
  }
170
+ // Add query string without the '?' prefix
171
+ if ((0, validators_1.isUndefined)(pageProps.query)) {
172
+ pageProps.query = globalThis.location.search.slice(1);
173
+ }
174
+ // Parse query parameters and add as individual properties (don't overwrite existing)
175
+ // Skip fields that are already captured in context or are semantic event properties
176
+ try {
177
+ var urlObj = new URL(globalThis.location.href);
178
+ urlObj.searchParams.forEach(function (value, key) {
179
+ // Only add if the property doesn't already exist and is not excluded
180
+ if ((0, validators_1.isUndefined)(pageProps[key]) && !constants_2.PAGE_PROPERTIES_EXCLUDED_FIELDS.has(key)) {
181
+ pageProps[key] = value;
182
+ }
183
+ });
184
+ }
185
+ catch (error) {
186
+ logger_1.logger.error("Error parsing query parameters for page properties:", error);
187
+ }
169
188
  return pageProps;
170
189
  };
171
190
  this.options = options;
@@ -242,19 +261,17 @@ var EventFactory = /** @class */ (function () {
242
261
  // Contextual fields that are automatically collected and populated by the Formo SDK
243
262
  EventFactory.prototype.generateContext = function (context) {
244
263
  return __awaiter(this, void 0, void 0, function () {
245
- var path, browserName, language, timezone, location, library_version, defaultContext, mergedContext;
264
+ var browserName, language, timezone, location, library_version, defaultContext, mergedContext;
246
265
  return __generator(this, function (_a) {
247
266
  switch (_a.label) {
248
- case 0:
249
- path = globalThis.location.pathname;
250
- return [4 /*yield*/, (0, browsers_1.detectBrowser)()];
267
+ case 0: return [4 /*yield*/, (0, browsers_1.detectBrowser)()];
251
268
  case 1:
252
269
  browserName = _a.sent();
253
270
  language = this.getLanguage();
254
271
  timezone = this.getTimezone();
255
272
  location = this.getLocation();
256
273
  library_version = this.getLibraryVersion();
257
- defaultContext = __assign(__assign(__assign({ user_agent: globalThis.navigator.userAgent, locale: language, timezone: timezone, location: location }, this.getTrafficSources(globalThis.location.href)), { page_path: path, page_title: document.title, page_url: globalThis.location.href, library_name: "Formo Web SDK", library_version: library_version, browser: browserName }), this.getScreen());
274
+ 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());
258
275
  mergedContext = (0, mergeDeepRight_1.default)(defaultContext, context || {});
259
276
  return [2 /*return*/, mergedContext];
260
277
  }
@@ -302,7 +319,7 @@ var EventFactory = /** @class */ (function () {
302
319
  return __awaiter(this, void 0, void 0, function () {
303
320
  var props, pageEvent;
304
321
  return __generator(this, function (_a) {
305
- props = properties !== null && properties !== void 0 ? properties : {};
322
+ props = __assign({}, (properties !== null && properties !== void 0 ? properties : {}));
306
323
  props.category = category;
307
324
  props.name = name;
308
325
  props = this.getPageProperties(props);
@@ -1,4 +1,4 @@
1
- import { Address, APIEvent, Options } from "../../types";
1
+ import { Address, APIEvent, Options } from "../types";
2
2
  import { IEventQueue } from "../queue";
3
3
  import { IEventFactory, IEventManager } from "./type";
4
4
  /**
@@ -50,7 +50,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
50
50
  exports.EventManager = void 0;
51
51
  var logger_1 = require("../logger");
52
52
  var EventFactory_1 = require("./EventFactory");
53
- var address_1 = require("../../utils/address");
53
+ var address_1 = require("../utils/address");
54
54
  /**
55
55
  * A service to generate valid event payloads and queue them for processing
56
56
  */
@@ -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,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PAGE_PROPERTIES_EXCLUDED_FIELDS = exports.VERSION = exports.CHANNEL = void 0;
4
+ var CHANNEL = "web";
5
+ exports.CHANNEL = CHANNEL;
6
+ var VERSION = "0";
7
+ exports.VERSION = VERSION;
8
+ /**
9
+ * Fields that should be excluded from page event properties parsing
10
+ * These are either:
11
+ * - Already captured in event context (UTM params, referral params)
12
+ * - Semantic event properties that should not be overridden by URL params
13
+ */
14
+ var PAGE_PROPERTIES_EXCLUDED_FIELDS = new Set([
15
+ // Context fields (already captured in event context)
16
+ 'utm_source',
17
+ 'utm_medium',
18
+ 'utm_campaign',
19
+ 'utm_term',
20
+ 'utm_content',
21
+ 'ref',
22
+ 'referral',
23
+ 'refcode',
24
+ 'referrer',
25
+ // Semantic event properties (should not be overridden by URL params)
26
+ 'category',
27
+ 'name',
28
+ 'url',
29
+ 'path',
30
+ 'hash',
31
+ 'query',
32
+ ]);
33
+ exports.PAGE_PROPERTIES_EXCLUDED_FIELDS = PAGE_PROPERTIES_EXCLUDED_FIELDS;
34
+ //# sourceMappingURL=constants.js.map
@@ -1,4 +1,4 @@
1
- import { Address, APIEvent, IFormoEvent } from "../../types";
1
+ import { Address, APIEvent, IFormoEvent } from "../types";
2
2
  export interface IEventManager {
3
3
  addEvent(event: APIEvent, address?: Address, userId?: string): Promise<void>;
4
4
  }
@@ -1,4 +1,4 @@
1
- import { AnonymousID } from "../../types";
1
+ import { AnonymousID } from "../types";
2
2
  declare const generateAnonymousId: (key: string) => AnonymousID;
3
3
  declare function getCookieDomain(hostname?: string): string;
4
4
  export { generateAnonymousId, getCookieDomain };
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateAnonymousId = void 0;
4
4
  exports.getCookieDomain = getCookieDomain;
5
- var utils_1 = require("../../utils");
5
+ var utils_1 = require("../utils");
6
6
  var storage_1 = require("../storage");
7
7
  var generateAnonymousId = function (key) {
8
8
  var storedAnonymousId = (0, storage_1.cookie)().get(key);
@@ -1,3 +1,3 @@
1
1
  declare const _default: (input: string | Request | URL, init?: (RequestInit & import("fetch-retry").RequestInitRetryParams<typeof globalThis.fetch>) | undefined) => Promise<Response>;
2
2
  export default _default;
3
- //# sourceMappingURL=fetch.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -5,4 +5,4 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  var fetch_retry_1 = __importDefault(require("fetch-retry"));
7
7
  exports.default = (0, fetch_retry_1.default)(global.fetch);
8
- //# sourceMappingURL=fetch.js.map
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Provider detection utilities for identifying wallet providers
3
+ */
4
+ import { EIP1193Provider } from "../types";
5
+ /**
6
+ * Default icon for providers without custom icons
7
+ */
8
+ export declare const DEFAULT_PROVIDER_ICON: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSIjRkZGIi8+CjxwYXRoIGQ9Ik0xNiA4TDggMjRoMTZMMTYgOHoiIGZpbGw9IiMzMzMiLz4KPC9zdmc+Cg==";
9
+ /**
10
+ * Common wallet provider flags used for detection
11
+ */
12
+ export interface WalletProviderFlags {
13
+ isMetaMask?: boolean;
14
+ isCoinbaseWallet?: boolean;
15
+ isWalletConnect?: boolean;
16
+ isTrust?: boolean;
17
+ isBraveWallet?: boolean;
18
+ isPhantom?: boolean;
19
+ }
20
+ /**
21
+ * Provider information returned by detection
22
+ */
23
+ export interface ProviderInfo {
24
+ name: string;
25
+ rdns: string;
26
+ uuid: string;
27
+ icon: `data:image/${string}`;
28
+ }
29
+ /**
30
+ * Attempts to detect information about an injected provider by examining
31
+ * common wallet-specific flags and properties.
32
+ *
33
+ * @param provider The injected provider to analyze
34
+ * @returns Provider information with fallback values if detection fails
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const provider = window.ethereum;
39
+ * const info = detectInjectedProviderInfo(provider);
40
+ * console.log(info.name); // "MetaMask" or "Injected Provider"
41
+ * ```
42
+ */
43
+ export declare function detectInjectedProviderInfo(provider: EIP1193Provider): ProviderInfo;
44
+ /**
45
+ * Validates that a provider implements the required EIP-1193 interface
46
+ *
47
+ * @param provider The provider to validate
48
+ * @returns true if the provider has all required methods
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * if (isValidProvider(window.ethereum)) {
53
+ * // Safe to use provider
54
+ * }
55
+ * ```
56
+ */
57
+ export declare function isValidProvider(provider: EIP1193Provider | undefined | null): provider is EIP1193Provider;
58
+ //# sourceMappingURL=detection.d.ts.map
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * Provider detection utilities for identifying wallet providers
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_PROVIDER_ICON = void 0;
7
+ exports.detectInjectedProviderInfo = detectInjectedProviderInfo;
8
+ exports.isValidProvider = isValidProvider;
9
+ /**
10
+ * Default icon for providers without custom icons
11
+ */
12
+ exports.DEFAULT_PROVIDER_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSIjRkZGIi8+CjxwYXRoIGQ9Ik0xNiA4TDggMjRoMTZMMTYgOHoiIGZpbGw9IiMzMzMiLz4KPC9zdmc+Cg==";
13
+ /**
14
+ * Known wallet providers with their identifying flags and metadata
15
+ */
16
+ var KNOWN_PROVIDERS = [
17
+ {
18
+ flag: 'isMetaMask',
19
+ name: 'MetaMask',
20
+ rdns: 'io.metamask',
21
+ },
22
+ {
23
+ flag: 'isCoinbaseWallet',
24
+ name: 'Coinbase Wallet',
25
+ rdns: 'com.coinbase.wallet',
26
+ },
27
+ {
28
+ flag: 'isWalletConnect',
29
+ name: 'WalletConnect',
30
+ rdns: 'com.walletconnect',
31
+ },
32
+ {
33
+ flag: 'isTrust',
34
+ name: 'Trust Wallet',
35
+ rdns: 'com.trustwallet',
36
+ },
37
+ {
38
+ flag: 'isBraveWallet',
39
+ name: 'Brave Wallet',
40
+ rdns: 'com.brave.wallet',
41
+ },
42
+ {
43
+ flag: 'isPhantom',
44
+ name: 'Phantom',
45
+ rdns: 'app.phantom',
46
+ },
47
+ ];
48
+ /**
49
+ * Attempts to detect information about an injected provider by examining
50
+ * common wallet-specific flags and properties.
51
+ *
52
+ * @param provider The injected provider to analyze
53
+ * @returns Provider information with fallback values if detection fails
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * const provider = window.ethereum;
58
+ * const info = detectInjectedProviderInfo(provider);
59
+ * console.log(info.name); // "MetaMask" or "Injected Provider"
60
+ * ```
61
+ */
62
+ function detectInjectedProviderInfo(provider) {
63
+ // Default values for unknown providers
64
+ var name = "Injected Provider";
65
+ var rdns = "io.injected.provider";
66
+ // Cast to check for wallet-specific flags
67
+ var flags = provider;
68
+ // Check known providers in order of precedence
69
+ for (var _i = 0, KNOWN_PROVIDERS_1 = KNOWN_PROVIDERS; _i < KNOWN_PROVIDERS_1.length; _i++) {
70
+ var knownProvider = KNOWN_PROVIDERS_1[_i];
71
+ if (flags[knownProvider.flag]) {
72
+ name = knownProvider.name;
73
+ rdns = knownProvider.rdns;
74
+ break;
75
+ }
76
+ }
77
+ return {
78
+ name: name,
79
+ rdns: rdns,
80
+ uuid: "injected-".concat(rdns.replace(/[^a-zA-Z0-9]/g, "-")),
81
+ icon: exports.DEFAULT_PROVIDER_ICON,
82
+ };
83
+ }
84
+ /**
85
+ * Validates that a provider implements the required EIP-1193 interface
86
+ *
87
+ * @param provider The provider to validate
88
+ * @returns true if the provider has all required methods
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * if (isValidProvider(window.ethereum)) {
93
+ * // Safe to use provider
94
+ * }
95
+ * ```
96
+ */
97
+ function isValidProvider(provider) {
98
+ return (!!provider &&
99
+ typeof provider.request === "function" &&
100
+ typeof provider.on === "function" &&
101
+ typeof provider.removeListener === "function");
102
+ }
103
+ //# sourceMappingURL=detection.js.map
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Provider-related exports
3
+ */
4
+ export { detectInjectedProviderInfo, isValidProvider, DEFAULT_PROVIDER_ICON, } from './detection';
5
+ export type { WalletProviderFlags, ProviderInfo, } from './detection';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ /**
3
+ * Provider-related exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_PROVIDER_ICON = exports.isValidProvider = exports.detectInjectedProviderInfo = void 0;
7
+ var detection_1 = require("./detection");
8
+ Object.defineProperty(exports, "detectInjectedProviderInfo", { enumerable: true, get: function () { return detection_1.detectInjectedProviderInfo; } });
9
+ Object.defineProperty(exports, "isValidProvider", { enumerable: true, get: function () { return detection_1.isValidProvider; } });
10
+ Object.defineProperty(exports, "DEFAULT_PROVIDER_ICON", { enumerable: true, get: function () { return detection_1.DEFAULT_PROVIDER_ICON; } });
11
+ //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { IFormoEvent } from "../../types";
1
+ import { IFormoEvent } from "../types";
2
2
  import { IEventQueue } from "./type";
3
3
  type Options = {
4
4
  apiHost: string;
@@ -51,10 +51,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
51
51
  };
52
52
  Object.defineProperty(exports, "__esModule", { value: true });
53
53
  exports.EventQueue = void 0;
54
- var validators_1 = require("../../validators");
55
- var utils_1 = require("../../utils");
54
+ var validators_1 = require("../validators");
55
+ var utils_1 = require("../utils");
56
56
  var logger_1 = require("../logger");
57
- var constants_1 = require("../../constants");
57
+ var constants_1 = require("../constants");
58
58
  var fetch_1 = __importDefault(require("../fetch"));
59
59
  var noop = function () { };
60
60
  var DEFAULT_RETRY = 3;
@@ -1,4 +1,4 @@
1
- import { IFormoEvent } from "../../types";
1
+ import { IFormoEvent } from "../types";
2
2
  export interface IEventQueue {
3
3
  enqueue(event: IFormoEvent, callback?: (...args: any) => void): Promise<void>;
4
4
  flush(callback?: (...args: any) => void): Promise<any>;