@formo/analytics 1.25.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 (179) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/src/FormoAnalytics.d.ts +24 -14
  3. package/dist/cjs/src/FormoAnalytics.js +195 -255
  4. package/dist/cjs/src/FormoAnalyticsProvider.js +71 -13
  5. package/dist/{esm/src/lib/consent.d.ts → cjs/src/consent/index.d.ts} +1 -1
  6. package/dist/cjs/src/{lib/consent.js → consent/index.js} +1 -1
  7. package/dist/cjs/src/constants/base.d.ts +0 -2
  8. package/dist/cjs/src/constants/base.js +3 -3
  9. package/dist/cjs/src/constants/config.js +1 -1
  10. package/dist/cjs/src/{lib/event → event}/EventFactory.d.ts +1 -1
  11. package/dist/cjs/src/{lib/event → event}/EventFactory.js +6 -6
  12. package/dist/cjs/src/{lib/event → event}/EventManager.d.ts +1 -1
  13. package/dist/cjs/src/{lib/event → event}/EventManager.js +1 -1
  14. package/dist/cjs/src/{lib/event → event}/type.d.ts +1 -1
  15. package/dist/cjs/src/{lib/event → event}/utils.d.ts +1 -1
  16. package/dist/cjs/src/{lib/event → event}/utils.js +1 -1
  17. package/dist/cjs/src/{lib/fetch.d.ts → fetch/index.d.ts} +1 -1
  18. package/dist/cjs/src/{lib/fetch.js → fetch/index.js} +1 -1
  19. package/dist/cjs/src/provider/detection.d.ts +58 -0
  20. package/dist/cjs/src/provider/detection.js +103 -0
  21. package/dist/cjs/src/provider/index.d.ts +6 -0
  22. package/dist/cjs/src/provider/index.js +11 -0
  23. package/dist/{esm/src/lib → cjs/src}/queue/EventQueue.d.ts +1 -1
  24. package/dist/cjs/src/{lib/queue → queue}/EventQueue.js +3 -3
  25. package/dist/{esm/src/lib → cjs/src}/queue/type.d.ts +1 -1
  26. package/dist/cjs/src/session/index.d.ts +91 -0
  27. package/dist/cjs/src/session/index.js +126 -0
  28. package/dist/cjs/src/{lib/storage → storage}/built-in/blueprint.js +1 -1
  29. package/dist/cjs/src/types/base.d.ts +27 -1
  30. package/dist/cjs/src/validators/object.js +0 -2
  31. package/dist/cjs/src/version.d.ts +1 -1
  32. package/dist/cjs/src/version.js +1 -1
  33. package/dist/cjs/src/wagmi/WagmiEventHandler.d.ts +69 -0
  34. package/dist/cjs/src/wagmi/WagmiEventHandler.js +449 -0
  35. package/dist/cjs/src/wagmi/index.d.ts +9 -0
  36. package/dist/cjs/src/wagmi/index.js +12 -0
  37. package/dist/cjs/src/wagmi/types.d.ts +115 -0
  38. package/dist/cjs/src/wagmi/types.js +10 -0
  39. package/dist/esm/src/FormoAnalytics.d.ts +24 -14
  40. package/dist/esm/src/FormoAnalytics.js +85 -145
  41. package/dist/esm/src/FormoAnalyticsProvider.js +68 -10
  42. package/dist/{cjs/src/lib/consent.d.ts → esm/src/consent/index.d.ts} +1 -1
  43. package/dist/esm/src/{lib/consent.js → consent/index.js} +1 -1
  44. package/dist/esm/src/constants/base.d.ts +0 -2
  45. package/dist/esm/src/constants/base.js +2 -2
  46. package/dist/esm/src/constants/config.js +1 -1
  47. package/dist/esm/src/{lib/event → event}/EventFactory.d.ts +1 -1
  48. package/dist/esm/src/{lib/event → event}/EventFactory.js +6 -6
  49. package/dist/esm/src/{lib/event → event}/EventManager.d.ts +1 -1
  50. package/dist/esm/src/{lib/event → event}/EventManager.js +1 -1
  51. package/dist/esm/src/{lib/event → event}/type.d.ts +1 -1
  52. package/dist/esm/src/{lib/event → event}/utils.d.ts +1 -1
  53. package/dist/esm/src/{lib/event → event}/utils.js +1 -1
  54. package/dist/esm/src/{lib/fetch.d.ts → fetch/index.d.ts} +1 -1
  55. package/dist/esm/src/{lib/fetch.js → fetch/index.js} +1 -1
  56. package/dist/esm/src/provider/detection.d.ts +58 -0
  57. package/dist/esm/src/provider/detection.js +98 -0
  58. package/dist/esm/src/provider/index.d.ts +6 -0
  59. package/dist/esm/src/provider/index.js +5 -0
  60. package/dist/{cjs/src/lib → esm/src}/queue/EventQueue.d.ts +1 -1
  61. package/dist/esm/src/{lib/queue → queue}/EventQueue.js +3 -3
  62. package/dist/{cjs/src/lib → esm/src}/queue/type.d.ts +1 -1
  63. package/dist/esm/src/session/index.d.ts +91 -0
  64. package/dist/esm/src/session/index.js +123 -0
  65. package/dist/esm/src/{lib/storage → storage}/built-in/blueprint.js +1 -1
  66. package/dist/esm/src/types/base.d.ts +27 -1
  67. package/dist/esm/src/validators/object.js +0 -2
  68. package/dist/esm/src/version.d.ts +1 -1
  69. package/dist/esm/src/version.js +1 -1
  70. package/dist/esm/src/wagmi/WagmiEventHandler.d.ts +69 -0
  71. package/dist/esm/src/wagmi/WagmiEventHandler.js +446 -0
  72. package/dist/esm/src/wagmi/index.d.ts +9 -0
  73. package/dist/esm/src/wagmi/index.js +8 -0
  74. package/dist/esm/src/wagmi/types.d.ts +115 -0
  75. package/dist/esm/src/wagmi/types.js +9 -0
  76. package/dist/index.umd.min.js +1 -1
  77. package/package.json +18 -3
  78. package/dist/cjs/src/lib/index.d.ts +0 -7
  79. package/dist/cjs/src/lib/index.js +0 -28
  80. package/dist/esm/src/lib/index.d.ts +0 -7
  81. package/dist/esm/src/lib/index.js +0 -7
  82. /package/dist/cjs/src/{lib/browser → browser}/browsers.d.ts +0 -0
  83. /package/dist/cjs/src/{lib/browser → browser}/browsers.js +0 -0
  84. /package/dist/cjs/src/{lib/event → event}/constants.d.ts +0 -0
  85. /package/dist/cjs/src/{lib/event → event}/constants.js +0 -0
  86. /package/dist/cjs/src/{lib/event → event}/index.d.ts +0 -0
  87. /package/dist/cjs/src/{lib/event → event}/index.js +0 -0
  88. /package/dist/cjs/src/{lib/event → event}/type.js +0 -0
  89. /package/dist/cjs/src/{lib/logger → logger}/Logger.d.ts +0 -0
  90. /package/dist/cjs/src/{lib/logger → logger}/Logger.js +0 -0
  91. /package/dist/cjs/src/{lib/logger → logger}/index.d.ts +0 -0
  92. /package/dist/cjs/src/{lib/logger → logger}/index.js +0 -0
  93. /package/dist/cjs/src/{lib/logger → logger}/type.d.ts +0 -0
  94. /package/dist/cjs/src/{lib/logger → logger}/type.js +0 -0
  95. /package/dist/cjs/src/{lib/queue → queue}/index.d.ts +0 -0
  96. /package/dist/cjs/src/{lib/queue → queue}/index.js +0 -0
  97. /package/dist/cjs/src/{lib/queue → queue}/type.js +0 -0
  98. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry1.d.ts +0 -0
  99. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry1.js +0 -0
  100. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry2.d.ts +0 -0
  101. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry2.js +0 -0
  102. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry3.d.ts +0 -0
  103. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry3.js +0 -0
  104. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_has.d.ts +0 -0
  105. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_has.js +0 -0
  106. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isObject.d.ts +0 -0
  107. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isObject.js +0 -0
  108. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isPlaceholder.d.ts +0 -0
  109. /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isPlaceholder.js +0 -0
  110. /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepRight.d.ts +0 -0
  111. /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepRight.js +0 -0
  112. /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepWithKey.d.ts +0 -0
  113. /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepWithKey.js +0 -0
  114. /package/dist/cjs/src/{lib/ramda → ramda}/mergeWithKey.d.ts +0 -0
  115. /package/dist/cjs/src/{lib/ramda → ramda}/mergeWithKey.js +0 -0
  116. /package/dist/cjs/src/{lib/storage → storage}/StorageManager.d.ts +0 -0
  117. /package/dist/cjs/src/{lib/storage → storage}/StorageManager.js +0 -0
  118. /package/dist/cjs/src/{lib/storage → storage}/built-in/blueprint.d.ts +0 -0
  119. /package/dist/cjs/src/{lib/storage → storage}/built-in/cookie.d.ts +0 -0
  120. /package/dist/cjs/src/{lib/storage → storage}/built-in/cookie.js +0 -0
  121. /package/dist/cjs/src/{lib/storage → storage}/built-in/memory.d.ts +0 -0
  122. /package/dist/cjs/src/{lib/storage → storage}/built-in/memory.js +0 -0
  123. /package/dist/cjs/src/{lib/storage → storage}/built-in/web.d.ts +0 -0
  124. /package/dist/cjs/src/{lib/storage → storage}/built-in/web.js +0 -0
  125. /package/dist/cjs/src/{lib/storage → storage}/constant.d.ts +0 -0
  126. /package/dist/cjs/src/{lib/storage → storage}/constant.js +0 -0
  127. /package/dist/cjs/src/{lib/storage → storage}/index.d.ts +0 -0
  128. /package/dist/cjs/src/{lib/storage → storage}/index.js +0 -0
  129. /package/dist/cjs/src/{lib/storage → storage}/type.d.ts +0 -0
  130. /package/dist/cjs/src/{lib/storage → storage}/type.js +0 -0
  131. /package/dist/esm/src/{lib/browser → browser}/browsers.d.ts +0 -0
  132. /package/dist/esm/src/{lib/browser → browser}/browsers.js +0 -0
  133. /package/dist/esm/src/{lib/event → event}/constants.d.ts +0 -0
  134. /package/dist/esm/src/{lib/event → event}/constants.js +0 -0
  135. /package/dist/esm/src/{lib/event → event}/index.d.ts +0 -0
  136. /package/dist/esm/src/{lib/event → event}/index.js +0 -0
  137. /package/dist/esm/src/{lib/event → event}/type.js +0 -0
  138. /package/dist/esm/src/{lib/logger → logger}/Logger.d.ts +0 -0
  139. /package/dist/esm/src/{lib/logger → logger}/Logger.js +0 -0
  140. /package/dist/esm/src/{lib/logger → logger}/index.d.ts +0 -0
  141. /package/dist/esm/src/{lib/logger → logger}/index.js +0 -0
  142. /package/dist/esm/src/{lib/logger → logger}/type.d.ts +0 -0
  143. /package/dist/esm/src/{lib/logger → logger}/type.js +0 -0
  144. /package/dist/esm/src/{lib/queue → queue}/index.d.ts +0 -0
  145. /package/dist/esm/src/{lib/queue → queue}/index.js +0 -0
  146. /package/dist/esm/src/{lib/queue → queue}/type.js +0 -0
  147. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry1.d.ts +0 -0
  148. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry1.js +0 -0
  149. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry2.d.ts +0 -0
  150. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry2.js +0 -0
  151. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry3.d.ts +0 -0
  152. /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry3.js +0 -0
  153. /package/dist/esm/src/{lib/ramda → ramda}/internal/_has.d.ts +0 -0
  154. /package/dist/esm/src/{lib/ramda → ramda}/internal/_has.js +0 -0
  155. /package/dist/esm/src/{lib/ramda → ramda}/internal/_isObject.d.ts +0 -0
  156. /package/dist/esm/src/{lib/ramda → ramda}/internal/_isObject.js +0 -0
  157. /package/dist/esm/src/{lib/ramda → ramda}/internal/_isPlaceholder.d.ts +0 -0
  158. /package/dist/esm/src/{lib/ramda → ramda}/internal/_isPlaceholder.js +0 -0
  159. /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepRight.d.ts +0 -0
  160. /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepRight.js +0 -0
  161. /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepWithKey.d.ts +0 -0
  162. /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepWithKey.js +0 -0
  163. /package/dist/esm/src/{lib/ramda → ramda}/mergeWithKey.d.ts +0 -0
  164. /package/dist/esm/src/{lib/ramda → ramda}/mergeWithKey.js +0 -0
  165. /package/dist/esm/src/{lib/storage → storage}/StorageManager.d.ts +0 -0
  166. /package/dist/esm/src/{lib/storage → storage}/StorageManager.js +0 -0
  167. /package/dist/esm/src/{lib/storage → storage}/built-in/blueprint.d.ts +0 -0
  168. /package/dist/esm/src/{lib/storage → storage}/built-in/cookie.d.ts +0 -0
  169. /package/dist/esm/src/{lib/storage → storage}/built-in/cookie.js +0 -0
  170. /package/dist/esm/src/{lib/storage → storage}/built-in/memory.d.ts +0 -0
  171. /package/dist/esm/src/{lib/storage → storage}/built-in/memory.js +0 -0
  172. /package/dist/esm/src/{lib/storage → storage}/built-in/web.d.ts +0 -0
  173. /package/dist/esm/src/{lib/storage → storage}/built-in/web.js +0 -0
  174. /package/dist/esm/src/{lib/storage → storage}/constant.d.ts +0 -0
  175. /package/dist/esm/src/{lib/storage → storage}/constant.js +0 -0
  176. /package/dist/esm/src/{lib/storage → storage}/index.d.ts +0 -0
  177. /package/dist/esm/src/{lib/storage → storage}/index.js +0 -0
  178. /package/dist/esm/src/{lib/storage → storage}/type.d.ts +0 -0
  179. /package/dist/esm/src/{lib/storage → storage}/type.js +0 -0
@@ -0,0 +1,449 @@
1
+ "use strict";
2
+ /**
3
+ * WagmiEventHandler
4
+ *
5
+ * Handles wallet event tracking by hooking into Wagmi v2's config.subscribe()
6
+ * and TanStack Query's MutationCache. This replaces the EIP-1193 provider
7
+ * wrapping approach when Wagmi mode is enabled.
8
+ */
9
+ var __assign = (this && this.__assign) || function () {
10
+ __assign = Object.assign || function(t) {
11
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
12
+ s = arguments[i];
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
14
+ t[p] = s[p];
15
+ }
16
+ return t;
17
+ };
18
+ return __assign.apply(this, arguments);
19
+ };
20
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
21
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
22
+ return new (P || (P = Promise))(function (resolve, reject) {
23
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
24
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
25
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
26
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
27
+ });
28
+ };
29
+ var __generator = (this && this.__generator) || function (thisArg, body) {
30
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
31
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
32
+ function verb(n) { return function (v) { return step([n, v]); }; }
33
+ function step(op) {
34
+ if (f) throw new TypeError("Generator is already executing.");
35
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
36
+ 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;
37
+ if (y = 0, t) op = [op[0] & 2, t.value];
38
+ switch (op[0]) {
39
+ case 0: case 1: t = op; break;
40
+ case 4: _.label++; return { value: op[1], done: false };
41
+ case 5: _.label++; y = op[1]; op = [0]; continue;
42
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
43
+ default:
44
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
45
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
46
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
47
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
48
+ if (t[2]) _.ops.pop();
49
+ _.trys.pop(); continue;
50
+ }
51
+ op = body.call(thisArg, _);
52
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
53
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
54
+ }
55
+ };
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ exports.WagmiEventHandler = void 0;
58
+ var events_1 = require("../types/events");
59
+ var logger_1 = require("../logger");
60
+ var WagmiEventHandler = /** @class */ (function () {
61
+ function WagmiEventHandler(formoAnalytics, wagmiConfig, queryClient) {
62
+ this.unsubscribers = [];
63
+ this.trackingState = {
64
+ isProcessing: false,
65
+ };
66
+ /**
67
+ * Track processed mutation states to prevent duplicate event emissions
68
+ * Key format: `${mutationId}:${status}`
69
+ */
70
+ this.processedMutations = new Set();
71
+ this.formo = formoAnalytics;
72
+ this.wagmiConfig = wagmiConfig;
73
+ this.queryClient = queryClient;
74
+ logger_1.logger.info("WagmiEventHandler: Initializing Wagmi integration");
75
+ // Set up connection/disconnection/chain listeners
76
+ this.setupConnectionListeners();
77
+ // Set up mutation tracking if QueryClient is provided
78
+ if (this.queryClient) {
79
+ this.setupMutationTracking();
80
+ }
81
+ else {
82
+ logger_1.logger.warn("WagmiEventHandler: QueryClient not provided, signature and transaction events will not be tracked");
83
+ }
84
+ }
85
+ /**
86
+ * Set up listeners for wallet connection, disconnection, and chain changes
87
+ */
88
+ WagmiEventHandler.prototype.setupConnectionListeners = function () {
89
+ var _this = this;
90
+ logger_1.logger.info("WagmiEventHandler: Setting up connection listeners");
91
+ // Subscribe to status changes (connect/disconnect)
92
+ var statusUnsubscribe = this.wagmiConfig.subscribe(function (state) { return state.status; }, function (status, prevStatus) {
93
+ _this.handleStatusChange(status, prevStatus);
94
+ });
95
+ this.unsubscribers.push(statusUnsubscribe);
96
+ // Subscribe to chain ID changes
97
+ var chainIdUnsubscribe = this.wagmiConfig.subscribe(function (state) { return state.chainId; }, function (chainId, prevChainId) {
98
+ _this.handleChainChange(chainId, prevChainId);
99
+ });
100
+ this.unsubscribers.push(chainIdUnsubscribe);
101
+ logger_1.logger.info("WagmiEventHandler: Connection listeners set up successfully");
102
+ };
103
+ /**
104
+ * Handle status changes (connect/disconnect)
105
+ */
106
+ WagmiEventHandler.prototype.handleStatusChange = function (status, prevStatus) {
107
+ return __awaiter(this, void 0, void 0, function () {
108
+ var state, address, chainId, connectorName, error_1;
109
+ return __generator(this, function (_a) {
110
+ switch (_a.label) {
111
+ case 0:
112
+ // Prevent concurrent processing
113
+ if (this.trackingState.isProcessing) {
114
+ logger_1.logger.debug("WagmiEventHandler: Already processing status change, skipping");
115
+ return [2 /*return*/];
116
+ }
117
+ this.trackingState.isProcessing = true;
118
+ _a.label = 1;
119
+ case 1:
120
+ _a.trys.push([1, 7, 8, 9]);
121
+ state = this.getState();
122
+ address = this.getConnectedAddress(state);
123
+ chainId = state.chainId;
124
+ logger_1.logger.info("WagmiEventHandler: Status changed", {
125
+ status: status,
126
+ prevStatus: prevStatus,
127
+ address: address,
128
+ chainId: chainId,
129
+ });
130
+ if (!(status === "disconnected" && prevStatus === "connected")) return [3 /*break*/, 4];
131
+ if (!this.formo.isAutocaptureEnabled("disconnect")) return [3 /*break*/, 3];
132
+ return [4 /*yield*/, this.formo.disconnect({
133
+ chainId: this.trackingState.lastChainId,
134
+ address: this.trackingState.lastAddress,
135
+ })];
136
+ case 2:
137
+ _a.sent();
138
+ _a.label = 3;
139
+ case 3:
140
+ this.trackingState.lastAddress = undefined;
141
+ this.trackingState.lastChainId = undefined;
142
+ _a.label = 4;
143
+ case 4:
144
+ if (!(status === "connected" && prevStatus !== "connected")) return [3 /*break*/, 6];
145
+ if (!(address && chainId !== undefined)) return [3 /*break*/, 6];
146
+ this.trackingState.lastAddress = address;
147
+ this.trackingState.lastChainId = chainId;
148
+ if (!this.formo.isAutocaptureEnabled("connect")) return [3 /*break*/, 6];
149
+ connectorName = this.getConnectorName(state);
150
+ return [4 /*yield*/, this.formo.connect({ chainId: chainId, address: address }, __assign({}, (connectorName && { providerName: connectorName })))];
151
+ case 5:
152
+ _a.sent();
153
+ _a.label = 6;
154
+ case 6:
155
+ this.trackingState.lastStatus = status;
156
+ return [3 /*break*/, 9];
157
+ case 7:
158
+ error_1 = _a.sent();
159
+ logger_1.logger.error("WagmiEventHandler: Error handling status change:", error_1);
160
+ return [3 /*break*/, 9];
161
+ case 8:
162
+ this.trackingState.isProcessing = false;
163
+ return [7 /*endfinally*/];
164
+ case 9: return [2 /*return*/];
165
+ }
166
+ });
167
+ });
168
+ };
169
+ /**
170
+ * Handle chain ID changes
171
+ */
172
+ WagmiEventHandler.prototype.handleChainChange = function (chainId, prevChainId) {
173
+ return __awaiter(this, void 0, void 0, function () {
174
+ var state, address, error_2;
175
+ return __generator(this, function (_a) {
176
+ switch (_a.label) {
177
+ case 0:
178
+ if (chainId === prevChainId || chainId === undefined) {
179
+ return [2 /*return*/];
180
+ }
181
+ state = this.getState();
182
+ if (state.status !== "connected") {
183
+ return [2 /*return*/];
184
+ }
185
+ address = this.getConnectedAddress(state);
186
+ if (!address) {
187
+ logger_1.logger.warn("WagmiEventHandler: Chain changed but no address found");
188
+ return [2 /*return*/];
189
+ }
190
+ logger_1.logger.info("WagmiEventHandler: Chain changed", {
191
+ chainId: chainId,
192
+ prevChainId: prevChainId,
193
+ address: address,
194
+ });
195
+ this.trackingState.lastChainId = chainId;
196
+ if (!this.formo.isAutocaptureEnabled("chain")) return [3 /*break*/, 4];
197
+ _a.label = 1;
198
+ case 1:
199
+ _a.trys.push([1, 3, , 4]);
200
+ return [4 /*yield*/, this.formo.chain({ chainId: chainId, address: address })];
201
+ case 2:
202
+ _a.sent();
203
+ return [3 /*break*/, 4];
204
+ case 3:
205
+ error_2 = _a.sent();
206
+ logger_1.logger.error("WagmiEventHandler: Error tracking chain change:", error_2);
207
+ return [3 /*break*/, 4];
208
+ case 4: return [2 /*return*/];
209
+ }
210
+ });
211
+ });
212
+ };
213
+ /**
214
+ * Set up mutation tracking for signatures and transactions
215
+ */
216
+ WagmiEventHandler.prototype.setupMutationTracking = function () {
217
+ var _this = this;
218
+ if (!this.queryClient) {
219
+ return;
220
+ }
221
+ logger_1.logger.info("WagmiEventHandler: Setting up mutation tracking");
222
+ var mutationCache = this.queryClient.getMutationCache();
223
+ var unsubscribe = mutationCache.subscribe(function (event) {
224
+ _this.handleMutationEvent(event);
225
+ });
226
+ this.unsubscribers.push(unsubscribe);
227
+ logger_1.logger.info("WagmiEventHandler: Mutation tracking set up successfully");
228
+ };
229
+ /**
230
+ * Handle mutation cache events (signatures, transactions)
231
+ */
232
+ WagmiEventHandler.prototype.handleMutationEvent = function (event) {
233
+ if (event.type !== "updated") {
234
+ return;
235
+ }
236
+ var mutation = event.mutation;
237
+ var mutationKey = mutation.options.mutationKey;
238
+ if (!mutationKey || mutationKey.length === 0) {
239
+ return;
240
+ }
241
+ var mutationType = mutationKey[0];
242
+ var state = mutation.state;
243
+ // Create a unique key for this mutation state to prevent duplicate processing
244
+ var mutationStateKey = "".concat(mutation.mutationId, ":").concat(state.status);
245
+ // Skip if we've already processed this mutation state
246
+ if (this.processedMutations.has(mutationStateKey)) {
247
+ logger_1.logger.debug("WagmiEventHandler: Skipping duplicate mutation event", {
248
+ mutationType: mutationType,
249
+ mutationId: mutation.mutationId,
250
+ status: state.status,
251
+ });
252
+ return;
253
+ }
254
+ // Mark this mutation state as processed
255
+ this.processedMutations.add(mutationStateKey);
256
+ logger_1.logger.debug("WagmiEventHandler: Mutation event", {
257
+ mutationType: mutationType,
258
+ mutationId: mutation.mutationId,
259
+ status: state.status,
260
+ });
261
+ // Handle signature mutations
262
+ if (mutationType === "signMessage" || mutationType === "signTypedData") {
263
+ this.handleSignatureMutation(mutationType, mutation);
264
+ }
265
+ // Handle transaction mutations
266
+ if (mutationType === "sendTransaction" || mutationType === "writeContract") {
267
+ this.handleTransactionMutation(mutationType, mutation);
268
+ }
269
+ // Clean up old processed mutations to prevent memory leaks
270
+ // Keep only recent mutations (max 1000 entries)
271
+ if (this.processedMutations.size > 1000) {
272
+ var entries = Array.from(this.processedMutations);
273
+ // Remove oldest 500 entries
274
+ for (var i = 0; i < 500; i++) {
275
+ this.processedMutations.delete(entries[i]);
276
+ }
277
+ }
278
+ };
279
+ /**
280
+ * Handle signature mutations (signMessage, signTypedData)
281
+ */
282
+ WagmiEventHandler.prototype.handleSignatureMutation = function (mutationType, mutation) {
283
+ if (!this.formo.isAutocaptureEnabled("signature")) {
284
+ return;
285
+ }
286
+ var state = mutation.state;
287
+ var variables = state.variables || {};
288
+ var chainId = this.trackingState.lastChainId;
289
+ var address = this.trackingState.lastAddress;
290
+ if (!address) {
291
+ logger_1.logger.warn("WagmiEventHandler: Signature event but no address available");
292
+ return;
293
+ }
294
+ try {
295
+ // Map Wagmi mutation status to Formo signature status
296
+ var status_1;
297
+ var signatureHash = void 0;
298
+ if (state.status === "pending") {
299
+ status_1 = events_1.SignatureStatus.REQUESTED;
300
+ }
301
+ else if (state.status === "success") {
302
+ status_1 = events_1.SignatureStatus.CONFIRMED;
303
+ signatureHash = state.data;
304
+ }
305
+ else if (state.status === "error") {
306
+ status_1 = events_1.SignatureStatus.REJECTED;
307
+ }
308
+ else {
309
+ return; // Ignore idle state
310
+ }
311
+ // Extract message from variables
312
+ var message = void 0;
313
+ if (mutationType === "signMessage") {
314
+ message = variables.message || "";
315
+ }
316
+ else {
317
+ // For signTypedData, stringify the typed data
318
+ message = JSON.stringify(variables.message || variables.types || {});
319
+ }
320
+ logger_1.logger.info("WagmiEventHandler: Tracking signature event", {
321
+ status: status_1,
322
+ mutationType: mutationType,
323
+ address: address,
324
+ chainId: chainId,
325
+ });
326
+ this.formo.signature(__assign({ status: status_1, chainId: chainId, address: address, message: message }, (signatureHash && { signatureHash: signatureHash })));
327
+ }
328
+ catch (error) {
329
+ logger_1.logger.error("WagmiEventHandler: Error handling signature mutation:", error);
330
+ }
331
+ };
332
+ /**
333
+ * Handle transaction mutations (sendTransaction, writeContract)
334
+ */
335
+ WagmiEventHandler.prototype.handleTransactionMutation = function (mutationType, mutation) {
336
+ var _a;
337
+ if (!this.formo.isAutocaptureEnabled("transaction")) {
338
+ return;
339
+ }
340
+ var state = mutation.state;
341
+ var variables = state.variables || {};
342
+ var chainId = this.trackingState.lastChainId || variables.chainId;
343
+ var address = this.trackingState.lastAddress || variables.account || variables.address;
344
+ if (!address) {
345
+ logger_1.logger.warn("WagmiEventHandler: Transaction event but no address available");
346
+ return;
347
+ }
348
+ try {
349
+ // Map Wagmi mutation status to Formo transaction status
350
+ var status_2;
351
+ var transactionHash = void 0;
352
+ if (state.status === "pending") {
353
+ status_2 = events_1.TransactionStatus.STARTED;
354
+ }
355
+ else if (state.status === "success") {
356
+ status_2 = events_1.TransactionStatus.BROADCASTED;
357
+ transactionHash = state.data;
358
+ }
359
+ else if (state.status === "error") {
360
+ status_2 = events_1.TransactionStatus.REJECTED;
361
+ }
362
+ else {
363
+ return; // Ignore idle state
364
+ }
365
+ // Extract transaction details from variables
366
+ var data = variables.data;
367
+ var to = variables.to || variables.address;
368
+ var value = (_a = variables.value) === null || _a === void 0 ? void 0 : _a.toString();
369
+ logger_1.logger.info("WagmiEventHandler: Tracking transaction event", {
370
+ status: status_2,
371
+ mutationType: mutationType,
372
+ address: address,
373
+ chainId: chainId,
374
+ transactionHash: transactionHash,
375
+ });
376
+ this.formo.transaction(__assign(__assign(__assign(__assign({ status: status_2, chainId: chainId || 0, address: address }, (data && { data: data })), (to && { to: to })), (value && { value: value })), (transactionHash && { transactionHash: transactionHash })));
377
+ }
378
+ catch (error) {
379
+ logger_1.logger.error("WagmiEventHandler: Error handling transaction mutation:", error);
380
+ }
381
+ };
382
+ /**
383
+ * Get the current Wagmi state
384
+ * Supports both getState() method and direct state property access
385
+ * for compatibility with different Wagmi wrappers (RainbowKit, etc.)
386
+ */
387
+ WagmiEventHandler.prototype.getState = function () {
388
+ // Try getState() method first (standard Wagmi API)
389
+ if (typeof this.wagmiConfig.getState === "function") {
390
+ return this.wagmiConfig.getState();
391
+ }
392
+ // Fall back to direct state property (RainbowKit and some Wagmi setups)
393
+ if (this.wagmiConfig.state) {
394
+ return this.wagmiConfig.state;
395
+ }
396
+ // Return a default disconnected state if neither is available
397
+ logger_1.logger.warn("WagmiEventHandler: Unable to get state from config, returning default state");
398
+ return {
399
+ status: "disconnected",
400
+ connections: new Map(),
401
+ current: undefined,
402
+ chainId: undefined,
403
+ };
404
+ };
405
+ /**
406
+ * Get the currently connected address from Wagmi state
407
+ */
408
+ WagmiEventHandler.prototype.getConnectedAddress = function (state) {
409
+ if (!state.current) {
410
+ return undefined;
411
+ }
412
+ var connection = state.connections.get(state.current);
413
+ if (!connection || connection.accounts.length === 0) {
414
+ return undefined;
415
+ }
416
+ return connection.accounts[0];
417
+ };
418
+ /**
419
+ * Get the connector name from Wagmi state
420
+ */
421
+ WagmiEventHandler.prototype.getConnectorName = function (state) {
422
+ if (!state.current) {
423
+ return undefined;
424
+ }
425
+ var connection = state.connections.get(state.current);
426
+ return connection === null || connection === void 0 ? void 0 : connection.connector.name;
427
+ };
428
+ /**
429
+ * Clean up all subscriptions
430
+ */
431
+ WagmiEventHandler.prototype.cleanup = function () {
432
+ logger_1.logger.info("WagmiEventHandler: Cleaning up subscriptions");
433
+ for (var _i = 0, _a = this.unsubscribers; _i < _a.length; _i++) {
434
+ var unsubscribe = _a[_i];
435
+ try {
436
+ unsubscribe();
437
+ }
438
+ catch (error) {
439
+ logger_1.logger.error("WagmiEventHandler: Error during cleanup:", error);
440
+ }
441
+ }
442
+ this.unsubscribers = [];
443
+ this.processedMutations.clear();
444
+ logger_1.logger.info("WagmiEventHandler: Cleanup complete");
445
+ };
446
+ return WagmiEventHandler;
447
+ }());
448
+ exports.WagmiEventHandler = WagmiEventHandler;
449
+ //# sourceMappingURL=WagmiEventHandler.js.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Wagmi integration module
3
+ *
4
+ * Provides integration with Wagmi v2 for wallet event tracking.
5
+ * This module exports the WagmiEventHandler and related types.
6
+ */
7
+ export { WagmiEventHandler } from "./WagmiEventHandler";
8
+ export type { WagmiState, WagmiConnection, WagmiConnector, WagmiConfig, MutationState, Mutation, MutationCacheEvent, MutationCache, QueryClient, UnsubscribeFn, WagmiMutationKey, WagmiTrackingState, } from "./types";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Wagmi integration module
4
+ *
5
+ * Provides integration with Wagmi v2 for wallet event tracking.
6
+ * This module exports the WagmiEventHandler and related types.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.WagmiEventHandler = void 0;
10
+ var WagmiEventHandler_1 = require("./WagmiEventHandler");
11
+ Object.defineProperty(exports, "WagmiEventHandler", { enumerable: true, get: function () { return WagmiEventHandler_1.WagmiEventHandler; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Wagmi-specific type definitions for wallet event tracking
3
+ *
4
+ * These types provide TypeScript interfaces for Wagmi v2 integration,
5
+ * allowing the SDK to hook into Wagmi's config.subscribe() and MutationCache
6
+ * to track wallet events without wrapping EIP-1193 providers.
7
+ */
8
+ /**
9
+ * Wagmi config state structure
10
+ * Based on Wagmi v2 internal state
11
+ */
12
+ export interface WagmiState {
13
+ chainId?: number;
14
+ connections: Map<string, WagmiConnection>;
15
+ current?: string;
16
+ status: 'connected' | 'disconnected' | 'connecting' | 'reconnecting';
17
+ }
18
+ /**
19
+ * Wagmi connection information
20
+ */
21
+ export interface WagmiConnection {
22
+ accounts: readonly string[];
23
+ chainId: number;
24
+ connector: WagmiConnector;
25
+ }
26
+ /**
27
+ * Wagmi connector interface
28
+ */
29
+ export interface WagmiConnector {
30
+ id: string;
31
+ name: string;
32
+ type: string;
33
+ uid: string;
34
+ }
35
+ /**
36
+ * Wagmi config interface
37
+ * This is the config object returned by createConfig() or getDefaultConfig() (RainbowKit)
38
+ *
39
+ * Note: Different Wagmi wrappers (RainbowKit, etc.) may expose state differently:
40
+ * - Some use getState() method
41
+ * - Some expose state as a direct property
42
+ * We support both patterns for maximum compatibility.
43
+ */
44
+ export interface WagmiConfig {
45
+ subscribe<TData>(selector: (state: WagmiState) => TData, listener: (selectedState: TData, previousSelectedState: TData) => void, options?: {
46
+ equalityFn?: (a: TData, b: TData) => boolean;
47
+ fireImmediately?: boolean;
48
+ }): () => void;
49
+ /**
50
+ * Get state method - available in some Wagmi versions
51
+ */
52
+ getState?(): WagmiState;
53
+ /**
54
+ * Direct state property - available in RainbowKit and some Wagmi setups
55
+ */
56
+ state?: WagmiState;
57
+ }
58
+ /**
59
+ * React Query (TanStack Query) mutation state
60
+ */
61
+ export interface MutationState {
62
+ status: 'idle' | 'pending' | 'success' | 'error';
63
+ data?: any;
64
+ error?: Error | null;
65
+ variables?: any;
66
+ context?: any;
67
+ }
68
+ /**
69
+ * React Query mutation object
70
+ */
71
+ export interface Mutation {
72
+ state: MutationState;
73
+ options: {
74
+ mutationKey?: readonly unknown[];
75
+ [key: string]: any;
76
+ };
77
+ mutationId: number;
78
+ }
79
+ /**
80
+ * React Query mutation cache event
81
+ */
82
+ export interface MutationCacheEvent {
83
+ type: 'added' | 'removed' | 'updated';
84
+ mutation: Mutation;
85
+ }
86
+ /**
87
+ * React Query MutationCache interface
88
+ */
89
+ export interface MutationCache {
90
+ subscribe(listener: (event: MutationCacheEvent) => void): () => void;
91
+ }
92
+ /**
93
+ * React Query QueryClient interface
94
+ */
95
+ export interface QueryClient {
96
+ getMutationCache(): MutationCache;
97
+ }
98
+ /**
99
+ * Unsubscribe function returned by subscriptions
100
+ */
101
+ export type UnsubscribeFn = () => void;
102
+ /**
103
+ * Wagmi mutation key types for identifying wallet operations
104
+ */
105
+ export type WagmiMutationKey = 'signMessage' | 'signTypedData' | 'sendTransaction' | 'writeContract';
106
+ /**
107
+ * Internal tracking state for Wagmi event handler
108
+ */
109
+ export interface WagmiTrackingState {
110
+ lastChainId?: number;
111
+ lastAddress?: string;
112
+ lastStatus?: WagmiState['status'];
113
+ isProcessing: boolean;
114
+ }
115
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * Wagmi-specific type definitions for wallet event tracking
4
+ *
5
+ * These types provide TypeScript interfaces for Wagmi v2 integration,
6
+ * allowing the SDK to hook into Wagmi's config.subscribe() and MutationCache
7
+ * to track wallet events without wrapping EIP-1193 providers.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ //# sourceMappingURL=types.js.map
@@ -24,6 +24,16 @@ export declare class FormoAnalytics implements IFormoAnalytics {
24
24
  private _injectedProviderDetail?;
25
25
  private _processingAccountsChanged;
26
26
  private _seenProviders;
27
+ /**
28
+ * Wagmi event handler for tracking wallet events via Wagmi v2
29
+ * Only initialized when options.wagmi is provided
30
+ */
31
+ private wagmiHandler?;
32
+ /**
33
+ * Flag indicating if Wagmi mode is enabled
34
+ * When true, EIP-1193 provider wrapping is skipped
35
+ */
36
+ private isWagmiMode;
27
37
  config: Config;
28
38
  currentChainId?: ChainID;
29
39
  currentAddress?: Address;
@@ -34,12 +44,6 @@ export declare class FormoAnalytics implements IFormoAnalytics {
34
44
  * @returns true if there's a provider mismatch, false otherwise
35
45
  */
36
46
  private isProviderMismatch;
37
- /**
38
- * Check if a provider is in a valid state for switching
39
- * @param provider The provider to validate
40
- * @returns true if the provider is in a valid state
41
- */
42
- private isProviderInValidState;
43
47
  private constructor();
44
48
  static init(writeKey: string, options?: Options): Promise<FormoAnalytics>;
45
49
  /**
@@ -57,6 +61,12 @@ export declare class FormoAnalytics implements IFormoAnalytics {
57
61
  * @returns {void}
58
62
  */
59
63
  reset(): void;
64
+ /**
65
+ * Clean up resources and event listeners
66
+ * Call this when destroying the analytics instance
67
+ * @returns {void}
68
+ */
69
+ cleanup(): void;
60
70
  /**
61
71
  * Emits a connect wallet event.
62
72
  * @param {ChainID} params.chainId
@@ -193,7 +203,13 @@ export declare class FormoAnalytics implements IFormoAnalytics {
193
203
  * @returns {boolean} True if the user has opted out
194
204
  */
195
205
  hasOptedOutTracking(): boolean;
196
- private trackProvider;
206
+ /**
207
+ * Track an EIP-1193 provider by wrapping its request method and adding event listeners
208
+ * Note: This is only used in non-Wagmi mode. When Wagmi is enabled, all tracking
209
+ * happens through Wagmi's connector system instead of EIP-1193/EIP-6963.
210
+ * @param provider The EIP-1193 provider to track
211
+ */
212
+ private trackEIP1193Provider;
197
213
  private trackProviders;
198
214
  private addProviderListener;
199
215
  private registerAccountsChangedListener;
@@ -229,19 +245,13 @@ export declare class FormoAnalytics implements IFormoAnalytics {
229
245
  * @param eventType The wallet event type to check
230
246
  * @returns {boolean} True if the event type should be autocaptured
231
247
  */
232
- private isAutocaptureEnabled;
248
+ isAutocaptureEnabled(eventType: "connect" | "disconnect" | "signature" | "transaction" | "chain"): boolean;
233
249
  /**
234
250
  * Get provider information for a given provider
235
251
  * @param provider The provider to get info for
236
252
  * @returns Provider information
237
253
  */
238
254
  private getProviderInfo;
239
- /**
240
- * Attempts to detect information about an injected provider
241
- * @param provider The injected provider to analyze
242
- * @returns Provider information with fallback values
243
- */
244
- private detectInjectedProviderInfo;
245
255
  private getProviders;
246
256
  get providers(): readonly EIP6963ProviderDetail[];
247
257
  private detectWallets;